Compare commits
	
		
			24 Commits
		
	
	
		
			0.1.0
			...
			3ce8eda712
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 3ce8eda712 | |||
| 1a78e88b34 | |||
| 968abd04ee | |||
| dc209fa192 | |||
| a80df49fdd | |||
| 92d1d21d00 | |||
| 917f627933 | |||
| 4946a6b119 | |||
| 9f784c3190 | |||
| aa08e212ee | |||
| 80ad939aab | |||
| 08c9cddc78 | |||
| e6285c282b | |||
| 61829fc042 | |||
| e2f8fd3ee5 | |||
| 763c9e521e | |||
| 98747be7c2 | |||
| 91288a9ffa | |||
| a19ec682e6 | |||
| dba53106fb | |||
| 91ff0c14e4 | |||
| bf27511caa | |||
| 4ff2f64a22 | |||
| 146c8e7ab3 | 
							
								
								
									
										18
									
								
								.drone.yml
									
									
									
									
									
								
							
							
						
						
									
										18
									
								
								.drone.yml
									
									
									
									
									
								
							| @@ -27,19 +27,33 @@ steps: | ||||
|   - npm install --prefix assets | ||||
|   - mix test | ||||
|  | ||||
| - name: build and publish | ||||
| - name: build and publish stable | ||||
|   image: plugins/docker | ||||
|   settings: | ||||
|     repo: shibaobun/cannery | ||||
|     tags: latest | ||||
|     username: | ||||
|       from_secret: docker_username | ||||
|     password: | ||||
|       from_secret: docker_password | ||||
|     tags: latest | ||||
|   when: | ||||
|     branch: | ||||
|     - stable | ||||
|  | ||||
| - name: build and publish tagged version | ||||
|   image: plugins/docker | ||||
|   settings: | ||||
|     repo: shibaobun/cannery | ||||
|     username: | ||||
|       from_secret: docker_username | ||||
|     password: | ||||
|       from_secret: docker_password | ||||
|     tags: | ||||
|       - ${DRONE_TAG} | ||||
|   when: | ||||
|     event: | ||||
|     - tag | ||||
|  | ||||
| - name: rebuild-cache | ||||
|   image: drillster/drone-volume-cache | ||||
|   volumes: | ||||
|   | ||||
							
								
								
									
										26
									
								
								CHANGELOG.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										26
									
								
								CHANGELOG.md
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,26 @@ | ||||
| # v0.2.3 | ||||
| - Fix modals with overflowing forms | ||||
| - Add page titles to registration and setting pages | ||||
|  | ||||
| # v0.2.2 | ||||
| - Fix loading and reconnecting pages not being fixed | ||||
| - Fix closing modal in some cases not triggering a page reload | ||||
| - Fix error when display container and tag edit routes from a fresh reload | ||||
|  | ||||
| # v0.2.1 | ||||
| - Fix checkbox spacing for mobile view | ||||
| - Fix spacing with form elements in mobile view | ||||
| - Fix user card spacing | ||||
|  | ||||
| # v0.2.0 | ||||
| - Add or remove tags from containers list and details page | ||||
| - Show tags on containers | ||||
| - Add "Cannery" to page titles | ||||
| - Don't show true/false column for ammo types if all values are false | ||||
| - Fix ammo type firing type display | ||||
| - Show original count, current value, and percentage remaining for ammo groups | ||||
| - Show shot history for an ammo group | ||||
| - Show ammo round totals and total shot for ammo types | ||||
|  | ||||
| # v0.1.0 | ||||
| - Initial release! | ||||
| @@ -1,5 +1,7 @@ | ||||
| # Cannery | ||||
|  | ||||
|  | ||||
|  | ||||
| The self-hosted firearm tracker website. | ||||
|  | ||||
| * Easy to Use: Cannery lets you easily keep an eye on your ammo levels before | ||||
|   | ||||
| @@ -17,8 +17,7 @@ | ||||
|     -o-transform: scale(1.5); | ||||
|     transform: scale(1.5); | ||||
|     padding: 10px; | ||||
|     margin-left: auto; | ||||
|     margin-right: auto; | ||||
|     margin: 1em auto; | ||||
|   } | ||||
|  | ||||
|   .title { | ||||
|   | ||||
| @@ -67,6 +67,59 @@ defmodule Cannery.Ammo do | ||||
|     ) | ||||
|   end | ||||
|  | ||||
|   @doc """ | ||||
|   Gets the total number of rounds for an ammo type | ||||
|  | ||||
|   Raises `Ecto.NoResultsError` if the Ammo type does not exist. | ||||
|  | ||||
|   ## Examples | ||||
|  | ||||
|       iex> get_round_count_for_ammo_type(123, %User{id: 123}) | ||||
|       %AmmoType{} | ||||
|  | ||||
|       iex> get_round_count_for_ammo_type(456, %User{id: 123}) | ||||
|       ** (Ecto.NoResultsError) | ||||
|  | ||||
|   """ | ||||
|   @spec get_round_count_for_ammo_type(AmmoType.t(), User.t()) :: non_neg_integer() | ||||
|   def get_round_count_for_ammo_type( | ||||
|         %AmmoType{id: ammo_type_id, user_id: user_id}, | ||||
|         %User{id: user_id} | ||||
|       ) do | ||||
|     Repo.one!( | ||||
|       from ag in AmmoGroup, | ||||
|         where: ag.ammo_type_id == ^ammo_type_id, | ||||
|         select: sum(ag.count) | ||||
|     ) | ||||
|   end | ||||
|  | ||||
|   @doc """ | ||||
|   Gets the total number of rounds shot for an ammo type | ||||
|  | ||||
|   Raises `Ecto.NoResultsError` if the Ammo type does not exist. | ||||
|  | ||||
|   ## Examples | ||||
|  | ||||
|       iex> get_used_count_for_ammo_type(123, %User{id: 123}) | ||||
|       %AmmoType{} | ||||
|  | ||||
|       iex> get_used_count_for_ammo_type(456, %User{id: 123}) | ||||
|       ** (Ecto.NoResultsError) | ||||
|  | ||||
|   """ | ||||
|   @spec get_used_count_for_ammo_type(AmmoType.t(), User.t()) :: non_neg_integer() | ||||
|   def get_used_count_for_ammo_type( | ||||
|         %AmmoType{id: ammo_type_id, user_id: user_id}, | ||||
|         %User{id: user_id} | ||||
|       ) do | ||||
|     Repo.one!( | ||||
|       from ag in AmmoGroup, | ||||
|         left_join: sg in assoc(ag, :shot_groups), | ||||
|         where: ag.ammo_type_id == ^ammo_type_id, | ||||
|         select: sum(sg.count) | ||||
|     ) | ||||
|   end | ||||
|  | ||||
|   @doc """ | ||||
|   Creates a ammo_type. | ||||
|  | ||||
| @@ -162,10 +215,12 @@ defmodule Cannery.Ammo do | ||||
|   @spec list_ammo_groups_for_type(AmmoType.t(), User.t()) :: [AmmoGroup.t()] | ||||
|   def list_ammo_groups_for_type(%AmmoType{id: ammo_type_id, user_id: user_id}, %User{id: user_id}) do | ||||
|     Repo.all( | ||||
|       from am in AmmoGroup, | ||||
|         where: am.ammo_type_id == ^ammo_type_id, | ||||
|         where: am.user_id == ^user_id, | ||||
|         order_by: am.id | ||||
|       from ag in AmmoGroup, | ||||
|         left_join: sg in assoc(ag, :shot_groups), | ||||
|         where: ag.ammo_type_id == ^ammo_type_id, | ||||
|         where: ag.user_id == ^user_id, | ||||
|         preload: [shot_groups: sg], | ||||
|         order_by: ag.id | ||||
|     ) | ||||
|   end | ||||
|  | ||||
| @@ -182,12 +237,18 @@ defmodule Cannery.Ammo do | ||||
|   @spec list_ammo_groups(User.t(), include_empty :: boolean()) :: [AmmoGroup.t()] | ||||
|   def list_ammo_groups(%User{id: user_id}, include_empty \\ false) do | ||||
|     if include_empty do | ||||
|       from am in AmmoGroup, where: am.user_id == ^user_id, order_by: am.id | ||||
|       from ag in AmmoGroup, | ||||
|         left_join: sg in assoc(ag, :shot_groups), | ||||
|         where: ag.user_id == ^user_id, | ||||
|         preload: [shot_groups: sg], | ||||
|         order_by: ag.id | ||||
|     else | ||||
|       from am in AmmoGroup, | ||||
|         where: am.user_id == ^user_id, | ||||
|         where: not (am.count == 0), | ||||
|         order_by: am.id | ||||
|       from ag in AmmoGroup, | ||||
|         left_join: sg in assoc(ag, :shot_groups), | ||||
|         where: ag.user_id == ^user_id, | ||||
|         where: not (ag.count == 0), | ||||
|         preload: [shot_groups: sg], | ||||
|         order_by: ag.id | ||||
|     end | ||||
|     |> Repo.all() | ||||
|   end | ||||
| @@ -204,10 +265,12 @@ defmodule Cannery.Ammo do | ||||
|   @spec list_staged_ammo_groups(User.t()) :: [AmmoGroup.t()] | ||||
|   def list_staged_ammo_groups(%User{id: user_id}) do | ||||
|     Repo.all( | ||||
|       from am in AmmoGroup, | ||||
|         where: am.user_id == ^user_id, | ||||
|         where: am.staged == true, | ||||
|         order_by: am.id | ||||
|       from ag in AmmoGroup, | ||||
|         left_join: sg in assoc(ag, :shot_groups), | ||||
|         where: ag.user_id == ^user_id, | ||||
|         where: ag.staged == true, | ||||
|         preload: [shot_groups: sg], | ||||
|         order_by: ag.id | ||||
|     ) | ||||
|   end | ||||
|  | ||||
| @@ -226,8 +289,42 @@ defmodule Cannery.Ammo do | ||||
|  | ||||
|   """ | ||||
|   @spec get_ammo_group!(AmmoGroup.id(), User.t()) :: AmmoGroup.t() | ||||
|   def get_ammo_group!(id, %User{id: user_id}), | ||||
|     do: Repo.one!(from am in AmmoGroup, where: am.id == ^id and am.user_id == ^user_id) | ||||
|   def get_ammo_group!(id, %User{id: user_id}) do | ||||
|     Repo.one!( | ||||
|       from ag in AmmoGroup, | ||||
|         left_join: sg in assoc(ag, :shot_groups), | ||||
|         where: ag.id == ^id, | ||||
|         where: ag.user_id == ^user_id, | ||||
|         preload: [shot_groups: sg] | ||||
|     ) | ||||
|   end | ||||
|  | ||||
|   @doc """ | ||||
|   Returns the number of shot rounds for an ammo group | ||||
|   """ | ||||
|   @spec get_used_count(AmmoGroup.t()) :: non_neg_integer() | ||||
|   def get_used_count(%AmmoGroup{} = ammo_group) do | ||||
|     ammo_group | ||||
|     |> Repo.preload(:shot_groups) | ||||
|     |> Map.get(:shot_groups) | ||||
|     |> Enum.map(fn %{count: count} -> count end) | ||||
|     |> Enum.sum() | ||||
|   end | ||||
|  | ||||
|   @doc """ | ||||
|   Calculates the percentage remaining of an ammo group out of 100 | ||||
|   """ | ||||
|   @spec get_percentage_remaining(AmmoGroup.t()) :: non_neg_integer() | ||||
|   def get_percentage_remaining(%AmmoGroup{count: 0}), do: 0 | ||||
|  | ||||
|   def get_percentage_remaining(%AmmoGroup{count: count} = ammo_group) do | ||||
|     ammo_group = ammo_group |> Repo.preload(:shot_groups) | ||||
|  | ||||
|     shot_group_sum = | ||||
|       ammo_group.shot_groups |> Enum.map(fn %{count: count} -> count end) |> Enum.sum() | ||||
|  | ||||
|     round(count / (count + shot_group_sum) * 100) | ||||
|   end | ||||
|  | ||||
|   @doc """ | ||||
|   Creates a ammo_group. | ||||
|   | ||||
| @@ -19,8 +19,16 @@ defmodule Cannery.Containers do | ||||
|  | ||||
|   """ | ||||
|   @spec list_containers(User.t()) :: [Container.t()] | ||||
|   def list_containers(%User{id: user_id}), | ||||
|     do: Repo.all(from c in Container, where: c.user_id == ^user_id, order_by: c.name) | ||||
|   def list_containers(%User{id: user_id}) do | ||||
|     Repo.all( | ||||
|       from c in Container, | ||||
|         left_join: t in assoc(c, :tags), | ||||
|         left_join: ag in assoc(c, :ammo_groups), | ||||
|         where: c.user_id == ^user_id, | ||||
|         order_by: c.name, | ||||
|         preload: [tags: t, ammo_groups: ag] | ||||
|     ) | ||||
|   end | ||||
|  | ||||
|   @doc """ | ||||
|   Gets a single container. | ||||
| @@ -37,8 +45,17 @@ defmodule Cannery.Containers do | ||||
|  | ||||
|   """ | ||||
|   @spec get_container!(Container.id(), User.t()) :: Container.t() | ||||
|   def get_container!(id, %User{id: user_id}), | ||||
|     do: Repo.one!(from c in Container, where: c.id == ^id and c.user_id == ^user_id) | ||||
|   def get_container!(id, %User{id: user_id}) do | ||||
|     Repo.one!( | ||||
|       from c in Container, | ||||
|         left_join: t in assoc(c, :tags), | ||||
|         left_join: ag in assoc(c, :ammo_groups), | ||||
|         where: c.user_id == ^user_id, | ||||
|         where: c.id == ^id, | ||||
|         order_by: c.name, | ||||
|         preload: [tags: t, ammo_groups: ag] | ||||
|     ) | ||||
|   end | ||||
|  | ||||
|   @doc """ | ||||
|   Creates a container. | ||||
| @@ -189,4 +206,17 @@ defmodule Cannery.Containers do | ||||
|  | ||||
|     if count == 0, do: raise("could not delete container tag"), else: count | ||||
|   end | ||||
|  | ||||
|   @doc """ | ||||
|   Returns number of rounds in container. If data is already preloaded, then | ||||
|   there will be no db hit. | ||||
|   """ | ||||
|   @spec get_container_rounds!(Container.t()) :: non_neg_integer() | ||||
|   def get_container_rounds!(%Container{} = container) do | ||||
|     container | ||||
|     |> Repo.preload(:ammo_groups) | ||||
|     |> Map.get(:ammo_groups) | ||||
|     |> Enum.map(fn %{count: count} -> count end) | ||||
|     |> Enum.sum() | ||||
|   end | ||||
| end | ||||
|   | ||||
| @@ -7,7 +7,7 @@ | ||||
|     let={f} | ||||
|     for={@changeset} | ||||
|     id="shot-group-form" | ||||
|     class="flex flex-col sm:grid sm:grid-cols-3 sm:gap-4 justify-center items-center" | ||||
|     class="flex flex-col space-y-4 sm:space-y-0 sm:grid sm:grid-cols-3 sm:gap-4 justify-center items-center" | ||||
|     phx-target={@myself} | ||||
|     phx-change="validate" | ||||
|     phx-submit="save" | ||||
|   | ||||
| @@ -4,17 +4,21 @@ defmodule CanneryWeb.Components.ContainerCard do | ||||
|   """ | ||||
|  | ||||
|   use CanneryWeb, :component | ||||
|   import CanneryWeb.Components.TagCard | ||||
|   alias Cannery.{Containers, Repo} | ||||
|   alias CanneryWeb.Endpoint | ||||
|  | ||||
|   def container_card(assigns) do | ||||
|   def container_card(%{container: container} = assigns) do | ||||
|     assigns = assigns |> Map.put(:container, container |> Repo.preload([:tags, :ammo_groups])) | ||||
|  | ||||
|     ~H""" | ||||
|     <div | ||||
|       id={"container-#{@container.id}"} | ||||
|       class="mx-4 my-2 px-8 py-4 flex flex-col justify-center items-center | ||||
|       class="mx-4 my-2 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 | ||||
|         transition-all duration-300 ease-in-out" | ||||
|     > | ||||
|       <div class="mb-4 flex flex-col justify-center items-center"> | ||||
|       <div class="mb-4 flex flex-col justify-center items-center space-y-2"> | ||||
|         <%= live_redirect to: Routes.container_show_path(Endpoint, :show, @container), | ||||
|                       class: "link" do %> | ||||
|           <h1 class="px-4 py-2 rounded-lg title text-xl"> | ||||
| @@ -40,6 +44,25 @@ defmodule CanneryWeb.Components.ContainerCard do | ||||
|             <%= @container.location %> | ||||
|           </span> | ||||
|         <% end %> | ||||
|  | ||||
|         <%= if @container.ammo_groups do %> | ||||
|           <span class="rounded-lg title text-lg"> | ||||
|             <%= gettext("Rounds:") %> | ||||
|             <%= @container |> Containers.get_container_rounds!() %> | ||||
|           </span> | ||||
|         <% end %> | ||||
|  | ||||
|         <div class="flex flex-wrap justify-center items-center"> | ||||
|           <%= unless @container.tags |> Enum.empty?() do %> | ||||
|             <%= for tag <- @container.tags do %> | ||||
|               <.simple_tag_card tag={tag} /> | ||||
|             <% end %> | ||||
|           <% end %> | ||||
|  | ||||
|           <%= if assigns |> Map.has_key?(:tag_actions) do %> | ||||
|             <%= render_slot(@tag_actions) %> | ||||
|           <% end %> | ||||
|         </div> | ||||
|       </div> | ||||
|  | ||||
|       <%= if assigns |> Map.has_key?(:inner_block) do %> | ||||
|   | ||||
| @@ -13,15 +13,20 @@ defmodule CanneryWeb.Components.TagCard do | ||||
|           border border-gray-400 rounded-lg shadow-lg hover:shadow-md | ||||
|           transition-all duration-300 ease-in-out" | ||||
|     > | ||||
|       <h1 | ||||
|         class="px-4 py-2 rounded-lg title text-xl" | ||||
|         style={"color: #{@tag.text_color}; background-color: #{@tag.bg_color}"} | ||||
|       > | ||||
|         <%= @tag.name %> | ||||
|       </h1> | ||||
|  | ||||
|       <.simple_tag_card tag={@tag} /> | ||||
|       <%= render_slot(@inner_block) %> | ||||
|     </div> | ||||
|     """ | ||||
|   end | ||||
|  | ||||
|   def simple_tag_card(assigns) do | ||||
|     ~H""" | ||||
|     <h1 | ||||
|       class="mx-2 my-1 px-4 py-2 rounded-lg title text-xl" | ||||
|       style={"color: #{@tag.text_color}; background-color: #{@tag.bg_color}"} | ||||
|     > | ||||
|       <%= @tag.name %> | ||||
|     </h1> | ||||
|     """ | ||||
|   end | ||||
| end | ||||
|   | ||||
| @@ -9,7 +9,7 @@ defmodule CanneryWeb.Components.UserCard do | ||||
|     ~H""" | ||||
|     <div | ||||
|       id={"user-#{@user.id}"} | ||||
|       class="mx-4 my-2 px-8 py-4 flex flex-col justify-center items-center | ||||
|       class="mx-4 my-2 px-8 py-4 flex flex-col justify-center items-center text-center | ||||
|           border border-gray-400 rounded-lg shadow-lg hover:shadow-md | ||||
|           transition-all duration-300 ease-in-out" | ||||
|     > | ||||
| @@ -21,7 +21,8 @@ defmodule CanneryWeb.Components.UserCard do | ||||
|         <%= if @user.confirmed_at |> is_nil() do %> | ||||
|           Email unconfirmed | ||||
|         <% else %> | ||||
|           User was confirmed at<%= @user.confirmed_at |> display_datetime() %> | ||||
|           <p>User was confirmed at</p> | ||||
|           <%= @user.confirmed_at |> display_datetime() %> | ||||
|         <% end %> | ||||
|       </h3> | ||||
|  | ||||
|   | ||||
| @@ -1,10 +1,11 @@ | ||||
| defmodule CanneryWeb.UserConfirmationController do | ||||
|   use CanneryWeb, :controller | ||||
|  | ||||
|   import CanneryWeb.Gettext | ||||
|   alias Cannery.Accounts | ||||
|  | ||||
|   def new(conn, _params) do | ||||
|     render(conn, "new.html") | ||||
|     render(conn, "new.html", page_title: gettext("Confirm your account")) | ||||
|   end | ||||
|  | ||||
|   def create(conn, %{"user" => %{"email" => email}}) do | ||||
|   | ||||
| @@ -29,8 +29,11 @@ defmodule CanneryWeb.UserRegistrationController do | ||||
|  | ||||
|   # renders new user registration page | ||||
|   defp render_new(conn, invite \\ nil) do | ||||
|     changeset = Accounts.change_user_registration(%User{}) | ||||
|     conn |> render("new.html", changeset: changeset, invite: invite) | ||||
|     render(conn, "new.html", | ||||
|       changeset: Accounts.change_user_registration(%User{}), | ||||
|       invite: invite, | ||||
|       page_title: gettext("Register") | ||||
|     ) | ||||
|   end | ||||
|  | ||||
|   def create(conn, %{"user" => %{"invite_token" => invite_token}} = attrs) do | ||||
|   | ||||
| @@ -6,7 +6,7 @@ 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") | ||||
|     render(conn, "new.html", page_title: gettext("Forgot your password?")) | ||||
|   end | ||||
|  | ||||
|   def create(conn, %{"user" => %{"email" => email}}) do | ||||
| @@ -31,7 +31,10 @@ defmodule CanneryWeb.UserResetPasswordController do | ||||
|   end | ||||
|  | ||||
|   def edit(conn, _params) do | ||||
|     render(conn, "edit.html", changeset: Accounts.change_user_password(conn.assigns.user)) | ||||
|     render(conn, "edit.html", | ||||
|       changeset: Accounts.change_user_password(conn.assigns.user), | ||||
|       page_title: gettext("Reset your password") | ||||
|     ) | ||||
|   end | ||||
|  | ||||
|   # Do not log in the user after reset password to avoid a | ||||
|   | ||||
| @@ -5,7 +5,7 @@ defmodule CanneryWeb.UserSessionController do | ||||
|   alias CanneryWeb.UserAuth | ||||
|  | ||||
|   def new(conn, _params) do | ||||
|     render(conn, "new.html", error_message: nil) | ||||
|     render(conn, "new.html", error_message: nil, page_title: gettext("Log in")) | ||||
|   end | ||||
|  | ||||
|   def create(conn, %{"user" => user_params}) do | ||||
|   | ||||
| @@ -1,13 +1,13 @@ | ||||
| defmodule CanneryWeb.UserSettingsController do | ||||
|   use CanneryWeb, :controller | ||||
|  | ||||
|   import CanneryWeb.Gettext | ||||
|   alias Cannery.Accounts | ||||
|   alias CanneryWeb.{HomeLive, UserAuth} | ||||
|  | ||||
|   plug :assign_email_and_password_changesets | ||||
|  | ||||
|   def edit(conn, _params) do | ||||
|     render(conn, "edit.html") | ||||
|     render(conn, "edit.html", page_title: gettext("Settings")) | ||||
|   end | ||||
|  | ||||
|   def update(conn, %{"action" => "update_email"} = params) do | ||||
|   | ||||
| @@ -10,7 +10,7 @@ | ||||
|     phx-target={@myself} | ||||
|     phx-change="validate" | ||||
|     phx-submit="save" | ||||
|     class="flex flex-col sm:grid sm:grid-cols-3 sm:gap-4 justify-center items-center" | ||||
|     class="flex flex-col space-y-4 sm:space-y-0 sm:grid sm:grid-cols-3 sm:gap-4 justify-center items-center" | ||||
|   > | ||||
|     <%= if @changeset.action && not @changeset.valid? do %> | ||||
|       <div class="invalid-feedback col-span-3 text-center"> | ||||
| @@ -18,34 +18,34 @@ | ||||
|       </div> | ||||
|     <% end %> | ||||
|  | ||||
|     <%= label(f, :ammo_type_id, gettext("Ammo type"), class: "mr-4 title text-lg text-primary-600") %> | ||||
|     <%= label(f, :ammo_type_id, gettext("Ammo type"), class: "title text-lg text-primary-600") %> | ||||
|     <%= select(f, :ammo_type_id, ammo_type_options(@ammo_types), | ||||
|       class: "text-center col-span-2 input input-primary" | ||||
|     ) %> | ||||
|     <%= error_tag(f, :ammo_type_id, "col-span-3 text-center") %> | ||||
|  | ||||
|     <%= label(f, :count, gettext("Count"), class: "mr-4 title text-lg text-primary-600") %> | ||||
|     <%= label(f, :count, gettext("Count"), class: "title text-lg text-primary-600") %> | ||||
|     <%= number_input(f, :count, | ||||
|       class: "text-center col-span-2 input input-primary", | ||||
|       min: 1 | ||||
|     ) %> | ||||
|     <%= error_tag(f, :count, "col-span-3 text-center") %> | ||||
|  | ||||
|     <%= label(f, :price_paid, gettext("Price paid"), class: "mr-4 title text-lg text-primary-600") %> | ||||
|     <%= label(f, :price_paid, gettext("Price paid"), class: "title text-lg text-primary-600") %> | ||||
|     <%= number_input(f, :price_paid, | ||||
|       step: "0.01", | ||||
|       class: "text-center col-span-2 input input-primary" | ||||
|     ) %> | ||||
|     <%= error_tag(f, :price_paid, "col-span-3 text-center") %> | ||||
|  | ||||
|     <%= label(f, :notes, gettext("Notes"), class: "mr-4 title text-lg text-primary-600") %> | ||||
|     <%= label(f, :notes, gettext("Notes"), class: "title text-lg text-primary-600") %> | ||||
|     <%= textarea(f, :notes, | ||||
|       class: "text-center col-span-2 input input-primary", | ||||
|       phx_hook: "MaintainAttrs" | ||||
|     ) %> | ||||
|     <%= error_tag(f, :notes, "col-span-3 text-center") %> | ||||
|  | ||||
|     <%= label(f, :container, gettext("Container"), class: "mr-4 title text-lg text-primary-600") %> | ||||
|     <%= label(f, :container, gettext("Container"), class: "title text-lg text-primary-600") %> | ||||
|     <%= select(f, :container_id, container_options(@containers), | ||||
|       class: "text-center col-span-2 input input-primary" | ||||
|     ) %> | ||||
|   | ||||
| @@ -33,7 +33,7 @@ | ||||
|               <%= gettext("Price paid") %> | ||||
|             </th> | ||||
|             <th class="p-2"> | ||||
|               <%= gettext("Notes") %> | ||||
|               <%= gettext("% left") %> | ||||
|             </th> | ||||
|             <th class="p-2"> | ||||
|               <%= gettext("Range") %> | ||||
| @@ -68,7 +68,7 @@ | ||||
|               </td> | ||||
|  | ||||
|               <td class="p-2"> | ||||
|                 <%= ammo_group.notes %> | ||||
|                 <%= "#{ammo_group |> Ammo.get_percentage_remaining()}%" %> | ||||
|               </td> | ||||
|  | ||||
|               <td class="p-2"> | ||||
|   | ||||
| @@ -9,6 +9,16 @@ | ||||
|       <%= @ammo_group.count %> | ||||
|     </span> | ||||
|  | ||||
|     <span class="rounded-lg title text-lg"> | ||||
|       <%= gettext("Original count:") %> | ||||
|       <%= @ammo_group.count + Ammo.get_used_count(@ammo_group) %> | ||||
|     </span> | ||||
|  | ||||
|     <span class="rounded-lg title text-lg"> | ||||
|       <%= gettext("Percentage left:") %> | ||||
|       <%= "#{@ammo_group |> Ammo.get_percentage_remaining()}%" %> | ||||
|     </span> | ||||
|  | ||||
|     <%= if @ammo_group.notes do %> | ||||
|       <span class="rounded-lg title text-lg"> | ||||
|         <%= gettext("Notes:") %> | ||||
| @@ -18,11 +28,20 @@ | ||||
|  | ||||
|     <%= if @ammo_group.price_paid do %> | ||||
|       <span class="rounded-lg title text-lg"> | ||||
|         <%= gettext("Price paid:") %> | ||||
|         <%= gettext("Original cost:") %> | ||||
|         <%= gettext("$%{amount}", | ||||
|           amount: @ammo_group.price_paid |> :erlang.float_to_binary(decimals: 2) | ||||
|         ) %> | ||||
|       </span> | ||||
|  | ||||
|       <span class="rounded-lg title text-lg"> | ||||
|         <%= gettext("Current value:") %> | ||||
|         <%= gettext("$%{amount}", | ||||
|           amount: | ||||
|             (@ammo_group.price_paid * Ammo.get_percentage_remaining(@ammo_group) / 100) | ||||
|             |> :erlang.float_to_binary(decimals: 2) | ||||
|         ) %> | ||||
|       </span> | ||||
|     <% end %> | ||||
|   </div> | ||||
|  | ||||
| @@ -84,6 +103,47 @@ | ||||
|       <%= gettext("This ammo group is not in a container") %> | ||||
|     <% end %> | ||||
|   </div> | ||||
|  | ||||
|   <%= unless @ammo_group.shot_groups |> Enum.empty?() do %> | ||||
|     <hr class="mb-4 w-full" /> | ||||
|  | ||||
|     <h1 class="mb-4 px-4 py-2 text-center rounded-lg title text-xl"> | ||||
|       <%= gettext("Rounds used") %> | ||||
|     </h1> | ||||
|  | ||||
|     <div class="w-full overflow-x-auto border border-gray-600 rounded-lg shadow-lg bg-black"> | ||||
|       <table class="min-w-full table-auto text-center bg-white"> | ||||
|         <thead class="border-b border-primary-600"> | ||||
|           <tr> | ||||
|             <th class="p-2"> | ||||
|               <%= gettext("Rounds shot") %> | ||||
|             </th> | ||||
|             <th class="p-2"> | ||||
|               <%= gettext("Notes") %> | ||||
|             </th> | ||||
|             <th class="p-2"> | ||||
|               <%= gettext("Date") %> | ||||
|             </th> | ||||
|           </tr> | ||||
|         </thead> | ||||
|         <tbody id="shot_groups"> | ||||
|           <%= for shot_group <- @ammo_group.shot_groups do %> | ||||
|             <tr id={"shot_group-#{shot_group.id}"}> | ||||
|               <td class="p-2"> | ||||
|                 <%= shot_group.count %> | ||||
|               </td> | ||||
|               <td class="p-2"> | ||||
|                 <%= shot_group.notes %> | ||||
|               </td> | ||||
|               <td class="p-2"> | ||||
|                 <%= shot_group.date |> display_date() %> | ||||
|               </td> | ||||
|             </tr> | ||||
|           <% end %> | ||||
|         </tbody> | ||||
|       </table> | ||||
|     </div> | ||||
|   <% end %> | ||||
| </div> | ||||
|  | ||||
| <%= case @live_action do %> | ||||
|   | ||||
| @@ -9,7 +9,7 @@ | ||||
|     phx-target={@myself} | ||||
|     phx-change="validate" | ||||
|     phx-submit="save" | ||||
|     class="flex flex-col sm:grid sm:grid-cols-3 sm:gap-4 justify-center items-center" | ||||
|     class="flex flex-col space-y-4 sm:space-y-0 sm:grid sm:grid-cols-3 sm:gap-4 justify-center items-center" | ||||
|   > | ||||
|     <%= if @changeset.action && not @changeset.valid? do %> | ||||
|       <div class="invalid-feedback col-span-3 text-center"> | ||||
| @@ -17,11 +17,11 @@ | ||||
|       </div> | ||||
|     <% end %> | ||||
|  | ||||
|     <%= label(f, :name, gettext("Name"), class: "mr-4 title text-lg text-primary-600") %> | ||||
|     <%= label(f, :name, gettext("Name"), class: "title text-lg text-primary-600") %> | ||||
|     <%= text_input(f, :name, class: "text-center col-span-2 input input-primary") %> | ||||
|     <%= error_tag(f, :name, "col-span-3 text-center") %> | ||||
|  | ||||
|     <%= label(f, :desc, gettext("Description"), class: "mr-4 title text-lg text-primary-600") %> | ||||
|     <%= label(f, :desc, gettext("Description"), class: "title text-lg text-primary-600") %> | ||||
|     <%= textarea(f, :desc, | ||||
|       class: "text-center col-span-2 input input-primary", | ||||
|       phx_hook: "MaintainAttrs" | ||||
| @@ -34,50 +34,42 @@ | ||||
|     > | ||||
|       <%= gettext("Example bullet type abbreviations") %> | ||||
|     </a> | ||||
|     <%= label(f, :bullet_type, gettext("Bullet type"), | ||||
|       class: "mr-4 title text-lg text-primary-600" | ||||
|     ) %> | ||||
|     <%= label(f, :bullet_type, gettext("Bullet type"), class: "title text-lg text-primary-600") %> | ||||
|     <%= text_input(f, :bullet_type, | ||||
|       class: "text-center col-span-2 input input-primary", | ||||
|       placeholder: gettext("FMJ") | ||||
|     ) %> | ||||
|     <%= error_tag(f, :bullet_type, "col-span-3 text-center") %> | ||||
|  | ||||
|     <%= label(f, :bullet_core, gettext("Bullet core"), | ||||
|       class: "mr-4 title text-lg text-primary-600" | ||||
|     ) %> | ||||
|     <%= label(f, :bullet_core, gettext("Bullet core"), class: "title text-lg text-primary-600") %> | ||||
|     <%= text_input(f, :bullet_core, | ||||
|       class: "text-center col-span-2 input input-primary", | ||||
|       placeholder: gettext("Steel") | ||||
|     ) %> | ||||
|     <%= error_tag(f, :bullet_core, "col-span-3 text-center") %> | ||||
|  | ||||
|     <%= label(f, :cartridge, gettext("Cartridge"), class: "mr-4 title text-lg text-primary-600") %> | ||||
|     <%= label(f, :cartridge, gettext("Cartridge"), class: "title text-lg text-primary-600") %> | ||||
|     <%= text_input(f, :cartridge, | ||||
|       class: "text-center col-span-2 input input-primary", | ||||
|       placeholder: "5.56x46mm NATO" | ||||
|     ) %> | ||||
|     <%= error_tag(f, :cartridge, "col-span-3 text-center") %> | ||||
|  | ||||
|     <%= label(f, :caliber, gettext("Caliber"), class: "mr-4 title text-lg text-primary-600") %> | ||||
|     <%= label(f, :caliber, gettext("Caliber"), class: "title text-lg text-primary-600") %> | ||||
|     <%= text_input(f, :caliber, | ||||
|       class: "text-center col-span-2 input input-primary", | ||||
|       placeholder: ".223" | ||||
|     ) %> | ||||
|     <%= error_tag(f, :caliber, "col-span-3 text-center") %> | ||||
|  | ||||
|     <%= label(f, :case_material, gettext("Case material"), | ||||
|       class: "mr-4 title text-lg text-primary-600" | ||||
|     ) %> | ||||
|     <%= label(f, :case_material, gettext("Case material"), class: "title text-lg text-primary-600") %> | ||||
|     <%= text_input(f, :case_material, | ||||
|       class: "text-center col-span-2 input input-primary", | ||||
|       placeholder: gettext("Brass") | ||||
|     ) %> | ||||
|     <%= error_tag(f, :case_material, "col-span-3 text-center") %> | ||||
|  | ||||
|     <%= label(f, :jacket_type, gettext("Jacket type"), | ||||
|       class: "mr-4 title text-lg text-primary-600" | ||||
|     ) %> | ||||
|     <%= label(f, :jacket_type, gettext("Jacket type"), class: "title text-lg text-primary-600") %> | ||||
|     <%= text_input(f, :jacket_type, | ||||
|       class: "text-center col-span-2 input input-primary", | ||||
|       placeholder: gettext("Bimetal") | ||||
| @@ -85,7 +77,7 @@ | ||||
|     <%= error_tag(f, :case_material, "col-span-3 text-center") %> | ||||
|  | ||||
|     <%= label(f, :muzzle_velocity, gettext("Muzzle velocity"), | ||||
|       class: "mr-4 title text-lg text-primary-600" | ||||
|       class: "title text-lg text-primary-600" | ||||
|     ) %> | ||||
|     <%= number_input(f, :muzzle_velocity, | ||||
|       step: "1", | ||||
| @@ -94,14 +86,12 @@ | ||||
|     ) %> | ||||
|     <%= error_tag(f, :muzzle_velocity, "col-span-3 text-center") %> | ||||
|  | ||||
|     <%= label(f, :powder_type, gettext("Powder type"), | ||||
|       class: "mr-4 title text-lg text-primary-600" | ||||
|     ) %> | ||||
|     <%= label(f, :powder_type, gettext("Powder type"), class: "title text-lg text-primary-600") %> | ||||
|     <%= text_input(f, :powder_type, class: "text-center col-span-2 input input-primary") %> | ||||
|     <%= error_tag(f, :powder_type, "col-span-3 text-center") %> | ||||
|  | ||||
|     <%= label(f, :powder_grains_per_charge, gettext("Powder grains per charge"), | ||||
|       class: "mr-4 title text-lg text-primary-600" | ||||
|       class: "title text-lg text-primary-600" | ||||
|     ) %> | ||||
|     <%= number_input(f, :powder_grains_per_charge, | ||||
|       step: "1", | ||||
| @@ -110,7 +100,7 @@ | ||||
|     ) %> | ||||
|     <%= error_tag(f, :powder_grains_per_charge, "col-span-3 text-center") %> | ||||
|  | ||||
|     <%= label(f, :grains, gettext("Grains"), class: "mr-4 title text-lg text-primary-600") %> | ||||
|     <%= label(f, :grains, gettext("Grains"), class: "title text-lg text-primary-600") %> | ||||
|     <%= number_input(f, :grains, | ||||
|       step: "1", | ||||
|       class: "text-center col-span-2 input input-primary", | ||||
| @@ -118,54 +108,48 @@ | ||||
|     ) %> | ||||
|     <%= error_tag(f, :grains, "col-span-3 text-center") %> | ||||
|  | ||||
|     <%= label(f, :pressure, gettext("Pressure"), class: "mr-4 title text-lg text-primary-600") %> | ||||
|     <%= label(f, :pressure, gettext("Pressure"), class: "title text-lg text-primary-600") %> | ||||
|     <%= text_input(f, :pressure, | ||||
|       class: "text-center col-span-2 input input-primary", | ||||
|       placeholder: "+P" | ||||
|     ) %> | ||||
|     <%= error_tag(f, :pressure, "col-span-3 text-center") %> | ||||
|  | ||||
|     <%= label(f, :primer_type, gettext("Primer type"), | ||||
|       class: "mr-4 title text-lg text-primary-600" | ||||
|     ) %> | ||||
|     <%= label(f, :primer_type, gettext("Primer type"), class: "title text-lg text-primary-600") %> | ||||
|     <%= text_input(f, :primer_type, | ||||
|       class: "text-center col-span-2 input input-primary", | ||||
|       placeholder: "Boxer" | ||||
|     ) %> | ||||
|     <%= error_tag(f, :primer_type, "col-span-3 text-center") %> | ||||
|  | ||||
|     <%= label(f, :firing_type, gettext("Firing type"), | ||||
|       class: "mr-4 title text-lg text-primary-600" | ||||
|     ) %> | ||||
|     <%= label(f, :firing_type, gettext("Firing type"), class: "title text-lg text-primary-600") %> | ||||
|     <%= text_input(f, :firing_type, | ||||
|       class: "text-center col-span-2 input input-primary", | ||||
|       placeholder: "Centerfire" | ||||
|     ) %> | ||||
|     <%= error_tag(f, :firing_type, "col-span-3 text-center") %> | ||||
|  | ||||
|     <%= label(f, :tracer, gettext("Tracer"), class: "mr-4 title text-lg text-primary-600") %> | ||||
|     <%= label(f, :tracer, gettext("Tracer"), class: "title text-lg text-primary-600") %> | ||||
|     <%= checkbox(f, :tracer, class: "text-center col-span-2 checkbox") %> | ||||
|     <%= error_tag(f, :tracer, "col-span-3 text-center") %> | ||||
|  | ||||
|     <%= label(f, :incendiary, gettext("Incendiary"), class: "mr-4 title text-lg text-primary-600") %> | ||||
|     <%= label(f, :incendiary, gettext("Incendiary"), class: "title text-lg text-primary-600") %> | ||||
|     <%= checkbox(f, :incendiary, class: "text-center col-span-2 checkbox") %> | ||||
|     <%= error_tag(f, :incendiary, "col-span-3 text-center") %> | ||||
|  | ||||
|     <%= label(f, :blank, gettext("Blank"), class: "mr-4 title text-lg text-primary-600") %> | ||||
|     <%= label(f, :blank, gettext("Blank"), class: "title text-lg text-primary-600") %> | ||||
|     <%= checkbox(f, :blank, class: "text-center col-span-2 checkbox") %> | ||||
|     <%= error_tag(f, :blank, "col-span-3 text-center") %> | ||||
|  | ||||
|     <%= label(f, :corrosive, gettext("Corrosive"), class: "mr-4 title text-lg text-primary-600") %> | ||||
|     <%= label(f, :corrosive, gettext("Corrosive"), class: "title text-lg text-primary-600") %> | ||||
|     <%= checkbox(f, :corrosive, class: "text-center col-span-2 checkbox") %> | ||||
|     <%= error_tag(f, :corrosive, "col-span-3 text-center") %> | ||||
|  | ||||
|     <%= label(f, :manufacturer, gettext("Manufacturer"), | ||||
|       class: "mr-4 title text-lg text-primary-600" | ||||
|     ) %> | ||||
|     <%= label(f, :manufacturer, gettext("Manufacturer"), class: "title text-lg text-primary-600") %> | ||||
|     <%= text_input(f, :manufacturer, class: "text-center col-span-2 input input-primary") %> | ||||
|     <%= error_tag(f, :manufacturer, "col-span-3 text-center") %> | ||||
|  | ||||
|     <%= label(f, :upc, gettext("UPC"), class: "mr-4 title text-lg text-primary-600") %> | ||||
|     <%= label(f, :upc, gettext("UPC"), class: "title text-lg text-primary-600") %> | ||||
|     <%= text_input(f, :upc, class: "text-center col-span-2 input input-primary") %> | ||||
|     <%= error_tag(f, :upc, "col-span-3 text-center") %> | ||||
|  | ||||
|   | ||||
| @@ -61,7 +61,7 @@ defmodule CanneryWeb.AmmoTypeLive.Index do | ||||
|         {gettext("Grains"), :grains, :string}, | ||||
|         {gettext("Pressure"), :pressure, :string}, | ||||
|         {gettext("Primer type"), :primer_type, :string}, | ||||
|         {gettext("Rimfire"), :rimfire, :boolean}, | ||||
|         {gettext("Firing type"), :firing_type, :string}, | ||||
|         {gettext("Tracer"), :tracer, :boolean}, | ||||
|         {gettext("Incendiary"), :incendiary, :boolean}, | ||||
|         {gettext("Blank"), :blank, :boolean}, | ||||
| @@ -69,9 +69,12 @@ defmodule CanneryWeb.AmmoTypeLive.Index do | ||||
|         {gettext("Manufacturer"), :manufacturer, :string}, | ||||
|         {gettext("UPC"), :upc, :string} | ||||
|       ] | ||||
|       # filter columns to only used ones | ||||
|       |> Enum.filter(fn {_label, field, _type} -> | ||||
|         ammo_types |> Enum.any?(fn ammo_type -> not (ammo_type |> Map.get(field) |> is_nil()) end) | ||||
|       |> Enum.filter(fn {_label, field, type} -> | ||||
|         # remove columns if all values match defaults | ||||
|         default_value = if type == :boolean, do: false, else: nil | ||||
|  | ||||
|         ammo_types | ||||
|         |> Enum.any?(fn ammo_type -> not (ammo_type |> Map.get(field) == default_value) end) | ||||
|       end) | ||||
|  | ||||
|     socket |> assign(ammo_types: ammo_types, columns_to_display: columns_to_display) | ||||
|   | ||||
| @@ -28,6 +28,9 @@ | ||||
|                 <%= field_name %> | ||||
|               </th> | ||||
|             <% end %> | ||||
|             <th class="p-2"> | ||||
|               <%= gettext("Total # of rounds") %> | ||||
|             </th> | ||||
|  | ||||
|             <th class="p-2"></th> | ||||
|           </tr> | ||||
| @@ -46,6 +49,10 @@ | ||||
|                 </td> | ||||
|               <% end %> | ||||
|  | ||||
|               <td class="p-2"> | ||||
|                 <%= ammo_type |> Ammo.get_round_count_for_ammo_type(@current_user) %> | ||||
|               </td> | ||||
|  | ||||
|               <td class="p-2"> | ||||
|                 <div class="px-4 py-2 space-x-4 flex justify-center items-center"> | ||||
|                   <%= live_redirect to: Routes.ammo_type_show_path(Endpoint, :show, ammo_type), | ||||
|   | ||||
| @@ -35,70 +35,75 @@ | ||||
|  | ||||
|   <hr class="hr" /> | ||||
|  | ||||
|   <div class="grid sm:grid-cols-2 text-center justify-center items-center"> | ||||
|     <%= for {field_name, field} <- [ | ||||
|           {gettext("Bullet type"), :bullet_type}, | ||||
|           {gettext("Bullet core"), :bullet_core}, | ||||
|           {gettext("Cartridge"), :cartridge}, | ||||
|           {gettext("Caliber"), :caliber}, | ||||
|           {gettext("Case material"), :case_material}, | ||||
|           {gettext("Jacket type"), :jacket_type}, | ||||
|           {gettext("Muzzle velocity"), :muzzle_velocity}, | ||||
|           {gettext("Powder type"), :powder_type}, | ||||
|           {gettext("Powder grains per charge"), :powder_grains_per_charge}, | ||||
|           {gettext("Grains"), :grains}, | ||||
|           {gettext("Pressure"), :pressure}, | ||||
|           {gettext("Primer type"), :primer_type} | ||||
|   <div class="grid sm:grid-cols-2 gap-4 text-center justify-center items-center"> | ||||
|     <%= for {field_name, field, type} <- [ | ||||
|           {gettext("Bullet type"), :bullet_type, :string}, | ||||
|           {gettext("Bullet core"), :bullet_core, :string}, | ||||
|           {gettext("Cartridge"), :cartridge, :string}, | ||||
|           {gettext("Caliber"), :caliber, :string}, | ||||
|           {gettext("Case material"), :case_material, :string}, | ||||
|           {gettext("Jacket type"), :jacket_type, :string}, | ||||
|           {gettext("Muzzle velocity"), :muzzle_velocity, :string}, | ||||
|           {gettext("Powder type"), :powder_type, :string}, | ||||
|           {gettext("Powder grains per charge"), :powder_grains_per_charge, :string}, | ||||
|           {gettext("Grains"), :grains, :string}, | ||||
|           {gettext("Pressure"), :pressure, :string}, | ||||
|           {gettext("Primer type"), :primer_type, :string}, | ||||
|           {gettext("Firing type"), :firing_type, :string}, | ||||
|           {gettext("Tracer"), :tracer, :boolean}, | ||||
|           {gettext("Incendiary"), :incendiary, :boolean}, | ||||
|           {gettext("Blank"), :blank, :boolean}, | ||||
|           {gettext("Corrosive"), :corrosive, :boolean}, | ||||
|           {gettext("Manufacturer"), :manufacturer, :string}, | ||||
|           {gettext("UPC"), :upc, :string} | ||||
|         ] do %> | ||||
|       <%= if @ammo_type |> Map.get(field) do %> | ||||
|         <h3 class="mb-2 sm:mr-4 title text-lg"> | ||||
|         <h3 class="title text-lg"> | ||||
|           <%= field_name %>: | ||||
|         </h3> | ||||
|  | ||||
|         <span class="mb-4 sm:mb-2 text-primary-600"> | ||||
|           <%= @ammo_type |> Map.get(field) %> | ||||
|         <span class="text-primary-600"> | ||||
|           <%= case type do %> | ||||
|             <% :boolean -> %> | ||||
|               <%= @ammo_type |> Map.get(field) |> humanize() %> | ||||
|             <% _ -> %> | ||||
|               <%= @ammo_type |> Map.get(field) %> | ||||
|           <% end %> | ||||
|         </span> | ||||
|       <% end %> | ||||
|     <% end %> | ||||
|  | ||||
|     <%= for {field_name, field} <- [ | ||||
|           {"Rimfire", :rimfire}, | ||||
|           {"Tracer", :tracer}, | ||||
|           {"Incendiary", :incendiary}, | ||||
|           {"Blank", :blank}, | ||||
|           {"Corrosive", :corrosive} | ||||
|         ] do %> | ||||
|       <h3 class="mb-2 sm:mr-4 title text-lg"> | ||||
|         <%= field_name %>: | ||||
|       </h3> | ||||
|     <h3 class="title text-lg"> | ||||
|       <%= gettext("Current # of rounds:") %> | ||||
|     </h3> | ||||
|  | ||||
|       <span class="mb-4 sm:mb-2 text-primary-600"> | ||||
|         <%= @ammo_type |> Map.get(field) |> humanize() %> | ||||
|       </span> | ||||
|     <% end %> | ||||
|     <span class="text-primary-600"> | ||||
|       <%= @ammo_type |> Ammo.get_round_count_for_ammo_type(@current_user) %> | ||||
|     </span> | ||||
|  | ||||
|     <%= for {field_name, field} <- [{"Manufacturer", :manufacturer}, {"UPC", :upc}] do %> | ||||
|       <%= if @ammo_type |> Map.get(field) do %> | ||||
|         <h3 class="mb-2 sm:mr-4 title text-lg"> | ||||
|           <%= field_name %>: | ||||
|         </h3> | ||||
|     <h3 class="title text-lg"> | ||||
|       <%= gettext("Total rounds shot:") %> | ||||
|     </h3> | ||||
|  | ||||
|         <span class="mb-4 sm:mb-2 text-primary-600"> | ||||
|           <%= @ammo_type |> Map.get(field) %> | ||||
|         </span> | ||||
|       <% end %> | ||||
|     <% end %> | ||||
|     <span class="text-primary-600"> | ||||
|       <%= @ammo_type |> Ammo.get_used_count_for_ammo_type(@current_user) %> | ||||
|     </span> | ||||
|  | ||||
|     <%= if @avg_cost_per_round do %> | ||||
|       <h3 class="mb-2 sm:mr-4 title text-lg"> | ||||
|       <h3 class="title text-lg"> | ||||
|         <%= gettext("Average Price paid") %>: | ||||
|       </h3> | ||||
|  | ||||
|       <span class="mb-4 sm:mb-2 text-primary-600"> | ||||
|       <span class="text-primary-600"> | ||||
|         <%= gettext("$%{amount}", | ||||
|           amount: @avg_cost_per_round |> :erlang.float_to_binary(decimals: 2) | ||||
|         ) %> | ||||
|       </span> | ||||
|     <% else %> | ||||
|       <h3 class="title text-lg col-span-2"> | ||||
|         <%= gettext("No cost information") %> | ||||
|         <%= display_emoji("😔") %> | ||||
|       </h3> | ||||
|     <% end %> | ||||
|   </div> | ||||
|  | ||||
| @@ -107,10 +112,13 @@ | ||||
|   <div> | ||||
|     <%= if @ammo_groups |> Enum.empty?() do %> | ||||
|       <%= gettext("No ammo for this type") %> | ||||
|       <%= display_emoji("😔") %> | ||||
|     <% else %> | ||||
|       <%= for ammo_group <- @ammo_groups do %> | ||||
|         <.ammo_group_card ammo_group={ammo_group} /> | ||||
|       <% end %> | ||||
|       <div class="flex flex-wrap justify-center items-center"> | ||||
|         <%= for ammo_group <- @ammo_groups do %> | ||||
|           <.ammo_group_card ammo_group={ammo_group} /> | ||||
|         <% end %> | ||||
|       </div> | ||||
|     <% end %> | ||||
|   </div> | ||||
| </div> | ||||
|   | ||||
| @@ -1,51 +0,0 @@ | ||||
| defmodule CanneryWeb.ContainerLive.AddTagComponent do | ||||
|   @moduledoc """ | ||||
|   Livecomponent that can add a tag to a Container | ||||
|   """ | ||||
|  | ||||
|   use CanneryWeb, :live_component | ||||
|   alias Cannery.{Accounts.User, Containers, Containers.Container, Tags, Tags.Tag} | ||||
|   alias Phoenix.LiveView.Socket | ||||
|  | ||||
|   @impl true | ||||
|   @spec update( | ||||
|           %{:container => Container.t(), :current_user => User.t(), optional(any) => any}, | ||||
|           Socket.t() | ||||
|         ) :: {:ok, Socket.t()} | ||||
|   def update(%{container: _container, current_user: current_user} = assigns, socket) do | ||||
|     {:ok, socket |> assign(assigns) |> assign(:tags, Tags.list_tags(current_user))} | ||||
|   end | ||||
|  | ||||
|   @impl true | ||||
|   def handle_event( | ||||
|         "save", | ||||
|         %{"tag" => %{"tag_id" => tag_id}}, | ||||
|         %{ | ||||
|           assigns: %{ | ||||
|             tags: tags, | ||||
|             container: container, | ||||
|             current_user: current_user, | ||||
|             return_to: return_to | ||||
|           } | ||||
|         } = socket | ||||
|       ) do | ||||
|     socket = | ||||
|       case tags |> Enum.find(fn %{id: id} -> tag_id == id end) do | ||||
|         nil -> | ||||
|           prompt = dgettext("errors", "Tag could not be added") | ||||
|           socket |> put_flash(:error, prompt) | ||||
|  | ||||
|         %{name: tag_name} = tag -> | ||||
|           _container_tag = Containers.add_tag!(container, tag, current_user) | ||||
|           prompt = dgettext("prompts", "%{name} added successfully", name: tag_name) | ||||
|           socket |> put_flash(:info, prompt) |> push_redirect(to: return_to) | ||||
|       end | ||||
|  | ||||
|     {:noreply, socket} | ||||
|   end | ||||
|  | ||||
|   @spec tag_options([Tag.t()]) :: [{String.t(), Tag.id()}] | ||||
|   defp tag_options(tags) do | ||||
|     tags |> Enum.map(fn %{id: id, name: name} -> {name, id} end) | ||||
|   end | ||||
| end | ||||
| @@ -1,22 +0,0 @@ | ||||
| <div> | ||||
|   <h2 class="mb-8 text-center title text-xl text-primary-600"> | ||||
|     <%= @title %> | ||||
|   </h2> | ||||
|  | ||||
|   <.form | ||||
|     let={f} | ||||
|     for={:tag} | ||||
|     id="add-tag-to-container-form" | ||||
|     class="flex flex-col sm:grid sm:grid-cols-3 sm:gap-4 justify-center items-center" | ||||
|     phx-target={@myself} | ||||
|     phx-submit="save" | ||||
|   > | ||||
|     <%= select(f, :tag_id, tag_options(@tags), class: "text-center col-span-2 input input-primary") %> | ||||
|     <%= error_tag(f, :tag_id, "col-span-3 text-center") %> | ||||
|  | ||||
|     <%= submit(dgettext("actions", "Add"), | ||||
|       class: "mx-auto btn btn-primary", | ||||
|       phx_disable_with: dgettext("prompts", "Adding...") | ||||
|     ) %> | ||||
|   </.form> | ||||
| </div> | ||||
							
								
								
									
										73
									
								
								lib/cannery_web/live/container_live/edit_tags_component.ex
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										73
									
								
								lib/cannery_web/live/container_live/edit_tags_component.ex
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,73 @@ | ||||
| defmodule CanneryWeb.ContainerLive.EditTagsComponent do | ||||
|   @moduledoc """ | ||||
|   Livecomponent that can add or remove a tag to a Container | ||||
|   """ | ||||
|  | ||||
|   use CanneryWeb, :live_component | ||||
|   alias Cannery.{Accounts.User, Containers, Containers.Container, Repo, Tags, Tags.Tag} | ||||
|   alias Phoenix.LiveView.Socket | ||||
|  | ||||
|   @impl true | ||||
|   @spec update( | ||||
|           %{:container => Container.t(), :current_user => User.t(), optional(any) => any}, | ||||
|           Socket.t() | ||||
|         ) :: {:ok, Socket.t()} | ||||
|   def update(%{container: container, current_user: current_user} = assigns, socket) do | ||||
|     tags = Tags.list_tags(current_user) | ||||
|     container = container |> Repo.preload(:tags) | ||||
|     {:ok, socket |> assign(assigns) |> assign(tags: tags, container: container)} | ||||
|   end | ||||
|  | ||||
|   @impl true | ||||
|   def handle_event( | ||||
|         "save", | ||||
|         %{"tag" => %{"tag_id" => tag_id}}, | ||||
|         %{assigns: %{tags: tags, container: container, current_user: current_user}} = socket | ||||
|       ) do | ||||
|     socket = | ||||
|       case tags |> Enum.find(fn %{id: id} -> tag_id == id end) do | ||||
|         nil -> | ||||
|           prompt = dgettext("errors", "Tag could not be added") | ||||
|           socket |> put_flash(:error, prompt) | ||||
|  | ||||
|         %{name: tag_name} = tag -> | ||||
|           _container_tag = Containers.add_tag!(container, tag, current_user) | ||||
|           container = container |> Repo.preload(:tags, force: true) | ||||
|           prompt = dgettext("prompts", "%{name} added successfully", name: tag_name) | ||||
|           socket |> put_flash(:info, prompt) |> assign(container: container) | ||||
|       end | ||||
|  | ||||
|     {:noreply, socket} | ||||
|   end | ||||
|  | ||||
|   @impl true | ||||
|   def handle_event( | ||||
|         "delete", | ||||
|         %{"tag-id" => tag_id}, | ||||
|         %{assigns: %{tags: tags, container: container, current_user: current_user}} = socket | ||||
|       ) do | ||||
|     socket = | ||||
|       case tags |> Enum.find(fn %{id: id} -> tag_id == id end) do | ||||
|         nil -> | ||||
|           prompt = dgettext("errors", "Tag could not be removed") | ||||
|           socket |> put_flash(:error, prompt) | ||||
|  | ||||
|         %{name: tag_name} = tag -> | ||||
|           _container_tag = Containers.remove_tag!(container, tag, current_user) | ||||
|           container = container |> Repo.preload(:tags, force: true) | ||||
|           prompt = dgettext("prompts", "%{name} removed successfully", name: tag_name) | ||||
|           socket |> put_flash(:info, prompt) |> assign(container: container) | ||||
|       end | ||||
|  | ||||
|     {:noreply, socket} | ||||
|   end | ||||
|  | ||||
|   @spec tag_options([Tag.t()], Container.t()) :: [{String.t(), Tag.id()}] | ||||
|   defp tag_options(tags, %Container{tags: container_tags}) do | ||||
|     container_tags_map = container_tags |> Enum.map(fn %{id: id} -> id end) |> MapSet.new() | ||||
|  | ||||
|     tags | ||||
|     |> Enum.reject(fn %{id: id} -> container_tags_map |> MapSet.member?(id) end) | ||||
|     |> Enum.map(fn %{id: id, name: name} -> {name, id} end) | ||||
|   end | ||||
| end | ||||
| @@ -0,0 +1,58 @@ | ||||
| <div class="flex flex-col justify-center items-center text-center space-y-8"> | ||||
|   <h2 class="title text-xl text-primary-600"> | ||||
|     <%= @title %> | ||||
|   </h2> | ||||
|  | ||||
|   <div class="flex flex-wrap justify-center items-center"> | ||||
|     <%= for tag <- @container.tags do %> | ||||
|       <%= link to: "#", | ||||
|             class: "mx-2 my-1 px-4 py-2 rounded-lg title text-xl", | ||||
|             style: "color: #{tag.text_color}; background-color: #{tag.bg_color}", | ||||
|             phx_click: "delete", | ||||
|             phx_value_tag_id: tag.id, | ||||
|             phx_target: @myself, | ||||
|             data: [ | ||||
|               confirm: | ||||
|                 dgettext( | ||||
|                   "prompts", | ||||
|                   "Are you sure you want to remove the %{tag_name} tag from %{container_name}?", | ||||
|                   tag_name: tag.name, | ||||
|                   container_name: @container.name | ||||
|                 ) | ||||
|             ] do %> | ||||
|         <%= tag.name %> | ||||
|         <i class="fa-fw fa-sm fas fa-trash"></i> | ||||
|       <% end %> | ||||
|     <% end %> | ||||
|  | ||||
|     <%= if @container.tags |> Enum.empty?() do %> | ||||
|       <h2 class="title text-xl text-primary-600"> | ||||
|         <%= gettext("No tags") %> | ||||
|         <%= display_emoji("😔") %> | ||||
|       </h2> | ||||
|     <% end %> | ||||
|   </div> | ||||
|  | ||||
|   <%= unless tag_options(@tags, @container) |> Enum.empty?() do %> | ||||
|     <hr class="hr" /> | ||||
|  | ||||
|     <.form | ||||
|       let={f} | ||||
|       for={:tag} | ||||
|       id="add-tag-to-container-form" | ||||
|       class="flex flex-col space-y-4 sm:space-y-0 sm:grid sm:grid-cols-3 sm:gap-4 justify-center items-center" | ||||
|       phx-target={@myself} | ||||
|       phx-submit="save" | ||||
|     > | ||||
|       <%= select(f, :tag_id, tag_options(@tags, @container), | ||||
|         class: "text-center col-span-2 input input-primary" | ||||
|       ) %> | ||||
|       <%= error_tag(f, :tag_id, "col-span-3 text-center") %> | ||||
|  | ||||
|       <%= submit(dgettext("actions", "Add"), | ||||
|         class: "mx-auto btn btn-primary", | ||||
|         phx_disable_with: dgettext("prompts", "Adding...") | ||||
|       ) %> | ||||
|     </.form> | ||||
|   <% end %> | ||||
| </div> | ||||
| @@ -6,7 +6,7 @@ | ||||
|     let={f} | ||||
|     for={@changeset} | ||||
|     id="container-form" | ||||
|     class="flex flex-col sm:grid sm:grid-cols-3 sm:gap-4 justify-center items-center" | ||||
|     class="flex flex-col space-y-4 sm:space-y-0 sm:grid sm:grid-cols-3 sm:gap-4 justify-center items-center" | ||||
|     phx-target={@myself} | ||||
|     phx-change="validate" | ||||
|     phx-submit="save" | ||||
|   | ||||
| @@ -5,24 +5,28 @@ defmodule CanneryWeb.ContainerLive.Index do | ||||
|  | ||||
|   use CanneryWeb, :live_view | ||||
|   import CanneryWeb.Components.ContainerCard | ||||
|   alias Cannery.{Containers, Containers.Container} | ||||
|   alias Cannery.{Containers, Containers.Container, Repo} | ||||
|   alias CanneryWeb.Endpoint | ||||
|   alias Ecto.Changeset | ||||
|  | ||||
|   @impl true | ||||
|   def mount(_params, session, socket) do | ||||
|     {:ok, socket |> assign_defaults(session) |> display_containers()} | ||||
|     {:ok, socket |> assign_defaults(session)} | ||||
|   end | ||||
|  | ||||
|   @impl true | ||||
|   def handle_params(params, _url, %{assigns: %{live_action: live_action}} = socket) do | ||||
|     {:noreply, apply_action(socket, live_action, params)} | ||||
|     {:noreply, apply_action(socket, live_action, params) |> display_containers()} | ||||
|   end | ||||
|  | ||||
|   defp apply_action(%{assigns: %{current_user: current_user}} = socket, :edit, %{"id" => id}) do | ||||
|     %{name: container_name} = | ||||
|       container = | ||||
|       Containers.get_container!(id, current_user) | ||||
|       |> Repo.preload([:tags, :ammo_groups], force: true) | ||||
|  | ||||
|     socket | ||||
|     |> assign(:page_title, gettext("Edit Container")) | ||||
|     |> assign(:container, Containers.get_container!(id, current_user)) | ||||
|     |> assign(page_title: gettext("Edit %{name}", name: container_name), container: container) | ||||
|   end | ||||
|  | ||||
|   defp apply_action(socket, :new, _params) do | ||||
| @@ -30,7 +34,19 @@ defmodule CanneryWeb.ContainerLive.Index do | ||||
|   end | ||||
|  | ||||
|   defp apply_action(socket, :index, _params) do | ||||
|     socket |> assign(:page_title, gettext("Listing Containers")) |> assign(:container, nil) | ||||
|     socket | ||||
|     |> assign(:page_title, gettext("Listing Containers")) | ||||
|     |> assign(:container, nil) | ||||
|     |> display_containers() | ||||
|   end | ||||
|  | ||||
|   defp apply_action(%{assigns: %{current_user: current_user}} = socket, :edit_tags, %{"id" => id}) do | ||||
|     %{name: container_name} = | ||||
|       container = | ||||
|       Containers.get_container!(id, current_user) |> Repo.preload([:tags, :ammo_groups]) | ||||
|  | ||||
|     page_title = gettext("Edit %{name} tags", name: container_name) | ||||
|     socket |> assign(page_title: page_title, container: container) | ||||
|   end | ||||
|  | ||||
|   @impl true | ||||
| @@ -70,6 +86,9 @@ defmodule CanneryWeb.ContainerLive.Index do | ||||
|   end | ||||
|  | ||||
|   defp display_containers(%{assigns: %{current_user: current_user}} = socket) do | ||||
|     socket |> assign(containers: Containers.list_containers(current_user)) | ||||
|     containers = | ||||
|       Containers.list_containers(current_user) |> Repo.preload([:tags, :ammo_groups], force: true) | ||||
|  | ||||
|     socket |> assign(containers: containers) | ||||
|   end | ||||
| end | ||||
|   | ||||
| @@ -23,6 +23,14 @@ | ||||
|   <div class="flex flex-row flex-wrap justify-center items-center"> | ||||
|     <%= for container <- @containers do %> | ||||
|       <.container_card container={container}> | ||||
|         <:tag_actions> | ||||
|           <div class="mx-4 my-2"> | ||||
|             <%= live_patch to: Routes.container_index_path(Endpoint, :edit_tags, container), | ||||
|               class: "text-primary-600 link" do %> | ||||
|               <i class="fa-fw fa-lg fas fa-tags"></i> | ||||
|             <% end %> | ||||
|           </div> | ||||
|         </:tag_actions> | ||||
|         <%= live_patch to: Routes.container_index_path(Endpoint, :edit, container), | ||||
|                    class: "text-primary-600 link", | ||||
|                    data: [qa: "edit-#{container.id}"] do %> | ||||
| @@ -58,3 +66,16 @@ | ||||
|     /> | ||||
|   </.modal> | ||||
| <% end %> | ||||
|  | ||||
| <%= if @live_action == :edit_tags do %> | ||||
|   <.modal return_to={Routes.container_index_path(Endpoint, :index)}> | ||||
|     <.live_component | ||||
|       module={CanneryWeb.ContainerLive.EditTagsComponent} | ||||
|       id={@container.id} | ||||
|       title={@page_title} | ||||
|       action={@live_action} | ||||
|       container={@container} | ||||
|       current_user={@current_user} | ||||
|     /> | ||||
|   </.modal> | ||||
| <% end %> | ||||
|   | ||||
| @@ -19,10 +19,9 @@ defmodule CanneryWeb.ContainerLive.Show do | ||||
|   def handle_params( | ||||
|         %{"id" => id}, | ||||
|         _, | ||||
|         %{assigns: %{current_user: current_user, live_action: live_action}} = socket | ||||
|         %{assigns: %{current_user: current_user}} = socket | ||||
|       ) do | ||||
|     {:noreply, | ||||
|      socket |> assign(page_title: page_title(live_action)) |> render_container(id, current_user)} | ||||
|     {:noreply, socket |> render_container(id, current_user)} | ||||
|   end | ||||
|  | ||||
|   @impl true | ||||
| @@ -85,16 +84,20 @@ defmodule CanneryWeb.ContainerLive.Show do | ||||
|     {:noreply, socket} | ||||
|   end | ||||
|  | ||||
|   defp page_title(:show), do: gettext("Show Container") | ||||
|   defp page_title(:edit), do: gettext("Edit Container") | ||||
|   defp page_title(:add_tag), do: gettext("Add Tag to Container") | ||||
|  | ||||
|   @spec render_container(Socket.t(), Container.id(), User.t()) :: Socket.t() | ||||
|   defp render_container(socket, id, current_user) do | ||||
|     container = | ||||
|   defp render_container(%{assigns: %{live_action: live_action}} = socket, id, current_user) do | ||||
|     %{name: container_name} = | ||||
|       container = | ||||
|       Containers.get_container!(id, current_user) | ||||
|       |> Repo.preload([:ammo_groups, :tags], force: true) | ||||
|  | ||||
|     socket |> assign(container: container) | ||||
|     page_title = | ||||
|       case live_action do | ||||
|         :show -> gettext("Show %{name}", name: container_name) | ||||
|         :edit -> gettext("Edit %{name}", name: container_name) | ||||
|         :edit_tags -> gettext("Edit %{name} tags", name: container_name) | ||||
|       end | ||||
|  | ||||
|     socket |> assign(container: container, page_title: page_title) | ||||
|   end | ||||
| end | ||||
|   | ||||
| @@ -51,34 +51,23 @@ | ||||
|       </h2> | ||||
|  | ||||
|       <%= live_patch(dgettext("actions", "Why not add one?"), | ||||
|         to: Routes.container_show_path(Endpoint, :add_tag, @container), | ||||
|         to: Routes.container_show_path(Endpoint, :edit_tags, @container), | ||||
|         class: "btn btn-primary" | ||||
|       ) %> | ||||
|     </div> | ||||
|   <% else %> | ||||
|     <h2 class="mb-4 title text-xl text-primary-600"> | ||||
|       <%= gettext("Tags") %> | ||||
|     </h2> | ||||
|     <div class="flex flex-wrap justify-center items-center"> | ||||
|       <%= for tag <- @container.tags do %> | ||||
|         <.simple_tag_card tag={tag} /> | ||||
|       <% end %> | ||||
|  | ||||
|     <%= for tag <- @container.tags do %> | ||||
|       <.tag_card tag={tag}> | ||||
|         <%= link to: "#", | ||||
|              class: "text-primary-600 link", | ||||
|              phx_click: "delete_tag", | ||||
|              phx_value_tag_id: tag.id, | ||||
|              data: [ | ||||
|                confirm: | ||||
|                  dgettext( | ||||
|                    "prompts", | ||||
|                    "Are you sure you want to remove the %{tag_name} tag from %{container_name}?", | ||||
|                    tag_name: tag.name, | ||||
|                    container_name: @container.name | ||||
|                  ) | ||||
|              ] do %> | ||||
|           <i class="fa-fw fa-lg fas fa-trash"></i> | ||||
|       <div class="mx-4 my-2"> | ||||
|         <%= live_patch to: Routes.container_show_path(Endpoint, :edit_tags, @container), | ||||
|           class: "text-primary-600 link" do %> | ||||
|           <i class="fa-fw fa-lg fas fa-tags"></i> | ||||
|         <% end %> | ||||
|       </.tag_card> | ||||
|     <% end %> | ||||
|       </div> | ||||
|     </div> | ||||
|   <% end %> | ||||
|  | ||||
|   <hr class="mb-4 hr" /> | ||||
| @@ -87,9 +76,11 @@ | ||||
|     <%= if @container.ammo_groups |> Enum.empty?() do %> | ||||
|       <%= gettext("No ammo groups in this container") %> | ||||
|     <% else %> | ||||
|       <%= for ammo_group <- @container.ammo_groups do %> | ||||
|         <.ammo_group_card ammo_group={ammo_group} /> | ||||
|       <% end %> | ||||
|       <div class="flex flex-wrap justify-center items-center"> | ||||
|         <%= for ammo_group <- @container.ammo_groups do %> | ||||
|           <.ammo_group_card ammo_group={ammo_group} /> | ||||
|         <% end %> | ||||
|       </div> | ||||
|     <% end %> | ||||
|   </p> | ||||
| </div> | ||||
| @@ -108,10 +99,10 @@ | ||||
|   </.modal> | ||||
| <% end %> | ||||
|  | ||||
| <%= if @live_action == :add_tag do %> | ||||
| <%= if @live_action == :edit_tags do %> | ||||
|   <.modal return_to={Routes.container_show_path(Endpoint, :show, @container)}> | ||||
|     <.live_component | ||||
|       module={CanneryWeb.ContainerLive.AddTagComponent} | ||||
|       module={CanneryWeb.ContainerLive.EditTagsComponent} | ||||
|       id={@container.id} | ||||
|       title={@page_title} | ||||
|       action={@live_action} | ||||
|   | ||||
| @@ -9,7 +9,13 @@ defmodule CanneryWeb.HomeLive do | ||||
|   @impl true | ||||
|   def mount(_params, session, socket) do | ||||
|     admins = Accounts.list_users_by_role(:admin) | ||||
|     {:ok, socket |> assign_defaults(session) |> assign(query: "", results: %{}, admins: admins)} | ||||
|  | ||||
|     socket = | ||||
|       socket | ||||
|       |> assign_defaults(session) | ||||
|       |> assign(page_title: "Home", query: "", results: %{}, admins: admins) | ||||
|  | ||||
|     {:ok, socket} | ||||
|   end | ||||
|  | ||||
|   @impl true | ||||
| @@ -124,7 +130,7 @@ defmodule CanneryWeb.HomeLive do | ||||
|         <li class="flex flex-row justify-center space-x-2"> | ||||
|           <b>Version:</b> | ||||
|           <p> | ||||
|             0.1.0 | ||||
|             0.2.2 | ||||
|           </p> | ||||
|         </li> | ||||
|       </ul> | ||||
|   | ||||
| @@ -6,7 +6,7 @@ | ||||
|     let={f} | ||||
|     for={@changeset} | ||||
|     id="invite-form" | ||||
|     class="flex flex-col sm:grid sm:grid-cols-3 sm:gap-4 justify-center items-center" | ||||
|     class="flex flex-col space-y-4 sm:space-y-0 sm:grid sm:grid-cols-3 sm:gap-4 justify-center items-center" | ||||
|     phx-target={@myself} | ||||
|     phx-change="validate" | ||||
|     phx-submit="save" | ||||
|   | ||||
| @@ -38,32 +38,45 @@ defmodule CanneryWeb.LiveHelpers do | ||||
|   """ | ||||
|   def modal(assigns) do | ||||
|     ~H""" | ||||
|     <%= live_patch to: @return_to, | ||||
|       id: "modal-bg", | ||||
|       class: | ||||
|         "fade-in fixed z-10 left-0 top-0 | ||||
|          w-full h-full overflow-hidden | ||||
|          p-8 flex flex-col justify-center items-center cursor-auto", | ||||
|       style: "background-color: rgba(0,0,0,0.4);", | ||||
|       phx_remove: hide_modal() | ||||
|     do %> | ||||
|       <span class="hidden"></span> | ||||
|     <% end %> | ||||
|  | ||||
|     <div | ||||
|       id="modal" | ||||
|       class="fade-in fixed z-10 left-0 top-0 | ||||
|       w-full h-full overflow-hidden | ||||
|       p-8 flex flex-col justify-center items-center" | ||||
|       style="opacity: 1 !important; background-color: rgba(0,0,0,0.4);" | ||||
|       phx-remove={hide_modal()} | ||||
|       class="fixed z-10 left-0 top-0 pointer-events-none | ||||
|         w-full h-full overflow-hidden | ||||
|         p-4 sm:p-8 flex flex-col justify-center items-center" | ||||
|     > | ||||
|       <div | ||||
|         id="modal-content" | ||||
|         class="fade-in-scale w-full max-w-3xl max-h-128 relative overflow-y-auto | ||||
|         class="fade-in-scale w-full max-w-3xl relative | ||||
|         pointer-events-auto overflow-hidden | ||||
|         px-8 py-4 sm:py-8 flex flex-col justify-center items-center | ||||
|         flex flex-col justify-start items-center | ||||
|         bg-white border-2 rounded-lg" | ||||
|         phx-click-away={hide_modal()} | ||||
|         phx-window-keydown={hide_modal()} | ||||
|         phx-key="escape" | ||||
|       > | ||||
|         <%= live_patch to: @return_to, | ||||
|                    id: "close", | ||||
|                    class: | ||||
|                      "absolute top-8 right-10 text-gray-500 hover:text-gray-800 transition-all duration-500 ease-in-out", | ||||
|                    phx_click: hide_modal() do %> | ||||
|                      "absolute top-8 right-10 | ||||
|                       text-gray-500 hover:text-gray-800 | ||||
|                       transition-all duration-500 ease-in-out", | ||||
|                    phx_remove: hide_modal() do %> | ||||
|           <i class="fa-fw fa-lg fas fa-times"></i> | ||||
|         <% end %> | ||||
|  | ||||
|         <div class="w-full p-8 flex flex-col space-y-4 justify-start items-center"> | ||||
|         <div | ||||
|           class="overflow-x-hidden overflow-y-auto w-full p-8 flex flex-col space-y-4 justify-start items-center" | ||||
|         > | ||||
|           <%= render_slot(@inner_block) %> | ||||
|         </div> | ||||
|       </div> | ||||
| @@ -74,6 +87,7 @@ defmodule CanneryWeb.LiveHelpers do | ||||
|   def hide_modal(js \\ %JS{}) do | ||||
|     js | ||||
|     |> JS.hide(to: "#modal", transition: "fade-out") | ||||
|     |> JS.hide(to: "#modal-bg", transition: "fade-out") | ||||
|     |> JS.hide(to: "#modal-content", transition: "fade-out-scale") | ||||
|   end | ||||
| end | ||||
|   | ||||
| @@ -7,7 +7,7 @@ | ||||
|     let={f} | ||||
|     for={@changeset} | ||||
|     id="shot-group-form" | ||||
|     class="flex flex-col sm:grid sm:grid-cols-3 sm:gap-4 justify-center items-center" | ||||
|     class="flex flex-col space-y-4 sm:space-y-0 sm:grid sm:grid-cols-3 sm:gap-4 justify-center items-center" | ||||
|     phx-target={@myself} | ||||
|     phx-change="validate" | ||||
|     phx-submit="save" | ||||
|   | ||||
| @@ -36,7 +36,7 @@ defmodule CanneryWeb.TagLive.FormComponent do | ||||
|         let={f} | ||||
|         for={@changeset} | ||||
|         id="tag-form" | ||||
|         class="flex flex-col sm:grid sm:grid-cols-3 sm:gap-4 justify-center items-center" | ||||
|         class="flex flex-col space-y-4 sm:space-y-0 sm:grid sm:grid-cols-3 sm:gap-4 justify-center items-center" | ||||
|         phx-target={@myself} | ||||
|         phx-change="validate" | ||||
|         phx-submit="save" | ||||
|   | ||||
| @@ -15,7 +15,7 @@ defmodule CanneryWeb.TagLive.Index do | ||||
|  | ||||
|   @impl true | ||||
|   def handle_params(params, _url, %{assigns: %{live_action: live_action}} = socket) do | ||||
|     {:noreply, apply_action(socket, live_action, params)} | ||||
|     {:noreply, apply_action(socket, live_action, params) |> display_tags} | ||||
|   end | ||||
|  | ||||
|   defp apply_action(%{assigns: %{current_user: current_user}} = socket, :edit, %{"id" => id}) do | ||||
|   | ||||
| @@ -64,10 +64,11 @@ defmodule CanneryWeb.Router do | ||||
|     live "/containers", ContainerLive.Index, :index | ||||
|     live "/containers/new", ContainerLive.Index, :new | ||||
|     live "/containers/:id/edit", ContainerLive.Index, :edit | ||||
|     live "/containers/:id/edit_tags", ContainerLive.Index, :edit_tags | ||||
|  | ||||
|     live "/containers/:id", ContainerLive.Show, :show | ||||
|     live "/containers/:id/show/edit", ContainerLive.Show, :edit | ||||
|     live "/containers/:id/show/add_tag", ContainerLive.Show, :add_tag | ||||
|     live "/containers/:id/show/edit_tags", ContainerLive.Show, :edit_tags | ||||
|  | ||||
|     live "/ammo_groups", AmmoGroupLive.Index, :index | ||||
|     live "/ammo_groups/new", AmmoGroupLive.Index, :new | ||||
|   | ||||
| @@ -29,7 +29,7 @@ | ||||
|  | ||||
| <div | ||||
|   id="loading" | ||||
|   class="absolute opacity-0 top-0 left-0 w-screen h-screen bg-white z-50 | ||||
|   class="fixed opacity-0 top-0 left-0 w-screen h-screen bg-white z-50 | ||||
|   flex flex-col justify-center items-center space-y-4 | ||||
|   transition-opacity ease-in-out duration-500" | ||||
| > | ||||
| @@ -42,7 +42,7 @@ | ||||
|  | ||||
| <div | ||||
|   id="disconnect" | ||||
|   class="absolute opacity-0 top-0 left-0 w-screen h-screen bg-white z-50 | ||||
|   class="fixed opacity-0 top-0 left-0 w-screen h-screen bg-white z-50 | ||||
|   flex flex-col justify-center items-center space-y-4 | ||||
|   transition-opacity ease-in-out duration-500" | ||||
| > | ||||
|   | ||||
| @@ -5,7 +5,8 @@ | ||||
|     <meta http-equiv="X-UA-Compatible" content="IE=edge" /> | ||||
|     <meta name="viewport" content="width=device-width, initial-scale=1.0" /> | ||||
|     <%= csrf_meta_tag() %> | ||||
|     <%= live_title_tag(assigns[:page_title] || "Cannery", suffix: "") %> | ||||
|     <%= if(assigns |> Map.has_key?(:page_title), do: @page_title, else: "Cannery") | ||||
|     |> live_title_tag(suffix: " | Cannery") %> | ||||
|     <link phx-track-static rel="stylesheet" href={Routes.static_path(@conn, "/css/app.css")} /> | ||||
|     <script | ||||
|       defer | ||||
|   | ||||
| @@ -7,7 +7,7 @@ | ||||
|            Routes.user_confirmation_path(@conn, :create), | ||||
|            [ | ||||
|              class: | ||||
|                "flex flex-col sm:grid sm:grid-cols-3 sm:gap-4 justify-center items-center" | ||||
|                "flex flex-col space-y-4 sm:space-y-0 sm:grid sm:grid-cols-3 sm:gap-4 justify-center items-center" | ||||
|            ], | ||||
|            fn f -> %> | ||||
|     <%= label(f, :email, class: "title text-lg text-primary-600") %> | ||||
|   | ||||
| @@ -7,7 +7,7 @@ | ||||
|            Routes.user_registration_path(@conn, :create), | ||||
|            [ | ||||
|              class: | ||||
|                "flex flex-col sm:grid sm:grid-cols-3 sm:gap-4 justify-center items-center" | ||||
|                "flex flex-col space-y-4 sm:space-y-0 sm:grid sm:grid-cols-3 sm:gap-4 justify-center items-center" | ||||
|            ], | ||||
|            fn f -> %> | ||||
|     <%= if @changeset.action && not @changeset.valid? do %> | ||||
|   | ||||
| @@ -7,7 +7,7 @@ | ||||
|            Routes.user_reset_password_path(@conn, :update, @token), | ||||
|            [ | ||||
|              class: | ||||
|                "flex flex-col sm:grid sm:grid-cols-3 sm:gap-4 justify-center items-center" | ||||
|                "flex flex-col space-y-4 sm:space-y-0 sm:grid sm:grid-cols-3 sm:gap-4 justify-center items-center" | ||||
|            ], | ||||
|            fn f -> %> | ||||
|     <%= if @changeset.action && not @changeset.valid? do %> | ||||
|   | ||||
| @@ -7,7 +7,7 @@ | ||||
|            Routes.user_reset_password_path(@conn, :create), | ||||
|            [ | ||||
|              class: | ||||
|                "flex flex-col sm:grid sm:grid-cols-3 sm:gap-4 justify-center items-center" | ||||
|                "flex flex-col space-y-4 sm:space-y-0 sm:grid sm:grid-cols-3 sm:gap-4 justify-center items-center" | ||||
|            ], | ||||
|            fn f -> %> | ||||
|     <%= label(f, :email, class: "title text-lg text-primary-600") %> | ||||
|   | ||||
| @@ -8,7 +8,7 @@ | ||||
|            [ | ||||
|              as: :user, | ||||
|              class: | ||||
|                "flex flex-col sm:grid sm:grid-cols-3 sm:gap-4 justify-center items-center" | ||||
|                "flex flex-col space-y-4 sm:space-y-0 sm:grid sm:grid-cols-3 sm:gap-4 justify-center items-center" | ||||
|            ], | ||||
|            fn f -> %> | ||||
|     <%= if @error_message do %> | ||||
|   | ||||
| @@ -9,7 +9,7 @@ | ||||
|            Routes.user_settings_path(@conn, :update), | ||||
|            [ | ||||
|              class: | ||||
|                "pb-4 text-center flex flex-col sm:grid sm:grid-cols-3 sm:gap-4 justify-center items-center" | ||||
|                "flex flex-col space-y-4 sm:space-y-0 sm:grid sm:grid-cols-3 sm:gap-4 justify-center items-center" | ||||
|            ], | ||||
|            fn f -> %> | ||||
|     <h3 class="title text-primary-600 text-lg col-span-3"> | ||||
| @@ -53,7 +53,7 @@ | ||||
|            Routes.user_settings_path(@conn, :update), | ||||
|            [ | ||||
|              class: | ||||
|                "pb-4 text-center flex flex-col sm:grid sm:grid-cols-3 sm:gap-4 justify-center items-center" | ||||
|                "flex flex-col space-y-4 sm:space-y-0 sm:grid sm:grid-cols-3 sm:gap-4 justify-center items-center" | ||||
|            ], | ||||
|            fn f -> %> | ||||
|     <h3 class="title text-primary-600 text-lg col-span-3"> | ||||
|   | ||||
							
								
								
									
										2
									
								
								mix.exs
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								mix.exs
									
									
									
									
									
								
							| @@ -4,7 +4,7 @@ defmodule Cannery.MixProject do | ||||
|   def project do | ||||
|     [ | ||||
|       app: :cannery, | ||||
|       version: "0.1.0", | ||||
|       version: "0.2.2", | ||||
|       elixir: "~> 1.12", | ||||
|       elixirc_paths: elixirc_paths(Mix.env()), | ||||
|       compilers: [:gettext] ++ Mix.compilers(), | ||||
|   | ||||
| @@ -126,7 +126,7 @@ msgstr "" | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/components/add_shot_group_component.html.heex:42 | ||||
| #: lib/cannery_web/live/ammo_group_live/form_component.html.heex:54 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:172 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:156 | ||||
| #: lib/cannery_web/live/container_live/form_component.html.heex:50 | ||||
| #: lib/cannery_web/live/invite_live/form_component.html.heex:28 | ||||
| #: lib/cannery_web/live/range_live/form_component.html.heex:40 | ||||
| @@ -145,7 +145,7 @@ msgid "Why not add one?" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/container_live/add_tag_component.html.heex:17 | ||||
| #: lib/cannery_web/live/container_live/edit_tags_component.html.heex:52 | ||||
| msgid "Add" | ||||
| msgstr "" | ||||
|  | ||||
| @@ -161,13 +161,13 @@ msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/ammo_group_live/index.html.heex:85 | ||||
| #: lib/cannery_web/live/ammo_group_live/show.html.heex:67 | ||||
| #: lib/cannery_web/live/ammo_group_live/show.html.heex:86 | ||||
| #: lib/cannery_web/live/range_live/index.html.heex:36 | ||||
| msgid "Record shots" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/ammo_group_live/show.html.heex:31 | ||||
| #: lib/cannery_web/live/ammo_group_live/show.html.heex:50 | ||||
| msgid "Ammo Details" | ||||
| msgstr "" | ||||
|  | ||||
| @@ -177,7 +177,7 @@ msgid "Add another container!" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/ammo_group_live/show.html.heex:61 | ||||
| #: lib/cannery_web/live/ammo_group_live/show.html.heex:80 | ||||
| msgid "Move containers" | ||||
| msgstr "" | ||||
|  | ||||
|   | ||||
| @@ -11,12 +11,12 @@ msgid "" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/home_live.ex:57 | ||||
| #: lib/cannery_web/live/home_live.ex:63 | ||||
| msgid "%{name} lets you easily keep an eye on your ammo levels before and after range day" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/home_live.ex:79 | ||||
| #: lib/cannery_web/live/home_live.ex:85 | ||||
| msgid "Access from any internet-capable device" | ||||
| msgstr "" | ||||
|  | ||||
| @@ -26,7 +26,7 @@ msgid "Admins" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/home_live.ex:93 | ||||
| #: lib/cannery_web/live/home_live.ex:99 | ||||
| msgid "Admins:" | ||||
| msgstr "" | ||||
|  | ||||
| @@ -54,18 +54,19 @@ msgid "Background color" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:154 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:140 | ||||
| #: lib/cannery_web/live/ammo_type_live/index.ex:67 | ||||
| #: lib/cannery_web/live/ammo_type_live/show.html.heex:55 | ||||
| msgid "Blank" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:74 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:68 | ||||
| msgid "Brass" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:46 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:44 | ||||
| #: lib/cannery_web/live/ammo_type_live/index.ex:53 | ||||
| #: lib/cannery_web/live/ammo_type_live/show.html.heex:41 | ||||
| msgid "Bullet core" | ||||
| @@ -79,21 +80,21 @@ msgid "Bullet type" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:62 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:58 | ||||
| #: lib/cannery_web/live/ammo_type_live/index.ex:55 | ||||
| #: lib/cannery_web/live/ammo_type_live/show.html.heex:43 | ||||
| msgid "Caliber" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:55 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:51 | ||||
| #: lib/cannery_web/live/ammo_type_live/index.ex:54 | ||||
| #: lib/cannery_web/live/ammo_type_live/show.html.heex:42 | ||||
| msgid "Cartridge" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:69 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:65 | ||||
| #: lib/cannery_web/live/ammo_type_live/index.ex:56 | ||||
| #: lib/cannery_web/live/ammo_type_live/show.html.heex:44 | ||||
| msgid "Case material" | ||||
| @@ -113,8 +114,9 @@ msgid "Containers" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:158 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:144 | ||||
| #: lib/cannery_web/live/ammo_type_live/index.ex:68 | ||||
| #: lib/cannery_web/live/ammo_type_live/show.html.heex:56 | ||||
| msgid "Corrosive" | ||||
| msgstr "" | ||||
|  | ||||
| @@ -137,7 +139,7 @@ msgid "Description" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/components/container_card.ex:27 | ||||
| #: lib/cannery_web/components/container_card.ex:31 | ||||
| #: lib/cannery_web/live/container_live/show.html.heex:8 | ||||
| msgid "Description:" | ||||
| msgstr "" | ||||
| @@ -148,7 +150,7 @@ msgid "Disable" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/home_live.ex:54 | ||||
| #: lib/cannery_web/live/home_live.ex:60 | ||||
| msgid "Easy to Use:" | ||||
| msgstr "" | ||||
|  | ||||
| @@ -164,12 +166,6 @@ msgstr "" | ||||
| msgid "Edit Ammo type" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/container_live/index.ex:24 | ||||
| #: lib/cannery_web/live/container_live/show.ex:89 | ||||
| msgid "Edit Container" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/invite_live/index.ex:35 | ||||
| msgid "Edit Invite" | ||||
| @@ -191,25 +187,26 @@ msgid "Example bullet type abbreviations" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:42 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:40 | ||||
| msgid "FMJ" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:113 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:103 | ||||
| #: lib/cannery_web/live/ammo_type_live/index.ex:61 | ||||
| #: lib/cannery_web/live/ammo_type_live/show.html.heex:49 | ||||
| msgid "Grains" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:150 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:136 | ||||
| #: lib/cannery_web/live/ammo_type_live/index.ex:66 | ||||
| #: lib/cannery_web/live/ammo_type_live/show.html.heex:54 | ||||
| msgid "Incendiary" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/home_live.ex:88 | ||||
| #: lib/cannery_web/live/home_live.ex:94 | ||||
| msgid "Instance Information" | ||||
| msgstr "" | ||||
|  | ||||
| @@ -219,7 +216,7 @@ msgid "Invite Disabled" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/home_live.ex:119 | ||||
| #: lib/cannery_web/live/home_live.ex:125 | ||||
| msgid "Invite Only" | ||||
| msgstr "" | ||||
|  | ||||
| @@ -240,7 +237,7 @@ msgid "Listing Ammo types" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/container_live/index.ex:33 | ||||
| #: lib/cannery_web/live/container_live/index.ex:38 | ||||
| msgid "Listing Containers" | ||||
| msgstr "" | ||||
|  | ||||
| @@ -261,7 +258,7 @@ msgid "Location" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/components/container_card.ex:39 | ||||
| #: lib/cannery_web/components/container_card.ex:43 | ||||
| #: lib/cannery_web/live/container_live/show.html.heex:20 | ||||
| msgid "Location:" | ||||
| msgstr "" | ||||
| @@ -277,8 +274,9 @@ msgid "Manage" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:162 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:148 | ||||
| #: lib/cannery_web/live/ammo_type_live/index.ex:69 | ||||
| #: lib/cannery_web/live/ammo_type_live/show.html.heex:57 | ||||
| msgid "Manufacturer" | ||||
| msgstr "" | ||||
|  | ||||
| @@ -307,7 +305,7 @@ msgid "New Ammo type" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/container_live/index.ex:29 | ||||
| #: lib/cannery_web/live/container_live/index.ex:33 | ||||
| msgid "New Container" | ||||
| msgstr "" | ||||
|  | ||||
| @@ -332,12 +330,12 @@ msgid "No Ammo Types" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/ammo_type_live/show.html.heex:109 | ||||
| #: lib/cannery_web/live/ammo_type_live/show.html.heex:114 | ||||
| msgid "No ammo for this type" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/container_live/show.html.heex:88 | ||||
| #: lib/cannery_web/live/container_live/show.html.heex:77 | ||||
| msgid "No ammo groups in this container" | ||||
| msgstr "" | ||||
|  | ||||
| @@ -352,6 +350,7 @@ msgid "No invites" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/container_live/edit_tags_component.html.heex:30 | ||||
| #: lib/cannery_web/live/tag_live/index.html.heex:10 | ||||
| msgid "No tags" | ||||
| msgstr "" | ||||
| @@ -359,7 +358,7 @@ msgstr "" | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/components/add_shot_group_component.html.heex:30 | ||||
| #: lib/cannery_web/live/ammo_group_live/form_component.html.heex:41 | ||||
| #: lib/cannery_web/live/ammo_group_live/index.html.heex:36 | ||||
| #: lib/cannery_web/live/ammo_group_live/show.html.heex:122 | ||||
| #: lib/cannery_web/live/range_live/form_component.html.heex:29 | ||||
| #: lib/cannery_web/live/range_live/index.html.heex:67 | ||||
| msgid "Notes" | ||||
| @@ -367,7 +366,7 @@ msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/components/ammo_group_card.ex:35 | ||||
| #: lib/cannery_web/live/ammo_group_live/show.html.heex:14 | ||||
| #: lib/cannery_web/live/ammo_group_live/show.html.heex:24 | ||||
| msgid "Notes:" | ||||
| msgstr "" | ||||
|  | ||||
| @@ -377,7 +376,7 @@ msgid "On the bookshelf" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:121 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:111 | ||||
| #: lib/cannery_web/live/ammo_type_live/index.ex:62 | ||||
| #: lib/cannery_web/live/ammo_type_live/show.html.heex:50 | ||||
| msgid "Pressure" | ||||
| @@ -391,34 +390,28 @@ msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/components/ammo_group_card.ex:42 | ||||
| #: lib/cannery_web/live/ammo_group_live/show.html.heex:21 | ||||
| msgid "Price paid:" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:128 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:118 | ||||
| #: lib/cannery_web/live/ammo_type_live/index.ex:63 | ||||
| #: lib/cannery_web/live/ammo_type_live/show.html.heex:51 | ||||
| msgid "Primer type" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/home_live.ex:118 | ||||
| #: lib/cannery_web/live/home_live.ex:124 | ||||
| msgid "Public Signups" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/ammo_type_live/index.ex:64 | ||||
| msgid "Rimfire" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/home_live.ex:66 | ||||
| #: lib/cannery_web/live/home_live.ex:72 | ||||
| msgid "Secure:" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/home_live.ex:69 | ||||
| #: lib/cannery_web/live/home_live.ex:75 | ||||
| msgid "Self-host your own instance, or use an instance from someone you trust." | ||||
| msgstr "" | ||||
|  | ||||
| @@ -428,6 +421,7 @@ msgid "Set Unlimited" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/controllers/user_settings_controller.ex:10 | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:3 | ||||
| msgid "Settings" | ||||
| msgstr "" | ||||
| @@ -443,28 +437,22 @@ msgid "Show Ammo type" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/container_live/show.ex:88 | ||||
| msgid "Show Container" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/home_live.ex:76 | ||||
| #: lib/cannery_web/live/home_live.ex:82 | ||||
| msgid "Simple:" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:51 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:47 | ||||
| msgid "Steel" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/ammo_group_live/show.html.heex:79 | ||||
| #: lib/cannery_web/live/ammo_group_live/show.html.heex:98 | ||||
| msgid "Stored in" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/components/topbar.ex:40 | ||||
| #: lib/cannery_web/live/container_live/show.html.heex:60 | ||||
| #: lib/cannery_web/live/tag_live/index.html.heex:3 | ||||
| msgid "Tags" | ||||
| msgstr "" | ||||
| @@ -480,18 +468,19 @@ msgid "Text color" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/home_live.ex:45 | ||||
| #: lib/cannery_web/live/home_live.ex:51 | ||||
| msgid "The self-hosted firearm tracker website" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/ammo_group_live/show.html.heex:84 | ||||
| #: lib/cannery_web/live/ammo_group_live/show.html.heex:103 | ||||
| msgid "This ammo group is not in a container" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:146 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:132 | ||||
| #: lib/cannery_web/live/ammo_type_live/index.ex:65 | ||||
| #: lib/cannery_web/live/ammo_type_live/show.html.heex:53 | ||||
| msgid "Tracer" | ||||
| msgstr "" | ||||
|  | ||||
| @@ -502,7 +491,7 @@ msgid "Type" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/components/container_card.ex:33 | ||||
| #: lib/cannery_web/components/container_card.ex:37 | ||||
| #: lib/cannery_web/live/container_live/show.html.heex:14 | ||||
| msgid "Type:" | ||||
| msgstr "" | ||||
| @@ -523,20 +512,15 @@ msgid "Uses left" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/home_live.ex:41 | ||||
| #: lib/cannery_web/live/home_live.ex:47 | ||||
| msgid "Welcome to %{name}" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/home_live.ex:70 | ||||
| #: lib/cannery_web/live/home_live.ex:76 | ||||
| msgid "Your data stays with you, period" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/container_live/show.ex:90 | ||||
| msgid "Add Tag to Container" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/container_live/show.html.heex:49 | ||||
| msgid "No tags for this container" | ||||
| @@ -554,6 +538,7 @@ msgid "Range day" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/ammo_group_live/show.html.heex:125 | ||||
| #: lib/cannery_web/live/range_live/index.html.heex:70 | ||||
| msgid "Date" | ||||
| msgstr "" | ||||
| @@ -569,13 +554,13 @@ msgid "No ammo staged" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/ammo_group_live/show.html.heex:58 | ||||
| #: lib/cannery_web/live/ammo_group_live/show.html.heex:77 | ||||
| #: lib/cannery_web/live/range_live/index.html.heex:33 | ||||
| msgid "Stage for range" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/ammo_group_live/show.html.heex:57 | ||||
| #: lib/cannery_web/live/ammo_group_live/show.html.heex:76 | ||||
| #: lib/cannery_web/live/range_live/index.html.heex:32 | ||||
| msgid "Unstage from range" | ||||
| msgstr "" | ||||
| @@ -629,6 +614,7 @@ msgid "Rounds left" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/ammo_group_live/show.html.heex:119 | ||||
| #: lib/cannery_web/live/range_live/index.html.heex:64 | ||||
| msgid "Rounds shot" | ||||
| msgstr "" | ||||
| @@ -662,47 +648,49 @@ msgstr "" | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/components/ammo_group_card.ex:43 | ||||
| #: lib/cannery_web/live/ammo_group_live/index.html.heex:64 | ||||
| #: lib/cannery_web/live/ammo_group_live/show.html.heex:22 | ||||
| #: lib/cannery_web/live/ammo_group_live/show.html.heex:32 | ||||
| #: lib/cannery_web/live/ammo_group_live/show.html.heex:39 | ||||
| #: lib/cannery_web/live/ammo_type_live/show.html.heex:98 | ||||
| msgid "$%{amount}" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:83 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:75 | ||||
| msgid "Bimetal" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:78 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:72 | ||||
| #: lib/cannery_web/live/ammo_type_live/index.ex:57 | ||||
| #: lib/cannery_web/live/ammo_type_live/show.html.heex:45 | ||||
| msgid "Jacket type" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:87 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:79 | ||||
| #: lib/cannery_web/live/ammo_type_live/index.ex:58 | ||||
| #: lib/cannery_web/live/ammo_type_live/show.html.heex:46 | ||||
| msgid "Muzzle velocity" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:103 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:93 | ||||
| #: lib/cannery_web/live/ammo_type_live/index.ex:60 | ||||
| #: lib/cannery_web/live/ammo_type_live/show.html.heex:48 | ||||
| msgid "Powder grains per charge" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:97 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:89 | ||||
| #: lib/cannery_web/live/ammo_type_live/index.ex:59 | ||||
| #: lib/cannery_web/live/ammo_type_live/show.html.heex:47 | ||||
| msgid "Powder type" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:168 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:152 | ||||
| #: lib/cannery_web/live/ammo_type_live/index.ex:70 | ||||
| #: lib/cannery_web/live/ammo_type_live/show.html.heex:58 | ||||
| msgid "UPC" | ||||
| msgstr "" | ||||
|  | ||||
| @@ -733,7 +721,9 @@ msgid "Unstage" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:137 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:125 | ||||
| #: lib/cannery_web/live/ammo_type_live/index.ex:64 | ||||
| #: lib/cannery_web/live/ammo_type_live/show.html.heex:52 | ||||
| msgid "Firing type" | ||||
| msgstr "" | ||||
|  | ||||
| @@ -746,3 +736,100 @@ msgstr "" | ||||
| #: lib/cannery_web/templates/layout/live.html.heex:37 | ||||
| msgid "Loading..." | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/container_live/index.ex:29 | ||||
| #: lib/cannery_web/live/container_live/show.ex:97 | ||||
| msgid "Edit %{name}" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/container_live/index.ex:48 | ||||
| #: lib/cannery_web/live/container_live/show.ex:98 | ||||
| msgid "Edit %{name} tags" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/components/container_card.ex:50 | ||||
| msgid "Rounds:" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/container_live/show.ex:96 | ||||
| msgid "Show %{name}" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/ammo_type_live/show.html.heex:104 | ||||
| msgid "No cost information" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/ammo_group_live/index.html.heex:36 | ||||
| msgid "% left" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/ammo_group_live/show.html.heex:38 | ||||
| msgid "Current value:" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/ammo_group_live/show.html.heex:31 | ||||
| msgid "Original cost:" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/ammo_group_live/show.html.heex:13 | ||||
| msgid "Original count:" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/ammo_group_live/show.html.heex:18 | ||||
| msgid "Percentage left:" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/ammo_group_live/show.html.heex:111 | ||||
| msgid "Rounds used" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/ammo_type_live/show.html.heex:77 | ||||
| msgid "Current # of rounds:" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/ammo_type_live/index.html.heex:32 | ||||
| msgid "Total # of rounds" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/ammo_type_live/show.html.heex:85 | ||||
| msgid "Total rounds shot:" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/controllers/user_confirmation_controller.ex:8 | ||||
| msgid "Confirm your account" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/controllers/user_reset_password_controller.ex:9 | ||||
| msgid "Forgot your password?" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/controllers/user_session_controller.ex:8 | ||||
| msgid "Log in" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/controllers/user_registration_controller.ex:35 | ||||
| msgid "Register" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/controllers/user_reset_password_controller.ex:36 | ||||
| msgid "Reset your password" | ||||
| msgstr "" | ||||
|   | ||||
| @@ -32,14 +32,14 @@ msgid "Add your first type!" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:17 | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:46 | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:16 | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:45 | ||||
| msgid "Change email" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:61 | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:102 | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:60 | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:101 | ||||
| msgid "Change password" | ||||
| msgstr "" | ||||
|  | ||||
| @@ -49,14 +49,14 @@ msgid "Create Invite" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:109 | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:108 | ||||
| msgid "Delete User" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/templates/user_registration/new.html.heex:44 | ||||
| #: lib/cannery_web/templates/user_registration/new.html.heex:43 | ||||
| #: lib/cannery_web/templates/user_reset_password/new.html.heex:3 | ||||
| #: lib/cannery_web/templates/user_session/new.html.heex:46 | ||||
| #: lib/cannery_web/templates/user_session/new.html.heex:45 | ||||
| msgid "Forgot your password?" | ||||
| msgstr "" | ||||
|  | ||||
| @@ -67,12 +67,12 @@ msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/components/topbar.ex:108 | ||||
| #: lib/cannery_web/templates/user_confirmation/new.html.heex:31 | ||||
| #: lib/cannery_web/templates/user_registration/new.html.heex:40 | ||||
| #: lib/cannery_web/templates/user_reset_password/edit.html.heex:49 | ||||
| #: lib/cannery_web/templates/user_reset_password/new.html.heex:31 | ||||
| #: lib/cannery_web/templates/user_confirmation/new.html.heex:30 | ||||
| #: lib/cannery_web/templates/user_registration/new.html.heex:39 | ||||
| #: lib/cannery_web/templates/user_reset_password/edit.html.heex:48 | ||||
| #: lib/cannery_web/templates/user_reset_password/new.html.heex:30 | ||||
| #: lib/cannery_web/templates/user_session/new.html.heex:3 | ||||
| #: lib/cannery_web/templates/user_session/new.html.heex:34 | ||||
| #: lib/cannery_web/templates/user_session/new.html.heex:33 | ||||
| msgid "Log in" | ||||
| msgstr "" | ||||
|  | ||||
| @@ -103,31 +103,31 @@ msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/components/topbar.ex:101 | ||||
| #: lib/cannery_web/templates/user_confirmation/new.html.heex:26 | ||||
| #: lib/cannery_web/templates/user_confirmation/new.html.heex:25 | ||||
| #: 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:44 | ||||
| #: lib/cannery_web/templates/user_reset_password/new.html.heex:26 | ||||
| #: lib/cannery_web/templates/user_session/new.html.heex:41 | ||||
| #: lib/cannery_web/templates/user_registration/new.html.heex:33 | ||||
| #: lib/cannery_web/templates/user_reset_password/edit.html.heex:43 | ||||
| #: lib/cannery_web/templates/user_reset_password/new.html.heex:25 | ||||
| #: lib/cannery_web/templates/user_session/new.html.heex:40 | ||||
| msgid "Register" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/templates/user_confirmation/new.html.heex:3 | ||||
| #: lib/cannery_web/templates/user_confirmation/new.html.heex:17 | ||||
| #: lib/cannery_web/templates/user_confirmation/new.html.heex:16 | ||||
| msgid "Resend confirmation instructions" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/templates/user_reset_password/edit.html.heex:3 | ||||
| #: lib/cannery_web/templates/user_reset_password/edit.html.heex:35 | ||||
| #: lib/cannery_web/templates/user_reset_password/edit.html.heex:34 | ||||
| msgid "Reset password" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/components/add_shot_group_component.html.heex:42 | ||||
| #: lib/cannery_web/live/ammo_group_live/form_component.html.heex:54 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:175 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:156 | ||||
| #: lib/cannery_web/live/container_live/form_component.html.heex:50 | ||||
| #: lib/cannery_web/live/invite_live/form_component.html.heex:28 | ||||
| #: lib/cannery_web/live/range_live/form_component.html.heex:40 | ||||
| @@ -136,7 +136,7 @@ msgid "Save" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/templates/user_reset_password/new.html.heex:17 | ||||
| #: lib/cannery_web/templates/user_reset_password/new.html.heex:16 | ||||
| msgid "Send instructions to reset password" | ||||
| msgstr "" | ||||
|  | ||||
| @@ -146,7 +146,7 @@ msgid "Why not add one?" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/container_live/add_tag_component.html.heex:17 | ||||
| #: lib/cannery_web/live/container_live/edit_tags_component.html.heex:52 | ||||
| msgid "Add" | ||||
| msgstr "" | ||||
|  | ||||
| @@ -162,13 +162,13 @@ msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/ammo_group_live/index.html.heex:85 | ||||
| #: lib/cannery_web/live/ammo_group_live/show.html.heex:67 | ||||
| #: lib/cannery_web/live/ammo_group_live/show.html.heex:86 | ||||
| #: lib/cannery_web/live/range_live/index.html.heex:36 | ||||
| msgid "Record shots" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/ammo_group_live/show.html.heex:31 | ||||
| #: lib/cannery_web/live/ammo_group_live/show.html.heex:50 | ||||
| msgid "Ammo Details" | ||||
| msgstr "" | ||||
|  | ||||
| @@ -178,7 +178,7 @@ msgid "Add another container!" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/ammo_group_live/show.html.heex:61 | ||||
| #: lib/cannery_web/live/ammo_group_live/show.html.heex:80 | ||||
| msgid "Move containers" | ||||
| msgstr "" | ||||
|  | ||||
|   | ||||
| @@ -12,12 +12,12 @@ msgstr "" | ||||
| "Plural-Forms: nplurals=2\n" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/home_live.ex:57 | ||||
| #: lib/cannery_web/live/home_live.ex:63 | ||||
| msgid "%{name} lets you easily keep an eye on your ammo levels before and after range day" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/home_live.ex:79 | ||||
| #: lib/cannery_web/live/home_live.ex:85 | ||||
| msgid "Access from any internet-capable device" | ||||
| msgstr "" | ||||
|  | ||||
| @@ -27,7 +27,7 @@ msgid "Admins" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/home_live.ex:93 | ||||
| #: lib/cannery_web/live/home_live.ex:99 | ||||
| msgid "Admins:" | ||||
| msgstr "" | ||||
|  | ||||
| @@ -55,19 +55,19 @@ msgid "Background color" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:157 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:140 | ||||
| #: lib/cannery_web/live/ammo_type_live/index.ex:67 | ||||
| #: lib/cannery_web/live/ammo_type_live/show.html.heex:55 | ||||
| msgid "Blank" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:74 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:102 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:68 | ||||
| msgid "Brass" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:46 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:44 | ||||
| #: lib/cannery_web/live/ammo_type_live/index.ex:53 | ||||
| #: lib/cannery_web/live/ammo_type_live/show.html.heex:41 | ||||
| msgid "Bullet core" | ||||
| @@ -81,21 +81,21 @@ msgid "Bullet type" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:62 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:58 | ||||
| #: lib/cannery_web/live/ammo_type_live/index.ex:55 | ||||
| #: lib/cannery_web/live/ammo_type_live/show.html.heex:43 | ||||
| msgid "Caliber" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:55 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:51 | ||||
| #: lib/cannery_web/live/ammo_type_live/index.ex:54 | ||||
| #: lib/cannery_web/live/ammo_type_live/show.html.heex:42 | ||||
| msgid "Cartridge" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:69 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:65 | ||||
| #: lib/cannery_web/live/ammo_type_live/index.ex:56 | ||||
| #: lib/cannery_web/live/ammo_type_live/show.html.heex:44 | ||||
| msgid "Case material" | ||||
| @@ -115,8 +115,9 @@ msgid "Containers" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:161 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:144 | ||||
| #: lib/cannery_web/live/ammo_type_live/index.ex:68 | ||||
| #: lib/cannery_web/live/ammo_type_live/show.html.heex:56 | ||||
| msgid "Corrosive" | ||||
| msgstr "" | ||||
|  | ||||
| @@ -139,7 +140,7 @@ msgid "Description" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/components/container_card.ex:27 | ||||
| #: lib/cannery_web/components/container_card.ex:31 | ||||
| #: lib/cannery_web/live/container_live/show.html.heex:8 | ||||
| msgid "Description:" | ||||
| msgstr "" | ||||
| @@ -150,7 +151,7 @@ msgid "Disable" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/home_live.ex:54 | ||||
| #: lib/cannery_web/live/home_live.ex:60 | ||||
| msgid "Easy to Use:" | ||||
| msgstr "" | ||||
|  | ||||
| @@ -166,12 +167,6 @@ msgstr "" | ||||
| msgid "Edit Ammo type" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/container_live/index.ex:24 | ||||
| #: lib/cannery_web/live/container_live/show.ex:89 | ||||
| msgid "Edit Container" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/invite_live/index.ex:35 | ||||
| msgid "Edit Invite" | ||||
| @@ -193,25 +188,26 @@ msgid "Example bullet type abbreviations" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:42 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:40 | ||||
| msgid "FMJ" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:116 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:103 | ||||
| #: lib/cannery_web/live/ammo_type_live/index.ex:61 | ||||
| #: lib/cannery_web/live/ammo_type_live/show.html.heex:49 | ||||
| msgid "Grains" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:153 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:136 | ||||
| #: lib/cannery_web/live/ammo_type_live/index.ex:66 | ||||
| #: lib/cannery_web/live/ammo_type_live/show.html.heex:54 | ||||
| msgid "Incendiary" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/home_live.ex:88 | ||||
| #: lib/cannery_web/live/home_live.ex:94 | ||||
| msgid "Instance Information" | ||||
| msgstr "" | ||||
|  | ||||
| @@ -221,7 +217,7 @@ msgid "Invite Disabled" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/home_live.ex:119 | ||||
| #: lib/cannery_web/live/home_live.ex:125 | ||||
| msgid "Invite Only" | ||||
| msgstr "" | ||||
|  | ||||
| @@ -232,7 +228,7 @@ msgid "Invites" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/templates/user_session/new.html.heex:29 | ||||
| #: lib/cannery_web/templates/user_session/new.html.heex:28 | ||||
| msgid "Keep me logged in for 60 days" | ||||
| msgstr "" | ||||
|  | ||||
| @@ -242,7 +238,7 @@ msgid "Listing Ammo types" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/container_live/index.ex:33 | ||||
| #: lib/cannery_web/live/container_live/index.ex:38 | ||||
| msgid "Listing Containers" | ||||
| msgstr "" | ||||
|  | ||||
| @@ -263,7 +259,7 @@ msgid "Location" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/components/container_card.ex:39 | ||||
| #: lib/cannery_web/components/container_card.ex:43 | ||||
| #: lib/cannery_web/live/container_live/show.html.heex:20 | ||||
| msgid "Location:" | ||||
| msgstr "" | ||||
| @@ -279,8 +275,9 @@ msgid "Manage" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:165 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:148 | ||||
| #: lib/cannery_web/live/ammo_type_live/index.ex:69 | ||||
| #: lib/cannery_web/live/ammo_type_live/show.html.heex:57 | ||||
| msgid "Manufacturer" | ||||
| msgstr "" | ||||
|  | ||||
| @@ -309,7 +306,7 @@ msgid "New Ammo type" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/container_live/index.ex:29 | ||||
| #: lib/cannery_web/live/container_live/index.ex:33 | ||||
| msgid "New Container" | ||||
| msgstr "" | ||||
|  | ||||
| @@ -334,12 +331,12 @@ msgid "No Ammo Types" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/ammo_type_live/show.html.heex:109 | ||||
| #: lib/cannery_web/live/ammo_type_live/show.html.heex:114 | ||||
| msgid "No ammo for this type" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/container_live/show.html.heex:88 | ||||
| #: lib/cannery_web/live/container_live/show.html.heex:77 | ||||
| msgid "No ammo groups in this container" | ||||
| msgstr "" | ||||
|  | ||||
| @@ -354,6 +351,7 @@ msgid "No invites" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/container_live/edit_tags_component.html.heex:30 | ||||
| #: lib/cannery_web/live/tag_live/index.html.heex:10 | ||||
| msgid "No tags" | ||||
| msgstr "" | ||||
| @@ -361,7 +359,7 @@ msgstr "" | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/components/add_shot_group_component.html.heex:30 | ||||
| #: lib/cannery_web/live/ammo_group_live/form_component.html.heex:41 | ||||
| #: lib/cannery_web/live/ammo_group_live/index.html.heex:36 | ||||
| #: lib/cannery_web/live/ammo_group_live/show.html.heex:122 | ||||
| #: lib/cannery_web/live/range_live/form_component.html.heex:29 | ||||
| #: lib/cannery_web/live/range_live/index.html.heex:67 | ||||
| msgid "Notes" | ||||
| @@ -369,7 +367,7 @@ msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/components/ammo_group_card.ex:35 | ||||
| #: lib/cannery_web/live/ammo_group_live/show.html.heex:14 | ||||
| #: lib/cannery_web/live/ammo_group_live/show.html.heex:24 | ||||
| msgid "Notes:" | ||||
| msgstr "" | ||||
|  | ||||
| @@ -379,7 +377,7 @@ msgid "On the bookshelf" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:124 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:111 | ||||
| #: lib/cannery_web/live/ammo_type_live/index.ex:62 | ||||
| #: lib/cannery_web/live/ammo_type_live/show.html.heex:50 | ||||
| msgid "Pressure" | ||||
| @@ -393,34 +391,28 @@ msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/components/ammo_group_card.ex:42 | ||||
| #: lib/cannery_web/live/ammo_group_live/show.html.heex:21 | ||||
| msgid "Price paid:" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:131 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:118 | ||||
| #: lib/cannery_web/live/ammo_type_live/index.ex:63 | ||||
| #: lib/cannery_web/live/ammo_type_live/show.html.heex:51 | ||||
| msgid "Primer type" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/home_live.ex:118 | ||||
| #: lib/cannery_web/live/home_live.ex:124 | ||||
| msgid "Public Signups" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/ammo_type_live/index.ex:64 | ||||
| msgid "Rimfire" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/home_live.ex:66 | ||||
| #: lib/cannery_web/live/home_live.ex:72 | ||||
| msgid "Secure:" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/home_live.ex:69 | ||||
| #: lib/cannery_web/live/home_live.ex:75 | ||||
| msgid "Self-host your own instance, or use an instance from someone you trust." | ||||
| msgstr "" | ||||
|  | ||||
| @@ -430,6 +422,7 @@ msgid "Set Unlimited" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/controllers/user_settings_controller.ex:10 | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:3 | ||||
| msgid "Settings" | ||||
| msgstr "" | ||||
| @@ -445,28 +438,22 @@ msgid "Show Ammo type" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/container_live/show.ex:88 | ||||
| msgid "Show Container" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/home_live.ex:76 | ||||
| #: lib/cannery_web/live/home_live.ex:82 | ||||
| msgid "Simple:" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:51 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:47 | ||||
| msgid "Steel" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/ammo_group_live/show.html.heex:79 | ||||
| #: lib/cannery_web/live/ammo_group_live/show.html.heex:98 | ||||
| msgid "Stored in" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/components/topbar.ex:40 | ||||
| #: lib/cannery_web/live/container_live/show.html.heex:60 | ||||
| #: lib/cannery_web/live/tag_live/index.html.heex:3 | ||||
| msgid "Tags" | ||||
| msgstr "" | ||||
| @@ -482,18 +469,19 @@ msgid "Text color" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/home_live.ex:45 | ||||
| #: lib/cannery_web/live/home_live.ex:51 | ||||
| msgid "The self-hosted firearm tracker website" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/ammo_group_live/show.html.heex:84 | ||||
| #: lib/cannery_web/live/ammo_group_live/show.html.heex:103 | ||||
| msgid "This ammo group is not in a container" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:149 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:132 | ||||
| #: lib/cannery_web/live/ammo_type_live/index.ex:65 | ||||
| #: lib/cannery_web/live/ammo_type_live/show.html.heex:53 | ||||
| msgid "Tracer" | ||||
| msgstr "" | ||||
|  | ||||
| @@ -504,7 +492,7 @@ msgid "Type" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/components/container_card.ex:33 | ||||
| #: lib/cannery_web/components/container_card.ex:37 | ||||
| #: lib/cannery_web/live/container_live/show.html.heex:14 | ||||
| msgid "Type:" | ||||
| msgstr "" | ||||
| @@ -525,20 +513,15 @@ msgid "Uses left" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/home_live.ex:41 | ||||
| #: lib/cannery_web/live/home_live.ex:47 | ||||
| msgid "Welcome to %{name}" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/home_live.ex:70 | ||||
| #: lib/cannery_web/live/home_live.ex:76 | ||||
| msgid "Your data stays with you, period" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/container_live/show.ex:90 | ||||
| msgid "Add Tag to Container" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/container_live/show.html.heex:49 | ||||
| msgid "No tags for this container" | ||||
| @@ -556,6 +539,7 @@ msgid "Range day" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/ammo_group_live/show.html.heex:125 | ||||
| #: lib/cannery_web/live/range_live/index.html.heex:70 | ||||
| msgid "Date" | ||||
| msgstr "" | ||||
| @@ -571,13 +555,13 @@ msgid "No ammo staged" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/ammo_group_live/show.html.heex:58 | ||||
| #: lib/cannery_web/live/ammo_group_live/show.html.heex:77 | ||||
| #: lib/cannery_web/live/range_live/index.html.heex:33 | ||||
| msgid "Stage for range" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/ammo_group_live/show.html.heex:57 | ||||
| #: lib/cannery_web/live/ammo_group_live/show.html.heex:76 | ||||
| #: lib/cannery_web/live/range_live/index.html.heex:32 | ||||
| msgid "Unstage from range" | ||||
| msgstr "" | ||||
| @@ -631,6 +615,7 @@ msgid "Rounds left" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/ammo_group_live/show.html.heex:119 | ||||
| #: lib/cannery_web/live/range_live/index.html.heex:64 | ||||
| msgid "Rounds shot" | ||||
| msgstr "" | ||||
| @@ -664,63 +649,65 @@ msgstr "" | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/components/ammo_group_card.ex:43 | ||||
| #: lib/cannery_web/live/ammo_group_live/index.html.heex:64 | ||||
| #: lib/cannery_web/live/ammo_group_live/show.html.heex:22 | ||||
| #: lib/cannery_web/live/ammo_group_live/show.html.heex:32 | ||||
| #: lib/cannery_web/live/ammo_group_live/show.html.heex:39 | ||||
| #: lib/cannery_web/live/ammo_type_live/show.html.heex:98 | ||||
| msgid "$%{amount}" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:83 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:75 | ||||
| msgid "Bimetal" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:78 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:72 | ||||
| #: lib/cannery_web/live/ammo_type_live/index.ex:57 | ||||
| #: lib/cannery_web/live/ammo_type_live/show.html.heex:45 | ||||
| msgid "Jacket type" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:87 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:79 | ||||
| #: lib/cannery_web/live/ammo_type_live/index.ex:58 | ||||
| #: lib/cannery_web/live/ammo_type_live/show.html.heex:46 | ||||
| msgid "Muzzle velocity" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:106 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:93 | ||||
| #: lib/cannery_web/live/ammo_type_live/index.ex:60 | ||||
| #: lib/cannery_web/live/ammo_type_live/show.html.heex:48 | ||||
| msgid "Powder grains per charge" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:97 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:89 | ||||
| #: lib/cannery_web/live/ammo_type_live/index.ex:59 | ||||
| #: lib/cannery_web/live/ammo_type_live/show.html.heex:47 | ||||
| msgid "Powder type" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:171 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:152 | ||||
| #: lib/cannery_web/live/ammo_type_live/index.ex:70 | ||||
| #: lib/cannery_web/live/ammo_type_live/show.html.heex:58 | ||||
| msgid "UPC" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:81 | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:80 | ||||
| msgid "Confirm new password" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:34 | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:90 | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:33 | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:89 | ||||
| msgid "Current password" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:74 | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:73 | ||||
| msgid "New password" | ||||
| msgstr "" | ||||
|  | ||||
| @@ -735,7 +722,9 @@ msgid "Unstage" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:140 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:125 | ||||
| #: lib/cannery_web/live/ammo_type_live/index.ex:64 | ||||
| #: lib/cannery_web/live/ammo_type_live/show.html.heex:52 | ||||
| msgid "Firing type" | ||||
| msgstr "" | ||||
|  | ||||
| @@ -748,3 +737,100 @@ msgstr "" | ||||
| #: lib/cannery_web/templates/layout/live.html.heex:37 | ||||
| msgid "Loading..." | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/container_live/index.ex:29 | ||||
| #: lib/cannery_web/live/container_live/show.ex:97 | ||||
| msgid "Edit %{name}" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/container_live/index.ex:48 | ||||
| #: lib/cannery_web/live/container_live/show.ex:98 | ||||
| msgid "Edit %{name} tags" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format, fuzzy | ||||
| #: lib/cannery_web/components/container_card.ex:50 | ||||
| msgid "Rounds:" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/container_live/show.ex:96 | ||||
| msgid "Show %{name}" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/ammo_type_live/show.html.heex:104 | ||||
| msgid "No cost information" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/ammo_group_live/index.html.heex:36 | ||||
| msgid "% left" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/ammo_group_live/show.html.heex:38 | ||||
| msgid "Current value:" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/ammo_group_live/show.html.heex:31 | ||||
| msgid "Original cost:" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/ammo_group_live/show.html.heex:13 | ||||
| msgid "Original count:" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/ammo_group_live/show.html.heex:18 | ||||
| msgid "Percentage left:" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format, fuzzy | ||||
| #: lib/cannery_web/live/ammo_group_live/show.html.heex:111 | ||||
| msgid "Rounds used" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/ammo_type_live/show.html.heex:77 | ||||
| msgid "Current # of rounds:" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/ammo_type_live/index.html.heex:32 | ||||
| msgid "Total # of rounds" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/ammo_type_live/show.html.heex:85 | ||||
| msgid "Total rounds shot:" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/controllers/user_confirmation_controller.ex:8 | ||||
| msgid "Confirm your account" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/controllers/user_reset_password_controller.ex:9 | ||||
| msgid "Forgot your password?" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/controllers/user_session_controller.ex:8 | ||||
| msgid "Log in" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/controllers/user_registration_controller.ex:35 | ||||
| msgid "Register" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/controllers/user_reset_password_controller.ex:36 | ||||
| msgid "Reset your password" | ||||
| msgstr "" | ||||
|   | ||||
| @@ -11,18 +11,18 @@ msgstr "" | ||||
| "Language: en\n" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery/containers.ex:105 | ||||
| #: lib/cannery/containers.ex:122 | ||||
| msgid "Container must be empty before deleting" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/container_live/index.ex:55 | ||||
| #: lib/cannery_web/live/container_live/show.ex:74 | ||||
| #: lib/cannery_web/live/container_live/index.ex:71 | ||||
| #: lib/cannery_web/live/container_live/show.ex:73 | ||||
| msgid "Could not delete %{name}: %{error}" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/container_live/index.ex:43 | ||||
| #: lib/cannery_web/live/container_live/index.ex:59 | ||||
| msgid "Could not find that container" | ||||
| msgstr "" | ||||
|  | ||||
| @@ -57,27 +57,27 @@ msgid "Not found" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/templates/user_registration/new.html.heex:17 | ||||
| #: lib/cannery_web/templates/user_reset_password/edit.html.heex:17 | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:23 | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:67 | ||||
| #: lib/cannery_web/templates/user_registration/new.html.heex:16 | ||||
| #: lib/cannery_web/templates/user_reset_password/edit.html.heex:16 | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:22 | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:66 | ||||
| msgid "Oops, something went wrong! Please check the errors below." | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/controllers/user_reset_password_controller.ex:60 | ||||
| #: lib/cannery_web/controllers/user_reset_password_controller.ex:63 | ||||
| msgid "Reset password link is invalid or it has expired." | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/controllers/user_registration_controller.ex:25 | ||||
| #: lib/cannery_web/controllers/user_registration_controller.ex:53 | ||||
| #: lib/cannery_web/controllers/user_registration_controller.ex:56 | ||||
| msgid "Sorry, public registration is disabled" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/controllers/user_registration_controller.ex:15 | ||||
| #: lib/cannery_web/controllers/user_registration_controller.ex:43 | ||||
| #: lib/cannery_web/controllers/user_registration_controller.ex:46 | ||||
| msgid "Sorry, this invite was not found or expired" | ||||
| msgstr "" | ||||
|  | ||||
| @@ -92,7 +92,7 @@ msgid "Unauthorized" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/controllers/user_confirmation_controller.ex:53 | ||||
| #: lib/cannery_web/controllers/user_confirmation_controller.ex:54 | ||||
| msgid "User confirmation link is invalid or it has expired." | ||||
| msgstr "" | ||||
|  | ||||
| @@ -133,7 +133,7 @@ msgid "Tag not found" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/container_live/add_tag_component.ex:35 | ||||
| #: lib/cannery_web/live/container_live/edit_tags_component.ex:30 | ||||
| msgid "Tag could not be added" | ||||
| msgstr "" | ||||
|  | ||||
| @@ -153,3 +153,8 @@ msgstr "" | ||||
| #: lib/cannery_web/controllers/user_auth.ex:161 | ||||
| msgid "You must confirm your account and log in to access this page." | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format, fuzzy | ||||
| #: lib/cannery_web/live/container_live/edit_tags_component.ex:52 | ||||
| msgid "Tag could not be removed" | ||||
| msgstr "" | ||||
|   | ||||
| @@ -39,8 +39,8 @@ msgid "%{name} enabled succesfully" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/container_live/index.ex:48 | ||||
| #: lib/cannery_web/live/container_live/show.ex:64 | ||||
| #: lib/cannery_web/live/container_live/index.ex:64 | ||||
| #: lib/cannery_web/live/container_live/show.ex:63 | ||||
| msgid "%{name} has been deleted" | ||||
| msgstr "" | ||||
|  | ||||
| @@ -86,7 +86,7 @@ msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/ammo_type_live/show.html.heex:29 | ||||
| #: lib/cannery_web/live/container_live/index.html.heex:38 | ||||
| #: lib/cannery_web/live/container_live/index.html.heex:46 | ||||
| #: lib/cannery_web/live/container_live/show.html.heex:37 | ||||
| #: lib/cannery_web/live/tag_live/index.html.heex:38 | ||||
| msgid "Are you sure you want to delete %{name}?" | ||||
| @@ -99,13 +99,13 @@ msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/ammo_group_live/index.html.heex:120 | ||||
| #: lib/cannery_web/live/ammo_group_live/show.html.heex:47 | ||||
| #: lib/cannery_web/live/ammo_type_live/index.html.heex:68 | ||||
| #: lib/cannery_web/live/ammo_group_live/show.html.heex:66 | ||||
| #: lib/cannery_web/live/ammo_type_live/index.html.heex:75 | ||||
| msgid "Are you sure you want to delete this ammo?" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:113 | ||||
| #: lib/cannery_web/templates/user_settings/edit.html.heex:112 | ||||
| msgid "Are you sure you want to delete your account?" | ||||
| msgstr "" | ||||
|  | ||||
| @@ -125,7 +125,7 @@ msgid "Email changed successfully." | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/controllers/user_confirmation_controller.ex:22 | ||||
| #: lib/cannery_web/controllers/user_confirmation_controller.ex:23 | ||||
| msgid "If your email is in our system and it has not been confirmed yet, you will receive an email with instructions shortly." | ||||
| msgstr "" | ||||
|  | ||||
| @@ -140,7 +140,7 @@ msgid "Logged out successfully." | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/controllers/user_reset_password_controller.ex:43 | ||||
| #: lib/cannery_web/controllers/user_reset_password_controller.ex:46 | ||||
| msgid "Password reset successfully." | ||||
| msgstr "" | ||||
|  | ||||
| @@ -150,19 +150,19 @@ msgid "Password updated successfully." | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/controllers/user_registration_controller.ex:71 | ||||
| #: lib/cannery_web/controllers/user_registration_controller.ex:74 | ||||
| msgid "Please check your email to verify your account" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/home_live.ex:97 | ||||
| #: lib/cannery_web/live/home_live.ex:103 | ||||
| msgid "Register to setup %{name}" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/components/add_shot_group_component.html.heex:44 | ||||
| #: lib/cannery_web/live/ammo_group_live/form_component.html.heex:55 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:176 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:157 | ||||
| #: lib/cannery_web/live/container_live/form_component.html.heex:52 | ||||
| #: lib/cannery_web/live/invite_live/form_component.html.heex:30 | ||||
| #: lib/cannery_web/live/range_live/form_component.html.heex:42 | ||||
| @@ -176,22 +176,22 @@ msgid "Your account has been deleted" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/container_live/show.html.heex:71 | ||||
| #: lib/cannery_web/live/container_live/edit_tags_component.html.heex:16 | ||||
| msgid "Are you sure you want to remove the %{tag_name} tag from %{container_name}?" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/container_live/add_tag_component.ex:40 | ||||
| #: lib/cannery_web/live/container_live/edit_tags_component.ex:36 | ||||
| msgid "%{name} added successfully" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/container_live/show.ex:40 | ||||
| #: lib/cannery_web/live/container_live/show.ex:39 | ||||
| msgid "%{tag_name} has been removed from %{container_name}" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/container_live/add_tag_component.html.heex:19 | ||||
| #: lib/cannery_web/live/container_live/edit_tags_component.html.heex:54 | ||||
| msgid "Adding..." | ||||
| msgstr "" | ||||
|  | ||||
| @@ -226,7 +226,7 @@ msgid "Shot records updated successfully" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/controllers/user_confirmation_controller.ex:37 | ||||
| #: lib/cannery_web/controllers/user_confirmation_controller.ex:38 | ||||
| msgid "%{email} confirmed successfully." | ||||
| msgstr "" | ||||
|  | ||||
| @@ -239,3 +239,8 @@ msgstr "" | ||||
| #: lib/cannery_web/live/invite_live/index.ex:123 | ||||
| msgid "Copied to clipboard" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format, fuzzy | ||||
| #: lib/cannery_web/live/container_live/edit_tags_component.ex:58 | ||||
| msgid "%{name} removed successfully" | ||||
| msgstr "" | ||||
|   | ||||
| @@ -11,18 +11,18 @@ msgid "" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery/containers.ex:105 | ||||
| #: lib/cannery/containers.ex:122 | ||||
| msgid "Container must be empty before deleting" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/container_live/index.ex:55 | ||||
| #: lib/cannery_web/live/container_live/show.ex:74 | ||||
| #: lib/cannery_web/live/container_live/index.ex:71 | ||||
| #: lib/cannery_web/live/container_live/show.ex:73 | ||||
| msgid "Could not delete %{name}: %{error}" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/container_live/index.ex:43 | ||||
| #: lib/cannery_web/live/container_live/index.ex:59 | ||||
| msgid "Could not find that container" | ||||
| msgstr "" | ||||
|  | ||||
| @@ -65,19 +65,19 @@ msgid "Oops, something went wrong! Please check the errors below." | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/controllers/user_reset_password_controller.ex:60 | ||||
| #: lib/cannery_web/controllers/user_reset_password_controller.ex:63 | ||||
| msgid "Reset password link is invalid or it has expired." | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/controllers/user_registration_controller.ex:25 | ||||
| #: lib/cannery_web/controllers/user_registration_controller.ex:53 | ||||
| #: lib/cannery_web/controllers/user_registration_controller.ex:56 | ||||
| msgid "Sorry, public registration is disabled" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/controllers/user_registration_controller.ex:15 | ||||
| #: lib/cannery_web/controllers/user_registration_controller.ex:43 | ||||
| #: lib/cannery_web/controllers/user_registration_controller.ex:46 | ||||
| msgid "Sorry, this invite was not found or expired" | ||||
| msgstr "" | ||||
|  | ||||
| @@ -92,7 +92,7 @@ msgid "Unauthorized" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/controllers/user_confirmation_controller.ex:53 | ||||
| #: lib/cannery_web/controllers/user_confirmation_controller.ex:54 | ||||
| msgid "User confirmation link is invalid or it has expired." | ||||
| msgstr "" | ||||
|  | ||||
| @@ -132,7 +132,7 @@ msgid "Tag not found" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/container_live/add_tag_component.ex:35 | ||||
| #: lib/cannery_web/live/container_live/edit_tags_component.ex:30 | ||||
| msgid "Tag could not be added" | ||||
| msgstr "" | ||||
|  | ||||
| @@ -152,3 +152,8 @@ msgstr "" | ||||
| #: lib/cannery_web/controllers/user_auth.ex:161 | ||||
| msgid "You must confirm your account and log in to access this page." | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/container_live/edit_tags_component.ex:52 | ||||
| msgid "Tag could not be removed" | ||||
| msgstr "" | ||||
|   | ||||
| @@ -38,8 +38,8 @@ msgid "%{name} enabled succesfully" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/container_live/index.ex:48 | ||||
| #: lib/cannery_web/live/container_live/show.ex:64 | ||||
| #: lib/cannery_web/live/container_live/index.ex:64 | ||||
| #: lib/cannery_web/live/container_live/show.ex:63 | ||||
| msgid "%{name} has been deleted" | ||||
| msgstr "" | ||||
|  | ||||
| @@ -85,7 +85,7 @@ msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/ammo_type_live/show.html.heex:29 | ||||
| #: lib/cannery_web/live/container_live/index.html.heex:38 | ||||
| #: lib/cannery_web/live/container_live/index.html.heex:46 | ||||
| #: lib/cannery_web/live/container_live/show.html.heex:37 | ||||
| #: lib/cannery_web/live/tag_live/index.html.heex:38 | ||||
| msgid "Are you sure you want to delete %{name}?" | ||||
| @@ -98,8 +98,8 @@ msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/ammo_group_live/index.html.heex:120 | ||||
| #: lib/cannery_web/live/ammo_group_live/show.html.heex:47 | ||||
| #: lib/cannery_web/live/ammo_type_live/index.html.heex:68 | ||||
| #: lib/cannery_web/live/ammo_group_live/show.html.heex:66 | ||||
| #: lib/cannery_web/live/ammo_type_live/index.html.heex:75 | ||||
| msgid "Are you sure you want to delete this ammo?" | ||||
| msgstr "" | ||||
|  | ||||
| @@ -124,7 +124,7 @@ msgid "Email changed successfully." | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/controllers/user_confirmation_controller.ex:22 | ||||
| #: lib/cannery_web/controllers/user_confirmation_controller.ex:23 | ||||
| msgid "If your email is in our system and it has not been confirmed yet, you will receive an email with instructions shortly." | ||||
| msgstr "" | ||||
|  | ||||
| @@ -139,7 +139,7 @@ msgid "Logged out successfully." | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/controllers/user_reset_password_controller.ex:43 | ||||
| #: lib/cannery_web/controllers/user_reset_password_controller.ex:46 | ||||
| msgid "Password reset successfully." | ||||
| msgstr "" | ||||
|  | ||||
| @@ -149,19 +149,19 @@ msgid "Password updated successfully." | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/controllers/user_registration_controller.ex:71 | ||||
| #: lib/cannery_web/controllers/user_registration_controller.ex:74 | ||||
| msgid "Please check your email to verify your account" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/home_live.ex:97 | ||||
| #: lib/cannery_web/live/home_live.ex:103 | ||||
| msgid "Register to setup %{name}" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/components/add_shot_group_component.html.heex:44 | ||||
| #: lib/cannery_web/live/ammo_group_live/form_component.html.heex:55 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:173 | ||||
| #: lib/cannery_web/live/ammo_type_live/form_component.html.heex:157 | ||||
| #: lib/cannery_web/live/container_live/form_component.html.heex:52 | ||||
| #: lib/cannery_web/live/invite_live/form_component.html.heex:30 | ||||
| #: lib/cannery_web/live/range_live/form_component.html.heex:42 | ||||
| @@ -175,22 +175,22 @@ msgid "Your account has been deleted" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/container_live/show.html.heex:71 | ||||
| #: lib/cannery_web/live/container_live/edit_tags_component.html.heex:16 | ||||
| msgid "Are you sure you want to remove the %{tag_name} tag from %{container_name}?" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/container_live/add_tag_component.ex:40 | ||||
| #: lib/cannery_web/live/container_live/edit_tags_component.ex:36 | ||||
| msgid "%{name} added successfully" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/container_live/show.ex:40 | ||||
| #: lib/cannery_web/live/container_live/show.ex:39 | ||||
| msgid "%{tag_name} has been removed from %{container_name}" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/container_live/add_tag_component.html.heex:19 | ||||
| #: lib/cannery_web/live/container_live/edit_tags_component.html.heex:54 | ||||
| msgid "Adding..." | ||||
| msgstr "" | ||||
|  | ||||
| @@ -225,7 +225,7 @@ msgid "Shot records updated successfully" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/controllers/user_confirmation_controller.ex:37 | ||||
| #: lib/cannery_web/controllers/user_confirmation_controller.ex:38 | ||||
| msgid "%{email} confirmed successfully." | ||||
| msgstr "" | ||||
|  | ||||
| @@ -238,3 +238,8 @@ msgstr "" | ||||
| #: lib/cannery_web/live/invite_live/index.ex:123 | ||||
| msgid "Copied to clipboard" | ||||
| msgstr "" | ||||
|  | ||||
| #, elixir-autogen, elixir-format | ||||
| #: lib/cannery_web/live/container_live/edit_tags_component.ex:58 | ||||
| msgid "%{name} removed successfully" | ||||
| msgstr "" | ||||
|   | ||||
| @@ -120,12 +120,13 @@ defmodule Cannery.AmmoTest do | ||||
|  | ||||
|     test "list_ammo_groups/0 returns all ammo_groups", | ||||
|          %{ammo_group: ammo_group, current_user: current_user} do | ||||
|       assert Ammo.list_ammo_groups(current_user) == [ammo_group] | ||||
|       assert Ammo.list_ammo_groups(current_user) == [ammo_group] |> Repo.preload(:shot_groups) | ||||
|     end | ||||
|  | ||||
|     test "get_ammo_group!/1 returns the ammo_group with given id", | ||||
|          %{ammo_group: ammo_group, current_user: current_user} do | ||||
|       assert Ammo.get_ammo_group!(ammo_group.id, current_user) == ammo_group | ||||
|       assert Ammo.get_ammo_group!(ammo_group.id, current_user) == | ||||
|                ammo_group |> Repo.preload(:shot_groups) | ||||
|     end | ||||
|  | ||||
|     test "create_ammo_group/1 with valid data creates a ammo_group", | ||||
| @@ -167,7 +168,8 @@ defmodule Cannery.AmmoTest do | ||||
|       assert {:error, %Changeset{}} = | ||||
|                Ammo.update_ammo_group(ammo_group, @invalid_attrs, current_user) | ||||
|  | ||||
|       assert ammo_group == Ammo.get_ammo_group!(ammo_group.id, current_user) | ||||
|       assert ammo_group |> Repo.preload(:shot_groups) == | ||||
|                Ammo.get_ammo_group!(ammo_group.id, current_user) | ||||
|     end | ||||
|  | ||||
|     test "delete_ammo_group/1 deletes the ammo_group", | ||||
|   | ||||
| @@ -33,12 +33,14 @@ defmodule Cannery.ContainersTest do | ||||
|  | ||||
|     test "list_containers/1 returns all containers", | ||||
|          %{current_user: current_user, container: container} do | ||||
|       assert Containers.list_containers(current_user) == [container] | ||||
|       assert Containers.list_containers(current_user) == | ||||
|                [container |> Repo.preload([:ammo_groups, :tags])] | ||||
|     end | ||||
|  | ||||
|     test "get_container!/1 returns the container with given id", | ||||
|          %{current_user: current_user, container: container} do | ||||
|       assert Containers.get_container!(container.id, current_user) == container | ||||
|       assert Containers.get_container!(container.id, current_user) == | ||||
|                container |> Repo.preload([:ammo_groups, :tags]) | ||||
|     end | ||||
|  | ||||
|     test "create_container/1 with valid data creates a container", %{current_user: current_user} do | ||||
| @@ -73,7 +75,8 @@ defmodule Cannery.ContainersTest do | ||||
|       assert {:error, %Changeset{}} = | ||||
|                Containers.update_container(container, current_user, @invalid_attrs) | ||||
|  | ||||
|       assert container == Containers.get_container!(container.id, current_user) | ||||
|       assert container |> Repo.preload([:ammo_groups, :tags]) == | ||||
|                Containers.get_container!(container.id, current_user) | ||||
|     end | ||||
|  | ||||
|     test "delete_container/1 deletes the container", | ||||
|   | ||||
| @@ -50,7 +50,7 @@ defmodule CanneryWeb.AmmoGroupLiveTest do | ||||
|         |> follow_redirect(conn, Routes.ammo_group_index_path(conn, :index)) | ||||
|  | ||||
|       assert html =~ dgettext("prompts", "Ammo group created successfully") | ||||
|       assert html =~ "some notes" | ||||
|       assert html =~ "42" | ||||
|     end | ||||
|  | ||||
|     test "saves new shot_group", %{conn: conn, ammo_group: ammo_group} do | ||||
| @@ -95,7 +95,7 @@ defmodule CanneryWeb.AmmoGroupLiveTest do | ||||
|         |> follow_redirect(conn, Routes.ammo_group_index_path(conn, :index)) | ||||
|  | ||||
|       assert html =~ dgettext("prompts", "Ammo group updated successfully") | ||||
|       assert html =~ "some updated notes" | ||||
|       assert html =~ "43" | ||||
|     end | ||||
|  | ||||
|     test "deletes ammo_group in listing", %{conn: conn, ammo_group: ammo_group} do | ||||
|   | ||||
| @@ -70,7 +70,7 @@ defmodule CanneryWeb.ContainerLiveTest do | ||||
|       {:ok, index_live, _html} = live(conn, Routes.container_index_path(conn, :index)) | ||||
|  | ||||
|       assert index_live |> element("[data-qa=\"edit-#{container.id}\"]") |> render_click() =~ | ||||
|                gettext("Edit Container") | ||||
|                gettext("Edit %{name}", name: container.name) | ||||
|  | ||||
|       assert_patch(index_live, Routes.container_index_path(conn, :edit, container)) | ||||
|  | ||||
| @@ -103,7 +103,7 @@ defmodule CanneryWeb.ContainerLiveTest do | ||||
|     test "displays container", %{conn: conn, container: container} do | ||||
|       {:ok, _show_live, html} = live(conn, Routes.container_show_path(conn, :show, container)) | ||||
|  | ||||
|       assert html =~ gettext("Show Container") | ||||
|       assert html =~ gettext("Show %{name}", name: container.name) | ||||
|       assert html =~ container.location | ||||
|     end | ||||
|  | ||||
| @@ -115,7 +115,7 @@ defmodule CanneryWeb.ContainerLiveTest do | ||||
|       {:ok, show_live, _html} = live(conn, Routes.container_show_path(conn, :show, container)) | ||||
|  | ||||
|       assert show_live |> element("[data-qa=\"edit\"]") |> render_click() =~ | ||||
|                gettext("Edit Container") | ||||
|                gettext("Edit %{name}", name: container.name) | ||||
|  | ||||
|       assert_patch(show_live, Routes.container_show_path(conn, :edit, container)) | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user