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
+
+
+
+
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.
-
-
-
- -
- <.unstyled_link href={
- if team.current?,
- do: "#",
- else: Routes.site_path(@conn, :index, __team: team.identifier)
- }>
-
-
- {team.name}
-
-
- Owner{if team.many_owners?, do: "s"}: {team.owners}
-
-
-
-
-
-
-
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