diff --git a/src/app/clients/clients.service.ts b/src/app/clients/clients.service.ts index b9730c937..53373c008 100644 --- a/src/app/clients/clients.service.ts +++ b/src/app/clients/clients.service.ts @@ -16,7 +16,7 @@ export class ClientsService { */ constructor(private http: HttpClient) { } - getFilteredClients(orderBy: string, sortOrder: string, orphansOnly: boolean, displayName: string, officeId: any): Observable { + getFilteredClients(orderBy: string, sortOrder: string, orphansOnly: boolean, displayName: string, officeId?: any): Observable { let httpParams = new HttpParams() .set('displayName', displayName) .set('orphansOnly', orphansOnly.toString()) diff --git a/src/app/groups/common-resolvers/group-actions.resolver.ts b/src/app/groups/common-resolvers/group-actions.resolver.ts index aae98a13d..7fd402d22 100644 --- a/src/app/groups/common-resolvers/group-actions.resolver.ts +++ b/src/app/groups/common-resolvers/group-actions.resolver.ts @@ -29,6 +29,7 @@ export class GroupActionsResolver implements Resolve { const groupId = route.paramMap.get('groupId') || route.parent.parent.paramMap.get('groupId'); switch (actionName) { case 'Attendance': + case 'Manage Members': return this.groupsService.getGroupData(groupId); case 'Assign Staff': return this.groupsService.getGroupData(groupId, 'true'); diff --git a/src/app/groups/groups-view/group-actions/group-actions.component.html b/src/app/groups/groups-view/group-actions/group-actions.component.html index de39bdc29..047a46172 100644 --- a/src/app/groups/groups-view/group-actions/group-actions.component.html +++ b/src/app/groups/groups-view/group-actions/group-actions.component.html @@ -3,3 +3,4 @@ + diff --git a/src/app/groups/groups-view/group-actions/group-actions.component.ts b/src/app/groups/groups-view/group-actions/group-actions.component.ts index 917eb6661..b7a0c2f3f 100644 --- a/src/app/groups/groups-view/group-actions/group-actions.component.ts +++ b/src/app/groups/groups-view/group-actions/group-actions.component.ts @@ -19,12 +19,14 @@ export class GroupActionsComponent { 'Activate': boolean 'Attach Meeting': boolean 'Attendance': boolean + 'Manage Members': boolean } = { 'Assign Staff': false, 'Close': false, 'Activate': false, 'Attach Meeting': false, - 'Attendance': false + 'Attendance': false, + 'Manage Members': false }; /** diff --git a/src/app/groups/groups-view/group-actions/group-attendance/group-attendance.component.ts b/src/app/groups/groups-view/group-actions/group-attendance/group-attendance.component.ts index 8707d0670..1e2280754 100644 --- a/src/app/groups/groups-view/group-actions/group-attendance/group-attendance.component.ts +++ b/src/app/groups/groups-view/group-actions/group-attendance/group-attendance.component.ts @@ -37,7 +37,7 @@ export class GroupAttendanceComponent implements OnInit { meetingDate = new FormControl(); /** Meeting Dates Data */ meetingDates: any[]; - /** Data source for currencies table. */ + /** Data source for client members table. */ dataSource: {}[]; /** diff --git a/src/app/groups/groups-view/group-actions/manage-group-members/manage-group-members.component.html b/src/app/groups/groups-view/group-actions/manage-group-members/manage-group-members.component.html new file mode 100644 index 000000000..86dbcf8d0 --- /dev/null +++ b/src/app/groups/groups-view/group-actions/manage-group-members/manage-group-members.component.html @@ -0,0 +1,55 @@ +
+ + + + + Add Clients + + + + + + {{ client.displayName }} + + + +
+
+
Client Details
+ +
+
+
Name
+
{{clientChoice.value.displayName}}
+
+
+
Id
+
{{clientChoice.value.id}}
+
+
+
Office
+
{{clientChoice.value.officeName}}
+
+
+ +
+ + + +

Client Members

+ + +
+ {{client.displayName}} +
+ +
+
+ +
+ +
diff --git a/src/app/groups/groups-view/group-actions/manage-group-members/manage-group-members.component.scss b/src/app/groups/groups-view/group-actions/manage-group-members/manage-group-members.component.scss new file mode 100644 index 000000000..5298c1d1c --- /dev/null +++ b/src/app/groups/groups-view/group-actions/manage-group-members/manage-group-members.component.scss @@ -0,0 +1,35 @@ +.container { + max-width: 50rem; + + .mat-table { + display: block; + font-family: Tahoma, Verdana; + width: 100%; + } + + .mat-row, + .mat-header-row { + display: flex; + border-bottom-width: 1px; + border-bottom-style: solid; + align-items: center; + min-height: 48px; + padding: 0 24px; + } + + .mat-cell, + .mat-header-cell { + flex: 1; + overflow: hidden; + word-wrap: break-word; + } + + h3 { + padding-left: 0; + margin-bottom: 0; + } + + .client-card { + max-height: 20rem; + } +} diff --git a/src/app/groups/groups-view/group-actions/manage-group-members/manage-group-members.component.spec.ts b/src/app/groups/groups-view/group-actions/manage-group-members/manage-group-members.component.spec.ts new file mode 100644 index 000000000..d79a2182f --- /dev/null +++ b/src/app/groups/groups-view/group-actions/manage-group-members/manage-group-members.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { ManageGroupMembersComponent } from './manage-group-members.component'; + +describe('ManageGroupMembersComponent', () => { + let component: ManageGroupMembersComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ ManageGroupMembersComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(ManageGroupMembersComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/groups/groups-view/group-actions/manage-group-members/manage-group-members.component.ts b/src/app/groups/groups-view/group-actions/manage-group-members/manage-group-members.component.ts new file mode 100644 index 000000000..9556281ab --- /dev/null +++ b/src/app/groups/groups-view/group-actions/manage-group-members/manage-group-members.component.ts @@ -0,0 +1,98 @@ +/** Angular Imports */ +import { Component, OnInit, AfterViewInit } from '@angular/core'; +import { FormGroup, FormBuilder, FormControl, Validators } from '@angular/forms'; +import { Router, ActivatedRoute } from '@angular/router'; + +/** Custom Dialogs */ +import { DeleteDialogComponent } from 'app/shared/delete-dialog/delete-dialog.component'; + +/** Custom Services */ +import { GroupsService } from 'app/groups/groups.service'; +import { ClientsService } from 'app/clients/clients.service'; +import { MatDialog } from '@angular/material'; + + +@Component({ + selector: 'mifosx-manage-group-members', + templateUrl: './manage-group-members.component.html', + styleUrls: ['./manage-group-members.component.scss'] +}) +export class ManageGroupMembersComponent implements AfterViewInit { + + /** Group Data */ + groupData: any; + /** Client data. */ + clientsData: any = []; + /** Client Members. */ + clientMembers: any[] = []; + /** ClientChoice. */ + clientChoice = new FormControl(''); + + /** + * Fetches group action data from `resolve` + * @param {ActivatedRoute} route Activated Route + * @param {GroupsService} groupsService Groups Service + * @param {ClientsService} clientsService Clients Service + * @param {MatDialog} dialog Mat Dialog + */ + constructor(private route: ActivatedRoute, + private groupsService: GroupsService, + private clientsService: ClientsService, + public dialog: MatDialog) { + this.route.data.subscribe((data: { groupActionData: any }) => { + this.groupData = data.groupActionData; + this.clientMembers = data.groupActionData.clientMembers; + }); + } + + + /** + * Subscribes to Clients search filter: + */ + ngAfterViewInit() { + this.clientChoice.valueChanges.subscribe( (value: string) => { + if (value.length >= 2) { + this.clientsService.getFilteredClients('displayName', 'ASC', true, value, this.groupData.officeId) + .subscribe((data: any) => { + this.clientsData = data.pageItems; + }); + } + }); + } + + /** + * Add client. + */ + addClient() { + if (!this.clientMembers.includes(this.clientChoice.value)) { + this.groupsService.executeGroupCommand(this.groupData.id, 'associateClients', {clientMembers: [this.clientChoice.value.id]}) + .subscribe(() => { this.clientMembers.push(this.clientChoice.value); }); + } + } + + /** + * Remove client. + * @param index Client's array index. + */ + removeClient(index: number, client: any) { + const removeMemberDialogRef = this.dialog.open(DeleteDialogComponent, { + data: { deleteContext: `client member: ${client.displayName}` } + }); + removeMemberDialogRef.afterClosed().subscribe((response: any) => { + if (response.delete) { + this.groupsService.executeGroupCommand(this.groupData.id, 'disassociateClients', {clientMembers: [client.id]}) + .subscribe(() => { this.clientMembers.splice(index, 1); }); + } + }); + } + + /** + * Displays Client name in form control input. + * @param {any} client Client data. + * @returns {string} Client name if valid otherwise undefined. + */ + displayClient(client: any): string | undefined { + return client ? client.displayName : undefined; + } + +} diff --git a/src/app/groups/groups-view/groups-view.component.html b/src/app/groups/groups-view/groups-view.component.html index e262c2a76..ba17eca56 100644 --- a/src/app/groups/groups-view/groups-view.component.html +++ b/src/app/groups/groups-view/groups-view.component.html @@ -63,8 +63,8 @@ Add Clients - + diff --git a/src/app/groups/groups-view/groups-view.component.ts b/src/app/groups/groups-view/groups-view.component.ts index d04bd2bb1..f7af10aa0 100644 --- a/src/app/groups/groups-view/groups-view.component.ts +++ b/src/app/groups/groups-view/groups-view.component.ts @@ -50,6 +50,7 @@ export class GroupsViewComponent { case 'Activate': case 'Attach Meeting': case 'Attendance': + case 'Manage Members': this.router.navigate([`actions/${name}`], { relativeTo: this.route }); break; case 'Edit': diff --git a/src/app/groups/groups.module.ts b/src/app/groups/groups.module.ts index c7ee69a39..6b524c5bd 100644 --- a/src/app/groups/groups.module.ts +++ b/src/app/groups/groups.module.ts @@ -28,6 +28,7 @@ import { ActivateGroupComponent } from './groups-view/group-actions/activate-gro import { EditGroupComponent } from './edit-group/edit-group.component'; import { AttachGroupMeetingComponent } from './groups-view/group-actions/attach-group-meeting/attach-group-meeting.component'; import { GroupAttendanceComponent } from './groups-view/group-actions/group-attendance/group-attendance.component'; +import { ManageGroupMembersComponent } from './groups-view/group-actions/manage-group-members/manage-group-members.component'; /** * Groups Module @@ -60,7 +61,8 @@ import { GroupAttendanceComponent } from './groups-view/group-actions/group-atte ActivateGroupComponent, EditGroupComponent, AttachGroupMeetingComponent, - GroupAttendanceComponent + GroupAttendanceComponent, + ManageGroupMembersComponent ], entryComponents: [ UnassignRoleDialogComponent,