diff --git a/angular.json b/angular.json index 867cd1c..8ad9156 100644 --- a/angular.json +++ b/angular.json @@ -107,5 +107,8 @@ } } } + }, + "cli": { + "analytics": false } } diff --git a/src/app/admin-pages/files-page/FilesSearchTable.ts b/src/app/admin-pages/files-page/FilesSearchTable.ts index a4f6055..76e7094 100644 --- a/src/app/admin-pages/files-page/FilesSearchTable.ts +++ b/src/app/admin-pages/files-page/FilesSearchTable.ts @@ -1,10 +1,142 @@ import {Component} from "@angular/core"; +import {AbstractSearchTable} from "../../pages/internal-components/abstract-search-table.component"; +import {DbFile} from "../../entities/DbFile"; +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 {FileService} from "../../services/file.service"; +import {MatTableDataSource} from "@angular/material/table"; +import {ActionService} from "../../services/action.service"; @Component({ selector: 'app-files-search-table', template: ` +
+ + Искать по... + + + + + + + + + + Обновить + + + + + + +
+
+
+ +
+ Слишком много запросов или сервер не отвечает, обнови страницу. +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
Имя игрока {{row.uploader}} + + + + Время {{row.timestamp | date:"HH:mm dd/MM/yyyy"}} + + + + Файл {{row.filename}}Расширение {{row.extension}}Размер {{row.filesize}}Теги {{row.tags}}Действия + cloud_download +
А вот и нету файлов...
+ + +
` }) -export class FilesSearchTable { +export class FilesSearchTable extends AbstractSearchTable{ + displayedColumns: string[] = ['uploader', 'timestamp','filename', 'extension','filesize', 'tags', 'actions']; + + constructor(authService: AuthService, + serverService: ServerService, + playerService: PlayerService, + router: Router, + route: ActivatedRoute, + private fileService: FileService, + public actionService: ActionService) { + super(authService, serverService, playerService, route, router); + super.filter = new SearchFilter(); + } + + private getFiles(): boolean { + this.filter.updated = false; + this.loading = true; + this.fileService.getFiles(this.filter, this.paginator).subscribe( + (res) => { + this.dataSource = new MatTableDataSource(res.data); + this.err = false; + }, (e) => this.err = true, () => this.loading = false + ) + return true; + } + override updateData() { + if (this.lazy) return; + super.updateData(); + this.getFiles(); + } } diff --git a/src/app/admin-pages/files-page/FilesUploader.ts b/src/app/admin-pages/files-page/FilesUploader.ts index ec66250..010d2ba 100644 --- a/src/app/admin-pages/files-page/FilesUploader.ts +++ b/src/app/admin-pages/files-page/FilesUploader.ts @@ -1,10 +1,151 @@ -import {Component} from "@angular/core"; +import {Component, Input, OnInit} from "@angular/core"; +import {FilesSearchTable} from "./FilesSearchTable"; +import {FileService} from "../../services/file.service"; +import {MatTableDataSource} from "@angular/material/table"; + +export interface UploadedFile { + file:File; + status: "initial" | "uploading" | "success" | "fail"; + tags: string[]; + tag:''; +} @Component({ selector: 'app-files-uploader', template: ` + +
+ + + + Общий тег + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Имя файла {{element.file.name}} Размер {{element.file.size}} Статус загрузки {{status2rus(element.status)}} Теги + + + + {{tag}} + + + + + Новый тег + + + + + Действия nyk
Нет выбранных файлов
+ ` }) -export class FilesUploader { +export class FilesUploader implements OnInit { + displayedColumns: string[] = ['name', 'size', 'tags', 'status', 'action']; + dataSource!:MatTableDataSource; + + @Input('fst') + fst!: FilesSearchTable; + status: 'wait' | 'uploading' | 'done' = 'wait'; + globalTag: string = ''; + + constructor(private fileService:FileService) { + } + + ngOnInit(): void { + this.dataSource = new MatTableDataSource(); + } + + status2rus(status: "initial" | "uploading" | "success" | "fail"):string { + switch (status) { + case "initial": return 'Ожидание'; + case "uploading": return 'Загрузка'; + case "success": return 'Успешно'; + case "fail": return 'Ошибка'; + default: return ''; + } + } + + onChange(event: any) { + if (event && event.target && event.target.files) { + for (const f of event.target.files) { + this.dataSource.data.push({file:f, status: "initial", tags: [], tag:''}); + } + } + this.dataSource = new MatTableDataSource(this.dataSource.data); + } + + processingFiles() { + this.status = "uploading"; + this.dataSource.data.forEach((f)=> { + if (f.status == "initial") { + f.status = "uploading"; + this.fileService.uploadFile(f.file, f.tags).subscribe( + (res) => { + f.status = "success" + }, + (err) => { + f.status = "fail"; + } + ) + } + }); + this.status = "wait"; + } + + removeTag(f: UploadedFile, tag: string) { + f.tags = f.tags.filter(t => t != tag); + } + setGlobalTag() { + if (this.globalTag.length == 0 ) return; + this.dataSource.data.forEach((f)=> { + this.removeTag(f, this.globalTag); + f.tags.push(this.globalTag); + }); + } } diff --git a/src/app/app.module.ts b/src/app/app.module.ts index e2d7222..3814fa0 100644 --- a/src/app/app.module.ts +++ b/src/app/app.module.ts @@ -79,6 +79,7 @@ import { AdminMainPageComponent } from './admin-pages/admin-main-page/admin-main import { FilesPageComponent } from './admin-pages/files-page/files-page.component'; import {FilesSearchTable} from "./admin-pages/files-page/FilesSearchTable"; import {FilesUploader} from "./admin-pages/files-page/FilesUploader"; +import {AuthDialogRequest} from "./pages/internal-components/dialogs/AuthDialogRequest"; registerLocaleData(localeRu, "ru") @@ -120,6 +121,7 @@ registerLocaleData(localeRu, "ru") VipBuyDialog, VipFreeDialog, VipPromocodeDialog, + AuthDialogRequest, DowngamePageComponent, StatisticPageComponent, AboutPageComponent, diff --git a/src/app/pages/banlist-page/banlist-page.component.html b/src/app/pages/banlist-page/banlist-page.component.html deleted file mode 100644 index c2ff5b9..0000000 --- a/src/app/pages/banlist-page/banlist-page.component.html +++ /dev/null @@ -1,13 +0,0 @@ -
-

Бан лист

-

Скоро и ты сюда попадешь браток

-
- -
-
- -
- -
-
-
diff --git a/src/app/pages/banlist-page/banlist-page.component.ts b/src/app/pages/banlist-page/banlist-page.component.ts index 94d49bf..9cc95eb 100644 --- a/src/app/pages/banlist-page/banlist-page.component.ts +++ b/src/app/pages/banlist-page/banlist-page.component.ts @@ -13,8 +13,19 @@ import {BanViewDialog} from "../internal-components/dialogs/BanViewDialog"; @Component({ selector: 'app-banlist-page', - templateUrl: './banlist-page.component.html', - styleUrls: ['./banlist-page.component.scss'] + styleUrls: ['./banlist-page.component.scss'], + template: ` +
+

Бан лист

+

Скоро и ты сюда попадешь браток

+
+ +
+
+ +
+
+ ` }) export class BanlistPageComponent { diff --git a/src/app/pages/banlist-page/banlist-search-table.ts b/src/app/pages/banlist-page/banlist-search-table.ts index bcde246..4b59306 100644 --- a/src/app/pages/banlist-page/banlist-search-table.ts +++ b/src/app/pages/banlist-page/banlist-search-table.ts @@ -10,6 +10,7 @@ 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"; +import {AuthDialogRequest} from "../internal-components/dialogs/AuthDialogRequest"; @Component({ selector: "app-banlist-search-table", @@ -119,8 +120,8 @@ import {BanViewDialog} from "../internal-components/dialogs/BanViewDialog"; @@ -146,7 +147,19 @@ export class BanlistSearchTable extends AbstractSearchTable { this.dataSource = new MatTableDataSource(res.data); this.err = false; - }, (e) => this.err = true, () => this.loading = false + }, (e) => { + this.loading = false; + switch (e.status) { + case 401: { + this.dialog.open(AuthDialogRequest); + break; + } + default: { + this.err = true; + break; + } + } + }, () => this.loading = false ) return true; } diff --git a/src/app/pages/internal-components/DonateSearchTable.ts b/src/app/pages/internal-components/DonateSearchTable.ts index e68e99c..0a13643 100644 --- a/src/app/pages/internal-components/DonateSearchTable.ts +++ b/src/app/pages/internal-components/DonateSearchTable.ts @@ -8,6 +8,8 @@ import {PlayerService} from "../../services/player.service"; import {ActivatedRoute, Router} from "@angular/router"; import {VipService} from "../../services/vip.service"; import {MatTableDataSource} from "@angular/material/table"; +import {MatDialog} from "@angular/material/dialog"; +import {AuthDialogRequest} from "./dialogs/AuthDialogRequest"; @Component({ selector: 'app-donate-search-table', @@ -86,8 +88,8 @@ import {MatTableDataSource} from "@angular/material/table"; @@ -101,7 +103,8 @@ export class DonateSearchTable extends AbstractSearchTable { this.dataSource = new MatTableDataSource(res.data) this.err = false; - }, (e) => this.err = true, () => this.loading = false + }, (e) => { + this.loading = false; + switch (e.status) { + case 401: { + this.dialog.open(AuthDialogRequest); + break; + } + default: { + this.err = true; + break; + } + } + }, () => this.loading = false ) return true; } diff --git a/src/app/pages/internal-components/abstract-search-table.component.ts b/src/app/pages/internal-components/abstract-search-table.component.ts index c6aff1f..8bd5ed4 100644 --- a/src/app/pages/internal-components/abstract-search-table.component.ts +++ b/src/app/pages/internal-components/abstract-search-table.component.ts @@ -9,9 +9,12 @@ import {ServerService} from "../../services/server.service"; import {ActivatedRoute, Router} from "@angular/router"; import {AuthService} from "../../services/auth.service"; import {PlayerService} from "../../services/player.service"; +import {DefaultValues} from "../../utils/DefaultValues"; @Component({template: ''}) export abstract class AbstractSearchTable implements AfterViewInit { + pageSizeOptions:number[] = DefaultValues.pageSizeOptions; + pageSize:number = DefaultValues.pageSize; dataSource: MatTableDataSource; filter: U; diff --git a/src/app/pages/internal-components/dialogs/AuthDialogRequest.ts b/src/app/pages/internal-components/dialogs/AuthDialogRequest.ts new file mode 100644 index 0000000..f8574e0 --- /dev/null +++ b/src/app/pages/internal-components/dialogs/AuthDialogRequest.ts @@ -0,0 +1,15 @@ +import {Component} from "@angular/core"; + +@Component({ + selector: 'app-auth-dialog-request', + template: ` +

Чтобы смотреть дальше...

+ + + + + + + ` +}) +export class AuthDialogRequest {} diff --git a/src/app/pages/killfeed-page/KillFeedSearchTable.ts b/src/app/pages/killfeed-page/KillFeedSearchTable.ts index a65aa63..a89a482 100644 --- a/src/app/pages/killfeed-page/KillFeedSearchTable.ts +++ b/src/app/pages/killfeed-page/KillFeedSearchTable.ts @@ -12,6 +12,9 @@ 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', @@ -115,8 +118,8 @@ import {Component} from "@angular/core"; @@ -130,7 +133,8 @@ export class KillFeedSearchTable extends AbstractSearchTable PagingAndSortingPaginator.newObj().fromData(res).updatePaginator(this.paginator)))) .subscribe((res) => { this.dataSource = new MatTableDataSource(res.data); this.err = false; - }, (e) => this.err = true, () => this.loading = false + }, (e) => { + this.loading = false; + switch (e.status) { + case 401: { + this.dialog.open(AuthDialogRequest); + break; + } + default: { + this.err = true; + break; + } + } + }, () => this.loading = false ) } diff --git a/src/app/pages/killfeed-page/killfeed-page.component.ts b/src/app/pages/killfeed-page/killfeed-page.component.ts index 77cca64..0fccbe5 100644 --- a/src/app/pages/killfeed-page/killfeed-page.component.ts +++ b/src/app/pages/killfeed-page/killfeed-page.component.ts @@ -12,8 +12,7 @@ import {AuthService} from "../../services/auth.service";
- - +
` diff --git a/src/app/pages/messages-page/message-search-table.ts b/src/app/pages/messages-page/message-search-table.ts index 1854e33..b1f5d4a 100644 --- a/src/app/pages/messages-page/message-search-table.ts +++ b/src/app/pages/messages-page/message-search-table.ts @@ -8,6 +8,8 @@ import {ServerService} from "../../services/server.service"; import {PlayerService} from "../../services/player.service"; import {ActivatedRoute, Router} from "@angular/router"; import {MatTableDataSource} from "@angular/material/table"; +import {MatDialog} from "@angular/material/dialog"; +import {AuthDialogRequest} from "../internal-components/dialogs/AuthDialogRequest"; @Component({ selector: 'app-message-search', @@ -108,8 +110,8 @@ import {MatTableDataSource} from "@angular/material/table"; @@ -123,7 +125,8 @@ export class MessageSearchTable extends AbstractSearchTable { this.dataSource = new MatTableDataSource(res.data); this.err = false; - }, (e) => this.err = true, () => this.loading = false + }, (e) => { + this.loading = false; + switch (e.status) { + case 401: { + this.dialog.open(AuthDialogRequest); + break; + } + default: { + this.err = true; + break; + } + } + }, () => this.loading = false ) return true; } diff --git a/src/app/pages/messages-page/messages-page.component.ts b/src/app/pages/messages-page/messages-page.component.ts index 46b8437..6ad9a9f 100644 --- a/src/app/pages/messages-page/messages-page.component.ts +++ b/src/app/pages/messages-page/messages-page.component.ts @@ -23,8 +23,7 @@ import {ActivatedRoute, Router} from "@angular/router";
- -
+
diff --git a/src/app/pages/reports-page/ReportSearchTable.ts b/src/app/pages/reports-page/ReportSearchTable.ts index e7c2d90..56d53d6 100644 --- a/src/app/pages/reports-page/ReportSearchTable.ts +++ b/src/app/pages/reports-page/ReportSearchTable.ts @@ -11,6 +11,9 @@ import {PagingAndSortingPaginator} from "../../entities/PagingAndSortingPaginato import {MatTableDataSource} from "@angular/material/table"; import {Component} from "@angular/core"; import {Report} from "../../entities/Report"; +import {DefaultValues} from "../../utils/DefaultValues"; +import {MatDialog} from "@angular/material/dialog"; +import {AuthDialogRequest} from "../internal-components/dialogs/AuthDialogRequest"; @Component({ selector: 'app-report-search-table', @@ -116,8 +119,8 @@ import {Report} from "../../entities/Report";
@@ -134,7 +137,8 @@ export class ReportSearchTable extends AbstractSearchTable PagingAndSortingPaginator.newObj().fromData(res).updatePaginator(this.paginator))) .subscribe((res) => { this.dataSource = new MatTableDataSource(res.data); this.err = false; - }, (e) => this.err = true, () => this.loading = false + }, (e) => { + this.loading = false; + switch (e.status) { + case 401: { + this.dialog.open(AuthDialogRequest); + break; + } + default: { + this.err = true; + break; + } + }}, () => this.loading = false ); } diff --git a/src/app/pages/reports-page/reports-page.component.ts b/src/app/pages/reports-page/reports-page.component.ts index 3bf630e..1402ae6 100644 --- a/src/app/pages/reports-page/reports-page.component.ts +++ b/src/app/pages/reports-page/reports-page.component.ts @@ -12,8 +12,7 @@ import {AuthService} from "../../services/auth.service";
- - +
` diff --git a/src/app/pages/vip-page/vip-page.component.html b/src/app/pages/vip-page/vip-page.component.html index e8e9820..f20af6b 100644 --- a/src/app/pages/vip-page/vip-page.component.html +++ b/src/app/pages/vip-page/vip-page.component.html @@ -66,8 +66,7 @@

Последние выданые випки

- - +
diff --git a/src/app/services/ban.service.ts b/src/app/services/ban.service.ts index 060ffdc..8a187b0 100644 --- a/src/app/services/ban.service.ts +++ b/src/app/services/ban.service.ts @@ -6,6 +6,7 @@ import {map, Observable} from "rxjs"; import {BanSearchFilter} from "../entities/search/BanSearchFilter"; import {MatPaginator} from "@angular/material/paginator"; import {PagingAndSortingPaginator} from "../entities/PagingAndSortingPaginator"; +import {DefaultValues} from "../utils/DefaultValues"; @Injectable({ providedIn: 'root' @@ -17,7 +18,7 @@ export class BanService { getBanList(filters: BanSearchFilter, paginator: MatPaginator | undefined) { return this.http.post(`api/web/banlist`, filters, - {params: {size: paginator?paginator.pageSize:20, page: paginator?paginator.pageIndex:0}}).pipe( + {params: {size: paginator?paginator.pageSize:DefaultValues.pageSize, page: paginator?paginator.pageIndex:0}}).pipe( map((res) => PagingAndSortingPaginator.newObj().fromData(res).updatePaginator(paginator)) ); } diff --git a/src/app/services/file.service.ts b/src/app/services/file.service.ts index 8f85ee1..b6efb3b 100644 --- a/src/app/services/file.service.ts +++ b/src/app/services/file.service.ts @@ -5,6 +5,7 @@ import {MatPaginator} from "@angular/material/paginator"; import {map, Observable} from "rxjs"; import {PagingAndSortingPaginator} from "../entities/PagingAndSortingPaginator"; import {DbFile} from "../entities/DbFile"; +import {DefaultValues} from "../utils/DefaultValues"; @Injectable({ providedIn: 'root' @@ -15,7 +16,7 @@ export class FileService { getFiles(filters: SearchFilter, paginator: MatPaginator | undefined) { return this.http.post(`api/file/search`, filters, - {params: {size: paginator?paginator.pageSize:20, page: paginator?paginator.pageIndex:0}}).pipe( + {params: {size: paginator?paginator.pageSize:DefaultValues.pageSize, page: paginator?paginator.pageIndex:0}}).pipe( map((res) => PagingAndSortingPaginator.newObj().fromData(res).updatePaginator(paginator)) ); } @@ -30,10 +31,10 @@ export class FileService { return this.http.post(`api/file/edit`, file); } - uploadFile(file: File): Observable { + uploadFile(file: File, tags:string[] = []): Observable { const formData = new FormData(); formData.append('file', file, file.name); - return this.http.post(`api/file`, formData).pipe( + return this.http.post(`api/file?tags=`+tags.join(","), formData, {responseType: "text"}).pipe( map((res) => `${res}`) ) } diff --git a/src/app/services/message.service.ts b/src/app/services/message.service.ts index 9c4b42c..719daef 100644 --- a/src/app/services/message.service.ts +++ b/src/app/services/message.service.ts @@ -5,6 +5,7 @@ import {map} from "rxjs"; import {PagingAndSortingPaginator} from "../entities/PagingAndSortingPaginator"; import {Message} from "../entities/profile/Message"; import {MessageSearchFilter} from "../entities/search/MessageSearchFilter"; +import {DefaultValues} from "../utils/DefaultValues"; @Injectable({ providedIn: 'root' @@ -17,7 +18,7 @@ export class MessageService { return this.http.post( `/api/profile/messages/pages`, filters, - {params: {size: paginator?paginator.pageSize:20, page: paginator?paginator.pageIndex:0}}).pipe( + {params: {size: paginator?paginator.pageSize:DefaultValues.pageSize, page: paginator?paginator.pageIndex:0}}).pipe( map((res) => PagingAndSortingPaginator.newObj().fromData(res).updatePaginator(paginator)) ); } diff --git a/src/app/services/vip.service.ts b/src/app/services/vip.service.ts index 13ae577..f2d7a75 100644 --- a/src/app/services/vip.service.ts +++ b/src/app/services/vip.service.ts @@ -7,6 +7,7 @@ import {MatPaginator} from "@angular/material/paginator"; import {PagingAndSortingPaginator} from "../entities/PagingAndSortingPaginator"; import {Ban} from "../entities/ban/Ban"; import {DonateStat} from "../entities/DonateStat"; +import {DefaultValues} from "../utils/DefaultValues"; @Injectable({ providedIn: 'root' @@ -25,7 +26,7 @@ export class VipService { getDonateStat(filters: SearchFilter, paginator: MatPaginator | undefined) { return this.http.post(`api/profile/donate`, filters, - {params: {size: paginator?paginator.pageSize:20, page: paginator?paginator.pageIndex:0}}).pipe( + {params: {size: paginator?paginator.pageSize:DefaultValues.pageSize, page: paginator?paginator.pageIndex:0}}).pipe( map((res) => PagingAndSortingPaginator.newObj().fromData(res).updatePaginator(paginator)) ); } diff --git a/src/app/utils/DefaultValues.ts b/src/app/utils/DefaultValues.ts new file mode 100644 index 0000000..20f9f8f --- /dev/null +++ b/src/app/utils/DefaultValues.ts @@ -0,0 +1,4 @@ +export class DefaultValues { + public static pageSizeOptions:number[] = [5, 10, 25]; + public static pageSize:number = 10; +}