From 33a0045b108c9b7175ae4c026173cad5277dd4cc Mon Sep 17 00:00:00 2001 From: Muskan Khedia <36980003+muskankhedia@users.noreply.github.com> Date: Tue, 14 Jul 2020 18:58:51 +0530 Subject: [PATCH] feat: add centers action (Attendance) (#1095) Fixes: #1094 --- .../center-actions.component.html | 3 +- .../center-actions.component.ts | 6 +- .../center-attendance.component.html | 49 +++++++ .../center-attendance.component.scss | 3 + .../center-attendance.component.spec.ts | 25 ++++ .../center-attendance.component.ts | 138 ++++++++++++++++++ .../centers-view/centers-view.component.html | 2 +- .../centers-view/centers-view.component.ts | 1 + src/app/centers/centers.module.ts | 4 +- src/app/centers/centers.service.ts | 15 ++ .../center-actions.resolver.ts | 2 + 11 files changed, 243 insertions(+), 5 deletions(-) create mode 100644 src/app/centers/centers-view/center-actions/center-attendance/center-attendance.component.html create mode 100644 src/app/centers/centers-view/center-actions/center-attendance/center-attendance.component.scss create mode 100644 src/app/centers/centers-view/center-actions/center-attendance/center-attendance.component.spec.ts create mode 100644 src/app/centers/centers-view/center-actions/center-attendance/center-attendance.component.ts diff --git a/src/app/centers/centers-view/center-actions/center-actions.component.html b/src/app/centers/centers-view/center-actions/center-actions.component.html index ad701cd89..837092e1d 100644 --- a/src/app/centers/centers-view/center-actions/center-actions.component.html +++ b/src/app/centers/centers-view/center-actions/center-actions.component.html @@ -1,3 +1,4 @@ - \ No newline at end of file + + diff --git a/src/app/centers/centers-view/center-actions/center-actions.component.ts b/src/app/centers/centers-view/center-actions/center-actions.component.ts index 1b3f478e0..f55d75d90 100644 --- a/src/app/centers/centers-view/center-actions/center-actions.component.ts +++ b/src/app/centers/centers-view/center-actions/center-actions.component.ts @@ -16,11 +16,13 @@ export class CenterActionsComponent { actions: { 'Activate': boolean, 'Assign Staff': boolean, - 'Close': boolean + 'Close': boolean, + 'Attendance': boolean } = { 'Activate': false, 'Assign Staff': false, - 'Close': false + 'Close': false, + 'Attendance': false }; /** diff --git a/src/app/centers/centers-view/center-actions/center-attendance/center-attendance.component.html b/src/app/centers/centers-view/center-actions/center-attendance/center-attendance.component.html new file mode 100644 index 000000000..b884a0fe6 --- /dev/null +++ b/src/app/centers/centers-view/center-actions/center-attendance/center-attendance.component.html @@ -0,0 +1,49 @@ +
+ + + + + Meeting Date + + + {{ date | date }} + + + Next Meeting on: {{ this.centerData.collectionMeetingCalendar.nextTenRecurringDates[0] | date }} + + + + + + + + + + + + + + + + + +
Name {{ member.clientId | find:membersData:'id':'displayName' }} Attendance + Present + Absent + Approved + Leave + Late + +
+ + + + + + +
+ +
diff --git a/src/app/centers/centers-view/center-actions/center-attendance/center-attendance.component.scss b/src/app/centers/centers-view/center-actions/center-attendance/center-attendance.component.scss new file mode 100644 index 000000000..f6edc1a09 --- /dev/null +++ b/src/app/centers/centers-view/center-actions/center-attendance/center-attendance.component.scss @@ -0,0 +1,3 @@ +.container { + max-width: 37rem; +} diff --git a/src/app/centers/centers-view/center-actions/center-attendance/center-attendance.component.spec.ts b/src/app/centers/centers-view/center-actions/center-attendance/center-attendance.component.spec.ts new file mode 100644 index 000000000..9d8296171 --- /dev/null +++ b/src/app/centers/centers-view/center-actions/center-attendance/center-attendance.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { CenterAttendanceComponent } from './center-attendance.component'; + +describe('CenterAttendanceComponent', () => { + let component: CenterAttendanceComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ CenterAttendanceComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(CenterAttendanceComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/centers/centers-view/center-actions/center-attendance/center-attendance.component.ts b/src/app/centers/centers-view/center-actions/center-attendance/center-attendance.component.ts new file mode 100644 index 000000000..9309ee0cb --- /dev/null +++ b/src/app/centers/centers-view/center-actions/center-attendance/center-attendance.component.ts @@ -0,0 +1,138 @@ +/** Angular Imports */ +import { Component, OnInit } from '@angular/core'; +import { MatDialog } from '@angular/material'; +import { DatePipe } from '@angular/common'; +import { ActivatedRoute, Router } from '@angular/router'; +import { FormControl } from '@angular/forms'; + +/** Custom Services */ +import { CentersService } from 'app/centers/centers.service'; + +/** Custom Dialogs */ +import { FormDialogComponent } from 'app/shared/form-dialog/form-dialog.component'; + +/** Custom Models */ +import { FormfieldBase } from 'app/shared/form-dialog/formfield/model/formfield-base'; +import { SelectBase } from 'app/shared/form-dialog/formfield/model/select-base'; + +/** + * Center Attendance component. + */ +@Component({ + selector: 'mifosx-center-attendance', + templateUrl: './center-attendance.component.html', + styleUrls: ['./center-attendance.component.scss'] +}) +export class CenterAttendanceComponent implements OnInit { + + /** Members data. */ + membersData: any; + /** Center Data */ + centerData: any; + /** Attendance Type Options */ + attendanceTypeOptions: any; + /** Columns to be displayed in member's attendance table. */ + displayedColumns: string[] = ['name', 'attendance']; + /** Start Date Form Control */ + meetingDate = new FormControl(); + /** Meeting Dates Data */ + meetingDates: any[]; + /** Data source for client members table. */ + dataSource: {}[] = []; + /** Minimum date allowed. */ + minDate = new Date(2000, 0, 1); + /** Maximum date allowed. */ + maxDate = new Date(); + + /** + * Retrieves the center members data from `resolve`. + * @param {ActivatedRoute} route Route + * @param {DatePipe} datePipe Date Pipe + * @param {Router} router Router + * @param {CentersService} centersService Centers Service + * @param {MatDialog} dialog Mat Dialog + */ + constructor(private route: ActivatedRoute, + private datePipe: DatePipe, + private router: Router, + private centersService: CentersService, + public dialog: MatDialog) { + this.route.data.subscribe(( data: { centersActionData: any }) => { + this.centerData = data.centersActionData; + this.membersData = data.centersActionData.clients; + }); + } + + /** + * Sets the members table. + */ + ngOnInit() { + if (this.membersData !== undefined && this.membersData !== null) { + this.dataSource = this.membersData.map((member: any) => ({ clientId: member.id, attendanceType: 1 })); + } + this.meetingDates = this.centerData.collectionMeetingCalendar.recurringDates + .filter((date: any) => new Date(date).getTime() < new Date().getTime()); + this.getAttendanceOptions(); + } + + /** + * Gets attendance type options based on calendar id. + */ + getAttendanceOptions() { + this.centersService.getMeetingsTemplate(this.centerData.id, this.centerData.collectionMeetingCalendar.id) + .subscribe((response: any) => { + this.attendanceTypeOptions = response.attendanceTypeOptions; + }); + } + + /** + * Edits a member's attendance + * @param {any} member Client Member + */ + editAttendance(member: any) { + const formfields: FormfieldBase[] = [ + new SelectBase({ + controlName: 'attendanceType', + label: 'Attendance', + value: member.attendanceType, + options: { label: 'value', value: 'id', data: this.attendanceTypeOptions }, + required: false + }), + ]; + const data = { + title: 'Assign Member Attendance', + layout: { addButtonText: 'Confirm' }, + formfields: formfields + }; + const memberAttendanceDialogRef = this.dialog.open(FormDialogComponent, { data }); + memberAttendanceDialogRef.afterClosed().subscribe((response: any) => { + if (response.data) { + const updatedMemeber = { ...member, ...response.data.value }; + this.dataSource.splice(this.dataSource.indexOf(member), 1, updatedMemeber); + this.dataSource = this.dataSource.concat([]); + } + }); + } + + /** + * Assigns Client Members Attendance + */ + submit() { + // TODO: Update once language and date settings are setup + const locale = 'en'; + const dateFormat = 'dd MMMM yyyy'; + const prevMeetingDate: Date = new Date(this.meetingDate.value); + this.meetingDate.patchValue(this.datePipe.transform(prevMeetingDate, dateFormat)); + const data = { + meetingDate: this.meetingDate.value, + calendarId: this.centerData.collectionMeetingCalendar.id, + clientsAttendance: this.dataSource, + dateFormat, + locale + }; + this.centersService.assignCenterAttendance(this.centerData.id, this.centerData.collectionMeetingCalendar.id, data).subscribe(() => { + this.router.navigate(['../../'], { relativeTo: this.route }); + }); + } + +} diff --git a/src/app/centers/centers-view/centers-view.component.html b/src/app/centers/centers-view/centers-view.component.html index 97b704306..9563b432b 100644 --- a/src/app/centers/centers-view/centers-view.component.html +++ b/src/app/centers/centers-view/centers-view.component.html @@ -62,7 +62,7 @@ - + diff --git a/src/app/centers/centers-view/centers-view.component.ts b/src/app/centers/centers-view/centers-view.component.ts index f90d66ea3..794e6f11b 100644 --- a/src/app/centers/centers-view/centers-view.component.ts +++ b/src/app/centers/centers-view/centers-view.component.ts @@ -59,6 +59,7 @@ export class CentersViewComponent implements OnInit { case 'Activate': case 'Assign Staff': case 'Close': + case 'Attendance': this.router.navigate([`actions/${name}`], { relativeTo: this.route }); break; case 'Unassign Staff': diff --git a/src/app/centers/centers.module.ts b/src/app/centers/centers.module.ts index 889e781c7..3e4a93e76 100644 --- a/src/app/centers/centers.module.ts +++ b/src/app/centers/centers.module.ts @@ -20,6 +20,7 @@ import { CenterActionsComponent } from './centers-view/center-actions/center-act import { ActivateCenterComponent } from './centers-view/center-actions/activate-center/activate-center.component'; import { CenterAssignStaffComponent } from './centers-view/center-actions/center-assign-staff/center-assign-staff.component'; import { CloseCenterComponent } from './centers-view/center-actions/close-center/close-center.component'; +import { CenterAttendanceComponent } from './centers-view/center-actions/center-attendance/center-attendance.component'; /** * Centers Module @@ -45,7 +46,8 @@ import { CloseCenterComponent } from './centers-view/center-actions/close-center CenterActionsComponent, ActivateCenterComponent, CenterAssignStaffComponent, - CloseCenterComponent + CloseCenterComponent, + CenterAttendanceComponent ] }) export class CentersModule { } diff --git a/src/app/centers/centers.service.ts b/src/app/centers/centers.service.ts index 1119516fc..55dfd28d3 100644 --- a/src/app/centers/centers.service.ts +++ b/src/app/centers/centers.service.ts @@ -213,4 +213,19 @@ export class CentersService { return this.http.delete(`/centers/${centerId}`); } + getCentersData(centerId: string) { + const httpParams = new HttpParams().set('associations', 'groupMembers,collectionMeetingCalendar'); + return this.http.get(`/centers/${centerId}`, {params: httpParams}); + } + + getMeetingsTemplate(centerId: any, calendarId: any): Observable { + const httpParams = new HttpParams().set('calenderId', calendarId); + return this.http.get(`/centers/${centerId}/meetings/template`); + } + + assignCenterAttendance(centerId: any, calendarId: any, data: any): Observable { + const httpParams = new HttpParams().set('calenderId', calendarId); + return this.http.post(`/centers/${centerId}/meetings`, data, {params: httpParams}); + } + } diff --git a/src/app/centers/common-resolvers/center-actions.resolver.ts b/src/app/centers/common-resolvers/center-actions.resolver.ts index b8edc24b3..bafb12949 100644 --- a/src/app/centers/common-resolvers/center-actions.resolver.ts +++ b/src/app/centers/common-resolvers/center-actions.resolver.ts @@ -30,6 +30,8 @@ export class CenterActionsResolver implements Resolve { switch (actionName) { case 'Assign Staff': return this.centersService.getGroupStaffData(centerId); + case 'Attendance': + return this.centersService.getCentersData(centerId); default: return undefined; }