diff --git a/src/app/app-module.ts b/src/app/app-module.ts index 4907717..7b9b385 100644 --- a/src/app/app-module.ts +++ b/src/app/app-module.ts @@ -28,6 +28,7 @@ import { MatTooltipModule } from '@angular/material/tooltip'; import { MatPaginatorModule } from '@angular/material/paginator'; import { MatTableModule } from '@angular/material/table'; import {MatSelectModule} from '@angular/material/select'; +import { MatSortModule } from '@angular/material/sort'; import { HeaderComponent } from './header/header.component'; import { HomeComponent } from './home/home.component'; @@ -78,6 +79,7 @@ import { PricelistComponent } from './pricelist/pricelist.component'; + @NgModule({ declarations: [ App, @@ -128,39 +130,40 @@ import { PricelistComponent } from './pricelist/pricelist.component'; CancelOrderDialog, PricelistComponent, ], - imports: [ - AppRoutingModule, - BrowserModule, - ReactiveFormsModule, - CommonModule, - FormsModule, - MatIconModule, - MatTabsModule, - MatToolbarModule, - MatProgressBarModule, - MatProgressSpinnerModule, - MatSnackBarModule, - MatAutocompleteModule, - MatInputModule, - MatFormFieldModule, - MatIconButton, - MatDividerModule, - MatButtonModule, - MatDialogClose, - MatDialogTitle, - MatDialogContent, - MatDialogActions, - MatCheckboxModule, - MatStepperModule, - NgxMaskDirective, - NgxMaskPipe, - QRCodeComponent, - MatBadgeModule, - MatTooltipModule, - MatPaginatorModule, - MatTableModule, - MatSelectModule, - ], + imports: [ + AppRoutingModule, + BrowserModule, + ReactiveFormsModule, + CommonModule, + FormsModule, + MatIconModule, + MatTabsModule, + MatToolbarModule, + MatProgressBarModule, + MatProgressSpinnerModule, + MatSnackBarModule, + MatAutocompleteModule, + MatInputModule, + MatFormFieldModule, + MatIconButton, + MatDividerModule, + MatButtonModule, + MatDialogClose, + MatDialogTitle, + MatDialogContent, + MatDialogActions, + MatCheckboxModule, + MatStepperModule, + NgxMaskDirective, + NgxMaskPipe, + QRCodeComponent, + MatBadgeModule, + MatTooltipModule, + MatPaginatorModule, + MatTableModule, + MatSelectModule, + MatSortModule, + ], providers: [ provideBrowserGlobalErrorListeners(), provideHttpClient( diff --git a/src/app/statistics/statistics.component.html b/src/app/statistics/statistics.component.html index 9b20459..184d756 100644 --- a/src/app/statistics/statistics.component.html +++ b/src/app/statistics/statistics.component.html @@ -2,40 +2,29 @@

Movie-Statistiken

- - Filter - - - @for(filterValue of valuesToFilter; track $index){ - {{filterValue}} - } - - - -
- +
- - + + - - + + - - - - @@ -52,38 +41,38 @@

Show-Statistiken

-
IDID {{row.movieId}} TitelTitel {{row.movieTitle}} + + Umsatz {{(row.earnings/100).toFixed(2)}} € + + Gebuchte Tickets {{row.tickets}}
+
- - + + - - + + - - + + - - + + - - - - diff --git a/src/app/statistics/statistics.component.ts b/src/app/statistics/statistics.component.ts index 55d99d5..1745cb4 100644 --- a/src/app/statistics/statistics.component.ts +++ b/src/app/statistics/statistics.component.ts @@ -1,11 +1,15 @@ -import {Component, inject} from '@angular/core'; +import {Component, effect, inject, signal, ViewChild} from '@angular/core'; +import {MatSort, Sort, MatSortModule} from '@angular/material/sort'; import {HttpService} from '../http.service'; import { StatisticsFilm, StatisticsVorstellung, } from '@infinimotion/model-frontend'; import {LoadingService} from '../loading.service'; -import {filter, firstValueFrom, forkJoin} from 'rxjs'; +import {firstValueFrom} from 'rxjs'; +import {MatTableDataSource} from '@angular/material/table'; +import {MatPaginatorModule} from '@angular/material/paginator'; + @Component({ selector: 'app-statistics', @@ -15,19 +19,30 @@ import {filter, firstValueFrom, forkJoin} from 'rxjs'; }) export class StatisticsComponent { private http = inject(HttpService); - protected movies: StatisticsFilm[] = []; - protected shows: StatisticsVorstellung[] = []; - protected moviesDisplayedColumns: string[] = ['id', 'title', 'earnings', 'tickets']; - protected showsDisplayedColumns: string[] = ['id', 'hall', 'movie_title', 'date', 'earnings', 'tickets']; - protected valuesToFilter: string[] = ['title', 'date', 'earnings', 'tickets']; + protected movies = signal([]); + protected shows = signal([]); + protected moviesDisplayedColumns: string[] = ['movieId', 'movieTitle', 'movieEarnings', 'movieTickets']; + protected showsDisplayedColumns: string[] = ['showId', 'showHall', 'showMovieTitle', 'showDate', 'showEarnings', 'showTickets']; protected movieResultsLength: number = 0; protected showsResultLength: number = 0; + protected moviesDS = new MatTableDataSource(); + protected showsDS = new MatTableDataSource(); + + // Sorting + Pagination + @ViewChild('movieSort') movieSort!: MatSort; + @ViewChild('showSort') showSort!: MatSort; private loading = inject(LoadingService); ngOnInit(): void { this.loading.show() this.loadData().then(); + this.setupSortingAccessors() + } + + ngAfterViewInit() { + this.moviesDS.sort = this.movieSort; + this.showsDS.sort = this.showSort; } async loadData() { @@ -35,8 +50,10 @@ export class StatisticsComponent { let showRequest = this.http.getShowStatistics(); let movieResponse = await firstValueFrom(movieRequest); let showResponse = await firstValueFrom(showRequest); - this.movies = movieResponse - this.shows = showResponse + this.movies.set(movieResponse); + this.shows.set(showResponse); + this.moviesDS.data = movieResponse; + this.showsDS.data = showResponse; if (this.movies.length / 30 < 1) { this.movieResultsLength = 1; } else { @@ -54,26 +71,24 @@ export class StatisticsComponent { return new Date(date).toLocaleString("de"); } - filterByCategory(filter: string) { - switch (filter) { - case this.valuesToFilter[0]: //title - this.movies = this.movies.sort((a, b) => a.movieTitle.localeCompare(b.movieTitle)); - this.shows = this.shows.sort((a, b) => a.movieTitle.localeCompare(b.movieTitle)); - //console.log(this.movies, this.shows); - break; - case this.valuesToFilter[1]: //date - this.shows = this.shows.sort((a,b) => new Date(a.showStart).getTime() - new Date(b.showStart).getTime()); - break; - case this.valuesToFilter[2]: //earnings - this.movies = this.movies.sort((a, b) => a.earnings - b.earnings); - this.shows = this.shows.sort((a, b) => a.earnings - b.earnings); - break; - case this.valuesToFilter[3]: //tickets - this.movies = this.movies.sort((a, b) => a.tickets - b.tickets); - this.shows = this.shows.sort((a, b) => a.tickets - b.tickets); - break; - default: - } + private setupSortingAccessors() { + // Movies + this.moviesDS.sortingDataAccessor = (item, property) => { + switch (property) { + case 'earnings': return item.earnings; + case 'tickets': return item.tickets; + default: return (item as any)[property]; + } + }; + // Shows + this.showsDS.sortingDataAccessor = (item, property) => { + switch (property) { + case 'showStart': return new Date(item.showStart).getTime(); + case 'earnings': return item.earnings; + case 'tickets': return item.tickets; + default: return (item as any)[property]; + } + }; } }
IDID {{row.showId}} KinosaalKinosaal {{row.showHallName}} Film NameFilm Name {{row.movieTitle}} DatumDatum {{formatDate(row.showStart)}} + + Umsatz {{(row.earnings/100).toFixed(2)}} € + + Gebuchte Tickets {{row.tickets}}