diff --git a/apps/web/src/app/admin-console/components/organization-switcher.component.ts b/apps/web/src/app/admin-console/components/organization-switcher.component.ts index cc7046e3b5f..a1c3cfd51da 100644 --- a/apps/web/src/app/admin-console/components/organization-switcher.component.ts +++ b/apps/web/src/app/admin-console/components/organization-switcher.component.ts @@ -1,12 +1,11 @@ import { Component, Input, OnInit } from "@angular/core"; -import { combineLatest, map, Observable } from "rxjs"; +import { Observable, switchMap } from "rxjs"; import { canAccessAdmin, OrganizationService, } from "@bitwarden/common/admin-console/abstractions/organization/organization.service.abstraction"; import { Organization } from "@bitwarden/common/admin-console/models/domain/organization"; -import { FeatureFlag } from "@bitwarden/common/enums/feature-flag.enum"; import { ConfigServiceAbstraction } from "@bitwarden/common/platform/abstractions/config/config.service.abstraction"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { Utils } from "@bitwarden/common/platform/misc/utils"; @@ -28,13 +27,10 @@ export class OrganizationSwitcherComponent implements OnInit { loaded = false; async ngOnInit() { - this.organizations$ = combineLatest([ - this.organizationService.memberOrganizations$, - this.configService.getFeatureFlag$(FeatureFlag.FlexibleCollections, false), - ]).pipe( - map(([orgs, flexibleCollectionsEnabled]) => { - const canAccess = canAccessAdmin(this.i18nService, flexibleCollectionsEnabled); - return canAccess ? orgs.sort(Utils.getSortFunction(this.i18nService, "name")) : []; + this.organizations$ = this.organizationService.memberOrganizations$.pipe( + switchMap(async (orgs) => { + const canAccess = await canAccessAdmin(this.i18nService, this.configService); + return canAccess ? orgs.sort(Utils.getSortFunction(this.i18nService, "name")) : orgs; }) ); diff --git a/apps/web/src/app/admin-console/organizations/guards/org-permissions.guard.ts b/apps/web/src/app/admin-console/organizations/guards/org-permissions.guard.ts index 8d671ec2d14..509b173c5a4 100644 --- a/apps/web/src/app/admin-console/organizations/guards/org-permissions.guard.ts +++ b/apps/web/src/app/admin-console/organizations/guards/org-permissions.guard.ts @@ -6,7 +6,6 @@ import { OrganizationService, } from "@bitwarden/common/admin-console/abstractions/organization/organization.service.abstraction"; import { Organization } from "@bitwarden/common/admin-console/models/domain/organization"; -import { FeatureFlag } from "@bitwarden/common/enums/feature-flag.enum"; import { ConfigServiceAbstraction } from "@bitwarden/common/platform/abstractions/config/config.service.abstraction"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; @@ -45,17 +44,12 @@ export class OrganizationPermissionsGuard implements CanActivate { return this.router.createUrlTree(["/"]); } - const flexibleCollectionsEnabled = await this.configService.getFeatureFlag( - FeatureFlag.FlexibleCollections, - false - ); - const permissionsCallback: ( organization: Organization, - flexibleCollectionsEnabled: boolean - ) => boolean = route.data?.organizationPermissions; + configService: ConfigServiceAbstraction + ) => Promise = route.data?.organizationPermissions; const hasPermissions = - permissionsCallback == null || permissionsCallback(org, flexibleCollectionsEnabled); + permissionsCallback == null || (await permissionsCallback(org, this.configService)); if (!hasPermissions) { // Handle linkable ciphers for organizations the user only has view access to @@ -71,7 +65,7 @@ export class OrganizationPermissionsGuard implements CanActivate { } this.platformUtilsService.showToast("error", null, this.i18nService.t("accessDenied")); - return canAccessOrgAdmin(org, flexibleCollectionsEnabled) + return (await canAccessOrgAdmin(org, this.configService)) ? this.router.createUrlTree(["/organizations", org.id]) : this.router.createUrlTree(["/"]); } diff --git a/apps/web/src/app/admin-console/organizations/guards/org-redirect.guard.ts b/apps/web/src/app/admin-console/organizations/guards/org-redirect.guard.ts index 3c1d14e7c2c..6efe46691c3 100644 --- a/apps/web/src/app/admin-console/organizations/guards/org-redirect.guard.ts +++ b/apps/web/src/app/admin-console/organizations/guards/org-redirect.guard.ts @@ -5,7 +5,6 @@ import { canAccessOrgAdmin, OrganizationService, } from "@bitwarden/common/admin-console/abstractions/organization/organization.service.abstraction"; -import { FeatureFlag } from "@bitwarden/common/enums/feature-flag.enum"; import { ConfigServiceAbstraction } from "@bitwarden/common/platform/abstractions/config/config.service.abstraction"; @Injectable({ @@ -20,21 +19,17 @@ export class OrganizationRedirectGuard implements CanActivate { async canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) { const org = this.organizationService.get(route.params.organizationId); - const flexibleCollectionsEnabled = await this.configService.getFeatureFlag( - FeatureFlag.FlexibleCollections, - false - ); const customRedirect = route.data?.autoRedirectCallback; if (customRedirect) { - let redirectPath = customRedirect(org, flexibleCollectionsEnabled); + let redirectPath = await customRedirect(org, this.configService); if (typeof redirectPath === "string") { redirectPath = [redirectPath]; } return this.router.createUrlTree([state.url, ...redirectPath]); } - if (canAccessOrgAdmin(org, flexibleCollectionsEnabled)) { + if (await canAccessOrgAdmin(org, this.configService)) { return this.router.createUrlTree(["/organizations", org.id]); } return this.router.createUrlTree(["/"]); diff --git a/apps/web/src/app/admin-console/organizations/layouts/organization-layout.component.html b/apps/web/src/app/admin-console/organizations/layouts/organization-layout.component.html index 0d537a4b2a3..e75da035787 100644 --- a/apps/web/src/app/admin-console/organizations/layouts/organization-layout.component.html +++ b/apps/web/src/app/admin-console/organizations/layouts/organization-layout.component.html @@ -7,7 +7,7 @@ [activeOrganization]="organization" > - {{ + {{ "vault" | i18n }} {{ diff --git a/apps/web/src/app/admin-console/organizations/layouts/organization-layout.component.ts b/apps/web/src/app/admin-console/organizations/layouts/organization-layout.component.ts index 47d9df042da..1f59e8bd9a8 100644 --- a/apps/web/src/app/admin-console/organizations/layouts/organization-layout.component.ts +++ b/apps/web/src/app/admin-console/organizations/layouts/organization-layout.component.ts @@ -56,8 +56,8 @@ export class OrganizationLayoutComponent implements OnInit, OnDestroy { this._destroy.complete(); } - canShowVaultTab(organization: Organization): boolean { - return canAccessVaultTab(organization, this.flexibleCollectionsEnabled); + async canShowVaultTab(organization: Organization): Promise { + return await canAccessVaultTab(organization, this.configService); } canShowSettingsTab(organization: Organization): boolean { diff --git a/apps/web/src/app/admin-console/organizations/organization-routing.module.ts b/apps/web/src/app/admin-console/organizations/organization-routing.module.ts index 7e59cc9c7fe..1538be8db44 100644 --- a/apps/web/src/app/admin-console/organizations/organization-routing.module.ts +++ b/apps/web/src/app/admin-console/organizations/organization-routing.module.ts @@ -11,6 +11,7 @@ import { canAccessSettingsTab, } from "@bitwarden/common/admin-console/abstractions/organization/organization.service.abstraction"; import { Organization } from "@bitwarden/common/admin-console/models/domain/organization"; +import { ConfigServiceAbstraction } from "@bitwarden/common/platform/abstractions/config/config.service.abstraction"; import { OrganizationPermissionsGuard } from "../../admin-console/organizations/guards/org-permissions.guard"; import { OrganizationRedirectGuard } from "../../admin-console/organizations/guards/org-redirect.guard"; @@ -78,11 +79,11 @@ const routes: Routes = [ }, ]; -function getOrganizationRoute( +async function getOrganizationRoute( organization: Organization, - flexibleCollectionsEnabled: boolean -): string { - if (canAccessVaultTab(organization, flexibleCollectionsEnabled)) { + configService: ConfigServiceAbstraction +): Promise { + if (await canAccessVaultTab(organization, configService)) { return "vault"; } if (canAccessMembersTab(organization)) { diff --git a/apps/web/src/app/layouts/navbar.component.html b/apps/web/src/app/layouts/navbar.component.html index cecd5599abd..b1202199fac 100644 --- a/apps/web/src/app/layouts/navbar.component.html +++ b/apps/web/src/app/layouts/navbar.component.html @@ -22,9 +22,15 @@ class="nav-item" routerLinkActive="active" > - {{ - "organizations" | i18n - }} + + + {{ "organizations" | i18n }} + +