From 2ce737e53d32e8216f342608719efd6143fbbb14 Mon Sep 17 00:00:00 2001 From: punwai Date: Sun, 29 Dec 2019 14:14:03 +0800 Subject: [PATCH] feat: add password preferences component Fixes: #510 --- .../organization-routing.module.ts | 13 ++- .../organization/organization.component.html | 2 +- src/app/organization/organization.module.ts | 4 +- src/app/organization/organization.service.ts | 15 ++++ .../password-preferences-template.resolver.ts | 30 +++++++ .../password-preferences.component.html | 26 ++++++ .../password-preferences.component.scss | 3 + .../password-preferences.component.spec.ts | 25 ++++++ .../password-preferences.component.ts | 79 +++++++++++++++++++ 9 files changed, 194 insertions(+), 3 deletions(-) create mode 100644 src/app/organization/password-preferences/password-preferences-template.resolver.ts create mode 100644 src/app/organization/password-preferences/password-preferences.component.html create mode 100644 src/app/organization/password-preferences/password-preferences.component.scss create mode 100644 src/app/organization/password-preferences/password-preferences.component.spec.ts create mode 100644 src/app/organization/password-preferences/password-preferences.component.ts diff --git a/src/app/organization/organization-routing.module.ts b/src/app/organization/organization-routing.module.ts index c8d82ffc9..fb44218e4 100644 --- a/src/app/organization/organization-routing.module.ts +++ b/src/app/organization/organization-routing.module.ts @@ -18,6 +18,7 @@ import { SmsCampaignsComponent } from './sms-campaigns/sms-campaigns.component'; import { AdhocQueryComponent } from './adhoc-query/adhoc-query.component'; import { TellersComponent } from './tellers/tellers.component'; import { PaymentTypesComponent } from './payment-types/payment-types.component'; +import { PasswordPreferencesComponent } from './password-preferences/password-preferences.component'; /** Custom Resolvers */ import { LoanProvisioningCriteriaResolver } from './loan-provisioning-criteria/loan-provisioning-criteria.resolver'; @@ -28,6 +29,7 @@ import { SmsCampaignsResolver } from './sms-campaigns/sms-campaigns.resolver'; import { AdhocQueriesResolver } from './adhoc-query/adhoc-queries.resolver'; import { TellersResolver } from './tellers/tellers.resolver'; import { PaymentTypesResolver } from './payment-types/payment-types.resolver'; +import { PasswordPreferencesTemplateResolver } from './password-preferences/password-preferences-template.resolver'; /** Organization Routes */ const routes: Routes = [ @@ -108,6 +110,14 @@ const routes: Routes = [ resolve: { paymentTypes: PaymentTypesResolver } + }, + { + path: 'password-preferences', + component: PasswordPreferencesComponent, + data: { title: extract('Password Preferences'), breadcrumb: 'Password Preferences' }, + resolve: { + passwordPreferencesTemplate: PasswordPreferencesTemplateResolver + } } ] } @@ -130,7 +140,8 @@ const routes: Routes = [ SmsCampaignsResolver, AdhocQueriesResolver, TellersResolver, - PaymentTypesResolver + PaymentTypesResolver, + PasswordPreferencesTemplateResolver ] }) export class OrganizationRoutingModule { } diff --git a/src/app/organization/organization.component.html b/src/app/organization/organization.component.html index 40555bcaf..034231020 100644 --- a/src/app/organization/organization.component.html +++ b/src/app/organization/organization.component.html @@ -48,7 +48,7 @@

Bulk entry screen for mapping fund sources to loans

- + diff --git a/src/app/organization/organization.module.ts b/src/app/organization/organization.module.ts index fcfc458e8..7dff56905 100644 --- a/src/app/organization/organization.module.ts +++ b/src/app/organization/organization.module.ts @@ -16,6 +16,7 @@ import { SmsCampaignsComponent } from './sms-campaigns/sms-campaigns.component'; import { AdhocQueryComponent } from './adhoc-query/adhoc-query.component'; import { TellersComponent } from './tellers/tellers.component'; import { PaymentTypesComponent } from './payment-types/payment-types.component'; +import { PasswordPreferencesComponent } from './password-preferences/password-preferences.component'; /** * Organization Module @@ -37,7 +38,8 @@ import { PaymentTypesComponent } from './payment-types/payment-types.component'; SmsCampaignsComponent, AdhocQueryComponent, TellersComponent, - PaymentTypesComponent + PaymentTypesComponent, + PasswordPreferencesComponent ] }) export class OrganizationModule { } diff --git a/src/app/organization/organization.service.ts b/src/app/organization/organization.service.ts index a648feb61..a41ca7965 100644 --- a/src/app/organization/organization.service.ts +++ b/src/app/organization/organization.service.ts @@ -82,4 +82,19 @@ export class OrganizationService { return this.http.delete(`/paymenttypes/${paymentTypeId}`); } + /** + * @returns {Observable} Password Preferences Template data + */ + getPasswordPreferencesTemplate(): Observable { + return this.http.get('/passwordpreferences/template'); + } + + /** + * @param {any} passwordPreferences Password Preferences data. + * @returns {Observable} + */ + updatePasswordPreferences(passwordPreferences: any): Observable { + return this.http.put('/passwordpreferences', passwordPreferences); + } + } diff --git a/src/app/organization/password-preferences/password-preferences-template.resolver.ts b/src/app/organization/password-preferences/password-preferences-template.resolver.ts new file mode 100644 index 000000000..ef038f28f --- /dev/null +++ b/src/app/organization/password-preferences/password-preferences-template.resolver.ts @@ -0,0 +1,30 @@ +/** Angular Imports */ +import { Injectable } from '@angular/core'; +import { Resolve } from '@angular/router'; + +/** rxjs Imports */ +import { Observable } from 'rxjs'; + +/** Custom Services */ +import { OrganizationService } from '../organization.service'; + +/** + * Password Preferences Template data resolver. + */ +@Injectable() +export class PasswordPreferencesTemplateResolver implements Resolve { + + /** + * @param {OrganizationService} organizationService Organization service. + */ + constructor(private organizationService: OrganizationService) {} + + /** + * Returns the password preferences template data. + * @returns {Observable} + */ + resolve(): Observable { + return this.organizationService.getPasswordPreferencesTemplate(); + } + +} diff --git a/src/app/organization/password-preferences/password-preferences.component.html b/src/app/organization/password-preferences/password-preferences.component.html new file mode 100644 index 000000000..b9ab03b2a --- /dev/null +++ b/src/app/organization/password-preferences/password-preferences.component.html @@ -0,0 +1,26 @@ +
+ + + +
+ + + + + + {{ passwordPreference.description }} + + + + + + + + + + +
+ +
+ +
diff --git a/src/app/organization/password-preferences/password-preferences.component.scss b/src/app/organization/password-preferences/password-preferences.component.scss new file mode 100644 index 000000000..783d2bc85 --- /dev/null +++ b/src/app/organization/password-preferences/password-preferences.component.scss @@ -0,0 +1,3 @@ +.description-wrap { + white-space: normal; +} diff --git a/src/app/organization/password-preferences/password-preferences.component.spec.ts b/src/app/organization/password-preferences/password-preferences.component.spec.ts new file mode 100644 index 000000000..a1a48d65b --- /dev/null +++ b/src/app/organization/password-preferences/password-preferences.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { PasswordPreferencesComponent } from './password-preferences.component'; + +describe('PasswordPreferencesComponent', () => { + let component: PasswordPreferencesComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ PasswordPreferencesComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(PasswordPreferencesComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/organization/password-preferences/password-preferences.component.ts b/src/app/organization/password-preferences/password-preferences.component.ts new file mode 100644 index 000000000..3e2ab8395 --- /dev/null +++ b/src/app/organization/password-preferences/password-preferences.component.ts @@ -0,0 +1,79 @@ +/** Angular Imports */ +import { Component, OnInit } from '@angular/core'; +import { FormGroup, FormBuilder } from '@angular/forms'; +import { Router, ActivatedRoute } from '@angular/router'; + +/** Custom Services */ +import { OrganizationService } from '../organization.service'; + +/** + * Password preferences component. + */ +@Component({ + selector: 'mifosx-password-preferences', + templateUrl: './password-preferences.component.html', + styleUrls: ['./password-preferences.component.scss'] +}) +export class PasswordPreferencesComponent implements OnInit { + + /** Password preferences form. */ + passwordPreferencesForm: FormGroup; + /** Password preferences data. */ + passwordPreferencesData: any; + + /** + * Retrieves the password preferences data from `resolve`. + * @param {FormBuilder} formBuilder Form Builder. + * @param {OrganizationService} organizationService Organization Service. + * @param {ActivatedRoute} route Activated Route. + * @param {Router} router Router for navigation. + */ + constructor(private formBuilder: FormBuilder, + private organizationService: OrganizationService, + private route: ActivatedRoute, + private router: Router) { + this.route.data.subscribe((data: { passwordPreferencesTemplate: any}) => { + this.passwordPreferencesData = data.passwordPreferencesTemplate; + }); + } + + /** + * Creates and sets the password preferences form. + */ + ngOnInit() { + this.createPasswordPreferencesForm(); + this.setPasswordPreferencesForm(); + } + + /** + * Creates the password preferences form. + */ + createPasswordPreferencesForm() { + this.passwordPreferencesForm = this.formBuilder.group({ + 'validationPolicyId': [''] + }); + } + + /** + * Sets the password preferences form. + */ + setPasswordPreferencesForm() { + for (const passwordPreference of this.passwordPreferencesData) { + if (passwordPreference.active === true) { + this.passwordPreferencesForm.get('validationPolicyId').setValue(passwordPreference.id); + } + } + } + + /** + * Submits the password preferences form and updates password preferences, + * if successful redirects to organization view. + */ + submit() { + const passwordPreferences = this.passwordPreferencesForm.value; + this.organizationService.updatePasswordPreferences(passwordPreferences).subscribe((response: any) => { + this.router.navigate(['../'], { relativeTo: this.route }); + }); + } + +}