Commit 8b7e3c11 by Emile TAVERNE

Ajout page détail et guard vérification

parent f2ad81d1
...@@ -9,12 +9,14 @@ import {AppComponent} from './app.component'; ...@@ -9,12 +9,14 @@ import {AppComponent} from './app.component';
import * as Components from './components'; import * as Components from './components';
import * as Services from './services'; import * as Services from './services';
import * as Pipes from './pipes'; import * as Pipes from './pipes';
import * as Guards from './guards';
@NgModule({ @NgModule({
declarations: [ declarations: [
AppComponent, AppComponent,
Components.HeaderComponent, Components.HeaderComponent,
Components.LoaderComponent, Components.LoaderComponent,
Components.PageProfilComponent,
Components.PageTrombinoscopeComponent, Components.PageTrombinoscopeComponent,
Components.TrombinoscopeCardComponent, Components.TrombinoscopeCardComponent,
Pipes.CapitalizePipe, Pipes.CapitalizePipe,
...@@ -27,11 +29,13 @@ import * as Pipes from './pipes'; ...@@ -27,11 +29,13 @@ import * as Pipes from './pipes';
FormsModule, FormsModule,
RouterModule.forRoot([ RouterModule.forRoot([
{path: '', component: Components.PageTrombinoscopeComponent, pathMatch: 'full'}, {path: '', component: Components.PageTrombinoscopeComponent, pathMatch: 'full'},
{path: 'profil/:id', component: Components.PageProfilComponent, resolve: {person: Guards.ResolvePersonGuard}},
{path: '**', redirectTo: ''} {path: '**', redirectTo: ''}
]) ])
], ],
providers: [ providers: [
Services.PersonService Services.PersonService,
Guards.ResolvePersonGuard
], ],
bootstrap: [AppComponent] bootstrap: [AppComponent]
}) })
......
export * from './header/header.component'; export * from './header/header.component';
export * from './loader/loader.component'; export * from './loader/loader.component';
export * from './page-profil/page-profil.component';
export * from './page-trombinoscope/page-trombinoscope.component'; export * from './page-trombinoscope/page-trombinoscope.component';
export * from './trombinoscope-card/trombinoscope-card.component'; export * from './trombinoscope-card/trombinoscope-card.component';
<main>
<button [routerLink]="['']">Retour</button>
<div class="card">
<div class="header">
<img [src]="person.image">
</div>
<div class="content">
<h2 bp="text-center">{{ person.fullName | capitalize }}</h2>
<p bp="text-center">
<a [href]="'mailto:' + person.email">{{ person.email }}</a>
</p>
</div>
</div>
</main>
main {
width: 60%;
margin: 50px auto;
button {
display: flex;
align-items: center;
justify-content: center;
width: 184px;
height: 40px;
padding: 0 24px;
font-size: 18px;
font-weight: 600;
line-height: 40px;
background-color: #1976d2;
border-radius: 5px;
box-shadow: 0 2px 5px 0 rgba(0, 0, 0, .26);
box-sizing: border-box;
cursor: pointer;
color: #fff;
text-decoration: none;
text-transform: uppercase;
overflow: hidden;
border: none;
margin-bottom: 20px;
&:hover {
opacity: .9;
background-color: #198aef;
}
}
.card {
background-color: #eeeeee;
box-shadow: 0 0 3px rgba(0, 0, 0, .5);
border-radius: 3px;
.header {
background-color: #dfdfdf;
border-bottom: 1px solid rgba(0, 0, 0, 0.18);
height: 200px;
position: relative;
img {
width: auto;
height: 100%;
border-radius: 50%;
position: absolute;
top: 100px;
left: 50%;
transform: translateX(-50%);
border: 4px solid rgba(0, 0, 0, 0.18);
}
}
.content {
padding: 100px 0 50px;
h2 {
text-transform: capitalize;
color: #2c2e31;
font-size: 38px;
margin: 5px;
}
p {
color: #999;
font-size: 18px;
margin: 0;
}
}
}
}
import {Component, OnInit} from '@angular/core';
import {ActivatedRoute} from '@angular/router';
import {PersonModel} from '../../models';
@Component({
selector: 'app-page-profil',
templateUrl: './page-profil.component.html',
styleUrls: ['./page-profil.component.scss']
})
export class PageProfilComponent implements OnInit {
person: PersonModel;
constructor(private route: ActivatedRoute) {
}
ngOnInit() {
this.route.data.subscribe((data: { person: PersonModel }) => {
this.person = data.person;
});
}
}
...@@ -6,8 +6,9 @@ ...@@ -6,8 +6,9 @@
<app-trombinoscope-card <app-trombinoscope-card
*ngFor="let person of persons | searchPerson:searchField | orderByFullName" *ngFor="let person of persons | searchPerson:searchField | orderByFullName"
bp="3" [person]="person"
[person]="person"> [routerLink]="['/profil', person.id]"
bp="3">
</app-trombinoscope-card> </app-trombinoscope-card>
</ng-container> </ng-container>
<ng-template #loading> <ng-template #loading>
......
...@@ -2,6 +2,11 @@ ...@@ -2,6 +2,11 @@
background-color: #ffffff; background-color: #ffffff;
box-shadow: 0 6px 6px rgba(10, 16, 20, .15), 0 0 52px rgba(10, 16, 20, .12); box-shadow: 0 6px 6px rgba(10, 16, 20, .15), 0 0 52px rgba(10, 16, 20, .12);
padding: 30px; padding: 30px;
cursor: pointer;
&:hover {
box-shadow: 0 8px 8px rgba(10, 16, 20, .24), 0 0 8px rgba(10, 16, 20, .12);
}
h2 { h2 {
font-weight: 500; font-weight: 500;
......
export * from './resolve-person.guard';
import {Injectable} from '@angular/core';
import {ActivatedRouteSnapshot, Resolve, Router, RouterStateSnapshot} from '@angular/router';
import {PersonModel} from '../models';
import {PersonService} from '../services';
@Injectable()
export class ResolvePersonGuard implements Resolve<PersonModel> {
constructor(private personService: PersonService, private router: Router) {
}
async resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Promise<PersonModel> {
const id = +route.params.id;
try {
const person = await this.personService.getPerson(id);
if (person) {
return person;
}
} catch (e) {
}
this.router.navigateByUrl('');
return null;
}
}
...@@ -5,13 +5,15 @@ import {PersonModel} from '../models'; ...@@ -5,13 +5,15 @@ import {PersonModel} from '../models';
@Injectable() @Injectable()
export class PersonService { export class PersonService {
private static internalId = 0;
constructor(private httpClient: HttpClient) { constructor(private httpClient: HttpClient) {
} }
private static responseToPerson(data: any): PersonModel { private static responseToPerson(data: any): PersonModel {
const person = new PersonModel(); const person = new PersonModel();
person.id = data.id.value; person.id = this.internalId++;
person.firstname = data.name.first; person.firstname = data.name.first;
person.lastname = data.name.last; person.lastname = data.name.last;
person.email = data.email; person.email = data.email;
...@@ -21,6 +23,8 @@ export class PersonService { ...@@ -21,6 +23,8 @@ export class PersonService {
} }
public async getPersons(length: number = 20, seed: string = 'seed'): Promise<PersonModel[]> { public async getPersons(length: number = 20, seed: string = 'seed'): Promise<PersonModel[]> {
PersonService.internalId = 0;
const options = { const options = {
params: { params: {
results: length.toString(), results: length.toString(),
...@@ -31,4 +35,10 @@ export class PersonService { ...@@ -31,4 +35,10 @@ export class PersonService {
const result = await this.httpClient.get<{ results: [] }>(environment.api.persons, options).toPromise(); const result = await this.httpClient.get<{ results: [] }>(environment.api.persons, options).toPromise();
return result.results.map(element => PersonService.responseToPerson(element)); return result.results.map(element => PersonService.responseToPerson(element));
} }
public async getPerson(id: number): Promise<PersonModel> {
const persons = await this.getPersons();
return persons.find(person => person.id === id);
}
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment