From 409433ff81e2e40afd829f629e6dbc1b63dc39cc Mon Sep 17 00:00:00 2001 From: Luke Heath Date: Wed, 22 Apr 2026 10:19:05 -0500 Subject: [PATCH] Fix unreleased bug where workstations is not selected on controls page (#43893) --- frontend/hooks/useTeamIdParam.tests.ts | 64 ++++++++++++++++++++++++++ frontend/hooks/useTeamIdParam.ts | 24 +++++++--- 2 files changed, 81 insertions(+), 7 deletions(-) create mode 100644 frontend/hooks/useTeamIdParam.tests.ts diff --git a/frontend/hooks/useTeamIdParam.tests.ts b/frontend/hooks/useTeamIdParam.tests.ts new file mode 100644 index 0000000000..0d9280cc7a --- /dev/null +++ b/frontend/hooks/useTeamIdParam.tests.ts @@ -0,0 +1,64 @@ +import { preferredOrLowestIdFleet } from "./useTeamIdParam"; + +describe("preferredOrLowestIdFleet", () => { + it('returns "Workstations" when present', () => { + const fleets = [ + { id: 1, name: "Alpha" }, + { id: 2, name: "Workstations" }, + { id: 3, name: "Zebra" }, + ]; + expect(preferredOrLowestIdFleet(fleets)).toEqual({ + id: 2, + name: "Workstations", + }); + }); + + it('returns "💻 Workstations" (emoji variant) when present', () => { + const fleets = [ + { id: 1, name: "Alpha" }, + { id: 3, name: "💻 Workstations" }, + ]; + expect(preferredOrLowestIdFleet(fleets)).toEqual({ + id: 3, + name: "💻 Workstations", + }); + }); + + it("prefers plain over emoji when both exist (first match wins)", () => { + const fleets = [ + { id: 5, name: "Workstations" }, + { id: 2, name: "💻 Workstations" }, + ]; + expect(preferredOrLowestIdFleet(fleets)).toEqual({ + id: 5, + name: "Workstations", + }); + }); + + it("matches case-insensitively", () => { + const fleets = [ + { id: 1, name: "Alpha" }, + { id: 4, name: "WORKSTATIONS" }, + ]; + expect(preferredOrLowestIdFleet(fleets)).toEqual({ + id: 4, + name: "WORKSTATIONS", + }); + }); + + it("falls back to lowest ID when no Workstations fleet exists", () => { + const fleets = [ + { id: 10, name: "Zebra" }, + { id: 3, name: "Charlie" }, + { id: 7, name: "Mike" }, + ]; + expect(preferredOrLowestIdFleet(fleets)).toEqual({ + id: 3, + name: "Charlie", + }); + }); + + it("returns undefined for an empty array", () => { + expect(preferredOrLowestIdFleet([])).toBeUndefined(); + }); +}); diff --git a/frontend/hooks/useTeamIdParam.ts b/frontend/hooks/useTeamIdParam.ts index eced195bf0..c24bb7ce9c 100644 --- a/frontend/hooks/useTeamIdParam.ts +++ b/frontend/hooks/useTeamIdParam.ts @@ -186,6 +186,17 @@ const getUserTeams = ({ : filterUserTeamsByRole(currentUser.teams, permittedAccessByTeamRole); }; +// Prefer a fleet named "Workstations" (with or without emoji prefix), +// otherwise fall back to the fleet with the lowest ID. +export const preferredOrLowestIdFleet = (fleets: ITeamSummary[]) => { + const name = "workstations"; + const workstations = fleets.find((t) => { + const lower = t.name.toLowerCase(); + return lower === name || lower === `\u{1F4BB} ${name}`; + }); + return workstations ?? sortBy(fleets, (t) => t.id)[0]; +}; + const getDefaultTeam = ({ currentUser, includeAllTeams, @@ -202,6 +213,8 @@ const getDefaultTeam = ({ if (!currentUser || !userTeams?.length) { return undefined; } + const realFleets = userTeams.filter((t) => t.id > APP_CONTEXT_NO_TEAM_ID); + if (permissions.isOnGlobalTeam(currentUser)) { let defaultTeam: ITeamSummary | undefined; if (isPrimoMode) { @@ -221,25 +234,22 @@ const getDefaultTeam = ({ defaultTeam = userTeams.find((t) => t.id === APP_CONTEXT_ALL_TEAMS_ID); } if (!defaultTeam && includeNoTeam) { - // prefer the real fleet with the lowest ID over "Unassigned" - const realFleets = userTeams.filter( - (t) => t.id > APP_CONTEXT_NO_TEAM_ID - ); + // prefer a real fleet over "Unassigned" if (realFleets.length > 0) { - defaultTeam = sortBy(realFleets, (t) => t.id)[0]; + defaultTeam = preferredOrLowestIdFleet(realFleets); } else { defaultTeam = userTeams.find((t) => t.id === APP_CONTEXT_NO_TEAM_ID); } } } - return defaultTeam || userTeams.find((t) => t.id > APP_CONTEXT_NO_TEAM_ID); + return defaultTeam || preferredOrLowestIdFleet(realFleets); } return ( userTeams.find((t) => permissions.isTeamAdmin(currentUser, t.id)) || userTeams.find((t) => permissions.isTeamMaintainer(currentUser, t.id)) || - userTeams.find((t) => t.id > APP_CONTEXT_NO_TEAM_ID) + preferredOrLowestIdFleet(realFleets) ); };