diff --git a/src/app/clients/clients-routing.module.ts b/src/app/clients/clients-routing.module.ts index 7f760420b..3623b83e7 100644 --- a/src/app/clients/clients-routing.module.ts +++ b/src/app/clients/clients-routing.module.ts @@ -22,6 +22,7 @@ import { AddressTabComponent } from './clients-view/address-tab/address-tab.comp import { ClientActionsComponent } from './clients-view/client-actions/client-actions.component'; import { ViewChargeComponent } from './clients-view/charges/view-charge/view-charge.component'; import { ClientPayChargesComponent } from './clients-view/charges/client-pay-charges/client-pay-charges.component'; +import { EditClientComponent } from './edit-client/edit-client.component'; /** Custom Resolvers */ import { ClientViewResolver } from './common-resolvers/client-view.resolver'; @@ -45,6 +46,7 @@ import { ClientChargeOverviewResolver } from './clients-view/charges/charges-ove import { ClientActionsResolver } from './common-resolvers/client-actions.resolver'; import { ClientChargeViewResolver } from './common-resolvers/client-charge-view.resolver'; import { ClientTransactionPayResolver } from './common-resolvers/client-transaction-pay.resolver'; +import { ClientDataAndTemplateResolver } from './common-resolvers/client-and-template.resolver'; const routes: Routes = [ Route.withShell([{ @@ -166,6 +168,14 @@ const routes: Routes = [ path: ':clientId', data: { title: extract('Clients View'), routeParamBreadcrumb: 'clientId' }, children: [ + { + path: 'edit', + data: { title: extract('Edit Client'), breadcrumb: 'Edit', routeParamBreadcrumb: false }, + component: EditClientComponent, + resolve: { + clientDataAndTemplate: ClientDataAndTemplateResolver + } + }, { path: 'actions/:name', data: { title: extract('Client Actions'), routeParamBreadcrumb: 'name' }, @@ -263,7 +273,8 @@ const routes: Routes = [ ClientChargeOverviewResolver, ClientActionsResolver, ClientChargeViewResolver, - ClientTransactionPayResolver + ClientTransactionPayResolver, + ClientDataAndTemplateResolver ] }) export class ClientsRoutingModule { } diff --git a/src/app/clients/clients-view/clients-view.component.html b/src/app/clients/clients-view/clients-view.component.html index 077661e4a..c919ea4f2 100644 --- a/src/app/clients/clients-view/clients-view.component.html +++ b/src/app/clients/clients-view/clients-view.component.html @@ -31,7 +31,7 @@ - + diff --git a/src/app/clients/clients.module.ts b/src/app/clients/clients.module.ts index 7cc664ab7..38cd4a6c7 100644 --- a/src/app/clients/clients.module.ts +++ b/src/app/clients/clients.module.ts @@ -49,6 +49,7 @@ import { UploadSignatureDialogComponent } from './clients-view/custom-dialogs/up import { DeleteSignatureDialogComponent } from './clients-view/custom-dialogs/delete-signature-dialog/delete-signature-dialog.component'; import { UploadImageDialogComponent } from './clients-view/custom-dialogs/upload-image-dialog/upload-image-dialog.component'; import { ClientScreenReportsComponent } from './clients-view/client-actions/client-screen-reports/client-screen-reports.component'; +import { EditClientComponent } from './edit-client/edit-client.component'; /** @@ -103,7 +104,8 @@ import { ClientScreenReportsComponent } from './clients-view/client-actions/clie UploadSignatureDialogComponent, DeleteSignatureDialogComponent, UploadImageDialogComponent, - ClientScreenReportsComponent + ClientScreenReportsComponent, + EditClientComponent ], entryComponents: [ UploadDocumentDialogComponent, diff --git a/src/app/clients/clients.service.ts b/src/app/clients/clients.service.ts index 08796cba7..8cdfeaf2c 100644 --- a/src/app/clients/clients.service.ts +++ b/src/app/clients/clients.service.ts @@ -45,6 +45,10 @@ export class ClientsService { return this.http.get(`/clients/${clientId}`); } + updateClient(clientId: string, client: any) { + return this.http.put(`/clients/${clientId}`, client); + } + deleteClient(clientId: string) { return this.http.delete(`/clients/${clientId}`); } diff --git a/src/app/clients/common-resolvers/client-and-template.resolver.ts b/src/app/clients/common-resolvers/client-and-template.resolver.ts new file mode 100644 index 000000000..6216fed48 --- /dev/null +++ b/src/app/clients/common-resolvers/client-and-template.resolver.ts @@ -0,0 +1,31 @@ +/** Angular Imports */ +import { Injectable } from '@angular/core'; +import { Resolve, ActivatedRouteSnapshot } from '@angular/router'; + +/** rxjs Imports */ +import { Observable } from 'rxjs'; + +/** Custom Services */ +import { ClientsService } from '../clients.service'; + +/** + * Clients data and template resolver. + */ +@Injectable() +export class ClientDataAndTemplateResolver implements Resolve { + + /** + * @param {ClientsService} ClientsService Clients service. + */ + constructor(private clientsService: ClientsService) { } + + /** + * Returns the Clients data and template. + * @returns {Observable} + */ + resolve(route: ActivatedRouteSnapshot): Observable { + const clientId = route.paramMap.get('clientId'); + return this.clientsService.getClientDataAndTemplate(clientId); + } + +} diff --git a/src/app/clients/edit-client/edit-client.component.html b/src/app/clients/edit-client/edit-client.component.html new file mode 100644 index 000000000..7b4dfbaee --- /dev/null +++ b/src/app/clients/edit-client/edit-client.component.html @@ -0,0 +1,194 @@ +
+ + + +
+ + + +
+ + + Office + + + {{ office.name }} + + + + Office is required + + + + + Staff + + + {{ staff.displayName }} + + + + + + Legal Form + + + {{ legalForm.value }} + + + + + + Name + + + Client name is required + + + + + First Name + + + Client first name is required + + + + + Middle Name + + + + + Last Name + + + Client last name is required + + + + + {{ editClientForm.value.legalFormId === 1 ? 'Date of Birth' : 'Incorporation Date' }} + + + + + + + Account No + + + + + External Id + + + + + Mobile No + + + + + Client Type + + + {{ clientType.name }} + + + + + + Client Classification + + + {{ clientClassification.name }} + + + + + + Submitted On + + + + + + + Activated On + + + + + Activation Date is required + + + + + Gender + + + {{ gender.name }} + + + + + + Is staff? + + +
+ + + Incorporation Validity Till Date + + + + + + + Incorporation No + + + + + Main Business Line + + + {{ business.name }} + + + + + + Constitution + + + {{ constitution.name }} + + + + + + Remarks + + + +
+ +
+ +
+ + + + + + +
+ +
+ +
diff --git a/src/app/clients/edit-client/edit-client.component.scss b/src/app/clients/edit-client/edit-client.component.scss new file mode 100644 index 000000000..5fbc7952b --- /dev/null +++ b/src/app/clients/edit-client/edit-client.component.scss @@ -0,0 +1,3 @@ +.margin-v { + margin: 2em 0 0 0; +} diff --git a/src/app/clients/edit-client/edit-client.component.spec.ts b/src/app/clients/edit-client/edit-client.component.spec.ts new file mode 100644 index 000000000..2f57c925f --- /dev/null +++ b/src/app/clients/edit-client/edit-client.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { EditClientComponent } from './edit-client.component'; + +describe('EditClientComponent', () => { + let component: EditClientComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ EditClientComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(EditClientComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/clients/edit-client/edit-client.component.ts b/src/app/clients/edit-client/edit-client.component.ts new file mode 100644 index 000000000..409c20223 --- /dev/null +++ b/src/app/clients/edit-client/edit-client.component.ts @@ -0,0 +1,182 @@ +/** Angular Imports */ +import { Component, OnInit } from '@angular/core'; +import { ActivatedRoute, Router } from '@angular/router'; +import { FormBuilder, FormGroup, Validators, FormControl } from '@angular/forms'; +import { DatePipe } from '@angular/common'; + +/** Custom Services */ +import { ClientsService } from '../clients.service'; + +/** + * Edit Client Component + */ +@Component({ + selector: 'mifosx-edit-client', + templateUrl: './edit-client.component.html', + styleUrls: ['./edit-client.component.scss'] +}) +export class EditClientComponent implements OnInit { + + /** Minimum date allowed. */ + minDate = new Date(2000, 0, 1); + /** Maximum date allowed. */ + maxDate = new Date(); + + /** Client Data and Template */ + clientDataAndTemplate: any; + /** Edit Client Form */ + editClientForm: FormGroup; + + /** Office Options */ + officeOptions: any; + /** Staff Options */ + staffOptions: any; + /** Legal Form Options */ + legalFormOptions: any; + /** Client Type Options */ + clientTypeOptions: any; + /** Client Classification Options */ + clientClassificationTypeOptions: any; + /** Business Line Options */ + businessLineOptions: any; + /** Constitution Options */ + constitutionOptions: any; + /** Gender Options */ + genderOptions: any; + + /** + * Fetches client template data from `resolve` + * @param {FormBuilder} formBuilder Form Builder + * @param {ActivatedRoute} route ActivatedRoute + * @param {Router} router Router + * @param {ClientsService} clientsService Clients Service + * @param {DatePipe} datePipe Date Pipe + */ + constructor(private formBuilder: FormBuilder, + private route: ActivatedRoute, + private router: Router, + private clientsService: ClientsService, + private datePipe: DatePipe) { + this.route.data.subscribe((data: { clientDataAndTemplate: any }) => { + this.clientDataAndTemplate = data.clientDataAndTemplate; + }); + } + + ngOnInit() { + this.createEditClientForm(); + this.setOptions(); + this.buildDependencies(); + this.editClientForm.patchValue({ + 'officeId': this.clientDataAndTemplate.officeId, + 'staffId': this.clientDataAndTemplate.staffId, + 'legalFormId': this.clientDataAndTemplate.legalForm && this.clientDataAndTemplate.legalForm.id, + 'accountNo': this.clientDataAndTemplate.accountNo, + 'externalId': this.clientDataAndTemplate.externalId, + 'genderId': this.clientDataAndTemplate.gender && this.clientDataAndTemplate.gender.id, + 'isStaff': this.clientDataAndTemplate.isStaff, + 'active': this.clientDataAndTemplate.active, + 'mobileNo': this.clientDataAndTemplate.mobileNo, + 'dateOfBirth': this.clientDataAndTemplate.dateOfBirth && new Date(this.clientDataAndTemplate.dateOfBirth), + 'clientTypeId': this.clientDataAndTemplate.clientType && this.clientDataAndTemplate.clientType.id, + 'clientClassificationId': this.clientDataAndTemplate.clientClassification && this.clientDataAndTemplate.clientClassification.id, + 'submittedOnDate': this.clientDataAndTemplate.timeline.submittedOnDate && new Date(this.clientDataAndTemplate.timeline.submittedOnDate), + 'activationDate': this.clientDataAndTemplate.timeline.activatedOnDate && new Date(this.clientDataAndTemplate.timeline.activatedOnDate) + }); + } + + /** + * Creates the edit client form. + */ + createEditClientForm() { + this.editClientForm = this.formBuilder.group({ + 'officeId': [{ value: '', disabled: true }], + 'staffId': [''], + 'legalFormId': [''], + 'isStaff': [false], + 'active': [false], + 'accountNo': [{ value: '', disabled: true }], + 'externalId': [''], + 'genderId': [''], + 'mobileNo': [''], + 'dateOfBirth': [''], + 'clientTypeId': [''], + 'clientClassificationId': [''], + 'submittedOnDate': [''], + 'activationDate': ['', Validators.required] + }); + } + + /** + * Sets select dropdown options. + */ + setOptions() { + this.officeOptions = this.clientDataAndTemplate.officeOptions; + this.staffOptions = this.clientDataAndTemplate.staffOptions; + this.legalFormOptions = this.clientDataAndTemplate.clientLegalFormOptions; + this.clientTypeOptions = this.clientDataAndTemplate.clientTypeOptions; + this.clientClassificationTypeOptions = this.clientDataAndTemplate.clientClassificationOptions; + this.businessLineOptions = this.clientDataAndTemplate.clientNonPersonMainBusinessLineOptions; + this.constitutionOptions = this.clientDataAndTemplate.clientNonPersonConstitutionOptions; + this.genderOptions = this.clientDataAndTemplate.genderOptions; + } + + /** + * Adds controls conditionally. + */ + buildDependencies() { + this.editClientForm.get('legalFormId').valueChanges.subscribe((legalFormId: any) => { + if (legalFormId === 1) { + this.editClientForm.removeControl('fullname'); + this.editClientForm.removeControl('clientNonPersonDetails'); + this.editClientForm.addControl('firstname', new FormControl(this.clientDataAndTemplate.firstname, Validators.required)); + this.editClientForm.addControl('middlename', new FormControl(this.clientDataAndTemplate.middlename)); + this.editClientForm.addControl('lastname', new FormControl(this.clientDataAndTemplate.lastname, Validators.required)); + } else { + this.editClientForm.removeControl('firstname'); + this.editClientForm.removeControl('middlename'); + this.editClientForm.removeControl('lastname'); + this.editClientForm.addControl('fullname', new FormControl(this.clientDataAndTemplate.fullname, Validators.required)); + this.editClientForm.addControl('clientNonPersonDetails', this.formBuilder.group({ + 'constitutionId': [this.clientDataAndTemplate.clientNonPersonDetails.constitution && this.clientDataAndTemplate.clientNonPersonDetails.constitution.id], + 'incorpValidityTillDate': [this.clientDataAndTemplate.clientNonPersonDetails.incorpValidityTillDate && new Date(this.clientDataAndTemplate.clientNonPersonDetails.incorpValidityTillDate)], + 'incorpNumber': [this.clientDataAndTemplate.clientNonPersonDetails.incorpNumber], + 'mainBusinessLineId': [this.clientDataAndTemplate.clientNonPersonDetails.mainBusinessLine && this.clientDataAndTemplate.clientNonPersonDetails.mainBusinessLine.id], + 'remarks': [this.clientDataAndTemplate.clientNonPersonDetails.remarks] + })); + } + }); + } + + /** + * Submits the edit client form. + */ + submit() { + const locale = 'en'; + const dateFormat = 'dd MMMM yyyy'; + // TODO: Update once language and date settings are setup + const editClientFormValue: any = this.editClientForm.getRawValue(); + const clientData = { + ...editClientFormValue, + dateOfBirth: editClientFormValue.dateOfBirth && this.datePipe.transform(editClientFormValue.dateOfBirth, dateFormat), + submittedOnDate: editClientFormValue.submittedOnDate && this.datePipe.transform(editClientFormValue.submittedOnDate, dateFormat), + activationDate: this.datePipe.transform(editClientFormValue.activationDate, dateFormat), + dateFormat, + locale + }; + delete clientData.officeId; + if (editClientFormValue.clientNonPersonDetails) { + clientData.clientNonPersonDetails = { + ...editClientFormValue.clientNonPersonDetails, + incorpValidityTillDate: editClientFormValue.clientNonPersonDetails.incorpValidityTillDate && this.datePipe.transform(editClientFormValue.clientNonPersonDetails.incorpValidityTillDate, dateFormat), + dateFormat, + locale + }; + } else { + clientData.clientNonPersonDetails = {}; + } + this.clientsService.updateClient(this.clientDataAndTemplate.id, clientData).subscribe(() => { + this.router.navigate(['../'], { relativeTo: this.route }); + }); + } + +}