From 0390c458869fc0ee1a628388f224de20d073df12 Mon Sep 17 00:00:00 2001 From: AlineRinquin <90188226+AlineRinquin@users.noreply.github.com> Date: Sat, 22 Jan 2022 14:57:04 +0100 Subject: [PATCH 1/2] =?UTF-8?q?recup=20du=20stach=20et=20fonctionalit?= =?UTF-8?q?=C3=A9e=20modifier=20contact?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/app/app-routing.module.ts | 5 +- .../fiche-contact.component.html | 2 +- .../page-modifier-contact.component.html | 83 ++++++++++++++++++- .../page-modifier-contact.component.scss | 26 ++++++ .../page-modifier-contact.component.ts | 79 +++++++++++++++++- src/app/services/repertoire.service.ts | 10 ++- 6 files changed, 195 insertions(+), 10 deletions(-) diff --git a/src/app/app-routing.module.ts b/src/app/app-routing.module.ts index f33fc52..4cbae19 100644 --- a/src/app/app-routing.module.ts +++ b/src/app/app-routing.module.ts @@ -10,6 +10,7 @@ import { PageDashboardComponent } from './pages/page-dashboard/page-dashboard.co import { PageDeleteMemberComponent } from './pages/page-delete-member/page-delete-member.component'; import { PageForgotPasswordComponent } from './pages/page-forgot-password/page-forgot-password.component'; import { PageMenuSemaineComponent } from './pages/page-menu-semaine/page-menu-semaine.component'; +import { PageModifierContactComponent } from './pages/page-modifier-contact/page-modifier-contact.component'; import { PageNotFoundComponent } from './pages/page-not-found/page-not-found.component'; import { PageRepertoireComponent } from './pages/page-repertoire/page-repertoire.component'; import { PageResetPasswordComponent } from './pages/page-reset-password/page-reset-password.component'; @@ -33,8 +34,8 @@ const routes: Routes = [ { path: 'to-do-list', component: PageToDoListComponent }, { path: 'modifier-membre', component: PageUpdateMemberComponent }, { path: 'ajouter-contact', component: PageAjoutContactComponent }, - { path: 'modifier-contact', component: PageAjoutContactComponent }, - { path: 'creation-team', component : PageCreationTeamComponent}, + { path: 'creation-team', component: PageCreationTeamComponent }, + { path: 'modifier-contact', component: PageModifierContactComponent }, { path: '**', component: PageNotFoundComponent }, ]; diff --git a/src/app/components/fiche-contact/fiche-contact.component.html b/src/app/components/fiche-contact/fiche-contact.component.html index 5672e50..42ae5da 100644 --- a/src/app/components/fiche-contact/fiche-contact.component.html +++ b/src/app/components/fiche-contact/fiche-contact.component.html @@ -1,7 +1,7 @@
-
diff --git a/src/app/pages/page-modifier-contact/page-modifier-contact.component.html b/src/app/pages/page-modifier-contact/page-modifier-contact.component.html index f63276c..c5b4b08 100644 --- a/src/app/pages/page-modifier-contact/page-modifier-contact.component.html +++ b/src/app/pages/page-modifier-contact/page-modifier-contact.component.html @@ -1 +1,82 @@ -

page-modifier-contact works!

+
+ + +
+
+
+
+

Modifier ce contact

+ + +
+ + + + +
+
+ + + + +
+
+ + + + +
+
+ + +
+ + +
+ + +
+ + +
+ + +
+ + + +
+
+
\ No newline at end of file diff --git a/src/app/pages/page-modifier-contact/page-modifier-contact.component.scss b/src/app/pages/page-modifier-contact/page-modifier-contact.component.scss index e69de29..b3720e0 100644 --- a/src/app/pages/page-modifier-contact/page-modifier-contact.component.scss +++ b/src/app/pages/page-modifier-contact/page-modifier-contact.component.scss @@ -0,0 +1,26 @@ +.login-form { + height: 100vh; + padding-top: 40px; + background-color: #f5f5f5; +} + +.form-modifContact { + width: 100%; + max-width: 330px; + padding: 15px; + margin: auto; +} + +.form-modifContact .checkbox { + font-weight: 400; +} + +.form-modifContact .form-floating:focus-within { + z-index: 2; +} + +.form-modifContact input[type="email"] { + margin-bottom: -1px; + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; +} diff --git a/src/app/pages/page-modifier-contact/page-modifier-contact.component.ts b/src/app/pages/page-modifier-contact/page-modifier-contact.component.ts index b5c46df..7b1d5e1 100644 --- a/src/app/pages/page-modifier-contact/page-modifier-contact.component.ts +++ b/src/app/pages/page-modifier-contact/page-modifier-contact.component.ts @@ -1,15 +1,88 @@ import { Component, OnInit } from '@angular/core'; +import { + FormBuilder, + FormControl, + FormGroup, + Validators, +} from '@angular/forms'; +import { Router } from '@angular/router'; +import { Contact } from '../../models/contact'; +import { RepertoireService } from '../../services/repertoire.service'; @Component({ selector: 'app-page-modifier-contact', templateUrl: './page-modifier-contact.component.html', - styleUrls: ['./page-modifier-contact.component.scss'] + styleUrls: ['./page-modifier-contact.component.scss'], }) export class PageModifierContactComponent implements OnInit { + public modifContactForm: FormGroup; + public contactInfo: FormGroup; - constructor() { } + constructor( + private repertoireService: RepertoireService, + private router: Router, + private fb: FormBuilder + ) { + this.modifContactForm = new FormGroup({}); + this.contactInfo = this.initForm(); - ngOnInit(): void { + // this.repertoireService.getContactById()?.subscribe((contact: Contact) => { + // this.contactInfo = this.initForm(contact); + // }); } + ngOnInit(): void { + // *********************************pensser a changer group car déprécié******************************** + this.modifContactForm = this.fb.group({ + lastNameFc: new FormControl('', [Validators.required]), + firstNameFc: new FormControl('', [Validators.required]), + telephoneFc: new FormControl('', [Validators.required]), + emailFc: new FormControl('', [ + Validators.email, + Validators.required, + Validators.pattern(/^([\w\.\-_]+)?\w+@[\w-_]+(\.\w+){1,}/gim), + ]), // chercher une meilleure regex + dateNaissanceFc: new FormControl('', [Validators.required]), + adresseFc: new FormControl('', [Validators.required]), + }); + } + + private initForm(contact?: Contact): FormGroup { + return this.fb.group({ + firstName: [contact ? contact.nom : ''], + lastName: [contact ? contact.prenom : ''], + telephone: [contact ? contact.telephone : ''], + email: [contact ? contact.email : ''], + dateNaissance: [contact ? contact.dateNaissance : ''], + adresse: [contact ? contact.adresse : ''], + }); + } + + public onSubmit(): void { + console.log('value : ', this.modifContactForm.value); + console.log('form : ', this.modifContactForm); + const firstNameValue = this.modifContactForm.value['firstNameFc']; + const lastNameValue = this.modifContactForm.value['lastNameFc']; + const telephoneValue = this.modifContactForm.value['telephoneFc']; + const emailValue = this.modifContactForm.value['emailFc']; + const dateNaissanceValue = this.modifContactForm.value['dateNaissanceFc']; + const adresseValue = this.modifContactForm.value['adresseFc']; + + const contact: Contact = { + nom: lastNameValue, + prenom: firstNameValue, + telephone: telephoneValue, + email: emailValue, + dateNaissance: dateNaissanceValue, + adresse: adresseValue, + }; + + if (contact.nom !== '') { + this.repertoireService.updateContact(contact).subscribe((resp) => { + this.router.navigate(['repertoire/']); + }); + } else { + // affichage erreur + } + } } diff --git a/src/app/services/repertoire.service.ts b/src/app/services/repertoire.service.ts index eb07eda..1b1713a 100644 --- a/src/app/services/repertoire.service.ts +++ b/src/app/services/repertoire.service.ts @@ -21,6 +21,10 @@ export class RepertoireService { return this.http.get(`${this.apiUrl}/contacts/team/1`); } + getContactById(contact: Contact): Observable { + return this.http.get(`${this.apiUrl}/contacts/{id}`); + } + addContact(contact: Contact): Observable { console.log(contact); @@ -31,7 +35,7 @@ export class RepertoireService { return this.http.delete(`${this.apiUrl}/contacts/delete`); } - // updateContact(){ - // return this.http.put(`${this.apiUrl}/contacts/update/1`); - // } + updateContact(contact: Contact): Observable { + return this.http.put(`${this.apiUrl}/contacts/update/1`, contact); + } } From a723a02a56d7cbf0644a827380df4fdc4b4895fb Mon Sep 17 00:00:00 2001 From: AlineRinquin <90188226+AlineRinquin@users.noreply.github.com> Date: Sun, 23 Jan 2022 15:08:17 +0100 Subject: [PATCH 2/2] Fonctionn modifier contact ok --- src/app/app-routing.module.ts | 2 +- .../fiche-contact.component.html | 2 +- src/app/models/contact.ts | 2 + .../page-ajout-contact.component.html | 2 +- .../page-ajout-contact.component.scss | 5 +++ .../page-ajout-contact.component.ts | 4 +- .../page-modifier-contact.component.html | 15 +++---- .../page-modifier-contact.component.scss | 5 +++ .../page-modifier-contact.component.ts | 38 +++++++++++------- .../page-not-found.component.html | 4 +- .../page-repertoire.component.ts | 25 +++++++++++- src/app/services/repertoire.service.ts | 8 ++-- src/assets/images/adresse.jpg | Bin 11538 -> 0 bytes 13 files changed, 80 insertions(+), 32 deletions(-) delete mode 100644 src/assets/images/adresse.jpg diff --git a/src/app/app-routing.module.ts b/src/app/app-routing.module.ts index 4cbae19..4587264 100644 --- a/src/app/app-routing.module.ts +++ b/src/app/app-routing.module.ts @@ -20,6 +20,7 @@ import { PageUpdateMemberComponent } from './pages/page-update-member/page-updat const routes: Routes = [ { path: '', redirectTo: 'accueil', pathMatch: 'full' }, + { path: 'modifier-contact/:id', component: PageModifierContactComponent }, { path: 'compte', component: PageAccountComponent }, { path: 'accueil', component: PageAccueilComponent }, { path: 'ajout-membre', component: PageAddMemberComponent }, @@ -35,7 +36,6 @@ const routes: Routes = [ { path: 'modifier-membre', component: PageUpdateMemberComponent }, { path: 'ajouter-contact', component: PageAjoutContactComponent }, { path: 'creation-team', component: PageCreationTeamComponent }, - { path: 'modifier-contact', component: PageModifierContactComponent }, { path: '**', component: PageNotFoundComponent }, ]; diff --git a/src/app/components/fiche-contact/fiche-contact.component.html b/src/app/components/fiche-contact/fiche-contact.component.html index 42ae5da..1d4eb48 100644 --- a/src/app/components/fiche-contact/fiche-contact.component.html +++ b/src/app/components/fiche-contact/fiche-contact.component.html @@ -1,7 +1,7 @@
-
diff --git a/src/app/models/contact.ts b/src/app/models/contact.ts index 2c632a4..539aab3 100644 --- a/src/app/models/contact.ts +++ b/src/app/models/contact.ts @@ -1,8 +1,10 @@ export interface Contact { + id: string; nom: string; prenom: string; telephone: string; email: string; adresse: string; dateNaissance: Date; + team: any; } diff --git a/src/app/pages/page-ajout-contact/page-ajout-contact.component.html b/src/app/pages/page-ajout-contact/page-ajout-contact.component.html index 30c5a21..981a9c2 100644 --- a/src/app/pages/page-ajout-contact/page-ajout-contact.component.html +++ b/src/app/pages/page-ajout-contact/page-ajout-contact.component.html @@ -73,7 +73,7 @@
- diff --git a/src/app/pages/page-ajout-contact/page-ajout-contact.component.scss b/src/app/pages/page-ajout-contact/page-ajout-contact.component.scss index ca7893e..0f5ceb6 100644 --- a/src/app/pages/page-ajout-contact/page-ajout-contact.component.scss +++ b/src/app/pages/page-ajout-contact/page-ajout-contact.component.scss @@ -24,3 +24,8 @@ border-bottom-right-radius: 0; border-bottom-left-radius: 0; } + +.btn-secondary { + color: #fff; + background-color: #5a1e63 !important; +} diff --git a/src/app/pages/page-ajout-contact/page-ajout-contact.component.ts b/src/app/pages/page-ajout-contact/page-ajout-contact.component.ts index 2bb57b1..d99669d 100644 --- a/src/app/pages/page-ajout-contact/page-ajout-contact.component.ts +++ b/src/app/pages/page-ajout-contact/page-ajout-contact.component.ts @@ -26,7 +26,7 @@ export class PageAjoutContactComponent implements OnInit { } ngOnInit(): void { - // *********************************pensser a changer group car déprécié******************************** + // *********************************pensser à changer group car déprécié******************************** this.ajoutContactForm = this.fb.group({ lastNameFc: new FormControl('', [Validators.required]), firstNameFc: new FormControl('', [Validators.required]), @@ -52,12 +52,14 @@ export class PageAjoutContactComponent implements OnInit { const adresseValue = this.ajoutContactForm.value['adresseFc']; const contact: Contact = { + id: '', nom: lastNameValue, prenom: firstNameValue, telephone: telephoneValue, email: emailValue, dateNaissance: dateNaissanceValue, adresse: adresseValue, + team: { id: '1' }, // changer l'id quand la personne est logé => recuperer l'id de la team du membre }; if (contact.nom !== '') { diff --git a/src/app/pages/page-modifier-contact/page-modifier-contact.component.html b/src/app/pages/page-modifier-contact/page-modifier-contact.component.html index c5b4b08..5ac961b 100644 --- a/src/app/pages/page-modifier-contact/page-modifier-contact.component.html +++ b/src/app/pages/page-modifier-contact/page-modifier-contact.component.html @@ -2,6 +2,7 @@
+
@@ -14,7 +15,7 @@ id="floatingInputlastName" placeholder="" name="lastName" - formControlName="lastNameFc"> + formControlName="lastNameFc" value= "{{ listContactInfo.nom }}"> @@ -25,7 +26,7 @@ id="floatingInputfirstName" placeholder="" name="firstName" - formControlName="firstNameFc"> + formControlName="firstNameFc" value= "{{ listContactInfo.prenom }}"> @@ -36,7 +37,7 @@ id="floatingInputTelephone" placeholder="" name="telephone" - formControlName="telephoneFc"> + formControlName="telephoneFc" value= "{{ listContactInfo.telephone }}"> @@ -47,7 +48,7 @@ id="floatingInput" placeholder="" name="email" - formControlName="emailFc"> + formControlName="emailFc" value= "{{ listContactInfo.email }}">
@@ -58,7 +59,7 @@ id="floatingInputdateNaissance" placeholder="" name="dateNaissance" - formControlName="dateNaissanceFc"> + formControlName="dateNaissanceFc" value= "{{ listContactInfo.dateNaissance }}">
@@ -69,11 +70,11 @@ id="floatingInputAdresse" placeholder="" name="adresse" - formControlName="adresseFc"> + formControlName="adresseFc" value= "{{ listContactInfo.adresse }}">
- diff --git a/src/app/pages/page-modifier-contact/page-modifier-contact.component.scss b/src/app/pages/page-modifier-contact/page-modifier-contact.component.scss index b3720e0..6709ac8 100644 --- a/src/app/pages/page-modifier-contact/page-modifier-contact.component.scss +++ b/src/app/pages/page-modifier-contact/page-modifier-contact.component.scss @@ -24,3 +24,8 @@ border-bottom-right-radius: 0; border-bottom-left-radius: 0; } + +.btn-secondary { + color: #fff; + background-color: #5a1e63 !important; +} diff --git a/src/app/pages/page-modifier-contact/page-modifier-contact.component.ts b/src/app/pages/page-modifier-contact/page-modifier-contact.component.ts index 7b1d5e1..0cfa9d9 100644 --- a/src/app/pages/page-modifier-contact/page-modifier-contact.component.ts +++ b/src/app/pages/page-modifier-contact/page-modifier-contact.component.ts @@ -5,7 +5,7 @@ import { FormGroup, Validators, } from '@angular/forms'; -import { Router } from '@angular/router'; +import { ActivatedRoute, Router } from '@angular/router'; import { Contact } from '../../models/contact'; import { RepertoireService } from '../../services/repertoire.service'; @@ -17,22 +17,32 @@ import { RepertoireService } from '../../services/repertoire.service'; export class PageModifierContactComponent implements OnInit { public modifContactForm: FormGroup; public contactInfo: FormGroup; + public listContactInfo: any; + public personneid: any; constructor( private repertoireService: RepertoireService, private router: Router, - private fb: FormBuilder + private fb: FormBuilder, + private route: ActivatedRoute ) { this.modifContactForm = new FormGroup({}); this.contactInfo = this.initForm(); - - // this.repertoireService.getContactById()?.subscribe((contact: Contact) => { - // this.contactInfo = this.initForm(contact); - // }); + this.listContactInfo = ''; } ngOnInit(): void { - // *********************************pensser a changer group car déprécié******************************** + this.personneid = this.route.snapshot.paramMap.get('id'); // récupère l'id du contact à modifier + console.log(this.personneid); + + this.repertoireService + .getContactById(this.personneid) + .subscribe((listContactInfo: any) => { + console.log(listContactInfo); + this.listContactInfo = listContactInfo; + }); + + // *********************************pensser à changer group car déprécié******************************** this.modifContactForm = this.fb.group({ lastNameFc: new FormControl('', [Validators.required]), firstNameFc: new FormControl('', [Validators.required]), @@ -47,6 +57,7 @@ export class PageModifierContactComponent implements OnInit { }); } + //Méthode qui initialise les champs du formulaire avec les infos de la BDD private initForm(contact?: Contact): FormGroup { return this.fb.group({ firstName: [contact ? contact.nom : ''], @@ -58,6 +69,7 @@ export class PageModifierContactComponent implements OnInit { }); } + //Méthode qui envoie les champs modifiés pour mise à jour public onSubmit(): void { console.log('value : ', this.modifContactForm.value); console.log('form : ', this.modifContactForm); @@ -69,20 +81,18 @@ export class PageModifierContactComponent implements OnInit { const adresseValue = this.modifContactForm.value['adresseFc']; const contact: Contact = { + id: this.personneid, nom: lastNameValue, prenom: firstNameValue, telephone: telephoneValue, email: emailValue, dateNaissance: dateNaissanceValue, adresse: adresseValue, + team: { id: this.listContactInfo.team.id }, }; - if (contact.nom !== '') { - this.repertoireService.updateContact(contact).subscribe((resp) => { - this.router.navigate(['repertoire/']); - }); - } else { - // affichage erreur - } + this.repertoireService.updateContact(contact).subscribe((resp) => { + this.router.navigate(['repertoire/']); + }); } } diff --git a/src/app/pages/page-not-found/page-not-found.component.html b/src/app/pages/page-not-found/page-not-found.component.html index be7d620..575a83b 100644 --- a/src/app/pages/page-not-found/page-not-found.component.html +++ b/src/app/pages/page-not-found/page-not-found.component.html @@ -1,11 +1,11 @@
- +

Page introuvable



Je retourne à l'accueil











- +
diff --git a/src/app/pages/page-repertoire/page-repertoire.component.ts b/src/app/pages/page-repertoire/page-repertoire.component.ts index c4fff1b..b7a1859 100644 --- a/src/app/pages/page-repertoire/page-repertoire.component.ts +++ b/src/app/pages/page-repertoire/page-repertoire.component.ts @@ -1,4 +1,6 @@ import { Component, OnInit } from '@angular/core'; +import { ActivatedRoute, Router } from '@angular/router'; +import { Contact } from 'src/app/models/contact'; import { RepertoireService } from 'src/app/services/repertoire.service'; @Component({ @@ -9,12 +11,19 @@ import { RepertoireService } from 'src/app/services/repertoire.service'; export class PageRepertoireComponent implements OnInit { public listContact: any[]; public listFull: any[]; + public listContactInfo: any; + public personneid: any; keyword: any; openDetails: any; - constructor(private repertoireService: RepertoireService) { + constructor( + private repertoireService: RepertoireService, + private router: Router, + private route: ActivatedRoute + ) { this.listContact = []; this.listFull = []; + this.listContactInfo = ''; } ngOnInit(): void { @@ -23,6 +32,16 @@ export class PageRepertoireComponent implements OnInit { this.listContact = listContact; this.listFull = listContact; }); + + this.personneid = this.route.snapshot.paramMap.get('id'); + console.log(this.personneid); + + this.repertoireService + .getContactById(this.personneid) + .subscribe((listContactInfo: any) => { + console.log(listContactInfo); + this.listContactInfo = listContactInfo; + }); } // Méthode pour récuper ce qui est saisi dans l'input @@ -47,4 +66,8 @@ export class PageRepertoireComponent implements OnInit { console.log(personne); this.openDetails = personne; } + + // this.repertoireService.deleteContact(contact).subscribe((resp) => { + // this.router.navigate(['repertoire/']); + // }); } diff --git a/src/app/services/repertoire.service.ts b/src/app/services/repertoire.service.ts index 1b1713a..a452854 100644 --- a/src/app/services/repertoire.service.ts +++ b/src/app/services/repertoire.service.ts @@ -21,8 +21,8 @@ export class RepertoireService { return this.http.get(`${this.apiUrl}/contacts/team/1`); } - getContactById(contact: Contact): Observable { - return this.http.get(`${this.apiUrl}/contacts/{id}`); + getContactById(id: any): Observable { + return this.http.get(`${this.apiUrl}/contacts/` + id); } addContact(contact: Contact): Observable { @@ -31,8 +31,8 @@ export class RepertoireService { return this.http.post(`${this.apiUrl}/contacts/add`, contact); } - deleteContact() { - return this.http.delete(`${this.apiUrl}/contacts/delete`); + deleteContact(contact: Contact): Observable { + return this.http.delete(`${this.apiUrl}/contacts/delete/1`); } updateContact(contact: Contact): Observable { diff --git a/src/assets/images/adresse.jpg b/src/assets/images/adresse.jpg deleted file mode 100644 index deca31c859cd48674a381a2abdce3d75cf1c92e9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11538 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 Lg6I#7=hgoMNc0kQ