You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
183 lines
8.8 KiB
183 lines
8.8 KiB
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";
|
|
import {DefaultValues} from "../../utils/DefaultValues";
|
|
import {MatDialog} from "@angular/material/dialog";
|
|
import {AuthDialogRequest} from "../internal-components/dialogs/AuthDialogRequest";
|
|
|
|
@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]="pageSizeOptions"
|
|
[pageSize]="pageSize"
|
|
(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,
|
|
private dialog: MatDialog) {
|
|
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:DefaultValues.pageSize,
|
|
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.loading = false;
|
|
this.paginator?.previousPage();
|
|
switch (e.status) {
|
|
case 401: {
|
|
this.dialog.open(AuthDialogRequest);
|
|
break;
|
|
}
|
|
default: {
|
|
this.err = true;
|
|
break;
|
|
}
|
|
}
|
|
}, () => this.loading = false
|
|
)
|
|
}
|
|
|
|
override updateData() {
|
|
if (this.lazy) return;
|
|
super.updateData();
|
|
this.getStat();
|
|
}
|
|
|
|
lazyInit() {
|
|
if (this.lazy) {
|
|
this.lazy = false;
|
|
this.updateData();
|
|
}
|
|
}
|
|
}
|
|
|