diff --git a/barker/routes.py b/barker/routes.py
index 57046fb..e66ab34 100644
--- a/barker/routes.py
+++ b/barker/routes.py
@@ -89,9 +89,12 @@ def includeme(config):
config.add_route('guest_book_list', '/guest-book/list')
config.add_route('guest_book_id', '/guest-book/{id}')
- config.add_route('food_table', '/table/new.json')
- config.add_route('food_table_list', '/table/list.json')
- config.add_route('food_table_id', '/table/{id}.json')
+ config.add_route("tables_new", "/tables/new")
+ config.add_route("tables_id", "/tables/{id}")
+ config.add_route("tables_list", "/tables")
+ config.add_route("v1_tables_new", "/v1/tables/new")
+ config.add_route("v1_tables_id", "/v1/tables/{id}")
+ config.add_route("v1_tables_list", "/v1/tables")
config.add_route('voucher', '/Voucher.json')
config.add_route('voucher_id', '/Voucher/{id}.json')
diff --git a/barker/views/food_table.py b/barker/views/food_table.py
index fc88530..5d900b0 100644
--- a/barker/views/food_table.py
+++ b/barker/views/food_table.py
@@ -7,7 +7,7 @@ from pyramid.view import view_config
from barker.models import FoodTable, Overview
-@view_config(request_method='PUT', route_name='food_table', renderer='json', permission='Tables', trans=True)
+@view_config(request_method='POST', route_name='v1_tables_new', renderer='json', permission='Tables', trans=True)
def save(request):
json = request.json_body
item = FoodTable(json['name'], json['location'], json['isActive'], json['sortOrder'])
@@ -17,7 +17,7 @@ def save(request):
return food_table_info(item)
-@view_config(request_method='POST', route_name='food_table_id', renderer='json', permission='Tables', trans=True)
+@view_config(request_method='PUT', route_name='v1_tables_id', renderer='json', permission='Tables', trans=True)
def update(request):
json = request.json_body
item = request.dbsession.query(FoodTable).filter(FoodTable.id == uuid.UUID(request.matchdict['id'])).first()
@@ -30,7 +30,7 @@ def update(request):
return food_table_info(item)
-@view_config(request_method='DELETE', route_name='food_table_id', renderer='json', permission='Tables', trans=True)
+@view_config(request_method='DELETE', route_name='v1_tables_id', renderer='json', permission='Tables', trans=True)
def delete(request):
item = request.dbsession.query(FoodTable).filter(FoodTable.id == uuid.UUID(request.matchdict['id'])).first()
request.dbsession.delete(item)
@@ -38,7 +38,7 @@ def delete(request):
return {}
-@view_config(request_method='GET', route_name='food_table_id', renderer='json', permission='Authenticated')
+@view_config(request_method='GET', route_name='v1_tables_id', renderer='json', permission='Authenticated')
def show_id(request):
id_ = request.matchdict['id']
p = re.compile('^[A-Za-z0-9]{8}-[A-Za-z0-9]{4}-[A-Za-z0-9]{4}-[A-Za-z0-9]{4}-[A-Za-z0-9]{12}$')
@@ -50,8 +50,8 @@ def show_id(request):
return food_table_info(item)
-@view_config(request_method='GET', route_name='food_table', renderer='json', request_param='v', permission='Tables')
-def show_blank(request):
+@view_config(request_method='GET', route_name='v1_tables_new', renderer='json', request_param='v')
+def show_voucher(request):
voucher_id = request.GET['v']
voucher = request.dbsession.query(Overview).filter(Overview.voucher_id == voucher_id).first()
if voucher is not None:
@@ -59,7 +59,17 @@ def show_blank(request):
return {}
-@view_config(request_method='GET', route_name='food_table_list', renderer='json', permission='Authenticated')
+@view_config(request_method='GET', route_name='v1_tables_new', renderer='json', permission='Tables')
+def show_blank(request):
+ return {
+ 'name': "",
+ 'isActive': True,
+ 'location': "",
+ 'sortOrder': 0
+ }
+
+
+@view_config(request_method='GET', route_name='v1_tables_list', renderer='json', permission='Authenticated')
def show_list(request):
active = request.GET.get('a', None)
list_ = request.dbsession.query(FoodTable)
@@ -81,7 +91,7 @@ def show_list(request):
return food_tables
-@view_config(request_method='POST', route_name='food_table_list', renderer='json', permission='Tables')
+@view_config(request_method='PUT', route_name='v1_tables_list', renderer='json', permission='Tables')
def sort_order(request):
json = request.json_body
for index, item in enumerate(json):
@@ -99,8 +109,8 @@ def food_table_info(item):
return {
'id': item.id,
'name': item.name,
- 'isActive': item.is_active,
'location': item.location,
+ 'isActive': item.is_active,
'status': '' if item.status is None else item.status.status,
'sortOrder': item.sort_order,
'voucherId': None if item.status is None else item.status.voucher_id
diff --git a/bookie/src/app/app-routing.module.ts b/bookie/src/app/app-routing.module.ts
index 382b271..e5a0b31 100644
--- a/bookie/src/app/app-routing.module.ts
+++ b/bookie/src/app/app-routing.module.ts
@@ -9,6 +9,10 @@ const routes: Routes = [
path: 'guest-book',
loadChildren: () => import('./guest-book/guest-book.module').then(mod => mod.GuestBookModule)
},
+ {
+ path: 'tables',
+ loadChildren: () => import('./tables/tables.module').then(mod => mod.TableModule)
+ },
{path: 'login', component: LoginComponent},
{path: 'logout', component: LogoutComponent},
{path: '', component: HomeComponent},
diff --git a/bookie/src/app/core/table.ts b/bookie/src/app/core/table.ts
new file mode 100644
index 0000000..e743881
--- /dev/null
+++ b/bookie/src/app/core/table.ts
@@ -0,0 +1,6 @@
+export class Table {
+ id: string;
+ name: string;
+ location: string;
+ isActive: boolean;
+}
diff --git a/bookie/src/app/tables/table-detail/table-detail.component.css b/bookie/src/app/tables/table-detail/table-detail.component.css
new file mode 100644
index 0000000..82c7afd
--- /dev/null
+++ b/bookie/src/app/tables/table-detail/table-detail.component.css
@@ -0,0 +1,3 @@
+.example-card {
+ max-width: 400px;
+}
diff --git a/bookie/src/app/tables/table-detail/table-detail.component.html b/bookie/src/app/tables/table-detail/table-detail.component.html
new file mode 100644
index 0000000..8add151
--- /dev/null
+++ b/bookie/src/app/tables/table-detail/table-detail.component.html
@@ -0,0 +1,33 @@
+
+
+
+ Table
+
+
+
+
+
+
+
+
+
+
diff --git a/bookie/src/app/tables/table-detail/table-detail.component.spec.ts b/bookie/src/app/tables/table-detail/table-detail.component.spec.ts
new file mode 100644
index 0000000..a14e933
--- /dev/null
+++ b/bookie/src/app/tables/table-detail/table-detail.component.spec.ts
@@ -0,0 +1,25 @@
+import {async, ComponentFixture, TestBed} from '@angular/core/testing';
+
+import {TableDetailComponent} from './tables-detail.component';
+
+describe('TableDetailComponent', () => {
+ let component: TableDetailComponent;
+ let fixture: ComponentFixture;
+
+ beforeEach(async(() => {
+ TestBed.configureTestingModule({
+ declarations: [TableDetailComponent]
+ })
+ .compileComponents();
+ }));
+
+ beforeEach(() => {
+ fixture = TestBed.createComponent(TableDetailComponent);
+ component = fixture.componentInstance;
+ fixture.detectChanges();
+ });
+
+ it('should create', () => {
+ expect(component).toBeTruthy();
+ });
+});
diff --git a/bookie/src/app/tables/table-detail/table-detail.component.ts b/bookie/src/app/tables/table-detail/table-detail.component.ts
new file mode 100644
index 0000000..e11722b
--- /dev/null
+++ b/bookie/src/app/tables/table-detail/table-detail.component.ts
@@ -0,0 +1,108 @@
+import {AfterViewInit, Component, ElementRef, OnInit, ViewChild} from '@angular/core';
+
+import {TableService} from '../table.service';
+import {Table} from '../../core/table';
+import {ActivatedRoute, Router} from '@angular/router';
+import {ToasterService} from '../../core/toaster.service';
+import {FormBuilder, FormGroup} from '@angular/forms';
+import {ConfirmDialogComponent} from "../../shared/confirm-dialog/confirm-dialog.component";
+import {MatDialog} from "@angular/material";
+
+@Component({
+ selector: 'app-table-detail',
+ templateUrl: './table-detail.component.html',
+ styleUrls: ['./table-detail.component.css']
+})
+export class TableDetailComponent implements OnInit, AfterViewInit {
+ @ViewChild('nameElement', { static: true }) nameElement: ElementRef;
+ form: FormGroup;
+ item: Table;
+
+ constructor(
+ private route: ActivatedRoute,
+ private router: Router,
+ private dialog: MatDialog,
+ private fb: FormBuilder,
+ private toaster: ToasterService,
+ private ser: TableService
+ ) {
+ this.createForm();
+ }
+
+ createForm() {
+ this.form = this.fb.group({
+ name: '',
+ location: '',
+ isActive: ''
+ });
+ }
+
+ ngOnInit() {
+ this.route.data
+ .subscribe((data: { item: Table }) => {
+ this.showItem(data.item);
+ });
+ }
+
+ showItem(item: Table) {
+ this.item = item;
+ this.form.setValue({
+ name: this.item.name,
+ location: this.item.location,
+ isActive: this.item.isActive
+ });
+ }
+
+ ngAfterViewInit() {
+ setTimeout(() => {
+ this.nameElement.nativeElement.focus();
+ }, 0);
+ }
+
+ save() {
+ this.ser.saveOrUpdate(this.getItem())
+ .subscribe(
+ (result) => {
+ this.toaster.show('Success', '');
+ this.router.navigateByUrl('/tables');
+ },
+ (error) => {
+ this.toaster.show('Danger', error.error);
+ }
+ );
+ }
+
+ delete() {
+ this.ser.delete(this.item.id)
+ .subscribe(
+ (result) => {
+ this.toaster.show('Success', '');
+ this.router.navigateByUrl('/tables');
+ },
+ (error) => {
+ this.toaster.show('Danger', error.error);
+ }
+ );
+ }
+
+ confirmDelete(): void {
+ const dialogRef = this.dialog.open(ConfirmDialogComponent, {
+ width: '250px',
+ data: {title: 'Delete Account?', content: 'Are you sure? This cannot be undone.'}
+ });
+
+ dialogRef.afterClosed().subscribe((result: boolean) => {
+ if (result) {
+ this.delete();
+ }
+ });
+ }
+
+ getItem(): Table {
+ const formModel = this.form.value;
+ this.item.name = formModel.name;
+ this.item.location = formModel.location;
+ this.item.isActive = formModel.isActive;
+ return this.item;
+ }
+}
diff --git a/bookie/src/app/tables/table-list-resolver.service.spec.ts b/bookie/src/app/tables/table-list-resolver.service.spec.ts
new file mode 100644
index 0000000..c2858ad
--- /dev/null
+++ b/bookie/src/app/tables/table-list-resolver.service.spec.ts
@@ -0,0 +1,15 @@
+import {inject, TestBed} from '@angular/core/testing';
+
+import {TableListResolver} from './table-list-resolver.service';
+
+describe('TableListResolverService', () => {
+ beforeEach(() => {
+ TestBed.configureTestingModule({
+ providers: [TableListResolver]
+ });
+ });
+
+ it('should be created', inject([TableListResolver], (service: TableListResolver) => {
+ expect(service).toBeTruthy();
+ }));
+});
diff --git a/bookie/src/app/tables/table-list-resolver.service.ts b/bookie/src/app/tables/table-list-resolver.service.ts
new file mode 100644
index 0000000..9a4905f
--- /dev/null
+++ b/bookie/src/app/tables/table-list-resolver.service.ts
@@ -0,0 +1,18 @@
+import {Injectable} from '@angular/core';
+import {ActivatedRouteSnapshot, Resolve, Router, RouterStateSnapshot} from '@angular/router';
+import {Table} from '../core/table';
+import {Observable} from 'rxjs/internal/Observable';
+import {TableService} from './table.service';
+
+@Injectable({
+ providedIn: 'root'
+})
+export class TableListResolver implements Resolve {
+
+ constructor(private ser: TableService, private router: Router) {
+ }
+
+ resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable {
+ return this.ser.list();
+ }
+}
diff --git a/bookie/src/app/tables/table-list/table-list-datasource.ts b/bookie/src/app/tables/table-list/table-list-datasource.ts
new file mode 100644
index 0000000..8f4a75a
--- /dev/null
+++ b/bookie/src/app/tables/table-list/table-list-datasource.ts
@@ -0,0 +1,59 @@
+import {DataSource} from '@angular/cdk/collections';
+import { MatPaginator } from '@angular/material/paginator';
+import { MatSort } from '@angular/material/sort';
+import {map} from 'rxjs/operators';
+import {merge, Observable, of as observableOf} from 'rxjs';
+import {Table} from '../../core/table';
+
+export class TableListDataSource extends DataSource {
+
+ constructor(private paginator: MatPaginator, private sort: MatSort, public data: Table[]) {
+ super();
+ }
+
+ connect(): Observable {
+ const dataMutations = [
+ observableOf(this.data),
+ this.paginator.page,
+ this.sort.sortChange
+ ];
+
+ // Set the paginators length
+ this.paginator.length = this.data.length;
+
+ return merge(...dataMutations).pipe(map(() => {
+ return this.getPagedData(this.getSortedData([...this.data]));
+ }));
+ }
+
+ disconnect() {
+ }
+
+ private getPagedData(data: Table[]) {
+ const startIndex = this.paginator.pageIndex * this.paginator.pageSize;
+ return data.splice(startIndex, this.paginator.pageSize);
+ }
+
+ private getSortedData(data: Table[]) {
+ if (!this.sort.active || this.sort.direction === '') {
+ return data;
+ }
+
+ return data.sort((a, b) => {
+ const isAsc = this.sort.direction === 'asc';
+ switch (this.sort.active) {
+ case 'name':
+ return compare(a.name, b.name, isAsc);
+ case 'id':
+ return compare(+a.id, +b.id, isAsc);
+ default:
+ return 0;
+ }
+ });
+ }
+}
+
+/** Simple sort comparator for example ID/Name columns (for client-side sorting). */
+function compare(a, b, isAsc) {
+ return (a < b ? -1 : 1) * (isAsc ? 1 : -1);
+}
diff --git a/bookie/src/app/tables/table-list/table-list.component.css b/bookie/src/app/tables/table-list/table-list.component.css
index 49a8146..e69de29 100644
--- a/bookie/src/app/tables/table-list/table-list.component.css
+++ b/bookie/src/app/tables/table-list/table-list.component.css
@@ -1,21 +0,0 @@
-.grid-container {
- margin: 20px;
-}
-
-.dashboard-card {
- position: absolute;
- top: 15px;
- left: 15px;
- right: 15px;
- bottom: 15px;
-}
-
-.more-button {
- position: absolute;
- top: 5px;
- right: 10px;
-}
-
-.dashboard-card-content {
- text-align: center;
-}
diff --git a/bookie/src/app/tables/table-list/table-list.component.html b/bookie/src/app/tables/table-list/table-list.component.html
index 91a8a3f..1b8e4a2 100644
--- a/bookie/src/app/tables/table-list/table-list.component.html
+++ b/bookie/src/app/tables/table-list/table-list.component.html
@@ -1,7 +1,41 @@
-
-
-
+
+
+ Tables
+
+ add_box
+ Add
+
+
+
+
-
-
-
+
+
+ Name
+ {{row.name}}
+
+
+
+
+ Location
+ {{row.location}}
+
+
+
+
+ Is Active?
+ {{row.isActive}}
+
+
+
+
+
+
+
+
+
+
diff --git a/bookie/src/app/tables/table-list/table-list.component.spec.ts b/bookie/src/app/tables/table-list/table-list.component.spec.ts
new file mode 100644
index 0000000..8ae0953
--- /dev/null
+++ b/bookie/src/app/tables/table-list/table-list.component.spec.ts
@@ -0,0 +1,23 @@
+import {ComponentFixture, fakeAsync, TestBed} from '@angular/core/testing';
+
+import {TableListComponent} from './table-list.component';
+
+describe('TableListComponent', () => {
+ let component: TableListComponent;
+ let fixture: ComponentFixture;
+
+ beforeEach(fakeAsync(() => {
+ TestBed.configureTestingModule({
+ declarations: [TableListComponent]
+ })
+ .compileComponents();
+
+ fixture = TestBed.createComponent(TableListComponent);
+ component = fixture.componentInstance;
+ fixture.detectChanges();
+ }));
+
+ it('should compile', () => {
+ expect(component).toBeTruthy();
+ });
+});
diff --git a/bookie/src/app/tables/table-list/table-list.component.ts b/bookie/src/app/tables/table-list/table-list.component.ts
index a0778d7..21b7581 100644
--- a/bookie/src/app/tables/table-list/table-list.component.ts
+++ b/bookie/src/app/tables/table-list/table-list.component.ts
@@ -1,33 +1,31 @@
-import { Component } from '@angular/core';
-import { map } from 'rxjs/operators';
-import { Breakpoints, BreakpointObserver } from '@angular/cdk/layout';
+import {Component, OnInit, ViewChild} from '@angular/core';
+import { MatPaginator } from '@angular/material/paginator';
+import { MatSort } from '@angular/material/sort';
+import {TableListDataSource} from './table-list-datasource';
+import {Table} from '../../core/table';
+import {ActivatedRoute} from '@angular/router';
@Component({
selector: 'app-table-list',
templateUrl: './table-list.component.html',
styleUrls: ['./table-list.component.css']
})
-export class TableListComponent {
- /** Based on the screen size, switch from standard to one column per row */
- cards = this.breakpointObserver.observe(Breakpoints.Handset).pipe(
- map(({ matches }) => {
- if (matches) {
- return [
- { title: 'Card 1', cols: 1, rows: 1 },
- { title: 'Card 2', cols: 1, rows: 1 },
- { title: 'Card 3', cols: 1, rows: 1 },
- { title: 'Card 4', cols: 1, rows: 1 }
- ];
- }
+export class TableListComponent implements OnInit {
+ @ViewChild(MatPaginator, { static: true }) paginator: MatPaginator;
+ @ViewChild(MatSort, { static: true }) sort: MatSort;
+ dataSource: TableListDataSource;
+ list: Table[];
+ /** Columns displayed in the table. Columns IDs can be added, removed, or reordered. */
+ displayedColumns = ['name', 'isActive'];
- return [
- { title: 'Card 1', cols: 2, rows: 1 },
- { title: 'Card 2', cols: 1, rows: 1 },
- { title: 'Card 3', cols: 1, rows: 2 },
- { title: 'Card 4', cols: 1, rows: 1 }
- ];
- })
- );
+ constructor(private route: ActivatedRoute) {
+ }
- constructor(private breakpointObserver: BreakpointObserver) {}
+ ngOnInit() {
+ this.route.data
+ .subscribe((data: { list: Table[] }) => {
+ this.list = data.list;
+ });
+ this.dataSource = new TableListDataSource(this.paginator, this.sort, this.list);
+ }
}
diff --git a/bookie/src/app/tables/table-resolver.service.spec.ts b/bookie/src/app/tables/table-resolver.service.spec.ts
new file mode 100644
index 0000000..ff5445f
--- /dev/null
+++ b/bookie/src/app/tables/table-resolver.service.spec.ts
@@ -0,0 +1,15 @@
+import {inject, TestBed} from '@angular/core/testing';
+
+import {TableResolver} from './table-resolver.service';
+
+describe('TableResolverService', () => {
+ beforeEach(() => {
+ TestBed.configureTestingModule({
+ providers: [TableResolver]
+ });
+ });
+
+ it('should be created', inject([TableResolver], (service: TableResolver) => {
+ expect(service).toBeTruthy();
+ }));
+});
diff --git a/bookie/src/app/tables/table-resolver.service.ts b/bookie/src/app/tables/table-resolver.service.ts
new file mode 100644
index 0000000..3627425
--- /dev/null
+++ b/bookie/src/app/tables/table-resolver.service.ts
@@ -0,0 +1,19 @@
+import {Injectable} from '@angular/core';
+import {ActivatedRouteSnapshot, Resolve, Router, RouterStateSnapshot} from '@angular/router';
+import {TableService} from './table.service';
+import {Table} from '../core/table';
+import {Observable} from 'rxjs/internal/Observable';
+
+@Injectable({
+ providedIn: 'root'
+})
+export class TableResolver implements Resolve {
+
+ constructor(private ser: TableService, private router: Router) {
+ }
+
+ resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable {
+ const id = route.paramMap.get('id');
+ return this.ser.get(id);
+ }
+}
diff --git a/bookie/src/app/tables/table.service.spec.ts b/bookie/src/app/tables/table.service.spec.ts
new file mode 100644
index 0000000..46b596c
--- /dev/null
+++ b/bookie/src/app/tables/table.service.spec.ts
@@ -0,0 +1,15 @@
+import {inject, TestBed} from '@angular/core/testing';
+
+import {TableService} from './table.service';
+
+describe('TableService', () => {
+ beforeEach(() => {
+ TestBed.configureTestingModule({
+ providers: [TableService]
+ });
+ });
+
+ it('should be created', inject([TableService], (service: TableService) => {
+ expect(service).toBeTruthy();
+ }));
+});
diff --git a/bookie/src/app/tables/table.service.ts b/bookie/src/app/tables/table.service.ts
new file mode 100644
index 0000000..cdd5e45
--- /dev/null
+++ b/bookie/src/app/tables/table.service.ts
@@ -0,0 +1,65 @@
+import {Injectable} from '@angular/core';
+import {HttpClient, HttpHeaders, HttpParams} from '@angular/common/http';
+import {ErrorLoggerService} from '../core/error-logger.service';
+import {catchError} from 'rxjs/operators';
+import {Observable} from 'rxjs/internal/Observable';
+import {Table} from '../core/table';
+
+const httpOptions = {
+ headers: new HttpHeaders({'Content-Type': 'application/json'})
+};
+const url = '/v1/tables';
+const serviceName = 'TableService';
+
+@Injectable({
+ providedIn: 'root'
+})
+export class TableService {
+ constructor(private http: HttpClient, private log: ErrorLoggerService) {
+ }
+
+ get(id: string): Observable {
+ const getUrl: string = (id === null) ? `${url}/new` : `${url}/${id}`;
+ return >this.http.get(getUrl)
+ .pipe(
+ catchError(this.log.handleError(serviceName, `get id=${id}`))
+ );
+ }
+
+ list(): Observable {
+ const options = {params: new HttpParams().set('l', '')};
+ return >this.http.get(url, options)
+ .pipe(
+ catchError(this.log.handleError(serviceName, 'list'))
+ );
+ }
+
+ save(tables: Table): Observable {
+ return >this.http.post(`${url}/new`, tables, httpOptions)
+ .pipe(
+ catchError(this.log.handleError(serviceName, 'save'))
+ );
+ }
+
+ update(tables: Table): Observable {
+ return >this.http.put(`${url}/${tables.id}`, tables, httpOptions)
+ .pipe(
+ catchError(this.log.handleError(serviceName, 'update'))
+ );
+ }
+
+ saveOrUpdate(tables: Table): Observable {
+ if (!tables.id) {
+ return this.save(tables);
+ } else {
+ return this.update(tables);
+ }
+ }
+
+ delete(id: string): Observable {
+ return >this.http.delete(`${url}/${id}`, httpOptions)
+ .pipe(
+ catchError(this.log.handleError(serviceName, 'delete'))
+ );
+ }
+}
diff --git a/bookie/src/app/tables/tables-routing.module.spec.ts b/bookie/src/app/tables/tables-routing.module.spec.ts
new file mode 100644
index 0000000..be00969
--- /dev/null
+++ b/bookie/src/app/tables/tables-routing.module.spec.ts
@@ -0,0 +1,13 @@
+import {TableRoutingModule} from './tables-routing.module';
+
+describe('TableRoutingModule', () => {
+ let tablesRoutingModule: TableRoutingModule;
+
+ beforeEach(() => {
+ tablesRoutingModule = new TableRoutingModule();
+ });
+
+ it('should create an instance', () => {
+ expect(tablesRoutingModule).toBeTruthy();
+ });
+});
diff --git a/bookie/src/app/tables/tables-routing.module.ts b/bookie/src/app/tables/tables-routing.module.ts
new file mode 100644
index 0000000..ea225ef
--- /dev/null
+++ b/bookie/src/app/tables/tables-routing.module.ts
@@ -0,0 +1,61 @@
+import {NgModule} from '@angular/core';
+import {CommonModule} from '@angular/common';
+import {RouterModule, Routes} from '@angular/router';
+import {TableListResolver} from './table-list-resolver.service';
+import {TableResolver} from './table-resolver.service';
+import {TableListComponent} from './table-list/table-list.component';
+import {TableDetailComponent} from './table-detail/table-detail.component';
+import {AuthGuard} from '../auth/auth-guard.service';
+
+const tablesRoutes: Routes = [
+ {
+ path: '',
+ component: TableListComponent,
+ canActivate: [AuthGuard],
+ data: {
+ permission: 'Tables'
+ },
+ resolve: {
+ list: TableListResolver
+ }
+ },
+ {
+ path: 'new',
+ component: TableDetailComponent,
+ canActivate: [AuthGuard],
+ data: {
+ permission: 'Tables'
+ },
+ resolve: {
+ item: TableResolver
+ }
+ },
+ {
+ path: ':id',
+ component: TableDetailComponent,
+ canActivate: [AuthGuard],
+ data: {
+ permission: 'Tables'
+ },
+ resolve: {
+ item: TableResolver
+ }
+ }
+];
+
+@NgModule({
+ imports: [
+ CommonModule,
+ RouterModule.forChild(tablesRoutes)
+
+ ],
+ exports: [
+ RouterModule
+ ],
+ providers: [
+ TableListResolver,
+ TableResolver
+ ]
+})
+export class TableRoutingModule {
+}
diff --git a/bookie/src/app/tables/tables.module.spec.ts b/bookie/src/app/tables/tables.module.spec.ts
new file mode 100644
index 0000000..93e27a9
--- /dev/null
+++ b/bookie/src/app/tables/tables.module.spec.ts
@@ -0,0 +1,13 @@
+import {TableModule} from './tables.module';
+
+describe('TableModule', () => {
+ let tablesModule: TableModule;
+
+ beforeEach(() => {
+ tablesModule = new TableModule();
+ });
+
+ it('should create an instance', () => {
+ expect(tablesModule).toBeTruthy();
+ });
+});
diff --git a/bookie/src/app/tables/tables.module.ts b/bookie/src/app/tables/tables.module.ts
index e90288c..c2bf3f2 100644
--- a/bookie/src/app/tables/tables.module.ts
+++ b/bookie/src/app/tables/tables.module.ts
@@ -1,23 +1,43 @@
-import { NgModule } from '@angular/core';
-import { CommonModule } from '@angular/common';
-import { TableListComponent } from './table-list/table-list.component';
+import {NgModule} from '@angular/core';
+import {CommonModule} from '@angular/common';
+
+import {TableListComponent} from './table-list/table-list.component';
+import {TableDetailComponent} from './table-detail/table-detail.component';
+import {TableRoutingModule} from './tables-routing.module';
import { MatButtonModule } from '@angular/material/button';
import { MatCardModule } from '@angular/material/card';
-import { MatGridListModule } from '@angular/material/grid-list';
+import { MatCheckboxModule } from '@angular/material/checkbox';
import { MatIconModule } from '@angular/material/icon';
-import { MatMenuModule } from '@angular/material/menu';
-import { LayoutModule } from '@angular/cdk/layout';
+import { MatInputModule } from '@angular/material/input';
+import { MatPaginatorModule } from '@angular/material/paginator';
+import { MatProgressSpinnerModule } from '@angular/material/progress-spinner';
+import { MatSortModule } from '@angular/material/sort';
+import { MatTableModule } from '@angular/material/table';
+import {CdkTableModule} from '@angular/cdk/table';
+import {ReactiveFormsModule} from '@angular/forms';
+import {FlexLayoutModule} from '@angular/flex-layout';
@NgModule({
- declarations: [TableListComponent],
imports: [
CommonModule,
- MatGridListModule,
- MatCardModule,
- MatMenuModule,
- MatIconModule,
+ CdkTableModule,
+ FlexLayoutModule,
MatButtonModule,
- LayoutModule
+ MatCardModule,
+ MatCheckboxModule,
+ MatIconModule,
+ MatInputModule,
+ MatPaginatorModule,
+ MatProgressSpinnerModule,
+ MatSortModule,
+ MatTableModule,
+ ReactiveFormsModule,
+ TableRoutingModule
+ ],
+ declarations: [
+ TableListComponent,
+ TableDetailComponent
]
})
-export class TablesModule { }
+export class TableModule {
+}