From af32d481bf288fa42481362fcd1131ae7f38632d Mon Sep 17 00:00:00 2001 From: Karan Takalkar Date: Mon, 13 Jul 2020 11:18:10 +0530 Subject: [PATCH] feat: client actions (assign/unassign staff) (#1067) Fixes: #1066 --- src/app/clients/clients-routing.module.ts | 13 +++- .../client-actions.component.html | 1 + .../client-actions.component.scss} | 0 .../client-actions.component.spec.ts | 25 +++++++ .../client-actions.component.ts | 33 +++++++++ .../client-assign-staff.component.html | 36 ++++++++++ .../client-assign-staff.component.scss | 3 + .../client-assign-staff.component.spec.ts | 25 +++++++ .../client-assign-staff.component.ts | 69 +++++++++++++++++++ .../clients-view/clients-view.component.html | 5 +- .../clients-view/clients-view.component.ts | 56 ++++++++++++++- .../edit-notes-dialog.component.html | 0 .../edit-notes-dialog.component.scss} | 0 .../edit-notes-dialog.component.spec.ts | 0 .../edit-notes-dialog.component.ts | 0 .../unassign-staff-dialog.component.html | 8 +++ .../unassign-staff-dialog.component.scss | 0 .../unassign-staff-dialog.component.spec.ts | 25 +++++++ .../unassign-staff-dialog.component.ts | 20 ++++++ .../upload-document-dialog.component.html | 0 .../upload-document-dialog.component.scss | 0 .../upload-document-dialog.component.spec.ts | 0 .../upload-document-dialog.component.ts | 0 .../documents-tab/documents-tab.component.ts | 2 +- .../identities-tab.component.ts | 2 +- .../notes-tab/notes-tab.component.ts | 2 +- src/app/clients/clients.module.ts | 15 ++-- src/app/clients/clients.service.ts | 13 ++++ .../client-actions.resolver.ts | 38 ++++++++++ 29 files changed, 378 insertions(+), 13 deletions(-) create mode 100644 src/app/clients/clients-view/client-actions/client-actions.component.html rename src/app/clients/clients-view/{edit-notes-dialog/edit-notes-dialog.component.scss => client-actions/client-actions.component.scss} (100%) create mode 100644 src/app/clients/clients-view/client-actions/client-actions.component.spec.ts create mode 100644 src/app/clients/clients-view/client-actions/client-actions.component.ts create mode 100644 src/app/clients/clients-view/client-actions/client-assign-staff/client-assign-staff.component.html create mode 100644 src/app/clients/clients-view/client-actions/client-assign-staff/client-assign-staff.component.scss create mode 100644 src/app/clients/clients-view/client-actions/client-assign-staff/client-assign-staff.component.spec.ts create mode 100644 src/app/clients/clients-view/client-actions/client-assign-staff/client-assign-staff.component.ts rename src/app/clients/clients-view/{ => custom-dialogs}/edit-notes-dialog/edit-notes-dialog.component.html (100%) rename src/app/clients/clients-view/{upload-document-dialog/upload-document-dialog.component.scss => custom-dialogs/edit-notes-dialog/edit-notes-dialog.component.scss} (100%) rename src/app/clients/clients-view/{ => custom-dialogs}/edit-notes-dialog/edit-notes-dialog.component.spec.ts (100%) rename src/app/clients/clients-view/{ => custom-dialogs}/edit-notes-dialog/edit-notes-dialog.component.ts (100%) create mode 100644 src/app/clients/clients-view/custom-dialogs/unassign-staff-dialog/unassign-staff-dialog.component.html create mode 100644 src/app/clients/clients-view/custom-dialogs/unassign-staff-dialog/unassign-staff-dialog.component.scss create mode 100644 src/app/clients/clients-view/custom-dialogs/unassign-staff-dialog/unassign-staff-dialog.component.spec.ts create mode 100644 src/app/clients/clients-view/custom-dialogs/unassign-staff-dialog/unassign-staff-dialog.component.ts rename src/app/clients/clients-view/{ => custom-dialogs}/upload-document-dialog/upload-document-dialog.component.html (100%) create mode 100644 src/app/clients/clients-view/custom-dialogs/upload-document-dialog/upload-document-dialog.component.scss rename src/app/clients/clients-view/{ => custom-dialogs}/upload-document-dialog/upload-document-dialog.component.spec.ts (100%) rename src/app/clients/clients-view/{ => custom-dialogs}/upload-document-dialog/upload-document-dialog.component.ts (100%) create mode 100644 src/app/clients/common-resolvers/client-actions.resolver.ts diff --git a/src/app/clients/clients-routing.module.ts b/src/app/clients/clients-routing.module.ts index 91edd5104..56be63bf8 100644 --- a/src/app/clients/clients-routing.module.ts +++ b/src/app/clients/clients-routing.module.ts @@ -19,6 +19,7 @@ import { NotesTabComponent } from './clients-view/notes-tab/notes-tab.component' import { DocumentsTabComponent } from './clients-view/documents-tab/documents-tab.component'; import { DatatableTabComponent } from './clients-view/datatable-tab/datatable-tab.component'; import { AddressTabComponent } from './clients-view/address-tab/address-tab.component'; +import { ClientActionsComponent } from './clients-view/client-actions/client-actions.component'; /** Custom Resolvers */ import { ClientViewResolver } from './common-resolvers/client-view.resolver'; @@ -39,6 +40,7 @@ import { ClientAddressFieldConfigurationResolver } from './common-resolvers/clie import { ClientAddressTemplateResolver } from './common-resolvers/client-address-template.resolver'; import { ChargesOverviewComponent } from './clients-view/charges-overview/charges-overview.component'; import { ClientChargeOverviewResolver } from './clients-view/charges-overview/charge-overview.resolver'; +import { ClientActionsResolver } from './common-resolvers/client-actions.resolver'; const routes: Routes = [ Route.withShell([{ @@ -168,6 +170,14 @@ const routes: Routes = [ path: ':clientId', data: { title: extract('Clients View'), routeParamBreadcrumb: 'clientId' }, children: [ + { + path: 'actions/:name', + data: { title: extract('Client Actions'), routeParamBreadcrumb: 'name' }, + component: ClientActionsComponent, + resolve: { + clientActionData: ClientActionsResolver + } + }, { path: 'loans', data: { title: extract('Loans'), breadcrumb: 'loans', routeParamBreadcrumb: false }, @@ -216,7 +226,8 @@ const routes: Routes = [ ClientIdentifierTemplateResolver, ClientAddressFieldConfigurationResolver, ClientAddressTemplateResolver, - ClientChargeOverviewResolver + ClientChargeOverviewResolver, + ClientActionsResolver ] }) export class ClientsRoutingModule { } diff --git a/src/app/clients/clients-view/client-actions/client-actions.component.html b/src/app/clients/clients-view/client-actions/client-actions.component.html new file mode 100644 index 000000000..d405babcd --- /dev/null +++ b/src/app/clients/clients-view/client-actions/client-actions.component.html @@ -0,0 +1 @@ + diff --git a/src/app/clients/clients-view/edit-notes-dialog/edit-notes-dialog.component.scss b/src/app/clients/clients-view/client-actions/client-actions.component.scss similarity index 100% rename from src/app/clients/clients-view/edit-notes-dialog/edit-notes-dialog.component.scss rename to src/app/clients/clients-view/client-actions/client-actions.component.scss diff --git a/src/app/clients/clients-view/client-actions/client-actions.component.spec.ts b/src/app/clients/clients-view/client-actions/client-actions.component.spec.ts new file mode 100644 index 000000000..ea21b79ac --- /dev/null +++ b/src/app/clients/clients-view/client-actions/client-actions.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { ClientActionsComponent } from './client-actions.component'; + +describe('ClientActionsComponent', () => { + let component: ClientActionsComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ ClientActionsComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(ClientActionsComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/clients/clients-view/client-actions/client-actions.component.ts b/src/app/clients/clients-view/client-actions/client-actions.component.ts new file mode 100644 index 000000000..8ed2178ad --- /dev/null +++ b/src/app/clients/clients-view/client-actions/client-actions.component.ts @@ -0,0 +1,33 @@ +/** Angular Imports */ +import { Component } from '@angular/core'; +import { ActivatedRoute, Router } from '@angular/router'; + +/** + * Client actions component. + */ +@Component({ + selector: 'mifosx-client-actions', + templateUrl: './client-actions.component.html', + styleUrls: ['./client-actions.component.scss'] +}) +export class ClientActionsComponent { + + /** Flag object to store possible actions and render appropriate UI to the user */ + actions: { + 'Assign Staff': boolean + } = { + 'Assign Staff': false, + }; + + /** + * @param {ActivatedRoute} route Activated Route + * @param {Router} router Router + */ + constructor(private route: ActivatedRoute, + private router: Router) { + this.router.routeReuseStrategy.shouldReuseRoute = () => false; + const name = this.route.snapshot.params['name']; + this.actions[name] = true; + } + +} diff --git a/src/app/clients/clients-view/client-actions/client-assign-staff/client-assign-staff.component.html b/src/app/clients/clients-view/client-actions/client-assign-staff/client-assign-staff.component.html new file mode 100644 index 000000000..a6accc117 --- /dev/null +++ b/src/app/clients/clients-view/client-actions/client-assign-staff/client-assign-staff.component.html @@ -0,0 +1,36 @@ +
+ + + +
+ + + +
+ + + Staff + + + {{ staff.displayName }} + + + + Staff is required + + + +
+ +
+ + + + + + +
+ +
+ +
diff --git a/src/app/clients/clients-view/client-actions/client-assign-staff/client-assign-staff.component.scss b/src/app/clients/clients-view/client-actions/client-assign-staff/client-assign-staff.component.scss new file mode 100644 index 000000000..d774f68da --- /dev/null +++ b/src/app/clients/clients-view/client-actions/client-assign-staff/client-assign-staff.component.scss @@ -0,0 +1,3 @@ +.container { + max-width: 37rem; +} diff --git a/src/app/clients/clients-view/client-actions/client-assign-staff/client-assign-staff.component.spec.ts b/src/app/clients/clients-view/client-actions/client-assign-staff/client-assign-staff.component.spec.ts new file mode 100644 index 000000000..3d601e443 --- /dev/null +++ b/src/app/clients/clients-view/client-actions/client-assign-staff/client-assign-staff.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { ClientAssignStaffComponent } from './client-assign-staff.component'; + +describe('ClientAssignStaffComponent', () => { + let component: ClientAssignStaffComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ ClientAssignStaffComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(ClientAssignStaffComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/clients/clients-view/client-actions/client-assign-staff/client-assign-staff.component.ts b/src/app/clients/clients-view/client-actions/client-assign-staff/client-assign-staff.component.ts new file mode 100644 index 000000000..86f39aad8 --- /dev/null +++ b/src/app/clients/clients-view/client-actions/client-assign-staff/client-assign-staff.component.ts @@ -0,0 +1,69 @@ +/** Angular Imports */ +import { Component, OnInit } from '@angular/core'; +import { FormGroup, FormBuilder } from '@angular/forms'; +import { ActivatedRoute, Router } from '@angular/router'; + +/** Custom Services */ +import { ClientsService } from 'app/clients/clients.service'; + +/** + * Clients Assign Staff Component + */ +@Component({ + selector: 'mifosx-client-assign-staff', + templateUrl: './client-assign-staff.component.html', + styleUrls: ['./client-assign-staff.component.scss'] +}) +export class ClientAssignStaffComponent implements OnInit { + + /** Client Assign Staff form. */ + clientAssignStaffForm: FormGroup; + /** Field Officer Data */ + staffData: any; + /** Client Data */ + clientData: any; + + /** + * Fetches Client Action Data from `resolve` + * @param {FormBuilder} formBuilder Form Builder + * @param {SavingsService} savingsService Savings Service + * @param {ActivatedRoute} route Activated Route + * @param {Router} router Router + */ + constructor(private formBuilder: FormBuilder, + private clientsService: ClientsService, + private route: ActivatedRoute, + private router: Router) { + this.route.data.subscribe((data: { clientActionData: any }) => { + this.clientData = data.clientActionData; + }); + } + + /** + * Creates the client assign staff form. + */ + ngOnInit() { + this.staffData = this.clientData.staffOptions; + this.createClientAssignStaffForm(); + } + + /** + * Creates the client assign staff form. + */ + createClientAssignStaffForm() { + this.clientAssignStaffForm = this.formBuilder.group({ + 'staffId': [''] + }); + } + + /** + * Submits the form and assigns staff for the client. + */ + submit() { + this.clientsService.executeClientCommand(this.clientData.id, 'assignStaff', this.clientAssignStaffForm.value) + .subscribe(() => { + this.router.navigate(['../../'], { relativeTo: this.route }); + }); + } + +} diff --git a/src/app/clients/clients-view/clients-view.component.html b/src/app/clients/clients-view/clients-view.component.html index 6c980574e..dab80c81b 100644 --- a/src/app/clients/clients-view/clients-view.component.html +++ b/src/app/clients/clients-view/clients-view.component.html @@ -17,7 +17,7 @@

Client #:{{clientViewData.accountNo}} | External - Id: {{clientViewData.externalId}} | Staff:{{clientViewData.staffName}}
+ Id: {{clientViewData.externalId}} | Staff:{{clientViewData.staffName || 'Unassigned'}}
Activation Date : {{(clientViewData.activationDate)?(clientViewData.activationDate|date) :'Not Activated'}}
Member Of : @@ -40,7 +40,8 @@ - + + diff --git a/src/app/clients/clients-view/clients-view.component.ts b/src/app/clients/clients-view/clients-view.component.ts index 806cff99a..926f6c0c7 100644 --- a/src/app/clients/clients-view/clients-view.component.ts +++ b/src/app/clients/clients-view/clients-view.component.ts @@ -1,24 +1,32 @@ /** Angular Imports */ import { Component, OnInit } from '@angular/core'; -import { ActivatedRoute } from '@angular/router'; +import { ActivatedRoute, Router } from '@angular/router'; import { DomSanitizer } from '@angular/platform-browser'; +import { MatDialog } from '@angular/material'; + +/** Custom Dialogs */ +import { UnassignStaffDialogComponent } from './custom-dialogs/unassign-staff-dialog/unassign-staff-dialog.component'; /** Custom Services */ import { ClientsService } from '../clients.service'; + @Component({ selector: 'mifosx-clients-view', templateUrl: './clients-view.component.html', styleUrls: ['./clients-view.component.scss'] }) export class ClientsViewComponent implements OnInit { + clientViewData: any; clientDatatables: any; clientImage: any; clientTemplateData: any; constructor(private route: ActivatedRoute, - private clientsService: ClientsService, - private _sanitizer: DomSanitizer) { + private router: Router, + private clientsService: ClientsService, + private _sanitizer: DomSanitizer, + public dialog: MatDialog) { this.route.data.subscribe((data: { clientViewData: any, clientTemplateData: any, @@ -35,4 +43,46 @@ export class ClientsViewComponent implements OnInit { this.clientImage = this._sanitizer.bypassSecurityTrustResourceUrl(base64Image); }); } + + /** + * Performs action button/option action. + * @param {string} name action name. + */ + doAction(name: string) { + switch (name) { + case 'Assign Staff': + this.router.navigate([`actions/${name}`], { relativeTo: this.route }); + break; + case 'Unassign Staff': + this.unassignStaff(); + break; + } + } + + + /** + * Refetches data for the component + * TODO: Replace by a custom reload component instead of hard-coded back-routing. + */ + reload() { + const url: string = this.router.url; + this.router.navigateByUrl(`/clients`, {skipLocationChange: true}) + .then(() => this.router.navigate([url])); + } + + /** + * Unassign's the group's staff. + */ + private unassignStaff() { + const unAssignStaffDialogRef = this.dialog.open(UnassignStaffDialogComponent); + unAssignStaffDialogRef.afterClosed().subscribe((response: { confirm: any }) => { + if (response.confirm) { + this.clientsService.executeClientCommand(this.clientViewData.id, 'unassignStaff', { staffId: this.clientViewData.staffId }) + .subscribe(() => { + this.reload(); + }); + } + }); + } + } diff --git a/src/app/clients/clients-view/edit-notes-dialog/edit-notes-dialog.component.html b/src/app/clients/clients-view/custom-dialogs/edit-notes-dialog/edit-notes-dialog.component.html similarity index 100% rename from src/app/clients/clients-view/edit-notes-dialog/edit-notes-dialog.component.html rename to src/app/clients/clients-view/custom-dialogs/edit-notes-dialog/edit-notes-dialog.component.html diff --git a/src/app/clients/clients-view/upload-document-dialog/upload-document-dialog.component.scss b/src/app/clients/clients-view/custom-dialogs/edit-notes-dialog/edit-notes-dialog.component.scss similarity index 100% rename from src/app/clients/clients-view/upload-document-dialog/upload-document-dialog.component.scss rename to src/app/clients/clients-view/custom-dialogs/edit-notes-dialog/edit-notes-dialog.component.scss diff --git a/src/app/clients/clients-view/edit-notes-dialog/edit-notes-dialog.component.spec.ts b/src/app/clients/clients-view/custom-dialogs/edit-notes-dialog/edit-notes-dialog.component.spec.ts similarity index 100% rename from src/app/clients/clients-view/edit-notes-dialog/edit-notes-dialog.component.spec.ts rename to src/app/clients/clients-view/custom-dialogs/edit-notes-dialog/edit-notes-dialog.component.spec.ts diff --git a/src/app/clients/clients-view/edit-notes-dialog/edit-notes-dialog.component.ts b/src/app/clients/clients-view/custom-dialogs/edit-notes-dialog/edit-notes-dialog.component.ts similarity index 100% rename from src/app/clients/clients-view/edit-notes-dialog/edit-notes-dialog.component.ts rename to src/app/clients/clients-view/custom-dialogs/edit-notes-dialog/edit-notes-dialog.component.ts diff --git a/src/app/clients/clients-view/custom-dialogs/unassign-staff-dialog/unassign-staff-dialog.component.html b/src/app/clients/clients-view/custom-dialogs/unassign-staff-dialog/unassign-staff-dialog.component.html new file mode 100644 index 000000000..2f8b3b5fd --- /dev/null +++ b/src/app/clients/clients-view/custom-dialogs/unassign-staff-dialog/unassign-staff-dialog.component.html @@ -0,0 +1,8 @@ +

Unassign Staff

+
+

Are you sure you want to unassign staff for this client ?

+
+ + + + diff --git a/src/app/clients/clients-view/custom-dialogs/unassign-staff-dialog/unassign-staff-dialog.component.scss b/src/app/clients/clients-view/custom-dialogs/unassign-staff-dialog/unassign-staff-dialog.component.scss new file mode 100644 index 000000000..e69de29bb diff --git a/src/app/clients/clients-view/custom-dialogs/unassign-staff-dialog/unassign-staff-dialog.component.spec.ts b/src/app/clients/clients-view/custom-dialogs/unassign-staff-dialog/unassign-staff-dialog.component.spec.ts new file mode 100644 index 000000000..1eaed45f3 --- /dev/null +++ b/src/app/clients/clients-view/custom-dialogs/unassign-staff-dialog/unassign-staff-dialog.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { UnassignStaffDialogComponent } from './unassign-staff-dialog.component'; + +describe('UnassignStaffDialogComponent', () => { + let component: UnassignStaffDialogComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ UnassignStaffDialogComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(UnassignStaffDialogComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/clients/clients-view/custom-dialogs/unassign-staff-dialog/unassign-staff-dialog.component.ts b/src/app/clients/clients-view/custom-dialogs/unassign-staff-dialog/unassign-staff-dialog.component.ts new file mode 100644 index 000000000..84628e6b8 --- /dev/null +++ b/src/app/clients/clients-view/custom-dialogs/unassign-staff-dialog/unassign-staff-dialog.component.ts @@ -0,0 +1,20 @@ +/** Angular Imports */ +import { Component, Inject } from '@angular/core'; +import { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material'; + +/** + * Unassign staff dialog component. + */ +@Component({ + selector: 'mifosx-unassign-staff-dialog', + templateUrl: './unassign-staff-dialog.component.html', + styleUrls: ['./unassign-staff-dialog.component.scss'] +}) +export class UnassignStaffDialogComponent { + + /** + * @param {MatDialogRef} dialogRef Component reference to dialog. + */ + constructor(public dialogRef: MatDialogRef) { } + +} diff --git a/src/app/clients/clients-view/upload-document-dialog/upload-document-dialog.component.html b/src/app/clients/clients-view/custom-dialogs/upload-document-dialog/upload-document-dialog.component.html similarity index 100% rename from src/app/clients/clients-view/upload-document-dialog/upload-document-dialog.component.html rename to src/app/clients/clients-view/custom-dialogs/upload-document-dialog/upload-document-dialog.component.html diff --git a/src/app/clients/clients-view/custom-dialogs/upload-document-dialog/upload-document-dialog.component.scss b/src/app/clients/clients-view/custom-dialogs/upload-document-dialog/upload-document-dialog.component.scss new file mode 100644 index 000000000..e69de29bb diff --git a/src/app/clients/clients-view/upload-document-dialog/upload-document-dialog.component.spec.ts b/src/app/clients/clients-view/custom-dialogs/upload-document-dialog/upload-document-dialog.component.spec.ts similarity index 100% rename from src/app/clients/clients-view/upload-document-dialog/upload-document-dialog.component.spec.ts rename to src/app/clients/clients-view/custom-dialogs/upload-document-dialog/upload-document-dialog.component.spec.ts diff --git a/src/app/clients/clients-view/upload-document-dialog/upload-document-dialog.component.ts b/src/app/clients/clients-view/custom-dialogs/upload-document-dialog/upload-document-dialog.component.ts similarity index 100% rename from src/app/clients/clients-view/upload-document-dialog/upload-document-dialog.component.ts rename to src/app/clients/clients-view/custom-dialogs/upload-document-dialog/upload-document-dialog.component.ts 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 index 4c3f9acc1..b7e5f96f5 100644 --- a/src/app/clients/clients-view/documents-tab/documents-tab.component.ts +++ b/src/app/clients/clients-view/documents-tab/documents-tab.component.ts @@ -7,7 +7,7 @@ import { MatDialog } from '@angular/material'; import { ClientsService } from '../../clients.service'; /** Custom Components */ -import { UploadDocumentDialogComponent } from '../upload-document-dialog/upload-document-dialog.component'; +import { UploadDocumentDialogComponent } from '../custom-dialogs/upload-document-dialog/upload-document-dialog.component'; import { DeleteDialogComponent } from '../../../shared/delete-dialog/delete-dialog.component'; diff --git a/src/app/clients/clients-view/identities-tab/identities-tab.component.ts b/src/app/clients/clients-view/identities-tab/identities-tab.component.ts index a00f64b10..fffdae4ae 100644 --- a/src/app/clients/clients-view/identities-tab/identities-tab.component.ts +++ b/src/app/clients/clients-view/identities-tab/identities-tab.component.ts @@ -7,7 +7,7 @@ import { InputBase } from 'app/shared/form-dialog/formfield/model/input-base'; import { SelectBase } from 'app/shared/form-dialog/formfield/model/select-base'; /** Custom Components */ -import { UploadDocumentDialogComponent } from '../upload-document-dialog/upload-document-dialog.component'; +import { UploadDocumentDialogComponent } from '../custom-dialogs/upload-document-dialog/upload-document-dialog.component'; import { DeleteDialogComponent } from '../../../shared/delete-dialog/delete-dialog.component'; import { FormDialogComponent } from 'app/shared/form-dialog/form-dialog.component'; diff --git a/src/app/clients/clients-view/notes-tab/notes-tab.component.ts b/src/app/clients/clients-view/notes-tab/notes-tab.component.ts index 2d8459885..7bf1ccff5 100644 --- a/src/app/clients/clients-view/notes-tab/notes-tab.component.ts +++ b/src/app/clients/clients-view/notes-tab/notes-tab.component.ts @@ -8,7 +8,7 @@ import { DeleteDialogComponent } from '../../../shared/delete-dialog/delete-dial /** Custom Services */ import { ClientsService } from '../../clients.service'; -import { EditNotesDialogComponent } from '../edit-notes-dialog/edit-notes-dialog.component'; +import { EditNotesDialogComponent } from '../custom-dialogs/edit-notes-dialog/edit-notes-dialog.component'; @Component({ selector: 'mifosx-notes-tab', diff --git a/src/app/clients/clients.module.ts b/src/app/clients/clients.module.ts index 40f7a9f53..927f57d12 100644 --- a/src/app/clients/clients.module.ts +++ b/src/app/clients/clients.module.ts @@ -16,15 +16,18 @@ import { FamilyMembersTabComponent } from './clients-view/family-members-tab/fam import { AddFamilyMemberComponent } from './clients-view/family-members-tab/add-family-member/add-family-member.component'; 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 { UploadDocumentDialogComponent } from './clients-view/upload-document-dialog/upload-document-dialog.component'; +import { UploadDocumentDialogComponent } from './clients-view/custom-dialogs/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 { EditNotesDialogComponent } from './clients-view/custom-dialogs/edit-notes-dialog/edit-notes-dialog.component'; import { DocumentsTabComponent } from './clients-view/documents-tab/documents-tab.component'; import { DatatableTabComponent } from './clients-view/datatable-tab/datatable-tab.component'; import { MultiRowComponent } from './clients-view/datatable-tab/multi-row/multi-row.component'; import { SingleRowComponent } from './clients-view/datatable-tab/single-row/single-row.component'; import { AddressTabComponent } from './clients-view/address-tab/address-tab.component'; import { ChargesOverviewComponent } from './clients-view/charges-overview/charges-overview.component'; +import { ClientActionsComponent } from './clients-view/client-actions/client-actions.component'; +import { ClientAssignStaffComponent } from './clients-view/client-actions/client-assign-staff/client-assign-staff.component'; +import { UnassignStaffDialogComponent } from './clients-view/custom-dialogs/unassign-staff-dialog/unassign-staff-dialog.component'; /** @@ -55,11 +58,15 @@ import { ChargesOverviewComponent } from './clients-view/charges-overview/charge MultiRowComponent, SingleRowComponent, AddressTabComponent, - ChargesOverviewComponent + ChargesOverviewComponent, + ClientActionsComponent, + ClientAssignStaffComponent, + UnassignStaffDialogComponent ], entryComponents: [ UploadDocumentDialogComponent, - EditNotesDialogComponent + EditNotesDialogComponent, + UnassignStaffDialogComponent ], providers: [DatePipe] diff --git a/src/app/clients/clients.service.ts b/src/app/clients/clients.service.ts index 53373c008..0862ff764 100644 --- a/src/app/clients/clients.service.ts +++ b/src/app/clients/clients.service.ts @@ -45,6 +45,13 @@ export class ClientsService { return this.http.get(`/clients/${clientId}`); } + getClientDataAndTemplate(clientId: string) { + const httpParams = new HttpParams() + .set('template', 'true') + .set('staffInSelectedOfficeOnly', 'true'); + return this.http.get(`/clients/${clientId}`, { params: httpParams }); + } + getClientDatatables() { const httpParams = new HttpParams().set('apptable', 'm_client'); return this.http.get(`/datatables`, { params: httpParams }); @@ -205,4 +212,10 @@ export class ClientsService { editClientAddress(clientId: string, addressTypeId: string, addressData: any) { return this.http.put(`/client/${clientId}/addresses?type=${addressTypeId}`, addressData); } + + executeClientCommand(clientId: string, command: string, data: any): Observable { + const httpParams = new HttpParams().set('command', command); + return this.http.post(`/clients/${clientId}`, data, { params: httpParams }); + } + } diff --git a/src/app/clients/common-resolvers/client-actions.resolver.ts b/src/app/clients/common-resolvers/client-actions.resolver.ts new file mode 100644 index 000000000..0f42eb337 --- /dev/null +++ b/src/app/clients/common-resolvers/client-actions.resolver.ts @@ -0,0 +1,38 @@ +/** 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 Actions data resolver. + */ +@Injectable() +export class ClientActionsResolver implements Resolve { + + /** + * @param {ClientsService} clientsService Clients service. + */ + constructor(private clientsService: ClientsService) { } + + /** + * Returns the clients actions data. + * @param {ActivatedRouteSnapshot} route Route Snapshot + * @returns {Observable} + */ + resolve(route: ActivatedRouteSnapshot): Observable { + const actionName = route.paramMap.get('name'); + const clientId = route.paramMap.get('clientId') || route.parent.parent.paramMap.get('clientId'); + switch (actionName) { + case 'Assign Staff': + return this.clientsService.getClientDataAndTemplate(clientId); + default: + return undefined; + } + } + +}