diff --git a/src/app/admin/adList/page-ad-list-admin/page-ad-list-admin.component.html b/src/app/admin/adList/page-ad-list-admin/page-ad-list-admin.component.html index ac349b5..0a462ca 100644 --- a/src/app/admin/adList/page-ad-list-admin/page-ad-list-admin.component.html +++ b/src/app/admin/adList/page-ad-list-admin/page-ad-list-admin.component.html @@ -75,26 +75,22 @@ - - - Supprimer + + + Actions + + - - - Visualisation - - - - - diff --git a/src/app/admin/adList/page-ad-list-admin/page-ad-list-admin.component.ts b/src/app/admin/adList/page-ad-list-admin/page-ad-list-admin.component.ts index 775d3f7..e936d40 100644 --- a/src/app/admin/adList/page-ad-list-admin/page-ad-list-admin.component.ts +++ b/src/app/admin/adList/page-ad-list-admin/page-ad-list-admin.component.ts @@ -9,6 +9,7 @@ import {MatTableDataSource} from "@angular/material/table"; import {Advert} from "../../../utils/interfaces/advert"; import {PopupVisualizeAdAdminComponent} from "../popup-visualize-ad-admin/popup-visualize-ad-admin.component"; import {PopupDeleteAdAdminComponent} from "../popup-delete-ad-admin/popup-delete-ad-admin.component"; +import {PopupVisualizeImagesAdminComponent} from "../popup-visualize-images-admin/popup-visualize-images-admin.component"; @@ -19,7 +20,7 @@ import {PopupDeleteAdAdminComponent} from "../popup-delete-ad-admin/popup-delete }) export class PageAdListAdminComponent implements AfterViewInit { - displayedColumns: string[] = [ 'title', 'advertiser', 'tags', 'createdAt', 'updatedAt', 'views', 'isVisible', 'delete', 'visualisation' ]; + displayedColumns: string[] = [ 'title', 'advertiser', 'tags', 'createdAt', 'updatedAt', 'views', 'isVisible', 'actions' ]; dataSource ; @ViewChild(MatSort) sort: MatSort; @ViewChild(MatPaginator) paginator: MatPaginator; @@ -49,7 +50,25 @@ export class PageAdListAdminComponent implements AfterViewInit } - onVisualize(advert: Advert): void + onVisualizeImages(advert: Advert) + { + const config = { + width: '30%', + height: '90%', + data: { + images: advert.images, + width: 300, + height: 800, + } + }; + this.dialog + .open(PopupVisualizeImagesAdminComponent, config) + .afterClosed() + .subscribe(retour => {}); + } + + + onVisualizeInfo(advert: Advert): void { const config = { width: '50%', @@ -82,7 +101,7 @@ export class PageAdListAdminComponent implements AfterViewInit this.dataSource.data.splice(index, 1); this.dataSource.data = this.dataSource.data; this.dataSource = this.dataSource; - message = "L'annonce a bien été supprimée ✔" ; + message = advert.title + " a bien été supprimée ✔" ; } this.snackBar.open( message, "", config); }); diff --git a/src/app/admin/adList/popup-visualize-ad-admin/popup-visualize-ad-admin.component.html b/src/app/admin/adList/popup-visualize-ad-admin/popup-visualize-ad-admin.component.html index 9339438..750dead 100644 --- a/src/app/admin/adList/popup-visualize-ad-admin/popup-visualize-ad-admin.component.html +++ b/src/app/admin/adList/popup-visualize-ad-admin/popup-visualize-ad-admin.component.html @@ -15,11 +15,9 @@
-
Images:
-
- +
Images:
+
+
{{image.url}}
@@ -27,7 +25,7 @@
Tags:
-
• {{tag}}
+
{{tag}}
diff --git a/src/app/admin/adList/popup-visualize-ad-admin/popup-visualize-ad-admin.component.ts b/src/app/admin/adList/popup-visualize-ad-admin/popup-visualize-ad-admin.component.ts index a06900a..7d4646b 100644 --- a/src/app/admin/adList/popup-visualize-ad-admin/popup-visualize-ad-admin.component.ts +++ b/src/app/admin/adList/popup-visualize-ad-admin/popup-visualize-ad-admin.component.ts @@ -1,8 +1,7 @@ import {Component, Inject, OnInit} from '@angular/core'; import {Advert} from "../../../utils/interfaces/advert"; -import {MAT_DIALOG_DATA, MatDialog, MatDialogRef} from "@angular/material/dialog"; +import {MAT_DIALOG_DATA, MatDialogRef} from "@angular/material/dialog"; import {ThemeService} from "../../../utils/services/theme/theme.service"; -import {PopupVisualizeImagesAdminComponent} from "../popup-visualize-images-admin/popup-visualize-images-admin.component"; @@ -15,34 +14,13 @@ export class PopupVisualizeAdAdminComponent implements OnInit { advert: Advert; - constructor( public dialogRef: MatDialogRef, @Inject(MAT_DIALOG_DATA) public data, - public themeService: ThemeService, - public dialog: MatDialog ) { } - + public themeService: ThemeService ) { } ngOnInit(): void { this.advert = this.data.advert; } - - onVisualizeImages(images: any[]) - { - const config = { - width: '400px', - height: '950px', - data: { - images: images, - width: 300, - height: 800, - } - }; - this.dialog - .open(PopupVisualizeImagesAdminComponent, config) - .afterClosed() - .subscribe(retour => {}); - } - } diff --git a/src/app/admin/adList/popup-visualize-images-admin/popup-visualize-images-admin.component.ts b/src/app/admin/adList/popup-visualize-images-admin/popup-visualize-images-admin.component.ts index ab100a5..944ecbd 100644 --- a/src/app/admin/adList/popup-visualize-images-admin/popup-visualize-images-admin.component.ts +++ b/src/app/admin/adList/popup-visualize-images-admin/popup-visualize-images-admin.component.ts @@ -21,8 +21,8 @@ export class PopupVisualizeImagesAdminComponent implements OnInit ngOnInit(): void { - this.width = this.data.width; - this.height = this.data.height; + this.width = this.data.width*0.8; + this.height = this.data.height*0.8; for(let couple of this.data.images) { diff --git a/src/app/admin/myProfil/popup-update-admin/popup-update-admin.component.ts b/src/app/admin/myProfil/popup-update-admin/popup-update-admin.component.ts index 721028e..023ad93 100644 --- a/src/app/admin/myProfil/popup-update-admin/popup-update-admin.component.ts +++ b/src/app/admin/myProfil/popup-update-admin/popup-update-admin.component.ts @@ -41,6 +41,7 @@ export class PopupUpdateAdminComponent implements OnInit isAccepted: admin0.isisAccepted, createdAt: admin0.createdAt, updatedAt: admin0.updatedAt, + lastConnexion: admin0.lastConnexion }; for(let interest of admin0.interests) this.adminCopy.interests.push(interest); } @@ -51,10 +52,8 @@ export class PopupUpdateAdminComponent implements OnInit this.checkField(); if(!this.hasError) { - const data = { - user: this.adminCopy, - newPassword: this.newPassword - }; + if(this.changePassword) this.adminCopy.hashPass = this.hashage(this.newPassword); + const data = { user: this.adminCopy }; // VRAI CODE: envoie au back ... @@ -104,4 +103,17 @@ export class PopupUpdateAdminComponent implements OnInit { this.adminCopy.interests = myInterets; } + + + // Fonction de hashage (faible) + hashage(input: string): string + { + let hash = 0; + for (let i = 0; i < input.length; i++) { + let ch = input.charCodeAt(i); + hash = ((hash << 5) - hash) + ch; + hash = hash & hash; + } + return hash.toString(); + } } diff --git a/src/app/admin/userList/input-interests-admin/input-interests-admin.component.html b/src/app/admin/userList/input-interests-admin/input-interests-admin.component.html new file mode 100644 index 0000000..847d672 --- /dev/null +++ b/src/app/admin/userList/input-interests-admin/input-interests-admin.component.html @@ -0,0 +1,43 @@ + + + + + Tags + + + + + + + {{interest}} + + + + + + + + + + + + {{interest}} + + + + + + diff --git a/src/app/admin/userList/input-interests-admin/input-interests-admin.component.scss b/src/app/admin/userList/input-interests-admin/input-interests-admin.component.scss new file mode 100644 index 0000000..c7acb4b --- /dev/null +++ b/src/app/admin/userList/input-interests-admin/input-interests-admin.component.scss @@ -0,0 +1,3 @@ +mat-form-field { + width: 100%; +} diff --git a/src/app/admin/userList/input-interests-admin/input-interests-admin.component.spec.ts b/src/app/admin/userList/input-interests-admin/input-interests-admin.component.spec.ts new file mode 100644 index 0000000..62f9051 --- /dev/null +++ b/src/app/admin/userList/input-interests-admin/input-interests-admin.component.spec.ts @@ -0,0 +1,25 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { InputInterestsAdminComponent } from './input-interests-admin.component'; + +describe('InputInterestsAdminComponent', () => { + let component: InputInterestsAdminComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + declarations: [ InputInterestsAdminComponent ] + }) + .compileComponents(); + }); + + beforeEach(() => { + fixture = TestBed.createComponent(InputInterestsAdminComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/admin/userList/input-interests-admin/input-interests-admin.component.ts b/src/app/admin/userList/input-interests-admin/input-interests-admin.component.ts new file mode 100644 index 0000000..26f3d01 --- /dev/null +++ b/src/app/admin/userList/input-interests-admin/input-interests-admin.component.ts @@ -0,0 +1,81 @@ +import {Component, ElementRef, EventEmitter, Input, OnInit, Output, ViewChild} from '@angular/core'; +import {COMMA, ENTER} from "@angular/cdk/keycodes"; +import {FormControl} from "@angular/forms"; +import {Observable} from "rxjs"; +import {FictitiousDatasService} from "../../../utils/services/fictitiousDatas/fictitious-datas.service"; +import {MessageService} from "../../../utils/services/message/message.service"; +import {map, startWith} from "rxjs/operators"; +import {MatChipInputEvent} from "@angular/material/chips"; +import {MatAutocompleteSelectedEvent} from "@angular/material/autocomplete"; + +@Component({ + selector: 'app-input-interests-admin', + templateUrl: './input-interests-admin.component.html', + styleUrls: ['./input-interests-admin.component.scss'] +}) +export class InputInterestsAdminComponent implements OnInit +{ + selectable = true; + removable = true; + separatorKeysCodes: number[] = [ENTER, COMMA]; + formControl = new FormControl(); + filteredInterests: Observable; + @Input() myInterests: string[] = []; + allInterests: string[] = []; + @Output() eventEmitter = new EventEmitter(); + @ViewChild('tagInput') tagInput: ElementRef; + + + constructor( private fictitiousDatasService: FictitiousDatasService, + private messageService: MessageService ) {} + + + ngOnInit(): void + { + this.filteredInterests = this.formControl.valueChanges.pipe( + startWith(null), + map((fruit: string | null) => fruit ? this._filter(fruit) : this.allInterests.slice())); + + // --- FAUX CODE --- + this.allInterests = this.fictitiousDatasService.getTags(); + this.allInterests.sort(); + } + + + add(event: MatChipInputEvent): void + { + const value = (event.value || '').trim(); + if (value && (this.allInterests.indexOf(value) !== -1)) + { + this.myInterests.push(value); + event.chipInput!.clear(); + this.formControl.setValue(null); + this.eventEmitter.emit(this.myInterests); + } + } + + + remove(tag: string): void + { + const index = this.myInterests.indexOf(tag); + if (index >= 0) this.myInterests.splice(index, 1); + this.eventEmitter.emit(this.myInterests); + } + + + selected(event: MatAutocompleteSelectedEvent): void + { + this.myInterests.push(event.option.viewValue); + this.tagInput.nativeElement.value = ''; + this.formControl.setValue(null); + this.eventEmitter.emit(this.myInterests); + } + + + private _filter(value: string): string[] + { + const filterValue = value.toLowerCase(); + return this.allInterests.filter(fruit => fruit.toLowerCase().includes(filterValue)); + } + +} diff --git a/src/app/admin/userList/page-user-list/page-user-list.component.html b/src/app/admin/userList/page-user-list/page-user-list.component.html index 7144539..3d1016b 100644 --- a/src/app/admin/userList/page-user-list/page-user-list.component.html +++ b/src/app/admin/userList/page-user-list/page-user-list.component.html @@ -30,8 +30,8 @@
-
@@ -60,13 +60,30 @@ Date de naissance - {{ user.dateOfBirth | date:'dd/LL/YYYY à HH:mm:ss' }} + {{ user.dateOfBirth | date:'dd/LL/YYYY' }} + + + + + + Âge + + {{user.age}} + + + + + + Sexe + + Homme + Femme - Centre d'intérêts + Centres d'intérêt {{interest}}, @@ -83,11 +100,11 @@ - - - Dernière modification + + + Dernière connexion - {{ user.updatedAt | date:'dd/LL/YYYY à HH:mm:ss' }} + {{ user.lastConnexion | date:'dd/LL/YYYY à HH:mm:ss' }} @@ -101,22 +118,15 @@ - - Supprimer - - - - - - - - Visualisation + + Actions + diff --git a/src/app/admin/userList/page-user-list/page-user-list.component.scss b/src/app/admin/userList/page-user-list/page-user-list.component.scss index 8bb87ab..70d995d 100644 --- a/src/app/admin/userList/page-user-list/page-user-list.component.scss +++ b/src/app/admin/userList/page-user-list/page-user-list.component.scss @@ -18,7 +18,7 @@ .btnAjouterContainer { float:left; - margin-left: 67%; + margin-left: 65%; padding-top: 20px; } diff --git a/src/app/admin/userList/page-user-list/page-user-list.component.ts b/src/app/admin/userList/page-user-list/page-user-list.component.ts index 5713c6e..7c0d706 100644 --- a/src/app/admin/userList/page-user-list/page-user-list.component.ts +++ b/src/app/admin/userList/page-user-list/page-user-list.component.ts @@ -9,6 +9,7 @@ import {MatTableDataSource} from "@angular/material/table"; import {User} from "../../../utils/interfaces/user"; import {PopupVisualizeUserComponent} from "../popup-visualize-user/popup-visualize-user.component"; import {PopupDeleteUserComponent} from "../popup-delete-user/popup-delete-user.component"; +import {PopupCreateUserComponent} from "../popup-create-user/popup-create-user.component"; @@ -20,11 +21,11 @@ import {PopupDeleteUserComponent} from "../popup-delete-user/popup-delete-user.c export class PageUserListComponent implements AfterViewInit { displayedColumns: string[]; - displayedColumnsUser: string[] = [ 'login', 'mail', 'dateOfBirth', 'interests', 'createdAt', 'updatedAt', 'delete', 'visualisation' ]; - displayedColumnsAdvertiser: string[] = [ 'login', 'mail', 'createdAt', 'updatedAt', 'isAccepted', 'delete', 'visualisation' ]; - displayedColumnsAdmin: string[] = [ 'login', 'mail', 'createdAt', 'updatedAt', 'delete', 'visualisation' ]; + displayedColumnsUser: string[] = [ 'login', 'mail', 'dateOfBirth', 'age', 'sexe', 'interests', 'createdAt', 'lastConnexion', 'actions' ]; + displayedColumnsAdvertiser: string[] = [ 'login', 'mail', 'createdAt', 'lastConnexion', 'isAccepted', 'actions' ]; + displayedColumnsAdmin: string[] = [ 'login', 'mail', 'createdAt', 'lastConnexion', 'actions' ]; - tabUser: User[] = []; + tabUser: any[] = []; tabAdvertiser: User[] = []; tabAdmin: User[] = []; @@ -47,9 +48,11 @@ export class PageUserListComponent implements AfterViewInit this.tabAdvertiser = this.fictitiousDatasService.getTabAdvertiser(8); this.tabAdmin = this.fictitiousDatasService.getTabAdmin(4); + for(const user of this.tabUser) user.age = this.getAge(user.dateOfBirth); + this.displayedColumns = this.displayedColumnsUser; - this.dataSource = new MatTableDataSource(this.tabUser); + this.dataSource = new MatTableDataSource(this.tabUser); this.dataSource.sort = this.sort; this.dataSource.paginator = this.paginator; this.dataSource = this.dataSource; @@ -114,14 +117,36 @@ export class PageUserListComponent implements AfterViewInit this.dataSource.data.splice(index, 1); this.dataSource.data = this.dataSource.data; this.dataSource = this.dataSource; - message = "L'annonce a bien été supprimée ✔" ; + message = user.login + " a bien été supprimée ✔" ; } this.snackBar.open( message, "", config); }); } - onAddAdmin(): void - { + onCreateUser(): void + { + const config = { width: '50%' }; + this.dialog + .open(PopupCreateUserComponent, config) + .afterClosed() + .subscribe( retour => { + + const config = { duration: 1000, panelClass: "custom-class" }; + if((retour === null) || (retour === undefined)) { + this.snackBar.open( "Opération annulée", "", config); + } + else { + this.snackBar.open( "L'utilisateur a bien été créé", "", config); + } + }); + } + + + getAge(date: Date): number + { + const diff = Date.now() - date.getTime(); + const age = new Date(diff); + return Math.abs(age.getUTCFullYear() - 1970); } } diff --git a/src/app/admin/userList/popup-create-user/popup-create-user.component.html b/src/app/admin/userList/popup-create-user/popup-create-user.component.html new file mode 100644 index 0000000..1e0f9a0 --- /dev/null +++ b/src/app/admin/userList/popup-create-user/popup-create-user.component.html @@ -0,0 +1,145 @@ +
+ + +
+ + Utilisateur
+ Annonceur
+ Admin +
+

+ + +
+ + +
+
+ + +
+ + +
+ {{errorMessage}} +
+ + +
+ + +
+ +
+ + + + + + + + + +
+
+ +

+ +
+ + +
+ + + + Email + +
+ + + + Login + +
+ + + + Mot de passe + +
+ + + + Confirmation mot de passe + + + +
+ + +
+ + + + Date de naissance + +
+ + + + Homme     + Femme + +

+ + + +
+ +
+
+ + + + + + + +
+ + +
+
+ +

+ + + + Email + +
+ + + + Login + +
+ + + + Mot de passe + +
+ + + + Confirmation nouveau mot de passe + + + +
+
diff --git a/src/app/admin/userList/popup-create-user/popup-create-user.component.scss b/src/app/admin/userList/popup-create-user/popup-create-user.component.scss new file mode 100644 index 0000000..4c8a0c6 --- /dev/null +++ b/src/app/admin/userList/popup-create-user/popup-create-user.component.scss @@ -0,0 +1,16 @@ +.myContainer { + font-size: small; +} + +img { + margin: 0px 0px 10px 0px; + width: 10%; + height: 10%; + border: solid 2px black; + border-radius: 50%; + font-size: xxx-large; +} + +.leftCol { + border-right: solid 1px #dcdcdc; +} diff --git a/src/app/admin/userList/popup-create-user/popup-create-user.component.spec.ts b/src/app/admin/userList/popup-create-user/popup-create-user.component.spec.ts new file mode 100644 index 0000000..9c57fcc --- /dev/null +++ b/src/app/admin/userList/popup-create-user/popup-create-user.component.spec.ts @@ -0,0 +1,25 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { PopupCreateUserComponent } from './popup-create-user.component'; + +describe('PopupCreateUserComponent', () => { + let component: PopupCreateUserComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + declarations: [ PopupCreateUserComponent ] + }) + .compileComponents(); + }); + + beforeEach(() => { + fixture = TestBed.createComponent(PopupCreateUserComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/admin/userList/popup-create-user/popup-create-user.component.ts b/src/app/admin/userList/popup-create-user/popup-create-user.component.ts new file mode 100644 index 0000000..a13368c --- /dev/null +++ b/src/app/admin/userList/popup-create-user/popup-create-user.component.ts @@ -0,0 +1,121 @@ +import {Component, Inject, OnInit} from '@angular/core'; +import {MAT_DIALOG_DATA, MatDialogRef} from "@angular/material/dialog"; +import {User} from "../../../utils/interfaces/user"; + + + +@Component({ + selector: 'app-popup-create-user', + templateUrl: './popup-create-user.component.html', + styleUrls: ['./popup-create-user.component.scss'] +}) +export class PopupCreateUserComponent implements OnInit +{ + user: User; + hasError: boolean = false; + errorMessage: string = ""; + password: string = ""; + confirmPassword: string = ""; + + + constructor( public dialogRef: MatDialogRef, + @Inject(MAT_DIALOG_DATA) public data ) { } + + + // Initialise l'utilisateur qui va être créé + ngOnInit(): void + { + this.user = { + _id: "", + login: "", + hashPass: "", + mail: "", + role: { + name: "", + permission: 0, + }, + profilePictureUrl: "", + dateOfBirth: null, + gender: "man", + interests: [], + isActive: false, + isAccepted: false, + createdAt: new Date(), + updatedAt: new Date(), + lastConnexion: new Date() + }; + } + + + // Crée le nouvel utilisateur + onEnregistrer(): void + { + this.checkField(); + + if(!this.hasError) + { + this.user.hashPass = this.hashage(this.password); + this.dialogRef.close(this.user); + // VRAI CODE ... + } + } + + + // Check les champs saisies par l'utilisateur + checkField(): void + { + if(this.user.login.length === 0) { + this.errorMessage = "Veuillez remplir le champ 'login'."; + this.hasError = true; + } + else if(this.user.mail.length === 0) { + this.errorMessage = "Veuillez remplir le champ 'email'."; + this.hasError = true; + } + else if(!this.isValidEmail(this.user.mail)) { + this.errorMessage = "Email invalide"; + this.hasError = true; + } + else if(this.password.length === 0) { + this.errorMessage = "Veuillez remplir le champ 'mot de passe'."; + this.hasError = true; + } + else if(this.password !== this.confirmPassword) { + this.errorMessage = "Le mot de passe est différent de sa confirmation."; + this.hasError = true; + } + else { + this.errorMessage = "" ; + this.hasError = false; + } + } + + + // Indique si email a bien le format d'un email + isValidEmail(email): boolean + { + let re = /^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/; + return re.test(email); + } + + + // Récupère la liste des centres d'intérets (car celle-ci est remplie à l'aide d'un component intermédiaire) + onEventInputInterests(myInterets: string[]): void + { + this.user.interests = myInterets; + } + + + // Fonction de hashage (faible) + hashage(input: string): string + { + let hash = 0; + for (let i = 0; i < input.length; i++) { + let ch = input.charCodeAt(i); + hash = ((hash << 5) - hash) + ch; + hash = hash & hash; + } + return hash.toString(); + } + +} diff --git a/src/app/admin/userList/popup-delete-user/popup-delete-user.component.html b/src/app/admin/userList/popup-delete-user/popup-delete-user.component.html index 8d801d0..26e3854 100644 --- a/src/app/admin/userList/popup-delete-user/popup-delete-user.component.html +++ b/src/app/admin/userList/popup-delete-user/popup-delete-user.component.html @@ -1 +1,8 @@ -

popup-delete-user works!

+ + Êtes-vous sûr de vouloir supprimer {{user.login}} ? + + + + + + diff --git a/src/app/admin/userList/popup-delete-user/popup-delete-user.component.ts b/src/app/admin/userList/popup-delete-user/popup-delete-user.component.ts index 0c26176..35e8d9e 100644 --- a/src/app/admin/userList/popup-delete-user/popup-delete-user.component.ts +++ b/src/app/admin/userList/popup-delete-user/popup-delete-user.component.ts @@ -1,15 +1,47 @@ -import { Component, OnInit } from '@angular/core'; +import {Component, Inject, OnInit} from '@angular/core'; +import {MAT_DIALOG_DATA, MatDialogRef} from "@angular/material/dialog"; +import {MessageService} from "../../../utils/services/message/message.service"; + + @Component({ - selector: 'app-popup-delete-user', - templateUrl: './popup-delete-user.component.html', - styleUrls: ['./popup-delete-user.component.scss'] + selector: 'app-popup-delete-user', + templateUrl: './popup-delete-user.component.html', + styleUrls: ['./popup-delete-user.component.scss'] }) -export class PopupDeleteUserComponent implements OnInit { +export class PopupDeleteUserComponent implements OnInit +{ + user; - constructor() { } + constructor( public dialogRef: MatDialogRef, + @Inject(MAT_DIALOG_DATA) public data, + private messageService: MessageService ) { } - ngOnInit(): void { - } + ngOnInit(): void + { + this.user = this.data.user; + } + + onValidate(): void + { + // --- FAUX CODE --- + this.dialogRef.close(true); + + // --- VRAI CODE --- + /* + this.messageService + .sendMessage("user/delete", {"advert": this.advert}) + .subscribe( retour => { + + if(retour.status === "error") { + console.log(retour); + this.dialogRef.close(); + } + else { + this.dialogRef.close(true); + } + }); + */ + } } diff --git a/src/app/admin/userList/popup-visualize-user/popup-visualize-user.component.html b/src/app/admin/userList/popup-visualize-user/popup-visualize-user.component.html index 570cf0f..6fb982e 100644 --- a/src/app/admin/userList/popup-visualize-user/popup-visualize-user.component.html +++ b/src/app/admin/userList/popup-visualize-user/popup-visualize-user.component.html @@ -1 +1,76 @@ -

popup-visualize-user works!

+
+ + +
+ +
+ + +
+
Login:
+
{{user.login}}
+
+ + +
+
Mail:
+
{{user.mail}}
+
+ +
+ + +
+
Date de naissance:
+
{{ user.dateOfBirth | date:'dd/LL/YYYY' }}
+
+ + +
+
Âge:
+
{{user.age}}
+
+ + +
+
Sexe:
+
+ Homme + Femme +
+
+ + +
+
Centres d'intérêt:
+
+
• {{interest}}
+
+
+ + +
+
Date de création:
+
{{ user.createdAt | date:'dd/LL/YYYY' }}
+
+ +
+ + +
+
Rôle:
+
+ Utilisateur + Annonceur + Admin +
+
+
+ + +
+ +
+ +
diff --git a/src/app/admin/userList/popup-visualize-user/popup-visualize-user.component.scss b/src/app/admin/userList/popup-visualize-user/popup-visualize-user.component.scss index e69de29..b070a71 100644 --- a/src/app/admin/userList/popup-visualize-user/popup-visualize-user.component.scss +++ b/src/app/admin/userList/popup-visualize-user/popup-visualize-user.component.scss @@ -0,0 +1,29 @@ +.myContainer { + font-size: small; +} + + +img { + margin: 0px 0px 10px 0px; + width: 5vw; + height: 5vw; + border: solid 2px black; + border-radius: 50%; + font-size: xxx-large; +} + + +.myRow { + margin: 15px 0px 15px 0px; +} +.myLabel { + text-align: right; + padding: 0px 5px 0px 0px; + margin: 0px; + font-weight: bold; +} +.myValue { + text-align: left; + padding: 0px 0px 0px 5px; + margin: 0px; +} diff --git a/src/app/admin/userList/popup-visualize-user/popup-visualize-user.component.ts b/src/app/admin/userList/popup-visualize-user/popup-visualize-user.component.ts index 53008e1..6a4062a 100644 --- a/src/app/admin/userList/popup-visualize-user/popup-visualize-user.component.ts +++ b/src/app/admin/userList/popup-visualize-user/popup-visualize-user.component.ts @@ -1,15 +1,23 @@ -import { Component, OnInit } from '@angular/core'; +import {Component, Inject, OnInit} from '@angular/core'; +import {MAT_DIALOG_DATA, MatDialogRef} from "@angular/material/dialog"; + + @Component({ selector: 'app-popup-visualize-user', templateUrl: './popup-visualize-user.component.html', styleUrls: ['./popup-visualize-user.component.scss'] }) -export class PopupVisualizeUserComponent implements OnInit { +export class PopupVisualizeUserComponent implements OnInit +{ + user; - constructor() { } + constructor( public dialogRef: MatDialogRef, + @Inject(MAT_DIALOG_DATA) public data ) { } - ngOnInit(): void { - } + ngOnInit(): void + { + this.user = this.data.user; + } } diff --git a/src/app/advertiser/adList/input-tags/input-tags.component.html b/src/app/advertiser/adList/input-tags/input-tags.component.html index 97e7a39..f8da61e 100644 --- a/src/app/advertiser/adList/input-tags/input-tags.component.html +++ b/src/app/advertiser/adList/input-tags/input-tags.component.html @@ -1,4 +1,4 @@ - + diff --git a/src/app/advertiser/adList/input-tags/input-tags.component.scss b/src/app/advertiser/adList/input-tags/input-tags.component.scss index c7acb4b..2c3a84d 100644 --- a/src/app/advertiser/adList/input-tags/input-tags.component.scss +++ b/src/app/advertiser/adList/input-tags/input-tags.component.scss @@ -1,3 +1,16 @@ mat-form-field { width: 100%; + font-size: small; +} + +mat-chip-list { + font-size: small; +} + +mat-chip { + font-size: small; +} + +input { + font-size: small; } diff --git a/src/app/advertiser/adList/page-ad-list-advertiser/page-ad-list-advertiser.component.html b/src/app/advertiser/adList/page-ad-list-advertiser/page-ad-list-advertiser.component.html index 5727386..49ae0d2 100644 --- a/src/app/advertiser/adList/page-ad-list-advertiser/page-ad-list-advertiser.component.html +++ b/src/app/advertiser/adList/page-ad-list-advertiser/page-ad-list-advertiser.component.html @@ -74,33 +74,22 @@
- - - Modifier + + + Actions + - - - - - - Supprimer - - - - - - - - Visualisation - + diff --git a/src/app/advertiser/adList/page-ad-list-advertiser/page-ad-list-advertiser.component.ts b/src/app/advertiser/adList/page-ad-list-advertiser/page-ad-list-advertiser.component.ts index c3e1c65..5cc3ca0 100644 --- a/src/app/advertiser/adList/page-ad-list-advertiser/page-ad-list-advertiser.component.ts +++ b/src/app/advertiser/adList/page-ad-list-advertiser/page-ad-list-advertiser.component.ts @@ -10,6 +10,7 @@ import {MatSnackBar} from "@angular/material/snack-bar"; import {PopupDeleteAdAdvertiserComponent} from "../popup-delete-ad-advertiser/popup-delete-ad-advertiser.component"; import {PopupVisualizeAdAdvertiserComponent} from "../popup-visualize-ad-advertiser/popup-visualize-ad-advertiser.component"; import {MatPaginator} from "@angular/material/paginator"; +import {PopupVisualizeImagesAdvertiserComponent} from "../popup-visualize-images-advertiser/popup-visualize-images-advertiser.component"; @@ -20,7 +21,7 @@ import {MatPaginator} from "@angular/material/paginator"; }) export class PageAdListAdvertiserComponent implements AfterViewInit { - displayedColumns: string[] = [ 'title', 'tags', 'createdAt', 'updatedAt', 'views', 'isVisible', 'update', 'delete', 'visualisation' ]; + displayedColumns: string[] = [ 'title', 'tags', 'createdAt', 'updatedAt', 'views', 'isVisible', 'actions' ]; dataSource ; @ViewChild(MatSort) sort: MatSort; @ViewChild(MatPaginator) paginator: MatPaginator; @@ -50,6 +51,24 @@ export class PageAdListAdvertiserComponent implements AfterViewInit } + onVisualizeImages(advert: Advert) + { + const config = { + width: '30%', + height: '90%', + data: { + images: advert.images, + width: 300, + height: 800, + } + }; + this.dialog + .open(PopupVisualizeImagesAdvertiserComponent, config) + .afterClosed() + .subscribe(retour => {}); + } + + onVisualize(advert: Advert): void { const config = { @@ -140,7 +159,7 @@ export class PageAdListAdvertiserComponent implements AfterViewInit this.dataSource.data.splice(index, 1); this.dataSource.data = this.dataSource.data; this.dataSource = this.dataSource; - message = "L'annonce a bien été supprimée ✔" ; + message = advert.title + " a bien été supprimée ✔" ; } this.snackBar.open( message, "", config); }); diff --git a/src/app/advertiser/adList/popup-visualize-ad-advertiser/popup-visualize-ad-advertiser.component.html b/src/app/advertiser/adList/popup-visualize-ad-advertiser/popup-visualize-ad-advertiser.component.html index 460ede0..4263967 100644 --- a/src/app/advertiser/adList/popup-visualize-ad-advertiser/popup-visualize-ad-advertiser.component.html +++ b/src/app/advertiser/adList/popup-visualize-ad-advertiser/popup-visualize-ad-advertiser.component.html @@ -9,11 +9,9 @@
-
Images:
-
- +
Images:
+
+
{{image.url}}
diff --git a/src/app/advertiser/adList/popup-visualize-ad-advertiser/popup-visualize-ad-advertiser.component.ts b/src/app/advertiser/adList/popup-visualize-ad-advertiser/popup-visualize-ad-advertiser.component.ts index 96ab398..1e65834 100644 --- a/src/app/advertiser/adList/popup-visualize-ad-advertiser/popup-visualize-ad-advertiser.component.ts +++ b/src/app/advertiser/adList/popup-visualize-ad-advertiser/popup-visualize-ad-advertiser.component.ts @@ -2,7 +2,6 @@ import {Component, Inject, OnInit} from '@angular/core'; import {ThemeService} from "../../../utils/services/theme/theme.service"; import {MAT_DIALOG_DATA, MatDialog, MatDialogRef} from "@angular/material/dialog"; import {Advert} from "../../../utils/interfaces/advert"; -import {PopupVisualizeImagesAdvertiserComponent} from "../popup-visualize-images-advertiser/popup-visualize-images-advertiser.component"; @@ -15,34 +14,14 @@ export class PopupVisualizeAdAdvertiserComponent implements OnInit { advert: Advert; - constructor( public dialogRef: MatDialogRef, @Inject(MAT_DIALOG_DATA) public data, public themeService: ThemeService, public dialog: MatDialog ) { } - ngOnInit(): void { this.advert = this.data.advert; } - - onVisualizeImages(images: any[]) - { - const config = { - width: '400px', - height: '950px', - data: { - images: images, - width: 300, - height: 800, - } - }; - this.dialog - .open(PopupVisualizeImagesAdvertiserComponent, config) - .afterClosed() - .subscribe(retour => {}); - } - } diff --git a/src/app/advertiser/myProfil/popup-update-advertiser/popup-update-advertiser.component.html b/src/app/advertiser/myProfil/popup-update-advertiser/popup-update-advertiser.component.html index 856ba9c..f047682 100644 --- a/src/app/advertiser/myProfil/popup-update-advertiser/popup-update-advertiser.component.html +++ b/src/app/advertiser/myProfil/popup-update-advertiser/popup-update-advertiser.component.html @@ -39,7 +39,7 @@
- + Confirmation nouveau mot de passe diff --git a/src/app/advertiser/myProfil/popup-update-advertiser/popup-update-advertiser.component.ts b/src/app/advertiser/myProfil/popup-update-advertiser/popup-update-advertiser.component.ts index 09fd284..2ad7c6c 100644 --- a/src/app/advertiser/myProfil/popup-update-advertiser/popup-update-advertiser.component.ts +++ b/src/app/advertiser/myProfil/popup-update-advertiser/popup-update-advertiser.component.ts @@ -43,6 +43,7 @@ export class PopupUpdateAdvertiserComponent implements OnInit isAccepted: advertiser0.isAccepted, createdAt: advertiser0.createdAt, updatedAt: advertiser0.updatedAt, + lastConnexion: new Date() }; for(let interest of advertiser0.interests) this.advertiserCopy.interests.push(interest); } @@ -53,10 +54,8 @@ export class PopupUpdateAdvertiserComponent implements OnInit this.checkField(); if(!this.hasError) { - const data = { - user: this.advertiserCopy, - newPassword: this.newPassword - }; + if(this.changePassword) this.advertiserCopy.hashPass = this.hashage(this.newPassword); + const data = { user: this.advertiserCopy }; // VRAI CODE: envoie au back ... @@ -107,4 +106,16 @@ export class PopupUpdateAdvertiserComponent implements OnInit this.advertiserCopy.interests = myInterets; } + + // Fonction de hashage (faible) + hashage(input: string): string + { + let hash = 0; + for (let i = 0; i < input.length; i++) { + let ch = input.charCodeAt(i); + hash = ((hash << 5) - hash) + ch; + hash = hash & hash; + } + return hash.toString(); + } } diff --git a/src/app/app.module.ts b/src/app/app.module.ts index 139ab70..30ffeb8 100644 --- a/src/app/app.module.ts +++ b/src/app/app.module.ts @@ -67,6 +67,8 @@ import { PopupVisualizeImagesAdminComponent } from './admin/adList/popup-visuali import { PageUserListComponent } from './admin/userList/page-user-list/page-user-list.component'; import { PopupVisualizeUserComponent } from './admin/userList/popup-visualize-user/popup-visualize-user.component'; import { PopupDeleteUserComponent } from './admin/userList/popup-delete-user/popup-delete-user.component'; +import { PopupCreateUserComponent } from './admin/userList/popup-create-user/popup-create-user.component'; +import { InputInterestsAdminComponent } from './admin/userList/input-interests-admin/input-interests-admin.component'; @NgModule({ @@ -114,6 +116,8 @@ import { PopupDeleteUserComponent } from './admin/userList/popup-delete-user/pop PageUserListComponent, PopupVisualizeUserComponent, PopupDeleteUserComponent, + PopupCreateUserComponent, + InputInterestsAdminComponent, ], imports: [ BrowserModule, diff --git a/src/app/beforeConnexion/register/page-register/page-register.component.ts b/src/app/beforeConnexion/register/page-register/page-register.component.ts index 8191d33..d6f2782 100644 --- a/src/app/beforeConnexion/register/page-register/page-register.component.ts +++ b/src/app/beforeConnexion/register/page-register/page-register.component.ts @@ -37,6 +37,7 @@ export class PageRegisterComponent isAccepted: false, createdAt: new Date(), updatedAt: new Date(), + lastConnexion: new Date() }; @@ -88,14 +89,6 @@ export class PageRegisterComponent } - // Indique si email a bien le format d'un email - isValidEmail(email): boolean - { - let re = /^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/; - return re.test(email); - } - - // Check les champs saisies par l'utilisateur checkField(): void { @@ -126,6 +119,14 @@ export class PageRegisterComponent } + // Indique si email a bien le format d'un email + isValidEmail(email): boolean + { + let re = /^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/; + return re.test(email); + } + + // Récupère la liste des centres d'intérets (car celle-ci est remplie à l'aide d'un component intermédiaire) onEventInputInterests(myInterets: string[]): void { diff --git a/src/app/user/myProfil/popup-update-user/popup-update-user.component.ts b/src/app/user/myProfil/popup-update-user/popup-update-user.component.ts index 15c38bb..ac0911d 100644 --- a/src/app/user/myProfil/popup-update-user/popup-update-user.component.ts +++ b/src/app/user/myProfil/popup-update-user/popup-update-user.component.ts @@ -43,6 +43,7 @@ export class PopupUpdateUserComponent implements OnInit isAccepted: user0.isAccepted, createdAt: user0.createdAt, updatedAt: user0.updatedAt, + lastConnexion: new Date() }; for(let interest of user0.interests) this.userCopy.interests.push(interest); } @@ -53,10 +54,8 @@ export class PopupUpdateUserComponent implements OnInit this.checkField(); if(!this.hasError) { - const data = { - user: this.userCopy, - newPassword: this.newPassword - }; + if(this.changePassword) this.userCopy.hashPass = this.hashage(this.newPassword); + const data = { user: this.userCopy }; // VRAI CODE: envoie au back ... @@ -107,4 +106,17 @@ export class PopupUpdateUserComponent implements OnInit this.userCopy.interests = myInterets; } + + // Fonction de hashage (faible) + hashage(input: string): string + { + let hash = 0; + for (let i = 0; i < input.length; i++) { + let ch = input.charCodeAt(i); + hash = ((hash << 5) - hash) + ch; + hash = hash & hash; + } + return hash.toString(); + } + } diff --git a/src/app/utils/interfaces/user.ts b/src/app/utils/interfaces/user.ts index 11eb36f..f498313 100644 --- a/src/app/utils/interfaces/user.ts +++ b/src/app/utils/interfaces/user.ts @@ -16,4 +16,5 @@ export interface User isAccepted: boolean, createdAt: Date, updatedAt: Date, + lastConnexion: Date, } diff --git a/src/app/utils/services/fictitiousDatas/fictitious-datas.service.ts b/src/app/utils/services/fictitiousDatas/fictitious-datas.service.ts index 7b6115a..1e44c7a 100644 --- a/src/app/utils/services/fictitiousDatas/fictitious-datas.service.ts +++ b/src/app/utils/services/fictitiousDatas/fictitious-datas.service.ts @@ -152,6 +152,7 @@ const USER: User = { isAccepted: true, createdAt: new Date(), updatedAt: new Date(), + lastConnexion: new Date() }; const ADVERTISER: User = { @@ -171,6 +172,7 @@ const ADVERTISER: User = { isAccepted: true, createdAt: new Date(), updatedAt: new Date(), + lastConnexion: new Date() }; const ADMIN: User = { @@ -190,6 +192,7 @@ const ADMIN: User = { isAccepted: true, createdAt: new Date(), updatedAt: new Date(), + lastConnexion: new Date() }; // ------------------------------------------------------------------------------------------------------------------------------