diff --git a/src/app/app.routes.ts b/src/app/app.routes.ts index d525b5a..4720348 100644 --- a/src/app/app.routes.ts +++ b/src/app/app.routes.ts @@ -1,7 +1,7 @@ import {Routes} from '@angular/router'; import {LoginComponent} from './pages/login/login.component'; import {HomeComponent} from './pages/home/home.component'; -import {RegisterComponent} from './pages/register/register.component'; +import {RegisterFormComponent} from './components/register-form/register-form.component'; import {LogoutComponent} from './pages/logout/logout.component'; import {NotFoundComponent} from './pages/not-found/not-found.component'; import {authGuard} from './guards/auth.guard'; @@ -10,11 +10,12 @@ import {NewPostComponent} from './pages/new-post/new-post.component'; import {writerGuard} from './guards/writer.guard'; import {PostComponent} from './pages/post/post.component'; import {MyPostsComponent} from './pages/my-posts/my-posts.component'; +import {RegisterComponent} from './pages/register/register.component'; export const routes: Routes = [ {path: '', component: HomeComponent}, {path: 'login', component: LoginComponent, canActivate: [authGuard]}, - {path: 'register', component: RegisterComponent, canActivate: [authGuard]}, + {path: 'register', component: RegisterComponent, canActivate: [authGuard]}, {path: 'logout', component: LogoutComponent}, {path: 'profile/:authorId', component: ProfileComponent}, {path: 'post/:postId', component: PostComponent}, diff --git a/src/app/components/register-form/register-form.component.css b/src/app/components/register-form/register-form.component.css new file mode 100644 index 0000000..ce9d921 --- /dev/null +++ b/src/app/components/register-form/register-form.component.css @@ -0,0 +1,18 @@ +.form-container { + margin-top: 2em; + display: flex; + justify-content: center; + align-items: center; +} + +.form { + width: 100%; + max-width: 50em; + display: flex; + flex-direction: column; + gap:1em; +} + +.send-button { + align-self: center; +} diff --git a/src/app/components/register-form/register-form.component.html b/src/app/components/register-form/register-form.component.html new file mode 100644 index 0000000..ebb3265 --- /dev/null +++ b/src/app/components/register-form/register-form.component.html @@ -0,0 +1,14 @@ +
+
+ + + + + + + + + + +
diff --git a/src/app/components/register-form/register-form.component.ts b/src/app/components/register-form/register-form.component.ts new file mode 100644 index 0000000..d00b576 --- /dev/null +++ b/src/app/components/register-form/register-form.component.ts @@ -0,0 +1,92 @@ +import {Component, Input, OnDestroy, OnInit} from '@angular/core'; +import {HeaderComponent} from '../header/header.component'; +import {Subscription} from 'rxjs'; +import {FormBuilder, FormGroup, FormsModule, ReactiveFormsModule, Validators} from '@angular/forms'; +import {InputTextModule} from 'primeng/inputtext'; +import {SelectButtonModule} from 'primeng/selectbutton'; +import {Button} from 'primeng/button'; +import {AuthorService} from '../../services/author.service'; +import {Router} from '@angular/router'; +import {MessageService} from 'primeng/api'; + +@Component({ + selector: 'app-register-form', + standalone: true, + imports: [ + HeaderComponent, + ReactiveFormsModule, + InputTextModule, + SelectButtonModule, + FormsModule, + Button + ], + templateUrl: './register-form.component.html', + styleUrl: './register-form.component.css' +}) +export class RegisterFormComponent implements OnDestroy { + @Input() username: string = ""; + @Input() password: string = ""; + @Input() passwordConfirm: string = ""; + @Input() role: string = "READER" + @Input() adminForm: boolean = false; + roles = [ + {name: 'Lecteur', value: 'READER'}, + {name: 'Écrivain', value: 'WRITER'} + ]; + subs: Subscription[] = []; + form: FormGroup; + + constructor(private formBuilder: FormBuilder, + private authorService: AuthorService, + private router: Router, + private messageService: MessageService + ) { + 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)]], + }); + } + + successMessage(summary: string, detail: string): void { + this.messageService.add({ + severity: 'success', + summary, + detail, + life: 3000, + closable: false + }); + } + + failureMessage(summary: string, detail: string): void { + this.messageService.add({ + severity: 'error', + summary, + detail, + life: 3000, + closable: false + }); + } + + onSubmit() { + if (this.form.valid && this.password === this.passwordConfirm) { + if (this.adminForm) { + this.authorService.createAccountAdmin(this.username, this.password, this.role); //TODO à finir + } 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')), + error: (err) => this.failureMessage('Erreur', err.message) + + })); + } + } + } + + + ngOnDestroy(): void { + this.subs.forEach((sub: Subscription) => sub.unsubscribe()); + } + + +} diff --git a/src/app/pages/login/login.component.css b/src/app/pages/login/login.component.css index ce9d921..4712463 100644 --- a/src/app/pages/login/login.component.css +++ b/src/app/pages/login/login.component.css @@ -16,3 +16,7 @@ .send-button { align-self: center; } + +#role { + width: 100%; +} diff --git a/src/app/pages/login/login.component.html b/src/app/pages/login/login.component.html index 76e243f..e3ba48c 100644 --- a/src/app/pages/login/login.component.html +++ b/src/app/pages/login/login.component.html @@ -2,11 +2,11 @@
- + - + - - -

register works!

+ diff --git a/src/app/pages/register/register.component.ts b/src/app/pages/register/register.component.ts index e0d4800..014d56d 100644 --- a/src/app/pages/register/register.component.ts +++ b/src/app/pages/register/register.component.ts @@ -1,11 +1,13 @@ import { Component } from '@angular/core'; import {HeaderComponent} from '../../components/header/header.component'; +import {RegisterFormComponent} from '../../components/register-form/register-form.component'; @Component({ selector: 'app-register', standalone: true, imports: [ - HeaderComponent + HeaderComponent, + RegisterFormComponent ], 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 4be9556..02ec70f 100644 --- a/src/app/services/author.service.ts +++ b/src/app/services/author.service.ts @@ -50,4 +50,12 @@ export class AuthorService { }; return this.httpClient.get(`${this.url}/${id}/posts`, httpOptions); } + + createAccount(username: string, password: string): Observable { + return this.httpClient.post(`${this.url}/register`, {name: username, password: password}) + } + + createAccountAdmin(username: string, password: string, role: string): Observable { + return this.httpClient.post(`${this.url}/register`, {name: username, password: password, role: role}) + } }