diff --git a/src/app/app.module.ts b/src/app/app.module.ts index ce6d3d573..2fe798bc4 100644 --- a/src/app/app.module.ts +++ b/src/app/app.module.ts @@ -35,6 +35,7 @@ import { SystemModule } from './system/system.module'; import { ProductsModule } from './products/products.module'; import { OrganizationModule } from './organization/organization.module'; import { TemplatesModule } from './templates/templates.module'; +import { UsersModule } from './users/users.module'; @@ -68,6 +69,7 @@ import { AppRoutingModule } from './app-routing.module'; ProductsModule, OrganizationModule, TemplatesModule, + UsersModule, AppRoutingModule, ], declarations: [WebAppComponent, NotFoundComponent], diff --git a/src/app/core/shell/toolbar/toolbar.component.html b/src/app/core/shell/toolbar/toolbar.component.html index acea733ab..1366df12c 100644 --- a/src/app/core/shell/toolbar/toolbar.component.html +++ b/src/app/core/shell/toolbar/toolbar.component.html @@ -100,7 +100,7 @@ - + diff --git a/src/app/users/users-routing.module.ts b/src/app/users/users-routing.module.ts new file mode 100644 index 000000000..11be643c7 --- /dev/null +++ b/src/app/users/users-routing.module.ts @@ -0,0 +1,48 @@ +/** Angular Imports */ +import { NgModule } from '@angular/core'; +import { Routes, RouterModule } from '@angular/router'; + +/** Routing Imports */ +import { Route } from '../core/route/route.service'; + +/** Translation Imports */ +import { extract } from '../core/i18n/i18n.service'; + +/** Custom Components */ +import { UsersComponent } from './users.component'; + +/** Custom Resolvers */ +import { UsersResolver } from './users.resolver'; + +/** Users Routes */ +const routes: Routes = [ + Route.withShell([ + { + path: 'users', + data: { title: extract('Users'), breadcrumb: 'Users' }, + children: [ + { + path: '', + component: UsersComponent, + resolve: { + users: UsersResolver + } + } + ] + } + ]) +]; + +/** + * Users Routing Module + * + * Configures the users routes. + */ +@NgModule({ + imports: [RouterModule.forChild(routes)], + exports: [RouterModule], + providers: [ + UsersResolver + ] +}) +export class UsersRoutingModule { } diff --git a/src/app/users/users.component.html b/src/app/users/users.component.html new file mode 100644 index 000000000..ab77e3d3c --- /dev/null +++ b/src/app/users/users.component.html @@ -0,0 +1,50 @@ +
+ +
+ +
+ +
+ + Filter + + +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
First Name {{ user.firstname }} Last Name {{ user.lastname }} Email {{ user.email }} Office {{ user.officeName }}
+ + + +
+ +
diff --git a/src/app/users/users.component.scss b/src/app/users/users.component.scss new file mode 100644 index 000000000..24edb63bb --- /dev/null +++ b/src/app/users/users.component.scss @@ -0,0 +1,7 @@ +table { + width: 100%; + + .select-row:hover { + cursor: pointer; + } +} diff --git a/src/app/users/users.component.spec.ts b/src/app/users/users.component.spec.ts new file mode 100644 index 000000000..909b5bafc --- /dev/null +++ b/src/app/users/users.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { UsersComponent } from './users.component'; + +describe('UsersComponent', () => { + let component: UsersComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ UsersComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(UsersComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/users/users.component.ts b/src/app/users/users.component.ts new file mode 100644 index 000000000..e0d9cce85 --- /dev/null +++ b/src/app/users/users.component.ts @@ -0,0 +1,65 @@ +/** Angular Imports */ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { MatTableDataSource, MatPaginator, MatSort } from '@angular/material'; +import { ActivatedRoute } from '@angular/router'; + +/** rxjs Imports */ +import { of } from 'rxjs'; + +/** + * Users component. + */ +@Component({ + selector: 'mifosx-users', + templateUrl: './users.component.html', + styleUrls: ['./users.component.scss'] +}) +export class UsersComponent implements OnInit { + + /** Users data. */ + usersData: any; + /** Columns to be displayed in users table. */ + displayedColumns: string[] = ['firstname', 'lastname', 'email', 'officeName']; + /** Data source for users table. */ + dataSource: MatTableDataSource; + + /** Paginator for users table. */ + @ViewChild(MatPaginator) paginator: MatPaginator; + /** Sorter for users table. */ + @ViewChild(MatSort) sort: MatSort; + + /** + * Retrieves the users data from `resolve`. + * @param {ActivatedRoute} route Activated Route. + */ + constructor(private route: ActivatedRoute) { + this.route.data.subscribe(( data: { users: any }) => { + this.usersData = data.users; + }); + } + + /** + * Filters data in users table based on passed value. + * @param {string} filterValue Value to filter data. + */ + applyFilter(filterValue: string) { + this.dataSource.filter = filterValue.trim().toLowerCase(); + } + + /** + * Sets the users table. + */ + ngOnInit() { + this.setUsers(); + } + + /** + * Initializes the data source, paginator and sorter for users table. + */ + setUsers() { + this.dataSource = new MatTableDataSource(this.usersData); + this.dataSource.paginator = this.paginator; + this.dataSource.sort = this.sort; + } + +} diff --git a/src/app/users/users.module.ts b/src/app/users/users.module.ts new file mode 100644 index 000000000..0a1d47b72 --- /dev/null +++ b/src/app/users/users.module.ts @@ -0,0 +1,25 @@ +/** Angular Imports */ +import { NgModule } from '@angular/core'; + +/** Custom Modules */ +import { SharedModule } from '../shared/shared.module'; +import { UsersRoutingModule } from './users-routing.module'; + +/** Custom Components */ +import { UsersComponent } from './users.component'; + +/** + * Users Module + * + * Users components should be declared here. + */ +@NgModule({ + imports: [ + SharedModule, + UsersRoutingModule + ], + declarations: [ + UsersComponent + ] +}) +export class UsersModule { } diff --git a/src/app/users/users.resolver.ts b/src/app/users/users.resolver.ts new file mode 100644 index 000000000..ada6ef705 --- /dev/null +++ b/src/app/users/users.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 { UsersService } from './users.service'; + +/** + * Users data resolver. + */ +@Injectable() +export class UsersResolver implements Resolve { + + /** + * @param {UsersService} usersService Users service. + */ + constructor(private usersService: UsersService) {} + + /** + * Returns the users data. + * @returns {Observable} + */ + resolve(): Observable { + return this.usersService.getUsers(); + } + +} diff --git a/src/app/users/users.service.ts b/src/app/users/users.service.ts new file mode 100644 index 000000000..f05c64cbe --- /dev/null +++ b/src/app/users/users.service.ts @@ -0,0 +1,28 @@ +/** Angular Imports */ +import { Injectable } from '@angular/core'; +import { HttpClient } from '@angular/common/http'; + +/** rxjs Imports */ +import { Observable } from 'rxjs'; + +/** + * Users service. + */ +@Injectable({ + providedIn: 'root' +}) +export class UsersService { + + /** + * @param {HttpClient} http Http Client to send requests. + */ + constructor(private http: HttpClient) { } + + /** + * @returns {Observable} Users data + */ + getUsers(): Observable { + return this.http.get('/users'); + } + +}