Skip to content

[PM-40252] feat: migrate shared vault components to shared-folder terminology#21967

Open
jaasen-livefront wants to merge 15 commits into
mainfrom
PM-40252
Open

[PM-40252] feat: migrate shared vault components to shared-folder terminology#21967
jaasen-livefront wants to merge 15 commits into
mainfrom
PM-40252

Conversation

@jaasen-livefront

@jaasen-livefront jaasen-livefront commented Jul 20, 2026

Copy link
Copy Markdown
Collaborator

🎟️ Tracking

https://bitwarden.atlassian.net/browse/PM-40252

📔 Objective

Behind the vfo1-foundation feature flag (off by default), migrate the shared libs/vault components — consumed by web, browser, and desktop — from collection/folder terminology to shared-folder / my-folder terminology, using the vfo1I18n pipe and Vfo1TerminologyService:

  • item-detail card aria labels + titles (item-details-v2)
  • cipher-form labels (item-details-section)
  • new-item menu items + "New/Add" button label (new-cipher-menu)
  • vault batch-bar "Assign to collections" label (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"), so add-edit-folder-dialog and addToFolder are 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

…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.
@jaasen-livefront jaasen-livefront added the ai-review Request a Claude code review label Jul 20, 2026
…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.
Copilot AI review requested due to automatic review settings July 21, 2026 16:50
@github-actions

github-actions Bot commented Jul 21, 2026

Copy link
Copy Markdown
Contributor

🤖 Bitwarden Claude Code Review

Overall Assessment: APPROVE

Reviewed the migration of shared libs/vault components to shared-folder / my-folder terminology behind the vfo1-foundation feature flag (off by default). Verified dependency-injection wiring for the new Vfo1TerminologyService across web, browser, and desktop; confirmed all terminology i18n keys (sharedFolder, sharedFolders, myFolder, myFolders, addSharedFolder, newSharedFolder) exist in every consuming app's en locale; and checked that the added unit tests align with the flag-off behavior they assert.

Code Review Details

No blocking findings.

  • The base VaultFilterService gained a required Vfo1TerminologyService constructor parameter. Every instantiation site was updated consistently: the web subclass (vault-filter.service.ts), the desktop safeProvider deps array (services.module.ts), and both affected spec files.
  • Vfo1TerminologyService is providedIn: "root", so it resolves in components (item-details-v2, new-cipher-menu) without explicit test providers, given the ConfigService mock already present in each test bed.
  • The previously unresolved thread on item-details-v2.component.ts (aria-label missing a separator) is addressed by this PR's fix (${label} ${item.name}) with new getAriaLabel test coverage.

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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 Vfo1I18nPipe in templates and added new shared-folder localization keys to web/desktop/browser en.
  • 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.

Copilot AI review requested due to automatic review settings July 21, 2026 16:57
@bitwarden bitwarden deleted a comment from github-actions Bot Jul 21, 2026

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 26 out of 27 changed files in this pull request and generated 3 comments.

Comment thread apps/browser/src/autofill/content/components/notification/confirmation/message.ts Outdated
Comment thread apps/browser/src/autofill/content/components/notification/confirmation/message.ts Outdated
Comment thread libs/vault/src/components/assign-collections.component.ts Outdated
@codecov

codecov Bot commented Jul 21, 2026

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 68.00000% with 8 lines in your changes missing coverage. Please review.
✅ Project coverage is 52.43%. Comparing base (2f74a0f) to head (abb8ee7).
⚠️ Report is 21 commits behind head on main.
✅ All tests successful. No failed tests found.

Files with missing lines Patch % Lines
...her-view/item-details/item-details-v2.component.ts 60.00% 2 Missing and 2 partials ⚠️
...nents/new-cipher-menu/new-cipher-menu.component.ts 42.85% 4 Missing ⚠️
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.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

@jaasen-livefront jaasen-livefront added the t:feature Change Type - Feature Development label Jul 21, 2026
Copilot AI review requested due to automatic review settings July 21, 2026 19:31

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 26 out of 27 changed files in this pull request and generated no new comments.

Copilot AI review requested due to automatic review settings July 21, 2026 19:40
@jaasen-livefront
jaasen-livefront marked this pull request as ready for review July 21, 2026 19:45
@jaasen-livefront
jaasen-livefront requested review from a team as code owners July 21, 2026 19:45

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 26 out of 26 changed files in this pull request and generated no new comments.

@bw-ghapp

bw-ghapp Bot commented Jul 21, 2026

Copy link
Copy Markdown
Contributor

Changes in this PR impact the Autofill experience of the browser client

BIT has tested the core experience with these changes and the feature flag configuration used by vault.bitwarden.com.

✅ Fortunately, these BIT tests have passed! 🎉

@bw-ghapp

bw-ghapp Bot commented Jul 21, 2026

Copy link
Copy Markdown
Contributor

Changes in this PR impact the Autofill experience of the browser client

BIT has tested the core experience with these changes and all feature flags disabled.

✅ Fortunately, these BIT tests have passed! 🎉

@jengstrom-bw jengstrom-bw left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.

Comment thread apps/browser/src/_locales/en/messages.json Outdated
Comment thread apps/desktop/src/locales/en/messages.json Outdated
Comment thread apps/web/src/locales/en/messages.json Outdated
Comment thread libs/vault/src/components/assign-collections.component.html
- 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.
Copilot AI review requested due to automatic review settings July 21, 2026 21:31
@jaasen-livefront

jaasen-livefront commented Jul 21, 2026

Copy link
Copy Markdown
Collaborator Author

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.

@jengstrom-bw Thanks for pointing these out. I reverted these changes.

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 14 out of 14 changed files in this pull request and generated 1 comment.

Comment thread libs/vault/src/cipher-view/item-details/item-details-v2.component.ts Outdated
Copilot AI review requested due to automatic review settings July 21, 2026 21:35

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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-label is built by concatenating the translated type label and the item name without any separator. Since the visible name is marked aria-hidden, screen readers will announce e.g. "Shared folderMy Team". Add a separator (at least a space) between the translated label and item.name.
  getAriaLabel(item: Organization | CollectionView | FolderView): string {
    if (item instanceof Organization) {
      return this.i18nService.t("owner") + item.name;
    } else if (item instanceof CollectionView) {
      return (

Comment thread libs/vault/src/components/vault-batch-bar/vault-batch-action.component.ts Outdated
Comment thread libs/vault/src/components/vault-batch-bar/vault-batch-action.component.ts Outdated

@jengstrom-bw jengstrom-bw left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

couple little cleanup things from the removal of assign-collections, but otherwise looks good!

Copilot AI review requested due to automatic review settings July 22, 2026 16:31

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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

  • getAriaLabel concatenates 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 and item.name for 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;
    }

@jaasen-livefront

Copy link
Copy Markdown
Collaborator Author

@jengstrom-bw Thanks for the review! Ready for another look when you have a chance.

jengstrom-bw
jengstrom-bw previously approved these changes Jul 22, 2026

@jengstrom-bw jengstrom-bw left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks good! Thanks Jordan!

@jaasen-livefront

Copy link
Copy Markdown
Collaborator Author

@jengstrom-bw just pushed a small fix to address this issue

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

ai-review Request a Claude code review t:feature Change Type - Feature Development

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants