diff --git a/src/app/app.module.ts b/src/app/app.module.ts index 1b623ab..8542497 100644 --- a/src/app/app.module.ts +++ b/src/app/app.module.ts @@ -55,6 +55,8 @@ import {BanlistSearchTable} from "./pages/banlist-page/banlist-search-table"; import {FilterMatChipActiveBan} from "./pages/internal-components/search-filters/ban/FilterMatChipActiveBan"; import {FilterMatChipAdmins} from "./pages/internal-components/search-filters/ban/FilterMatChipAdmins"; import {LivetimeServerMap} from "./pages/servers-page/livetime-server-map"; +import {NewsViewDialog} from "./pages/main-page/NewsViewDialog"; +import {AnnoncesListCarules} from "./pages/main-page/AnnoncesListCarules"; registerLocaleData(localeRu, "ru") @@ -73,6 +75,7 @@ registerLocaleData(localeRu, "ru") //tables MessageSearchTable, BanlistSearchTable, + AnnoncesListCarules, //search filters FilterMatChipAccount, FilterMatChipMessage, @@ -83,7 +86,8 @@ registerLocaleData(localeRu, "ru") FilterMatChipActiveBan, FilterMatChipAdmins, //dialogs - BanViewDialog + BanViewDialog, + NewsViewDialog ], imports: [ BrowserModule, diff --git a/src/app/entities/Annonce.ts b/src/app/entities/Annonce.ts index a2f0936..af72a22 100644 --- a/src/app/entities/Annonce.ts +++ b/src/app/entities/Annonce.ts @@ -1,8 +1,29 @@ -export interface Annonce { - header: string - short: string - full: string|null - image: string - type: 'news' | 'reason4play', - redirect: string|null +export class Annonce { + id!: number; + header!: string + shortText!: string + fullText!: string|null + type!: 'news' | 'reason4play' + redirect!: string|null + attachments: string[] = []; + timestamp!: Date + author!: string + + static getPreview(a: Annonce): string { + if (a.attachments.length == 0) + return "../../../../assets/images/test.jpg"; + else + return a.attachments[0]; + } + + public static createHtml(a: Annonce):string { + if (!a.fullText) return "хуй"; + let toDiv: string = ""; + a.fullText.split("\n").forEach( + (chain) => { + toDiv += `

${chain}

` + } + ) + return toDiv; + } } diff --git a/src/app/pages/main-page/AnnoncesListCarules.ts b/src/app/pages/main-page/AnnoncesListCarules.ts new file mode 100644 index 0000000..00dc100 --- /dev/null +++ b/src/app/pages/main-page/AnnoncesListCarules.ts @@ -0,0 +1,98 @@ +import {AbstractSearchTable} from "../internal-components/abstract-search-table.component"; +import {Annonce} from "../../entities/Annonce"; +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 {AnnonceService} from "../../services/AnnonceService"; +import {Component, Input} from "@angular/core"; +import {NewsViewDialog} from "./NewsViewDialog"; +import {MatDialog} from "@angular/material/dialog"; +import {ActionService} from "../../services/action.service"; + +@Component({ + selector: 'app-annonces-list-carules', + template: ` +

{{getHeader()}}

+
+ + {{a.header}} + {{a.shortText!=null?a.shortText:'от ' + (a.timestamp|date:'HH:mm dd.MM.YYYY')}} + +
+ + `, styleUrls: ['main-page.component.scss'] +}) +export class AnnoncesListCarules extends AbstractSearchTable { + + @Input("type") + type!: 'news' | 'reason4play'; + + annonces: Annonce[] = []; + + constructor(authService: AuthService, + serverService: ServerService, + playerService: PlayerService, + route: ActivatedRoute, + router: Router, + private annonceService: AnnonceService, + private dialog: MatDialog, + private actionService: ActionService) { + super(authService, serverService, playerService, route, router); + } + + override updateData() { + super.updateData(); + this.getNewsList(); + } + + getNewsList() { + switch (this.type) { + case "news":{ + this.annonceService.getNews(this.paginator).subscribe((n) => { + this.annonces = n.data; + }); + break; + } + case "reason4play":{ + this.annonceService.getAnnonces(this.paginator).subscribe((a) => { + this.annonces = a.data; + }); + break; + } + default: break; + } + } + + generateStyle4Card(a: Annonce) { + return { + 'background': 'linear-gradient(to right, black, transparent), url(\''+Annonce.getPreview(a)+'\')', + 'background-size': 'cover' + } + } + + openNews(annonce: Annonce) { + if (annonce.type != "news" || !annonce.fullText) { + if (annonce.redirect) this.actionService.goToUrlViaTab(annonce.redirect) + return; + } + this.dialog.open(NewsViewDialog, {data: annonce}) + } + + getHeader():string { + switch (this.type) { + case "news": return "Интереснные приколы"; + case "reason4play": return "Почему стоит начать играть?"; + default: return "Всякое говно"; + } + } +} diff --git a/src/app/pages/main-page/NewsViewDialog.ts b/src/app/pages/main-page/NewsViewDialog.ts new file mode 100644 index 0000000..e800661 --- /dev/null +++ b/src/app/pages/main-page/NewsViewDialog.ts @@ -0,0 +1,41 @@ +import {Component, Inject} from "@angular/core"; +import {MAT_DIALOG_DATA, MatDialogRef} from "@angular/material/dialog"; +import {Annonce} from "../../entities/Annonce"; +import {ActionService} from "../../services/action.service"; + +@Component({ + selector: "app-news-view-dialog", + template: ` +

{{annonce.header}}

+ +
+ + +
+
+
+

{{annonce.author}} | {{annonce.timestamp | date:'HH:mm dd.MM.YYYY'}}

+
+
+ + + + + ` +}) +export class NewsViewDialog { + constructor( + @Inject(MAT_DIALOG_DATA) public annonce: Annonce, + private dialogRef: MatDialogRef, + public actionService: ActionService + ) { + } + + close() { + this.dialogRef.close(); + } + + createHtml(a: Annonce): string { + return Annonce.createHtml(a); + } +} diff --git a/src/app/pages/main-page/main-page.component.html b/src/app/pages/main-page/main-page.component.html index d12726f..1636828 100644 --- a/src/app/pages/main-page/main-page.component.html +++ b/src/app/pages/main-page/main-page.component.html @@ -61,30 +61,9 @@
-

Интереснные приколы

-
- - {{a.header}} - {{a.short}} - -
+
-
-

Почему стоит начать играть?

-
- - {{a.header}} - {{a.short}} - -
+
diff --git a/src/app/pages/main-page/main-page.component.ts b/src/app/pages/main-page/main-page.component.ts index 243be79..cd3336b 100644 --- a/src/app/pages/main-page/main-page.component.ts +++ b/src/app/pages/main-page/main-page.component.ts @@ -1,6 +1,5 @@ import { Component, OnInit } from '@angular/core'; import {AnnonceService} from "../../services/AnnonceService"; -import {Annonce} from "../../entities/Annonce"; import {Router} from "@angular/router"; import {AuthService} from "../../services/auth.service"; import {PlayerService} from "../../services/player.service"; @@ -43,17 +42,6 @@ export class MainPageComponent implements OnInit { ) } - getAnnonces(type: any, limit: number = 3): Annonce[] { - return this.annoncesService.getAnnonces(type); - } - - generateStyle4Card(a: Annonce) { - return { - 'background': 'linear-gradient(to right, black, transparent), url(\''+a.image+'\')', - 'background-size': 'cover' - } - } - go2url(url:string) { this.router.navigate([url]) } diff --git a/src/app/services/AnnonceService.ts b/src/app/services/AnnonceService.ts index 868060b..cc62814 100644 --- a/src/app/services/AnnonceService.ts +++ b/src/app/services/AnnonceService.ts @@ -1,20 +1,25 @@ import {Annonce} from "../entities/Annonce"; import {Injectable} from "@angular/core"; import {MatPaginator, MatPaginatorIntl} from "@angular/material/paginator"; +import {HttpClient} from "@angular/common/http"; +import {map} from "rxjs"; +import {PagingAndSortingPaginator} from "../entities/PagingAndSortingPaginator"; @Injectable() export class AnnonceService { - annonces: Annonce[] = [ - {header: 'Пиздатая коллекция карт', short: 'Жми сюда карлик и получи пачку карт факты13', full: null, type: 'news', image: '../../../../assets/images/test.jpg', redirect: null}, - {header: 'Крутые поделки наших работяг', short: 'Заходи в дискорд и насоалист качественным исскуством самых рукастых карликов', full: null, type: 'news', image: '../../../../assets/images/test.jpg', redirect: null}, - {header: 'Ютуб канал какого-то злодея', short: 'Зацени забавные видосики по нашему серверу', full: null, type: 'news', image: '../../../../assets/images/test.jpg', redirect: null}, - {header: 'Уникальный опыт', short: 'Все карты на сервере уникальны и сделаны нами, ты всегда можншь найти место по вкусу!', full: null, type: 'reason4play', image: '../../../../assets/images/test.jpg', redirect: null}, - {header: 'Качественный геймплей', short: 'Большенство плагинов на сервере сделаны нами и добавляют некий шарм в геймплей.', full: null, type: 'reason4play', image: '../../../../assets/images/test.jpg', redirect: null}, - {header: 'Отсутствие правил', short: 'Правила для вас не писаны(каканы), можете делать всё что душе угодно, но ожидайте что вам дадут пиздюлей наши модераторы.', full: null, type: 'reason4play', image: '../../../../assets/images/test.jpg', redirect: null}, - {header: 'Uptime 99%', short: 'Сервера работают на божем слове, так что шанс что проект закроется стремится к нулю. Конечно пока нам не надоест.', full: null, type: 'reason4play', image: '../../../../assets/images/test.jpg', redirect: null}, - ] + constructor(private http: HttpClient) {} - getAnnonces(type: 'news' | 'reason4play'): Annonce[] { - return this.annonces.filter((a) => a.type == type) + private default_count: number = 4; + + getNews(paginator: MatPaginator | undefined) { + return this.http.get("api/web/news", {params: {size:paginator?paginator.pageSize:this.default_count, page: paginator?paginator.pageIndex:0}}).pipe( + map((res) => PagingAndSortingPaginator.newObj().fromData(res).updatePaginator(paginator)) + ); + } + + getAnnonces(paginator: MatPaginator | undefined) { + return this.http.get("api/web/annonces", {params: {size:paginator?paginator.pageSize:this.default_count, page: paginator?paginator.pageIndex:0}}).pipe( + map((res) => PagingAndSortingPaginator.newObj().fromData(res).updatePaginator(paginator)) + ); } }