deps: upgrade to live view 1.0

This commit is contained in:
Alex Lion
2025-07-03 14:55:23 +02:00
parent d01851a2df
commit 827c6c77da
59 changed files with 604 additions and 599 deletions

View File

@@ -1,3 +1,11 @@
### v.2.4.0
### Fixes and improvements
- Upgrade JS dependencies
- Upgrade Elixir dependencies, including Phoenix Live View to 1.0.17
- Refactor view templates to use {} instead of <%= %>
### v.2.3.2 ### v.2.3.2
### Fixes and improvements ### Fixes and improvements

View File

@@ -99,7 +99,7 @@ defmodule ClaperWeb do
use PhoenixHTMLHelpers use PhoenixHTMLHelpers
# Import LiveView and .heex helpers (live_render, live_patch, <.form>, etc) # Import LiveView and .heex helpers (live_render, live_patch, <.form>, etc)
import Phoenix.LiveView.Helpers import Phoenix.Component
import ClaperWeb.LiveHelpers import ClaperWeb.LiveHelpers
alias Phoenix.LiveView.JS alias Phoenix.LiveView.JS

View File

@@ -103,7 +103,7 @@ defmodule ClaperWeb.UserOidcAuth do
Application.get_env(:claper, ClaperWeb.Endpoint)[:base_url] Application.get_env(:claper, ClaperWeb.Endpoint)[:base_url]
end end
defp opts(pkce_verifier \\ nil) do defp opts(pkce_verifier) do
url = base_url() url = base_url()
base_opts = %{ base_opts = %{

View File

@@ -46,16 +46,16 @@
</div> </div>
</div> </div>
<p class="text-gray-700 text-xl font-semibold mt-5"><%= gettext("Options") %></p> <p class="text-gray-700 text-xl font-semibold mt-5">{gettext("Options")}</p>
<div class="flex gap-x-2 mb-5 mt-3"> <div class="flex gap-x-2 mb-5 mt-3">
<%= checkbox(f, :attendee_visibility, class: "h-4 w-5") %> {checkbox(f, :attendee_visibility, class: "h-4 w-5")}
<%= label( {label(
f, f,
:attendee_visibility, :attendee_visibility,
gettext("Attendees can view the web content on their device"), gettext("Attendees can view the web content on their device"),
class: "text-sm font-medium" class: "text-sm font-medium"
) %> )}
</div> </div>
</div> </div>
@@ -65,13 +65,13 @@
phx_disable_with="Loading..." phx_disable_with="Loading..."
class="w-full lg:w-auto px-6 text-white py-2 rounded-md tracking-wide font-bold focus:outline-none focus:shadow-outline bg-gradient-to-tl from-primary-500 to-secondary-500 bg-size-200 bg-pos-0 hover:bg-pos-100 transition-all duration-500" class="w-full lg:w-auto px-6 text-white py-2 rounded-md tracking-wide font-bold focus:outline-none focus:shadow-outline bg-gradient-to-tl from-primary-500 to-secondary-500 bg-size-200 bg-pos-0 hover:bg-pos-100 transition-all duration-500"
> >
<%= case @live_action do {case @live_action do
:new -> gettext("Create") :new -> gettext("Create")
:edit -> gettext("Save") :edit -> gettext("Save")
end %> end}
</button> </button>
<%= if @live_action == :edit do %> <%= if @live_action == :edit do %>
<%= link(gettext("Delete"), {link(gettext("Delete"),
to: "#", to: "#",
phx_click: "delete", phx_click: "delete",
phx_target: @myself, phx_target: @myself,
@@ -81,7 +81,7 @@
], ],
class: class:
"w-full lg:w-auto px-6 text-center text-white py-2 rounded-md tracking-wide font-bold focus:outline-none focus:shadow-outline bg-gradient-to-tl from-supporting-red-600 to-supporting-red-400 bg-size-200 bg-pos-0 hover:bg-pos-100 transition-all duration-500" "w-full lg:w-auto px-6 text-center text-white py-2 rounded-md tracking-wide font-bold focus:outline-none focus:shadow-outline bg-gradient-to-tl from-supporting-red-600 to-supporting-red-400 bg-size-200 bg-pos-0 hover:bg-pos-100 transition-all duration-500"
) %> )}
<% end %> <% end %>
</div> </div>
</.form> </.form>

View File

@@ -29,7 +29,7 @@ defmodule ClaperWeb.EventLive.EmbedComponent do
d="M14.25 9.75L16.5 12l-2.25 2.25m-4.5 0L7.5 12l2.25-2.25M6 20.25h12A2.25 2.25 0 0020.25 18V6A2.25 2.25 0 0018 3.75H6A2.25 2.25 0 003.75 6v12A2.25 2.25 0 006 20.25z" d="M14.25 9.75L16.5 12l-2.25 2.25m-4.5 0L7.5 12l2.25-2.25M6 20.25h12A2.25 2.25 0 0020.25 18V6A2.25 2.25 0 0018 3.75H6A2.25 2.25 0 003.75 6v12A2.25 2.25 0 006 20.25z"
/> />
</svg> </svg>
<span class="font-bold"><%= gettext("See current web content") %></span> <span class="font-bold">{gettext("See current web content")}</span>
</div> </div>
</div> </div>
</div> </div>
@@ -52,8 +52,8 @@ defmodule ClaperWeb.EventLive.EmbedComponent do
</svg> </svg>
</div> </div>
<p class="text-xs text-gray-500 my-1"><%= gettext("Current web content") %></p> <p class="text-xs text-gray-500 my-1">{gettext("Current web content")}</p>
<p class="text-white text-lg font-semibold mb-4"><%= @embed.title %></p> <p class="text-white text-lg font-semibold mb-4">{@embed.title}</p>
</div> </div>
<div class="flex flex-col space-y-3"> <div class="flex flex-col space-y-3">
<.live_component <.live_component

View File

@@ -39,7 +39,7 @@ defmodule ClaperWeb.EventLive.EmbedIframeComponent do
> >
</iframe> </iframe>
<% "custom" -> %> <% "custom" -> %>
<%= raw(@content) %> {raw(@content)}
<% end %> <% end %>
</div> </div>
""" """

View File

@@ -20,7 +20,7 @@ defmodule ClaperWeb.EventLive.EventCardComponent do
class="text-lg font-medium text-primary-600 truncate" class="text-lg font-medium text-primary-600 truncate"
href={~p"/e/#{@event.code}/manage"} href={~p"/e/#{@event.code}/manage"}
> >
<%= @event.name %> {@event.name}
</a> </a>
<p <p
:if={@event.lti_resource} :if={@event.lti_resource}
@@ -47,17 +47,17 @@ defmodule ClaperWeb.EventLive.EventCardComponent do
<div class="px-2 inline-flex text-xs leading-5 font-semibold rounded-full bg-red-500 text-white items-center gap-x-1"> <div class="px-2 inline-flex text-xs leading-5 font-semibold rounded-full bg-red-500 text-white items-center gap-x-1">
<span class="h-2 w-2 bg-white rounded-full animate__animated animate__flash animate__infinite animate__slow_slow"> <span class="h-2 w-2 bg-white rounded-full animate__animated animate__flash animate__infinite animate__slow_slow">
</span> </span>
<%= gettext("Live") %> {gettext("Live")}
</div> </div>
<% end %> <% end %>
<%= if !Event.started?(@event) && !Event.finished?(@event) do %> <%= if !Event.started?(@event) && !Event.finished?(@event) do %>
<p class="px-2 inline-flex text-xs leading-5 font-semibold rounded-full bg-green-100 text-green-800"> <p class="px-2 inline-flex text-xs leading-5 font-semibold rounded-full bg-green-100 text-green-800">
<%= gettext("Incoming") %> {gettext("Incoming")}
</p> </p>
<% end %> <% end %>
<%= if Event.finished?(@event) do %> <%= if Event.finished?(@event) do %>
<p class="px-2 inline-flex text-xs leading-5 font-semibold rounded-full bg-gray-100 text-gray-800"> <p class="px-2 inline-flex text-xs leading-5 font-semibold rounded-full bg-gray-100 text-gray-800">
<%= gettext("Finished") %> {gettext("Finished")}
</p> </p>
<% end %> <% end %>
</div> </div>
@@ -66,7 +66,7 @@ defmodule ClaperWeb.EventLive.EventCardComponent do
<div class="text-sm font-medium uppercase text-gray-700 flex justify-center space-x-1 items-center"> <div class="text-sm font-medium uppercase text-gray-700 flex justify-center space-x-1 items-center">
<img src="/images/icons/hashtag.svg" class="h-5 w-5" /> <img src="/images/icons/hashtag.svg" class="h-5 w-5" />
<p> <p>
<%= @event.code %> {@event.code}
</p> </p>
</div> </div>
<div <div
@@ -83,11 +83,11 @@ defmodule ClaperWeb.EventLive.EventCardComponent do
class="h-5 w-5" class="h-5 w-5"
/> />
<p :if={!Event.finished?(@event) && !Event.started?(@event)}> <p :if={!Event.finished?(@event) && !Event.started?(@event)}>
<%= gettext("Starting on") %> {gettext("Starting on")}
<span x-text={"moment.utc('#{@event.started_at}').local().format('lll')"}></span> <span x-text={"moment.utc('#{@event.started_at}').local().format('lll')"}></span>
</p> </p>
<p :if={Event.finished?(@event)}> <p :if={Event.finished?(@event)}>
<%= gettext("Finished on") %> {gettext("Finished on")}
<span x-text={"moment.utc('#{@event.expired_at}').local().format('lll')"}></span> <span x-text={"moment.utc('#{@event.expired_at}').local().format('lll')"}></span>
</p> </p>
</div> </div>
@@ -108,7 +108,7 @@ defmodule ClaperWeb.EventLive.EventCardComponent do
phx-target={@myself} phx-target={@myself}
class="flex w-full lg:w-auto pl-3 pr-4 text-white items-center justify-between py-2 rounded-md tracking-wide font-bold focus:outline-none focus:shadow-outline hover:bg-primary-600 bg-primary-500" class="flex w-full lg:w-auto pl-3 pr-4 text-white items-center justify-between py-2 rounded-md tracking-wide font-bold focus:outline-none focus:shadow-outline hover:bg-primary-600 bg-primary-500"
> >
<span class="mr-2"><%= gettext("Join") %></span> <span class="mr-2">{gettext("Join")}</span>
<svg <svg
xmlns="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg"
fill="none" fill="none"
@@ -149,7 +149,7 @@ defmodule ClaperWeb.EventLive.EventCardComponent do
clip-rule="evenodd" clip-rule="evenodd"
/> />
</svg> </svg>
<span><%= gettext("Event manager") %></span> <span>{gettext("Event manager")}</span>
</a> </a>
</li> </li>
<li> <li>
@@ -172,7 +172,7 @@ defmodule ClaperWeb.EventLive.EventCardComponent do
/> />
<path d="M5.082 14.254a8.287 8.287 0 0 0-1.308 5.135 9.687 9.687 0 0 1-1.764-.44l-.115-.04a.563.563 0 0 1-.373-.487l-.01-.121a3.75 3.75 0 0 1 3.57-4.047ZM20.226 19.389a8.287 8.287 0 0 0-1.308-5.135 3.75 3.75 0 0 1 3.57 4.047l-.01.121a.563.563 0 0 1-.373.486l-.115.04c-.567.2-1.156.349-1.764.441Z" /> <path d="M5.082 14.254a8.287 8.287 0 0 0-1.308 5.135 9.687 9.687 0 0 1-1.764-.44l-.115-.04a.563.563 0 0 1-.373-.487l-.01-.121a3.75 3.75 0 0 1 3.57-4.047ZM20.226 19.389a8.287 8.287 0 0 0-1.308-5.135 3.75 3.75 0 0 1 3.57 4.047l-.01.121a.563.563 0 0 1-.373.486l-.115.04c-.567.2-1.156.349-1.764.441Z" />
</svg> </svg>
<span><%= gettext("Attendees room") %></span> <span>{gettext("Attendees room")}</span>
</a> </a>
</li> </li>
</ul> </ul>
@@ -198,7 +198,7 @@ defmodule ClaperWeb.EventLive.EventCardComponent do
> >
<path stroke-linecap="round" stroke-linejoin="round" d="M6 18 18 6M6 6l12 12" /> <path stroke-linecap="round" stroke-linejoin="round" d="M6 18 18 6M6 6l12 12" />
</svg> </svg>
<span><%= gettext("End") %></span> <span>{gettext("End")}</span>
</.link> </.link>
</div> </div>
<div class="flex items-start gap-x-2 relative text-sm "> <div class="flex items-start gap-x-2 relative text-sm ">
@@ -209,7 +209,7 @@ defmodule ClaperWeb.EventLive.EventCardComponent do
phx-target={@myself} phx-target={@myself}
class="flex w-full lg:w-auto pl-3 pr-4 text-gray-700 items-center justify-between py-2 rounded-md tracking-wide font-bold focus:outline-none focus:shadow-outline hover:bg-gray-300 bg-gray-200" class="flex w-full lg:w-auto pl-3 pr-4 text-gray-700 items-center justify-between py-2 rounded-md tracking-wide font-bold focus:outline-none focus:shadow-outline hover:bg-gray-300 bg-gray-200"
> >
<span class="mr-2"><%= gettext("More options") %></span> <span class="mr-2">{gettext("More options")}</span>
<svg <svg
xmlns="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg"
fill="none" fill="none"
@@ -247,7 +247,7 @@ defmodule ClaperWeb.EventLive.EventCardComponent do
<path d="m5.433 13.917 1.262-3.155A4 4 0 0 1 7.58 9.42l6.92-6.918a2.121 2.121 0 0 1 3 3l-6.92 6.918c-.383.383-.84.685-1.343.886l-3.154 1.262a.5.5 0 0 1-.65-.65Z" /> <path d="m5.433 13.917 1.262-3.155A4 4 0 0 1 7.58 9.42l6.92-6.918a2.121 2.121 0 0 1 3 3l-6.92 6.918c-.383.383-.84.685-1.343.886l-3.154 1.262a.5.5 0 0 1-.65-.65Z" />
<path d="M3.5 5.75c0-.69.56-1.25 1.25-1.25H10A.75.75 0 0 0 10 3H4.75A2.75 2.75 0 0 0 2 5.75v9.5A2.75 2.75 0 0 0 4.75 18h9.5A2.75 2.75 0 0 0 17 15.25V10a.75.75 0 0 0-1.5 0v5.25c0 .69-.56 1.25-1.25 1.25h-9.5c-.69 0-1.25-.56-1.25-1.25v-9.5Z" /> <path d="M3.5 5.75c0-.69.56-1.25 1.25-1.25H10A.75.75 0 0 0 10 3H4.75A2.75 2.75 0 0 0 2 5.75v9.5A2.75 2.75 0 0 0 4.75 18h9.5A2.75 2.75 0 0 0 17 15.25V10a.75.75 0 0 0-1.5 0v5.25c0 .69-.56 1.25-1.25 1.25h-9.5c-.69 0-1.25-.56-1.25-1.25v-9.5Z" />
</svg> </svg>
<span><%= gettext("Edit") %></span> <span>{gettext("Edit")}</span>
</a> </a>
</li> </li>
<li> <li>
@@ -265,7 +265,7 @@ defmodule ClaperWeb.EventLive.EventCardComponent do
<path d="M7 3.5A1.5 1.5 0 0 1 8.5 2h3.879a1.5 1.5 0 0 1 1.06.44l3.122 3.12A1.5 1.5 0 0 1 17 6.622V12.5a1.5 1.5 0 0 1-1.5 1.5h-1v-3.379a3 3 0 0 0-.879-2.121L10.5 5.379A3 3 0 0 0 8.379 4.5H7v-1Z" /> <path d="M7 3.5A1.5 1.5 0 0 1 8.5 2h3.879a1.5 1.5 0 0 1 1.06.44l3.122 3.12A1.5 1.5 0 0 1 17 6.622V12.5a1.5 1.5 0 0 1-1.5 1.5h-1v-3.379a3 3 0 0 0-.879-2.121L10.5 5.379A3 3 0 0 0 8.379 4.5H7v-1Z" />
<path d="M4.5 6A1.5 1.5 0 0 0 3 7.5v9A1.5 1.5 0 0 0 4.5 18h7a1.5 1.5 0 0 0 1.5-1.5v-5.879a1.5 1.5 0 0 0-.44-1.06L9.44 6.439A1.5 1.5 0 0 0 8.378 6H4.5Z" /> <path d="M4.5 6A1.5 1.5 0 0 0 3 7.5v9A1.5 1.5 0 0 0 4.5 18h7a1.5 1.5 0 0 0 1.5-1.5v-5.879a1.5 1.5 0 0 0-.44-1.06L9.44 6.439A1.5 1.5 0 0 0 8.378 6H4.5Z" />
</svg> </svg>
<span><%= gettext("Duplicate") %></span> <span>{gettext("Duplicate")}</span>
</button> </button>
</li> </li>
</ul> </ul>
@@ -279,7 +279,7 @@ defmodule ClaperWeb.EventLive.EventCardComponent do
class="mt-2 flex flex-col space-y-2 sm:space-y-0 justify-between sm:flex-row items-center" class="mt-2 flex flex-col space-y-2 sm:space-y-0 justify-between sm:flex-row items-center"
> >
<span class="text-sm text-supporting-red-500"> <span class="text-sm text-supporting-red-500">
<%= gettext("Error when processing the file") %> {gettext("Error when processing the file")}
</span> </span>
<div class="relative text-sm"> <div class="relative text-sm">
<%= if not @is_leader do %> <%= if not @is_leader do %>
@@ -289,7 +289,7 @@ defmodule ClaperWeb.EventLive.EventCardComponent do
phx-target={@myself} phx-target={@myself}
class="flex w-full lg:w-auto pl-3 pr-4 text-gray-700 items-center justify-between py-2 rounded-md tracking-wide font-bold focus:outline-none focus:shadow-outline hover:bg-gray-300 bg-gray-200" class="flex w-full lg:w-auto pl-3 pr-4 text-gray-700 items-center justify-between py-2 rounded-md tracking-wide font-bold focus:outline-none focus:shadow-outline hover:bg-gray-300 bg-gray-200"
> >
<span class="mr-2"><%= gettext("More options") %></span> <span class="mr-2">{gettext("More options")}</span>
<svg <svg
xmlns="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg"
fill="none" fill="none"
@@ -327,7 +327,7 @@ defmodule ClaperWeb.EventLive.EventCardComponent do
<path d="m5.433 13.917 1.262-3.155A4 4 0 0 1 7.58 9.42l6.92-6.918a2.121 2.121 0 0 1 3 3l-6.92 6.918c-.383.383-.84.685-1.343.886l-3.154 1.262a.5.5 0 0 1-.65-.65Z" /> <path d="m5.433 13.917 1.262-3.155A4 4 0 0 1 7.58 9.42l6.92-6.918a2.121 2.121 0 0 1 3 3l-6.92 6.918c-.383.383-.84.685-1.343.886l-3.154 1.262a.5.5 0 0 1-.65-.65Z" />
<path d="M3.5 5.75c0-.69.56-1.25 1.25-1.25H10A.75.75 0 0 0 10 3H4.75A2.75 2.75 0 0 0 2 5.75v9.5A2.75 2.75 0 0 0 4.75 18h9.5A2.75 2.75 0 0 0 17 15.25V10a.75.75 0 0 0-1.5 0v5.25c0 .69-.56 1.25-1.25 1.25h-9.5c-.69 0-1.25-.56-1.25-1.25v-9.5Z" /> <path d="M3.5 5.75c0-.69.56-1.25 1.25-1.25H10A.75.75 0 0 0 10 3H4.75A2.75 2.75 0 0 0 2 5.75v9.5A2.75 2.75 0 0 0 4.75 18h9.5A2.75 2.75 0 0 0 17 15.25V10a.75.75 0 0 0-1.5 0v5.25c0 .69-.56 1.25-1.25 1.25h-9.5c-.69 0-1.25-.56-1.25-1.25v-9.5Z" />
</svg> </svg>
<span><%= gettext("Edit") %></span> <span>{gettext("Edit")}</span>
</a> </a>
</li> </li>
</ul> </ul>
@@ -341,7 +341,7 @@ defmodule ClaperWeb.EventLive.EventCardComponent do
class="flex space-x-1 items-center" class="flex space-x-1 items-center"
> >
<img src="/images/loading.gif" class="h-8" /> <img src="/images/loading.gif" class="h-8" />
<span class="text-sm text-gray-500"><%= gettext("Processing your file...") %></span> <span class="text-sm text-gray-500">{gettext("Processing your file...")}</span>
</div> </div>
<% end %> <% end %>
@@ -367,7 +367,7 @@ defmodule ClaperWeb.EventLive.EventCardComponent do
<path d="M2 10a8 8 0 018-8v8h8a8 8 0 11-16 0z" /> <path d="M2 10a8 8 0 018-8v8h8a8 8 0 11-16 0z" />
<path d="M12 2.252A8.014 8.014 0 0117.748 8H12V2.252z" /> <path d="M12 2.252A8.014 8.014 0 0117.748 8H12V2.252z" />
</svg> </svg>
<span><%= gettext("View report") %></span> <span>{gettext("View report")}</span>
</a> </a>
</div> </div>
<div class="relative text-sm"> <div class="relative text-sm">
@@ -378,7 +378,7 @@ defmodule ClaperWeb.EventLive.EventCardComponent do
phx-target={@myself} phx-target={@myself}
class="flex w-full lg:w-auto pl-3 pr-4 text-gray-700 items-center justify-between py-2 rounded-md tracking-wide font-bold focus:outline-none focus:shadow-outline hover:bg-gray-300 bg-gray-200" class="flex w-full lg:w-auto pl-3 pr-4 text-gray-700 items-center justify-between py-2 rounded-md tracking-wide font-bold focus:outline-none focus:shadow-outline hover:bg-gray-300 bg-gray-200"
> >
<span class="mr-2"><%= gettext("More options") %></span> <span class="mr-2">{gettext("More options")}</span>
<svg <svg
xmlns="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg"
fill="none" fill="none"
@@ -415,7 +415,7 @@ defmodule ClaperWeb.EventLive.EventCardComponent do
<path d="M7 3.5A1.5 1.5 0 0 1 8.5 2h3.879a1.5 1.5 0 0 1 1.06.44l3.122 3.12A1.5 1.5 0 0 1 17 6.622V12.5a1.5 1.5 0 0 1-1.5 1.5h-1v-3.379a3 3 0 0 0-.879-2.121L10.5 5.379A3 3 0 0 0 8.379 4.5H7v-1Z" /> <path d="M7 3.5A1.5 1.5 0 0 1 8.5 2h3.879a1.5 1.5 0 0 1 1.06.44l3.122 3.12A1.5 1.5 0 0 1 17 6.622V12.5a1.5 1.5 0 0 1-1.5 1.5h-1v-3.379a3 3 0 0 0-.879-2.121L10.5 5.379A3 3 0 0 0 8.379 4.5H7v-1Z" />
<path d="M4.5 6A1.5 1.5 0 0 0 3 7.5v9A1.5 1.5 0 0 0 4.5 18h7a1.5 1.5 0 0 0 1.5-1.5v-5.879a1.5 1.5 0 0 0-.44-1.06L9.44 6.439A1.5 1.5 0 0 0 8.378 6H4.5Z" /> <path d="M4.5 6A1.5 1.5 0 0 0 3 7.5v9A1.5 1.5 0 0 0 4.5 18h7a1.5 1.5 0 0 0 1.5-1.5v-5.879a1.5 1.5 0 0 0-.44-1.06L9.44 6.439A1.5 1.5 0 0 0 8.378 6H4.5Z" />
</svg> </svg>
<span><%= gettext("Duplicate") %></span> <span>{gettext("Duplicate")}</span>
</button> </button>
</li> </li>
<li> <li>
@@ -441,7 +441,7 @@ defmodule ClaperWeb.EventLive.EventCardComponent do
clip-rule="evenodd" clip-rule="evenodd"
/> />
</svg> </svg>
<span><%= gettext("Delete") %></span> <span>{gettext("Delete")}</span>
</.link> </.link>
</li> </li>
</ul> </ul>

View File

@@ -33,13 +33,13 @@
/> />
</svg> </svg>
<span><%= gettext("How it works ?") %></span> <span>{gettext("How it works ?")}</span>
</button> </button>
</div> </div>
<div class="border-b border-gray-200 py-4 flex flex-col sm:flex-row sm:items-center justify-between"> <div class="border-b border-gray-200 py-4 flex flex-col sm:flex-row sm:items-center justify-between">
<div class="flex-1 min-w-0"> <div class="flex-1 min-w-0">
<h1 class="text-2xl font-medium leading-6 text-gray-900 sm:truncate"> <h1 class="text-2xl font-medium leading-6 text-gray-900 sm:truncate">
<%= @page_title %> {@page_title}
</h1> </h1>
</div> </div>
<div class="flex mt-4 space-x-5 sm:mt-0"> <div class="flex mt-4 space-x-5 sm:mt-0">
@@ -50,28 +50,28 @@
phx_disable_with="Loading..." phx_disable_with="Loading..."
class="w-full lg:w-auto px-6 text-white py-2 rounded-md tracking-wide font-bold focus:outline-none focus:shadow-outline bg-gradient-to-tl from-primary-500 to-secondary-500 bg-size-200 bg-pos-0 hover:bg-pos-100 transition-all duration-500" class="w-full lg:w-auto px-6 text-white py-2 rounded-md tracking-wide font-bold focus:outline-none focus:shadow-outline bg-gradient-to-tl from-primary-500 to-secondary-500 bg-size-200 bg-pos-0 hover:bg-pos-100 transition-all duration-500"
> >
<%= case @action do {case @action do
:edit -> gettext("Save") :edit -> gettext("Save")
:new -> gettext("Create") :new -> gettext("Create")
end %> end}
</button> </button>
<% else %> <% else %>
<div class="opacity-25 cursor-default w-full lg:w-auto px-6 text-white py-2 rounded-md tracking-wide font-bold focus:outline-none focus:shadow-outline bg-gradient-to-tl from-primary-500 to-secondary-500 bg-size-200 bg-pos-0"> <div class="opacity-25 cursor-default w-full lg:w-auto px-6 text-white py-2 rounded-md tracking-wide font-bold focus:outline-none focus:shadow-outline bg-gradient-to-tl from-primary-500 to-secondary-500 bg-size-200 bg-pos-0">
<%= case @action do {case @action do
:edit -> gettext("Save") :edit -> gettext("Save")
:new -> gettext("Create") :new -> gettext("Create")
end %> end}
</div> </div>
<% end %> <% end %>
<%= if @action == :edit && !@event.expired_at do %> <%= if @action == :edit && !@event.expired_at do %>
<%= link(gettext("Delete"), {link(gettext("Delete"),
to: "#", to: "#",
phx_click: "delete", phx_click: "delete",
phx_value_id: @event.uuid, phx_value_id: @event.uuid,
data: [confirm: gettext("Are you sure?")], data: [confirm: gettext("Are you sure?")],
class: class:
"w-full lg:w-auto px-6 text-center text-white py-2 rounded-md tracking-wide font-bold focus:outline-none focus:shadow-outline bg-gradient-to-tl from-supporting-red-600 to-supporting-red-400 bg-size-200 bg-pos-0 hover:bg-pos-100 transition-all duration-500" "w-full lg:w-auto px-6 text-center text-white py-2 rounded-md tracking-wide font-bold focus:outline-none focus:shadow-outline bg-gradient-to-tl from-supporting-red-600 to-supporting-red-400 bg-size-200 bg-pos-0 hover:bg-pos-100 transition-all duration-500"
) %> )}
<% end %> <% end %>
</div> </div>
</div> </div>
@@ -85,7 +85,7 @@
data-tg-title={"📄 #{gettext("Presentation file (optional)")}"} data-tg-title={"📄 #{gettext("Presentation file (optional)")}"}
> >
<label class="block text-sm font-medium text-gray-700 mb-2"> <label class="block text-sm font-medium text-gray-700 mb-2">
<%= gettext("Select your presentation (optional)") %> {gettext("Select your presentation (optional)")}
</label> </label>
<div class="max-w-lg flex flex-col justify-center items-center px-6 pt-5 pb-6 border-2 bg-white shadow-base border-gray-300 border-dashed rounded-md"> <div class="max-w-lg flex flex-col justify-center items-center px-6 pt-5 pb-6 border-2 bg-white shadow-base border-gray-300 border-dashed rounded-md">
<%= if @uploads.presentation_file.entries |> Enum.at(0, %{}) |> Map.get(:progress, 0) < 100 do %> <%= if @uploads.presentation_file.entries |> Enum.at(0, %{}) |> Map.get(:progress, 0) < 100 do %>
@@ -112,22 +112,22 @@
phx-submit="save-file" phx-submit="save-file"
phx-target={@myself} phx-target={@myself}
> >
<span><%= gettext("Upload a file") %></span> <span>{gettext("Upload a file")}</span>
<.live_file_input upload={@uploads.presentation_file} class="sr-only" /> <.live_file_input upload={@uploads.presentation_file} class="sr-only" />
</form> </form>
</label> </label>
<p class="pl-1"><%= gettext("or drag and drop") %></p> <p class="pl-1">{gettext("or drag and drop")}</p>
</div> </div>
<p class="text-xs text-gray-500"> <p class="text-xs text-gray-500">
<%= gettext("PDF, PPT, PPTX up to %{size} MB", size: @max_file_size) %> {gettext("PDF, PPT, PPTX up to %{size} MB", size: @max_file_size)}
</p> </p>
<%= for entry <- @uploads.presentation_file.entries do %> <%= for entry <- @uploads.presentation_file.entries do %>
<progress id="file" max="100" value={entry.progress}> <progress id="file" max="100" value={entry.progress}>
<%= entry.progress %> {entry.progress}
</progress> </progress>
<%= for err <- upload_errors(@uploads.presentation_file, entry) do %> <%= for err <- upload_errors(@uploads.presentation_file, entry) do %>
<p class="text-red-500 text-sm px-4 py-2 border border-red-600 rounded-md my-3"> <p class="text-red-500 text-sm px-4 py-2 border border-red-600 rounded-md my-3">
<%= error_to_string(err) %> {error_to_string(err)}
</p> </p>
<% end %> <% end %>
<% end %> <% end %>
@@ -149,9 +149,9 @@
d="M5 13l4 4L19 7" d="M5 13l4 4L19 7"
/> />
</svg> </svg>
<p class="text-gray-700"><%= gettext("Presentation uploaded") %></p> <p class="text-gray-700">{gettext("Presentation uploaded")}</p>
</div> </div>
<p class="text-xs text-gray-400"><%= entry.client_name %></p> <p class="text-xs text-gray-400">{entry.client_name}</p>
<p> <p>
<a <a
href="#" href="#"
@@ -160,7 +160,7 @@
phx-target={@myself} phx-target={@myself}
class="text-red-500 text-sm" class="text-red-500 text-sm"
> >
<%= gettext("Remove") %> {gettext("Remove")}
</a> </a>
</p> </p>
<% end %> <% end %>
@@ -170,7 +170,7 @@
<% else %> <% else %>
<div class="mt-12 mb-3"> <div class="mt-12 mb-3">
<label class="block text-sm font-medium text-gray-700 mb-2"> <label class="block text-sm font-medium text-gray-700 mb-2">
<%= gettext("Select your presentation") %> {gettext("Select your presentation")}
</label> </label>
<div class="max-w-lg flex flex-col justify-center items-center px-6 pt-5 pb-6 border-2 bg-white shadow-base border-gray-300 border-dashed rounded-md"> <div class="max-w-lg flex flex-col justify-center items-center px-6 pt-5 pb-6 border-2 bg-white shadow-base border-gray-300 border-dashed rounded-md">
<%= if @uploads.presentation_file.entries |> Enum.at(0, %{}) |> Map.get(:progress, 0) < 100 do %> <%= if @uploads.presentation_file.entries |> Enum.at(0, %{}) |> Map.get(:progress, 0) < 100 do %>
@@ -189,7 +189,7 @@
d="M5 13l4 4L19 7" d="M5 13l4 4L19 7"
/> />
</svg> </svg>
<p class="text-gray-700"><%= gettext("Presentation attached") %></p> <p class="text-gray-700">{gettext("Presentation attached")}</p>
</div> </div>
<div class="flex flex-col space-y-3 items-center"> <div class="flex flex-col space-y-3 items-center">
<label class="text-primary-500 text-sm"> <label class="text-primary-500 text-sm">
@@ -199,24 +199,24 @@
phx-submit="save-file" phx-submit="save-file"
phx-target={@myself} phx-target={@myself}
> >
<span><%= gettext("Change file") %></span> <span>{gettext("Change file")}</span>
<.live_file_input upload={@uploads.presentation_file} class="sr-only" /> <.live_file_input upload={@uploads.presentation_file} class="sr-only" />
</form> </form>
</label> </label>
<%= for entry <- @uploads.presentation_file.entries do %> <%= for entry <- @uploads.presentation_file.entries do %>
<progress id="file" max="100" value={entry.progress}> <progress id="file" max="100" value={entry.progress}>
<%= entry.progress %> {entry.progress}
</progress> </progress>
<%= for err <- upload_errors(@uploads.presentation_file, entry) do %> <%= for err <- upload_errors(@uploads.presentation_file, entry) do %>
<p class="text-red-500 text-sm px-4 py-2 border border-red-600 rounded-md my-3"> <p class="text-red-500 text-sm px-4 py-2 border border-red-600 rounded-md my-3">
<%= error_to_string(err) %> {error_to_string(err)}
</p> </p>
<% end %> <% end %>
<% end %> <% end %>
<p class="text-supporting-red-500 text-sm italic text-center hidden"> <p class="text-supporting-red-500 text-sm italic text-center hidden">
<%= gettext( {gettext(
"Changing your file will remove all interaction elements like polls associated." "Changing your file will remove all interaction elements like polls associated."
) %> )}
</p> </p>
</div> </div>
<% else %> <% else %>
@@ -235,19 +235,19 @@
d="M5 13l4 4L19 7" d="M5 13l4 4L19 7"
/> />
</svg> </svg>
<p class="text-gray-700"><%= gettext("Presentation replaced") %></p> <p class="text-gray-700">{gettext("Presentation replaced")}</p>
</div> </div>
<%= for entry <- @uploads.presentation_file.entries do %> <%= for entry <- @uploads.presentation_file.entries do %>
<p class="text-xs text-gray-400"><%= entry.client_name %></p> <p class="text-xs text-gray-400">{entry.client_name}</p>
<div :if={entry.progress < 100}> <div :if={entry.progress < 100}>
<progress id="file" max="100" value={entry.progress}> <progress id="file" max="100" value={entry.progress}>
<%= entry.progress %> {entry.progress}
</progress> </progress>
</div> </div>
<%= for err <- upload_errors(@uploads.presentation_file, entry) do %> <%= for err <- upload_errors(@uploads.presentation_file, entry) do %>
<p class="text-red-500 text-sm px-4 py-2 border border-red-600 rounded-md my-3"> <p class="text-red-500 text-sm px-4 py-2 border border-red-600 rounded-md my-3">
<%= error_to_string(err) %> {error_to_string(err)}
</p> </p>
<% end %> <% end %>
<p> <p>
@@ -258,7 +258,7 @@
phx-target={@myself} phx-target={@myself}
class="text-red-500 text-sm" class="text-red-500 text-sm"
> >
<%= gettext("Remove") %> {gettext("Remove")}
</a> </a>
</p> </p>
<% end %> <% end %>
@@ -267,7 +267,7 @@
<%= for entry <- @uploads.presentation_file.entries do %> <%= for entry <- @uploads.presentation_file.entries do %>
<%= for err <- upload_errors(@uploads.presentation_file, entry) do %> <%= for err <- upload_errors(@uploads.presentation_file, entry) do %>
<p class="text-red-500 text-sm px-4 py-2 border border-red-600 rounded-md my-3"> <p class="text-red-500 text-sm px-4 py-2 border border-red-600 rounded-md my-3">
<%= error_to_string(err) %> {error_to_string(err)}
</p> </p>
<% end %> <% end %>
<% end %> <% end %>
@@ -339,7 +339,7 @@
data-tg-order="4" data-tg-order="4"
> >
<span class="text-lg block font-medium text-gray-700"> <span class="text-lg block font-medium text-gray-700">
<%= gettext("Facilitators can present and manage interactions") %> {gettext("Facilitators can present and manage interactions")}
</span> </span>
<button <button
type="button" type="button"
@@ -360,7 +360,7 @@
clip-rule="evenodd" clip-rule="evenodd"
/> />
</svg> </svg>
<span><%= gettext("Add facilitator") %></span> <span>{gettext("Add facilitator")}</span>
</button> </button>
</div> </div>
@@ -381,15 +381,15 @@
key={:email} key={:email}
name="" name=""
/> />
<%= hidden_input(l, :user_email, value: @current_user.email) %> {hidden_input(l, :user_email, value: @current_user.email)}
</div> </div>
<label <label
phx-click={JS.hide(to: "##{l.data.temp_id || l.id}")} phx-click={JS.hide(to: "##{l.data.temp_id || l.id}")}
class="cursor-pointer md:ml-3 rounded-md bg-supporting-red-500 hover:bg-supporting-red-600 transition flex items-center mt-2 md:w-max text-white py-7 px-3 text-sm max-h-0" class="cursor-pointer md:ml-3 rounded-md bg-supporting-red-500 hover:bg-supporting-red-600 transition flex items-center mt-2 md:w-max text-white py-7 px-3 text-sm max-h-0"
> >
<span><%= gettext("Remove") %></span> <span>{gettext("Remove")}</span>
<%= checkbox(l, :delete, class: "hidden") %> {checkbox(l, :delete, class: "hidden")}
</label> </label>
<% else %> <% else %>
<div class="relative"> <div class="relative">
@@ -401,9 +401,9 @@
/> />
</div> </div>
<%= hidden_input(l, :temp_id) %> {hidden_input(l, :temp_id)}
<%= hidden_input(l, :event_id, value: @event.id) %> {hidden_input(l, :event_id, value: @event.id)}
<%= hidden_input(l, :user_email, value: @current_user.email) %> {hidden_input(l, :user_email, value: @current_user.email)}
<button <button
type="button" type="button"
@@ -412,7 +412,7 @@
phx-target={@myself} phx-target={@myself}
class="md:ml-3 rounded-md bg-supporting-red-500 hover:bg-supporting-red-600 transition flex items-center mt-2 md:w-max text-white py-5 px-3 text-sm max-h-0" class="md:ml-3 rounded-md bg-supporting-red-500 hover:bg-supporting-red-600 transition flex items-center mt-2 md:w-max text-white py-5 px-3 text-sm max-h-0"
> >
<span><%= gettext("Remove") %></span> <span>{gettext("Remove")}</span>
</button> </button>
<% end %> <% end %>
</div> </div>

View File

@@ -29,7 +29,7 @@ defmodule ClaperWeb.EventLive.FormComponent do
<path d="M17 12h.01"></path> <path d="M17 12h.01"></path>
<path d="M13 12h.01"></path> <path d="M13 12h.01"></path>
</svg> </svg>
<span class="font-bold"><%= gettext("See current form") %></span> <span class="font-bold">{gettext("See current form")}</span>
</div> </div>
</div> </div>
</div> </div>
@@ -48,8 +48,8 @@ defmodule ClaperWeb.EventLive.FormComponent do
</svg> </svg>
</div> </div>
<p class="text-xs text-gray-500 my-1"><%= gettext("Current form") %></p> <p class="text-xs text-gray-500 my-1">{gettext("Current form")}</p>
<p class="text-white text-lg font-semibold mb-4"><%= @form.title %></p> <p class="text-white text-lg font-semibold mb-4">{@form.title}</p>
</div> </div>
<%= form_for :form_submit, "#", [id: @id, phx_change: "validate", phx_target: @myself, phx_submit: "submit"], fn f -> %> <%= form_for :form_submit, "#", [id: @id, phx_change: "validate", phx_target: @myself, phx_submit: "submit"], fn f -> %>
<div class="flex flex-col space-y-3"> <div class="flex flex-col space-y-3">
@@ -94,7 +94,7 @@ defmodule ClaperWeb.EventLive.FormComponent do
type="submit" type="submit"
class="px-3 py-2 text-white font-semibold bg-primary-500 hover:bg-primary-600 rounded-md my-5" class="px-3 py-2 text-white font-semibold bg-primary-500 hover:bg-primary-600 rounded-md my-5"
> >
<%= if is_nil(assigns.current_form_submit), do: gettext("Submit"), else: gettext("Edit") %> {if is_nil(assigns.current_form_submit), do: gettext("Submit"), else: gettext("Edit")}
</button> </button>
<%= unless is_nil(assigns.current_form_submit) do %> <%= unless is_nil(assigns.current_form_submit) do %>
@@ -111,7 +111,7 @@ defmodule ClaperWeb.EventLive.FormComponent do
> >
<path stroke="none" d="M0 0h24v24H0z" fill="none" /><path d="M12 12m-9 0a9 9 0 1 0 18 0a9 9 0 1 0 -18 0" /><path d="M9 12l2 2l4 -4" /> <path stroke="none" d="M0 0h24v24H0z" fill="none" /><path d="M12 12m-9 0a9 9 0 1 0 18 0a9 9 0 1 0 -18 0" /><path d="M9 12l2 2l4 -4" />
</svg> </svg>
<span><%= gettext("Saved") %></span> <span>{gettext("Saved")}</span>
</div> </div>
<% end %> <% end %>
</div> </div>

View File

@@ -25,7 +25,7 @@
/> />
</svg> </svg>
<span><%= gettext("How it works ?") %></span> <span>{gettext("How it works ?")}</span>
</button> </button>
</div> </div>
<%= if @live_action in [:new, :edit] do %> <%= if @live_action in [:new, :edit] do %>
@@ -90,7 +90,7 @@
phx_disable_with="Loading..." phx_disable_with="Loading..."
class="mt-5 w-full lg:w-auto px-6 text-white py-2 rounded-md tracking-wide font-bold focus:outline-none focus:shadow-outline bg-gradient-to-tl from-primary-500 to-secondary-500 bg-size-200 bg-pos-0 hover:bg-pos-100 transition-all duration-500" class="mt-5 w-full lg:w-auto px-6 text-white py-2 rounded-md tracking-wide font-bold focus:outline-none focus:shadow-outline bg-gradient-to-tl from-primary-500 to-secondary-500 bg-size-200 bg-pos-0 hover:bg-pos-100 transition-all duration-500"
> >
<%= gettext("Create") %> {gettext("Create")}
</button> </button>
</.form> </.form>
</div> </div>
@@ -108,7 +108,7 @@
> >
<div class="flex-1 min-w-0"> <div class="flex-1 min-w-0">
<h1 class="text-2xl font-medium leading-6 text-gray-900 sm:truncate"> <h1 class="text-2xl font-medium leading-6 text-gray-900 sm:truncate">
<%= gettext("My events") %> {gettext("My events")}
</h1> </h1>
</div> </div>
<div class="flex flex-col w-full items-center sm:w-auto sm:flex-row mt-0"> <div class="flex flex-col w-full items-center sm:w-auto sm:flex-row mt-0">
@@ -138,7 +138,7 @@
/> />
</svg> </svg>
<span> <span>
<%= gettext("Quick event") %> {gettext("Quick event")}
</span> </span>
</.link> </.link>
<.link <.link
@@ -163,7 +163,7 @@
/> />
</svg> </svg>
<span> <span>
<%= gettext("Create event") %> {gettext("Create event")}
</span> </span>
</.link> </.link>
</div> </div>
@@ -175,7 +175,7 @@
phx-value-tab="not_expired" phx-value-tab="not_expired"
class={"#{if @active_tab == "not_expired", do: "bg-primary-100 text-primary-700", else: "text-gray-500 hover:text-gray-700"} px-3 py-2 font-medium rounded-md"} class={"#{if @active_tab == "not_expired", do: "bg-primary-100 text-primary-700", else: "text-gray-500 hover:text-gray-700"} px-3 py-2 font-medium rounded-md"}
> >
<%= gettext("Active") %> {gettext("Active")}
</button> </button>
<button <button
phx-click="change-tab" phx-click="change-tab"
@@ -183,7 +183,7 @@
disabled={not @has_expired_events} disabled={not @has_expired_events}
class={"#{if @active_tab == "expired", do: "bg-primary-100 text-primary-700", else: "text-gray-500 hover:text-gray-700"} px-3 py-2 font-medium rounded-md #{if not @has_expired_events, do: "opacity-50"}"} class={"#{if @active_tab == "expired", do: "bg-primary-100 text-primary-700", else: "text-gray-500 hover:text-gray-700"} px-3 py-2 font-medium rounded-md #{if not @has_expired_events, do: "opacity-50"}"}
> >
<%= gettext("Finished") %> {gettext("Finished")}
</button> </button>
<button <button
phx-click="change-tab" phx-click="change-tab"
@@ -191,7 +191,7 @@
disabled={not @has_invited_events} disabled={not @has_invited_events}
class={"#{if @active_tab == "invited", do: "bg-primary-100 text-primary-700", else: "text-gray-500 hover:text-gray-700"} px-3 py-2 font-medium rounded-md #{if not @has_invited_events, do: "opacity-50"}"} class={"#{if @active_tab == "invited", do: "bg-primary-100 text-primary-700", else: "text-gray-500 hover:text-gray-700"} px-3 py-2 font-medium rounded-md #{if not @has_invited_events, do: "opacity-50"}"}
> >
<%= gettext("Shared with you") %> {gettext("Shared with you")}
</button> </button>
</nav> </nav>
@@ -214,14 +214,14 @@
phx-click="load-more" phx-click="load-more"
class="inline-flex items-center px-4 py-2 border border-transparent text-sm font-medium rounded-md text-primary-700 bg-primary-100 hover:bg-primary-200 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-primary-500" class="inline-flex items-center px-4 py-2 border border-transparent text-sm font-medium rounded-md text-primary-700 bg-primary-100 hover:bg-primary-200 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-primary-500"
> >
<%= gettext("Load more") %> {gettext("Load more")}
</button> </button>
</div> </div>
<% end %> <% end %>
<%= if Enum.count(@events) == 0 do %> <%= if Enum.count(@events) == 0 do %>
<div class="w-full text-2xl text-black opacity-25 text-center"> <div class="w-full text-2xl text-black opacity-25 text-center">
<img src="/images/icons/arrow.svg" class="h-20 float-right mr-16 -mt-5" /> <img src="/images/icons/arrow.svg" class="h-20 float-right mr-16 -mt-5" />
<p class="pt-12 clear-both"><%= gettext("Create your first event") %></p> <p class="pt-12 clear-both">{gettext("Create your first event")}</p>
</div> </div>
<% end %> <% end %>
</div> </div>

View File

@@ -21,21 +21,21 @@
@click.away="open = false" @click.away="open = false"
> >
<a href="https://get.claper.co/" class="text-sm font-semibold text-black"> <a href="https://get.claper.co/" class="text-sm font-semibold text-black">
<%= gettext("About") %> {gettext("About")}
</a> </a>
<%= if @current_user do %> <%= if @current_user do %>
<.link <.link
href={~p"/events"} href={~p"/events"}
class="relative inline-flex items-center px-4 py-1 text-base font-sm rounded-md text-white bg-gradient-to-tl from-primary-500 to-secondary-500 bg-size-200 bg-pos-0 hover:bg-pos-100 transition-all duration-500" class="relative inline-flex items-center px-4 py-1 text-base font-sm rounded-md text-white bg-gradient-to-tl from-primary-500 to-secondary-500 bg-size-200 bg-pos-0 hover:bg-pos-100 transition-all duration-500"
> >
<%= gettext("Dashboard") %> {gettext("Dashboard")}
</.link> </.link>
<% else %> <% else %>
<.link <.link
href={~p"/users/log_in"} href={~p"/users/log_in"}
class="relative inline-flex items-center px-4 py-1 text-base font-sm rounded-md text-white bg-gradient-to-tl from-primary-500 to-secondary-500 bg-size-200 bg-pos-0 hover:bg-pos-100 transition-all duration-500" class="relative inline-flex items-center px-4 py-1 text-base font-sm rounded-md text-white bg-gradient-to-tl from-primary-500 to-secondary-500 bg-size-200 bg-pos-0 hover:bg-pos-100 transition-all duration-500"
> >
<%= gettext("Login") %> {gettext("Login")}
</.link> </.link>
<% end %> <% end %>
</div> </div>
@@ -44,21 +44,21 @@
</button> </button>
<div class="hidden md:block"> <div class="hidden md:block">
<a href="https://get.claper.co/" class="text-sm text-white font-semibold mr-3"> <a href="https://get.claper.co/" class="text-sm text-white font-semibold mr-3">
<%= gettext("About") %> {gettext("About")}
</a> </a>
<%= if @current_user do %> <%= if @current_user do %>
<.link <.link
href={~p"/events"} href={~p"/events"}
class="relative inline-flex items-center px-4 py-1 text-base font-sm rounded-md text-white bg-gradient-to-tl from-primary-500 to-secondary-500 bg-size-200 bg-pos-0 hover:bg-pos-100 transition-all duration-500" class="relative inline-flex items-center px-4 py-1 text-base font-sm rounded-md text-white bg-gradient-to-tl from-primary-500 to-secondary-500 bg-size-200 bg-pos-0 hover:bg-pos-100 transition-all duration-500"
> >
<%= gettext("Dashboard") %> {gettext("Dashboard")}
</.link> </.link>
<% else %> <% else %>
<.link <.link
href={~p"/users/log_in"} href={~p"/users/log_in"}
class="relative inline-flex items-center px-4 py-1 text-base font-sm rounded-md text-white bg-gradient-to-tl from-primary-500 to-secondary-500 bg-size-200 bg-pos-0 hover:bg-pos-100 transition-all duration-500" class="relative inline-flex items-center px-4 py-1 text-base font-sm rounded-md text-white bg-gradient-to-tl from-primary-500 to-secondary-500 bg-size-200 bg-pos-0 hover:bg-pos-100 transition-all duration-500"
> >
<%= gettext("Login") %> {gettext("Login")}
</.link> </.link>
<% end %> <% end %>
</div> </div>
@@ -71,13 +71,13 @@
<%= form_for :event, ~p"/join", ["phx-submit": "join", "phx-hook": "JoinEvent", id: "form"], fn f -> %> <%= form_for :event, ~p"/join", ["phx-submit": "join", "phx-hook": "JoinEvent", id: "form"], fn f -> %>
<div class="relative"> <div class="relative">
<%= text_input(f, :code, {text_input(f, :code,
required: true, required: true,
autofocus: true, autofocus: true,
id: "input", id: "input",
class: class:
"transition-all bg-transparent tracking-widest w-full uppercase text-white text-2xl px-3 border-b border-gray-200 focus:border-b-2 pt-5 pl-12 pb-3 outline-none" "transition-all bg-transparent tracking-widest w-full uppercase text-white text-2xl px-3 border-b border-gray-200 focus:border-b-2 pt-5 pl-12 pb-3 outline-none"
) %> )}
<img <img
class="icon absolute top-5 left-2 transition-all duration-100" class="icon absolute top-5 left-2 transition-all duration-100"
src="/images/icons/hashtag-white.svg" src="/images/icons/hashtag-white.svg"
@@ -91,7 +91,7 @@
id="submit" id="submit"
class="w-full flex justify-center text-white p-4 rounded-full tracking-wide font-bold outline-none focus:shadow-outline shadow-lg bg-gradient-to-tl from-primary-500 to-secondary-500 bg-size-200 bg-pos-0 hover:bg-pos-100 transition-all duration-500" class="w-full flex justify-center text-white p-4 rounded-full tracking-wide font-bold outline-none focus:shadow-outline shadow-lg bg-gradient-to-tl from-primary-500 to-secondary-500 bg-size-200 bg-pos-0 hover:bg-pos-100 transition-all duration-500"
> >
<%= gettext("Join") %> {gettext("Join")}
</button> </button>
<img src="/images/loading.gif" id="loading" class="hidden h-12 mx-auto" /> <img src="/images/loading.gif" id="loading" class="hidden h-12 mx-auto" />
</div> </div>
@@ -101,7 +101,7 @@
<div class="rounded-md bg-gray-600 bg-opacity-50 p-4 mt-8"> <div class="rounded-md bg-gray-600 bg-opacity-50 p-4 mt-8">
<div class="flex justify-center items-center"> <div class="flex justify-center items-center">
<p class="text-sm text-white"> <p class="text-sm text-white">
<%= gettext("Return to your last event") %> (<%= @last_event.name %>) {gettext("Return to your last event")} ({@last_event.name})
</p> </p>
<p class="text-base ml-3 mt-1"> <p class="text-base ml-3 mt-1">
<a href="#" class="whitespace-nowrap font-medium text-white"> <a href="#" class="whitespace-nowrap font-medium text-white">

View File

@@ -32,7 +32,7 @@
/> />
</svg> </svg>
<span><%= gettext("How it works ?") %></span> <span>{gettext("How it works ?")}</span>
</button> </button>
</div> </div>
<div <div
@@ -119,8 +119,8 @@
<path stroke="none" d="M0 0h24v24H0z" fill="none" /><path d="M10.585 10.587a2 2 0 0 0 2.829 2.828" /><path d="M16.681 16.673a8.717 8.717 0 0 1 -4.681 1.327c-3.6 0 -6.6 -2 -9 -6c1.272 -2.12 2.712 -3.678 4.32 -4.674m2.86 -1.146a9.055 9.055 0 0 1 1.82 -.18c3.6 0 6.6 2 9 6c-.666 1.11 -1.379 2.067 -2.138 2.87" /><path d="M3 3l18 18" /> <path stroke="none" d="M0 0h24v24H0z" fill="none" /><path d="M10.585 10.587a2 2 0 0 0 2.829 2.828" /><path d="M16.681 16.673a8.717 8.717 0 0 1 -4.681 1.327c-3.6 0 -6.6 -2 -9 -6c1.272 -2.12 2.712 -3.678 4.32 -4.674m2.86 -1.146a9.055 9.055 0 0 1 1.82 -.18c3.6 0 6.6 2 9 6c-.666 1.11 -1.379 2.067 -2.138 2.87" /><path d="M3 3l18 18" />
</svg> </svg>
<span :if={!@preview}><%= gettext("Open preview") %></span> <span :if={!@preview}>{gettext("Open preview")}</span>
<span :if={@preview}><%= gettext("Close preview") %></span> <span :if={@preview}>{gettext("Close preview")}</span>
</button> </button>
<div id="settings-modal-content" class="bg-white p-4"> <div id="settings-modal-content" class="bg-white p-4">
<.live_component <.live_component
@@ -192,10 +192,10 @@
</div> </div>
<div class="ml-4 flex-auto text-left"> <div class="ml-4 flex-auto text-left">
<p class="font-medium text-gray-700"> <p class="font-medium text-gray-700">
<%= gettext("Poll") %> {gettext("Poll")}
</p> </p>
<p class="text-gray-500"> <p class="text-gray-500">
<%= gettext("Add poll to know opinion of your public.") %> {gettext("Add poll to know opinion of your public.")}
</p> </p>
</div> </div>
</a> </a>
@@ -225,10 +225,10 @@
</div> </div>
<div class="ml-4 flex-auto text-left"> <div class="ml-4 flex-auto text-left">
<p class="font-medium text-gray-700"> <p class="font-medium text-gray-700">
<%= gettext("Form") %> {gettext("Form")}
</p> </p>
<p class="text-gray-500"> <p class="text-gray-500">
<%= gettext("Add form to collect data from your public.") %> {gettext("Add form to collect data from your public.")}
</p> </p>
</div> </div>
</a> </a>
@@ -257,9 +257,9 @@
</svg> </svg>
</div> </div>
<div class="ml-4 flex-auto text-left"> <div class="ml-4 flex-auto text-left">
<p class="font-medium text-gray-700"><%= gettext("Web content") %></p> <p class="font-medium text-gray-700">{gettext("Web content")}</p>
<p class="text-gray-500"> <p class="text-gray-500">
<%= gettext("Add a Youtube video or any web content.") %> {gettext("Add a Youtube video or any web content.")}
</p> </p>
</div> </div>
</a> </a>
@@ -289,9 +289,9 @@
</svg> </svg>
</div> </div>
<div class="ml-4 flex-auto text-left"> <div class="ml-4 flex-auto text-left">
<p class="font-medium text-gray-700"><%= gettext("Quiz") %></p> <p class="font-medium text-gray-700">{gettext("Quiz")}</p>
<p class="text-gray-500"> <p class="text-gray-500">
<%= gettext("Add a quiz to test knowledge.") %> {gettext("Add a quiz to test knowledge.")}
</p> </p>
</div> </div>
</a> </a>
@@ -301,10 +301,10 @@
<%= if @create=="poll" do %> <%= if @create=="poll" do %>
<div class="scroll-py-3 overflow-y-auto bg-gray-100 p-3"> <div class="scroll-py-3 overflow-y-auto bg-gray-100 p-3">
<p class="text-xl font-bold"> <p class="text-xl font-bold">
<%= case @create_action do {case @create_action do
:new -> gettext("New poll") :new -> gettext("New poll")
:edit -> gettext("Edit poll") :edit -> gettext("Edit poll")
end %> end}
</p> </p>
<.live_component <.live_component
module={ClaperWeb.PollLive.FormComponent} module={ClaperWeb.PollLive.FormComponent}
@@ -322,10 +322,10 @@
<%= if @create=="form" do %> <%= if @create=="form" do %>
<div class="scroll-py-3 overflow-y-auto bg-gray-100 p-3"> <div class="scroll-py-3 overflow-y-auto bg-gray-100 p-3">
<p class="text-xl font-bold"> <p class="text-xl font-bold">
<%= case @create_action do {case @create_action do
:new -> gettext("New form") :new -> gettext("New form")
:edit -> gettext("Edit form") :edit -> gettext("Edit form")
end %> end}
</p> </p>
<.live_component <.live_component
module={ClaperWeb.FormLive.FormComponent} module={ClaperWeb.FormLive.FormComponent}
@@ -343,10 +343,10 @@
<%= if @create == "embed" do %> <%= if @create == "embed" do %>
<div class="scroll-py-3 overflow-y-auto bg-gray-100 p-3"> <div class="scroll-py-3 overflow-y-auto bg-gray-100 p-3">
<p class="text-xl font-bold"> <p class="text-xl font-bold">
<%= case @create_action do {case @create_action do
:new -> gettext("New web content") :new -> gettext("New web content")
:edit -> gettext("Edit web content") :edit -> gettext("Edit web content")
end %> end}
</p> </p>
<.live_component <.live_component
module={ClaperWeb.EmbedLive.FormComponent} module={ClaperWeb.EmbedLive.FormComponent}
@@ -364,10 +364,10 @@
<%= if @create=="quiz" do %> <%= if @create=="quiz" do %>
<div class="scroll-py-3 overflow-y-auto bg-gray-100 p-3"> <div class="scroll-py-3 overflow-y-auto bg-gray-100 p-3">
<p class="text-xl font-bold"> <p class="text-xl font-bold">
<%= case @create_action do {case @create_action do
:new -> gettext("New quiz") :new -> gettext("New quiz")
:edit -> gettext("Edit quiz") :edit -> gettext("Edit quiz")
end %> end}
</p> </p>
<.live_component <.live_component
module={ClaperWeb.QuizLive.QuizComponent} module={ClaperWeb.QuizLive.QuizComponent}
@@ -385,7 +385,7 @@
<%= if @create == "import" do %> <%= if @create == "import" do %>
<div class="scroll-py-3 overflow-y-auto bg-gray-100 p-3"> <div class="scroll-py-3 overflow-y-auto bg-gray-100 p-3">
<p class="text-xl font-bold"> <p class="text-xl font-bold">
<%= gettext("Select presentation") %> {gettext("Select presentation")}
</p> </p>
<ul> <ul>
<%= for event <- @events do %> <%= for event <- @events do %>
@@ -410,7 +410,7 @@
/> />
</svg> </svg>
<span> <span>
<%= event.name %> {event.name}
</span> </span>
</button> </button>
</li> </li>
@@ -453,7 +453,7 @@
</a> </a>
<div class="flex items-center justify-start gap-x-2"> <div class="flex items-center justify-start gap-x-2">
<h2 class="text-xl font-bold leading-7 text-gray-900 md:text-2xl truncate w-24 md:w-auto"> <h2 class="text-xl font-bold leading-7 text-gray-900 md:text-2xl truncate w-24 md:w-auto">
<%= @event.name %> {@event.name}
</h2> </h2>
<div class="flex gap-x-3 items-center"> <div class="flex gap-x-3 items-center">
<div class="flex items-center text-sm text-gray-500 gap-x-1"> <div class="flex items-center text-sm text-gray-500 gap-x-1">
@@ -471,7 +471,7 @@
d="M7 20l4-16m2 16l4-16M6 9h14M4 15h14" d="M7 20l4-16m2 16l4-16M6 9h14M4 15h14"
/> />
</svg> </svg>
<span class="uppercase"><%= @event.code %></span> <span class="uppercase">{@event.code}</span>
</div> </div>
<div class="flex items-center text-sm text-gray-500 gap-x-1"> <div class="flex items-center text-sm text-gray-500 gap-x-1">
<svg <svg
@@ -487,14 +487,14 @@
/> />
</svg> </svg>
<span id="attendees-count" phx-update="ignore" phx-hook="UpdateAttendees"> <span id="attendees-count" phx-update="ignore" phx-hook="UpdateAttendees">
<%= @attendees_nb %> {@attendees_nb}
</span> </span>
<span> <span>
<%= link(gettext("Join"), {link(gettext("Join"),
to: ~p"/e/#{@event.code}", to: ~p"/e/#{@event.code}",
class: "text-xs text-primary-600 font-semibold text-sm ", class: "text-xs text-primary-600 font-semibold text-sm ",
target: "_blank" target: "_blank"
) %> )}
</span> </span>
</div> </div>
</div> </div>
@@ -535,8 +535,8 @@
<path stroke="none" d="M0 0h24v24H0z" fill="none" /><path d="M10.585 10.587a2 2 0 0 0 2.829 2.828" /><path d="M16.681 16.673a8.717 8.717 0 0 1 -4.681 1.327c-3.6 0 -6.6 -2 -9 -6c1.272 -2.12 2.712 -3.678 4.32 -4.674m2.86 -1.146a9.055 9.055 0 0 1 1.82 -.18c3.6 0 6.6 2 9 6c-.666 1.11 -1.379 2.067 -2.138 2.87" /><path d="M3 3l18 18" /> <path stroke="none" d="M0 0h24v24H0z" fill="none" /><path d="M10.585 10.587a2 2 0 0 0 2.829 2.828" /><path d="M16.681 16.673a8.717 8.717 0 0 1 -4.681 1.327c-3.6 0 -6.6 -2 -9 -6c1.272 -2.12 2.712 -3.678 4.32 -4.674m2.86 -1.146a9.055 9.055 0 0 1 1.82 -.18c3.6 0 6.6 2 9 6c-.666 1.11 -1.379 2.067 -2.138 2.87" /><path d="M3 3l18 18" />
</svg> </svg>
<span :if={!@preview}><%= gettext("Open preview") %></span> <span :if={!@preview}>{gettext("Open preview")}</span>
<span :if={@preview}><%= gettext("Close preview") %></span> <span :if={@preview}>{gettext("Close preview")}</span>
</button> </button>
<button <button
phx-hook="OpenPresenter" phx-hook="OpenPresenter"
@@ -563,7 +563,7 @@
d="M13.5 6H5.25A2.25 2.25 0 0 0 3 8.25v10.5A2.25 2.25 0 0 0 5.25 21h10.5A2.25 2.25 0 0 0 18 18.75V10.5m-10.5 6L21 3m0 0h-5.25M21 3v5.25" d="M13.5 6H5.25A2.25 2.25 0 0 0 3 8.25v10.5A2.25 2.25 0 0 0 5.25 21h10.5A2.25 2.25 0 0 0 18 18.75V10.5m-10.5 6L21 3m0 0h-5.25M21 3v5.25"
/> />
</svg> </svg>
<%= gettext("Open presentation") %> {gettext("Open presentation")}
</button> </button>
</div> </div>
<div class="flex items-center gap-x-2 lg:hidden"> <div class="flex items-center gap-x-2 lg:hidden">
@@ -737,10 +737,10 @@
<p class="text-lg"> <p class="text-lg">
<span :if={@event.presentation_file.length > 0}> <span :if={@event.presentation_file.length > 0}>
<%= gettext("This slide does not have any interactions.") %> {gettext("This slide does not have any interactions.")}
</span> </span>
<span :if={@event.presentation_file.length == 0}> <span :if={@event.presentation_file.length == 0}>
<%= gettext("Create your first interaction.") %> {gettext("Create your first interaction.")}
</span> </span>
</p> </p>
@@ -756,7 +756,7 @@
> >
<path d="M8.75 3.75a.75.75 0 0 0-1.5 0v3.5h-3.5a.75.75 0 0 0 0 1.5h3.5v3.5a.75.75 0 0 0 1.5 0v-3.5h3.5a.75.75 0 0 0 0-1.5h-3.5v-3.5Z" /> <path d="M8.75 3.75a.75.75 0 0 0-1.5 0v3.5h-3.5a.75.75 0 0 0 0 1.5h3.5v3.5a.75.75 0 0 0 1.5 0v-3.5h3.5a.75.75 0 0 0 0-1.5h-3.5v-3.5Z" />
</svg> </svg>
<span><%= gettext("Add interaction") %></span> <span>{gettext("Add interaction")}</span>
</button> </button>
</div> </div>
<div class="grid grid-cols-1 @sm:grid-cols-2 @lg:grid-cols-3 gap-4 p-4 overflow-y-auto"> <div class="grid grid-cols-1 @sm:grid-cols-2 @lg:grid-cols-3 gap-4 p-4 overflow-y-auto">
@@ -783,7 +783,7 @@
/> />
</svg> </svg>
</div> </div>
<span class="font-semibold"><%= gettext("Poll") %></span> <span class="font-semibold">{gettext("Poll")}</span>
</div> </div>
<a <a
@@ -827,7 +827,7 @@
/> />
</svg> </svg>
</div> </div>
<span class="font-semibold"><%= gettext("Form") %></span> <span class="font-semibold">{gettext("Form")}</span>
</div> </div>
<a <a
class="p-2 rounded text-xs font-medium text-center text-primary-500" class="p-2 rounded text-xs font-medium text-center text-primary-500"
@@ -871,7 +871,7 @@
</svg> </svg>
</div> </div>
<span class="font-semibold"> <span class="font-semibold">
<%= gettext("Web content") %> {gettext("Web content")}
</span> </span>
</div> </div>
<a <a
@@ -917,7 +917,7 @@
</svg> </svg>
</div> </div>
<span class="font-semibold"> <span class="font-semibold">
<%= gettext("Quiz") %> {gettext("Quiz")}
</span> </span>
<p <p
:if={interaction.lti_resource_id} :if={interaction.lti_resource_id}
@@ -1079,7 +1079,7 @@
<% end %> <% end %>
<% _ -> %> <% _ -> %>
<% end %> <% end %>
<span><%= interaction.title %></span> <span>{interaction.title}</span>
</div> </div>
</div> </div>
<div class="w-full"> <div class="w-full">
@@ -1098,7 +1098,7 @@
phx-value-id={interaction.id} phx-value-id={interaction.id}
class="bg-supporting-red-100 text-supporting-red-800 px-2 py-2 rounded text-sm font-medium w-full" class="bg-supporting-red-100 text-supporting-red-800 px-2 py-2 rounded text-sm font-medium w-full"
> >
<%= gettext("Disable") %> {gettext("Disable")}
</button> </button>
</div> </div>
<% else %> <% else %>
@@ -1115,7 +1115,7 @@
phx-value-id={interaction.id} phx-value-id={interaction.id}
class="bg-primary-100 text-primary-800 px-2 py-2 rounded text-sm font-medium w-full" class="bg-primary-100 text-primary-800 px-2 py-2 rounded text-sm font-medium w-full"
> >
<%= gettext("Enable") %> {gettext("Enable")}
</button> </button>
<% end %> <% end %>
</div> </div>
@@ -1129,7 +1129,7 @@
> >
<img src="/images/interaction-icons.png" class="w-2/3 @sm:w-1/3" /> <img src="/images/interaction-icons.png" class="w-2/3 @sm:w-1/3" />
<span class="font-semibold text-secondary-800"> <span class="font-semibold text-secondary-800">
<%= gettext("Add interaction") %> {gettext("Add interaction")}
</span> </span>
</button> </button>
</div> </div>
@@ -1164,35 +1164,35 @@
> >
<li class={"rounded-md #{if @list_tab==:posts, do: "bg-secondary-600 text-white" , <li class={"rounded-md #{if @list_tab==:posts, do: "bg-secondary-600 text-white" ,
else: "bg-white text-gray-600" } px-2 py-0.5 text-sm shadow-sm"}> else: "bg-white text-gray-600" } px-2 py-0.5 text-sm shadow-sm"}>
<%= link(gettext("Messages") <> " (#{@post_count})", {link(gettext("Messages") <> " (#{@post_count})",
to: "#", to: "#",
phx_click: "list-tab", phx_click: "list-tab",
phx_value_tab: :posts phx_value_tab: :posts
) %> )}
</li> </li>
<li class={"rounded-md #{if @list_tab==:questions, do: "bg-secondary-600 text-white" , <li class={"rounded-md #{if @list_tab==:questions, do: "bg-secondary-600 text-white" ,
else: "bg-white text-gray-600" } px-2 py-0.5 text-sm shadow-sm"}> else: "bg-white text-gray-600" } px-2 py-0.5 text-sm shadow-sm"}>
<%= link(gettext("Questions") <> " (#{@question_count})", {link(gettext("Questions") <> " (#{@question_count})",
to: "#", to: "#",
phx_click: "list-tab", phx_click: "list-tab",
phx_value_tab: :questions phx_value_tab: :questions
) %> )}
</li> </li>
<li class={"rounded-md #{if @list_tab==:pinned_posts, do: "bg-secondary-600 text-white" , <li class={"rounded-md #{if @list_tab==:pinned_posts, do: "bg-secondary-600 text-white" ,
else: "bg-white text-gray-600" } px-2 py-0.5 text-sm shadow-sm"}> else: "bg-white text-gray-600" } px-2 py-0.5 text-sm shadow-sm"}>
<%= link(gettext("Pinned messages") <> " (#{@pinned_post_count})", {link(gettext("Pinned messages") <> " (#{@pinned_post_count})",
to: "#", to: "#",
phx_click: "list-tab", phx_click: "list-tab",
phx_value_tab: :pinned_posts phx_value_tab: :pinned_posts
) %> )}
</li> </li>
<li class={"rounded-md #{if @list_tab==:forms, do: "bg-secondary-600 text-white" , <li class={"rounded-md #{if @list_tab==:forms, do: "bg-secondary-600 text-white" ,
else: "bg-white text-gray-600" } px-2 py-0.5 text-sm shadow-sm"}> else: "bg-white text-gray-600" } px-2 py-0.5 text-sm shadow-sm"}>
<%= link(gettext("Form submissions") <> " (#{@form_submit_count})", {link(gettext("Form submissions") <> " (#{@form_submit_count})",
to: "#", to: "#",
phx_click: "list-tab", phx_click: "list-tab",
phx_value_tab: :forms phx_value_tab: :forms
) %> )}
</li> </li>
</ul> </ul>
@@ -1218,7 +1218,7 @@
</svg> </svg>
<p class="text-lg"> <p class="text-lg">
<%= gettext("Messages from attendees will appear here.") %> {gettext("Messages from attendees will appear here.")}
</p> </p>
</div> </div>
<div <div
@@ -1259,7 +1259,7 @@
</svg> </svg>
<p class="text-lg"> <p class="text-lg">
<%= gettext("Questions will appear here.") %> {gettext("Questions will appear here.")}
</p> </p>
</div> </div>
@@ -1280,7 +1280,7 @@
</svg> </svg>
<p class="flex items-center gap-x-1"> <p class="flex items-center gap-x-1">
<%= gettext("Sort by popularity") %> {gettext("Sort by popularity")}
</p> </p>
</button> </button>
<button <button
@@ -1301,7 +1301,7 @@
/> />
</svg> </svg>
<span><%= gettext("Sort by date") %></span> <span>{gettext("Sort by date")}</span>
</button> </button>
</div> </div>
<div <div
@@ -1341,7 +1341,7 @@
</svg> </svg>
<p class="text-lg"> <p class="text-lg">
<%= gettext("Pinned messages will appear here.") %> {gettext("Pinned messages will appear here.")}
</p> </p>
</div> </div>
@@ -1387,7 +1387,7 @@
</svg> </svg>
<p class="text-lg"> <p class="text-lg">
<%= gettext("Form submissions from attendees will appear here.") %> {gettext("Form submissions from attendees will appear here.")}
</p> </p>
</div> </div>
<% end %> <% end %>
@@ -1402,20 +1402,20 @@
<div class="px-4 pb-2 pt-3 rounded-b-lg rounded-tr-lg bg-white relative shadow-md text-black break-all mt-2"> <div class="px-4 pb-2 pt-3 rounded-b-lg rounded-tr-lg bg-white relative shadow-md text-black break-all mt-2">
<div class="float-right mr-1"> <div class="float-right mr-1">
<span class="text-red-500"> <span class="text-red-500">
<%= link(gettext("Delete"), {link(gettext("Delete"),
to: "#", to: "#",
phx_click: "delete-form-submit", phx_click: "delete-form-submit",
phx_value_id: submission.id, phx_value_id: submission.id,
phx_value_event_id: @event.uuid, phx_value_event_id: @event.uuid,
data: [confirm: gettext("This cannot be undone, confirm ?")] data: [confirm: gettext("This cannot be undone, confirm ?")]
) %> )}
</span> </span>
</div> </div>
<p> <p>
<span class="font-semibold text-lg"> <span class="font-semibold text-lg">
<%= gettext("Form") %> <%= gettext("Form") %>
</span>: <%= submission.form.title %> </span>: {submission.form.title}
</p> </p>
<div class="flex space-x-3 items-center"> <div class="flex space-x-3 items-center">
@@ -1435,9 +1435,9 @@
<%= for res <- submission.response do %> <%= for res <- submission.response do %>
<p> <p>
<strong> <strong>
<%= elem(res, 0) %>: {elem(res, 0)}:
</strong> </strong>
<%= elem(res, 1) %> {elem(res, 1)}
</p> </p>
<% end %> <% end %>
</div> </div>
@@ -1460,7 +1460,7 @@
data-tg-group="manage" data-tg-group="manage"
> >
<div class="w-full h-12 bg-gray-100 font-semibold text-xl flex items-center justify-center"> <div class="w-full h-12 bg-gray-100 font-semibold text-xl flex items-center justify-center">
<%= gettext("Settings") %> {gettext("Settings")}
</div> </div>
<.live_component <.live_component

View File

@@ -26,12 +26,12 @@ defmodule ClaperWeb.EventLive.ManageablePostComponent do
/> />
</svg> </svg>
<span><%= gettext("Question") %></span> <span>{gettext("Question")}</span>
</div> </div>
<div :if={!@readonly} class="float-right mr-1"> <div :if={!@readonly} class="float-right mr-1">
<%= if @post.attendee_identifier do %> <%= if @post.attendee_identifier do %>
<span class="text-yellow-500"> <span class="text-yellow-500">
<%= link( {link(
if @post.pinned do if @post.pinned do
gettext("Unpin") gettext("Unpin")
else else
@@ -41,11 +41,11 @@ defmodule ClaperWeb.EventLive.ManageablePostComponent do
phx_click: "pin", phx_click: "pin",
phx_value_id: @post.uuid, phx_value_id: @post.uuid,
phx_value_event_id: @event.uuid phx_value_event_id: @event.uuid
) %> )}
</span> </span>
/ /
<span class="text-red-500"> <span class="text-red-500">
<%= link(gettext("Ban"), {link(gettext("Ban"),
to: "#", to: "#",
phx_click: "ban", phx_click: "ban",
phx_value_attendee_identifier: @post.attendee_identifier, phx_value_attendee_identifier: @post.attendee_identifier,
@@ -55,12 +55,12 @@ defmodule ClaperWeb.EventLive.ManageablePostComponent do
"Blocking this user will delete all his messages and he will not be able to join again, confirm ?" "Blocking this user will delete all his messages and he will not be able to join again, confirm ?"
) )
] ]
) %> )}
</span> </span>
/ /
<% else %> <% else %>
<span class="text-yellow-500"> <span class="text-yellow-500">
<%= link( {link(
if @post.pinned do if @post.pinned do
gettext("Unpin") gettext("Unpin")
else else
@@ -70,11 +70,11 @@ defmodule ClaperWeb.EventLive.ManageablePostComponent do
phx_click: "pin", phx_click: "pin",
phx_value_id: @post.uuid, phx_value_id: @post.uuid,
phx_value_event_id: @event.uuid phx_value_event_id: @event.uuid
) %> )}
</span> </span>
/ /
<span class="text-red-500"> <span class="text-red-500">
<%= link(gettext("Ban"), {link(gettext("Ban"),
to: "#", to: "#",
phx_click: "ban", phx_click: "ban",
phx_value_user_id: @post.user_id, phx_value_user_id: @post.user_id,
@@ -84,17 +84,17 @@ defmodule ClaperWeb.EventLive.ManageablePostComponent do
"Blocking this user will delete all his messages and he will not be able to join again, confirm ?" "Blocking this user will delete all his messages and he will not be able to join again, confirm ?"
) )
] ]
) %> )}
</span> </span>
/ /
<% end %> <% end %>
<span class="text-red-500"> <span class="text-red-500">
<%= link(gettext("Delete"), {link(gettext("Delete"),
to: "#", to: "#",
phx_click: "delete", phx_click: "delete",
phx_value_id: @post.uuid, phx_value_id: @post.uuid,
phx_value_event_id: @event.uuid phx_value_event_id: @event.uuid
) %> )}
</span> </span>
</div> </div>
@@ -114,12 +114,12 @@ defmodule ClaperWeb.EventLive.ManageablePostComponent do
<div class="flex flex-col"> <div class="flex flex-col">
<%= if @post.name do %> <%= if @post.name do %>
<p class="text-black text-sm font-semibold mr-2"> <p class="text-black text-sm font-semibold mr-2">
<%= @post.name %> {@post.name}
</p> </p>
<% end %> <% end %>
<p class="text-xl"> <p class="text-xl">
<%= ClaperWeb.Helpers.format_body(@post.body) %> {ClaperWeb.Helpers.format_body(@post.body)}
</p> </p>
</div> </div>
</div> </div>
@@ -130,7 +130,7 @@ defmodule ClaperWeb.EventLive.ManageablePostComponent do
<%= if @post.like_count> 0 do %> <%= if @post.like_count> 0 do %>
<img src="/images/icons/thumb.svg" class="h-4" /> <img src="/images/icons/thumb.svg" class="h-4" />
<span class="ml-1"> <span class="ml-1">
<%= @post.like_count %> {@post.like_count}
</span> </span>
<% end %> <% end %>
</div> </div>
@@ -138,7 +138,7 @@ defmodule ClaperWeb.EventLive.ManageablePostComponent do
<%= if @post.love_count> 0 do %> <%= if @post.love_count> 0 do %>
<img src="/images/icons/heart.svg" class="h-4" /> <img src="/images/icons/heart.svg" class="h-4" />
<span class="ml-1"> <span class="ml-1">
<%= @post.love_count %> {@post.love_count}
</span> </span>
<% end %> <% end %>
</div> </div>
@@ -146,7 +146,7 @@ defmodule ClaperWeb.EventLive.ManageablePostComponent do
<%= if @post.lol_count> 0 do %> <%= if @post.lol_count> 0 do %>
<img src="/images/icons/laugh.svg" class="h-4" /> <img src="/images/icons/laugh.svg" class="h-4" />
<span class="ml-1"> <span class="ml-1">
<%= @post.lol_count %> {@post.lol_count}
</span> </span>
<% end %> <% end %>
</div> </div>

View File

@@ -16,9 +16,9 @@ defmodule ClaperWeb.EventLive.ManageableQuizComponent do
> >
<div class="w-full md:w-1/2 mx-auto h-full"> <div class="w-full md:w-1/2 mx-auto h-full">
<p class={"#{if @iframe, do: "text-xl mb-12", else: "text-5xl mb-24"} text-white font-bold text-center"}> <p class={"#{if @iframe, do: "text-xl mb-12", else: "text-5xl mb-24"} text-white font-bold text-center"}>
<span :if={@current_question_idx < 0}><%= @quiz.title %></span> <span :if={@current_question_idx < 0}>{@quiz.title}</span>
<span :if={@current_question_idx >= 0}> <span :if={@current_question_idx >= 0}>
<%= Enum.at(@quiz.quiz_questions, @current_question_idx).content %> {Enum.at(@quiz.quiz_questions, @current_question_idx).content}
</span> </span>
</p> </p>
@@ -26,9 +26,9 @@ defmodule ClaperWeb.EventLive.ManageableQuizComponent do
:if={@current_question_idx == -1} :if={@current_question_idx == -1}
class={"#{if @iframe, do: "space-y-5", else: "space-y-8"} flex flex-col text-white text-center"} class={"#{if @iframe, do: "space-y-5", else: "space-y-8"} flex flex-col text-white text-center"}
> >
<p class="font-semibold text-2xl"><%= gettext("Average score") %>:</p> <p class="font-semibold text-2xl">{gettext("Average score")}:</p>
<p class="font-semibold text-7xl"> <p class="font-semibold text-7xl">
<%= Claper.Quizzes.calculate_average_score(@quiz.id) %>/<%= length(@quiz.quiz_questions) %> {Claper.Quizzes.calculate_average_score(@quiz.id)}/{length(@quiz.quiz_questions)}
</p> </p>
</div> </div>
@@ -41,8 +41,8 @@ defmodule ClaperWeb.EventLive.ManageableQuizComponent do
<div class="bg-gradient-to-r from-primary-500 to-secondary-500 h-full absolute left-0 transition-all rounded-l-3xl"> <div class="bg-gradient-to-r from-primary-500 to-secondary-500 h-full absolute left-0 transition-all rounded-l-3xl">
</div> </div>
<div class="flex space-x-3 justify-between w-full items-center z-10 text-left"> <div class="flex space-x-3 justify-between w-full items-center z-10 text-left">
<span class="flex-1 pr-2 text-3xl"><%= opt.content %></span> <span class="flex-1 pr-2 text-3xl">{opt.content}</span>
<span class="text-xl"><%= opt.percentage %>% (<%= opt.response_count %>)</span> <span class="text-xl">{opt.percentage}% ({opt.response_count})</span>
</div> </div>
</div> </div>
<% end %> <% end %>

View File

@@ -19,7 +19,7 @@ defmodule ClaperWeb.EventLive.ManagerSettingsComponent do
<path d="M10.766 7.51a.75.75 0 0 0-1.37.365l-.492 6.861a.75.75 0 0 0 1.204.65l1.043-.799.985 3.678a.75.75 0 0 0 1.45-.388l-.978-3.646 1.292.204a.75.75 0 0 0 .74-1.16l-3.874-5.764Z" /> <path d="M10.766 7.51a.75.75 0 0 0-1.37.365l-.492 6.861a.75.75 0 0 0 1.204.65l1.043-.799.985 3.678a.75.75 0 0 0 1.45-.388l-.978-3.646 1.292.204a.75.75 0 0 0 .74-1.16l-3.874-5.764Z" />
</svg> </svg>
<span><%= gettext("Interaction") %></span> <span>{gettext("Interaction")}</span>
</div> </div>
<%= case @current_interaction do %> <%= case @current_interaction do %>
@@ -59,10 +59,10 @@ defmodule ClaperWeb.EventLive.ManagerSettingsComponent do
</svg> </svg>
<span :if={@state.poll_visible}> <span :if={@state.poll_visible}>
<%= gettext("Hide results on presentation") %> {gettext("Hide results on presentation")}
</span> </span>
<span :if={!@state.poll_visible}> <span :if={!@state.poll_visible}>
<%= gettext("Show results on presentation") %> {gettext("Show results on presentation")}
</span> </span>
<code <code
:if={@show_shortcut} :if={@show_shortcut}
@@ -109,10 +109,10 @@ defmodule ClaperWeb.EventLive.ManagerSettingsComponent do
</svg> </svg>
<span :if={@current_interaction.show_results}> <span :if={@current_interaction.show_results}>
<%= gettext("Hide results on presentation") %> {gettext("Hide results on presentation")}
</span> </span>
<span :if={!@current_interaction.show_results}> <span :if={!@current_interaction.show_results}>
<%= gettext("Show results on presentation") %> {gettext("Show results on presentation")}
</span> </span>
<code <code
:if={@show_shortcut} :if={@show_shortcut}
@@ -141,7 +141,7 @@ defmodule ClaperWeb.EventLive.ManagerSettingsComponent do
</svg> </svg>
<span> <span>
<%= gettext("Review questions") %> {gettext("Review questions")}
</span> </span>
<div></div> <div></div>
</ClaperWeb.Component.Input.check_button> </ClaperWeb.Component.Input.check_button>
@@ -165,7 +165,7 @@ defmodule ClaperWeb.EventLive.ManagerSettingsComponent do
</svg> </svg>
<span> <span>
<%= gettext("Previous") %> {gettext("Previous")}
</span> </span>
</ClaperWeb.Component.Input.check_button> </ClaperWeb.Component.Input.check_button>
<ClaperWeb.Component.Input.check_button <ClaperWeb.Component.Input.check_button
@@ -173,7 +173,7 @@ defmodule ClaperWeb.EventLive.ManagerSettingsComponent do
key={:next_quiz_question} key={:next_quiz_question}
> >
<span> <span>
<%= gettext("Next") %> {gettext("Next")}
</span> </span>
<svg <svg
xmlns="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg"
@@ -214,7 +214,7 @@ defmodule ClaperWeb.EventLive.ManagerSettingsComponent do
/> />
</svg> </svg>
<span><%= gettext("Presentation") %></span> <span>{gettext("Presentation")}</span>
</div> </div>
<div class="flex space-x-1 items-center mt-3"> <div class="flex space-x-1 items-center mt-3">
@@ -252,10 +252,10 @@ defmodule ClaperWeb.EventLive.ManagerSettingsComponent do
</svg> </svg>
<div> <div>
<span :if={!@state.join_screen_visible}> <span :if={!@state.join_screen_visible}>
<%= gettext("Show instructions to join") %> {gettext("Show instructions to join")}
</span> </span>
<span :if={@state.join_screen_visible}> <span :if={@state.join_screen_visible}>
<%= gettext("Hide instructions to join") %> {gettext("Hide instructions to join")}
</span> </span>
</div> </div>
<code <code
@@ -301,8 +301,8 @@ defmodule ClaperWeb.EventLive.ManagerSettingsComponent do
<path stroke="none" d="M0 0h24v24H0z" fill="none" /><path d="M8 9h1m4 0h3" /><path d="M8 13h5" /><path d="M8 4h10a3 3 0 0 1 3 3v8c0 .577 -.163 1.116 -.445 1.573m-2.555 1.427h-5l-5 3v-3h-2a3 3 0 0 1 -3 -3v-8c0 -1.085 .576 -2.036 1.439 -2.562" /><path d="M3 3l18 18" /> <path stroke="none" d="M0 0h24v24H0z" fill="none" /><path d="M8 9h1m4 0h3" /><path d="M8 13h5" /><path d="M8 4h10a3 3 0 0 1 3 3v8c0 .577 -.163 1.116 -.445 1.573m-2.555 1.427h-5l-5 3v-3h-2a3 3 0 0 1 -3 -3v-8c0 -1.085 .576 -2.036 1.439 -2.562" /><path d="M3 3l18 18" />
</svg> </svg>
<div> <div>
<span :if={!@state.chat_visible}><%= gettext("Show messages") %></span> <span :if={!@state.chat_visible}>{gettext("Show messages")}</span>
<span :if={@state.chat_visible}><%= gettext("Hide messages") %></span> <span :if={@state.chat_visible}>{gettext("Hide messages")}</span>
</div> </div>
<code <code
:if={@show_shortcut} :if={@show_shortcut}
@@ -356,9 +356,9 @@ defmodule ClaperWeb.EventLive.ManagerSettingsComponent do
</svg> </svg>
<div> <div>
<span :if={!@state.show_only_pinned}> <span :if={!@state.show_only_pinned}>
<%= gettext("Show only pinned messages") %> {gettext("Show only pinned messages")}
</span> </span>
<span :if={@state.show_only_pinned}><%= gettext("Show all messages") %></span> <span :if={@state.show_only_pinned}>{gettext("Show all messages")}</span>
</div> </div>
<code <code
:if={@show_shortcut} :if={@show_shortcut}
@@ -387,7 +387,7 @@ defmodule ClaperWeb.EventLive.ManagerSettingsComponent do
/> />
</svg> </svg>
<span><%= gettext("Attendees") %></span> <span>{gettext("Attendees")}</span>
</div> </div>
<div class="flex space-x-2 items-center mt-3"> <div class="flex space-x-2 items-center mt-3">
@@ -423,8 +423,8 @@ defmodule ClaperWeb.EventLive.ManagerSettingsComponent do
<path stroke="none" d="M0 0h24v24H0z" fill="none" /><path d="M8 9h1m4 0h3" /><path d="M8 13h5" /><path d="M8 4h10a3 3 0 0 1 3 3v8c0 .577 -.163 1.116 -.445 1.573m-2.555 1.427h-5l-5 3v-3h-2a3 3 0 0 1 -3 -3v-8c0 -1.085 .576 -2.036 1.439 -2.562" /><path d="M3 3l18 18" /> <path stroke="none" d="M0 0h24v24H0z" fill="none" /><path d="M8 9h1m4 0h3" /><path d="M8 13h5" /><path d="M8 4h10a3 3 0 0 1 3 3v8c0 .577 -.163 1.116 -.445 1.573m-2.555 1.427h-5l-5 3v-3h-2a3 3 0 0 1 -3 -3v-8c0 -1.085 .576 -2.036 1.439 -2.562" /><path d="M3 3l18 18" />
</svg> </svg>
<div> <div>
<span :if={!@state.chat_enabled}><%= gettext("Enable messages") %></span> <span :if={!@state.chat_enabled}>{gettext("Enable messages")}</span>
<span :if={@state.chat_enabled}><%= gettext("Disable messages") %></span> <span :if={@state.chat_enabled}>{gettext("Disable messages")}</span>
</div> </div>
<code <code
:if={@show_shortcut} :if={@show_shortcut}
@@ -479,10 +479,10 @@ defmodule ClaperWeb.EventLive.ManagerSettingsComponent do
<div> <div>
<span :if={!@state.anonymous_chat_enabled}> <span :if={!@state.anonymous_chat_enabled}>
<%= gettext("Allow anonymous messages") %> {gettext("Allow anonymous messages")}
</span> </span>
<span :if={@state.anonymous_chat_enabled}> <span :if={@state.anonymous_chat_enabled}>
<%= gettext("Deny anonymous messages") %> {gettext("Deny anonymous messages")}
</span> </span>
</div> </div>
<code <code
@@ -530,10 +530,10 @@ defmodule ClaperWeb.EventLive.ManagerSettingsComponent do
<div> <div>
<span :if={!@state.message_reaction_enabled}> <span :if={!@state.message_reaction_enabled}>
<%= gettext("Enable reactions") %> {gettext("Enable reactions")}
</span> </span>
<span :if={@state.message_reaction_enabled}> <span :if={@state.message_reaction_enabled}>
<%= gettext("Disable reactions") %> {gettext("Disable reactions")}
</span> </span>
</div> </div>
<code <code

View File

@@ -25,7 +25,7 @@ defmodule ClaperWeb.EventLive.PollComponent do
d="M16 8v8m-4-5v5m-4-2v2m-2 4h12a2 2 0 002-2V6a2 2 0 00-2-2H6a2 2 0 00-2 2v12a2 2 0 002 2z" d="M16 8v8m-4-5v5m-4-2v2m-2 4h12a2 2 0 002-2V6a2 2 0 00-2-2H6a2 2 0 00-2 2v12a2 2 0 002 2z"
/> />
</svg> </svg>
<span class="font-bold"><%= gettext("See current poll") %></span> <span class="font-bold">{gettext("See current poll")}</span>
</div> </div>
</div> </div>
</div> </div>
@@ -44,12 +44,12 @@ defmodule ClaperWeb.EventLive.PollComponent do
</svg> </svg>
</div> </div>
<p class="text-sm text-gray-400 my-1"><%= gettext("Current poll") %></p> <p class="text-sm text-gray-400 my-1">{gettext("Current poll")}</p>
<p class="text-white text-xl font-semibold mb-2"><%= @poll.title %></p> <p class="text-white text-xl font-semibold mb-2">{@poll.title}</p>
<%= if @poll.multiple do %> <%= if @poll.multiple do %>
<p class="text-gray-400 text-sm mb-4"><%= gettext("Select one or multiple options") %></p> <p class="text-gray-400 text-sm mb-4">{gettext("Select one or multiple options")}</p>
<% else %> <% else %>
<p class="text-gray-400 text-sm mb-4"><%= gettext("Select one option") %></p> <p class="text-gray-400 text-sm mb-4">{gettext("Select one option")}</p>
<% end %> <% end %>
</div> </div>
<div> <div>
@@ -78,10 +78,10 @@ defmodule ClaperWeb.EventLive.PollComponent do
</span> </span>
<% end %> <% end %>
<% end %> <% end %>
<span class="flex-1 pr-2"><%= opt.content %></span> <span class="flex-1 pr-2">{opt.content}</span>
</div> </div>
<span :if={@show_results} class="text-sm z-10"> <span :if={@show_results} class="text-sm z-10">
<%= opt.percentage %>% (<%= opt.vote_count %>) {opt.percentage}% ({opt.vote_count})
</span> </span>
</button> </button>
<% else %> <% else %>
@@ -111,10 +111,10 @@ defmodule ClaperWeb.EventLive.PollComponent do
</span> </span>
<% end %> <% end %>
<% end %> <% end %>
<span class="flex-1 pr-2"><%= opt.content %></span> <span class="flex-1 pr-2">{opt.content}</span>
</div> </div>
<span :if={@show_results} class="text-sm z-10"> <span :if={@show_results} class="text-sm z-10">
<%= opt.percentage %>% (<%= opt.vote_count %>) {opt.percentage}% ({opt.vote_count})
</span> </span>
</button> </button>
<% end %> <% end %>
@@ -124,7 +124,7 @@ defmodule ClaperWeb.EventLive.PollComponent do
<%= if (length @selected_poll_opt) == 0 || (length @current_poll_vote) > 0 do %> <%= if (length @selected_poll_opt) == 0 || (length @current_poll_vote) > 0 do %>
<button class="px-3 py-2 text-white font-medium bg-gray-500 rounded-md mt-3 mb-4 cursor-default"> <button class="px-3 py-2 text-white font-medium bg-gray-500 rounded-md mt-3 mb-4 cursor-default">
<%= gettext("Vote") %> {gettext("Vote")}
</button> </button>
<% else %> <% else %>
<button <button
@@ -132,7 +132,7 @@ defmodule ClaperWeb.EventLive.PollComponent do
phx-disable-with="..." phx-disable-with="..."
class="px-3 py-2 text-white font-medium bg-primary-400 hover:bg-primary-500 rounded-md mt-3 mb-4" class="px-3 py-2 text-white font-medium bg-primary-400 hover:bg-primary-500 rounded-md mt-3 mb-4"
> >
<%= gettext("Vote") %> {gettext("Vote")}
</button> </button>
<% end %> <% end %>
</div> </div>

View File

@@ -25,12 +25,12 @@ defmodule ClaperWeb.EventLive.PostComponent do
<%= if @post.name || leader?(@post, @event, @leaders) || pinned?(@post) do %> <%= if @post.name || leader?(@post, @event, @leaders) || pinned?(@post) do %>
<div class="inline-flex items-center"> <div class="inline-flex items-center">
<%= if @post.name do %> <%= if @post.name do %>
<p class="text-white text-xs font-semibold mb-2 mr-2"><%= @post.name %></p> <p class="text-white text-xs font-semibold mb-2 mr-2">{@post.name}</p>
<% end %> <% end %>
<%= if leader?(@post, @event, @leaders) do %> <%= if leader?(@post, @event, @leaders) do %>
<div class="inline-flex items-center space-x-1 justify-center px-3 py-0.5 rounded-full text-xs font-medium bg-supporting-yellow-100 text-supporting-yellow-800 mb-2"> <div class="inline-flex items-center space-x-1 justify-center px-3 py-0.5 rounded-full text-xs font-medium bg-supporting-yellow-100 text-supporting-yellow-800 mb-2">
<img src="/images/icons/star.svg" class="h-3" /> <img src="/images/icons/star.svg" class="h-3" />
<span><%= gettext("Host") %></span> <span>{gettext("Host")}</span>
</div> </div>
<% end %> <% end %>
@@ -56,7 +56,7 @@ defmodule ClaperWeb.EventLive.PostComponent do
> >
</path> </path>
</svg> </svg>
<span><%= gettext("Pinned") %></span> <span>{gettext("Pinned")}</span>
</div> </div>
<% end %> <% end %>
</div> </div>
@@ -67,34 +67,34 @@ defmodule ClaperWeb.EventLive.PostComponent do
class="hidden absolute right-4 top-7 bg-white rounded-lg px-5 py-2 animate__faster" class="hidden absolute right-4 top-7 bg-white rounded-lg px-5 py-2 animate__faster"
> >
<span class="text-red-500"> <span class="text-red-500">
<%= link(gettext("Delete"), {link(gettext("Delete"),
to: "#", to: "#",
phx_click: "delete", phx_click: "delete",
phx_value_id: @post.uuid, phx_value_id: @post.uuid,
phx_value_event_id: @event.uuid, phx_value_event_id: @event.uuid,
data: [confirm: gettext("Are you sure?")] data: [confirm: gettext("Are you sure?")]
) %> )}
</span> </span>
</div> </div>
<p><%= ClaperWeb.Helpers.format_body(@post.body) %></p> <p>{ClaperWeb.Helpers.format_body(@post.body)}</p>
<div class="flex h-6 text-sm float-right text-white space-x-2"> <div class="flex h-6 text-sm float-right text-white space-x-2">
<%= if @post.like_count > 0 do %> <%= if @post.like_count > 0 do %>
<div class="flex px-1 items-center"> <div class="flex px-1 items-center">
<img src="/images/icons/thumb.svg" class="h-4" /> <img src="/images/icons/thumb.svg" class="h-4" />
<span class="ml-1 text-white"><%= @post.like_count %></span> <span class="ml-1 text-white">{@post.like_count}</span>
</div> </div>
<% end %> <% end %>
<%= if @post.love_count > 0 do %> <%= if @post.love_count > 0 do %>
<div class="flex px-1 items-center"> <div class="flex px-1 items-center">
<img src="/images/icons/heart.svg" class="h-4" /> <img src="/images/icons/heart.svg" class="h-4" />
<span class="ml-1 text-white"><%= @post.love_count %></span> <span class="ml-1 text-white">{@post.love_count}</span>
</div> </div>
<% end %> <% end %>
<%= if @post.lol_count > 0 do %> <%= if @post.lol_count > 0 do %>
<div class="flex px-1 items-center"> <div class="flex px-1 items-center">
<img src="/images/icons/laugh.svg" class="h-4" /> <img src="/images/icons/laugh.svg" class="h-4" />
<span class="ml-1 text-white"><%= @post.lol_count %></span> <span class="ml-1 text-white">{@post.lol_count}</span>
</div> </div>
<% end %> <% end %>
</div> </div>
@@ -104,12 +104,12 @@ defmodule ClaperWeb.EventLive.PostComponent do
<%= if @post.name || leader?(@post, @event, @leaders) do %> <%= if @post.name || leader?(@post, @event, @leaders) do %>
<div class="inline-flex items-center"> <div class="inline-flex items-center">
<%= if @post.name do %> <%= if @post.name do %>
<p class="text-black text-xs font-semibold mb-2 mr-2"><%= @post.name %></p> <p class="text-black text-xs font-semibold mb-2 mr-2">{@post.name}</p>
<% end %> <% end %>
<%= if leader?(@post, @event, @leaders) do %> <%= if leader?(@post, @event, @leaders) do %>
<div class="inline-flex items-center space-x-1 justify-center px-3 py-0.5 rounded-full text-xs font-medium bg-supporting-yellow-100 text-supporting-yellow-800 mb-2"> <div class="inline-flex items-center space-x-1 justify-center px-3 py-0.5 rounded-full text-xs font-medium bg-supporting-yellow-100 text-supporting-yellow-800 mb-2">
<img src="/images/icons/star.svg" class="h-3" /> <img src="/images/icons/star.svg" class="h-3" />
<span><%= gettext("Host") %></span> <span>{gettext("Host")}</span>
</div> </div>
<% end %> <% end %>
</div> </div>
@@ -139,13 +139,13 @@ defmodule ClaperWeb.EventLive.PostComponent do
class="hidden absolute right-4 top-7 bg-gray-900 rounded-lg px-5 py-2" class="hidden absolute right-4 top-7 bg-gray-900 rounded-lg px-5 py-2"
> >
<span class="text-red-500"> <span class="text-red-500">
<%= link(gettext("Delete"), {link(gettext("Delete"),
to: "#", to: "#",
phx_click: "delete", phx_click: "delete",
phx_value_id: @post.uuid, phx_value_id: @post.uuid,
phx_value_event_id: @event.uuid, phx_value_event_id: @event.uuid,
data: [confirm: gettext("Are you sure?")] data: [confirm: gettext("Are you sure?")]
) %> )}
</span> </span>
</div> </div>
<% end %> <% end %>
@@ -172,11 +172,11 @@ defmodule ClaperWeb.EventLive.PostComponent do
> >
</path> </path>
</svg> </svg>
<span><%= gettext("Pinned") %></span> <span>{gettext("Pinned")}</span>
</div> </div>
<% end %> <% end %>
<p><%= ClaperWeb.Helpers.format_body(@post.body) %></p> <p>{ClaperWeb.Helpers.format_body(@post.body)}</p>
<div class="flex h-6 text-xs float-right space-x-2"> <div class="flex h-6 text-xs float-right space-x-2">
<%= if @reaction_enabled do %> <%= if @reaction_enabled do %>
@@ -189,7 +189,7 @@ defmodule ClaperWeb.EventLive.PostComponent do
> >
<img src="/images/icons/thumb.svg" class="h-4" /> <img src="/images/icons/thumb.svg" class="h-4" />
<%= if @post.like_count > 0 do %> <%= if @post.like_count > 0 do %>
<span class="ml-1"><%= @post.like_count %></span> <span class="ml-1">{@post.like_count}</span>
<% end %> <% end %>
</button> </button>
<% else %> <% else %>
@@ -203,7 +203,7 @@ defmodule ClaperWeb.EventLive.PostComponent do
<img src="/images/icons/thumb.svg" class="h-4" /> <img src="/images/icons/thumb.svg" class="h-4" />
</span> </span>
<%= if @post.like_count > 0 do %> <%= if @post.like_count > 0 do %>
<span class="ml-1"><%= @post.like_count %></span> <span class="ml-1">{@post.like_count}</span>
<% end %> <% end %>
</button> </button>
<% end %> <% end %>
@@ -216,7 +216,7 @@ defmodule ClaperWeb.EventLive.PostComponent do
> >
<img src="/images/icons/heart.svg" class="h-4" /> <img src="/images/icons/heart.svg" class="h-4" />
<%= if @post.love_count > 0 do %> <%= if @post.love_count > 0 do %>
<span class="ml-1"><%= @post.love_count %></span> <span class="ml-1">{@post.love_count}</span>
<% end %> <% end %>
</button> </button>
<% else %> <% else %>
@@ -228,7 +228,7 @@ defmodule ClaperWeb.EventLive.PostComponent do
> >
<img src="/images/icons/heart.svg" class="h-4" /> <img src="/images/icons/heart.svg" class="h-4" />
<%= if @post.love_count > 0 do %> <%= if @post.love_count > 0 do %>
<span class="ml-1"><%= @post.love_count %></span> <span class="ml-1">{@post.love_count}</span>
<% end %> <% end %>
</button> </button>
<% end %> <% end %>
@@ -241,7 +241,7 @@ defmodule ClaperWeb.EventLive.PostComponent do
> >
<img src="/images/icons/laugh.svg" class="h-4" /> <img src="/images/icons/laugh.svg" class="h-4" />
<%= if @post.lol_count > 0 do %> <%= if @post.lol_count > 0 do %>
<span class="ml-1"><%= @post.lol_count %></span> <span class="ml-1">{@post.lol_count}</span>
<% end %> <% end %>
</button> </button>
<% else %> <% else %>
@@ -253,7 +253,7 @@ defmodule ClaperWeb.EventLive.PostComponent do
> >
<img src="/images/icons/laugh.svg" class="h-4" /> <img src="/images/icons/laugh.svg" class="h-4" />
<%= if @post.lol_count > 0 do %> <%= if @post.lol_count > 0 do %>
<span class="ml-1"><%= @post.lol_count %></span> <span class="ml-1">{@post.lol_count}</span>
<% end %> <% end %>
</button> </button>
<% end %> <% end %>

View File

@@ -23,7 +23,7 @@
> >
<div class="h-full bg-white text-black text-center flex flex-col items-center justify-center"> <div class="h-full bg-white text-black text-center flex flex-col items-center justify-center">
<span class="font-semibold mb-10 sm:text-3xl md:text-4xl lg:text-6xl"> <span class="font-semibold mb-10 sm:text-3xl md:text-4xl lg:text-6xl">
<%= gettext("Scan to interact in real-time") %> {gettext("Scan to interact in real-time")}
</span> </span>
<div <div
phx-hook="QRCode" phx-hook="QRCode"
@@ -35,10 +35,10 @@
> >
</div> </div>
<span class="font-semibold mb-10 sm:text-3xl md:text-4xl lg:text-6xl"> <span class="font-semibold mb-10 sm:text-3xl md:text-4xl lg:text-6xl">
<%= gettext("Or go to %{url} and use the code:", url: @host) %> {gettext("Or go to %{url} and use the code:", url: @host)}
</span> </span>
<span class="font-semibold mb-10 sm:text-5xl md:text-6xl lg:text-8xl"> <span class="font-semibold mb-10 sm:text-5xl md:text-6xl lg:text-8xl">
#<%= String.upcase(@event.code) %> #{String.upcase(@event.code)}
</span> </span>
</div> </div>
</div> </div>
@@ -50,7 +50,7 @@
> >
<div class="w-full md:w-1/2 mx-auto h-full"> <div class="w-full md:w-1/2 mx-auto h-full">
<p class={"#{if @iframe, do: "text-xl mb-12", else: "text-5xl mb-24"} text-white font-bold text-center"}> <p class={"#{if @iframe, do: "text-xl mb-12", else: "text-5xl mb-24"} text-white font-bold text-center"}>
<%= @current_poll.title %> {@current_poll.title}
</p> </p>
<div class={"#{if @iframe, do: "space-y-5", else: "space-y-8"} flex flex-col"}> <div class={"#{if @iframe, do: "space-y-5", else: "space-y-8"} flex flex-col"}>
@@ -64,11 +64,11 @@
</div> </div>
<div class="flex space-x-3 z-10 text-left"> <div class="flex space-x-3 z-10 text-left">
<span class={"#{if @iframe, do: "text-base", else: "text-2xl"} flex-1 font-bold pr-2"}> <span class={"#{if @iframe, do: "text-base", else: "text-2xl"} flex-1 font-bold pr-2"}>
<%= opt.content %> {opt.content}
</span> </span>
</div> </div>
<span class={"#{if @iframe, do: "text-base", else: "text-2xl"} z-10 font-bold"}> <span class={"#{if @iframe, do: "text-base", else: "text-2xl"} z-10 font-bold"}>
<%= opt.percentage %>% (<%= opt.vote_count %>) {opt.percentage}% ({opt.vote_count})
</span> </span>
</div> </div>
<% end %> <% end %>
@@ -107,10 +107,10 @@
<div class="px-4 pb-2 pt-3 rounded-b-lg rounded-tr-lg bg-white shadow-md text-black break-word mt-4"> <div class="px-4 pb-2 pt-3 rounded-b-lg rounded-tr-lg bg-white shadow-md text-black break-word mt-4">
<%= if post.name do %> <%= if post.name do %>
<p class={"#{if @iframe, do: "text-base", else: "text-lg"} text-gray-400 font-semibold mb-2 mr-2"}> <p class={"#{if @iframe, do: "text-base", else: "text-lg"} text-gray-400 font-semibold mb-2 mr-2"}>
<%= post.name %> {post.name}
</p> </p>
<% end %> <% end %>
<p class={"#{if @iframe, do: "text-xl", else: "text-3xl"}"}><%= post.body %></p> <p class={"#{if @iframe, do: "text-xl", else: "text-3xl"}"}>{post.body}</p>
<%= if post.like_count > 0 || post.love_count > 0 || post.lol_count > 0 do %> <%= if post.like_count > 0 || post.love_count > 0 || post.lol_count > 0 do %>
<div class="flex h-6 space-x-2 text-lg text-gray-500 pb-3 items-center mt-5"> <div class="flex h-6 space-x-2 text-lg text-gray-500 pb-3 items-center mt-5">
@@ -120,7 +120,7 @@
src="/images/icons/thumb.svg" src="/images/icons/thumb.svg"
class={"#{if @iframe, do: "h-4", else: "h-7"}"} class={"#{if @iframe, do: "h-4", else: "h-7"}"}
/> />
<span class="ml-1"><%= post.like_count %></span> <span class="ml-1">{post.like_count}</span>
<% end %> <% end %>
</div> </div>
<div class="flex items-center"> <div class="flex items-center">
@@ -129,7 +129,7 @@
src="/images/icons/heart.svg" src="/images/icons/heart.svg"
class={"#{if @iframe, do: "h-4", else: "h-7"}"} class={"#{if @iframe, do: "h-4", else: "h-7"}"}
/> />
<span class="ml-1"><%= post.love_count %></span> <span class="ml-1">{post.love_count}</span>
<% end %> <% end %>
</div> </div>
<div class="flex items-center"> <div class="flex items-center">
@@ -138,7 +138,7 @@
src="/images/icons/laugh.svg" src="/images/icons/laugh.svg"
class={"#{if @iframe, do: "h-4", else: "h-7"}"} class={"#{if @iframe, do: "h-4", else: "h-7"}"}
/> />
<span class="ml-1"><%= post.lol_count %></span> <span class="ml-1">{post.lol_count}</span>
<% end %> <% end %>
</div> </div>
</div> </div>
@@ -154,10 +154,10 @@
<div class="px-4 pb-2 pt-3 rounded-b-lg rounded-tr-lg bg-white shadow-md text-black break-word mt-4"> <div class="px-4 pb-2 pt-3 rounded-b-lg rounded-tr-lg bg-white shadow-md text-black break-word mt-4">
<%= if post.name do %> <%= if post.name do %>
<p class={"#{if @iframe, do: "text-base", else: "text-lg"} text-gray-400 font-semibold mb-2 mr-2"}> <p class={"#{if @iframe, do: "text-base", else: "text-lg"} text-gray-400 font-semibold mb-2 mr-2"}>
<%= post.name %> {post.name}
</p> </p>
<% end %> <% end %>
<p class={"#{if @iframe, do: "text-xl", else: "text-3xl"}"}><%= post.body %></p> <p class={"#{if @iframe, do: "text-xl", else: "text-3xl"}"}>{post.body}</p>
<%= if post.like_count > 0 || post.love_count > 0 || post.lol_count > 0 do %> <%= if post.like_count > 0 || post.love_count > 0 || post.lol_count > 0 do %>
<div class="flex h-6 space-x-2 text-lg text-gray-500 pb-3 items-center mt-5"> <div class="flex h-6 space-x-2 text-lg text-gray-500 pb-3 items-center mt-5">
@@ -167,7 +167,7 @@
src="/images/icons/thumb.svg" src="/images/icons/thumb.svg"
class={"#{if @iframe, do: "h-4", else: "h-7"}"} class={"#{if @iframe, do: "h-4", else: "h-7"}"}
/> />
<span class="ml-1"><%= post.like_count %></span> <span class="ml-1">{post.like_count}</span>
<% end %> <% end %>
</div> </div>
<div class="flex items-center"> <div class="flex items-center">
@@ -176,7 +176,7 @@
src="/images/icons/heart.svg" src="/images/icons/heart.svg"
class={"#{if @iframe, do: "h-4", else: "h-7"}"} class={"#{if @iframe, do: "h-4", else: "h-7"}"}
/> />
<span class="ml-1"><%= post.love_count %></span> <span class="ml-1">{post.love_count}</span>
<% end %> <% end %>
</div> </div>
<div class="flex items-center"> <div class="flex items-center">
@@ -185,7 +185,7 @@
src="/images/icons/laugh.svg" src="/images/icons/laugh.svg"
class={"#{if @iframe, do: "h-4", else: "h-7"}"} class={"#{if @iframe, do: "h-4", else: "h-7"}"}
/> />
<span class="ml-1"><%= post.lol_count %></span> <span class="ml-1">{post.lol_count}</span>
<% end %> <% end %>
</div> </div>
</div> </div>
@@ -244,7 +244,7 @@
<div class="inline-flex justify-between items-center text-white text-2xl"> <div class="inline-flex justify-between items-center text-white text-2xl">
<img src="/images/icons/online-users.svg" class="h-12 mr-2" /> <img src="/images/icons/online-users.svg" class="h-12 mr-2" />
<span id="counter" phx-hook="UpdateAttendees" phx-update="ignore"> <span id="counter" phx-hook="UpdateAttendees" phx-update="ignore">
<%= @attendees_nb %> {@attendees_nb}
</span> </span>
</div> </div>
</div> </div>

View File

@@ -38,7 +38,7 @@ defmodule ClaperWeb.EventLive.QuizComponent do
d="M9 12.75 11.25 15 15 9.75M21 12a9 9 0 1 1-18 0 9 9 0 0 1 18 0Z" d="M9 12.75 11.25 15 15 9.75M21 12a9 9 0 1 1-18 0 9 9 0 0 1 18 0Z"
/> />
</svg> </svg>
<span class="font-bold"><%= gettext("See current quiz") %></span> <span class="font-bold">{gettext("See current quiz")}</span>
</div> </div>
</div> </div>
</div> </div>
@@ -57,13 +57,13 @@ defmodule ClaperWeb.EventLive.QuizComponent do
</svg> </svg>
</div> </div>
<p class="text-sm text-gray-400 my-1"><%= gettext("Current quiz") %></p> <p class="text-sm text-gray-400 my-1">{gettext("Current quiz")}</p>
<%= if is_nil(@current_question) do %> <%= if is_nil(@current_question) do %>
<p class="text-white text-xl font-semibold mb-2"><%= @quiz.title %></p> <p class="text-white text-xl font-semibold mb-2">{@quiz.title}</p>
<% else %> <% else %>
<p class="text-white text-xl font-semibold mb-2"><%= @current_question.content %></p> <p class="text-white text-xl font-semibold mb-2">{@current_question.content}</p>
<p class="text-gray-400 text-sm mb-4"> <p class="text-gray-400 text-sm mb-4">
<%= @current_quiz_question_idx + 1 %>/<%= length(@quiz.quiz_questions) %> {@current_quiz_question_idx + 1}/{length(@quiz.quiz_questions)}
</p> </p>
<% end %> <% end %>
</div> </div>
@@ -81,10 +81,10 @@ defmodule ClaperWeb.EventLive.QuizComponent do
<div class="h-5 w-5 mt-0.5 rounded-md point-select border-2 border-white"> <div class="h-5 w-5 mt-0.5 rounded-md point-select border-2 border-white">
</div> </div>
<% end %> <% end %>
<span class="flex-1 pr-2"><%= opt.content %></span> <span class="flex-1 pr-2">{opt.content}</span>
</div> </div>
<span class="text-sm"><%= opt.percentage %>% (<%= opt.response_count %>)</span> <span class="text-sm">{opt.percentage}% ({opt.response_count})</span>
</div> </div>
</div> </div>
<% else %> <% else %>
@@ -102,7 +102,7 @@ defmodule ClaperWeb.EventLive.QuizComponent do
<span class="h-5 w-5 mt-0.5 rounded-md point-select border-2 border-white"> <span class="h-5 w-5 mt-0.5 rounded-md point-select border-2 border-white">
</span> </span>
<% end %> <% end %>
<span class="flex-1 pr-2"><%= opt.content %></span> <span class="flex-1 pr-2">{opt.content}</span>
</div> </div>
</button> </button>
<% end %> <% end %>
@@ -110,18 +110,18 @@ defmodule ClaperWeb.EventLive.QuizComponent do
<% else %> <% else %>
<div class="text-gray-400 flex flex-col items-center justify-center font-semibold text-lg mt-4"> <div class="text-gray-400 flex flex-col items-center justify-center font-semibold text-lg mt-4">
<%= if @quiz.show_results do %> <%= if @quiz.show_results do %>
<p><%= gettext("Your score") %></p> <p>{gettext("Your score")}</p>
<p class="text-6xl font-bold mt-2"> <p class="text-6xl font-bold mt-2">
<%= elem(@quiz_score, 0) %>/<%= elem(@quiz_score, 1) %> {elem(@quiz_score, 0)}/{elem(@quiz_score, 1)}
</p> </p>
<button <button
phx-click="show-quiz-results" phx-click="show-quiz-results"
class="mt-7 px-3 py-2 text-white font-medium bg-primary-400 hover:bg-primary-500 rounded-md mt-3 mb-4" class="mt-7 px-3 py-2 text-white font-medium bg-primary-400 hover:bg-primary-500 rounded-md mt-3 mb-4"
> >
<%= gettext("Show results") %> {gettext("Show results")}
</button> </button>
<% else %> <% else %>
<p><%= gettext("Waiting for results...") %></p> <p>{gettext("Waiting for results...")}</p>
<svg <svg
class="w-32 h-32 mt-4" class="w-32 h-32 mt-4"
viewBox="0 0 360 360" viewBox="0 0 360 360"
@@ -148,7 +148,7 @@ defmodule ClaperWeb.EventLive.QuizComponent do
<div :if={not @is_submitted} class="flex justify-between items-baseline w-full h-12 mt-5"> <div :if={not @is_submitted} class="flex justify-between items-baseline w-full h-12 mt-5">
<%= if @current_quiz_question_idx > 0 do %> <%= if @current_quiz_question_idx > 0 do %>
<button phx-click="prev-question" class="px-3 py-2 text-white font-medium"> <button phx-click="prev-question" class="px-3 py-2 text-white font-medium">
<%= gettext("Back") %> {gettext("Back")}
</button> </button>
<% end %> <% end %>
@@ -158,21 +158,21 @@ defmodule ClaperWeb.EventLive.QuizComponent do
class={"px-3 py-2 text-white font-medium rounded-md h-full #{if @has_selection, do: "bg-primary-400 hover:bg-primary-500", else: "bg-gray-500 cursor-not-allowed"}"} class={"px-3 py-2 text-white font-medium rounded-md h-full #{if @has_selection, do: "bg-primary-400 hover:bg-primary-500", else: "bg-gray-500 cursor-not-allowed"}"}
disabled={not @has_selection} disabled={not @has_selection}
> >
<%= gettext("Next") %> {gettext("Next")}
</button> </button>
<% else %> <% else %>
<%= if is_nil(@current_user) && !@quiz.allow_anonymous do %> <%= if is_nil(@current_user) && !@quiz.allow_anonymous do %>
<div class="w-full flex items-center justify-between"> <div class="w-full flex items-center justify-between">
<div class="text-white text-sm font-semibold"> <div class="text-white text-sm font-semibold">
<%= gettext("Please sign in to submit your answers") %> {gettext("Please sign in to submit your answers")}
</div> </div>
<%= link( {link(
gettext("Sign in"), gettext("Sign in"),
target: "_blank", target: "_blank",
to: ~p"/users/log_in", to: ~p"/users/log_in",
class: class:
"inline px-3 py-2 text-white font-medium rounded-md h-full bg-primary-400 hover:bg-primary-500" "inline px-3 py-2 text-white font-medium rounded-md h-full bg-primary-400 hover:bg-primary-500"
) %> )}
</div> </div>
<% else %> <% else %>
<button <button
@@ -180,7 +180,7 @@ defmodule ClaperWeb.EventLive.QuizComponent do
class={"px-3 py-2 text-white font-medium rounded-md h-full #{if @has_selection, do: "bg-primary-400 hover:bg-primary-500", else: "bg-gray-500 cursor-not-allowed"}"} class={"px-3 py-2 text-white font-medium rounded-md h-full #{if @has_selection, do: "bg-primary-400 hover:bg-primary-500", else: "bg-gray-500 cursor-not-allowed"}"}
disabled={not @has_selection} disabled={not @has_selection}
> >
<%= gettext("Submit") %> {gettext("Submit")}
</button> </button>
<% end %> <% end %>
<% end %> <% end %>
@@ -195,7 +195,7 @@ defmodule ClaperWeb.EventLive.QuizComponent do
> >
<%= if (@current_quiz_question_idx > 0 && @current_quiz_question_idx <= length(@quiz.quiz_questions) - 1) do %> <%= if (@current_quiz_question_idx > 0 && @current_quiz_question_idx <= length(@quiz.quiz_questions) - 1) do %>
<button phx-click="prev-question" class="px-3 py-2 text-white font-medium"> <button phx-click="prev-question" class="px-3 py-2 text-white font-medium">
<%= gettext("Back") %> {gettext("Back")}
</button> </button>
<% else %> <% else %>
<div class="w-1/2"></div> <div class="w-1/2"></div>
@@ -206,7 +206,7 @@ defmodule ClaperWeb.EventLive.QuizComponent do
phx-click="next-question" phx-click="next-question"
class="px-3 py-2 text-white font-medium bg-primary-400 hover:bg-primary-500 rounded-md h-full" class="px-3 py-2 text-white font-medium bg-primary-400 hover:bg-primary-500 rounded-md h-full"
> >
<%= gettext("Next") %> {gettext("Next")}
</button> </button>
</div> </div>
</div> </div>

View File

@@ -15,7 +15,7 @@
<div> <div>
<img src="/images/logo-large-black.svg" class="h-16 my-3" /> <img src="/images/logo-large-black.svg" class="h-16 my-3" />
<span class="font-bold text-xl"><%= @event.name %></span> <span class="font-bold text-xl">{@event.name}</span>
</div> </div>
<a <a
@@ -23,7 +23,7 @@
href={~p"/?disconnected_from=#{@event.uuid}"} href={~p"/?disconnected_from=#{@event.uuid}"}
> >
<img src="/images/icons/exit-outline.svg" class="h-5 mr-3" /> <img src="/images/icons/exit-outline.svg" class="h-5 mr-3" />
<span><%= gettext("Leave") %></span> <span>{gettext("Leave")}</span>
</a> </a>
</div> </div>
</div> </div>
@@ -35,7 +35,7 @@
> >
<div id="banner" class="hidden w-full bg-gray-800 text-center" phx-hook="EmbeddedBanner"> <div id="banner" class="hidden w-full bg-gray-800 text-center" phx-hook="EmbeddedBanner">
<a href="https://claper.co" target="_blank" class="text-xs text-white py-3 w-full"> <a href="https://claper.co" target="_blank" class="text-xs text-white py-3 w-full">
<%= gettext("Create your next presentation with") %> {gettext("Create your next presentation with")}
<span class="underline">Claper</span> <span class="underline">Claper</span>
</a> </a>
</div> </div>
@@ -45,13 +45,13 @@
class="bg-black rounded-full text-sm px-3 py-1 bg-gradient-to-tl from-primary-500 to-secondary-500 bg-size-200 bg-pos-0 text-white uppercase flex items-center" class="bg-black rounded-full text-sm px-3 py-1 bg-gradient-to-tl from-primary-500 to-secondary-500 bg-size-200 bg-pos-0 text-white uppercase flex items-center"
> >
<img src="/images/icons/menu-outline.svg" class="h-6" /> <img src="/images/icons/menu-outline.svg" class="h-6" />
<span class="ml-1">#<%= @event.code %></span> <span class="ml-1">#{@event.code}</span>
</button> </button>
<div class="inline-flex justify-between items-center text-white text-sm"> <div class="inline-flex justify-between items-center text-white text-sm">
<img src="/images/icons/online-users.svg" class="h-6 mr-2" /> <img src="/images/icons/online-users.svg" class="h-6 mr-2" />
<span id="counter" phx-update="ignore" phx-hook="UpdateAttendees"> <span id="counter" phx-update="ignore" phx-hook="UpdateAttendees">
<%= @attendees_nb %> {@attendees_nb}
</span> </span>
</div> </div>
</div> </div>
@@ -162,7 +162,7 @@
<%= if @post_count == 0 && @state.chat_enabled do %> <%= if @post_count == 0 && @state.chat_enabled do %>
<div class="text-2xl text-white block fixed bottom-32 left-0 w-full lg:w-1/3 lg:left-1/2 lg:transform lg:-translate-x-1/2 text-center opacity-30"> <div class="text-2xl text-white block fixed bottom-32 left-0 w-full lg:w-1/3 lg:left-1/2 lg:transform lg:-translate-x-1/2 text-center opacity-30">
<span><%= gettext("Be the first to react !") %></span> <span>{gettext("Be the first to react !")}</span>
<img src="/images/icons/arrow-white.svg" class="h-24 rotate-180 ml-12 mt-8" /> <img src="/images/icons/arrow-white.svg" class="h-24 rotate-180 ml-12 mt-8" />
</div> </div>
<% end %> <% end %>
@@ -205,7 +205,7 @@
<path d="M17 17m-3 0a3 3 0 1 0 6 0a3 3 0 1 0 -6 0"></path> <path d="M17 17m-3 0a3 3 0 1 0 6 0a3 3 0 1 0 -6 0"></path>
<path d="M10 17h4"></path> <path d="M10 17h4"></path>
</svg> </svg>
<span><%= gettext("Anonymous") %></span> <span>{gettext("Anonymous")}</span>
</button> </button>
<% else %> <% else %>
<button class="w-full bg-gray-900 opacity-50 text-left text-white px-3 py-2 rounded-md flex space-x-2 items-center cursor-default"> <button class="w-full bg-gray-900 opacity-50 text-left text-white px-3 py-2 rounded-md flex space-x-2 items-center cursor-default">
@@ -226,7 +226,7 @@
<path d="M17 17m-3 0a3 3 0 1 0 6 0a3 3 0 1 0 -6 0"></path> <path d="M17 17m-3 0a3 3 0 1 0 6 0a3 3 0 1 0 -6 0"></path>
<path d="M10 17h4"></path> <path d="M10 17h4"></path>
</svg> </svg>
<span><%= gettext("Anonymous") %> (<%= gettext("disabled") %>)</span> <span>{gettext("Anonymous")} ({gettext("disabled")})</span>
</button> </button>
<% end %> <% end %>
@@ -246,13 +246,13 @@
<path d="M5.433 13.917l1.262-3.155A4 4 0 017.58 9.42l6.92-6.918a2.121 2.121 0 013 3l-6.92 6.918c-.383.383-.84.685-1.343.886l-3.154 1.262a.5.5 0 01-.65-.65z" /> <path d="M5.433 13.917l1.262-3.155A4 4 0 017.58 9.42l6.92-6.918a2.121 2.121 0 013 3l-6.92 6.918c-.383.383-.84.685-1.343.886l-3.154 1.262a.5.5 0 01-.65-.65z" />
<path d="M3.5 5.75c0-.69.56-1.25 1.25-1.25H10A.75.75 0 0010 3H4.75A2.75 2.75 0 002 5.75v9.5A2.75 2.75 0 004.75 18h9.5A2.75 2.75 0 0017 15.25V10a.75.75 0 00-1.5 0v5.25c0 .69-.56 1.25-1.25 1.25h-9.5c-.69 0-1.25-.56-1.25-1.25v-9.5z" /> <path d="M3.5 5.75c0-.69.56-1.25 1.25-1.25H10A.75.75 0 0010 3H4.75A2.75 2.75 0 002 5.75v9.5A2.75 2.75 0 004.75 18h9.5A2.75 2.75 0 0017 15.25V10a.75.75 0 00-1.5 0v5.25c0 .69-.56 1.25-1.25 1.25h-9.5c-.69 0-1.25-.56-1.25-1.25v-9.5z" />
</svg> </svg>
<span><%= gettext("Use your name") %></span> <span>{gettext("Use your name")}</span>
</button> </button>
<button <button
phx-click={toggle_nickname_popup()} phx-click={toggle_nickname_popup()}
class="w-full text-left text-primary-500 text-sm px-3 py-0 rounded-md" class="w-full text-left text-primary-500 text-sm px-3 py-0 rounded-md"
> >
<%= gettext("Close") %> {gettext("Close")}
</button> </button>
</div> </div>
@@ -275,15 +275,15 @@
backdrop-filter: blur(11.5px); backdrop-filter: blur(11.5px);
-webkit-backdrop-filter: blur(11.5px);" -webkit-backdrop-filter: blur(11.5px);"
> >
<%= text_input(f, :name, {text_input(f, :name,
class: class:
"bg-transparent outline-none w-full text-white h-10 placeholder-white resize-none pr-20 leading-4 overflow-y-hidden focus:overflow-y-auto", "bg-transparent outline-none w-full text-white h-10 placeholder-white resize-none pr-20 leading-4 overflow-y-hidden focus:overflow-y-auto",
placeholder: gettext("Enter your name") placeholder: gettext("Enter your name")
) %> )}
<p class="font-semibold text-sm"> <p class="font-semibold text-sm">
<%= error_tag(f, :name) %> {error_tag(f, :name)}
</p> </p>
<%= submit(gettext("Join"), class: "absolute right-5 top-2 p-2 bg-white rounded-md") %> {submit(gettext("Join"), class: "absolute right-5 top-2 p-2 bg-white rounded-md")}
</div> </div>
</.form> </.form>
<% else %> <% else %>
@@ -326,9 +326,9 @@
/> />
</svg> </svg>
<%= if @nickname && @nickname == "" do %> <%= if @nickname && @nickname == "" do %>
<span><%= gettext("Anonymous") %></span> <span>{gettext("Anonymous")}</span>
<% else %> <% else %>
<span><%= @nickname %></span> <span>{@nickname}</span>
<% end %> <% end %>
</a> </a>
</div> </div>
@@ -338,15 +338,15 @@
</button> </button>
<div class="flex space-x-2 items-center"> <div class="flex space-x-2 items-center">
<%= textarea(f, :body, {textarea(f, :body,
id: "postFormTA", id: "postFormTA",
class: class:
"bg-transparent outline-none w-full text-white h-10 placeholder-white pt-3 resize-none pr-20 leading-4 overflow-y-hidden focus:overflow-y-auto", "bg-transparent outline-none w-full text-white h-10 placeholder-white pt-3 resize-none pr-20 leading-4 overflow-y-hidden focus:overflow-y-auto",
placeholder: gettext("Ask, comment...") placeholder: gettext("Ask, comment...")
) %> )}
</div> </div>
</div> </div>
<%= submit("Save", phx_disable_with: "Saving...", id: "hiddenSubmit", class: "hidden") %> {submit("Save", phx_disable_with: "Saving...", id: "hiddenSubmit", class: "hidden")}
</.form> </.form>
<% end %> <% end %>
<% else %> <% else %>
@@ -362,7 +362,7 @@
> >
<div class="flex space-x-2 items-center"> <div class="flex space-x-2 items-center">
<div class="opacity-50 bg-transparent outline-none w-full text-white h-10 placeholder-white pt-3 resize-none pr-20 leading-4 overflow-y-hidden focus:overflow-y-auto"> <div class="opacity-50 bg-transparent outline-none w-full text-white h-10 placeholder-white pt-3 resize-none pr-20 leading-4 overflow-y-hidden focus:overflow-y-auto">
<%= gettext("Messages deactivated") %> {gettext("Messages deactivated")}
</div> </div>
</div> </div>
</div> </div>
@@ -420,7 +420,7 @@
<div class="flex bg-black h-screen"> <div class="flex bg-black h-screen">
<div class="flex items-center text-center lg:text-left justify-center lg:justify-start lg:px-12 w-full lg:w-1/2"> <div class="flex items-center text-center lg:text-left justify-center lg:justify-start lg:px-12 w-full lg:w-1/2">
<div class="w-full mx-12 lg:w-auto lg:mx-0"> <div class="w-full mx-12 lg:w-auto lg:mx-0">
<h1 class="py-5 text-5xl font-semibold text-white md:text-6xl"><%= @event.name %></h1> <h1 class="py-5 text-5xl font-semibold text-white md:text-6xl">{@event.name}</h1>
<h2 <h2
x-data={"{date: moment.utc('#{@event.started_at}').local().format('LLLL')}"} x-data={"{date: moment.utc('#{@event.started_at}').local().format('LLLL')}"}
@@ -432,27 +432,27 @@
<div class="text-white flex justify-between items-center mt-12"> <div class="text-white flex justify-between items-center mt-12">
<div class="flex flex-col items-center mr-10"> <div class="flex flex-col items-center mr-10">
<span class="text-5xl font-bold"> <span class="text-5xl font-bold">
<%= if @remaining_days < 10, do: "0" %><%= @remaining_days %> {if @remaining_days < 10, do: "0"}{@remaining_days}
</span> </span>
<span class="text-gray-400"><%= gettext("days") %></span> <span class="text-gray-400">{gettext("days")}</span>
</div> </div>
<div class="flex flex-col items-center mr-10"> <div class="flex flex-col items-center mr-10">
<span class="text-5xl font-bold"> <span class="text-5xl font-bold">
<%= if @remaining_hours < 10, do: "0" %><%= @remaining_hours %> {if @remaining_hours < 10, do: "0"}{@remaining_hours}
</span> </span>
<span class="text-gray-400"><%= gettext("hours") %></span> <span class="text-gray-400">{gettext("hours")}</span>
</div> </div>
<div class="flex flex-col items-center mr-10"> <div class="flex flex-col items-center mr-10">
<span class="text-5xl font-bold"> <span class="text-5xl font-bold">
<%= if @remaining_minutes < 10, do: "0" %><%= @remaining_minutes %> {if @remaining_minutes < 10, do: "0"}{@remaining_minutes}
</span> </span>
<span class="text-gray-400"><%= gettext("minutes") %></span> <span class="text-gray-400">{gettext("minutes")}</span>
</div> </div>
<div class="flex flex-col items-center"> <div class="flex flex-col items-center">
<span class="text-5xl font-bold"> <span class="text-5xl font-bold">
<%= if @remaining_seconds < 10, do: "0" %><%= @remaining_seconds %> {if @remaining_seconds < 10, do: "0"}{@remaining_seconds}
</span> </span>
<span class="text-gray-400"><%= gettext("seconds") %></span> <span class="text-gray-400">{gettext("seconds")}</span>
</div> </div>
</div> </div>
</div> </div>
@@ -461,7 +461,7 @@
<div class="h-full object-cover bg-gradient-animate"> <div class="h-full object-cover bg-gradient-animate">
<div class="h-full bg-black text-white bg-opacity-50 text-center flex flex-col items-center justify-center"> <div class="h-full bg-black text-white bg-opacity-50 text-center flex flex-col items-center justify-center">
<span class="text-4xl font-semibold mb-10"> <span class="text-4xl font-semibold mb-10">
<%= gettext("Scan to interact in real-time") %> {gettext("Scan to interact in real-time")}
</span> </span>
<div <div
phx-hook="QRCode" phx-hook="QRCode"
@@ -470,8 +470,8 @@
class="rounded-lg mx-auto bg-black h-64 w-64 p-12 flex items-center justify-center mb-14" class="rounded-lg mx-auto bg-black h-64 w-64 p-12 flex items-center justify-center mb-14"
> >
</div> </div>
<span class="text-4xl font-semibold mb-10"><%= gettext("Or use the code:") %></span> <span class="text-4xl font-semibold mb-10">{gettext("Or use the code:")}</span>
<span class="text-5xl font-semibold mb-10">#<%= String.upcase(@event.code) %></span> <span class="text-5xl font-semibold mb-10">#{String.upcase(@event.code)}</span>
</div> </div>
</div> </div>
</div> </div>

View File

@@ -94,13 +94,13 @@
phx_disable_with="Loading..." phx_disable_with="Loading..."
class="w-full lg:w-auto px-6 text-white py-2 rounded-md tracking-wide font-bold focus:outline-none focus:shadow-outline bg-gradient-to-tl from-primary-500 to-secondary-500 bg-size-200 bg-pos-0 hover:bg-pos-100 transition-all duration-500" class="w-full lg:w-auto px-6 text-white py-2 rounded-md tracking-wide font-bold focus:outline-none focus:shadow-outline bg-gradient-to-tl from-primary-500 to-secondary-500 bg-size-200 bg-pos-0 hover:bg-pos-100 transition-all duration-500"
> >
<%= case @live_action do {case @live_action do
:new -> gettext("Create") :new -> gettext("Create")
:edit -> gettext("Save") :edit -> gettext("Save")
end %> end}
</button> </button>
<%= if @live_action == :edit do %> <%= if @live_action == :edit do %>
<%= link(gettext("Delete"), {link(gettext("Delete"),
to: "#", to: "#",
phx_click: "delete", phx_click: "delete",
phx_target: @myself, phx_target: @myself,
@@ -113,7 +113,7 @@
], ],
class: class:
"w-full lg:w-auto px-6 text-center text-white py-2 rounded-md tracking-wide font-bold focus:outline-none focus:shadow-outline bg-gradient-to-tl from-supporting-red-600 to-supporting-red-400 bg-size-200 bg-pos-0 hover:bg-pos-100 transition-all duration-500" "w-full lg:w-auto px-6 text-center text-white py-2 rounded-md tracking-wide font-bold focus:outline-none focus:shadow-outline bg-gradient-to-tl from-supporting-red-600 to-supporting-red-400 bg-size-200 bg-pos-0 hover:bg-pos-100 transition-all duration-500"
) %> )}
<% end %> <% end %>
</div> </div>
</.form> </.form>

View File

@@ -15,7 +15,6 @@ defmodule ClaperWeb.ModalComponent do
phx-window-keydown={hide_modal()} phx-window-keydown={hide_modal()}
phx-key="escape" phx-key="escape"
phx-target={@myself} phx-target={@myself}
phx-page-loading
> >
<div class="flex items-center justify-center pt-4 px-4 pb-20 text-center sm:block sm:p-4"> <div class="flex items-center justify-center pt-4 px-4 pb-20 text-center sm:block sm:p-4">
<div <div
@@ -36,16 +35,16 @@ defmodule ClaperWeb.ModalComponent do
</div> </div>
<h3 class="text-lg leading-6 font-medium text-gray-900"> <h3 class="text-lg leading-6 font-medium text-gray-900">
<%= @title %> {@title}
</h3> </h3>
<div class="mt-2 max-w-xl text-sm text-gray-500"> <div class="mt-2 max-w-xl text-sm text-gray-500">
<p> <p>
<%= @description %> {@description}
</p> </p>
</div> </div>
<div class="mt-2"> <div class="mt-2">
<p class="text-sm text-gray-500"> <p class="text-sm text-gray-500">
<%= render_slot(@inner_block) %> {render_slot(@inner_block)}
</p> </p>
</div> </div>
</div> </div>
@@ -64,6 +63,6 @@ defmodule ClaperWeb.ModalComponent do
def hide_modal(js \\ %JS{}) do def hide_modal(js \\ %JS{}) do
js js
|> JS.hide(to: "#modal", transition: "animate__animated animate__fadeOut", time: 300) |> JS.hide(to: "#modal", transition: "animate__animated animate__fadeOut", time: 300)
|> JS.push("hide", target: "#modal") |> JS.push("hide", target: "#modal", page_loading: true)
end end
end end

View File

@@ -79,21 +79,21 @@
</svg> </svg>
</button> </button>
<p class="text-gray-700 text-xl font-semibold"><%= gettext("Options") %></p> <p class="text-gray-700 text-xl font-semibold">{gettext("Options")}</p>
<div class="flex gap-x-2 mb-5 mt-3"> <div class="flex gap-x-2 mb-5 mt-3">
<%= checkbox(f, :show_results, class: "h-4 w-4") %> {checkbox(f, :show_results, class: "h-4 w-4")}
<%= label( {label(
f, f,
:show_results, :show_results,
gettext("Attendees can see the results on their device"), gettext("Attendees can see the results on their device"),
class: "text-sm font-medium" class: "text-sm font-medium"
) %> )}
</div> </div>
<div class="flex gap-x-2 mb-5"> <div class="flex gap-x-2 mb-5">
<%= checkbox(f, :multiple, class: "h-4 w-4") %> {checkbox(f, :multiple, class: "h-4 w-4")}
<%= label(f, :multiple, gettext("Multiple answers"), class: "text-sm font-medium") %> {label(f, :multiple, gettext("Multiple answers"), class: "text-sm font-medium")}
</div> </div>
<div class="flex space-x-3"> <div class="flex space-x-3">
@@ -102,13 +102,13 @@
phx_disable_with="Loading..." phx_disable_with="Loading..."
class="w-full lg:w-auto px-6 text-white py-2 rounded-md tracking-wide font-bold focus:outline-none focus:shadow-outline bg-gradient-to-tl from-primary-500 to-secondary-500 bg-size-200 bg-pos-0 hover:bg-pos-100 transition-all duration-500" class="w-full lg:w-auto px-6 text-white py-2 rounded-md tracking-wide font-bold focus:outline-none focus:shadow-outline bg-gradient-to-tl from-primary-500 to-secondary-500 bg-size-200 bg-pos-0 hover:bg-pos-100 transition-all duration-500"
> >
<%= case @live_action do {case @live_action do
:new -> gettext("Create") :new -> gettext("Create")
:edit -> gettext("Save") :edit -> gettext("Save")
end %> end}
</button> </button>
<%= if @live_action == :edit do %> <%= if @live_action == :edit do %>
<%= link(gettext("Delete"), {link(gettext("Delete"),
to: "#", to: "#",
phx_click: "delete", phx_click: "delete",
phx_target: @myself, phx_target: @myself,
@@ -121,7 +121,7 @@
], ],
class: class:
"w-full lg:w-auto px-6 text-center text-white py-2 rounded-md tracking-wide font-bold focus:outline-none focus:shadow-outline bg-gradient-to-tl from-supporting-red-600 to-supporting-red-400 bg-size-200 bg-pos-0 hover:bg-pos-100 transition-all duration-500" "w-full lg:w-auto px-6 text-center text-white py-2 rounded-md tracking-wide font-bold focus:outline-none focus:shadow-outline bg-gradient-to-tl from-supporting-red-600 to-supporting-red-400 bg-size-200 bg-pos-0 hover:bg-pos-100 transition-all duration-500"
) %> )}
<% end %> <% end %>
</div> </div>
</.form> </.form>

View File

@@ -33,7 +33,7 @@
if(i == 0, do: "rounded-tl-md") if(i == 0, do: "rounded-tl-md")
]} ]}
> >
<%= i + 1 %> {i + 1}
</button> </button>
<% end %> <% end %>
<%= if Ecto.Changeset.get_field(@changeset, :quiz_questions) |> length() < 10 do %> <%= if Ecto.Changeset.get_field(@changeset, :quiz_questions) |> length() < 10 do %>
@@ -43,7 +43,7 @@
class="text-xs px-3" class="text-xs px-3"
phx-target={@myself} phx-target={@myself}
> >
+ <%= gettext("Add Question") %> + {gettext("Add Question")}
</button> </button>
<% end %> <% end %>
</div> </div>
@@ -67,7 +67,7 @@
<%= if Keyword.has_key?(q.errors, :quiz_question_opts) do %> <%= if Keyword.has_key?(q.errors, :quiz_question_opts) do %>
<p class="text-supporting-red-500 text-sm my-2"> <p class="text-supporting-red-500 text-sm my-2">
<%= elem(Keyword.get(q.errors, :quiz_question_opts), 0) %> {elem(Keyword.get(q.errors, :quiz_question_opts), 0)}
</p> </p>
<% end %> <% end %>
@@ -87,7 +87,7 @@
</div> </div>
<div> <div>
<%= label(class: "mt-6 cursor-pointer flex items-center text-white rounded-md px-2.5 py-2.5 h-full #{if (o.source.changes[:is_correct] != nil && o.source.changes[:is_correct]) || (!Map.has_key?(o.source.changes, :is_correct) && o.source.data.is_correct), do: "bg-green-500", else: "bg-red-500"}") do %> <%= label(class: "mt-6 cursor-pointer flex items-center text-white rounded-md px-2.5 py-2.5 h-full #{if (o.source.changes[:is_correct] != nil && o.source.changes[:is_correct]) || (!Map.has_key?(o.source.changes, :is_correct) && o.source.data.is_correct), do: "bg-green-500", else: "bg-red-500"}") do %>
<%= checkbox(o, :is_correct, class: "hidden") %> {checkbox(o, :is_correct, class: "hidden")}
<%= if (o.source.changes[:is_correct] != nil && o.source.changes[:is_correct]) || (!Map.has_key?(o.source.changes, :is_correct) && o.source.data.is_correct) do %> <%= if (o.source.changes[:is_correct] != nil && o.source.changes[:is_correct]) || (!Map.has_key?(o.source.changes, :is_correct) && o.source.data.is_correct) do %>
<svg <svg
xmlns="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg"
@@ -126,7 +126,7 @@
<%= if o.index > 1 do %> <%= if o.index > 1 do %>
<label> <label>
<div class="cursor-pointer mt-1 text-xs font-semibold text-red-600"> <div class="cursor-pointer mt-1 text-xs font-semibold text-red-600">
<%= gettext("Delete") %> {gettext("Delete")}
</div> </div>
<input <input
type="checkbox" type="checkbox"
@@ -149,13 +149,13 @@
phx-target={@myself} phx-target={@myself}
class="mt-5 text-xs text-gray-700" class="mt-5 text-xs text-gray-700"
> >
+ <%= gettext("Add answer") %> + {gettext("Add answer")}
</button> </button>
<%= if Ecto.Changeset.get_field(@changeset, :quiz_questions) |> length() > 1 do %> <%= if Ecto.Changeset.get_field(@changeset, :quiz_questions) |> length() > 1 do %>
<label phx-click="remove_quiz_question" phx-target={@myself}> <label phx-click="remove_quiz_question" phx-target={@myself}>
<div class="cursor-pointer mt-4 w-full lg:w-auto px-6 text-center text-white py-2 rounded-md tracking-wide font-bold focus:outline-none focus:shadow-outline bg-gradient-to-tl from-supporting-red-600 to-supporting-red-400 bg-size-200 bg-pos-0 hover:bg-pos-100 transition-all duration-500"> <div class="cursor-pointer mt-4 w-full lg:w-auto px-6 text-center text-white py-2 rounded-md tracking-wide font-bold focus:outline-none focus:shadow-outline bg-gradient-to-tl from-supporting-red-600 to-supporting-red-400 bg-size-200 bg-pos-0 hover:bg-pos-100 transition-all duration-500">
<%= gettext("Remove question") %> {gettext("Remove question")}
</div> </div>
<input <input
type="checkbox" type="checkbox"
@@ -169,16 +169,16 @@
<% end %> <% end %>
</div> </div>
<p class="text-gray-700 text-xl font-semibold"><%= gettext("Options") %></p> <p class="text-gray-700 text-xl font-semibold">{gettext("Options")}</p>
<div class="flex gap-x-2 mb-5 mt-3"> <div class="flex gap-x-2 mb-5 mt-3">
<%= checkbox(f, :allow_anonymous, class: "h-4 w-4") %> {checkbox(f, :allow_anonymous, class: "h-4 w-4")}
<%= label( {label(
f, f,
:allow_anonymous, :allow_anonymous,
gettext("Allow anonymous submissions"), gettext("Allow anonymous submissions"),
class: "text-sm font-medium" class: "text-sm font-medium"
) %> )}
</div> </div>
<div class="flex justify-between items-center"> <div class="flex justify-between items-center">
@@ -189,14 +189,14 @@
disabled={!@changeset.valid?} disabled={!@changeset.valid?}
class="w-full lg:w-auto px-6 text-white py-2 rounded-md tracking-wide font-bold focus:outline-none focus:shadow-outline bg-gradient-to-tl from-primary-500 to-secondary-500 bg-size-200 bg-pos-0 hover:bg-pos-100 transition-all duration-500 disabled:opacity-50 disabled:cursor-not-allowed" class="w-full lg:w-auto px-6 text-white py-2 rounded-md tracking-wide font-bold focus:outline-none focus:shadow-outline bg-gradient-to-tl from-primary-500 to-secondary-500 bg-size-200 bg-pos-0 hover:bg-pos-100 transition-all duration-500 disabled:opacity-50 disabled:cursor-not-allowed"
> >
<%= case @live_action do {case @live_action do
:new -> gettext("Create") :new -> gettext("Create")
:edit -> gettext("Save") :edit -> gettext("Save")
end %> end}
</button> </button>
<%= if @live_action == :edit do %> <%= if @live_action == :edit do %>
<%= link(gettext("Delete"), {link(gettext("Delete"),
to: "#", to: "#",
phx_click: "delete", phx_click: "delete",
phx_target: @myself, phx_target: @myself,
@@ -209,13 +209,13 @@
], ],
class: class:
"w-full lg:w-auto px-6 text-center text-white py-2 rounded-md tracking-wide font-bold focus:outline-none focus:shadow-outline bg-gradient-to-tl from-supporting-red-600 to-supporting-red-400 bg-size-200 bg-pos-0 hover:bg-pos-100 transition-all duration-500" "w-full lg:w-auto px-6 text-center text-white py-2 rounded-md tracking-wide font-bold focus:outline-none focus:shadow-outline bg-gradient-to-tl from-supporting-red-600 to-supporting-red-400 bg-size-200 bg-pos-0 hover:bg-pos-100 transition-all duration-500"
) %> )}
<% end %> <% end %>
</div> </div>
<%= if @live_action == :edit do %> <%= if @live_action == :edit do %>
<%= link to: ~p"/export/quizzes/#{@quiz.id}/qti", class: "text-xs text-primary-500 font-medium flex items-center gap-1", method: :post, target: "_blank" do %> <%= link to: ~p"/export/quizzes/#{@quiz.id}/qti", class: "text-xs text-primary-500 font-medium flex items-center gap-1", method: :post, target: "_blank" do %>
<%= gettext("Export to QTI (XML)") %> {gettext("Export to QTI (XML)")}
<% end %> <% end %>
<% end %> <% end %>
</div> </div>

View File

@@ -2,7 +2,7 @@
<div class="border-b border-gray-200 py-4 flex flex-col sm:flex-row sm:items-center justify-between"> <div class="border-b border-gray-200 py-4 flex flex-col sm:flex-row sm:items-center justify-between">
<div class="flex-1 min-w-0"> <div class="flex-1 min-w-0">
<h1 class="text-2xl font-medium leading-6 text-gray-900 sm:truncate"> <h1 class="text-2xl font-medium leading-6 text-gray-900 sm:truncate">
<%= @page_title %> {@page_title}
</h1> </h1>
</div> </div>
<div class="flex mt-4 space-x-5 sm:mt-0 hidden"> <div class="flex mt-4 space-x-5 sm:mt-0 hidden">
@@ -12,7 +12,7 @@
<div class="mt-12 mb-3"> <div class="mt-12 mb-3">
<h3 class="text-lg leading-6 font-medium text-gray-900"> <h3 class="text-lg leading-6 font-medium text-gray-900">
<%= gettext("Event") %>: <%= @event.name %> (#<%= @event.code %>) {gettext("Event")}: {@event.name} (#{@event.code})
</h3> </h3>
<dl class="mt-5 grid grid-cols-1 gap-5 sm:grid-cols-2 lg:grid-cols-4"> <dl class="mt-5 grid grid-cols-1 gap-5 sm:grid-cols-2 lg:grid-cols-4">
@@ -35,14 +35,14 @@
</svg> </svg>
</div> </div>
<p class="ml-16 text-sm font-medium text-gray-500 truncate"> <p class="ml-16 text-sm font-medium text-gray-500 truncate">
<%= gettext("Audience peak") %> {gettext("Audience peak")}
</p> </p>
</dt> </dt>
<dd class="ml-16 flex items-baseline"> <dd class="ml-16 flex items-baseline">
<p class="text-2xl font-semibold text-gray-900"> <p class="text-2xl font-semibold text-gray-900">
<%= @event.audience_peak %> {@event.audience_peak}
<span class="text-xs text-gray-500 font-normal"> <span class="text-xs text-gray-500 font-normal">
<%= ngettext("attendee", "attendees", @event.audience_peak) %> {ngettext("attendee", "attendees", @event.audience_peak)}
</span> </span>
</p> </p>
</dd> </dd>
@@ -67,14 +67,14 @@
</svg> </svg>
</div> </div>
<p class="ml-16 text-sm font-medium text-gray-500 truncate"> <p class="ml-16 text-sm font-medium text-gray-500 truncate">
<%= gettext("Unique attendees") %> {gettext("Unique attendees")}
</p> </p>
</dt> </dt>
<dd class="ml-16 flex items-baseline"> <dd class="ml-16 flex items-baseline">
<p class="text-2xl font-semibold text-gray-900"> <p class="text-2xl font-semibold text-gray-900">
<%= @distinct_attendee_count %> {@distinct_attendee_count}
<span class="text-xs text-gray-500 font-normal"> <span class="text-xs text-gray-500 font-normal">
<%= ngettext("attendee", "attendees", @distinct_attendee_count) %> {ngettext("attendee", "attendees", @distinct_attendee_count)}
</span> </span>
</p> </p>
</dd> </dd>
@@ -99,18 +99,18 @@
</svg> </svg>
</div> </div>
<p class="ml-16 text-sm font-medium text-gray-500 truncate"> <p class="ml-16 text-sm font-medium text-gray-500 truncate">
<%= gettext("Messages") %> {gettext("Messages")}
</p> </p>
</dt> </dt>
<dd class="ml-16 flex items-baseline"> <dd class="ml-16 flex items-baseline">
<p class="text-2xl font-semibold text-gray-900"> <p class="text-2xl font-semibold text-gray-900">
<%= length(@posts) %> {length(@posts)}
<span class="text-xs text-gray-500 font-normal"> <span class="text-xs text-gray-500 font-normal">
<%= ngettext( {ngettext(
"from %{count} people", "from %{count} people",
"from %{count} peoples", "from %{count} peoples",
@distinct_poster_count @distinct_poster_count
) %> )}
</span> </span>
</p> </p>
</dd> </dd>
@@ -136,11 +136,11 @@
</svg> </svg>
</div> </div>
<p class="ml-16 text-sm font-medium truncate text-gray-500"> <p class="ml-16 text-sm font-medium truncate text-gray-500">
<%= gettext("Engagement rate") %> {gettext("Engagement rate")}
</p> </p>
</dt> </dt>
<dd class="ml-16 flex items-baseline flex items-center"> <dd class="ml-16 flex items-baseline flex items-center">
<p class="text-2xl font-semibold text-gray-900"><%= @engagement_rate %>%</p> <p class="text-2xl font-semibold text-gray-900">{@engagement_rate}%</p>
<a <a
href="https://docs.claper.co/usage/reports.html#metrics" href="https://docs.claper.co/usage/reports.html#metrics"
target="_blank" target="_blank"
@@ -167,7 +167,7 @@
<div class="pt-5 pb-5"> <div class="pt-5 pb-5">
<h3 class="text-lg leading-6 font-medium text-gray-900 mb-4"> <h3 class="text-lg leading-6 font-medium text-gray-900 mb-4">
<%= gettext("Interactions") %> {gettext("Interactions")}
</h3> </h3>
<div class="border-b border-gray-200"> <div class="border-b border-gray-200">
@@ -177,35 +177,35 @@
phx-value-tab="messages" phx-value-tab="messages"
class={"whitespace-nowrap py-4 px-1 border-b-2 font-medium text-sm #{if @current_tab == :messages, do: "border-primary-500 text-primary-600", else: "border-transparent text-gray-500 hover:text-gray-700 hover:border-gray-300"}"} class={"whitespace-nowrap py-4 px-1 border-b-2 font-medium text-sm #{if @current_tab == :messages, do: "border-primary-500 text-primary-600", else: "border-transparent text-gray-500 hover:text-gray-700 hover:border-gray-300"}"}
> >
<%= gettext("Messages") %> {gettext("Messages")}
</button> </button>
<button <button
phx-click="change_tab" phx-click="change_tab"
phx-value-tab="polls" phx-value-tab="polls"
class={"whitespace-nowrap py-4 px-1 border-b-2 font-medium text-sm #{if @current_tab == :polls, do: "border-primary-500 text-primary-600", else: "border-transparent text-gray-500 hover:text-gray-700 hover:border-gray-300"}"} class={"whitespace-nowrap py-4 px-1 border-b-2 font-medium text-sm #{if @current_tab == :polls, do: "border-primary-500 text-primary-600", else: "border-transparent text-gray-500 hover:text-gray-700 hover:border-gray-300"}"}
> >
<%= gettext("Polls") %> {gettext("Polls")}
</button> </button>
<button <button
phx-click="change_tab" phx-click="change_tab"
phx-value-tab="forms" phx-value-tab="forms"
class={"whitespace-nowrap py-4 px-1 border-b-2 font-medium text-sm #{if @current_tab == :forms, do: "border-primary-500 text-primary-600", else: "border-transparent text-gray-500 hover:text-gray-700 hover:border-gray-300"}"} class={"whitespace-nowrap py-4 px-1 border-b-2 font-medium text-sm #{if @current_tab == :forms, do: "border-primary-500 text-primary-600", else: "border-transparent text-gray-500 hover:text-gray-700 hover:border-gray-300"}"}
> >
<%= gettext("Forms") %> {gettext("Forms")}
</button> </button>
<button <button
phx-click="change_tab" phx-click="change_tab"
phx-value-tab="web_content" phx-value-tab="web_content"
class={"whitespace-nowrap py-4 px-1 border-b-2 font-medium text-sm #{if @current_tab == :web_content, do: "border-primary-500 text-primary-600", else: "border-transparent text-gray-500 hover:text-gray-700 hover:border-gray-300"}"} class={"whitespace-nowrap py-4 px-1 border-b-2 font-medium text-sm #{if @current_tab == :web_content, do: "border-primary-500 text-primary-600", else: "border-transparent text-gray-500 hover:text-gray-700 hover:border-gray-300"}"}
> >
<%= gettext("Web Content") %> {gettext("Web Content")}
</button> </button>
<button <button
phx-click="change_tab" phx-click="change_tab"
phx-value-tab="quizzes" phx-value-tab="quizzes"
class={"whitespace-nowrap py-4 px-1 border-b-2 font-medium text-sm #{if @current_tab == :quizzes, do: "border-primary-500 text-primary-600", else: "border-transparent text-gray-500 hover:text-gray-700 hover:border-gray-300"}"} class={"whitespace-nowrap py-4 px-1 border-b-2 font-medium text-sm #{if @current_tab == :quizzes, do: "border-primary-500 text-primary-600", else: "border-transparent text-gray-500 hover:text-gray-700 hover:border-gray-300"}"}
> >
<%= gettext("Quizzes") %> {gettext("Quizzes")}
</button> </button>
</nav> </nav>
</div> </div>
@@ -219,7 +219,7 @@
<% total = Enum.map(poll.poll_opts, fn e -> e.vote_count end) |> Enum.sum() %> <% total = Enum.map(poll.poll_opts, fn e -> e.vote_count end) |> Enum.sum() %>
<div class="bg-gray-900 w-full p-6 my-5 text-black shadow-lg rounded-md"> <div class="bg-gray-900 w-full p-6 my-5 text-black shadow-lg rounded-md">
<div class="w-full h-full flex items-center justify-between mb-4"> <div class="w-full h-full flex items-center justify-between mb-4">
<p class="text-white text-xl font-semibold"><%= poll.title %></p> <p class="text-white text-xl font-semibold">{poll.title}</p>
<%= link to: ~p"/export/polls/#{poll.id}", class: "text-sm text-white bg-primary-500 hover:bg-primary-600 rounded-md px-3 py-1 flex items-center gap-1", method: :post, target: "_blank" do %> <%= link to: ~p"/export/polls/#{poll.id}", class: "text-sm text-white bg-primary-500 hover:bg-primary-600 rounded-md px-3 py-1 flex items-center gap-1", method: :post, target: "_blank" do %>
<svg <svg
xmlns="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg"
@@ -233,7 +233,7 @@
> >
<path stroke="none" d="M0 0h24v24H0z" fill="none" /><path d="M14 3v4a1 1 0 0 0 1 1h4" /><path d="M17 21h-10a2 2 0 0 1 -2 -2v-14a2 2 0 0 1 2 -2h7l5 5v11a2 2 0 0 1 -2 2z" /><path d="M9 15h6" /><path d="M12.5 17.5l2.5 -2.5l-2.5 -2.5" /> <path stroke="none" d="M0 0h24v24H0z" fill="none" /><path d="M14 3v4a1 1 0 0 0 1 1h4" /><path d="M17 21h-10a2 2 0 0 1 -2 -2v-14a2 2 0 0 1 2 -2h7l5 5v11a2 2 0 0 1 -2 2z" /><path d="M9 15h6" /><path d="M12.5 17.5l2.5 -2.5l-2.5 -2.5" />
</svg> </svg>
<span><%= gettext("Export") %> (CSV)</span> <span>{gettext("Export")} (CSV)</span>
<% end %> <% end %>
</div> </div>
<div> <div>
@@ -256,10 +256,10 @@
> >
</div> </div>
<div class="flex space-x-3 items-center z-10 text-left"> <div class="flex space-x-3 items-center z-10 text-left">
<span class="flex-1 pr-2"><%= opt.content %></span> <span class="flex-1 pr-2">{opt.content}</span>
</div> </div>
<span class="text-sm z-10"> <span class="text-sm z-10">
<%= percentage %>% (<%= opt.vote_count %>) {percentage}% ({opt.vote_count})
</span> </span>
</div> </div>
<% end %> <% end %>
@@ -269,7 +269,7 @@
</div> </div>
<% end %> <% end %>
<% else %> <% else %>
<p class="italic text-gray-500"><%= gettext("No poll has been created") %></p> <p class="italic text-gray-500">{gettext("No poll has been created")}</p>
<% end %> <% end %>
</div> </div>
<% :forms -> %> <% :forms -> %>
@@ -278,7 +278,7 @@
<%= for form <- @event.presentation_file.forms do %> <%= for form <- @event.presentation_file.forms do %>
<div class="flex justify-between items-center mb-5"> <div class="flex justify-between items-center mb-5">
<span class="text-xl font-semibold text-gray-900"> <span class="text-xl font-semibold text-gray-900">
<%= form.title %> {form.title}
</span> </span>
<%= if length(form.form_submits) > 0 do %> <%= if length(form.form_submits) > 0 do %>
@@ -295,14 +295,14 @@
> >
<path stroke="none" d="M0 0h24v24H0z" fill="none" /><path d="M14 3v4a1 1 0 0 0 1 1h4" /><path d="M17 21h-10a2 2 0 0 1 -2 -2v-14a2 2 0 0 1 2 -2h7l5 5v11a2 2 0 0 1 -2 2z" /><path d="M9 15h6" /><path d="M12.5 17.5l2.5 -2.5l-2.5 -2.5" /> <path stroke="none" d="M0 0h24v24H0z" fill="none" /><path d="M14 3v4a1 1 0 0 0 1 1h4" /><path d="M17 21h-10a2 2 0 0 1 -2 -2v-14a2 2 0 0 1 2 -2h7l5 5v11a2 2 0 0 1 -2 2z" /><path d="M9 15h6" /><path d="M12.5 17.5l2.5 -2.5l-2.5 -2.5" />
</svg> </svg>
<span><%= gettext("Export") %> (CSV)</span> <span>{gettext("Export")} (CSV)</span>
<% end %> <% end %>
<% end %> <% end %>
</div> </div>
<%= if length(form.form_submits) == 0 do %> <%= if length(form.form_submits) == 0 do %>
<p class="italic text-gray-500"> <p class="italic text-gray-500">
<%= gettext("No form submission has been sent") %> {gettext("No form submission has been sent")}
</p> </p>
<% end %> <% end %>
@@ -325,7 +325,7 @@
<div> <div>
<%= for res <- fs.response do %> <%= for res <- fs.response do %>
<p><strong><%= elem(res, 0) %>:</strong> <%= elem(res, 1) %></p> <p><strong>{elem(res, 0)}:</strong> {elem(res, 1)}</p>
<% end %> <% end %>
</div> </div>
</div> </div>
@@ -335,7 +335,7 @@
</div> </div>
<% end %> <% end %>
<% else %> <% else %>
<p class="italic text-gray-500"><%= gettext("No form has been created") %></p> <p class="italic text-gray-500">{gettext("No form has been created")}</p>
<% end %> <% end %>
</div> </div>
<% :web_content -> %> <% :web_content -> %>
@@ -343,7 +343,7 @@
<%= if length(@event.presentation_file.embeds) > 0 do %> <%= if length(@event.presentation_file.embeds) > 0 do %>
<%= for embed <- @event.presentation_file.embeds do %> <%= for embed <- @event.presentation_file.embeds do %>
<span class="text-xl font-semibold text-gray-900 mb-4"> <span class="text-xl font-semibold text-gray-900 mb-4">
<%= embed.title %> {embed.title}
</span> </span>
<div class="text-black break-all mt-4 mb-10"> <div class="text-black break-all mt-4 mb-10">
<.live_component <.live_component
@@ -356,7 +356,7 @@
<% end %> <% end %>
<% else %> <% else %>
<p class="italic text-gray-500"> <p class="italic text-gray-500">
<%= gettext("No web content has been created") %> {gettext("No web content has been created")}
</p> </p>
<% end %> <% end %>
</div> </div>
@@ -377,13 +377,13 @@
> >
<path stroke="none" d="M0 0h24v24H0z" fill="none" /><path d="M14 3v4a1 1 0 0 0 1 1h4" /><path d="M17 21h-10a2 2 0 0 1 -2 -2v-14a2 2 0 0 1 2 -2h7l5 5v11a2 2 0 0 1 -2 2z" /><path d="M9 15h6" /><path d="M12.5 17.5l2.5 -2.5l-2.5 -2.5" /> <path stroke="none" d="M0 0h24v24H0z" fill="none" /><path d="M14 3v4a1 1 0 0 0 1 1h4" /><path d="M17 21h-10a2 2 0 0 1 -2 -2v-14a2 2 0 0 1 2 -2h7l5 5v11a2 2 0 0 1 -2 2z" /><path d="M9 15h6" /><path d="M12.5 17.5l2.5 -2.5l-2.5 -2.5" />
</svg> </svg>
<span><%= gettext("Export") %> (CSV)</span> <span>{gettext("Export")} (CSV)</span>
<% end %> <% end %>
</div> </div>
<% end %> <% end %>
<%= if length(@posts) == 0 do %> <%= if length(@posts) == 0 do %>
<p class="italic text-gray-500"><%= gettext("No messages has been sent") %></p> <p class="italic text-gray-500">{gettext("No messages has been sent")}</p>
<% end %> <% end %>
<div> <div>
@@ -405,7 +405,7 @@
<div class="bg-gray-900 w-full p-4 text-black shadow-lg rounded-md mb-10"> <div class="bg-gray-900 w-full p-4 text-black shadow-lg rounded-md mb-10">
<div class="mb-4"> <div class="mb-4">
<div class="w-full flex items-center justify-between"> <div class="w-full flex items-center justify-between">
<p class="text-white text-xl font-semibold mb-2"><%= quiz.title %></p> <p class="text-white text-xl font-semibold mb-2">{quiz.title}</p>
<%= link to: ~p"/export/quizzes/#{quiz.id}", class: "text-sm text-white bg-primary-500 hover:bg-primary-600 rounded-md px-3 py-1 flex items-center gap-1", method: :post, target: "_blank" do %> <%= link to: ~p"/export/quizzes/#{quiz.id}", class: "text-sm text-white bg-primary-500 hover:bg-primary-600 rounded-md px-3 py-1 flex items-center gap-1", method: :post, target: "_blank" do %>
<svg <svg
xmlns="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg"
@@ -419,22 +419,22 @@
> >
<path stroke="none" d="M0 0h24v24H0z" fill="none" /><path d="M14 3v4a1 1 0 0 0 1 1h4" /><path d="M17 21h-10a2 2 0 0 1 -2 -2v-14a2 2 0 0 1 2 -2h7l5 5v11a2 2 0 0 1 -2 2z" /><path d="M9 15h6" /><path d="M12.5 17.5l2.5 -2.5l-2.5 -2.5" /> <path stroke="none" d="M0 0h24v24H0z" fill="none" /><path d="M14 3v4a1 1 0 0 0 1 1h4" /><path d="M17 21h-10a2 2 0 0 1 -2 -2v-14a2 2 0 0 1 2 -2h7l5 5v11a2 2 0 0 1 -2 2z" /><path d="M9 15h6" /><path d="M12.5 17.5l2.5 -2.5l-2.5 -2.5" />
</svg> </svg>
<span><%= gettext("Export") %> (CSV)</span> <span>{gettext("Export")} (CSV)</span>
<% end %> <% end %>
</div> </div>
<p class="text-gray-400 text-sm"> <p class="text-gray-400 text-sm">
<%= gettext("Average score") %>: {gettext("Average score")}:
<span class="font-semibold"> <span class="font-semibold">
<%= Claper.Quizzes.calculate_average_score(quiz.id) %>/<%= length( {Claper.Quizzes.calculate_average_score(quiz.id)}/{length(
quiz.quiz_questions quiz.quiz_questions
) %> )}
</span> </span>
</p> </p>
<p class="text-gray-400 text-sm"> <p class="text-gray-400 text-sm">
<%= gettext("Total submissions") %>: {gettext("Total submissions")}:
<span class="font-semibold"> <span class="font-semibold">
<%= Claper.Quizzes.get_submission_count(quiz.id) %> {Claper.Quizzes.get_submission_count(quiz.id)}
</span> </span>
</p> </p>
</div> </div>
@@ -443,7 +443,7 @@
<%= for {question, _idx} <- Enum.with_index(quiz.quiz_questions) do %> <%= for {question, _idx} <- Enum.with_index(quiz.quiz_questions) do %>
<div class="border-t border-gray-700 pt-4 mt-4 first:border-t-0 first:pt-0 first:mt-0"> <div class="border-t border-gray-700 pt-4 mt-4 first:border-t-0 first:pt-0 first:mt-0">
<p class="text-white text-lg font-medium mb-3"> <p class="text-white text-lg font-medium mb-3">
<%= question.content %> {question.content}
</p> </p>
<div class="space-y-2"> <div class="space-y-2">
<%= for opt <- question.quiz_question_opts do %> <%= for opt <- question.quiz_question_opts do %>
@@ -457,10 +457,10 @@
<div class="h-5 w-5 mt-0.5 rounded-md point-select border-2 border-white"> <div class="h-5 w-5 mt-0.5 rounded-md point-select border-2 border-white">
</div> </div>
<% end %> <% end %>
<span class="flex-1 pr-2"><%= opt.content %></span> <span class="flex-1 pr-2">{opt.content}</span>
</div> </div>
<span class="text-sm"> <span class="text-sm">
<%= opt.percentage %>% (<%= opt.response_count %>) {opt.percentage}% ({opt.response_count})
</span> </span>
</div> </div>
</div> </div>
@@ -473,7 +473,7 @@
<% end %> <% end %>
</div> </div>
<% else %> <% else %>
<p class="italic text-gray-500"><%= gettext("No quiz has been created") %></p> <p class="italic text-gray-500">{gettext("No quiz has been created")}</p>
<% end %> <% end %>
</div> </div>
<% end %> <% end %>

View File

@@ -2,7 +2,7 @@
<div class="border-b border-gray-200 py-4 sm:flex sm:items-center sm:justify-between"> <div class="border-b border-gray-200 py-4 sm:flex sm:items-center sm:justify-between">
<div class="flex-1 min-w-0"> <div class="flex-1 min-w-0">
<h1 class="text-2xl font-medium leading-6 text-gray-900 sm:truncate"> <h1 class="text-2xl font-medium leading-6 text-gray-900 sm:truncate">
<%= gettext("My account") %> {gettext("My account")}
</h1> </h1>
</div> </div>
<div class="mt-4 flex sm:mt-0 sm:ml-4"></div> <div class="mt-4 flex sm:mt-0 sm:ml-4"></div>
@@ -26,7 +26,7 @@
id="update_email" id="update_email"
class="mt-5 md:flex md:items-end" class="mt-5 md:flex md:items-end"
> >
<%= hidden_input(f, :action, name: "action", value: "update_email") %> {hidden_input(f, :action, name: "action", value: "update_email")}
<ClaperWeb.Component.Input.email <ClaperWeb.Component.Input.email
form={f} form={f}
@@ -35,11 +35,11 @@
required="true" required="true"
/> />
<%= submit(gettext("Save"), {submit(gettext("Save"),
phx_disable_with: "Saving...", phx_disable_with: "Saving...",
class: class:
"mt-2 w-full h-14 inline-flex transition-all items-center justify-center px-4 py-2 shadow-sm font-medium rounded-md text-white bg-black hover:bg-primary-500 md:mt-0 md:ml-3 md:w-auto md:text-sm" "mt-2 w-full h-14 inline-flex transition-all items-center justify-center px-4 py-2 shadow-sm font-medium rounded-md text-white bg-black hover:bg-primary-500 md:mt-0 md:ml-3 md:w-auto md:text-sm"
) %> )}
</.form> </.form>
</div> </div>
</.live_component> </.live_component>
@@ -62,7 +62,7 @@
id="update_password" id="update_password"
class="mt-5 md:flex md:items-end gap-x-2" class="mt-5 md:flex md:items-end gap-x-2"
> >
<%= hidden_input(f, :action, name: "action", value: "update_password") %> {hidden_input(f, :action, name: "action", value: "update_password")}
<ClaperWeb.Component.Input.password <ClaperWeb.Component.Input.password
form={f} form={f}
@@ -77,11 +77,11 @@
required="true" required="true"
/> />
<%= submit(gettext("Save"), {submit(gettext("Save"),
phx_disable_with: "Saving...", phx_disable_with: "Saving...",
class: class:
"mt-2 w-full h-14 inline-flex transition-all items-center justify-center px-4 py-2 shadow-sm font-medium rounded-md text-white bg-black hover:bg-primary-500 md:mt-0 md:ml-3 md:w-auto md:text-sm" "mt-2 w-full h-14 inline-flex transition-all items-center justify-center px-4 py-2 shadow-sm font-medium rounded-md text-white bg-black hover:bg-primary-500 md:mt-0 md:ml-3 md:w-auto md:text-sm"
) %> )}
</.form> </.form>
</div> </div>
</.live_component> </.live_component>
@@ -104,7 +104,7 @@
id="set_password" id="set_password"
class="mt-5 md:flex md:items-end gap-x-2" class="mt-5 md:flex md:items-end gap-x-2"
> >
<%= hidden_input(f, :action, name: "action", value: "set_password") %> {hidden_input(f, :action, name: "action", value: "set_password")}
<ClaperWeb.Component.Input.password <ClaperWeb.Component.Input.password
form={f} form={f}
@@ -120,11 +120,11 @@
required="true" required="true"
/> />
<%= submit(gettext("Save"), {submit(gettext("Save"),
phx_disable_with: "Saving...", phx_disable_with: "Saving...",
class: class:
"mt-2 w-full h-14 inline-flex transition-all items-center justify-center px-4 py-2 shadow-sm font-medium rounded-md text-white bg-black hover:bg-primary-500 md:mt-0 md:ml-3 md:w-auto md:text-sm" "mt-2 w-full h-14 inline-flex transition-all items-center justify-center px-4 py-2 shadow-sm font-medium rounded-md text-white bg-black hover:bg-primary-500 md:mt-0 md:ml-3 md:w-auto md:text-sm"
) %> )}
</.form> </.form>
</div> </div>
</.live_component> </.live_component>
@@ -133,32 +133,32 @@
<div class="shadow overflow-hidden sm:rounded-lg"> <div class="shadow overflow-hidden sm:rounded-lg">
<div class="py-5"> <div class="py-5">
<h3 class="text-lg leading-6 font-medium text-gray-900"> <h3 class="text-lg leading-6 font-medium text-gray-900">
<%= gettext("Personal informations") %> {gettext("Personal informations")}
</h3> </h3>
<p class="mt-1 max-w-2xl text-sm text-gray-500"> <p class="mt-1 max-w-2xl text-sm text-gray-500">
<%= gettext("Your personal informations to access your account") %> {gettext("Your personal informations to access your account")}
</p> </p>
</div> </div>
<div class="border-t border-gray-200 py-5 sm:p-0"> <div class="border-t border-gray-200 py-5 sm:p-0">
<dl class="sm:divide-y sm:divide-gray-200"> <dl class="sm:divide-y sm:divide-gray-200">
<div class="py-4 sm:py-5 sm:grid sm:grid-cols-2 sm:gap-4"> <div class="py-4 sm:py-5 sm:grid sm:grid-cols-2 sm:gap-4">
<dt class="text-sm font-medium text-gray-500"> <dt class="text-sm font-medium text-gray-500">
<%= gettext("Email address") %> {gettext("Email address")}
</dt> </dt>
<dd class="mt-1 text-sm text-gray-900 sm:mt-0 sm:col-span-2"> <dd class="mt-1 text-sm text-gray-900 sm:mt-0 sm:col-span-2">
<span class="flex-grow"><%= @current_user.email %></span> <span class="flex-grow">{@current_user.email}</span>
<span :if={!@is_external_user} class="ml-4 flex-shrink-0"> <span :if={!@is_external_user} class="ml-4 flex-shrink-0">
<.link <.link
patch={~p"/users/settings/edit/email"} patch={~p"/users/settings/edit/email"}
class="rounded-md font-medium text-purple-600 hover:text-purple-500" class="rounded-md font-medium text-purple-600 hover:text-purple-500"
> >
<%= gettext("Change") %> {gettext("Change")}
</.link> </.link>
</span> </span>
</dd> </dd>
<dt :if={!@is_external_user} class="text-sm font-medium text-gray-500"> <dt :if={!@is_external_user} class="text-sm font-medium text-gray-500">
<%= gettext("Password") %> {gettext("Password")}
</dt> </dt>
<dd :if={!@is_external_user} class="mt-1 text-sm text-gray-900 sm:mt-0 sm:col-span-2"> <dd :if={!@is_external_user} class="mt-1 text-sm text-gray-900 sm:mt-0 sm:col-span-2">
<span class="flex-grow">********</span> <span class="flex-grow">********</span>
@@ -167,20 +167,20 @@
patch={~p"/users/settings/edit/password"} patch={~p"/users/settings/edit/password"}
class="rounded-md font-medium text-purple-600 hover:text-purple-500" class="rounded-md font-medium text-purple-600 hover:text-purple-500"
> >
<%= gettext("Change") %> {gettext("Change")}
</.link> </.link>
</span> </span>
</dd> </dd>
<dt :if={@is_external_user} class="text-sm font-medium text-gray-500"> <dt :if={@is_external_user} class="text-sm font-medium text-gray-500">
<%= gettext("Accounts linked") %> {gettext("Accounts linked")}
</dt> </dt>
<dd class="text-sm text-gray-900 sm:col-span-2"> <dd class="text-sm text-gray-900 sm:col-span-2">
<%= for account <- @oidc_accounts do %> <%= for account <- @oidc_accounts do %>
<div class="text-sm text-gray-900 bg-white rounded-md py-2 px-4 shadow-base flex gap-x-2 items-center justify-start mt-2 sm:mt-0 mb-2"> <div class="text-sm text-gray-900 bg-white rounded-md py-2 px-4 shadow-base flex gap-x-2 items-center justify-start mt-2 sm:mt-0 mb-2">
<img src="/images/icons/openid.png" class="w-5" /> <img src="/images/icons/openid.png" class="w-5" />
<span class="flex-grow flex items-center gap-x-2"> <span class="flex-grow flex items-center gap-x-2">
<span><%= account.provider %></span> <span>{account.provider}</span>
<div <div
:if={account.organization} :if={account.organization}
class="text-gray-500 text-xs flex items-center gap-x-1" class="text-gray-500 text-xs flex items-center gap-x-1"
@@ -198,7 +198,7 @@
/> />
</svg> </svg>
<span><%= account.organization %></span> <span>{account.organization}</span>
</div> </div>
</span> </span>
<span :if={@allow_unlink_external_provider}> <span :if={@allow_unlink_external_provider}>
@@ -208,7 +208,7 @@
data-confirm={gettext("Are you sure you want to unlink this account?")} data-confirm={gettext("Are you sure you want to unlink this account?")}
class="font-medium text-red-600 hover:text-red-500" class="font-medium text-red-600 hover:text-red-500"
> >
<%= gettext("Unlink") %> {gettext("Unlink")}
</button> </button>
</span> </span>
</div> </div>
@@ -217,7 +217,7 @@
<div class="text-sm text-gray-900 bg-white rounded-md py-2 px-4 shadow-base flex gap-x-2 items-center justify-start mb-2"> <div class="text-sm text-gray-900 bg-white rounded-md py-2 px-4 shadow-base flex gap-x-2 items-center justify-start mb-2">
<img src="/images/icons/lms.png" class="w-8" /> <img src="/images/icons/lms.png" class="w-8" />
<span class="flex-grow"> <span class="flex-grow">
LMS <span class="text-gray-500 text-xs">#<%= account.registration_id %></span> LMS <span class="text-gray-500 text-xs">#{account.registration_id}</span>
</span> </span>
<span :if={@allow_unlink_external_provider} class="ml-4 flex-shrink-0"> <span :if={@allow_unlink_external_provider} class="ml-4 flex-shrink-0">
<button <button
@@ -226,7 +226,7 @@
data-confirm={gettext("Are you sure you want to unlink this account?")} data-confirm={gettext("Are you sure you want to unlink this account?")}
class="font-medium text-red-600 hover:text-red-500" class="font-medium text-red-600 hover:text-red-500"
> >
<%= gettext("Unlink") %> {gettext("Unlink")}
</button> </button>
</span> </span>
</div> </div>
@@ -238,17 +238,17 @@
<div> <div>
<div class="py-5"> <div class="py-5">
<h3 class="text-lg leading-6 font-medium text-gray-900"> <h3 class="text-lg leading-6 font-medium text-gray-900">
<%= gettext("Preferences") %> {gettext("Preferences")}
</h3> </h3>
<p class="mt-1 max-w-2xl text-sm text-gray-500"> <p class="mt-1 max-w-2xl text-sm text-gray-500">
<%= gettext("Customize your account") %> {gettext("Customize your account")}
</p> </p>
</div> </div>
<div class="border-t border-gray-200 py-5 sm:p-0"> <div class="border-t border-gray-200 py-5 sm:p-0">
<dl class="sm:divide-y sm:divide-gray-200"> <dl class="sm:divide-y sm:divide-gray-200">
<div class="mt-5"> <div class="mt-5">
<.form :let={f} for={@preferences_changeset} phx-change="save"> <.form :let={f} for={@preferences_changeset} phx-change="save">
<%= hidden_input(f, :action, name: "action", value: "update_preferences") %> {hidden_input(f, :action, name: "action", value: "update_preferences")}
<ClaperWeb.Component.Input.select <ClaperWeb.Component.Input.select
form={f} form={f}
fieldClass="!w-auto" fieldClass="!w-auto"
@@ -272,23 +272,23 @@
<div :if={!@is_external_user}> <div :if={!@is_external_user}>
<div class="py-5"> <div class="py-5">
<h3 class="text-lg leading-6 font-medium text-gray-900"> <h3 class="text-lg leading-6 font-medium text-gray-900">
<%= gettext("Danger zone") %> {gettext("Danger zone")}
</h3> </h3>
<p class="mt-1 max-w-2xl text-sm text-gray-500"> <p class="mt-1 max-w-2xl text-sm text-gray-500">
<%= gettext("Be careful, these actions are irreversible") %> {gettext("Be careful, these actions are irreversible")}
</p> </p>
</div> </div>
<div class="border-t border-gray-200 py-5 sm:p-0"> <div class="border-t border-gray-200 py-5 sm:p-0">
<dl class="sm:divide-y sm:divide-gray-200"> <dl class="sm:divide-y sm:divide-gray-200">
<div class="my-5"> <div class="my-5">
<%= link(gettext("Delete account"), {link(gettext("Delete account"),
to: ~p"/users/register/delete", to: ~p"/users/register/delete",
method: :delete, method: :delete,
"data-confirm": "data-confirm":
gettext("All your events and files will be permanently deleted, are you sure?"), gettext("All your events and files will be permanently deleted, are you sure?"),
class: class:
"w-full lg:w-auto px-6 text-center text-white py-2 rounded-md tracking-wide font-bold focus:outline-none focus:shadow-outline bg-gradient-to-tl from-supporting-red-600 to-supporting-red-400 bg-size-200 bg-pos-0 hover:bg-pos-100 transition-all duration-500" "w-full lg:w-auto px-6 text-center text-white py-2 rounded-md tracking-wide font-bold focus:outline-none focus:shadow-outline bg-gradient-to-tl from-supporting-red-600 to-supporting-red-400 bg-size-200 bg-pos-0 hover:bg-pos-100 transition-all duration-500"
) %> )}
</div> </div>
</dl> </dl>
</div> </div>

View File

@@ -4,7 +4,7 @@
<meta charset="utf-8" /> <meta charset="utf-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" /> <meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" />
<%= csrf_meta_tag() %> {csrf_meta_tag()}
<title>Not found - Claper</title> <title>Not found - Claper</title>
<link rel="icon" type="image/png" href="/images/favicon.png" /> <link rel="icon" type="image/png" href="/images/favicon.png" />
<link phx-track-static rel="stylesheet" href="/assets/app.css" /> <link phx-track-static rel="stylesheet" href="/assets/app.css" />
@@ -28,12 +28,12 @@
</a> </a>
</h2> </h2>
<p class="mt-6 text-xl md:text-3xl font-bold text-gray-100"> <p class="mt-6 text-xl md:text-3xl font-bold text-gray-100">
<%= gettext("Oops, page doesn't exist.") %> {gettext("Oops, page doesn't exist.")}
</p> </p>
<div class="mt-10"> <div class="mt-10">
<a href="/" class="text-sm text-white underline"> <a href="/" class="text-sm text-white underline">
<%= gettext("Return to home") %> {gettext("Return to home")}
</a> </a>
</div> </div>
</div> </div>

View File

@@ -4,7 +4,7 @@
<meta charset="utf-8" /> <meta charset="utf-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" /> <meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" />
<%= csrf_meta_tag() %> {csrf_meta_tag()}
<title>Not found - Claper</title> <title>Not found - Claper</title>
<link rel="icon" type="image/png" href="/images/favicon.png" /> <link rel="icon" type="image/png" href="/images/favicon.png" />
<link phx-track-static rel="stylesheet" href="/assets/app.css" /> <link phx-track-static rel="stylesheet" href="/assets/app.css" />
@@ -28,13 +28,13 @@
</a> </a>
</h2> </h2>
<p class="mt-6 text-xl md:text-3xl font-bold text-gray-100"> <p class="mt-6 text-xl md:text-3xl font-bold text-gray-100">
<%= gettext("The site is under maintenance, we'll be back very soon!") %> {gettext("The site is under maintenance, we'll be back very soon!")}
</p> </p>
<div class="mt-10"> <div class="mt-10">
<p class="mt-5"> <p class="mt-5">
<a href="/" class="text-sm text-white underline"> <a href="/" class="text-sm text-white underline">
<%= gettext("Return to home") %> {gettext("Return to home")}
</a> </a>
</p> </p>
</div> </div>

View File

@@ -2,31 +2,31 @@
<div class="max-w-3xl w-full p-10"> <div class="max-w-3xl w-full p-10">
<div class="text-center"> <div class="text-center">
<h1 class="text-4xl font-bold text-gray-900 mb-2"> <h1 class="text-4xl font-bold text-gray-900 mb-2">
<%= gettext("CSRF Verification Failed") %> {gettext("CSRF Verification Failed")}
</h1> </h1>
<p class="text-lg text-gray-700 mb-8"> <p class="text-lg text-gray-700 mb-8">
<%= gettext("A required security token was not found or was invalid.") %> {gettext("A required security token was not found or was invalid.")}
</p> </p>
</div> </div>
<div class="space-y-6 text-center"> <div class="space-y-6 text-center">
<p class="text-gray-700"> <p class="text-gray-700">
<%= gettext("If you're continually seeing this issue, try the following:") %> {gettext("If you're continually seeing this issue, try the following:")}
</p> </p>
<ol class="list-decimal list-inside space-y-2 text-gray-600"> <ol class="list-decimal list-inside space-y-2 text-gray-600">
<li><%= gettext("Clear cookies (at least for Claper domain)") %></li> <li>{gettext("Clear cookies (at least for Claper domain)")}</li>
<li><%= gettext("Reload the page you're trying to access (don't re-submit data)") %></li> <li>{gettext("Reload the page you're trying to access (don't re-submit data)")}</li>
<li><%= gettext("Try logging in again") %></li> <li>{gettext("Try logging in again")}</li>
<li><%= gettext("Ensure the URL does not contain an extra \"/\" anywhere") %></li> <li>{gettext("Ensure the URL does not contain an extra \"/\" anywhere")}</li>
</ol> </ol>
<p class="text-gray-700 mt-6"> <p class="text-gray-700 mt-6">
<%= gettext("If the problem persists, please contact support.") %> {gettext("If the problem persists, please contact support.")}
</p> </p>
<div class="mt-8"> <div class="mt-8">
<%= link(gettext("Back to Login"), {link(gettext("Back to Login"),
to: ~p"/users/log_in", to: ~p"/users/log_in",
class: "text-blue underline font-semibold transition duration-300 ease-in-out" class: "text-blue underline font-semibold transition duration-300 ease-in-out"
) %> )}
</div> </div>
</div> </div>
</div> </div>

View File

@@ -4,9 +4,9 @@
<% else %> <% else %>
<div class="bg-neutral-500 h-10 w-10 rounded-full text-center flex items-center justify-center"> <div class="bg-neutral-500 h-10 w-10 rounded-full text-center flex items-center justify-center">
<%= if @user.full_name do %> <%= if @user.full_name do %>
<%= with [first | _] <- String.codepoints(@user.full_name), do: String.capitalize(first) %> {with [first | _] <- String.codepoints(@user.full_name), do: String.capitalize(first)}
<% else %> <% else %>
<%= with [first | _] <- String.codepoints(@user.email), do: String.capitalize(first) %> {with [first | _] <- String.codepoints(@user.email), do: String.capitalize(first)}
<% end %> <% end %>
</div> </div>
<% end %> <% end %>

View File

@@ -20,7 +20,7 @@
aria-haspopup="true" aria-haspopup="true"
> >
<span class="sr-only">Open user menu</span> <span class="sr-only">Open user menu</span>
<span class="hidden md:block"><%= @user.email %></span> <span class="hidden md:block">{@user.email}</span>
<svg <svg
xmlns="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 20 20" viewBox="0 0 20 20"
@@ -44,7 +44,7 @@
aria-labelledby="user-menu-button" aria-labelledby="user-menu-button"
tabindex="-1" tabindex="-1"
> >
<%= render("_user_menu.html", conn: @conn, user: @user) %> {render("_user_menu.html", conn: @conn, user: @user)}
</div> </div>
</div> </div>
</div> </div>

View File

@@ -3,24 +3,24 @@
href={~p"/users/settings"} href={~p"/users/settings"}
class="text-gray-700 block px-4 py-2 text-sm hover:bg-gray-100 hover:text-gray-900" class="text-gray-700 block px-4 py-2 text-sm hover:bg-gray-100 hover:text-gray-900"
> >
<%= gettext("My account") %> {gettext("My account")}
</a> </a>
<a <a
href="https://docs.claper.co" href="https://docs.claper.co"
class="text-gray-700 block px-4 py-2 text-sm hover:bg-gray-100 hover:text-gray-900" class="text-gray-700 block px-4 py-2 text-sm hover:bg-gray-100 hover:text-gray-900"
> >
<%= gettext("Documentation") %> {gettext("Documentation")}
</a> </a>
</div> </div>
<div class="py-1" role="none"> <div class="py-1" role="none">
<%= link(gettext("Logout"), {link(gettext("Logout"),
to: ~p"/users/log_out", to: ~p"/users/log_out",
method: :delete, method: :delete,
class: "text-gray-700 block px-4 py-2 text-sm hover:bg-gray-100 hover:text-gray-900" class: "text-gray-700 block px-4 py-2 text-sm hover:bg-gray-100 hover:text-gray-900"
) %> )}
</div> </div>
<div class="py-1" role="none"> <div class="py-1" role="none">
<p class="text-gray-500 block px-4 text-xs py-1"> <p class="text-gray-500 block px-4 text-xs py-1">
Version <%= Application.spec(:claper, :vsn) %> Version {Application.spec(:claper, :vsn)}
</p> </p>
</div> </div>

View File

@@ -8,4 +8,4 @@
<% end %> <% end %>
</div> </div>
<%= @inner_content %> {@inner_content}

View File

@@ -58,7 +58,7 @@
<td style="height:20px;">&nbsp;</td> <td style="height:20px;">&nbsp;</td>
</tr> </tr>
<%= @inner_content %> {@inner_content}
<tr> <tr>
<td style="text-align:center;"> <td style="text-align:center;">

View File

@@ -1,11 +1,11 @@
<div class="fixed max-w-xl w-full bottom-5 left-1/2 tranform -translate-x-1/2 z-10"> <div class="fixed max-w-xl w-full bottom-5 left-1/2 tranform -translate-x-1/2 z-10">
<%= if live_flash(@flash, :info) do %> <%= if Phoenix.Flash.get(@flash, :info) do %>
<ClaperWeb.Component.Alert.info message={live_flash(@flash, :info)} /> <ClaperWeb.Component.Alert.info message={Phoenix.Flash.get(@flash, :info)} />
<% end %> <% end %>
<%= if live_flash(@flash, :error) do %> <%= if Phoenix.Flash.get(@flash, :error) do %>
<ClaperWeb.Component.Alert.error message={live_flash(@flash, :error)} /> <ClaperWeb.Component.Alert.error message={Phoenix.Flash.get(@flash, :error)} />
<% end %> <% end %>
</div> </div>
<%= @inner_content %> {@inner_content}

View File

@@ -4,8 +4,8 @@
<meta charset="utf-8" /> <meta charset="utf-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" /> <meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" />
<%= csrf_meta_tag() %> {csrf_meta_tag()}
<.live_title suffix=" · Claper" )><%= assigns[:page_title] || "Claper" %></.live_title> <.live_title suffix=" · Claper" )>{assigns[:page_title] || "Claper"}</.live_title>
<link rel="icon" type="image/png" href="/images/favicon.png" /> <link rel="icon" type="image/png" href="/images/favicon.png" />
<link phx-track-static rel="stylesheet" href="/assets/app.css" /> <link phx-track-static rel="stylesheet" href="/assets/app.css" />
<link phx-track-static rel="stylesheet" href="/assets/custom.css" /> <link phx-track-static rel="stylesheet" href="/assets/custom.css" />
@@ -17,7 +17,7 @@
<!-- Main column --> <!-- Main column -->
<div class="flex flex-col"> <div class="flex flex-col">
<main class="flex-1"> <main class="flex-1">
<%= @inner_content %> {@inner_content}
</main> </main>
</div> </div>
</div> </div>

View File

@@ -4,8 +4,8 @@
<meta charset="utf-8" /> <meta charset="utf-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" /> <meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" />
<%= csrf_meta_tag() %> {csrf_meta_tag()}
<.live_title suffix=" · Claper" )><%= assigns[:page_title] || "Claper" %></.live_title> <.live_title suffix=" · Claper" )>{assigns[:page_title] || "Claper"}</.live_title>
<link phx-track-static rel="stylesheet" href="/assets/app.css" /> <link phx-track-static rel="stylesheet" href="/assets/app.css" />
<link rel="icon" type="image/png" href="/images/favicon.png" /> <link rel="icon" type="image/png" href="/images/favicon.png" />
<link phx-track-static rel="stylesheet" href="/assets/custom.css" /> <link phx-track-static rel="stylesheet" href="/assets/custom.css" />
@@ -16,9 +16,9 @@
<div class="min-h-full"> <div class="min-h-full">
<!-- Main column --> <!-- Main column -->
<div class="flex flex-col" x-data="{profileMobileDropdown: false}"> <div class="flex flex-col" x-data="{profileMobileDropdown: false}">
<%= render("_profile_dropdown.html", user: @current_user, conn: @conn) %> {render("_profile_dropdown.html", user: @current_user, conn: @conn)}
<main class="flex-1"> <main class="flex-1">
<%= @inner_content %> {@inner_content}
</main> </main>
</div> </div>
</div> </div>

View File

@@ -14,25 +14,25 @@
<tr> <tr>
<td style="padding:0 35px;"> <td style="padding:0 35px;">
<h1 style="color:#1e1e2d; font-weight:500; margin:0;font-size:32px;font-family:'Rubik',sans-serif;"> <h1 style="color:#1e1e2d; font-weight:500; margin:0;font-size:32px;font-family:'Rubik',sans-serif;">
<%= gettext("You have been invited") %> {gettext("You have been invited")}
</h1> </h1>
<span style="display:inline-block; vertical-align:middle; margin:29px 0 26px; border-bottom:1px solid #cecece; width:100px;"> <span style="display:inline-block; vertical-align:middle; margin:29px 0 26px; border-bottom:1px solid #cecece; width:100px;">
</span> </span>
<p style="color:#455056; font-size:15px;line-height:24px; margin:0;"> <p style="color:#455056; font-size:15px;line-height:24px; margin:0;">
<%= gettext("Someone invited you to manage the event: %{name}", name: @event_name) %> {gettext("Someone invited you to manage the event: %{name}", name: @event_name)}
</p> </p>
<p style="color:#455056; font-size:15px;line-height:24px; margin:0;"> <p style="color:#455056; font-size:15px;line-height:24px; margin:0;">
<%= gettext( {gettext(
"To accept the invitation, please login or create an account with this email: %{email}", "To accept the invitation, please login or create an account with this email: %{email}",
email: @leader_email email: @leader_email
) %> )}
</p> </p>
<a <a
href={@url} href={@url}
target="_blank" target="_blank"
style="background:#8611ed;text-decoration:none !important; font-weight:500; margin-top:35px; color:#fff;text-transform:uppercase; font-size:14px;padding:10px 24px;display:inline-block;border-radius:50px;" style="background:#8611ed;text-decoration:none !important; font-weight:500; margin-top:35px; color:#fff;text-transform:uppercase; font-size:14px;padding:10px 24px;display:inline-block;border-radius:50px;"
> >
<%= gettext("Login or create account") %> {gettext("Login or create account")}
</a> </a>
</td> </td>
</tr> </tr>
@@ -42,11 +42,11 @@
<tr> <tr>
<td style="font-size: 0.8em; color: #6C6C6C"> <td style="font-size: 0.8em; color: #6C6C6C">
<p class="sub"> <p class="sub">
<%= gettext( {gettext(
"If youre having trouble with the button above, copy and paste the URL below into your web browser" "If youre having trouble with the button above, copy and paste the URL below into your web browser"
) %>. )}.
</p> </p>
<p class="sub"><%= @url %></p> <p class="sub">{@url}</p>
</td> </td>
</tr> </tr>
<tr> <tr>

View File

@@ -2,11 +2,11 @@
<div class="relative h-screen bg-black flex justify-center items-center"> <div class="relative h-screen bg-black flex justify-center items-center">
<div class="max-w-xl text-center"> <div class="max-w-xl text-center">
<p class="text-4xl font-bold text-gray-100 flex items-center justify-center gap-x-2"> <p class="text-4xl font-bold text-gray-100 flex items-center justify-center gap-x-2">
<span><%= gettext("Oops") %></span> <span>{gettext("Oops")}</span>
</p> </p>
<div class="my-8"> <div class="my-8">
<p class="text-gray-200 font-bold"> <p class="text-gray-200 font-bold">
<%= gettext("You cannot perform this action") %> {gettext("You cannot perform this action")}
</p> </p>
<pre class="text-gray-200 my-4 text-sm bg-gray-800 p-2 rounded-lg"><%= @msg %></pre> <pre class="text-gray-200 my-4 text-sm bg-gray-800 p-2 rounded-lg"><%= @msg %></pre>
</div> </div>
@@ -14,7 +14,7 @@
class="mx-auto mt-8 flex justify-center text-white p-4 rounded-md tracking-wide font-bold focus:outline-none focus:shadow-outline shadow-lg bg-gradient-to-tl from-primary-500 to-secondary-500 bg-size-200 bg-pos-0 hover:bg-pos-100 transition-all duration-500" class="mx-auto mt-8 flex justify-center text-white p-4 rounded-md tracking-wide font-bold focus:outline-none focus:shadow-outline shadow-lg bg-gradient-to-tl from-primary-500 to-secondary-500 bg-size-200 bg-pos-0 hover:bg-pos-100 transition-all duration-500"
onclick="window.close()" onclick="window.close()"
> >
<%= gettext("Close") %> {gettext("Close")}
</button> </button>
</div> </div>
</div> </div>

View File

@@ -21,10 +21,10 @@
<img src="/images/lms-platforms.png" class="h-12 w-auto inline" /> <img src="/images/lms-platforms.png" class="h-12 w-auto inline" />
</div> </div>
<h2 class="mt-6 text-4xl md:text-6xl font-bold text-gray-100"> <h2 class="mt-6 text-4xl md:text-6xl font-bold text-gray-100">
<%= gettext("Bring Claper to your LMS") %> {gettext("Bring Claper to your LMS")}
</h2> </h2>
<p class="mt-10 text-2xl md:text-4xl text-gray-200"> <p class="mt-10 text-2xl md:text-4xl text-gray-200">
<%= gettext("Register your platform") %> {gettext("Register your platform")}
</p> </p>
</div> </div>
<div class="flex flex-row justify-center items-center space-x-3"></div> <div class="flex flex-row justify-center items-center space-x-3"></div>
@@ -37,10 +37,10 @@
type="submit" type="submit"
class="flex justify-center text-white p-4 rounded-md tracking-wide font-bold focus:outline-none focus:shadow-outline shadow-lg bg-gradient-to-tl from-primary-500 to-secondary-500 bg-size-200 bg-pos-0 hover:bg-pos-100 transition-all duration-500" class="flex justify-center text-white p-4 rounded-md tracking-wide font-bold focus:outline-none focus:shadow-outline shadow-lg bg-gradient-to-tl from-primary-500 to-secondary-500 bg-size-200 bg-pos-0 hover:bg-pos-100 transition-all duration-500"
> >
<%= gettext("Add Claper") %> {gettext("Add Claper")}
</button> </button>
<p :if={!@current_user} class="text-white italic"> <p :if={!@current_user} class="text-white italic">
<%= gettext("You must login to continue") %> {gettext("You must login to continue")}
</p> </p>
</form> </form>
</div> </div>

View File

@@ -2,19 +2,19 @@
<div class="relative h-screen bg-black flex justify-center items-center"> <div class="relative h-screen bg-black flex justify-center items-center">
<div class="max-w-xl text-center"> <div class="max-w-xl text-center">
<p class="text-4xl font-bold text-gray-100 flex items-center justify-center gap-x-2"> <p class="text-4xl font-bold text-gray-100 flex items-center justify-center gap-x-2">
<span><%= gettext("Registration completed") %></span> <span>{gettext("Registration completed")}</span>
<img src="/images/icons/thumb.svg" class="h-12 -mt-3" /> <img src="/images/icons/thumb.svg" class="h-12 -mt-3" />
</p> </p>
<div class="my-8"> <div class="my-8">
<p class="text-gray-200"> <p class="text-gray-200">
<%= gettext("Your next steps") %>: {gettext("Your next steps")}:
</p> </p>
<div class="mt-4 bg-gray-800 p-6 rounded-lg shadow-lg border border-white"> <div class="mt-4 bg-gray-800 p-6 rounded-lg shadow-lg border border-white">
<ol class="list-decimal list-inside text-gray-200"> <ol class="list-decimal list-inside text-gray-200">
<li class="mb-2"><%= gettext("Activate the tool in your LMS") %></li> <li class="mb-2">{gettext("Activate the tool in your LMS")}</li>
<li class="mb-2"><%= gettext("Configure it to be opened in a new window") %></li> <li class="mb-2">{gettext("Configure it to be opened in a new window")}</li>
<li class="mb-2"> <li class="mb-2">
<%= gettext("Check the permissions to share name and email of users") %> {gettext("Check the permissions to share name and email of users")}
</li> </li>
</ol> </ol>
</div> </div>
@@ -23,7 +23,7 @@
class="mx-auto mt-8 flex justify-center text-white p-4 rounded-md tracking-wide font-bold focus:outline-none focus:shadow-outline shadow-lg bg-gradient-to-tl from-primary-500 to-secondary-500 bg-size-200 bg-pos-0 hover:bg-pos-100 transition-all duration-500" class="mx-auto mt-8 flex justify-center text-white p-4 rounded-md tracking-wide font-bold focus:outline-none focus:shadow-outline shadow-lg bg-gradient-to-tl from-primary-500 to-secondary-500 bg-size-200 bg-pos-0 hover:bg-pos-100 transition-all duration-500"
onclick="(window.opener || window.parent).postMessage({subject:'org.imsglobal.lti.close'}, '*');" onclick="(window.opener || window.parent).postMessage({subject:'org.imsglobal.lti.close'}, '*');"
> >
<%= gettext("Finish") %> {gettext("Finish")}
</button> </button>
</div> </div>
</div> </div>

View File

@@ -2,12 +2,12 @@
<.form :let={_f} for={:user} action={~p"/users/confirm/#{@token}"}> <.form :let={_f} for={:user} action={~p"/users/confirm/#{@token}"}>
<div> <div>
<%= submit("Confirm my account") %> {submit("Confirm my account")}
</div> </div>
</.form> </.form>
<p> <p>
<%= link("Register", to: ~p"/users/register") %> | <%= link("Log in", {link("Register", to: ~p"/users/register")} | {link("Log in",
to: ~p"/users/log_in" to: ~p"/users/log_in"
) %> )}
</p> </p>

View File

@@ -1,16 +1,16 @@
<h1>Resend confirmation instructions</h1> <h1>Resend confirmation instructions</h1>
<.form :let={f} for={:user} action={~p"/users/confirm"}> <.form :let={f} for={:user} action={~p"/users/confirm"}>
<%= label(f, :email) %> {label(f, :email)}
<%= email_input(f, :email, required: true) %> {email_input(f, :email, required: true)}
<div> <div>
<%= submit("Resend confirmation instructions") %> {submit("Resend confirmation instructions")}
</div> </div>
</.form> </.form>
<p> <p>
<%= link("Register", to: ~p"/users/register") %> | <%= link("Log in", {link("Register", to: ~p"/users/register")} | {link("Log in",
to: ~p"/users/log_in" to: ~p"/users/log_in"
) %> )}
</p> </p>

View File

@@ -1,16 +1,16 @@
<h1>Resend confirmation instructions</h1> <h1>Resend confirmation instructions</h1>
<%= form_for :user, ~p"/users/confirm", fn f -> %> <%= form_for :user, ~p"/users/confirm", fn f -> %>
<%= label(f, :email) %> {label(f, :email)}
<%= email_input(f, :email, required: true) %> {email_input(f, :email, required: true)}
<div> <div>
<%= submit("Resend confirmation instructions") %> {submit("Resend confirmation instructions")}
</div> </div>
<% end %> <% end %>
<p> <p>
<%= link("Register", to: ~p"/users/register") %> | <%= link("Log in", {link("Register", to: ~p"/users/register")} | {link("Log in",
to: ~p"/users/log_in" to: ~p"/users/log_in"
) %> )}
</p> </p>

View File

@@ -14,22 +14,22 @@
<tr> <tr>
<td style="padding:0 35px;"> <td style="padding:0 35px;">
<h1 style="color:#1e1e2d; font-weight:500; margin:0;font-size:32px;font-family:'Rubik',sans-serif;"> <h1 style="color:#1e1e2d; font-weight:500; margin:0;font-size:32px;font-family:'Rubik',sans-serif;">
<%= gettext("Confirm email") %> {gettext("Confirm email")}
</h1> </h1>
<span style="display:inline-block; vertical-align:middle; margin:29px 0 26px; border-bottom:1px solid #cecece; width:100px;"> <span style="display:inline-block; vertical-align:middle; margin:29px 0 26px; border-bottom:1px solid #cecece; width:100px;">
</span> </span>
<p style="color:#455056; font-size:15px;line-height:24px; margin:0;"> <p style="color:#455056; font-size:15px;line-height:24px; margin:0;">
<%= gettext("You can change your email by visiting the URL below") %> {gettext("You can change your email by visiting the URL below")}
</p> </p>
<a <a
href={@url} href={@url}
target="_blank" target="_blank"
style="background:#8611ed;text-decoration:none !important; font-weight:500; margin-top:35px; color:#fff;text-transform:uppercase; font-size:14px;padding:10px 24px;display:inline-block;border-radius:50px;" style="background:#8611ed;text-decoration:none !important; font-weight:500; margin-top:35px; color:#fff;text-transform:uppercase; font-size:14px;padding:10px 24px;display:inline-block;border-radius:50px;"
> >
<%= gettext("CONFIRM EMAIL") %> {gettext("CONFIRM EMAIL")}
</a> </a>
<p style="color:#455056; font-size:15px;line-height:24px; margin-top:26px;"> <p style="color:#455056; font-size:15px;line-height:24px; margin-top:26px;">
<%= gettext("If you didn't create an account with us, please ignore this.") %> {gettext("If you didn't create an account with us, please ignore this.")}
</p> </p>
</td> </td>
</tr> </tr>
@@ -39,11 +39,11 @@
<tr> <tr>
<td style="font-size: 0.8em; color: #6C6C6C"> <td style="font-size: 0.8em; color: #6C6C6C">
<p class="sub"> <p class="sub">
<%= gettext( {gettext(
"If youre having trouble with the button above, copy and paste the URL below into your web browser" "If youre having trouble with the button above, copy and paste the URL below into your web browser"
) %>. )}.
</p> </p>
<p class="sub"><%= @url %></p> <p class="sub">{@url}</p>
</td> </td>
</tr> </tr>
<tr> <tr>

View File

@@ -14,22 +14,22 @@
<tr> <tr>
<td style="padding:0 35px;"> <td style="padding:0 35px;">
<h1 style="color:#1e1e2d; font-weight:500; margin:0;font-size:32px;font-family:'Rubik',sans-serif;"> <h1 style="color:#1e1e2d; font-weight:500; margin:0;font-size:32px;font-family:'Rubik',sans-serif;">
<%= gettext("Confirm account") %> {gettext("Confirm account")}
</h1> </h1>
<span style="display:inline-block; vertical-align:middle; margin:29px 0 26px; border-bottom:1px solid #cecece; width:100px;"> <span style="display:inline-block; vertical-align:middle; margin:29px 0 26px; border-bottom:1px solid #cecece; width:100px;">
</span> </span>
<p style="color:#455056; font-size:15px;line-height:24px; margin:0;"> <p style="color:#455056; font-size:15px;line-height:24px; margin:0;">
<%= gettext("You can confirm your account by visiting the URL below") %> {gettext("You can confirm your account by visiting the URL below")}
</p> </p>
<a <a
href={@url} href={@url}
target="_blank" target="_blank"
style="background:#8611ed;text-decoration:none !important; font-weight:500; margin-top:35px; color:#fff;text-transform:uppercase; font-size:14px;padding:10px 24px;display:inline-block;border-radius:50px;" style="background:#8611ed;text-decoration:none !important; font-weight:500; margin-top:35px; color:#fff;text-transform:uppercase; font-size:14px;padding:10px 24px;display:inline-block;border-radius:50px;"
> >
<%= gettext("CONFIRM ACCOUNT") %> {gettext("CONFIRM ACCOUNT")}
</a> </a>
<p style="color:#455056; font-size:15px;line-height:24px; margin-top:26px;"> <p style="color:#455056; font-size:15px;line-height:24px; margin-top:26px;">
<%= gettext("If you didn't create an account with us, please ignore this.") %> {gettext("If you didn't create an account with us, please ignore this.")}
</p> </p>
</td> </td>
</tr> </tr>
@@ -39,11 +39,11 @@
<tr> <tr>
<td style="font-size: 0.8em; color: #6C6C6C"> <td style="font-size: 0.8em; color: #6C6C6C">
<p class="sub"> <p class="sub">
<%= gettext( {gettext(
"If youre having trouble with the button above, copy and paste the URL below into your web browser" "If youre having trouble with the button above, copy and paste the URL below into your web browser"
) %>. )}.
</p> </p>
<p class="sub"><%= @url %></p> <p class="sub">{@url}</p>
</td> </td>
</tr> </tr>
<tr> <tr>

View File

@@ -14,22 +14,22 @@
<tr> <tr>
<td style="padding:0 35px;"> <td style="padding:0 35px;">
<h1 style="color:#1e1e2d; font-weight:500; margin:0;font-size:32px;font-family:'Rubik',sans-serif;"> <h1 style="color:#1e1e2d; font-weight:500; margin:0;font-size:32px;font-family:'Rubik',sans-serif;">
<%= gettext("Connect to Claper") %> {gettext("Connect to Claper")}
</h1> </h1>
<span style="display:inline-block; vertical-align:middle; margin:29px 0 26px; border-bottom:1px solid #cecece; width:100px;"> <span style="display:inline-block; vertical-align:middle; margin:29px 0 26px; border-bottom:1px solid #cecece; width:100px;">
</span> </span>
<p style="color:#455056; font-size:15px;line-height:24px; margin:0;"> <p style="color:#455056; font-size:15px;line-height:24px; margin:0;">
<%= gettext("You can log into your account by clicking here.") %> {gettext("You can log into your account by clicking here.")}
</p> </p>
<a <a
href={@url} href={@url}
target="_blank" target="_blank"
style="background:#8611ed;text-decoration:none !important; font-weight:500; margin-top:35px; color:#fff;text-transform:uppercase; font-size:14px;padding:10px 24px;display:inline-block;border-radius:50px;" style="background:#8611ed;text-decoration:none !important; font-weight:500; margin-top:35px; color:#fff;text-transform:uppercase; font-size:14px;padding:10px 24px;display:inline-block;border-radius:50px;"
> >
<%= gettext("ACCESS TO MY ACCOUNT") %> {gettext("ACCESS TO MY ACCOUNT")}
</a> </a>
<p style="color:#455056; font-size:15px;line-height:24px; margin-top:26px;"> <p style="color:#455056; font-size:15px;line-height:24px; margin-top:26px;">
<%= gettext("If you didn't create an account with us, please ignore this.") %> {gettext("If you didn't create an account with us, please ignore this.")}
</p> </p>
</td> </td>
</tr> </tr>
@@ -39,11 +39,11 @@
<tr> <tr>
<td style="font-size: 0.8em; color: #6C6C6C"> <td style="font-size: 0.8em; color: #6C6C6C">
<p class="sub"> <p class="sub">
<%= gettext( {gettext(
"If youre having trouble with the button above, copy and paste the URL below into your web browser" "If youre having trouble with the button above, copy and paste the URL below into your web browser"
) %>. )}.
</p> </p>
<p class="sub"><%= @url %></p> <p class="sub">{@url}</p>
</td> </td>
</tr> </tr>
<tr> <tr>

View File

@@ -14,22 +14,22 @@
<tr> <tr>
<td style="padding:0 35px;"> <td style="padding:0 35px;">
<h1 style="color:#1e1e2d; font-weight:500; margin:0;font-size:32px;font-family:'Rubik',sans-serif;"> <h1 style="color:#1e1e2d; font-weight:500; margin:0;font-size:32px;font-family:'Rubik',sans-serif;">
<%= gettext("Reset password") %> {gettext("Reset password")}
</h1> </h1>
<span style="display:inline-block; vertical-align:middle; margin:29px 0 26px; border-bottom:1px solid #cecece; width:100px;"> <span style="display:inline-block; vertical-align:middle; margin:29px 0 26px; border-bottom:1px solid #cecece; width:100px;">
</span> </span>
<p style="color:#455056; font-size:15px;line-height:24px; margin:0;"> <p style="color:#455056; font-size:15px;line-height:24px; margin:0;">
<%= gettext("You can reset your password by visiting the URL below") %> {gettext("You can reset your password by visiting the URL below")}
</p> </p>
<a <a
href={@url} href={@url}
target="_blank" target="_blank"
style="background:#8611ed;text-decoration:none !important; font-weight:500; margin-top:35px; color:#fff;text-transform:uppercase; font-size:14px;padding:10px 24px;display:inline-block;border-radius:50px;" style="background:#8611ed;text-decoration:none !important; font-weight:500; margin-top:35px; color:#fff;text-transform:uppercase; font-size:14px;padding:10px 24px;display:inline-block;border-radius:50px;"
> >
<%= gettext("RESET PASSWORD") %> {gettext("RESET PASSWORD")}
</a> </a>
<p style="color:#455056; font-size:15px;line-height:24px; margin-top:26px;"> <p style="color:#455056; font-size:15px;line-height:24px; margin-top:26px;">
<%= gettext("If you didn't create an account with us, please ignore this.") %> {gettext("If you didn't create an account with us, please ignore this.")}
</p> </p>
</td> </td>
</tr> </tr>
@@ -39,11 +39,11 @@
<tr> <tr>
<td style="font-size: 0.8em; color: #6C6C6C"> <td style="font-size: 0.8em; color: #6C6C6C">
<p class="sub"> <p class="sub">
<%= gettext( {gettext(
"If youre having trouble with the button above, copy and paste the URL below into your web browser" "If youre having trouble with the button above, copy and paste the URL below into your web browser"
) %>. )}.
</p> </p>
<p class="sub"><%= @url %></p> <p class="sub">{@url}</p>
</td> </td>
</tr> </tr>
<tr> <tr>

View File

@@ -14,59 +14,59 @@
<tr> <tr>
<td style="padding:0 35px;"> <td style="padding:0 35px;">
<h1 style="color:#1e1e2d; font-weight:500; margin:0;font-size:32px;font-family:'Rubik',sans-serif;"> <h1 style="color:#1e1e2d; font-weight:500; margin:0;font-size:32px;font-family:'Rubik',sans-serif;">
<%= gettext("Welcome !") %> {gettext("Welcome !")}
</h1> </h1>
<span style="display:inline-block; vertical-align:middle; margin:29px 0 26px; border-bottom:1px solid #cecece; width:100px;"> <span style="display:inline-block; vertical-align:middle; margin:29px 0 26px; border-bottom:1px solid #cecece; width:100px;">
</span> </span>
<p style="color:#455056; font-size:15px;line-height:24px; margin:0;"> <p style="color:#455056; font-size:15px;line-height:24px; margin:0;">
<%= gettext( {gettext(
"Congrats! You've taken the first step to improving your presentations. Here are the next steps to create step up your presentations with Claper:" "Congrats! You've taken the first step to improving your presentations. Here are the next steps to create step up your presentations with Claper:"
) %> )}
</p> </p>
<ol style="color:#455056; font-size:15px;line-height:24px; margin:10px 0px; text-align: left;"> <ol style="color:#455056; font-size:15px;line-height:24px; margin:10px 0px; text-align: left;">
<li> <li>
<%= raw( {raw(
gettext( gettext(
"<span style='font-weight: 700'>Export your current presentation</span> to PDF from your favorite slide presentation software (PowerPoint, etc)" "<span style='font-weight: 700'>Export your current presentation</span> to PDF from your favorite slide presentation software (PowerPoint, etc)"
) )
) %> )}
</li> </li>
<li> <li>
<%= raw( {raw(
gettext( gettext(
"Click on the <span style='font-weight: 700'>create button</span> on your dashboard" "Click on the <span style='font-weight: 700'>create button</span> on your dashboard"
) )
) %> )}
</li> </li>
<li> <li>
<%= raw( {raw(
gettext( gettext(
"Choose <span style='font-weight: 700'>a name</span> for your event, <span style='font-weight: 700'>a code</span> for your attendees to join and <span style='font-weight: 700'>dates when your attendees could start interacting</span>" "Choose <span style='font-weight: 700'>a name</span> for your event, <span style='font-weight: 700'>a code</span> for your attendees to join and <span style='font-weight: 700'>dates when your attendees could start interacting</span>"
) )
) %> )}
</li> </li>
<li> <li>
<%= raw( {raw(
gettext( gettext(
"<span style='font-weight: 700'>Wait few minutes</span> for your file to be processed" "<span style='font-weight: 700'>Wait few minutes</span> for your file to be processed"
) )
) %> )}
</li> </li>
<li> <li>
<%= raw( {raw(
gettext( gettext(
"Click on <span style='font-weight: 700'>Present/Customize</span> to add interaction on your slides" "Click on <span style='font-weight: 700'>Present/Customize</span> to add interaction on your slides"
) )
) %> )}
</li> </li>
<li> <li>
<%= raw( {raw(
gettext( gettext(
"Click <span style='font-weight: 700'>Start</span> to open your presentation and move the window on the big screen" "Click <span style='font-weight: 700'>Start</span> to open your presentation and move the window on the big screen"
) )
) %> )}
</li> </li>
<li><%= gettext("Enjoy ! ✨") %></li> <li>{gettext("Enjoy ! ✨")}</li>
</ol> </ol>
</td> </td>
</tr> </tr>

View File

@@ -10,23 +10,23 @@
</h2> </h2>
<p class="mt-6 text-lg md:text-xl font-bold text-gray-100"> <p class="mt-6 text-lg md:text-xl font-bold text-gray-100">
<%= if @conn.query_params["retry"] do %> <%= if @conn.query_params["retry"] do %>
<%= gettext("We already sent you an email to login, please retry in 5 minutes.") %> {gettext("We already sent you an email to login, please retry in 5 minutes.")}
<% else %> <% else %>
<%= if @conn.query_params["email"] do %> <%= if @conn.query_params["email"] do %>
<%= gettext("We sent you an email at") <> {gettext("We sent you an email at") <>
" #{@conn.query_params["email"]}" <> " #{@conn.query_params["email"]}" <>
gettext(", click on the provided link to connect (check your spam !)") %> gettext(", click on the provided link to connect (check your spam !)")}
<% else %> <% else %>
<%= gettext( {gettext(
"We sent you an email, click on the provided link to connect (check your spam !)" "We sent you an email, click on the provided link to connect (check your spam !)"
) %> )}
<% end %> <% end %>
<% end %> <% end %>
</p> </p>
<div class="mt-10"> <div class="mt-10">
<.link href={~p"/"} class="text-sm text-white underline"> <.link href={~p"/"} class="text-sm text-white underline">
<%= gettext("back to the home page") %> {gettext("back to the home page")}
</.link> </.link>
</div> </div>
</div> </div>

View File

@@ -9,7 +9,7 @@
</a> </a>
</h2> </h2>
<h2 class="mt-6 text-3xl font-bold text-gray-100"> <h2 class="mt-6 text-3xl font-bold text-gray-100">
<%= gettext("Join the Claper experience") %> {gettext("Join the Claper experience")}
</h2> </h2>
</div> </div>
@@ -43,7 +43,7 @@
type="submit" type="submit"
class="w-full flex justify-center text-white p-4 rounded-full tracking-wide font-bold focus:outline-none focus:shadow-outline shadow-lg bg-gradient-to-tl from-primary-500 to-secondary-500 bg-size-200 bg-pos-0 hover:bg-pos-100 transition-all duration-500" class="w-full flex justify-center text-white p-4 rounded-full tracking-wide font-bold focus:outline-none focus:shadow-outline shadow-lg bg-gradient-to-tl from-primary-500 to-secondary-500 bg-size-200 bg-pos-0 hover:bg-pos-100 transition-all duration-500"
> >
<%= gettext("Create account") %> {gettext("Create account")}
</button> </button>
</div> </div>
</.form> </.form>

View File

@@ -9,7 +9,7 @@
</a> </a>
</h2> </h2>
<h2 class="mt-6 text-3xl font-bold text-gray-100"> <h2 class="mt-6 text-3xl font-bold text-gray-100">
<%= gettext("Reset your password") %> {gettext("Reset your password")}
</h2> </h2>
</div> </div>
@@ -48,7 +48,7 @@
type="submit" type="submit"
class="w-full flex justify-center text-white p-4 rounded-full tracking-wide font-bold focus:outline-none focus:shadow-outline shadow-lg bg-gradient-to-tl from-primary-500 to-secondary-500 bg-size-200 bg-pos-0 hover:bg-pos-100 transition-all duration-500" class="w-full flex justify-center text-white p-4 rounded-full tracking-wide font-bold focus:outline-none focus:shadow-outline shadow-lg bg-gradient-to-tl from-primary-500 to-secondary-500 bg-size-200 bg-pos-0 hover:bg-pos-100 transition-all duration-500"
> >
<%= gettext("Confirm new password") %> {gettext("Confirm new password")}
</button> </button>
</div> </div>
</.form> </.form>

View File

@@ -9,7 +9,7 @@
</a> </a>
</h2> </h2>
<h2 class="mt-6 text-3xl font-bold text-gray-100"> <h2 class="mt-6 text-3xl font-bold text-gray-100">
<%= gettext("Reset your password") %> {gettext("Reset your password")}
</h2> </h2>
</div> </div>
@@ -33,7 +33,7 @@
type="submit" type="submit"
class="w-full flex justify-center text-white p-4 rounded-full tracking-wide font-bold focus:outline-none focus:shadow-outline shadow-lg bg-gradient-to-tl from-primary-500 to-secondary-500 bg-size-200 bg-pos-0 hover:bg-pos-100 transition-all duration-500" class="w-full flex justify-center text-white p-4 rounded-full tracking-wide font-bold focus:outline-none focus:shadow-outline shadow-lg bg-gradient-to-tl from-primary-500 to-secondary-500 bg-size-200 bg-pos-0 hover:bg-pos-100 transition-all duration-500"
> >
<%= gettext("Send link to reset password") %> {gettext("Send link to reset password")}
</button> </button>
</div> </div>
</.form> </.form>

View File

@@ -19,10 +19,10 @@
<img src="/images/logo.svg" class="h-10 w-auto inline" /> <img src="/images/logo.svg" class="h-10 w-auto inline" />
</h2> </h2>
<h2 class="mt-6 text-4xl md:text-6xl font-bold text-gray-100"> <h2 class="mt-6 text-4xl md:text-6xl font-bold text-gray-100">
<%= gettext("It's time to empower your presentations.") %> {gettext("It's time to empower your presentations.")}
</h2> </h2>
<p class="mt-10 text-2xl md:text-4xl text-gray-200"> <p class="mt-10 text-2xl md:text-4xl text-gray-200">
<%= gettext("Connect to your account") %> {gettext("Connect to your account")}
</p> </p>
</div> </div>
<div class="flex flex-row justify-center items-center space-x-3"></div> <div class="flex flex-row justify-center items-center space-x-3"></div>
@@ -59,7 +59,7 @@
type="submit" type="submit"
class="w-full flex justify-center text-white p-4 rounded-md tracking-wide font-bold focus:outline-none focus:shadow-outline shadow-lg bg-gradient-to-tl from-primary-500 to-secondary-500 bg-size-200 bg-pos-0 hover:bg-pos-100 transition-all duration-500" class="w-full flex justify-center text-white p-4 rounded-md tracking-wide font-bold focus:outline-none focus:shadow-outline shadow-lg bg-gradient-to-tl from-primary-500 to-secondary-500 bg-size-200 bg-pos-0 hover:bg-pos-100 transition-all duration-500"
> >
<%= gettext("Login") %> {gettext("Login")}
</button> </button>
</div> </div>
</.form> </.form>
@@ -71,20 +71,20 @@
"w-full flex justify-center items-center gap-x-2 py-2 px-4 rounded-md shadow-sm text-sm font-medium text-white border-2 border-secondary-500 hover:bg-secondary-500 hover:bg-opacity-40" "w-full flex justify-center items-center gap-x-2 py-2 px-4 rounded-md shadow-sm text-sm font-medium text-white border-2 border-secondary-500 hover:bg-secondary-500 hover:bg-opacity-40"
) do %> ) do %>
<img width="24" src={@oidc_logo_url} /> <img width="24" src={@oidc_logo_url} />
<span><%= gettext("Login with %{provider}", provider: @oidc_provider_name) %></span> <span>{gettext("Login with %{provider}", provider: @oidc_provider_name)}</span>
<% end %> <% end %>
</div> </div>
<div class="mt-4 text-center justify-center"> <div class="mt-4 text-center justify-center">
<%= link(gettext("Forgot your password?"), {link(gettext("Forgot your password?"),
to: ~p"/users/reset_password", to: ~p"/users/reset_password",
class: "text-white text-sm text-center" class: "text-white text-sm text-center"
) %> )}
<%= if Application.get_env(:claper, :enable_account_creation) do %> <%= if Application.get_env(:claper, :enable_account_creation) do %>
<span class="text-white">•</span> <%= link(gettext("Create account"), <span class="text-white">•</span> {link(gettext("Create account"),
to: ~p"/users/register", to: ~p"/users/register",
class: "text-white text-sm text-center" class: "text-white text-sm text-center"
) %> )}
<% end %> <% end %>
</div> </div>
</div> </div>

View File

@@ -32,7 +32,7 @@ defmodule ClaperWeb.Component.Alert do
</div> </div>
<div class="ml-3"> <div class="ml-3">
<p class="text-sm text-supporting-green-700"> <p class="text-sm text-supporting-green-700">
<%= @message %> {@message}
</p> </p>
</div> </div>
</div> </div>
@@ -72,7 +72,7 @@ defmodule ClaperWeb.Component.Alert do
</div> </div>
<div class="ml-3"> <div class="ml-3">
<p class="text-sm text-supporting-red-700"> <p class="text-sm text-supporting-red-700">
<%= @message %> {@message}
</p> </p>
</div> </div>
</div> </div>

View File

@@ -19,9 +19,9 @@ defmodule ClaperWeb.Component.Input do
~H""" ~H"""
<div class="relative"> <div class="relative">
<%= label(@form, @key, @name, class: "block text-sm font-medium #{@labelClass}") %> {label(@form, @key, @name, class: "block text-sm font-medium #{@labelClass}")}
<div class="mt-1"> <div class="mt-1">
<%= text_input(@form, @key, {text_input(@form, @key,
required: @required, required: @required,
readonly: @readonly, readonly: @readonly,
autofocus: @autofocus, autofocus: @autofocus,
@@ -32,10 +32,10 @@ defmodule ClaperWeb.Component.Input do
maxlength: @maxlength, maxlength: @maxlength,
class: class:
"#{@fieldClass} read-only:opacity-50 outline-none shadow-base focus:ring-primary-500 focus:border-primary-500 focus:ring-2 block w-full text-lg border-gray-300 rounded-md py-2 px-3" "#{@fieldClass} read-only:opacity-50 outline-none shadow-base focus:ring-primary-500 focus:border-primary-500 focus:ring-2 block w-full text-lg border-gray-300 rounded-md py-2 px-3"
) %> )}
</div> </div>
<%= if Keyword.has_key?(@form.errors, @key) do %> <%= if Keyword.has_key?(@form.errors, @key) do %>
<p class="text-supporting-red-500 text-sm"><%= error_tag(@form, @key) %></p> <p class="text-supporting-red-500 text-sm">{error_tag(@form, @key)}</p>
<% end %> <% end %>
</div> </div>
""" """
@@ -54,9 +54,9 @@ defmodule ClaperWeb.Component.Input do
~H""" ~H"""
<div class="relative"> <div class="relative">
<%= label(@form, @key, @name, class: "block text-sm font-medium #{@labelClass}") %> {label(@form, @key, @name, class: "block text-sm font-medium #{@labelClass}")}
<div class="mt-1"> <div class="mt-1">
<%= text_input(@form, @key, {text_input(@form, @key,
required: @required, required: @required,
readonly: @readonly, readonly: @readonly,
autofocus: @autofocus, autofocus: @autofocus,
@@ -65,10 +65,10 @@ defmodule ClaperWeb.Component.Input do
value: @value, value: @value,
class: class:
"#{@fieldClass} read-only:opacity-50 outline-none shadow-base focus:ring-primary-500 focus:border-primary-500 focus:ring-2 block w-full text-lg border-gray-300 rounded-md py-2 px-3" "#{@fieldClass} read-only:opacity-50 outline-none shadow-base focus:ring-primary-500 focus:border-primary-500 focus:ring-2 block w-full text-lg border-gray-300 rounded-md py-2 px-3"
) %> )}
</div> </div>
<%= if Keyword.has_key?(@form.errors, @key) do %> <%= if Keyword.has_key?(@form.errors, @key) do %>
<p class="text-supporting-red-500 text-sm"><%= error_tag(@form, @key) %></p> <p class="text-supporting-red-500 text-sm">{error_tag(@form, @key)}</p>
<% end %> <% end %>
</div> </div>
""" """
@@ -85,19 +85,19 @@ defmodule ClaperWeb.Component.Input do
~H""" ~H"""
<div class="relative"> <div class="relative">
<%= label(@form, @key, @name, class: "block text-sm font-medium #{@labelClass}") %> {label(@form, @key, @name, class: "block text-sm font-medium #{@labelClass}")}
<div class="mt-1"> <div class="mt-1">
<%= select(@form, @key, @array, {select(@form, @key, @array,
required: @required, required: @required,
autofocus: @autofocus, autofocus: @autofocus,
placeholder: @placeholder, placeholder: @placeholder,
autocomplete: @key, autocomplete: @key,
class: class:
"#{@fieldClass} outline-none shadow-base focus:ring-primary-500 focus:border-primary-500 block w-full text-lg border-gray-300 rounded-md py-2 px-3" "#{@fieldClass} outline-none shadow-base focus:ring-primary-500 focus:border-primary-500 block w-full text-lg border-gray-300 rounded-md py-2 px-3"
) %> )}
</div> </div>
<%= if Keyword.has_key?(@form.errors, @key) do %> <%= if Keyword.has_key?(@form.errors, @key) do %>
<p class="text-supporting-red-500 text-sm"><%= error_tag(@form, @key) %></p> <p class="text-supporting-red-500 text-sm">{error_tag(@form, @key)}</p>
<% end %> <% end %>
</div> </div>
""" """
@@ -156,7 +156,7 @@ defmodule ClaperWeb.Component.Input do
phx-key={@shortcut} phx-key={@shortcut}
phx-window-keydown={if @shortcut && not @disabled, do: checked(@checked, @key)} phx-window-keydown={if @shortcut && not @disabled, do: checked(@checked, @key)}
> >
<%= render_slot(@inner_block) %> {render_slot(@inner_block)}
</button> </button>
""" """
end end
@@ -201,14 +201,14 @@ defmodule ClaperWeb.Component.Input do
~H""" ~H"""
<div class="relative"> <div class="relative">
<%= label(@form, @key, @name, class: "block text-sm font-medium text-gray-700") %> {label(@form, @key, @name, class: "block text-sm font-medium text-gray-700")}
<div class="mt-1 relative"> <div class="mt-1 relative">
<img <img
class="icon absolute transition-all top-2.5 left-2 duration-100 h-6" class="icon absolute transition-all top-2.5 left-2 duration-100 h-6"
src="/images/icons/hashtag.svg" src="/images/icons/hashtag.svg"
alt="code" alt="code"
/> />
<%= text_input(@form, @key, {text_input(@form, @key,
required: @required, required: @required,
readonly: @readonly, readonly: @readonly,
placeholder: @placeholder, placeholder: @placeholder,
@@ -218,10 +218,10 @@ defmodule ClaperWeb.Component.Input do
maxlength: 10, maxlength: 10,
class: class:
"read-only:opacity-50 outline-none shadow-base focus:ring-primary-500 focus:border-primary-500 block w-full text-lg border-gray-300 rounded-md py-2 pr-3 pl-9 uppercase" "read-only:opacity-50 outline-none shadow-base focus:ring-primary-500 focus:border-primary-500 block w-full text-lg border-gray-300 rounded-md py-2 pr-3 pl-9 uppercase"
) %> )}
</div> </div>
<%= if Keyword.has_key?(@form.errors, @key) do %> <%= if Keyword.has_key?(@form.errors, @key) do %>
<p class="text-supporting-red-500 text-sm"><%= error_tag(@form, @key) %></p> <p class="text-supporting-red-500 text-sm">{error_tag(@form, @key)}</p>
<% end %> <% end %>
</div> </div>
""" """
@@ -238,20 +238,20 @@ defmodule ClaperWeb.Component.Input do
~H""" ~H"""
<div> <div>
<div class="relative" id="date" phx-hook="Pickr"> <div class="relative" id="date" phx-hook="Pickr">
<%= label(@form, @key, @name, class: "block text-sm font-medium text-gray-700") %> {label(@form, @key, @name, class: "block text-sm font-medium text-gray-700")}
<div class="mt-1 relative"> <div class="mt-1 relative">
<%= hidden_input(@form, @key) %> {hidden_input(@form, @key)}
<%= text_input(@form, :local_date, {text_input(@form, :local_date,
autofocus: @autofocus, autofocus: @autofocus,
placeholder: @placeholder, placeholder: @placeholder,
autocomplete: false, autocomplete: false,
class: class:
"outline-none shadow-base focus:ring-primary-500 focus:border-primary-500 block w-full text-lg border-gray-300 rounded-md py-2 px-3 read-only:opacity-50" "outline-none shadow-base focus:ring-primary-500 focus:border-primary-500 block w-full text-lg border-gray-300 rounded-md py-2 px-3 read-only:opacity-50"
) %> )}
</div> </div>
<%= if Keyword.has_key?(@form.errors, @key) do %> <%= if Keyword.has_key?(@form.errors, @key) do %>
<p class="text-supporting-red-500 text-sm"><%= error_tag(@form, @key) %></p> <p class="text-supporting-red-500 text-sm">{error_tag(@form, @key)}</p>
<% end %> <% end %>
</div> </div>
</div> </div>
@@ -271,9 +271,9 @@ defmodule ClaperWeb.Component.Input do
~H""" ~H"""
<div class="relative" x-data={"{input: '#{assigns.value}'}"}> <div class="relative" x-data={"{input: '#{assigns.value}'}"}>
<%= label(@form, @key, @name, class: "block text-sm font-medium #{@labelClass}") %> {label(@form, @key, @name, class: "block text-sm font-medium #{@labelClass}")}
<div class="mt-1"> <div class="mt-1">
<%= email_input(@form, @key, {email_input(@form, @key,
required: @required, required: @required,
autofocus: @autofocus, autofocus: @autofocus,
placeholder: @placeholder, placeholder: @placeholder,
@@ -284,10 +284,10 @@ defmodule ClaperWeb.Component.Input do
"#{@fieldClass} read-only:opacity-50 shadow-base block w-full text-lg focus:ring-primary-500 focus:ring-2 outline-none rounded-md py-2 px-3", "#{@fieldClass} read-only:opacity-50 shadow-base block w-full text-lg focus:ring-primary-500 focus:ring-2 outline-none rounded-md py-2 px-3",
"x-model": "input", "x-model": "input",
"x-ref": "input" "x-ref": "input"
) %> )}
</div> </div>
<%= if Keyword.has_key?(@form.errors, @key) do %> <%= if Keyword.has_key?(@form.errors, @key) do %>
<p class="text-supporting-red-500 text-sm"><%= error_tag(@form, @key) %></p> <p class="text-supporting-red-500 text-sm">{error_tag(@form, @key)}</p>
<% end %> <% end %>
</div> </div>
""" """
@@ -305,9 +305,9 @@ defmodule ClaperWeb.Component.Input do
~H""" ~H"""
<div class="relative" x-data={"{input: '#{assigns.value}'}"}> <div class="relative" x-data={"{input: '#{assigns.value}'}"}>
<%= label(@form, @key, @name, class: "block text-sm font-medium #{@labelClass}") %> {label(@form, @key, @name, class: "block text-sm font-medium #{@labelClass}")}
<div class="mt-1"> <div class="mt-1">
<%= password_input(@form, @key, {password_input(@form, @key,
required: @required, required: @required,
autofocus: @autofocus, autofocus: @autofocus,
placeholder: @placeholder, placeholder: @placeholder,
@@ -315,10 +315,10 @@ defmodule ClaperWeb.Component.Input do
"#{@fieldClass} shadow-base block w-full text-lg focus:ring-primary-500 focus:ring-2 outline-none rounded-md py-2 px-3", "#{@fieldClass} shadow-base block w-full text-lg focus:ring-primary-500 focus:ring-2 outline-none rounded-md py-2 px-3",
"x-model": "input", "x-model": "input",
"x-ref": "input" "x-ref": "input"
) %> )}
</div> </div>
<%= if Keyword.has_key?(@form.errors, @key) do %> <%= if Keyword.has_key?(@form.errors, @key) do %>
<p class="text-supporting-red-500 text-sm"><%= error_tag(@form, @key) %></p> <p class="text-supporting-red-500 text-sm">{error_tag(@form, @key)}</p>
<% end %> <% end %>
</div> </div>
""" """

View File

@@ -3,18 +3,16 @@ defmodule ClaperWeb.ErrorHelpers do
Conveniences for translating and building error messages. Conveniences for translating and building error messages.
""" """
import Phoenix.HTML.Form
use PhoenixHTMLHelpers use PhoenixHTMLHelpers
@doc """ @doc """
Generates tag for inlined form input errors. Generates tag for inlined form input errors.
""" """
def error_tag(form, field) do def error_tag(form, field) do
Enum.map(Keyword.get_values(form.errors, field), fn error -> errors = if Phoenix.Component.used_input?(form[field]), do: form[field].errors, else: []
content_tag(:span, translate_error(error),
class: "invalid-feedback", Enum.map(errors, fn error ->
phx_feedback_for: input_name(form, field) content_tag(:span, translate_error(error), class: "invalid-feedback")
)
end) end)
end end

View File

@@ -1,7 +1,7 @@
defmodule Claper.MixProject do defmodule Claper.MixProject do
use Mix.Project use Mix.Project
@version "2.3.3" @version "2.4.0"
def project do def project do
[ [
@@ -87,7 +87,7 @@ defmodule Claper.MixProject do
{:phoenix_html, "~> 4.2"}, {:phoenix_html, "~> 4.2"},
{:phoenix_html_helpers, "~> 1.0"}, {:phoenix_html_helpers, "~> 1.0"},
{:phoenix_live_reload, "~> 1.6", only: :dev}, {:phoenix_live_reload, "~> 1.6", only: :dev},
{:phoenix_live_view, "~> 0.20.14"}, {:phoenix_live_view, "~> 1.0"},
{:phoenix_swoosh, "~> 1.2.1"}, {:phoenix_swoosh, "~> 1.2.1"},
{:phoenix_view, "~> 2.0"}, {:phoenix_view, "~> 2.0"},
{:floki, ">= 0.36.1", only: :test}, {:floki, ">= 0.36.1", only: :test},

View File

@@ -9,7 +9,7 @@
"cowboy": {:hex, :cowboy, "2.13.0", "09d770dd5f6a22cc60c071f432cd7cb87776164527f205c5a6b0f24ff6b38990", [:make, :rebar3], [{:cowlib, ">= 2.14.0 and < 3.0.0", [hex: :cowlib, repo: "hexpm", optional: false]}, {:ranch, ">= 1.8.0 and < 3.0.0", [hex: :ranch, repo: "hexpm", optional: false]}], "hexpm", "e724d3a70995025d654c1992c7b11dbfea95205c047d86ff9bf1cda92ddc5614"}, "cowboy": {:hex, :cowboy, "2.13.0", "09d770dd5f6a22cc60c071f432cd7cb87776164527f205c5a6b0f24ff6b38990", [:make, :rebar3], [{:cowlib, ">= 2.14.0 and < 3.0.0", [hex: :cowlib, repo: "hexpm", optional: false]}, {:ranch, ">= 1.8.0 and < 3.0.0", [hex: :ranch, repo: "hexpm", optional: false]}], "hexpm", "e724d3a70995025d654c1992c7b11dbfea95205c047d86ff9bf1cda92ddc5614"},
"cowboy_telemetry": {:hex, :cowboy_telemetry, "0.4.0", "f239f68b588efa7707abce16a84d0d2acf3a0f50571f8bb7f56a15865aae820c", [:rebar3], [{:cowboy, "~> 2.7", [hex: :cowboy, repo: "hexpm", optional: false]}, {:telemetry, "~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "7d98bac1ee4565d31b62d59f8823dfd8356a169e7fcbb83831b8a5397404c9de"}, "cowboy_telemetry": {:hex, :cowboy_telemetry, "0.4.0", "f239f68b588efa7707abce16a84d0d2acf3a0f50571f8bb7f56a15865aae820c", [:rebar3], [{:cowboy, "~> 2.7", [hex: :cowboy, repo: "hexpm", optional: false]}, {:telemetry, "~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "7d98bac1ee4565d31b62d59f8823dfd8356a169e7fcbb83831b8a5397404c9de"},
"cowlib": {:hex, :cowlib, "2.15.0", "3c97a318a933962d1c12b96ab7c1d728267d2c523c25a5b57b0f93392b6e9e25", [:make, :rebar3], [], "hexpm", "4f00c879a64b4fe7c8fcb42a4281925e9ffdb928820b03c3ad325a617e857532"}, "cowlib": {:hex, :cowlib, "2.15.0", "3c97a318a933962d1c12b96ab7c1d728267d2c523c25a5b57b0f93392b6e9e25", [:make, :rebar3], [], "hexpm", "4f00c879a64b4fe7c8fcb42a4281925e9ffdb928820b03c3ad325a617e857532"},
"credo": {:hex, :credo, "1.7.7", "771445037228f763f9b2afd612b6aa2fd8e28432a95dbbc60d8e03ce71ba4446", [:mix], [{:bunt, "~> 0.2.1 or ~> 1.0", [hex: :bunt, repo: "hexpm", optional: false]}, {:file_system, "~> 0.2 or ~> 1.0", [hex: :file_system, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}], "hexpm", "8bc87496c9aaacdc3f90f01b7b0582467b69b4bd2441fe8aae3109d843cc2f2e"}, "credo": {:hex, :credo, "1.7.12", "9e3c20463de4b5f3f23721527fcaf16722ec815e70ff6c60b86412c695d426c1", [:mix], [{:bunt, "~> 0.2.1 or ~> 1.0", [hex: :bunt, repo: "hexpm", optional: false]}, {:file_system, "~> 0.2 or ~> 1.0", [hex: :file_system, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}], "hexpm", "8493d45c656c5427d9c729235b99d498bd133421f3e0a683e5c1b561471291e5"},
"csv": {:hex, :csv, "3.2.2", "452f96414b39a176b7c390af6d8b78f15130dc6167fe3b836729131f515d843e", [:mix], [], "hexpm", "cbf256ff74a3fa01d9ec420d07b19c90d410ed9fe5b6d6e1bc7662edf35bc574"}, "csv": {:hex, :csv, "3.2.2", "452f96414b39a176b7c390af6d8b78f15130dc6167fe3b836729131f515d843e", [:mix], [], "hexpm", "cbf256ff74a3fa01d9ec420d07b19c90d410ed9fe5b6d6e1bc7662edf35bc574"},
"dart_sass": {:hex, :dart_sass, "0.7.0", "7979e056cb74fd6843e1c72db763cffc7726a9192a657735b7d24c0d9c26a1ce", [:mix], [{:castore, ">= 0.0.0", [hex: :castore, repo: "hexpm", optional: false]}], "hexpm", "4a8e70bca41aa00846398abdf5ad8a64d7907a0f7bf40145cd2e40d5971629f2"}, "dart_sass": {:hex, :dart_sass, "0.7.0", "7979e056cb74fd6843e1c72db763cffc7726a9192a657735b7d24c0d9c26a1ce", [:mix], [{:castore, ">= 0.0.0", [hex: :castore, repo: "hexpm", optional: false]}], "hexpm", "4a8e70bca41aa00846398abdf5ad8a64d7907a0f7bf40145cd2e40d5971629f2"},
"db_connection": {:hex, :db_connection, "2.8.0", "64fd82cfa6d8e25ec6660cea73e92a4cbc6a18b31343910427b702838c4b33b2", [:mix], [{:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "008399dae5eee1bf5caa6e86d204dcb44242c82b1ed5e22c881f2c34da201b15"}, "db_connection": {:hex, :db_connection, "2.8.0", "64fd82cfa6d8e25ec6660cea73e92a4cbc6a18b31343910427b702838c4b33b2", [:mix], [{:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "008399dae5eee1bf5caa6e86d204dcb44242c82b1ed5e22c881f2c34da201b15"},
@@ -25,7 +25,7 @@
"expo": {:hex, :expo, "1.1.0", "f7b9ed7fb5745ebe1eeedf3d6f29226c5dd52897ac67c0f8af62a07e661e5c75", [:mix], [], "hexpm", "fbadf93f4700fb44c331362177bdca9eeb8097e8b0ef525c9cc501cb9917c960"}, "expo": {:hex, :expo, "1.1.0", "f7b9ed7fb5745ebe1eeedf3d6f29226c5dd52897ac67c0f8af62a07e661e5c75", [:mix], [], "hexpm", "fbadf93f4700fb44c331362177bdca9eeb8097e8b0ef525c9cc501cb9917c960"},
"file_system": {:hex, :file_system, "1.1.0", "08d232062284546c6c34426997dd7ef6ec9f8bbd090eb91780283c9016840e8f", [:mix], [], "hexpm", "bfcf81244f416871f2a2e15c1b515287faa5db9c6bcf290222206d120b3d43f6"}, "file_system": {:hex, :file_system, "1.1.0", "08d232062284546c6c34426997dd7ef6ec9f8bbd090eb91780283c9016840e8f", [:mix], [], "hexpm", "bfcf81244f416871f2a2e15c1b515287faa5db9c6bcf290222206d120b3d43f6"},
"finch": {:hex, :finch, "0.19.0", "c644641491ea854fc5c1bbaef36bfc764e3f08e7185e1f084e35e0672241b76d", [:mix], [{:mime, "~> 1.0 or ~> 2.0", [hex: :mime, repo: "hexpm", optional: false]}, {:mint, "~> 1.6.2 or ~> 1.7", [hex: :mint, repo: "hexpm", optional: false]}, {:nimble_options, "~> 0.4 or ~> 1.0", [hex: :nimble_options, repo: "hexpm", optional: false]}, {:nimble_pool, "~> 1.1", [hex: :nimble_pool, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "fc5324ce209125d1e2fa0fcd2634601c52a787aff1cd33ee833664a5af4ea2b6"}, "finch": {:hex, :finch, "0.19.0", "c644641491ea854fc5c1bbaef36bfc764e3f08e7185e1f084e35e0672241b76d", [:mix], [{:mime, "~> 1.0 or ~> 2.0", [hex: :mime, repo: "hexpm", optional: false]}, {:mint, "~> 1.6.2 or ~> 1.7", [hex: :mint, repo: "hexpm", optional: false]}, {:nimble_options, "~> 0.4 or ~> 1.0", [hex: :nimble_options, repo: "hexpm", optional: false]}, {:nimble_pool, "~> 1.1", [hex: :nimble_pool, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "fc5324ce209125d1e2fa0fcd2634601c52a787aff1cd33ee833664a5af4ea2b6"},
"floki": {:hex, :floki, "0.36.1", "712b7f2ba19a4d5a47dfe3e74d81876c95bbcbee44fe551f0af3d2a388abb3da", [:mix], [], "hexpm", "21ba57abb8204bcc70c439b423fc0dd9f0286de67dc82773a14b0200ada0995f"}, "floki": {:hex, :floki, "0.38.0", "62b642386fa3f2f90713f6e231da0fa3256e41ef1089f83b6ceac7a3fd3abf33", [:mix], [], "hexpm", "a5943ee91e93fb2d635b612caf5508e36d37548e84928463ef9dd986f0d1abd9"},
"gen_smtp": {:hex, :gen_smtp, "1.2.0", "9cfc75c72a8821588b9b9fe947ae5ab2aed95a052b81237e0928633a13276fd3", [:rebar3], [{:ranch, ">= 1.8.0", [hex: :ranch, repo: "hexpm", optional: false]}], "hexpm", "5ee0375680bca8f20c4d85f58c2894441443a743355430ff33a783fe03296779"}, "gen_smtp": {:hex, :gen_smtp, "1.2.0", "9cfc75c72a8821588b9b9fe947ae5ab2aed95a052b81237e0928633a13276fd3", [:rebar3], [{:ranch, ">= 1.8.0", [hex: :ranch, repo: "hexpm", optional: false]}], "hexpm", "5ee0375680bca8f20c4d85f58c2894441443a743355430ff33a783fe03296779"},
"gettext": {:hex, :gettext, "0.26.2", "5978aa7b21fada6deabf1f6341ddba50bc69c999e812211903b169799208f2a8", [:mix], [{:expo, "~> 0.5.1 or ~> 1.0", [hex: :expo, repo: "hexpm", optional: false]}], "hexpm", "aa978504bcf76511efdc22d580ba08e2279caab1066b76bb9aa81c4a1e0a32a5"}, "gettext": {:hex, :gettext, "0.26.2", "5978aa7b21fada6deabf1f6341ddba50bc69c999e812211903b169799208f2a8", [:mix], [{:expo, "~> 0.5.1 or ~> 1.0", [hex: :expo, repo: "hexpm", optional: false]}], "hexpm", "aa978504bcf76511efdc22d580ba08e2279caab1066b76bb9aa81c4a1e0a32a5"},
"hackney": {:hex, :hackney, "1.24.1", "f5205a125bba6ed4587f9db3cc7c729d11316fa8f215d3e57ed1c067a9703fa9", [:rebar3], [{:certifi, "~> 2.15.0", [hex: :certifi, repo: "hexpm", optional: false]}, {:idna, "~> 6.1.0", [hex: :idna, repo: "hexpm", optional: false]}, {:metrics, "~> 1.0.0", [hex: :metrics, repo: "hexpm", optional: false]}, {:mimerl, "~> 1.4", [hex: :mimerl, repo: "hexpm", optional: false]}, {:parse_trans, "3.4.1", [hex: :parse_trans, repo: "hexpm", optional: false]}, {:ssl_verify_fun, "~> 1.1.0", [hex: :ssl_verify_fun, repo: "hexpm", optional: false]}, {:unicode_util_compat, "~> 0.7.0", [hex: :unicode_util_compat, repo: "hexpm", optional: false]}], "hexpm", "f4a7392a0b53d8bbc3eb855bdcc919cd677358e65b2afd3840b5b3690c4c8a39"}, "hackney": {:hex, :hackney, "1.24.1", "f5205a125bba6ed4587f9db3cc7c729d11316fa8f215d3e57ed1c067a9703fa9", [:rebar3], [{:certifi, "~> 2.15.0", [hex: :certifi, repo: "hexpm", optional: false]}, {:idna, "~> 6.1.0", [hex: :idna, repo: "hexpm", optional: false]}, {:metrics, "~> 1.0.0", [hex: :metrics, repo: "hexpm", optional: false]}, {:mimerl, "~> 1.4", [hex: :mimerl, repo: "hexpm", optional: false]}, {:parse_trans, "3.4.1", [hex: :parse_trans, repo: "hexpm", optional: false]}, {:ssl_verify_fun, "~> 1.1.0", [hex: :ssl_verify_fun, repo: "hexpm", optional: false]}, {:unicode_util_compat, "~> 0.7.0", [hex: :unicode_util_compat, repo: "hexpm", optional: false]}], "hexpm", "f4a7392a0b53d8bbc3eb855bdcc919cd677358e65b2afd3840b5b3690c4c8a39"},
@@ -34,9 +34,9 @@
"hpax": {:hex, :hpax, "1.0.3", "ed67ef51ad4df91e75cc6a1494f851850c0bd98ebc0be6e81b026e765ee535aa", [:mix], [], "hexpm", "8eab6e1cfa8d5918c2ce4ba43588e894af35dbd8e91e6e55c817bca5847df34a"}, "hpax": {:hex, :hpax, "1.0.3", "ed67ef51ad4df91e75cc6a1494f851850c0bd98ebc0be6e81b026e765ee535aa", [:mix], [], "hexpm", "8eab6e1cfa8d5918c2ce4ba43588e894af35dbd8e91e6e55c817bca5847df34a"},
"html_entities": {:hex, :html_entities, "0.5.2", "9e47e70598da7de2a9ff6af8758399251db6dbb7eebe2b013f2bbd2515895c3c", [:mix], [], "hexpm", "c53ba390403485615623b9531e97696f076ed415e8d8058b1dbaa28181f4fdcc"}, "html_entities": {:hex, :html_entities, "0.5.2", "9e47e70598da7de2a9ff6af8758399251db6dbb7eebe2b013f2bbd2515895c3c", [:mix], [], "hexpm", "c53ba390403485615623b9531e97696f076ed415e8d8058b1dbaa28181f4fdcc"},
"httpoison": {:hex, :httpoison, "2.2.1", "87b7ed6d95db0389f7df02779644171d7319d319178f6680438167d7b69b1f3d", [:mix], [{:hackney, "~> 1.17", [hex: :hackney, repo: "hexpm", optional: false]}], "hexpm", "51364e6d2f429d80e14fe4b5f8e39719cacd03eb3f9a9286e61e216feac2d2df"}, "httpoison": {:hex, :httpoison, "2.2.1", "87b7ed6d95db0389f7df02779644171d7319d319178f6680438167d7b69b1f3d", [:mix], [{:hackney, "~> 1.17", [hex: :hackney, repo: "hexpm", optional: false]}], "hexpm", "51364e6d2f429d80e14fe4b5f8e39719cacd03eb3f9a9286e61e216feac2d2df"},
"idna": {:hex, :idna, "6.1.1", "8a63070e9f7d0c62eb9d9fcb360a7de382448200fbbd1b106cc96d3d8099df8d", [:rebar3], [{:unicode_util_compat, "~>0.7.0", [hex: :unicode_util_compat, repo: "hexpm", optional: false]}], "hexpm", "92376eb7894412ed19ac475e4a86f7b413c1b9fbb5bd16dccd57934157944cea"}, "idna": {:hex, :idna, "6.1.1", "8a63070e9f7d0c62eb9d9fcb360a7de382448200fbbd1b106cc96d3d8099df8d", [:rebar3], [{:unicode_util_compat, "~> 0.7.0", [hex: :unicode_util_compat, repo: "hexpm", optional: false]}], "hexpm", "92376eb7894412ed19ac475e4a86f7b413c1b9fbb5bd16dccd57934157944cea"},
"jason": {:hex, :jason, "1.4.4", "b9226785a9aa77b6857ca22832cffa5d5011a667207eb2a0ad56adb5db443b8a", [:mix], [{:decimal, "~> 1.0 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: true]}], "hexpm", "c5eb0cab91f094599f94d55bc63409236a8ec69a21a67814529e8d5f6cc90b3b"}, "jason": {:hex, :jason, "1.4.4", "b9226785a9aa77b6857ca22832cffa5d5011a667207eb2a0ad56adb5db443b8a", [:mix], [{:decimal, "~> 1.0 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: true]}], "hexpm", "c5eb0cab91f094599f94d55bc63409236a8ec69a21a67814529e8d5f6cc90b3b"},
"joken": {:hex, :joken, "2.6.1", "2ca3d8d7f83bf7196296a3d9b2ecda421a404634bfc618159981a960020480a1", [:mix], [{:jose, "~> 1.11.9", [hex: :jose, repo: "hexpm", optional: false]}], "hexpm", "ab26122c400b3d254ce7d86ed066d6afad27e70416df947cdcb01e13a7382e68"}, "joken": {:hex, :joken, "2.6.2", "5daaf82259ca603af4f0b065475099ada1b2b849ff140ccd37f4b6828ca6892a", [:mix], [{:jose, "~> 1.11.10", [hex: :jose, repo: "hexpm", optional: false]}], "hexpm", "5134b5b0a6e37494e46dbf9e4dad53808e5e787904b7c73972651b51cce3d72b"},
"jose": {:hex, :jose, "1.11.10", "a903f5227417bd2a08c8a00a0cbcc458118be84480955e8d251297a425723f83", [:mix, :rebar3], [], "hexpm", "0d6cd36ff8ba174db29148fc112b5842186b68a90ce9fc2b3ec3afe76593e614"}, "jose": {:hex, :jose, "1.11.10", "a903f5227417bd2a08c8a00a0cbcc458118be84480955e8d251297a425723f83", [:mix, :rebar3], [], "hexpm", "0d6cd36ff8ba174db29148fc112b5842186b68a90ce9fc2b3ec3afe76593e614"},
"libcluster": {:hex, :libcluster, "3.5.0", "5ee4cfde4bdf32b2fef271e33ce3241e89509f4344f6c6a8d4069937484866ba", [:mix], [{:jason, "~> 1.1", [hex: :jason, repo: "hexpm", optional: false]}, {:telemetry, "~> 1.3", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "ebf6561fcedd765a4cd43b4b8c04b1c87f4177b5fb3cbdfe40a780499d72f743"}, "libcluster": {:hex, :libcluster, "3.5.0", "5ee4cfde4bdf32b2fef271e33ce3241e89509f4344f6c6a8d4069937484866ba", [:mix], [{:jason, "~> 1.1", [hex: :jason, repo: "hexpm", optional: false]}, {:telemetry, "~> 1.3", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "ebf6561fcedd765a4cd43b4b8c04b1c87f4177b5fb3cbdfe40a780499d72f743"},
"lti_1p3": {:hex, :lti_1p3, "0.6.0", "e896c56b0ae067b768fb5ce2c44db305b6d7bbc213fafd1bbb7da586629c6d9f", [:mix], [{:httpoison, "~> 2.0", [hex: :httpoison, repo: "hexpm", optional: false]}, {:jason, "~> 1.3", [hex: :jason, repo: "hexpm", optional: false]}, {:joken, "~> 2.2.0", [hex: :joken, repo: "hexpm", optional: false]}, {:timex, "~> 3.5", [hex: :timex, repo: "hexpm", optional: false]}, {:uuid, "~> 1.1", [hex: :uuid, repo: "hexpm", optional: false]}], "hexpm", "7c142ae8027913bbaa2267a28f448e734b1c5b2563e2aee2b1481632b84e35b3"}, "lti_1p3": {:hex, :lti_1p3, "0.6.0", "e896c56b0ae067b768fb5ce2c44db305b6d7bbc213fafd1bbb7da586629c6d9f", [:mix], [{:httpoison, "~> 2.0", [hex: :httpoison, repo: "hexpm", optional: false]}, {:jason, "~> 1.3", [hex: :jason, repo: "hexpm", optional: false]}, {:joken, "~> 2.2.0", [hex: :joken, repo: "hexpm", optional: false]}, {:timex, "~> 3.5", [hex: :timex, repo: "hexpm", optional: false]}, {:uuid, "~> 1.1", [hex: :uuid, repo: "hexpm", optional: false]}], "hexpm", "7c142ae8027913bbaa2267a28f448e734b1c5b2563e2aee2b1481632b84e35b3"},
@@ -49,7 +49,7 @@
"mime": {:hex, :mime, "2.0.7", "b8d739037be7cd402aee1ba0306edfdef982687ee7e9859bee6198c1e7e2f128", [:mix], [], "hexpm", "6171188e399ee16023ffc5b76ce445eb6d9672e2e241d2df6050f3c771e80ccd"}, "mime": {:hex, :mime, "2.0.7", "b8d739037be7cd402aee1ba0306edfdef982687ee7e9859bee6198c1e7e2f128", [:mix], [], "hexpm", "6171188e399ee16023ffc5b76ce445eb6d9672e2e241d2df6050f3c771e80ccd"},
"mimerl": {:hex, :mimerl, "1.4.0", "3882a5ca67fbbe7117ba8947f27643557adec38fa2307490c4c4207624cb213b", [:rebar3], [], "hexpm", "13af15f9f68c65884ecca3a3891d50a7b57d82152792f3e19d88650aa126b144"}, "mimerl": {:hex, :mimerl, "1.4.0", "3882a5ca67fbbe7117ba8947f27643557adec38fa2307490c4c4207624cb213b", [:rebar3], [], "hexpm", "13af15f9f68c65884ecca3a3891d50a7b57d82152792f3e19d88650aa126b144"},
"mint": {:hex, :mint, "1.7.1", "113fdb2b2f3b59e47c7955971854641c61f378549d73e829e1768de90fc1abf1", [:mix], [{:castore, "~> 0.1.0 or ~> 1.0", [hex: :castore, repo: "hexpm", optional: true]}, {:hpax, "~> 0.1.1 or ~> 0.2.0 or ~> 1.0", [hex: :hpax, repo: "hexpm", optional: false]}], "hexpm", "fceba0a4d0f24301ddee3024ae116df1c3f4bb7a563a731f45fdfeb9d39a231b"}, "mint": {:hex, :mint, "1.7.1", "113fdb2b2f3b59e47c7955971854641c61f378549d73e829e1768de90fc1abf1", [:mix], [{:castore, "~> 0.1.0 or ~> 1.0", [hex: :castore, repo: "hexpm", optional: true]}, {:hpax, "~> 0.1.1 or ~> 0.2.0 or ~> 1.0", [hex: :hpax, repo: "hexpm", optional: false]}], "hexpm", "fceba0a4d0f24301ddee3024ae116df1c3f4bb7a563a731f45fdfeb9d39a231b"},
"mogrify": {:hex, :mogrify, "0.9.2", "b360984adea7dd6a55f18028e6327973c58de7f548fdb86c9859848aa904d5b0", [:mix], [], "hexpm", "c18d10fd70ca20e2585301616c89f6e4f7159d92efc9cc8ee579e00c886f699d"}, "mogrify": {:hex, :mogrify, "0.9.3", "238c782f00271dace01369ad35ae2e9dd020feee3443b9299ea5ea6bed559841", [:mix], [], "hexpm", "0189b1e1de27455f2b9ae8cf88239cefd23d38de9276eb5add7159aea51731e6"},
"mua": {:hex, :mua, "0.2.4", "a9172ab0a1ac8732cf2699d739ceac3febcb9b4ffc540260ad2e32c0b6632af9", [:mix], [{:castore, "~> 0.1.0 or ~> 1.0", [hex: :castore, repo: "hexpm", optional: true]}], "hexpm", "e7e4dacd5ad65f13e3542772e74a159c00bd2d5579e729e9bb72d2c73a266fb7"}, "mua": {:hex, :mua, "0.2.4", "a9172ab0a1ac8732cf2699d739ceac3febcb9b4ffc540260ad2e32c0b6632af9", [:mix], [{:castore, "~> 0.1.0 or ~> 1.0", [hex: :castore, repo: "hexpm", optional: true]}], "hexpm", "e7e4dacd5ad65f13e3542772e74a159c00bd2d5579e729e9bb72d2c73a266fb7"},
"nimble_options": {:hex, :nimble_options, "1.1.1", "e3a492d54d85fc3fd7c5baf411d9d2852922f66e69476317787a7b2bb000a61b", [:mix], [], "hexpm", "821b2470ca9442c4b6984882fe9bb0389371b8ddec4d45a9504f00a66f650b44"}, "nimble_options": {:hex, :nimble_options, "1.1.1", "e3a492d54d85fc3fd7c5baf411d9d2852922f66e69476317787a7b2bb000a61b", [:mix], [], "hexpm", "821b2470ca9442c4b6984882fe9bb0389371b8ddec4d45a9504f00a66f650b44"},
"nimble_parsec": {:hex, :nimble_parsec, "1.4.2", "8efba0122db06df95bfaa78f791344a89352ba04baedd3849593bfce4d0dc1c6", [:mix], [], "hexpm", "4b21398942dda052b403bbe1da991ccd03a053668d147d53fb8c4e0efe09c973"}, "nimble_parsec": {:hex, :nimble_parsec, "1.4.2", "8efba0122db06df95bfaa78f791344a89352ba04baedd3849593bfce4d0dc1c6", [:mix], [], "hexpm", "4b21398942dda052b403bbe1da991ccd03a053668d147d53fb8c4e0efe09c973"},
@@ -61,9 +61,9 @@
"phoenix_ecto": {:hex, :phoenix_ecto, "4.6.5", "c4ef322acd15a574a8b1a08eff0ee0a85e73096b53ce1403b6563709f15e1cea", [:mix], [{:ecto, "~> 3.5", [hex: :ecto, repo: "hexpm", optional: false]}, {:phoenix_html, "~> 2.14.2 or ~> 3.0 or ~> 4.1", [hex: :phoenix_html, repo: "hexpm", optional: true]}, {:plug, "~> 1.9", [hex: :plug, repo: "hexpm", optional: false]}, {:postgrex, "~> 0.16 or ~> 1.0", [hex: :postgrex, repo: "hexpm", optional: true]}], "hexpm", "26ec3208eef407f31b748cadd044045c6fd485fbff168e35963d2f9dfff28d4b"}, "phoenix_ecto": {:hex, :phoenix_ecto, "4.6.5", "c4ef322acd15a574a8b1a08eff0ee0a85e73096b53ce1403b6563709f15e1cea", [:mix], [{:ecto, "~> 3.5", [hex: :ecto, repo: "hexpm", optional: false]}, {:phoenix_html, "~> 2.14.2 or ~> 3.0 or ~> 4.1", [hex: :phoenix_html, repo: "hexpm", optional: true]}, {:plug, "~> 1.9", [hex: :plug, repo: "hexpm", optional: false]}, {:postgrex, "~> 0.16 or ~> 1.0", [hex: :postgrex, repo: "hexpm", optional: true]}], "hexpm", "26ec3208eef407f31b748cadd044045c6fd485fbff168e35963d2f9dfff28d4b"},
"phoenix_html": {:hex, :phoenix_html, "4.2.1", "35279e2a39140068fc03f8874408d58eef734e488fc142153f055c5454fd1c08", [:mix], [], "hexpm", "cff108100ae2715dd959ae8f2a8cef8e20b593f8dfd031c9cba92702cf23e053"}, "phoenix_html": {:hex, :phoenix_html, "4.2.1", "35279e2a39140068fc03f8874408d58eef734e488fc142153f055c5454fd1c08", [:mix], [], "hexpm", "cff108100ae2715dd959ae8f2a8cef8e20b593f8dfd031c9cba92702cf23e053"},
"phoenix_html_helpers": {:hex, :phoenix_html_helpers, "1.0.1", "7eed85c52eff80a179391036931791ee5d2f713d76a81d0d2c6ebafe1e11e5ec", [:mix], [{:phoenix_html, "~> 4.0", [hex: :phoenix_html, repo: "hexpm", optional: false]}, {:plug, "~> 1.5", [hex: :plug, repo: "hexpm", optional: true]}], "hexpm", "cffd2385d1fa4f78b04432df69ab8da63dc5cf63e07b713a4dcf36a3740e3090"}, "phoenix_html_helpers": {:hex, :phoenix_html_helpers, "1.0.1", "7eed85c52eff80a179391036931791ee5d2f713d76a81d0d2c6ebafe1e11e5ec", [:mix], [{:phoenix_html, "~> 4.0", [hex: :phoenix_html, repo: "hexpm", optional: false]}, {:plug, "~> 1.5", [hex: :plug, repo: "hexpm", optional: true]}], "hexpm", "cffd2385d1fa4f78b04432df69ab8da63dc5cf63e07b713a4dcf36a3740e3090"},
"phoenix_live_dashboard": {:hex, :phoenix_live_dashboard, "0.8.3", "7ff51c9b6609470f681fbea20578dede0e548302b0c8bdf338b5a753a4f045bf", [:mix], [{:ecto, "~> 3.6.2 or ~> 3.7", [hex: :ecto, repo: "hexpm", optional: true]}, {:ecto_mysql_extras, "~> 0.5", [hex: :ecto_mysql_extras, repo: "hexpm", optional: true]}, {:ecto_psql_extras, "~> 0.7", [hex: :ecto_psql_extras, repo: "hexpm", optional: true]}, {:ecto_sqlite3_extras, "~> 1.1.7 or ~> 1.2.0", [hex: :ecto_sqlite3_extras, repo: "hexpm", optional: true]}, {:mime, "~> 1.6 or ~> 2.0", [hex: :mime, repo: "hexpm", optional: false]}, {:phoenix_live_view, "~> 0.19 or ~> 1.0", [hex: :phoenix_live_view, repo: "hexpm", optional: false]}, {:telemetry_metrics, "~> 0.6 or ~> 1.0", [hex: :telemetry_metrics, repo: "hexpm", optional: false]}], "hexpm", "f9470a0a8bae4f56430a23d42f977b5a6205fdba6559d76f932b876bfaec652d"}, "phoenix_live_dashboard": {:hex, :phoenix_live_dashboard, "0.8.7", "405880012cb4b706f26dd1c6349125bfc903fb9e44d1ea668adaf4e04d4884b7", [:mix], [{:ecto, "~> 3.6.2 or ~> 3.7", [hex: :ecto, repo: "hexpm", optional: true]}, {:ecto_mysql_extras, "~> 0.5", [hex: :ecto_mysql_extras, repo: "hexpm", optional: true]}, {:ecto_psql_extras, "~> 0.7", [hex: :ecto_psql_extras, repo: "hexpm", optional: true]}, {:ecto_sqlite3_extras, "~> 1.1.7 or ~> 1.2.0", [hex: :ecto_sqlite3_extras, repo: "hexpm", optional: true]}, {:mime, "~> 1.6 or ~> 2.0", [hex: :mime, repo: "hexpm", optional: false]}, {:phoenix_live_view, "~> 0.19 or ~> 1.0", [hex: :phoenix_live_view, repo: "hexpm", optional: false]}, {:telemetry_metrics, "~> 0.6 or ~> 1.0", [hex: :telemetry_metrics, repo: "hexpm", optional: false]}], "hexpm", "3a8625cab39ec261d48a13b7468dc619c0ede099601b084e343968309bd4d7d7"},
"phoenix_live_reload": {:hex, :phoenix_live_reload, "1.6.0", "2791fac0e2776b640192308cc90c0dbcf67843ad51387ed4ecae2038263d708d", [:mix], [{:file_system, "~> 0.2.10 or ~> 1.0", [hex: :file_system, repo: "hexpm", optional: false]}, {:phoenix, "~> 1.4", [hex: :phoenix, repo: "hexpm", optional: false]}], "hexpm", "b3a1fa036d7eb2f956774eda7a7638cf5123f8f2175aca6d6420a7f95e598e1c"}, "phoenix_live_reload": {:hex, :phoenix_live_reload, "1.6.0", "2791fac0e2776b640192308cc90c0dbcf67843ad51387ed4ecae2038263d708d", [:mix], [{:file_system, "~> 0.2.10 or ~> 1.0", [hex: :file_system, repo: "hexpm", optional: false]}, {:phoenix, "~> 1.4", [hex: :phoenix, repo: "hexpm", optional: false]}], "hexpm", "b3a1fa036d7eb2f956774eda7a7638cf5123f8f2175aca6d6420a7f95e598e1c"},
"phoenix_live_view": {:hex, :phoenix_live_view, "0.20.14", "70fa101aa0539e81bed4238777498f6215e9dda3461bdaa067cad6908110c364", [:mix], [{:floki, "~> 0.36", [hex: :floki, repo: "hexpm", optional: true]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:phoenix, "~> 1.6.15 or ~> 1.7.0", [hex: :phoenix, repo: "hexpm", optional: false]}, {:phoenix_html, "~> 3.3 or ~> 4.0 or ~> 4.1", [hex: :phoenix_html, repo: "hexpm", optional: false]}, {:phoenix_template, "~> 1.0", [hex: :phoenix_template, repo: "hexpm", optional: false]}, {:phoenix_view, "~> 2.0", [hex: :phoenix_view, repo: "hexpm", optional: true]}, {:plug, "~> 1.15", [hex: :plug, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4.2 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "82f6d006c5264f979ed5eb75593d808bbe39020f20df2e78426f4f2d570e2402"}, "phoenix_live_view": {:hex, :phoenix_live_view, "1.0.17", "beeb16d83a7d3760f7ad463df94e83b087577665d2acc0bf2987cd7d9778068f", [:mix], [{:floki, "~> 0.36", [hex: :floki, repo: "hexpm", optional: true]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:phoenix, "~> 1.6.15 or ~> 1.7.0 or ~> 1.8.0-rc", [hex: :phoenix, repo: "hexpm", optional: false]}, {:phoenix_html, "~> 3.3 or ~> 4.0", [hex: :phoenix_html, repo: "hexpm", optional: false]}, {:phoenix_template, "~> 1.0", [hex: :phoenix_template, repo: "hexpm", optional: false]}, {:phoenix_view, "~> 2.0", [hex: :phoenix_view, repo: "hexpm", optional: true]}, {:plug, "~> 1.15", [hex: :plug, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4.2 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "a4ca05c1eb6922c4d07a508a75bfa12c45e5f4d8f77ae83283465f02c53741e1"},
"phoenix_pubsub": {:hex, :phoenix_pubsub, "2.1.3", "3168d78ba41835aecad272d5e8cd51aa87a7ac9eb836eabc42f6e57538e3731d", [:mix], [], "hexpm", "bba06bc1dcfd8cb086759f0edc94a8ba2bc8896d5331a1e2c2902bf8e36ee502"}, "phoenix_pubsub": {:hex, :phoenix_pubsub, "2.1.3", "3168d78ba41835aecad272d5e8cd51aa87a7ac9eb836eabc42f6e57538e3731d", [:mix], [], "hexpm", "bba06bc1dcfd8cb086759f0edc94a8ba2bc8896d5331a1e2c2902bf8e36ee502"},
"phoenix_swoosh": {:hex, :phoenix_swoosh, "1.2.1", "b74ccaa8046fbc388a62134360ee7d9742d5a8ae74063f34eb050279de7a99e1", [:mix], [{:finch, "~> 0.8", [hex: :finch, repo: "hexpm", optional: true]}, {:hackney, "~> 1.10", [hex: :hackney, repo: "hexpm", optional: true]}, {:phoenix, "~> 1.6", [hex: :phoenix, repo: "hexpm", optional: true]}, {:phoenix_html, "~> 3.0 or ~> 4.0", [hex: :phoenix_html, repo: "hexpm", optional: true]}, {:phoenix_view, "~> 1.0 or ~> 2.0", [hex: :phoenix_view, repo: "hexpm", optional: false]}, {:swoosh, "~> 1.5", [hex: :swoosh, repo: "hexpm", optional: false]}], "hexpm", "4000eeba3f9d7d1a6bf56d2bd56733d5cadf41a7f0d8ffe5bb67e7d667e204a2"}, "phoenix_swoosh": {:hex, :phoenix_swoosh, "1.2.1", "b74ccaa8046fbc388a62134360ee7d9742d5a8ae74063f34eb050279de7a99e1", [:mix], [{:finch, "~> 0.8", [hex: :finch, repo: "hexpm", optional: true]}, {:hackney, "~> 1.10", [hex: :hackney, repo: "hexpm", optional: true]}, {:phoenix, "~> 1.6", [hex: :phoenix, repo: "hexpm", optional: true]}, {:phoenix_html, "~> 3.0 or ~> 4.0", [hex: :phoenix_html, repo: "hexpm", optional: true]}, {:phoenix_view, "~> 1.0 or ~> 2.0", [hex: :phoenix_view, repo: "hexpm", optional: false]}, {:swoosh, "~> 1.5", [hex: :swoosh, repo: "hexpm", optional: false]}], "hexpm", "4000eeba3f9d7d1a6bf56d2bd56733d5cadf41a7f0d8ffe5bb67e7d667e204a2"},
"phoenix_template": {:hex, :phoenix_template, "1.0.4", "e2092c132f3b5e5b2d49c96695342eb36d0ed514c5b252a77048d5969330d639", [:mix], [{:phoenix_html, "~> 2.14.2 or ~> 3.0 or ~> 4.0", [hex: :phoenix_html, repo: "hexpm", optional: true]}], "hexpm", "2c0c81f0e5c6753faf5cca2f229c9709919aba34fab866d3bc05060c9c444206"}, "phoenix_template": {:hex, :phoenix_template, "1.0.4", "e2092c132f3b5e5b2d49c96695342eb36d0ed514c5b252a77048d5969330d639", [:mix], [{:phoenix_html, "~> 2.14.2 or ~> 3.0 or ~> 4.0", [hex: :phoenix_html, repo: "hexpm", optional: true]}], "hexpm", "2c0c81f0e5c6753faf5cca2f229c9709919aba34fab866d3bc05060c9c444206"},