From 26b2c5a03e3837b583f46ca594029bd877d33ca7 Mon Sep 17 00:00:00 2001 From: Leslie Xiong Date: Tue, 6 Jan 2026 17:12:25 -0500 Subject: [PATCH] PR followup: - removed `DesktopRoutedVaultFilterBridgeService` - added 'baseRoute' injectable in `RoutedVaultFilterService` - removed `folderAddEditModalRef` from `VaultComponent` --- ...ktop-routed-vault-filter-bridge.service.ts | 38 ------------------- .../src/app/services/services.module.ts | 11 ++++-- .../vault-filter/vault-filter.component.ts | 4 +- .../src/vault/app/vault-v3/vault.component.ts | 18 ++------- .../services/routed-vault-filter.service.ts | 11 +++++- 5 files changed, 22 insertions(+), 60 deletions(-) delete mode 100644 apps/desktop/src/app/services/desktop-routed-vault-filter-bridge.service.ts diff --git a/apps/desktop/src/app/services/desktop-routed-vault-filter-bridge.service.ts b/apps/desktop/src/app/services/desktop-routed-vault-filter-bridge.service.ts deleted file mode 100644 index 2eadb6462ca..00000000000 --- a/apps/desktop/src/app/services/desktop-routed-vault-filter-bridge.service.ts +++ /dev/null @@ -1,38 +0,0 @@ -import { Injectable } from "@angular/core"; -import { Router } from "@angular/router"; - -import { - RoutedVaultFilterService, - RoutedVaultFilterBridgeService, - RoutedVaultFilterModel, - VaultFilterServiceAbstraction as VaultFilterService, -} from "@bitwarden/vault"; - -/** - * Desktop-specific extension of RoutedVaultFilterBridgeService that ensures - * vault filter navigation always goes to the /new-vault route. - */ -@Injectable() -export class DesktopRoutedVaultFilterBridgeService extends RoutedVaultFilterBridgeService { - private static readonly VAULT_ROUTE = "/new-vault"; - private readonly desktopRouter: Router; - private readonly desktopRoutedVaultFilterService: RoutedVaultFilterService; - - constructor( - router: Router, - routedVaultFilterService: RoutedVaultFilterService, - vaultFilterService: VaultFilterService, - ) { - super(router, routedVaultFilterService, vaultFilterService); - this.desktopRouter = router; - this.desktopRoutedVaultFilterService = routedVaultFilterService; - } - - override navigate(filter: RoutedVaultFilterModel) { - const extras = this.desktopRoutedVaultFilterService.createRoute(filter)[1]; - const vaultCommands = [DesktopRoutedVaultFilterBridgeService.VAULT_ROUTE]; - - // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling. - void this.desktopRouter.navigate(vaultCommands, extras); - } -} diff --git a/apps/desktop/src/app/services/services.module.ts b/apps/desktop/src/app/services/services.module.ts index 895f62bba2e..59a3e3b289e 100644 --- a/apps/desktop/src/app/services/services.module.ts +++ b/apps/desktop/src/app/services/services.module.ts @@ -126,6 +126,8 @@ import { VaultFilterServiceAbstraction, VaultFilterService, RoutedVaultFilterService, + RoutedVaultFilterBridgeService, + VAULT_FILTER_BASE_ROUTE, } from "@bitwarden/vault"; import { DesktopLoginApprovalDialogComponentService } from "../../auth/login/desktop-login-approval-dialog-component.service"; @@ -161,7 +163,6 @@ import { NativeMessagingService } from "../../services/native-messaging.service" import { SearchBarService } from "../layout/search/search-bar.service"; import { DesktopFileDownloadService } from "./desktop-file-download.service"; -import { DesktopRoutedVaultFilterBridgeService } from "./desktop-routed-vault-filter-bridge.service"; import { InitService } from "./init.service"; import { NativeMessagingManifestService } from "./native-messaging-manifest.service"; import { DesktopSetInitialPasswordService } from "./set-initial-password/desktop-set-initial-password.service"; @@ -533,14 +534,18 @@ const safeProviders: SafeProvider[] = [ ConfigService, ], }), + safeProvider({ + provide: VAULT_FILTER_BASE_ROUTE, + useValue: "/new-vault", + }), safeProvider({ provide: RoutedVaultFilterService, useClass: RoutedVaultFilterService, deps: [ActivatedRoute], }), safeProvider({ - provide: DesktopRoutedVaultFilterBridgeService, - useClass: DesktopRoutedVaultFilterBridgeService, + provide: RoutedVaultFilterBridgeService, + useClass: RoutedVaultFilterBridgeService, deps: [Router, RoutedVaultFilterService, VaultFilterServiceAbstraction], }), ]; diff --git a/apps/desktop/src/vault/app/vault-v3/vault-filter/vault-filter.component.ts b/apps/desktop/src/vault/app/vault-v3/vault-filter/vault-filter.component.ts index 3d6a481911d..aa54c736024 100644 --- a/apps/desktop/src/vault/app/vault-v3/vault-filter/vault-filter.component.ts +++ b/apps/desktop/src/vault/app/vault-v3/vault-filter/vault-filter.component.ts @@ -21,9 +21,9 @@ import { VaultFilter, VaultFilterServiceAbstraction as VaultFilterService, AddEditFolderDialogComponent, + RoutedVaultFilterBridgeService, } from "@bitwarden/vault"; -import { DesktopRoutedVaultFilterBridgeService } from "../../../../app/services/desktop-routed-vault-filter-bridge.service"; import { DesktopPremiumUpgradePromptService } from "../../../../services/desktop-premium-upgrade-prompt.service"; import { CollectionFilterComponent } from "./filters/collection-filter.component"; @@ -56,7 +56,7 @@ import { TypeFilterComponent } from "./filters/type-filter.component"; ], }) export class VaultFilterComponent implements OnInit { - private routedVaultFilterBridgeService = inject(DesktopRoutedVaultFilterBridgeService); + private routedVaultFilterBridgeService = inject(RoutedVaultFilterBridgeService); private vaultFilterService: VaultFilterService = inject(VaultFilterService); private accountService: AccountService = inject(AccountService); private cipherArchiveService: CipherArchiveService = inject(CipherArchiveService); diff --git a/apps/desktop/src/vault/app/vault-v3/vault.component.ts b/apps/desktop/src/vault/app/vault-v3/vault.component.ts index 81761a4a88c..f4267036a2b 100644 --- a/apps/desktop/src/vault/app/vault-v3/vault.component.ts +++ b/apps/desktop/src/vault/app/vault-v3/vault.component.ts @@ -1,13 +1,5 @@ import { CommonModule } from "@angular/common"; -import { - ChangeDetectorRef, - Component, - NgZone, - OnDestroy, - OnInit, - ViewChild, - ViewContainerRef, -} from "@angular/core"; +import { ChangeDetectorRef, Component, NgZone, OnDestroy, OnInit, ViewChild } from "@angular/core"; import { ActivatedRoute, Router } from "@angular/router"; import { firstValueFrom, @@ -83,10 +75,10 @@ import { ArchiveCipherUtilitiesService, VaultFilter, VaultFilterServiceAbstraction as VaultFilterService, + RoutedVaultFilterBridgeService, } from "@bitwarden/vault"; import { SearchBarService } from "../../../app/layout/search/search-bar.service"; -import { DesktopRoutedVaultFilterBridgeService } from "../../../app/services/desktop-routed-vault-filter-bridge.service"; import { DesktopCredentialGenerationService } from "../../../services/desktop-cipher-form-generator.service"; import { DesktopPremiumUpgradePromptService } from "../../../services/desktop-premium-upgrade-prompt.service"; import { invokeMenu, RendererMenuItem } from "../../../utils"; @@ -144,10 +136,6 @@ export class VaultComponent implements OnInit, OnDestroy, CopyClickListener { vaultItemsComponent: VaultItemsV2Component | null = null; // FIXME(https://bitwarden.atlassian.net/browse/CL-903): Migrate to Signals // eslint-disable-next-line @angular-eslint/prefer-signals - @ViewChild("folderAddEdit", { read: ViewContainerRef, static: true }) - folderAddEditModalRef: ViewContainerRef | null = null; - // FIXME(https://bitwarden.atlassian.net/browse/CL-903): Migrate to Signals - // eslint-disable-next-line @angular-eslint/prefer-signals @ViewChild(CipherFormComponent) cipherFormComponent: CipherFormComponent | null = null; @@ -221,7 +209,7 @@ export class VaultComponent implements OnInit, OnDestroy, CopyClickListener { private cipherArchiveService: CipherArchiveService, private policyService: PolicyService, private archiveCipherUtilitiesService: ArchiveCipherUtilitiesService, - private routedVaultFilterBridgeService: DesktopRoutedVaultFilterBridgeService, + private routedVaultFilterBridgeService: RoutedVaultFilterBridgeService, private vaultFilterService: VaultFilterService, ) {} diff --git a/libs/vault/src/services/routed-vault-filter.service.ts b/libs/vault/src/services/routed-vault-filter.service.ts index ae928f8583f..9005d507da7 100644 --- a/libs/vault/src/services/routed-vault-filter.service.ts +++ b/libs/vault/src/services/routed-vault-filter.service.ts @@ -1,14 +1,20 @@ -import { Injectable, OnDestroy } from "@angular/core"; +import { Injectable, OnDestroy, inject } from "@angular/core"; import { ActivatedRoute, NavigationExtras } from "@angular/router"; import { combineLatest, map, Observable, Subject, takeUntil } from "rxjs"; import { CollectionId, OrganizationId } from "@bitwarden/common/types/guid"; +import { SafeInjectionToken } from "@bitwarden/ui-common"; import { isRoutedVaultFilterItemType, RoutedVaultFilterModel, } from "../models/routed-vault-filter.model"; +/** + * Injection token for the base route path used in vault filter navigation. + */ +export const VAULT_FILTER_BASE_ROUTE = new SafeInjectionToken("VaultFilterBaseRoute"); + /** * This service is an abstraction layer on top of ActivatedRoute that * encapsulates the logic of how filters are stored in the URL. @@ -19,6 +25,7 @@ import { @Injectable() export class RoutedVaultFilterService implements OnDestroy { private onDestroy = new Subject(); + private baseRoute: string = inject(VAULT_FILTER_BASE_ROUTE, { optional: true }) ?? ""; /** * Filter values extracted from the URL. @@ -64,7 +71,7 @@ export class RoutedVaultFilterService implements OnDestroy { * @returns route that can be used with Router or RouterLink */ createRoute(filter: RoutedVaultFilterModel): [commands: any[], extras?: NavigationExtras] { - const commands: string[] = []; + const commands: string[] = this.baseRoute ? [this.baseRoute] : []; const extras: NavigationExtras = { queryParams: { collectionId: filter.collectionId ?? null,