diff --git a/apps/web/src/app/vault/core/collection-admin.service.ts b/apps/web/src/app/vault/core/collection-admin.service.ts index 90c00df74f..74f825e1ac 100644 --- a/apps/web/src/app/vault/core/collection-admin.service.ts +++ b/apps/web/src/app/vault/core/collection-admin.service.ts @@ -4,6 +4,8 @@ import { ApiService } from "@bitwarden/common/abstractions/api.service"; import { SelectionReadOnlyRequest } from "@bitwarden/common/admin-console/models/request/selection-read-only.request"; import { CryptoService } from "@bitwarden/common/platform/abstractions/crypto.service"; import { EncString } from "@bitwarden/common/platform/models/domain/enc-string"; +import { CollectionService } from "@bitwarden/common/vault/abstractions/collection.service"; +import { CollectionData } from "@bitwarden/common/vault/models/data/collection.data"; import { CollectionRequest } from "@bitwarden/common/vault/models/request/collection.request"; import { CollectionAccessDetailsResponse, @@ -21,6 +23,7 @@ export class CollectionAdminService { constructor( private apiService: ApiService, private cryptoService: CryptoService, + private collectionService: CollectionService, ) {} async getAll(organizationId: string): Promise { @@ -67,6 +70,12 @@ export class CollectionAdminService { ); } + if (response.assigned) { + await this.collectionService.upsert(new CollectionData(response)); + } else { + await this.collectionService.delete(collection.id); + } + return response; } diff --git a/apps/web/src/app/vault/org-vault/vault.component.ts b/apps/web/src/app/vault/org-vault/vault.component.ts index 74e0adbaef..d9c20261ab 100644 --- a/apps/web/src/app/vault/org-vault/vault.component.ts +++ b/apps/web/src/app/vault/org-vault/vault.component.ts @@ -11,6 +11,7 @@ import { ActivatedRoute, Params, Router } from "@angular/router"; import { BehaviorSubject, combineLatest, + defer, firstValueFrom, lastValueFrom, Observable, @@ -250,7 +251,7 @@ export class VaultComponent implements OnInit, OnDestroy { const allCollectionsWithoutUnassigned$ = combineLatest([ organizationId$.pipe(switchMap((orgId) => this.collectionAdminService.getAll(orgId))), - this.collectionService.getAllDecrypted(), + defer(() => this.collectionService.getAllDecrypted()), ]).pipe( map(([adminCollections, syncCollections]) => { const syncCollectionDict = Object.fromEntries(syncCollections.map((c) => [c.id, c])); diff --git a/libs/common/src/vault/models/response/collection.response.ts b/libs/common/src/vault/models/response/collection.response.ts index 6577f3790a..6a97b78238 100644 --- a/libs/common/src/vault/models/response/collection.response.ts +++ b/libs/common/src/vault/models/response/collection.response.ts @@ -20,12 +20,17 @@ export class CollectionDetailsResponse extends CollectionResponse { readOnly: boolean; manage: boolean; hidePasswords: boolean; + assigned: boolean; constructor(response: any) { super(response); this.readOnly = this.getResponseProperty("ReadOnly") || false; this.manage = this.getResponseProperty("Manage") || false; this.hidePasswords = this.getResponseProperty("HidePasswords") || false; + + // Temporary until the API is updated to return this property in AC-2084 + // For now, we can assume that if the object is 'collectionDetails' then the user is assigned + this.assigned = this.getResponseProperty("object") == "collectionDetails"; } }