From 339ae6fdcfaa617cca9029dfcb075bed1100a74c Mon Sep 17 00:00:00 2001 From: Alexandre Lion Date: Thu, 10 Aug 2023 20:39:38 +0200 Subject: [PATCH] Add nickname feature + German locale + minor fixes (#43) * Add attendee name feature * Add names to report * Add name to test * Finish nickname feature + minor fixes * Add german locale * Update changelog --- CHANGELOG.md | 10 + assets/js/app.js | 54 +- config/config.exs | 2 +- lib/claper/posts/post.ex | 8 + .../presentations/presentation_state.ex | 4 +- .../live/event_live/form_component.ex | 4 +- lib/claper_web/live/event_live/manage.ex | 17 + .../live/event_live/manage.html.heex | 20 +- .../live/event_live/post_component.ex | 30 +- lib/claper_web/live/event_live/presenter.ex | 7 + .../live/event_live/presenter.html.heex | 5 +- lib/claper_web/live/event_live/show.ex | 42 +- lib/claper_web/live/event_live/show.html.heex | 236 ++++- lib/claper_web/live/stat_live/index.html.heex | 8 +- mix.exs | 2 +- mix.lock | 2 +- priv/gettext/de/LC_MESSAGES/default.po | 958 ++++++++++++++++++ priv/gettext/de/LC_MESSAGES/errors.po | 85 ++ priv/gettext/default.pot | 139 ++- priv/gettext/en/LC_MESSAGES/default.po | 325 ++++-- priv/gettext/fr/LC_MESSAGES/default.po | 325 ++++-- priv/gettext/fr/LC_MESSAGES/errors.po | 2 +- ...us_chat_enabled_to_presentation_states.exs | 9 + test/claper/posts_test.exs | 2 +- 24 files changed, 2033 insertions(+), 263 deletions(-) create mode 100644 priv/gettext/de/LC_MESSAGES/default.po create mode 100644 priv/gettext/de/LC_MESSAGES/errors.po create mode 100644 priv/repo/migrations/20230809172244_add_anonymous_chat_enabled_to_presentation_states.exs 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 @@
-
    +
    • <%= link(gettext("Messages"), to: "#", phx_click: "list-tab", phx_value_tab: :posts) %>
    • @@ -586,7 +586,7 @@ <% end %>
      0, do: 'max-h-full'} pb-5 px-5"} + class={"overflow-y-auto #{if Enum.count(@posts) > 0, do: 'max-h-full'} pb-5 pt-8 px-5"} phx-update="append" data-posts-nb={Enum.count(@posts)} phx-hook="ScrollIntoDiv" @@ -650,7 +650,13 @@ /> <% end %> -

      <%= post.body %>

      +
      + <%= if post.name do %> +

      <%= post.name %>

      + <% end %> + +

      <%= post.body %>

      +
      <%= if post.like_count > 0 || post.love_count > 0 || post.lol_count > 0 do %> @@ -793,6 +799,14 @@ <%= gettext("Enable messages") %>
+ +
+ + <%= 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 %> +