1
0
mirror of https://github.com/bitwarden/browser synced 2025-12-10 13:23:34 +00:00

[PM-21122] - Hide orgs in product switcher for single org policy users (#14803)

* don't display orgs in account switcher for single org policy users

* add comment

* add test case

* fix storybook

* fix storybook again

* use variable name instead of comment
This commit is contained in:
Jordan Aasen
2025-05-27 10:03:29 -07:00
committed by GitHub
parent 0f9f6a1c5d
commit 5f169af08e
4 changed files with 44 additions and 2 deletions

View File

@@ -5,6 +5,7 @@ import { BehaviorSubject, firstValueFrom, Observable, of } from "rxjs";
import { I18nPipe } from "@bitwarden/angular/platform/pipes/i18n.pipe";
import { OrganizationService } from "@bitwarden/common/admin-console/abstractions/organization/organization.service.abstraction";
import { PolicyService } from "@bitwarden/common/admin-console/abstractions/policy/policy.service.abstraction";
import { ProviderService } from "@bitwarden/common/admin-console/abstractions/provider.service";
import { Organization } from "@bitwarden/common/admin-console/models/domain/organization";
import { Provider } from "@bitwarden/common/admin-console/models/domain/provider";
@@ -130,6 +131,12 @@ export default {
return new I18nMockService(translations);
},
},
{
provide: PolicyService,
useValue: {
policyAppliesToUser$: () => of(false),
},
},
],
}),
applicationConfig({

View File

@@ -5,6 +5,7 @@ import { BehaviorSubject, firstValueFrom, Observable, of } from "rxjs";
import { JslibModule } from "@bitwarden/angular/jslib.module";
import { OrganizationService } from "@bitwarden/common/admin-console/abstractions/organization/organization.service.abstraction";
import { PolicyService } from "@bitwarden/common/admin-console/abstractions/policy/policy.service.abstraction";
import { ProviderService } from "@bitwarden/common/admin-console/abstractions/provider.service";
import { Organization } from "@bitwarden/common/admin-console/models/domain/organization";
import { Provider } from "@bitwarden/common/admin-console/models/domain/provider";
@@ -126,6 +127,12 @@ export default {
});
},
},
{
provide: PolicyService,
useValue: {
policyAppliesToUser$: () => of(false),
},
},
],
}),
applicationConfig({

View File

@@ -7,6 +7,7 @@ import { Observable, firstValueFrom, of } from "rxjs";
import { I18nPipe } from "@bitwarden/angular/platform/pipes/i18n.pipe";
import { OrganizationService } from "@bitwarden/common/admin-console/abstractions/organization/organization.service.abstraction";
import { PolicyService } from "@bitwarden/common/admin-console/abstractions/policy/policy.service.abstraction";
import { ProviderService } from "@bitwarden/common/admin-console/abstractions/provider.service";
import { Organization } from "@bitwarden/common/admin-console/models/domain/organization";
import { Provider } from "@bitwarden/common/admin-console/models/domain/provider";
@@ -27,6 +28,7 @@ describe("ProductSwitcherService", () => {
let accountService: FakeAccountService;
let platformUtilsService: MockProxy<PlatformUtilsService>;
let activeRouteParams = convertToParamMap({ organizationId: "1234" });
let singleOrgPolicyEnabled = false;
const getLastSync = jest.fn().mockResolvedValue(new Date("2024-05-14"));
const userId = Utils.newGuid() as UserId;
@@ -77,6 +79,12 @@ describe("ProductSwitcherService", () => {
provide: SyncService,
useValue: { getLastSync },
},
{
provide: PolicyService,
useValue: {
policyAppliesToUser$: () => of(singleOrgPolicyEnabled),
},
},
],
});
});
@@ -184,6 +192,14 @@ describe("ProductSwitcherService", () => {
expect(products.bento.find((p) => p.name === "Admin Console")).toBeDefined();
expect(products.other.find((p) => p.name === "Organizations")).toBeUndefined();
});
it("does not include Organizations when the user's single org policy is enabled", async () => {
singleOrgPolicyEnabled = true;
initiateService();
const products = await firstValueFrom(service.products$);
expect(products.other.find((p) => p.name === "Organizations")).not.toBeDefined();
});
});
describe("Provider Portal", () => {

View File

@@ -6,6 +6,7 @@ import {
combineLatest,
concatMap,
filter,
firstValueFrom,
map,
Observable,
ReplaySubject,
@@ -18,10 +19,12 @@ import {
canAccessOrgAdmin,
OrganizationService,
} from "@bitwarden/common/admin-console/abstractions/organization/organization.service.abstraction";
import { PolicyService } from "@bitwarden/common/admin-console/abstractions/policy/policy.service.abstraction";
import { ProviderService } from "@bitwarden/common/admin-console/abstractions/provider.service";
import { ProviderType } from "@bitwarden/common/admin-console/enums";
import { PolicyType, ProviderType } from "@bitwarden/common/admin-console/enums";
import { Organization } from "@bitwarden/common/admin-console/models/domain/organization";
import { AccountService } from "@bitwarden/common/auth/abstractions/account.service";
import { getUserId } from "@bitwarden/common/auth/services/account.service";
import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service";
import { SyncService } from "@bitwarden/common/platform/sync";
@@ -104,6 +107,7 @@ export class ProductSwitcherService {
private syncService: SyncService,
private accountService: AccountService,
private platformUtilsService: PlatformUtilsService,
private policyService: PolicyService,
) {
this.pollUntilSynced();
}
@@ -235,7 +239,15 @@ export class ProductSwitcherService {
if (acOrg) {
bento.push(products.ac);
} else {
other.push(products.orgs);
const activeUserId = await firstValueFrom(
this.accountService.activeAccount$.pipe(getUserId),
);
const userHasSingleOrgPolicy = await firstValueFrom(
this.policyService.policyAppliesToUser$(PolicyType.SingleOrg, activeUserId),
);
if (!userHasSingleOrgPolicy) {
other.push(products.orgs);
}
}
if (providers.length > 0) {