[PM-37807] Implement VaultBatchBarComponent on organization vault#21345
[PM-37807] Implement VaultBatchBarComponent on organization vault#21345gbubemismith wants to merge 6 commits into
VaultBatchBarComponent on organization vault#21345Conversation
🤖 Bitwarden Claude Code ReviewOverall Assessment: APPROVE Reviewed the wiring of Code Review DetailsNo blocking findings. Notes confirmed during review:
|
Codecov Report❌ Patch coverage is Additional details and impacted files@@ Coverage Diff @@
## main #21345 +/- ##
=======================================
Coverage 49.20% 49.21%
=======================================
Files 4074 4076 +2
Lines 127814 127884 +70
Branches 19566 19574 +8
=======================================
+ Hits 62897 62943 +46
- Misses 60264 60280 +16
- Partials 4653 4661 +8 ☔ View full report in Codecov by Harness. 🚀 New features to boost your workflow:
|
BTreston
left a comment
There was a problem hiding this comment.
2 questions about the interface for the config of this batch bar service
| combineLatest([this.organization$, this.allCollections$, this.ciphers$]) | ||
| .pipe(takeUntil(this.destroy$)) | ||
| .subscribe(([organization, allCollections, ciphers]) => { | ||
| this.vaultBatchBarService.setConfig({ | ||
| isOrgVault: true, | ||
| organization, | ||
| allCollections, | ||
| hasCiphers: ciphers.length > 0, | ||
| }); | ||
| }); |
There was a problem hiding this comment.
Why do we need isOrgVault? would organization being Organization | undefined not satisfy that? Also it feels a bit backward to be managing the service state from the component. I think it would be clearer to derive the config internally in VaultBatchBarService from our existing services (OrganizationService and VaultCollectionService). I understand that ciphers$ here is still managed internally by our component and not a dedicated service which, complicates this. But a lift and shift of the ciphers logic might just resolve that. Any thoughts on that? We should really strive for truly presentational components, and all the business logic should live in the services.
There was a problem hiding this comment.
isOrgVault feeds cipherAuthorizationService.canDeleteCipher$/canRestoreCipher$ which checks if an action is performed from admin console, it gates the elevated admin permission paths. That's why I'd keep it explicit rather than infer it from organization != null; on the individual vault, we always go through the member path, even for ciphers that belong to an org. So presence of an organization isn't the same question as is this an admin-console action?. I'll prefer we keep this separate
|
BTreston
left a comment
There was a problem hiding this comment.
LGTM 🌱 The component managing the service's state is not ideal, but non blocking. We can revisit this tech-debt on the AC side in the future as we continue to clean up our org vault component.



🎟️ Tracking
https://bitwarden.atlassian.net/browse/PM-37807
📔 Objective
Enable admin console users to perform bulk collection operations through the floating batch bar.
📸 Screenshots
Screen.Recording.2026-06-17.at.14.46.46.mov