diff --git a/package.json b/package.json index c19abd4..f217a36 100644 --- a/package.json +++ b/package.json @@ -50,7 +50,7 @@ "stylelint-scss": "^6.11.0", "typescript": "~5.6.2" }, - "api_version": "v0.0.0-rc.2", + "api_version": "v0.0.0-rc.7", "volta": { "node": "22.13.1" } diff --git a/src/app/app.config.ts b/src/app/app.config.ts index dc2f322..8d71ef3 100644 --- a/src/app/app.config.ts +++ b/src/app/app.config.ts @@ -1,5 +1,6 @@ import { provideHttpClient } from '@angular/common/http'; import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core'; +import {MAT_FORM_FIELD_DEFAULT_OPTIONS} from '@angular/material/form-field'; import { provideAnimationsAsync } from '@angular/platform-browser/animations/async'; import { provideRouter } from '@angular/router'; import { BASE_PATH, Configuration} from '@core/server'; @@ -28,6 +29,7 @@ export const appConfig: ApplicationConfig = { } }), - { provide: BASE_PATH, useValue: 'http://localhost:8080/api/v1' } + { provide: BASE_PATH, useValue: 'http://localhost:8080/api/v1' }, + { provide: MAT_FORM_FIELD_DEFAULT_OPTIONS, useValue: { appearance: 'outline' } } ] }; \ No newline at end of file diff --git a/src/app/app.routes.ts b/src/app/app.routes.ts index df958e6..10343ca 100644 --- a/src/app/app.routes.ts +++ b/src/app/app.routes.ts @@ -1,4 +1,6 @@ import { Routes } from '@angular/router'; import { DashboardComponent } from '@app/views/dashboard/dashboard.component'; -export const routes: Routes = [{ path: '', component: DashboardComponent, title: 'Home' }]; +export const routes: Routes = [{ path: '', component: DashboardComponent, title: 'Player Overview'}]; + + diff --git a/src/app/views/dashboard/dashboard.component.html b/src/app/views/dashboard/dashboard.component.html index e0c966a..4d625a1 100644 --- a/src/app/views/dashboard/dashboard.component.html +++ b/src/app/views/dashboard/dashboard.component.html @@ -1,3 +1,43 @@
-

Lorem ipsum dolor sit amet consectetur, adipisicing elit. Facere illo animi quidem repellat perspiciatis, excepturi amet corrupti ipsa sit consequuntur placeat ratione saepe velit asperiores suscipit esse quod minima exercitationem minus, alias laudantium inventore! Beatae cum nobis error suscipit cupiditate, praesentium itaque ut ipsa iusto in doloribus unde quisquam consequuntur.

+ @if (authService.$user|async) { + + + + + Username + {{ user.username }} + + + Actions + + + + + + + + } @else { +

Du musst eingeloggt sein, um dies zu sehen

+ }
diff --git a/src/app/views/dashboard/dashboard.component.scss b/src/app/views/dashboard/dashboard.component.scss index e69de29..a6005e9 100644 --- a/src/app/views/dashboard/dashboard.component.scss +++ b/src/app/views/dashboard/dashboard.component.scss @@ -0,0 +1,33 @@ +.dashboard { + display: flex; + flex-direction: column; + gap: 1rem; + + &__search { + display: flex; + gap: 1rem; + + &__input-field { + flex-grow: 1; + } + } + + &__table { + tr, td { + display: flex; + height: auto; + } + + .mat-column-username { + flex-grow: 1; + } + + th.mat-column-actions { + display: none; + } + + td.mat-column-actions { + padding: 0.25rem 0; + } + } +} \ No newline at end of file diff --git a/src/app/views/dashboard/dashboard.component.ts b/src/app/views/dashboard/dashboard.component.ts index 4653ae7..5b90545 100644 --- a/src/app/views/dashboard/dashboard.component.ts +++ b/src/app/views/dashboard/dashboard.component.ts @@ -1,11 +1,78 @@ -import { Component } from '@angular/core'; +import {AsyncPipe} from '@angular/common'; +import {Component, OnInit} from '@angular/core'; +import {MatFabButton, MatMiniFabButton} from '@angular/material/button'; +import {MatFormFieldModule} from '@angular/material/form-field'; +import {MatIcon} from '@angular/material/icon'; +import {MatInputModule} from '@angular/material/input'; +import {MatSelectModule} from '@angular/material/select'; +import { + MatTableDataSource, MatTableModule +} from '@angular/material/table'; +import {AuthService} from '@core/auth/auth.service'; +import UserData from '@core/auth/UserData'; +import {AdministratablePlayer, AdminService, PlayerFilter} from '@core/server'; @Component({ selector: 'app-dashboard', - imports: [], + imports: [ + AsyncPipe, + MatIcon, + MatInputModule, + MatTableModule, + MatFormFieldModule, + MatMiniFabButton, + MatFabButton, + MatSelectModule + ], templateUrl: './dashboard.component.html', styleUrl: './dashboard.component.scss' }) -export class DashboardComponent { - +export class DashboardComponent implements OnInit { + displayedColumns: Array = ['username', 'actions']; + usersDataSource: MatTableDataSource = new MatTableDataSource([]); + + constructor(private adminService: AdminService, protected authService: AuthService) { + } + + ngOnInit(): void { + this.authService.$user.subscribe((user) => { + if (user != undefined) { + return this.fetchPlayers(''); + } + }); + } + + fetchPlayers(querry: string): void { + const filter: PlayerFilter = { + page: 0, + pageSize: 32, + order: PlayerFilter.OrderEnum.Ascending, + username: querry, + sortBy: 'username' + }; + + this.adminService.getAllPlayers(filter).subscribe( + (players) => { + this.usersDataSource = new MatTableDataSource(players); + }, + (error) => { + console.error('Error fetching players:', error); + } + ); + } + + banPlayer(user: UserData): void { + console.log(`Banning user: ${user.username}`); + // TODO: implement banning logic + } + + onSearch(searchbar: HTMLInputElement): void { + this.fetchPlayers(searchbar.value); + } + + resetFilter(searchbar: HTMLInputElement): void { + searchbar.value = ''; + this.fetchPlayers(''); + } + }