forked from shibao/cannery
		
	improve templates
This commit is contained in:
		@@ -12,11 +12,12 @@
 | 
			
		||||
    phx-change="validate"
 | 
			
		||||
    phx-submit="save"
 | 
			
		||||
  >
 | 
			
		||||
    <%= if @changeset.action && not @changeset.valid? do %>
 | 
			
		||||
      <div class="invalid-feedback col-span-3 text-center">
 | 
			
		||||
        <%= changeset_errors(@changeset) %>
 | 
			
		||||
      </div>
 | 
			
		||||
    <% end %>
 | 
			
		||||
    <div
 | 
			
		||||
      :if={@changeset.action && not @changeset.valid?()}
 | 
			
		||||
      class="invalid-feedback col-span-3 text-center"
 | 
			
		||||
    >
 | 
			
		||||
      <%= changeset_errors(@changeset) %>
 | 
			
		||||
    </div>
 | 
			
		||||
 | 
			
		||||
    <%= label(f, :ammo_left, gettext("Rounds left"), class: "title text-lg text-primary-600") %>
 | 
			
		||||
    <%= number_input(f, :ammo_left,
 | 
			
		||||
 
 | 
			
		||||
@@ -23,9 +23,10 @@ defmodule CanneryWeb.Components.AmmoGroupCard do
 | 
			
		||||
    ~H"""
 | 
			
		||||
    <div
 | 
			
		||||
      id={"ammo_group-#{@ammo_group.id}"}
 | 
			
		||||
      class="mx-4 my-2 px-8 py-4 flex flex-col justify-center items-center
 | 
			
		||||
            border border-gray-400 rounded-lg shadow-lg hover:shadow-md
 | 
			
		||||
            transition-all duration-300 ease-in-out"
 | 
			
		||||
      class="mx-4 my-2 px-8 py-4
 | 
			
		||||
        flex flex-col justify-center items-center
 | 
			
		||||
        border border-gray-400 rounded-lg shadow-lg hover:shadow-md
 | 
			
		||||
        transition-all duration-300 ease-in-out"
 | 
			
		||||
    >
 | 
			
		||||
      <.link navigate={Routes.ammo_group_show_path(Endpoint, :show, @ammo_group)} class="mb-2 link">
 | 
			
		||||
        <h1 class="title text-xl title-primary-500">
 | 
			
		||||
@@ -39,31 +40,28 @@ defmodule CanneryWeb.Components.AmmoGroupCard do
 | 
			
		||||
          <%= if @ammo_group.count == 0, do: gettext("Empty"), else: @ammo_group.count %>
 | 
			
		||||
        </span>
 | 
			
		||||
 | 
			
		||||
        <%= if @ammo_group |> Ammo.get_original_count() != @ammo_group.count do %>
 | 
			
		||||
          <span class="rounded-lg title text-lg">
 | 
			
		||||
            <%= gettext("Original Count:") %>
 | 
			
		||||
            <%= @ammo_group |> Ammo.get_original_count() %>
 | 
			
		||||
          </span>
 | 
			
		||||
        <% end %>
 | 
			
		||||
        <span
 | 
			
		||||
          :if={@ammo_group |> Ammo.get_original_count() != @ammo_group.count}
 | 
			
		||||
          class="rounded-lg title text-lg"
 | 
			
		||||
        >
 | 
			
		||||
          <%= gettext("Original Count:") %>
 | 
			
		||||
          <%= @ammo_group |> Ammo.get_original_count() %>
 | 
			
		||||
        </span>
 | 
			
		||||
 | 
			
		||||
        <%= if @ammo_group.notes do %>
 | 
			
		||||
          <span class="rounded-lg title text-lg">
 | 
			
		||||
            <%= gettext("Notes:") %>
 | 
			
		||||
            <%= @ammo_group.notes %>
 | 
			
		||||
          </span>
 | 
			
		||||
        <% end %>
 | 
			
		||||
        <span :if={@ammo_group.notes} class="rounded-lg title text-lg">
 | 
			
		||||
          <%= gettext("Notes:") %>
 | 
			
		||||
          <%= @ammo_group.notes %>
 | 
			
		||||
        </span>
 | 
			
		||||
 | 
			
		||||
        <span class="rounded-lg title text-lg">
 | 
			
		||||
          <%= gettext("Purchased on:") %>
 | 
			
		||||
          <.date date={@ammo_group.purchased_on} />
 | 
			
		||||
        </span>
 | 
			
		||||
 | 
			
		||||
        <%= if @ammo_group |> Ammo.get_last_used_shot_group() do %>
 | 
			
		||||
          <span class="rounded-lg title text-lg">
 | 
			
		||||
            <%= gettext("Last used on:") %>
 | 
			
		||||
            <.date date={@ammo_group |> Ammo.get_last_used_shot_group() |> Map.get(:date)} />
 | 
			
		||||
          </span>
 | 
			
		||||
        <% end %>
 | 
			
		||||
        <span :if={@ammo_group |> Ammo.get_last_used_shot_group()} class="rounded-lg title text-lg">
 | 
			
		||||
          <%= gettext("Last used on:") %>
 | 
			
		||||
          <.date date={@ammo_group |> Ammo.get_last_used_shot_group() |> Map.get(:date)} />
 | 
			
		||||
        </span>
 | 
			
		||||
 | 
			
		||||
        <%= if @ammo_group.price_paid do %>
 | 
			
		||||
          <span class="rounded-lg title text-lg">
 | 
			
		||||
@@ -81,25 +79,24 @@ defmodule CanneryWeb.Components.AmmoGroupCard do
 | 
			
		||||
          </span>
 | 
			
		||||
        <% end %>
 | 
			
		||||
 | 
			
		||||
        <%= if @show_container and @ammo_group.container do %>
 | 
			
		||||
          <span class="rounded-lg title text-lg">
 | 
			
		||||
            <%= gettext("Container:") %>
 | 
			
		||||
        <span :if={@show_container and @ammo_group.container} class="rounded-lg title text-lg">
 | 
			
		||||
          <%= gettext("Container:") %>
 | 
			
		||||
 | 
			
		||||
            <.link
 | 
			
		||||
              navigate={Routes.container_show_path(Endpoint, :show, @ammo_group.container)}
 | 
			
		||||
              class="link"
 | 
			
		||||
            >
 | 
			
		||||
              <%= @ammo_group.container.name %>
 | 
			
		||||
            </.link>
 | 
			
		||||
          </span>
 | 
			
		||||
        <% end %>
 | 
			
		||||
          <.link
 | 
			
		||||
            navigate={Routes.container_show_path(Endpoint, :show, @ammo_group.container)}
 | 
			
		||||
            class="link"
 | 
			
		||||
          >
 | 
			
		||||
            <%= @ammo_group.container.name %>
 | 
			
		||||
          </.link>
 | 
			
		||||
        </span>
 | 
			
		||||
      </div>
 | 
			
		||||
 | 
			
		||||
      <%= if assigns |> Map.has_key?(:inner_block) do %>
 | 
			
		||||
        <div class="mt-4 flex space-x-4 justify-center items-center">
 | 
			
		||||
          <%= render_slot(@inner_block) %>
 | 
			
		||||
        </div>
 | 
			
		||||
      <% end %>
 | 
			
		||||
      <div
 | 
			
		||||
        :if={assigns |> Map.has_key?(:inner_block)}
 | 
			
		||||
        class="mt-4 flex space-x-4 justify-center items-center"
 | 
			
		||||
      >
 | 
			
		||||
        <%= render_slot(@inner_block) %>
 | 
			
		||||
      </div>
 | 
			
		||||
    </div>
 | 
			
		||||
    """
 | 
			
		||||
  end
 | 
			
		||||
 
 | 
			
		||||
@@ -23,7 +23,8 @@ defmodule CanneryWeb.Components.ContainerCard do
 | 
			
		||||
    ~H"""
 | 
			
		||||
    <div
 | 
			
		||||
      id={"container-#{@container.id}"}
 | 
			
		||||
      class="overflow-hidden max-w-full mx-4 mb-4 px-8 py-4 flex flex-col justify-center items-center space-y-4
 | 
			
		||||
      class="overflow-hidden max-w-full mx-4 mb-4 px-8 py-4
 | 
			
		||||
        flex flex-col justify-center items-center space-y-4
 | 
			
		||||
        border border-gray-400 rounded-lg shadow-lg hover:shadow-md
 | 
			
		||||
        transition-all duration-300 ease-in-out"
 | 
			
		||||
    >
 | 
			
		||||
@@ -34,24 +35,20 @@ defmodule CanneryWeb.Components.ContainerCard do
 | 
			
		||||
          </h1>
 | 
			
		||||
        </.link>
 | 
			
		||||
 | 
			
		||||
        <%= if @container.desc do %>
 | 
			
		||||
          <span class="rounded-lg title text-lg">
 | 
			
		||||
            <%= gettext("Description:") %>
 | 
			
		||||
            <%= @container.desc %>
 | 
			
		||||
          </span>
 | 
			
		||||
        <% end %>
 | 
			
		||||
        <span :if={@container.desc} class="rounded-lg title text-lg">
 | 
			
		||||
          <%= gettext("Description:") %>
 | 
			
		||||
          <%= @container.desc %>
 | 
			
		||||
        </span>
 | 
			
		||||
 | 
			
		||||
        <span class="rounded-lg title text-lg">
 | 
			
		||||
          <%= gettext("Type:") %>
 | 
			
		||||
          <%= @container.type %>
 | 
			
		||||
        </span>
 | 
			
		||||
 | 
			
		||||
        <%= if @container.location do %>
 | 
			
		||||
          <span class="rounded-lg title text-lg">
 | 
			
		||||
            <%= gettext("Location:") %>
 | 
			
		||||
            <%= @container.location %>
 | 
			
		||||
          </span>
 | 
			
		||||
        <% end %>
 | 
			
		||||
        <span :if={@container.location} class="rounded-lg title text-lg">
 | 
			
		||||
          <%= gettext("Location:") %>
 | 
			
		||||
          <%= @container.location %>
 | 
			
		||||
        </span>
 | 
			
		||||
 | 
			
		||||
        <%= unless @container.ammo_groups |> Enum.empty?() do %>
 | 
			
		||||
          <span class="rounded-lg title text-lg">
 | 
			
		||||
@@ -66,21 +63,18 @@ defmodule CanneryWeb.Components.ContainerCard do
 | 
			
		||||
        <% 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 %>
 | 
			
		||||
          <.simple_tag_card :for={tag <- @container.tags} :if={@container.tags} tag={tag} />
 | 
			
		||||
 | 
			
		||||
          <%= render_slot(@tag_actions) %>
 | 
			
		||||
        </div>
 | 
			
		||||
      </div>
 | 
			
		||||
 | 
			
		||||
      <%= if assigns |> Map.has_key?(:inner_block) do %>
 | 
			
		||||
        <div class="flex space-x-4 justify-center items-center">
 | 
			
		||||
          <%= render_slot(@inner_block) %>
 | 
			
		||||
        </div>
 | 
			
		||||
      <% end %>
 | 
			
		||||
      <div
 | 
			
		||||
        :if={assigns |> Map.has_key?(:inner_block)}
 | 
			
		||||
        class="flex space-x-4 justify-center items-center"
 | 
			
		||||
      >
 | 
			
		||||
        <%= render_slot(@inner_block) %>
 | 
			
		||||
      </div>
 | 
			
		||||
    </div>
 | 
			
		||||
    """
 | 
			
		||||
  end
 | 
			
		||||
 
 | 
			
		||||
@@ -135,11 +135,7 @@ defmodule CanneryWeb.Components.ContainerTableComponent do
 | 
			
		||||
    {container.tags |> Enum.map(fn %{name: name} -> name end),
 | 
			
		||||
     ~H"""
 | 
			
		||||
     <div class="flex flex-wrap justify-center items-center">
 | 
			
		||||
       <%= unless @container.tags |> Enum.empty?() do %>
 | 
			
		||||
         <%= for tag <- @container.tags do %>
 | 
			
		||||
           <TagCard.simple_tag_card tag={tag} />
 | 
			
		||||
         <% end %>
 | 
			
		||||
       <% end %>
 | 
			
		||||
       <TagCard.simple_tag_card :for={tag <- @container.tags} :if={@container.tags} tag={tag} />
 | 
			
		||||
 | 
			
		||||
       <%= render_slot(@tag_actions, @container) %>
 | 
			
		||||
     </div>
 | 
			
		||||
 
 | 
			
		||||
@@ -18,8 +18,8 @@ defmodule CanneryWeb.Components.InviteCard do
 | 
			
		||||
    <div
 | 
			
		||||
      id={"invite-#{@invite.id}"}
 | 
			
		||||
      class="mx-4 my-2 px-8 py-4 flex flex-col justify-center items-center space-y-4
 | 
			
		||||
      border border-gray-400 rounded-lg shadow-lg hover:shadow-md
 | 
			
		||||
      transition-all duration-300 ease-in-out"
 | 
			
		||||
        border border-gray-400 rounded-lg shadow-lg hover:shadow-md
 | 
			
		||||
        transition-all duration-300 ease-in-out"
 | 
			
		||||
    >
 | 
			
		||||
      <h1 class="title text-xl">
 | 
			
		||||
        <%= @invite.name %>
 | 
			
		||||
@@ -56,11 +56,9 @@ defmodule CanneryWeb.Components.InviteCard do
 | 
			
		||||
        <%= render_slot(@code_actions) %>
 | 
			
		||||
      </div>
 | 
			
		||||
 | 
			
		||||
      <%= if @inner_block do %>
 | 
			
		||||
        <div class="flex space-x-4 justify-center items-center">
 | 
			
		||||
          <%= render_slot(@inner_block) %>
 | 
			
		||||
        </div>
 | 
			
		||||
      <% end %>
 | 
			
		||||
      <div :if={@inner_block} class="flex space-x-4 justify-center items-center">
 | 
			
		||||
        <%= render_slot(@inner_block) %>
 | 
			
		||||
      </div>
 | 
			
		||||
    </div>
 | 
			
		||||
    """
 | 
			
		||||
  end
 | 
			
		||||
 
 | 
			
		||||
@@ -34,20 +34,19 @@
 | 
			
		||||
      </tr>
 | 
			
		||||
    </thead>
 | 
			
		||||
    <tbody>
 | 
			
		||||
      <%= for {values, i} <- @rows |> Enum.with_index() do %>
 | 
			
		||||
        <tr class={if i |> Integer.is_even(), do: @row_class, else: @alternate_row_class}>
 | 
			
		||||
          <%= for %{key: key} = value <- @columns do %>
 | 
			
		||||
            <td class={["p-2", value[:class]]}>
 | 
			
		||||
              <%= case values |> Map.get(key) do %>
 | 
			
		||||
                <% {_custom_sort_value, value} -> %>
 | 
			
		||||
                  <%= value %>
 | 
			
		||||
                <% value -> %>
 | 
			
		||||
                  <%= value %>
 | 
			
		||||
              <% end %>
 | 
			
		||||
            </td>
 | 
			
		||||
      <tr
 | 
			
		||||
        :for={{values, i} <- @rows |> Enum.with_index()}
 | 
			
		||||
        class={if i |> Integer.is_even(), do: @row_class, else: @alternate_row_class}
 | 
			
		||||
      >
 | 
			
		||||
        <td :for={%{key: key} = value <- @columns} class={["p-2", value[:class]]}>
 | 
			
		||||
          <%= case values |> Map.get(key) do %>
 | 
			
		||||
            <% {_custom_sort_value, value} -> %>
 | 
			
		||||
              <%= value %>
 | 
			
		||||
            <% value -> %>
 | 
			
		||||
              <%= value %>
 | 
			
		||||
          <% end %>
 | 
			
		||||
        </tr>
 | 
			
		||||
      <% end %>
 | 
			
		||||
        </td>
 | 
			
		||||
      </tr>
 | 
			
		||||
    </tbody>
 | 
			
		||||
  </table>
 | 
			
		||||
</div>
 | 
			
		||||
 
 | 
			
		||||
@@ -14,8 +14,8 @@ defmodule CanneryWeb.Components.TagCard do
 | 
			
		||||
    <div
 | 
			
		||||
      id={"tag-#{@tag.id}"}
 | 
			
		||||
      class="mx-4 mb-4 px-8 py-4 space-x-4 flex justify-center items-center
 | 
			
		||||
          border border-gray-400 rounded-lg shadow-lg hover:shadow-md
 | 
			
		||||
          transition-all duration-300 ease-in-out"
 | 
			
		||||
        border border-gray-400 rounded-lg shadow-lg hover:shadow-md
 | 
			
		||||
        transition-all duration-300 ease-in-out"
 | 
			
		||||
    >
 | 
			
		||||
      <.simple_tag_card tag={@tag} />
 | 
			
		||||
      <%= render_slot(@inner_block) %>
 | 
			
		||||
 
 | 
			
		||||
@@ -119,16 +119,14 @@ defmodule CanneryWeb.Components.Topbar do
 | 
			
		||||
              </li>
 | 
			
		||||
            <% end %>
 | 
			
		||||
          <% else %>
 | 
			
		||||
            <%= if Accounts.allow_registration?() do %>
 | 
			
		||||
              <li class="mx-2 my-1">
 | 
			
		||||
                <.link
 | 
			
		||||
                  navigate={Routes.user_registration_path(Endpoint, :new)}
 | 
			
		||||
                  class="text-primary-600 text-white hover:underline truncate"
 | 
			
		||||
                >
 | 
			
		||||
                  <%= dgettext("actions", "Register") %>
 | 
			
		||||
                </.link>
 | 
			
		||||
              </li>
 | 
			
		||||
            <% end %>
 | 
			
		||||
            <li :if={Accounts.allow_registration?()} class="mx-2 my-1">
 | 
			
		||||
              <.link
 | 
			
		||||
                navigate={Routes.user_registration_path(Endpoint, :new)}
 | 
			
		||||
                class="text-primary-600 text-white hover:underline truncate"
 | 
			
		||||
              >
 | 
			
		||||
                <%= dgettext("actions", "Register") %>
 | 
			
		||||
              </.link>
 | 
			
		||||
            </li>
 | 
			
		||||
            <li class="mx-2 my-1">
 | 
			
		||||
              <.link
 | 
			
		||||
                navigate={Routes.user_session_path(Endpoint, :new)}
 | 
			
		||||
 
 | 
			
		||||
@@ -14,8 +14,8 @@ defmodule CanneryWeb.Components.UserCard do
 | 
			
		||||
    <div
 | 
			
		||||
      id={"user-#{@user.id}"}
 | 
			
		||||
      class="mx-4 my-2 px-8 py-4 flex flex-col justify-center items-center text-center
 | 
			
		||||
          border border-gray-400 rounded-lg shadow-lg hover:shadow-md
 | 
			
		||||
          transition-all duration-300 ease-in-out"
 | 
			
		||||
        border border-gray-400 rounded-lg shadow-lg hover:shadow-md
 | 
			
		||||
        transition-all duration-300 ease-in-out"
 | 
			
		||||
    >
 | 
			
		||||
      <h1 class="px-4 py-2 rounded-lg title text-xl break-all">
 | 
			
		||||
        <%= @user.email %>
 | 
			
		||||
@@ -43,11 +43,9 @@ defmodule CanneryWeb.Components.UserCard do
 | 
			
		||||
        </p>
 | 
			
		||||
      </h3>
 | 
			
		||||
 | 
			
		||||
      <%= if @inner_block do %>
 | 
			
		||||
        <div class="px-4 py-2 flex space-x-4 justify-center items-center">
 | 
			
		||||
          <%= render_slot(@inner_block) %>
 | 
			
		||||
        </div>
 | 
			
		||||
      <% end %>
 | 
			
		||||
      <div :if={@inner_block} class="px-4 py-2 flex space-x-4 justify-center items-center">
 | 
			
		||||
        <%= render_slot(@inner_block) %>
 | 
			
		||||
      </div>
 | 
			
		||||
    </div>
 | 
			
		||||
    """
 | 
			
		||||
  end
 | 
			
		||||
 
 | 
			
		||||
@@ -12,11 +12,12 @@
 | 
			
		||||
    phx-submit="save"
 | 
			
		||||
    class="flex flex-col space-y-4 sm:space-y-0 sm:grid sm:grid-cols-3 sm:gap-4 justify-center items-center"
 | 
			
		||||
  >
 | 
			
		||||
    <%= if @changeset.action && not @changeset.valid? do %>
 | 
			
		||||
      <div class="invalid-feedback col-span-3 text-center">
 | 
			
		||||
        <%= changeset_errors(@changeset) %>
 | 
			
		||||
      </div>
 | 
			
		||||
    <% end %>
 | 
			
		||||
    <div
 | 
			
		||||
      :if={@changeset.action && not @changeset.valid?()}
 | 
			
		||||
      class="invalid-feedback col-span-3 text-center"
 | 
			
		||||
    >
 | 
			
		||||
      <%= changeset_errors(@changeset) %>
 | 
			
		||||
    </div>
 | 
			
		||||
 | 
			
		||||
    <%= 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),
 | 
			
		||||
@@ -59,8 +60,8 @@
 | 
			
		||||
    ) %>
 | 
			
		||||
    <%= error_tag(f, :container_id, "col-span-3 text-center") %>
 | 
			
		||||
 | 
			
		||||
    <%= cond do %>
 | 
			
		||||
      <% @action in [:new, :clone] -> %>
 | 
			
		||||
    <%= case @action do %>
 | 
			
		||||
      <% action when action in [:new, :clone] -> %>
 | 
			
		||||
        <hr class="hr col-span-3" />
 | 
			
		||||
 | 
			
		||||
        <%= label(f, :multiplier, gettext("Copies"), class: "title text-lg text-primary-600") %>
 | 
			
		||||
@@ -77,7 +78,7 @@
 | 
			
		||||
        ) %>
 | 
			
		||||
 | 
			
		||||
        <%= error_tag(f, :multiplier, "col-span-3 text-center") %>
 | 
			
		||||
      <% @action == :edit -> %>
 | 
			
		||||
      <% :edit -> %>
 | 
			
		||||
        <%= submit(dgettext("actions", "Save"),
 | 
			
		||||
          phx_disable_with: dgettext("prompts", "Saving..."),
 | 
			
		||||
          class: "mx-auto col-span-3 btn btn-primary"
 | 
			
		||||
 
 | 
			
		||||
@@ -3,12 +3,13 @@
 | 
			
		||||
    <%= gettext("Ammo") %>
 | 
			
		||||
  </h1>
 | 
			
		||||
 | 
			
		||||
  <%= if @ammo_groups |> Enum.empty?() and @search |> is_nil() do %>
 | 
			
		||||
    <h2 class="title text-xl text-primary-600">
 | 
			
		||||
      <%= gettext("No Ammo") %>
 | 
			
		||||
      <%= display_emoji("😔") %>
 | 
			
		||||
    </h2>
 | 
			
		||||
  <% end %>
 | 
			
		||||
  <h2
 | 
			
		||||
    :if={@ammo_groups |> Enum.empty?() and @search |> is_nil()}
 | 
			
		||||
    class="title text-xl text-primary-600"
 | 
			
		||||
  >
 | 
			
		||||
    <%= gettext("No Ammo") %>
 | 
			
		||||
    <%= display_emoji("😔") %>
 | 
			
		||||
  </h2>
 | 
			
		||||
 | 
			
		||||
  <%= cond do %>
 | 
			
		||||
    <% @containers_count == 0 -> %>
 | 
			
		||||
 
 | 
			
		||||
@@ -11,11 +11,12 @@
 | 
			
		||||
    phx-submit="save"
 | 
			
		||||
    class="flex flex-col space-y-4 sm:space-y-0 sm:grid sm:grid-cols-3 sm:gap-4 justify-center items-center"
 | 
			
		||||
  >
 | 
			
		||||
    <%= if @changeset.action && not @changeset.valid? do %>
 | 
			
		||||
      <div class="invalid-feedback col-span-3 text-center">
 | 
			
		||||
        <%= changeset_errors(@changeset) %>
 | 
			
		||||
      </div>
 | 
			
		||||
    <% end %>
 | 
			
		||||
    <div
 | 
			
		||||
      :if={@changeset.action && not @changeset.valid?()}
 | 
			
		||||
      class="invalid-feedback col-span-3 text-center"
 | 
			
		||||
    >
 | 
			
		||||
      <%= changeset_errors(@changeset) %>
 | 
			
		||||
    </div>
 | 
			
		||||
 | 
			
		||||
    <%= 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") %>
 | 
			
		||||
 
 | 
			
		||||
@@ -104,17 +104,18 @@
 | 
			
		||||
  <% end %>
 | 
			
		||||
</div>
 | 
			
		||||
 | 
			
		||||
<%= if @live_action in [:new, :edit, :clone] do %>
 | 
			
		||||
  <.modal return_to={Routes.ammo_type_index_path(Endpoint, :index)}>
 | 
			
		||||
    <.live_component
 | 
			
		||||
      module={CanneryWeb.AmmoTypeLive.FormComponent}
 | 
			
		||||
      id={@ammo_type.id || :new}
 | 
			
		||||
      title={@page_title}
 | 
			
		||||
      action={@live_action}
 | 
			
		||||
      ammo_type={@ammo_type}
 | 
			
		||||
      return_to={Routes.ammo_type_index_path(Endpoint, :index)}
 | 
			
		||||
      current_user={@current_user}
 | 
			
		||||
      }
 | 
			
		||||
    />
 | 
			
		||||
  </.modal>
 | 
			
		||||
<% end %>
 | 
			
		||||
<.modal
 | 
			
		||||
  :if={@live_action in [:new, :edit, :clone]}
 | 
			
		||||
  return_to={Routes.ammo_type_index_path(Endpoint, :index)}
 | 
			
		||||
>
 | 
			
		||||
  <.live_component
 | 
			
		||||
    module={CanneryWeb.AmmoTypeLive.FormComponent}
 | 
			
		||||
    id={@ammo_type.id || :new}
 | 
			
		||||
    title={@page_title}
 | 
			
		||||
    action={@live_action}
 | 
			
		||||
    ammo_type={@ammo_type}
 | 
			
		||||
    return_to={Routes.ammo_type_index_path(Endpoint, :index)}
 | 
			
		||||
    current_user={@current_user}
 | 
			
		||||
    }
 | 
			
		||||
  />
 | 
			
		||||
</.modal>
 | 
			
		||||
 
 | 
			
		||||
@@ -3,13 +3,14 @@
 | 
			
		||||
    <%= @ammo_type.name %>
 | 
			
		||||
  </h1>
 | 
			
		||||
 | 
			
		||||
  <%= if @ammo_type.desc do %>
 | 
			
		||||
    <span class="max-w-2xl w-full px-8 py-4 rounded-lg
 | 
			
		||||
      text-center title text-lg
 | 
			
		||||
      border border-primary-600">
 | 
			
		||||
      <%= @ammo_type.desc %>
 | 
			
		||||
    </span>
 | 
			
		||||
  <% end %>
 | 
			
		||||
  <span
 | 
			
		||||
    :if={@ammo_type.desc}
 | 
			
		||||
    class="max-w-2xl w-full px-8 py-4 rounded-lg
 | 
			
		||||
    text-center title text-lg
 | 
			
		||||
    border border-primary-600"
 | 
			
		||||
  >
 | 
			
		||||
    <%= @ammo_type.desc %>
 | 
			
		||||
  </span>
 | 
			
		||||
 | 
			
		||||
  <div class="flex space-x-4 justify-center items-center text-primary-600">
 | 
			
		||||
    <.link
 | 
			
		||||
@@ -185,25 +186,28 @@
 | 
			
		||||
        </.live_component>
 | 
			
		||||
      <% else %>
 | 
			
		||||
        <div class="flex flex-wrap justify-center items-stretch">
 | 
			
		||||
          <%= for ammo_group <- @ammo_groups do %>
 | 
			
		||||
            <.ammo_group_card ammo_group={ammo_group} show_container={true} />
 | 
			
		||||
          <% end %>
 | 
			
		||||
          <.ammo_group_card
 | 
			
		||||
            :for={ammo_group <- @ammo_groups}
 | 
			
		||||
            ammo_group={ammo_group}
 | 
			
		||||
            show_container={true}
 | 
			
		||||
          />
 | 
			
		||||
        </div>
 | 
			
		||||
      <% end %>
 | 
			
		||||
    <% end %>
 | 
			
		||||
  </div>
 | 
			
		||||
</div>
 | 
			
		||||
 | 
			
		||||
<%= if @live_action in [:edit] do %>
 | 
			
		||||
  <.modal return_to={Routes.ammo_type_show_path(Endpoint, :show, @ammo_type)}>
 | 
			
		||||
    <.live_component
 | 
			
		||||
      module={CanneryWeb.AmmoTypeLive.FormComponent}
 | 
			
		||||
      id={@ammo_type.id}
 | 
			
		||||
      title={@page_title}
 | 
			
		||||
      action={@live_action}
 | 
			
		||||
      ammo_type={@ammo_type}
 | 
			
		||||
      return_to={Routes.ammo_type_show_path(Endpoint, :show, @ammo_type)}
 | 
			
		||||
      current_user={@current_user}
 | 
			
		||||
    />
 | 
			
		||||
  </.modal>
 | 
			
		||||
<% end %>
 | 
			
		||||
<.modal
 | 
			
		||||
  :if={@live_action == :edit}
 | 
			
		||||
  return_to={Routes.ammo_type_show_path(Endpoint, :show, @ammo_type)}
 | 
			
		||||
>
 | 
			
		||||
  <.live_component
 | 
			
		||||
    module={CanneryWeb.AmmoTypeLive.FormComponent}
 | 
			
		||||
    id={@ammo_type.id}
 | 
			
		||||
    title={@page_title}
 | 
			
		||||
    action={@live_action}
 | 
			
		||||
    ammo_type={@ammo_type}
 | 
			
		||||
    return_to={Routes.ammo_type_show_path(Endpoint, :show, @ammo_type)}
 | 
			
		||||
    current_user={@current_user}
 | 
			
		||||
  />
 | 
			
		||||
</.modal>
 | 
			
		||||
 
 | 
			
		||||
@@ -4,34 +4,31 @@
 | 
			
		||||
  </h2>
 | 
			
		||||
 | 
			
		||||
  <div class="flex flex-wrap justify-center items-center">
 | 
			
		||||
    <%= for tag <- @container.tags do %>
 | 
			
		||||
      <.link
 | 
			
		||||
        href="#"
 | 
			
		||||
        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
 | 
			
		||||
          )
 | 
			
		||||
        }
 | 
			
		||||
      >
 | 
			
		||||
        <%= tag.name %>
 | 
			
		||||
        <i class="fa-fw fa-sm fas fa-trash"></i>
 | 
			
		||||
      </.link>
 | 
			
		||||
    <% end %>
 | 
			
		||||
    <.link
 | 
			
		||||
      :for={tag <- @container.tags}
 | 
			
		||||
      href="#"
 | 
			
		||||
      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
 | 
			
		||||
        )
 | 
			
		||||
      }
 | 
			
		||||
    >
 | 
			
		||||
      <%= tag.name %>
 | 
			
		||||
      <i class="fa-fw fa-sm fas fa-trash"></i>
 | 
			
		||||
    </.link>
 | 
			
		||||
 | 
			
		||||
    <%= if @container.tags |> Enum.empty?() do %>
 | 
			
		||||
      <h2 class="title text-xl text-primary-600">
 | 
			
		||||
        <%= gettext("No tags") %>
 | 
			
		||||
        <%= display_emoji("😔") %>
 | 
			
		||||
      </h2>
 | 
			
		||||
    <% end %>
 | 
			
		||||
    <h2 :if={@container.tags |> Enum.empty?()} class="title text-xl text-primary-600">
 | 
			
		||||
      <%= gettext("No tags") %>
 | 
			
		||||
      <%= display_emoji("😔") %>
 | 
			
		||||
    </h2>
 | 
			
		||||
  </div>
 | 
			
		||||
 | 
			
		||||
  <%= unless tag_options(@tags, @container) |> Enum.empty?() do %>
 | 
			
		||||
 
 | 
			
		||||
@@ -11,11 +11,12 @@
 | 
			
		||||
    phx-change="validate"
 | 
			
		||||
    phx-submit="save"
 | 
			
		||||
  >
 | 
			
		||||
    <%= if @changeset.action && not @changeset.valid? do %>
 | 
			
		||||
      <div class="invalid-feedback col-span-3 text-center">
 | 
			
		||||
        <%= changeset_errors(@changeset) %>
 | 
			
		||||
      </div>
 | 
			
		||||
    <% end %>
 | 
			
		||||
    <div
 | 
			
		||||
      :if={@changeset.action && not @changeset.valid?()}
 | 
			
		||||
      class="invalid-feedback col-span-3 text-center"
 | 
			
		||||
    >
 | 
			
		||||
      <%= changeset_errors(@changeset) %>
 | 
			
		||||
    </div>
 | 
			
		||||
 | 
			
		||||
    <%= label(f, :name, gettext("Name"), class: "title text-lg text-primary-600") %>
 | 
			
		||||
    <%= text_input(f, :name,
 | 
			
		||||
 
 | 
			
		||||
@@ -99,78 +99,73 @@
 | 
			
		||||
      </.live_component>
 | 
			
		||||
    <% else %>
 | 
			
		||||
      <div class="w-full flex flex-row flex-wrap justify-center items-stretch">
 | 
			
		||||
        <%= for container <- @containers do %>
 | 
			
		||||
          <.container_card container={container}>
 | 
			
		||||
            <:tag_actions>
 | 
			
		||||
              <div class="mx-4 my-2">
 | 
			
		||||
                <.link
 | 
			
		||||
                  patch={Routes.container_index_path(Endpoint, :edit_tags, container)}
 | 
			
		||||
                  class="text-primary-600 link"
 | 
			
		||||
                >
 | 
			
		||||
                  <i class="fa-fw fa-lg fas fa-tags"></i>
 | 
			
		||||
                </.link>
 | 
			
		||||
              </div>
 | 
			
		||||
            </:tag_actions>
 | 
			
		||||
            <.link
 | 
			
		||||
              patch={Routes.container_index_path(Endpoint, :edit, container)}
 | 
			
		||||
              class="text-primary-600 link"
 | 
			
		||||
              data-qa={"edit-#{container.id}"}
 | 
			
		||||
            >
 | 
			
		||||
              <i class="fa-fw fa-lg fas fa-edit"></i>
 | 
			
		||||
            </.link>
 | 
			
		||||
        <.container_card :for={container <- @containers} container={container}>
 | 
			
		||||
          <:tag_actions>
 | 
			
		||||
            <div class="mx-4 my-2">
 | 
			
		||||
              <.link
 | 
			
		||||
                patch={Routes.container_index_path(Endpoint, :edit_tags, container)}
 | 
			
		||||
                class="text-primary-600 link"
 | 
			
		||||
              >
 | 
			
		||||
                <i class="fa-fw fa-lg fas fa-tags"></i>
 | 
			
		||||
              </.link>
 | 
			
		||||
            </div>
 | 
			
		||||
          </:tag_actions>
 | 
			
		||||
          <.link
 | 
			
		||||
            patch={Routes.container_index_path(Endpoint, :edit, container)}
 | 
			
		||||
            class="text-primary-600 link"
 | 
			
		||||
            data-qa={"edit-#{container.id}"}
 | 
			
		||||
          >
 | 
			
		||||
            <i class="fa-fw fa-lg fas fa-edit"></i>
 | 
			
		||||
          </.link>
 | 
			
		||||
 | 
			
		||||
            <.link
 | 
			
		||||
              patch={Routes.container_index_path(Endpoint, :clone, container)}
 | 
			
		||||
              class="text-primary-600 link"
 | 
			
		||||
              data-qa={"clone-#{container.id}"}
 | 
			
		||||
            >
 | 
			
		||||
              <i class="fa-fw fa-lg fas fa-copy"></i>
 | 
			
		||||
            </.link>
 | 
			
		||||
          <.link
 | 
			
		||||
            patch={Routes.container_index_path(Endpoint, :clone, container)}
 | 
			
		||||
            class="text-primary-600 link"
 | 
			
		||||
            data-qa={"clone-#{container.id}"}
 | 
			
		||||
          >
 | 
			
		||||
            <i class="fa-fw fa-lg fas fa-copy"></i>
 | 
			
		||||
          </.link>
 | 
			
		||||
 | 
			
		||||
            <.link
 | 
			
		||||
              href="#"
 | 
			
		||||
              class="text-primary-600 link"
 | 
			
		||||
              phx-click="delete"
 | 
			
		||||
              phx-value-id={container.id}
 | 
			
		||||
              data-confirm={
 | 
			
		||||
                dgettext("prompts", "Are you sure you want to delete %{name}?",
 | 
			
		||||
                  name: container.name
 | 
			
		||||
                )
 | 
			
		||||
              }
 | 
			
		||||
              data-qa={"delete-#{container.id}"}
 | 
			
		||||
            >
 | 
			
		||||
              <i class="fa-fw fa-lg fas fa-trash"></i>
 | 
			
		||||
            </.link>
 | 
			
		||||
          </.container_card>
 | 
			
		||||
        <% end %>
 | 
			
		||||
          <.link
 | 
			
		||||
            href="#"
 | 
			
		||||
            class="text-primary-600 link"
 | 
			
		||||
            phx-click="delete"
 | 
			
		||||
            phx-value-id={container.id}
 | 
			
		||||
            data-confirm={
 | 
			
		||||
              dgettext("prompts", "Are you sure you want to delete %{name}?", name: container.name)
 | 
			
		||||
            }
 | 
			
		||||
            data-qa={"delete-#{container.id}"}
 | 
			
		||||
          >
 | 
			
		||||
            <i class="fa-fw fa-lg fas fa-trash"></i>
 | 
			
		||||
          </.link>
 | 
			
		||||
        </.container_card>
 | 
			
		||||
      </div>
 | 
			
		||||
    <% end %>
 | 
			
		||||
  <% end %>
 | 
			
		||||
</div>
 | 
			
		||||
 | 
			
		||||
<%= if @live_action in [:new, :edit, :clone] do %>
 | 
			
		||||
  <.modal return_to={Routes.container_index_path(Endpoint, :index)}>
 | 
			
		||||
    <.live_component
 | 
			
		||||
      module={CanneryWeb.ContainerLive.FormComponent}
 | 
			
		||||
      id={@container.id || :new}
 | 
			
		||||
      title={@page_title}
 | 
			
		||||
      action={@live_action}
 | 
			
		||||
      container={@container}
 | 
			
		||||
      return_to={Routes.container_index_path(Endpoint, :index)}
 | 
			
		||||
      current_user={@current_user}
 | 
			
		||||
    />
 | 
			
		||||
  </.modal>
 | 
			
		||||
<% end %>
 | 
			
		||||
<.modal
 | 
			
		||||
  :if={@live_action in [:new, :edit, :clone]}
 | 
			
		||||
  return_to={Routes.container_index_path(Endpoint, :index)}
 | 
			
		||||
>
 | 
			
		||||
  <.live_component
 | 
			
		||||
    module={CanneryWeb.ContainerLive.FormComponent}
 | 
			
		||||
    id={@container.id || :new}
 | 
			
		||||
    title={@page_title}
 | 
			
		||||
    action={@live_action}
 | 
			
		||||
    container={@container}
 | 
			
		||||
    return_to={Routes.container_index_path(Endpoint, :index)}
 | 
			
		||||
    current_user={@current_user}
 | 
			
		||||
  />
 | 
			
		||||
</.modal>
 | 
			
		||||
 | 
			
		||||
<%= 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 %>
 | 
			
		||||
<.modal :if={@live_action == :edit_tags} 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>
 | 
			
		||||
 
 | 
			
		||||
@@ -3,24 +3,20 @@
 | 
			
		||||
    <%= @container.name %>
 | 
			
		||||
  </h1>
 | 
			
		||||
 | 
			
		||||
  <%= if @container.desc do %>
 | 
			
		||||
    <span class="rounded-lg title text-lg">
 | 
			
		||||
      <%= gettext("Description:") %>
 | 
			
		||||
      <%= @container.desc %>
 | 
			
		||||
    </span>
 | 
			
		||||
  <% end %>
 | 
			
		||||
  <span :if={@container.desc} class="rounded-lg title text-lg">
 | 
			
		||||
    <%= gettext("Description:") %>
 | 
			
		||||
    <%= @container.desc %>
 | 
			
		||||
  </span>
 | 
			
		||||
 | 
			
		||||
  <span class="rounded-lg title text-lg">
 | 
			
		||||
    <%= gettext("Type:") %>
 | 
			
		||||
    <%= @container.type %>
 | 
			
		||||
  </span>
 | 
			
		||||
 | 
			
		||||
  <%= if @container.location do %>
 | 
			
		||||
    <span class="rounded-lg title text-lg">
 | 
			
		||||
      <%= gettext("Location:") %>
 | 
			
		||||
      <%= @container.location %>
 | 
			
		||||
    </span>
 | 
			
		||||
  <% end %>
 | 
			
		||||
  <span :if={@container.location} class="rounded-lg title text-lg">
 | 
			
		||||
    <%= gettext("Location:") %>
 | 
			
		||||
    <%= @container.location %>
 | 
			
		||||
  </span>
 | 
			
		||||
 | 
			
		||||
  <%= unless @ammo_groups |> Enum.empty?() do %>
 | 
			
		||||
    <span class="rounded-lg title text-lg">
 | 
			
		||||
@@ -82,9 +78,7 @@
 | 
			
		||||
    </div>
 | 
			
		||||
  <% else %>
 | 
			
		||||
    <div class="flex flex-wrap justify-center items-center">
 | 
			
		||||
      <%= for tag <- @container.tags do %>
 | 
			
		||||
        <.simple_tag_card tag={tag} />
 | 
			
		||||
      <% end %>
 | 
			
		||||
      <.simple_tag_card :for={tag <- @container.tags} tag={tag} />
 | 
			
		||||
 | 
			
		||||
      <div class="mx-4 my-2">
 | 
			
		||||
        <.link
 | 
			
		||||
@@ -134,39 +128,39 @@
 | 
			
		||||
        </.live_component>
 | 
			
		||||
      <% else %>
 | 
			
		||||
        <div class="flex flex-wrap justify-center items-stretch">
 | 
			
		||||
          <%= for ammo_group <- @ammo_groups do %>
 | 
			
		||||
            <.ammo_group_card ammo_group={ammo_group} />
 | 
			
		||||
          <% end %>
 | 
			
		||||
          <.ammo_group_card :for={ammo_group <- @ammo_groups} ammo_group={ammo_group} />
 | 
			
		||||
        </div>
 | 
			
		||||
      <% end %>
 | 
			
		||||
    <% end %>
 | 
			
		||||
  </div>
 | 
			
		||||
</div>
 | 
			
		||||
 | 
			
		||||
<%= if @live_action in [:edit] do %>
 | 
			
		||||
  <.modal return_to={Routes.container_show_path(Endpoint, :show, @container)}>
 | 
			
		||||
    <.live_component
 | 
			
		||||
      module={CanneryWeb.ContainerLive.FormComponent}
 | 
			
		||||
      id={@container.id}
 | 
			
		||||
      title={@page_title}
 | 
			
		||||
      action={@live_action}
 | 
			
		||||
      container={@container}
 | 
			
		||||
      return_to={Routes.container_show_path(Endpoint, :show, @container)}
 | 
			
		||||
      current_user={@current_user}
 | 
			
		||||
    />
 | 
			
		||||
  </.modal>
 | 
			
		||||
<% end %>
 | 
			
		||||
<.modal
 | 
			
		||||
  :if={@live_action == :edit}
 | 
			
		||||
  return_to={Routes.container_show_path(Endpoint, :show, @container)}
 | 
			
		||||
>
 | 
			
		||||
  <.live_component
 | 
			
		||||
    module={CanneryWeb.ContainerLive.FormComponent}
 | 
			
		||||
    id={@container.id}
 | 
			
		||||
    title={@page_title}
 | 
			
		||||
    action={@live_action}
 | 
			
		||||
    container={@container}
 | 
			
		||||
    return_to={Routes.container_show_path(Endpoint, :show, @container)}
 | 
			
		||||
    current_user={@current_user}
 | 
			
		||||
  />
 | 
			
		||||
</.modal>
 | 
			
		||||
 | 
			
		||||
<%= if @live_action == :edit_tags do %>
 | 
			
		||||
  <.modal return_to={Routes.container_show_path(Endpoint, :show, @container)}>
 | 
			
		||||
    <.live_component
 | 
			
		||||
      module={CanneryWeb.ContainerLive.EditTagsComponent}
 | 
			
		||||
      id={@container.id}
 | 
			
		||||
      title={@page_title}
 | 
			
		||||
      action={@live_action}
 | 
			
		||||
      container={@container}
 | 
			
		||||
      return_to={Routes.container_show_path(Endpoint, :show, @container)}
 | 
			
		||||
      current_user={@current_user}
 | 
			
		||||
    />
 | 
			
		||||
  </.modal>
 | 
			
		||||
<% end %>
 | 
			
		||||
<.modal
 | 
			
		||||
  :if={@live_action == :edit_tags}
 | 
			
		||||
  return_to={Routes.container_show_path(Endpoint, :show, @container)}
 | 
			
		||||
>
 | 
			
		||||
  <.live_component
 | 
			
		||||
    module={CanneryWeb.ContainerLive.EditTagsComponent}
 | 
			
		||||
    id={@container.id}
 | 
			
		||||
    title={@page_title}
 | 
			
		||||
    action={@live_action}
 | 
			
		||||
    container={@container}
 | 
			
		||||
    return_to={Routes.container_show_path(Endpoint, :show, @container)}
 | 
			
		||||
    current_user={@current_user}
 | 
			
		||||
  />
 | 
			
		||||
</.modal>
 | 
			
		||||
 
 | 
			
		||||
@@ -15,161 +15,4 @@ defmodule CanneryWeb.HomeLive do
 | 
			
		||||
    socket = socket |> assign(page_title: gettext("Home"), admins: admins, version: @version)
 | 
			
		||||
    {:ok, socket}
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  @impl true
 | 
			
		||||
  def render(assigns) do
 | 
			
		||||
    ~H"""
 | 
			
		||||
    <div class="mx-auto px-8 sm:px-16 flex flex-col justify-center items-center text-center space-y-4 max-w-3xl">
 | 
			
		||||
      <img
 | 
			
		||||
        src={Routes.static_path(Endpoint, "/images/cannery.svg")}
 | 
			
		||||
        alt={gettext("Cannery logo")}
 | 
			
		||||
        class="inline-block w-32 hover:-mt-2 hover:mb-2 transition-all duration-500 ease-in-out"
 | 
			
		||||
        title={gettext("isn't he cute >:3")}
 | 
			
		||||
      />
 | 
			
		||||
 | 
			
		||||
      <h1 class="title text-primary-600 text-2xl">
 | 
			
		||||
        <%= gettext("Welcome to %{name}", name: "Cannery") %>
 | 
			
		||||
      </h1>
 | 
			
		||||
 | 
			
		||||
      <h2 class="title text-primary-600 text-lg">
 | 
			
		||||
        <%= gettext("The self-hosted firearm tracker website") %>
 | 
			
		||||
      </h2>
 | 
			
		||||
 | 
			
		||||
      <hr class="hr" />
 | 
			
		||||
 | 
			
		||||
      <ul class="flex flex-col space-y-4 text-center">
 | 
			
		||||
        <li class="flex flex-col justify-center items-center
 | 
			
		||||
          space-y-2">
 | 
			
		||||
          <b class="whitespace-nowrap">
 | 
			
		||||
            <%= gettext("Easy to Use:") %>
 | 
			
		||||
          </b>
 | 
			
		||||
          <p>
 | 
			
		||||
            <%= gettext(
 | 
			
		||||
              "%{name} lets you easily keep an eye on your ammo levels before and after range day",
 | 
			
		||||
              name: "Cannery"
 | 
			
		||||
            ) %>
 | 
			
		||||
          </p>
 | 
			
		||||
        </li>
 | 
			
		||||
        <li class="flex flex-col justify-center items-center
 | 
			
		||||
          space-y-2">
 | 
			
		||||
          <b class="whitespace-nowrap">
 | 
			
		||||
            <%= gettext("Secure:") %>
 | 
			
		||||
          </b>
 | 
			
		||||
          <p>
 | 
			
		||||
            <%= gettext("Self-host your own instance, or use an instance from someone you trust.") %>
 | 
			
		||||
            <%= gettext("Your data stays with you, period") %>
 | 
			
		||||
          </p>
 | 
			
		||||
        </li>
 | 
			
		||||
        <li class="flex flex-col justify-center items-center
 | 
			
		||||
          space-y-2">
 | 
			
		||||
          <b class="whitespace-nowrap">
 | 
			
		||||
            <%= gettext("Simple:") %>
 | 
			
		||||
          </b>
 | 
			
		||||
          <p>
 | 
			
		||||
            <%= gettext("Access from any internet-capable device") %>
 | 
			
		||||
          </p>
 | 
			
		||||
        </li>
 | 
			
		||||
      </ul>
 | 
			
		||||
 | 
			
		||||
      <hr class="hr" />
 | 
			
		||||
 | 
			
		||||
      <ul class="flex flex-col space-y-2 text-center justify-center">
 | 
			
		||||
        <h2 class="title text-primary-600 text-lg">
 | 
			
		||||
          <%= gettext("Instance Information") %>
 | 
			
		||||
        </h2>
 | 
			
		||||
 | 
			
		||||
        <li class="flex flex-col justify-center space-x-2">
 | 
			
		||||
          <b>
 | 
			
		||||
            <%= gettext("Admins:") %>
 | 
			
		||||
          </b>
 | 
			
		||||
          <p>
 | 
			
		||||
            <%= if @admins |> Enum.empty?() do %>
 | 
			
		||||
              <.link
 | 
			
		||||
                href={Routes.user_registration_path(CanneryWeb.Endpoint, :new)}
 | 
			
		||||
                class="hover:underline"
 | 
			
		||||
              >
 | 
			
		||||
                <%= dgettext("prompts", "Register to setup %{name}", name: "Cannery") %>
 | 
			
		||||
              </.link>
 | 
			
		||||
            <% else %>
 | 
			
		||||
              <div class="flex flex-wrap justify-center space-x-2">
 | 
			
		||||
                <%= for admin <- @admins do %>
 | 
			
		||||
                  <a class="hover:underline" href={"mailto:#{admin.email}"}>
 | 
			
		||||
                    <%= admin.email %>
 | 
			
		||||
                  </a>
 | 
			
		||||
                <% end %>
 | 
			
		||||
              </div>
 | 
			
		||||
            <% end %>
 | 
			
		||||
          </p>
 | 
			
		||||
        </li>
 | 
			
		||||
 | 
			
		||||
        <li class="flex flex-row justify-center space-x-2">
 | 
			
		||||
          <b>Registration:</b>
 | 
			
		||||
          <p>
 | 
			
		||||
            <%= case Application.get_env(:cannery, Cannery.Accounts)[:registration] do
 | 
			
		||||
              "public" -> gettext("Public Signups")
 | 
			
		||||
              _ -> gettext("Invite Only")
 | 
			
		||||
            end %>
 | 
			
		||||
          </p>
 | 
			
		||||
        </li>
 | 
			
		||||
 | 
			
		||||
        <li class="flex flex-row justify-center items-center space-x-2">
 | 
			
		||||
          <b>Version:</b>
 | 
			
		||||
          <.link
 | 
			
		||||
            href="https://gitea.bubbletea.dev/shibao/cannery/src/branch/stable/CHANGELOG.md"
 | 
			
		||||
            class="flex flex-row justify-center items-center space-x-2 hover:underline"
 | 
			
		||||
            target="_blank"
 | 
			
		||||
            rel="noopener noreferrer"
 | 
			
		||||
          >
 | 
			
		||||
            <p>
 | 
			
		||||
              <%= @version %>
 | 
			
		||||
            </p>
 | 
			
		||||
            <i class="fas fa-md fa-info-circle"></i>
 | 
			
		||||
          </.link>
 | 
			
		||||
        </li>
 | 
			
		||||
      </ul>
 | 
			
		||||
 | 
			
		||||
      <hr class="hr" />
 | 
			
		||||
 | 
			
		||||
      <ul class="flex flex-col space-y-2 text-center justify-center">
 | 
			
		||||
        <h2 class="title text-primary-600 text-lg">
 | 
			
		||||
          <%= gettext("Get involved!") %>
 | 
			
		||||
        </h2>
 | 
			
		||||
 | 
			
		||||
        <li class="flex flex-col justify-center space-x-2">
 | 
			
		||||
          <.link
 | 
			
		||||
            class="flex flex-row justify-center items-center space-x-2 hover:underline"
 | 
			
		||||
            href="https://gitea.bubbletea.dev/shibao/cannery"
 | 
			
		||||
            target="_blank"
 | 
			
		||||
            rel="noopener noreferrer"
 | 
			
		||||
          >
 | 
			
		||||
            <p><%= gettext("View the source code") %></p>
 | 
			
		||||
            <i class="fas fa-md fa-code"></i>
 | 
			
		||||
          </.link>
 | 
			
		||||
        </li>
 | 
			
		||||
        <li class="flex flex-col justify-center space-x-2">
 | 
			
		||||
          <.link
 | 
			
		||||
            class="flex flex-row justify-center items-center space-x-2 hover:underline"
 | 
			
		||||
            href="https://weblate.bubbletea.dev/engage/cannery"
 | 
			
		||||
            target="_blank"
 | 
			
		||||
            rel="noopener noreferrer"
 | 
			
		||||
          >
 | 
			
		||||
            <p><%= gettext("Help translate") %></p>
 | 
			
		||||
            <i class="fas fa-md fa-language"></i>
 | 
			
		||||
          </.link>
 | 
			
		||||
        </li>
 | 
			
		||||
        <li class="flex flex-col justify-center space-x-2">
 | 
			
		||||
          <.link
 | 
			
		||||
            class="flex flex-row justify-center items-center space-x-2 hover:underline"
 | 
			
		||||
            href="https://gitea.bubbletea.dev/shibao/cannery/issues/new"
 | 
			
		||||
            target="_blank"
 | 
			
		||||
            rel="noopener noreferrer"
 | 
			
		||||
          >
 | 
			
		||||
            <p><%= gettext("Report bugs or request features") %></p>
 | 
			
		||||
            <i class="fas fa-md fa-spider"></i>
 | 
			
		||||
          </.link>
 | 
			
		||||
        </li>
 | 
			
		||||
      </ul>
 | 
			
		||||
    </div>
 | 
			
		||||
    """
 | 
			
		||||
  end
 | 
			
		||||
end
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										144
									
								
								lib/cannery_web/live/home_live.html.heex
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										144
									
								
								lib/cannery_web/live/home_live.html.heex
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,144 @@
 | 
			
		||||
<div class="mx-auto px-8 sm:px-16 flex flex-col justify-center items-center text-center space-y-4 max-w-3xl">
 | 
			
		||||
  <img
 | 
			
		||||
    src={Routes.static_path(Endpoint, "/images/cannery.svg")}
 | 
			
		||||
    alt={gettext("Cannery logo")}
 | 
			
		||||
    class="inline-block w-32 hover:-mt-2 hover:mb-2 transition-all duration-500 ease-in-out"
 | 
			
		||||
    title={gettext("isn't he cute >:3")}
 | 
			
		||||
  />
 | 
			
		||||
 | 
			
		||||
  <h1 class="title text-primary-600 text-2xl">
 | 
			
		||||
    <%= gettext("Welcome to Cannery") %>
 | 
			
		||||
  </h1>
 | 
			
		||||
 | 
			
		||||
  <h2 class="title text-primary-600 text-lg">
 | 
			
		||||
    <%= gettext("The self-hosted firearm tracker website") %>
 | 
			
		||||
  </h2>
 | 
			
		||||
 | 
			
		||||
  <hr class="hr" />
 | 
			
		||||
 | 
			
		||||
  <ul class="flex flex-col space-y-4 text-center">
 | 
			
		||||
    <li class="flex flex-col justify-center items-center
 | 
			
		||||
      space-y-2">
 | 
			
		||||
      <b class="whitespace-nowrap">
 | 
			
		||||
        <%= gettext("Easy to Use:") %>
 | 
			
		||||
      </b>
 | 
			
		||||
      <p>
 | 
			
		||||
        <%= gettext(
 | 
			
		||||
          "Cannery lets you easily keep an eye on your ammo levels before and after range day"
 | 
			
		||||
        ) %>
 | 
			
		||||
      </p>
 | 
			
		||||
    </li>
 | 
			
		||||
    <li class="flex flex-col justify-center items-center space-y-2">
 | 
			
		||||
      <b class="whitespace-nowrap">
 | 
			
		||||
        <%= gettext("Secure:") %>
 | 
			
		||||
      </b>
 | 
			
		||||
      <p>
 | 
			
		||||
        <%= gettext("Self-host your own instance, or use an instance from someone you trust.") %>
 | 
			
		||||
        <%= gettext("Your data stays with you, period") %>
 | 
			
		||||
      </p>
 | 
			
		||||
    </li>
 | 
			
		||||
    <li class="flex flex-col justify-center items-center
 | 
			
		||||
      space-y-2">
 | 
			
		||||
      <b class="whitespace-nowrap">
 | 
			
		||||
        <%= gettext("Simple:") %>
 | 
			
		||||
      </b>
 | 
			
		||||
      <p>
 | 
			
		||||
        <%= gettext("Access from any internet-capable device") %>
 | 
			
		||||
      </p>
 | 
			
		||||
    </li>
 | 
			
		||||
  </ul>
 | 
			
		||||
 | 
			
		||||
  <hr class="hr" />
 | 
			
		||||
 | 
			
		||||
  <ul class="flex flex-col space-y-2 text-center justify-center">
 | 
			
		||||
    <h2 class="title text-primary-600 text-lg">
 | 
			
		||||
      <%= gettext("Instance Information") %>
 | 
			
		||||
    </h2>
 | 
			
		||||
 | 
			
		||||
    <li class="flex flex-col justify-center space-x-2">
 | 
			
		||||
      <b>
 | 
			
		||||
        <%= gettext("Admins:") %>
 | 
			
		||||
      </b>
 | 
			
		||||
      <p>
 | 
			
		||||
        <%= if @admins |> Enum.empty?() do %>
 | 
			
		||||
          <.link href={Routes.user_registration_path(Endpoint, :new)} class="hover:underline">
 | 
			
		||||
            <%= dgettext("prompts", "Register to setup Cannery") %>
 | 
			
		||||
          </.link>
 | 
			
		||||
        <% else %>
 | 
			
		||||
          <div class="flex flex-wrap justify-center space-x-2">
 | 
			
		||||
            <a :for={%{email: email} <- @admins} class="hover:underline" href={"mailto:#{email}"}>
 | 
			
		||||
              <%= email %>
 | 
			
		||||
            </a>
 | 
			
		||||
          </div>
 | 
			
		||||
        <% end %>
 | 
			
		||||
      </p>
 | 
			
		||||
    </li>
 | 
			
		||||
 | 
			
		||||
    <li class="flex flex-row justify-center space-x-2">
 | 
			
		||||
      <b><%= gettext("Registration:") %></b>
 | 
			
		||||
      <p>
 | 
			
		||||
        <%= case Application.get_env(:cannery, Cannery.Accounts)[:registration] do
 | 
			
		||||
          "public" -> gettext("Public Signups")
 | 
			
		||||
          _ -> gettext("Invite Only")
 | 
			
		||||
        end %>
 | 
			
		||||
      </p>
 | 
			
		||||
    </li>
 | 
			
		||||
 | 
			
		||||
    <li class="flex flex-row justify-center items-center space-x-2">
 | 
			
		||||
      <b><%= gettext("Version:") %></b>
 | 
			
		||||
      <.link
 | 
			
		||||
        href="https://gitea.bubbletea.dev/shibao/cannery/src/branch/stable/CHANGELOG.md"
 | 
			
		||||
        class="flex flex-row justify-center items-center space-x-2 hover:underline"
 | 
			
		||||
        target="_blank"
 | 
			
		||||
        rel="noopener noreferrer"
 | 
			
		||||
      >
 | 
			
		||||
        <p>
 | 
			
		||||
          <%= @version %>
 | 
			
		||||
        </p>
 | 
			
		||||
        <i class="fas fa-md fa-info-circle"></i>
 | 
			
		||||
      </.link>
 | 
			
		||||
    </li>
 | 
			
		||||
  </ul>
 | 
			
		||||
 | 
			
		||||
  <hr class="hr" />
 | 
			
		||||
 | 
			
		||||
  <ul class="flex flex-col space-y-2 text-center justify-center">
 | 
			
		||||
    <h2 class="title text-primary-600 text-lg">
 | 
			
		||||
      <%= gettext("Get involved!") %>
 | 
			
		||||
    </h2>
 | 
			
		||||
 | 
			
		||||
    <li class="flex flex-col justify-center space-x-2">
 | 
			
		||||
      <.link
 | 
			
		||||
        class="flex flex-row justify-center items-center space-x-2 hover:underline"
 | 
			
		||||
        href="https://gitea.bubbletea.dev/shibao/cannery"
 | 
			
		||||
        target="_blank"
 | 
			
		||||
        rel="noopener noreferrer"
 | 
			
		||||
      >
 | 
			
		||||
        <p><%= gettext("View the source code") %></p>
 | 
			
		||||
        <i class="fas fa-md fa-code"></i>
 | 
			
		||||
      </.link>
 | 
			
		||||
    </li>
 | 
			
		||||
    <li class="flex flex-col justify-center space-x-2">
 | 
			
		||||
      <.link
 | 
			
		||||
        class="flex flex-row justify-center items-center space-x-2 hover:underline"
 | 
			
		||||
        href="https://weblate.bubbletea.dev/engage/cannery"
 | 
			
		||||
        target="_blank"
 | 
			
		||||
        rel="noopener noreferrer"
 | 
			
		||||
      >
 | 
			
		||||
        <p><%= gettext("Help translate") %></p>
 | 
			
		||||
        <i class="fas fa-md fa-language"></i>
 | 
			
		||||
      </.link>
 | 
			
		||||
    </li>
 | 
			
		||||
    <li class="flex flex-col justify-center space-x-2">
 | 
			
		||||
      <.link
 | 
			
		||||
        class="flex flex-row justify-center items-center space-x-2 hover:underline"
 | 
			
		||||
        href="https://gitea.bubbletea.dev/shibao/cannery/issues/new"
 | 
			
		||||
        target="_blank"
 | 
			
		||||
        rel="noopener noreferrer"
 | 
			
		||||
      >
 | 
			
		||||
        <p><%= gettext("Report bugs or request features") %></p>
 | 
			
		||||
        <i class="fas fa-md fa-spider"></i>
 | 
			
		||||
      </.link>
 | 
			
		||||
    </li>
 | 
			
		||||
  </ul>
 | 
			
		||||
</div>
 | 
			
		||||
@@ -11,11 +11,12 @@
 | 
			
		||||
    phx-change="validate"
 | 
			
		||||
    phx-submit="save"
 | 
			
		||||
  >
 | 
			
		||||
    <%= if @changeset.action && not @changeset.valid? do %>
 | 
			
		||||
      <div class="invalid-feedback col-span-3 text-center">
 | 
			
		||||
        <%= changeset_errors(@changeset) %>
 | 
			
		||||
      </div>
 | 
			
		||||
    <% end %>
 | 
			
		||||
    <div
 | 
			
		||||
      :if={@changeset.action && not @changeset.valid?()}
 | 
			
		||||
      class="invalid-feedback col-span-3 text-center"
 | 
			
		||||
    >
 | 
			
		||||
      <%= changeset_errors(@changeset) %>
 | 
			
		||||
    </div>
 | 
			
		||||
 | 
			
		||||
    <%= label(f, :name, gettext("Name"), class: "title text-lg text-primary-600") %>
 | 
			
		||||
    <%= text_input(f, :name, class: "input input-primary col-span-2") %>
 | 
			
		||||
@@ -25,7 +26,7 @@
 | 
			
		||||
    <%= number_input(f, :uses_left, min: 0, class: "input input-primary col-span-2") %>
 | 
			
		||||
    <%= error_tag(f, :uses_left, "col-span-3") %>
 | 
			
		||||
    <span class="col-span-3 text-primary-400 italic text-center">
 | 
			
		||||
      <%= gettext("Leave \"Uses left\" blank to make invite unlimited") %>
 | 
			
		||||
      <%= gettext(~s/Leave "Uses left" blank to make invite unlimited/) %>
 | 
			
		||||
    </span>
 | 
			
		||||
 | 
			
		||||
    <%= submit(dgettext("actions", "Save"),
 | 
			
		||||
 
 | 
			
		||||
@@ -19,69 +19,65 @@
 | 
			
		||||
  <% end %>
 | 
			
		||||
 | 
			
		||||
  <div class="w-full flex flex-row flex-wrap justify-center items-stretch">
 | 
			
		||||
    <%= for invite <- @invites do %>
 | 
			
		||||
      <.invite_card invite={invite}>
 | 
			
		||||
        <:code_actions>
 | 
			
		||||
          <form phx-submit="copy_to_clipboard">
 | 
			
		||||
            <button
 | 
			
		||||
              type="submit"
 | 
			
		||||
              class="mx-2 my-1 btn btn-primary"
 | 
			
		||||
              phx-click={JS.dispatch("cannery:clipcopy", to: "#code-#{invite.id}")}
 | 
			
		||||
            >
 | 
			
		||||
              <%= dgettext("actions", "Copy to clipboard") %>
 | 
			
		||||
            </button>
 | 
			
		||||
          </form>
 | 
			
		||||
        </:code_actions>
 | 
			
		||||
        <.link
 | 
			
		||||
          patch={Routes.invite_index_path(Endpoint, :edit, invite)}
 | 
			
		||||
          class="text-primary-600 link"
 | 
			
		||||
          data-qa={"edit-#{invite.id}"}
 | 
			
		||||
        >
 | 
			
		||||
          <i class="fa-fw fa-lg fas fa-edit"></i>
 | 
			
		||||
        </.link>
 | 
			
		||||
 | 
			
		||||
        <.link
 | 
			
		||||
          href="#"
 | 
			
		||||
          class="text-primary-600 link"
 | 
			
		||||
          phx-click="delete_invite"
 | 
			
		||||
          phx-value-id={invite.id}
 | 
			
		||||
          data-confirm={
 | 
			
		||||
            dgettext("prompts", "Are you sure you want to delete the invite for %{name}?",
 | 
			
		||||
              name: invite.name
 | 
			
		||||
            )
 | 
			
		||||
          }
 | 
			
		||||
          data-qa={"delete-#{invite.id}"}
 | 
			
		||||
        >
 | 
			
		||||
          <i class="fa-fw fa-lg fas fa-trash"></i>
 | 
			
		||||
        </.link>
 | 
			
		||||
 | 
			
		||||
        <%= if invite.disabled_at |> is_nil() do %>
 | 
			
		||||
          <a href="#" class="btn btn-primary" phx-click="disable_invite" phx-value-id={invite.id}>
 | 
			
		||||
            <%= dgettext("actions", "Disable") %>
 | 
			
		||||
          </a>
 | 
			
		||||
        <% else %>
 | 
			
		||||
          <a href="#" class="btn btn-primary" phx-click="enable_invite" phx-value-id={invite.id}>
 | 
			
		||||
            <%= dgettext("actions", "Enable") %>
 | 
			
		||||
          </a>
 | 
			
		||||
        <% end %>
 | 
			
		||||
 | 
			
		||||
        <%= if invite.disabled_at |> is_nil() and not (invite.uses_left |> is_nil()) do %>
 | 
			
		||||
          <a
 | 
			
		||||
            href="#"
 | 
			
		||||
            class="btn btn-primary"
 | 
			
		||||
            phx-click="set_unlimited"
 | 
			
		||||
            phx-value-id={invite.id}
 | 
			
		||||
            data-confirm={
 | 
			
		||||
              dgettext("prompts", "Are you sure you want to make %{name} unlimited?",
 | 
			
		||||
                name: invite.name
 | 
			
		||||
              )
 | 
			
		||||
            }
 | 
			
		||||
    <.invite_card :for={invite <- @invites} invite={invite}>
 | 
			
		||||
      <:code_actions>
 | 
			
		||||
        <form phx-submit="copy_to_clipboard">
 | 
			
		||||
          <button
 | 
			
		||||
            type="submit"
 | 
			
		||||
            class="mx-2 my-1 btn btn-primary"
 | 
			
		||||
            phx-click={JS.dispatch("cannery:clipcopy", to: "#code-#{invite.id}")}
 | 
			
		||||
          >
 | 
			
		||||
            <%= dgettext("actions", "Set Unlimited") %>
 | 
			
		||||
          </a>
 | 
			
		||||
        <% end %>
 | 
			
		||||
      </.invite_card>
 | 
			
		||||
    <% end %>
 | 
			
		||||
            <%= dgettext("actions", "Copy to clipboard") %>
 | 
			
		||||
          </button>
 | 
			
		||||
        </form>
 | 
			
		||||
      </:code_actions>
 | 
			
		||||
      <.link
 | 
			
		||||
        patch={Routes.invite_index_path(Endpoint, :edit, invite)}
 | 
			
		||||
        class="text-primary-600 link"
 | 
			
		||||
        data-qa={"edit-#{invite.id}"}
 | 
			
		||||
      >
 | 
			
		||||
        <i class="fa-fw fa-lg fas fa-edit"></i>
 | 
			
		||||
      </.link>
 | 
			
		||||
 | 
			
		||||
      <.link
 | 
			
		||||
        href="#"
 | 
			
		||||
        class="text-primary-600 link"
 | 
			
		||||
        phx-click="delete_invite"
 | 
			
		||||
        phx-value-id={invite.id}
 | 
			
		||||
        data-confirm={
 | 
			
		||||
          dgettext("prompts", "Are you sure you want to delete the invite for %{name}?",
 | 
			
		||||
            name: invite.name
 | 
			
		||||
          )
 | 
			
		||||
        }
 | 
			
		||||
        data-qa={"delete-#{invite.id}"}
 | 
			
		||||
      >
 | 
			
		||||
        <i class="fa-fw fa-lg fas fa-trash"></i>
 | 
			
		||||
      </.link>
 | 
			
		||||
 | 
			
		||||
      <a
 | 
			
		||||
        href="#"
 | 
			
		||||
        class="btn btn-primary"
 | 
			
		||||
        phx-click={if invite.disabled_at, do: "enable_invite", else: "disable_invite"}
 | 
			
		||||
        phx-value-id={invite.id}
 | 
			
		||||
      >
 | 
			
		||||
        <%= if invite.disabled_at, do: gettext("Enable"), else: gettext("Disable") %>
 | 
			
		||||
      </a>
 | 
			
		||||
 | 
			
		||||
      <a
 | 
			
		||||
        :if={invite.disabled_at |> is_nil() and not (invite.uses_left |> is_nil())}
 | 
			
		||||
        href="#"
 | 
			
		||||
        class="btn btn-primary"
 | 
			
		||||
        phx-click="set_unlimited"
 | 
			
		||||
        phx-value-id={invite.id}
 | 
			
		||||
        data-confirm={
 | 
			
		||||
          dgettext("prompts", "Are you sure you want to make %{name} unlimited?",
 | 
			
		||||
            name: invite.name
 | 
			
		||||
          )
 | 
			
		||||
        }
 | 
			
		||||
      >
 | 
			
		||||
        <%= dgettext("actions", "Set Unlimited") %>
 | 
			
		||||
      </a>
 | 
			
		||||
    </.invite_card>
 | 
			
		||||
  </div>
 | 
			
		||||
 | 
			
		||||
  <%= unless @admins |> Enum.empty?() do %>
 | 
			
		||||
@@ -92,25 +88,23 @@
 | 
			
		||||
    </h1>
 | 
			
		||||
 | 
			
		||||
    <div class="w-full flex flex-row flex-wrap justify-center items-stretch">
 | 
			
		||||
      <%= for admin <- @admins do %>
 | 
			
		||||
        <.user_card user={admin}>
 | 
			
		||||
          <.link
 | 
			
		||||
            href="#"
 | 
			
		||||
            class="text-primary-600 link"
 | 
			
		||||
            phx-click="delete_user"
 | 
			
		||||
            phx-value-id={admin.id}
 | 
			
		||||
            data-confirm={
 | 
			
		||||
              dgettext(
 | 
			
		||||
                "prompts",
 | 
			
		||||
                "Are you sure you want to delete %{email}? This action is permanent!",
 | 
			
		||||
                email: admin.email
 | 
			
		||||
              )
 | 
			
		||||
            }
 | 
			
		||||
          >
 | 
			
		||||
            <i class="fa-fw fa-lg fas fa-trash"></i>
 | 
			
		||||
          </.link>
 | 
			
		||||
        </.user_card>
 | 
			
		||||
      <% end %>
 | 
			
		||||
      <.user_card :for={admin <- @admins} user={admin}>
 | 
			
		||||
        <.link
 | 
			
		||||
          href="#"
 | 
			
		||||
          class="text-primary-600 link"
 | 
			
		||||
          phx-click="delete_user"
 | 
			
		||||
          phx-value-id={admin.id}
 | 
			
		||||
          data-confirm={
 | 
			
		||||
            dgettext(
 | 
			
		||||
              "prompts",
 | 
			
		||||
              "Are you sure you want to delete %{email}? This action is permanent!",
 | 
			
		||||
              email: admin.email
 | 
			
		||||
            )
 | 
			
		||||
          }
 | 
			
		||||
        >
 | 
			
		||||
          <i class="fa-fw fa-lg fas fa-trash"></i>
 | 
			
		||||
        </.link>
 | 
			
		||||
      </.user_card>
 | 
			
		||||
    </div>
 | 
			
		||||
  <% end %>
 | 
			
		||||
 | 
			
		||||
@@ -122,39 +116,35 @@
 | 
			
		||||
    </h1>
 | 
			
		||||
 | 
			
		||||
    <div class="w-full flex flex-row flex-wrap justify-center items-stretch">
 | 
			
		||||
      <%= for user <- @users do %>
 | 
			
		||||
        <.user_card user={user}>
 | 
			
		||||
          <.link
 | 
			
		||||
            href="#"
 | 
			
		||||
            class="text-primary-600 link"
 | 
			
		||||
            phx-click="delete_user"
 | 
			
		||||
            phx-value-id={user.id}
 | 
			
		||||
            data-confirm={
 | 
			
		||||
              dgettext(
 | 
			
		||||
                "prompts",
 | 
			
		||||
                "Are you sure you want to delete %{email}? This action is permanent!",
 | 
			
		||||
                email: user.email
 | 
			
		||||
              )
 | 
			
		||||
            }
 | 
			
		||||
          >
 | 
			
		||||
            <i class="fa-fw fa-lg fas fa-trash"></i>
 | 
			
		||||
          </.link>
 | 
			
		||||
        </.user_card>
 | 
			
		||||
      <% end %>
 | 
			
		||||
      <.user_card :for={user <- @users} user={user}>
 | 
			
		||||
        <.link
 | 
			
		||||
          href="#"
 | 
			
		||||
          class="text-primary-600 link"
 | 
			
		||||
          phx-click="delete_user"
 | 
			
		||||
          phx-value-id={user.id}
 | 
			
		||||
          data-confirm={
 | 
			
		||||
            dgettext(
 | 
			
		||||
              "prompts",
 | 
			
		||||
              "Are you sure you want to delete %{email}? This action is permanent!",
 | 
			
		||||
              email: user.email
 | 
			
		||||
            )
 | 
			
		||||
          }
 | 
			
		||||
        >
 | 
			
		||||
          <i class="fa-fw fa-lg fas fa-trash"></i>
 | 
			
		||||
        </.link>
 | 
			
		||||
      </.user_card>
 | 
			
		||||
    </div>
 | 
			
		||||
  <% end %>
 | 
			
		||||
</div>
 | 
			
		||||
 | 
			
		||||
<%= if @live_action in [:new, :edit] do %>
 | 
			
		||||
  <.modal return_to={Routes.invite_index_path(Endpoint, :index)}>
 | 
			
		||||
    <.live_component
 | 
			
		||||
      module={CanneryWeb.InviteLive.FormComponent}
 | 
			
		||||
      id={@invite.id || :new}
 | 
			
		||||
      title={@page_title}
 | 
			
		||||
      action={@live_action}
 | 
			
		||||
      invite={@invite}
 | 
			
		||||
      return_to={Routes.invite_index_path(Endpoint, :index)}
 | 
			
		||||
      current_user={@current_user}
 | 
			
		||||
    />
 | 
			
		||||
  </.modal>
 | 
			
		||||
<% end %>
 | 
			
		||||
<.modal :if={@live_action in [:new, :edit]} return_to={Routes.invite_index_path(Endpoint, :index)}>
 | 
			
		||||
  <.live_component
 | 
			
		||||
    module={CanneryWeb.InviteLive.FormComponent}
 | 
			
		||||
    id={@invite.id || :new}
 | 
			
		||||
    title={@page_title}
 | 
			
		||||
    action={@live_action}
 | 
			
		||||
    invite={@invite}
 | 
			
		||||
    return_to={Routes.invite_index_path(Endpoint, :index)}
 | 
			
		||||
    current_user={@current_user}
 | 
			
		||||
  />
 | 
			
		||||
</.modal>
 | 
			
		||||
 
 | 
			
		||||
@@ -31,10 +31,10 @@ defmodule CanneryWeb.LiveHelpers do
 | 
			
		||||
      patch={@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"
 | 
			
		||||
        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()}
 | 
			
		||||
      phx-remove={hide_modal()}
 | 
			
		||||
    >
 | 
			
		||||
      <span class="hidden"></span>
 | 
			
		||||
    </.link>
 | 
			
		||||
@@ -48,18 +48,18 @@ defmodule CanneryWeb.LiveHelpers do
 | 
			
		||||
      <div
 | 
			
		||||
        id="modal-content"
 | 
			
		||||
        class="fade-in-scale w-full max-w-3xl relative
 | 
			
		||||
        pointer-events-auto overflow-hidden
 | 
			
		||||
        px-8 py-4 sm:py-8 flex flex-col justify-center items-center
 | 
			
		||||
        flex flex-col justify-start items-center
 | 
			
		||||
        bg-white border-2 rounded-lg"
 | 
			
		||||
          pointer-events-auto overflow-hidden
 | 
			
		||||
          px-8 py-4 sm:py-8 flex flex-col justify-center items-center
 | 
			
		||||
          flex flex-col justify-start items-center
 | 
			
		||||
          bg-white border-2 rounded-lg"
 | 
			
		||||
      >
 | 
			
		||||
        <.link
 | 
			
		||||
          patch={@return_to}
 | 
			
		||||
          id="close"
 | 
			
		||||
          class="absolute top-8 right-10
 | 
			
		||||
                      text-gray-500 hover:text-gray-800
 | 
			
		||||
                      transition-all duration-500 ease-in-out"
 | 
			
		||||
          phx_remove={hide_modal()}
 | 
			
		||||
            text-gray-500 hover:text-gray-800
 | 
			
		||||
            transition-all duration-500 ease-in-out"
 | 
			
		||||
          phx-remove={hide_modal()}
 | 
			
		||||
        >
 | 
			
		||||
          <i class="fa-fw fa-lg fas fa-times"></i>
 | 
			
		||||
        </.link>
 | 
			
		||||
@@ -106,8 +106,8 @@ defmodule CanneryWeb.LiveHelpers do
 | 
			
		||||
        data-qa={@id}
 | 
			
		||||
        {
 | 
			
		||||
          if assigns |> Map.has_key?(:target),
 | 
			
		||||
            do: %{"phx-click" => @action, "phx-value-value" => @value, "phx-target" => @target},
 | 
			
		||||
            else: %{"phx-click" => @action, "phx-value-value" => @value}
 | 
			
		||||
            do: %{"phx-click": @action, "phx-value-value": @value, "phx-target": @target},
 | 
			
		||||
            else: %{"phx-click": @action, "phx-value-value": @value}
 | 
			
		||||
        }
 | 
			
		||||
      />
 | 
			
		||||
      <div class="w-11 h-6 bg-gray-300 rounded-full peer
 | 
			
		||||
 
 | 
			
		||||
@@ -12,11 +12,12 @@
 | 
			
		||||
    phx-change="validate"
 | 
			
		||||
    phx-submit="save"
 | 
			
		||||
  >
 | 
			
		||||
    <%= if @changeset.action && not @changeset.valid? do %>
 | 
			
		||||
      <div class="invalid-feedback col-span-3 text-center">
 | 
			
		||||
        <%= changeset_errors(@changeset) %>
 | 
			
		||||
      </div>
 | 
			
		||||
    <% end %>
 | 
			
		||||
    <div
 | 
			
		||||
      :if={@changeset.action && not @changeset.valid?()}
 | 
			
		||||
      class="invalid-feedback col-span-3 text-center"
 | 
			
		||||
    >
 | 
			
		||||
      <%= changeset_errors(@changeset) %>
 | 
			
		||||
    </div>
 | 
			
		||||
 | 
			
		||||
    <%= label(f, :count, gettext("Shots fired"), class: "title text-lg text-primary-600") %>
 | 
			
		||||
    <%= number_input(f, :count,
 | 
			
		||||
 
 | 
			
		||||
@@ -18,28 +18,26 @@
 | 
			
		||||
    </.link>
 | 
			
		||||
 | 
			
		||||
    <div class="w-full flex flex-row flex-wrap justify-center items-stretch">
 | 
			
		||||
      <%= for ammo_group <- @ammo_groups do %>
 | 
			
		||||
        <.ammo_group_card ammo_group={ammo_group}>
 | 
			
		||||
          <button
 | 
			
		||||
            type="button"
 | 
			
		||||
            class="btn btn-primary"
 | 
			
		||||
            phx-click="toggle_staged"
 | 
			
		||||
            phx-value-ammo_group_id={ammo_group.id}
 | 
			
		||||
            data-confirm={"#{dgettext("prompts", "Are you sure you want to unstage this ammo?")}"}
 | 
			
		||||
          >
 | 
			
		||||
            <%= if ammo_group.staged,
 | 
			
		||||
              do: dgettext("actions", "Unstage from range"),
 | 
			
		||||
              else: dgettext("actions", "Stage for range") %>
 | 
			
		||||
          </button>
 | 
			
		||||
      <.ammo_group_card :for={ammo_group <- @ammo_groups} ammo_group={ammo_group}>
 | 
			
		||||
        <button
 | 
			
		||||
          type="button"
 | 
			
		||||
          class="btn btn-primary"
 | 
			
		||||
          phx-click="toggle_staged"
 | 
			
		||||
          phx-value-ammo_group_id={ammo_group.id}
 | 
			
		||||
          data-confirm={"#{dgettext("prompts", "Are you sure you want to unstage this ammo?")}"}
 | 
			
		||||
        >
 | 
			
		||||
          <%= if ammo_group.staged,
 | 
			
		||||
            do: dgettext("actions", "Unstage from range"),
 | 
			
		||||
            else: dgettext("actions", "Stage for range") %>
 | 
			
		||||
        </button>
 | 
			
		||||
 | 
			
		||||
          <.link
 | 
			
		||||
            patch={Routes.range_index_path(Endpoint, :add_shot_group, ammo_group)}
 | 
			
		||||
            class="btn btn-primary"
 | 
			
		||||
          >
 | 
			
		||||
            <%= dgettext("actions", "Record shots") %>
 | 
			
		||||
          </.link>
 | 
			
		||||
        </.ammo_group_card>
 | 
			
		||||
      <% end %>
 | 
			
		||||
        <.link
 | 
			
		||||
          patch={Routes.range_index_path(Endpoint, :add_shot_group, ammo_group)}
 | 
			
		||||
          class="btn btn-primary"
 | 
			
		||||
        >
 | 
			
		||||
          <%= dgettext("actions", "Record shots") %>
 | 
			
		||||
        </.link>
 | 
			
		||||
      </.ammo_group_card>
 | 
			
		||||
    </div>
 | 
			
		||||
  <% end %>
 | 
			
		||||
 | 
			
		||||
@@ -128,30 +126,29 @@
 | 
			
		||||
  <% end %>
 | 
			
		||||
</div>
 | 
			
		||||
 | 
			
		||||
<%= if @live_action in [:edit] do %>
 | 
			
		||||
  <.modal return_to={Routes.range_index_path(Endpoint, :index)}>
 | 
			
		||||
    <.live_component
 | 
			
		||||
      module={CanneryWeb.RangeLive.FormComponent}
 | 
			
		||||
      id={@shot_group.id}
 | 
			
		||||
      title={@page_title}
 | 
			
		||||
      action={@live_action}
 | 
			
		||||
      shot_group={@shot_group}
 | 
			
		||||
      return_to={Routes.range_index_path(Endpoint, :index)}
 | 
			
		||||
      current_user={@current_user}
 | 
			
		||||
    />
 | 
			
		||||
  </.modal>
 | 
			
		||||
<% end %>
 | 
			
		||||
<.modal :if={@live_action == :edit} return_to={Routes.range_index_path(Endpoint, :index)}>
 | 
			
		||||
  <.live_component
 | 
			
		||||
    module={CanneryWeb.RangeLive.FormComponent}
 | 
			
		||||
    id={@shot_group.id}
 | 
			
		||||
    title={@page_title}
 | 
			
		||||
    action={@live_action}
 | 
			
		||||
    shot_group={@shot_group}
 | 
			
		||||
    return_to={Routes.range_index_path(Endpoint, :index)}
 | 
			
		||||
    current_user={@current_user}
 | 
			
		||||
  />
 | 
			
		||||
</.modal>
 | 
			
		||||
 | 
			
		||||
<%= if @live_action in [:add_shot_group] do %>
 | 
			
		||||
  <.modal return_to={Routes.range_index_path(Endpoint, :index)}>
 | 
			
		||||
    <.live_component
 | 
			
		||||
      module={CanneryWeb.Components.AddShotGroupComponent}
 | 
			
		||||
      id={:new}
 | 
			
		||||
      title={@page_title}
 | 
			
		||||
      action={@live_action}
 | 
			
		||||
      ammo_group={@ammo_group}
 | 
			
		||||
      return_to={Routes.range_index_path(Endpoint, :index)}
 | 
			
		||||
      current_user={@current_user}
 | 
			
		||||
    />
 | 
			
		||||
  </.modal>
 | 
			
		||||
<% end %>
 | 
			
		||||
<.modal
 | 
			
		||||
  :if={@live_action == :add_shot_group}
 | 
			
		||||
  return_to={Routes.range_index_path(Endpoint, :index)}
 | 
			
		||||
>
 | 
			
		||||
  <.live_component
 | 
			
		||||
    module={CanneryWeb.Components.AddShotGroupComponent}
 | 
			
		||||
    id={:new}
 | 
			
		||||
    title={@page_title}
 | 
			
		||||
    action={@live_action}
 | 
			
		||||
    ammo_group={@ammo_group}
 | 
			
		||||
    return_to={Routes.range_index_path(Endpoint, :index)}
 | 
			
		||||
    current_user={@current_user}
 | 
			
		||||
  />
 | 
			
		||||
</.modal>
 | 
			
		||||
 
 | 
			
		||||
@@ -50,53 +50,6 @@ defmodule CanneryWeb.TagLive.FormComponent do
 | 
			
		||||
    socket |> assign(:changeset, changeset)
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  @impl true
 | 
			
		||||
  def render(assigns) do
 | 
			
		||||
    ~H"""
 | 
			
		||||
    <div>
 | 
			
		||||
      <h2 class="mb-8 text-center title text-xl text-primary-600">
 | 
			
		||||
        <%= @title %>
 | 
			
		||||
      </h2>
 | 
			
		||||
      <.form
 | 
			
		||||
        :let={f}
 | 
			
		||||
        for={@changeset}
 | 
			
		||||
        id="tag-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-change="validate"
 | 
			
		||||
        phx-submit="save"
 | 
			
		||||
      >
 | 
			
		||||
        <%= if @changeset.action && not @changeset.valid? do %>
 | 
			
		||||
          <div class="invalid-feedback col-span-3 text-center">
 | 
			
		||||
            <%= changeset_errors(@changeset) %>
 | 
			
		||||
          </div>
 | 
			
		||||
        <% end %>
 | 
			
		||||
 | 
			
		||||
        <%= label(f, :name, gettext("Name"), class: "title text-lg text-primary-600") %>
 | 
			
		||||
        <%= text_input(f, :name, class: "input input-primary col-span-2") %>
 | 
			
		||||
        <%= error_tag(f, :name, "col-span-3") %>
 | 
			
		||||
 | 
			
		||||
        <%= label(f, :bg_color, gettext("Background color"), class: "title text-lg text-primary-600") %>
 | 
			
		||||
        <span id="tag-bg-color-input" class="mx-auto col-span-2" phx-update="ignore">
 | 
			
		||||
          <%= color_input(f, :bg_color) %>
 | 
			
		||||
        </span>
 | 
			
		||||
        <%= error_tag(f, :bg_color, "col-span-3") %>
 | 
			
		||||
 | 
			
		||||
        <%= label(f, :text_color, gettext("Text color"), class: "title text-lg text-primary-600") %>
 | 
			
		||||
        <span id="tag-text-color-input" class="mx-auto col-span-2" phx-update="ignore">
 | 
			
		||||
          <%= color_input(f, :text_color) %>
 | 
			
		||||
        </span>
 | 
			
		||||
        <%= error_tag(f, :text_color, "col-span-3") %>
 | 
			
		||||
 | 
			
		||||
        <%= submit(dgettext("actions", "Save"),
 | 
			
		||||
          class: "mx-auto btn btn-primary col-span-3",
 | 
			
		||||
          phx_disable_with: dgettext("prompts", "Saving...")
 | 
			
		||||
        ) %>
 | 
			
		||||
      </.form>
 | 
			
		||||
    </div>
 | 
			
		||||
    """
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  defp save_tag(
 | 
			
		||||
         %{assigns: %{tag: tag, current_user: current_user, return_to: return_to}} = socket,
 | 
			
		||||
         :edit,
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										42
									
								
								lib/cannery_web/live/tag_live/form_component.html.heex
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										42
									
								
								lib/cannery_web/live/tag_live/form_component.html.heex
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,42 @@
 | 
			
		||||
<div>
 | 
			
		||||
  <h2 class="mb-8 text-center title text-xl text-primary-600">
 | 
			
		||||
    <%= @title %>
 | 
			
		||||
  </h2>
 | 
			
		||||
  <.form
 | 
			
		||||
    :let={f}
 | 
			
		||||
    for={@changeset}
 | 
			
		||||
    id="tag-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-change="validate"
 | 
			
		||||
    phx-submit="save"
 | 
			
		||||
  >
 | 
			
		||||
    <div
 | 
			
		||||
      :if={@changeset.action && not @changeset.valid?()}
 | 
			
		||||
      class="invalid-feedback col-span-3 text-center"
 | 
			
		||||
    >
 | 
			
		||||
      <%= changeset_errors(@changeset) %>
 | 
			
		||||
    </div>
 | 
			
		||||
 | 
			
		||||
    <%= label(f, :name, gettext("Name"), class: "title text-lg text-primary-600") %>
 | 
			
		||||
    <%= text_input(f, :name, class: "input input-primary col-span-2") %>
 | 
			
		||||
    <%= error_tag(f, :name, "col-span-3") %>
 | 
			
		||||
 | 
			
		||||
    <%= label(f, :bg_color, gettext("Background color"), class: "title text-lg text-primary-600") %>
 | 
			
		||||
    <span id="tag-bg-color-input" class="mx-auto col-span-2" phx-update="ignore">
 | 
			
		||||
      <%= color_input(f, :bg_color) %>
 | 
			
		||||
    </span>
 | 
			
		||||
    <%= error_tag(f, :bg_color, "col-span-3") %>
 | 
			
		||||
 | 
			
		||||
    <%= label(f, :text_color, gettext("Text color"), class: "title text-lg text-primary-600") %>
 | 
			
		||||
    <span id="tag-text-color-input" class="mx-auto col-span-2" phx-update="ignore">
 | 
			
		||||
      <%= color_input(f, :text_color) %>
 | 
			
		||||
    </span>
 | 
			
		||||
    <%= error_tag(f, :text_color, "col-span-3") %>
 | 
			
		||||
 | 
			
		||||
    <%= submit(dgettext("actions", "Save"),
 | 
			
		||||
      class: "mx-auto btn btn-primary col-span-3",
 | 
			
		||||
      phx_disable_with: dgettext("prompts", "Saving...")
 | 
			
		||||
    ) %>
 | 
			
		||||
  </.form>
 | 
			
		||||
</div>
 | 
			
		||||
@@ -45,44 +45,40 @@
 | 
			
		||||
    </h2>
 | 
			
		||||
  <% else %>
 | 
			
		||||
    <div class="flex flex-row flex-wrap justify-center items-stretch">
 | 
			
		||||
      <%= for tag <- @tags do %>
 | 
			
		||||
        <.tag_card tag={tag}>
 | 
			
		||||
          <.link
 | 
			
		||||
            patch={Routes.tag_index_path(Endpoint, :edit, tag)}
 | 
			
		||||
            class="text-primary-600 link"
 | 
			
		||||
            data-qa={"edit-#{tag.id}"}
 | 
			
		||||
          >
 | 
			
		||||
            <i class="fa-fw fa-lg fas fa-edit"></i>
 | 
			
		||||
          </.link>
 | 
			
		||||
      <.tag_card :for={tag <- @tags} tag={tag}>
 | 
			
		||||
        <.link
 | 
			
		||||
          patch={Routes.tag_index_path(Endpoint, :edit, tag)}
 | 
			
		||||
          class="text-primary-600 link"
 | 
			
		||||
          data-qa={"edit-#{tag.id}"}
 | 
			
		||||
        >
 | 
			
		||||
          <i class="fa-fw fa-lg fas fa-edit"></i>
 | 
			
		||||
        </.link>
 | 
			
		||||
 | 
			
		||||
          <.link
 | 
			
		||||
            href="#"
 | 
			
		||||
            class="text-primary-600 link"
 | 
			
		||||
            phx-click="delete"
 | 
			
		||||
            phx-value-id={tag.id}
 | 
			
		||||
            data-confirm={
 | 
			
		||||
              dgettext("prompts", "Are you sure you want to delete %{name}?", name: tag.name)
 | 
			
		||||
            }
 | 
			
		||||
            data-qa={"delete-#{tag.id}"}
 | 
			
		||||
          >
 | 
			
		||||
            <i class="fa-fw fa-lg fas fa-trash"></i>
 | 
			
		||||
          </.link>
 | 
			
		||||
        </.tag_card>
 | 
			
		||||
      <% end %>
 | 
			
		||||
        <.link
 | 
			
		||||
          href="#"
 | 
			
		||||
          class="text-primary-600 link"
 | 
			
		||||
          phx-click="delete"
 | 
			
		||||
          phx-value-id={tag.id}
 | 
			
		||||
          data-confirm={
 | 
			
		||||
            dgettext("prompts", "Are you sure you want to delete %{name}?", name: tag.name)
 | 
			
		||||
          }
 | 
			
		||||
          data-qa={"delete-#{tag.id}"}
 | 
			
		||||
        >
 | 
			
		||||
          <i class="fa-fw fa-lg fas fa-trash"></i>
 | 
			
		||||
        </.link>
 | 
			
		||||
      </.tag_card>
 | 
			
		||||
    </div>
 | 
			
		||||
  <% end %>
 | 
			
		||||
</div>
 | 
			
		||||
 | 
			
		||||
<%= if @live_action in [:new, :edit] do %>
 | 
			
		||||
  <.modal return_to={Routes.tag_index_path(Endpoint, :index)}>
 | 
			
		||||
    <.live_component
 | 
			
		||||
      module={CanneryWeb.TagLive.FormComponent}
 | 
			
		||||
      id={@tag.id || :new}
 | 
			
		||||
      title={@page_title}
 | 
			
		||||
      action={@live_action}
 | 
			
		||||
      tag={@tag}
 | 
			
		||||
      return_to={Routes.tag_index_path(Endpoint, :index)}
 | 
			
		||||
      current_user={@current_user}
 | 
			
		||||
    />
 | 
			
		||||
  </.modal>
 | 
			
		||||
<% end %>
 | 
			
		||||
<.modal :if={@live_action in [:new, :edit]} return_to={Routes.tag_index_path(Endpoint, :index)}>
 | 
			
		||||
  <.live_component
 | 
			
		||||
    module={CanneryWeb.TagLive.FormComponent}
 | 
			
		||||
    id={@tag.id || :new}
 | 
			
		||||
    title={@page_title}
 | 
			
		||||
    action={@live_action}
 | 
			
		||||
    tag={@tag}
 | 
			
		||||
    return_to={Routes.tag_index_path(Endpoint, :index)}
 | 
			
		||||
    current_user={@current_user}
 | 
			
		||||
  />
 | 
			
		||||
</.modal>
 | 
			
		||||
 
 | 
			
		||||
@@ -5,7 +5,7 @@
 | 
			
		||||
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
 | 
			
		||||
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
 | 
			
		||||
    <title>
 | 
			
		||||
      <%= dgettext("errors", "Error") %>| Cannery
 | 
			
		||||
      <%= dgettext("errors", "Error") %> | <%= gettext("Cannery") %>
 | 
			
		||||
    </title>
 | 
			
		||||
    <link rel="stylesheet" href="/css/app.css" />
 | 
			
		||||
    <script defer type="text/javascript" src="/js/app.js">
 | 
			
		||||
 
 | 
			
		||||
@@ -3,16 +3,12 @@
 | 
			
		||||
    <.topbar current_user={assigns[:current_user]}></.topbar>
 | 
			
		||||
 | 
			
		||||
    <div class="mx-8 my-2 flex flex-col space-y-4 text-center">
 | 
			
		||||
      <%= if get_flash(@conn, :info) do %>
 | 
			
		||||
        <p class="alert alert-info" role="alert">
 | 
			
		||||
          <%= get_flash(@conn, :info) %>
 | 
			
		||||
        </p>
 | 
			
		||||
      <% end %>
 | 
			
		||||
      <%= if get_flash(@conn, :error) do %>
 | 
			
		||||
        <p class="alert alert-danger" role="alert">
 | 
			
		||||
          <%= get_flash(@conn, :error) %>
 | 
			
		||||
        </p>
 | 
			
		||||
      <% end %>
 | 
			
		||||
      <p :if={get_flash(@conn, :info)} class="alert alert-info" role="alert">
 | 
			
		||||
        <%= get_flash(@conn, :info) %>
 | 
			
		||||
      </p>
 | 
			
		||||
      <p :if={get_flash(@conn, :error)} class="alert alert-danger" role="alert">
 | 
			
		||||
        <%= get_flash(@conn, :error) %>
 | 
			
		||||
      </p>
 | 
			
		||||
    </div>
 | 
			
		||||
  </header>
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -3,22 +3,25 @@
 | 
			
		||||
    <.topbar current_user={assigns[:current_user]}></.topbar>
 | 
			
		||||
 | 
			
		||||
    <div class="mx-8 my-2 flex flex-col space-y-4 text-center">
 | 
			
		||||
      <%= if @flash && @flash |> Map.has_key?("info") do %>
 | 
			
		||||
        <p class="alert alert-info" role="alert" phx-click="lv:clear-flash" phx-value-key="info">
 | 
			
		||||
          <%= live_flash(@flash, "info") %>
 | 
			
		||||
        </p>
 | 
			
		||||
      <% end %>
 | 
			
		||||
      <p
 | 
			
		||||
        :if={@flash && @flash |> Map.has_key?("info")}
 | 
			
		||||
        class="alert alert-info"
 | 
			
		||||
        role="alert"
 | 
			
		||||
        phx-click="lv:clear-flash"
 | 
			
		||||
        phx-value-key="info"
 | 
			
		||||
      >
 | 
			
		||||
        <%= live_flash(@flash, "info") %>
 | 
			
		||||
      </p>
 | 
			
		||||
 | 
			
		||||
      <%= if @flash && @flash |> Map.has_key?("error") do %>
 | 
			
		||||
        <p
 | 
			
		||||
          class="alert alert-danger"
 | 
			
		||||
          role="alert"
 | 
			
		||||
          phx-click="lv:clear-flash"
 | 
			
		||||
          phx-value-key="error"
 | 
			
		||||
        >
 | 
			
		||||
          <%= live_flash(@flash, "error") %>
 | 
			
		||||
        </p>
 | 
			
		||||
      <% end %>
 | 
			
		||||
      <p
 | 
			
		||||
        :if={@flash && @flash |> Map.has_key?("error")}
 | 
			
		||||
        class="alert alert-danger"
 | 
			
		||||
        role="alert"
 | 
			
		||||
        phx-click="lv:clear-flash"
 | 
			
		||||
        phx-value-key="error"
 | 
			
		||||
      >
 | 
			
		||||
        <%= live_flash(@flash, "error") %>
 | 
			
		||||
      </p>
 | 
			
		||||
    </div>
 | 
			
		||||
  </header>
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -3,29 +3,30 @@
 | 
			
		||||
    <%= dgettext("actions", "Resend confirmation instructions") %>
 | 
			
		||||
  </h1>
 | 
			
		||||
 | 
			
		||||
  <%= form_for :user,
 | 
			
		||||
           Routes.user_confirmation_path(@conn, :create),
 | 
			
		||||
           [
 | 
			
		||||
             class:
 | 
			
		||||
               "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 -> %>
 | 
			
		||||
  <.form
 | 
			
		||||
    :let={f}
 | 
			
		||||
    for={:user}
 | 
			
		||||
    action={Routes.user_confirmation_path(@conn, :create)}
 | 
			
		||||
    class="flex flex-col space-y-4 sm:space-y-0 sm:grid sm:grid-cols-3 sm:gap-4 justify-center items-center"
 | 
			
		||||
  >
 | 
			
		||||
    <%= label(f, :email, class: "title text-lg text-primary-600") %>
 | 
			
		||||
    <%= email_input(f, :email, required: true, class: "input input-primary col-span-2") %>
 | 
			
		||||
 | 
			
		||||
    <%= submit(dgettext("actions", "Resend confirmation instructions"),
 | 
			
		||||
      class: "mx-auto btn btn-primary col-span-3"
 | 
			
		||||
    ) %>
 | 
			
		||||
  <% end %>
 | 
			
		||||
  </.form>
 | 
			
		||||
 | 
			
		||||
  <hr class="hr" />
 | 
			
		||||
 | 
			
		||||
  <div class="flex flex-row justify-center items-center space-x-4">
 | 
			
		||||
    <%= if Accounts.allow_registration?() do %>
 | 
			
		||||
      <.link href={Routes.user_registration_path(@conn, :new)} class="btn btn-primary">
 | 
			
		||||
        <%= dgettext("actions", "Register") %>
 | 
			
		||||
      </.link>
 | 
			
		||||
    <% end %>
 | 
			
		||||
    <.link
 | 
			
		||||
      :if={Accounts.allow_registration?()}
 | 
			
		||||
      href={Routes.user_registration_path(@conn, :new)}
 | 
			
		||||
      class="btn btn-primary"
 | 
			
		||||
    >
 | 
			
		||||
      <%= dgettext("actions", "Register") %>
 | 
			
		||||
    </.link>
 | 
			
		||||
    <.link href={Routes.user_session_path(@conn, :new)} class="btn btn-primary">
 | 
			
		||||
      <%= dgettext("actions", "Log in") %>
 | 
			
		||||
    </.link>
 | 
			
		||||
 
 | 
			
		||||
@@ -3,20 +3,17 @@
 | 
			
		||||
    <%= dgettext("actions", "Register") %>
 | 
			
		||||
  </h1>
 | 
			
		||||
 | 
			
		||||
  <%= form_for @changeset,
 | 
			
		||||
           Routes.user_registration_path(@conn, :create),
 | 
			
		||||
           [
 | 
			
		||||
             class:
 | 
			
		||||
               "flex flex-col space-y-4 sm:space-y-0 sm:grid sm:grid-cols-3 sm:gap-4 justify-center items-center"
 | 
			
		||||
           ],
 | 
			
		||||
           fn f -> %>
 | 
			
		||||
    <%= if @changeset.action && not @changeset.valid? do %>
 | 
			
		||||
      <div class="alert alert-danger col-span-3">
 | 
			
		||||
        <p>
 | 
			
		||||
          <%= dgettext("errors", "Oops, something went wrong! Please check the errors below.") %>
 | 
			
		||||
        </p>
 | 
			
		||||
      </div>
 | 
			
		||||
    <% end %>
 | 
			
		||||
  <.form
 | 
			
		||||
    :let={f}
 | 
			
		||||
    for={@changeset}
 | 
			
		||||
    action={Routes.user_registration_path(@conn, :create)}
 | 
			
		||||
    class="flex flex-col space-y-4 sm:space-y-0 sm:grid sm:grid-cols-3 sm:gap-4 justify-center items-center"
 | 
			
		||||
  >
 | 
			
		||||
    <div :if={@changeset.action && not @changeset.valid?()} class="alert alert-danger col-span-3">
 | 
			
		||||
      <p>
 | 
			
		||||
        <%= dgettext("errors", "Oops, something went wrong! Please check the errors below.") %>
 | 
			
		||||
      </p>
 | 
			
		||||
    </div>
 | 
			
		||||
 | 
			
		||||
    <%= if @invite do %>
 | 
			
		||||
      <%= hidden_input(f, :invite_token, value: @invite.token) %>
 | 
			
		||||
@@ -40,7 +37,7 @@
 | 
			
		||||
    <%= error_tag(f, :locale) %>
 | 
			
		||||
 | 
			
		||||
    <%= submit(dgettext("actions", "Register"), class: "mx-auto btn btn-primary col-span-3") %>
 | 
			
		||||
  <% end %>
 | 
			
		||||
  </.form>
 | 
			
		||||
 | 
			
		||||
  <hr class="hr" />
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -3,20 +3,17 @@
 | 
			
		||||
    <%= dgettext("actions", "Reset password") %>
 | 
			
		||||
  </h1>
 | 
			
		||||
 | 
			
		||||
  <%= form_for @changeset,
 | 
			
		||||
           Routes.user_reset_password_path(@conn, :update, @token),
 | 
			
		||||
           [
 | 
			
		||||
             class:
 | 
			
		||||
               "flex flex-col space-y-4 sm:space-y-0 sm:grid sm:grid-cols-3 sm:gap-4 justify-center items-center"
 | 
			
		||||
           ],
 | 
			
		||||
           fn f -> %>
 | 
			
		||||
    <%= if @changeset.action && not @changeset.valid? do %>
 | 
			
		||||
      <div class="alert alert-danger col-span-3">
 | 
			
		||||
        <p>
 | 
			
		||||
          <%= dgettext("errors", "Oops, something went wrong! Please check the errors below.") %>
 | 
			
		||||
        </p>
 | 
			
		||||
      </div>
 | 
			
		||||
    <% end %>
 | 
			
		||||
  <.form
 | 
			
		||||
    :let={f}
 | 
			
		||||
    for={@changeset}
 | 
			
		||||
    action={Routes.user_reset_password_path(@conn, :update, @token)}
 | 
			
		||||
    class="flex flex-col space-y-4 sm:space-y-0 sm:grid sm:grid-cols-3 sm:gap-4 justify-center items-center"
 | 
			
		||||
  >
 | 
			
		||||
    <div :if={@changeset.action && not @changeset.valid?()} class="alert alert-danger col-span-3">
 | 
			
		||||
      <p>
 | 
			
		||||
        <%= dgettext("errors", "Oops, something went wrong! Please check the errors below.") %>
 | 
			
		||||
      </p>
 | 
			
		||||
    </div>
 | 
			
		||||
 | 
			
		||||
    <%= label(f, :password, "New password", class: "title text-lg text-primary-600") %>
 | 
			
		||||
    <%= password_input(f, :password, required: true, class: "input input-primary col-span-2") %>
 | 
			
		||||
@@ -34,16 +31,18 @@
 | 
			
		||||
    <%= submit(dgettext("actions", "Reset password"),
 | 
			
		||||
      class: "mx-auto btn btn-primary col-span-3"
 | 
			
		||||
    ) %>
 | 
			
		||||
  <% end %>
 | 
			
		||||
  </.form>
 | 
			
		||||
 | 
			
		||||
  <hr class="hr" />
 | 
			
		||||
 | 
			
		||||
  <div class="flex flex-row justify-center items-center space-x-4">
 | 
			
		||||
    <%= if Accounts.allow_registration?() do %>
 | 
			
		||||
      <.link href={Routes.user_registration_path(@conn, :new)} class="btn btn-primary">
 | 
			
		||||
        <%= dgettext("actions", "Register") %>
 | 
			
		||||
      </.link>
 | 
			
		||||
    <% end %>
 | 
			
		||||
    <.link
 | 
			
		||||
      :if={Accounts.allow_registration?()}
 | 
			
		||||
      href={Routes.user_registration_path(@conn, :new)}
 | 
			
		||||
      class="btn btn-primary"
 | 
			
		||||
    >
 | 
			
		||||
      <%= dgettext("actions", "Register") %>
 | 
			
		||||
    </.link>
 | 
			
		||||
    <.link href={Routes.user_session_path(@conn, :new)} class="btn btn-primary">
 | 
			
		||||
      <%= dgettext("actions", "Log in") %>
 | 
			
		||||
    </.link>
 | 
			
		||||
 
 | 
			
		||||
@@ -3,29 +3,30 @@
 | 
			
		||||
    <%= dgettext("actions", "Forgot your password?") %>
 | 
			
		||||
  </h1>
 | 
			
		||||
 | 
			
		||||
  <%= form_for :user,
 | 
			
		||||
           Routes.user_reset_password_path(@conn, :create),
 | 
			
		||||
           [
 | 
			
		||||
             class:
 | 
			
		||||
               "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 -> %>
 | 
			
		||||
  <.form
 | 
			
		||||
    :let={f}
 | 
			
		||||
    for={:user}
 | 
			
		||||
    action={Routes.user_reset_password_path(@conn, :create)}
 | 
			
		||||
    class="flex flex-col space-y-4 sm:space-y-0 sm:grid sm:grid-cols-3 sm:gap-4 justify-center items-center"
 | 
			
		||||
  >
 | 
			
		||||
    <%= label(f, :email, class: "title text-lg text-primary-600") %>
 | 
			
		||||
    <%= email_input(f, :email, required: true, class: "input input-primary col-span-2") %>
 | 
			
		||||
 | 
			
		||||
    <%= submit(dgettext("actions", "Send instructions to reset password"),
 | 
			
		||||
      class: "mx-auto btn btn-primary col-span-3"
 | 
			
		||||
    ) %>
 | 
			
		||||
  <% end %>
 | 
			
		||||
  </.form>
 | 
			
		||||
 | 
			
		||||
  <hr class="hr" />
 | 
			
		||||
 | 
			
		||||
  <div class="flex flex-row justify-center items-center space-x-4">
 | 
			
		||||
    <%= if Accounts.allow_registration?() do %>
 | 
			
		||||
      <.link href={Routes.user_registration_path(@conn, :new)} class="btn btn-primary">
 | 
			
		||||
        <%= dgettext("actions", "Register") %>
 | 
			
		||||
      </.link>
 | 
			
		||||
    <% end %>
 | 
			
		||||
    <.link
 | 
			
		||||
      :if={Accounts.allow_registration?()}
 | 
			
		||||
      href={Routes.user_registration_path(@conn, :new)}
 | 
			
		||||
      class="btn btn-primary"
 | 
			
		||||
    >
 | 
			
		||||
      <%= dgettext("actions", "Register") %>
 | 
			
		||||
    </.link>
 | 
			
		||||
    <.link href={Routes.user_session_path(@conn, :new)} class="btn btn-primary">
 | 
			
		||||
      <%= dgettext("actions", "Log in") %>
 | 
			
		||||
    </.link>
 | 
			
		||||
 
 | 
			
		||||
@@ -3,21 +3,18 @@
 | 
			
		||||
    <%= dgettext("actions", "Log in") %>
 | 
			
		||||
  </h1>
 | 
			
		||||
 | 
			
		||||
  <%= form_for @conn,
 | 
			
		||||
           Routes.user_session_path(@conn, :create),
 | 
			
		||||
           [
 | 
			
		||||
             as: :user,
 | 
			
		||||
             class:
 | 
			
		||||
               "flex flex-col space-y-4 sm:space-y-0 sm:grid sm:grid-cols-3 sm:gap-4 justify-center items-center"
 | 
			
		||||
           ],
 | 
			
		||||
           fn f -> %>
 | 
			
		||||
    <%= if @error_message do %>
 | 
			
		||||
      <div class="alert alert-danger col-span-3">
 | 
			
		||||
        <p>
 | 
			
		||||
          <%= @error_message %>
 | 
			
		||||
        </p>
 | 
			
		||||
      </div>
 | 
			
		||||
    <% end %>
 | 
			
		||||
  <.form
 | 
			
		||||
    :let={f}
 | 
			
		||||
    for={@conn}
 | 
			
		||||
    action={Routes.user_session_path(@conn, :create)}
 | 
			
		||||
    as="user"
 | 
			
		||||
    class="flex flex-col space-y-4 sm:space-y-0 sm:grid sm:grid-cols-3 sm:gap-4 justify-center items-center"
 | 
			
		||||
  >
 | 
			
		||||
    <div :if={@error_message} class="alert alert-danger col-span-3">
 | 
			
		||||
      <p>
 | 
			
		||||
        <%= @error_message %>
 | 
			
		||||
      </p>
 | 
			
		||||
    </div>
 | 
			
		||||
 | 
			
		||||
    <%= label(f, :email, class: "title text-lg text-primary-600") %>
 | 
			
		||||
    <%= email_input(f, :email, required: true, class: "input input-primary col-span-2") %>
 | 
			
		||||
@@ -31,16 +28,18 @@
 | 
			
		||||
    <%= checkbox(f, :remember_me, class: "checkbox col-span-2") %>
 | 
			
		||||
 | 
			
		||||
    <%= submit(dgettext("actions", "Log in"), class: "mx-auto btn btn-primary col-span-3") %>
 | 
			
		||||
  <% end %>
 | 
			
		||||
  </.form>
 | 
			
		||||
 | 
			
		||||
  <hr class="hr" />
 | 
			
		||||
 | 
			
		||||
  <div class="flex flex-row justify-center items-center space-x-4">
 | 
			
		||||
    <%= if Accounts.allow_registration?() do %>
 | 
			
		||||
      <.link href={Routes.user_registration_path(@conn, :new)} class="btn btn-primary">
 | 
			
		||||
        <%= dgettext("actions", "Register") %>
 | 
			
		||||
      </.link>
 | 
			
		||||
    <% end %>
 | 
			
		||||
    <.link
 | 
			
		||||
      :if={Accounts.allow_registration?()}
 | 
			
		||||
      href={Routes.user_registration_path(@conn, :new)}
 | 
			
		||||
      class="btn btn-primary"
 | 
			
		||||
    >
 | 
			
		||||
      <%= dgettext("actions", "Register") %>
 | 
			
		||||
    </.link>
 | 
			
		||||
    <.link href={Routes.user_reset_password_path(@conn, :new)} class="btn btn-primary">
 | 
			
		||||
      <%= dgettext("actions", "Forgot your password?") %>
 | 
			
		||||
    </.link>
 | 
			
		||||
 
 | 
			
		||||
@@ -15,13 +15,14 @@
 | 
			
		||||
      <%= dgettext("actions", "Change email") %>
 | 
			
		||||
    </h3>
 | 
			
		||||
 | 
			
		||||
    <%= if @email_changeset.action && not @email_changeset.valid? do %>
 | 
			
		||||
      <div class="alert alert-danger col-span-3">
 | 
			
		||||
        <p>
 | 
			
		||||
          <%= dgettext("errors", "Oops, something went wrong! Please check the errors below.") %>
 | 
			
		||||
        </p>
 | 
			
		||||
      </div>
 | 
			
		||||
    <% end %>
 | 
			
		||||
    <div
 | 
			
		||||
      :if={@email_changeset.action && not @email_changeset.valid?()}
 | 
			
		||||
      class="alert alert-danger col-span-3"
 | 
			
		||||
    >
 | 
			
		||||
      <p>
 | 
			
		||||
        <%= dgettext("errors", "Oops, something went wrong! Please check the errors below.") %>
 | 
			
		||||
      </p>
 | 
			
		||||
    </div>
 | 
			
		||||
 | 
			
		||||
    <%= hidden_input(f, :action, name: "action", value: "update_email") %>
 | 
			
		||||
 | 
			
		||||
@@ -58,13 +59,14 @@
 | 
			
		||||
      <%= dgettext("actions", "Change password") %>
 | 
			
		||||
    </h3>
 | 
			
		||||
 | 
			
		||||
    <%= if @password_changeset.action && not @password_changeset.valid? do %>
 | 
			
		||||
      <div class="alert alert-danger col-span-3">
 | 
			
		||||
        <p>
 | 
			
		||||
          <%= dgettext("errors", "Oops, something went wrong! Please check the errors below.") %>
 | 
			
		||||
        </p>
 | 
			
		||||
      </div>
 | 
			
		||||
    <% end %>
 | 
			
		||||
    <div
 | 
			
		||||
      :if={@password_changeset.action && not @password_changeset.valid?()}
 | 
			
		||||
      class="alert alert-danger col-span-3"
 | 
			
		||||
    >
 | 
			
		||||
      <p>
 | 
			
		||||
        <%= dgettext("errors", "Oops, something went wrong! Please check the errors below.") %>
 | 
			
		||||
      </p>
 | 
			
		||||
    </div>
 | 
			
		||||
 | 
			
		||||
    <%= hidden_input(f, :action, name: "action", value: "update_password") %>
 | 
			
		||||
 | 
			
		||||
@@ -113,13 +115,14 @@
 | 
			
		||||
      <%= dgettext("actions", "Change Language") %>
 | 
			
		||||
    </h3>
 | 
			
		||||
 | 
			
		||||
    <%= if @locale_changeset.action && not @locale_changeset.valid? do %>
 | 
			
		||||
      <div class="alert alert-danger">
 | 
			
		||||
        <p>
 | 
			
		||||
          <%= dgettext("errors", "Oops, something went wrong! Please check the errors below.") %>
 | 
			
		||||
        </p>
 | 
			
		||||
      </div>
 | 
			
		||||
    <% end %>
 | 
			
		||||
    <div
 | 
			
		||||
      :if={@locale_changeset.action && not @locale_changeset.valid?()}
 | 
			
		||||
      class="alert alert-danger"
 | 
			
		||||
    >
 | 
			
		||||
      <p>
 | 
			
		||||
        <%= dgettext("errors", "Oops, something went wrong! Please check the errors below.") %>
 | 
			
		||||
      </p>
 | 
			
		||||
    </div>
 | 
			
		||||
 | 
			
		||||
    <%= hidden_input(f, :action, name: "action", value: "update_locale") %>
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -17,11 +17,13 @@ defmodule CanneryWeb.ErrorHelpers do
 | 
			
		||||
    assigns = %{extra_class: extra_class, form: form, field: field}
 | 
			
		||||
 | 
			
		||||
    ~H"""
 | 
			
		||||
    <%= for error <- Keyword.get_values(@form.errors, @field) do %>
 | 
			
		||||
      <span class={["invalid-feedback", @extra_class]} phx-feedback-for={input_name(@form, @field)}>
 | 
			
		||||
        <%= translate_error(error) %>
 | 
			
		||||
      </span>
 | 
			
		||||
    <% end %>
 | 
			
		||||
    <span
 | 
			
		||||
      :for={error <- Keyword.get_values(@form.errors, @field)}
 | 
			
		||||
      class={["invalid-feedback", @extra_class]}
 | 
			
		||||
      phx-feedback-for={input_name(@form, @field)}
 | 
			
		||||
    >
 | 
			
		||||
      <%= translate_error(error) %>
 | 
			
		||||
    </span>
 | 
			
		||||
    """
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -7,11 +7,11 @@ defmodule CanneryWeb.LayoutView do
 | 
			
		||||
  # so we instruct Elixir to not warn if the dashboard route is missing.
 | 
			
		||||
  @compile {:no_warn_undefined, {Routes, :live_dashboard_path, 2}}
 | 
			
		||||
 | 
			
		||||
  def get_title(conn) do
 | 
			
		||||
    if conn.assigns |> Map.has_key?(:title) do
 | 
			
		||||
      "Cannery | #{conn.assigns.title}"
 | 
			
		||||
    else
 | 
			
		||||
      "Cannery"
 | 
			
		||||
    end
 | 
			
		||||
  def get_title(%{assigns: %{title: title}}) when title not in [nil, ""] do
 | 
			
		||||
    gettext("Cannery | %{title}", title: title)
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def get_title(_conn) do
 | 
			
		||||
    gettext("Cannery")
 | 
			
		||||
  end
 | 
			
		||||
end
 | 
			
		||||
 
 | 
			
		||||
@@ -16,19 +16,18 @@ defmodule CanneryWeb.ViewHelpers do
 | 
			
		||||
 | 
			
		||||
  def datetime(assigns) do
 | 
			
		||||
    ~H"""
 | 
			
		||||
    <%= if @datetime do %>
 | 
			
		||||
      <time
 | 
			
		||||
        datetime={cast_datetime(@datetime)}
 | 
			
		||||
        x-data={"{
 | 
			
		||||
          datetime:
 | 
			
		||||
            Intl.DateTimeFormat([], {dateStyle: 'short', timeStyle: 'long'})
 | 
			
		||||
              .format(new Date(\"#{cast_datetime(@datetime)}\"))
 | 
			
		||||
        }"}
 | 
			
		||||
        x-text="datetime"
 | 
			
		||||
      >
 | 
			
		||||
        <%= cast_datetime(@datetime) %>
 | 
			
		||||
      </time>
 | 
			
		||||
    <% end %>
 | 
			
		||||
    <time
 | 
			
		||||
      :if={@datetime}
 | 
			
		||||
      datetime={cast_datetime(@datetime)}
 | 
			
		||||
      x-data={"{
 | 
			
		||||
        datetime:
 | 
			
		||||
          Intl.DateTimeFormat([], {dateStyle: 'short', timeStyle: 'long'})
 | 
			
		||||
            .format(new Date(\"#{cast_datetime(@datetime)}\"))
 | 
			
		||||
      }"}
 | 
			
		||||
      x-text="datetime"
 | 
			
		||||
    >
 | 
			
		||||
      <%= cast_datetime(@datetime) %>
 | 
			
		||||
    </time>
 | 
			
		||||
    """
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
@@ -48,19 +47,18 @@ defmodule CanneryWeb.ViewHelpers do
 | 
			
		||||
 | 
			
		||||
  def date(assigns) do
 | 
			
		||||
    ~H"""
 | 
			
		||||
    <%= if @date do %>
 | 
			
		||||
      <time
 | 
			
		||||
        datetime={@date |> Date.to_iso8601(:extended)}
 | 
			
		||||
        x-data={"{
 | 
			
		||||
          date:
 | 
			
		||||
            Intl.DateTimeFormat([], {timeZone: 'Etc/UTC', dateStyle: 'short'})
 | 
			
		||||
              .format(new Date(\"#{@date |> Date.to_iso8601(:extended)}\"))
 | 
			
		||||
        }"}
 | 
			
		||||
        x-text="date"
 | 
			
		||||
      >
 | 
			
		||||
        <%= @date |> Date.to_iso8601(:extended) %>
 | 
			
		||||
      </time>
 | 
			
		||||
    <% end %>
 | 
			
		||||
    <time
 | 
			
		||||
      :if={@date}
 | 
			
		||||
      datetime={@date |> Date.to_iso8601(:extended)}
 | 
			
		||||
      x-data={"{
 | 
			
		||||
        date:
 | 
			
		||||
          Intl.DateTimeFormat([], {timeZone: 'Etc/UTC', dateStyle: 'short'})
 | 
			
		||||
            .format(new Date(\"#{@date |> Date.to_iso8601(:extended)}\"))
 | 
			
		||||
      }"}
 | 
			
		||||
      x-text="date"
 | 
			
		||||
    >
 | 
			
		||||
      <%= @date |> Date.to_iso8601(:extended) %>
 | 
			
		||||
    </time>
 | 
			
		||||
    """
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user