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