diff --git a/src/app/core/auth/UserData.d.ts b/src/app/core/auth/UserData.d.ts index 08b8212..be1060e 100644 --- a/src/app/core/auth/UserData.d.ts +++ b/src/app/core/auth/UserData.d.ts @@ -1,6 +1,8 @@ interface UserData { username: string, - verified: boolean + verified: boolean, + id: number, + banned: boolean } export default UserData; diff --git a/src/app/core/auth/auth.service.ts b/src/app/core/auth/auth.service.ts index 65f8079..eba59af 100644 --- a/src/app/core/auth/auth.service.ts +++ b/src/app/core/auth/auth.service.ts @@ -22,7 +22,9 @@ export class AuthService implements CanActivate { const isLoggedIn = isAuthenticated && userData != null && accessToken != ''; this.$user.next(isLoggedIn ? { username: userData.preferred_username, - verified: userData.email_verified + verified: userData.email_verified, + id: userData.id, + banned: userData.banned } : undefined); }); } diff --git a/src/app/views/dashboard/dashboard.component.html b/src/app/views/dashboard/dashboard.component.html index 4d625a1..cf0c27f 100644 --- a/src/app/views/dashboard/dashboard.component.html +++ b/src/app/views/dashboard/dashboard.component.html @@ -6,11 +6,11 @@ - Banned - - Reset - Banned - Not Banned + Filter + + All + Banned + Not Banned - + Username {{ user.username }} + + Banned + + Actions + @if (user.banned == false) { + } @else { + + } diff --git a/src/app/views/dashboard/dashboard.component.scss b/src/app/views/dashboard/dashboard.component.scss index a6005e9..2a2310e 100644 --- a/src/app/views/dashboard/dashboard.component.scss +++ b/src/app/views/dashboard/dashboard.component.scss @@ -30,4 +30,8 @@ padding: 0.25rem 0; } } +} + +.unbanned { + color:green; } \ 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 5b90545..ab847d3 100644 --- a/src/app/views/dashboard/dashboard.component.ts +++ b/src/app/views/dashboard/dashboard.component.ts @@ -1,5 +1,5 @@ import {AsyncPipe} from '@angular/common'; -import {Component, OnInit} from '@angular/core'; +import {ChangeDetectorRef, 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'; @@ -28,10 +28,12 @@ import {AdministratablePlayer, AdminService, PlayerFilter} from '@core/server'; styleUrl: './dashboard.component.scss' }) export class DashboardComponent implements OnInit { - displayedColumns: Array = ['username', 'actions']; - usersDataSource: MatTableDataSource = new MatTableDataSource([]); + displayedColumns: Array = ['username', 'actions', 'banned']; + selectedFilter: string = 'all'; + originalUsersDataSource: MatTableDataSource = new MatTableDataSource([]); + filteredUsersDataSource: MatTableDataSource = new MatTableDataSource([]); - constructor(private adminService: AdminService, protected authService: AuthService) { + constructor(private adminService: AdminService, protected authService: AuthService, private cdr: ChangeDetectorRef) { } ngOnInit(): void { @@ -42,18 +44,19 @@ export class DashboardComponent implements OnInit { }); } - fetchPlayers(querry: string): void { + fetchPlayers(query: string): void { const filter: PlayerFilter = { page: 0, pageSize: 32, order: PlayerFilter.OrderEnum.Ascending, - username: querry, + username: query, sortBy: 'username' }; this.adminService.getAllPlayers(filter).subscribe( (players) => { - this.usersDataSource = new MatTableDataSource(players); + this.originalUsersDataSource.data = players; // Store original data + this.filteredUsersDataSource.data = [...players]; // Apply initial filter }, (error) => { console.error('Error fetching players:', error); @@ -62,8 +65,19 @@ export class DashboardComponent implements OnInit { } banPlayer(user: UserData): void { - console.log(`Banning user: ${user.username}`); - // TODO: implement banning logic + this.adminService.banPlayer(user.id).subscribe(() => { + user.banned = true; + this.originalUsersDataSource.data = [...this.originalUsersDataSource.data]; + this.applyFilter(this.selectedFilter); + }); + } + + unbanPlayer(user: UserData): void { + this.adminService.unbanPlayer(user.id).subscribe(() => { + user.banned = false; + this.originalUsersDataSource.data = [...this.originalUsersDataSource.data]; + this.applyFilter(this.selectedFilter); + }); } onSearch(searchbar: HTMLInputElement): void { @@ -75,4 +89,16 @@ export class DashboardComponent implements OnInit { this.fetchPlayers(''); } + applyFilter(filter: string): void { + this.selectedFilter = filter; // Store filter selection + let filteredUsers = this.originalUsersDataSource.data; + + if (filter === 'banned') { + filteredUsers = filteredUsers.filter(user => user.banned); + } else if (filter === 'notBanned') { + filteredUsers = filteredUsers.filter(user => !user.banned); + } + + this.filteredUsersDataSource.data = [...filteredUsers]; + } }