{"version":3,"file":"../basket.js","names":["basket_toggle","document","querySelector","basket_overlay","basket_close","body","basketError","basketClearedErrorText","dataset","basketClearedError","basketMaxItemsErrorText","basketMaxItemsError","basketNoItemsErrorText","basketEmptyError","handleOutsideClickToCloseBasket","event","target","classList","contains","closeBasket","removeEventListener","window","addEventListener","persisted","button","getElementById","setAttribute","remove","add","openBasket","querySelectorAll","forEach","e","preventDefault","stopPropagation","id","$","this","data","merchandiseId","umbracoId","inviteCampaign","addToCartDataLayer","CustomEvent","detail","productId","dispatchEvent","maximumItemsInCart","cartItemLimits","showBasketError","message","innerHTML","scrollIntoView","clearBasketError","showBasketItemCount","cartData","JSON","parse","localStorage","getItem","basketIcon","lineItems","undefined","length","quantity","i","productTitle","title","emptyTitle","emptyBasket","removeItem","fetch","method","headers","Accept","stringify","cartId","then","itemResponse","style","removeProperty","documentWidth","documentElement","clientWidth","Math","abs","innerWidth","GetProductInfoFromApi","parsedItemData","viewCartDataLayer","newItem","dataNotSeperated","dataArray","split","productString","googleDataLayer","addToCart","increaseQuantityDataLayer","cartItem","collectionName","pop","cartItemString","itemCost","volume","itemCurrency","cartDetails","map","item","join","currency","viewCartLayer","removeCartDataLayer","removeFromCart","completeCheckout","orderDetailsSpan","dl","orderdetails","parsedData","createdAt","now","Date","getCartId","getElementsByClassName","angular","injector","get","$http","url","cache","app","module","numberWithCommas","x","toString","replace","factory","$q","request","config","when","requestError","reject","response","responseError","status","$httpProvider","interceptors","push","service","baseUrl","params","createNew","campaignId","MerchandiseId","InitialQuantity","dataType","contentType","createNewWithMultipleItems","itemsToAdd","CartId","Quantity","CampaignId","addMultiple","update","lineItemId","LineItemId","NewQuantity","getMaxItemCount","addNote","note","removeLine","lineId","getDTCSettings","culture","SetCartData","SetGiftData","giftMsgIncluded","checkoutUrl","giftMessage","GetItemData","itemLineId","$window","key","value","save","toBeSaved","controller","$scope","$rootScope","cartApiResource","settingsApiResource","sessionApiResource","cacheApiResource","storageService","Title","CloseBasket","input","HasCart","HasLineItems","HasError","hasError","GetErrorMsg","error","TotalItemCount","CalculateTotalCount","itemCount","IncreaseQty","currentQty","itemData","addGiftMessage","toggled","itemDataForCurrent","maximumItems","maxItemCount","productName","specificLineItem","find","CalculateShipping","totalCost","DecreaseQty","line","GetBasketItemDetailsById","items","AddItemToLimitStorage","workingItem","Promise","resolve","orderCost","subtotal","shippingValueField","subtotalValueField","totalValueField","shippingData","threshold","shippingValue","shippingIsFree","shippingMessage","cost","round","toFixed","BeginCheckout","basketCheckoutButton","pageDetails","cultureCode","giftData","addingNote","orderDetails","productCampaignId","each","obj","lineAttributes","itemInfo","item_id","item_name","price","item_category","item_brand","coupon","datalayerInfo","beginCheckout","location","href","giftLineIds","getCartGiftLineIds","promiseArray","promise","all","values","shippingThreshold","shippingCost","parseFloat","itemGetResponse","parsedLimitData","element","on","sender","inviteCampaignObj","updatedLimits","cartSetResponse","async","itemDetails","index","itemDetail","errorStr","existingItem","splice","maxItemsErrorText","concat","CheckExistingCartLines","init"],"sources":["basket.js"],"sourcesContent":["var basket_toggle = document.querySelector('#basket-toggle'),\r\n basket_overlay = document.querySelector('.basket__overlay'),\r\n basket_close = document.querySelector('.basket__close'),\r\n body = document.querySelector('body'),\r\n basketError = document.querySelector('.cartErrorMessages'),\r\n basketClearedErrorText = document.querySelector('.js-basket-aside').dataset.basketClearedError,\r\n basketMaxItemsErrorText = document.querySelector('.js-basket-aside').dataset.basketMaxItemsError,\r\n basketNoItemsErrorText = document.querySelector('.js-basket-aside').dataset.basketEmptyError;\r\n\r\n// Checking if page was restored from the bfcache and hiding the spinner\r\n// There is a very brief flash - need a better way to handle but the BeginCheckout function is called before this is\r\nwindow.addEventListener('pageshow', (event) => {\r\n if (event.persisted) {\r\n var button = document.getElementById('beginCheckout');\r\n button.setAttribute('aria-disabled', 'false');\r\n button.querySelector('.submit__text').classList.remove('hidden');\r\n button.querySelector('.spinner').classList.add('hidden');\r\n }\r\n});\r\n\r\nif (basket_toggle != null) {\r\n\r\n // toggle overlay\r\n basket_toggle.addEventListener('click', function () {\r\n if (!document.querySelector(\".basket__overlay--active\")) {\r\n openBasket();\r\n }\r\n })\r\n\r\n // close overlay\r\n basket_close.addEventListener('click', function () {\r\n closeBasket();\r\n });\r\n\r\n // Buy Now click\r\n document.querySelectorAll('.basket__button').forEach(function (e) {\r\n e.addEventListener('click', function (e) {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n id = $(this).data(\"productid\");\r\n merchandiseId = $(this).data(\"merchandiseid\");\r\n umbracoId = $(this).data(\"umbracoid\");\r\n inviteCampaign = $(this).data(\"invitecampaign\");\r\n //var dl = $(this).data(\"datalayer\");\r\n\r\n addToCartDataLayer(this);\r\n\r\n const event = new CustomEvent('addToCart', {\r\n detail: {\r\n productId: id,\r\n merchandiseId: merchandiseId,\r\n umbracoId: umbracoId,\r\n inviteCampaign: inviteCampaign\r\n }\r\n });\r\n window.dispatchEvent(event);\r\n\r\n })\r\n })\r\n}\r\n\r\nfunction handleOutsideClickToCloseBasket(event) {\r\n // TODO: fix this properly\r\n var modal = document.querySelector(\".modal\");\r\n if (modal) {\r\n if (!event.target.classList.contains(\"onetrust-pc-dark-filter\") && !basket_overlay.contains(event.target) && !basket_toggle.contains(event.target) &&\r\n !document.querySelector(\".nav\").contains(event.target)\r\n && !document.querySelector(\".nav__toggle\").contains(event.target)\r\n && !document.querySelector(\".modal\").contains(event.target)) {\r\n closeBasket();\r\n\r\n body.removeEventListener('click', handleOutsideClickToCloseBasket);\r\n }\r\n } else {\r\n if (!event.target.classList.contains(\"onetrust-pc-dark-filter\") && !basket_overlay.contains(event.target) && !basket_toggle.contains(event.target) &&\r\n !document.querySelector(\".nav\").contains(event.target)\r\n && !document.querySelector(\".nav__toggle\").contains(event.target)) {\r\n closeBasket();\r\n\r\n body.removeEventListener('click', handleOutsideClickToCloseBasket);\r\n }\r\n }\r\n}\r\n\r\nlet maximumItemsInCart = 2;\r\nlet cartItemLimits = {};\r\nfunction showBasketError(message) {\r\n basketError.classList.remove(\"hidden\");\r\n basketError.innerHTML = message;\r\n basketError.scrollIntoView();\r\n}\r\nfunction clearBasketError() {\r\n basketError.classList.add(\"hidden\");\r\n basketError.innerHTML = '';\r\n}\r\n\r\nfunction showBasketItemCount() {\r\n var cartData = JSON.parse(localStorage.getItem(\"cartData\"));\r\n var basketIcon = document.getElementById('basket-toggle');\r\n if (basketIcon) {\r\n\r\n if (cartData != null && cartData.lineItems !== null && cartData.lineItems !== undefined) {\r\n var count = cartData.lineItems.length;\r\n if (count > 0) {\r\n let quantity = 0;\r\n cartData.lineItems.forEach(function (i) {\r\n //Don't count the giftMessage item\r\n if (i.productTitle == 'Gift Message') {\r\n return;\r\n }\r\n\r\n //console.log(i);\r\n quantity += i.quantity;\r\n });\r\n if (basketIcon != null && quantity > 0) { // && basketIcon[0].count > 0\r\n basketIcon.title = quantity;\r\n basketIcon.classList.add(\"basket--has-items\");\r\n } else {\r\n basketIcon.title = basketIcon.dataset.emptyTitle; // Clear it\r\n basketIcon.classList.remove(\"basket--has-items\");\r\n }\r\n } else {\r\n basketIcon.title = basketIcon.dataset.emptyTitle; // Clear it\r\n basketIcon.classList.remove(\"basket--has-items\");\r\n }\r\n }\r\n else {\r\n basketIcon.title = basketIcon.dataset.emptyTitle; // Clear it\r\n basketIcon.classList.remove(\"basket--has-items\");\r\n }\r\n }\r\n}\r\n\r\nfunction emptyBasket() {\r\n localStorage.removeItem(\"cartData\");\r\n localStorage.removeItem(\"giftData\");\r\n\r\n fetch('/umbraco/api/session/SetCartData', {\r\n method: 'POST',\r\n headers: {\r\n 'Accept': 'application/json, text/plain, */*',\r\n 'Content-Type': 'application/json'\r\n },\r\n body: JSON.stringify({ cartId: null })\r\n }).then(function (itemResponse) {\r\n showBasketItemCount();\r\n });\r\n}\r\n\r\nfunction closeBasket() {\r\n basket_overlay.classList.remove('basket__overlay--active');\r\n body.classList.remove('overflow--hidden');\r\n document.body.style.removeProperty(\"padding-right\");\r\n\r\n basket_overlay.setAttribute('aria-hidden', 'true')\r\n}\r\n\r\n\r\nfunction openBasket() {\r\n basket_overlay.classList.add('basket__overlay--active');\r\n // handle scrollbar width so page doesn't jump when we set overflow hidden\r\n const documentWidth = document.documentElement.clientWidth;\r\n const scrollbarWidth = Math.abs(window.innerWidth - documentWidth);\r\n //document.body.style.paddingRight = `${scrollbarWidth}px`;\r\n body.classList.add('overflow--hidden');\r\n basket_overlay.setAttribute('aria-hidden', 'false')\r\n\r\n // click outside overlay to close\r\n body.addEventListener('click', handleOutsideClickToCloseBasket);\r\n\r\n GetProductInfoFromApi().then(function (itemResponse) {\r\n var parsedItemData = {}\r\n if (itemResponse.data != null && itemResponse.data != \"\") {\r\n parsedItemData = itemResponse.data;\r\n }\r\n\r\n var cartData = JSON.parse(localStorage.getItem(\"cartData\"));\r\n if (cartData) {\r\n viewCartDataLayer(cartData.lineItems, parsedItemData);\r\n }\r\n\r\n });\r\n}\r\n\r\nfunction addToCartDataLayer(newItem) {\r\n let dataNotSeperated = $(newItem).data(\"itemdetails\");\r\n\r\n if (dataNotSeperated != null) {\r\n let dataArray = dataNotSeperated.split(',');\r\n // Extract data attributes from the clicked button\r\n let productTitle = dataArray[0];\r\n let merchantId = dataArray[1];\r\n let itemCost = dataArray[2];\r\n let itemBrand = dataArray[3];\r\n let category = dataArray[4];\r\n let volume = dataArray[5];\r\n let quantity = dataArray[6];\r\n let itemCurrency = dataArray[10];\r\n let coupon = \"\";\r\n\r\n // Construct the string for addToCart\r\n let productString = `${productTitle},${merchantId},${itemCost},${itemBrand},${category},${volume},${quantity},${coupon},${itemCurrency}`;\r\n\r\n // Google data layer for when new product is added to cart\r\n if (typeof googleDataLayer !== 'undefined') {\r\n googleDataLayer.addToCart(productString);\r\n }\r\n }\r\n}\r\n\r\nfunction increaseQuantityDataLayer(cartItem, collectionName) {\r\n let productId = cartItem.productId.split('/').pop();\r\n let coupon = \"\";\r\n let quantity = 1;\r\n let cartItemString = `${cartItem.productTitle},${productId},${cartItem.itemCost},Dalmore,${collectionName},${cartItem.volume},${quantity},${coupon},${cartItem.itemCurrency}`;\r\n\r\n // Google Data layer for when item is removed from cart\r\n if (typeof googleDataLayer !== 'undefined') {\r\n googleDataLayer.addToCart(cartItemString);\r\n }\r\n}\r\nfunction viewCartDataLayer(cartData, parsedItemData) {\r\n var cartItems = cartData.map(item => {\r\n let productId = item.productId.split('/').pop();\r\n //Add logic to ensure no issues with js\r\n let collectionName = \"\";\r\n if (parsedItemData && parsedItemData[item.productId] && parsedItemData[item.productId].collectionName) {\r\n collectionName = parsedItemData[item.productId].collectionName;\r\n } else {\r\n console.warn(`Collection name not found for productId: ${item.productId}`);\r\n }\r\n //Currently no coupons?\r\n let coupon = \"\";\r\n return `${item.productTitle},${productId},${item.itemCost},Dalmore,${collectionName},${item.volume},${item.quantity},${coupon}`;\r\n });\r\n\r\n // Join the cart items into a single string separated by '|'\r\n var cartDetails = cartItems.join('|');\r\n\r\n var currency = cartData.length > 0 ? cartData[0].itemCurrency : 'undefined';\r\n\r\n //Google Data Layer if user views cart\r\n if (typeof googleDataLayer !== 'undefined') {\r\n googleDataLayer.viewCartLayer(cartDetails, currency);\r\n }\r\n}\r\n\r\nfunction removeCartDataLayer(cartItem, collectionName) {\r\n let productId = cartItem.productId.split('/').pop();\r\n let coupon = \"\";\r\n let cartItemString = `${cartItem.productTitle},${productId},${cartItem.itemCost},Dalmore,${collectionName},${cartItem.volume},1,${coupon},${cartItem.itemCurrency}`;\r\n\r\n // Google Data layer for when item is removed from cart\r\n if (typeof googleDataLayer !== 'undefined') {\r\n googleDataLayer.removeFromCart(cartItemString);\r\n }\r\n}\r\n\r\nfunction completeCheckout() {\r\n var orderDetailsSpan = document.getElementById('orderDetails');\r\n var inviteCampaignSpan = document.getElementById('inviteCampaign');\r\n //var inviteCampaign = $(inviteCampaignSpan).data(\"invitecampaign\");\r\n var dl = orderDetailsSpan.dataset.orderdetails;\r\n\r\n var parsedData = JSON.parse(dl);\r\n var createdAt = parsedData.createdAt;\r\n\r\n //Google data layer for when checkout is complete and fresh\r\n var now = new Date();\r\n var then = new Date(createdAt);\r\n var diff = Math.abs(now - then) / 1000;\r\n if (diff < 60) {\r\n console.log(`completeCheckout.New: ${diff} since order`);\r\n googleDataLayer.completeCheckout(parsedData);\r\n }\r\n else {\r\n console.log(`completeCheckout.Old: ${diff} since order`);\r\n }\r\n}\r\n\r\n/* ================================================================== */\r\n\r\nfunction getCartId() {\r\n var cartData = JSON.parse(localStorage.getItem(\"cartData\"));\r\n var basketIcon = document.getElementsByClassName('header__count');\r\n if (basketIcon.length > 0) {\r\n if (cartData != null && cartData.id !== null && cartData.id !== undefined) {\r\n return cartData.id;\r\n }\r\n }\r\n}\r\n\r\nfunction GetProductInfoFromApi() {\r\n var $http = angular.injector([\"ng\"]).get(\"$http\");\r\n var baseUrl = \"/umbraco/api/cache\";\r\n return $http({\r\n url: (baseUrl + '/GetAllItemData'),\r\n cache: false,\r\n method: 'GET'\r\n })\r\n}\r\n\r\n(function () {\r\n \"use strict\";\r\n var app = angular.module('basket', []);\r\n\r\n app.factory('httpInterceptor', ['$q',\r\n function ($q) {\r\n return {\r\n 'request': function (config) {\r\n config.headers = config.headers || {};\r\n //config.headers['X-Custom'] = 'APIKey'; // add api key here if needed\r\n return config || $q.when(config);\r\n },\r\n 'requestError': function (request) {\r\n\r\n return $q.reject(request);\r\n },\r\n 'response': function (response) {\r\n return response || $q.when(response);\r\n },\r\n 'responseError': function (response) {\r\n if (response && response.status === 401) {\r\n }\r\n if (response && response.status === 404) {\r\n }\r\n if (response && response.status >= 500) {\r\n }\r\n return $q.reject(response);\r\n }\r\n };\r\n\r\n\r\n }]);\r\n\r\n app.config(['$httpProvider', function ($httpProvider) {\r\n $httpProvider.interceptors.push('httpInterceptor');\r\n }]);\r\n\r\n function numberWithCommas(x) {\r\n return x.toString().replace(/\\B(?=(\\d{3})+(?!\\d))/g, \",\");\r\n }\r\n\r\n function cartApiResource($http) {\r\n var baseUrl = \"/umbraco/api/shopifycart\";\r\n return {\r\n get: function (cartId) {\r\n return $http({\r\n url: (baseUrl + '/Get'),\r\n method: 'GET',\r\n params: { cartId: cartId }\r\n });\r\n },\r\n createNew: function (merchandiseId, campaignId) {\r\n console.log(`cartApiResource.CreateNew - ${merchandiseId} campaignId : ${campaignId}`);\r\n return $http({\r\n url: baseUrl + \"/new\",\r\n method: \"POST\",\r\n data: JSON.stringify({ MerchandiseId: merchandiseId, InitialQuantity: 1, campaignId }),\r\n dataType: \"json\",\r\n contentType: \"application/json; charset=utf-8\"\r\n });\r\n },\r\n createNewWithMultipleItems: function (lineItems, campaignId) {\r\n console.log(`cartApiResource.createNewWithMultipleItems - ${lineItems} campaignId : ${campaignId}`);\r\n return $http({\r\n url: baseUrl + \"/new-with-multiple-items\",\r\n method: \"POST\",\r\n data: JSON.stringify({ itemsToAdd: lineItems, campaignId: campaignId }),\r\n dataType: \"json\",\r\n contentType: \"application/json; charset=utf-8\"\r\n });\r\n },\r\n add: function (cartId, merchandiseId, quantity, campaignId) {\r\n console.log(`cartApiResource.add - cart id : ${cartId} MerchandiseId : ${merchandiseId} quantity : ${quantity} campaignId : ${campaignId}`);\r\n return $http({\r\n url: baseUrl + \"/add\",\r\n method: \"POST\",\r\n data: JSON.stringify({ CartId: cartId, MerchandiseId: merchandiseId, Quantity: quantity, CampaignId: campaignId }),\r\n dataType: \"json\",\r\n contentType: \"application/json; charset=utf-8\"\r\n });\r\n },\r\n addMultiple: function (cartId, lineItems, campaignId) {\r\n console.log(`cartApiResource.addMultiple - cart id : ${cartId} lineItems : ${lineItems} campaignId : ${campaignId}`);\r\n return $http({\r\n url: baseUrl + \"/add-multiple\",\r\n method: \"POST\",\r\n data: JSON.stringify({ cartId: cartId, itemsToAdd: lineItems, campaignId: campaignId }),\r\n dataType: \"json\",\r\n contentType: \"application/json; charset=utf-8\"\r\n });\r\n },\r\n update: function (cartId, lineItemId, quantity, campaignId) {\r\n console.log(`cartApiResource.add - cartId : ${cartId} lineItemId : ${lineItemId} quantity : ${quantity} campaignId : ${campaignId}`);\r\n return $http({\r\n url: baseUrl + \"/update\",\r\n method: \"POST\",\r\n data: JSON.stringify({ CartId: cartId, LineItemId: lineItemId, NewQuantity: quantity, CampaignId: campaignId }),\r\n dataType: \"json\",\r\n contentType: \"application/json; charset=utf-8\"\r\n });\r\n },\r\n getMaxItemCount: function (cartId, lineItemId, quantity) {\r\n console.log(`cartApiResource.add - cartId : ${cartId} lineItemId : ${lineItemId} quantity : ${quantity}`);\r\n return $http({\r\n url: baseUrl + \"/update\",\r\n method: \"POST\",\r\n data: JSON.stringify({ CartId: cartId, LineItemId: lineItemId, NewQuantity: quantity }),\r\n dataType: \"json\",\r\n contentType: \"application/json; charset=utf-8\"\r\n });\r\n },\r\n addNote: function (cartId, note) {\r\n console.log(`cartApiResource.addNote - cartId : ${cartId} note : ${note}`);\r\n\r\n return $http({\r\n url: baseUrl + \"/addNote\",\r\n method: \"POST\",\r\n data: JSON.stringify({ CartId: cartId, note: note }),\r\n dataType: \"json\",\r\n contentType: \"application/json; charset=utf-8\"\r\n });\r\n },\r\n removeLine: function (cartId, lineId) {\r\n console.log(`cartApiResource.removeLine - cartId : ${cartId} lineId : ${lineId}`);\r\n\r\n return $http({\r\n url: baseUrl + \"/removeLine\",\r\n method: \"POST\",\r\n data: JSON.stringify({ CartId: cartId, lineId: lineId }),\r\n dataType: \"json\",\r\n contentType: \"application/json; charset=utf-8\"\r\n });\r\n\r\n }\r\n };\r\n };\r\n app.service('cartApiResource', ['$http', cartApiResource]);\r\n\r\n function settingsApiResource($http) {\r\n var baseUrl = \"/umbraco/api/settings\";\r\n\r\n return {\r\n getDTCSettings: function (culture) {\r\n return $http({\r\n url: (baseUrl + '/getDTCSettings'),\r\n method: 'GET',\r\n params: { culture: culture }\r\n });\r\n }\r\n }\r\n }\r\n app.service('settingsApiResource', ['$http', settingsApiResource]);\r\n\r\n function sessionApiResource($http) {\r\n var baseUrl = \"/umbraco/api/session\";\r\n\r\n return {\r\n SetCartData: function (cartId) {\r\n return $http({\r\n url: (baseUrl + '/SetCartData'),\r\n cache: false,\r\n method: 'POST',\r\n data: { cartId: cartId }\r\n });\r\n },\r\n SetGiftData: function (url, giftMsgIncluded) {\r\n return $http({\r\n url: (baseUrl + '/SetGiftData'),\r\n cache: false,\r\n method: 'POST',\r\n data: { checkoutUrl: url, giftMessage: giftMsgIncluded }\r\n });\r\n }\r\n }\r\n }\r\n\r\n app.service('sessionApiResource', ['$http', sessionApiResource]);\r\n\r\n function cacheApiResource($http) {\r\n var baseUrl = \"/umbraco/api/cache\";\r\n return {\r\n GetItemData: function (umbracoId, itemLineId) {\r\n return $http({\r\n url: (baseUrl + '/GetAllItemData'),\r\n cache: false,\r\n method: 'GET'\r\n })\r\n }\r\n }\r\n\r\n }\r\n\r\n app.service('cacheApiResource', ['$http', cacheApiResource]);\r\n\r\n function storageService($window) {\r\n return {\r\n get: function (key) {\r\n var value = $window.localStorage[key];\r\n if (typeof value === 'undefined' || value === 'undefined' || value === null) {\r\n value = null;\r\n console.log('Got undefined value for localStorage key : ' + key);\r\n }\r\n return value ? JSON.parse(value) : null;\r\n },\r\n save: function (key, value) {\r\n let toBeSaved = JSON.stringify(value);\r\n $window.localStorage[key] = toBeSaved;\r\n },\r\n remove: function (key) {\r\n $window.localStorage.removeItem(key);\r\n }\r\n };\r\n };\r\n app.service('storageService', ['$window', storageService]);\r\n\r\n function BasketController($scope, $window, $rootScope, cartApiResource, settingsApiResource, sessionApiResource, cacheApiResource, storageService) {\r\n\r\n $scope.data = null;\r\n\r\n $scope.Title = \"The Title\";\r\n\r\n $scope.CloseBasket = function () {\r\n return closeBasket();\r\n }\r\n\r\n $scope.numberWithCommas = function (input) {\r\n return numberWithCommas(input);\r\n }\r\n $scope.HasCart = function () {\r\n return $scope.data != null;\r\n }\r\n $scope.HasLineItems = function () {\r\n return $scope.data != null && $scope.data.lineItems.length > 0;\r\n }\r\n $scope.HasError = function () {\r\n return $scope.data != null ? $scope.data.hasError : false;\r\n }\r\n $scope.GetErrorMsg = function () {\r\n return $scope.data != null ? $scope.data.error : '';\r\n }\r\n\r\n $scope.TotalItemCount = null;\r\n\r\n $scope.CalculateTotalCount = function () {\r\n var itemCount = 0;\r\n\r\n if ($scope.data != null) {\r\n $scope.data.lineItems.forEach(function (item) {\r\n if (item.productTitle == 'Gift Message') {\r\n return;\r\n } else {\r\n itemCount++;\r\n }\r\n });\r\n }\r\n\r\n $scope.TotalItemCount = itemCount;\r\n }\r\n\r\n $scope.IncreaseQty = function (productId, lineItemId, cartId, currentQty, campaignId) {\r\n\r\n // Find out what the max limit is for this item\r\n console.log(`IncreaseQty - productId : ${productId} lineItemId : ${lineItemId} cartId : ${cartId} currentQty : ${currentQty}`);\r\n clearBasketError();\r\n\r\n cacheApiResource.GetItemData().then(function (itemResponse) {\r\n\r\n var parsedItemData = {}\r\n if (itemResponse.data != null) {\r\n parsedItemData = itemResponse.data;\r\n }\r\n $scope.itemData = parsedItemData;\r\n if ($scope.itemData === null || $scope.itemData === undefined || $scope.itemData === 'undefined') {\r\n storageService.remove('cartData');\r\n storageService.remove('giftData');\r\n $scope.addGiftMessage.toggled = false;\r\n $scope.data = {};\r\n $scope.data.hasError = true;\r\n showBasketError(basketClearedErrorText);\r\n showBasketItemCount();\r\n return;\r\n }\r\n\r\n //TODO itemData dictionary changed to now use ShopifyItemId as key - this needs updated\r\n let itemDataForCurrent = $scope.itemData[productId];\r\n\r\n // Check for null in case of cache and session mismatch after idle time\r\n if (itemDataForCurrent === null || itemDataForCurrent === undefined || itemDataForCurrent === 'undefined') {\r\n storageService.remove('cartData');\r\n storageService.remove('giftData');\r\n $scope.addGiftMessage.toggled = false;\r\n $scope.data = {};\r\n $scope.data.hasError = true;\r\n showBasketError(basketClearedErrorText);\r\n showBasketItemCount();\r\n return;\r\n }\r\n\r\n var maximumItems = itemDataForCurrent.maxItemCount;\r\n console.log('IncreaseQty - maximumItems : ', maximumItems);\r\n\r\n\r\n // Only allow quantity up to x\r\n if (currentQty >= maximumItems) {\r\n currentQty = maximumItems;\r\n openBasket();\r\n\r\n var maxItemsErrorText = basketMaxItemsErrorText.replace('{0}', maximumItems).replace('{1}', itemDataForCurrent.productName);\r\n\r\n console.log(maxItemsErrorText);\r\n showBasketError(maxItemsErrorText)\r\n } else {\r\n currentQty++;\r\n var cartData = JSON.parse(localStorage.getItem(\"cartData\"));\r\n var specificLineItem = cartData.lineItems.find(item => item.id === lineItemId);\r\n\r\n if (specificLineItem) {\r\n let collectionName = \"\";\r\n if (itemDataForCurrent.collectionName != null) {\r\n collectionName = itemDataForCurrent.collectionName;\r\n }\r\n increaseQuantityDataLayer(specificLineItem, collectionName);\r\n }\r\n };\r\n\r\n cartApiResource.update(cartId, lineItemId, currentQty, campaignId)\r\n .then(function (response) {\r\n console.log('cartApiResource.update response : %o', response);\r\n\r\n if (response.data.hasError) {\r\n console.log(response.data.error);\r\n storageService.remove('cartData');\r\n storageService.remove('giftData');\r\n $scope.addGiftMessage.toggled = false;\r\n $scope.data = {};\r\n $scope.data.hasError = true;\r\n $scope.data.error = basketClearedErrorText;\r\n\r\n }\r\n else {\r\n storageService.save('cartData', response.data);\r\n $scope.data = storageService.get(\"cartData\");\r\n $scope.CalculateShipping($scope.data.totalCost);\r\n }\r\n showBasketItemCount();\r\n openBasket();\r\n }, function (error) {\r\n console.error(error)\r\n storageService.remove('cartData');\r\n storageService.remove('giftData');\r\n $scope.addGiftMessage.toggled = false;\r\n $scope.data = {};\r\n $scope.data.hasError = true;\r\n $scope.data.error = basketClearedErrorText;\r\n showBasketItemCount();\r\n });\r\n });\r\n }\r\n $scope.DecreaseQty = function (productId, lineItemId, cartId, currentQty) {\r\n currentQty -= 1;\r\n cacheApiResource.GetItemData().then(function (itemResponse) {\r\n\r\n cartApiResource.update(cartId, lineItemId, currentQty)\r\n .then(function (response) {\r\n var cartData = JSON.parse(localStorage.getItem(\"cartData\"));\r\n cartData.lineItems.forEach(item => console.log(item.id));\r\n var specificLineItem = cartData.lineItems.find(item => item.id === lineItemId);\r\n\r\n var parsedItemData = {}\r\n if (itemResponse.data != null) {\r\n parsedItemData = itemResponse.data;\r\n }\r\n\r\n $scope.itemData = parsedItemData;\r\n let itemDataForCurrent = $scope.itemData[productId];\r\n\r\n if (specificLineItem) {\r\n let collectionName = \"\";\r\n if (itemDataForCurrent.collectionName != null) {\r\n collectionName = itemDataForCurrent.collectionName;\r\n }\r\n removeCartDataLayer(specificLineItem, collectionName);\r\n }\r\n\r\n clearBasketError();\r\n console.log('cartApiResource.update response : %o', response);\r\n\r\n if (response.data.hasError) {\r\n console.log(response.data.error)\r\n storageService.remove('cartData');\r\n $scope.addGiftMessage.toggled = false;\r\n $scope.data = {};\r\n $scope.data.hasError = true;\r\n $scope.data.error = basketClearedErrorText;\r\n\r\n }\r\n else {\r\n if (response.data.lineItems.length > 0) {\r\n\r\n //Check if the only line we have left is a gift line, if so remove it\r\n if (response.data.lineItems.length == 1) {\r\n\r\n var line = response.data.lineItems[0];\r\n if (line.productTitle == 'Gift Message') {\r\n cartApiResource.removeLine(cartId, line.id)\r\n .then(function (response) {\r\n if (response.data.hasError) {\r\n console.log(response.data.error)\r\n storageService.remove('cartData');\r\n $scope.addGiftMessage.toggled = false;\r\n $scope.data = {};\r\n $scope.data.hasError = true;\r\n $scope.data.error = basketClearedErrorText;\r\n } else {\r\n storageService.remove('cartData');\r\n storageService.remove('giftData');\r\n $scope.addGiftMessage.toggled = false;\r\n $scope.data = null;\r\n }\r\n showBasketItemCount();\r\n },\r\n function (error) {\r\n console.log(response.data.error)\r\n storageService.remove('cartData');\r\n storageService.remove('giftData');\r\n $scope.addGiftMessage.toggled = false;\r\n $scope.data = {};\r\n $scope.data.hasError = true;\r\n $scope.data.error = basketClearedErrorText;\r\n showBasketItemCount();\r\n });\r\n } else {\r\n storageService.save('cartData', response.data);\r\n $scope.data = storageService.get(\"cartData\");\r\n $scope.CalculateShipping($scope.data.totalCost);\r\n showBasketItemCount();\r\n }\r\n } else {\r\n storageService.save('cartData', response.data);\r\n $scope.data = storageService.get(\"cartData\");\r\n $scope.CalculateShipping($scope.data.totalCost);\r\n showBasketItemCount();\r\n }\r\n }\r\n else {\r\n storageService.remove('cartData');\r\n storageService.remove('giftData');\r\n\r\n $scope.addGiftMessage.toggled = false;\r\n $scope.data = null;\r\n showBasketItemCount();\r\n }\r\n }\r\n openBasket();\r\n\r\n }, function (error) {\r\n console.error(error)\r\n storageService.remove('cartData');\r\n storageService.remove('giftData');\r\n $scope.addGiftMessage.toggled = false;\r\n $scope.data = {};\r\n $scope.data.hasError = true;\r\n $scope.data.error = basketClearedErrorText;\r\n showBasketItemCount();\r\n });\r\n });\r\n }\r\n\r\n $scope.GetBasketItemDetailsById = function (merchandiseId, cartData) {\r\n let items = cartData.lineItems;\r\n console.log('GetBasketItemDetailsById - cartData.lineItems : %o', items);\r\n if (items != null && items.length > 0) {\r\n console.log('Got items : %o', items);\r\n for (let i = 0; i < items.length; i++) {\r\n if (items[i].merchandiseId == merchandiseId) {\r\n return items[i];\r\n }\r\n }\r\n } else {\r\n showBasketError(basketNoItemsErrorText);\r\n return null;\r\n }\r\n }\r\n\r\n $scope.AddItemToLimitStorage = function (umbracoId, workingItem) {\r\n return new Promise((resolve) => {\r\n cacheApiResource.GetItemData().then(function (itemResponse) {\r\n var parsedItemData = {}\r\n if (itemResponse.data != null && itemResponse.data != \"\") {\r\n parsedItemData = itemResponse.data;\r\n }\r\n\r\n let item = parsedItemData;\r\n console.log('workingItem : %o', workingItem);\r\n console.log('limitData from ls : %o', item);\r\n //let umbracoSettingsTemp = umbracoSettings;\r\n\r\n if (workingItem != null) {\r\n\r\n if (item === null || item === undefined || item === 'undefined') { // Init if not already\r\n item = {};\r\n }\r\n\r\n // Add or update the item\r\n //umbracoSettingsTemp.merchandiseId = workingItem.merchandiseId;\r\n //limit[workingItem.id] = umbracoSettingsTemp;\r\n\r\n resolve(item);\r\n\r\n } else {\r\n console.error('Could not find item in cart : %o', workingItem);\r\n }\r\n });\r\n });\r\n }\r\n\r\n $scope.CalculateShipping = function (orderCost) {\r\n\r\n $scope.data.subtotal = $scope.data.totalCost;\r\n var shippingValueField = document.getElementById(\"shippingValue\");\r\n var subtotalValueField = document.getElementById(\"subtotalValue\");\r\n var totalValueField = document.getElementById(\"totalValue\");\r\n if (shippingValueField) {\r\n if ($scope.shippingData !== null) {\r\n if (orderCost >= $scope.shippingData.threshold) { //ERROR HERE!\r\n $scope.shippingData.shippingValue = \"Complimentary\";\r\n $scope.shippingData.shippingIsFree = true;\r\n $scope.shippingData.shippingMessage = \"Complimentary\";\r\n shippingValueField.innerHTML = \"Complimentary\";\r\n subtotalValueField.innerHTML = \"£\" + numberWithCommas($scope.data.subtotal);\r\n totalValueField.innerHTML = \"£\" + numberWithCommas($scope.data.totalCost);\r\n } else {\r\n $scope.shippingData.shippingValue = $scope.shippingData.cost;\r\n $scope.data.totalCost += $scope.shippingData.cost;\r\n $scope.data.totalCost = (Math.round($scope.data.totalCost * 100) / 100).toFixed(2);\r\n $scope.shippingData.shippingIsFree = false;\r\n $scope.shippingData.shippingMessage = \"£\" + $scope.shippingData.cost;\r\n shippingValueField.innerHTML = \"£\" + $scope.shippingData.cost;\r\n subtotalValueField.innerHTML = \"£\" + numberWithCommas($scope.data.subtotal);\r\n totalValueField.innerHTML = \"£\" + numberWithCommas($scope.data.totalCost);\r\n }\r\n\r\n storageService.save('shippingData', $scope.shippingData);\r\n } else {\r\n //No shipping data defined!\r\n }\r\n }\r\n\r\n $scope.CalculateTotalCount();\r\n }\r\n\r\n $scope.BeginCheckout = function () {\r\n // show spinner on button\r\n var basketCheckoutButton = document.getElementById('beginCheckout');\r\n basketCheckoutButton.setAttribute('aria-disabled', 'true');\r\n basketCheckoutButton.querySelector('.submit__text').classList.add('hidden');\r\n basketCheckoutButton.querySelector('.spinner').classList.remove('hidden');\r\n\r\n var pageDetails = $(\".pageDetailsObj\")[0];\r\n var cultureCode = $(pageDetails).data(\"culturecode\");\r\n\r\n if ($scope.addGiftMessage.toggled) {\r\n var giftData = {\r\n addingNote: true,\r\n note: $scope.addGiftMessage.note\r\n }\r\n\r\n storageService.save('giftData', giftData);\r\n } else {\r\n\r\n var orderDetails = $(\".orderDetailsObj\")[0];\r\n var currency = $(orderDetails).data(\"ordercurrency\");\r\n var cost = $(orderDetails).data(\"ordervalue\");\r\n\r\n var items = [];\r\n var productCampaignId = \"\";\r\n\r\n var giftData = {\r\n addingNote: false\r\n }\r\n\r\n storageService.save('giftData', giftData);\r\n\r\n $(\".itemDetailsObj\").each(function (i, obj) {\r\n var itemData = $(obj).data(\"itemdata\").split(',');\r\n var lineAttributes = $(obj).data(\"lineattributes\");\r\n\r\n $(lineAttributes).each(function (i, obj) {\r\n if (obj.key == \"campaignId\") {\r\n productCampaignId = obj.value\r\n }\r\n });\r\n\r\n let itemInfo = {\r\n item_id: itemData[5].split('/').pop(),\r\n item_name: itemData[1],\r\n quantity: itemData[2],\r\n price: itemData[3],\r\n item_category: itemData[4],\r\n item_brand: \"Dalmore\",\r\n coupon: productCampaignId\r\n };\r\n\r\n items.push(itemInfo);\r\n });\r\n\r\n var datalayerInfo = {\r\n currency: currency,\r\n value: cost,\r\n items: items,\r\n inviteCampaign: productCampaignId\r\n }\r\n\r\n googleDataLayer.beginCheckout(datalayerInfo);\r\n }\r\n\r\n if (!$scope.addGiftMessage.toggled) {\r\n ClearGiftLines().then(function (response) {\r\n //Set some serverside variables\r\n sessionApiResource.SetGiftData($scope.data.checkoutUrl, $scope.addGiftMessage.toggled)\r\n .then(function (response) {\r\n console.log('Session data set!');\r\n // TODO: use dynamic url\r\n window.location.href = `/${cultureCode}/checkout/login/`;\r\n });\r\n });\r\n } else {\r\n\r\n //Set some serverside variables\r\n sessionApiResource.SetGiftData($scope.data.checkoutUrl, $scope.addGiftMessage.toggled)\r\n .then(function (response) {\r\n console.log('Session data set!');\r\n // TODO: use dynamic url\r\n window.location.href = `/${cultureCode}/checkout/login/`;\r\n });\r\n }\r\n }\r\n\r\n function init() {\r\n $scope.data = storageService.get(\"cartData\");\r\n var giftData = storageService.get('giftData');\r\n\r\n if ($scope.data != null) {\r\n $scope.data.subtotal = $scope.data.totalCost;\r\n\r\n //Set the cartID in session again in case we have lost this from an expired session\r\n if ($scope.data.id != null) {\r\n sessionApiResource.SetCartData($scope.data.id);\r\n }\r\n }\r\n\r\n $scope.addGiftMessage = {};\r\n $scope.addGiftMessage.toggled = false;\r\n\r\n if (giftData) {\r\n var giftToggled = giftData.addingNote;\r\n\r\n if (giftToggled) {\r\n $scope.addGiftMessage.toggled = true;\r\n }\r\n\r\n $scope.addGiftMessage.note = giftData.note;\r\n }\r\n\r\n //Get the DTC settings\r\n var pageDetails = $(\".pageDetailsObj\")[0];\r\n var cultureCode = $(pageDetails).data(\"culturecode\");\r\n\r\n settingsApiResource.getDTCSettings(cultureCode)\r\n .then(function (response) {\r\n if (response.data.hasError) {\r\n console.error('settingsApiResource.getDTCSettings ERROR : %o', response.data.error)\r\n } else {\r\n $scope.shippingData = {};\r\n if (response.data != null) {\r\n if (response.data.shippingThreshold != undefined && response.data.shippingCost != undefined) {\r\n $scope.shippingData.threshold = parseFloat(response.data.shippingThreshold);\r\n $scope.shippingData.cost = parseFloat(response.data.shippingCost);\r\n\r\n if ($scope.data != null) {\r\n //Set up the shipping calc, this is important if we're returning from a previous session\r\n $scope.CalculateShipping($scope.data.totalCost);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n , function (error) {\r\n console.error('cartApiResource.createNew error - %o', error);\r\n });\r\n\r\n cacheApiResource.GetItemData().then(function (itemGetResponse) {\r\n\r\n var parsedLimitData = {}\r\n if (itemGetResponse.data != null) {\r\n parsedLimitData = itemGetResponse.data;\r\n }\r\n\r\n $scope.itemData = parsedLimitData;\r\n });\r\n\r\n angular.element($window).on('addToCart', function (event) {\r\n var sender = event.detail;\r\n $scope.data = storageService.get(\"cartData\");\r\n if ($scope.data === null) {\r\n $scope.merchandiseId = sender.merchandiseId; // Save this for the lookup when the api call completes\r\n\r\n //Set the invite campaign details\r\n if (sender.inviteCampaign) {\r\n $scope.inviteCampaignObj = {\r\n productId: sender.productId,\r\n inviteCampaign: sender.inviteCampaign\r\n }\r\n }\r\n\r\n cartApiResource.createNew(sender.merchandiseId, sender.inviteCampaign)\r\n .then(function (response) {\r\n\r\n console.log('cartApiResource.createNew response : %o', response);\r\n\r\n if (response.data.hasError) {\r\n console.error('cartApiResource.createNew ERROR : %o', response.data.error)\r\n storageService.remove('cartData');\r\n storageService.remove('giftData');\r\n $scope.addGiftMessage.toggled = false;\r\n $scope.data = {};\r\n $scope.data.hasError = true;\r\n $scope.data.error = basketClearedErrorText;\r\n }\r\n else {\r\n\r\n // Add in the extra umbraco details to the \"itemData\" storage\r\n let workingItem = $scope.GetBasketItemDetailsById($scope.merchandiseId, response.data);\r\n $scope.AddItemToLimitStorage(sender.umbracoId, workingItem).then(function (updatedLimits) {\r\n console.log('updatedLimits : ', updatedLimits);\r\n\r\n sessionApiResource.SetCartData(response.data.id).then(function (cartSetResponse) {\r\n\r\n storageService.save('cartData', response.data);\r\n\r\n cacheApiResource.GetItemData().then(function (itemGetResponse) {\r\n\r\n var parsedLimitData = {}\r\n if (itemGetResponse.data != null) {\r\n parsedLimitData = itemGetResponse.data;\r\n }\r\n\r\n $scope.itemData = parsedLimitData;\r\n $scope.data = storageService.get(\"cartData\");\r\n\r\n showBasketItemCount();\r\n openBasket();\r\n $scope.CalculateShipping($scope.data.totalCost);\r\n });\r\n });\r\n });\r\n }\r\n }, function (error) {\r\n console.error('cartApiResource.createNew error - %o', error);\r\n });\r\n }\r\n else {\r\n $scope.merchandiseId = sender.merchandiseId; // Save this for the lookup when the api call completes\r\n\r\n if (sender.inviteCampaign) {\r\n $scope.inviteCampaignObj = {\r\n productId: sender.productId,\r\n inviteCampaign: sender.inviteCampaign\r\n }\r\n }\r\n\r\n $scope.data = storageService.get(\"cartData\");\r\n // Is this item already in the cart?\r\n let workingItem = $scope.GetBasketItemDetailsById($scope.merchandiseId, $scope.data);\r\n if (workingItem == null) {\r\n // New item. Add to cart\r\n cartApiResource.add($scope.data.id, sender.merchandiseId, 1, sender.inviteCampaign)\r\n .then(function (response) {\r\n\r\n console.log('cartApiResource.add response : %o', response);\r\n\r\n\r\n if (response.data.hasError) {\r\n console.error('cartApiResource.add : %o', response.data.error)\r\n storageService.remove('cartData');\r\n storageService.remove('giftData');\r\n $scope.addGiftMessage.toggled = false;\r\n $scope.data = {};\r\n $scope.data.hasError = true;\r\n $scope.data.error = basketClearedErrorText;\r\n }\r\n else {\r\n\r\n // Add in the extra umbraco details to the \"itemData\" storage\r\n let workingItem = $scope.GetBasketItemDetailsById($scope.merchandiseId, response.data);\r\n $scope.AddItemToLimitStorage(sender.umbracoId, workingItem).then(function (updatedLimits) {\r\n\r\n //console.log('updatedLimits add : ', updatedLimits);\r\n\r\n storageService.save('cartData', response.data);\r\n\r\n cacheApiResource.GetItemData().then(function (itemGetResponse) {\r\n\r\n var parsedLimitData = {}\r\n if (itemGetResponse.data != null) {\r\n parsedLimitData = itemGetResponse.data;\r\n }\r\n\r\n $scope.itemData = parsedLimitData;\r\n $scope.data = storageService.get(\"cartData\");\r\n\r\n openBasket();\r\n\r\n //TODO Make this work properly - SetTimeout is not appropriate\r\n //setTimeout(() => { $scope.CalculateShipping($scope.data.totalCost); }, 300);\r\n $scope.CalculateShipping($scope.data.totalCost);\r\n });\r\n });\r\n }\r\n }, function (error) {\r\n console.error(error);\r\n });\r\n } else {\r\n console.log('Working item from ls : %o', workingItem)\r\n let quantity = workingItem.quantity;\r\n console.log(`IncreaseQty existing item - scope.data.id : ${$scope.data.id} workingItem.id : ${workingItem.id} workingItem.quantity ${quantity}`);\r\n // Already in the cart. Increase the count\r\n\r\n $scope.IncreaseQty(sender.productId, workingItem.id, $scope.data.id, quantity, sender.inviteCampaign);\r\n }\r\n }\r\n });\r\n\r\n angular.element($window).on('removeCart', function (event) {\r\n storageService.remove('cartData');\r\n storageService.remove('giftData');\r\n $scope.addGiftMessage.toggled = false;\r\n $scope.data = {};\r\n showBasketItemCount();\r\n });\r\n\r\n angular.element($window).on('addMultipleToCart', async function (event) {\r\n var sender = event.detail;\r\n var button = sender.button;\r\n\r\n button.setAttribute('aria-disabled', 'true');\r\n button.querySelector('.submit__text').classList.add('hidden');\r\n button.querySelector('.spinner').classList.remove('hidden');\r\n\r\n\r\n //TODO pass the item details to a helper method that checks the item limits/existing cart, and remove any that would go over the purchase limit.\r\n var itemDetails = sender.itemDetails;\r\n $scope.data = storageService.get(\"cartData\");\r\n\r\n //Are we making a new cart?\r\n if ($scope.data === null) {\r\n cartApiResource.createNewWithMultipleItems(itemDetails, sender.inviteCampaign)\r\n .then(async function (response) {\r\n console.log('cartApiResource.createNewWithMultipleItems response : %o', response);\r\n\r\n if (response.data.hasError) {\r\n console.error('cartApiResource.createNew ERROR : %o', response.data.error)\r\n storageService.remove('cartData');\r\n storageService.remove('giftData');\r\n $scope.addGiftMessage.toggled = false;\r\n $scope.data = {};\r\n $scope.data.hasError = true;\r\n $scope.data.error = basketClearedErrorText;\r\n } else {\r\n for (var index in itemDetails) {\r\n var itemDetail = itemDetails[index];\r\n\r\n let workingItem = $scope.GetBasketItemDetailsById(itemDetail.merchandiseId, response.data);\r\n await $scope.AddItemToLimitStorage(sender.umbracoId, workingItem).then(function (updatedLimits) {\r\n return;\r\n });\r\n }\r\n\r\n sessionApiResource.SetCartData(response.data.id).then(function (cartSetResponse) {\r\n storageService.save('cartData', response.data);\r\n\r\n cacheApiResource.GetItemData().then(function (itemGetResponse) {\r\n\r\n var parsedLimitData = {}\r\n if (itemGetResponse.data != null) {\r\n parsedLimitData = itemGetResponse.data;\r\n }\r\n\r\n $scope.itemData = parsedLimitData;\r\n $scope.data = storageService.get(\"cartData\");\r\n\r\n showBasketItemCount();\r\n openBasket();\r\n $scope.CalculateShipping($scope.data.totalCost);\r\n\r\n button.setAttribute('aria-disabled', 'false');\r\n button.querySelector('.submit__text').classList.remove('hidden');\r\n button.querySelector('.spinner').classList.add('hidden');\r\n });\r\n });\r\n }\r\n }, function (error) {\r\n console.error('cartApiResource.createNewWithMultipleItems error - %o', error);\r\n button.setAttribute('aria-disabled', 'false');\r\n button.querySelector('.submit__text').classList.remove('hidden');\r\n button.querySelector('.spinner').classList.add('hidden');\r\n });\r\n } else {\r\n //Cart already exists - add the items to it\r\n //TODO why do we get it again here? possibly can remove this here and in addToCart handler\r\n $scope.data = storageService.get(\"cartData\");\r\n\r\n await CheckExistingCartLines(itemDetails, $scope.data);\r\n\r\n cartApiResource.addMultiple($scope.data.id, itemDetails, sender.inviteCampaign).then(async function (response) {\r\n console.log('cartApiResource.addMultiple response : %o', response);\r\n\r\n if (response.data.hasError) {\r\n console.error('cartApiResource.createNew ERROR : %o', response.data.error)\r\n storageService.remove('cartData');\r\n storageService.remove('giftData');\r\n $scope.addGiftMessage.toggled = false;\r\n $scope.data = {};\r\n $scope.data.hasError = true;\r\n $scope.data.error = basketClearedErrorText;\r\n } else {\r\n for (var index in itemDetails) {\r\n var itemDetail = itemDetails[index];\r\n\r\n let workingItem = $scope.GetBasketItemDetailsById(itemDetail.merchandiseId, response.data);\r\n await $scope.AddItemToLimitStorage(sender.umbracoId, workingItem).then(function (updatedLimits) {\r\n return;\r\n });\r\n }\r\n\r\n sessionApiResource.SetCartData(response.data.id).then(function (cartSetResponse) {\r\n storageService.save('cartData', response.data);\r\n\r\n cacheApiResource.GetItemData().then(function (itemGetResponse) {\r\n\r\n var parsedLimitData = {}\r\n if (itemGetResponse.data != null) {\r\n parsedLimitData = itemGetResponse.data;\r\n }\r\n\r\n $scope.itemData = parsedLimitData;\r\n $scope.data = storageService.get(\"cartData\");\r\n\r\n showBasketItemCount();\r\n openBasket();\r\n $scope.CalculateShipping($scope.data.totalCost);\r\n\r\n button.setAttribute('aria-disabled', 'false');\r\n button.querySelector('.submit__text').classList.remove('hidden');\r\n button.querySelector('.spinner').classList.add('hidden');\r\n });\r\n });\r\n }\r\n }, function (error) {\r\n console.error('cartApiResource.addMultiple error - %o', error);\r\n button.setAttribute('aria-disabled', 'false');\r\n button.querySelector('.submit__text').classList.remove('hidden');\r\n button.querySelector('.spinner').classList.add('hidden');\r\n });\r\n }\r\n });\r\n }\r\n\r\n //Take in a list of item details and check if their item purchase limit against the cart, adjusting the list if necessary\r\n async function CheckExistingCartLines(itemDetails, cartData) {\r\n return new Promise(function (resolve, reject) {\r\n cacheApiResource.GetItemData().then(async function (itemResponse) {\r\n var parsedItemData = {}\r\n if (itemResponse.data != null) {\r\n parsedItemData = itemResponse.data;\r\n }\r\n\r\n $scope.itemData = parsedItemData;\r\n if ($scope.itemData === null || $scope.itemData === undefined || $scope.itemData === 'undefined') {\r\n storageService.remove('cartData');\r\n storageService.remove('giftData');\r\n $scope.addGiftMessage.toggled = false;\r\n $scope.data = {};\r\n $scope.data.hasError = true;\r\n showBasketError(basketClearedErrorText);\r\n showBasketItemCount();\r\n return;\r\n }\r\n\r\n var index = itemDetails.length;\r\n var errorStr = \"\";\r\n while (index--) {\r\n let itemDetail = itemDetails[index];\r\n\r\n let itemDataForCurrent = $scope.itemData[itemDetail.productId];\r\n if (itemDataForCurrent === null || itemDataForCurrent === undefined || itemDataForCurrent === 'undefined') {\r\n storageService.remove('cartData');\r\n storageService.remove('giftData');\r\n $scope.addGiftMessage.toggled = false;\r\n $scope.data = {};\r\n $scope.data.hasError = true;\r\n showBasketError(basketClearedErrorText);\r\n showBasketItemCount();\r\n return;\r\n }\r\n\r\n var maximumItems = itemDataForCurrent.maxItemCount;\r\n\r\n let existingItem = $scope.GetBasketItemDetailsById(itemDetail.merchandiseId, cartData);\r\n\r\n if (existingItem) {\r\n var currentQty = existingItem.quantity;\r\n\r\n if (currentQty >= maximumItems) {\r\n currentQty = maximumItems;\r\n\r\n itemDetails.splice(index, 1);\r\n var maxItemsErrorText = basketMaxItemsErrorText.replace('{0}', maximumItems).replace('{1}', itemDataForCurrent.productName);\r\n\r\n if (errorStr.length > 0) {\r\n errorStr = errorStr.concat(`

${maxItemsErrorText}`);\r\n } else {\r\n errorStr = errorStr.concat(maxItemsErrorText);\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (errorStr.length > 0) {\r\n showBasketError(errorStr);\r\n }\r\n resolve();\r\n });\r\n });\r\n\r\n\r\n }\r\n\r\n function ClearGiftLines() {\r\n return new Promise(function (resolve, reject) {\r\n var giftLineIds = getCartGiftLineIds();\r\n var cartId = getCartId();\r\n\r\n if (giftLineIds != null) {\r\n\r\n var promiseArray = [];\r\n\r\n for (const lineId of giftLineIds) {\r\n const promise = cartApiResource.removeLine(cartId, lineId);\r\n promiseArray.push(promise);\r\n }\r\n\r\n Promise.all(promiseArray).then(values => {\r\n values.forEach(function (response) {\r\n if (response.data.hasError) {\r\n console.log(response.data.error)\r\n storageService.remove('cartData');\r\n $scope.addGiftMessage.toggled = false;\r\n $scope.data = {};\r\n $scope.data.hasError = true;\r\n $scope.data.error = basketClearedErrorText;\r\n } else {\r\n console.log(\"Preexisting gift lines removed.\");\r\n }\r\n });\r\n resolve();\r\n })\r\n }\r\n });\r\n }\r\n\r\n function getCartGiftLineIds() {\r\n if ($scope.data != undefined) {\r\n if ($scope.data.lineItems != null) {\r\n var giftLineIds = [];\r\n $scope.data.lineItems.forEach(function (line) {\r\n if (line.productTitle == 'Gift Message') {\r\n giftLineIds.push(line.id);\r\n }\r\n });\r\n\r\n return giftLineIds;\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n init();\r\n }\r\n\r\n\r\n app.controller(\"BasketController\", ['$scope', '$window', '$rootScope', 'cartApiResource', 'settingsApiResource', 'sessionApiResource', 'cacheApiResource', 'storageService', BasketController]);\r\n})();\r\n"],"mappings":"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"}