[PM-40252] feat: migrate shared vault components to shared-folder terminology#21967
[PM-40252] feat: migrate shared vault components to shared-folder terminology#21967jaasen-livefront wants to merge 15 commits into
Conversation
…der terminology Behind the vfo1-foundation flag, migrate shared libs/vault components to shared-folder / my-folder terminology via the vfo1I18n pipe and Vfo1TerminologyService: item detail aria/title, cipher-form labels, new-item menu + button label, vault batch-bar assign label, and the assign-collections dialog labels + submit toasts. Adds the compound shared-folder localization keys to web/browser/desktop. Per copy decision, personal-folder action phrases stay "folder" (only the entity label flips to "My folder"). Icon swaps and the query-param rename are handled in separate tickets.
…shared-folder terminology VaultFilterService.getCollectionFilterHead / getFolderFilterHead now read Vfo1TerminologyService.enabled() and use the sharedFolders / myFolders i18n keys (the head node name is rendered via the i18n pipe) when the flag is on, falling back to collections / folders when off. Updates the desktop provider deps array (web modules resolve the root service via reflection).
…lder terminology The desktop cipher-row menu item and assign-collections dialog title now use the vfo1I18n pipe (assignToCollections -> assignToSharedFolders) when the vfo1-foundation flag is on. Event-type discriminators are unchanged.
The create-action menu item reads better as "Folder" than "My folder", per the copy decision that personal-folder action phrases stay "folder". The Collection item still flips to "Shared folder" under the flag.
…folder terminology The web cipher-row three-dot menu, bulk-actions menu, and assign-collections dialog title now use the vfo1I18n pipe (assignToCollections -> assignToSharedFolders) when the vfo1-foundation flag is on. Vfo1I18nPipe added to VaultItemsModule and the standalone web dialog component.
🤖 Bitwarden Claude Code ReviewOverall Assessment: APPROVE Reviewed the migration of shared Code Review DetailsNo blocking findings.
|
There was a problem hiding this comment.
Pull request overview
Migrates shared libs/vault UI surfaces (consumed by web/browser/desktop) from collection/folder terminology to shared-folder / my-folder terminology behind the VFO1Foundation feature flag, using Vfo1I18nPipe and Vfo1TerminologyService, and adds the necessary English localization keys in each client.
Changes:
- Updated vault filter tree head identifiers and multiple vault UI labels/toasts to switch terminology based on
Vfo1TerminologyService.enabled(). - Introduced/expanded usage of
Vfo1I18nPipein templates and added new shared-folder localization keys to web/desktop/browseren. - Applied repo-wide formatting improvements (primarily union-type and template literal formatting) across multiple libraries/apps.
Reviewed changes
Copilot reviewed 90 out of 91 changed files in this pull request and generated no comments.
Show a summary per file
| File | Description |
|---|---|
| libs/vault/src/services/vault-filter.service.ts | Switch filter head names via flag |
| libs/vault/src/services/vault-filter.service.spec.ts | Add tests for head naming |
| libs/vault/src/models/vault-filter-section.type.ts | Union type formatting only |
| libs/vault/src/components/vault-batch-bar/vault-batch-action.component.ts | Flagged i18n key for batch action |
| libs/vault/src/components/vault-batch-bar/vault-batch-action.component.spec.ts | Test flagged batch action label |
| libs/vault/src/components/new-cipher-menu/new-cipher-menu.component.ts | Flagged keys for “new/add” labels |
| libs/vault/src/components/new-cipher-menu/new-cipher-menu.component.html | Use vfo1I18n for menu label |
| libs/vault/src/components/assign-collections.component.ts | Flagged toast/success keys |
| libs/vault/src/components/assign-collections.component.spec.ts | Stabilize ConfigService mock for flag |
| libs/vault/src/components/assign-collections.component.html | Use vfo1I18n for dialog text |
| libs/vault/src/cipher-view/item-details/item-details-v2.component.ts | Flagged aria/title terminology |
| libs/vault/src/cipher-form/components/item-details/item-details-section.component.ts | Add Vfo1I18nPipe import |
| libs/vault/src/cipher-form/components/item-details/item-details-section.component.html | Use vfo1I18n for labels |
| libs/tools/generator/core/src/types/generator-constraints.ts | Union type formatting only |
| libs/tools/generator/core/src/metadata/type.ts | Union type formatting only |
| libs/tools/generator/core/src/metadata/profile-metadata.ts | Union type formatting only |
| libs/tools/export-vault-core/src/types/bitwarden-json-export-types.ts | Union type formatting only |
| libs/logging-angular/README.md | Example formatting only |
| libs/key-management-ui/src/key-rotation/key-rotation-dialog.component.ts | Union/arrow formatting only |
| libs/importer/src/models/import-options.ts | Union type formatting only |
| libs/importer/src/importers/protonpass/types/protonpass-json-type.ts | Union type formatting only |
| libs/importer/src/importers/enpass/types/enpass-item-templates.ts | Union type formatting only |
| libs/components/src/utils/function-to-observable.ts | Union type formatting only |
| libs/components/src/tooltip/tooltip-positions.ts | Union type formatting only |
| libs/components/src/icon-tile/icon-tile.component.ts | Union type formatting only |
| libs/components/src/berry/berry.component.ts | Union type formatting only |
| libs/common/src/tools/integration/README.md | Type example formatting only |
| libs/common/src/services/api.service.ts | Union type formatting only |
| libs/common/src/key-management/session-timeout/types/session-timeout.type.ts | Union type formatting only |
| libs/common/src/key-management/encrypted-migrator/migrations/encrypted-migration.ts | Union type formatting only |
| libs/common/src/billing/services/subscription-pricing.service.ts | Minor map formatting only |
| libs/common/src/auth/models/response/identity-response.ts | Union type formatting only |
| libs/common/src/admin-console/models/data/encrypted-organization-key.data.ts | Union type formatting only |
| libs/common/src/abstractions/api.service.ts | Union type formatting only |
| libs/auth/src/angular/user-verification/user-verification-form-input.component.ts | Union type formatting only |
| libs/auth/src/angular/two-factor-auth/two-factor-auth.component.ts | Union type formatting only |
| libs/auth/src/angular/sso/sso-component.service.ts | Union type formatting only |
| libs/auth/src/angular/login-via-auth-request/login-via-auth-request.component.ts | Union type formatting only |
| libs/auth/src/angular/input-password/input-password.component.ts | Union type formatting only |
| bitwarden_license/bit-web/src/app/billing/providers/warnings/types/provider-warnings.ts | Union type formatting only |
| bitwarden_license/bit-common/src/dirt/reports/risk-insights/services/domain/risk-insights-report.service.ts | Minor map formatting only |
| apps/web/src/locales/en/messages.json | Add shared-folder localization keys |
| apps/web/src/app/vault/components/vault-items/vault-items.module.ts | Import Vfo1I18nPipe |
| apps/web/src/app/vault/components/vault-items/vault-items.component.html | Use vfo1I18n for assign label |
| apps/web/src/app/vault/components/vault-items/vault-cipher-row.component.html | Use vfo1I18n for assign label |
| apps/web/src/app/vault/components/assign-collections/assign-collections-web.component.ts | Add Vfo1I18nPipe to imports |
| apps/web/src/app/vault/components/assign-collections/assign-collections-web.component.html | Use vfo1I18n in dialog title |
| apps/web/src/app/tools/send/send.component.ts | Union type formatting only |
| apps/web/src/app/billing/trial-initiation/complete-trial-initiation/complete-trial-initiation.component.ts | Union type formatting only |
| apps/web/src/app/billing/payment/components/edit-billing-address-dialog.component.ts | Union type formatting only |
| apps/web/src/app/billing/organizations/change-plan-dialog.component.ts | Conditional formatting only |
| apps/web/src/app/auth/settings/webauthn-login-settings/create-credential-dialog/create-credential-dialog.component.ts | Union type formatting only |
| apps/web/src/app/auth/settings/two-factor/two-factor-setup-duo.component.ts | Union type formatting only |
| apps/web/src/app/admin-console/organizations/collections/vault-filter/vault-filter.service.ts | Pass terminology service to base |
| apps/desktop/src/vault/app/vault/assign-collections/assign-collections-desktop.component.ts | Add Vfo1I18nPipe to imports |
| apps/desktop/src/vault/app/vault/assign-collections/assign-collections-desktop.component.html | Use vfo1I18n in dialog title |
| apps/desktop/src/vault/app/vault-v3/vault-items/vault-item-event.ts | Union type formatting only |
| apps/desktop/src/vault/app/vault-v3/vault-items/vault-cipher-row.component.ts | Add Vfo1I18nPipe to imports |
| apps/desktop/src/vault/app/vault-v3/vault-items/vault-cipher-row.component.html | Use vfo1I18n for assign label |
| apps/desktop/src/locales/en/messages.json | Add shared-folder localization keys |
| apps/desktop/src/app/services/services.module.ts | Ensure terminology service provided |
| apps/desktop/native-messaging-test-runner/src/native-message.service.ts | Union type formatting only |
| apps/cli/src/tools/send/commands/create.command.ts | Union type formatting only |
| apps/browser/src/vault/popup/services/vault-popup-list-filters.service.spec.ts | Map formatting only |
| apps/browser/src/platform/utils/web-ext-sender.ts | Union type formatting only |
| apps/browser/src/background/main.background.ts | switchMap formatting only |
| apps/browser/src/autofill/types/index.ts | Union type formatting only |
| apps/browser/src/autofill/overlay/inline-menu/abstractions/autofill-inline-menu-page-element.ts | Union type formatting only |
| apps/browser/src/autofill/fido2/services/browser-fido2-user-interface.service.ts | Comment/union formatting only |
| apps/browser/src/autofill/fido2/content/messaging/messenger.ts | Union type formatting only |
| apps/browser/src/autofill/fido2/content/fido2-content-script.ts | Union type formatting only |
| apps/browser/src/autofill/fido2/content/fido2-content-script.spec.ts | Union type formatting only |
| apps/browser/src/autofill/content/components/option-selection/option-selection.ts | Template formatting only |
| apps/browser/src/autofill/content/components/option-selection/option-items.ts | Template formatting only |
| apps/browser/src/autofill/content/components/notification/header.ts | Template formatting only |
| apps/browser/src/autofill/content/components/notification/footer.ts | Template formatting only |
| apps/browser/src/autofill/content/components/notification/container.ts | Template formatting only |
| apps/browser/src/autofill/content/components/notification/confirmation/message.ts | Template formatting only |
| apps/browser/src/autofill/content/components/notification/confirmation/container.ts | Template formatting only |
| apps/browser/src/autofill/content/components/notification/confirmation/body.ts | Template formatting only |
| apps/browser/src/autofill/content/components/notification/at-risk-password/message.ts | Template formatting only |
| apps/browser/src/autofill/content/components/notification/at-risk-password/container.ts | Template formatting only |
| apps/browser/src/autofill/content/components/notification/at-risk-password/body.ts | Template formatting only |
| apps/browser/src/autofill/content/components/inline-menu/prompt.ts | Template formatting only |
| apps/browser/src/autofill/content/components/cipher/cipher-info.ts | Template formatting only |
| apps/browser/src/autofill/content/components/buttons/option-selection-button.ts | Template formatting only |
| apps/browser/src/autofill/content/components/buttons/edit-button.ts | Template formatting only |
| apps/browser/src/autofill/content/components/buttons/badge-button.ts | Template formatting only |
| apps/browser/src/autofill/content/components/buttons/action-button.ts | Template formatting only |
| apps/browser/src/_locales/en/messages.json | Add shared-folder localization keys |
| .claude/skills/figma-to-angular/SKILL.md | Example formatting only |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
Codecov Report❌ Patch coverage is Additional details and impacted files@@ Coverage Diff @@
## main #21967 +/- ##
==========================================
+ Coverage 52.10% 52.43% +0.33%
==========================================
Files 4122 4129 +7
Lines 130348 130573 +225
Branches 20463 20501 +38
==========================================
+ Hits 67922 68472 +550
+ Misses 57407 57063 -344
- Partials 5019 5038 +19 ☔ View full report in Codecov by Harness. 🚀 New features to boost your workflow:
|
Changes in this PR impact the Autofill experience of the browser clientBIT has tested the core experience with these changes and the feature flag configuration used by ✅ Fortunately, these BIT tests have passed! 🎉 |
Changes in this PR impact the Autofill experience of the browser clientBIT has tested the core experience with these changes and all feature flags disabled. ✅ Fortunately, these BIT tests have passed! 🎉 |
jengstrom-bw
left a comment
There was a problem hiding this comment.
Want to make sure we aren't changing i18n copy twice (once for org => vault and another for collection => shared folder)/getting those changes QAed twice, so I pulled the assign-collection dialog to PM-40119. Design changed some of the wording in that dialog.
- assign-collections (shared + web/desktop wrappers): handled in PM-40119 - per-client vault-items components (web/desktop): belong to PM-40165/40253/40254 Keeps only the shared libs/vault terminology work in scope for PM-40252 (item-details, new-cipher-menu, vault-batch-action, vault-filter service).
Drop 9 keys that only the reverted assign-collections dialog and bulk-move flows used. Keeps addSharedFolder/newSharedFolder (new-cipher-menu) and assignToSharedFolders (vault-batch-action), which remain in scope.
@jengstrom-bw Thanks for pointing these out. I reverted these changes. |
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 14 out of 14 changed files in this pull request and generated 2 comments.
Comments suppressed due to low confidence (1)
libs/vault/src/cipher-view/item-details/item-details-v2.component.ts:103
aria-labelis built by concatenating the translated type label and the item name without any separator. Since the visible name is markedaria-hidden, screen readers will announce e.g. "Shared folderMy Team". Add a separator (at least a space) between the translated label anditem.name.
getAriaLabel(item: Organization | CollectionView | FolderView): string {
if (item instanceof Organization) {
return this.i18nService.t("owner") + item.name;
} else if (item instanceof CollectionView) {
return (
jengstrom-bw
left a comment
There was a problem hiding this comment.
couple little cleanup things from the removal of assign-collections, but otherwise looks good!
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 12 out of 12 changed files in this pull request and generated no new comments.
Comments suppressed due to low confidence (1)
libs/vault/src/cipher-view/item-details/item-details-v2.component.ts:108
getAriaLabelconcatenates the translated label and the item name without any separator, producing values like "OwnerAcme" / "Shared folderTeam" for screen readers. Add a space (or other separator) between the label anditem.namefor all branches.
getAriaLabel(item: Organization | CollectionView | FolderView): string {
if (item instanceof Organization) {
return this.i18nService.t("owner") + item.name;
} else if (item instanceof CollectionView) {
return (
this.i18nService.t(this.terminology.enabled() ? "sharedFolder" : "collection") + item.name
);
} else if (item instanceof FolderView) {
return this.i18nService.t(this.terminology.enabled() ? "myFolder" : "folder") + item.name;
}
|
@jengstrom-bw Thanks for the review! Ready for another look when you have a chance. |
jengstrom-bw
left a comment
There was a problem hiding this comment.
Looks good! Thanks Jordan!
|
@jengstrom-bw just pushed a small fix to address this issue |
🎟️ Tracking
https://bitwarden.atlassian.net/browse/PM-40252
📔 Objective
Behind the
vfo1-foundationfeature flag (off by default), migrate the sharedlibs/vaultcomponents — consumed by web, browser, and desktop — from collection/folder terminology to shared-folder / my-folder terminology, using thevfo1I18npipe andVfo1TerminologyService:item-details-v2)item-details-section)new-cipher-menu)vault-batch-action)Adds the compound shared-folder localization keys to web/browser/desktop (
en).Copy decision:
collection*→ "shared folder" substitutions apply everywhere; personal-folder action phrases stay "folder" (only the entity noun label flips to "My folder"), soadd-edit-folder-dialogandaddToFolderare unchanged. Icon swaps and the vault-filter query-param rename are handled in separate tickets (PM-40255, PM-40510).With the flag off there is no visible change; per-client wiring + QA land in PM-40165 / PM-40253 / PM-40254.
Screen.Recording.2026-07-21.at.12.16.32.PM.mov