initial
This commit is contained in:
commit
73897ea5b4
94 changed files with 32679 additions and 0 deletions
9
src/app/components/avis-bar/avis-bar.component.html
Normal file
9
src/app/components/avis-bar/avis-bar.component.html
Normal file
|
|
@ -0,0 +1,9 @@
|
|||
<div (mouseleave)="onMouseLeave()">
|
||||
<app-icon *ngFor="let star of starStates; let starIndex = index"
|
||||
[iconName]="star.stateHoverUser ? 'star-fill' : 'star'"
|
||||
[iconSize]="1.2"
|
||||
[iconColor]="'#ffbf00'"
|
||||
(mouseover)="onMouseOver(starIndex)"
|
||||
(click)="onClickStar(starIndex)"
|
||||
></app-icon>
|
||||
</div>
|
||||
0
src/app/components/avis-bar/avis-bar.component.scss
Normal file
0
src/app/components/avis-bar/avis-bar.component.scss
Normal file
25
src/app/components/avis-bar/avis-bar.component.spec.ts
Normal file
25
src/app/components/avis-bar/avis-bar.component.spec.ts
Normal file
|
|
@ -0,0 +1,25 @@
|
|||
import { ComponentFixture, TestBed } from '@angular/core/testing';
|
||||
|
||||
import { AvisBarComponent } from './avis-bar.component';
|
||||
|
||||
describe('AvisBarComponent', () => {
|
||||
let component: AvisBarComponent;
|
||||
let fixture: ComponentFixture<AvisBarComponent>;
|
||||
|
||||
beforeEach(async () => {
|
||||
await TestBed.configureTestingModule({
|
||||
declarations: [ AvisBarComponent ]
|
||||
})
|
||||
.compileComponents();
|
||||
});
|
||||
|
||||
beforeEach(() => {
|
||||
fixture = TestBed.createComponent(AvisBarComponent);
|
||||
component = fixture.componentInstance;
|
||||
fixture.detectChanges();
|
||||
});
|
||||
|
||||
it('should create', () => {
|
||||
expect(component).toBeTruthy();
|
||||
});
|
||||
});
|
||||
62
src/app/components/avis-bar/avis-bar.component.ts
Normal file
62
src/app/components/avis-bar/avis-bar.component.ts
Normal file
|
|
@ -0,0 +1,62 @@
|
|||
import { Component, OnInit } from '@angular/core';
|
||||
|
||||
@Component({
|
||||
selector: 'app-avis-bar',
|
||||
templateUrl: './avis-bar.component.html',
|
||||
styleUrls: ['./avis-bar.component.scss']
|
||||
})
|
||||
export class AvisBarComponent implements OnInit {
|
||||
starStates: {stateSelectedUser : boolean, stateHoverUser : boolean}[];
|
||||
|
||||
constructor() {
|
||||
this.starStates = [];
|
||||
|
||||
for (let index = 0; index < 5; index++) {
|
||||
this.starStates.push(
|
||||
{
|
||||
stateSelectedUser : false,
|
||||
stateHoverUser : false
|
||||
}
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
ngOnInit(): void {
|
||||
}
|
||||
|
||||
onMouseOver(index: number) {
|
||||
console.log("star over", index);
|
||||
for (let i = 0; i < this.starStates.length ; i++) {
|
||||
if(i <= index) {
|
||||
this.starStates[i].stateHoverUser = true;
|
||||
} else {
|
||||
this.starStates[i].stateHoverUser = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
onMouseLeave() {
|
||||
// this.starState = ['star', 'star', 'star', 'star', 'star'];
|
||||
const tempTab = [];
|
||||
for (let index = 0; index < this.starStates.length; index++) {
|
||||
tempTab.push(
|
||||
{
|
||||
stateSelectedUser : this.starStates[index].stateSelectedUser,
|
||||
stateHoverUser : this.starStates[index].stateSelectedUser
|
||||
}
|
||||
);
|
||||
}
|
||||
this.starStates = [...tempTab];
|
||||
}
|
||||
|
||||
onClickStar(starIndex: number) {
|
||||
for (let i = 0; i < this.starStates.length ; i++) {
|
||||
if(i <= starIndex) {
|
||||
this.starStates[i].stateSelectedUser = true;
|
||||
} else {
|
||||
this.starStates[i].stateSelectedUser = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
20
src/app/components/card-plante/card-plante.component.html
Normal file
20
src/app/components/card-plante/card-plante.component.html
Normal file
|
|
@ -0,0 +1,20 @@
|
|||
<div class="plant card mb-4" style="width: 14rem;">
|
||||
<app-icon class="like"
|
||||
[iconName]="plant.plantLike ? 'heart-fill' : 'heart'"
|
||||
[iconColor]="'#e35d6a'"
|
||||
(click)="onClickLike()"></app-icon>
|
||||
<img src="{{plant.product_url_picture}}" class="card-img-top" alt="Image de {{ plant.product_name }}">
|
||||
<div class="card-body">
|
||||
<h6 class="card-title">{{ plant.product_name }}</h6>
|
||||
<div class="card-content">
|
||||
<app-avis-bar></app-avis-bar>
|
||||
</div>
|
||||
|
||||
<div class="d-flex flex-row align-items-end justify-content-between">
|
||||
<div class="card-content">
|
||||
{{ plant.product_unitprice_ati }} €
|
||||
</div>
|
||||
<a href="#" class="btn btn-success">Pour moi !</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
14
src/app/components/card-plante/card-plante.component.scss
Normal file
14
src/app/components/card-plante/card-plante.component.scss
Normal file
|
|
@ -0,0 +1,14 @@
|
|||
.plant {
|
||||
min-height: 22rem;
|
||||
.card-body {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
justify-content: space-between;
|
||||
}
|
||||
}
|
||||
|
||||
.like {
|
||||
position: absolute;
|
||||
right: 0.7rem;
|
||||
top: 0.5rem;
|
||||
}
|
||||
25
src/app/components/card-plante/card-plante.component.spec.ts
Normal file
25
src/app/components/card-plante/card-plante.component.spec.ts
Normal file
|
|
@ -0,0 +1,25 @@
|
|||
import { ComponentFixture, TestBed } from '@angular/core/testing';
|
||||
|
||||
import { CardPlanteComponent } from './card-plante.component';
|
||||
|
||||
describe('CardPlanteComponent', () => {
|
||||
let component: CardPlanteComponent;
|
||||
let fixture: ComponentFixture<CardPlanteComponent>;
|
||||
|
||||
beforeEach(async () => {
|
||||
await TestBed.configureTestingModule({
|
||||
declarations: [ CardPlanteComponent ]
|
||||
})
|
||||
.compileComponents();
|
||||
});
|
||||
|
||||
beforeEach(() => {
|
||||
fixture = TestBed.createComponent(CardPlanteComponent);
|
||||
component = fixture.componentInstance;
|
||||
fixture.detectChanges();
|
||||
});
|
||||
|
||||
it('should create', () => {
|
||||
expect(component).toBeTruthy();
|
||||
});
|
||||
});
|
||||
22
src/app/components/card-plante/card-plante.component.ts
Normal file
22
src/app/components/card-plante/card-plante.component.ts
Normal file
|
|
@ -0,0 +1,22 @@
|
|||
import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core';
|
||||
|
||||
|
||||
@Component({
|
||||
selector: 'app-card-plante',
|
||||
templateUrl: './card-plante.component.html',
|
||||
styleUrls: ['./card-plante.component.scss']
|
||||
})
|
||||
export class CardPlanteComponent implements OnInit {
|
||||
@Input() plant: any;
|
||||
@Output() clickLike = new EventEmitter();
|
||||
constructor() { }
|
||||
|
||||
ngOnInit(): void {
|
||||
}
|
||||
|
||||
onClickLike() {
|
||||
console.log('click');
|
||||
this.clickLike.emit();
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,27 @@
|
|||
<div class="custom-side-bar flex-shrink-0 bg-white border-end">
|
||||
<div class="p-3">
|
||||
<span class="fs-5 fw-semibold">Filtres</span>
|
||||
</div>
|
||||
<ul class="list-unstyled ps-0 border-top">
|
||||
<div class="p-3">
|
||||
<p class="mb-1 fs-5 fw-semibold">Catégories</p>
|
||||
<div
|
||||
*ngFor="let category of listCategories; let indexCat = index"
|
||||
class="form-check">
|
||||
|
||||
<input
|
||||
class="form-check-input"
|
||||
type="checkbox"
|
||||
value="testcategory"
|
||||
id="checkBoxCategory{{indexCat}}">
|
||||
|
||||
<label class="form-check-label" for="checkBoxCategory{{indexCat}}">
|
||||
{{ category }}
|
||||
</label>
|
||||
</div>
|
||||
<div *ngIf="listCategories.length == 0 ">
|
||||
Aucune catégorie disponible
|
||||
</div>
|
||||
</div>
|
||||
</ul>
|
||||
</div>
|
||||
|
|
@ -0,0 +1,5 @@
|
|||
.custom-side-bar {
|
||||
min-height: calc(100vh - 54px);
|
||||
width: 280px;
|
||||
height: 100%;
|
||||
}
|
||||
|
|
@ -0,0 +1,25 @@
|
|||
import { ComponentFixture, TestBed } from '@angular/core/testing';
|
||||
|
||||
import { FilterSideBarComponent } from './filter-side-bar.component';
|
||||
|
||||
describe('FilterSideBarComponent', () => {
|
||||
let component: FilterSideBarComponent;
|
||||
let fixture: ComponentFixture<FilterSideBarComponent>;
|
||||
|
||||
beforeEach(async () => {
|
||||
await TestBed.configureTestingModule({
|
||||
declarations: [ FilterSideBarComponent ]
|
||||
})
|
||||
.compileComponents();
|
||||
});
|
||||
|
||||
beforeEach(() => {
|
||||
fixture = TestBed.createComponent(FilterSideBarComponent);
|
||||
component = fixture.componentInstance;
|
||||
fixture.detectChanges();
|
||||
});
|
||||
|
||||
it('should create', () => {
|
||||
expect(component).toBeTruthy();
|
||||
});
|
||||
});
|
||||
|
|
@ -0,0 +1,18 @@
|
|||
import { Component, Input, OnInit } from '@angular/core';
|
||||
|
||||
@Component({
|
||||
selector: 'app-filter-side-bar',
|
||||
templateUrl: './filter-side-bar.component.html',
|
||||
styleUrls: ['./filter-side-bar.component.scss']
|
||||
})
|
||||
export class FilterSideBarComponent implements OnInit {
|
||||
@Input() listCategories: string[];
|
||||
|
||||
constructor() {
|
||||
this.listCategories = [];
|
||||
}
|
||||
|
||||
ngOnInit(): void {
|
||||
}
|
||||
|
||||
}
|
||||
2
src/app/components/icon/icon.component.html
Normal file
2
src/app/components/icon/icon.component.html
Normal file
|
|
@ -0,0 +1,2 @@
|
|||
<i class="bi-{{iconName}}"
|
||||
[ngStyle]="{'font-size.rem': iconSize, 'color': iconColor}"></i>
|
||||
3
src/app/components/icon/icon.component.scss
Normal file
3
src/app/components/icon/icon.component.scss
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
i {
|
||||
cursor: pointer;
|
||||
}
|
||||
25
src/app/components/icon/icon.component.spec.ts
Normal file
25
src/app/components/icon/icon.component.spec.ts
Normal file
|
|
@ -0,0 +1,25 @@
|
|||
import { ComponentFixture, TestBed } from '@angular/core/testing';
|
||||
|
||||
import { IconComponent } from './icon.component';
|
||||
|
||||
describe('IconComponent', () => {
|
||||
let component: IconComponent;
|
||||
let fixture: ComponentFixture<IconComponent>;
|
||||
|
||||
beforeEach(async () => {
|
||||
await TestBed.configureTestingModule({
|
||||
declarations: [ IconComponent ]
|
||||
})
|
||||
.compileComponents();
|
||||
});
|
||||
|
||||
beforeEach(() => {
|
||||
fixture = TestBed.createComponent(IconComponent);
|
||||
component = fixture.componentInstance;
|
||||
fixture.detectChanges();
|
||||
});
|
||||
|
||||
it('should create', () => {
|
||||
expect(component).toBeTruthy();
|
||||
});
|
||||
});
|
||||
17
src/app/components/icon/icon.component.ts
Normal file
17
src/app/components/icon/icon.component.ts
Normal file
|
|
@ -0,0 +1,17 @@
|
|||
import { Component, Input, OnInit } from '@angular/core';
|
||||
|
||||
@Component({
|
||||
selector: 'app-icon',
|
||||
templateUrl: './icon.component.html',
|
||||
styleUrls: ['./icon.component.scss']
|
||||
})
|
||||
export class IconComponent implements OnInit {
|
||||
@Input() iconName!: string;
|
||||
@Input() iconSize!: number;
|
||||
@Input() iconColor!: string;
|
||||
constructor() { }
|
||||
|
||||
ngOnInit(): void {
|
||||
}
|
||||
|
||||
}
|
||||
27
src/app/components/nav-bar/nav-bar.component.html
Normal file
27
src/app/components/nav-bar/nav-bar.component.html
Normal file
|
|
@ -0,0 +1,27 @@
|
|||
<nav class="navbar sticky-top navbar-expand-lg navbar-light bg-light shadow ">
|
||||
<div class="container-fluid">
|
||||
<a class="navbar-brand" href="#">🪴 La Belle Plante</a>
|
||||
<button class="navbar-toggler"
|
||||
type="button"
|
||||
data-bs-toggle="collapse"
|
||||
data-bs-target="#navbarNavAltMarkup"
|
||||
aria-controls="navbarNavAltMarkup"
|
||||
aria-expanded="false"
|
||||
aria-label="Toggle navigation">
|
||||
<span class="navbar-toggler-icon"></span>
|
||||
</button>
|
||||
<div class="collapse navbar-collapse" id="navbarNavAltMarkup">
|
||||
<div class="navbar-nav">
|
||||
<a routerLink="home" routerLinkActive="active-custom" class="nav-link">Accueil</a>
|
||||
<a routerLink="details" routerLinkActive="active-custom" class="nav-link">Details</a>
|
||||
<a routerLink="account/signin" routerLinkActive="active-custom" class="nav-link">Se connecter</a>
|
||||
<a routerLink="account/user" routerLinkActive="active-custom" class="nav-link">Mon compte</a>
|
||||
<a class="nav-link">Panier</a>
|
||||
<a class="nav-link disabled">Plus d'option bientôt</a>
|
||||
<a class="nav-link disabled" *ngIf="likeCounter == 0"> Pas de plante likée</a>
|
||||
<a class="nav-link disabled" *ngIf="likeCounter == 1">Plante likée : {{ likeCounter }}</a>
|
||||
<a class="nav-link disabled" *ngIf="likeCounter > 1">Plantes likées : {{ likeCounter }}</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</nav>
|
||||
3
src/app/components/nav-bar/nav-bar.component.scss
Normal file
3
src/app/components/nav-bar/nav-bar.component.scss
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
.active-custom {
|
||||
color: green !important;
|
||||
}
|
||||
25
src/app/components/nav-bar/nav-bar.component.spec.ts
Normal file
25
src/app/components/nav-bar/nav-bar.component.spec.ts
Normal file
|
|
@ -0,0 +1,25 @@
|
|||
import { ComponentFixture, TestBed } from '@angular/core/testing';
|
||||
|
||||
import { NavBarComponent } from './nav-bar.component';
|
||||
|
||||
describe('NavBarComponent', () => {
|
||||
let component: NavBarComponent;
|
||||
let fixture: ComponentFixture<NavBarComponent>;
|
||||
|
||||
beforeEach(async () => {
|
||||
await TestBed.configureTestingModule({
|
||||
declarations: [ NavBarComponent ]
|
||||
})
|
||||
.compileComponents();
|
||||
});
|
||||
|
||||
beforeEach(() => {
|
||||
fixture = TestBed.createComponent(NavBarComponent);
|
||||
component = fixture.componentInstance;
|
||||
fixture.detectChanges();
|
||||
});
|
||||
|
||||
it('should create', () => {
|
||||
expect(component).toBeTruthy();
|
||||
});
|
||||
});
|
||||
31
src/app/components/nav-bar/nav-bar.component.ts
Normal file
31
src/app/components/nav-bar/nav-bar.component.ts
Normal file
|
|
@ -0,0 +1,31 @@
|
|||
import { Component, OnDestroy, OnInit } from '@angular/core';
|
||||
import { Subscription } from 'rxjs';
|
||||
import { PlantouneService } from 'src/app/services/plantoune.service';
|
||||
|
||||
@Component({
|
||||
selector: 'app-nav-bar',
|
||||
templateUrl: './nav-bar.component.html',
|
||||
styleUrls: ['./nav-bar.component.scss']
|
||||
})
|
||||
export class NavBarComponent implements OnInit, OnDestroy {
|
||||
likeCounter: number;
|
||||
subPlantLiked!: Subscription;
|
||||
|
||||
constructor(private plantouneService: PlantouneService) {
|
||||
this.likeCounter = 0;
|
||||
}
|
||||
|
||||
ngOnInit(): void {
|
||||
this.subPlantLiked = this.plantouneService.plantLiked$.subscribe(
|
||||
() => {
|
||||
console.log('Get new event from Subject');
|
||||
this.likeCounter ++;
|
||||
}
|
||||
)
|
||||
}
|
||||
|
||||
ngOnDestroy(): void {
|
||||
this.subPlantLiked.unsubscribe();
|
||||
}
|
||||
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue