From 6001446310adbe212d0eaed60bcee0d510510526 Mon Sep 17 00:00:00 2001 From: Jivjyot Singh Date: Wed, 26 Jun 2019 05:47:06 +0530 Subject: [PATCH] feat: add clients document upload list fixes: #264 --- src/app/clients/clients-routing.module.ts | 12 ++++- .../clients-view/clients-view.component.html | 4 ++ .../documents-tab.component.html | 46 ++++++++++++++++ .../documents-tab.component.scss | 17 ++++++ .../documents-tab.component.spec.ts | 25 +++++++++ .../documents-tab/documents-tab.component.ts | 54 +++++++++++++++++++ src/app/clients/clients.module.ts | 4 +- src/app/clients/clients.service.ts | 12 +++++ .../client-document.resolver.ts | 31 +++++++++++ 9 files changed, 203 insertions(+), 2 deletions(-) create mode 100644 src/app/clients/clients-view/documents-tab/documents-tab.component.html create mode 100644 src/app/clients/clients-view/documents-tab/documents-tab.component.scss create mode 100644 src/app/clients/clients-view/documents-tab/documents-tab.component.spec.ts create mode 100644 src/app/clients/clients-view/documents-tab/documents-tab.component.ts create mode 100644 src/app/clients/common-resolvers/client-document.resolver.ts diff --git a/src/app/clients/clients-routing.module.ts b/src/app/clients/clients-routing.module.ts index 00b273d91..e7afd21cd 100644 --- a/src/app/clients/clients-routing.module.ts +++ b/src/app/clients/clients-routing.module.ts @@ -16,6 +16,7 @@ import { AddFamilyMemberComponent } from './clients-view/family-members-tab/add- import { EditFamilyMemberComponent } from './clients-view/family-members-tab/edit-family-member/edit-family-member.component'; import { IdentitiesTabComponent } from './clients-view/identities-tab/identities-tab.component'; import { NotesTabComponent } from './clients-view/notes-tab/notes-tab.component'; +import { DocumentsTabComponent } from './clients-view/documents-tab/documents-tab.component'; /** Custom Resolvers */ import { ClientsResolver } from './common-resolvers/clients.resolver'; @@ -28,6 +29,7 @@ import { ClientFamilyMemberResolver } from './common-resolvers/client-family-mem import { ClientTemplateResolver } from './common-resolvers/client-template.resolver'; import { ClientIdentitiesResolver } from './common-resolvers/client-identities.resolver'; import { ClientNotesResolver } from './common-resolvers/client-notes.resolver'; +import { ClientDocumentsResolver } from './common-resolvers/client-document.resolver'; const routes: Routes = [ Route.withShell([{ @@ -95,6 +97,13 @@ const routes: Routes = [ clientIdentities: ClientIdentitiesResolver } }, + { + path: 'documents', + component: DocumentsTabComponent, + resolve: { + clientDocuments: ClientDocumentsResolver + } + }, { path: 'notes', component: NotesTabComponent, @@ -122,7 +131,8 @@ const routes: Routes = [ ClientFamilyMemberResolver, ClientTemplateResolver, ClientIdentitiesResolver, - ClientNotesResolver + ClientNotesResolver, + ClientDocumentsResolver ] }) 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 448ffbabf..0cb6e7145 100644 --- a/src/app/clients/clients-view/clients-view.component.html +++ b/src/app/clients/clients-view/clients-view.component.html @@ -56,6 +56,10 @@ [active]="identities.isActive"> Identities + + Documents + Notes diff --git a/src/app/clients/clients-view/documents-tab/documents-tab.component.html b/src/app/clients/clients-view/documents-tab/documents-tab.component.html new file mode 100644 index 000000000..7b2ea9ca3 --- /dev/null +++ b/src/app/clients/clients-view/documents-tab/documents-tab.component.html @@ -0,0 +1,46 @@ +
+ + + +

Documents

+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
Name + {{document.name}} Description {{document.description}} File Name {{document.fileName}} + Actions + + +
+ +
\ No newline at end of file diff --git a/src/app/clients/clients-view/documents-tab/documents-tab.component.scss b/src/app/clients/clients-view/documents-tab/documents-tab.component.scss new file mode 100644 index 000000000..2e38d49e9 --- /dev/null +++ b/src/app/clients/clients-view/documents-tab/documents-tab.component.scss @@ -0,0 +1,17 @@ +.tab-container { + padding: 1%; + margin: 1%; + + h3 { + margin: 1% auto; + } + table { + width: 100%; + .document-action-button { + min-width: 26px; + padding: 0 6px; + margin: 4px; + line-height: 25px; + } + } +} diff --git a/src/app/clients/clients-view/documents-tab/documents-tab.component.spec.ts b/src/app/clients/clients-view/documents-tab/documents-tab.component.spec.ts new file mode 100644 index 000000000..bd6b2dd7a --- /dev/null +++ b/src/app/clients/clients-view/documents-tab/documents-tab.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { DocumentsTabComponent } from './documents-tab.component'; + +describe('DocumentsTabComponent', () => { + let component: DocumentsTabComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ DocumentsTabComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(DocumentsTabComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/clients/clients-view/documents-tab/documents-tab.component.ts b/src/app/clients/clients-view/documents-tab/documents-tab.component.ts new file mode 100644 index 000000000..b54f0794b --- /dev/null +++ b/src/app/clients/clients-view/documents-tab/documents-tab.component.ts @@ -0,0 +1,54 @@ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { ActivatedRoute } from '@angular/router'; +import { MatTable } from '@angular/material/table'; +import { MatDialog } from '@angular/material'; + +/** Custom Services */ +import { ClientsService } from '../../clients.service'; +import { DeleteDialogComponent } from '../../../shared/delete-dialog/delete-dialog.component'; + + +@Component({ + selector: 'mifosx-documents-tab', + templateUrl: './documents-tab.component.html', + styleUrls: ['./documents-tab.component.scss'] +}) +export class DocumentsTabComponent implements OnInit { + @ViewChild('documentsTable') documentsTable: MatTable; + documentsColumns: string[] = ['name', 'description', 'fileName', 'actions']; + clientDocuments: any; + + + constructor(private route: ActivatedRoute, + private clientService: ClientsService, + public dialog: MatDialog) { + this.route.data.subscribe((data: { clientDocuments: any }) => { + this.clientDocuments = data.clientDocuments; + }); + } + + ngOnInit() { + } + + download(parentEntityId: string, documentId: string) { + this.clientService.downloadClientDocument(parentEntityId, documentId).subscribe(res => { + const url = window.URL.createObjectURL(res); + window.open(url); + }); + } + + deleteDocument(parentEntityId: string, documentId: string, index: number) { + const deleteFamilyMemberDialogRef = this.dialog.open(DeleteDialogComponent, { + data: { deleteContext: `document id:${documentId}` } + }); + deleteFamilyMemberDialogRef.afterClosed().subscribe((response: any) => { + if (response.delete) { + this.clientService.deleteClientDocument(parentEntityId, documentId).subscribe(res => { + this.clientDocuments.splice(index, 1); + this.documentsTable.renderRows(); + }); + } + }); + } + +} diff --git a/src/app/clients/clients.module.ts b/src/app/clients/clients.module.ts index 746f24a36..5e92fd4a2 100644 --- a/src/app/clients/clients.module.ts +++ b/src/app/clients/clients.module.ts @@ -18,6 +18,7 @@ import { IdentitiesTabComponent } from './clients-view/identities-tab/identities import { UploadDocumentDialogComponent } from './clients-view/upload-document-dialog/upload-document-dialog.component'; import { NotesTabComponent } from './clients-view/notes-tab/notes-tab.component'; import { EditNotesDialogComponent } from './clients-view/edit-notes-dialog/edit-notes-dialog.component'; +import { DocumentsTabComponent } from './clients-view/documents-tab/documents-tab.component'; /** @@ -41,7 +42,8 @@ import { EditNotesDialogComponent } from './clients-view/edit-notes-dialog/edit- IdentitiesTabComponent, UploadDocumentDialogComponent, NotesTabComponent, - EditNotesDialogComponent + EditNotesDialogComponent, + DocumentsTabComponent ], entryComponents: [ UploadDocumentDialogComponent, diff --git a/src/app/clients/clients.service.ts b/src/app/clients/clients.service.ts index e4ded4e0b..c1c70e88a 100644 --- a/src/app/clients/clients.service.ts +++ b/src/app/clients/clients.service.ts @@ -88,6 +88,18 @@ export class ClientsService { return this.http.post(`/client_identifiers/${identifierId}/documents`, documentData); } + getClientDocuments(clientId: string) { + return this.http.get(`/clients/${clientId}/documents`); + } + + downloadClientDocument(parentEntityId: string, documentId: string) { + return this.http.get(`/clients/${parentEntityId}/documents/${documentId}/attachment`, { responseType: 'blob' }); + } + + deleteClientDocument(parentEntityId: string, documentId: string) { + return this.http.delete(`/clients/${parentEntityId}/documents/${documentId}`); + } + getClientNotes(clientId: string) { return this.http.get(`/clients/${clientId}/notes`); } diff --git a/src/app/clients/common-resolvers/client-document.resolver.ts b/src/app/clients/common-resolvers/client-document.resolver.ts new file mode 100644 index 000000000..d79c1a525 --- /dev/null +++ b/src/app/clients/common-resolvers/client-document.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 Documents resolver. + */ +@Injectable() +export class ClientDocumentsResolver implements Resolve { + + /** + * @param {ClientsService} ClientsService Clients service. + */ + constructor(private clientsService: ClientsService) { } + + /** + * Returns the Client's Documents data. + * @returns {Observable} + */ + resolve(route: ActivatedRouteSnapshot): Observable { + const clientId = route.parent.paramMap.get('clientId'); + return this.clientsService.getClientDocuments(clientId); + } + +}