diff --git a/src/app/clients/clients-view/clients-view.component.html b/src/app/clients/clients-view/clients-view.component.html index f3d9c5ac0..6c62633ed 100644 --- a/src/app/clients/clients-view/clients-view.component.html +++ b/src/app/clients/clients-view/clients-view.component.html @@ -47,6 +47,9 @@ + + + diff --git a/src/app/clients/clients-view/clients-view.component.ts b/src/app/clients/clients-view/clients-view.component.ts index a58808ae4..b13d226ea 100644 --- a/src/app/clients/clients-view/clients-view.component.ts +++ b/src/app/clients/clients-view/clients-view.component.ts @@ -6,6 +6,9 @@ import { MatDialog } from '@angular/material'; /** Custom Dialogs */ import { UnassignStaffDialogComponent } from './custom-dialogs/unassign-staff-dialog/unassign-staff-dialog.component'; +import { UploadSignatureDialogComponent } from './custom-dialogs/upload-signature-dialog/upload-signature-dialog.component'; +import { ViewSignatureDialogComponent } from './custom-dialogs/view-signature-dialog/view-signature-dialog.component'; +import { DeleteSignatureDialogComponent } from './custom-dialogs/delete-signature-dialog/delete-signature-dialog.component'; import { DeleteDialogComponent } from 'app/shared/delete-dialog/delete-dialog.component'; /** Custom Services */ @@ -43,10 +46,8 @@ export class ClientsViewComponent implements OnInit { this.clientsService.getClientProfileImage(this.clientViewData.id).subscribe( (base64Image: any) => { this.clientImage = this._sanitizer.bypassSecurityTrustResourceUrl(base64Image); - }, - (error: any) => {} + }, (error: any) => {} ); - } /** @@ -76,6 +77,16 @@ export class ClientsViewComponent implements OnInit { break; case 'Delete': this.deleteClient(); + break; + case 'View Signature': + this.viewSignature(); + break; + case 'Upload Signature': + this.uploadSignature(); + break; + case 'Delete Signature': + this.deleteSignature(); + break; } } @@ -121,4 +132,61 @@ export class ClientsViewComponent implements OnInit { }); } + /** + * Shows client signature in a dialog + */ + private viewSignature() { + this.clientsService.getClientDocuments(this.clientViewData.id).subscribe((documents: any) => { + const viewSignatureDialogRef = this.dialog.open(ViewSignatureDialogComponent, { + data: { + documents: documents, + id: this.clientViewData.id + } + }); + viewSignatureDialogRef.afterClosed().subscribe((response: any) => { + if (response.upload) { + this.uploadSignature(); + } else if (response.delete) { + this.deleteSignature(); + } + }); + }); + } + + /** + * Uploads client signature + */ + private uploadSignature() { + const uploadSignatureDialogRef = this.dialog.open(UploadSignatureDialogComponent); + uploadSignatureDialogRef.afterClosed().subscribe((signature: File) => { + if (signature) { + this.clientsService.uploadClientSignature(this.clientViewData.id, signature) + .subscribe(() => { + this.reload(); + }); + } + }); + } + + /** + * Deletes client signature + */ + private deleteSignature() { + this.clientsService.getClientDocuments(this.clientViewData.id).subscribe((documents: any) => { + const deleteSignatureDialogRef = this.dialog.open(DeleteSignatureDialogComponent, { + data: documents + }); + deleteSignatureDialogRef.afterClosed().subscribe((response: any) => { + if (response.delete) { + this.clientsService.deleteClientDocument(this.clientViewData.id, response.id) + .subscribe(() => { + this.reload(); + }); + } else if (response.upload) { + this.uploadSignature(); + } + }); + }); + } + } diff --git a/src/app/clients/clients-view/custom-dialogs/delete-signature-dialog/delete-signature-dialog.component.html b/src/app/clients/clients-view/custom-dialogs/delete-signature-dialog/delete-signature-dialog.component.html new file mode 100644 index 000000000..d596b8dea --- /dev/null +++ b/src/app/clients/clients-view/custom-dialogs/delete-signature-dialog/delete-signature-dialog.component.html @@ -0,0 +1,15 @@ +

Delete Client Signature

+ +
+

Are you sure you want to delete this clients signature ?

+
+ +
+

Client Signature is not provided.

+
+ + + + + + diff --git a/src/app/clients/clients-view/custom-dialogs/delete-signature-dialog/delete-signature-dialog.component.scss b/src/app/clients/clients-view/custom-dialogs/delete-signature-dialog/delete-signature-dialog.component.scss new file mode 100644 index 000000000..e69de29bb diff --git a/src/app/clients/clients-view/custom-dialogs/delete-signature-dialog/delete-signature-dialog.component.spec.ts b/src/app/clients/clients-view/custom-dialogs/delete-signature-dialog/delete-signature-dialog.component.spec.ts new file mode 100644 index 000000000..7abb3390e --- /dev/null +++ b/src/app/clients/clients-view/custom-dialogs/delete-signature-dialog/delete-signature-dialog.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { DeleteSignatureDialogComponent } from './delete-signature-dialog.component'; + +describe('DeleteSignatureDialogComponent', () => { + let component: DeleteSignatureDialogComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ DeleteSignatureDialogComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(DeleteSignatureDialogComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/clients/clients-view/custom-dialogs/delete-signature-dialog/delete-signature-dialog.component.ts b/src/app/clients/clients-view/custom-dialogs/delete-signature-dialog/delete-signature-dialog.component.ts new file mode 100644 index 000000000..69aa333f9 --- /dev/null +++ b/src/app/clients/clients-view/custom-dialogs/delete-signature-dialog/delete-signature-dialog.component.ts @@ -0,0 +1,28 @@ +/** Angular Imports */ +import { Component, Inject } from '@angular/core'; +import { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material'; + +/** + * Delete signature dialog component. + */ +@Component({ + selector: 'mifosx-delete-signature-dialog', + templateUrl: './delete-signature-dialog.component.html', + styleUrls: ['./delete-signature-dialog.component.scss'] +}) +export class DeleteSignatureDialogComponent { + + /** Id of client signature in documents */ + signatureId: any; + + /** + * @param {MatDialogRef} dialogRef Component reference to dialog. + * @param {any} data Documents data + */ + constructor(public dialogRef: MatDialogRef, + @Inject(MAT_DIALOG_DATA) public data: any[]) { + const signature = this.data.find((document: any) => document.name === 'clientSignature') || {}; + this.signatureId = signature.id; + } + +} diff --git a/src/app/clients/clients-view/custom-dialogs/upload-signature-dialog/upload-signature-dialog.component.html b/src/app/clients/clients-view/custom-dialogs/upload-signature-dialog/upload-signature-dialog.component.html new file mode 100644 index 000000000..4dd72a1e4 --- /dev/null +++ b/src/app/clients/clients-view/custom-dialogs/upload-signature-dialog/upload-signature-dialog.component.html @@ -0,0 +1,12 @@ +

Upload Client Signature

+ +
+ + + + + + + + +
\ No newline at end of file diff --git a/src/app/clients/clients-view/custom-dialogs/upload-signature-dialog/upload-signature-dialog.component.scss b/src/app/clients/clients-view/custom-dialogs/upload-signature-dialog/upload-signature-dialog.component.scss new file mode 100644 index 000000000..e69de29bb diff --git a/src/app/clients/clients-view/custom-dialogs/upload-signature-dialog/upload-signature-dialog.component.spec.ts b/src/app/clients/clients-view/custom-dialogs/upload-signature-dialog/upload-signature-dialog.component.spec.ts new file mode 100644 index 000000000..8429cbbe1 --- /dev/null +++ b/src/app/clients/clients-view/custom-dialogs/upload-signature-dialog/upload-signature-dialog.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { UploadSignatureDialogComponent } from './upload-signature-dialog.component'; + +describe('UploadSignatureDialogComponent', () => { + let component: UploadSignatureDialogComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ UploadSignatureDialogComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(UploadSignatureDialogComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/clients/clients-view/custom-dialogs/upload-signature-dialog/upload-signature-dialog.component.ts b/src/app/clients/clients-view/custom-dialogs/upload-signature-dialog/upload-signature-dialog.component.ts new file mode 100644 index 000000000..d409b94fa --- /dev/null +++ b/src/app/clients/clients-view/custom-dialogs/upload-signature-dialog/upload-signature-dialog.component.ts @@ -0,0 +1,33 @@ +/** Angular Imports */ +import { Component } from '@angular/core'; +import { MatDialogRef } from '@angular/material'; + +/** + * Upload signature dialog component. + */ +@Component({ + selector: 'mifosx-upload-signature-dialog', + templateUrl: './upload-signature-dialog.component.html', + styleUrls: ['./upload-signature-dialog.component.scss'] +}) +export class UploadSignatureDialogComponent { + + /** Client Signature */ + signature: File; + + /** + * @param {MatDialogRef} dialogRef Component reference to dialog. + */ + constructor(public dialogRef: MatDialogRef) { } + + /** + * Sets file form control value. + * @param {any} $event file change event. + */ + onFileSelect($event: any) { + if ($event.target.files.length > 0) { + this.signature = $event.target.files[0]; + } + } + +} diff --git a/src/app/clients/clients-view/custom-dialogs/view-signature-dialog/view-signature-dialog.component.html b/src/app/clients/clients-view/custom-dialogs/view-signature-dialog/view-signature-dialog.component.html new file mode 100644 index 000000000..f9dc56386 --- /dev/null +++ b/src/app/clients/clients-view/custom-dialogs/view-signature-dialog/view-signature-dialog.component.html @@ -0,0 +1,15 @@ +

View Client Signature

+ +
+ Signature +
+ +
+

Client Signature is not provided.

+
+ + + + + + diff --git a/src/app/clients/clients-view/custom-dialogs/view-signature-dialog/view-signature-dialog.component.scss b/src/app/clients/clients-view/custom-dialogs/view-signature-dialog/view-signature-dialog.component.scss new file mode 100644 index 000000000..e69de29bb diff --git a/src/app/clients/clients-view/custom-dialogs/view-signature-dialog/view-signature-dialog.component.spec.ts b/src/app/clients/clients-view/custom-dialogs/view-signature-dialog/view-signature-dialog.component.spec.ts new file mode 100644 index 000000000..0107f3d53 --- /dev/null +++ b/src/app/clients/clients-view/custom-dialogs/view-signature-dialog/view-signature-dialog.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { ViewSignatureDialogComponent } from './view-signature-dialog.component'; + +describe('ViewSignatureDialogComponent', () => { + let component: ViewSignatureDialogComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ ViewSignatureDialogComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(ViewSignatureDialogComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/clients/clients-view/custom-dialogs/view-signature-dialog/view-signature-dialog.component.ts b/src/app/clients/clients-view/custom-dialogs/view-signature-dialog/view-signature-dialog.component.ts new file mode 100644 index 000000000..250f97b6e --- /dev/null +++ b/src/app/clients/clients-view/custom-dialogs/view-signature-dialog/view-signature-dialog.component.ts @@ -0,0 +1,50 @@ +/** Angular Imports */ +import { Component, Inject, OnInit } from '@angular/core'; +import { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material'; +import { DomSanitizer } from '@angular/platform-browser'; + +/** Custom Services */ +import { ClientsService } from 'app/clients/clients.service'; + +/** + * View signature dialog component. + */ +@Component({ + selector: 'mifosx-view-signature-dialog', + templateUrl: './view-signature-dialog.component.html', + styleUrls: ['./view-signature-dialog.component.scss'] +}) +export class ViewSignatureDialogComponent implements OnInit { + + /** Id of client signature in documents */ + signatureId: any; + /** Signature Image */ + signatureImage: any; + /** Client Id */ + clientId: any; + + /** + * @param {MatDialogRef} dialogRef Component reference to dialog. + * @param {any} data Documents data + */ + constructor(public dialogRef: MatDialogRef, + private clientsService: ClientsService, + private sanitizer: DomSanitizer, + @Inject(MAT_DIALOG_DATA) public data: { documents: any[], id: string }) { + const signature = this.data.documents.find((document: any) => document.name === 'clientSignature') || {}; + this.signatureId = signature.id; + this.clientId = this.data.id; + console.log(this.clientId); + } + + ngOnInit() { + if (this.signatureId) { + this.clientsService.getClientSignatureImage(this.clientId, this.signatureId).subscribe( + (base64Image: any) => { + this.signatureImage = this.sanitizer.bypassSecurityTrustResourceUrl(base64Image); + }, (error: any) => {} + ); + } + } + +} diff --git a/src/app/clients/clients.module.ts b/src/app/clients/clients.module.ts index 1d61136e2..4ffbd8823 100644 --- a/src/app/clients/clients.module.ts +++ b/src/app/clients/clients.module.ts @@ -44,6 +44,9 @@ import { UndoClientRejectionComponent } from './clients-view/client-actions/undo import { AddClientChargeComponent } from './clients-view/client-actions/add-client-charge/add-client-charge.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 { ViewSignatureDialogComponent } from './clients-view/custom-dialogs/view-signature-dialog/view-signature-dialog.component'; +import { UploadSignatureDialogComponent } from './clients-view/custom-dialogs/upload-signature-dialog/upload-signature-dialog.component'; +import { DeleteSignatureDialogComponent } from './clients-view/custom-dialogs/delete-signature-dialog/delete-signature-dialog.component'; /** @@ -93,12 +96,18 @@ import { ClientPayChargesComponent } from './clients-view/charges/client-pay-cha UndoClientRejectionComponent, AddClientChargeComponent, ViewChargeComponent, - ClientPayChargesComponent + ClientPayChargesComponent, + ViewSignatureDialogComponent, + UploadSignatureDialogComponent, + DeleteSignatureDialogComponent ], entryComponents: [ UploadDocumentDialogComponent, EditNotesDialogComponent, - UnassignStaffDialogComponent + UnassignStaffDialogComponent, + ViewSignatureDialogComponent, + UploadSignatureDialogComponent, + DeleteSignatureDialogComponent ], providers: [DatePipe] diff --git a/src/app/clients/clients.service.ts b/src/app/clients/clients.service.ts index fee005104..183b8f0b5 100644 --- a/src/app/clients/clients.service.ts +++ b/src/app/clients/clients.service.ts @@ -151,6 +151,18 @@ export class ClientsService { return this.http.skipErrorHandler().get(`/clients/${clientId}/images`, { params: httpParams, responseType: 'text' }); } + uploadClientSignature(clientId: string, signature: File) { + const formData = new FormData(); + formData.append('file', signature); + formData.append('filename', signature.name); + return this.http.post(`/clients/${clientId}/images`, formData); + } + + getClientSignatureImage(clientId: string, documentId: string) { + const httpParams = new HttpParams().set('tenantIdentifier', 'default'); + return this.http.get(`/clients/${clientId}/documents/${documentId}/attachment`, { params: httpParams, responseType: 'blob' }); + } + getClientFamilyMembers(clientId: string) { return this.http.get(`/clients/${clientId}/familymembers`); }