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 + + +
+
+ + Name + + +
+
+ + Location + + +
+
+ Is Active? +
+
+
+ + + + +
+
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 { +}