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

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();
}
}
}