Add slide reordering with drag-and-drop

This commit is contained in:
Alex Lion
2026-06-12 22:53:24 +02:00
parent 7ee549d5e7
commit 7a424cbb93
18 changed files with 473 additions and 127 deletions

View File

@@ -407,6 +407,57 @@ Hooks.Manager = {
this.manager.update();
},
};
Hooks.SlideSortable = {
mounted() {
this.from = null;
this.el.addEventListener("dragstart", (e) => {
const item = e.target.closest("[data-index]");
if (!item) return;
this.from = parseInt(item.dataset.index);
e.dataTransfer.effectAllowed = "move";
e.dataTransfer.setData("text/plain", item.dataset.index);
setTimeout(() => item.classList.add("opacity-40"), 0);
});
this.el.addEventListener("dragover", (e) => {
if (this.from === null) return;
e.preventDefault();
e.dataTransfer.dropEffect = "move";
const item = e.target.closest("[data-index]");
this.clearDropTarget();
if (item && parseInt(item.dataset.index) !== this.from) {
item.classList.add("ring-2", "ring-primary-500");
}
});
this.el.addEventListener("drop", (e) => {
e.preventDefault();
const item = e.target.closest("[data-index]");
if (item && this.from !== null) {
const to = parseInt(item.dataset.index);
if (to !== this.from) {
this.pushEvent("reorder-slides", { from: this.from, to: to });
}
}
this.reset();
});
this.el.addEventListener("dragend", () => this.reset());
},
clearDropTarget() {
this.el
.querySelectorAll("[data-index]")
.forEach((n) => n.classList.remove("ring-2", "ring-primary-500"));
},
reset() {
this.from = null;
this.clearDropTarget();
this.el
.querySelectorAll("[data-index]")
.forEach((n) => n.classList.remove("opacity-40"));
},
};
Hooks.OpenPresenter = {
open(e) {
e.preventDefault();

View File

@@ -57,12 +57,12 @@ defmodule Claper.Presentations do
[]
presentation ->
get_slide_urls(hash, presentation.length)
get_slide_urls(presentation)
end
end
def get_slide_urls(%PresentationFile{} = presentation) do
get_slide_urls(presentation.hash, presentation.length)
get_slide_urls(presentation.hash, presentation.length, presentation.slide_order)
end
@doc """
@@ -94,25 +94,25 @@ defmodule Claper.Presentations do
@doc """
Returns a list of JPG slide URLs for a given presentation `hash` and
`length`. See also `get_slide_urls/1`.
`length`, optionally reordered by `slide_order`. See also `get_slide_urls/1`.
"""
def get_slide_urls(hash, length)
def get_slide_urls(hash, length, slide_order \\ nil)
def get_slide_urls(nil, _), do: []
def get_slide_urls(nil, _, _), do: []
def get_slide_urls(hash, length) when is_binary(hash) and is_integer(length) do
def get_slide_urls(hash, length, slide_order) when is_binary(hash) and is_integer(length) do
config = Application.get_env(:claper, :presentations)
case Keyword.fetch!(config, :storage) do
"local" ->
for index <- 1..length do
for index <- slide_indexes(length, slide_order) do
"/uploads/#{hash}/#{index}.jpg"
end
"s3" ->
base_url = Keyword.fetch!(config, :s3_public_url)
for index <- 1..length do
for index <- slide_indexes(length, slide_order) do
base_url <> "/presentations/#{hash}/#{index}.jpg"
end
@@ -131,23 +131,24 @@ defmodule Claper.Presentations do
def get_slide_thumbnail_urls(%PresentationFile{length: nil}), do: []
def get_slide_thumbnail_urls(%PresentationFile{length: 0}), do: []
def get_slide_thumbnail_urls(%PresentationFile{hash: hash, length: length}) do
get_slide_thumbnail_urls(hash, length)
def get_slide_thumbnail_urls(%PresentationFile{} = presentation) do
get_slide_thumbnail_urls(presentation.hash, presentation.length, presentation.slide_order)
end
def get_slide_thumbnail_urls(hash, length) when is_binary(hash) and is_integer(length) do
def get_slide_thumbnail_urls(hash, length, slide_order \\ nil)
when is_binary(hash) and is_integer(length) do
config = Application.get_env(:claper, :presentations)
case Keyword.fetch!(config, :storage) do
"local" ->
for index <- 1..length do
for index <- slide_indexes(length, slide_order) do
"/uploads/#{hash}/thumbs/#{index}.jpg"
end
"s3" ->
base_url = Keyword.fetch!(config, :s3_public_url)
for index <- 1..length do
for index <- slide_indexes(length, slide_order) do
base_url <> "/presentations/#{hash}/thumbs/#{index}.jpg"
end
@@ -156,6 +157,15 @@ defmodule Claper.Presentations do
end
end
# Display order as a list of 1-based original slide file indexes. A stored
# `slide_order` is only honored when it matches the slide count, so a stale
# order (e.g. from before a re-upload) falls back to the natural order.
defp slide_indexes(count, slide_order)
when is_list(slide_order) and length(slide_order) == count,
do: slide_order
defp slide_indexes(count, _slide_order), do: Enum.to_list(1..count//1)
@doc """
Returns true when a presentation has slides but no generated thumbnails.
"""
@@ -248,6 +258,111 @@ defmodule Claper.Presentations do
|> broadcast(:state_updated)
end
@interaction_schemas [
Claper.Polls.Poll,
Claper.Forms.Form,
Claper.Embeds.Embed,
Claper.Quizzes.Quiz
]
@doc """
Moves the slide displayed at position `from` to position `to` (both 0-based
display positions).
Slide files are never renamed (a hash directory can be shared by duplicated
events); instead the per-presentation `slide_order` permutation is updated.
Interactions (polls, forms, embeds, quizzes) and the current presentation
state position are remapped so they stay attached to their slide content.
Returns `{:ok, presentation_file, presentation_state}` or
`{:error, :invalid_position}`.
"""
def reorder_slides(%PresentationFile{} = presentation_file, from, to)
when is_integer(from) and is_integer(to) do
count = presentation_file.length || 0
if from == to or from < 0 or to < 0 or from >= count or to >= count do
{:error, :invalid_position}
else
do_reorder_slides(presentation_file, from, to)
end
end
defp do_reorder_slides(presentation_file, from, to) do
{moved, rest} =
presentation_file.length
|> slide_indexes(presentation_file.slide_order)
|> List.pop_at(from)
new_order = List.insert_at(rest, to, moved)
Repo.transaction(fn ->
presentation_file =
presentation_file
|> PresentationFile.changeset(%{slide_order: new_order})
|> Repo.update!()
Enum.each(@interaction_schemas, fn schema ->
remap_interaction_positions(schema, presentation_file.id, from, to)
end)
state = Repo.get_by(PresentationState, presentation_file_id: presentation_file.id)
new_position = state && remap_position(state.position, from, to)
position_changed = state && new_position != state.position
state =
if position_changed do
state
|> PresentationState.changeset(%{position: new_position})
|> Repo.update!()
else
state
end
{presentation_file, state, position_changed}
end)
|> case do
{:ok, {presentation_file, state, position_changed}} ->
if position_changed, do: broadcast({:ok, state}, :state_updated)
{:ok, presentation_file, state}
{:error, reason} ->
{:error, reason}
end
end
# Shifts the `position` column of every interaction so it follows its slide
# content. Interactions on the moved slide are parked at -1 first to avoid
# colliding with the shifted range.
defp remap_interaction_positions(schema, presentation_file_id, from, to) do
base = from(i in schema, where: i.presentation_file_id == ^presentation_file_id)
base |> where([i], i.position == ^from) |> Repo.update_all(set: [position: -1])
if from < to do
base
|> where([i], i.position > ^from and i.position <= ^to)
|> Repo.update_all(inc: [position: -1])
else
base
|> where([i], i.position >= ^to and i.position < ^from)
|> Repo.update_all(inc: [position: 1])
end
base |> where([i], i.position == -1) |> Repo.update_all(set: [position: to])
end
defp remap_position(nil, _from, _to), do: nil
defp remap_position(position, from, to) when position == from, do: to
defp remap_position(position, from, to) when from < to and position > from and position <= to,
do: position - 1
defp remap_position(position, from, to) when from > to and position >= to and position < from,
do: position + 1
defp remap_position(position, _from, _to), do: position
defp broadcast({:error, _reason} = error, _state), do: error
defp broadcast({:ok, state}, event) do

View File

@@ -7,6 +7,7 @@ defmodule Claper.Presentations.PresentationFile do
hash: String.t() | nil,
length: integer() | nil,
status: String.t() | nil,
slide_order: [integer()] | nil,
event_id: integer() | nil,
polls: [Claper.Polls.Poll.t()] | nil,
forms: [Claper.Forms.Form.t()] | nil,
@@ -21,6 +22,7 @@ defmodule Claper.Presentations.PresentationFile do
field :hash, :string
field :length, :integer
field :status, :string
field :slide_order, {:array, :integer}
belongs_to :event, Claper.Events.Event
has_many :polls, Claper.Polls.Poll
@@ -37,7 +39,7 @@ defmodule Claper.Presentations.PresentationFile do
@doc false
def changeset(presentation_file, attrs) do
presentation_file
|> cast(attrs, [:length, :status, :hash, :event_id])
|> cast(attrs, [:length, :status, :hash, :event_id, :slide_order])
|> cast_assoc(:presentation_state)
end
end

View File

@@ -256,7 +256,8 @@ defmodule Claper.Tasks.Converter do
Claper.Presentations.update_presentation_file(presentation, %{
"hash" => "#{hash}",
"length" => length,
"status" => "done"
"status" => "done",
"slide_order" => nil
}) do
if get_presentation_storage() != "local", do: File.rm_rf!(path)

View File

@@ -427,6 +427,32 @@ defmodule ClaperWeb.EventLive.Manage do
|> interactions_at_position(page)}
end
@impl true
def handle_event(
"reorder-slides",
%{"from" => from, "to" => to},
%{assigns: %{event: event, state: state}} = socket
)
when is_integer(from) and is_integer(to) and from != to do
case Presentations.reorder_slides(event.presentation_file, from, to) do
{:ok, _presentation_file, new_state} ->
if new_state && new_state.position != state.position do
Phoenix.PubSub.broadcast(
Claper.PubSub,
"event:#{event.uuid}",
{:page_changed, new_state.position}
)
end
socket = refresh_event(socket)
{:noreply, socket |> interactions_at_position(socket.assigns.state.position)}
{:error, _reason} ->
{:noreply, socket |> put_flash(:error, gettext("Could not reorder slides"))}
end
end
@impl true
def handle_event(
"regenerate-thumbnails",

View File

@@ -40,13 +40,15 @@ defmodule ClaperWeb.EventLive.ManageSlideSidebarComponent do
<span class="font-bold text-sm text-[#140553]">{gettext("Content")}</span>
</div>
<div class="flex-1 overflow-y-auto p-3 space-y-2">
<div id="slide-sortable" phx-hook="SlideSortable" class="flex-1 overflow-y-auto p-3 space-y-2">
<button
:for={{src, index} <- @thumbnail_urls |> Enum.with_index(0)}
id={"slide-thumb-#{index}"}
draggable="true"
data-index={index}
phx-click="current-page"
phx-value-page={index}
class={"group flex items-start gap-x-1.5 w-full rounded-lg p-1 transition-all hover:bg-gray-200 #{if @current_position == index, do: "bg-primary-50"}"}
class={"group flex items-start gap-x-1.5 w-full rounded-lg p-1 transition-all cursor-grab active:cursor-grabbing hover:bg-gray-200 #{if @current_position == index, do: "bg-primary-50"}"}
>
<span class={"flex-shrink-0 w-5 text-base font-semibold #{if @current_position == index, do: "text-primary-600", else: "text-gray-500"}"}>
{index + 1}
@@ -54,6 +56,7 @@ defmodule ClaperWeb.EventLive.ManageSlideSidebarComponent do
<div class={"relative w-28 aspect-video rounded-md overflow-hidden border-2 transition-all #{if @current_position == index, do: "border-primary-500 shadow-md", else: "border-transparent opacity-60 group-hover:opacity-100"}"}>
<img
src={src}
draggable="false"
loading="lazy"
decoding="async"
class="w-full h-full object-cover"

View File

@@ -19,7 +19,7 @@ msgstr "Einstellungen"
#: lib/claper_web/live/admin_live/user_live.html.heex:41
#: lib/claper_web/live/admin_live/user_live.html.heex:104
#: lib/claper_web/live/admin_live/user_live/form_component.ex:18
#: lib/claper_web/live/event_live/manage.ex:1092
#: lib/claper_web/live/event_live/manage.ex:1118
#: lib/claper_web/live/form_live/form_component.html.heex:32
#: lib/claper_web/live/user_settings_live/show.html.heex:18
#: lib/claper_web/templates/user_registration/new.html.heex:63
@@ -691,7 +691,7 @@ msgstr "Formular"
#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:74
#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:234
#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:24
#: lib/claper_web/live/event_live/manage.ex:1091
#: lib/claper_web/live/event_live/manage.ex:1117
#, elixir-autogen, elixir-format
msgid "Name"
msgstr "Name"
@@ -1336,12 +1336,12 @@ msgstr "Laden Sie die Seite, auf die Sie zugreifen möchten, neu (senden Sie kei
msgid "Try logging in again"
msgstr "Versuchen Sie, sich erneut anzumelden"
#: lib/claper_web/live/event_live/manage.ex:1064
#: lib/claper_web/live/event_live/manage.ex:1090
#, elixir-autogen, elixir-format
msgid "No"
msgstr "Nein"
#: lib/claper_web/live/event_live/manage.ex:1064
#: lib/claper_web/live/event_live/manage.ex:1090
#, elixir-autogen, elixir-format
msgid "Yes"
msgstr "Ja"
@@ -2666,10 +2666,10 @@ msgstr "Ressourcen-ID"
msgid "Resource Type"
msgstr "Antworttyp"
#: lib/claper_web/live/event_live/manage.ex:1072
#: lib/claper_web/live/event_live/manage.ex:1115
#: lib/claper_web/live/event_live/manage.ex:1131
#: lib/claper_web/live/event_live/manage.ex:1173
#: lib/claper_web/live/event_live/manage.ex:1098
#: lib/claper_web/live/event_live/manage.ex:1141
#: lib/claper_web/live/event_live/manage.ex:1157
#: lib/claper_web/live/event_live/manage.ex:1199
#, elixir-autogen, elixir-format
msgid "Resource not found"
msgstr "Ressource nicht gefunden"
@@ -2907,7 +2907,7 @@ msgstr "Melden Sie sich an, um Ihre interaktiven Sitzungen zu starten oder zu ve
msgid "Could not regenerate thumbnails"
msgstr "Miniaturbilder konnten nicht neu erstellt werden"
#: lib/claper_web/live/event_live/manage.ex:461
#: lib/claper_web/live/event_live/manage.ex:487
#, elixir-autogen, elixir-format
msgid "Could not start thumbnail regeneration"
msgstr "Miniaturbilderstellung konnte nicht gestartet werden"
@@ -2937,7 +2937,7 @@ msgstr "Miniaturbilder neu erstellen"
msgid "Regenerating..."
msgstr "Wird neu erstellt..."
#: lib/claper_web/live/event_live/manage.ex:458
#: lib/claper_web/live/event_live/manage.ex:484
#, elixir-autogen, elixir-format
msgid "Thumbnail regeneration started"
msgstr "Miniaturbilderstellung gestartet"
@@ -3245,7 +3245,7 @@ msgstr ""
msgid "Transcription deleted"
msgstr ""
#: lib/claper_web/live/event_live/manage.ex:826
#: lib/claper_web/live/event_live/manage.ex:852
#, elixir-autogen, elixir-format
msgid "Transcription has been disabled by the administrator"
msgstr ""
@@ -3310,3 +3310,8 @@ msgstr "Unbegrenzt"
#, elixir-autogen, elixir-format
msgid "Powered by"
msgstr "Bereitgestellt von"
#: lib/claper_web/live/event_live/manage.ex:452
#, elixir-autogen, elixir-format
msgid "Could not reorder slides"
msgstr ""

View File

@@ -21,7 +21,7 @@ msgstr ""
#: lib/claper_web/live/admin_live/user_live.html.heex:41
#: lib/claper_web/live/admin_live/user_live.html.heex:104
#: lib/claper_web/live/admin_live/user_live/form_component.ex:18
#: lib/claper_web/live/event_live/manage.ex:1092
#: lib/claper_web/live/event_live/manage.ex:1118
#: lib/claper_web/live/form_live/form_component.html.heex:32
#: lib/claper_web/live/user_settings_live/show.html.heex:18
#: lib/claper_web/templates/user_registration/new.html.heex:63
@@ -693,7 +693,7 @@ msgstr ""
#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:74
#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:234
#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:24
#: lib/claper_web/live/event_live/manage.ex:1091
#: lib/claper_web/live/event_live/manage.ex:1117
#, elixir-autogen, elixir-format
msgid "Name"
msgstr ""
@@ -1338,12 +1338,12 @@ msgstr ""
msgid "Try logging in again"
msgstr ""
#: lib/claper_web/live/event_live/manage.ex:1064
#: lib/claper_web/live/event_live/manage.ex:1090
#, elixir-autogen, elixir-format
msgid "No"
msgstr ""
#: lib/claper_web/live/event_live/manage.ex:1064
#: lib/claper_web/live/event_live/manage.ex:1090
#, elixir-autogen, elixir-format
msgid "Yes"
msgstr ""
@@ -2668,10 +2668,10 @@ msgstr ""
msgid "Resource Type"
msgstr ""
#: lib/claper_web/live/event_live/manage.ex:1072
#: lib/claper_web/live/event_live/manage.ex:1115
#: lib/claper_web/live/event_live/manage.ex:1131
#: lib/claper_web/live/event_live/manage.ex:1173
#: lib/claper_web/live/event_live/manage.ex:1098
#: lib/claper_web/live/event_live/manage.ex:1141
#: lib/claper_web/live/event_live/manage.ex:1157
#: lib/claper_web/live/event_live/manage.ex:1199
#, elixir-autogen, elixir-format
msgid "Resource not found"
msgstr ""
@@ -2909,7 +2909,7 @@ msgstr ""
msgid "Could not regenerate thumbnails"
msgstr ""
#: lib/claper_web/live/event_live/manage.ex:461
#: lib/claper_web/live/event_live/manage.ex:487
#, elixir-autogen, elixir-format
msgid "Could not start thumbnail regeneration"
msgstr ""
@@ -2939,7 +2939,7 @@ msgstr ""
msgid "Regenerating..."
msgstr ""
#: lib/claper_web/live/event_live/manage.ex:458
#: lib/claper_web/live/event_live/manage.ex:484
#, elixir-autogen, elixir-format
msgid "Thumbnail regeneration started"
msgstr ""
@@ -3247,7 +3247,7 @@ msgstr ""
msgid "Transcription deleted"
msgstr ""
#: lib/claper_web/live/event_live/manage.ex:826
#: lib/claper_web/live/event_live/manage.ex:852
#, elixir-autogen, elixir-format
msgid "Transcription has been disabled by the administrator"
msgstr ""
@@ -3312,3 +3312,8 @@ msgstr ""
#, elixir-autogen, elixir-format
msgid "Powered by"
msgstr ""
#: lib/claper_web/live/event_live/manage.ex:452
#, elixir-autogen, elixir-format
msgid "Could not reorder slides"
msgstr ""

View File

@@ -19,7 +19,7 @@ msgstr ""
#: lib/claper_web/live/admin_live/user_live.html.heex:41
#: lib/claper_web/live/admin_live/user_live.html.heex:104
#: lib/claper_web/live/admin_live/user_live/form_component.ex:18
#: lib/claper_web/live/event_live/manage.ex:1092
#: lib/claper_web/live/event_live/manage.ex:1118
#: lib/claper_web/live/form_live/form_component.html.heex:32
#: lib/claper_web/live/user_settings_live/show.html.heex:18
#: lib/claper_web/templates/user_registration/new.html.heex:63
@@ -691,7 +691,7 @@ msgstr ""
#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:74
#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:234
#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:24
#: lib/claper_web/live/event_live/manage.ex:1091
#: lib/claper_web/live/event_live/manage.ex:1117
#, elixir-autogen, elixir-format
msgid "Name"
msgstr ""
@@ -1336,12 +1336,12 @@ msgstr ""
msgid "Try logging in again"
msgstr ""
#: lib/claper_web/live/event_live/manage.ex:1064
#: lib/claper_web/live/event_live/manage.ex:1090
#, elixir-autogen, elixir-format
msgid "No"
msgstr ""
#: lib/claper_web/live/event_live/manage.ex:1064
#: lib/claper_web/live/event_live/manage.ex:1090
#, elixir-autogen, elixir-format
msgid "Yes"
msgstr ""
@@ -2666,10 +2666,10 @@ msgstr ""
msgid "Resource Type"
msgstr ""
#: lib/claper_web/live/event_live/manage.ex:1072
#: lib/claper_web/live/event_live/manage.ex:1115
#: lib/claper_web/live/event_live/manage.ex:1131
#: lib/claper_web/live/event_live/manage.ex:1173
#: lib/claper_web/live/event_live/manage.ex:1098
#: lib/claper_web/live/event_live/manage.ex:1141
#: lib/claper_web/live/event_live/manage.ex:1157
#: lib/claper_web/live/event_live/manage.ex:1199
#, elixir-autogen, elixir-format
msgid "Resource not found"
msgstr ""
@@ -2907,7 +2907,7 @@ msgstr ""
msgid "Could not regenerate thumbnails"
msgstr ""
#: lib/claper_web/live/event_live/manage.ex:461
#: lib/claper_web/live/event_live/manage.ex:487
#, elixir-autogen, elixir-format
msgid "Could not start thumbnail regeneration"
msgstr ""
@@ -2937,7 +2937,7 @@ msgstr ""
msgid "Regenerating..."
msgstr ""
#: lib/claper_web/live/event_live/manage.ex:458
#: lib/claper_web/live/event_live/manage.ex:484
#, elixir-autogen, elixir-format
msgid "Thumbnail regeneration started"
msgstr ""
@@ -3245,7 +3245,7 @@ msgstr ""
msgid "Transcription deleted"
msgstr ""
#: lib/claper_web/live/event_live/manage.ex:826
#: lib/claper_web/live/event_live/manage.ex:852
#, elixir-autogen, elixir-format
msgid "Transcription has been disabled by the administrator"
msgstr ""
@@ -3310,3 +3310,8 @@ msgstr ""
#, elixir-autogen, elixir-format
msgid "Powered by"
msgstr ""
#: lib/claper_web/live/event_live/manage.ex:452
#, elixir-autogen, elixir-format
msgid "Could not reorder slides"
msgstr ""

View File

@@ -19,7 +19,7 @@ msgstr "Configuración"
#: lib/claper_web/live/admin_live/user_live.html.heex:41
#: lib/claper_web/live/admin_live/user_live.html.heex:104
#: lib/claper_web/live/admin_live/user_live/form_component.ex:18
#: lib/claper_web/live/event_live/manage.ex:1092
#: lib/claper_web/live/event_live/manage.ex:1118
#: lib/claper_web/live/form_live/form_component.html.heex:32
#: lib/claper_web/live/user_settings_live/show.html.heex:18
#: lib/claper_web/templates/user_registration/new.html.heex:63
@@ -691,7 +691,7 @@ msgstr "Formulario"
#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:74
#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:234
#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:24
#: lib/claper_web/live/event_live/manage.ex:1091
#: lib/claper_web/live/event_live/manage.ex:1117
#, elixir-autogen, elixir-format
msgid "Name"
msgstr "Nombre"
@@ -1336,12 +1336,12 @@ msgstr "Recargue la página a la que está intentando acceder (no vuelva a envia
msgid "Try logging in again"
msgstr "Intente iniciar sesión de nuevo"
#: lib/claper_web/live/event_live/manage.ex:1064
#: lib/claper_web/live/event_live/manage.ex:1090
#, elixir-autogen, elixir-format
msgid "No"
msgstr "No"
#: lib/claper_web/live/event_live/manage.ex:1064
#: lib/claper_web/live/event_live/manage.ex:1090
#, elixir-autogen, elixir-format
msgid "Yes"
msgstr "Sí"
@@ -2666,10 +2666,10 @@ msgstr "ID del recurso"
msgid "Resource Type"
msgstr "Tipo de Respuesta"
#: lib/claper_web/live/event_live/manage.ex:1072
#: lib/claper_web/live/event_live/manage.ex:1115
#: lib/claper_web/live/event_live/manage.ex:1131
#: lib/claper_web/live/event_live/manage.ex:1173
#: lib/claper_web/live/event_live/manage.ex:1098
#: lib/claper_web/live/event_live/manage.ex:1141
#: lib/claper_web/live/event_live/manage.ex:1157
#: lib/claper_web/live/event_live/manage.ex:1199
#, elixir-autogen, elixir-format
msgid "Resource not found"
msgstr "Recurso no encontrado"
@@ -2907,7 +2907,7 @@ msgstr "Inicia sesión para lanzar o gestionar tus sesiones interactivas."
msgid "Could not regenerate thumbnails"
msgstr "No se pudieron regenerar las miniaturas"
#: lib/claper_web/live/event_live/manage.ex:461
#: lib/claper_web/live/event_live/manage.ex:487
#, elixir-autogen, elixir-format
msgid "Could not start thumbnail regeneration"
msgstr "No se pudo iniciar la regeneración de miniaturas"
@@ -2937,7 +2937,7 @@ msgstr "Regenerar miniaturas"
msgid "Regenerating..."
msgstr "Regenerando..."
#: lib/claper_web/live/event_live/manage.ex:458
#: lib/claper_web/live/event_live/manage.ex:484
#, elixir-autogen, elixir-format
msgid "Thumbnail regeneration started"
msgstr "Regeneración de miniaturas iniciada"
@@ -3245,7 +3245,7 @@ msgstr ""
msgid "Transcription deleted"
msgstr ""
#: lib/claper_web/live/event_live/manage.ex:826
#: lib/claper_web/live/event_live/manage.ex:852
#, elixir-autogen, elixir-format
msgid "Transcription has been disabled by the administrator"
msgstr ""
@@ -3310,3 +3310,8 @@ msgstr "Ilimitado"
#, elixir-autogen, elixir-format
msgid "Powered by"
msgstr "Con tecnología de"
#: lib/claper_web/live/event_live/manage.ex:452
#, elixir-autogen, elixir-format
msgid "Could not reorder slides"
msgstr ""

View File

@@ -19,7 +19,7 @@ msgstr "Paramètres"
#: lib/claper_web/live/admin_live/user_live.html.heex:41
#: lib/claper_web/live/admin_live/user_live.html.heex:104
#: lib/claper_web/live/admin_live/user_live/form_component.ex:18
#: lib/claper_web/live/event_live/manage.ex:1092
#: lib/claper_web/live/event_live/manage.ex:1118
#: lib/claper_web/live/form_live/form_component.html.heex:32
#: lib/claper_web/live/user_settings_live/show.html.heex:18
#: lib/claper_web/templates/user_registration/new.html.heex:63
@@ -695,7 +695,7 @@ msgstr "Formulaire"
#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:74
#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:234
#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:24
#: lib/claper_web/live/event_live/manage.ex:1091
#: lib/claper_web/live/event_live/manage.ex:1117
#, elixir-autogen, elixir-format
msgid "Name"
msgstr "Nom"
@@ -1340,12 +1340,12 @@ msgstr "Rechargez la page à laquelle vous essayez d'accéder (ne renvoyez pas l
msgid "Try logging in again"
msgstr "Essayez de vous reconnecter"
#: lib/claper_web/live/event_live/manage.ex:1064
#: lib/claper_web/live/event_live/manage.ex:1090
#, elixir-autogen, elixir-format
msgid "No"
msgstr "Non"
#: lib/claper_web/live/event_live/manage.ex:1064
#: lib/claper_web/live/event_live/manage.ex:1090
#, elixir-autogen, elixir-format
msgid "Yes"
msgstr "Oui"
@@ -2670,10 +2670,10 @@ msgstr "ID de la ressource"
msgid "Resource Type"
msgstr "Type de réponse"
#: lib/claper_web/live/event_live/manage.ex:1072
#: lib/claper_web/live/event_live/manage.ex:1115
#: lib/claper_web/live/event_live/manage.ex:1131
#: lib/claper_web/live/event_live/manage.ex:1173
#: lib/claper_web/live/event_live/manage.ex:1098
#: lib/claper_web/live/event_live/manage.ex:1141
#: lib/claper_web/live/event_live/manage.ex:1157
#: lib/claper_web/live/event_live/manage.ex:1199
#, elixir-autogen, elixir-format
msgid "Resource not found"
msgstr "Ressource introuvable"
@@ -2911,7 +2911,7 @@ msgstr "Connectez-vous pour lancer ou gérer vos sessions interactives."
msgid "Could not regenerate thumbnails"
msgstr "Impossible de régénérer les miniatures"
#: lib/claper_web/live/event_live/manage.ex:461
#: lib/claper_web/live/event_live/manage.ex:487
#, elixir-autogen, elixir-format
msgid "Could not start thumbnail regeneration"
msgstr "Impossible de démarrer la régénération des miniatures"
@@ -2941,7 +2941,7 @@ msgstr "Régénérer les miniatures"
msgid "Regenerating..."
msgstr "Régénération en cours..."
#: lib/claper_web/live/event_live/manage.ex:458
#: lib/claper_web/live/event_live/manage.ex:484
#, elixir-autogen, elixir-format
msgid "Thumbnail regeneration started"
msgstr "Régénération des miniatures lancée"
@@ -3249,7 +3249,7 @@ msgstr ""
msgid "Transcription deleted"
msgstr ""
#: lib/claper_web/live/event_live/manage.ex:826
#: lib/claper_web/live/event_live/manage.ex:852
#, elixir-autogen, elixir-format
msgid "Transcription has been disabled by the administrator"
msgstr ""
@@ -3314,3 +3314,8 @@ msgstr "Illimité"
#, elixir-autogen, elixir-format
msgid "Powered by"
msgstr "Propulsé par"
#: lib/claper_web/live/event_live/manage.ex:452
#, elixir-autogen, elixir-format
msgid "Could not reorder slides"
msgstr ""

View File

@@ -19,7 +19,7 @@ msgstr "Beállítások"
#: lib/claper_web/live/admin_live/user_live.html.heex:41
#: lib/claper_web/live/admin_live/user_live.html.heex:104
#: lib/claper_web/live/admin_live/user_live/form_component.ex:18
#: lib/claper_web/live/event_live/manage.ex:1092
#: lib/claper_web/live/event_live/manage.ex:1118
#: lib/claper_web/live/form_live/form_component.html.heex:32
#: lib/claper_web/live/user_settings_live/show.html.heex:18
#: lib/claper_web/templates/user_registration/new.html.heex:63
@@ -691,7 +691,7 @@ msgstr "Űrlap"
#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:74
#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:234
#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:24
#: lib/claper_web/live/event_live/manage.ex:1091
#: lib/claper_web/live/event_live/manage.ex:1117
#, elixir-autogen, elixir-format
msgid "Name"
msgstr "Név"
@@ -1336,12 +1336,12 @@ msgstr "Töltse újra az elérni kívánt oldalt, de ne küldje újra az adatoka
msgid "Try logging in again"
msgstr "Jelentkezzen be újra"
#: lib/claper_web/live/event_live/manage.ex:1064
#: lib/claper_web/live/event_live/manage.ex:1090
#, elixir-autogen, elixir-format
msgid "No"
msgstr "Nem"
#: lib/claper_web/live/event_live/manage.ex:1064
#: lib/claper_web/live/event_live/manage.ex:1090
#, elixir-autogen, elixir-format
msgid "Yes"
msgstr "Igen"
@@ -2666,10 +2666,10 @@ msgstr "Erőforrás-azonosító"
msgid "Resource Type"
msgstr "Válasz típus"
#: lib/claper_web/live/event_live/manage.ex:1072
#: lib/claper_web/live/event_live/manage.ex:1115
#: lib/claper_web/live/event_live/manage.ex:1131
#: lib/claper_web/live/event_live/manage.ex:1173
#: lib/claper_web/live/event_live/manage.ex:1098
#: lib/claper_web/live/event_live/manage.ex:1141
#: lib/claper_web/live/event_live/manage.ex:1157
#: lib/claper_web/live/event_live/manage.ex:1199
#, elixir-autogen, elixir-format
msgid "Resource not found"
msgstr "Az erőforrás nem található"
@@ -2907,7 +2907,7 @@ msgstr "Jelentkezzen be interaktív munkamenetei indításához vagy kezeléséh
msgid "Could not regenerate thumbnails"
msgstr "A miniatűrök nem hozhatók létre újra"
#: lib/claper_web/live/event_live/manage.ex:461
#: lib/claper_web/live/event_live/manage.ex:487
#, elixir-autogen, elixir-format
msgid "Could not start thumbnail regeneration"
msgstr "A miniatűrök újragenerálása nem indítható el"
@@ -2937,7 +2937,7 @@ msgstr "Miniatűrök újragenerálása"
msgid "Regenerating..."
msgstr "Újragenerálás..."
#: lib/claper_web/live/event_live/manage.ex:458
#: lib/claper_web/live/event_live/manage.ex:484
#, elixir-autogen, elixir-format
msgid "Thumbnail regeneration started"
msgstr "Miniatűrök újragenerálása elindult"
@@ -3245,7 +3245,7 @@ msgstr ""
msgid "Transcription deleted"
msgstr ""
#: lib/claper_web/live/event_live/manage.ex:826
#: lib/claper_web/live/event_live/manage.ex:852
#, elixir-autogen, elixir-format
msgid "Transcription has been disabled by the administrator"
msgstr ""
@@ -3310,3 +3310,8 @@ msgstr "Korlátlan"
#, elixir-autogen, elixir-format
msgid "Powered by"
msgstr "Üzemelteti"
#: lib/claper_web/live/event_live/manage.ex:452
#, elixir-autogen, elixir-format
msgid "Could not reorder slides"
msgstr ""

View File

@@ -20,7 +20,7 @@ msgstr "Impostazioni"
#: lib/claper_web/live/admin_live/user_live.html.heex:41
#: lib/claper_web/live/admin_live/user_live.html.heex:104
#: lib/claper_web/live/admin_live/user_live/form_component.ex:18
#: lib/claper_web/live/event_live/manage.ex:1092
#: lib/claper_web/live/event_live/manage.ex:1118
#: lib/claper_web/live/form_live/form_component.html.heex:32
#: lib/claper_web/live/user_settings_live/show.html.heex:18
#: lib/claper_web/templates/user_registration/new.html.heex:63
@@ -692,7 +692,7 @@ msgstr "Modulo"
#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:74
#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:234
#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:24
#: lib/claper_web/live/event_live/manage.ex:1091
#: lib/claper_web/live/event_live/manage.ex:1117
#, elixir-autogen, elixir-format
msgid "Name"
msgstr "Nome"
@@ -1337,12 +1337,12 @@ msgstr "Ricarica la pagina che stai cercando di accedere (non reinviare i dati)"
msgid "Try logging in again"
msgstr "Prova ad accedere di nuovo"
#: lib/claper_web/live/event_live/manage.ex:1064
#: lib/claper_web/live/event_live/manage.ex:1090
#, elixir-autogen, elixir-format
msgid "No"
msgstr "No"
#: lib/claper_web/live/event_live/manage.ex:1064
#: lib/claper_web/live/event_live/manage.ex:1090
#, elixir-autogen, elixir-format
msgid "Yes"
msgstr "Sì"
@@ -2667,10 +2667,10 @@ msgstr "ID risorsa"
msgid "Resource Type"
msgstr "Tipo di risposta"
#: lib/claper_web/live/event_live/manage.ex:1072
#: lib/claper_web/live/event_live/manage.ex:1115
#: lib/claper_web/live/event_live/manage.ex:1131
#: lib/claper_web/live/event_live/manage.ex:1173
#: lib/claper_web/live/event_live/manage.ex:1098
#: lib/claper_web/live/event_live/manage.ex:1141
#: lib/claper_web/live/event_live/manage.ex:1157
#: lib/claper_web/live/event_live/manage.ex:1199
#, elixir-autogen, elixir-format
msgid "Resource not found"
msgstr "Risorsa non trovata"
@@ -2908,7 +2908,7 @@ msgstr "Accedi per avviare o gestire le tue sessioni interattive."
msgid "Could not regenerate thumbnails"
msgstr "Impossibile rigenerare le miniature"
#: lib/claper_web/live/event_live/manage.ex:461
#: lib/claper_web/live/event_live/manage.ex:487
#, elixir-autogen, elixir-format
msgid "Could not start thumbnail regeneration"
msgstr "Impossibile avviare la rigenerazione delle miniature"
@@ -2938,7 +2938,7 @@ msgstr "Rigenera miniature"
msgid "Regenerating..."
msgstr "Rigenerazione in corso..."
#: lib/claper_web/live/event_live/manage.ex:458
#: lib/claper_web/live/event_live/manage.ex:484
#, elixir-autogen, elixir-format
msgid "Thumbnail regeneration started"
msgstr "Rigenerazione delle miniature avviata"
@@ -3246,7 +3246,7 @@ msgstr ""
msgid "Transcription deleted"
msgstr ""
#: lib/claper_web/live/event_live/manage.ex:826
#: lib/claper_web/live/event_live/manage.ex:852
#, elixir-autogen, elixir-format
msgid "Transcription has been disabled by the administrator"
msgstr ""
@@ -3311,3 +3311,8 @@ msgstr "Illimitato"
#, elixir-autogen, elixir-format
msgid "Powered by"
msgstr "Funziona con"
#: lib/claper_web/live/event_live/manage.ex:452
#, elixir-autogen, elixir-format
msgid "Could not reorder slides"
msgstr ""

View File

@@ -19,7 +19,7 @@ msgstr "Iestatījumi"
#: lib/claper_web/live/admin_live/user_live.html.heex:41
#: lib/claper_web/live/admin_live/user_live.html.heex:104
#: lib/claper_web/live/admin_live/user_live/form_component.ex:18
#: lib/claper_web/live/event_live/manage.ex:1092
#: lib/claper_web/live/event_live/manage.ex:1118
#: lib/claper_web/live/form_live/form_component.html.heex:32
#: lib/claper_web/live/user_settings_live/show.html.heex:18
#: lib/claper_web/templates/user_registration/new.html.heex:63
@@ -695,7 +695,7 @@ msgstr "Veidlapa"
#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:74
#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:234
#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:24
#: lib/claper_web/live/event_live/manage.ex:1091
#: lib/claper_web/live/event_live/manage.ex:1117
#, elixir-autogen, elixir-format
msgid "Name"
msgstr "Nosaukums"
@@ -1340,12 +1340,12 @@ msgstr "Atkārtoti ielādējiet lapu, kurai mēģināt piekļūt (neveiciet atk
msgid "Try logging in again"
msgstr "Mēģiniet vēlreiz pieteikties"
#: lib/claper_web/live/event_live/manage.ex:1064
#: lib/claper_web/live/event_live/manage.ex:1090
#, elixir-autogen, elixir-format
msgid "No"
msgstr "Nē"
#: lib/claper_web/live/event_live/manage.ex:1064
#: lib/claper_web/live/event_live/manage.ex:1090
#, elixir-autogen, elixir-format
msgid "Yes"
msgstr "Jā"
@@ -2670,10 +2670,10 @@ msgstr "Resursa ID"
msgid "Resource Type"
msgstr "Atbildes veids"
#: lib/claper_web/live/event_live/manage.ex:1072
#: lib/claper_web/live/event_live/manage.ex:1115
#: lib/claper_web/live/event_live/manage.ex:1131
#: lib/claper_web/live/event_live/manage.ex:1173
#: lib/claper_web/live/event_live/manage.ex:1098
#: lib/claper_web/live/event_live/manage.ex:1141
#: lib/claper_web/live/event_live/manage.ex:1157
#: lib/claper_web/live/event_live/manage.ex:1199
#, elixir-autogen, elixir-format
msgid "Resource not found"
msgstr "Resurss nav atrasts"
@@ -2911,7 +2911,7 @@ msgstr "Piesakieties, lai palaistu vai pārvaldītu savas interaktīvās sesijas
msgid "Could not regenerate thumbnails"
msgstr "Nevarēja atjaunot sīktēlus"
#: lib/claper_web/live/event_live/manage.ex:461
#: lib/claper_web/live/event_live/manage.ex:487
#, elixir-autogen, elixir-format
msgid "Could not start thumbnail regeneration"
msgstr "Nevarēja sākt sīktēlu atjaunošanu"
@@ -2941,7 +2941,7 @@ msgstr "Atjaunot sīktēlus"
msgid "Regenerating..."
msgstr "Atjauno..."
#: lib/claper_web/live/event_live/manage.ex:458
#: lib/claper_web/live/event_live/manage.ex:484
#, elixir-autogen, elixir-format
msgid "Thumbnail regeneration started"
msgstr "Sīktēlu atjaunošana sākta"
@@ -3249,7 +3249,7 @@ msgstr ""
msgid "Transcription deleted"
msgstr ""
#: lib/claper_web/live/event_live/manage.ex:826
#: lib/claper_web/live/event_live/manage.ex:852
#, elixir-autogen, elixir-format
msgid "Transcription has been disabled by the administrator"
msgstr ""
@@ -3314,3 +3314,8 @@ msgstr "Neierobežots"
#, elixir-autogen, elixir-format
msgid "Powered by"
msgstr "Darbina"
#: lib/claper_web/live/event_live/manage.ex:452
#, elixir-autogen, elixir-format
msgid "Could not reorder slides"
msgstr ""

View File

@@ -19,7 +19,7 @@ msgstr "Instellingen"
#: lib/claper_web/live/admin_live/user_live.html.heex:41
#: lib/claper_web/live/admin_live/user_live.html.heex:104
#: lib/claper_web/live/admin_live/user_live/form_component.ex:18
#: lib/claper_web/live/event_live/manage.ex:1092
#: lib/claper_web/live/event_live/manage.ex:1118
#: lib/claper_web/live/form_live/form_component.html.heex:32
#: lib/claper_web/live/user_settings_live/show.html.heex:18
#: lib/claper_web/templates/user_registration/new.html.heex:63
@@ -691,7 +691,7 @@ msgstr "Formulier"
#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:74
#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:234
#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:24
#: lib/claper_web/live/event_live/manage.ex:1091
#: lib/claper_web/live/event_live/manage.ex:1117
#, elixir-autogen, elixir-format
msgid "Name"
msgstr "Naam"
@@ -1336,12 +1336,12 @@ msgstr "Herlaad de pagina die u probeert te openen (dien geen gegevens opnieuw i
msgid "Try logging in again"
msgstr "Probeer opnieuw in te loggen"
#: lib/claper_web/live/event_live/manage.ex:1064
#: lib/claper_web/live/event_live/manage.ex:1090
#, elixir-autogen, elixir-format
msgid "No"
msgstr "Nee"
#: lib/claper_web/live/event_live/manage.ex:1064
#: lib/claper_web/live/event_live/manage.ex:1090
#, elixir-autogen, elixir-format
msgid "Yes"
msgstr "Ja"
@@ -2666,10 +2666,10 @@ msgstr "Resource-ID"
msgid "Resource Type"
msgstr "Reactietype"
#: lib/claper_web/live/event_live/manage.ex:1072
#: lib/claper_web/live/event_live/manage.ex:1115
#: lib/claper_web/live/event_live/manage.ex:1131
#: lib/claper_web/live/event_live/manage.ex:1173
#: lib/claper_web/live/event_live/manage.ex:1098
#: lib/claper_web/live/event_live/manage.ex:1141
#: lib/claper_web/live/event_live/manage.ex:1157
#: lib/claper_web/live/event_live/manage.ex:1199
#, elixir-autogen, elixir-format
msgid "Resource not found"
msgstr "Resource niet gevonden"
@@ -2907,7 +2907,7 @@ msgstr "Meld je aan om je interactieve sessies te starten of beheren."
msgid "Could not regenerate thumbnails"
msgstr "Miniaturen konden niet opnieuw worden gegenereerd"
#: lib/claper_web/live/event_live/manage.ex:461
#: lib/claper_web/live/event_live/manage.ex:487
#, elixir-autogen, elixir-format
msgid "Could not start thumbnail regeneration"
msgstr "Het genereren van miniaturen kon niet worden gestart"
@@ -2937,7 +2937,7 @@ msgstr "Miniaturen opnieuw genereren"
msgid "Regenerating..."
msgstr "Opnieuw genereren..."
#: lib/claper_web/live/event_live/manage.ex:458
#: lib/claper_web/live/event_live/manage.ex:484
#, elixir-autogen, elixir-format
msgid "Thumbnail regeneration started"
msgstr "Genereren van miniaturen gestart"
@@ -3245,7 +3245,7 @@ msgstr ""
msgid "Transcription deleted"
msgstr ""
#: lib/claper_web/live/event_live/manage.ex:826
#: lib/claper_web/live/event_live/manage.ex:852
#, elixir-autogen, elixir-format
msgid "Transcription has been disabled by the administrator"
msgstr ""
@@ -3310,3 +3310,8 @@ msgstr "Onbeperkt"
#, elixir-autogen, elixir-format
msgid "Powered by"
msgstr "Mogelijk gemaakt door"
#: lib/claper_web/live/event_live/manage.ex:452
#, elixir-autogen, elixir-format
msgid "Could not reorder slides"
msgstr ""

View File

@@ -26,7 +26,7 @@ msgstr "Inställningar"
#: lib/claper_web/live/admin_live/user_live.html.heex:41
#: lib/claper_web/live/admin_live/user_live.html.heex:104
#: lib/claper_web/live/admin_live/user_live/form_component.ex:18
#: lib/claper_web/live/event_live/manage.ex:1092
#: lib/claper_web/live/event_live/manage.ex:1118
#: lib/claper_web/live/form_live/form_component.html.heex:32
#: lib/claper_web/live/user_settings_live/show.html.heex:18
#: lib/claper_web/templates/user_registration/new.html.heex:63
@@ -724,7 +724,7 @@ msgstr "Formulär"
#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:74
#: lib/claper_web/live/admin_live/oidc_provider_live.html.heex:234
#: lib/claper_web/live/admin_live/oidc_provider_live/form_component.ex:24
#: lib/claper_web/live/event_live/manage.ex:1091
#: lib/claper_web/live/event_live/manage.ex:1117
#, elixir-autogen, elixir-format
msgid "Name"
msgstr "Namn"
@@ -1372,12 +1372,12 @@ msgstr "Ladda om sidan du försöker komma åt (skicka inte om data)"
msgid "Try logging in again"
msgstr "Försök logga in igen"
#: lib/claper_web/live/event_live/manage.ex:1064
#: lib/claper_web/live/event_live/manage.ex:1090
#, elixir-autogen, elixir-format
msgid "No"
msgstr "Nej"
#: lib/claper_web/live/event_live/manage.ex:1064
#: lib/claper_web/live/event_live/manage.ex:1090
#, elixir-autogen, elixir-format
msgid "Yes"
msgstr "Ja"
@@ -2704,10 +2704,10 @@ msgstr "Resurs-ID"
msgid "Resource Type"
msgstr "Resurstyp"
#: lib/claper_web/live/event_live/manage.ex:1072
#: lib/claper_web/live/event_live/manage.ex:1115
#: lib/claper_web/live/event_live/manage.ex:1131
#: lib/claper_web/live/event_live/manage.ex:1173
#: lib/claper_web/live/event_live/manage.ex:1098
#: lib/claper_web/live/event_live/manage.ex:1141
#: lib/claper_web/live/event_live/manage.ex:1157
#: lib/claper_web/live/event_live/manage.ex:1199
#, elixir-autogen, elixir-format
msgid "Resource not found"
msgstr ""
@@ -2945,7 +2945,7 @@ msgstr ""
msgid "Could not regenerate thumbnails"
msgstr ""
#: lib/claper_web/live/event_live/manage.ex:461
#: lib/claper_web/live/event_live/manage.ex:487
#, elixir-autogen, elixir-format
msgid "Could not start thumbnail regeneration"
msgstr ""
@@ -2975,7 +2975,7 @@ msgstr ""
msgid "Regenerating..."
msgstr ""
#: lib/claper_web/live/event_live/manage.ex:458
#: lib/claper_web/live/event_live/manage.ex:484
#, elixir-autogen, elixir-format
msgid "Thumbnail regeneration started"
msgstr ""
@@ -3283,7 +3283,7 @@ msgstr ""
msgid "Transcription deleted"
msgstr ""
#: lib/claper_web/live/event_live/manage.ex:826
#: lib/claper_web/live/event_live/manage.ex:852
#, elixir-autogen, elixir-format
msgid "Transcription has been disabled by the administrator"
msgstr ""
@@ -3348,3 +3348,8 @@ msgstr "Obegränsat"
#, elixir-autogen, elixir-format
msgid "Powered by"
msgstr "Drivs av"
#: lib/claper_web/live/event_live/manage.ex:452
#, elixir-autogen, elixir-format
msgid "Could not reorder slides"
msgstr ""

View File

@@ -0,0 +1,9 @@
defmodule Claper.Repo.Migrations.AddSlideOrderToPresentationFiles do
use Ecto.Migration
def change do
alter table(:presentation_files) do
add :slide_order, {:array, :integer}
end
end
end

View File

@@ -64,6 +64,95 @@ defmodule Claper.PresentationsTest do
end
end
describe "slide ordering" do
import Claper.PresentationsFixtures
import Claper.PollsFixtures
test "get_slide_urls/1 and get_slide_thumbnail_urls/1 honor slide_order" do
put_local_storage_config(unique_storage_dir())
presentation_file = presentation_file_fixture(%{hash: "ordered", length: 3})
{:ok, presentation_file} =
Presentations.update_presentation_file(presentation_file, %{slide_order: [3, 1, 2]})
assert Presentations.get_slide_urls(presentation_file) == [
"/uploads/ordered/3.jpg",
"/uploads/ordered/1.jpg",
"/uploads/ordered/2.jpg"
]
assert Presentations.get_slide_thumbnail_urls(presentation_file) == [
"/uploads/ordered/thumbs/3.jpg",
"/uploads/ordered/thumbs/1.jpg",
"/uploads/ordered/thumbs/2.jpg"
]
end
test "a stale slide_order falls back to natural order" do
put_local_storage_config(unique_storage_dir())
presentation_file = presentation_file_fixture(%{hash: "stale", length: 3})
{:ok, presentation_file} =
Presentations.update_presentation_file(presentation_file, %{slide_order: [2, 1]})
assert Presentations.get_slide_urls(presentation_file) == [
"/uploads/stale/1.jpg",
"/uploads/stale/2.jpg",
"/uploads/stale/3.jpg"
]
end
test "update_presentation_file/2 clears slide_order with a nil param" do
presentation_file = presentation_file_fixture()
{:ok, presentation_file} =
Presentations.update_presentation_file(presentation_file, %{slide_order: [2, 1]})
assert presentation_file.slide_order == [2, 1]
{:ok, presentation_file} =
Presentations.update_presentation_file(presentation_file, %{"slide_order" => nil})
assert is_nil(presentation_file.slide_order)
end
test "reorder_slides/3 remaps slide order, interactions and state position" do
presentation_file = presentation_file_fixture(%{length: 5})
presentation_state_fixture(%{presentation_file: presentation_file, position: 1})
poll_at_0 = poll_fixture(%{presentation_file_id: presentation_file.id, position: 0})
poll_at_3 = poll_fixture(%{presentation_file_id: presentation_file.id, position: 3})
# Move the slide displayed at position 3 to position 0
assert {:ok, presentation_file, state} =
Presentations.reorder_slides(presentation_file, 3, 0)
assert presentation_file.slide_order == [4, 1, 2, 3, 5]
assert state.position == 2
assert Claper.Polls.get_poll!(poll_at_0.id).position == 1
assert Claper.Polls.get_poll!(poll_at_3.id).position == 0
# Moving it back restores the natural order
assert {:ok, presentation_file, state} =
Presentations.reorder_slides(presentation_file, 0, 3)
assert presentation_file.slide_order == [1, 2, 3, 4, 5]
assert state.position == 1
assert Claper.Polls.get_poll!(poll_at_0.id).position == 0
assert Claper.Polls.get_poll!(poll_at_3.id).position == 3
end
test "reorder_slides/3 rejects invalid positions" do
presentation_file = presentation_file_fixture(%{length: 5})
assert {:error, :invalid_position} = Presentations.reorder_slides(presentation_file, 0, 0)
assert {:error, :invalid_position} = Presentations.reorder_slides(presentation_file, -1, 2)
assert {:error, :invalid_position} = Presentations.reorder_slides(presentation_file, 0, 5)
end
end
describe "presentation_states" do
alias Claper.Presentations.PresentationState