diff --git a/lib/claper/presentations.ex b/lib/claper/presentations.ex index 6427abe..3b1db9d 100644 --- a/lib/claper/presentations.ex +++ b/lib/claper/presentations.ex @@ -156,6 +156,19 @@ defmodule Claper.Presentations do end end + @doc """ + Returns true when a presentation has slides but no generated thumbnails. + """ + def missing_slide_thumbnails?(nil), do: false + + def missing_slide_thumbnails?(%PresentationFile{hash: nil}), do: false + def missing_slide_thumbnails?(%PresentationFile{length: nil}), do: false + def missing_slide_thumbnails?(%PresentationFile{length: 0}), do: false + + def missing_slide_thumbnails?(%PresentationFile{hash: hash}) do + not slide_thumbnails_available?(hash) + end + @doc """ Creates a presentation_files. @@ -246,4 +259,44 @@ defmodule Claper.Presentations do {:ok, state} end + + defp slide_thumbnails_available?(hash) when is_binary(hash) do + config = Application.get_env(:claper, :presentations) + + case Keyword.fetch!(config, :storage) do + "local" -> + thumbnails_glob(hash) + |> Path.wildcard() + |> Enum.any?() + + "s3" -> + ExAws.S3.list_objects(get_s3_bucket(), prefix: "presentations/#{hash}/thumbs/") + |> ExAws.stream!() + |> Enum.take(1) + |> Enum.any?() + + storage -> + raise "Unrecognised presentations storage value #{storage}" + end + rescue + _ -> false + end + + defp thumbnails_glob(hash) do + Path.join([ + get_presentation_storage_dir(), + "uploads", + hash, + "thumbs", + "*.jpg" + ]) + end + + defp get_presentation_storage_dir do + Application.get_env(:claper, :storage_dir) + end + + defp get_s3_bucket do + Application.get_env(:claper, :presentations) |> Keyword.get(:s3_bucket) + end end diff --git a/lib/claper/tasks/converter.ex b/lib/claper/tasks/converter.ex index 8d29eb9..475bed1 100644 --- a/lib/claper/tasks/converter.ex +++ b/lib/claper/tasks/converter.ex @@ -5,6 +5,7 @@ defmodule Claper.Tasks.Converter do """ alias Claper.Events + alias Claper.Presentations.PresentationFile alias Porcelain.Result @doc """ @@ -64,6 +65,27 @@ defmodule Claper.Tasks.Converter do end end + @doc """ + Regenerates thumbnails for an already converted presentation. + """ + def regenerate_thumbnails(%PresentationFile{hash: nil}), do: {:error, :missing_hash} + def regenerate_thumbnails(%PresentationFile{length: nil}), do: {:error, :missing_length} + def regenerate_thumbnails(%PresentationFile{length: 0}), do: {:error, :missing_length} + + def regenerate_thumbnails(%PresentationFile{hash: hash, length: length}) do + case get_presentation_storage() do + "local" -> + path = Path.join([get_presentation_storage_dir(), "uploads", hash]) + generate_thumbnails(path) + + "s3" -> + regenerate_s3_thumbnails(hash, length) + + storage -> + raise "Unrecognised presentations storage value #{storage}" + end + end + defp file_to_pdf(:ppt, path, file) do Porcelain.exec( get_libreoffice_binary(), @@ -112,13 +134,16 @@ defmodule Claper.Tasks.Converter do ] ) - # Generate thumbnails after full-size images case result do - %Porcelain.Result{status: 0} -> generate_thumbnails(path) - _ -> result - end + %Porcelain.Result{status: 0} -> + case generate_thumbnails(path) do + :ok -> result + _ -> %Porcelain.Result{status: 1} + end - result + _ -> + result + end end defp pdf_to_jpg(_result, path, presentation, user_id) do @@ -127,29 +152,42 @@ defmodule Claper.Tasks.Converter do defp generate_thumbnails(path) do thumbs_dir = Path.join(path, "thumbs") + File.rm_rf!(thumbs_dir) File.mkdir_p!(thumbs_dir) files = Path.wildcard("#{path}/*.jpg") - for file <- files do - thumb_path = Path.join(thumbs_dir, Path.basename(file)) + if Enum.empty?(files) do + {:error, :missing_slides} + else + result = + Enum.reduce_while(files, :ok, fn file, _acc -> + thumb_path = Path.join(thumbs_dir, Path.basename(file)) - # Generate thumbnail with 200px width, maintaining aspect ratio - # Using "magick" for ImageMagick v7+ compatibility - Porcelain.exec( - "magick", - [ - file, - "-resize", - "200x", - "-quality", - "80", - thumb_path - ] - ) + # Generate thumbnail with 200px width, maintaining aspect ratio + # Using "magick" for ImageMagick v7+ compatibility + case Porcelain.exec( + "magick", + [ + file, + "-resize", + "200x", + "-quality", + "80", + thumb_path + ] + ) do + %Porcelain.Result{status: 0} -> {:cont, :ok} + error -> {:halt, {:error, error}} + end + end) + + if result == :ok do + IO.puts("Generated #{length(files)} thumbnails in #{thumbs_dir}") + end + + result end - - IO.puts("Generated #{length(files)} thumbnails in #{thumbs_dir}") end defp jpg_upload(%Result{status: 0}, hash, path, presentation, user_id, is_copy) do @@ -259,4 +297,55 @@ defmodule Claper.Tasks.Converter do _ -> "libreoffice" end end + + defp regenerate_s3_thumbnails(hash, length) do + path = + Path.join(System.tmp_dir!(), "claper-thumbs-#{hash}-#{System.unique_integer([:positive])}") + + File.mkdir_p!(path) + + with :ok <- download_s3_slides(path, hash, length), + :ok <- generate_thumbnails(path), + :ok <- upload_s3_thumbnails(path, hash) do + File.rm_rf!(path) + :ok + else + error -> + File.rm_rf!(path) + error + end + end + + defp download_s3_slides(path, hash, length) do + Enum.reduce_while(1..length, :ok, fn index, _acc -> + key = "presentations/#{hash}/#{index}.jpg" + + case ExAws.S3.get_object(get_s3_bucket(), key) |> ExAws.request() do + {:ok, %{body: body}} -> + file_path = Path.join(path, "#{index}.jpg") + File.write!(file_path, body, [:binary]) + {:cont, :ok} + + error -> + {:halt, {:error, error}} + end + end) + end + + defp upload_s3_thumbnails(path, hash) do + path + |> Path.join("thumbs/*.jpg") + |> Path.wildcard() + |> Enum.reduce_while(:ok, fn file, _acc -> + key = "presentations/#{hash}/thumbs/#{Path.basename(file)}" + + case file + |> ExAws.S3.Upload.stream_file() + |> ExAws.S3.upload(get_s3_bucket(), key, acl: "public-read") + |> ExAws.request() do + {:ok, _response} -> {:cont, :ok} + error -> {:halt, {:error, error}} + end + end) + end end diff --git a/lib/claper/workers/presentation_thumbnails.ex b/lib/claper/workers/presentation_thumbnails.ex new file mode 100644 index 0000000..60532dd --- /dev/null +++ b/lib/claper/workers/presentation_thumbnails.ex @@ -0,0 +1,38 @@ +defmodule Claper.Workers.PresentationThumbnails do + use Oban.Worker, queue: :default + + alias Claper.{Events, Presentations} + alias Claper.Tasks.Converter + + @impl Oban.Worker + def perform(%Oban.Job{ + args: %{"presentation_file_id" => presentation_file_id, "user_id" => user_id} + }) do + presentation_file = Presentations.get_presentation_file!(presentation_file_id) + + case Converter.regenerate_thumbnails(presentation_file) do + :ok -> + Events.broadcast_user_events( + user_id, + {:presentation_file_thumbnails_regenerated, presentation_file_id} + ) + + :ok + + {:error, _reason} = error -> + Events.broadcast_user_events( + user_id, + {:presentation_file_thumbnail_regeneration_failed, presentation_file_id} + ) + + error + end + end + + def create(presentation_file_id, user_id) do + new(%{ + "presentation_file_id" => presentation_file_id, + "user_id" => user_id + }) + end +end diff --git a/lib/claper_web/live/event_live/manage.ex b/lib/claper_web/live/event_live/manage.ex index 7ec7053..b43a565 100644 --- a/lib/claper_web/live/event_live/manage.ex +++ b/lib/claper_web/live/event_live/manage.ex @@ -1,21 +1,23 @@ defmodule ClaperWeb.EventLive.Manage do use ClaperWeb, :live_view - alias Claper.{Embeds, Forms, Polls, Quizzes} + alias Claper.{Embeds, Events, Forms, Polls, Presentations, Quizzes} + alias Claper.Workers.PresentationThumbnails alias ClaperWeb.Presence + @event_preload [ + :user, + :lti_resource, + presentation_file: [:polls, :presentation_state] + ] + @impl true def mount(%{"code" => code}, session, socket) do with %{"locale" => locale} <- session do Gettext.put_locale(ClaperWeb.Gettext, locale) end - event = - Claper.Events.get_event_with_code(code, [ - :user, - :lti_resource, - presentation_file: [:polls, :presentation_state] - ]) + event = Events.get_event_with_code(code, @event_preload) if is_nil(event) || not leader?(socket, event) do {:ok, @@ -25,7 +27,8 @@ defmodule ClaperWeb.EventLive.Manage do else if connected?(socket) do Claper.Events.Event.subscribe(event.uuid) - Claper.Presentations.subscribe(event.presentation_file.id) + Presentations.subscribe(event.presentation_file.id) + Events.subscribe_user_events(socket.assigns.current_user.id) end posts = list_all_posts(socket, event.uuid) @@ -59,6 +62,12 @@ defmodule ClaperWeb.EventLive.Manage do |> assign(:create, nil) |> assign(:list_tab, :posts) |> assign(:create_action, :new) + |> assign( + :missing_slide_thumbnails, + Presentations.missing_slide_thumbnails?(event.presentation_file) + ) + |> assign(:thumbnail_cache_bust, thumbnail_cache_bust()) + |> assign(:thumbnail_regeneration_in_progress, false) |> push_event("page-manage", %{ current_page: event.presentation_file.presentation_state.position, timeout: 500 @@ -296,6 +305,37 @@ defmodule ClaperWeb.EventLive.Manage do end end + @impl true + def handle_info( + {:presentation_file_process_done, %{id: presentation_file_id}}, + %{assigns: %{event: %{presentation_file: %{id: presentation_file_id}}}} = socket + ) do + {:noreply, refresh_event(socket)} + end + + @impl true + def handle_info( + {:presentation_file_thumbnails_regenerated, presentation_file_id}, + %{assigns: %{event: %{presentation_file: %{id: presentation_file_id}}}} = socket + ) do + {:noreply, + socket + |> refresh_event() + |> assign(:thumbnail_regeneration_in_progress, false) + |> put_flash(:info, gettext("Thumbnails regenerated successfully"))} + end + + @impl true + def handle_info( + {:presentation_file_thumbnail_regeneration_failed, presentation_file_id}, + %{assigns: %{event: %{presentation_file: %{id: presentation_file_id}}}} = socket + ) do + {:noreply, + socket + |> assign(:thumbnail_regeneration_in_progress, false) + |> put_flash(:error, gettext("Could not regenerate thumbnails"))} + end + @impl true def handle_info(_, socket) do {:noreply, socket} @@ -329,6 +369,41 @@ defmodule ClaperWeb.EventLive.Manage do |> interactions_at_position(page)} end + @impl true + def handle_event( + "regenerate-thumbnails", + _params, + %{assigns: %{missing_slide_thumbnails: false}} = socket + ) do + {:noreply, socket} + end + + @impl true + def handle_event( + "regenerate-thumbnails", + _params, + %{assigns: %{thumbnail_regeneration_in_progress: true}} = socket + ) do + {:noreply, socket} + end + + @impl true + def handle_event("regenerate-thumbnails", _params, socket) do + presentation_file_id = socket.assigns.event.presentation_file.id + user_id = socket.assigns.current_user.id + + case PresentationThumbnails.create(presentation_file_id, user_id) |> Oban.insert() do + {:ok, _job} -> + {:noreply, + socket + |> assign(:thumbnail_regeneration_in_progress, true) + |> put_flash(:info, gettext("Thumbnail regeneration started"))} + + {:error, _changeset} -> + {:noreply, socket |> put_flash(:error, gettext("Could not start thumbnail regeneration"))} + end + end + def handle_event("poll-set-active", %{"id" => id}, socket) do case Polls.get_poll_for_event(id, event_id(socket)) do nil -> @@ -1062,4 +1137,21 @@ defmodule ClaperWeb.EventLive.Manage do defp list_form_submits(_socket, presentation_file_id) do Claper.Forms.list_form_submits(presentation_file_id, [:form]) end + + defp refresh_event(%{assigns: %{event: event}} = socket) do + refreshed_event = Events.get_event_with_code(event.code, @event_preload) + + socket + |> assign(:event, refreshed_event) + |> assign(:state, refreshed_event.presentation_file.presentation_state) + |> assign( + :missing_slide_thumbnails, + Presentations.missing_slide_thumbnails?(refreshed_event.presentation_file) + ) + |> assign(:thumbnail_cache_bust, thumbnail_cache_bust()) + end + + defp thumbnail_cache_bust do + System.system_time(:second) + end end diff --git a/lib/claper_web/live/event_live/manage.html.heex b/lib/claper_web/live/event_live/manage.html.heex index efc62bc..1187fa2 100644 --- a/lib/claper_web/live/event_live/manage.html.heex +++ b/lib/claper_web/live/event_live/manage.html.heex @@ -428,7 +428,7 @@
@@ -449,6 +450,8 @@ presentation_file={@event.presentation_file} current_position={@state.position} total_slides={@event.presentation_file.length} + missing_slide_thumbnails={@missing_slide_thumbnails} + thumbnail_regeneration_in_progress={@thumbnail_regeneration_in_progress} />
diff --git a/lib/claper_web/live/event_live/manage_slide_preview_component.ex b/lib/claper_web/live/event_live/manage_slide_preview_component.ex index 7ae07b7..fb7afb3 100644 --- a/lib/claper_web/live/event_live/manage_slide_preview_component.ex +++ b/lib/claper_web/live/event_live/manage_slide_preview_component.ex @@ -55,6 +55,30 @@ defmodule ClaperWeb.EventLive.ManageSlidePreviewComponent do {@current_position + 1}/ {@total_slides} +
+
+
+

{gettext("No thumbnails are available")}

+

+ {gettext("Regenerate them to restore the presentation preview sidebar.")} +

+
+ +
+
""" end + + defp append_cache_bust(url, nil), do: url + defp append_cache_bust(url, cache_bust), do: "#{url}?v=#{cache_bust}" end diff --git a/priv/gettext/de/LC_MESSAGES/default.po b/priv/gettext/de/LC_MESSAGES/default.po index c0d1228..5606b4a 100644 --- a/priv/gettext/de/LC_MESSAGES/default.po +++ b/priv/gettext/de/LC_MESSAGES/default.po @@ -16,7 +16,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:914 +#: lib/claper_web/live/event_live/manage.ex:989 #: 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 @@ -685,7 +685,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:913 +#: lib/claper_web/live/event_live/manage.ex:988 #, elixir-autogen, elixir-format msgid "Name" msgstr "Name" @@ -1061,7 +1061,7 @@ msgstr "Wann beginnt Ihre Veranstaltung?" msgid "Create your next presentation with" msgstr "Erstellen Sie Ihre nächste Präsentation mit" -#: lib/claper_web/live/event_live/manage.ex:23 +#: lib/claper_web/live/event_live/manage.ex:25 #: lib/claper_web/live/event_live/presenter.ex:26 #: lib/claper_web/live/event_live/show.ex:38 #, elixir-autogen, elixir-format @@ -1326,12 +1326,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:886 +#: lib/claper_web/live/event_live/manage.ex:961 #, elixir-autogen, elixir-format msgid "No" msgstr "Nein" -#: lib/claper_web/live/event_live/manage.ex:886 +#: lib/claper_web/live/event_live/manage.ex:961 #, elixir-autogen, elixir-format msgid "Yes" msgstr "Ja" @@ -2413,7 +2413,7 @@ msgstr "Teilnehmer" msgid "Audience Responses" msgstr "Publikumsantworten" -#: lib/claper_web/live/event_live/manage_slide_sidebar_component.ex:34 +#: lib/claper_web/live/event_live/manage_slide_sidebar_component.ex:45 #, elixir-autogen, elixir-format msgid "Content" msgstr "Inhalt" @@ -2518,7 +2518,7 @@ msgstr "Keine Interaktionen auf dieser Folie" msgid "No settings available for this interaction" msgstr "Keine Einstellungen für diese Interaktion verfügbar" -#: lib/claper_web/live/event_live/manage_slide_preview_component.ex:107 +#: lib/claper_web/live/event_live/manage_slide_preview_component.ex:131 #, elixir-autogen, elixir-format msgid "No slide available" msgstr "Keine Folie verfügbar" @@ -2652,10 +2652,10 @@ msgstr "" msgid "Resource Type" msgstr "Antworttyp" -#: lib/claper_web/live/event_live/manage.ex:894 -#: lib/claper_web/live/event_live/manage.ex:937 -#: lib/claper_web/live/event_live/manage.ex:953 -#: lib/claper_web/live/event_live/manage.ex:995 +#: lib/claper_web/live/event_live/manage.ex:969 +#: lib/claper_web/live/event_live/manage.ex:1012 +#: lib/claper_web/live/event_live/manage.ex:1028 +#: lib/claper_web/live/event_live/manage.ex:1070 #, elixir-autogen, elixir-format msgid "Resource not found" msgstr "" @@ -2887,3 +2887,57 @@ msgstr "" #, elixir-autogen, elixir-format msgid "Sign in to manage your presentations." msgstr "" + +#: lib/claper_web/live/event_live/manage.ex:336 +#, elixir-autogen, elixir-format +msgid "Could not regenerate thumbnails" +msgstr "" + +#: lib/claper_web/live/event_live/manage.ex:403 +#, elixir-autogen, elixir-format +msgid "Could not start thumbnail regeneration" +msgstr "" + +#: lib/claper_web/live/event_live/manage_slide_preview_component.ex:64 +#: lib/claper_web/live/event_live/manage_slide_sidebar_component.ex:52 +#, elixir-autogen, elixir-format +msgid "No thumbnails are available" +msgstr "" + +#: lib/claper_web/live/event_live/manage_slide_preview_component.ex:72 +#: lib/claper_web/live/event_live/manage_slide_sidebar_component.ex:59 +#, elixir-autogen, elixir-format +msgid "No thumbnails are available. Regenerate them?" +msgstr "" + +#: lib/claper_web/live/event_live/manage_slide_preview_component.ex:66 +#, elixir-autogen, elixir-format +msgid "Regenerate them to restore the presentation preview sidebar." +msgstr "" + +#: lib/claper_web/live/event_live/manage_slide_sidebar_component.ex:54 +#, elixir-autogen, elixir-format +msgid "Regenerate them to restore the slide sidebar preview." +msgstr "" + +#: lib/claper_web/live/event_live/manage_slide_preview_component.ex:78 +#: lib/claper_web/live/event_live/manage_slide_sidebar_component.ex:65 +#, elixir-autogen, elixir-format +msgid "Regenerate thumbnails" +msgstr "" + +#: lib/claper_web/live/event_live/manage_slide_preview_component.ex:77 +#: lib/claper_web/live/event_live/manage_slide_sidebar_component.ex:64 +#, elixir-autogen, elixir-format +msgid "Regenerating..." +msgstr "" + +#: lib/claper_web/live/event_live/manage.ex:400 +#, elixir-autogen, elixir-format +msgid "Thumbnail regeneration started" +msgstr "" + +#: lib/claper_web/live/event_live/manage.ex:325 +#, elixir-autogen, elixir-format +msgid "Thumbnails regenerated successfully" +msgstr "" diff --git a/priv/gettext/default.pot b/priv/gettext/default.pot index c618095..1e210fd 100644 --- a/priv/gettext/default.pot +++ b/priv/gettext/default.pot @@ -18,7 +18,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:914 +#: lib/claper_web/live/event_live/manage.ex:989 #: 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 @@ -687,7 +687,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:913 +#: lib/claper_web/live/event_live/manage.ex:988 #, elixir-autogen, elixir-format msgid "Name" msgstr "" @@ -1063,7 +1063,7 @@ msgstr "" msgid "Create your next presentation with" msgstr "" -#: lib/claper_web/live/event_live/manage.ex:23 +#: lib/claper_web/live/event_live/manage.ex:25 #: lib/claper_web/live/event_live/presenter.ex:26 #: lib/claper_web/live/event_live/show.ex:38 #, elixir-autogen, elixir-format @@ -1328,12 +1328,12 @@ msgstr "" msgid "Try logging in again" msgstr "" -#: lib/claper_web/live/event_live/manage.ex:886 +#: lib/claper_web/live/event_live/manage.ex:961 #, elixir-autogen, elixir-format msgid "No" msgstr "" -#: lib/claper_web/live/event_live/manage.ex:886 +#: lib/claper_web/live/event_live/manage.ex:961 #, elixir-autogen, elixir-format msgid "Yes" msgstr "" @@ -2415,7 +2415,7 @@ msgstr "" msgid "Audience Responses" msgstr "" -#: lib/claper_web/live/event_live/manage_slide_sidebar_component.ex:34 +#: lib/claper_web/live/event_live/manage_slide_sidebar_component.ex:45 #, elixir-autogen, elixir-format msgid "Content" msgstr "" @@ -2520,7 +2520,7 @@ msgstr "" msgid "No settings available for this interaction" msgstr "" -#: lib/claper_web/live/event_live/manage_slide_preview_component.ex:107 +#: lib/claper_web/live/event_live/manage_slide_preview_component.ex:131 #, elixir-autogen, elixir-format msgid "No slide available" msgstr "" @@ -2654,10 +2654,10 @@ msgstr "" msgid "Resource Type" msgstr "" -#: lib/claper_web/live/event_live/manage.ex:894 -#: lib/claper_web/live/event_live/manage.ex:937 -#: lib/claper_web/live/event_live/manage.ex:953 -#: lib/claper_web/live/event_live/manage.ex:995 +#: lib/claper_web/live/event_live/manage.ex:969 +#: lib/claper_web/live/event_live/manage.ex:1012 +#: lib/claper_web/live/event_live/manage.ex:1028 +#: lib/claper_web/live/event_live/manage.ex:1070 #, elixir-autogen, elixir-format msgid "Resource not found" msgstr "" @@ -2889,3 +2889,57 @@ msgstr "" #, elixir-autogen, elixir-format msgid "Sign in to manage your presentations." msgstr "" + +#: lib/claper_web/live/event_live/manage.ex:336 +#, elixir-autogen, elixir-format +msgid "Could not regenerate thumbnails" +msgstr "" + +#: lib/claper_web/live/event_live/manage.ex:403 +#, elixir-autogen, elixir-format +msgid "Could not start thumbnail regeneration" +msgstr "" + +#: lib/claper_web/live/event_live/manage_slide_preview_component.ex:64 +#: lib/claper_web/live/event_live/manage_slide_sidebar_component.ex:52 +#, elixir-autogen, elixir-format +msgid "No thumbnails are available" +msgstr "" + +#: lib/claper_web/live/event_live/manage_slide_preview_component.ex:72 +#: lib/claper_web/live/event_live/manage_slide_sidebar_component.ex:59 +#, elixir-autogen, elixir-format +msgid "No thumbnails are available. Regenerate them?" +msgstr "" + +#: lib/claper_web/live/event_live/manage_slide_preview_component.ex:66 +#, elixir-autogen, elixir-format +msgid "Regenerate them to restore the presentation preview sidebar." +msgstr "" + +#: lib/claper_web/live/event_live/manage_slide_sidebar_component.ex:54 +#, elixir-autogen, elixir-format +msgid "Regenerate them to restore the slide sidebar preview." +msgstr "" + +#: lib/claper_web/live/event_live/manage_slide_preview_component.ex:78 +#: lib/claper_web/live/event_live/manage_slide_sidebar_component.ex:65 +#, elixir-autogen, elixir-format +msgid "Regenerate thumbnails" +msgstr "" + +#: lib/claper_web/live/event_live/manage_slide_preview_component.ex:77 +#: lib/claper_web/live/event_live/manage_slide_sidebar_component.ex:64 +#, elixir-autogen, elixir-format +msgid "Regenerating..." +msgstr "" + +#: lib/claper_web/live/event_live/manage.ex:400 +#, elixir-autogen, elixir-format +msgid "Thumbnail regeneration started" +msgstr "" + +#: lib/claper_web/live/event_live/manage.ex:325 +#, elixir-autogen, elixir-format +msgid "Thumbnails regenerated successfully" +msgstr "" diff --git a/priv/gettext/en/LC_MESSAGES/default.po b/priv/gettext/en/LC_MESSAGES/default.po index d1fd570..2ac2b29 100644 --- a/priv/gettext/en/LC_MESSAGES/default.po +++ b/priv/gettext/en/LC_MESSAGES/default.po @@ -16,7 +16,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:914 +#: lib/claper_web/live/event_live/manage.ex:989 #: 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 @@ -685,7 +685,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:913 +#: lib/claper_web/live/event_live/manage.ex:988 #, elixir-autogen, elixir-format msgid "Name" msgstr "" @@ -1061,7 +1061,7 @@ msgstr "" msgid "Create your next presentation with" msgstr "" -#: lib/claper_web/live/event_live/manage.ex:23 +#: lib/claper_web/live/event_live/manage.ex:25 #: lib/claper_web/live/event_live/presenter.ex:26 #: lib/claper_web/live/event_live/show.ex:38 #, elixir-autogen, elixir-format @@ -1326,12 +1326,12 @@ msgstr "" msgid "Try logging in again" msgstr "" -#: lib/claper_web/live/event_live/manage.ex:886 +#: lib/claper_web/live/event_live/manage.ex:961 #, elixir-autogen, elixir-format msgid "No" msgstr "" -#: lib/claper_web/live/event_live/manage.ex:886 +#: lib/claper_web/live/event_live/manage.ex:961 #, elixir-autogen, elixir-format msgid "Yes" msgstr "" @@ -2413,7 +2413,7 @@ msgstr "" msgid "Audience Responses" msgstr "" -#: lib/claper_web/live/event_live/manage_slide_sidebar_component.ex:34 +#: lib/claper_web/live/event_live/manage_slide_sidebar_component.ex:45 #, elixir-autogen, elixir-format msgid "Content" msgstr "" @@ -2518,7 +2518,7 @@ msgstr "" msgid "No settings available for this interaction" msgstr "" -#: lib/claper_web/live/event_live/manage_slide_preview_component.ex:107 +#: lib/claper_web/live/event_live/manage_slide_preview_component.ex:131 #, elixir-autogen, elixir-format msgid "No slide available" msgstr "" @@ -2652,10 +2652,10 @@ msgstr "" msgid "Resource Type" msgstr "" -#: lib/claper_web/live/event_live/manage.ex:894 -#: lib/claper_web/live/event_live/manage.ex:937 -#: lib/claper_web/live/event_live/manage.ex:953 -#: lib/claper_web/live/event_live/manage.ex:995 +#: lib/claper_web/live/event_live/manage.ex:969 +#: lib/claper_web/live/event_live/manage.ex:1012 +#: lib/claper_web/live/event_live/manage.ex:1028 +#: lib/claper_web/live/event_live/manage.ex:1070 #, elixir-autogen, elixir-format msgid "Resource not found" msgstr "" @@ -2887,3 +2887,57 @@ msgstr "" #, elixir-autogen, elixir-format msgid "Sign in to manage your presentations." msgstr "" + +#: lib/claper_web/live/event_live/manage.ex:336 +#, elixir-autogen, elixir-format +msgid "Could not regenerate thumbnails" +msgstr "" + +#: lib/claper_web/live/event_live/manage.ex:403 +#, elixir-autogen, elixir-format +msgid "Could not start thumbnail regeneration" +msgstr "" + +#: lib/claper_web/live/event_live/manage_slide_preview_component.ex:64 +#: lib/claper_web/live/event_live/manage_slide_sidebar_component.ex:52 +#, elixir-autogen, elixir-format +msgid "No thumbnails are available" +msgstr "" + +#: lib/claper_web/live/event_live/manage_slide_preview_component.ex:72 +#: lib/claper_web/live/event_live/manage_slide_sidebar_component.ex:59 +#, elixir-autogen, elixir-format +msgid "No thumbnails are available. Regenerate them?" +msgstr "" + +#: lib/claper_web/live/event_live/manage_slide_preview_component.ex:66 +#, elixir-autogen, elixir-format +msgid "Regenerate them to restore the presentation preview sidebar." +msgstr "" + +#: lib/claper_web/live/event_live/manage_slide_sidebar_component.ex:54 +#, elixir-autogen, elixir-format +msgid "Regenerate them to restore the slide sidebar preview." +msgstr "" + +#: lib/claper_web/live/event_live/manage_slide_preview_component.ex:78 +#: lib/claper_web/live/event_live/manage_slide_sidebar_component.ex:65 +#, elixir-autogen, elixir-format +msgid "Regenerate thumbnails" +msgstr "" + +#: lib/claper_web/live/event_live/manage_slide_preview_component.ex:77 +#: lib/claper_web/live/event_live/manage_slide_sidebar_component.ex:64 +#, elixir-autogen, elixir-format +msgid "Regenerating..." +msgstr "" + +#: lib/claper_web/live/event_live/manage.ex:400 +#, elixir-autogen, elixir-format +msgid "Thumbnail regeneration started" +msgstr "" + +#: lib/claper_web/live/event_live/manage.ex:325 +#, elixir-autogen, elixir-format +msgid "Thumbnails regenerated successfully" +msgstr "" diff --git a/priv/gettext/es/LC_MESSAGES/default.po b/priv/gettext/es/LC_MESSAGES/default.po index a85cae8..5a2c6e2 100644 --- a/priv/gettext/es/LC_MESSAGES/default.po +++ b/priv/gettext/es/LC_MESSAGES/default.po @@ -16,7 +16,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:914 +#: lib/claper_web/live/event_live/manage.ex:989 #: 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 @@ -685,7 +685,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:913 +#: lib/claper_web/live/event_live/manage.ex:988 #, elixir-autogen, elixir-format msgid "Name" msgstr "Nombre" @@ -1061,7 +1061,7 @@ msgstr "¿Cuándo empezará tu evento?" msgid "Create your next presentation with" msgstr "Crea tu siguiente presentación con" -#: lib/claper_web/live/event_live/manage.ex:23 +#: lib/claper_web/live/event_live/manage.ex:25 #: lib/claper_web/live/event_live/presenter.ex:26 #: lib/claper_web/live/event_live/show.ex:38 #, elixir-autogen, elixir-format @@ -1326,12 +1326,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:886 +#: lib/claper_web/live/event_live/manage.ex:961 #, elixir-autogen, elixir-format msgid "No" msgstr "No" -#: lib/claper_web/live/event_live/manage.ex:886 +#: lib/claper_web/live/event_live/manage.ex:961 #, elixir-autogen, elixir-format msgid "Yes" msgstr "Sí" @@ -2413,7 +2413,7 @@ msgstr "Asistentes" msgid "Audience Responses" msgstr "Respuestas de la audiencia" -#: lib/claper_web/live/event_live/manage_slide_sidebar_component.ex:34 +#: lib/claper_web/live/event_live/manage_slide_sidebar_component.ex:45 #, elixir-autogen, elixir-format msgid "Content" msgstr "Contenido" @@ -2518,7 +2518,7 @@ msgstr "Sin interacciones en esta diapositiva" msgid "No settings available for this interaction" msgstr "Sin ajustes disponibles para esta interacción" -#: lib/claper_web/live/event_live/manage_slide_preview_component.ex:107 +#: lib/claper_web/live/event_live/manage_slide_preview_component.ex:131 #, elixir-autogen, elixir-format msgid "No slide available" msgstr "Sin diapositiva disponible" @@ -2652,10 +2652,10 @@ msgstr "" msgid "Resource Type" msgstr "Tipo de Respuesta" -#: lib/claper_web/live/event_live/manage.ex:894 -#: lib/claper_web/live/event_live/manage.ex:937 -#: lib/claper_web/live/event_live/manage.ex:953 -#: lib/claper_web/live/event_live/manage.ex:995 +#: lib/claper_web/live/event_live/manage.ex:969 +#: lib/claper_web/live/event_live/manage.ex:1012 +#: lib/claper_web/live/event_live/manage.ex:1028 +#: lib/claper_web/live/event_live/manage.ex:1070 #, elixir-autogen, elixir-format msgid "Resource not found" msgstr "" @@ -2887,3 +2887,57 @@ msgstr "" #, elixir-autogen, elixir-format msgid "Sign in to manage your presentations." msgstr "" + +#: lib/claper_web/live/event_live/manage.ex:336 +#, elixir-autogen, elixir-format +msgid "Could not regenerate thumbnails" +msgstr "" + +#: lib/claper_web/live/event_live/manage.ex:403 +#, elixir-autogen, elixir-format +msgid "Could not start thumbnail regeneration" +msgstr "" + +#: lib/claper_web/live/event_live/manage_slide_preview_component.ex:64 +#: lib/claper_web/live/event_live/manage_slide_sidebar_component.ex:52 +#, elixir-autogen, elixir-format +msgid "No thumbnails are available" +msgstr "" + +#: lib/claper_web/live/event_live/manage_slide_preview_component.ex:72 +#: lib/claper_web/live/event_live/manage_slide_sidebar_component.ex:59 +#, elixir-autogen, elixir-format +msgid "No thumbnails are available. Regenerate them?" +msgstr "" + +#: lib/claper_web/live/event_live/manage_slide_preview_component.ex:66 +#, elixir-autogen, elixir-format +msgid "Regenerate them to restore the presentation preview sidebar." +msgstr "" + +#: lib/claper_web/live/event_live/manage_slide_sidebar_component.ex:54 +#, elixir-autogen, elixir-format +msgid "Regenerate them to restore the slide sidebar preview." +msgstr "" + +#: lib/claper_web/live/event_live/manage_slide_preview_component.ex:78 +#: lib/claper_web/live/event_live/manage_slide_sidebar_component.ex:65 +#, elixir-autogen, elixir-format +msgid "Regenerate thumbnails" +msgstr "" + +#: lib/claper_web/live/event_live/manage_slide_preview_component.ex:77 +#: lib/claper_web/live/event_live/manage_slide_sidebar_component.ex:64 +#, elixir-autogen, elixir-format +msgid "Regenerating..." +msgstr "" + +#: lib/claper_web/live/event_live/manage.ex:400 +#, elixir-autogen, elixir-format +msgid "Thumbnail regeneration started" +msgstr "" + +#: lib/claper_web/live/event_live/manage.ex:325 +#, elixir-autogen, elixir-format +msgid "Thumbnails regenerated successfully" +msgstr "" diff --git a/priv/gettext/fr/LC_MESSAGES/default.po b/priv/gettext/fr/LC_MESSAGES/default.po index bf4325a..44dc272 100644 --- a/priv/gettext/fr/LC_MESSAGES/default.po +++ b/priv/gettext/fr/LC_MESSAGES/default.po @@ -16,7 +16,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:914 +#: lib/claper_web/live/event_live/manage.ex:989 #: 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 @@ -689,7 +689,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:913 +#: lib/claper_web/live/event_live/manage.ex:988 #, elixir-autogen, elixir-format msgid "Name" msgstr "Nom" @@ -1065,7 +1065,7 @@ msgstr "Quand votre événement commencera-t-il ?" msgid "Create your next presentation with" msgstr "Créez votre prochaine présentation avec" -#: lib/claper_web/live/event_live/manage.ex:23 +#: lib/claper_web/live/event_live/manage.ex:25 #: lib/claper_web/live/event_live/presenter.ex:26 #: lib/claper_web/live/event_live/show.ex:38 #, elixir-autogen, elixir-format @@ -1330,12 +1330,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:886 +#: lib/claper_web/live/event_live/manage.ex:961 #, elixir-autogen, elixir-format msgid "No" msgstr "Non" -#: lib/claper_web/live/event_live/manage.ex:886 +#: lib/claper_web/live/event_live/manage.ex:961 #, elixir-autogen, elixir-format msgid "Yes" msgstr "Oui" @@ -2417,7 +2417,7 @@ msgstr "Participants" msgid "Audience Responses" msgstr "Réponses de l'audience" -#: lib/claper_web/live/event_live/manage_slide_sidebar_component.ex:34 +#: lib/claper_web/live/event_live/manage_slide_sidebar_component.ex:45 #, elixir-autogen, elixir-format msgid "Content" msgstr "Contenu" @@ -2522,7 +2522,7 @@ msgstr "Aucune interaction sur cette diapositive" msgid "No settings available for this interaction" msgstr "Aucun paramètre disponible pour cette interaction" -#: lib/claper_web/live/event_live/manage_slide_preview_component.ex:107 +#: lib/claper_web/live/event_live/manage_slide_preview_component.ex:131 #, elixir-autogen, elixir-format msgid "No slide available" msgstr "Aucune diapositive disponible" @@ -2656,10 +2656,10 @@ msgstr "" msgid "Resource Type" msgstr "Type de réponse" -#: lib/claper_web/live/event_live/manage.ex:894 -#: lib/claper_web/live/event_live/manage.ex:937 -#: lib/claper_web/live/event_live/manage.ex:953 -#: lib/claper_web/live/event_live/manage.ex:995 +#: lib/claper_web/live/event_live/manage.ex:969 +#: lib/claper_web/live/event_live/manage.ex:1012 +#: lib/claper_web/live/event_live/manage.ex:1028 +#: lib/claper_web/live/event_live/manage.ex:1070 #, elixir-autogen, elixir-format msgid "Resource not found" msgstr "" @@ -2891,3 +2891,57 @@ msgstr "" #, elixir-autogen, elixir-format msgid "Sign in to manage your presentations." msgstr "" + +#: lib/claper_web/live/event_live/manage.ex:336 +#, elixir-autogen, elixir-format +msgid "Could not regenerate thumbnails" +msgstr "" + +#: lib/claper_web/live/event_live/manage.ex:403 +#, elixir-autogen, elixir-format +msgid "Could not start thumbnail regeneration" +msgstr "" + +#: lib/claper_web/live/event_live/manage_slide_preview_component.ex:64 +#: lib/claper_web/live/event_live/manage_slide_sidebar_component.ex:52 +#, elixir-autogen, elixir-format +msgid "No thumbnails are available" +msgstr "" + +#: lib/claper_web/live/event_live/manage_slide_preview_component.ex:72 +#: lib/claper_web/live/event_live/manage_slide_sidebar_component.ex:59 +#, elixir-autogen, elixir-format +msgid "No thumbnails are available. Regenerate them?" +msgstr "" + +#: lib/claper_web/live/event_live/manage_slide_preview_component.ex:66 +#, elixir-autogen, elixir-format +msgid "Regenerate them to restore the presentation preview sidebar." +msgstr "" + +#: lib/claper_web/live/event_live/manage_slide_sidebar_component.ex:54 +#, elixir-autogen, elixir-format +msgid "Regenerate them to restore the slide sidebar preview." +msgstr "" + +#: lib/claper_web/live/event_live/manage_slide_preview_component.ex:78 +#: lib/claper_web/live/event_live/manage_slide_sidebar_component.ex:65 +#, elixir-autogen, elixir-format +msgid "Regenerate thumbnails" +msgstr "" + +#: lib/claper_web/live/event_live/manage_slide_preview_component.ex:77 +#: lib/claper_web/live/event_live/manage_slide_sidebar_component.ex:64 +#, elixir-autogen, elixir-format +msgid "Regenerating..." +msgstr "" + +#: lib/claper_web/live/event_live/manage.ex:400 +#, elixir-autogen, elixir-format +msgid "Thumbnail regeneration started" +msgstr "" + +#: lib/claper_web/live/event_live/manage.ex:325 +#, elixir-autogen, elixir-format +msgid "Thumbnails regenerated successfully" +msgstr "" diff --git a/priv/gettext/hu/LC_MESSAGES/default.po b/priv/gettext/hu/LC_MESSAGES/default.po index 80c5307..bac46c0 100644 --- a/priv/gettext/hu/LC_MESSAGES/default.po +++ b/priv/gettext/hu/LC_MESSAGES/default.po @@ -16,7 +16,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:914 +#: lib/claper_web/live/event_live/manage.ex:989 #: 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 @@ -685,7 +685,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:913 +#: lib/claper_web/live/event_live/manage.ex:988 #, elixir-autogen, elixir-format msgid "Name" msgstr "Név" @@ -1061,7 +1061,7 @@ msgstr "Mikor kezdődik az esemény?" msgid "Create your next presentation with" msgstr "Hozza létre következő prezentációját ezzel:" -#: lib/claper_web/live/event_live/manage.ex:23 +#: lib/claper_web/live/event_live/manage.ex:25 #: lib/claper_web/live/event_live/presenter.ex:26 #: lib/claper_web/live/event_live/show.ex:38 #, elixir-autogen, elixir-format @@ -1326,12 +1326,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:886 +#: lib/claper_web/live/event_live/manage.ex:961 #, elixir-autogen, elixir-format msgid "No" msgstr "Nem" -#: lib/claper_web/live/event_live/manage.ex:886 +#: lib/claper_web/live/event_live/manage.ex:961 #, elixir-autogen, elixir-format msgid "Yes" msgstr "Igen" @@ -2413,7 +2413,7 @@ msgstr "Résztvevők" msgid "Audience Responses" msgstr "Közönség válaszai" -#: lib/claper_web/live/event_live/manage_slide_sidebar_component.ex:34 +#: lib/claper_web/live/event_live/manage_slide_sidebar_component.ex:45 #, elixir-autogen, elixir-format msgid "Content" msgstr "Tartalom" @@ -2518,7 +2518,7 @@ msgstr "Nincs interakció ezen a dián" msgid "No settings available for this interaction" msgstr "Nincsenek elérhető beállítások ehhez az interakcióhoz" -#: lib/claper_web/live/event_live/manage_slide_preview_component.ex:107 +#: lib/claper_web/live/event_live/manage_slide_preview_component.ex:131 #, elixir-autogen, elixir-format msgid "No slide available" msgstr "Nincs elérhető dia" @@ -2652,10 +2652,10 @@ msgstr "" msgid "Resource Type" msgstr "Válasz típus" -#: lib/claper_web/live/event_live/manage.ex:894 -#: lib/claper_web/live/event_live/manage.ex:937 -#: lib/claper_web/live/event_live/manage.ex:953 -#: lib/claper_web/live/event_live/manage.ex:995 +#: lib/claper_web/live/event_live/manage.ex:969 +#: lib/claper_web/live/event_live/manage.ex:1012 +#: lib/claper_web/live/event_live/manage.ex:1028 +#: lib/claper_web/live/event_live/manage.ex:1070 #, elixir-autogen, elixir-format msgid "Resource not found" msgstr "" @@ -2887,3 +2887,57 @@ msgstr "" #, elixir-autogen, elixir-format msgid "Sign in to manage your presentations." msgstr "" + +#: lib/claper_web/live/event_live/manage.ex:336 +#, elixir-autogen, elixir-format +msgid "Could not regenerate thumbnails" +msgstr "" + +#: lib/claper_web/live/event_live/manage.ex:403 +#, elixir-autogen, elixir-format +msgid "Could not start thumbnail regeneration" +msgstr "" + +#: lib/claper_web/live/event_live/manage_slide_preview_component.ex:64 +#: lib/claper_web/live/event_live/manage_slide_sidebar_component.ex:52 +#, elixir-autogen, elixir-format +msgid "No thumbnails are available" +msgstr "" + +#: lib/claper_web/live/event_live/manage_slide_preview_component.ex:72 +#: lib/claper_web/live/event_live/manage_slide_sidebar_component.ex:59 +#, elixir-autogen, elixir-format +msgid "No thumbnails are available. Regenerate them?" +msgstr "" + +#: lib/claper_web/live/event_live/manage_slide_preview_component.ex:66 +#, elixir-autogen, elixir-format +msgid "Regenerate them to restore the presentation preview sidebar." +msgstr "" + +#: lib/claper_web/live/event_live/manage_slide_sidebar_component.ex:54 +#, elixir-autogen, elixir-format +msgid "Regenerate them to restore the slide sidebar preview." +msgstr "" + +#: lib/claper_web/live/event_live/manage_slide_preview_component.ex:78 +#: lib/claper_web/live/event_live/manage_slide_sidebar_component.ex:65 +#, elixir-autogen, elixir-format +msgid "Regenerate thumbnails" +msgstr "" + +#: lib/claper_web/live/event_live/manage_slide_preview_component.ex:77 +#: lib/claper_web/live/event_live/manage_slide_sidebar_component.ex:64 +#, elixir-autogen, elixir-format +msgid "Regenerating..." +msgstr "" + +#: lib/claper_web/live/event_live/manage.ex:400 +#, elixir-autogen, elixir-format +msgid "Thumbnail regeneration started" +msgstr "" + +#: lib/claper_web/live/event_live/manage.ex:325 +#, elixir-autogen, elixir-format +msgid "Thumbnails regenerated successfully" +msgstr "" diff --git a/priv/gettext/it/LC_MESSAGES/default.po b/priv/gettext/it/LC_MESSAGES/default.po index 9fdce14..cf5cab1 100644 --- a/priv/gettext/it/LC_MESSAGES/default.po +++ b/priv/gettext/it/LC_MESSAGES/default.po @@ -17,7 +17,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:914 +#: lib/claper_web/live/event_live/manage.ex:989 #: 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 @@ -686,7 +686,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:913 +#: lib/claper_web/live/event_live/manage.ex:988 #, elixir-autogen, elixir-format msgid "Name" msgstr "Nome" @@ -1062,7 +1062,7 @@ msgstr "Quando inizierà il tuo evento?" msgid "Create your next presentation with" msgstr "Crea la tua prossima presentazione con" -#: lib/claper_web/live/event_live/manage.ex:23 +#: lib/claper_web/live/event_live/manage.ex:25 #: lib/claper_web/live/event_live/presenter.ex:26 #: lib/claper_web/live/event_live/show.ex:38 #, elixir-autogen, elixir-format @@ -1327,12 +1327,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:886 +#: lib/claper_web/live/event_live/manage.ex:961 #, elixir-autogen, elixir-format msgid "No" msgstr "No" -#: lib/claper_web/live/event_live/manage.ex:886 +#: lib/claper_web/live/event_live/manage.ex:961 #, elixir-autogen, elixir-format msgid "Yes" msgstr "Sì" @@ -2414,7 +2414,7 @@ msgstr "Partecipanti" msgid "Audience Responses" msgstr "Risposte del pubblico" -#: lib/claper_web/live/event_live/manage_slide_sidebar_component.ex:34 +#: lib/claper_web/live/event_live/manage_slide_sidebar_component.ex:45 #, elixir-autogen, elixir-format msgid "Content" msgstr "Contenuto" @@ -2519,7 +2519,7 @@ msgstr "Nessuna interazione su questa diapositiva" msgid "No settings available for this interaction" msgstr "Nessuna impostazione disponibile per questa interazione" -#: lib/claper_web/live/event_live/manage_slide_preview_component.ex:107 +#: lib/claper_web/live/event_live/manage_slide_preview_component.ex:131 #, elixir-autogen, elixir-format msgid "No slide available" msgstr "Nessuna diapositiva disponibile" @@ -2653,10 +2653,10 @@ msgstr "" msgid "Resource Type" msgstr "Tipo di risposta" -#: lib/claper_web/live/event_live/manage.ex:894 -#: lib/claper_web/live/event_live/manage.ex:937 -#: lib/claper_web/live/event_live/manage.ex:953 -#: lib/claper_web/live/event_live/manage.ex:995 +#: lib/claper_web/live/event_live/manage.ex:969 +#: lib/claper_web/live/event_live/manage.ex:1012 +#: lib/claper_web/live/event_live/manage.ex:1028 +#: lib/claper_web/live/event_live/manage.ex:1070 #, elixir-autogen, elixir-format msgid "Resource not found" msgstr "" @@ -2888,3 +2888,57 @@ msgstr "" #, elixir-autogen, elixir-format msgid "Sign in to manage your presentations." msgstr "" + +#: lib/claper_web/live/event_live/manage.ex:336 +#, elixir-autogen, elixir-format +msgid "Could not regenerate thumbnails" +msgstr "" + +#: lib/claper_web/live/event_live/manage.ex:403 +#, elixir-autogen, elixir-format +msgid "Could not start thumbnail regeneration" +msgstr "" + +#: lib/claper_web/live/event_live/manage_slide_preview_component.ex:64 +#: lib/claper_web/live/event_live/manage_slide_sidebar_component.ex:52 +#, elixir-autogen, elixir-format +msgid "No thumbnails are available" +msgstr "" + +#: lib/claper_web/live/event_live/manage_slide_preview_component.ex:72 +#: lib/claper_web/live/event_live/manage_slide_sidebar_component.ex:59 +#, elixir-autogen, elixir-format +msgid "No thumbnails are available. Regenerate them?" +msgstr "" + +#: lib/claper_web/live/event_live/manage_slide_preview_component.ex:66 +#, elixir-autogen, elixir-format +msgid "Regenerate them to restore the presentation preview sidebar." +msgstr "" + +#: lib/claper_web/live/event_live/manage_slide_sidebar_component.ex:54 +#, elixir-autogen, elixir-format +msgid "Regenerate them to restore the slide sidebar preview." +msgstr "" + +#: lib/claper_web/live/event_live/manage_slide_preview_component.ex:78 +#: lib/claper_web/live/event_live/manage_slide_sidebar_component.ex:65 +#, elixir-autogen, elixir-format +msgid "Regenerate thumbnails" +msgstr "" + +#: lib/claper_web/live/event_live/manage_slide_preview_component.ex:77 +#: lib/claper_web/live/event_live/manage_slide_sidebar_component.ex:64 +#, elixir-autogen, elixir-format +msgid "Regenerating..." +msgstr "" + +#: lib/claper_web/live/event_live/manage.ex:400 +#, elixir-autogen, elixir-format +msgid "Thumbnail regeneration started" +msgstr "" + +#: lib/claper_web/live/event_live/manage.ex:325 +#, elixir-autogen, elixir-format +msgid "Thumbnails regenerated successfully" +msgstr "" diff --git a/priv/gettext/lv/LC_MESSAGES/default.po b/priv/gettext/lv/LC_MESSAGES/default.po index c179c00..b3514b2 100644 --- a/priv/gettext/lv/LC_MESSAGES/default.po +++ b/priv/gettext/lv/LC_MESSAGES/default.po @@ -16,7 +16,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:914 +#: lib/claper_web/live/event_live/manage.ex:989 #: 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 @@ -689,7 +689,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:913 +#: lib/claper_web/live/event_live/manage.ex:988 #, elixir-autogen, elixir-format msgid "Name" msgstr "Nosaukums" @@ -1065,7 +1065,7 @@ msgstr "Kad sāksies jūsu pasākums?" msgid "Create your next presentation with" msgstr "Izveidojiet nākamo prezentāciju, izmantojot" -#: lib/claper_web/live/event_live/manage.ex:23 +#: lib/claper_web/live/event_live/manage.ex:25 #: lib/claper_web/live/event_live/presenter.ex:26 #: lib/claper_web/live/event_live/show.ex:38 #, elixir-autogen, elixir-format @@ -1330,12 +1330,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:886 +#: lib/claper_web/live/event_live/manage.ex:961 #, elixir-autogen, elixir-format msgid "No" msgstr "Nē" -#: lib/claper_web/live/event_live/manage.ex:886 +#: lib/claper_web/live/event_live/manage.ex:961 #, elixir-autogen, elixir-format msgid "Yes" msgstr "Jā" @@ -2417,7 +2417,7 @@ msgstr "Dalībnieki" msgid "Audience Responses" msgstr "Auditorijas atbildes" -#: lib/claper_web/live/event_live/manage_slide_sidebar_component.ex:34 +#: lib/claper_web/live/event_live/manage_slide_sidebar_component.ex:45 #, elixir-autogen, elixir-format msgid "Content" msgstr "Saturs" @@ -2522,7 +2522,7 @@ msgstr "Nav mijiedarbību šajā slaidā" msgid "No settings available for this interaction" msgstr "Nav pieejamu iestatījumu šai mijiedarbībai" -#: lib/claper_web/live/event_live/manage_slide_preview_component.ex:107 +#: lib/claper_web/live/event_live/manage_slide_preview_component.ex:131 #, elixir-autogen, elixir-format msgid "No slide available" msgstr "Nav pieejamu slaidu" @@ -2656,10 +2656,10 @@ msgstr "" msgid "Resource Type" msgstr "Atbildes veids" -#: lib/claper_web/live/event_live/manage.ex:894 -#: lib/claper_web/live/event_live/manage.ex:937 -#: lib/claper_web/live/event_live/manage.ex:953 -#: lib/claper_web/live/event_live/manage.ex:995 +#: lib/claper_web/live/event_live/manage.ex:969 +#: lib/claper_web/live/event_live/manage.ex:1012 +#: lib/claper_web/live/event_live/manage.ex:1028 +#: lib/claper_web/live/event_live/manage.ex:1070 #, elixir-autogen, elixir-format msgid "Resource not found" msgstr "" @@ -2891,3 +2891,57 @@ msgstr "" #, elixir-autogen, elixir-format msgid "Sign in to manage your presentations." msgstr "" + +#: lib/claper_web/live/event_live/manage.ex:336 +#, elixir-autogen, elixir-format +msgid "Could not regenerate thumbnails" +msgstr "" + +#: lib/claper_web/live/event_live/manage.ex:403 +#, elixir-autogen, elixir-format +msgid "Could not start thumbnail regeneration" +msgstr "" + +#: lib/claper_web/live/event_live/manage_slide_preview_component.ex:64 +#: lib/claper_web/live/event_live/manage_slide_sidebar_component.ex:52 +#, elixir-autogen, elixir-format +msgid "No thumbnails are available" +msgstr "" + +#: lib/claper_web/live/event_live/manage_slide_preview_component.ex:72 +#: lib/claper_web/live/event_live/manage_slide_sidebar_component.ex:59 +#, elixir-autogen, elixir-format +msgid "No thumbnails are available. Regenerate them?" +msgstr "" + +#: lib/claper_web/live/event_live/manage_slide_preview_component.ex:66 +#, elixir-autogen, elixir-format +msgid "Regenerate them to restore the presentation preview sidebar." +msgstr "" + +#: lib/claper_web/live/event_live/manage_slide_sidebar_component.ex:54 +#, elixir-autogen, elixir-format +msgid "Regenerate them to restore the slide sidebar preview." +msgstr "" + +#: lib/claper_web/live/event_live/manage_slide_preview_component.ex:78 +#: lib/claper_web/live/event_live/manage_slide_sidebar_component.ex:65 +#, elixir-autogen, elixir-format +msgid "Regenerate thumbnails" +msgstr "" + +#: lib/claper_web/live/event_live/manage_slide_preview_component.ex:77 +#: lib/claper_web/live/event_live/manage_slide_sidebar_component.ex:64 +#, elixir-autogen, elixir-format +msgid "Regenerating..." +msgstr "" + +#: lib/claper_web/live/event_live/manage.ex:400 +#, elixir-autogen, elixir-format +msgid "Thumbnail regeneration started" +msgstr "" + +#: lib/claper_web/live/event_live/manage.ex:325 +#, elixir-autogen, elixir-format +msgid "Thumbnails regenerated successfully" +msgstr "" diff --git a/priv/gettext/nl/LC_MESSAGES/default.po b/priv/gettext/nl/LC_MESSAGES/default.po index 2931c8a..e4216f8 100644 --- a/priv/gettext/nl/LC_MESSAGES/default.po +++ b/priv/gettext/nl/LC_MESSAGES/default.po @@ -16,7 +16,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:914 +#: lib/claper_web/live/event_live/manage.ex:989 #: 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 @@ -685,7 +685,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:913 +#: lib/claper_web/live/event_live/manage.ex:988 #, elixir-autogen, elixir-format msgid "Name" msgstr "Naam" @@ -1061,7 +1061,7 @@ msgstr "Wanneer begint het evenement?" msgid "Create your next presentation with" msgstr "Maak je volgende presentatie met" -#: lib/claper_web/live/event_live/manage.ex:23 +#: lib/claper_web/live/event_live/manage.ex:25 #: lib/claper_web/live/event_live/presenter.ex:26 #: lib/claper_web/live/event_live/show.ex:38 #, elixir-autogen, elixir-format @@ -1326,12 +1326,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:886 +#: lib/claper_web/live/event_live/manage.ex:961 #, elixir-autogen, elixir-format msgid "No" msgstr "Nee" -#: lib/claper_web/live/event_live/manage.ex:886 +#: lib/claper_web/live/event_live/manage.ex:961 #, elixir-autogen, elixir-format msgid "Yes" msgstr "Ja" @@ -2413,7 +2413,7 @@ msgstr "Deelnemers" msgid "Audience Responses" msgstr "Reacties van het publiek" -#: lib/claper_web/live/event_live/manage_slide_sidebar_component.ex:34 +#: lib/claper_web/live/event_live/manage_slide_sidebar_component.ex:45 #, elixir-autogen, elixir-format msgid "Content" msgstr "Inhoud" @@ -2518,7 +2518,7 @@ msgstr "Geen interacties op deze dia" msgid "No settings available for this interaction" msgstr "Geen instellingen beschikbaar voor deze interactie" -#: lib/claper_web/live/event_live/manage_slide_preview_component.ex:107 +#: lib/claper_web/live/event_live/manage_slide_preview_component.ex:131 #, elixir-autogen, elixir-format msgid "No slide available" msgstr "Geen dia beschikbaar" @@ -2652,10 +2652,10 @@ msgstr "" msgid "Resource Type" msgstr "Reactietype" -#: lib/claper_web/live/event_live/manage.ex:894 -#: lib/claper_web/live/event_live/manage.ex:937 -#: lib/claper_web/live/event_live/manage.ex:953 -#: lib/claper_web/live/event_live/manage.ex:995 +#: lib/claper_web/live/event_live/manage.ex:969 +#: lib/claper_web/live/event_live/manage.ex:1012 +#: lib/claper_web/live/event_live/manage.ex:1028 +#: lib/claper_web/live/event_live/manage.ex:1070 #, elixir-autogen, elixir-format msgid "Resource not found" msgstr "" @@ -2887,3 +2887,57 @@ msgstr "" #, elixir-autogen, elixir-format msgid "Sign in to manage your presentations." msgstr "" + +#: lib/claper_web/live/event_live/manage.ex:336 +#, elixir-autogen, elixir-format +msgid "Could not regenerate thumbnails" +msgstr "" + +#: lib/claper_web/live/event_live/manage.ex:403 +#, elixir-autogen, elixir-format +msgid "Could not start thumbnail regeneration" +msgstr "" + +#: lib/claper_web/live/event_live/manage_slide_preview_component.ex:64 +#: lib/claper_web/live/event_live/manage_slide_sidebar_component.ex:52 +#, elixir-autogen, elixir-format +msgid "No thumbnails are available" +msgstr "" + +#: lib/claper_web/live/event_live/manage_slide_preview_component.ex:72 +#: lib/claper_web/live/event_live/manage_slide_sidebar_component.ex:59 +#, elixir-autogen, elixir-format +msgid "No thumbnails are available. Regenerate them?" +msgstr "" + +#: lib/claper_web/live/event_live/manage_slide_preview_component.ex:66 +#, elixir-autogen, elixir-format +msgid "Regenerate them to restore the presentation preview sidebar." +msgstr "" + +#: lib/claper_web/live/event_live/manage_slide_sidebar_component.ex:54 +#, elixir-autogen, elixir-format +msgid "Regenerate them to restore the slide sidebar preview." +msgstr "" + +#: lib/claper_web/live/event_live/manage_slide_preview_component.ex:78 +#: lib/claper_web/live/event_live/manage_slide_sidebar_component.ex:65 +#, elixir-autogen, elixir-format +msgid "Regenerate thumbnails" +msgstr "" + +#: lib/claper_web/live/event_live/manage_slide_preview_component.ex:77 +#: lib/claper_web/live/event_live/manage_slide_sidebar_component.ex:64 +#, elixir-autogen, elixir-format +msgid "Regenerating..." +msgstr "" + +#: lib/claper_web/live/event_live/manage.ex:400 +#, elixir-autogen, elixir-format +msgid "Thumbnail regeneration started" +msgstr "" + +#: lib/claper_web/live/event_live/manage.ex:325 +#, elixir-autogen, elixir-format +msgid "Thumbnails regenerated successfully" +msgstr "" diff --git a/test/claper/presentations_test.exs b/test/claper/presentations_test.exs index 9610521..d305bd1 100644 --- a/test/claper/presentations_test.exs +++ b/test/claper/presentations_test.exs @@ -40,6 +40,28 @@ defmodule Claper.PresentationsTest do assert presentation_file.hash == "4567" assert presentation_file.length == 43 end + + test "missing_slide_thumbnails?/1 returns true when thumbnails are missing" do + storage_dir = unique_storage_dir() + put_local_storage_config(storage_dir) + + presentation_file = presentation_file_fixture(%{hash: "missing-thumbs", length: 2}) + + assert Presentations.missing_slide_thumbnails?(presentation_file) + end + + test "missing_slide_thumbnails?/1 returns false when thumbnails exist" do + storage_dir = unique_storage_dir() + put_local_storage_config(storage_dir) + + presentation_file = presentation_file_fixture(%{hash: "existing-thumbs", length: 2}) + + thumbs_dir = Path.join([storage_dir, "uploads", presentation_file.hash, "thumbs"]) + File.mkdir_p!(thumbs_dir) + File.write!(Path.join(thumbs_dir, "1.jpg"), "thumb") + + refute Presentations.missing_slide_thumbnails?(presentation_file) + end end describe "presentation_states" do @@ -61,4 +83,27 @@ defmodule Claper.PresentationsTest do Presentations.update_presentation_state(presentation_state, update_attrs) end end + + defp put_local_storage_config(storage_dir) do + previous_storage_dir = Application.get_env(:claper, :storage_dir) + previous_presentations = Application.get_env(:claper, :presentations) + + Application.put_env(:claper, :storage_dir, storage_dir) + + Application.put_env( + :claper, + :presentations, + Keyword.merge(previous_presentations || [], storage: "local") + ) + + on_exit(fn -> + File.rm_rf!(storage_dir) + Application.put_env(:claper, :storage_dir, previous_storage_dir) + Application.put_env(:claper, :presentations, previous_presentations) + end) + end + + defp unique_storage_dir do + Path.join(System.tmp_dir!(), "claper-test-#{System.unique_integer([:positive])}") + end end diff --git a/test/claper_web/live/event_live_test.exs b/test/claper_web/live/event_live_test.exs index c47b533..e067c5d 100644 --- a/test/claper_web/live/event_live_test.exs +++ b/test/claper_web/live/event_live_test.exs @@ -62,6 +62,28 @@ defmodule ClaperWeb.EventLiveTest do end end + describe "Manage" do + setup [:register_and_log_in_user, :create_event] + + test "prompts to regenerate missing thumbnails and starts regeneration", %{ + conn: conn, + presentation_file: presentation_file + } do + Oban.Testing.with_testing_mode(:manual, fn -> + {:ok, manage_live, html} = live(conn, ~p"/e/#{presentation_file.event.code}/manage") + + assert html =~ "No thumbnails are available" + assert html =~ "Regenerate thumbnails" + + manage_live + |> element(~s{button[phx-click="regenerate-thumbnails"]}) + |> render_click() + + assert render(manage_live) =~ "Thumbnail regeneration started" + end) + end + end + describe "Join" do test "renders the join page", %{conn: conn} do {:ok, join_live, html} = live(conn, ~p"/")