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