parent
723907b907
commit
c5b01c39db
@ -1,5 +1,5 @@
|
|||||||
<div>
|
<div>
|
||||||
<h1>Projet Book</h1>
|
<h1>Projet Recipe</h1>
|
||||||
<br />
|
<br />
|
||||||
<p>Bienvenue sur Book</p>
|
<p>Bienvenue sur Recipe</p>
|
||||||
</div>
|
</div>
|
||||||
|
@ -1,11 +1,62 @@
|
|||||||
<button (click)="navToAddRecipe()">Add Recipe</button>
|
<div *ngIf="recipes.length > 0">
|
||||||
<div *ngFor="let recipe of recipes">
|
<h2>List of recipes</h2>
|
||||||
<h3>{{ recipe.name }}</h3>
|
<button mat-raised-button color="primary" (click)="navToAddRecipe()">
|
||||||
<p>{{ recipe.description }}</p>
|
Add Recipe
|
||||||
<img *ngIf="recipe.image" [src]="recipe.image" alt="{{ recipe.name }}" />
|
</button>
|
||||||
<ul>
|
<table mat-table [dataSource]="dataSource" class="mat-elevation-z8">
|
||||||
<li *ngFor="let ingredient of recipe.ingredients">
|
<!-- Name Column -->
|
||||||
{{ ingredient.name }}: {{ getQuantity(recipe.id, ingredient.id) }}
|
<ng-container matColumnDef="name">
|
||||||
</li>
|
<th mat-header-cell *matHeaderCellDef>Name</th>
|
||||||
</ul>
|
<td mat-cell *matCellDef="let recipe">{{ recipe.name }}</td>
|
||||||
|
</ng-container>
|
||||||
|
|
||||||
|
<!-- Description Column -->
|
||||||
|
<ng-container matColumnDef="description">
|
||||||
|
<th mat-header-cell *matHeaderCellDef>Description</th>
|
||||||
|
<td mat-cell *matCellDef="let recipe">{{ recipe.description }}</td>
|
||||||
|
</ng-container>
|
||||||
|
|
||||||
|
<!-- Image Column -->
|
||||||
|
<ng-container matColumnDef="image">
|
||||||
|
<th mat-header-cell *matHeaderCellDef>Image</th>
|
||||||
|
<td mat-cell *matCellDef="let recipe">
|
||||||
|
<img
|
||||||
|
*ngIf="recipe.image; else placeholder"
|
||||||
|
[src]="recipe.image"
|
||||||
|
alt="{{ recipe.name }}"
|
||||||
|
style="max-width: 200px; max-height: 200px"
|
||||||
|
/>
|
||||||
|
<ng-template #placeholder>
|
||||||
|
<img
|
||||||
|
src="https://placehold.co/200x200"
|
||||||
|
alt="Placeholder Image"
|
||||||
|
style="max-width: 200px; max-height: 200px"
|
||||||
|
/>
|
||||||
|
</ng-template>
|
||||||
|
</td>
|
||||||
|
</ng-container>
|
||||||
|
|
||||||
|
<!-- Action Column -->
|
||||||
|
<ng-container matColumnDef="actions">
|
||||||
|
<th mat-header-cell *matHeaderCellDef>Show</th>
|
||||||
|
<td mat-cell *matCellDef="let recipe">
|
||||||
|
<button mat-button color="warn" (click)="onSelectRecipe(recipe)">
|
||||||
|
Show
|
||||||
|
</button>
|
||||||
|
</td>
|
||||||
|
</ng-container>
|
||||||
|
|
||||||
|
<tr mat-header-row *matHeaderRowDef="displayedColumns"></tr>
|
||||||
|
<tr
|
||||||
|
mat-row
|
||||||
|
*matRowDef="let row; columns: displayedColumns"
|
||||||
|
(click)="onSelectRecipe(row)"
|
||||||
|
></tr>
|
||||||
|
</table>
|
||||||
|
<mat-paginator
|
||||||
|
[length]="recipes.length"
|
||||||
|
[pageSize]="5"
|
||||||
|
[pageSizeOptions]="[5, 10, 20]"
|
||||||
|
>
|
||||||
|
</mat-paginator>
|
||||||
</div>
|
</div>
|
||||||
|
@ -1 +1,38 @@
|
|||||||
<p>recipe works!</p>
|
<div *ngIf="recipe">
|
||||||
|
<mat-card class="example-card" appearance="outlined">
|
||||||
|
<mat-card-header>
|
||||||
|
<mat-card-title-group>
|
||||||
|
<mat-card-title>{{ recipe.name }}</mat-card-title>
|
||||||
|
<mat-card-subtitle>{{ recipe.description }}</mat-card-subtitle>
|
||||||
|
<img
|
||||||
|
mat-card-xl-image
|
||||||
|
*ngIf="recipe.image; else placeholder"
|
||||||
|
[src]="recipe.image"
|
||||||
|
alt="{{ recipe.name }}"
|
||||||
|
style="max-width: 500px; max-height: 500px"
|
||||||
|
/>
|
||||||
|
<ng-template #placeholder>
|
||||||
|
<img
|
||||||
|
mat-card-xl-image
|
||||||
|
src="https://placehold.co/500x500"
|
||||||
|
alt="Placeholder Image"
|
||||||
|
style="max-width: 500px; max-height: 500px"
|
||||||
|
/>
|
||||||
|
</ng-template>
|
||||||
|
</mat-card-title-group>
|
||||||
|
</mat-card-header>
|
||||||
|
<mat-card-content>
|
||||||
|
<h2>Ingredients</h2>
|
||||||
|
<ul>
|
||||||
|
<li *ngFor="let ingredient of recipe.ingredients">
|
||||||
|
{{ ingredient.name }}: {{ getIngredientQuantity(ingredient.id) }}
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</mat-card-content>
|
||||||
|
<mat-card-actions>
|
||||||
|
<button mat-raised-button color="primary" (click)="navBack()">
|
||||||
|
Back to list
|
||||||
|
</button>
|
||||||
|
</mat-card-actions>
|
||||||
|
</mat-card>
|
||||||
|
</div>
|
||||||
|
@ -0,0 +1,4 @@
|
|||||||
|
.example-card {
|
||||||
|
max-width: 600px;
|
||||||
|
margin-bottom: 8px;
|
||||||
|
}
|
@ -1,12 +1,51 @@
|
|||||||
import { Component } from '@angular/core';
|
import { Component, OnInit } from '@angular/core';
|
||||||
|
import { ActivatedRoute } from '@angular/router';
|
||||||
|
import { Recipe } from '../models/recipe';
|
||||||
|
import { IngredientRecipe } from '../models/ingredient-recipe';
|
||||||
|
import { CommonModule } from '@angular/common';
|
||||||
|
import { MatButtonModule } from '@angular/material/button';
|
||||||
|
import { MatCardModule } from '@angular/material/card';
|
||||||
|
|
||||||
@Component({
|
@Component({
|
||||||
selector: 'app-recipe',
|
selector: 'app-recipe',
|
||||||
standalone: true,
|
standalone: true,
|
||||||
imports: [],
|
imports: [CommonModule, MatButtonModule, MatCardModule],
|
||||||
templateUrl: './recipe.component.html',
|
templateUrl: './recipe.component.html',
|
||||||
styleUrl: './recipe.component.scss'
|
styleUrls: ['./recipe.component.scss'],
|
||||||
})
|
})
|
||||||
export class RecipeComponent {
|
export class RecipeComponent implements OnInit {
|
||||||
|
recipe: Recipe | undefined;
|
||||||
|
ingredientRecipes: IngredientRecipe[] = [];
|
||||||
|
|
||||||
|
constructor(private route: ActivatedRoute) {}
|
||||||
|
|
||||||
|
ngOnInit(): void {
|
||||||
|
const recipeId = this.route.snapshot.paramMap.get('id');
|
||||||
|
const recipes: Recipe[] = JSON.parse(
|
||||||
|
localStorage.getItem('recipes') || '[]'
|
||||||
|
);
|
||||||
|
this.recipe = recipes.find((r) => r.id.toString() === recipeId);
|
||||||
|
|
||||||
|
if (this.recipe) {
|
||||||
|
this.ingredientRecipes = this.getIngredientRecipes(this.recipe.id);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
getIngredientRecipes(recipeId: number): IngredientRecipe[] {
|
||||||
|
const ingredientRecipes: IngredientRecipe[] = JSON.parse(
|
||||||
|
localStorage.getItem('ingredientRecipes') || '[]'
|
||||||
|
);
|
||||||
|
return ingredientRecipes.filter((ir) => ir.idRecipe === recipeId);
|
||||||
|
}
|
||||||
|
|
||||||
|
getIngredientQuantity(ingredientId: number): number {
|
||||||
|
const ingredientRecipe = this.ingredientRecipes.find(
|
||||||
|
(ir) => ir.idIngredient === ingredientId
|
||||||
|
);
|
||||||
|
return ingredientRecipe ? ingredientRecipe.quantity : 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
navBack(): void {
|
||||||
|
window.history.back();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in new issue