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}}
- }
-
-
-
-
-
+
-
- | ID |
+
+ ID |
{{row.movieId}} |
-
- Titel |
+
+ Titel |
{{row.movieTitle}} |
-
-
+
+ |
Umsatz
|
{{(row.earnings/100).toFixed(2)}} € |
-
-
+
+ |
Gebuchte Tickets
|
{{row.tickets}} |
@@ -52,38 +41,38 @@
Show-Statistiken
-
+
-
- | ID |
+
+ ID |
{{row.showId}} |
-
- Kinosaal |
+
+ Kinosaal |
{{row.showHallName}} |
-
- Film Name |
+
+ Film Name |
{{row.movieTitle}} |
-
- Datum |
+
+ Datum |
{{formatDate(row.showStart)}} |
-
-
+
+ |
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];
+ }
+ };
}
}
| | | |