Here is the full card page design for ionic and woocommerce amd increment and decrements:
.html
<ion-header>
<ion-navbar>
<ion-title style="text-align: center"> Keep Shopping </ion-title>
</ion-navbar>
</ion-header>
<ion-content padding>
<ion-card class="card-discreption">
<ion-grid>
<ion-row>
<ion-col>Your Cart Description</ion-col>
</ion-row>
<ion-row [hidden]="!showEmptyCartMessage">
<ion-col>There are no products in your cart!</ion-col>
<ion-col style="color: red"> Please Note: At least one product is required here to go ahead! </ion-col>
</ion-row>
</ion-grid>
</ion-card>
<ion-card *ngFor="let item of cartItems; let i = index">
<ion-item color="light">
<ion-thumbnail item-left>
<img [src]="item.product.images[0].src" class="img-width" />
</ion-thumbnail>
<h2>{{ item.product.title }}</h2>
<p *ngIf="item.variation"><span *ngFor="let att of item.variation.attributes">{{ att.option | titlecase }} </span></p>
<p>{{ item.qty }} •
<span *ngIf="!item.variation">{{ item.product.price }}</span>
<span *ngIf="item.variation">{{ item.variation.price }}</span></p>
</ion-item>
<ion-item class="compact">
<ion-row no-padding>
<ion-col col-8>
<button ion-button icon-only clear color="danger" (click)="changeQty(item, i, -1)">
<ion-icon name="remove-circle"></ion-icon>
</button>
<button ion-button clear color="danger"> {{ item.qty }} </button>
<button ion-button icon-only clear color="danger" (click)="changeQty(item, i, 1)">
<ion-icon name="add-circle"></ion-icon>
</button>
</ion-col>
<ion-col col-4 style="text-align: right;">
<button ion-button small outline (click)="removeFromCart(item, i)" color="danger" style="width: 64px;">Remove</button>
</ion-col>
</ion-row>
</ion-item>
</ion-card>
<ion-grid>
<ion-card>
<ion-grid>
<ion-row>
<ion-col col-1>
</ion-col>
<ion-col col-4>
<b>TOTAL</b>
</ion-col>
<ion-col col-3>
</ion-col>
<ion-col col-3>
<b> ${{ total }} </b>
</ion-col>
</ion-row>
</ion-grid>
</ion-card>
</ion-grid>
</ion-content>
<ion-footer>
<ion-toolbar>
<ion-grid>
<ion-row>
<ion-col>
<button ion-button color="danger" outline block (click)="closeModal()">Back</button>
</ion-col>
<ion-col>
<button ion-button color="danger" block (click)="checkout()" [disabled]="showEmptyCartMessage">Checkout</button>
</ion-col>
</ion-row>
</ion-grid>
</ion-toolbar>
</ion-footer>
.ts file:
import { Component } from '@angular/core';
import {NavController, NavParams, ViewController, ToastController, LoadingController} from 'ionic-angular';
import { Storage } from '@ionic/storage';
import { CheckoutPage } from '../checkout/checkout';
import { LoginPage } from '../login/login';
@Component({
selector: 'page-cart',
templateUrl: 'cart.html',
})
export class CartPage {
cartItems: any[] = [];
total: any;
showEmptyCartMessage: boolean = false;
constructor(public navCtrl: NavController, public navParams: NavParams, private loadCtrl: LoadingController ,public storage: Storage, public viewCtrl: ViewController, public toastController: ToastController) {
const run = this.loadCtrl.create({content: 'Please wait...'});
run.present();
setTimeout(() => {
this.total = 0.0;
this.storage.ready().then(()=>{
this.storage.get("cart").then( (data)=>{
this.cartItems = data;
console.log(this.cartItems);
if(this.cartItems.length > 0){
this.cartItems.forEach( (item, index)=> {
if(item.variation){
this.total = this.total + (parseFloat(item.variation.price) * item.qty);
} else {
this.total = this.total + (item.product.price * item.qty)
}
})
} else {
this.showEmptyCartMessage = true;
}
})
})
run.dismissAll();
}, 2000)
this.test();
}
removeFromCart(item, i){
const run = this.loadCtrl.create({content: 'Please wait...'});
run.present();
setTimeout(() => {
let price;
if(item.variation){
price = item.variation.price;
run.dismissAll()
} else {
price = item.product.price;
run.dismissAll();
}
let qty = item.qty;
this.cartItems.splice(i, 1);
this.storage.set("cart", this.cartItems).then( ()=> {
this.total = this.total - (price * qty);
});
if(this.cartItems.length == 0){
this.showEmptyCartMessage = true;
run.dismissAll();
}
}, 1000)
}
closeModal(){
const run = this.loadCtrl.create({content: 'Please wait...'});
run.present();
setTimeout(() => {
this.viewCtrl.dismiss();
run.dismissAll();
}, 1000)
}
test() {
const run = this.loadCtrl.create({content: 'Please wait...'});
run.present();
setTimeout(() => {
this.storage.get("enrolled").then( (data) => {
console.log(data)
})
}, 20)
}
checkout(){
const run = this.loadCtrl.create({content: 'Please wait...'});
run.present();
setTimeout(() => {
this.storage.get("userLoginInfo").then( (data) => {
if(data != null){
this.navCtrl.push(CheckoutPage);
run.dismissAll();
} else {
this.navCtrl.push(LoginPage, {next: CheckoutPage})
run.dismissAll();
}
})
}, 2000)
}
changeQty(item, i, change){
const run = this.loadCtrl.create({content: 'Please wait...'});
run.present();
setTimeout(() => {
let price;
if(!item.variation) {
price = item.product.price;
run.dismissAll();
}
else {
price = parseFloat(item.variation.price);
run.dismissAll();
}
let qty = item.qty;
if(change < 0 && item.qty == 1){
return;
}
qty = qty + change;
item.qty = qty;
item.amount = qty * price;
this.cartItems[i] = item;
this.storage.set("cart", this.cartItems).then( ()=> {
this.toastController.create({
message: "Cart Updated.",
duration: 2000,
showCloseButton: true
}).present();
});
this.total = (parseFloat(this.total.toString()) + (parseFloat(price.toString()) * change));
}, 5)
}
}
.scss
page-cart {
ion-header.header.header-md ion-navbar.toolbar.toolbar-md div {
background: purple !important;
color: white !important;
}
page-cart .item-md-light, page-cart .item-divider-md-light {
color: #000;
background-color: #fff !important;
border-top: 2px solid #f53d3d;
border-radius: 1px;
border-bottom: 1px solid #333 !important;
padding: 8px 15px !important;
}
.item-md-light, .item-divider-md-light {
background-color: #ffffff !important;
border-top: 3px solid gold;
border-radius: 1px;
border-bottom: 1px solid #333 !important;
padding: 8px 15px !important;
}
.label-md {
margin: 0px 8px 0px 0 !important;
}
button.disable-hover.button.button-md.button-outline.button-outline-md.button-small.button-small-md.button-outline-md-danger {
margin-top: 8px;
}
.input-wrapper {
text-align: right;
}
ion-item.compact.item.item-block.item-md ion-col.col {
padding: 0 !important;
}
ion-card.card-discreption {
border-top: 1px dashed black;
border-bottom: 1px dashed black;
border-radius: 8px;
border-left: none;
border-right: none;
}
.button-outline-md-danger {
border-color: gold !important;
color: gold !important;
}
.button-clear-md-danger {
color: gold !important;
}
.button-md-danger {
color: #fff;
background-color: purple !important;
}
}
Hope this will help!