diff --git a/src/app/clients/clients-routing.module.ts b/src/app/clients/clients-routing.module.ts index e7e394f69..38846748b 100644 --- a/src/app/clients/clients-routing.module.ts +++ b/src/app/clients/clients-routing.module.ts @@ -11,6 +11,7 @@ import { extract } from '../core/i18n/i18n.service'; import { ClientsComponent } from './clients.component'; import { ClientsViewComponent } from './clients-view/clients-view.component'; import { GeneralTabComponent } from './clients-view/general-tab/general-tab.component'; +import { FamilyMembersTabComponent } from './clients-view/family-members-tab/family-members-tab.component'; /** Custom Resolvers */ import { ClientsResolver } from './common-resolvers/clients.resolver'; @@ -18,6 +19,9 @@ import { ClientViewResolver } from './common-resolvers/client-view.resolver'; import { ClientAccountsResolver } from './common-resolvers/client-accounts.resolver'; import { ClientChargesResolver } from './common-resolvers/client-charges.resolver'; import { ClientSummaryResolver } from './common-resolvers/client-summary.resolver'; +import { ClientFamilyMembersResolver } from './common-resolvers/client-family-members.resolver'; +import { ClientFamilyMemberResolver } from './common-resolvers/client-family-member.resolver'; +import { ClientTemplateResolver } from './common-resolvers/client-template.resolver'; const routes: Routes = [ Route.withShell([{ @@ -36,7 +40,7 @@ const routes: Routes = [ component: ClientsViewComponent, data: { title: extract('Clients View'), routeParamBreadcrumb: 'clientId' }, resolve: { - clientViewData: ClientViewResolver + clientViewData: ClientViewResolver, }, children: [ { @@ -46,8 +50,19 @@ const routes: Routes = [ clientAccountsData: ClientAccountsResolver, clientChargesData: ClientChargesResolver, clientSummary: ClientSummaryResolver - }, - + } + }, + { + path: 'family-members', + children: [ + { + path: '', + component: FamilyMembersTabComponent, + resolve: { + clientFamilyMembers: ClientFamilyMembersResolver + } + } + ] } ] } @@ -64,7 +79,10 @@ const routes: Routes = [ ClientViewResolver, ClientAccountsResolver, ClientChargesResolver, - ClientSummaryResolver + ClientSummaryResolver, + ClientFamilyMembersResolver, + ClientFamilyMemberResolver, + ClientTemplateResolver ] }) 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 8eeff756f..da06c310d 100644 --- a/src/app/clients/clients-view/clients-view.component.html +++ b/src/app/clients/clients-view/clients-view.component.html @@ -4,7 +4,8 @@
- +
@@ -43,9 +44,12 @@ diff --git a/src/app/clients/clients-view/clients-view.component.ts b/src/app/clients/clients-view/clients-view.component.ts index 6ae13c578..44ab00355 100644 --- a/src/app/clients/clients-view/clients-view.component.ts +++ b/src/app/clients/clients-view/clients-view.component.ts @@ -13,19 +13,18 @@ import { ClientsService } from '../clients.service'; export class ClientsViewComponent implements OnInit { clientViewData: any; clientImage: any; + clientTemplate: any; constructor(private route: ActivatedRoute, private clientsService: ClientsService, private _sanitizer: DomSanitizer) { this.route.data.subscribe((data: { clientViewData: any }) => { this.clientViewData = data.clientViewData; }); - } ngOnInit() { - this.clientsService.getClientProfileImage(this.clientViewData.id).subscribe(base64Image => { + this.clientsService.getClientProfileImage(this.clientViewData.id).subscribe((base64Image: any) => { this.clientImage = this._sanitizer.bypassSecurityTrustResourceUrl(base64Image); }); } - } diff --git a/src/app/clients/clients-view/family-members-tab/family-members-tab.component.html b/src/app/clients/clients-view/family-members-tab/family-members-tab.component.html new file mode 100644 index 000000000..2b1c7d6f5 --- /dev/null +++ b/src/app/clients/clients-view/family-members-tab/family-members-tab.component.html @@ -0,0 +1,47 @@ +
+ +

Family Members

+
+ +
+ + + + + {{member.firstName+' '+member.middleName+' '+member.lastName}} + + + {{member.relationship}} + + + +
+ + + +
+

+ First Name : {{member.firstName}}
+ Middle Name : {{member.middleName}}
+ Last Name : {{member.lastName}}
+ Qualification : {{member.qualification}}
+ Mobile Number : {{member.mobileNumber}}
+ Age : {{member.age}}
+ Is Dependent : {{member.isDependent}}
+ Martial Status : {{member.maritalStatus}}
+ Gender : {{member.gender}}
+ Profession : {{member.profession}}
+ Date Of Birth : {{member.dateOfBirth|date}}
+

+ +
+ +
+
+
\ No newline at end of file diff --git a/src/app/clients/clients-view/family-members-tab/family-members-tab.component.scss b/src/app/clients/clients-view/family-members-tab/family-members-tab.component.scss new file mode 100644 index 000000000..bd6467910 --- /dev/null +++ b/src/app/clients/clients-view/family-members-tab/family-members-tab.component.scss @@ -0,0 +1,21 @@ +.tab-container { + padding:1%; + margin: 1%; + + .family-member { + .family-member-actions{ + margin-top: 1%; + button{ + margin-right: 1%; + } + } + h3 { + margin: 1% auto; + } + + p { + line-height: 30px; + margin-left: 2%; + } + } +} diff --git a/src/app/clients/clients-view/family-members-tab/family-members-tab.component.spec.ts b/src/app/clients/clients-view/family-members-tab/family-members-tab.component.spec.ts new file mode 100644 index 000000000..e11fb37fb --- /dev/null +++ b/src/app/clients/clients-view/family-members-tab/family-members-tab.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { FamilyMembersTabComponent } from './family-members-tab.component'; + +describe('FamilyMembersTabComponent', () => { + let component: FamilyMembersTabComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ FamilyMembersTabComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(FamilyMembersTabComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/clients/clients-view/family-members-tab/family-members-tab.component.ts b/src/app/clients/clients-view/family-members-tab/family-members-tab.component.ts new file mode 100644 index 000000000..c6c7a8fb8 --- /dev/null +++ b/src/app/clients/clients-view/family-members-tab/family-members-tab.component.ts @@ -0,0 +1,47 @@ +import { Component, OnInit } from '@angular/core'; +import { Router, ActivatedRoute } from '@angular/router'; +import { MatDialog } from '@angular/material'; + +/** Custom Components */ +import { DeleteDialogComponent } from '../../../shared/delete-dialog/delete-dialog.component'; + +/** Custom Services */ +import { ClientsService } from '../../clients.service'; + +@Component({ + selector: 'mifosx-family-members-tab', + templateUrl: './family-members-tab.component.html', + styleUrls: ['./family-members-tab.component.scss'] +}) +export class FamilyMembersTabComponent implements OnInit { + clientFamilyMembers: any; + constructor(private route: ActivatedRoute, + private router: Router, + private clientsService: ClientsService, + public dialog: MatDialog) { + this.route.data.subscribe((data: { clientFamilyMembers: any }) => { + this.clientFamilyMembers = data.clientFamilyMembers; + }); + } + + ngOnInit() { + } + + /** + * Deletes the family member and redirects to family members tab. + */ + deleteFamilyMember(clientId: string, id: string, name: string, index: number) { + const deleteFamilyMemberDialogRef = this.dialog.open(DeleteDialogComponent, { + data: { deleteContext: `Family member id:${id} name : ${name} ${index}` } + }); + deleteFamilyMemberDialogRef.afterClosed().subscribe((response: any) => { + if (response.delete) { + this.clientsService.deleteFamilyMember(clientId, id) + .subscribe(() => { + this.clientFamilyMembers.splice(index, 1); + }); + } + }); + } + +} diff --git a/src/app/clients/clients-view/general-tab/general-tab.component.html b/src/app/clients/clients-view/general-tab/general-tab.component.html index 4de5ab870..53445a927 100644 --- a/src/app/clients/clients-view/general-tab/general-tab.component.html +++ b/src/app/clients/clients-view/general-tab/general-tab.component.html @@ -2,13 +2,13 @@

Performance History

- No. Of Loan Cycles :{{clientSummary.loanCycle}}
- No. of Active Loans :{{clientSummary.activeLoans}}
- Last Loan Amount :{{clientSummary.lastLoanAmount}}
+ No. Of Loan Cycles :{{clientSummary?.loanCycle}}
+ No. of Active Loans :{{clientSummary?.activeLoans}}
+ Last Loan Amount :{{clientSummary?.lastLoanAmount}}

- No. of Active Savings :{{clientSummary.activeSavings}}
- Total Savings :{{clientSummary.totalSavings}}
+ No. of Active Savings :{{clientSummary?.activeSavings}}
+ Total Savings :{{clientSummary?.totalSavings}}

diff --git a/src/app/clients/clients.module.ts b/src/app/clients/clients.module.ts index 6ad908519..6e2e47013 100644 --- a/src/app/clients/clients.module.ts +++ b/src/app/clients/clients.module.ts @@ -11,6 +11,8 @@ import { ClientsComponent } from './clients.component'; import { ClientsViewComponent } from './clients-view/clients-view.component'; import { GeneralTabComponent } from './clients-view/general-tab/general-tab.component'; import {PipesModule} from '../pipes/pipes.module'; +import { FamilyMembersTabComponent } from './clients-view/family-members-tab/family-members-tab.component'; + /** @@ -27,7 +29,9 @@ import {PipesModule} from '../pipes/pipes.module'; declarations: [ ClientsComponent, ClientsViewComponent, - GeneralTabComponent], + GeneralTabComponent, + FamilyMembersTabComponent, + ], providers: [DatePipe] }) diff --git a/src/app/clients/clients.service.ts b/src/app/clients/clients.service.ts index 34b977c19..636ac7e2b 100644 --- a/src/app/clients/clients.service.ts +++ b/src/app/clients/clients.service.ts @@ -20,6 +20,10 @@ export class ClientsService { const httpParams = new HttpParams().set('orderBy', 'id'); return this.http.get('/clients', { params: httpParams }); } + + getClientTemplate(): Observable { + return this.http.get('/clients/template'); + } getClientData(clientId: string) { return this.http.get(`/clients/${clientId}`); } @@ -39,4 +43,19 @@ export class ClientsService { const httpParams = new HttpParams().set('maxHeight', '150'); return this.http.get(`/clients/${clientId}/images`, { params: httpParams, responseType: 'text' }); } + getClientFamilyMembers(clientId: string) { + return this.http.get(`/clients/${clientId}/familymembers`); + } + getClientFamilyMember(clientId: string, familyMemberId: string) { + return this.http.get(`/clients/${clientId}/familymembers/${familyMemberId}`); + } + addFamilyMember(clientId: string, familyMemberData: any) { + return this.http.post(`/clients/${clientId}/familymembers`, familyMemberData); + } + editFamilyMember(clientId: string, familyMemberId: any, familyMemberData: any) { + return this.http.put(`/clients/${clientId}/familymembers/${familyMemberId}`, familyMemberData); + } + deleteFamilyMember(clientId: string, familyMemberId: string) { + return this.http.delete(`/clients/${clientId}/familymembers/${familyMemberId}`); + } } diff --git a/src/app/clients/common-resolvers/client-family-member.resolver.ts b/src/app/clients/common-resolvers/client-family-member.resolver.ts new file mode 100644 index 000000000..d800a5c71 --- /dev/null +++ b/src/app/clients/common-resolvers/client-family-member.resolver.ts @@ -0,0 +1,32 @@ +/** 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'; + +/** + * Client Family Member resolver. + */ +@Injectable() +export class ClientFamilyMemberResolver implements Resolve { + + /** + * @param {ClientsService} ClientsService Clients service. + */ + constructor(private clientsService: ClientsService) { } + + /** + * Returns the Clients data. + * @returns {Observable} + */ + resolve(route: ActivatedRouteSnapshot): Observable { + const clientId = route.parent.parent.parent.paramMap.get('clientId'); + const familyMemberId = route.parent.paramMap.get('familyMemberId'); + return this.clientsService.getClientFamilyMember(clientId, familyMemberId); + } + +} diff --git a/src/app/clients/common-resolvers/client-family-members.resolver.ts b/src/app/clients/common-resolvers/client-family-members.resolver.ts new file mode 100644 index 000000000..e9a4a533f --- /dev/null +++ b/src/app/clients/common-resolvers/client-family-members.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'; + +/** + * Client Family Members resolver. + */ +@Injectable() +export class ClientFamilyMembersResolver implements Resolve { + + /** + * @param {ClientsService} ClientsService Clients service. + */ + constructor(private clientsService: ClientsService) { } + + /** + * Returns the Clients data. + * @returns {Observable} + */ + resolve(route: ActivatedRouteSnapshot): Observable { + const clientId = route.parent.parent.paramMap.get('clientId'); + return this.clientsService.getClientFamilyMembers(clientId); + } + +} diff --git a/src/app/clients/common-resolvers/client-template.resolver.ts b/src/app/clients/common-resolvers/client-template.resolver.ts new file mode 100644 index 000000000..3c7718da6 --- /dev/null +++ b/src/app/clients/common-resolvers/client-template.resolver.ts @@ -0,0 +1,30 @@ +/** 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'; + +/** + * Client Template resolver. + */ +@Injectable() +export class ClientTemplateResolver implements Resolve { + + /** + * @param {ClientsService} ClientsService Clients service. + */ + constructor(private clientsService: ClientsService) { } + + /** + * Returns the Client Template data. + * @returns {Observable} + */ + resolve(route: ActivatedRouteSnapshot): Observable { + return this.clientsService.getClientTemplate(); + } + +} diff --git a/src/app/shared/delete-dialog/delete-dialog.component.html b/src/app/shared/delete-dialog/delete-dialog.component.html index eacc70bd3..3acea2271 100644 --- a/src/app/shared/delete-dialog/delete-dialog.component.html +++ b/src/app/shared/delete-dialog/delete-dialog.component.html @@ -3,6 +3,6 @@

Are you sure you want to delete {{ data.deleteContext }} ?

- - + +