import { Component, EventEmitter, Input, Output } from "@angular/core"; import { ActivatedRoute } from "@angular/router"; import { combineLatest, map, Observable } from "rxjs"; import { OrganizationService } from "@bitwarden/common/abstractions/organization/organization.service.abstraction"; import type { Organization } from "@bitwarden/common/models/domain/organization"; @Component({ selector: "org-switcher", templateUrl: "org-switcher.component.html", }) export class OrgSwitcherComponent { protected organizations$: Observable = this.organizationService.organizations$.pipe( map((orgs) => orgs.filter(this.filter).sort((a, b) => a.name.localeCompare(b.name))) ); protected activeOrganization$: Observable = combineLatest([ this.route.paramMap, this.organizations$, ]).pipe(map(([params, orgs]) => orgs.find((org) => org.id === params.get("organizationId")))); /** * Filter function for displayed organizations in the `org-switcher` * @example * const smFilter = (org: Organization) => org.canAccessSecretsManager * // */ @Input() filter: (org: Organization) => boolean = () => true; /** * Is `true` if the expanded content is visible */ @Input() open = false; @Output() openChange = new EventEmitter(); constructor(private route: ActivatedRoute, private organizationService: OrganizationService) {} protected toggle(event?: MouseEvent) { event?.stopPropagation(); this.open = !this.open; this.openChange.emit(this.open); } }