import template from './saved-cart.component.html';
/**
* @namespace vfSavedCart
* @memberof Components
*/
(function () {
'use strict';
angular.module('vfApp').component('vfSavedCart', {
template,
controller: SavedCartController,
});
SavedCartController.$inject = ['$location', 'Cart', 'User', 'Utils'];
/**
* @param {Object} $location
* @param {Object} Cart VendorFuel service
* @param {Object} User VendorFuel service
* @param {Object} Utils VendorFuel service
*/
function SavedCartController($location, Cart, User, Utils) {
const vm = this;
vm.addSelectedToCart = addSelectedToCart;
vm.deleteItem = deleteItem;
vm.deleteSelected = deleteSelected;
vm.toggleSelectAll = toggleSelectAll;
vm.selectedItems = selectedItems;
vm.selectedItemsForAdding = selectedItemsForAdding;
vm.$onInit = $onInit;
/**
* Initialization
*/
function $onInit() {
vm.cartId = Utils.urlParser.param('id');
vm.isAddingSelectedToCart = false;
vm.isAllSelected = false;
vm.isCartLoaded = false;
vm.isLoading = true;
vm.isSignedIn = User.isAuthed && User.email;
vm.items = [];
vm.pageUrls = {
cart: Utils.getPageUrl('cart'),
login: Utils.getPageUrl('login', {
redirect_to: $location.path(),
}),
register: Utils.getPageUrl('register'),
savedCarts: Utils.getPageUrl('saved-carts'),
};
vm.productSlug =
localized.settings.general.product_slug || 'products';
if (!vm.cartId) {
Utils.goToPage(Utils.getPageUrl('saved-carts'));
}
}
/**
* Uses the digest cycle to check the real cart for any items that might the same as in the saved cart.
* That way users can't add more items to the cart than what's actually available.
*/
vm.$doCheck = () => {
if (!vm.isCartLoaded && vm.isSignedIn && vm.cartId) {
if (angular.isObject(Cart.details) && !vm.currentCartItems) {
vm.currentCartItems = Cart.details.items;
getSavedCart(vm.cartId);
} else if (
angular.isUndefined(Cart.details) &&
!vm.currentCartItems
) {
vm.currentCartItems = { 0: {} };
getSavedCart(vm.cartId);
}
}
};
/**
* @return {boolean} If item is selected
*/
function selectedItems() {
return vm.items.filter(function (item) {
return item.isSelected;
}).length;
}
/**
* @return {number} Selected items
*/
function selectedItemsForAdding() {
return vm.items.filter(function (item) {
return item.isSelected && item.isActive;
}).length;
}
/**
*/
function addSelectedToCart() {
vm.items.forEach((item) => {
if (item.isSelected) {
vm.isAddingSelectedToCart = true;
const index = vm.items.indexOf(item);
if (index >= 0) {
Cart.add(item.id, item.savedCartQty)
.then((response) => {
if (response.data.errors.length === 0) {
item.cartQty =
response.data.cart.items[item.id].qty;
} else {
vm.errors = response.data.errors;
vm.isAddingSelectedToCart = false;
}
})
.finally(function () {
vm.isAddingSelectedToCart = false;
});
}
}
});
}
this.deleteCart = () => {
this.isDeleting = true;
Cart.deleteSaved(vm.cartId).then(() => {
Utils.goToPage(vm.pageUrls.savedCarts);
this.isDeleting = false;
});
};
/**
* @function deleteSelected
*/
function deleteSelected() {
vm.items.forEach((item) => {
if (item.isSelected) {
const index = vm.items.indexOf(item);
if (index >= 0) {
vm.isLoading = true;
Cart.removeSavedItem(vm.cartId, item.id)
.then(
(response) => {
if (response.data.errors.length === 0) {
vm.items.splice(index, 1);
} else {
console.error(response.data.errors);
}
},
function (error) {
console.error(error);
}
)
.finally(() => {
vm.isLoading = false;
});
}
}
});
}
/**
* @function deleteItem
* @param {Object} item Item
*/
function deleteItem(item) {
const index = vm.items.indexOf(item);
if (index >= 0) {
vm.isLoading = true;
Cart.removeSavedItem(vm.cartId, item.id)
.then(
(response) => {
if (response.data.errors.length === 0) {
vm.items.splice(index, 1);
} else {
console.error(response.data.errors);
}
},
function (error) {
console.error(error);
}
)
.finally(() => {
vm.isLoading = false;
});
}
}
/**
* @function getSavedCart
* @param {number} id Saved cart ID
*/
function getSavedCart(id) {
Cart.getSaved(id).then((cart) => {
if (cart.items) {
vm.cartTitle = cart.cart_title;
vm.subtotal = cart.subtotal;
const items = [];
/* Convert returned object into an cleaned array. */
angular.forEach(cart.items, (value) => {
const item = {
hasStockQty: Number.isFinite(value.available_qty),
isActive: value.status === 'active',
isFavorite: value.favorite,
id: value.product_id,
image: getProductImage(value.images),
itemTotal: value.item_total,
price: value.price,
qty: value.qty,
cartQty: getRealCartQty(value.product_id),
savedCartQty: getSavedCartQty(value),
sku: value.sku,
slug: value.slug,
status: value.status,
stockQty: value.available_qty,
title: value.description,
uom: value.uom,
};
items.push(item);
});
vm.items = items;
vm.isCartLoaded = true;
}
vm.breadcrumb = setBreadcrumb();
vm.isLoading = false;
});
}
/**
* @param {number} id Product ID
* @return {number} Current quantity of product in cart.
*/
function getRealCartQty(id) {
return vm.currentCartItems[id] ? vm.currentCartItems[id].qty : 0;
}
/**
* @param {Object} item Product
* @return {number} Quantity in saved cart
*/
function getSavedCartQty(item) {
const savedCartQty = item.qty;
return savedCartQty;
}
/**
* @function getProductImage
* @param {Object} images Dictonary-style array containing the image info.
* @return {string} Image URL
*/
function getProductImage(images) {
return angular.isObject(images) && Object.keys(images).length > 0
? images[Object.keys(images)[0]].thumb_url
: null;
}
/**
* @return {Array} Breadcrumb
*/
function setBreadcrumb() {
const breadcrumb = [
{
title: 'Home',
link: '/',
},
{
title: 'Saved Carts',
link: vm.pageUrls.savedCarts,
},
];
if (vm.cartTitle) {
breadcrumb.push({
title: vm.cartTitle,
link: `/saved-cart?id=${vm.cartId}`,
});
} else {
breadcrumb.push({
title: 'Empty Saved Cart',
link: `/saved-cart?id=${vm.cartId}`,
});
}
return breadcrumb;
}
/**
* @function toggleSelectAll
* @param {boolean} isAllSelected True (checked) if all items are supposed to be selected.
*/
function toggleSelectAll(isAllSelected) {
vm.items.forEach((item) => (item.isSelected = isAllSelected));
}
}
})();