fix(ui): keep every team in the key form's team list for users who cannot change the organization

This commit is contained in:
mateo-berri 2026-10-20 22:02:14 -07:00
parent 2a5f0e7749
commit 45339ad26e
2 changed files with 44 additions and 4 deletions

View file

@ -1704,6 +1704,44 @@ describe("KeyEditView", () => {
expect(screen.queryByRole("option", { name: /Beta/ })).not.toBeInTheDocument();
});
it("should let a non-admin move a key to their team in another organization", async () => {
const onSubmitMock = vi.fn().mockResolvedValue(undefined);
renderWithProviders(
<KeyEditView
keyData={{ ...MOCK_KEY_DATA, organization_id: null, org_id: "org-1" }}
teams={[
{ team_id: "team-a", team_alias: "Alpha", organization_id: "org-1" },
{ team_id: "team-b", team_alias: "Beta", organization_id: "org-2" },
]}
onCancel={() => {}}
onSubmit={onSubmitMock}
accessToken=""
userID=""
userRole="Internal User"
premiumUser={false}
/>,
);
await waitFor(() => {
expect(screen.getByLabelText("Organization")).toHaveValue("Engineering");
});
await userEvent.click(screen.getByRole("combobox", { name: "Team" }));
await userEvent.click(await screen.findByRole("option", { name: /Beta/ }));
await waitFor(() => {
expect(screen.getByLabelText("Organization")).toHaveValue("Sales");
});
await userEvent.click(screen.getByRole("button", { name: /save changes/i }));
await waitFor(() => {
expect(onSubmitMock).toHaveBeenCalled();
});
expect(onSubmitMock.mock.calls[0][0]).toMatchObject({ organization_id: "org-2", team_id: "team-b" });
});
it("should re-scope teams when the edited key switches to another organization", async () => {
const sharedProps = {
teams: [

View file

@ -146,6 +146,7 @@ function KeyEditSession({
const { data: uiSettingsData } = useUISettings();
const enableProjectsUI = Boolean(uiSettingsData?.values?.enable_projects_ui);
const hasProject = Boolean(keyData.project_id);
const canChangeOrganization = userRole === "Admin" && !hasProject;
const detachProject = hasProject && form.watch("project_id") === null;
const canDetachProject = canDetachKeyProject(team, organizations, userID, userRole);
@ -352,9 +353,10 @@ function KeyEditSession({
})),
];
const visibleTeams = selectedOrganizationId
? teams?.filter((t) => t.organization_id === selectedOrganizationId)
: teams;
const visibleTeams =
canChangeOrganization && selectedOrganizationId
? teams?.filter((t) => t.organization_id === selectedOrganizationId)
: teams;
const teamOptionsFor = (selectedTeamId: string | null): SearchSelectOption[] => {
const selectedTeamOutsideFilter = teams?.find((t) => t.team_id === selectedTeamId && !visibleTeams?.includes(t));
@ -795,7 +797,7 @@ function KeyEditSession({
value={value}
organizations={organizations}
loading={isOrganizationsLoading}
disabled={userRole !== "Admin" || hasProject}
disabled={!canChangeOrganization}
onChange={(orgId) => handleOrganizationChange(onChange, orgId)}
/>
)}