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 @@
+
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 @@
-