From 2921ecc303628c8862e87a34205df3d7752b7753 Mon Sep 17 00:00:00 2001 From: Guams Date: Tue, 4 Feb 2025 20:24:03 +0100 Subject: [PATCH] Ajout de nouvelles pages pour les admins 2.0 --- public/favicon.ico | Bin 15086 -> 0 bytes public/icon.jpg | Bin 0 -> 32320 bytes src/app/app.component.html | 3 +- .../components/footer/footer.component.css | 25 ------ .../components/footer/footer.component.html | 10 --- src/app/components/footer/footer.component.ts | 12 --- .../post-form/post-form.component.ts | 2 - .../post-home/post-home.component.html | 4 +- .../register-form.component.html | 2 +- .../register-form/register-form.component.ts | 34 ++++++-- .../admin-authors/admin-authors.component.css | 7 ++ .../admin-authors.component.html | 61 +++++++++++++- .../admin-authors/admin-authors.component.ts | 79 +++++++++++++++++- src/app/pages/home/home.component.html | 1 - src/app/pages/home/home.component.ts | 2 - src/app/pages/login/login.component.html | 1 - src/app/pages/login/login.component.ts | 2 - src/app/pages/logout/logout.component.ts | 3 +- .../pages/my-posts/my-posts.component.html | 1 - src/app/pages/my-posts/my-posts.component.ts | 2 - .../pages/new-post/new-post.component.html | 1 - src/app/pages/new-post/new-post.component.ts | 2 - src/app/pages/post/post.component.html | 1 - src/app/pages/post/post.component.ts | 2 - src/app/pages/profile/profile.component.html | 1 - src/app/pages/profile/profile.component.ts | 2 - .../pages/register/register.component.html | 1 - src/app/pages/register/register.component.ts | 4 - src/app/services/author.service.ts | 9 +- src/app/services/post.service.ts | 1 - src/index.html | 12 ++- src/styles.css | 51 +++++++++++ 32 files changed, 245 insertions(+), 93 deletions(-) delete mode 100644 public/favicon.ico create mode 100644 public/icon.jpg delete mode 100644 src/app/components/footer/footer.component.css delete mode 100644 src/app/components/footer/footer.component.html delete mode 100644 src/app/components/footer/footer.component.ts diff --git a/public/favicon.ico b/public/favicon.ico deleted file mode 100644 index 57614f9c967596fad0a3989bec2b1deff33034f6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15086 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 Nr__JTFzvMr^FKp4S3v*( diff --git a/public/icon.jpg b/public/icon.jpg new file mode 100644 index 0000000000000000000000000000000000000000..7da39e5f0e527e53cd9467ae7c631522382581b7 GIT binary patch literal 32320 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 Votre session a expiré ! Il va falloir se reconnecter.
- +
} diff --git a/src/app/components/footer/footer.component.css b/src/app/components/footer/footer.component.css deleted file mode 100644 index 09205da..0000000 --- a/src/app/components/footer/footer.component.css +++ /dev/null @@ -1,25 +0,0 @@ -.footer { - background-color: #1c1c1c; - color: #f1f1f1; - padding: 20px; - text-align: center; - font-size: 14px; -} - -.footer-creator, -.footer-banner, -.footer-follow, -.footer-links, -.footer-copyright { - margin: 5px 0; -} - -.footer-link { - color: #1e90ff; - text-decoration: none; - margin: 0 10px; -} - -.footer-link:hover { - text-decoration: underline; -} diff --git a/src/app/components/footer/footer.component.html b/src/app/components/footer/footer.component.html deleted file mode 100644 index 0cbf7aa..0000000 --- a/src/app/components/footer/footer.component.html +++ /dev/null @@ -1,10 +0,0 @@ -
- - - - - -
diff --git a/src/app/components/footer/footer.component.ts b/src/app/components/footer/footer.component.ts deleted file mode 100644 index e2d1a44..0000000 --- a/src/app/components/footer/footer.component.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { Component } from '@angular/core'; - -@Component({ - selector: 'app-footer', - standalone: true, - imports: [], - templateUrl: './footer.component.html', - styleUrl: './footer.component.css' -}) -export class FooterComponent { - -} diff --git a/src/app/components/post-form/post-form.component.ts b/src/app/components/post-form/post-form.component.ts index f839b54..c3573bc 100644 --- a/src/app/components/post-form/post-form.component.ts +++ b/src/app/components/post-form/post-form.component.ts @@ -112,7 +112,6 @@ export class PostFormComponent implements OnDestroy { ).subscribe({ next: (_) => { this.successMessage('Succès', 'Post mis à jour avec succès') - console.log(this.body); }, error: (err) => this.failureMessage('Erreur', err.message) }) @@ -130,7 +129,6 @@ export class PostFormComponent implements OnDestroy { ).subscribe({ next: () => { this.router.navigate(['/']).then(() => { - console.log(this.body); this.successMessage('Succès', 'Post créé avec succès') }); }, diff --git a/src/app/components/post-home/post-home.component.html b/src/app/components/post-home/post-home.component.html index ef426b9..c5613d0 100644 --- a/src/app/components/post-home/post-home.component.html +++ b/src/app/components/post-home/post-home.component.html @@ -7,11 +7,11 @@ {{ description }} diff --git a/src/app/components/register-form/register-form.component.html b/src/app/components/register-form/register-form.component.html index 7b922c4..6f9a137 100644 --- a/src/app/components/register-form/register-form.component.html +++ b/src/app/components/register-form/register-form.component.html @@ -8,7 +8,7 @@ - diff --git a/src/app/components/register-form/register-form.component.ts b/src/app/components/register-form/register-form.component.ts index d00b576..6a62d22 100644 --- a/src/app/components/register-form/register-form.component.ts +++ b/src/app/components/register-form/register-form.component.ts @@ -1,5 +1,4 @@ -import {Component, Input, OnDestroy, OnInit} from '@angular/core'; -import {HeaderComponent} from '../header/header.component'; +import {Component, EventEmitter, Input, OnDestroy, Output} from '@angular/core'; import {Subscription} from 'rxjs'; import {FormBuilder, FormGroup, FormsModule, ReactiveFormsModule, Validators} from '@angular/forms'; import {InputTextModule} from 'primeng/inputtext'; @@ -8,12 +7,13 @@ import {Button} from 'primeng/button'; import {AuthorService} from '../../services/author.service'; import {Router} from '@angular/router'; import {MessageService} from 'primeng/api'; +import {Author} from '../../models/author'; +import {AuthService} from '../../auth.service'; @Component({ selector: 'app-register-form', standalone: true, imports: [ - HeaderComponent, ReactiveFormsModule, InputTextModule, SelectButtonModule, @@ -25,6 +25,7 @@ import {MessageService} from 'primeng/api'; }) export class RegisterFormComponent implements OnDestroy { @Input() username: string = ""; + @Output() createdAuthor: EventEmitter = new EventEmitter(); @Input() password: string = ""; @Input() passwordConfirm: string = ""; @Input() role: string = "READER" @@ -35,17 +36,22 @@ export class RegisterFormComponent implements OnDestroy { ]; subs: Subscription[] = []; form: FormGroup; + actualAuthor: Author | undefined; constructor(private formBuilder: FormBuilder, private authorService: AuthorService, private router: Router, - private messageService: MessageService + private messageService: MessageService, + private authService: AuthService, ) { + if (!(this.authService.isSessionExpired()) && this.authService.isAuthenticated()) { + this.actualAuthor = this.authService.getAuthenticatedAuthor(); + } this.form = this.formBuilder.group({ username: ['', [Validators.required, Validators.maxLength(255)]], password: ['', [Validators.required, Validators.maxLength(50)]], passwordConfirm: ['', [Validators.required, Validators.maxLength(50)]], - role: [{value: 'READER', disabled: !this.adminForm}, [Validators.required, Validators.maxLength(10)]], + role: [{value: 'READER'}, [Validators.required, Validators.maxLength(10)]], }); } @@ -71,8 +77,20 @@ export class RegisterFormComponent implements OnDestroy { onSubmit() { if (this.form.valid && this.password === this.passwordConfirm) { - if (this.adminForm) { - this.authorService.createAccountAdmin(this.username, this.password, this.role); //TODO à finir + if (this.adminForm && this.actualAuthor) { + this.authorService.createAccountAdmin( + this.username, + this.password, + this.role, + this.authService.getAuthenticatedAuthorToken()).subscribe({ + next: (author: Author) => { + this.successMessage('Succès', `Auteur ${author.name} créé avec succès`); + this.createdAuthor.emit(author); + }, + error: (err) => { + this.failureMessage("Erreur", err.message); + } + }); } else { this.subs.push(this.authorService.createAccount(this.username, this.password).subscribe({ next: () => this.router.navigate(['/login']).then(() => this.successMessage('Succès', 'Utilisateur créé avec succès')), @@ -80,6 +98,8 @@ export class RegisterFormComponent implements OnDestroy { })); } + } else { + this.failureMessage('Erreur', 'Le formulaire n\'est pas complet ou les mot de passes ne correspondent pas'); } } diff --git a/src/app/pages/admin-authors/admin-authors.component.css b/src/app/pages/admin-authors/admin-authors.component.css index e69de29..f8a66a1 100644 --- a/src/app/pages/admin-authors/admin-authors.component.css +++ b/src/app/pages/admin-authors/admin-authors.component.css @@ -0,0 +1,7 @@ +.add-button { + display: flex; + justify-content: flex-end; + margin-top: 2rem; + margin-right: 2rem; + margin-bottom: 2rem; +} diff --git a/src/app/pages/admin-authors/admin-authors.component.html b/src/app/pages/admin-authors/admin-authors.component.html index 30f5b53..846d948 100644 --- a/src/app/pages/admin-authors/admin-authors.component.html +++ b/src/app/pages/admin-authors/admin-authors.component.html @@ -1,2 +1,61 @@ -

admin-authors works!

+
+ + + + + +
+ + + + + ID + Nom + Photo de profil + Role + + + + + + + {{ author.id }} + {{ author.name }} + + @if (author.profilePicture) { + + } @else { + + } + + {{ author.role }} + + + + + + + + + + +
+ + +
+
+ + +
+
diff --git a/src/app/pages/admin-authors/admin-authors.component.ts b/src/app/pages/admin-authors/admin-authors.component.ts index e57e830..8ef8ec8 100644 --- a/src/app/pages/admin-authors/admin-authors.component.ts +++ b/src/app/pages/admin-authors/admin-authors.component.ts @@ -1,15 +1,88 @@ -import { Component } from '@angular/core'; +import {Component, OnDestroy} from '@angular/core'; import {HeaderComponent} from '../../components/header/header.component'; +import {TableModule} from 'primeng/table'; +import {AuthService} from '../../auth.service'; +import {AuthorService} from '../../services/author.service'; +import {Author} from '../../models/author'; +import {Subscription} from 'rxjs'; +import {MessageService} from 'primeng/api'; +import {AvatarModule} from 'primeng/avatar'; +import {Button} from 'primeng/button'; +import {DialogModule} from 'primeng/dialog'; +import {RegisterFormComponent} from '../../components/register-form/register-form.component'; @Component({ selector: 'app-admin-authors', standalone: true, imports: [ - HeaderComponent + HeaderComponent, + TableModule, + AvatarModule, + Button, + DialogModule, + RegisterFormComponent, ], templateUrl: './admin-authors.component.html', styleUrl: './admin-authors.component.css' }) -export class AdminAuthorsComponent { +export class AdminAuthorsComponent implements OnDestroy{ + authors: Author[] = []; + createAuthorDialogVisibility: boolean = false; + updateDialogVisibility: boolean[] = []; + deleteDialogVisibility: boolean[] = []; + subs: Subscription[] = []; + constructor(private authService: AuthService, + private authorService: AuthorService, + private messageService: MessageService) { + this.authorService.list().subscribe({ + next: (authors: Author[]) => { + this.authors = authors; + }, + error: (error: Error) => { + this.failureMessage("Erreur", error.message) + } + }) + } + + closeCreateAuthorDialog(author: Author): void { + this.authors.push(author); + this.createAuthorDialogVisibility = false; + } + + successMessage(summary: string, detail: string): void { + this.messageService.add({ + severity: 'success', + summary: summary, + detail: detail, + life: 3000, + closable: false + }); + } + + deleteAuthor(authorId: string, rowIndex: number): void { + + } + + openDialog(dialogBooleanTab: boolean[], index: number) { + dialogBooleanTab[index] = true; + } + + closeDialog(dialogBooleanTab: boolean[], index: number) { + dialogBooleanTab[index] = false; + } + + failureMessage(summary: string, detail: string): void { + this.messageService.add({ + severity: 'error', + summary: summary, + detail: detail, + life: 3000, + closable: false + }); + } + + ngOnDestroy(): void { + this.subs.forEach(sub => sub.unsubscribe()); + } } diff --git a/src/app/pages/home/home.component.html b/src/app/pages/home/home.component.html index 62715d8..b009070 100644 --- a/src/app/pages/home/home.component.html +++ b/src/app/pages/home/home.component.html @@ -16,4 +16,3 @@

Aucun post n'a été créé pour l'instant

} - diff --git a/src/app/pages/home/home.component.ts b/src/app/pages/home/home.component.ts index dc183e8..7d72096 100644 --- a/src/app/pages/home/home.component.ts +++ b/src/app/pages/home/home.component.ts @@ -7,7 +7,6 @@ import {ToastModule} from 'primeng/toast'; import {PostService} from '../../services/post.service'; import {PostHomeComponent} from '../../components/post-home/post-home.component'; import {AuthorWithPost} from '../../models/author-with-post'; -import {FooterComponent} from '../../components/footer/footer.component'; import {AuthService} from '../../auth.service'; @Component({ @@ -18,7 +17,6 @@ import {AuthService} from '../../auth.service'; HeaderComponent, ToastModule, PostHomeComponent, - FooterComponent ], templateUrl: './home.component.html', styleUrl: './home.component.css' diff --git a/src/app/pages/login/login.component.html b/src/app/pages/login/login.component.html index 5211dd8..5cf79e8 100644 --- a/src/app/pages/login/login.component.html +++ b/src/app/pages/login/login.component.html @@ -17,4 +17,3 @@ /> - diff --git a/src/app/pages/login/login.component.ts b/src/app/pages/login/login.component.ts index f67d88f..6dc34bf 100644 --- a/src/app/pages/login/login.component.ts +++ b/src/app/pages/login/login.component.ts @@ -10,7 +10,6 @@ import {Subscription, switchMap} from 'rxjs'; import {CookieService} from 'ngx-cookie-service'; import {HeaderComponent} from '../../components/header/header.component'; import {Router} from '@angular/router'; -import {FooterComponent} from '../../components/footer/footer.component'; import {ConfigurationService} from '../../configuration.service'; import {DateTime} from 'luxon'; @@ -23,7 +22,6 @@ import {DateTime} from 'luxon'; Button, ToastModule, HeaderComponent, - FooterComponent ], templateUrl: './login.component.html', styleUrl: './login.component.css' diff --git a/src/app/pages/logout/logout.component.ts b/src/app/pages/logout/logout.component.ts index 19f422e..3d9fb28 100644 --- a/src/app/pages/logout/logout.component.ts +++ b/src/app/pages/logout/logout.component.ts @@ -21,8 +21,7 @@ export class LogoutComponent implements OnInit{ private router: Router, private configurationService: ConfigurationService,) { } ngOnInit(): void { - console.log(this.cookieService.getAll()) - const routes: string[] = ['/', '/login', '/register', '/logout', '/profile', '/post', '/new-post'] + const routes: string[] = ['/', '/login', '/register', '/logout', '/profile', '/post', '/new-post', '/admin'] Object.keys(this.cookieService.getAll()).forEach(key => { routes.forEach(route => { this.cookieService.delete(key, route, this.configurationService.getServerAddress()); diff --git a/src/app/pages/my-posts/my-posts.component.html b/src/app/pages/my-posts/my-posts.component.html index 9dc84d1..cde8d1f 100644 --- a/src/app/pages/my-posts/my-posts.component.html +++ b/src/app/pages/my-posts/my-posts.component.html @@ -66,4 +66,3 @@ - diff --git a/src/app/pages/my-posts/my-posts.component.ts b/src/app/pages/my-posts/my-posts.component.ts index 41e3091..94932cc 100644 --- a/src/app/pages/my-posts/my-posts.component.ts +++ b/src/app/pages/my-posts/my-posts.component.ts @@ -13,7 +13,6 @@ import {InputTextModule} from 'primeng/inputtext'; import {PostHomeComponent} from '../../components/post-home/post-home.component'; import {PostService} from '../../services/post.service'; import {PostFormComponent} from "../../components/post-form/post-form.component"; -import {FooterComponent} from '../../components/footer/footer.component'; import {AuthService} from '../../auth.service'; @Component({ @@ -28,7 +27,6 @@ import {AuthService} from '../../auth.service'; InputTextModule, PostHomeComponent, PostFormComponent, - FooterComponent ], templateUrl: './my-posts.component.html', styleUrl: './my-posts.component.css' diff --git a/src/app/pages/new-post/new-post.component.html b/src/app/pages/new-post/new-post.component.html index 5f9de72..affd9f4 100644 --- a/src/app/pages/new-post/new-post.component.html +++ b/src/app/pages/new-post/new-post.component.html @@ -1,3 +1,2 @@ - diff --git a/src/app/pages/new-post/new-post.component.ts b/src/app/pages/new-post/new-post.component.ts index 9f46dd2..e33a27a 100644 --- a/src/app/pages/new-post/new-post.component.ts +++ b/src/app/pages/new-post/new-post.component.ts @@ -12,7 +12,6 @@ import {AuthorService} from '../../services/author.service'; import {Author} from '../../models/author'; import {Router} from '@angular/router'; import {PostFormComponent} from '../../components/post-form/post-form.component'; -import {FooterComponent} from '../../components/footer/footer.component'; import {AuthService} from '../../auth.service'; @Component({ @@ -26,7 +25,6 @@ import {AuthService} from '../../auth.service'; FileUploadModule, EditorModule, PostFormComponent, - FooterComponent ], templateUrl: './new-post.component.html', styleUrl: './new-post.component.css' diff --git a/src/app/pages/post/post.component.html b/src/app/pages/post/post.component.html index 73b3f87..b1e6cf0 100644 --- a/src/app/pages/post/post.component.html +++ b/src/app/pages/post/post.component.html @@ -70,7 +70,6 @@

{{ comment.content }}

} - } @else {

Loading...

} diff --git a/src/app/pages/post/post.component.ts b/src/app/pages/post/post.component.ts index 81fa62a..51610ab 100644 --- a/src/app/pages/post/post.component.ts +++ b/src/app/pages/post/post.component.ts @@ -13,7 +13,6 @@ import {CardModule} from 'primeng/card'; import {SafeHtmlPipe} from '../../pipes/safe-html-pipe'; import {Author} from '../../models/author'; import {CommentFormComponent} from '../../components/comment-form/comment-form.component'; -import {FooterComponent} from '../../components/footer/footer.component'; import {Button} from 'primeng/button'; import {DialogModule} from 'primeng/dialog'; import {AuthService} from '../../auth.service'; @@ -28,7 +27,6 @@ import {AuthService} from '../../auth.service'; CardModule, SafeHtmlPipe, CommentFormComponent, - FooterComponent, Button, DialogModule ], diff --git a/src/app/pages/profile/profile.component.html b/src/app/pages/profile/profile.component.html index ecdbf9d..cd066c9 100644 --- a/src/app/pages/profile/profile.component.html +++ b/src/app/pages/profile/profile.component.html @@ -32,4 +32,3 @@ } @else {

Loading...

} - diff --git a/src/app/pages/profile/profile.component.ts b/src/app/pages/profile/profile.component.ts index de4ac47..ad47caf 100644 --- a/src/app/pages/profile/profile.component.ts +++ b/src/app/pages/profile/profile.component.ts @@ -9,7 +9,6 @@ import {CardModule} from 'primeng/card'; import {Button} from 'primeng/button'; import {DialogModule} from 'primeng/dialog'; import {UpdateProfileFormComponent} from '../../components/update-profile-form/update-profile-form.component'; -import {FooterComponent} from '../../components/footer/footer.component'; import {AuthService} from '../../auth.service'; @Component({ @@ -22,7 +21,6 @@ import {AuthService} from '../../auth.service'; Button, DialogModule, UpdateProfileFormComponent, - FooterComponent ], templateUrl: './profile.component.html', styleUrl: './profile.component.css' diff --git a/src/app/pages/register/register.component.html b/src/app/pages/register/register.component.html index 341629b..fd6a941 100644 --- a/src/app/pages/register/register.component.html +++ b/src/app/pages/register/register.component.html @@ -1,3 +1,2 @@ - diff --git a/src/app/pages/register/register.component.ts b/src/app/pages/register/register.component.ts index 513f745..eac01c6 100644 --- a/src/app/pages/register/register.component.ts +++ b/src/app/pages/register/register.component.ts @@ -1,8 +1,6 @@ import { Component } from '@angular/core'; import {HeaderComponent} from '../../components/header/header.component'; import {RegisterFormComponent} from '../../components/register-form/register-form.component'; -import {Footer} from "primeng/api"; -import {FooterComponent} from '../../components/footer/footer.component'; @Component({ selector: 'app-register', @@ -10,8 +8,6 @@ import {FooterComponent} from '../../components/footer/footer.component'; imports: [ HeaderComponent, RegisterFormComponent, - Footer, - FooterComponent ], templateUrl: './register.component.html', styleUrl: './register.component.css' diff --git a/src/app/services/author.service.ts b/src/app/services/author.service.ts index b152a32..a594b7f 100644 --- a/src/app/services/author.service.ts +++ b/src/app/services/author.service.ts @@ -83,7 +83,12 @@ export class AuthorService { return this.httpClient.post(`${this.apiUrl}/register`, {name: username, password: password}) } - createAccountAdmin(username: string, password: string, role: string): Observable { - return this.httpClient.post(`${this.apiUrl}/register`, {name: username, password: password, role: role}) + createAccountAdmin(username: string, password: string, role: string, token: string): Observable { + const httpOptions = { + headers: new HttpHeaders({ + 'Authorization': `Bearer ${token}` + }) + } + return this.httpClient.post(`${this.apiUrl}/register/admin`, {name: username, password: password, role: role}, httpOptions); } } diff --git a/src/app/services/post.service.ts b/src/app/services/post.service.ts index a519adf..40e11f4 100644 --- a/src/app/services/post.service.ts +++ b/src/app/services/post.service.ts @@ -64,7 +64,6 @@ export class PostService { 'Authorization': `Bearer ${token}` }) }; - console.log(image); return this.httpClient.put(`${this.apiUrl}/${id}/illustration`, formData, httpOptions); } else { throw new Error('Image doesn\'t exist'); diff --git a/src/index.html b/src/index.html index f216df2..ac9c996 100644 --- a/src/index.html +++ b/src/index.html @@ -5,9 +5,19 @@ A BON ENTENDEUR - + + diff --git a/src/styles.css b/src/styles.css index e0eb2ba..1142a0d 100644 --- a/src/styles.css +++ b/src/styles.css @@ -2,3 +2,54 @@ @import '../node_modules/primeicons/primeicons.css'; @import '../node_modules/quill/dist/quill.bubble.css'; @import '../node_modules/quill/dist/quill.snow.css'; + +body { + min-height: 1920px; +} + +.footer { + background-color: #1c1c1c; + color: #f1f1f1; + padding: 20px; + text-align: center; + font-size: 14px; +} + +.footer-creator, +.footer-banner, +.footer-follow, +.footer-links, +.footer-copyright { + margin: 5px 0; +} + +html, body { + height: 100%; + margin: 0; + display: flex; + flex-direction: column; +} + +app-root { + flex: 1; + display: flex; + flex-direction: column; +} + +.footer { + width: 100%; + text-align: center; + padding: 10px; + background: #222; + color: white; +} + +.footer-link { + color: #1e90ff; + text-decoration: none; + margin: 0 10px; +} + +.footer-link:hover { + text-decoration: underline; +}