diff --git a/apps/web/src/app/vault/components/vault-items/vault-cipher-row.component.html b/apps/web/src/app/vault/components/vault-items/vault-cipher-row.component.html
index 4302edcb4e..2f38d7c70d 100644
--- a/apps/web/src/app/vault/components/vault-items/vault-cipher-row.component.html
+++ b/apps/web/src/app/vault/components/vault-items/vault-cipher-row.component.html
@@ -1,5 +1,6 @@
();
protected CipherType = CipherType;
+ protected organization?: Organization;
constructor(private configService: ConfigService) {}
@@ -53,6 +54,9 @@ export class VaultCipherRowComponent implements OnInit {
this.extensionRefreshEnabled = await firstValueFrom(
this.configService.getFeatureFlag$(FeatureFlag.ExtensionRefresh),
);
+ if (this.cipher.organizationId != null) {
+ this.organization = this.organizations.find((o) => o.id === this.cipher.organizationId);
+ }
}
protected get showTotpCopyButton() {
@@ -138,4 +142,12 @@ export class VaultCipherRowComponent implements OnInit {
protected assignToCollections() {
this.onEvent.emit({ type: "assignToCollections", items: [this.cipher] });
}
+
+ protected get showCheckbox() {
+ if (!this.viewingOrgVault || !this.organization) {
+ return true; // Always show checkbox in individual vault or for non-org items
+ }
+
+ return this.organization.canEditAllCiphers || this.cipher.edit;
+ }
}
diff --git a/apps/web/src/app/vault/components/vault-items/vault-collection-row.component.ts b/apps/web/src/app/vault/components/vault-items/vault-collection-row.component.ts
index 36cd3679a0..9656e4e835 100644
--- a/apps/web/src/app/vault/components/vault-items/vault-collection-row.component.ts
+++ b/apps/web/src/app/vault/components/vault-items/vault-collection-row.component.ts
@@ -103,6 +103,10 @@ export class VaultCollectionRowComponent {
}
protected get showCheckbox() {
- return this.collection?.id !== Unassigned;
+ if (this.collection?.id === Unassigned) {
+ return false; // Never show checkbox for Unassigned
+ }
+
+ return this.canEditCollection || this.canDeleteCollection;
}
}
diff --git a/apps/web/src/app/vault/components/vault-items/vault-items.component.ts b/apps/web/src/app/vault/components/vault-items/vault-items.component.ts
index 04f2245d26..794a0b3b25 100644
--- a/apps/web/src/app/vault/components/vault-items/vault-items.component.ts
+++ b/apps/web/src/app/vault/components/vault-items/vault-items.component.ts
@@ -1,7 +1,7 @@
import { SelectionModel } from "@angular/cdk/collections";
import { Component, EventEmitter, Input, Output } from "@angular/core";
-import { Unassigned, CollectionView } from "@bitwarden/admin-console/common";
+import { CollectionView, Unassigned } from "@bitwarden/admin-console/common";
import { Organization } from "@bitwarden/common/admin-console/models/domain/organization";
import { CipherView } from "@bitwarden/common/vault/models/view/cipher.view";
import { TableDataSource } from "@bitwarden/components";
@@ -205,11 +205,12 @@ export class VaultItemsComponent {
this.selection.clear();
- // Every item except for the Unassigned collection is selectable, individual bulk actions check the user's permission
+ // All ciphers are selectable, collections only if they can be edited or deleted
this.editableItems = items.filter(
(item) =>
item.cipher !== undefined ||
- (item.collection !== undefined && item.collection.id !== Unassigned),
+ (item.collection !== undefined &&
+ (this.canEditCollection(item.collection) || this.canDeleteCollection(item.collection))),
);
this.dataSource.data = items;
|