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 6d81565e6..d34c569dd 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 @@ -3,3 +3,5 @@ + + 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 18d605df2..4d4257607 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 @@ -18,13 +18,17 @@ export class CenterActionsComponent { 'Assign Staff': boolean, 'Close': boolean, 'Attendance': boolean, - 'Attach Meeting': boolean + 'Attach Meeting': boolean, + 'Edit Meeting': boolean, + 'Edit Meeting Schedule': boolean } = { 'Activate': false, 'Assign Staff': false, 'Close': false, 'Attendance': false, - 'Attach Meeting': false + 'Attach Meeting': false, + 'Edit Meeting': false, + 'Edit Meeting Schedule': false }; /** diff --git a/src/app/centers/centers-view/center-actions/edit-center-meeting-schedule/edit-center-meeting-schedule.component.html b/src/app/centers/centers-view/center-actions/edit-center-meeting-schedule/edit-center-meeting-schedule.component.html new file mode 100644 index 000000000..6d9f82c39 --- /dev/null +++ b/src/app/centers/centers-view/center-actions/edit-center-meeting-schedule/edit-center-meeting-schedule.component.html @@ -0,0 +1,46 @@ +
+ + + +
+ + + +
+ + + Existing Meeting Date + + + {{ date | date }} + + + + Existing Meeting Date is required + + + + + Revised Meeting Date + + + + + Revised Meeting Date is required + + + +
+ +
+ + + + + + +
+ +
+ +
diff --git a/src/app/centers/centers-view/center-actions/edit-center-meeting-schedule/edit-center-meeting-schedule.component.scss b/src/app/centers/centers-view/center-actions/edit-center-meeting-schedule/edit-center-meeting-schedule.component.scss new file mode 100644 index 000000000..d774f68da --- /dev/null +++ b/src/app/centers/centers-view/center-actions/edit-center-meeting-schedule/edit-center-meeting-schedule.component.scss @@ -0,0 +1,3 @@ +.container { + max-width: 37rem; +} diff --git a/src/app/centers/centers-view/center-actions/edit-center-meeting-schedule/edit-center-meeting-schedule.component.spec.ts b/src/app/centers/centers-view/center-actions/edit-center-meeting-schedule/edit-center-meeting-schedule.component.spec.ts new file mode 100644 index 000000000..7229175f8 --- /dev/null +++ b/src/app/centers/centers-view/center-actions/edit-center-meeting-schedule/edit-center-meeting-schedule.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { EditCenterMeetingScheduleComponent } from './edit-center-meeting-schedule.component'; + +describe('EditCenterMeetingScheduleComponent', () => { + let component: EditCenterMeetingScheduleComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ EditCenterMeetingScheduleComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(EditCenterMeetingScheduleComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/centers/centers-view/center-actions/edit-center-meeting-schedule/edit-center-meeting-schedule.component.ts b/src/app/centers/centers-view/center-actions/edit-center-meeting-schedule/edit-center-meeting-schedule.component.ts new file mode 100644 index 000000000..d294d2b0c --- /dev/null +++ b/src/app/centers/centers-view/center-actions/edit-center-meeting-schedule/edit-center-meeting-schedule.component.ts @@ -0,0 +1,95 @@ +/** Angular Imports */ +import { Component, OnInit } from '@angular/core'; +import { FormGroup, FormBuilder, Validators, FormControl } from '@angular/forms'; +import { DatePipe } from '@angular/common'; +import { ActivatedRoute, Router } from '@angular/router'; + +/** Custom Services */ +import { CentersService } from 'app/centers/centers.service'; + +/** + * Edit Center Meetings Schedule Component + */ +@Component({ + selector: 'mifosx-edit-center-meeting-schedule', + templateUrl: './edit-center-meeting-schedule.component.html', + styleUrls: ['./edit-center-meeting-schedule.component.scss'] +}) +export class EditCenterMeetingScheduleComponent implements OnInit { + + /** Minimum date allowed. */ + minDate = new Date(2000, 0, 1); + /** Maximum date allowed. */ + maxDate = new Date(); + /** Center Meeting form. */ + centerEditMeetingScheduleForm: FormGroup; + /** Calendar Template Data */ + calendarTemplate: any; + /** Center Id */ + centerId: any; + /** CalendarI ID */ + calendarId: any; + /** Next meetings data */ + nextMeetingDates: any; + + /** + * Fetches Calendar Template from `resolve` + * @param {FormBuilder} formBuilder Form Builder + * @param {CentersService} centersService Shares Service + * @param {DatePipe} datePipe Date Pipe + * @param {ActivatedRoute} route Activated Route + * @param {Router} router Router + */ + constructor(private formBuilder: FormBuilder, + private centersService: CentersService, + private datePipe: DatePipe, + private route: ActivatedRoute, + private router: Router) { + this.route.data.subscribe((data: { centersActionData: any }) => { + this.calendarTemplate = data.centersActionData; + this.nextMeetingDates = this.calendarTemplate.nextTenRecurringDates; + }); + this.calendarId = this.route.snapshot.queryParams['calendarId']; + this.centerId = this.route.parent.snapshot.params['centerId']; + } + + ngOnInit() { + this.createEditMeetingScheduleForm(); + } + + /** + * Creates the Edit Center Meeting Schedule form. + */ + createEditMeetingScheduleForm() { + this.centerEditMeetingScheduleForm = this.formBuilder.group({ + 'presentMeetingDate': ['', Validators.required], + 'newMeetingDate': ['', Validators.required] + }); + } + + /** + * Submits the form and updates the meeting. + */ + submit() { + // TODO: Update once language and date settings are setup + const locale = 'en'; + const dateFormat = 'dd MMMM yyyy'; + const reschedulebasedOnMeetingDates = true; + const prevOldDate: Date = new Date(this.centerEditMeetingScheduleForm.value.presentMeetingDate); + const prevNewDate: Date = this.centerEditMeetingScheduleForm.value.newMeetingDate; + this.centerEditMeetingScheduleForm.patchValue({ + 'presentMeetingDate': this.datePipe.transform(prevOldDate, dateFormat), + 'newMeetingDate': this.datePipe.transform(prevNewDate, dateFormat) + }); + const data = { + ...this.centerEditMeetingScheduleForm.value, + reschedulebasedOnMeetingDates, + dateFormat, + locale + }; + this.centersService.updateCenterMeeting(this.centerId, data, this.calendarId).subscribe((response: any) => { + this.router.navigate(['../../'], { relativeTo: this.route }); + }); + } + +} diff --git a/src/app/centers/centers-view/center-actions/edit-center-meeting/edit-center-meeting.component.html b/src/app/centers/centers-view/center-actions/edit-center-meeting/edit-center-meeting.component.html new file mode 100644 index 000000000..6f8bc205c --- /dev/null +++ b/src/app/centers/centers-view/center-actions/edit-center-meeting/edit-center-meeting.component.html @@ -0,0 +1,81 @@ +
+ +
+ +
+ + + +
+ + + +
+ + + Repetition Frequency + + + {{ option.value }} + + + + Repetition Frequency is required + + + + + Repetition Interval + + + {{ interval }} + + + + Repeition Interval is required + + + + + Repeats on Day + + + {{ day.value }} + + + + At least one day must be selected + + + + + Above Changes are Effective from + + + + + Changes Affection Date is required + + + Note: 'Repeats' and 'Repeats every' cannot not be modified if there are active accounts
+ (JLG Loans, Recurring Deposits etc) dependent on this meeting. +
+
+ +
+ +
+ + + + + + +
+ +
+ +
diff --git a/src/app/centers/centers-view/center-actions/edit-center-meeting/edit-center-meeting.component.scss b/src/app/centers/centers-view/center-actions/edit-center-meeting/edit-center-meeting.component.scss new file mode 100644 index 000000000..d774f68da --- /dev/null +++ b/src/app/centers/centers-view/center-actions/edit-center-meeting/edit-center-meeting.component.scss @@ -0,0 +1,3 @@ +.container { + max-width: 37rem; +} diff --git a/src/app/centers/centers-view/center-actions/edit-center-meeting/edit-center-meeting.component.spec.ts b/src/app/centers/centers-view/center-actions/edit-center-meeting/edit-center-meeting.component.spec.ts new file mode 100644 index 000000000..1d6f35f02 --- /dev/null +++ b/src/app/centers/centers-view/center-actions/edit-center-meeting/edit-center-meeting.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { EditCenterMeetingComponent } from './edit-center-meeting.component'; + +describe('EditCenterMeetingComponent', () => { + let component: EditCenterMeetingComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ EditCenterMeetingComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(EditCenterMeetingComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/centers/centers-view/center-actions/edit-center-meeting/edit-center-meeting.component.ts b/src/app/centers/centers-view/center-actions/edit-center-meeting/edit-center-meeting.component.ts new file mode 100644 index 000000000..dcf58a7e4 --- /dev/null +++ b/src/app/centers/centers-view/center-actions/edit-center-meeting/edit-center-meeting.component.ts @@ -0,0 +1,141 @@ +/** Angular Imports */ +import { Component, OnInit } from '@angular/core'; +import { FormGroup, FormBuilder, Validators, FormControl } from '@angular/forms'; +import { DatePipe } from '@angular/common'; +import { ActivatedRoute, Router } from '@angular/router'; + +/** Custom Services */ +import { CentersService } from 'app/centers/centers.service'; + +/** + * Edit Center Meetings Component + */ +@Component({ + selector: 'mifosx-edit-center-meeting', + templateUrl: './edit-center-meeting.component.html', + styleUrls: ['./edit-center-meeting.component.scss'] +}) +export class EditCenterMeetingComponent implements OnInit { + + /** Minimum date allowed. */ + minDate = new Date(2000, 0, 1); + /** Maximum date allowed. */ + maxDate = new Date(); + /** Center Meeting form. */ + centerEditMeetingForm: FormGroup; + /** Calendar Template Data */ + calendarTemplate: any; + /** Center Id */ + centerId: any; + /** Repetition Intervals */ + repetitionIntervals: any[]; + /** Frequency Options */ + frequencyOptions: any; + /** Repetition Days Data */ + repeatsOnDays: any; + /** CalendarI ID */ + calendarId: any; + + /** + * Fetches Calendar Template from `resolve` + * @param {FormBuilder} formBuilder Form Builder + * @param {CentersService} centersService Shares Service + * @param {DatePipe} datePipe Date Pipe + * @param {ActivatedRoute} route Activated Route + * @param {Router} router Router + */ + constructor(private formBuilder: FormBuilder, + private centersService: CentersService, + private datePipe: DatePipe, + private route: ActivatedRoute, + private router: Router) { + this.route.data.subscribe((data: { centersActionData: any }) => { + this.calendarTemplate = data.centersActionData; + this.frequencyOptions = this.calendarTemplate.frequencyOptions; + this.repeatsOnDays = this.calendarTemplate.repeatsOnDayOptions; + }); + this.calendarId = this.route.snapshot.queryParams['calendarId']; + this.centerId = this.route.parent.snapshot.params['centerId']; + } + + ngOnInit() { + this.createEditCenterMeetingForm(); + this.buildDependencies(); + } + + /** + * Creates the Edit Center Meeting form. + */ + createEditCenterMeetingForm() { + this.centerEditMeetingForm = this.formBuilder.group({ + 'startDate': ['', Validators.required], + 'frequency': ['', Validators.required], + 'interval': ['', Validators.required] + }); + } + + /** + * Subscribes to value changes of controls. + */ + buildDependencies() { + this.centerEditMeetingForm.get('frequency').valueChanges.subscribe((frequency: any) => { + this.centerEditMeetingForm.removeControl('repeatsOnDay'); + switch (frequency) { + case 1: // Daily + this.repetitionIntervals = ['1', '2', '3']; + break; + case 2: // Weekly + this.repetitionIntervals = ['1', '2', '3']; + this.centerEditMeetingForm.addControl('repeatsOnDay', new FormControl('', Validators.required)); + this.centerEditMeetingForm.get('repeatsOnDay').patchValue(this.calendarTemplate.repeatsOnDay.id); + break; + case 3: // Monthly + this.repetitionIntervals = ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11']; + break; + case 4: // Yearly + this.repetitionIntervals = ['1', '2', '3', '4', '5']; + break; + } + }); + this.centerEditMeetingForm.patchValue({ + 'startDate': this.calendarTemplate.startDate && new Date(this.calendarTemplate.startDate), + 'frequency': this.calendarTemplate.frequency.id, + 'interval': `${this.calendarTemplate.interval}` + }); + } + + /** + * Navigate to edit meeting schedule form. + */ + editSchedule() { + const queryParams: any = { calendarId: this.calendarId }; + this.router.navigate([`../Edit Meeting Schedule`], { relativeTo: this.route, queryParams: queryParams }); + } + + /** + * Submits the form and updates the meeting. + */ + submit() { + // TODO: Update once language and date settings are setup + const locale = 'en'; + const dateFormat = 'dd MMMM yyyy'; + const title = `centers_${this.centerId}_CollectionMeeting`; + const typeId = '1'; + const prevStartDate: Date = this.centerEditMeetingForm.value.startDate; + this.centerEditMeetingForm.patchValue({ + startDate: this.datePipe.transform(prevStartDate, dateFormat), + }); + const data = { + ...this.centerEditMeetingForm.value, + repeating: true, + title, + typeId, + dateFormat, + locale + }; + this.centersService.updateCenterMeeting(this.centerId, data, this.calendarId).subscribe((response: any) => { + 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 38db5f929..89bf2ef69 100644 --- a/src/app/centers/centers-view/centers-view.component.html +++ b/src/app/centers/centers-view/centers-view.component.html @@ -39,7 +39,7 @@

Next Meeting on: {{centerViewData.collectionMeetingCalendar?.nextTenRecurringDates[0] | date}} -
+
Meeting Frequency: {{centerViewData.collectionMeetingCalendar?.frequency.value | lowercase}}

diff --git a/src/app/centers/centers-view/centers-view.component.ts b/src/app/centers/centers-view/centers-view.component.ts index df1925dc2..f1e7249ec 100644 --- a/src/app/centers/centers-view/centers-view.component.ts +++ b/src/app/centers/centers-view/centers-view.component.ts @@ -50,6 +50,19 @@ export class CentersViewComponent implements OnInit { } else { this.meetingData = false; } } + /** + * Checks if meeting is editable. + */ + get editMeeting() { + if (this.centerViewData.collectionMeetingCalendar) { + const entityType = this.centerViewData.collectionMeetingCalendar.entityType.value; + if (entityType === 'CENTERS' && this.centerViewData.hierarchy === '.' + this.centerViewData.id + '.' ) { + return true; + } + } + return false; + } + /** * Performs action button/option action. * @param {string} name action name. @@ -63,6 +76,10 @@ export class CentersViewComponent implements OnInit { case 'Attach Meeting': this.router.navigate([`actions/${name}`], { relativeTo: this.route }); break; + case 'Edit Meeting': + const queryParams: any = { calendarId: this.centerViewData.collectionMeetingCalendar.id }; + this.router.navigate([`actions/${name}`], { relativeTo: this.route, queryParams: queryParams }); + break; case 'Unassign Staff': this.centersUnassignStaff(); break; diff --git a/src/app/centers/centers.module.ts b/src/app/centers/centers.module.ts index f14862794..987bdd737 100644 --- a/src/app/centers/centers.module.ts +++ b/src/app/centers/centers.module.ts @@ -22,6 +22,8 @@ import { CenterAssignStaffComponent } from './centers-view/center-actions/center import { CloseCenterComponent } from './centers-view/center-actions/close-center/close-center.component'; import { CenterAttendanceComponent } from './centers-view/center-actions/center-attendance/center-attendance.component'; import { AttachCenterMeetingComponent } from './centers-view/center-actions/attach-center-meeting/attach-center-meeting.component'; +import { EditCenterMeetingComponent } from './centers-view/center-actions/edit-center-meeting/edit-center-meeting.component'; +import { EditCenterMeetingScheduleComponent } from './centers-view/center-actions/edit-center-meeting-schedule/edit-center-meeting-schedule.component'; /** * Centers Module @@ -49,7 +51,9 @@ import { AttachCenterMeetingComponent } from './centers-view/center-actions/atta CenterAssignStaffComponent, CloseCenterComponent, CenterAttendanceComponent, - AttachCenterMeetingComponent + AttachCenterMeetingComponent, + EditCenterMeetingComponent, + EditCenterMeetingScheduleComponent ] }) export class CentersModule { } diff --git a/src/app/centers/centers.service.ts b/src/app/centers/centers.service.ts index cb6668096..1a2a82fca 100644 --- a/src/app/centers/centers.service.ts +++ b/src/app/centers/centers.service.ts @@ -236,4 +236,13 @@ export class CentersService { return this.http.post(`/centers/${centerId}/calendars`, data); } + getCalendarAndTemplate(centerId: any, calendarId: any): Observable { + const httpParams = new HttpParams().set('template', 'true'); + return this.http.get(`/centers/${centerId}/calendars/${calendarId}`, { params: httpParams }); + } + + updateCenterMeeting(centerId: any, data: any, calendarId: any): Observable { + return this.http.put(`/centers/${centerId}/calendars/${calendarId}`, data); + } + } diff --git a/src/app/centers/common-resolvers/center-actions.resolver.ts b/src/app/centers/common-resolvers/center-actions.resolver.ts index 869cdf015..aa3dba49f 100644 --- a/src/app/centers/common-resolvers/center-actions.resolver.ts +++ b/src/app/centers/common-resolvers/center-actions.resolver.ts @@ -34,6 +34,10 @@ export class CenterActionsResolver implements Resolve { return this.centersService.getCentersData(centerId); case 'Attach Meeting': return this.centersService.getCalendarTemplate(centerId); + case 'Edit Meeting': + case 'Edit Meeting Schedule': + const calendarId = route.queryParamMap.get('calendarId'); + return this.centersService.getCalendarAndTemplate(centerId, calendarId); default: return undefined; }