From 17cab17d0b20d8e0369de6d7e7abd5863ea6ebfc Mon Sep 17 00:00:00 2001 From: Ashutosh Sharma <45865775+spider0061@users.noreply.github.com> Date: Wed, 13 May 2020 08:17:32 +0530 Subject: [PATCH] feat: add edit employee component (#604) Fixes: #581 --- .../employees/edit-employee.resolver.ts | 31 +++++++ .../edit-employee.component.html | 81 +++++++++++++++++ .../edit-employee.component.scss | 3 + .../edit-employee.component.spec.ts | 25 +++++ .../edit-employee/edit-employee.component.ts | 91 +++++++++++++++++++ .../view-employee.component.html | 2 +- .../organization-routing.module.ts | 26 +++++- src/app/organization/organization.module.ts | 2 + src/app/organization/organization.service.ts | 16 +++- 9 files changed, 268 insertions(+), 9 deletions(-) create mode 100644 src/app/organization/employees/edit-employee.resolver.ts create mode 100644 src/app/organization/employees/edit-employee/edit-employee.component.html create mode 100644 src/app/organization/employees/edit-employee/edit-employee.component.scss create mode 100644 src/app/organization/employees/edit-employee/edit-employee.component.spec.ts create mode 100644 src/app/organization/employees/edit-employee/edit-employee.component.ts diff --git a/src/app/organization/employees/edit-employee.resolver.ts b/src/app/organization/employees/edit-employee.resolver.ts new file mode 100644 index 000000000..67afb90f7 --- /dev/null +++ b/src/app/organization/employees/edit-employee.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 { OrganizationService } from '../organization.service'; + +/** + * Employees data resolver. + */ +@Injectable() +export class EditEmployeeResolver implements Resolve { + + /** + * @param {OrganizationService} organizationService Organization service. + */ + constructor(private organizationService: OrganizationService) {} + + /** + * Returns the employees data. + * @returns {Observable} + */ + resolve(route: ActivatedRouteSnapshot): Observable { + const employeeId = route.paramMap.get('id'); + return this.organizationService.getEmployee(employeeId); + } + +} diff --git a/src/app/organization/employees/edit-employee/edit-employee.component.html b/src/app/organization/employees/edit-employee/edit-employee.component.html new file mode 100644 index 000000000..5a5ee5bd5 --- /dev/null +++ b/src/app/organization/employees/edit-employee/edit-employee.component.html @@ -0,0 +1,81 @@ +
+ + + +
+ + + +
+ + + Office + + + {{ office.name }} + + + + Office is required + + + + + First Name + + + First Name is required + + + First Name cannot begin with a special character or number + + + + + Last Name + + + Last Name is required + + + Last Name cannot begin with a special character or number + + + + + Is Loan Officer + + + + Mobile Number for SMS + + + + + Active + + + + Joining Date + + + + + Joining Date is required + + + +
+ +
+ + + + + + +
+ +
+ +
diff --git a/src/app/organization/employees/edit-employee/edit-employee.component.scss b/src/app/organization/employees/edit-employee/edit-employee.component.scss new file mode 100644 index 000000000..d774f68da --- /dev/null +++ b/src/app/organization/employees/edit-employee/edit-employee.component.scss @@ -0,0 +1,3 @@ +.container { + max-width: 37rem; +} diff --git a/src/app/organization/employees/edit-employee/edit-employee.component.spec.ts b/src/app/organization/employees/edit-employee/edit-employee.component.spec.ts new file mode 100644 index 000000000..ad008d708 --- /dev/null +++ b/src/app/organization/employees/edit-employee/edit-employee.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { EditEmployeeComponent } from './edit-employee.component'; + +describe('EditEmployeeComponent', () => { + let component: EditEmployeeComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ EditEmployeeComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(EditEmployeeComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/organization/employees/edit-employee/edit-employee.component.ts b/src/app/organization/employees/edit-employee/edit-employee.component.ts new file mode 100644 index 000000000..e7f09237a --- /dev/null +++ b/src/app/organization/employees/edit-employee/edit-employee.component.ts @@ -0,0 +1,91 @@ +/** Angular Imports */ +import { Component, OnInit } from '@angular/core'; +import { ActivatedRoute, Router } from '@angular/router'; +import { FormGroup, FormBuilder, Validators } from '@angular/forms'; +import { DatePipe } from '@angular/common'; + +/** Custom Services */ +import { OrganizationService } from '../../organization.service'; + +/** + * Edit Employee Component. + */ +@Component({ + selector: 'mifosx-edit-employee', + templateUrl: './edit-employee.component.html', + styleUrls: ['./edit-employee.component.scss'] +}) +export class EditEmployeeComponent implements OnInit { + + /** Employee data. */ + employeeData: any; + /** Minimum joining date allowed. */ + minDate = new Date(2000, 0, 1); + /** Maximum joining date allowed. */ + maxDate = new Date(); + /** Employee form. */ + editEmployeeForm: FormGroup; + /** Office data. */ + officeData: any; + + /** + * Retrieves the offices data from `resolve`. + * @param {FormBuilder} formBuilder Form Builder. + * @param {OrganizationService} organizationService Organization Service. + * @param {ActivatedRoute} route Activated Route. + * @param {Router} router Router for navigation. + * @param {DatePipe} datePipe Date Pipe to format date. + */ + constructor(private formBuilder: FormBuilder, + private organizationService: OrganizationService, + private route: ActivatedRoute, + private router: Router, + private datePipe: DatePipe) { + this.route.data.subscribe((data: { employee: any, offices: any }) => { + this.employeeData = data.employee; + this.officeData = data.employee.allowedOffices; + }); + } + + /** + * Creates the edit employee form. + */ + ngOnInit() { + this.createEditEmployeeForm(); + } + + /** + * Creates the employee form. + */ + createEditEmployeeForm() { + this.editEmployeeForm = this.formBuilder.group({ + 'officeId': [this.employeeData.officeId, Validators.required], + 'firstname': [this.employeeData.firstname, [Validators.required, Validators.pattern('(^[A-z]).*')]], + 'lastname': [this.employeeData.lastname, [Validators.required, Validators.pattern('(^[A-z]).*')]], + 'isLoanOfficer': [this.employeeData.isLoanOfficer], + 'mobileNo': [this.employeeData.mobileNo], + 'isActive': [this.employeeData.isActive], + 'joiningDate': [this.employeeData.joiningDate && new Date(this.employeeData.joiningDate), Validators.required] + }); + } + + /** + * Submits the employee form and edits employee, + * if successful redirects to the employee edited. + */ + submit() { + const prevJoiningDate: Date = this.editEmployeeForm.value.joiningDate; + // TODO: Update once language and date settings are setup + const dateFormat = 'yyyy-MM-dd'; + this.editEmployeeForm.patchValue({ + joiningDate: this.datePipe.transform(prevJoiningDate, dateFormat) + }); + const employee = this.editEmployeeForm.value; + employee.locale = 'en'; + employee.dateFormat = dateFormat; + this.organizationService.updateEmployee(this.employeeData.id, employee).subscribe((response: any) => { + this.router.navigate(['../../', response.resourceId], { relativeTo: this.route }); + }); + } + +} diff --git a/src/app/organization/employees/view-employee/view-employee.component.html b/src/app/organization/employees/view-employee/view-employee.component.html index 2a2fbf8a1..4be6193d9 100644 --- a/src/app/organization/employees/view-employee/view-employee.component.html +++ b/src/app/organization/employees/view-employee/view-employee.component.html @@ -1,5 +1,5 @@
- diff --git a/src/app/organization/organization-routing.module.ts b/src/app/organization/organization-routing.module.ts index cdd509af4..f24611bd4 100644 --- a/src/app/organization/organization-routing.module.ts +++ b/src/app/organization/organization-routing.module.ts @@ -30,12 +30,14 @@ import { CreateOfficeComponent } from './offices/create-office/create-office.com import { CreatePaymentTypeComponent } from './payment-types/create-payment-type/create-payment-type.component'; import { CreateAdhocQueryComponent } from './adhoc-query/create-adhoc-query/create-adhoc-query.component'; import { HolidaysComponent } from './holidays/holidays.component'; +import { EditEmployeeComponent } from './employees/edit-employee/edit-employee.component'; /** Custom Resolvers */ import { LoanProvisioningCriteriaResolver } from './loan-provisioning-criteria/loan-provisioning-criteria.resolver'; import { OfficesResolver } from './offices/offices.resolver'; import { EmployeesResolver } from './employees/employees.resolver'; import { EmployeeResolver } from './employees/employee.resolver'; +import { EditEmployeeResolver } from './employees/edit-employee.resolver'; import { CurrenciesResolver } from './currencies/currencies.resolver'; import { SmsCampaignsResolver } from './sms-campaigns/sms-campaigns.resolver'; import { AdhocQueriesResolver } from './adhoc-query/adhoc-queries.resolver'; @@ -126,11 +128,24 @@ const routes: Routes = [ }, { path: ':id', - component: ViewEmployeeComponent, - data: { title: extract('View Employee'), routeResolveBreadcrumb: ['employee', 'displayName'] }, - resolve: { - employee: EmployeeResolver - } + data: { title: extract('View Employee'), routeParamBreadcrumb: 'id' }, + children: [ + { + path: '', + component: ViewEmployeeComponent, + resolve: { + employee: EmployeeResolver, + } + }, + { + path: 'edit', + component: EditEmployeeComponent, + data: { title: extract('Edit Employee'), breadcrumb: 'Edit', routeParamBreadcrumb: false }, + resolve: { + employee: EditEmployeeResolver + } + } + ] } ] }, @@ -286,6 +301,7 @@ const routes: Routes = [ OfficesResolver, EmployeesResolver, EmployeeResolver, + EditEmployeeResolver, CurrenciesResolver, SmsCampaignsResolver, AdhocQueriesResolver, diff --git a/src/app/organization/organization.module.ts b/src/app/organization/organization.module.ts index afe37c808..9b888dfe3 100644 --- a/src/app/organization/organization.module.ts +++ b/src/app/organization/organization.module.ts @@ -29,6 +29,7 @@ import { ViewEmployeeComponent } from './employees/view-employee/view-employee.c import { EditOfficeComponent } from './offices/edit-office/edit-office.component'; import { CreateAdhocQueryComponent } from './adhoc-query/create-adhoc-query/create-adhoc-query.component'; import { HolidaysComponent } from './holidays/holidays.component'; +import { EditEmployeeComponent } from './employees/edit-employee/edit-employee.component'; /** * Organization Module @@ -64,6 +65,7 @@ import { HolidaysComponent } from './holidays/holidays.component'; CreateAdhocQueryComponent, HolidaysComponent, EditOfficeComponent, + EditEmployeeComponent ] }) export class OrganizationModule { } diff --git a/src/app/organization/organization.service.ts b/src/app/organization/organization.service.ts index f1423aa32..fe1dbdaa7 100644 --- a/src/app/organization/organization.service.ts +++ b/src/app/organization/organization.service.ts @@ -76,10 +76,12 @@ export class OrganizationService { /** * @param {string} employeeId Employee ID of employee. + * @param {boolean} template * @returns {Observable} Employee. */ - getEmployee(employeeId: string): Observable { - return this.http.get(`/staff/${employeeId}`); + getEmployee(employeeId: string, template: boolean = true): Observable { + const httpParams = new HttpParams().set('template', template.toString()); + return this.http.get(`/staff/${employeeId}`, { params: httpParams }); } /** @@ -246,7 +248,7 @@ export class OrganizationService { return this.http.put('/workingdays', workingDays); } - /* + /** * @param {string} officeId Office ID of Holidays. * @returns {Observable} Holidays data. */ @@ -256,4 +258,12 @@ export class OrganizationService { return this.http.get('/holidays', { params: httpParams }); } + /** + * @param {any} employeeId Employee ID of Employee to be edited. + * @returns {Observable} + */ + updateEmployee(employeeId: string, employee: any): Observable { + return this.http.put(`/staff/${employeeId}`, employee); + } + }