From e3b7f5799d25d934e9e008b64f1e25b0b85bed31 Mon Sep 17 00:00:00 2001
From: Benura Abeywardena <43112139+BLasan@users.noreply.github.com>
Date: Fri, 16 Oct 2020 20:50:39 +0530
Subject: [PATCH] feat: add create self service user (#1251)
Fixes: #1234
---
.../client-actions.component.html | 1 +
.../client-actions.component.ts | 6 +-
.../create-self-service-user.component.html | 98 ++++++++++++++++
.../create-self-service-user.component.scss | 19 ++++
...create-self-service-user.component.spec.ts | 25 +++++
.../create-self-service-user.component.ts | 106 ++++++++++++++++++
.../clients-view/clients-view.component.html | 2 +-
.../clients-view/clients-view.component.ts | 1 +
src/app/clients/clients.module.ts | 4 +-
src/app/clients/clients.service.ts | 8 ++
.../client-actions.resolver.ts | 2 +
11 files changed, 268 insertions(+), 4 deletions(-)
create mode 100644 src/app/clients/clients-view/client-actions/create-self-service-user/create-self-service-user.component.html
create mode 100644 src/app/clients/clients-view/client-actions/create-self-service-user/create-self-service-user.component.scss
create mode 100644 src/app/clients/clients-view/client-actions/create-self-service-user/create-self-service-user.component.spec.ts
create mode 100644 src/app/clients/clients-view/client-actions/create-self-service-user/create-self-service-user.component.ts
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
index bed88c9c7..5ee27468f 100644
--- a/src/app/clients/clients-view/client-actions/client-actions.component.html
+++ b/src/app/clients/clients-view/client-actions/client-actions.component.html
@@ -14,3 +14,4 @@
+
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
index 638855923..4654002b0 100644
--- a/src/app/clients/clients-view/client-actions/client-actions.component.ts
+++ b/src/app/clients/clients-view/client-actions/client-actions.component.ts
@@ -28,7 +28,8 @@ export class ClientActionsComponent {
'Undo Rejection': boolean
'Add Charge': boolean
'Take Survey': boolean
- 'Client Screen Reports': boolean
+ 'Client Screen Reports': boolean,
+ 'Create Self Service User': boolean
} = {
'Assign Staff': false,
'Close': false,
@@ -44,7 +45,8 @@ export class ClientActionsComponent {
'Undo Rejection': false,
'Add Charge': false,
'Take Survey': false,
- 'Client Screen Reports': false
+ 'Client Screen Reports': false,
+ 'Create Self Service User': false
};
/**
diff --git a/src/app/clients/clients-view/client-actions/create-self-service-user/create-self-service-user.component.html b/src/app/clients/clients-view/client-actions/create-self-service-user/create-self-service-user.component.html
new file mode 100644
index 000000000..9866c46c8
--- /dev/null
+++ b/src/app/clients/clients-view/client-actions/create-self-service-user/create-self-service-user.component.html
@@ -0,0 +1,98 @@
+
diff --git a/src/app/clients/clients-view/client-actions/create-self-service-user/create-self-service-user.component.scss b/src/app/clients/clients-view/client-actions/create-self-service-user/create-self-service-user.component.scss
new file mode 100644
index 000000000..601ad90d6
--- /dev/null
+++ b/src/app/clients/clients-view/client-actions/create-self-service-user/create-self-service-user.component.scss
@@ -0,0 +1,19 @@
+.fa-question-circle {
+ color: #1abc9c;
+}
+
+.fa {
+ display: inline-block;
+ font-family: FontAwesome;
+ font-style: normal;
+ font-weight: normal;
+ line-height: 1;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+}
+
+* {
+ -webkit-box-sizing: border-box;
+ -moz-box-sizing: border-box;
+ box-sizing: border-box;
+}
diff --git a/src/app/clients/clients-view/client-actions/create-self-service-user/create-self-service-user.component.spec.ts b/src/app/clients/clients-view/client-actions/create-self-service-user/create-self-service-user.component.spec.ts
new file mode 100644
index 000000000..49b4dbb33
--- /dev/null
+++ b/src/app/clients/clients-view/client-actions/create-self-service-user/create-self-service-user.component.spec.ts
@@ -0,0 +1,25 @@
+import { async, ComponentFixture, TestBed } from '@angular/core/testing';
+
+import { CreateSelfServiceUserComponent } from './create-self-service-user.component';
+
+describe('CreateSelfServiceUserComponent', () => {
+ let component: CreateSelfServiceUserComponent;
+ let fixture: ComponentFixture;
+
+ beforeEach(async(() => {
+ TestBed.configureTestingModule({
+ declarations: [ CreateSelfServiceUserComponent ]
+ })
+ .compileComponents();
+ }));
+
+ beforeEach(() => {
+ fixture = TestBed.createComponent(CreateSelfServiceUserComponent);
+ component = fixture.componentInstance;
+ fixture.detectChanges();
+ });
+
+ it('should create', () => {
+ expect(component).toBeTruthy();
+ });
+});
diff --git a/src/app/clients/clients-view/client-actions/create-self-service-user/create-self-service-user.component.ts b/src/app/clients/clients-view/client-actions/create-self-service-user/create-self-service-user.component.ts
new file mode 100644
index 000000000..df36dd074
--- /dev/null
+++ b/src/app/clients/clients-view/client-actions/create-self-service-user/create-self-service-user.component.ts
@@ -0,0 +1,106 @@
+/** Angular Imports. */
+import { Component, OnInit } from '@angular/core';
+import { FormBuilder, FormGroup, FormControl, Validators, AbstractControl, ValidationErrors, ValidatorFn } from '@angular/forms';
+import { ActivatedRoute, Router } from '@angular/router';
+import { Subscription } from 'rxjs';
+
+/** Client Services. */
+import { ClientsService } from 'app/clients/clients.service';
+
+@Component({
+ selector: 'mifosx-create-self-service-user',
+ templateUrl: './create-self-service-user.component.html',
+ styleUrls: ['./create-self-service-user.component.scss']
+})
+export class CreateSelfServiceUserComponent implements OnInit {
+
+ createSelfServiceForm: FormGroup;
+ clientData: any;
+ hidePasswordField = true;
+
+ constructor(private formBuilder: FormBuilder,
+ private route: ActivatedRoute,
+ private clientService: ClientsService,
+ private router: Router) {
+ this.route.data.subscribe((data: { clientActionData: any}) => {
+ this.clientData = data.clientActionData;
+ });
+ }
+
+ ngOnInit(): void {
+ this.createSelfServiceUser();
+ this.sendPasswordToEmailChange();
+ }
+
+ /**
+ * Send Password To Email Change.
+ */
+ sendPasswordToEmailChange() {
+ this.createSelfServiceForm.controls.sendPasswordToEmail.valueChanges.subscribe((value: any) => {
+ if (value === true) {
+ this.hidePasswordField = true;
+ this.createSelfServiceForm.removeControl('password');
+ this.createSelfServiceForm.removeControl('repeatPassword');
+ } else {
+ this.hidePasswordField = false;
+ this.createSelfServiceForm.addControl('password', new FormControl('', [Validators.required]));
+ this.createSelfServiceForm.addControl('repeatPassword', new FormControl('', [Validators.required, this.confirmPassword('password')]));
+ }
+ });
+ }
+
+ /**
+ * Create Self User Form.
+ */
+ createSelfServiceUser() {
+ this.createSelfServiceForm = this.formBuilder.group({
+ 'username': new FormControl('', [Validators.required]),
+ 'firstname': new FormControl(this.clientData.firstname, [Validators.required]),
+ 'lastname': new FormControl(this.clientData.lastname, [Validators.required]),
+ 'email': new FormControl('', [Validators.required, Validators.email]),
+ 'sendPasswordToEmail': new FormControl(true),
+ 'passwordNeverExpires': new FormControl(false),
+ 'status': new FormControl({value: this.clientData.subStatus.active ? 'Active' : 'Inactive', disabled: true})
+ });
+ }
+
+ /**
+ * Submit form.
+ */
+ submit() {
+ if (!this.createSelfServiceForm.get('passwordNeverExpires').value) {
+ this.createSelfServiceForm.removeControl('passwordNeverExpires');
+ }
+ const clientId = this.clientData.id.toString();
+ const selfServiceForm = this.createSelfServiceForm.value;
+ selfServiceForm.roles = [2],
+ selfServiceForm.isSelfServiceUser = true;
+ selfServiceForm.staffId = this.clientData.staffId;
+ selfServiceForm.clients = [clientId];
+ selfServiceForm.officeId = this.clientData.officeId;
+ this.clientService.createSelfServiceUser(selfServiceForm).subscribe(() => {
+ this.router.navigate(['../../general'], { relativeTo: this.route });
+ });
+ }
+
+ /**
+ * Confirm Change Password of Users
+ * @param controlNameToCompare Form Control Name to be compared.
+ */
+ confirmPassword(controlNameToCompare: string): ValidatorFn {
+ return (c: AbstractControl): ValidationErrors|null => {
+ if (c.value == null || c.value.length === 0) {
+ return null;
+ }
+ const controlToCompare = c.root.get(controlNameToCompare);
+ if (controlToCompare) {
+ const subscription: Subscription = controlToCompare.valueChanges.subscribe(() => {
+ c.updateValueAndValidity();
+ subscription.unsubscribe();
+ });
+ }
+ return controlToCompare && controlToCompare.value !== c.value ? {'notequal': true} : null;
+ };
+ }
+
+}
diff --git a/src/app/clients/clients-view/clients-view.component.html b/src/app/clients/clients-view/clients-view.component.html
index eed7ba1b3..9efe8fe4d 100644
--- a/src/app/clients/clients-view/clients-view.component.html
+++ b/src/app/clients/clients-view/clients-view.component.html
@@ -106,7 +106,7 @@
-
+
diff --git a/src/app/clients/clients-view/clients-view.component.ts b/src/app/clients/clients-view/clients-view.component.ts
index ce47075cb..10b4b410e 100644
--- a/src/app/clients/clients-view/clients-view.component.ts
+++ b/src/app/clients/clients-view/clients-view.component.ts
@@ -72,6 +72,7 @@ export class ClientsViewComponent implements OnInit {
case 'Reactivate':
case 'Undo Rejection':
case 'Add Charge':
+ case 'Create Self Service User':
case 'Client Screen Reports':
this.router.navigate([`actions/${name}`], { relativeTo: this.route });
break;
diff --git a/src/app/clients/clients.module.ts b/src/app/clients/clients.module.ts
index fe162851d..96b470502 100644
--- a/src/app/clients/clients.module.ts
+++ b/src/app/clients/clients.module.ts
@@ -57,6 +57,7 @@ import { ClientPreviewStepComponent } from './client-stepper/client-preview-step
import { ClientAddressStepComponent } from './client-stepper/client-address-step/client-address-step.component';
import { ClientFamilyMemberDialogComponent } from './client-stepper/client-family-members-step/client-family-member-dialog/client-family-member-dialog.component';
import { CaptureImageDialogComponent } from './clients-view/custom-dialogs/capture-image-dialog/capture-image-dialog.component';
+import { CreateSelfServiceUserComponent } from './clients-view/client-actions/create-self-service-user/create-self-service-user.component';
/**
@@ -119,7 +120,8 @@ import { CaptureImageDialogComponent } from './clients-view/custom-dialogs/captu
ClientPreviewStepComponent,
ClientAddressStepComponent,
ClientFamilyMemberDialogComponent,
- CaptureImageDialogComponent
+ CaptureImageDialogComponent,
+ CreateSelfServiceUserComponent
],
providers: [DatePipe]
diff --git a/src/app/clients/clients.service.ts b/src/app/clients/clients.service.ts
index 20a8b936c..8517aabc4 100644
--- a/src/app/clients/clients.service.ts
+++ b/src/app/clients/clients.service.ts
@@ -355,4 +355,12 @@ export class ClientsService {
createNewSurvey(surveyId: Number, surveyData: any) {
return this.http.post(`/surveys/scorecards/${surveyId}`, surveyData);
}
+
+ /**
+ * @param userData User Data.
+ */
+ createSelfServiceUser(userData: any) {
+ return this.http.post(`/users`, userData);
+ }
+
}
diff --git a/src/app/clients/common-resolvers/client-actions.resolver.ts b/src/app/clients/common-resolvers/client-actions.resolver.ts
index 787ee707e..1e08c53af 100644
--- a/src/app/clients/common-resolvers/client-actions.resolver.ts
+++ b/src/app/clients/common-resolvers/client-actions.resolver.ts
@@ -51,6 +51,8 @@ export class ClientActionsResolver implements Resolve