From c9331449205bd71659f28f2cea6e5c42588ecb5d Mon Sep 17 00:00:00 2001 From: Simon Date: Fri, 13 Mar 2026 19:01:50 +0100 Subject: [PATCH] feat: unify page titles --- lib/mv_web/components/layouts.ex | 33 +++++++ lib/mv_web/components/layouts/root.html.heex | 4 +- .../controllers/join_confirm_controller.ex | 9 ++ lib/mv_web/controllers/page_controller.ex | 6 +- lib/mv_web/live/auth/sign_in_live.ex | 10 ++ lib/mv_web/live/datafields_live.ex | 4 +- lib/mv_web/live/global_settings_live.ex | 4 +- lib/mv_web/live/group_live/form.ex | 6 +- lib/mv_web/live/group_live/index.ex | 4 +- lib/mv_web/live/group_live/show.ex | 6 +- lib/mv_web/live/import_live.ex | 4 +- lib/mv_web/live/join_live.ex | 1 + lib/mv_web/live/join_request_live/index.ex | 4 +- lib/mv_web/live/join_request_live/show.ex | 6 +- lib/mv_web/live/member_live/form.ex | 4 +- lib/mv_web/live/member_live/index.ex | 2 +- lib/mv_web/live/member_live/index.html.heex | 2 +- lib/mv_web/live/member_live/show.ex | 10 +- .../live/membership_fee_settings_live.ex | 4 +- .../live/membership_fee_type_live/form.ex | 6 +- .../live/membership_fee_type_live/index.ex | 4 +- lib/mv_web/live/role_live/form.ex | 12 +-- lib/mv_web/live/role_live/index.ex | 2 +- lib/mv_web/live/role_live/index.html.heex | 2 +- lib/mv_web/live/role_live/show.ex | 6 +- lib/mv_web/live/statistics_live.ex | 4 +- lib/mv_web/live/user_live/form.ex | 9 +- lib/mv_web/live/user_live/index.ex | 2 +- lib/mv_web/live/user_live/index.html.heex | 2 +- lib/mv_web/live/user_live/show.ex | 6 +- lib/mv_web/live_helpers.ex | 9 ++ lib/mv_web/plugs/assign_club_name.ex | 22 +++++ lib/mv_web/router.ex | 1 + priv/gettext/de/LC_MESSAGES/default.po | 98 ++++++++++--------- priv/gettext/default.pot | 98 ++++++++++--------- priv/gettext/en/LC_MESSAGES/default.po | 98 ++++++++++--------- .../live/join_live_email_failure_test.exs | 5 +- 37 files changed, 309 insertions(+), 200 deletions(-) create mode 100644 lib/mv_web/plugs/assign_club_name.ex diff --git a/lib/mv_web/components/layouts.ex b/lib/mv_web/components/layouts.ex index 29f5b8e..5a96001 100644 --- a/lib/mv_web/components/layouts.ex +++ b/lib/mv_web/components/layouts.ex @@ -13,6 +13,39 @@ defmodule MvWeb.Layouts do embed_templates "layouts/*" + @doc """ + Builds the full browser tab title: "Mila", "Mila · Page", or "Mila · Page · Club". + Order is always: Mila · page title · club name. + Uses assigns[:club_name] and the short page label from assigns[:content_title] or + assigns[:page_title]. LiveViews should set content_title (same gettext as sidebar) + and then assign page_title to the result of this function so the client receives + the full title. + """ + def page_title_string(assigns) do + club = assigns[:club_name] + page = assigns[:content_title] || assigns[:page_title] + + parts = + [page, club] + |> Enum.filter(&(is_binary(&1) and String.trim(&1) != "")) + + if parts == [] do + "Mila" + else + "Mila · " <> Enum.join(parts, " · ") + end + end + + @doc """ + Assigns content_title (short label for heading; same gettext as sidebar) and + page_title (full browser tab title). Call from LiveView mount after club_name + is set (e.g. from on_mount). Returns the socket. + """ + def assign_page_title(socket, content_title) do + socket = assign(socket, :content_title, content_title) + assign(socket, :page_title, page_title_string(socket.assigns)) + end + @doc """ Renders the public (unauthenticated) page layout: header with logo + "Mitgliederverwaltung" left, club name centered, language selector right; plus main content and flash group. Use for sign-in, join, and join-confirm pages so they diff --git a/lib/mv_web/components/layouts/root.html.heex b/lib/mv_web/components/layouts/root.html.heex index e107d5b..5419b73 100644 --- a/lib/mv_web/components/layouts/root.html.heex +++ b/lib/mv_web/components/layouts/root.html.heex @@ -7,8 +7,8 @@ - <.live_title default="Mv" suffix=" · Phoenix Framework"> - {assigns[:page_title]} + <.live_title default="Mila"> + {page_title_string(assigns)}