From 2e357e1b594f21d32604eab7f1140b8b255cec6e Mon Sep 17 00:00:00 2001 From: guams Date: Wed, 7 May 2025 19:50:04 +0200 Subject: [PATCH] Ajout d'un composant de chargement et update du formulaire --- .../components/loading/loading.component.css | 24 ++++++++ .../components/loading/loading.component.html | 3 + .../components/loading/loading.component.ts | 15 +++++ .../preview-modal/preview-modal.component.css | 0 .../preview-modal.component.html | 15 +++++ .../preview-modal/preview-modal.component.ts | 21 +++++++ .../update-modal/update-modal.component.css | 0 .../update-modal/update-modal.component.html | 15 +++++ .../update-modal/update-modal.component.ts | 33 ++++++++++ .../post-form/post-form.component.html | 57 +++++++++++++++--- .../post-form/post-form.component.ts | 20 +++--- src/app/pages/home/home.component.html | 2 +- src/app/pages/home/home.component.ts | 2 + src/app/pages/login/login.component.html | 5 +- src/app/pages/login/login.component.ts | 47 +++++++-------- .../pages/my-posts/my-posts.component.html | 23 +------ src/app/pages/my-posts/my-posts.component.ts | 25 +++++++- src/app/pages/profile/profile.component.html | 2 +- src/app/pages/profile/profile.component.ts | 2 + src/app/services/author.service.ts | 4 ++ src/assets/icon.jpg | Bin 0 -> 32320 bytes 21 files changed, 243 insertions(+), 72 deletions(-) create mode 100644 src/app/components/loading/loading.component.css create mode 100644 src/app/components/loading/loading.component.html create mode 100644 src/app/components/loading/loading.component.ts create mode 100644 src/app/components/modal/preview-modal/preview-modal.component.css create mode 100644 src/app/components/modal/preview-modal/preview-modal.component.html create mode 100644 src/app/components/modal/preview-modal/preview-modal.component.ts create mode 100644 src/app/components/modal/update-modal/update-modal.component.css create mode 100644 src/app/components/modal/update-modal/update-modal.component.html create mode 100644 src/app/components/modal/update-modal/update-modal.component.ts create mode 100644 src/assets/icon.jpg diff --git a/src/app/components/loading/loading.component.css b/src/app/components/loading/loading.component.css new file mode 100644 index 0000000..22d260e --- /dev/null +++ b/src/app/components/loading/loading.component.css @@ -0,0 +1,24 @@ +div { + margin-top: 10em; + display: flex; + justify-content: center; + align-items: center; +} + +img { + animation-name: spin; + animation-duration: 2000ms; + animation-iteration-count: infinite; + animation-timing-function: linear; + max-width: 40%; + max-height: 40%; +} + +@keyframes spin { + from { + transform:rotate(0deg); + } + to { + transform:rotate(360deg); + } +} diff --git a/src/app/components/loading/loading.component.html b/src/app/components/loading/loading.component.html new file mode 100644 index 0000000..29e6720 --- /dev/null +++ b/src/app/components/loading/loading.component.html @@ -0,0 +1,3 @@ +
+ loadign +
diff --git a/src/app/components/loading/loading.component.ts b/src/app/components/loading/loading.component.ts new file mode 100644 index 0000000..0e1870f --- /dev/null +++ b/src/app/components/loading/loading.component.ts @@ -0,0 +1,15 @@ +import { Component } from '@angular/core'; +import {NgOptimizedImage} from '@angular/common'; + +@Component({ + selector: 'app-loading', + standalone: true, + imports: [ + NgOptimizedImage + ], + templateUrl: './loading.component.html', + styleUrl: './loading.component.css' +}) +export class LoadingComponent { + +} diff --git a/src/app/components/modal/preview-modal/preview-modal.component.css b/src/app/components/modal/preview-modal/preview-modal.component.css new file mode 100644 index 0000000..e69de29 diff --git a/src/app/components/modal/preview-modal/preview-modal.component.html b/src/app/components/modal/preview-modal/preview-modal.component.html new file mode 100644 index 0000000..5554195 --- /dev/null +++ b/src/app/components/modal/preview-modal/preview-modal.component.html @@ -0,0 +1,15 @@ +@if (post) { + + + +} diff --git a/src/app/components/modal/preview-modal/preview-modal.component.ts b/src/app/components/modal/preview-modal/preview-modal.component.ts new file mode 100644 index 0000000..c446233 --- /dev/null +++ b/src/app/components/modal/preview-modal/preview-modal.component.ts @@ -0,0 +1,21 @@ +import {Component, Input} from '@angular/core'; +import {Dialog} from 'primeng/dialog'; +import {PostHomeComponent} from '../../post-home/post-home.component'; +import {Post} from '../../../models/post'; + +@Component({ + selector: 'app-preview-modal', + standalone: true, + imports: [ + Dialog, + PostHomeComponent + ], + templateUrl: './preview-modal.component.html', + styleUrl: './preview-modal.component.css' +}) +export class PreviewModalComponent { + opened: boolean = true; + @Input({required: true}) post: Post | undefined; + @Input() username: string = ''; + @Input() profilePicture: string = ''; +} diff --git a/src/app/components/modal/update-modal/update-modal.component.css b/src/app/components/modal/update-modal/update-modal.component.css new file mode 100644 index 0000000..e69de29 diff --git a/src/app/components/modal/update-modal/update-modal.component.html b/src/app/components/modal/update-modal/update-modal.component.html new file mode 100644 index 0000000..1f4b39a --- /dev/null +++ b/src/app/components/modal/update-modal/update-modal.component.html @@ -0,0 +1,15 @@ +@if (post) { + + + +} diff --git a/src/app/components/modal/update-modal/update-modal.component.ts b/src/app/components/modal/update-modal/update-modal.component.ts new file mode 100644 index 0000000..3e55abc --- /dev/null +++ b/src/app/components/modal/update-modal/update-modal.component.ts @@ -0,0 +1,33 @@ +import {Component, EventEmitter, Input, Output} from '@angular/core'; +import {Dialog} from 'primeng/dialog'; +import {PostFormComponent} from '../../post-form/post-form.component'; +import {Post} from '../../../models/post'; +import {AuthService} from '../../../auth.service'; +import {Author} from '../../../models/author'; + +@Component({ + selector: 'app-update-modal', + standalone: true, + imports: [ + Dialog, + PostFormComponent + ], + templateUrl: './update-modal.component.html', + styleUrl: './update-modal.component.css' +}) +export class UpdateModalComponent { + actualAuthor: Author | undefined; + opened: boolean = true; + @Input({required: true}) post: Post | undefined; + @Output() updatedPost: EventEmitter = new EventEmitter(); + + constructor(private authService: AuthService) { + this.authService.getAuthenticatedAuthor(); + } + + + onSubmit(updatedPost: Post) { + this.updatedPost.emit(updatedPost); + this.opened = false + } +} diff --git a/src/app/components/post-form/post-form.component.html b/src/app/components/post-form/post-form.component.html index 0fdaae2..a2eace2 100644 --- a/src/app/components/post-form/post-form.component.html +++ b/src/app/components/post-form/post-form.component.html @@ -1,13 +1,20 @@
- - + + + + - - + + + + + + + + + - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + = new EventEmitter(); subs: Subscription[] = []; form: FormGroup; uploadedFile: File | undefined; - editorModules = { - toolbar: [ - ['bold', 'italic', 'underline', 'code'], // Styles de texte - [{header: [2, false]}], // Permet d'ajouter un `

` - [{list: 'ordered'}, {list: 'bullet'}], // Listes - ['link', 'image', 'video'], // Ajout de liens et images - ], - }; constructor( private formBuilder: FormBuilder, @@ -111,6 +109,7 @@ export class PostFormComponent implements OnDestroy { }) ).subscribe({ next: (_) => { + this.postUpdate.emit(_); this.successMessage('Succès', 'Post mis à jour avec succès') }, error: (err) => this.failureMessage('Erreur', err.error.message) @@ -140,6 +139,7 @@ export class PostFormComponent implements OnDestroy { } private transformYouTubeLinksToIframes(html: string): string { + // Magie noire return html.replace(/]*href="(https?:\/\/(?:www\.)?(youtube\.com\/watch\?v=|youtu\.be\/|youtube\.com\/embed\/)([a-zA-Z0-9_-]+)[^"]*)".*?<\/a>/g, (_, _url, _prefix, videoId) => { return ``; diff --git a/src/app/pages/home/home.component.html b/src/app/pages/home/home.component.html index b009070..c955c3e 100644 --- a/src/app/pages/home/home.component.html +++ b/src/app/pages/home/home.component.html @@ -13,6 +13,6 @@ [authorProfilePicture]="post.authorProfilePicture"/> } } @else { -

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 7fc4c66..6dd83fa 100644 --- a/src/app/pages/home/home.component.ts +++ b/src/app/pages/home/home.component.ts @@ -8,6 +8,7 @@ import {PostService} from '../../services/post.service'; import {PostHomeComponent} from '../../components/post-home/post-home.component'; import {AuthorWithPost} from '../../models/author-with-post'; import {AuthService} from '../../auth.service'; +import {LoadingComponent} from '../../components/loading/loading.component'; @Component({ selector: 'app-home', @@ -17,6 +18,7 @@ import {AuthService} from '../../auth.service'; HeaderComponent, ToastModule, PostHomeComponent, + LoadingComponent, ], 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 5cf79e8..c8c934e 100644 --- a/src/app/pages/login/login.component.html +++ b/src/app/pages/login/login.component.html @@ -5,10 +5,7 @@ - - - + { - // sessionStorage.removeItem('token'); - sessionStorage.setItem('token', tokenObj.token); - return this.authorService.me(tokenObj.token) - })) - .subscribe({ - next: (author: Author) => { - // sessionStorage.removeItem('author'); - sessionStorage.setItem('author', JSON.stringify(author)); - sessionStorage.setItem('token-expiration-date', DateTime.now().plus({millisecond: this.configurationService.getTokenTTL()}).toISO()) - this.getAuthorCookie(); - this.router.navigate(['/']).then(() => { - this.successMessage('Connecté avec succès', 'Heureux de vous revoir ' + this.actualAuthor?.name) - }); - }, - error: (err) => this.failureMessage('Erreur de connexion', err.error.message) - }) - ); - } else { - this.failureMessage('Erreur de connexion', 'Les deux mots de passe ne correspondent pas') - } + this.subs.push + ( + this.authorService.login(this.name, this.password).pipe( + switchMap((tokenObj: any) => { + // sessionStorage.removeItem('token'); + sessionStorage.setItem('token', tokenObj.token); + return this.authorService.me(tokenObj.token) + })) + .subscribe({ + next: (author: Author) => { + // sessionStorage.removeItem('author'); + sessionStorage.setItem('author', JSON.stringify(author)); + sessionStorage.setItem('token-expiration-date', DateTime.now().plus({millisecond: this.configurationService.getTokenTTL()}).toISO()) + this.getAuthorCookie(); + this.router.navigate(['/']).then(() => { + this.successMessage('Connecté avec succès', 'Heureux de vous revoir ' + this.actualAuthor?.name) + }); + }, + error: (err) => this.failureMessage('Erreur de connexion', err.error.message) + }) + ); } getAuthorCookie(): void { diff --git a/src/app/pages/my-posts/my-posts.component.html b/src/app/pages/my-posts/my-posts.component.html index 1ac4c4d..dc8118e 100644 --- a/src/app/pages/my-posts/my-posts.component.html +++ b/src/app/pages/my-posts/my-posts.component.html @@ -23,29 +23,10 @@ {{ post.publicationDate | date: "dd/MM/yyyy à HH:mm" }} {{ post.description }} - - - - + - - - - + this.actualAuthor!.profilePicture = avatar); } this.updatePosts(); } @@ -98,6 +101,24 @@ export class MyPostsComponent implements OnDestroy { }); } + openDialogPreview(post: Post): void { + const modalInstance = this.viewContainer.createComponent(PreviewModalComponent); + modalInstance.setInput("post", post) + modalInstance.setInput("username", this.actualAuthor?.name) + modalInstance.setInput("profilePicture", this.actualAuthor?.profilePicture) + } + + openDialogUpdate(post: Post): void { + const modalInstance = this.viewContainer.createComponent(UpdateModalComponent); + modalInstance.setInput("post", post) + modalInstance.instance.updatedPost.subscribe(post => { + console.log(this.posts.map(a => a.id).indexOf(post.id)) + this.posts[this.posts.map(a => a.id).indexOf(post.id)] = post + this.posts = [... this.posts] + modalInstance.destroy(); + }); + } + openDialog(dialogBooleanTab: boolean[], index: number) { dialogBooleanTab[index] = true; } diff --git a/src/app/pages/profile/profile.component.html b/src/app/pages/profile/profile.component.html index cd066c9..d2bf924 100644 --- a/src/app/pages/profile/profile.component.html +++ b/src/app/pages/profile/profile.component.html @@ -30,5 +30,5 @@ } @else { -

Loading...

+ } diff --git a/src/app/pages/profile/profile.component.ts b/src/app/pages/profile/profile.component.ts index adf896b..937db53 100644 --- a/src/app/pages/profile/profile.component.ts +++ b/src/app/pages/profile/profile.component.ts @@ -10,6 +10,7 @@ import {Button} from 'primeng/button'; import {DialogModule} from 'primeng/dialog'; import {UpdateProfileFormComponent} from '../../components/update-profile-form/update-profile-form.component'; import {AuthService} from '../../auth.service'; +import {LoadingComponent} from '../../components/loading/loading.component'; @Component({ selector: 'app-profile', @@ -21,6 +22,7 @@ import {AuthService} from '../../auth.service'; Button, DialogModule, UpdateProfileFormComponent, + LoadingComponent, ], templateUrl: './profile.component.html', styleUrl: './profile.component.css' diff --git a/src/app/services/author.service.ts b/src/app/services/author.service.ts index a594b7f..f25fae1 100644 --- a/src/app/services/author.service.ts +++ b/src/app/services/author.service.ts @@ -91,4 +91,8 @@ export class AuthorService { } return this.httpClient.post(`${this.apiUrl}/register/admin`, {name: username, password: password, role: role}, httpOptions); } + + getAuthorAvatar(id: string) { + return this.httpClient.get(`${this.apiUrl}/${id}/avatar`); + } } diff --git a/src/assets/icon.jpg b/src/assets/icon.jpg new file mode 100644 index 0000000000000000000000000000000000000000..7da39e5f0e527e53cd9467ae7c631522382581b7 GIT binary patch literal 32320 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