diff --git a/CHANGELOG.md b/CHANGELOG.md index 85b78f5..db83274 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,13 @@ +## 1.5.0 + +- Add a nickname feature and toggle button to avoid anonymous messages +- Add url information on the instruction page with QR Code +- Add German locale (thanks to @Dynnammo) +- Update Moment Timezone, Moment to patch security vulnerabilities +- Update TailwindCSS 2 to 3 +- Fix layout on the moderator page for messages list +- Fix event link color being white + ## v1.4.2 - Update Moment Timezone, Moment to patch security vulnerabilities diff --git a/assets/js/app.js b/assets/js/app.js index 7b638a7..468c39d 100644 --- a/assets/js/app.js +++ b/assets/js/app.js @@ -125,6 +125,40 @@ Hooks.ScrollIntoDiv = { } } +Hooks.NicknamePicker = { + mounted() { + let currentNickname = localStorage.getItem("nickname") || "" + if (currentNickname.length > 0) { + this.pushEvent("set-nickname", {nickname: currentNickname}) + } + + this.el.addEventListener("click", (e) => this.clicked(e)) + }, + destroy() { + this.el.removeEventListener("click", (e) => this.clicked(e)) + }, + clicked(e) { + let nickname = prompt(this.el.dataset.prompt, localStorage.getItem("nickname") || "") + + if (nickname) { + localStorage.setItem("nickname", nickname) + this.pushEvent("set-nickname", {nickname: nickname}) + } + }, +} + +Hooks.EmptyNickname = { + mounted() { + this.el.addEventListener("click", (e) => this.clicked(e)) + }, + destroy() { + this.el.removeEventListener("click", (e) => this.clicked(e)) + }, + clicked(e) { + localStorage.removeItem("nickname") + }, +} + Hooks.PostForm = { onPress(e, submitBtn, TA) { if (e.key == "Enter" && !e.shiftKey) { @@ -146,11 +180,19 @@ Hooks.PostForm = { TA.value = "" }, mounted() { - const submitBtn = document.getElementById("submitBtn") - const TA = document.getElementById("postFormTA") - if (submitBtn && TA) { - submitBtn.addEventListener("click", (e) => this.onSubmit(e, TA)) - TA.addEventListener("keydown", (e) => this.onPress(e, submitBtn, TA)) + setTimeout(() => { + const submitBtn = document.getElementById("submitBtn") + const TA = document.getElementById("postFormTA") + if (submitBtn && TA) { + submitBtn.addEventListener("click", (e) => this.onSubmit(e, TA)) + TA.addEventListener("keydown", (e) => this.onPress(e, submitBtn, TA)) + } + }, 500) + + // set nickname if present + let nickname = this.el.dataset.nickname + if (nickname) { + localStorage.setItem("nickname", nickname) } }, updated() { @@ -419,7 +461,7 @@ Uploaders.S3 = function(entries, onViewError){ let liveSocket = new LiveSocket("/live", Socket, { uploaders: Uploaders, - params: {_csrf_token: csrfToken, tz: Intl.DateTimeFormat().resolvedOptions().timeZone}, + params: {_csrf_token: csrfToken, tz: Intl.DateTimeFormat().resolvedOptions().timeZone, host: window.location.host}, hooks: Hooks, dom: { onBeforeElUpdated(from, to){ diff --git a/config/config.exs b/config/config.exs index d9742a7..4eccda6 100644 --- a/config/config.exs +++ b/config/config.exs @@ -19,7 +19,7 @@ config :claper, ClaperWeb.Endpoint, config :claper, ClaperWeb.Gettext, default_locale: "en", - locales: ~w(fr en) + locales: ~w(fr en de) # Configures the mailer # diff --git a/lib/claper/posts/post.ex b/lib/claper/posts/post.ex index 959c23a..6837399 100644 --- a/lib/claper/posts/post.ex +++ b/lib/claper/posts/post.ex @@ -29,9 +29,17 @@ defmodule Claper.Posts.Post do :like_count, :love_count, :lol_count, + :name, :position ]) |> validate_required([:body, :position]) |> validate_length(:body, min: 2, max: 250) end + + def nickname_changeset(post, attrs) do + post + |> cast(attrs, [:name]) + |> validate_required([:name]) + |> validate_length(:name, min: 2, max: 20) + end end diff --git a/lib/claper/presentations/presentation_state.ex b/lib/claper/presentations/presentation_state.ex index a0d539c..153c1b3 100644 --- a/lib/claper/presentations/presentation_state.ex +++ b/lib/claper/presentations/presentation_state.ex @@ -8,6 +8,7 @@ defmodule Claper.Presentations.PresentationState do field :poll_visible, :boolean field :join_screen_visible, :boolean field :chat_enabled, :boolean + field :anonymous_chat_enabled, :boolean field :banned, {:array, :string}, default: [] belongs_to :presentation_file, Claper.Presentations.PresentationFile @@ -25,7 +26,8 @@ defmodule Claper.Presentations.PresentationState do :join_screen_visible, :banned, :presentation_file_id, - :chat_enabled + :chat_enabled, + :anonymous_chat_enabled ]) |> validate_required([]) end diff --git a/lib/claper_web/live/event_live/form_component.ex b/lib/claper_web/live/event_live/form_component.ex index 0998c48..4d10b32 100644 --- a/lib/claper_web/live/event_live/form_component.ex +++ b/lib/claper_web/live/event_live/form_component.ex @@ -66,7 +66,7 @@ defmodule ClaperWeb.EventLive.FormComponent do required="true" value={ if is_nil(assigns.current_form_submit), - do: '', + do: ~c"", else: assigns.current_form_submit.response[field.name] } /> @@ -80,7 +80,7 @@ defmodule ClaperWeb.EventLive.FormComponent do required="true" value={ if is_nil(assigns.current_form_submit), - do: '', + do: ~c"", else: assigns.current_form_submit.response[field.name] } /> diff --git a/lib/claper_web/live/event_live/manage.ex b/lib/claper_web/live/event_live/manage.ex index 839d97c..e5046a6 100644 --- a/lib/claper_web/live/event_live/manage.ex +++ b/lib/claper_web/live/event_live/manage.ex @@ -314,6 +314,23 @@ defmodule ClaperWeb.EventLive.Manage do {:noreply, socket |> assign(:state, new_state)} end + @impl true + def handle_event( + "checked", + %{"key" => "anonymous_chat_enabled", "value" => value}, + %{assigns: %{state: state}} = socket + ) do + {:ok, new_state} = + Claper.Presentations.update_presentation_state( + state, + %{ + :anonymous_chat_enabled => value + } + ) + + {:noreply, socket |> assign(:state, new_state)} + end + @impl true def handle_event( "checked", diff --git a/lib/claper_web/live/event_live/manage.html.heex b/lib/claper_web/live/event_live/manage.html.heex index 061e1bb..df0af6e 100644 --- a/lib/claper_web/live/event_live/manage.html.heex +++ b/lib/claper_web/live/event_live/manage.html.heex @@ -551,7 +551,7 @@
-
+ +
+ + <%= gettext("Enable anonymous messages") %> +
diff --git a/lib/claper_web/live/event_live/post_component.ex b/lib/claper_web/live/event_live/post_component.ex index aa76d98..be600c7 100644 --- a/lib/claper_web/live/event_live/post_component.ex +++ b/lib/claper_web/live/event_live/post_component.ex @@ -21,6 +21,21 @@ defmodule ClaperWeb.EventLive.PostComponent do > + + <%= if @post.name || is_a_leader(@post, @event, @leaders) do %> +
+ <%= if @post.name do %> +

<%= @post.name %>

+ <% end %> + <%= if is_a_leader(@post, @event, @leaders) do %> +
+ + <%= gettext("Host") %> +
+ <% end %> +
+ <% end %> +