diff --git a/apps/web/src/app/tools/reports/pages/cipher-report.component.ts b/apps/web/src/app/tools/reports/pages/cipher-report.component.ts index 792563c4fab..8f6abec46bb 100644 --- a/apps/web/src/app/tools/reports/pages/cipher-report.component.ts +++ b/apps/web/src/app/tools/reports/pages/cipher-report.component.ts @@ -1,24 +1,40 @@ // FIXME: Update this file to be type safe and remove this and next line // @ts-strict-ignore +import { DialogRef } from "@angular/cdk/dialog"; import { Directive, ViewChild, ViewContainerRef, OnDestroy } from "@angular/core"; -import { BehaviorSubject, Observable, Subject, firstValueFrom, switchMap, takeUntil } from "rxjs"; +import { + BehaviorSubject, + lastValueFrom, + Observable, + Subject, + firstValueFrom, + switchMap, + takeUntil, +} from "rxjs"; -import { ModalService } from "@bitwarden/angular/services/modal.service"; import { OrganizationService } from "@bitwarden/common/admin-console/abstractions/organization/organization.service.abstraction"; 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 { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; -import { OrganizationId } from "@bitwarden/common/types/guid"; +import { CipherId, CollectionId, OrganizationId } from "@bitwarden/common/types/guid"; import { CipherService } from "@bitwarden/common/vault/abstractions/cipher.service"; import { SyncService } from "@bitwarden/common/vault/abstractions/sync/sync.service.abstraction"; import { CipherRepromptType } from "@bitwarden/common/vault/enums/cipher-reprompt-type"; import { CipherView } from "@bitwarden/common/vault/models/view/cipher.view"; -import { TableDataSource } from "@bitwarden/components"; -import { PasswordRepromptService } from "@bitwarden/vault"; +import { TableDataSource, DialogService } from "@bitwarden/components"; +import { + CipherFormConfig, + CipherFormConfigService, + PasswordRepromptService, +} from "@bitwarden/vault"; -import { AddEditComponent } from "../../../vault/individual-vault/add-edit.component"; -import { AddEditComponent as OrgAddEditComponent } from "../../../vault/org-vault/add-edit.component"; +import { + VaultItemDialogComponent, + VaultItemDialogMode, + VaultItemDialogResult, +} from "../../../vault/components/vault-item-dialog/vault-item-dialog.component"; +import { AdminConsoleCipherFormConfigService } from "../../../vault/org-vault/services/admin-console-cipher-form-config.service"; @Directive() export class CipherReportComponent implements OnDestroy { @@ -41,15 +57,18 @@ export class CipherReportComponent implements OnDestroy { currentFilterStatus: number | string; protected filterOrgStatus$ = new BehaviorSubject(0); private destroyed$: Subject = new Subject(); + private vaultItemDialogRef?: DialogRef | undefined; constructor( protected cipherService: CipherService, - private modalService: ModalService, + private dialogService: DialogService, protected passwordRepromptService: PasswordRepromptService, protected organizationService: OrganizationService, protected accountService: AccountService, protected i18nService: I18nService, private syncService: SyncService, + private cipherFormConfigService: CipherFormConfigService, + private adminConsoleCipherFormConfigService: AdminConsoleCipherFormConfigService, ) { this.organizations$ = this.accountService.activeAccount$.pipe( getUserId, @@ -134,43 +153,63 @@ export class CipherReportComponent implements OnDestroy { this.loading = false; this.hasLoaded = true; } - async selectCipher(cipher: CipherView) { if (!(await this.repromptCipher(cipher))) { return; } - const type = this.organization != null ? OrgAddEditComponent : AddEditComponent; + if (this.organization) { + const adminCipherFormConfig = await this.adminConsoleCipherFormConfigService.buildConfig( + "edit", + cipher.id as CipherId, + cipher.type, + ); - const [modal, childComponent] = await this.modalService.openViewRef( - type, - this.cipherAddEditModalRef, - (comp: OrgAddEditComponent | AddEditComponent) => { - if (this.organization != null) { - (comp as OrgAddEditComponent).organization = this.organization; - comp.organizationId = this.organization.id; - } + await this.openVaultItemDialog("view", adminCipherFormConfig, cipher); + } else { + const cipherFormConfig = await this.cipherFormConfigService.buildConfig( + "edit", + cipher.id as CipherId, + cipher.type, + ); + await this.openVaultItemDialog("view", cipherFormConfig, cipher); + } + } - comp.cipherId = cipher == null ? null : cipher.id; - // eslint-disable-next-line rxjs/no-async-subscribe - comp.onSavedCipher.subscribe(async () => { - modal.close(); - await this.load(); - }); - // eslint-disable-next-line rxjs/no-async-subscribe - comp.onDeletedCipher.subscribe(async () => { - modal.close(); - await this.load(); - }); - // eslint-disable-next-line rxjs/no-async-subscribe - comp.onRestoredCipher.subscribe(async () => { - modal.close(); - await this.load(); - }); - }, - ); + /** + * Open the combined view / edit dialog for a cipher. + * @param mode - Starting mode of the dialog. + * @param formConfig - Configuration for the form when editing/adding a cipher. + * @param activeCollectionId - The active collection ID. + */ + async openVaultItemDialog( + mode: VaultItemDialogMode, + formConfig: CipherFormConfig, + cipher: CipherView, + activeCollectionId?: CollectionId, + ) { + const disableForm = cipher ? !cipher.edit && !this.organization.canEditAllCiphers : false; - return childComponent; + this.vaultItemDialogRef = VaultItemDialogComponent.open(this.dialogService, { + mode, + formConfig, + activeCollectionId, + disableForm, + }); + + const result = await lastValueFrom(this.vaultItemDialogRef.closed); + this.vaultItemDialogRef = undefined; + + // When the dialog is closed for a premium upgrade, return early as the user + // should be navigated to the subscription settings elsewhere + if (result === VaultItemDialogResult.PremiumUpgrade) { + return; + } + + // If the dialog was closed by deleting the cipher, refresh the report. + if (result === VaultItemDialogResult.Deleted || result === VaultItemDialogResult.Saved) { + await this.load(); + } } protected async setCiphers() { diff --git a/apps/web/src/app/tools/reports/pages/exposed-passwords-report.component.spec.ts b/apps/web/src/app/tools/reports/pages/exposed-passwords-report.component.spec.ts index 47e4a9d3652..23bee585219 100644 --- a/apps/web/src/app/tools/reports/pages/exposed-passwords-report.component.spec.ts +++ b/apps/web/src/app/tools/reports/pages/exposed-passwords-report.component.spec.ts @@ -4,7 +4,6 @@ import { mock, MockProxy } from "jest-mock-extended"; import { of } from "rxjs"; import { I18nPipe } from "@bitwarden/angular/platform/pipes/i18n.pipe"; -import { ModalService } from "@bitwarden/angular/services/modal.service"; import { AuditService } from "@bitwarden/common/abstractions/audit.service"; import { OrganizationService } from "@bitwarden/common/admin-console/abstractions/organization/organization.service.abstraction"; import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; @@ -14,7 +13,10 @@ import { FakeAccountService, mockAccountServiceWith } from "@bitwarden/common/sp import { UserId } from "@bitwarden/common/types/guid"; import { CipherService } from "@bitwarden/common/vault/abstractions/cipher.service"; import { SyncService } from "@bitwarden/common/vault/abstractions/sync/sync.service.abstraction"; -import { PasswordRepromptService } from "@bitwarden/vault"; +import { DialogService } from "@bitwarden/components"; +import { CipherFormConfigService, PasswordRepromptService } from "@bitwarden/vault"; + +import { AdminConsoleCipherFormConfigService } from "../../../vault/org-vault/services/admin-console-cipher-form-config.service"; import { ExposedPasswordsReportComponent } from "./exposed-passwords-report.component"; import { cipherData } from "./reports-ciphers.mock"; @@ -25,10 +27,12 @@ describe("ExposedPasswordsReportComponent", () => { let auditService: MockProxy; let organizationService: MockProxy; let syncServiceMock: MockProxy; + let adminConsoleCipherFormConfigServiceMock: MockProxy; const userId = Utils.newGuid() as UserId; const accountService: FakeAccountService = mockAccountServiceWith(userId); beforeEach(() => { + let cipherFormConfigServiceMock: MockProxy; syncServiceMock = mock(); auditService = mock(); organizationService = mock(); @@ -55,8 +59,8 @@ describe("ExposedPasswordsReportComponent", () => { useValue: accountService, }, { - provide: ModalService, - useValue: mock(), + provide: DialogService, + useValue: mock(), }, { provide: PasswordRepromptService, @@ -70,6 +74,14 @@ describe("ExposedPasswordsReportComponent", () => { provide: I18nService, useValue: mock(), }, + { + provide: CipherFormConfigService, + useValue: cipherFormConfigServiceMock, + }, + { + provide: AdminConsoleCipherFormConfigService, + useValue: adminConsoleCipherFormConfigServiceMock, + }, ], schemas: [], }).compileComponents(); diff --git a/apps/web/src/app/tools/reports/pages/exposed-passwords-report.component.ts b/apps/web/src/app/tools/reports/pages/exposed-passwords-report.component.ts index 1a0d4043b74..900ff3703f0 100644 --- a/apps/web/src/app/tools/reports/pages/exposed-passwords-report.component.ts +++ b/apps/web/src/app/tools/reports/pages/exposed-passwords-report.component.ts @@ -1,6 +1,5 @@ import { Component, OnInit } from "@angular/core"; -import { ModalService } from "@bitwarden/angular/services/modal.service"; import { AuditService } from "@bitwarden/common/abstractions/audit.service"; import { OrganizationService } from "@bitwarden/common/admin-console/abstractions/organization/organization.service.abstraction"; import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; @@ -9,7 +8,10 @@ import { CipherService } from "@bitwarden/common/vault/abstractions/cipher.servi import { SyncService } from "@bitwarden/common/vault/abstractions/sync/sync.service.abstraction"; import { CipherType } from "@bitwarden/common/vault/enums"; import { CipherView } from "@bitwarden/common/vault/models/view/cipher.view"; -import { PasswordRepromptService } from "@bitwarden/vault"; +import { DialogService } from "@bitwarden/components"; +import { CipherFormConfigService, PasswordRepromptService } from "@bitwarden/vault"; + +import { AdminConsoleCipherFormConfigService } from "../../../vault/org-vault/services/admin-console-cipher-form-config.service"; import { CipherReportComponent } from "./cipher-report.component"; @@ -26,20 +28,24 @@ export class ExposedPasswordsReportComponent extends CipherReportComponent imple protected cipherService: CipherService, protected auditService: AuditService, protected organizationService: OrganizationService, + dialogService: DialogService, accountService: AccountService, - modalService: ModalService, passwordRepromptService: PasswordRepromptService, i18nService: I18nService, syncService: SyncService, + cipherFormConfigService: CipherFormConfigService, + adminConsoleCipherFormConfigService: AdminConsoleCipherFormConfigService, ) { super( cipherService, - modalService, + dialogService, passwordRepromptService, organizationService, accountService, i18nService, syncService, + cipherFormConfigService, + adminConsoleCipherFormConfigService, ); } diff --git a/apps/web/src/app/tools/reports/pages/inactive-two-factor-report.component.spec.ts b/apps/web/src/app/tools/reports/pages/inactive-two-factor-report.component.spec.ts index 033b88ea34f..da2395ef1b3 100644 --- a/apps/web/src/app/tools/reports/pages/inactive-two-factor-report.component.spec.ts +++ b/apps/web/src/app/tools/reports/pages/inactive-two-factor-report.component.spec.ts @@ -4,7 +4,6 @@ import { MockProxy, mock } from "jest-mock-extended"; import { of } from "rxjs"; import { I18nPipe } from "@bitwarden/angular/platform/pipes/i18n.pipe"; -import { ModalService } from "@bitwarden/angular/services/modal.service"; import { OrganizationService } from "@bitwarden/common/admin-console/abstractions/organization/organization.service.abstraction"; import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; @@ -14,7 +13,10 @@ import { FakeAccountService, mockAccountServiceWith } from "@bitwarden/common/sp import { UserId } from "@bitwarden/common/types/guid"; import { CipherService } from "@bitwarden/common/vault/abstractions/cipher.service"; import { SyncService } from "@bitwarden/common/vault/abstractions/sync/sync.service.abstraction"; -import { PasswordRepromptService } from "@bitwarden/vault"; +import { DialogService } from "@bitwarden/components"; +import { CipherFormConfigService, PasswordRepromptService } from "@bitwarden/vault"; + +import { AdminConsoleCipherFormConfigService } from "../../../vault/org-vault/services/admin-console-cipher-form-config.service"; import { InactiveTwoFactorReportComponent } from "./inactive-two-factor-report.component"; import { cipherData } from "./reports-ciphers.mock"; @@ -24,10 +26,12 @@ describe("InactiveTwoFactorReportComponent", () => { let fixture: ComponentFixture; let organizationService: MockProxy; let syncServiceMock: MockProxy; + let adminConsoleCipherFormConfigServiceMock: MockProxy; const userId = Utils.newGuid() as UserId; const accountService: FakeAccountService = mockAccountServiceWith(userId); beforeEach(() => { + let cipherFormConfigServiceMock: MockProxy; organizationService = mock(); organizationService.organizations$.mockReturnValue(of([])); syncServiceMock = mock(); @@ -49,8 +53,8 @@ describe("InactiveTwoFactorReportComponent", () => { useValue: accountService, }, { - provide: ModalService, - useValue: mock(), + provide: DialogService, + useValue: mock(), }, { provide: LogService, @@ -68,6 +72,14 @@ describe("InactiveTwoFactorReportComponent", () => { provide: I18nService, useValue: mock(), }, + { + provide: CipherFormConfigService, + useValue: cipherFormConfigServiceMock, + }, + { + provide: AdminConsoleCipherFormConfigService, + useValue: adminConsoleCipherFormConfigServiceMock, + }, ], schemas: [], }).compileComponents(); diff --git a/apps/web/src/app/tools/reports/pages/inactive-two-factor-report.component.ts b/apps/web/src/app/tools/reports/pages/inactive-two-factor-report.component.ts index 52c52041c9d..819be73b8be 100644 --- a/apps/web/src/app/tools/reports/pages/inactive-two-factor-report.component.ts +++ b/apps/web/src/app/tools/reports/pages/inactive-two-factor-report.component.ts @@ -2,7 +2,6 @@ // @ts-strict-ignore import { Component, OnInit } from "@angular/core"; -import { ModalService } from "@bitwarden/angular/services/modal.service"; import { OrganizationService } from "@bitwarden/common/admin-console/abstractions/organization/organization.service.abstraction"; import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; @@ -12,7 +11,10 @@ import { CipherService } from "@bitwarden/common/vault/abstractions/cipher.servi import { SyncService } from "@bitwarden/common/vault/abstractions/sync/sync.service.abstraction"; import { CipherType } from "@bitwarden/common/vault/enums"; import { CipherView } from "@bitwarden/common/vault/models/view/cipher.view"; -import { PasswordRepromptService } from "@bitwarden/vault"; +import { DialogService } from "@bitwarden/components"; +import { CipherFormConfigService, PasswordRepromptService } from "@bitwarden/vault"; + +import { AdminConsoleCipherFormConfigService } from "../../../vault/org-vault/services/admin-console-cipher-form-config.service"; import { CipherReportComponent } from "./cipher-report.component"; @@ -28,21 +30,25 @@ export class InactiveTwoFactorReportComponent extends CipherReportComponent impl constructor( protected cipherService: CipherService, protected organizationService: OrganizationService, + dialogService: DialogService, accountService: AccountService, - modalService: ModalService, private logService: LogService, passwordRepromptService: PasswordRepromptService, i18nService: I18nService, syncService: SyncService, + cipherFormConfigService: CipherFormConfigService, + adminConsoleCipherFormConfigService: AdminConsoleCipherFormConfigService, ) { super( cipherService, - modalService, + dialogService, passwordRepromptService, organizationService, accountService, i18nService, syncService, + cipherFormConfigService, + adminConsoleCipherFormConfigService, ); } diff --git a/apps/web/src/app/tools/reports/pages/organizations/exposed-passwords-report.component.ts b/apps/web/src/app/tools/reports/pages/organizations/exposed-passwords-report.component.ts index 7658da2e793..4f523dbf7ba 100644 --- a/apps/web/src/app/tools/reports/pages/organizations/exposed-passwords-report.component.ts +++ b/apps/web/src/app/tools/reports/pages/organizations/exposed-passwords-report.component.ts @@ -4,7 +4,6 @@ import { Component, OnInit } from "@angular/core"; import { ActivatedRoute } from "@angular/router"; import { firstValueFrom } from "rxjs"; -import { ModalService } from "@bitwarden/angular/services/modal.service"; import { AuditService } from "@bitwarden/common/abstractions/audit.service"; import { getOrganizationById, @@ -17,13 +16,27 @@ import { CipherService } from "@bitwarden/common/vault/abstractions/cipher.servi import { SyncService } from "@bitwarden/common/vault/abstractions/sync/sync.service.abstraction"; import { Cipher } from "@bitwarden/common/vault/models/domain/cipher"; import { CipherView } from "@bitwarden/common/vault/models/view/cipher.view"; -import { PasswordRepromptService } from "@bitwarden/vault"; +import { DialogService } from "@bitwarden/components"; +import { PasswordRepromptService, CipherFormConfigService } from "@bitwarden/vault"; +// eslint-disable-next-line no-restricted-imports +import { RoutedVaultFilterBridgeService } from "../../../../vault/individual-vault/vault-filter/services/routed-vault-filter-bridge.service"; +import { RoutedVaultFilterService } from "../../../../vault/individual-vault/vault-filter/services/routed-vault-filter.service"; +import { AdminConsoleCipherFormConfigService } from "../../../../vault/org-vault/services/admin-console-cipher-form-config.service"; import { ExposedPasswordsReportComponent as BaseExposedPasswordsReportComponent } from "../exposed-passwords-report.component"; @Component({ selector: "app-org-exposed-passwords-report", templateUrl: "../exposed-passwords-report.component.html", + providers: [ + { + provide: CipherFormConfigService, + useClass: AdminConsoleCipherFormConfigService, + }, + AdminConsoleCipherFormConfigService, + RoutedVaultFilterService, + RoutedVaultFilterBridgeService, + ], }) // eslint-disable-next-line rxjs-angular/prefer-takeuntil export class ExposedPasswordsReportComponent @@ -35,23 +48,27 @@ export class ExposedPasswordsReportComponent constructor( cipherService: CipherService, auditService: AuditService, - modalService: ModalService, + dialogService: DialogService, organizationService: OrganizationService, protected accountService: AccountService, private route: ActivatedRoute, passwordRepromptService: PasswordRepromptService, i18nService: I18nService, syncService: SyncService, + cipherFormService: CipherFormConfigService, + adminConsoleCipherFormConfigService: AdminConsoleCipherFormConfigService, ) { super( cipherService, auditService, organizationService, + dialogService, accountService, - modalService, passwordRepromptService, i18nService, syncService, + cipherFormService, + adminConsoleCipherFormConfigService, ); } diff --git a/apps/web/src/app/tools/reports/pages/organizations/inactive-two-factor-report.component.ts b/apps/web/src/app/tools/reports/pages/organizations/inactive-two-factor-report.component.ts index 8db0389108e..8a2fc333c64 100644 --- a/apps/web/src/app/tools/reports/pages/organizations/inactive-two-factor-report.component.ts +++ b/apps/web/src/app/tools/reports/pages/organizations/inactive-two-factor-report.component.ts @@ -4,7 +4,6 @@ import { Component, OnInit } from "@angular/core"; import { ActivatedRoute } from "@angular/router"; import { firstValueFrom, map } from "rxjs"; -import { ModalService } from "@bitwarden/angular/services/modal.service"; import { getOrganizationById, OrganizationService, @@ -15,13 +14,27 @@ import { LogService } from "@bitwarden/common/platform/abstractions/log.service" import { CipherService } from "@bitwarden/common/vault/abstractions/cipher.service"; import { SyncService } from "@bitwarden/common/vault/abstractions/sync/sync.service.abstraction"; import { CipherView } from "@bitwarden/common/vault/models/view/cipher.view"; -import { PasswordRepromptService } from "@bitwarden/vault"; +import { DialogService } from "@bitwarden/components"; +import { CipherFormConfigService, PasswordRepromptService } from "@bitwarden/vault"; +// eslint-disable-next-line no-restricted-imports +import { RoutedVaultFilterBridgeService } from "../../../../vault/individual-vault/vault-filter/services/routed-vault-filter-bridge.service"; +import { RoutedVaultFilterService } from "../../../../vault/individual-vault/vault-filter/services/routed-vault-filter.service"; +import { AdminConsoleCipherFormConfigService } from "../../../../vault/org-vault/services/admin-console-cipher-form-config.service"; import { InactiveTwoFactorReportComponent as BaseInactiveTwoFactorReportComponent } from "../inactive-two-factor-report.component"; @Component({ selector: "app-inactive-two-factor-report", templateUrl: "../inactive-two-factor-report.component.html", + providers: [ + { + provide: CipherFormConfigService, + useClass: AdminConsoleCipherFormConfigService, + }, + AdminConsoleCipherFormConfigService, + RoutedVaultFilterService, + RoutedVaultFilterBridgeService, + ], }) // eslint-disable-next-line rxjs-angular/prefer-takeuntil export class InactiveTwoFactorReportComponent @@ -30,7 +43,7 @@ export class InactiveTwoFactorReportComponent { constructor( cipherService: CipherService, - modalService: ModalService, + dialogService: DialogService, private route: ActivatedRoute, logService: LogService, passwordRepromptService: PasswordRepromptService, @@ -38,16 +51,20 @@ export class InactiveTwoFactorReportComponent accountService: AccountService, i18nService: I18nService, syncService: SyncService, + cipherFormConfigService: CipherFormConfigService, + adminConsoleCipherFormConfigService: AdminConsoleCipherFormConfigService, ) { super( cipherService, organizationService, + dialogService, accountService, - modalService, logService, passwordRepromptService, i18nService, syncService, + cipherFormConfigService, + adminConsoleCipherFormConfigService, ); } diff --git a/apps/web/src/app/tools/reports/pages/organizations/reused-passwords-report.component.ts b/apps/web/src/app/tools/reports/pages/organizations/reused-passwords-report.component.ts index a15078d48f4..1e2f5225d59 100644 --- a/apps/web/src/app/tools/reports/pages/organizations/reused-passwords-report.component.ts +++ b/apps/web/src/app/tools/reports/pages/organizations/reused-passwords-report.component.ts @@ -4,7 +4,6 @@ import { Component, OnInit } from "@angular/core"; import { ActivatedRoute } from "@angular/router"; import { firstValueFrom } from "rxjs"; -import { ModalService } from "@bitwarden/angular/services/modal.service"; import { getOrganizationById, OrganizationService, @@ -16,13 +15,27 @@ import { CipherService } from "@bitwarden/common/vault/abstractions/cipher.servi import { SyncService } from "@bitwarden/common/vault/abstractions/sync/sync.service.abstraction"; import { Cipher } from "@bitwarden/common/vault/models/domain/cipher"; import { CipherView } from "@bitwarden/common/vault/models/view/cipher.view"; -import { PasswordRepromptService } from "@bitwarden/vault"; +import { DialogService } from "@bitwarden/components"; +import { CipherFormConfigService, PasswordRepromptService } from "@bitwarden/vault"; +// eslint-disable-next-line no-restricted-imports +import { RoutedVaultFilterBridgeService } from "../../../../vault/individual-vault/vault-filter/services/routed-vault-filter-bridge.service"; +import { RoutedVaultFilterService } from "../../../../vault/individual-vault/vault-filter/services/routed-vault-filter.service"; +import { AdminConsoleCipherFormConfigService } from "../../../../vault/org-vault/services/admin-console-cipher-form-config.service"; import { ReusedPasswordsReportComponent as BaseReusedPasswordsReportComponent } from "../reused-passwords-report.component"; @Component({ selector: "app-reused-passwords-report", templateUrl: "../reused-passwords-report.component.html", + providers: [ + { + provide: CipherFormConfigService, + useClass: AdminConsoleCipherFormConfigService, + }, + AdminConsoleCipherFormConfigService, + RoutedVaultFilterService, + RoutedVaultFilterBridgeService, + ], }) // eslint-disable-next-line rxjs-angular/prefer-takeuntil export class ReusedPasswordsReportComponent @@ -33,22 +46,26 @@ export class ReusedPasswordsReportComponent constructor( cipherService: CipherService, - modalService: ModalService, + dialogService: DialogService, private route: ActivatedRoute, organizationService: OrganizationService, protected accountService: AccountService, passwordRepromptService: PasswordRepromptService, i18nService: I18nService, syncService: SyncService, + cipherFormConfigService: CipherFormConfigService, + adminConsoleCipherFormConfigService: AdminConsoleCipherFormConfigService, ) { super( cipherService, organizationService, + dialogService, accountService, - modalService, passwordRepromptService, i18nService, syncService, + cipherFormConfigService, + adminConsoleCipherFormConfigService, ); } diff --git a/apps/web/src/app/tools/reports/pages/organizations/unsecured-websites-report.component.ts b/apps/web/src/app/tools/reports/pages/organizations/unsecured-websites-report.component.ts index a67116cc44c..156f3331d32 100644 --- a/apps/web/src/app/tools/reports/pages/organizations/unsecured-websites-report.component.ts +++ b/apps/web/src/app/tools/reports/pages/organizations/unsecured-websites-report.component.ts @@ -5,7 +5,6 @@ import { ActivatedRoute } from "@angular/router"; import { firstValueFrom, map } from "rxjs"; import { CollectionService } from "@bitwarden/admin-console/common"; -import { ModalService } from "@bitwarden/angular/services/modal.service"; import { getOrganizationById, OrganizationService, @@ -15,13 +14,27 @@ import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.servic import { CipherService } from "@bitwarden/common/vault/abstractions/cipher.service"; import { SyncService } from "@bitwarden/common/vault/abstractions/sync/sync.service.abstraction"; import { CipherView } from "@bitwarden/common/vault/models/view/cipher.view"; -import { PasswordRepromptService } from "@bitwarden/vault"; +import { DialogService } from "@bitwarden/components"; +import { CipherFormConfigService, PasswordRepromptService } from "@bitwarden/vault"; +// eslint-disable-next-line no-restricted-imports +import { RoutedVaultFilterBridgeService } from "../../../../vault/individual-vault/vault-filter/services/routed-vault-filter-bridge.service"; +import { RoutedVaultFilterService } from "../../../../vault/individual-vault/vault-filter/services/routed-vault-filter.service"; +import { AdminConsoleCipherFormConfigService } from "../../../../vault/org-vault/services/admin-console-cipher-form-config.service"; import { UnsecuredWebsitesReportComponent as BaseUnsecuredWebsitesReportComponent } from "../unsecured-websites-report.component"; @Component({ selector: "app-unsecured-websites-report", templateUrl: "../unsecured-websites-report.component.html", + providers: [ + { + provide: CipherFormConfigService, + useClass: AdminConsoleCipherFormConfigService, + }, + AdminConsoleCipherFormConfigService, + RoutedVaultFilterService, + RoutedVaultFilterBridgeService, + ], }) // eslint-disable-next-line rxjs-angular/prefer-takeuntil export class UnsecuredWebsitesReportComponent @@ -30,7 +43,7 @@ export class UnsecuredWebsitesReportComponent { constructor( cipherService: CipherService, - modalService: ModalService, + dialogService: DialogService, private route: ActivatedRoute, organizationService: OrganizationService, protected accountService: AccountService, @@ -38,16 +51,20 @@ export class UnsecuredWebsitesReportComponent i18nService: I18nService, syncService: SyncService, collectionService: CollectionService, + cipherFormConfigService: CipherFormConfigService, + adminConsoleCipherFormConfigService: AdminConsoleCipherFormConfigService, ) { super( cipherService, organizationService, + dialogService, accountService, - modalService, passwordRepromptService, i18nService, syncService, collectionService, + cipherFormConfigService, + adminConsoleCipherFormConfigService, ); } diff --git a/apps/web/src/app/tools/reports/pages/organizations/weak-passwords-report.component.ts b/apps/web/src/app/tools/reports/pages/organizations/weak-passwords-report.component.ts index a476a50e736..82abc8561fb 100644 --- a/apps/web/src/app/tools/reports/pages/organizations/weak-passwords-report.component.ts +++ b/apps/web/src/app/tools/reports/pages/organizations/weak-passwords-report.component.ts @@ -4,7 +4,6 @@ import { Component, OnInit } from "@angular/core"; import { ActivatedRoute } from "@angular/router"; import { firstValueFrom } from "rxjs"; -import { ModalService } from "@bitwarden/angular/services/modal.service"; import { getOrganizationById, OrganizationService, @@ -17,13 +16,27 @@ import { CipherService } from "@bitwarden/common/vault/abstractions/cipher.servi import { SyncService } from "@bitwarden/common/vault/abstractions/sync/sync.service.abstraction"; import { Cipher } from "@bitwarden/common/vault/models/domain/cipher"; import { CipherView } from "@bitwarden/common/vault/models/view/cipher.view"; -import { PasswordRepromptService } from "@bitwarden/vault"; +import { DialogService } from "@bitwarden/components"; +import { CipherFormConfigService, PasswordRepromptService } from "@bitwarden/vault"; +// eslint-disable-next-line no-restricted-imports +import { RoutedVaultFilterBridgeService } from "../../../../vault/individual-vault/vault-filter/services/routed-vault-filter-bridge.service"; +import { RoutedVaultFilterService } from "../../../../vault/individual-vault/vault-filter/services/routed-vault-filter.service"; +import { AdminConsoleCipherFormConfigService } from "../../../../vault/org-vault/services/admin-console-cipher-form-config.service"; import { WeakPasswordsReportComponent as BaseWeakPasswordsReportComponent } from "../weak-passwords-report.component"; @Component({ selector: "app-weak-passwords-report", templateUrl: "../weak-passwords-report.component.html", + providers: [ + { + provide: CipherFormConfigService, + useClass: AdminConsoleCipherFormConfigService, + }, + AdminConsoleCipherFormConfigService, + RoutedVaultFilterService, + RoutedVaultFilterBridgeService, + ], }) // eslint-disable-next-line rxjs-angular/prefer-takeuntil export class WeakPasswordsReportComponent @@ -35,23 +48,27 @@ export class WeakPasswordsReportComponent constructor( cipherService: CipherService, passwordStrengthService: PasswordStrengthServiceAbstraction, - modalService: ModalService, + dialogService: DialogService, private route: ActivatedRoute, organizationService: OrganizationService, passwordRepromptService: PasswordRepromptService, i18nService: I18nService, syncService: SyncService, + cipherFormConfigService: CipherFormConfigService, protected accountService: AccountService, + adminConsoleCipherFormConfigService: AdminConsoleCipherFormConfigService, ) { super( cipherService, passwordStrengthService, organizationService, + dialogService, accountService, - modalService, passwordRepromptService, i18nService, syncService, + cipherFormConfigService, + adminConsoleCipherFormConfigService, ); } diff --git a/apps/web/src/app/tools/reports/pages/reused-passwords-report.component.spec.ts b/apps/web/src/app/tools/reports/pages/reused-passwords-report.component.spec.ts index 7c895423159..cd0e21dda9b 100644 --- a/apps/web/src/app/tools/reports/pages/reused-passwords-report.component.spec.ts +++ b/apps/web/src/app/tools/reports/pages/reused-passwords-report.component.spec.ts @@ -4,7 +4,6 @@ import { MockProxy, mock } from "jest-mock-extended"; import { of } from "rxjs"; import { I18nPipe } from "@bitwarden/angular/platform/pipes/i18n.pipe"; -import { ModalService } from "@bitwarden/angular/services/modal.service"; import { OrganizationService } from "@bitwarden/common/admin-console/abstractions/organization/organization.service.abstraction"; import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; @@ -13,7 +12,10 @@ import { FakeAccountService, mockAccountServiceWith } from "@bitwarden/common/sp import { UserId } from "@bitwarden/common/types/guid"; import { CipherService } from "@bitwarden/common/vault/abstractions/cipher.service"; import { SyncService } from "@bitwarden/common/vault/abstractions/sync/sync.service.abstraction"; -import { PasswordRepromptService } from "@bitwarden/vault"; +import { DialogService } from "@bitwarden/components"; +import { CipherFormConfigService, PasswordRepromptService } from "@bitwarden/vault"; + +import { AdminConsoleCipherFormConfigService } from "../../../vault/org-vault/services/admin-console-cipher-form-config.service"; import { cipherData } from "./reports-ciphers.mock"; import { ReusedPasswordsReportComponent } from "./reused-passwords-report.component"; @@ -23,10 +25,12 @@ describe("ReusedPasswordsReportComponent", () => { let fixture: ComponentFixture; let organizationService: MockProxy; let syncServiceMock: MockProxy; + let adminConsoleCipherFormConfigServiceMock: MockProxy; const userId = Utils.newGuid() as UserId; const accountService: FakeAccountService = mockAccountServiceWith(userId); beforeEach(() => { + let cipherFormConfigServiceMock: MockProxy; organizationService = mock(); organizationService.organizations$.mockReturnValue(of([])); syncServiceMock = mock(); @@ -48,8 +52,8 @@ describe("ReusedPasswordsReportComponent", () => { useValue: accountService, }, { - provide: ModalService, - useValue: mock(), + provide: DialogService, + useValue: mock(), }, { provide: PasswordRepromptService, @@ -63,6 +67,14 @@ describe("ReusedPasswordsReportComponent", () => { provide: I18nService, useValue: mock(), }, + { + provide: CipherFormConfigService, + useValue: cipherFormConfigServiceMock, + }, + { + provide: AdminConsoleCipherFormConfigService, + useValue: adminConsoleCipherFormConfigServiceMock, + }, ], schemas: [], }).compileComponents(); diff --git a/apps/web/src/app/tools/reports/pages/reused-passwords-report.component.ts b/apps/web/src/app/tools/reports/pages/reused-passwords-report.component.ts index a5c1c65560b..6d70cc23875 100644 --- a/apps/web/src/app/tools/reports/pages/reused-passwords-report.component.ts +++ b/apps/web/src/app/tools/reports/pages/reused-passwords-report.component.ts @@ -2,7 +2,6 @@ // @ts-strict-ignore import { Component, OnInit } from "@angular/core"; -import { ModalService } from "@bitwarden/angular/services/modal.service"; import { OrganizationService } from "@bitwarden/common/admin-console/abstractions/organization/organization.service.abstraction"; import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; @@ -10,7 +9,10 @@ import { CipherService } from "@bitwarden/common/vault/abstractions/cipher.servi import { SyncService } from "@bitwarden/common/vault/abstractions/sync/sync.service.abstraction"; import { CipherType } from "@bitwarden/common/vault/enums"; import { CipherView } from "@bitwarden/common/vault/models/view/cipher.view"; -import { PasswordRepromptService } from "@bitwarden/vault"; +import { DialogService } from "@bitwarden/components"; +import { CipherFormConfigService, PasswordRepromptService } from "@bitwarden/vault"; + +import { AdminConsoleCipherFormConfigService } from "../../../vault/org-vault/services/admin-console-cipher-form-config.service"; import { CipherReportComponent } from "./cipher-report.component"; @@ -25,20 +27,24 @@ export class ReusedPasswordsReportComponent extends CipherReportComponent implem constructor( protected cipherService: CipherService, protected organizationService: OrganizationService, + dialogService: DialogService, accountService: AccountService, - modalService: ModalService, passwordRepromptService: PasswordRepromptService, i18nService: I18nService, syncService: SyncService, + cipherFormConfigService: CipherFormConfigService, + adminConsoleCipherFormConfigService: AdminConsoleCipherFormConfigService, ) { super( cipherService, - modalService, + dialogService, passwordRepromptService, organizationService, accountService, i18nService, syncService, + cipherFormConfigService, + adminConsoleCipherFormConfigService, ); } diff --git a/apps/web/src/app/tools/reports/pages/unsecured-websites-report.component.spec.ts b/apps/web/src/app/tools/reports/pages/unsecured-websites-report.component.spec.ts index 337aa41b56b..ada582dbf66 100644 --- a/apps/web/src/app/tools/reports/pages/unsecured-websites-report.component.spec.ts +++ b/apps/web/src/app/tools/reports/pages/unsecured-websites-report.component.spec.ts @@ -5,7 +5,6 @@ import { of } from "rxjs"; import { CollectionService } from "@bitwarden/admin-console/common"; import { I18nPipe } from "@bitwarden/angular/platform/pipes/i18n.pipe"; -import { ModalService } from "@bitwarden/angular/services/modal.service"; import { OrganizationService } from "@bitwarden/common/admin-console/abstractions/organization/organization.service.abstraction"; import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; @@ -14,7 +13,10 @@ import { FakeAccountService, mockAccountServiceWith } from "@bitwarden/common/sp import { UserId } from "@bitwarden/common/types/guid"; import { CipherService } from "@bitwarden/common/vault/abstractions/cipher.service"; import { SyncService } from "@bitwarden/common/vault/abstractions/sync/sync.service.abstraction"; -import { PasswordRepromptService } from "@bitwarden/vault"; +import { DialogService } from "@bitwarden/components"; +import { CipherFormConfigService, PasswordRepromptService } from "@bitwarden/vault"; + +import { AdminConsoleCipherFormConfigService } from "../../../vault/org-vault/services/admin-console-cipher-form-config.service"; import { cipherData } from "./reports-ciphers.mock"; import { UnsecuredWebsitesReportComponent } from "./unsecured-websites-report.component"; @@ -25,14 +27,18 @@ describe("UnsecuredWebsitesReportComponent", () => { let organizationService: MockProxy; let syncServiceMock: MockProxy; let collectionService: MockProxy; + let adminConsoleCipherFormConfigService: MockProxy; const userId = Utils.newGuid() as UserId; const accountService: FakeAccountService = mockAccountServiceWith(userId); beforeEach(() => { + let cipherFormConfigServiceMock: MockProxy; organizationService = mock(); organizationService.organizations$.mockReturnValue(of([])); syncServiceMock = mock(); collectionService = mock(); + adminConsoleCipherFormConfigService = mock(); + // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling. // eslint-disable-next-line @typescript-eslint/no-floating-promises TestBed.configureTestingModule({ @@ -51,8 +57,8 @@ describe("UnsecuredWebsitesReportComponent", () => { useValue: accountService, }, { - provide: ModalService, - useValue: mock(), + provide: DialogService, + useValue: mock(), }, { provide: PasswordRepromptService, @@ -70,6 +76,14 @@ describe("UnsecuredWebsitesReportComponent", () => { provide: CollectionService, useValue: collectionService, }, + { + provide: CipherFormConfigService, + useValue: cipherFormConfigServiceMock, + }, + { + provide: AdminConsoleCipherFormConfigService, + useValue: adminConsoleCipherFormConfigService, + }, ], schemas: [], }).compileComponents(); diff --git a/apps/web/src/app/tools/reports/pages/unsecured-websites-report.component.ts b/apps/web/src/app/tools/reports/pages/unsecured-websites-report.component.ts index 350e5c03980..11df326766b 100644 --- a/apps/web/src/app/tools/reports/pages/unsecured-websites-report.component.ts +++ b/apps/web/src/app/tools/reports/pages/unsecured-websites-report.component.ts @@ -1,7 +1,6 @@ import { Component, OnInit } from "@angular/core"; import { CollectionService, Collection } from "@bitwarden/admin-console/common"; -import { ModalService } from "@bitwarden/angular/services/modal.service"; import { OrganizationService } from "@bitwarden/common/admin-console/abstractions/organization/organization.service.abstraction"; import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; @@ -9,7 +8,10 @@ import { CipherService } from "@bitwarden/common/vault/abstractions/cipher.servi import { SyncService } from "@bitwarden/common/vault/abstractions/sync/sync.service.abstraction"; import { CipherType } from "@bitwarden/common/vault/enums"; import { CipherView } from "@bitwarden/common/vault/models/view/cipher.view"; -import { PasswordRepromptService } from "@bitwarden/vault"; +import { DialogService } from "@bitwarden/components"; +import { CipherFormConfigService, PasswordRepromptService } from "@bitwarden/vault"; + +import { AdminConsoleCipherFormConfigService } from "../../../vault/org-vault/services/admin-console-cipher-form-config.service"; import { CipherReportComponent } from "./cipher-report.component"; @@ -23,21 +25,25 @@ export class UnsecuredWebsitesReportComponent extends CipherReportComponent impl constructor( protected cipherService: CipherService, protected organizationService: OrganizationService, + dialogService: DialogService, accountService: AccountService, - modalService: ModalService, passwordRepromptService: PasswordRepromptService, i18nService: I18nService, syncService: SyncService, private collectionService: CollectionService, + cipherFormConfigService: CipherFormConfigService, + adminConsoleCipherFormConfigService: AdminConsoleCipherFormConfigService, ) { super( cipherService, - modalService, + dialogService, passwordRepromptService, organizationService, accountService, i18nService, syncService, + cipherFormConfigService, + adminConsoleCipherFormConfigService, ); } diff --git a/apps/web/src/app/tools/reports/pages/weak-passwords-report.component.spec.ts b/apps/web/src/app/tools/reports/pages/weak-passwords-report.component.spec.ts index 3d19511a252..739deee286a 100644 --- a/apps/web/src/app/tools/reports/pages/weak-passwords-report.component.spec.ts +++ b/apps/web/src/app/tools/reports/pages/weak-passwords-report.component.spec.ts @@ -4,7 +4,6 @@ import { mock, MockProxy } from "jest-mock-extended"; import { of } from "rxjs"; import { I18nPipe } from "@bitwarden/angular/platform/pipes/i18n.pipe"; -import { ModalService } from "@bitwarden/angular/services/modal.service"; import { OrganizationService } from "@bitwarden/common/admin-console/abstractions/organization/organization.service.abstraction"; import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; @@ -14,7 +13,10 @@ import { PasswordStrengthServiceAbstraction } from "@bitwarden/common/tools/pass import { UserId } from "@bitwarden/common/types/guid"; import { CipherService } from "@bitwarden/common/vault/abstractions/cipher.service"; import { SyncService } from "@bitwarden/common/vault/abstractions/sync/sync.service.abstraction"; -import { PasswordRepromptService } from "@bitwarden/vault"; +import { DialogService } from "@bitwarden/components"; +import { CipherFormConfigService, PasswordRepromptService } from "@bitwarden/vault"; + +import { AdminConsoleCipherFormConfigService } from "../../../vault/org-vault/services/admin-console-cipher-form-config.service"; import { cipherData } from "./reports-ciphers.mock"; import { WeakPasswordsReportComponent } from "./weak-passwords-report.component"; @@ -25,10 +27,12 @@ describe("WeakPasswordsReportComponent", () => { let passwordStrengthService: MockProxy; let organizationService: MockProxy; let syncServiceMock: MockProxy; + let adminConsoleCipherFormConfigServiceMock: MockProxy; const userId = Utils.newGuid() as UserId; const accountService: FakeAccountService = mockAccountServiceWith(userId); beforeEach(() => { + let cipherFormConfigServiceMock: MockProxy; syncServiceMock = mock(); passwordStrengthService = mock(); organizationService = mock(); @@ -55,8 +59,8 @@ describe("WeakPasswordsReportComponent", () => { useValue: accountService, }, { - provide: ModalService, - useValue: mock(), + provide: DialogService, + useValue: mock(), }, { provide: PasswordRepromptService, @@ -70,6 +74,15 @@ describe("WeakPasswordsReportComponent", () => { provide: I18nService, useValue: mock(), }, + { + provide: CipherFormConfigService, + useValue: cipherFormConfigServiceMock, + }, + + { + provide: AdminConsoleCipherFormConfigService, + useValue: adminConsoleCipherFormConfigServiceMock, + }, ], schemas: [], }).compileComponents(); diff --git a/apps/web/src/app/tools/reports/pages/weak-passwords-report.component.ts b/apps/web/src/app/tools/reports/pages/weak-passwords-report.component.ts index c374ecd0e4a..3c9186267ca 100644 --- a/apps/web/src/app/tools/reports/pages/weak-passwords-report.component.ts +++ b/apps/web/src/app/tools/reports/pages/weak-passwords-report.component.ts @@ -2,7 +2,6 @@ // @ts-strict-ignore import { Component, OnInit } from "@angular/core"; -import { ModalService } from "@bitwarden/angular/services/modal.service"; import { OrganizationService } from "@bitwarden/common/admin-console/abstractions/organization/organization.service.abstraction"; import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; @@ -12,8 +11,10 @@ import { CipherService } from "@bitwarden/common/vault/abstractions/cipher.servi import { SyncService } from "@bitwarden/common/vault/abstractions/sync/sync.service.abstraction"; import { CipherType } from "@bitwarden/common/vault/enums"; import { CipherView } from "@bitwarden/common/vault/models/view/cipher.view"; -import { BadgeVariant } from "@bitwarden/components"; -import { PasswordRepromptService } from "@bitwarden/vault"; +import { BadgeVariant, DialogService } from "@bitwarden/components"; +import { CipherFormConfigService, PasswordRepromptService } from "@bitwarden/vault"; + +import { AdminConsoleCipherFormConfigService } from "../../../vault/org-vault/services/admin-console-cipher-form-config.service"; import { CipherReportComponent } from "./cipher-report.component"; @@ -33,20 +34,24 @@ export class WeakPasswordsReportComponent extends CipherReportComponent implemen protected cipherService: CipherService, protected passwordStrengthService: PasswordStrengthServiceAbstraction, protected organizationService: OrganizationService, + dialogService: DialogService, protected accountService: AccountService, - modalService: ModalService, passwordRepromptService: PasswordRepromptService, i18nService: I18nService, syncService: SyncService, + cipherFormConfigService: CipherFormConfigService, + adminConsoleCipherFormConfigService: AdminConsoleCipherFormConfigService, ) { super( cipherService, - modalService, + dialogService, passwordRepromptService, organizationService, accountService, i18nService, syncService, + cipherFormConfigService, + adminConsoleCipherFormConfigService, ); } diff --git a/apps/web/src/app/tools/reports/reports.module.ts b/apps/web/src/app/tools/reports/reports.module.ts index 10849d56d9c..358768e71ee 100644 --- a/apps/web/src/app/tools/reports/reports.module.ts +++ b/apps/web/src/app/tools/reports/reports.module.ts @@ -1,10 +1,15 @@ import { CommonModule } from "@angular/common"; import { NgModule } from "@angular/core"; +import { CipherFormConfigService, DefaultCipherFormConfigService } from "@bitwarden/vault"; + import { HeaderModule } from "../../layouts/header/header.module"; import { SharedModule } from "../../shared"; import { OrganizationBadgeModule } from "../../vault/individual-vault/organization-badge/organization-badge.module"; import { PipesModule } from "../../vault/individual-vault/pipes/pipes.module"; +import { RoutedVaultFilterBridgeService } from "../../vault/individual-vault/vault-filter/services/routed-vault-filter-bridge.service"; +import { RoutedVaultFilterService } from "../../vault/individual-vault/vault-filter/services/routed-vault-filter.service"; +import { AdminConsoleCipherFormConfigService } from "../../vault/org-vault/services/admin-console-cipher-form-config.service"; import { BreachReportComponent } from "./pages/breach-report.component"; import { ExposedPasswordsReportComponent } from "./pages/exposed-passwords-report.component"; @@ -37,5 +42,14 @@ import { ReportsSharedModule } from "./shared"; UnsecuredWebsitesReportComponent, WeakPasswordsReportComponent, ], + providers: [ + { + provide: CipherFormConfigService, + useClass: DefaultCipherFormConfigService, + }, + RoutedVaultFilterService, + AdminConsoleCipherFormConfigService, + RoutedVaultFilterBridgeService, + ], }) export class ReportsModule {} diff --git a/apps/web/src/app/vault/components/vault-item-dialog/vault-item-dialog.component.ts b/apps/web/src/app/vault/components/vault-item-dialog/vault-item-dialog.component.ts index 3dc3b8f9f84..59275eb4e7c 100644 --- a/apps/web/src/app/vault/components/vault-item-dialog/vault-item-dialog.component.ts +++ b/apps/web/src/app/vault/components/vault-item-dialog/vault-item-dialog.component.ts @@ -90,7 +90,7 @@ export interface VaultItemDialogParams { /** * Function to restore a cipher from the trash. */ - restore: (c: CipherView) => Promise; + restore?: (c: CipherView) => Promise; } export enum VaultItemDialogResult { @@ -387,7 +387,7 @@ export class VaultItemDialogComponent implements OnInit, OnDestroy { } restore = async () => { - await this.params.restore(this.cipher); + await this.params.restore?.(this.cipher); this.dialogRef.close(VaultItemDialogResult.Restored); }; diff --git a/apps/web/src/app/vault/individual-vault/attachments-v2.component.ts b/apps/web/src/app/vault/individual-vault/attachments-v2.component.ts index 68bceb55985..81f14d5aa25 100644 --- a/apps/web/src/app/vault/individual-vault/attachments-v2.component.ts +++ b/apps/web/src/app/vault/individual-vault/attachments-v2.component.ts @@ -8,7 +8,7 @@ import { CipherId } from "@bitwarden/common/types/guid"; import { DialogService } from "@bitwarden/components"; import { CipherAttachmentsComponent } from "@bitwarden/vault"; -import { SharedModule } from "../../shared"; +import { SharedModule } from "../../shared/shared.module"; export interface AttachmentsDialogParams { cipherId: CipherId;