11 changed files with 360 additions and 350 deletions
@ -0,0 +1,168 @@ |
|||||
|
import {Component} from "@angular/core"; |
||||
|
import {AbstractSearchTable} from "../internal-components/abstract-search-table.component"; |
||||
|
import {Ban} from "../../entities/ban/Ban"; |
||||
|
import {BanSearchFilter} from "../../entities/search/BanSearchFilter"; |
||||
|
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 {BanService} from "../../services/ban.service"; |
||||
|
import {MatDialog} from "@angular/material/dialog"; |
||||
|
import {MatTableDataSource} from "@angular/material/table"; |
||||
|
import {BanViewDialog} from "../internal-components/dialogs/BanViewDialog"; |
||||
|
|
||||
|
@Component({ |
||||
|
selector: "app-banlist-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-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> |
||||
|
<app-filter-mat-chip-banid |
||||
|
[filter]="filter"> |
||||
|
</app-filter-mat-chip-banid> |
||||
|
</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="id"> |
||||
|
<th mat-header-cell *matHeaderCellDef> ID бана </th> |
||||
|
<td mat-cell *matCellDef="let row" [matMenuTriggerFor]="banIdMenu"> {{row.id}} |
||||
|
<mat-menu #banIdMenu><button mat-menu-item (click)="filter.addBanIdToSearch(row.id)">Искать по ид</button></mat-menu></td> |
||||
|
</ng-container> |
||||
|
<ng-container matColumnDef="player_name"> |
||||
|
<th mat-header-cell *matHeaderCellDef> Имя игрока </th> |
||||
|
<td mat-cell *matCellDef="let row" [matMenuTriggerFor]="accountMenu"> {{row.player_name}} |
||||
|
<mat-menu #accountMenu> |
||||
|
<button mat-menu-item (click)="filter.addAccountToSearch(row.player_name)">Добавить в поиск</button> |
||||
|
<button mat-menu-item (click)="authService.searchPlayer(row.account_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.timestamp | date:"HH:mm dd/MM/yyyy"}} |
||||
|
<mat-menu #dateMenu> |
||||
|
<button mat-menu-item (click)="filter.addEndTimeToSearch(row.timestamp)">Искать до {{row.timestamp | date:"HH:mm:ss dd/MM/yyyy"}}</button> |
||||
|
<button mat-menu-item (click)="filter.addBeginTimeToSearch(row.timestamp)">Искать после {{row.timestamp | date:"HH:mm:ss dd/MM/yyyy"}}</button> |
||||
|
</mat-menu></td> |
||||
|
</ng-container> |
||||
|
<ng-container matColumnDef="reason"> |
||||
|
<th mat-header-cell *matHeaderCellDef> Причина </th> |
||||
|
<td mat-cell *matCellDef="let row"> {{row.ban_reason}}</td> |
||||
|
</ng-container> |
||||
|
<ng-container matColumnDef="admin_name"> |
||||
|
<th mat-header-cell *matHeaderCellDef> Модератор </th> |
||||
|
<td mat-cell *matCellDef="let row"> {{row.banned_by}}</td> |
||||
|
</ng-container> |
||||
|
<ng-container matColumnDef="action"> |
||||
|
<th mat-header-cell *matHeaderCellDef> Действие </th> |
||||
|
<td mat-cell *matCellDef="let row"> |
||||
|
<mat-icon [matMenuTriggerFor]="actionMenu" style="cursor: pointer">view_headline</mat-icon> |
||||
|
<mat-menu #actionMenu> |
||||
|
<button mat-menu-item (click)="openBanDialog(row)">Подробнее</button> |
||||
|
<button mat-menu-item *ngIf="row.active==true&&authService.isModerator()">Разбанить</button> |
||||
|
</mat-menu> |
||||
|
</td> |
||||
|
</ng-container> |
||||
|
|
||||
|
|
||||
|
<tr mat-header-row *matHeaderRowDef="displayedColumns"></tr> |
||||
|
<tr mat-row *matRowDef="let row; columns: displayedColumns;" [style]="{'background-color':row.active?'rgba(255,0,0,0.25)':''}"></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 BanlistSearchTable extends AbstractSearchTable<Ban, BanSearchFilter> { |
||||
|
displayedColumns: string[] = ['id', 'player_name', 'date', 'reason', 'admin_name', 'action']; |
||||
|
constructor(public override authService: AuthService, |
||||
|
protected override serverService: ServerService, |
||||
|
protected override playerService: PlayerService, |
||||
|
protected override router: Router, |
||||
|
protected override route: ActivatedRoute, |
||||
|
private banService: BanService, |
||||
|
private dialog: MatDialog) { |
||||
|
super(authService, serverService, playerService, route, router); |
||||
|
super.filter = new BanSearchFilter(); |
||||
|
} |
||||
|
|
||||
|
private getBanList(): boolean { |
||||
|
this.filter.updated = false; |
||||
|
this.loading = true; |
||||
|
this.banService.getBanList(this.filter, this.paginator).subscribe( |
||||
|
(res) => { |
||||
|
this.dataSource = new MatTableDataSource<Ban>(res.data); |
||||
|
this.err = false; |
||||
|
}, (e) => this.err = true, () => this.loading = false |
||||
|
) |
||||
|
return true; |
||||
|
} |
||||
|
|
||||
|
override updateData() { |
||||
|
super.updateData(); |
||||
|
this.getBanList(); |
||||
|
} |
||||
|
|
||||
|
openBanDialog(ban: Ban) { |
||||
|
this.dialog.open( |
||||
|
BanViewDialog, { |
||||
|
data: ban |
||||
|
} |
||||
|
); |
||||
|
} |
||||
|
|
||||
|
addAdminIdToSearch(name: string) { |
||||
|
if (this.filter.admin_ids == null) |
||||
|
this.filter.admin_ids = []; |
||||
|
if (this.filter.admin_ids.indexOf(name) == -1) |
||||
|
this.filter.admin_ids.push(name); |
||||
|
this.filter.updated = true; |
||||
|
} |
||||
|
|
||||
|
removeAdminIdFromSearch(name: string) { |
||||
|
if (this.filter.admin_ids == null) return; |
||||
|
this.filter.admin_ids = this.filter.admin_ids.filter(v => v !== name); |
||||
|
this.filter.updated = true; |
||||
|
} |
||||
|
|
||||
|
} |
@ -0,0 +1,146 @@ |
|||||
|
import {Component} from "@angular/core"; |
||||
|
import {AbstractSearchTable} from "../internal-components/abstract-search-table.component"; |
||||
|
import {Message} from "../../entities/profile/Message"; |
||||
|
import {MessageSearchFilter} from "../../entities/search/MessageSearchFilter"; |
||||
|
import {AuthService} from "../../services/auth.service"; |
||||
|
import {MessageService} from "../../services/message.service"; |
||||
|
import {ServerService} from "../../services/server.service"; |
||||
|
import {PlayerService} from "../../services/player.service"; |
||||
|
import {ActivatedRoute, Router} from "@angular/router"; |
||||
|
import {MatTableDataSource} from "@angular/material/table"; |
||||
|
|
||||
|
@Component({ |
||||
|
selector: 'app-message-search', |
||||
|
styleUrls: ['messages-page.component.scss'], |
||||
|
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> |
||||
|
<button mat-menu-item (click)="filter.addServerToSearch()">Серверу</button> |
||||
|
<button mat-menu-item (click)="filter.addMessageToSearch('')">Содержимому</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-account |
||||
|
[filter]="filter" |
||||
|
[hidden]="account_id!=null" |
||||
|
></app-filter-mat-chip-account> |
||||
|
<app-filter-mat-chip-message |
||||
|
[filter]="filter"> |
||||
|
</app-filter-mat-chip-message> |
||||
|
<app-filter-mat-chip-server |
||||
|
[filter]="filter" |
||||
|
[serverList]="serverList"> |
||||
|
</app-filter-mat-chip-server> |
||||
|
<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="account_name"> |
||||
|
<th mat-header-cell *matHeaderCellDef> Игрок </th> |
||||
|
<td mat-cell *matCellDef="let row" [matMenuTriggerFor]="accountMenu"> {{row.account_name}} |
||||
|
<mat-menu #accountMenu> |
||||
|
<button mat-menu-item (click)="filter.addAccountToSearch(row.account_name)">Добавить в поиск</button> |
||||
|
<button mat-menu-item (click)="authService.searchPlayer(row.account_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:ss 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="message"> |
||||
|
<th mat-header-cell *matHeaderCellDef> Сообщение </th> |
||||
|
<td mat-cell *matCellDef="let row" [matMenuTriggerFor]="messageMenu"> {{row.message}} |
||||
|
<mat-menu #messageMenu> |
||||
|
<button mat-menu-item (click)="filter.addMessageToSearch(row.message)">Добавить в поиск</button> |
||||
|
</mat-menu></td> |
||||
|
</ng-container> |
||||
|
|
||||
|
<ng-container matColumnDef="serverName"> |
||||
|
<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 MessageSearchTable extends AbstractSearchTable<Message, MessageSearchFilter> { |
||||
|
displayedColumns: string[] = ['account_name', 'date', 'message', 'serverName']; |
||||
|
|
||||
|
constructor(public override authService: AuthService, |
||||
|
private messageService: MessageService, |
||||
|
protected override serverService: ServerService, |
||||
|
protected override playerService: PlayerService, |
||||
|
protected override router: Router, |
||||
|
protected override route: ActivatedRoute) { |
||||
|
super(authService, serverService, playerService, route, router); |
||||
|
super.filter = new MessageSearchFilter(); |
||||
|
} |
||||
|
|
||||
|
private getMessages(): boolean { |
||||
|
this.filter.updated = false; |
||||
|
this.loading = true; |
||||
|
this.messageService.getMessages(this.filter, this.paginator).subscribe( |
||||
|
(res) => { |
||||
|
this.dataSource = new MatTableDataSource<Message>(res.data); |
||||
|
this.err = false; |
||||
|
}, (e) => this.err = true, () => this.loading = false |
||||
|
) |
||||
|
return true; |
||||
|
} |
||||
|
|
||||
|
override updateData() { |
||||
|
super.updateData(); |
||||
|
this.getMessages(); |
||||
|
} |
||||
|
} |
@ -1,110 +0,0 @@ |
|||||
<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> |
|
||||
<div *ngIf="authService.isAuth()"> |
|
||||
<div style="padding-bottom: 10px;"> |
|
||||
<mat-chip-list> |
|
||||
<mat-chip [matMenuTriggerFor]="addFilter">Искать по...</mat-chip> |
|
||||
<mat-menu #addFilter> |
|
||||
<button mat-menu-item (click)="filter.addAccountToSearch('')">Профилю</button> |
|
||||
<button mat-menu-item [matMenuTriggerFor]="timeSelect">Времени</button> |
|
||||
<button mat-menu-item (click)="filter.addServerToSearch()">Серверу</button> |
|
||||
<button mat-menu-item (click)="filter.addMessageToSearch('')">Содержимому</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-account |
|
||||
[filter]="filter" |
|
||||
></app-filter-mat-chip-account> |
|
||||
<app-filter-mat-chip-message |
|
||||
[filter]="filter"> |
|
||||
</app-filter-mat-chip-message> |
|
||||
<app-filter-mat-chip-server |
|
||||
[filter]="filter" |
|
||||
[serverList]="serverList"> |
|
||||
</app-filter-mat-chip-server> |
|
||||
<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="account_name"> |
|
||||
<th mat-header-cell *matHeaderCellDef> Игрок </th> |
|
||||
<td mat-cell *matCellDef="let row" [matMenuTriggerFor]="accountMenu"> {{row.account_name}} |
|
||||
<mat-menu #accountMenu> |
|
||||
<button mat-menu-item (click)="filter.addAccountToSearch(row.account_name)">Добавить в поиск</button> |
|
||||
<button mat-menu-item (click)="authService.searchPlayer(row.account_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:ss 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="message"> |
|
||||
<th mat-header-cell *matHeaderCellDef> Сообщение </th> |
|
||||
<td mat-cell *matCellDef="let row" [matMenuTriggerFor]="messageMenu"> {{row.message}} |
|
||||
<mat-menu #messageMenu> |
|
||||
<button mat-menu-item (click)="filter.addMessageToSearch(row.message)">Добавить в поиск</button> |
|
||||
</mat-menu></td> |
|
||||
</ng-container> |
|
||||
|
|
||||
<ng-container matColumnDef="serverName"> |
|
||||
<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> |
|
||||
</div> |
|
||||
</div> |
|
||||
</div> |
|
Loading…
Reference in new issue