mirror of
https://github.com/bitwarden/browser
synced 2025-12-15 15:53:27 +00:00
* [EC-16] Cleanup RxJS linting problems * [EC-16] Update Group tab to use table component and show collections. * [EC-16] Extract interface from GroupResponse and use it in the view * [EC-16] Remove heading underline * [EC-16] Cleanup i18n * [EC-16] More i18n cleanup * [EC-16] Fix bulk group request type name * [EC-16] Rename group details type * [EC-86] Clear collectionMap before populating it with new collections * [EC-86] Update initialization/loading logic to make better use of the Observable pattern * [EC-86] Make table cells use a pointer cursor * [EC-86] Use bitIconButton for row menu triggers * [EC-86] Refactor GroupDetailsRow interface to wrap GroupDetailsResponse. Remove response model interfaces. Cleanup GroupsComponent. * [EC-86] Add bit-badge-list component and tweak BadgeModule to support both the component and directive. Update mockI18nService to support templated strings. * [EC-86] Cleanup badge color and bitIconButton classes * [EC-86] Cleanup more styles * [EC-86] Add GroupApiService Add a new GroupApiService to replace Group Api calls in the ApiService. * [EC-86] Revisions for badge-list implementation. - Remove `| null` for maxItems according to ADR-0014 - Remove custom setter for items - Use ngOnChanges to update filteredItems - Fix sr-only tailwind class and show screen reader comma after last item if truncated. * [EC-86] Refactor badge-list module/component - Move the badge list component to its own module. - Extract badge list stories from badge stories. - Cleanup bade stories and module after refactor. * [EC-86] Refactor/rename GroupApiService - Re-name GroupApiService to GroupService as there is no need for a separate Api service (no sync or local data for admin services) - Add GroupView for use in the GroupService instead of raw API models - Update views to use GroupView instead of raw GroupResponse models * [EC-86] Refactor group API request models - Move organizationGroupBulkRequest to group requests folder - Fix relative imports in GroupService * [EC-86] Fix linting errors * Fix tab item text color Tab item text color broke after a merge from master and needs a fix to account for bootstrap styles in Web. * [EC-86] Rename new files using kebab-case * [EC-86] Fix group view file name * [EC-86] Fix group request/response file names * [EC-86] Cleanup badge stories per review suggestions * [EC-86] Use inline-flex for badge list container * [EC-86] Move GroupService and Views to Web org module - Move GroupService and GroupServiceAbstraction to Organization Module - Add GroupService provider to Organization Module - Move collection-add-edit.component, user-groups.component, group-add-edit.component, and groups.component into Organization Module as they now depend on GroupService - Remove moved components from Loose Component module * [EC-86] Fix Group table search Adds the id and name properties to GroupDetailsRow to support using the searchPipe (which cannot access nested values such as details.name for filtering). * [EC-86] Fix badge story controls * [EC-87] Edit Group Dialog (#3651) * [EC-87] Update the edit dialog to use content tabs * [EC-87] WIP FormListSelection abstract controller * [EC-87] WIP FormListSelection for members and collections * [EC-87] More WIP on FormListSelection * [EC-87] WIP Working FormSelectionList with initial value support * [EC-87] WIP SelectionList without FormControls and with i18n support for sorting * [EC-87] Final sorted SelectionList with FormArray support * [EC-87] Extract and document FormSelectionList * [EC-87] Functional edit group modal * [EC-87] Remove button icon padding for bitButton directives * [EC-87] Use new disablePadding attribute for Dialog component * [EC-87] Some more cleanup and finetuning * [EC-87] Move enum declaration to top * [EC-87] Remove inline style from access selector * [EC-87] Move Group components into Organization Module * [EC-87] Add MultiSelectModule to Shared Web module * [EC-87] Integrate AccessSelector component in GroupAddEdit modal - Remove duplicate permission / selection readonly helpers from GroupAddEdit component - Use access item views/values for collection and member lists - Replace access selector HTMl with the AccessSelector component * [EC-87] Update Group collections column to open Collection tab * [EC-87] Remove old FormSelectionList file * [EC-87] Fix missed file import changes after merge * [EC-87] Remove GroupAddEditComponent modal service registration Groups component is now using the DialogService which does not require explicit registration for lazy loaded components. * [EC-87] Use injected DIALOG_DATA for GroupAddEdit component - Add types for the GroupAddEdit dialog params, result, and tab indices - Add strongly typed helper method to open GroupAddEdit dialogs - Remove @Input()/@Output() properties. Replaced with the injected DIALOG_DATA params instead - Use dialogRef.close() and result type instead of event emitters * [EC-87] Rename collection tab type to collections * [EC-87] Refactor postGroup() and putGroup() from ApiService - Move postGroup() and putGroup() methods to GroupService - Remove postGroup() and putGroup() from ApiService - Move GroupResponse and GroupRequest into Web (from lib/common) * [EC-87] Remove required attribute * [EC-87] Use PascalCase for template Enums * [EC-87] Use group modal tab enum in template * [EC-87] Convert dialog result to promise * [EC-87] Refactor dialog positionStrategy - Add .top() to position strategy to allow clicking the backdrop to close the dialog - Move the positionStrategy option into the openGroupAddEditDialog helper * [EC-87] Remove [preserveContent] from tab group * [EC-87] Use new CL async actions - Update handlers to be arrow-functions - Remove old form and delete promises - Use [bitSubmit] directive on form - Use bitFormButton directive and [bitAction] for submit and delete buttons - Remove delete/spinner bwi icons as they are handled by the new async directives * [EC-87] Introduce CollectionAccessSelectionView Use a new view to replace the SelectionReadonlyResponse/Request classes. * [EC-87] Use new access selection view in GroupView - Change the collections type - Add members list to make the view more complete - Update the static fromResponse helper to properly map the GroupDetailsResponse to the new access selection view - Update access selector helpers to use new access selection view instead of response/request models * [EC-87] Update GroupService to have a single save() method that accepts a GroupView - Add save() method that checks for existing group id to determine which API method to use - Make post/put group methods private * [EC-87] Utilize the new save() method in the group modal * [EC-87] Use observables for fetching data - Introduce 3 observables for collections, members, and group details - Combine and subscribe to those observables in ngOnInit - Add destroy$ subject - Inject changeDetectorRef to handle quirk of patching the AccessSelector value before available items are set
111 lines
3.2 KiB
TypeScript
111 lines
3.2 KiB
TypeScript
import { Injectable } from "@angular/core";
|
|
|
|
import { ApiService } from "@bitwarden/common/abstractions/api.service";
|
|
import { SelectionReadOnlyRequest } from "@bitwarden/common/models/request/selection-read-only.request";
|
|
import { ListResponse } from "@bitwarden/common/models/response/list.response";
|
|
|
|
import { GroupView } from "../../views/group.view";
|
|
import { GroupRequest, GroupServiceAbstraction } from "../abstractions/group";
|
|
|
|
import { OrganizationGroupBulkRequest } from "./requests/organization-group-bulk.request";
|
|
import { GroupDetailsResponse, GroupResponse } from "./responses/group.response";
|
|
|
|
@Injectable()
|
|
export class GroupService implements GroupServiceAbstraction {
|
|
constructor(private apiService: ApiService) {}
|
|
|
|
async delete(orgId: string, groupId: string): Promise<void> {
|
|
await this.apiService.send(
|
|
"DELETE",
|
|
"/organizations/" + orgId + "/groups/" + groupId,
|
|
null,
|
|
true,
|
|
false
|
|
);
|
|
}
|
|
|
|
async deleteMany(orgId: string, groupIds: string[]): Promise<GroupView[]> {
|
|
const request = new OrganizationGroupBulkRequest(groupIds);
|
|
|
|
const r = await this.apiService.send(
|
|
"DELETE",
|
|
"/organizations/" + orgId + "/groups",
|
|
request,
|
|
true,
|
|
true
|
|
);
|
|
const listResponse = new ListResponse(r, GroupResponse);
|
|
|
|
return listResponse.data?.map((gr) => GroupView.fromResponse(gr)) ?? [];
|
|
}
|
|
|
|
async get(orgId: string, groupId: string): Promise<GroupView> {
|
|
const r = await this.apiService.send(
|
|
"GET",
|
|
"/organizations/" + orgId + "/groups/" + groupId + "/details",
|
|
null,
|
|
true,
|
|
true
|
|
);
|
|
|
|
return GroupView.fromResponse(new GroupDetailsResponse(r));
|
|
}
|
|
|
|
async getAll(orgId: string): Promise<GroupView[]> {
|
|
const r = await this.apiService.send(
|
|
"GET",
|
|
"/organizations/" + orgId + "/groups",
|
|
null,
|
|
true,
|
|
true
|
|
);
|
|
|
|
const listResponse = new ListResponse(r, GroupDetailsResponse);
|
|
|
|
return listResponse.data?.map((gr) => GroupView.fromResponse(gr)) ?? [];
|
|
}
|
|
|
|
async save(group: GroupView): Promise<GroupView> {
|
|
const request = new GroupRequest();
|
|
request.name = group.name;
|
|
request.externalId = group.externalId;
|
|
request.accessAll = group.accessAll;
|
|
request.users = group.members;
|
|
request.collections = group.collections.map(
|
|
(c) => new SelectionReadOnlyRequest(c.id, c.readOnly, c.hidePasswords)
|
|
);
|
|
|
|
if (group.id == undefined) {
|
|
return await this.postGroup(group.organizationId, request);
|
|
} else {
|
|
return await this.putGroup(group.organizationId, group.id, request);
|
|
}
|
|
}
|
|
|
|
private async postGroup(organizationId: string, request: GroupRequest): Promise<GroupView> {
|
|
const r = await this.apiService.send(
|
|
"POST",
|
|
"/organizations/" + organizationId + "/groups",
|
|
request,
|
|
true,
|
|
true
|
|
);
|
|
return GroupView.fromResponse(new GroupResponse(r));
|
|
}
|
|
|
|
private async putGroup(
|
|
organizationId: string,
|
|
id: string,
|
|
request: GroupRequest
|
|
): Promise<GroupView> {
|
|
const r = await this.apiService.send(
|
|
"PUT",
|
|
"/organizations/" + organizationId + "/groups/" + id,
|
|
request,
|
|
true,
|
|
true
|
|
);
|
|
return GroupView.fromResponse(new GroupResponse(r));
|
|
}
|
|
}
|