Browse Source

Add to cart functionality completed

master
kj1352 6 years ago
parent
commit
beaf5ec26f
8 changed files with 124 additions and 31 deletions
  1. +7
    -18
      src/app/mocks/menu-items.ts
  2. +1
    -1
      src/app/mocks/outlets.ts
  3. +7
    -1
      src/app/outlet-details/outlet-details.page.html
  4. +25
    -0
      src/app/outlet-details/outlet-details.page.scss
  5. +66
    -1
      src/app/outlet-details/outlet-details.page.ts
  6. +14
    -2
      src/app/services/cart-item.service.ts
  7. +3
    -7
      src/app/services/mall.service.ts
  8. +1
    -1
      src/app/services/menu-item.service.ts

+ 7
- 18
src/app/mocks/menu-items.ts View File

@@ -13,26 +13,15 @@ export const MENU_ITEMS_1 = [new MenuItem({
tags: ['burger', 'breakfast'] tags: ['burger', 'breakfast']
}), new MenuItem({ }), new MenuItem({
id: '0002', id: '0002',
name: 'McAloo Tikki',
name: 'McChicken Tikki',
image_url: 'https://www.mcdonalds.com.my/images/nasi_lemak/burger/burger.jpg?id=bb965dd67df3afa52033', image_url: 'https://www.mcdonalds.com.my/images/nasi_lemak/burger/burger.jpg?id=bb965dd67df3afa52033',
description: 'the patties are very unique and is prepared mainly with mashed potatoes and green peas. the flagship mcaloo tikki recipe from McDonalds involves a special sauce which is basically a combination of tomato sauce and mayonnaise. aloo tikki burger recipe.',
is_vegeterian: true,
wait_duration: 13,
price: 120,
discount: 50,
rating: 4.0,
tags: ['spicy', 'dinner']
}), new MenuItem({
id: '0003',
name: 'McPork',
image_url: 'https://www.mcdonalds.com.my/images/nasi_lemak/burger/burger.jpg?id=bb965dd67df3afa52033',
description: 'the patties are very unique and is prepared mainly with mashed potatoes and green peas. the flagship mcaloo tikki recipe from McDonalds involves a special sauce which is basically a combination of tomato sauce and mayonnaise. aloo tikki burger recipe.',
description: 'the patties are very unique and is prepared mainly with mashed potatoes and green peas. the flagship McChicken tikki recipe from McDonalds involves a special sauce which is basically a combination of tomato sauce and mayonnaise. Chicken Tikka burger recipe.',
is_vegeterian: false, is_vegeterian: false,
wait_duration: 20,
price: 300,
discount: 5,
rating: 4.9,
tags: ['spicy', 'dinner', 'pork']
wait_duration: 10,
price: 90,
discount: 10,
rating: 4,
tags: ['burger', 'spicy', 'chicken']
})]; })];


export const MENU_ITEMS_2 = [new MenuItem({ export const MENU_ITEMS_2 = [new MenuItem({


+ 1
- 1
src/app/mocks/outlets.ts View File

@@ -7,7 +7,7 @@ export const OUTLETS: Outlet[] = [new Outlet({
image_url: 'https://images.markets.businessinsider.com/image/5a74835585cdd489228b47be-900/shutterstock643079686.jpg', image_url: 'https://images.markets.businessinsider.com/image/5a74835585cdd489228b47be-900/shutterstock643079686.jpg',
name: 'McDonalds', name: 'McDonalds',
description: 'Veg / Non-Veg Food Restaurant', description: 'Veg / Non-Veg Food Restaurant',
tags: ['dinner', 'spicy', 'breakfast', 'pork'],
tags: ['dinner', 'spicy', 'chicken', 'pork'],
menu_items: MENU_ITEMS_1.map((menu_item) => menu_item.id), menu_items: MENU_ITEMS_1.map((menu_item) => menu_item.id),
offers: OFFERS.map((offer) => offer.id), offers: OFFERS.map((offer) => offer.id),
outlet_type: OutletType.FOOD, outlet_type: OutletType.FOOD,


+ 7
- 1
src/app/outlet-details/outlet-details.page.html View File

@@ -81,7 +81,13 @@
<span class="discounted"> @ Rs {{ calculateDiscount(item.price, item.discount) }}/-* </span> <span class="discounted"> @ Rs {{ calculateDiscount(item.price, item.discount) }}/-* </span>
<span class="actual-price"> Rs {{ item.price }}/- </span> <span class="actual-price"> Rs {{ item.price }}/- </span>
</div> </div>
<button class="cart-button"> Add to Cart </button>
<button class="cart-button" (click)="addToCart(item)"
*ngIf="!checkIfPresentInCart(item.id)"> Add to Cart </button>
<div class="count-buttons-holder" *ngIf="checkIfPresentInCart(item.id)">
<ion-button (click)="decreaseCartItemCount(item.id)"> <ion-icon name="remove"></ion-icon> </ion-button>
<div class="count"> {{ getItemCount(item.id) }} </div>
<ion-button (click)="increaseCartItemCount(item.id)"> <ion-icon name="add"></ion-icon> </ion-button>
</div>
</div> </div>


</div> </div>


+ 25
- 0
src/app/outlet-details/outlet-details.page.scss View File

@@ -401,3 +401,28 @@
object-fit: cover; object-fit: cover;
} }
} }

.count-buttons-holder {
display: flex;
width: 100%;
justify-content: space-between;
align-items: center;
background-color: #efefef;

ion-button {
margin: 0;
width: 30px;
height: 30px;
--padding-start: 0;
--padding-end: 0;
--padding-top: 0;
--padding-bottom: 0;
font-size: 10px;
--background: var(--brand-blue);
}

.count {
color: var(--brand-dark-grey);
font-size: 12px;
}
}

+ 66
- 1
src/app/outlet-details/outlet-details.page.ts View File

@@ -6,6 +6,7 @@ import { IMall } from '../models/mall';
import CartItem from '../models/cart-item'; import CartItem from '../models/cart-item';
import { IOutlet } from '../models/outlet'; import { IOutlet } from '../models/outlet';
import MenuItem from '../models/menu-item'; import MenuItem from '../models/menu-item';
import { CartItemService } from '../services/cart-item.service';


@Component({ @Component({
selector: 'app-outlet-details', selector: 'app-outlet-details',
@@ -22,18 +23,23 @@ export class OutletDetailsPage implements OnInit {
selected_description: string = null; selected_description: string = null;
show_sort_popup: boolean = false; show_sort_popup: boolean = false;
selected_sort: string = null; selected_sort: string = null;
cart: Array<CartItem> = [];
cart_items: Array<CartItem>;


constructor( constructor(
private route: ActivatedRoute, private route: ActivatedRoute,
private location: Location, private location: Location,
private mallService: MallService, private mallService: MallService,
private cartService: CartItemService
) { } ) { }


ngOnInit() { ngOnInit() {
let mall_id = this.route.snapshot.paramMap.get('mall_id'); let mall_id = this.route.snapshot.paramMap.get('mall_id');
let outlet_id = this.route.snapshot.paramMap.get('outlet_id'); let outlet_id = this.route.snapshot.paramMap.get('outlet_id');


this.cartService.getAllCartItems().then((data: Array<CartItem>) => {
this.cart_items = data;
});

this.mallService.getMallByID(mall_id).then((data: IMall) => { this.mallService.getMallByID(mall_id).then((data: IMall) => {
this.mall_details = data; this.mall_details = data;
this.outlet_details = this.mall_details.outlets.find((outlet) => outlet.id === outlet_id); this.outlet_details = this.mall_details.outlets.find((outlet) => outlet.id === outlet_id);
@@ -45,6 +51,65 @@ export class OutletDetailsPage implements OnInit {
this.location.back(); this.location.back();
} }


addToCart(item: MenuItem) {
this.cart_items.push({
menu_item: item.id,
quantity: 1,
pickup_time: new Date(new Date().setMinutes(new Date().getMinutes() + item.wait_duration)),
outlet_id: this.outlet_details.id,
mall_id: this.mall_details.id,
is_parcel: false,
total_price: this.calculateDiscount(item.price, item.discount)
});

this.cartService.updateCartItems(this.cart_items);
}

checkIfPresentInCart(id: string) {
let i: number;
for (i = 0; i < this.cart_items.length; i += 1) {
if (this.cart_items[i].menu_item === id) {
return true;
}
}
return false;
}


getItemCount(id: string) {
let i: number;
for (i = 0; i < this.cart_items.length; i += 1) {
if (this.cart_items[i].menu_item === id) {
return this.cart_items[i].quantity;
}
}
return 0;
}


increaseCartItemCount(id: string) {
let i: number;
for (i = 0; i < this.cart_items.length; i += 1) {
if (this.cart_items[i].menu_item === id) {
this.cart_items[i].quantity += 1;
}
}
this.cartService.updateCartItems(this.cart_items);
}

decreaseCartItemCount(id: string) {
let i: number;
for (i = 0; i < this.cart_items.length; i += 1) {
if (this.cart_items[i].menu_item === id) {
this.cart_items[i].quantity -= 1;
if (this.cart_items[i].quantity === 0) {
this.cart_items.splice(i, 1);
}
}
}
this.cartService.updateCartItems(this.cart_items);
}

onScroll(event: any) { onScroll(event: any) {
if (event.detail.scrollTop > 100) { if (event.detail.scrollTop > 100) {
this.show_top_bar = true; this.show_top_bar = true;


+ 14
- 2
src/app/services/cart-item.service.ts View File

@@ -1,9 +1,21 @@
import { Injectable } from '@angular/core'; import { Injectable } from '@angular/core';
import CartItem from '../models/cart-item';


@Injectable({ @Injectable({
providedIn: 'root'
providedIn: 'root'
}) })
export class CartItemService { export class CartItemService {
cart_items: Array<CartItem> = [];

constructor() { }

async updateCartItems(cart_items: Array<CartItem>) {
this.cart_items = cart_items;
return await this.cart_items;
}

async getAllCartItems() {
return await this.cart_items;
}


constructor() { }
} }

+ 3
- 7
src/app/services/mall.service.ts View File

@@ -13,9 +13,7 @@ export class MallService {
constructor( constructor(
private offerService: OfferService, private offerService: OfferService,
private outletService: OutletService private outletService: OutletService
) {
this.fetchMalls();
}
) { }


private getDenormalizedMall = async (mall: Mall) => { private getDenormalizedMall = async (mall: Mall) => {
const offers = await Promise.all(mall.offers.map(offer_id => this.offerService.getOfferByID(offer_id))); const offers = await Promise.all(mall.offers.map(offer_id => this.offerService.getOfferByID(offer_id)));
@@ -28,15 +26,13 @@ export class MallService {
}; };
} }


private async fetchMalls() {
this.malls = await Promise.all(MALLS.map(this.getDenormalizedMall));
}

public async getAllMalls() { public async getAllMalls() {
this.malls = await Promise.all(MALLS.map(this.getDenormalizedMall));
return this.malls; return this.malls;
} }


public async getMallByID(id: string) { public async getMallByID(id: string) {
this.malls = await Promise.all(MALLS.map(this.getDenormalizedMall));
return this.malls.find((mall) => mall.id === id); return this.malls.find((mall) => mall.id === id);
} }
} }

+ 1
- 1
src/app/services/menu-item.service.ts View File

@@ -6,7 +6,7 @@ import MenuItem from '../models/menu-item';
providedIn: 'root' providedIn: 'root'
}) })
export class MenuItemService { export class MenuItemService {
menu_items: Array<MenuItem> = MENU_ITEMS_1 && MENU_ITEMS_2;
menu_items: Array<MenuItem> = MENU_ITEMS_1.concat(MENU_ITEMS_2);


constructor() { } constructor() { }




Loading…
Cancel
Save