diff --git a/CHANGELOG.md b/CHANGELOG.md index 9f10e57af8e4..b08756dde584 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -18,6 +18,8 @@ All notable changes to this project will be documented in this file. ### Removed +- Removed the standalone team switcher page; team switching is now done from the topbar dropdown only + ### Changed - Keybind hints are hidden on smaller screens diff --git a/lib/plausible_web/controllers/auth_controller.ex b/lib/plausible_web/controllers/auth_controller.ex index 73ab4d35dcbc..49f4137c445f 100644 --- a/lib/plausible_web/controllers/auth_controller.ex +++ b/lib/plausible_web/controllers/auth_controller.ex @@ -38,7 +38,6 @@ defmodule PlausibleWeb.AuthController do :verify_2fa_setup, :disable_2fa, :generate_2fa_recovery_codes, - :select_team, :switch_team ] ) @@ -61,51 +60,6 @@ defmodule PlausibleWeb.AuthController do TwoFactor.Session.clear_2fa_user(conn) end - def select_team(conn, _params) do - current_user = conn.assigns.current_user - current_team = conn.assigns[:current_team] - - owner_name_fn = fn owner -> - if owner.id == current_user.id do - "You" - else - owner.name - end - end - - teams = - current_user - |> Teams.Users.teams() - |> Enum.filter(& &1.setup_complete) - |> Enum.map(fn team -> - current_team? = current_team && team.id == current_team.id - - owners = - Enum.map_join(team.owners, ", ", &owner_name_fn.(&1)) - - many_owners? = length(team.owners) > 1 - - %{ - identifier: team.identifier, - name: team.name, - current?: current_team?, - many_owners?: many_owners?, - owners: owners - } - end) - - case teams do - [] -> - redirect(conn, to: Routes.site_path(conn, :index)) - - [%{identifier: sole_team_identifier}] -> - redirect(conn, to: Routes.site_path(conn, :index, __team: sole_team_identifier)) - - [_ | _] -> - render(conn, "select_team.html", teams_selection: teams) - end - end - def activate_form(conn, params) do user = conn.assigns.current_user flow = params["flow"] || PlausibleWeb.Flows.register() diff --git a/lib/plausible_web/live/auth_context.ex b/lib/plausible_web/live/auth_context.ex index cac8d7ff6b2f..3a41a24785df 100644 --- a/lib/plausible_web/live/auth_context.ex +++ b/lib/plausible_web/live/auth_context.ex @@ -87,16 +87,9 @@ defmodule PlausibleWeb.Live.AuthContext do %{current_user: user} -> user.team_memberships + |> Enum.filter(& &1.team.setup_complete) |> Enum.sort_by(fn tm -> [tm.role != :owner, tm.team_id] end) |> Enum.map(&Map.fetch!(&1, :team)) - |> Enum.take(3) - end) - |> assign_new(:teams_count, fn - %{current_user: nil} -> 0 - %{current_user: user} -> length(user.team_memberships) - end) - |> assign_new(:more_teams?, fn context -> - context.teams_count > 3 end) {:cont, socket} diff --git a/lib/plausible_web/live/sites.ex b/lib/plausible_web/live/sites.ex index 44e139fb52ed..239595886b0e 100644 --- a/lib/plausible_web/live/sites.ex +++ b/lib/plausible_web/live/sites.ex @@ -205,13 +205,35 @@ defmodule PlausibleWeb.Live.Sites do Add website <.button_link - :if={not Teams.setup?(@current_team) and @has_sites?} - href={Routes.auth_path(@socket, :select_team)} + :if={not Teams.setup?(@current_team) and @has_sites? and length(@teams) == 1} + href={Routes.site_path(@socket, :index, __team: hd(@teams).identifier)} theme="secondary" mt?={false} > Go to team sites + + 1} + id="go-to-team-dropdown" + > + + Go to team sites + + + +
+ + {Teams.name(team)} + +
+
+
diff --git a/lib/plausible_web/plugs/auth_plug.ex b/lib/plausible_web/plugs/auth_plug.ex index 1f62c9c381f2..7d01dfb75227 100644 --- a/lib/plausible_web/plugs/auth_plug.ex +++ b/lib/plausible_web/plugs/auth_plug.ex @@ -54,14 +54,11 @@ defmodule PlausibleWeb.AuthPlug do |> Enum.find(%{}, &(&1.role == :owner and &1.team.setup_complete == false)) |> Map.get(:team) - teams_count = length(user.team_memberships) - teams = user.team_memberships |> Enum.filter(& &1.team.setup_complete) |> Enum.sort_by(fn tm -> [tm.role != :owner, tm.team_id] end) |> Enum.map(&Map.fetch!(&1, :team)) - |> Enum.take(3) Plausible.OpenTelemetry.add_user_attributes(user) @@ -80,9 +77,7 @@ defmodule PlausibleWeb.AuthPlug do |> assign(:my_team, my_team) |> assign(:current_team, current_team || my_team) |> assign(:current_team_role, current_team_role || (my_team && :owner)) - |> assign(:teams_count, teams_count) |> assign(:teams, teams) - |> assign(:more_teams?, teams_count > 3) {:error, :session_expired, user_session} -> assign(conn, :expired_session, user_session) diff --git a/lib/plausible_web/plugs/require_account.ex b/lib/plausible_web/plugs/require_account.ex index 53b7a88cbadc..7ab0a83591af 100644 --- a/lib/plausible_web/plugs/require_account.ex +++ b/lib/plausible_web/plugs/require_account.ex @@ -1,4 +1,6 @@ defmodule PlausibleWeb.RequireAccountPlug do + @moduledoc false + alias PlausibleWeb.Router.Helpers, as: Routes import Plug.Conn @@ -12,8 +14,7 @@ defmodule PlausibleWeb.RequireAccountPlug do @force_2fa_exceptions [ ["2fa", "setup", "force-initiate"], ["2fa", "setup", "initiate"], - ["2fa", "setup", "verify"], - ["team", "select"] + ["2fa", "setup", "verify"] ] def init(options) do diff --git a/lib/plausible_web/router.ex b/lib/plausible_web/router.ex index 572537e65f12..b1a6b609b39d 100644 --- a/lib/plausible_web/router.ex +++ b/lib/plausible_web/router.ex @@ -543,7 +543,6 @@ defmodule PlausibleWeb.Router do get "/sso/notice", SSOController, :provision_notice get "/sso/issue", SSOController, :provision_issue get "/logout", AuthController, :logout - get "/team/select", AuthController, :select_team end scope "/", PlausibleWeb do @@ -560,7 +559,6 @@ defmodule PlausibleWeb.Router do on_ce do get "/logout", AuthController, :logout - get "/team/select", AuthController, :select_team end delete "/me", AuthController, :delete_me diff --git a/lib/plausible_web/templates/auth/select_team.html.heex b/lib/plausible_web/templates/auth/select_team.html.heex deleted file mode 100644 index d2e571279ebd..000000000000 --- a/lib/plausible_web/templates/auth/select_team.html.heex +++ /dev/null @@ -1,29 +0,0 @@ -<.focus_box> - <:title>Switch Team - - <:subtitle>Switch your current team. - -
- -
- diff --git a/lib/plausible_web/templates/layout/_header.html.heex b/lib/plausible_web/templates/layout/_header.html.heex index 58a0ec89fae5..18b6d12c94ce 100644 --- a/lib/plausible_web/templates/layout/_header.html.heex +++ b/lib/plausible_web/templates/layout/_header.html.heex @@ -76,7 +76,7 @@ class="-my-0.5 w-7 rounded-full" /> - <:menu> + <:menu class="max-w-xs"> <.dropdown_item>
Signed in as

@@ -88,7 +88,6 @@ teams={@teams} my_team={@my_team} current_team={@current_team} - more_teams?={@more_teams?} /> <.dropdown_divider /> <.dropdown_item href={Routes.settings_path(@conn, :index)}> diff --git a/lib/plausible_web/views/layout_view.ex b/lib/plausible_web/views/layout_view.ex index d4e16b1ca24b..b67ab79ccc46 100644 --- a/lib/plausible_web/views/layout_view.ex +++ b/lib/plausible_web/views/layout_view.ex @@ -166,7 +166,6 @@ defmodule PlausibleWeb.LayoutView do attr :teams, :list, required: true attr :my_team, :any, default: nil attr :current_team, :any, default: nil - attr :more_teams?, :boolean, required: true def team_switcher(assigns) do teams = assigns[:teams] @@ -192,36 +191,41 @@ defmodule PlausibleWeb.LayoutView do end selected_id = current_team && current_team.id + {pinned_team, other_teams} = Enum.split_with(teams, &(&1.id == selected_id)) assigns = assigns - |> assign(:teams, teams) - |> assign(:selected_id, selected_id) + |> assign(:pinned_team, List.first(pinned_team)) + |> assign(:other_teams, other_teams) ~H""" <.dropdown_item>

Teams
<.dropdown_item - :for={team <- @teams} - href={Routes.site_path(@conn, :index, __team: team.identifier)} + :if={@pinned_team} + href={Routes.site_path(@conn, :index, __team: @pinned_team.identifier)} > -

- {Teams.name(team)} -

- - <.dropdown_item :if={@more_teams?} href={Routes.auth_path(@conn, :select_team)}> - Switch to Another Team +
+

+ {Teams.name(@pinned_team)} +

+ +
+
+ <.dropdown_item + :for={team <- @other_teams} + href={Routes.site_path(@conn, :index, __team: team.identifier)} + > +

+ {Teams.name(team)} +

+ +
""" else ~H"" diff --git a/test/plausible_web/controllers/auth_controller_test.exs b/test/plausible_web/controllers/auth_controller_test.exs index c85cf676fc5b..c63e3f016430 100644 --- a/test/plausible_web/controllers/auth_controller_test.exs +++ b/test/plausible_web/controllers/auth_controller_test.exs @@ -2095,48 +2095,6 @@ defmodule PlausibleWeb.AuthControllerTest do end end - describe "GET /team/select" do - setup [:create_user, :log_in] - - test "redirects to /sites if no teams available", %{conn: conn} do - conn = get(conn, Routes.auth_path(conn, :select_team)) - assert redirected_to(conn, 302) == Routes.site_path(conn, :index) - end - - test "redirects to /sites?__team if one team set up available", %{conn: conn, user: user} do - new_site(owner: user) - team = team_of(user) - assert Plausible.Teams.complete_setup(team) - conn = get(conn, Routes.auth_path(conn, :select_team)) - assert redirected_to(conn, 302) == Routes.site_path(conn, :index, __team: team.identifier) - end - - test "displays team switcher if >1 teams available", %{conn: conn, user: user} do - t1 = new_site(owner: user).team - t2 = new_site().team - - add_member(t2, user: user, role: :viewer) - - Plausible.Teams.complete_setup(t1) - Plausible.Teams.complete_setup(t2) - - conn = get(conn, Routes.auth_path(conn, :select_team)) - assert html = html_response(conn, 200) - - assert text(html) =~ "Switch your current team" - - assert element_exists?( - html, - ~s|a[href="#{Routes.site_path(conn, :index, __team: t1.identifier)}"]| - ) - - assert element_exists?( - html, - ~s|a[href="#{Routes.site_path(conn, :index, __team: t2.identifier)}"]| - ) - end - end - defp login_with_cookie(conn, email, password) do conn |> post(Routes.auth_path(conn, :login), %{ diff --git a/test/plausible_web/live/sites_test.exs b/test/plausible_web/live/sites_test.exs index 8c546ba742ad..2df75c2f39b3 100644 --- a/test/plausible_web/live/sites_test.exs +++ b/test/plausible_web/live/sites_test.exs @@ -22,7 +22,7 @@ defmodule PlausibleWeb.Live.SitesTest do conn: conn, user: user } do - team2 = new_site().team + team2 = new_site().team |> Plausible.Teams.complete_setup() add_member(team2, user: user, role: :admin) @@ -33,6 +33,11 @@ defmodule PlausibleWeb.Live.SitesTest do refute text =~ "You don't have any sites yet" assert text =~ "Add your first personal site" assert text =~ "Go to team sites" + + assert element_exists?( + html, + ~s|a[href="/sites?__team=#{team2.identifier}"]| + ) end test "renders settings link when current team is set", %{user: user, conn: conn} do diff --git a/test/plausible_web/plugs/require_account_plug_test.exs b/test/plausible_web/plugs/require_account_plug_test.exs index 974af516cfeb..cb9066b4ca2d 100644 --- a/test/plausible_web/plugs/require_account_plug_test.exs +++ b/test/plausible_web/plugs/require_account_plug_test.exs @@ -56,8 +56,7 @@ defmodule PlausibleWeb.RequireAccountPlugTest do @force_2fa_exceptions [ "/2fa/setup/force-initiate", "/2fa/setup/initiate", - "/2fa/setup/verify", - "/team/select" + "/2fa/setup/verify" ] for path <- @force_2fa_exceptions do