From 8c56783e9799ab929fbed8e732196b0e8b4879d8 Mon Sep 17 00:00:00 2001 From: "Oussema.exe" Date: Mon, 6 Jan 2020 21:39:10 +0100 Subject: [PATCH] feat: add view user component (#547) Fixes: #533 --- src/app/users/user.resolver.ts | 30 +++++++ src/app/users/users-routing.module.ts | 18 ++++- src/app/users/users.component.html | 2 +- src/app/users/users.module.ts | 4 +- src/app/users/users.service.ts | 16 ++++ .../users/view-user/view-user.component.html | 80 +++++++++++++++++++ .../users/view-user/view-user.component.scss | 14 ++++ .../view-user/view-user.component.spec.ts | 25 ++++++ .../users/view-user/view-user.component.ts | 61 ++++++++++++++ 9 files changed, 247 insertions(+), 3 deletions(-) create mode 100644 src/app/users/user.resolver.ts create mode 100644 src/app/users/view-user/view-user.component.html create mode 100644 src/app/users/view-user/view-user.component.scss create mode 100644 src/app/users/view-user/view-user.component.spec.ts create mode 100644 src/app/users/view-user/view-user.component.ts diff --git a/src/app/users/user.resolver.ts b/src/app/users/user.resolver.ts new file mode 100644 index 000000000..22d085aab --- /dev/null +++ b/src/app/users/user.resolver.ts @@ -0,0 +1,30 @@ +/** Angular Imports */ +import { Injectable } from '@angular/core'; +import { ActivatedRouteSnapshot, Resolve } from '@angular/router'; + +/** rxjs Imports */ +import { Observable } from 'rxjs'; + +/** Custom Services */ +import { UsersService } from './users.service'; + +/** + * User data resolver. + */ +@Injectable() +export class UserResolver implements Resolve { + + /** + * @param {UsersService} usersService Users service. + */ + constructor(private usersService: UsersService) {} + + /** + * Returns the user data. + * @returns {Observable} + */ + resolve(route: ActivatedRouteSnapshot): Observable { + const userId = route.paramMap.get('id'); + return this.usersService.getUser(userId); + } +} diff --git a/src/app/users/users-routing.module.ts b/src/app/users/users-routing.module.ts index 27cd61b30..04540b1f5 100644 --- a/src/app/users/users-routing.module.ts +++ b/src/app/users/users-routing.module.ts @@ -11,10 +11,12 @@ import { extract } from '../core/i18n/i18n.service'; /** Custom Components */ import { UsersComponent } from './users.component'; import { CreateUserComponent } from './create-user/create-user.component'; +import { ViewUserComponent } from './view-user/view-user.component'; /** Custom Resolvers */ import { UsersResolver } from './users.resolver'; import { UsersTemplateResolver } from './users-template.resolver'; +import { UserResolver } from './user.resolver'; /** Users Routes */ const routes: Routes = [ @@ -37,6 +39,19 @@ const routes: Routes = [ resolve: { usersTemplate: UsersTemplateResolver } + }, + { + path: ':id', + data: { title: extract('View User'), routeResolveBreadcrumb: ['user', 'username'] }, + resolve: { + user: UserResolver + }, + children: [ + { + path: '', + component: ViewUserComponent + } + ] } ] } @@ -53,7 +68,8 @@ const routes: Routes = [ exports: [RouterModule], providers: [ UsersResolver, - UsersTemplateResolver + UsersTemplateResolver, + UserResolver ] }) export class UsersRoutingModule { } diff --git a/src/app/users/users.component.html b/src/app/users/users.component.html index c40b1fac5..0de9c43d8 100644 --- a/src/app/users/users.component.html +++ b/src/app/users/users.component.html @@ -39,7 +39,7 @@ - + diff --git a/src/app/users/users.module.ts b/src/app/users/users.module.ts index d034558cb..ae34c3215 100644 --- a/src/app/users/users.module.ts +++ b/src/app/users/users.module.ts @@ -8,6 +8,7 @@ import { UsersRoutingModule } from './users-routing.module'; /** Custom Components */ import { UsersComponent } from './users.component'; import { CreateUserComponent } from './create-user/create-user.component'; +import { ViewUserComponent } from './view-user/view-user.component'; /** * Users Module @@ -21,7 +22,8 @@ import { CreateUserComponent } from './create-user/create-user.component'; ], declarations: [ UsersComponent, - CreateUserComponent + CreateUserComponent, + ViewUserComponent ] }) export class UsersModule { } diff --git a/src/app/users/users.service.ts b/src/app/users/users.service.ts index 9aa45e68c..a1bd0d26d 100644 --- a/src/app/users/users.service.ts +++ b/src/app/users/users.service.ts @@ -40,6 +40,22 @@ export class UsersService { return this.http.post('/users', user); } + /** + * @param {string} userId user ID of user. + * @returns {Observable} User. + */ + getUser(userId: string): Observable { + return this.http.get(`/users/${userId}`); + } + + /** + * @param {string} userId user ID of user. + * @returns {Observable} + */ + deleteUser(userId: string): Observable { + return this.http.delete(`/users/${userId}`); + } + /** * @param {any} officeId ID of office to retrieve staff from. * @returns {Observable} Staff data. diff --git a/src/app/users/view-user/view-user.component.html b/src/app/users/view-user/view-user.component.html new file mode 100644 index 000000000..872135c38 --- /dev/null +++ b/src/app/users/view-user/view-user.component.html @@ -0,0 +1,80 @@ +
+ + + +
+ +
+ + + + + +
+ +
+ Login Name +
+ +
+ {{ userData.username }} +
+ +
+ First Name +
+ +
+ {{ userData.firstname }} +
+ +
+ Last Name +
+ +
+ {{ userData.lastname }} +
+ +
+ Email +
+ +
+ {{ userData.email }} +
+ +
+ Office +
+ +
+ {{ userData.officeName }} +
+ +
+ Roles +
+ +
+ + {{ role.name }} + +
+ +
+ +
+ +
+ +
diff --git a/src/app/users/view-user/view-user.component.scss b/src/app/users/view-user/view-user.component.scss new file mode 100644 index 000000000..b154f3f2b --- /dev/null +++ b/src/app/users/view-user/view-user.component.scss @@ -0,0 +1,14 @@ +.container { + max-width: 37rem; + + .content { + div { + margin: 1rem 0; + word-wrap: break-word; + + span { + display: block; + } + } + } +} diff --git a/src/app/users/view-user/view-user.component.spec.ts b/src/app/users/view-user/view-user.component.spec.ts new file mode 100644 index 000000000..57516288e --- /dev/null +++ b/src/app/users/view-user/view-user.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { ViewUserComponent } from './view-user.component'; + +describe('ViewUserComponent', () => { + let component: ViewUserComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ ViewUserComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(ViewUserComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/users/view-user/view-user.component.ts b/src/app/users/view-user/view-user.component.ts new file mode 100644 index 000000000..54293172b --- /dev/null +++ b/src/app/users/view-user/view-user.component.ts @@ -0,0 +1,61 @@ +/** Angular Imports */ +import { Component, OnInit } from '@angular/core'; +import { ActivatedRoute, Router } from '@angular/router'; +import { MatDialog } from '@angular/material'; + +/** Custom Services */ +import { UsersService } from '../users.service'; + +/** Custom Components */ +import { DeleteDialogComponent } from 'app/shared/delete-dialog/delete-dialog.component'; + +/** + * View user component. + */ +@Component({ + selector: 'mifosx-view-user', + templateUrl: './view-user.component.html', + styleUrls: ['./view-user.component.scss'] +}) +export class ViewUserComponent implements OnInit { + + /** User Data. */ + userData: any; + + /** + * Retrieves the user data from `resolve`. + * @param {UsersService} usersService Users Service. + * @param {ActivatedRoute} route Activated Route. + * @param {Router} router Router for navigation. + * @param {MatDialog} dialog Dialog reference. + */ + constructor(private usersService: UsersService, + private route: ActivatedRoute, + private router: Router, + private dialog: MatDialog) { + this.route.data.subscribe((data: { user: any }) => { + this.userData = data.user; + }); + } + + ngOnInit() { + } + + /** + * Deletes the user and redirects to users. + */ + delete() { + const deleteUserDialogRef = this.dialog.open(DeleteDialogComponent, { + data: { deleteContext: `user ${this.userData.id}` } + }); + deleteUserDialogRef.afterClosed().subscribe((response: any) => { + if (response.delete) { + this.usersService.deleteUser(this.userData.id) + .subscribe(() => { + this.router.navigate(['/users']); + }); + } + }); + } + +}