mirror of
https://github.com/bitwarden/browser
synced 2025-12-18 09:13:33 +00:00
[PM-10294] Remove FC v1 from Clients (#10422)
* chore: remove fc v1 from org.canEditAnyCollection and update callers, refs PM-10294 * chore: remove fc v1 from collectionView.canEdit and update callers, refs PM-10294 * chore: remove fc v1 from organization.canEditAllCiphers and update callers, refs PM-10294 * chore: remove fc v1 from canDeleteAnyCollection, collection views, update callers, refs PM-10294 * chore: remove fc v1 from canEditUser/GroupAccess, refs PM-10294 * chore: remove fc v1 from canViewCollectionInfo, refs PM-10294 * chore: remove fc v1 from account component, refs PM-10294 * fix: remove fc v1 from collections component, refs PM-10294 * fix: update vault-items component, refs PM-10294 * fix: remove fc v1 from collection-dialog and collections components, refs PM-10294 * chore: remove ConfigService from group-add-edit and account components, refs PM-10294 * chore: change canEditAnyCollection to getter and update callers, refs PM-10294 * chore: change canEditUnmanagedCollections to getter and update callers, refs PM-10294 * chore: change canDeleteAnyCollection to getter and update callers, refs PM-10294 * chore: remove deprecated observable and update comments with v1, refs PM-10294 * chore: remove ununsed ConfigService from collection-dialog component, refs PM-10294 * chore: remove final fc v1 ref for vault-collection-row, refs PM-10294
This commit is contained in:
@@ -17,8 +17,6 @@ import { OrganizationService } from "@bitwarden/common/admin-console/abstraction
|
||||
import { OrganizationUserService } from "@bitwarden/common/admin-console/abstractions/organization-user/organization-user.service";
|
||||
import { OrganizationUserUserDetailsResponse } from "@bitwarden/common/admin-console/abstractions/organization-user/responses/organization-user.response";
|
||||
import { Organization } from "@bitwarden/common/admin-console/models/domain/organization";
|
||||
import { FeatureFlag } from "@bitwarden/common/enums/feature-flag.enum";
|
||||
import { ConfigService } from "@bitwarden/common/platform/abstractions/config/config.service";
|
||||
import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service";
|
||||
import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service";
|
||||
import { Utils } from "@bitwarden/common/platform/misc/utils";
|
||||
@@ -77,10 +75,6 @@ export enum CollectionDialogAction {
|
||||
templateUrl: "collection-dialog.component.html",
|
||||
})
|
||||
export class CollectionDialogComponent implements OnInit, OnDestroy {
|
||||
protected flexibleCollectionsV1Enabled$ = this.configService
|
||||
.getFeatureFlag$(FeatureFlag.FlexibleCollectionsV1)
|
||||
.pipe(first());
|
||||
|
||||
private destroy$ = new Subject<void>();
|
||||
protected organizations$: Observable<Organization[]>;
|
||||
|
||||
@@ -113,7 +107,6 @@ export class CollectionDialogComponent implements OnInit, OnDestroy {
|
||||
private i18nService: I18nService,
|
||||
private platformUtilsService: PlatformUtilsService,
|
||||
private organizationUserService: OrganizationUserService,
|
||||
private configService: ConfigService,
|
||||
private dialogService: DialogService,
|
||||
private changeDetectorRef: ChangeDetectorRef,
|
||||
) {
|
||||
@@ -163,95 +156,90 @@ export class CollectionDialogComponent implements OnInit, OnDestroy {
|
||||
groups: groups$,
|
||||
// Collection(s) needed to map readonlypermission for (potential) access selector disabled state
|
||||
users: this.organizationUserService.getAllUsers(orgId, { includeCollections: true }),
|
||||
flexibleCollectionsV1: this.flexibleCollectionsV1Enabled$,
|
||||
})
|
||||
.pipe(takeUntil(this.formGroup.controls.selectedOrg.valueChanges), takeUntil(this.destroy$))
|
||||
.subscribe(
|
||||
({ organization, collections: allCollections, groups, users, flexibleCollectionsV1 }) => {
|
||||
this.organization = organization;
|
||||
this.accessItems = [].concat(
|
||||
groups.map((group) => mapGroupToAccessItemView(group, this.collectionId)),
|
||||
users.data.map((user) => mapUserToAccessItemView(user, this.collectionId)),
|
||||
);
|
||||
.subscribe(({ organization, collections: allCollections, groups, users }) => {
|
||||
this.organization = organization;
|
||||
this.accessItems = [].concat(
|
||||
groups.map((group) => mapGroupToAccessItemView(group, this.collectionId)),
|
||||
users.data.map((user) => mapUserToAccessItemView(user, this.collectionId)),
|
||||
);
|
||||
|
||||
// Force change detection to update the access selector's items
|
||||
this.changeDetectorRef.detectChanges();
|
||||
// Force change detection to update the access selector's items
|
||||
this.changeDetectorRef.detectChanges();
|
||||
|
||||
this.nestOptions = this.params.limitNestedCollections
|
||||
? allCollections.filter((c) => c.manage)
|
||||
: allCollections;
|
||||
this.nestOptions = this.params.limitNestedCollections
|
||||
? allCollections.filter((c) => c.manage)
|
||||
: allCollections;
|
||||
|
||||
if (this.params.collectionId) {
|
||||
this.collection = allCollections.find((c) => c.id === this.collectionId);
|
||||
// Ensure we don't allow nesting the current collection within itself
|
||||
this.nestOptions = this.nestOptions.filter((c) => c.id !== this.collectionId);
|
||||
if (this.params.collectionId) {
|
||||
this.collection = allCollections.find((c) => c.id === this.collectionId);
|
||||
// Ensure we don't allow nesting the current collection within itself
|
||||
this.nestOptions = this.nestOptions.filter((c) => c.id !== this.collectionId);
|
||||
|
||||
if (!this.collection) {
|
||||
throw new Error("Could not find collection to edit.");
|
||||
}
|
||||
|
||||
// Parse the name to find its parent name
|
||||
const { name, parent: parentName } = parseName(this.collection);
|
||||
|
||||
// Determine if the user can see/select the parent collection
|
||||
if (parentName !== undefined) {
|
||||
if (
|
||||
this.organization.canViewAllCollections &&
|
||||
!allCollections.find((c) => c.name === parentName)
|
||||
) {
|
||||
// The user can view all collections, but the parent was not found -> assume it has been deleted
|
||||
this.deletedParentName = parentName;
|
||||
} else if (!this.nestOptions.find((c) => c.name === parentName)) {
|
||||
// We cannot find the current parent collection in our list of options, so add a placeholder
|
||||
this.nestOptions.unshift({ name: parentName } as CollectionView);
|
||||
}
|
||||
}
|
||||
|
||||
const accessSelections = mapToAccessSelections(this.collection);
|
||||
this.formGroup.patchValue({
|
||||
name,
|
||||
externalId: this.collection.externalId,
|
||||
parent: parentName,
|
||||
access: accessSelections,
|
||||
});
|
||||
this.showDeleteButton =
|
||||
!this.dialogReadonly &&
|
||||
this.collection.canDelete(organization, flexibleCollectionsV1);
|
||||
} else {
|
||||
const parent = this.nestOptions.find((c) => c.id === this.params.parentCollectionId);
|
||||
const currentOrgUserId = users.data.find(
|
||||
(u) => u.userId === this.organization?.userId,
|
||||
)?.id;
|
||||
const initialSelection: AccessItemValue[] =
|
||||
currentOrgUserId !== undefined
|
||||
? [
|
||||
{
|
||||
id: currentOrgUserId,
|
||||
type: AccessItemType.Member,
|
||||
permission: CollectionPermission.Manage,
|
||||
},
|
||||
]
|
||||
: [];
|
||||
|
||||
this.formGroup.patchValue({
|
||||
parent: parent?.name ?? undefined,
|
||||
access: initialSelection,
|
||||
});
|
||||
if (!this.collection) {
|
||||
throw new Error("Could not find collection to edit.");
|
||||
}
|
||||
|
||||
if (flexibleCollectionsV1 && !organization.allowAdminAccessToAllCollectionItems) {
|
||||
this.formGroup.controls.access.addValidators(validateCanManagePermission);
|
||||
} else {
|
||||
this.formGroup.controls.access.removeValidators(validateCanManagePermission);
|
||||
// Parse the name to find its parent name
|
||||
const { name, parent: parentName } = parseName(this.collection);
|
||||
|
||||
// Determine if the user can see/select the parent collection
|
||||
if (parentName !== undefined) {
|
||||
if (
|
||||
this.organization.canViewAllCollections &&
|
||||
!allCollections.find((c) => c.name === parentName)
|
||||
) {
|
||||
// The user can view all collections, but the parent was not found -> assume it has been deleted
|
||||
this.deletedParentName = parentName;
|
||||
} else if (!this.nestOptions.find((c) => c.name === parentName)) {
|
||||
// We cannot find the current parent collection in our list of options, so add a placeholder
|
||||
this.nestOptions.unshift({ name: parentName } as CollectionView);
|
||||
}
|
||||
}
|
||||
this.formGroup.controls.access.updateValueAndValidity();
|
||||
|
||||
this.handleFormGroupReadonly(this.dialogReadonly);
|
||||
const accessSelections = mapToAccessSelections(this.collection);
|
||||
this.formGroup.patchValue({
|
||||
name,
|
||||
externalId: this.collection.externalId,
|
||||
parent: parentName,
|
||||
access: accessSelections,
|
||||
});
|
||||
this.showDeleteButton = !this.dialogReadonly && this.collection.canDelete(organization);
|
||||
} else {
|
||||
const parent = this.nestOptions.find((c) => c.id === this.params.parentCollectionId);
|
||||
const currentOrgUserId = users.data.find(
|
||||
(u) => u.userId === this.organization?.userId,
|
||||
)?.id;
|
||||
const initialSelection: AccessItemValue[] =
|
||||
currentOrgUserId !== undefined
|
||||
? [
|
||||
{
|
||||
id: currentOrgUserId,
|
||||
type: AccessItemType.Member,
|
||||
permission: CollectionPermission.Manage,
|
||||
},
|
||||
]
|
||||
: [];
|
||||
|
||||
this.loading = false;
|
||||
this.showAddAccessWarning = this.handleAddAccessWarning(flexibleCollectionsV1);
|
||||
},
|
||||
);
|
||||
this.formGroup.patchValue({
|
||||
parent: parent?.name ?? undefined,
|
||||
access: initialSelection,
|
||||
});
|
||||
}
|
||||
|
||||
if (!organization.allowAdminAccessToAllCollectionItems) {
|
||||
this.formGroup.controls.access.addValidators(validateCanManagePermission);
|
||||
} else {
|
||||
this.formGroup.controls.access.removeValidators(validateCanManagePermission);
|
||||
}
|
||||
this.formGroup.controls.access.updateValueAndValidity();
|
||||
|
||||
this.handleFormGroupReadonly(this.dialogReadonly);
|
||||
|
||||
this.loading = false;
|
||||
this.showAddAccessWarning = this.handleAddAccessWarning();
|
||||
});
|
||||
}
|
||||
|
||||
protected get collectionId() {
|
||||
@@ -361,9 +349,8 @@ export class CollectionDialogComponent implements OnInit, OnDestroy {
|
||||
this.destroy$.complete();
|
||||
}
|
||||
|
||||
private handleAddAccessWarning(flexibleCollectionsV1: boolean): boolean {
|
||||
private handleAddAccessWarning(): boolean {
|
||||
if (
|
||||
flexibleCollectionsV1 &&
|
||||
!this.organization?.allowAdminAccessToAllCollectionItems &&
|
||||
this.params.isAddAccessCollection
|
||||
) {
|
||||
|
||||
Reference in New Issue
Block a user