diff --git a/src/app/users/edit-user/edit-user.component.html b/src/app/users/edit-user/edit-user.component.html new file mode 100644 index 000000000..8b11a0ab9 --- /dev/null +++ b/src/app/users/edit-user/edit-user.component.html @@ -0,0 +1,104 @@ +
+ + + +
+ + + +
+ + + Username + + + Username is required + + + + + Email + + + Email is invalid + + + Email is required + + + + + First name + + + First Name cannot begin with a special character or number + + + First Name is required + + + + + Last name + + + Last Name cannot begin with a special character or number + + + Last Name is required + + + +
+ + Override password expiry policy + +
+ + + Office + + + {{ office.name }} + + + + Office is required + + + + + Staff + + + {{ staff.displayName }} + + + + + + Roles + + + {{ role.name }} + + + + At least one role must be selected + + + +
+ +
+ + + + + + +
+ +
+ +
diff --git a/src/app/users/edit-user/edit-user.component.scss b/src/app/users/edit-user/edit-user.component.scss new file mode 100644 index 000000000..d9eb8f25d --- /dev/null +++ b/src/app/users/edit-user/edit-user.component.scss @@ -0,0 +1,3 @@ +.password-never-expires-wrapper { + padding: 17.5px 0 17.5px 0; +} diff --git a/src/app/users/edit-user/edit-user.component.spec.ts b/src/app/users/edit-user/edit-user.component.spec.ts new file mode 100644 index 000000000..3702bd7a3 --- /dev/null +++ b/src/app/users/edit-user/edit-user.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { EditUserComponent } from './edit-user.component'; + +describe('EditUserComponent', () => { + let component: EditUserComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ EditUserComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(EditUserComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/users/edit-user/edit-user.component.ts b/src/app/users/edit-user/edit-user.component.ts new file mode 100644 index 000000000..c325356fd --- /dev/null +++ b/src/app/users/edit-user/edit-user.component.ts @@ -0,0 +1,92 @@ +/** Angular Imports */ +import { Component, OnInit } from '@angular/core'; +import { ActivatedRoute, Router } from '@angular/router'; +import { FormGroup, FormBuilder, Validators } from '@angular/forms'; + +/** Custom Services */ +import { UsersService } from '../users.service'; + +/** + * Edit User Component. + */ +@Component({ + selector: 'mifosx-edit-user', + templateUrl: './edit-user.component.html', + styleUrls: ['./edit-user.component.scss'] +}) +export class EditUserComponent implements OnInit { + + /** User Data */ + userData: any; + /** Offices Data */ + officesData: any; + /** Staff Data */ + staffData: any; + /** Roles Data */ + rolesData: any; + /** Edit User form. */ + editUserForm: FormGroup; + + /** + * Retrieves the offices data from `resolve`. + * @param {FormBuilder} formBuilder Form Builder. + * @param {UsersService} UsersService Users Service. + * @param {ActivatedRoute} route Activated Route. + * @param {Router} router Router for navigation. + */ + constructor(private formBuilder: FormBuilder, + private usersService: UsersService, + private route: ActivatedRoute, + private router: Router) { + this.route.data.subscribe((data: { user: any, usersTemplate: any }) => { + this.userData = data.user; + this.officesData = data.usersTemplate.allowedOffices; + this.rolesData = data.usersTemplate.availableRoles; + }); + } + + ngOnInit() { + this.createEditUserForm(); + this.officeChanged(this.userData.officeId); + } + + /** + * Creates the edit user form. + */ + createEditUserForm() { + const staffId = this.userData.staff ? this.userData.staff.id : null; + this.editUserForm = this.formBuilder.group({ + 'username': [this.userData.username, Validators.required], + 'email': [this.userData.email, [Validators.required, Validators.email]], + 'firstname': [this.userData.firstname, [Validators.required, Validators.pattern('(^[A-z]).*')]], + 'lastname': [this.userData.lastname, [Validators.required, Validators.pattern('(^[A-z]).*')]], + 'passwordNeverExpires': [this.userData.passwordNeverExpires], + 'officeId': [this.userData.officeId, Validators.required], + 'staffId': [staffId], + 'roles': [this.userData.selectedRoles.map((role: any) => role.id), Validators.required] + }); + } + + /** + * Fetches the staff for the selected office + * @param officeId the selected office id + */ + officeChanged(officeId: number) { + this.staffData = []; + this.usersService.getStaff(officeId).subscribe((staff: any) => { + this.staffData = staff; + }); + } + + /** + * Submits the user form and edits the user, + * if successful redirects to the updated user. + */ + submit() { + const editedUser = this.editUserForm.value; + this.usersService.editUser(this.userData.id, editedUser).subscribe((response: any) => { + this.router.navigate(['../../', response.resourceId], { relativeTo: this.route }); + }); + } + +} diff --git a/src/app/users/users-routing.module.ts b/src/app/users/users-routing.module.ts index 04540b1f5..b717cd318 100644 --- a/src/app/users/users-routing.module.ts +++ b/src/app/users/users-routing.module.ts @@ -12,6 +12,7 @@ import { extract } from '../core/i18n/i18n.service'; import { UsersComponent } from './users.component'; import { CreateUserComponent } from './create-user/create-user.component'; import { ViewUserComponent } from './view-user/view-user.component'; +import { EditUserComponent } from './edit-user/edit-user.component'; /** Custom Resolvers */ import { UsersResolver } from './users.resolver'; @@ -43,13 +44,22 @@ const routes: Routes = [ { path: ':id', data: { title: extract('View User'), routeResolveBreadcrumb: ['user', 'username'] }, - resolve: { - user: UserResolver - }, children: [ { path: '', - component: ViewUserComponent + component: ViewUserComponent, + resolve: { + user: UserResolver + } + }, + { + path: 'edit', + component: EditUserComponent, + data: { title: extract('Edit User'), breadcrumb: 'Edit', routeResolveBreadcrumb: false }, + resolve: { + user: UserResolver, + usersTemplate: UsersTemplateResolver + } } ] } diff --git a/src/app/users/users.module.ts b/src/app/users/users.module.ts index ae34c3215..313f85e9e 100644 --- a/src/app/users/users.module.ts +++ b/src/app/users/users.module.ts @@ -9,6 +9,7 @@ import { UsersRoutingModule } from './users-routing.module'; import { UsersComponent } from './users.component'; import { CreateUserComponent } from './create-user/create-user.component'; import { ViewUserComponent } from './view-user/view-user.component'; +import { EditUserComponent } from './edit-user/edit-user.component'; /** * Users Module @@ -23,7 +24,8 @@ import { ViewUserComponent } from './view-user/view-user.component'; declarations: [ UsersComponent, CreateUserComponent, - ViewUserComponent + ViewUserComponent, + EditUserComponent ] }) export class UsersModule { } diff --git a/src/app/users/users.service.ts b/src/app/users/users.service.ts index cd58b9088..6aed811f8 100644 --- a/src/app/users/users.service.ts +++ b/src/app/users/users.service.ts @@ -40,6 +40,15 @@ export class UsersService { return this.http.post('/users', user); } + /** + * @param {string} userId user ID of user. + * @param {any} user user to be updated. + * @returns {Observable} User. + */ + editUser(userId: string, user: any): Observable { + return this.http.put(`/users/${userId}`, user); + } + /** * @param {string} userId user ID of user. * @returns {Observable} User. @@ -72,7 +81,8 @@ export class UsersService { */ getStaff(officeId: any): Observable { const httpParams = new HttpParams() - .set('officeId', officeId.toString()); + .set('officeId', officeId.toString()) + .set('status', 'all'); return this.http.get('/staff', { params: httpParams }); } diff --git a/src/app/users/view-user/view-user.component.html b/src/app/users/view-user/view-user.component.html index 747af8820..9afe0d38e 100644 --- a/src/app/users/view-user/view-user.component.html +++ b/src/app/users/view-user/view-user.component.html @@ -1,5 +1,5 @@
-