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