From 32a360ff046bb7ab9032023206e8e105372765c9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Arthur=20Gu=C3=A9don?= <60623551+arthurgdn@users.noreply.github.com> Date: Mon, 16 Nov 2020 19:09:54 +0100 Subject: [PATCH] Validated signup file display (#54) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * adds support for personnal data * modifie le form pour inclure la nationalité * supprime le gg form * supprime le champ section et ajoute la liste des etablissements * adapts for user * adds validation and connects to students api for personnal data * adds classType field and rgpd info * corrects scholarships * removes signup file tab * minor presentation changes * deletes random console.log * changes upload component declarations * changes upload component declarations * changes upload component declarations * changes upload component declarations * changes upload component declarations * changes upload component declarations * changes upload component declarations * filters if the whole list is sent back * adds message after personnal data modifications * adds untested frontend support for showing validated status of signup file * adds phone number validation for personnal data * checks for year field in registration to display correct status --- package-lock.json | 6 +- package.json | 1 + .../members/account/account-routing.module.ts | 5 +- .../core/account-validation.service.ts | 69 +++++++++++++++++++ src/app/members/account/core/index.ts | 1 + .../account/core/personal-data.model.ts | 28 ++++++-- .../account/core/personal-data.service.ts | 9 ++- .../account/edit-data/edit-data.component.ts | 4 +- .../account/my-data/my-data.component.html | 3 + .../account/my-data/my-data.component.scss | 16 +++++ .../account/my-data/my-data.component.ts | 32 ++++++++- 11 files changed, 160 insertions(+), 14 deletions(-) create mode 100644 src/app/members/account/core/account-validation.service.ts diff --git a/package-lock.json b/package-lock.json index a7b79ff..f04e87a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -7146,9 +7146,9 @@ } }, "moment": { - "version": "2.22.2", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.22.2.tgz", - "integrity": "sha1-PCV/mDn8DpP/UxSWMiOeuQeD/2Y=" + "version": "2.29.1", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.1.tgz", + "integrity": "sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ==" }, "move-concurrently": { "version": "1.0.1", diff --git a/package.json b/package.json index 7017524..3e5acf4 100644 --- a/package.json +++ b/package.json @@ -35,6 +35,7 @@ "fuse.js": "^3.2.1", "hammerjs": "^2.0.8", "jump.js": "^1.0.2", + "moment": "^2.29.1", "ng2-emoji": "^0.2.0", "ngx-markdown": "^6.3.0", "ngx-moment": "^2.0.0", diff --git a/src/app/members/account/account-routing.module.ts b/src/app/members/account/account-routing.module.ts index 6439045..4494b72 100644 --- a/src/app/members/account/account-routing.module.ts +++ b/src/app/members/account/account-routing.module.ts @@ -7,6 +7,7 @@ import {MyDataComponent} from './my-data/my-data.component' import {EditDataComponent} from './edit-data/edit-data.component' import {MyFileComponent} from './my-file/my-file.component' import { PersonalDataResolver } from './core' +import {AccountValidationResolver} from './core' const routes: Routes = [ @@ -19,9 +20,9 @@ const routes: Routes = [ path: 'donnees', component: MyDataComponent, resolve : { - 'personalData' : PersonalDataResolver + 'personalData' : PersonalDataResolver, + //'validatedAccount' : AccountValidationResolver }, - }, { path: 'modifier_donnees', component: EditDataComponent, diff --git a/src/app/members/account/core/account-validation.service.ts b/src/app/members/account/core/account-validation.service.ts new file mode 100644 index 0000000..5dbc601 --- /dev/null +++ b/src/app/members/account/core/account-validation.service.ts @@ -0,0 +1,69 @@ +import { Injectable } from '@angular/core'; +import { HttpClient } from '@angular/common/http'; +import { Resolve,ActivatedRouteSnapshot } from '@angular/router'; +import { Observable, of, forkJoin } from 'rxjs'; +import { tap, map, filter,catchError } from 'rxjs/operators'; +import { ApiService, AuthService,} from 'app/core'; + + +@Injectable({ + providedIn: 'root' +}) +export class AccountValidationService extends ApiService { + + //api url + private baseUrl = this.apiUrl + 'registrations'; + + constructor( + private http: HttpClient, + private auth: AuthService + ) { super(); } + + //get personalData by user + get(filters: any): Observable<String> { + const url = this.baseUrl; + return this.http.get(url, { params: filters }).pipe( + map((data: any) => { + + return data}), + ); + } + retrieve(id: number | string): Observable<String> { + let url = this.baseUrl; + return this.http.get<String>(url).pipe( + map(v =>{ + console.log('validation',v) + if(v instanceof Array){ + if (v.length>1){ + return v.find((user)=>user.user_id===id).validated + } + return v[0].validated + } + + }), + ); + } + + forUser(userId: number): Observable<String> { + return this.get({ user_id: String(userId)}); + } +} + +@Injectable({ + providedIn: 'root' + }) +export class AccountValidationResolver implements Resolve<String>{ + + constructor(private service: AccountValidationService, private auth: AuthService) { } + //fetch registration status + + resolve(route: ActivatedRouteSnapshot): Observable<String> { + const user = this.auth.getUserSnapshot(); + return this.service.retrieve(user.id).pipe( + catchError(e => of(null)) + ); + + } +} + + diff --git a/src/app/members/account/core/index.ts b/src/app/members/account/core/index.ts index 93715ac..ccdcd8c 100644 --- a/src/app/members/account/core/index.ts +++ b/src/app/members/account/core/index.ts @@ -1,2 +1,3 @@ export * from './personal-data.model'; export * from './personal-data.service'; +export * from './account-validation.service'; diff --git a/src/app/members/account/core/personal-data.model.ts b/src/app/members/account/core/personal-data.model.ts index 468eaa4..a2c4ba0 100644 --- a/src/app/members/account/core/personal-data.model.ts +++ b/src/app/members/account/core/personal-data.model.ts @@ -1,10 +1,13 @@ import { User, UserAdapter, IAdapter } from 'app/core'; + export class PersonalDataSchema { user_id: string; url : string; + year: string; + registration: Registration; firstName:string; lastName: string; gender: string; @@ -27,6 +30,21 @@ export class PersonalDataSchema { dependantsNumber:number; } +class RegistrationSchema { + id: Number; + submitted: string; + validated: boolean; +} + + +export class Registration extends RegistrationSchema { + + constructor(args: RegistrationSchema) { + super(); + Object.assign(this, args); + } +} + export class PersonalData extends PersonalDataSchema { constructor(args: PersonalDataSchema) { @@ -41,10 +59,12 @@ export class PersonalDataAdapter implements IAdapter<PersonalData> { adapt(data: any): PersonalData { return new PersonalData({ - url : data.url, - user_id: data.user_id, - firstName: data.user.first_name, - lastName: data.user.last_name, + url : data.url?data.url:'', + user_id: data.user_id?data.user_id:'', + registration:data.registration?data.registration:{id: 0,submitted: '',validated: false}, + year:data.year?data.year:'', + firstName: data.user.first_name?data.user.first_name:'', + lastName: data.user.last_name?data.user.last_name:'', gender: data.gender?data.gender:'', nationality : data.nationality?data.nationality:'', addressNumber: data.addressNumber?data.addressNumber:'', diff --git a/src/app/members/account/core/personal-data.service.ts b/src/app/members/account/core/personal-data.service.ts index c5bf690..be2695f 100644 --- a/src/app/members/account/core/personal-data.service.ts +++ b/src/app/members/account/core/personal-data.service.ts @@ -34,11 +34,18 @@ export class PersonalDataService extends ApiService { let url = this.baseUrl; return this.http.get<PersonalData>(url).pipe( map(v =>{ + if(v instanceof Array){ if (v.length>1){ return this.adapter.adapt(v.find((user)=>user.user_id===id)) } - return this.adapter.adapt(v[0]) + else if (v.length===1){ + return this.adapter.adapt(v[0]) + }else{ + + return this.adapter.adapt({}) + } + } }), diff --git a/src/app/members/account/edit-data/edit-data.component.ts b/src/app/members/account/edit-data/edit-data.component.ts index 9bd2489..01714e3 100644 --- a/src/app/members/account/edit-data/edit-data.component.ts +++ b/src/app/members/account/edit-data/edit-data.component.ts @@ -94,8 +94,8 @@ export class EditDataComponent implements OnInit { street:this.personalData.street, zipCode:this.personalData.zipCode, city:this.personalData.city, - personalPhone:[this.personalData.personalPhone,Validators.pattern("^[0-9, ]*[0-9, ]{10}$")], - parentsPhone:this.personalData.parentsPhone, + personalPhone:[this.personalData.personalPhone,Validators.pattern("^([0-9]{2}[. ]?){5}$")], + parentsPhone:[this.personalData.parentsPhone,Validators.pattern("^([0-9]{2}[. ]?){5}$")], parentsEmail:[this.personalData.parentsEmail,Validators.email], school:this.personalData.school, grade:this.personalData.grade, diff --git a/src/app/members/account/my-data/my-data.component.html b/src/app/members/account/my-data/my-data.component.html index d17a781..935b376 100644 --- a/src/app/members/account/my-data/my-data.component.html +++ b/src/app/members/account/my-data/my-data.component.html @@ -1,4 +1,7 @@ <app-form-page> + <mat-divider class='top-margin'></mat-divider> + <p><span class='label'>Statut du dossier d'inscription : </span><span [ngClass]="styleValidatedAccount()">{{validatedAccount}}</span></p> + <mat-divider></mat-divider> <h2>Mes données</h2> <p><span class='label'>Prénom : </span>{{personalData.firstName}} </p> <p><span class='label'>Nom : </span>{{personalData.lastName}}</p> diff --git a/src/app/members/account/my-data/my-data.component.scss b/src/app/members/account/my-data/my-data.component.scss index 80c0108..b787390 100644 --- a/src/app/members/account/my-data/my-data.component.scss +++ b/src/app/members/account/my-data/my-data.component.scss @@ -1,4 +1,20 @@ .label{ color:grey; font-weight: 600; +} + +.in-progress-label{ + color : brown +} + +.not-sent-label{ + color:red +} + +.validated-label{ + color:green +} + +.top-margin{ + margin-top: 15px; } \ No newline at end of file diff --git a/src/app/members/account/my-data/my-data.component.ts b/src/app/members/account/my-data/my-data.component.ts index cf04c13..5a7c5e3 100644 --- a/src/app/members/account/my-data/my-data.component.ts +++ b/src/app/members/account/my-data/my-data.component.ts @@ -1,6 +1,7 @@ import { Component, OnInit } from '@angular/core'; import {ActivatedRoute,Router} from '@angular/router' import {PersonalData} from '../core' +import * as moment from 'moment' import {User} from 'app/core' @Component({ @@ -11,7 +12,9 @@ import {User} from 'app/core' export class MyDataComponent implements OnInit { personalData: PersonalData; - + validatedAccount : String; + dateNow: Date; + currentYear: String; public grade = { "troisieme": "Troisième", @@ -20,6 +23,17 @@ export class MyDataComponent implements OnInit { "terminale":"Terminale" } + + //Styles validated account label depending on the status of the account + public styleValidatedAccount = ()=> { + if(this.validatedAccount==="Données personnelles non remplies"){ + return 'not-sent-label' + }else if (this.validatedAccount==="En cours de validation"){ + return 'in-progress-label' + }else if (this.validatedAccount==="Validé"){ + return 'validated-label' + } + } public scholarship = { "echelon0": "Oui, échelon 0", "echelon1": "Oui, échelon 1", @@ -45,7 +59,21 @@ export class MyDataComponent implements OnInit { ngOnInit() { - this.personalData = this.route.snapshot.data['personalData']; + this.personalData = this.route.snapshot.data['personalData'] + this.dateNow = new Date() + if(moment(this.dateNow).month()>=9){ + this.currentYear = moment(this.dateNow).year() + "/"+ String(moment(this.dateNow).year()+1) + }else{ + this.currentYear = String(moment(this.dateNow).year() -1) + "/"+moment(this.dateNow).year() + } + + if(this.personalData.registration.validated){ + this.validatedAccount= "Validé" + }else if(this.personalData.year===this.currentYear){ + this.validatedAccount="En cours de validation" + }else{ + this.validatedAccount="Données personnelles non remplies" + } } -- GitLab