24 changed files with 594 additions and 67 deletions
@ -0,0 +1,14 @@ |
|||||
|
export class KillFeed { |
||||
|
id!:number; |
||||
|
attacker_id!:number; |
||||
|
attacker_name!:string; |
||||
|
victim_id!:number; |
||||
|
victim_name!:string; |
||||
|
assister_id!:number; |
||||
|
assister_name!:number; |
||||
|
utime!:number; |
||||
|
weapon_name!:string; |
||||
|
weapon_classname!:string; |
||||
|
server_id!: string; |
||||
|
serverName!: string; |
||||
|
} |
@ -0,0 +1,26 @@ |
|||||
|
import {SteamIDs} from "./profile/SteamIDs"; |
||||
|
|
||||
|
export class Report { |
||||
|
id!:number; |
||||
|
a_nickname!:string; |
||||
|
a_permition!:string; |
||||
|
a_kills!:number; |
||||
|
a_deads!:number; |
||||
|
a_seconds!:number; |
||||
|
//
|
||||
|
r_nickname!:string; |
||||
|
r_permition!:string; |
||||
|
r_kills!:number; |
||||
|
r_deads!:number; |
||||
|
r_seconds!:number; |
||||
|
//
|
||||
|
reasons!: string; |
||||
|
utime!:number; |
||||
|
srv!:string; |
||||
|
online!:number; |
||||
|
type!:string; |
||||
|
actions:string[] = [] |
||||
|
a_steam!:SteamIDs; |
||||
|
r_steam!:SteamIDs; |
||||
|
serverName!:string; |
||||
|
} |
@ -0,0 +1,30 @@ |
|||||
|
import {SearchFilter} from "./SearchFilter"; |
||||
|
import {MatPaginator} from "@angular/material/paginator"; |
||||
|
import {ParamMap} from "@angular/router"; |
||||
|
|
||||
|
export class KillFeedSearchFilter extends SearchFilter { |
||||
|
mode:string = 'kills'; |
||||
|
|
||||
|
override createQuery(paginator:MatPaginator|undefined): { [p: string]: any } { |
||||
|
let q:{[param: string]: any} = super.createQuery(paginator); |
||||
|
q["mode"] = this.mode; |
||||
|
return q; |
||||
|
} |
||||
|
|
||||
|
|
||||
|
override fromQuery(param: ParamMap,paginator:MatPaginator|undefined) { |
||||
|
try {if (param.get("mode")) { // @ts-ignore
|
||||
|
this.mode = param.get("mode");}}catch (e) {} |
||||
|
super.fromQuery(param, paginator); |
||||
|
} |
||||
|
|
||||
|
addModeToSearch(mode:string) { |
||||
|
this.mode = mode; |
||||
|
this.updated = true; |
||||
|
} |
||||
|
|
||||
|
removeModeFromSearch() { |
||||
|
this.mode = 'kills'; |
||||
|
this.updated = true; |
||||
|
} |
||||
|
} |
@ -0,0 +1,29 @@ |
|||||
|
import {Component, Input} from "@angular/core"; |
||||
|
import {KillFeedSearchFilter} from "../../../entities/search/KillFeedSearchFilter"; |
||||
|
|
||||
|
@Component({ |
||||
|
selector: "app-filter-mat-chip-killfeed", |
||||
|
template: ` |
||||
|
<mat-chip |
||||
|
*ngIf="filter && filter.mode!=null" |
||||
|
[matMenuTriggerFor]="killfeedSelect">Искать: {{getFancy(filter.mode)}} |
||||
|
<mat-menu #killfeedSelect> |
||||
|
<button mat-menu-item *ngFor="let t of types" (click)="filter.addModeToSearch(t)">{{getFancy(t)}}</button> |
||||
|
</mat-menu> |
||||
|
</mat-chip> |
||||
|
` |
||||
|
}) |
||||
|
export class FilterMatChipKillFeed { |
||||
|
@Input("filter") |
||||
|
filter: KillFeedSearchFilter|undefined; |
||||
|
types:string[] = ['kills','deads','assists']; |
||||
|
|
||||
|
getFancy(text:string):string { |
||||
|
switch (text) { |
||||
|
case "kills": return 'по убийствам'; |
||||
|
case "assists": return 'по помощи'; |
||||
|
case "deads": return 'по смертям'; |
||||
|
default: return ''; |
||||
|
} |
||||
|
} |
||||
|
} |
@ -0,0 +1,166 @@ |
|||||
|
import {AbstractSearchTable} from "../internal-components/abstract-search-table.component"; |
||||
|
import {SearchFilter} from "../../entities/search/SearchFilter"; |
||||
|
import {AuthService} from "../../services/auth.service"; |
||||
|
import {ServerService} from "../../services/server.service"; |
||||
|
import {PlayerService} from "../../services/player.service"; |
||||
|
import {ActivatedRoute, Router} from "@angular/router"; |
||||
|
import {VipService} from "../../services/vip.service"; |
||||
|
import {HttpClient} from "@angular/common/http"; |
||||
|
import {map} from "rxjs"; |
||||
|
import {PagingAndSortingPaginator} from "../../entities/PagingAndSortingPaginator"; |
||||
|
import {KillFeedSearchFilter} from "../../entities/search/KillFeedSearchFilter"; |
||||
|
import {KillFeed} from "../../entities/KillFeed"; |
||||
|
import {MatTableDataSource} from "@angular/material/table"; |
||||
|
import {Component} from "@angular/core"; |
||||
|
|
||||
|
@Component({ |
||||
|
selector: 'app-killfeed-search-table', |
||||
|
template: ` |
||||
|
<div style="padding-bottom: 10px;"> |
||||
|
<mat-chip-list> |
||||
|
<mat-chip [matMenuTriggerFor]="addFilter">Искать по...</mat-chip> |
||||
|
<mat-menu #addFilter> |
||||
|
<button mat-menu-item (click)="filter.addAccountToSearch('')" [disabled]="account_id!=null">Профилю</button> |
||||
|
<button mat-menu-item [matMenuTriggerFor]="timeSelect">Времени</button> |
||||
|
</mat-menu> |
||||
|
<mat-menu #timeSelect> |
||||
|
<button mat-menu-item (click)="filter.addEndTimeToSearch()">До ...</button> |
||||
|
<button mat-menu-item (click)="filter.addBeginTimeToSearch()">После ...</button> |
||||
|
</mat-menu> |
||||
|
|
||||
|
<mat-chip *ngIf="filter.updated" (click)="updateData()">Обновить</mat-chip> |
||||
|
<app-filter-mat-chip-killfeed |
||||
|
[filter]="filter"> |
||||
|
</app-filter-mat-chip-killfeed> |
||||
|
<app-filter-mat-chip-account |
||||
|
[filter]="filter" |
||||
|
[hidden]="account_id!=null" |
||||
|
></app-filter-mat-chip-account> |
||||
|
<app-filter-mat-chip-date-begin |
||||
|
[filter]="filter"> |
||||
|
</app-filter-mat-chip-date-begin> |
||||
|
<app-filter-mat-chip-date-end |
||||
|
[filter]="filter"> |
||||
|
</app-filter-mat-chip-date-end> |
||||
|
</mat-chip-list> |
||||
|
</div> |
||||
|
<div> |
||||
|
<div class="loading-shade" |
||||
|
*ngIf="loading || err"> |
||||
|
<mat-spinner *ngIf="loading"></mat-spinner> |
||||
|
<div class="err" *ngIf="err"> |
||||
|
Слишком много запросов или сервер не отвечает, обнови страницу. |
||||
|
<br> |
||||
|
<button mat-button (click)="err=false; loading=false">Закрыть</button> |
||||
|
</div> |
||||
|
</div> |
||||
|
<table mat-table [dataSource]="dataSource" style="width: 100%"> |
||||
|
<ng-container matColumnDef="attacker_name"> |
||||
|
<th mat-header-cell *matHeaderCellDef> Убийца </th> |
||||
|
<td mat-cell *matCellDef="let row" [matMenuTriggerFor]="row.attacker_name?aMenu:null"> {{row.attacker_name}} |
||||
|
<mat-menu #aMenu> |
||||
|
<button mat-menu-item (click)="filter.addAccountToSearch(row.attacker_name)" [disabled]="!row.attacker_name || account_id != null">Добавить в поиск</button> |
||||
|
<button mat-menu-item (click)="filter.addAccountToSearch('[U:1:'+row.attacker_id+']')" [disabled]="account_id != null">Добавить в поиск используя ID</button> |
||||
|
<button mat-menu-item (click)="authService.searchPlayer(row.attacker_id)">Открыть профиль</button> |
||||
|
</mat-menu></td> |
||||
|
</ng-container> |
||||
|
<ng-container matColumnDef="assister_name"> |
||||
|
<th mat-header-cell *matHeaderCellDef> Помог </th> |
||||
|
<td mat-cell *matCellDef="let row" [matMenuTriggerFor]="row.assister_name?asMenu:null"> {{row.assister_name}} |
||||
|
<mat-menu #asMenu> |
||||
|
<button mat-menu-item (click)="filter.addAccountToSearch(row.assister_name)" [disabled]="!row.assister_name || account_id != null">Добавить в поиск</button> |
||||
|
<button mat-menu-item (click)="filter.addAccountToSearch('[U:1:'+row.assister_id+']')" [disabled]="account_id != null">Добавить в поиск используя ID</button> |
||||
|
<button mat-menu-item (click)="authService.searchPlayer(row.assister_id)">Открыть профиль</button> |
||||
|
</mat-menu></td> |
||||
|
</ng-container> |
||||
|
<ng-container matColumnDef="victim_name"> |
||||
|
<th mat-header-cell *matHeaderCellDef> Умер </th> |
||||
|
<td mat-cell *matCellDef="let row" [matMenuTriggerFor]="row.victim_name?vMenu:null"> {{row.victim_name}} |
||||
|
<mat-menu #vMenu> |
||||
|
<button mat-menu-item (click)="filter.addAccountToSearch(row.victim_name)" [disabled]="!row.victim_name || account_id != null">Добавить в поиск</button> |
||||
|
<button mat-menu-item (click)="filter.addAccountToSearch('[U:1:'+row.victim_id+']')" [disabled]="account_id != null">Добавить в поиск используя ID</button> |
||||
|
<button mat-menu-item (click)="authService.searchPlayer(row.victim_id)">Открыть профиль</button> |
||||
|
</mat-menu></td> |
||||
|
</ng-container> |
||||
|
<ng-container matColumnDef="date"> |
||||
|
<th mat-header-cell *matHeaderCellDef> Время </th> |
||||
|
<td mat-cell *matCellDef="let row" [matMenuTriggerFor]="dateMenu"> {{row.utime * 1000 | date:"HH:mm dd/MM/yyyy"}} |
||||
|
<mat-menu #dateMenu> |
||||
|
<button mat-menu-item (click)="filter.addEndTimeToSearch(row.timestamp * 1000)">Искать до {{row.timestamp * 1000 | date:"HH:mm:ss dd/MM/yyyy"}}</button> |
||||
|
<button mat-menu-item (click)="filter.addBeginTimeToSearch(row.timestamp * 1000)">Искать после {{row.timestamp * 1000 | date:"HH:mm:ss dd/MM/yyyy"}}</button> |
||||
|
</mat-menu></td> |
||||
|
</ng-container> |
||||
|
<ng-container matColumnDef="weapon"> |
||||
|
<th mat-header-cell *matHeaderCellDef>Оружие</th> |
||||
|
<td mat-cell *matCellDef="let row"> {{row.weapon_name}}</td> |
||||
|
</ng-container> |
||||
|
<ng-container matColumnDef="server"> |
||||
|
<th mat-header-cell *matHeaderCellDef> Сервер </th> |
||||
|
<td mat-cell *matCellDef="let row" [matMenuTriggerFor]="serverMenu"> {{row.serverName}} |
||||
|
<mat-menu #serverMenu> |
||||
|
<button mat-menu-item (click)="filter.addServerToSearch(row.server_id)">Добавить в поиск</button> |
||||
|
</mat-menu> |
||||
|
</td> |
||||
|
</ng-container> |
||||
|
|
||||
|
<tr mat-header-row *matHeaderRowDef="displayedColumns"></tr> |
||||
|
<tr mat-row *matRowDef="let row; columns: displayedColumns;"></tr> |
||||
|
|
||||
|
<!-- Row shown when there is no matching data. --> |
||||
|
<div *ngIf="!loading"> |
||||
|
<tr class="mat-row" *matNoDataRow> |
||||
|
<td class="mat-cell" colspan="4">А вот и такое бывает...</td> |
||||
|
</tr> |
||||
|
</div> |
||||
|
</table> |
||||
|
|
||||
|
<mat-paginator |
||||
|
[pageSizeOptions]="[5, 10, 25, 100]" |
||||
|
[pageSize]="10" |
||||
|
(page)="updateData()" |
||||
|
></mat-paginator> |
||||
|
</div> |
||||
|
` |
||||
|
}) |
||||
|
export class KillFeedSearchTable extends AbstractSearchTable<KillFeedSearchTable, KillFeedSearchFilter> { |
||||
|
displayedColumns: string[] = ['attacker_name', 'assister_name', 'victim_name', 'date', 'weapon', 'server']; |
||||
|
|
||||
|
constructor(authService: AuthService, |
||||
|
serverService: ServerService, |
||||
|
playerService: PlayerService, |
||||
|
router: Router, |
||||
|
route: ActivatedRoute, |
||||
|
private http: HttpClient) { |
||||
|
super(authService, serverService, playerService, route, router); |
||||
|
super.filter = new KillFeedSearchFilter(); |
||||
|
} |
||||
|
|
||||
|
private getStat() { |
||||
|
this.filter.updated = false; |
||||
|
this.loading = true; |
||||
|
this.http.post(`api/profile/killfeed`, this.filter, |
||||
|
{params: |
||||
|
{size: this.paginator?this.paginator.pageSize:20, |
||||
|
page: this.paginator?this.paginator.pageIndex:0, |
||||
|
mode: this.filter.mode } |
||||
|
}).pipe((map((res) => PagingAndSortingPaginator<KillFeed>.newObj().fromData(res).updatePaginator(this.paginator)))) |
||||
|
.subscribe((res) => { |
||||
|
this.dataSource = new MatTableDataSource<KillFeedSearchTable>(res.data); |
||||
|
this.err = false; |
||||
|
}, (e) => this.err = true, () => this.loading = false |
||||
|
) |
||||
|
} |
||||
|
|
||||
|
override updateData() { |
||||
|
if (this.lazy) return; |
||||
|
super.updateData(); |
||||
|
this.getStat(); |
||||
|
} |
||||
|
|
||||
|
lazyInit() { |
||||
|
if (this.lazy) { |
||||
|
this.lazy = false; |
||||
|
this.updateData(); |
||||
|
} |
||||
|
} |
||||
|
} |
@ -0,0 +1,28 @@ |
|||||
|
import { Component, OnInit } from '@angular/core'; |
||||
|
import {AuthService} from "../../services/auth.service"; |
||||
|
|
||||
|
@Component({ |
||||
|
selector: 'app-killfeed-page', |
||||
|
styleUrls: ['./killfeed-page.component.scss'], |
||||
|
template: ` |
||||
|
<div class="content-in-center-header" style="flex-direction: column;"> |
||||
|
<h1>История убийств</h1> |
||||
|
<h3>Всегда приятно узнать сколько тебя раз попустил мгебраток</h3> |
||||
|
</div> |
||||
|
|
||||
|
<div class="content-in-center"> |
||||
|
<div class="content-in-border"> |
||||
|
<app-need-auth-to-continue *ngIf="!authService.isAuth()"></app-need-auth-to-continue> |
||||
|
<app-killfeed-search-table *ngIf="authService.isAuth()"></app-killfeed-search-table> |
||||
|
</div> |
||||
|
</div> |
||||
|
` |
||||
|
}) |
||||
|
export class KillfeedPageComponent implements OnInit { |
||||
|
|
||||
|
constructor(public authService: AuthService) { } |
||||
|
|
||||
|
ngOnInit(): void { |
||||
|
} |
||||
|
|
||||
|
} |
@ -0,0 +1,168 @@ |
|||||
|
import {AbstractSearchTable} from "../internal-components/abstract-search-table.component"; |
||||
|
import {AuthService} from "../../services/auth.service"; |
||||
|
import {ServerService} from "../../services/server.service"; |
||||
|
import {PlayerService} from "../../services/player.service"; |
||||
|
import {ActivatedRoute, Router} from "@angular/router"; |
||||
|
import {HttpClient} from "@angular/common/http"; |
||||
|
import {KillFeedSearchFilter} from "../../entities/search/KillFeedSearchFilter"; |
||||
|
import {SearchFilter} from "../../entities/search/SearchFilter"; |
||||
|
import {map} from "rxjs"; |
||||
|
import {PagingAndSortingPaginator} from "../../entities/PagingAndSortingPaginator"; |
||||
|
import {MatTableDataSource} from "@angular/material/table"; |
||||
|
import {Component} from "@angular/core"; |
||||
|
import {Report} from "../../entities/Report"; |
||||
|
|
||||
|
@Component({ |
||||
|
selector: 'app-report-search-table', |
||||
|
template: ` |
||||
|
<div style="padding-bottom: 10px;"> |
||||
|
<mat-chip-list> |
||||
|
<mat-chip [matMenuTriggerFor]="addFilter">Искать по...</mat-chip> |
||||
|
<mat-menu #addFilter> |
||||
|
<button mat-menu-item [matMenuTriggerFor]="timeSelect">Времени</button> |
||||
|
</mat-menu> |
||||
|
<mat-menu #timeSelect> |
||||
|
<button mat-menu-item (click)="filter.addEndTimeToSearch()">До ...</button> |
||||
|
<button mat-menu-item (click)="filter.addBeginTimeToSearch()">После ...</button> |
||||
|
</mat-menu> |
||||
|
|
||||
|
<mat-chip *ngIf="filter.updated" (click)="updateData()">Обновить</mat-chip> |
||||
|
<app-filter-mat-chip-killfeed |
||||
|
[filter]="filter"> |
||||
|
</app-filter-mat-chip-killfeed> |
||||
|
<app-filter-mat-chip-date-begin |
||||
|
[filter]="filter"> |
||||
|
</app-filter-mat-chip-date-begin> |
||||
|
<app-filter-mat-chip-date-end |
||||
|
[filter]="filter"> |
||||
|
</app-filter-mat-chip-date-end> |
||||
|
</mat-chip-list> |
||||
|
</div> |
||||
|
<div> |
||||
|
<div class="loading-shade" |
||||
|
*ngIf="loading || err"> |
||||
|
<mat-spinner *ngIf="loading"></mat-spinner> |
||||
|
<div class="err" *ngIf="err"> |
||||
|
Слишком много запросов или сервер не отвечает, обнови страницу. |
||||
|
<br> |
||||
|
<button mat-button (click)="err=false; loading=false">Закрыть</button> |
||||
|
</div> |
||||
|
</div> |
||||
|
<table mat-table [dataSource]="dataSource" style="width: 100%"> |
||||
|
<ng-container matColumnDef="author"> |
||||
|
<th mat-header-cell *matHeaderCellDef> Кто пожаловался </th> |
||||
|
<td mat-cell *matCellDef="let row" [matMenuTriggerFor]="row.a_nickname?aMenu:null"> {{row.a_nickname}} |
||||
|
<mat-menu #aMenu> |
||||
|
<button mat-menu-item (click)="filter.addAccountToSearch(row.a_nickname)">Добавить в поиск</button> |
||||
|
<button mat-menu-item (click)="filter.addAccountToSearch('[U:1:'+row.a_steam.account_id+']')">Добавить в поиск используя ID</button> |
||||
|
<button mat-menu-item (click)="authService.searchPlayer(row.a_steam.account_id)">Открыть профиль</button> |
||||
|
</mat-menu></td> |
||||
|
</ng-container> |
||||
|
<ng-container matColumnDef="author_kd"> |
||||
|
<th mat-header-cell *matHeaderCellDef>К/Д</th> |
||||
|
<td mat-cell *matCellDef="let row"> {{row.a_kills}}/{{row.a_deads}}</td> |
||||
|
</ng-container> |
||||
|
<ng-container matColumnDef="reported"> |
||||
|
<th mat-header-cell *matHeaderCellDef> На кого </th> |
||||
|
<td mat-cell *matCellDef="let row" [matMenuTriggerFor]="row.r_nickname?rMenu:null"> {{row.r_nickname}} |
||||
|
<mat-menu #rMenu> |
||||
|
<button mat-menu-item (click)="filter.addAccountToSearch(row.r_nickname)">Добавить в поиск</button> |
||||
|
<button mat-menu-item (click)="filter.addAccountToSearch('[U:1:'+row.r_steam.account_id+']')">Добавить в поиск используя ID</button> |
||||
|
<button mat-menu-item (click)="authService.searchPlayer(row.r_steam.account_id)">Открыть профиль</button> |
||||
|
</mat-menu></td> |
||||
|
</ng-container> |
||||
|
<ng-container matColumnDef="reported_kd"> |
||||
|
<th mat-header-cell *matHeaderCellDef>К/Д</th> |
||||
|
<td mat-cell *matCellDef="let row"> {{row.r_kills}}/{{row.r_deads}}</td> |
||||
|
</ng-container> |
||||
|
<ng-container matColumnDef="date"> |
||||
|
<th mat-header-cell *matHeaderCellDef> Время </th> |
||||
|
<td mat-cell *matCellDef="let row" [matMenuTriggerFor]="dateMenu"> {{row.utime * 1000 | date:"HH:mm dd/MM/yyyy"}} |
||||
|
<mat-menu #dateMenu> |
||||
|
<button mat-menu-item (click)="filter.addEndTimeToSearch(row.utime * 1000)">Искать до {{row.utime * 1000 | date:"HH:mm:ss dd/MM/yyyy"}}</button> |
||||
|
<button mat-menu-item (click)="filter.addBeginTimeToSearch(row.utime * 1000)">Искать после {{row.utime * 1000 | date:"HH:mm:ss dd/MM/yyyy"}}</button> |
||||
|
</mat-menu></td> |
||||
|
</ng-container> |
||||
|
<ng-container matColumnDef="reasons"> |
||||
|
<th mat-header-cell *matHeaderCellDef>Причина</th> |
||||
|
<td mat-cell *matCellDef="let row"> {{row.reasons}}</td> |
||||
|
</ng-container> |
||||
|
<ng-container matColumnDef="actions"> |
||||
|
<th mat-header-cell *matHeaderCellDef>Решение</th> |
||||
|
<td mat-cell *matCellDef="let row"> {{row.actions.length==0?'не было':row.actions}}</td> |
||||
|
</ng-container> |
||||
|
<ng-container matColumnDef="server"> |
||||
|
<th mat-header-cell *matHeaderCellDef> Сервер </th> |
||||
|
<td mat-cell *matCellDef="let row" [matMenuTriggerFor]="serverMenu"> {{row.serverName}} |
||||
|
<mat-menu #serverMenu> |
||||
|
<button mat-menu-item (click)="filter.addServerToSearch(row.srv)">Добавить в поиск</button> |
||||
|
</mat-menu> |
||||
|
</td> |
||||
|
</ng-container> |
||||
|
<ng-container matColumnDef="online"> |
||||
|
<th mat-header-cell *matHeaderCellDef>Игроков</th> |
||||
|
<td mat-cell *matCellDef="let row"> {{row.online}}</td> |
||||
|
</ng-container> |
||||
|
|
||||
|
<tr mat-header-row *matHeaderRowDef="displayedColumns"></tr> |
||||
|
<tr mat-row *matRowDef="let row; columns: displayedColumns;"></tr> |
||||
|
|
||||
|
<!-- Row shown when there is no matching data. --> |
||||
|
<div *ngIf="!loading"> |
||||
|
<tr class="mat-row" *matNoDataRow> |
||||
|
<td class="mat-cell" colspan="4">А вот и такое бывает...</td> |
||||
|
</tr> |
||||
|
</div> |
||||
|
</table> |
||||
|
|
||||
|
<mat-paginator |
||||
|
[pageSizeOptions]="[5, 10, 25, 100]" |
||||
|
[pageSize]="10" |
||||
|
(page)="updateData()" |
||||
|
></mat-paginator> |
||||
|
</div> |
||||
|
` |
||||
|
}) |
||||
|
export class ReportSearchTable extends AbstractSearchTable<ReportSearchTable, any>{ |
||||
|
displayedColumns: string[] = [ |
||||
|
'author', 'author_kd', |
||||
|
'reported', 'reported_kd', |
||||
|
'reasons', 'date','actions','server', 'online']; |
||||
|
|
||||
|
constructor(authService: AuthService, |
||||
|
serverService: ServerService, |
||||
|
playerService: PlayerService, |
||||
|
router: Router, |
||||
|
route: ActivatedRoute, |
||||
|
private http: HttpClient) { |
||||
|
super(authService, serverService, playerService, route, router); |
||||
|
super.filter = new SearchFilter();//todo replace
|
||||
|
} |
||||
|
|
||||
|
private getStat() { |
||||
|
this.filter.updated = false; |
||||
|
this.loading = true; |
||||
|
this.http.post(`api/web/reports`, this.filter, {params: |
||||
|
{size: this.paginator?this.paginator.pageSize:20, |
||||
|
page: this.paginator?this.paginator.pageIndex:0} |
||||
|
}).pipe(map((res) => PagingAndSortingPaginator<Report>.newObj().fromData(res).updatePaginator(this.paginator))) |
||||
|
.subscribe((res) => { |
||||
|
this.dataSource = new MatTableDataSource<ReportSearchTable>(res.data); |
||||
|
this.err = false; |
||||
|
}, (e) => this.err = true, () => this.loading = false |
||||
|
); |
||||
|
} |
||||
|
|
||||
|
override updateData() { |
||||
|
if (this.lazy) return; |
||||
|
super.updateData(); |
||||
|
this.getStat(); |
||||
|
} |
||||
|
|
||||
|
lazyInit() { |
||||
|
if (this.lazy) { |
||||
|
this.lazy = false; |
||||
|
this.updateData(); |
||||
|
} |
||||
|
} |
||||
|
} |
@ -0,0 +1,28 @@ |
|||||
|
import { Component, OnInit } from '@angular/core'; |
||||
|
import {AuthService} from "../../services/auth.service"; |
||||
|
|
||||
|
@Component({ |
||||
|
selector: 'app-reports-page', |
||||
|
styleUrls: ['./reports-page.component.scss'], |
||||
|
template: ` |
||||
|
<div class="content-in-center-header" style="flex-direction: column;"> |
||||
|
<h1>Жалобы на игроков</h1> |
||||
|
<h3>Ты можешь отправить жалобу из игры через команду !report</h3> |
||||
|
</div> |
||||
|
|
||||
|
<div class="content-in-center"> |
||||
|
<div class="content-in-border"> |
||||
|
<app-need-auth-to-continue *ngIf="!authService.isAuth()"></app-need-auth-to-continue> |
||||
|
<app-report-search-table *ngIf="authService.isAuth()"></app-report-search-table> |
||||
|
</div> |
||||
|
</div> |
||||
|
` |
||||
|
}) |
||||
|
export class ReportsPageComponent implements OnInit { |
||||
|
|
||||
|
constructor(public authService: AuthService) { } |
||||
|
|
||||
|
ngOnInit(): void { |
||||
|
} |
||||
|
|
||||
|
} |
Loading…
Reference in new issue