{"version":3,"sources":["services/accountServiceMixin.js","services/blogServiceMixin.js","services/calcEngineServiceMixin.js","services/checkoutServiceMixin.js","services/contactServiceMixin.js","services/productServiceMixin.js","services/purchaseOrderServiceMixin.js","services/recaptchaServiceMixin.js","services/relatedAccessoriesMixin.js","services/requestServiceMixin.js","services/reviewServiceMixin.js","services/searchServiceMixin.js","services/shoppingCartServiceMixin.js","services/variantsMixin.js","services/vouchersServiceMixin.js","vue/addOrderAddressMixin.js","vue/customValidationMixin.js","vue/dropZoneMixin.js","vue/generalMixin.js","vue/modalsMixin.js","vue/account/addressLookupMixin.js","vue/account/changeAddressMixin.js","vue/account/savedAddressMixin.js","vue/backoffice/couriersMixin.js","vue/backoffice/saveFileMixin.js","vue/products/addToCartBarMixin.js","vue/products/coloursMixin.js","vue/products/disableMixin.js","vue/products/discountTiersMixin.js","vue/products/drilledHolesMixin.js","vue/products/edgeFinishingMixin.js","vue/products/hatchMixin.js","vue/products/minMaxMixin.js","vue/products/onLoadPropertiesMixin.js","vue/products/optionalExtrasMixin.js","vue/products/productMixin.js","vue/products/quantityMixin.js","vue/products/ratingsMixin.js","vue/products/roundedCornersMixin.js","vue/products/socketCutOutsMixin.js","vue/products/standardSizesMixin.js","vue/products/toggleMixin.js","vue/products/unitsMixin.js","vue/products/validationMixin.js","vue/products/vatMixin.js"],"names":["accountServiceMixin","data","ACCOUNT_BASE","methods","registerUserApi","this","post","registerTradeUserApi","loginUser","addPassword","changePassword","resetPassword","addOrUpdateAddress","deleteAddressApi","forgotPassword","updateDetails","getAddressesApi","get","getAddressApi","blogServiceMixin","BLOG_BASE","getBlogPosts","purchaseOrderData","getHomePageBlogPosts","calcEngineServiceMixin","CALCENGINE_BASE","getProductPriceApi","productPrice","async","getBasicProductPriceApi","product","getLetteringProductPriceApi","checkoutServiceMixin","CHECKOUT_BASE","setDeliveryMethodApi","submitPayment","submitMotoPayment","isOrderNumberCreated","getBasketReviewItems","getCheckoutAddressApi","addBillingInformation","addShippingInformation","contactServiceMixin","CONTACT_BASE","contactForm","askAQuestion","quoteMe","productServiceMixin","PRODUCT_BASE","getCategoryProducts","sortedCategoryProducts","getProductRelatedProducts","getPageRelatedProducts","getRelatedProductsBasket","getSamplesData","getThicknessesForColourApi","getProductColours","getProductThicknesses","purchaseOrderServiceMixin","PURCHASE_ORDER_BASE","addAdditionalSocketCutOutFiles","recaptchaServiceMixin","RECAPTCHA_BASE","validateRecaptchaRetrieve","relatedAccessoriesMixin","addCartItemRelatedAccessoryToBasket","index","vm","relatedAccessories","isAddingToCart","productId","quantity","addBasicProductApi","then","response","content","vueShoppingCartCount","total","basketItemsTotal","added","vueProduct","finally","triggerAddToCartAnalytics","setTimeout","addRelatedAccessoryToBasket","loader","document","querySelector","classList","remove","vueAddToCartModal","clearAddedProduct","open","add","requestServiceMixin","serverErrorMessage","isLoading","getLastPart","endpoint","parts","endsWith","slice","split","length","recaptcha_token","action","grecaptcha","ready","execute","GLOBAL","RECAPTCHASITEKEY","token","Promise","r","baseUrl","recaptcha","arguments","undefined","reCaptchaToken","getRecaptchToken","axios","method","url","headers","__requestverificationtoken","ANTIFORGERYTOKEN","__recaptchatoken","serverError","scrollIntoView","errors","$refs","errorObj","JSON","parse","message","catch","error","status","rg4js","customData","params","reviewServiceMixin","REVIEW_BASE","getReviews","addReview","searchServiceMixin","SEARCH_BASE","getSearchResults","shoppingCartServiceMixin","SHOPPING_CART_BASE","updateLineItem","deleteItem","addConfiguredProductApi","addLetteringProductApi","addVariantItems","getShoppingCartCountApi","getBasketItems","variantsMixin","addClearanceItemToCart","variantSku","variantSkus","Skus","openError","vouchersServiceMixin","VOUCHERS_BASE","applyPromoCode","removePromoCode","addOrderAddressMixin","saveAddress","useBillingDetails","countries","vueCheckoutAddressPage_DATA","address","validations","firstName","required","lastName","emailAddress","email","phoneNumber","line1","city","postalCode","countryId","getCheckoutAddress","addressType","addressId","showAddressForm","customValidationMixin","renderErrorMessage","dropZoneMixin","success","failed","dropZone","appElement","$el","id","previewNode","previewTemplate","parentNode","innerHTML","removeChild","errorBar","Dropzone","autoProcessQueue","uploadMultiple","parallelUploads","previewsContainer","acceptedFiles","thumbnailWidth","thumbnailHeight","maxFilesExceeded","files","removeAllFiles","addFile","init","totalSize","on","file","parseFloat","size","toFixed","setSendButtonState","previewElement","xhr","formData","button","disabled","dropZone_DATA","max10MBFilesReached","generalMixin","filters","value","isEmpty","obj","Object","keys","isNullOrEmpty","setCookie","name","days","expires","date","Date","setTime","getTime","toUTCString","cookie","getCookie","nameEQ","ca","i","c","charAt","substring","indexOf","eraseCookie","getById","el","getElementById","console","log","elementExists","element","submitError","tagName","focus","modalsMixin","modals","addToCart","review","dimensions","quote","productRedirect","edgeFinishing","roundCorners","drilledHoles","mixins","getOrCreateModal","modalId","instanceKey","backdrop","modalElement","$set","BSN","Modal","addEventListener","event","lazyLoadImages","addToCartModal","reviewModal","dimensionsModal","askAQuestionModal","quoteModal","productRedirectModal","edgeFinishingModal","roundCornersModal","drilledHolesModal","querySelectorAll","forEach","img","dataset","src","srcset","setAttribute","addressLookupMixin","showFindAddress","showNoResults","showEnterAddressManually","addressLookupId","addressLookup","addressLookupListSelect","addressApiError","isFindingAddress","companyName","line2","line3","state","mounted","$nextTick","enterAddressManually","findAddresses","container","encodeURIComponent","LOQATEAPIKEY","Items","Type","Id","selectAddress","Error","resp","Company","Line1","Line2","Line3","City","AdminAreaName","PostalCode","find","x","CountryName","computed","sortedAddress","sort","a","b","textA","Text","toUpperCase","textB","changeAddressMixin","isEdit","queryString","window","location","search","URLSearchParams","has","savedAddressMixin","showSaveAddressCheckBox","selectSavedAddress","target","selectedIndex","addresses","hasCompanyName","getAddresses","loaded","orderLineSelected","checked","couriersMixin","couriers","trackingUrls","trackingInputs","trackingDisabled","getCouriers","getCourier","courierCode","courier","updateTrackAndTraceUrl","$event","input","trackingParameters","template","courierIndex","trackingUrl","replace","trim","trackAndTrace","parseTrackAndTraceUrl","defaultTrackingUrlObject","orderId","orderNumber","trackingAvailable","changeCourier","Number","push","changePacker","saveFileMixin","saveAs","blob","URL","createObjectURL","link","createElement","href","body","appendChild","click","addToCartBarMixin","toggleAddToCartVisibility","beforeDestroy","removeEventListener","elem","addToCartBar","isOutOfViewport","any","top","left","bottom","right","getBoundingClientRect","innerHeight","documentElement","clientHeight","innerWidth","clientWidth","coloursMixin","colours","showColoursModal","colour","selected","hexadecimalCode","addColours","colourMatrixItems","items","closeColoursModal","openColoursModal","observerImages","observe","resetColours","hasColours","thicknesses","selectColour","colourMatrixItem","definitionFieldId","thumbNailImg","mediaId","changeSlideImgClick","parentElement","gslide","updateProductPrice","showFromPrice","disableMixin","disabledProps","addDisableMessage","disabledItem","mydiv","text","dimensionsUnavailableForCutSizeOptions","dimenensionsUnavailableForCutSizeOptionsDiscOrSheet","dimensionsUnavailableForCutSizeOptionsRodOrTube","mycontent","myicon","createTextNode","disableItems","disabledArray","removeDisabledItems","roundedCorners","key","selectors","invalidField","holes","distanceFromEdge","holeSize","hole","placement","nodeName","selectItem","disabledError","productRules","productRule","rule","standardContainer","checkDisabled","operators","amountOfVariables","tempOfValidErrors","tempListOfDisable","innerRule","propertyName","$innerRule","operator","ruleValue","parseInt","numberValue","disableThisItem","discountTiersMixin","discountTiers","vueProduct_DATA","discountBarStyle","width","calculateDiscountBarStyle","currentTier","tierQuantity","nextTier","nextTierTemp","NaN","addOn","widthPercentage","leftPercentage","concat","holesMixin","showDistanceFromEdge","disableCounterSunk","defaultDrilledHoles","hasDrilledHoles","countersunk","toggleDrillHole","holeArrayPosition","splice","errorMessages","clearServerSideErrors","toggleCounterSunk","watch","edgeFinishingMixin","selectEdgeFinish","hatchMixin","hatch","selectHatch","minMaxMixin","combinedMessage","selectedThickness","productItem","minMaxdimensions","minheight","maxheight","minwidth","maxwidth","mindiameter","maxdiameter","mintubelength","maxtubelength","minlength","maxlength","units","heightFunction","fromWhere","checkMinMax","height","thickness","properties","min","max","minMaxHeightMessage","errorMessage","differentErrorMessages","minMaxWidthMessage","minMaxTubeLengthMessage","diameter","minMaxDiameterMessage","getErrorMessages","$minmaxerror","matched","maxMinRules","unit","hasSelectedThickness","combinedErrorMessage","errorType","singleErrorMessage","setError","minMax","errorItem","minVal","maxVal","elementValue","$element","$thickness","$diameter","getAttribute","onLoadPropertiesMixin","defaultValues","maxProperties","setDefaultValues","model","ref","defaultValue","setMaxMinProperties","result","prop","nestedProp","setMinValue","field","setMaxValue","optionalExtrasMixin","showOptionalExtras","countOptions","clearOptionalExtras","bottomLeftRadius","bottomRightRadius","topLeftRadius","topRightRadius","drillHole","checkBox","additionalInstructions","openOptionalExtras","pricePer","property","incVat","from","item","optionalExtrasPricePer","formattedPriceIncVat","formattedPriceExVat","productMixin","PRODUCT","ID","colourMessage","initialPrice","priceResponse","isAvailable","addToCartButtonDisabled","price","salePrice","quantityPrice","quantitySalePrice","isUpdating","showLimitedStock","showNonStandard","showProductRedirect","showPleaseContactUs","handleGlobalFromPriceChange","isLimitedOrOutOfStock","inStock","productType","filter","d","toString","tubeDiameter","vueRedirectProductModal","redirectMeta","requiredFieldsAreValid","minValue","maxValue","dimension","type","checkCharacters","quantityMixin","debouncedUpdateTextQuantityPrice","created","_","debounce","getProductPrice","addQuantity","subtractQuantity","newQuantity","ratingsMixin","getStars","rating","ratings","wholeNumbers","Math","floor","remainder","j","step","roundedCornersMixin","socketCutOutsMixin","socketCutOuts","noOfCutOuts","additionalInfo","socketCutOutUploads","hasSocketCutOutsToUpload","forElement","uploadSocketCutOuts","socketUploads","processQueue","addConfiguredProduct","standardSizesMixin","setSheetStandardSize","displayDimensions","setRodDiscStandardSize","toggleMixin","slideUp","duration","style","transitionProperty","transitionDuration","boxSizing","offsetHeight","overflow","paddingTop","paddingBottom","marginTop","marginBottom","display","removeProperty","slideDown","getComputedStyle","slideToggle","toggle","slideToggleByElement","toggleToolTip","triggerToggle","toggleToolTipIcon","slideOptionalExtraPanel","closest","yesButton","noButton","contains","closeToolTip","attr","toolTipToToggle","icons","innerText","unitsMixin","changeUnit","oldUnit","newUnit","convert","conversionFactors","mm","cm","meters","decimalRounding","shapeProperty","round","dispatchEvent","Event","zeros","isInteger","validationMixin","invalidFields","showStandardSizesOnly","showSocketCutouts","serverSideValidationPassed","handleClearError","e","srcElement","clearErrors","className","startsWith","clearAllServerSideErrors","addRequiredAttributes","validateThisField","requiredAttributes","letterRadios","typefaceName","drilledHoleName","radiosSelected","drilledSelected","materialId","radioInput","holeInput","activeElement","vatMixin","incVATTranslation","TRANSLATIONS","INCVAT","exVATTranslation","EXVAT","incVAT","vueCurrency"],"mappings":"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","file":"../mixins.bundle.js","sourcesContent":["const accountServiceMixin = {\r\n data: function () {\r\n return {\r\n ACCOUNT_BASE: '/Api/Account/'\r\n }\r\n },\r\n methods: { \r\n registerUserApi: function (data) {\r\n return this.post(this.ACCOUNT_BASE, 'RegisterUser', data, true);\r\n },\r\n registerTradeUserApi: function (data) {\r\n return this.post(this.ACCOUNT_BASE, 'RegisterTradeUser', data, true);\r\n },\r\n loginUser: function (data) {\r\n return this.post(this.ACCOUNT_BASE, 'LoginUser', data);\r\n },\r\n addPassword: function (data) {\r\n return this.post(this.ACCOUNT_BASE, 'AddPassword', data);\r\n },\r\n changePassword: function (data) {\r\n return this.post(this.ACCOUNT_BASE, 'ChangePassword', data);\r\n },\r\n resetPassword: function (data) {\r\n return this.post(this.ACCOUNT_BASE, 'ResetPassword', data);\r\n },\r\n addOrUpdateAddress: function (data) {\r\n return this.post(this.ACCOUNT_BASE, 'AddOrUpdateAddress', data);\r\n },\r\n deleteAddressApi: function (data) {\r\n return this.post(this.ACCOUNT_BASE, 'DeleteAddress', data);\r\n },\r\n forgotPassword: function (data) {\r\n return this.post(this.ACCOUNT_BASE, 'ForgotPassword', data, true);\r\n },\r\n updateDetails: function (data) {\r\n return this.post(this.ACCOUNT_BASE, 'UpdateDetails', data);\r\n },\r\n getAddressesApi : function () {\r\n return this.get(this.ACCOUNT_BASE, 'GetAddresses');\r\n },\r\n getAddressApi: function (data) {\r\n return this.get(this.ACCOUNT_BASE, 'GetAddress', data);\r\n }\r\n }\r\n}","const blogServiceMixin = {\r\n data: function () {\r\n return {\r\n BLOG_BASE: '/Api/Blog/'\r\n }\r\n },\r\n methods: {\r\n getBlogPosts: function(purchaseOrderData) { \r\n return this.post(this.BLOG_BASE, 'GetPosts', purchaseOrderData);\r\n },\r\n getHomePageBlogPosts: function(purchaseOrderData) {\r\n return this.get(this.BLOG_BASE, 'GetHomePageBlogPosts', purchaseOrderData);\r\n }\r\n }\r\n}","const calcEngineServiceMixin = {\r\n\tdata: function () {\r\n\t\treturn {\r\n\t\t\tCALCENGINE_BASE: '/api/CalcEngine/',\r\n\t\t};\r\n\t},\r\n\tmethods: {\r\n\t\tgetProductPriceApi(productPrice) {\r\n\t\t\treturn this.post(this.CALCENGINE_BASE, 'GetProductPrice', productPrice, true);\r\n\t\t},\r\n\t\tasync validateProduct(productPrice) {\r\n\t\t\treturn this.post(this.CALCENGINE_BASE, 'ValidateProduct', productPrice);\r\n\t\t},\r\n\t\tgetBasicProductPriceApi: function (product) {\r\n\t\t\treturn this.post(this.CALCENGINE_BASE, 'GetBasicProductPrice', product, true);\r\n\t\t},\r\n\t\tgetLetteringProductPriceApi: function (product) {\r\n\t\t\treturn this.post(this.CALCENGINE_BASE, 'GetLetteringPrice', product, true);\r\n\t\t},\r\n\t},\r\n};\r\n","const checkoutServiceMixin = {\r\n data: function () {\r\n return {\r\n CHECKOUT_BASE: '/Api/Checkout/'\r\n }\r\n },\r\n methods: {\r\n setDeliveryMethodApi: function (data) {\r\n return this.post(this.CHECKOUT_BASE, 'SetDeliveryMethod', data);\r\n },\r\n submitPayment: function (data) {\r\n return this.post(this.CHECKOUT_BASE, 'SubmitPayment', data);\r\n },\r\n submitMotoPayment: function (data) {\r\n return this.post(this.CHECKOUT_BASE, 'SubmitMotoPayment', data);\r\n },\r\n isOrderNumberCreated: function (data) {\r\n return this.get(this.CHECKOUT_BASE, 'IsOrderNumberCreated', data);\r\n },\r\n getBasketReviewItems: function () {\r\n return this.get(this.CHECKOUT_BASE, 'BasketReviewItems');\r\n },\r\n getCheckoutAddressApi: function (data) {\r\n return this.get(this.CHECKOUT_BASE, 'CheckoutAddress', data);\r\n },\r\n addBillingInformation: function (data) {\r\n return this.post(this.CHECKOUT_BASE, 'AddBillingInformation', data);\r\n },\r\n addShippingInformation: function (data) {\r\n return this.post(this.CHECKOUT_BASE, 'AddShippingInformation', data);\r\n }\r\n }\r\n}\r\n","var contactServiceMixin = {\r\n data: function () {\r\n return {\r\n CONTACT_BASE: '/Api/Contact/'\r\n }\r\n },\r\n methods: {\r\n contactForm: function(data) {\r\n return this.post(this.CONTACT_BASE, 'ContactForm', data, true);\r\n },\r\n askAQuestion: function(data) {\r\n return this.post(this.CONTACT_BASE, 'AskAQuestion', data, true);\r\n },\r\n quoteMe: function (data) {\r\n return this.post(this.CONTACT_BASE, 'QuoteMe', data, true);\r\n }\r\n } \r\n}","var productServiceMixin= {\r\n data: function () {\r\n return {\r\n PRODUCT_BASE: '/api/ProductsApi/'\r\n }\r\n },\r\n methods: {\r\n getCategoryProducts: function (sortedCategoryProducts) {\r\n return this.get(this.PRODUCT_BASE, 'GetCategoryProducts', sortedCategoryProducts);\r\n },\r\n getProductRelatedProducts: function (data) {\r\n return this.get(this.PRODUCT_BASE, 'GetProductRelatedProducts', data);\r\n },\r\n getPageRelatedProducts: function (data) {\r\n return this.get(this.PRODUCT_BASE, 'GetPageRelatedProducts', data);\r\n },\r\n getRelatedProductsBasket: function (data) {\r\n return this.get(this.PRODUCT_BASE, 'GetRelatedProductsBasket');\r\n },\r\n getSamplesData: function (data) {\r\n return this.get(this.PRODUCT_BASE, 'GetSamplesData', data);\r\n },\r\n getThicknessesForColourApi: function (data) {\r\n return this.get(this.PRODUCT_BASE, 'GetThicknessesForColour', data);\r\n },\r\n getProductColours: function (data) {\r\n return this.get(this.PRODUCT_BASE, 'GetProductColours', data);\r\n },\r\n getProductThicknesses: function (data) {\r\n return this.get(this.PRODUCT_BASE, 'GetProductThicknesses', data);\r\n }\r\n\r\n }\r\n}","const purchaseOrderServiceMixin = {\r\n data: function () {\r\n return {\r\n PURCHASE_ORDER_BASE: '/Api/PurchaseOrder/'\r\n }\r\n },\r\n methods: {\r\n addAdditionalSocketCutOutFiles: function(purchaseOrderData) {\r\n return this.post(this.PURCHASE_ORDER_BASE, 'AddAdditionalSocketCutOutFiles', purchaseOrderData);\r\n }\r\n }\r\n}","const recaptchaServiceMixin = {\r\n data: function () {\r\n return {\r\n RECAPTCHA_BASE: '/Api/Recaptcha/'\r\n }\r\n },\r\n methods: {\r\n validateRecaptchaRetrieve: function () {\r\n return this.post(this.RECAPTCHA_BASE, 'ValidateRetrieve', null, true);\r\n }\r\n }\r\n}","const relatedAccessoriesMixin = {\r\n methods: {\r\n addCartItemRelatedAccessoryToBasket: function (product, index) {\r\n const vm = this;\r\n vm.relatedAccessories[index].isAddingToCart = true;\r\n\r\n const data = {\r\n productId: product.productId,\r\n quantity: product.quantity\r\n };\r\n\r\n this.addBasicProductApi(data)\r\n .then(function (response) {\r\n if (!response) {\r\n return;\r\n }\r\n\r\n const content = response.data.content;\r\n\r\n vueShoppingCartCount.total = content.basketItemsTotal;\r\n vm.relatedAccessories[index].added = true;\r\n vueProduct.quoteMe = content.quoteMe;\r\n })\r\n .finally(() => {\r\n vm.relatedAccessories[index].added = true;\r\n vm.relatedAccessories[index].isAddingToCart = false;\r\n vm.triggerAddToCartAnalytics('Add accessory from cart');\r\n\r\n setTimeout(() => {\r\n vm.relatedAccessories[index].added = false;\r\n vm.relatedAccessories[index].quantity = 1;\r\n }, 5000);\r\n });\r\n },\r\n addRelatedAccessoryToBasket: function (productId) {\r\n const vm = this;\r\n\r\n const data = {\r\n productId: productId,\r\n quantity: 1\r\n };\r\n\r\n const loader = document.querySelector('#addRelatedAccessoryItemToCart-' + productId);\r\n loader.classList.remove('d-none');\r\n\r\n this.addBasicProductApi(data)\r\n .then(function (response) {\r\n if (!response) {\r\n return;\r\n }\r\n\r\n const content = response.data.content;\r\n vueShoppingCartCount.total = content.basketItemsTotal;\r\n vueProduct.quoteMe = content.quoteMe;\r\n vueAddToCartModal.clearAddedProduct();\r\n vueAddToCartModal.open();\r\n })\r\n .finally(() => {\r\n loader.classList.add('d-none');\r\n });\r\n }\r\n }\r\n}","const requestServiceMixin = {\r\n data: function () {\r\n return {\r\n serverErrorMessage: '',\r\n isLoading: false,\r\n };\r\n },\r\n methods: {\r\n getLastPart(endpoint) {\r\n const trimmed = endpoint.endsWith('/') ? endpoint.slice(0, -1) : endpoint;\r\n const parts = trimmed.split('/');\r\n return parts[parts.length - 1];\r\n },\r\n async getRecaptchToken(endpoint) {\r\n let recaptcha_token = '';\r\n\r\n let data = {\r\n action: this.getLastPart(endpoint),\r\n };\r\n\r\n grecaptcha.ready(() => {\r\n grecaptcha.execute(GLOBAL.RECAPTCHASITEKEY, data).then((token) => {\r\n recaptcha_token = token;\r\n });\r\n });\r\n\r\n while (recaptcha_token == '') {\r\n await new Promise((r) => setTimeout(r, 100));\r\n }\r\n\r\n return recaptcha_token;\r\n },\r\n async post(baseUrl, endpoint, data, recaptcha = false) {\r\n const vm = this;\r\n vm.isLoading = true;\r\n\r\n let reCaptchaToken = '';\r\n\r\n if (recaptcha) {\r\n reCaptchaToken = await vm.getRecaptchToken(endpoint);\r\n }\r\n\r\n return await axios({\r\n method: 'post',\r\n url: baseUrl + endpoint,\r\n headers: {\r\n __requestverificationtoken: GLOBAL.ANTIFORGERYTOKEN,\r\n __recaptchatoken: reCaptchaToken,\r\n },\r\n data: data,\r\n })\r\n .then(function (response) {\r\n if (!response) {\r\n vm.serverErrorMessage = \"No response\";\r\n serverError.scrollIntoView();\r\n vm.isLoading = false;\r\n return null;\r\n }\r\n const content = response.data.content;\r\n vm.isLoading = false;\r\n if (content.errors !== null) {\r\n const serverError = vm.$refs['server-error'];\r\n\r\n if (serverError) {\r\n const errorObj = JSON.parse(content.errors);\r\n vm.serverErrorMessage = errorObj.message;\r\n serverError.scrollIntoView();\r\n return null;\r\n }\r\n }\r\n\r\n vm.serverErrorMessage = '';\r\n return response;\r\n })\r\n .catch(function (error) {\r\n if (error.response && error.response.status === 400) {\r\n }\r\n else\r\n {\r\n rg4js('send', {\r\n error: error,\r\n customData: {\r\n baseUrl: baseUrl,\r\n endpoint: endpoint,\r\n data: data,\r\n recaptcha: recaptcha,\r\n productPrice: productPrice,\r\n },\r\n });\r\n }\r\n\r\n vm.isLoading = false;\r\n const serverError = vm.$refs['server-error'];\r\n\r\n if (serverError) {\r\n vm.serverErrorMessage = 'Sorry there has been an error. Please contact us, or try again shortly.';\r\n }\r\n });\r\n },\r\n get: function (baseUrl, endpoint, data) {\r\n const vm = this;\r\n vm.isLoading = true;\r\n\r\n return axios({\r\n method: 'get',\r\n url: baseUrl + endpoint,\r\n params: data,\r\n })\r\n .then(function (response) {\r\n vm.isLoading = false;\r\n return response;\r\n })\r\n .catch(function (error) {\r\n if (typeof rg4js !== \"undefined\") {\r\n rg4js('send', {\r\n error: error,\r\n customData: {\r\n baseUrl: baseUrl,\r\n endpoint: endpoint,\r\n data: data,\r\n },\r\n });\r\n }\r\n vm.isLoading = false;\r\n });\r\n },\r\n },\r\n};\r\n","const reviewServiceMixin = {\r\n data: function () {\r\n return {\r\n REVIEW_BASE: '/Api/Review/'\r\n }\r\n },\r\n methods: { \r\n getReviews: function (data) {\r\n return this.get(this.REVIEW_BASE, 'GetReviews', data);\r\n },\r\n addReview: function (data) {\r\n return this.post(this.REVIEW_BASE, 'AddReview', data, true);\r\n }\r\n }\r\n}","const searchServiceMixin = {\r\n data: function () {\r\n return {\r\n SEARCH_BASE: '/Api/Search/'\r\n }\r\n },\r\n methods: {\r\n getSearchResults: function(data) {\r\n return this.post(this.SEARCH_BASE, 'UpdateResults', data);\r\n }\r\n }\r\n}","const shoppingCartServiceMixin = {\r\n data: function () {\r\n return {\r\n SHOPPING_CART_BASE: '/api/ShoppingCartApi/'\r\n }\r\n },\r\n methods: {\r\n updateLineItem: function(data) {\r\n return this.post(this.SHOPPING_CART_BASE, 'UpdateItem', data);\r\n },\r\n deleteItem: function (data) {\r\n return this.post(this.SHOPPING_CART_BASE, 'RemoveItem', data);\r\n },\r\n addConfiguredProductApi: function (data) {\r\n return this.post(this.SHOPPING_CART_BASE, 'AddConfiguredProduct', data, true);\r\n },\r\n addBasicProductApi: function (data) {\r\n return this.post(this.SHOPPING_CART_BASE, 'AddBasicProduct', data, true);\r\n },\r\n addLetteringProductApi: function (data) {\r\n return this.post(this.SHOPPING_CART_BASE, 'AddLetteringProduct', data, true);\r\n },\r\n addVariantItems: function (data) {\r\n return this.post(this.SHOPPING_CART_BASE, 'AddVariantItems', data, true);\r\n },\r\n getShoppingCartCountApi: function () {\r\n return this.get(this.SHOPPING_CART_BASE, 'GetShoppingCartCount');\r\n },\r\n getBasketItems: function () {\r\n return this.get(this.SHOPPING_CART_BASE, 'GetBasketItems');\r\n }\r\n }\r\n}","const variantsMixin = {\r\n methods: {\r\n addClearanceItemToCart: function (variantSku, productId) {\r\n const vm = this;\r\n \r\n const variantSkus = {\r\n Skus: [variantSku]\r\n };\r\n\r\n const loader = document.querySelector('#addClearanceItemToCart-' + productId);\r\n loader.classList.remove('d-none');\r\n \r\n vm.addVariantItems(variantSkus)\r\n .then(function (response) {\r\n if (!response)\r\n return;\r\n\r\n const content = response.data.content;\r\n\r\n if (content.errors !== null) {\r\n vueAddToCartModal.openError();\r\n } else {\r\n vueShoppingCartCount.total = content.basketItemsTotal;\r\n vueProduct.quoteMe = content.quoteMe;\r\n vueAddToCartModal.clearAddedProduct();\r\n vueAddToCartModal.open();\r\n }\r\n })\r\n .finally(() => {\r\n loader.classList.add('d-none');\r\n });\r\n }\r\n }\r\n}","const vouchersServiceMixin = {\r\n data: function () {\r\n return {\r\n VOUCHERS_BASE: '/api/VouchersApi/'\r\n }\r\n },\r\n methods: {\r\n applyPromoCode: function (data) {\r\n return this.post(this.VOUCHERS_BASE, 'ApplyPromoCode', data);\r\n },\r\n removePromoCode: function (data) {\r\n return this.get(this.VOUCHERS_BASE, 'RemovePromoCode', data);\r\n }\r\n }\r\n}","const addOrderAddressMixin = {\r\n data: function () {\r\n return {\r\n saveAddress: false,\r\n useBillingDetails: true,\r\n countries: vueCheckoutAddressPage_DATA.countries,\r\n address: {}\r\n }\r\n },\r\n validations: {\r\n address: {\r\n firstName: {\r\n required\r\n },\r\n lastName: {\r\n required\r\n },\r\n emailAddress: {\r\n required,\r\n email \r\n },\r\n phoneNumber: {\r\n required\r\n },\r\n line1: {\r\n required\r\n },\r\n city: {\r\n required\r\n },\r\n postalCode: {\r\n required\r\n },\r\n countryId: {\r\n required\r\n }\r\n }\r\n },\r\n methods: {\r\n getCheckoutAddress: function () {\r\n const vm = this;\r\n\r\n const data = {\r\n addressType: vueCheckoutAddressPage_DATA.addressType\r\n };\r\n\r\n vm.getCheckoutAddressApi(data)\r\n .then(function (response) {\r\n if (!response)\r\n return;\r\n\r\n vm.address = response.data.content;\r\n\r\n if (vm.address.addressId !== 0) {\r\n vm.showAddressForm = true;\r\n }\r\n });\r\n }\r\n }\r\n}","var customValidationMixin = {\r\n data: function () {\r\n return {\r\n serverErrorMessage: ''\r\n }\r\n },\r\n methods: {\r\n /**\r\n * Renders the server side error message into a generic block on the page\r\n * @param {any} data\r\n */\r\n renderErrorMessage: function (error) {\r\n const vm = this;\r\n const serverError = vm.$refs['server-error'];\r\n\r\n if (serverError) {\r\n vm.serverErrorMessage = JSON.parse(error.message);\r\n serverError.scrollIntoView();\r\n }\r\n }\r\n }\r\n}","var dropZoneMixin = {\r\n data: function () {\r\n return {\r\n serverError: '',\r\n response: {\r\n success: false,\r\n failed: false\r\n }\r\n }\r\n },\r\n methods: {\r\n dropZone: function () {\r\n const vm = this;\r\n const appElement = '#' + vm.$el.id + ' '; // $el is the calling vue app\r\n\r\n const previewNode = document.querySelector(appElement + '#template');\r\n\r\n if (previewNode === null)\r\n return;\r\n\r\n previewNode.id = \"\";\r\n\r\n const previewTemplate = previewNode.parentNode.innerHTML;\r\n previewNode.parentNode.removeChild(previewNode);\r\n\r\n const errorBar = document.querySelector('#error-bar');\r\n\r\n new Dropzone(appElement + '#file-uploads', {\r\n url: '/Api/Uploads/UploadFiles',\r\n autoProcessQueue: false,\r\n uploadMultiple: true,\r\n parallelUploads: 100,\r\n previewTemplate: previewTemplate,\r\n previewsContainer: appElement + '#previews',\r\n acceptedFiles: 'image/png, image/jpeg, application/pdf, .eps, .dwg, .dxf',\r\n thumbnailWidth: 16,\r\n thumbnailHeight: 16,\r\n maxFilesExceeded: function (files) {\r\n this.removeAllFiles();\r\n this.addFile(files);\r\n },\r\n headers: {\r\n '__requestverificationtoken': GLOBAL.ANTIFORGERYTOKEN\r\n },\r\n init: function () {\r\n const dropZone = this;\r\n var totalSize = 0;\r\n\r\n dropZone.on(\"addedfile\", function (file) {\r\n totalSize += parseFloat((file.size / (1024 * 1024)).toFixed(2));\r\n\r\n vm.setSendButtonState(totalSize) \r\n });\r\n dropZone.on(\"removedfile\", function (file) {\r\n totalSize -= parseFloat((file.size / (1024 * 1024)).toFixed(2));\r\n\r\n vm.setSendButtonState(totalSize)\r\n });\r\n dropZone.on(\"error\", function (file, response) {\r\n errorBar.classList.remove('d-none');\r\n errorBar.querySelector('span').innerHTML = response;\r\n\r\n //reset the progress bars and show the remove file icon\r\n file.previewElement.querySelector(\".progress \").classList.add('d-none');\r\n file.previewElement.querySelector(\".close \").classList.remove('d-none');\r\n\r\n });\r\n dropZone.on(\"sendingmultiple\", function (file, xhr, formData) {\r\n\r\n });\r\n dropZone.on(\"errormultiple\", function (files, response) {\r\n errorBar.classList.remove('d-none');\r\n errorBar.querySelector('span').innerHTML = response.message;\r\n });\r\n dropZone.on(\"sending\", function (file) {\r\n file.previewElement.querySelector(\".progress \").classList.remove('d-none');\r\n file.previewElement.querySelector(\".close \").classList.add('d-none');\r\n });\r\n\r\n }\r\n });\r\n },\r\n setSendButtonState: function (totalSize) {\r\n const button = document.querySelector('#upload-files-button');\r\n const errorBar = document.querySelector('#error-bar');\r\n\r\n if (totalSize >= 10) {\r\n button.disabled = true;\r\n button.classList.add('disabled');\r\n errorBar.classList.remove('d-none');\r\n errorBar.querySelector('span').innerHTML = dropZone_DATA.max10MBFilesReached;\r\n } else {\r\n button.disabled = false;\r\n button.classList.remove('disabled');\r\n errorBar.classList.add('d-none');\r\n errorBar.querySelector('span').innerHTML = \"\";\r\n }\r\n }\r\n }\r\n}","var generalMixin = {\r\n\tfilters: {\r\n\t\ttoFixed: function (value) {\r\n\t\t\treturn parseFloat(value).toFixed(2);\r\n\t\t},\r\n\t},\r\n\tmethods: {\r\n\t\t/**\r\n\t\t * Checks to see if an object is empty\r\n\t\t * @param {any} object - object to check\r\n\t\t * @returns {boolean}\r\n\t\t */\r\n\t\tisEmpty: function (obj) {\r\n\t\t\treturn Object.keys(obj).length === 0;\r\n\t\t},\r\n\t\t/**\r\n\t\t * Returns true if the value is empty\r\n\t\t * @param {any} value\r\n\t\t */\r\n\t\tisNullOrEmpty: function (value) {\r\n\t\t\treturn !value;\r\n\t\t},\r\n\t\t/**\r\n\t\t * Set's the cookie, default 365 days\r\n\t\t * @param {string} name Name of the cookie\r\n\t\t * @param {any} value\r\n\t\t * @param {number} days\r\n\t\t */\r\n\t\tsetCookie: function (name, value, days = 365) {\r\n\t\t\tvar expires = '';\r\n\t\t\tif (days) {\r\n\t\t\t\tvar date = new Date();\r\n\t\t\t\tdate.setTime(date.getTime() + days * 24 * 60 * 60 * 1000);\r\n\t\t\t\texpires = '; expires=' + date.toUTCString();\r\n\t\t\t}\r\n\t\t\tdocument.cookie = name + '=' + (value || '') + expires + '; path=/';\r\n\t\t},\r\n\t\t/**\r\n\t\t * Get's the cookie\r\n\t\t * @param {string} name Name of the cookie\r\n\t\t */\r\n\t\tgetCookie: function (name) {\r\n\t\t\tconst nameEQ = name + '=';\r\n\t\t\tconst ca = document.cookie.split(';');\r\n\t\t\tfor (var i = 0; i < ca.length; i++) {\r\n\t\t\t\tvar c = ca[i];\r\n\t\t\t\twhile (c.charAt(0) == ' ') c = c.substring(1, c.length);\r\n\t\t\t\tif (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length, c.length);\r\n\t\t\t}\r\n\t\t\treturn null;\r\n\t\t},\r\n\t\t/**\r\n\t\t * Deletes the cookie\r\n\t\t * @param {string} name Name of the cookie\r\n\t\t */\r\n\t\teraseCookie: function (name) {\r\n\t\t\tdocument.cookie = name + '=; Path=/; Expires=Thu, 01 Jan 1970 00:00:01 GMT;';\r\n\t\t},\r\n\t\tgetById: function (id) {\r\n\t\t\tvar el = document.getElementById(id);\r\n\t\t\tif (!el) {\r\n\t\t\t\tconsole.log(id + ' is not defined');\r\n\t\t\t\treturn null;\r\n\t\t\t\tthrow new ReferenceError();\r\n\t\t\t}\r\n\t\t\treturn el;\r\n\t\t},\r\n\t\t/**\r\n\t\t * Ensures the element or attribute exists\r\n\t\t * @param {dom} element - a dom element e.g. from getElementById\r\n\t\t */\r\n\t\telementExists: function (element) {\r\n\t\t\treturn element !== null && element !== undefined;\r\n\t\t},\r\n\t\tsubmitError: function () {\r\n\t\t\tsetTimeout(function () {\r\n\t\t\t\tdocument.querySelector('.is-invalid').scrollIntoView();\r\n\r\n\t\t\t\tif (document.querySelector('.is-invalid').tagName == 'DIV') {\r\n\t\t\t\t\tif (document.querySelector('.is-invalid input')) {\r\n\t\t\t\t\t\tdocument.querySelector('.is-invalid input').focus();\r\n\t\t\t\t\t} else if (document.querySelector('.is-invalid select')) {\r\n\t\t\t\t\t\tdocument.querySelector('.is-invalid select').focus();\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tdocument.querySelector('.is-invalid textarea').focus();\r\n\t\t\t\t\t}\r\n\t\t\t\t} else {\r\n\t\t\t\t\tdocument.querySelector('.is-invalid').focus();\r\n\t\t\t\t}\r\n\t\t\t}, 10);\r\n\t\t},\r\n\t},\r\n};\r\n","const modalsMixin = {\r\n data: function () {\r\n return { \r\n modals: {\r\n addToCart: null,\r\n review: null,\r\n dimensions: null,\r\n askAQuestion: null,\r\n quote: null,\r\n productRedirect: null,\r\n edgeFinishing: null,\r\n roundCorners: null,\r\n drilledHoles: null\r\n }\r\n };\r\n },\r\n mixins: [generalMixin],\r\n methods: {\r\n /**\r\n * Retrieves or creates a modal instance based on the provided modalId and instanceKey.\r\n *\r\n * @param {string} modalId - The ID of the modal element.\r\n * @param {string} instanceKey - The key used to store the modal instance in the modals object.\r\n * @param {string} backdrop - defaults to static. Options are also true/false. See bootstrap for other options.\r\n * @return {BSN.Modal} The modal instance.\r\n */\r\n getOrCreateModal: function (modalId, instanceKey, backdrop = 'static') {\r\n const modalElement = document.querySelector(modalId);\r\n\r\n if (!this.modals[instanceKey] && modalElement) {\r\n this.$set(this.modals, instanceKey, new BSN.Modal(modalElement, {\r\n backdrop: backdrop,\r\n }));\r\n }\r\n\r\n if (modalElement) {\r\n modalElement.addEventListener('show.bs.modal', (event) => {\r\n this.lazyLoadImages(modalElement);\r\n });\r\n }\r\n\r\n return this.modals[instanceKey];\r\n },\r\n addToCartModal: function () {\r\n return this.getOrCreateModal('#vueAddToCartModal', 'addToCart');\r\n },\r\n reviewModal: function () {\r\n return this.getOrCreateModal('#vueReviewModal', 'review');\r\n },\r\n dimensionsModal: function () {\r\n return this.getOrCreateModal('#vueDimensionsModal', 'dimensions');\r\n },\r\n askAQuestionModal: function () {\r\n return this.getOrCreateModal('#vueAskAQuestionModal', 'askAQuestion');\r\n },\r\n quoteModal: function () {\r\n return this.getOrCreateModal('#vueQuoteModal', 'quote');\r\n },\r\n productRedirectModal: function () {\r\n return this.getOrCreateModal('#vueRedirectProductModal', 'productRedirect');\r\n },\r\n edgeFinishingModal: function () {\r\n return this.getOrCreateModal('#vueEdgeFinishingModal', 'edgeFinishing', true);\r\n },\r\n roundCornersModal: function () {\r\n return this.getOrCreateModal('#vueRoundCornersModal', 'roundCorners', true);\r\n },\r\n drilledHolesModal: function () {\r\n return this.getOrCreateModal('#vueDrilledHolesModal', 'drilledHoles', true);\r\n },\r\n lazyLoadImages: function (el) {\r\n const images = el.querySelectorAll(\"[data-lazyload]\");\r\n images.forEach((img) => {\r\n if (img.dataset.src) {\r\n img.src = img.dataset.src;\r\n }\r\n if (img.dataset.srcset) {\r\n img.srcset = img.dataset.srcset;\r\n }\r\n img.setAttribute(\"data-loaded\", \"true\");\r\n img.classList.add(\"loaded\");\r\n });\r\n }\r\n },\r\n};\r\n","var addressLookupMixin = {\r\n data: function () {\r\n return {\r\n showFindAddress: true,\r\n showNoResults: false,\r\n showAddressForm: false,\r\n showEnterAddressManually: true,\r\n addressLookupId: 0,\r\n addressLookup: '',\r\n addressLookupListSelect: [],\r\n addressApiError: false,\r\n isFindingAddress: false,\r\n address: {\r\n companyName: null,\r\n line1: null,\r\n line2: null,\r\n line3: null,\r\n city: null,\r\n state: null,\r\n postalCode: null,\r\n countryId: null\r\n }\r\n }\r\n },\r\n mounted: function () {\r\n const vm = this;\r\n vm.$nextTick(function () {\r\n if (vm.address.addressId > 0) {\r\n vm.enterAddressManually();\r\n }\r\n });\r\n },\r\n methods: {\r\n enterAddressManually: function () {\r\n const vm = this;\r\n vm.showAddressForm = true;\r\n vm.showEnterAddressManually = false;\r\n },\r\n findAddresses: function (container = \"\") {\r\n const vm = this;\r\n\r\n if (vm.isFindingAddress) {\r\n return;\r\n }\r\n\r\n var url = 'https://api.addressy.com/Capture/Interactive/Find/v1.10/json3.ws';\r\n var params = '';\r\n params += \"&Key=\" + encodeURIComponent(GLOBAL.LOQATEAPIKEY);\r\n params += \"&Text=\" + encodeURIComponent(vm.addressLookup);\r\n\r\n if (container !== null) {\r\n params += \"&Container=\" + encodeURIComponent(container);\r\n }\r\n\r\n params += \"&IsMiddleware=\" + encodeURIComponent(\"True\");\r\n params += \"&Countries=\" + encodeURIComponent(\"GB\");\r\n\r\n vm.isFindingAddress = true;\r\n axios.post(url, params, {\r\n headers: {\r\n 'Content-Type': 'application/x-www-form-urlencoded'\r\n }\r\n })\r\n .then(function (response) {\r\n if (!response) {\r\n vm.enterAddressManually();\r\n vm.addressApiError = true;\r\n vm.isFindingAddress = false;\r\n return;\r\n }\r\n\r\n vm.isFindingAddress = false;\r\n\r\n var data = response.data;\r\n\r\n if (data.Items.length) {\r\n vm.showNoResults = false;\r\n\r\n if (data.Items[0].Type !== 'Address') {\r\n vm.findAddresses(data.Items[0].Id);\r\n return;\r\n }\r\n\r\n vm.addressLookupListSelect = data.Items;\r\n if (vm.addressLookupListSelect.length === 1) {\r\n vm.addressLookupId = vm.addressLookupListSelect[0].Id;\r\n vm.selectAddress();\r\n }\r\n else {\r\n vm.addressLookupId = 0;\r\n }\r\n } else {\r\n vm.showNoResults = true;\r\n vm.enterAddressManually();\r\n }\r\n })\r\n .catch(function () {\r\n vm.enterAddressManually();\r\n vm.addressApiError = true;\r\n vm.isFindingAddress = false;\r\n });\r\n },\r\n selectAddress: function () {\r\n const vm = this;\r\n\r\n if (vm.addressLookupId == 0) {\r\n return;\r\n }\r\n\r\n vm.validateRecaptchaRetrieve().then(function (response) {\r\n if (!response) {\r\n vm.enterAddressManually();\r\n vm.addressApiError = true;\r\n return;\r\n }\r\n\r\n var url = 'https://api.addressy.com/Capture/Interactive/Retrieve/v1.20/json3.ws';\r\n var params = '';\r\n params += \"&Key=\" + encodeURIComponent(GLOBAL.LOQATEAPIKEY);\r\n params += \"&Id=\" + encodeURIComponent(vm.addressLookupId);\r\n\r\n axios.post(url, params, {\r\n headers: {\r\n 'Content-Type': 'application/x-www-form-urlencoded'\r\n }\r\n })\r\n .then(function (response) {\r\n var data = response.data;\r\n\r\n if (data.Items.length === 1 && typeof (data.Items[0].Error) !== \"undefined\") {\r\n vm.addressApiError = true;\r\n vm.enterAddressManually();\r\n } else {\r\n if (data.Items.length === 0) {\r\n vm.showNoResults = true;\r\n } else {\r\n vm.showEnterAddressManually = false;\r\n\r\n const resp = data.Items[0];\r\n\r\n vm.address.companyName = resp.Company;\r\n\r\n if (resp.line3 !== '') {\r\n vm.address.line1 = resp.Line1;\r\n if (resp.Line2 !== '') {\r\n vm.address.line1 += ', ' + resp.Line2\r\n }\r\n vm.address.line2 = resp.Line3;\r\n } else {\r\n vm.address.line1 = resp.Line1;\r\n vm.address.line2 = resp.Line2;\r\n }\r\n\r\n vm.address.city = resp.City;\r\n vm.address.state = resp.AdminAreaName;\r\n vm.address.postalCode = resp.PostalCode;\r\n vm.address.countryId = vm.countries.find(x => x.name == resp.CountryName).countryId;\r\n\r\n vm.enterAddressManually();\r\n }\r\n }\r\n })\r\n .catch(function (error) {\r\n vm.enterAddressManually();\r\n vm.addressApiError = true;\r\n });\r\n });\r\n },\r\n },\r\n computed: {\r\n sortedAddress() {\r\n return this.addressLookupListSelect.sort((a, b) => {\r\n let textA = a.Text.toUpperCase(); // ignore case\r\n let textB = b.Text.toUpperCase(); // ignore case\r\n return (textA < textB) ? -1 : (textA > textB) ? 1 : 0;\r\n });\r\n },\r\n },\r\n}\r\n","var changeAddressMixin = {\r\n data: function () {\r\n return {\r\n isEdit: false\r\n }\r\n },\r\n mounted: function() {\r\n const queryString = window.location.search;\r\n const urlParams = new URLSearchParams(queryString);\r\n\r\n if (urlParams.has('edit')) {\r\n const vm = this;\r\n vm.isEdit = true;\r\n vm.useBillingDetails = false;\r\n }\r\n }\r\n}","var savedAddressMixin = {\r\n data: function () {\r\n return {\r\n addressId: 0,\r\n showSaveAddressCheckBox: true\r\n }\r\n },\r\n methods: { \r\n /**\r\n * Selects the saved address for populating into the address and details form fields \r\n * @param {any} event \r\n */\r\n selectSavedAddress: function (event) {\r\n const vm = this;\r\n var index = event.target.selectedIndex;\r\n\r\n if (index > 0) {\r\n index--;\r\n vm.address = vm.addresses[index];\r\n \r\n } else {\r\n vm.address = {};\r\n }\r\n vm.showEnterAddressManually = false;\r\n vm.enterAddressManually();\r\n vm.showSaveAddressCheckBox = false;\r\n },\r\n /**\r\n * Puts the company name value in the dropdown if it exists\r\n * @param {string} value Company name\r\n */\r\n hasCompanyName: function (value) {\r\n return (value !== '' && value !== undefined) ? value + ' - ' : '';;\r\n },\r\n getAddresses: function () {\r\n const vm = this;\r\n vm.getAddressesApi()\r\n .then(function (response) {\r\n if (!response)\r\n return;\r\n\r\n const content = response.data.content;\r\n\r\n vm.addresses = content;\r\n vm.loaded = true;\r\n });\r\n }\r\n }\r\n}","const orderLineSelected = (value, vm) => {\r\n const found = value.find(element => element.checked === true);\r\n if (found !== undefined) {\r\n return true;\r\n }\r\n return false;\r\n};\r\n\r\nvar couriersMixin = {\r\n data: function () {\r\n return {\r\n couriers: [],\r\n trackingUrls: [],\r\n trackingInputs: [],\r\n trackingDisabled:[]\r\n }\r\n },\r\n methods: {\r\n getCouriers: function () {\r\n const vm = this;\r\n axios({\r\n method: 'get',\r\n url: '/Umbraco/BackOffice/Api/OrderDeliveryDetails/GetCouriers/'\r\n }).then(function (response) {\r\n const data = response.data;\r\n vm.couriers = data;\r\n }).catch(function (error) {\r\n if (error.response) {\r\n console.log(error.response.data);\r\n }\r\n });\r\n },\r\n getCourier: function (courierCode) {\r\n const vm = this;\r\n return vm.couriers.find(courier => courier.courierCode === courierCode);\r\n },\r\n\r\n updateTrackAndTraceUrl: function (index, $event) {\r\n const vm = this;\r\n const input = $event.target.value;\r\n \r\n const trackingParameters = input.split(\",\");\r\n\r\n if (vm.trackingUrls[index] === undefined)\r\n return;\r\n\r\n let template = vm.couriers[vm.trackingUrls[index].courierIndex].trackingUrl;\r\n\r\n for (let i = 0; i < trackingParameters.length; i++) {\r\n template = template.replace(\"{\" + i + \"}\", trackingParameters[i].trim());\r\n }\r\n\r\n vm.trackingUrls[index].trackingUrl = template;\r\n vm.trackingUrls[index].trackAndTrace = input;\r\n }, \r\n parseTrackAndTraceUrl: function (template, trackAndTrace) {\r\n const trackingParameters = trackAndTrace.split(\",\");\r\n\r\n if (template === 'undefined') {\r\n return\r\n }\r\n\r\n for (let i = 0; i < trackingParameters.length; i++) {\r\n template = template.replace(\"{\" + i + \"}\", trackingParameters[i].trim());\r\n }\r\n\r\n return template;\r\n },\r\n defaultTrackingUrlObject: function() {\r\n return [\r\n {\r\n orderId: 0,\r\n orderNumber: '',\r\n courierIndex: -1,\r\n courierCode: '',\r\n trackAndTrace: '',\r\n trackingUrl: '', \r\n trackingAvailable: true\r\n }\r\n ];\r\n },\r\n changeCourier: function (orderId, index, $event) {\r\n const vm = this;\r\n const courierIndex = $event.target.value;\r\n const trackingParameters = vm.$refs['trackingParameters'];\r\n\r\n if (courierIndex == -1) {\r\n console.log(courierIndex, 'is -1') \r\n vm.trackingUrls = vm.defaultTrackingUrlObject();\r\n vm.trackingDisabled[index] = true;\r\n return;\r\n }\r\n\r\n const courier = vm.couriers[courierIndex];\r\n console.log('courier:', courier)\r\n if (!courier.trackingAvailable) {\r\n vm.trackingDisabled[index] = true;\r\n if (trackingParameters.length > 0)\r\n trackingParameters[index].value = '';\r\n else\r\n trackingParameters.value = '';\r\n }\r\n else\r\n {\r\n vm.trackingDisabled[index] = false;\r\n }\r\n\r\n const obj = {\r\n orderId: orderId,\r\n courierIndex: Number(courierIndex),\r\n courierCode: courier.courierCode,\r\n trackAndTrace: courier.trackAndTrace,\r\n trackingUrl: courier.trackingUrl,\r\n trackingAvailable: courier.trackingAvailable\r\n }\r\n\r\n var trackingUrls = vm.trackingUrls[index];\r\n if (trackingUrls === undefined) {\r\n vm.trackingUrls.push(obj);\r\n } else {\r\n trackingUrls.courierCode = courier.courierCode;\r\n trackingUrls.trackAndTrace = courier.trackAndTrace;\r\n trackingUrls.trackingUrl = courier.trackingUrl;\r\n trackingUrls.courierIndex = Number(courierIndex);\r\n trackingUrls.trackingAvailable = courier.trackingAvailable;\r\n }\r\n },\r\n changePacker: function (orderId, index, $event) {\r\n \r\n }\r\n }\r\n}","var saveFileMixin = {\r\n data: function () {\r\n \r\n },\r\n methods: {\r\n saveAs: function (blob, name) {\r\n const url = window.URL.createObjectURL(blob);\r\n const link = document.createElement('a');\r\n link.href = url;\r\n link.setAttribute('download', name);\r\n document.body.appendChild(link);\r\n link.click();\r\n }\r\n }\r\n}","const addToCartBarMixin = {\r\n mounted() {\r\n this.toggleAddToCartVisibility();\r\n window.addEventListener('scroll', this.toggleAddToCartVisibility, false);\r\n },\r\n beforeDestroy() {\r\n window.removeEventListener('scroll', this.toggleAddToCartVisibility);\r\n },\r\n methods: {\r\n toggleAddToCartVisibility() {\r\n const elem = this.$el.querySelector('.price-start');\r\n const addToCartBar = document.querySelector('.add-to-cart-bar.buy-bar');\r\n\r\n if (!elem || !addToCartBar) return;\r\n\r\n const isOut = this.isOutOfViewport(elem);\r\n const method = isOut.any ? 'add' : 'remove';\r\n\r\n addToCartBar.classList[method]('show');\r\n document.body.classList[method]('add-to-cart-visible');\r\n },\r\n isOutOfViewport(elem) {\r\n const { top, left, bottom, right } = elem.getBoundingClientRect();\r\n const viewHeight = window.innerHeight || document.documentElement.clientHeight;\r\n const viewWidth = window.innerWidth || document.documentElement.clientWidth;\r\n\r\n return {\r\n top: top < 0,\r\n left: left < 0,\r\n bottom: bottom > viewHeight,\r\n right: right > viewWidth,\r\n get any() {\r\n return this.top || this.left || this.bottom || this.right;\r\n }\r\n };\r\n },\r\n },\r\n};\r\n","var coloursMixin = {\r\n\tdata: function () {\r\n\t\treturn {\r\n\t\t\tcolours: [],\r\n\t\t\tshowColoursModal: false,\r\n\t\t\tproduct: {\r\n\t\t\t\tcolour: '',\r\n\t\t\t},\r\n\t\t\tselected: {\r\n\t\t\t\tproduct: {\r\n\t\t\t\t\tcolour: '',\r\n\t\t\t\t\thexadecimalCode: '',\r\n\t\t\t\t},\r\n\t\t\t},\r\n\t\t};\r\n\t},\r\n\tmethods: {\r\n\t\taddColours: function (colourMatrixItems) {\r\n\t\t\tconst vm = this;\r\n\r\n\t\t\tvar items = [];\r\n\t\t\tcolourMatrixItems.forEach(function (element) {\r\n\t\t\t\titems.push(element.colours);\r\n\t\t\t});\r\n\r\n\t\t\tvm.colours = items;\r\n\t\t},\r\n\t\tcloseColoursModal: function () {\r\n\t\t\tconst vm = this;\r\n\r\n\t\t\tvm.showColoursModal = false;\r\n\t\t\tdocument.body.classList.remove('modal-open');\r\n\t\t},\r\n\t\topenColoursModal: function () {\r\n\t\t\tconst vm = this;\r\n\t\t\tvm.showColoursModal = true;\r\n\t\t\tdocument.body.classList.add('modal-open');\r\n\r\n\t\t\tif (document.querySelector('#typeface-preview') != null) {\r\n\t\t\t\twindow.observerImages.observe();\r\n\t\t\t}\r\n\t\t},\r\n\t\tresetColours: function () {\r\n\t\t\tconst vm = this;\r\n\t\t\tvm.hasColours = false;\r\n\t\t\tvm.selected.product.colour = {};\r\n\t\t\tvm.$refs['selectColor'].required = false;\r\n\t\t\tvm.colours = [];\r\n\t\t\tvm.product.colour = {};\r\n\t\t\tvm.thicknesses = [];\r\n\t\t},\r\n\t\tselectColour: function (colour) {\r\n\t\t\tconst vm = this;\r\n\t\t\tconst colourMatrixItem = vm.colourMatrixItems.find(\r\n\t\t\t\t(items) => items.colours.definitionFieldId === colour.definitionFieldId\r\n\t\t\t);\r\n\r\n\t\t\tvm.selected.product.colour = {\r\n\t\t\t\tname: colour.name,\r\n\t\t\t\thexadecimalCode: colour.hexadecimalCode,\r\n\t\t\t};\r\n\r\n\t\t\tvm.product.colour = colour.name;\r\n\r\n\t\t\tconst thumbNailImg = document.querySelector(\r\n\t\t\t\t'.slider-nav-thumbnails img[data-media-id=\"' + colour.mediaId + '\"]'\r\n\t\t\t);\r\n\r\n\t\t\tif (thumbNailImg) {\r\n\t\t\t\tchangeSlideImgClick(thumbNailImg.parentElement.dataset.gslide);\r\n\t\t\t}\r\n\r\n\t\t\tvm.thicknesses = colourMatrixItem.thicknesses;\r\n\r\n\t\t\tvm.updateProductPrice();\r\n\r\n\t\t\tif (document.querySelector('.colour.is-invalid')) {\r\n\t\t\t\tdocument.querySelector('.colour.is-invalid').classList.remove('is-invalid');\r\n\t\t\t}\r\n\t\t\tvm.$refs['selectColor'].classList.remove('is-invalid');\r\n\t\t\tvm.$refs['selectColor'].parentElement.classList.remove('is-invalid');\r\n\r\n\t\t\tvm.closeColoursModal();\r\n\t\t\tvm.showFromPrice = false;\r\n\t\t},\r\n\t},\r\n};\r\n","var disableMixin = {\r\n\tdata: function () {\r\n\t\treturn {\r\n\t\t\tdisabledProps: false,\r\n\t\t};\r\n\t},\r\n\tmethods: {\r\n\t\taddDisableMessage: function (disabledItem) {\r\n\t\t\tconst vm = this;\r\n\t\t\tlet mydiv = null;\r\n\r\n\t\t\tlet text =\r\n\t\t\t\tvm.dimensionsUnavailableForCutSizeOptions ||\r\n\t\t\t\t'Fallback text - dimensionsUnavailableForCutSizeOptions needs adding to translations';\r\n\r\n\t\t\tif (disabledItem == 'standardSizes') {\r\n\t\t\t\tmydiv = document.querySelector('.js-custom-size-container');\r\n\t\t\t\tif (\r\n\t\t\t\t\t(document.querySelector('input#width') && document.querySelector('input#height')) ||\r\n\t\t\t\t\tdocument.querySelector('input#diameter')\r\n\t\t\t\t) {\r\n\t\t\t\t\t// disc or sheet\r\n\t\t\t\t\ttext =\r\n\t\t\t\t\t\tvm.dimenensionsUnavailableForCutSizeOptionsDiscOrSheet ||\r\n\t\t\t\t\t\t'Fallback text - dimenensionsUnavailableForCutSizeOptionsDiscOrSheet needs adding to translations';\r\n\t\t\t\t} else if (document.querySelector('select#diameter')) {\r\n\t\t\t\t\t// rod or tube\r\n\t\t\t\t\ttext =\r\n\t\t\t\t\t\tvm.dimensionsUnavailableForCutSizeOptionsRodOrTube ||\r\n\t\t\t\t\t\t'Fallback text - dimensionsUnavailableForCutSizeOptionsRodOrTube needs adding to translations';\r\n\t\t\t\t}\r\n\t\t\t} else {\r\n\t\t\t\tmydiv = document.getElementById(disabledItem);\r\n\t\t\t}\r\n\r\n\t\t\tif (mydiv) {\r\n\t\t\t\tvar mycontent = document.createElement('p');\r\n\t\t\t\tvar myicon = document.createElement('i');\r\n\t\t\t\tmyicon.classList.add('material-icons', 'icon-30');\r\n\t\t\t\tmyicon.appendChild(document.createTextNode('sd_card_alert'));\r\n\t\t\t\tmycontent.appendChild(myicon);\r\n\t\t\t\tmycontent.appendChild(document.createTextNode(text));\r\n\t\t\t\tmycontent.classList.add('disabled-error');\r\n\r\n\t\t\t\tsetTimeout(function () {\r\n\t\t\t\t\tmydiv.appendChild(mycontent);\r\n\t\t\t\t}, 10);\r\n\t\t\t}\r\n\t\t},\r\n\t\tdisableItems: function (disabledArray) {\r\n\t\t\tconst vm = this;\r\n\t\t\tvm.removeDisabledItems();\r\n\r\n\t\t\tif (disabledArray) {\r\n\t\t\t\tdisabledArray.forEach((disabledItem) => {\r\n\t\t\t\t\tvm.addDisableMessage(disabledItem);\r\n\r\n\t\t\t\t\tif (disabledItem == 'round-corners') {\r\n\t\t\t\t\t\tObject.keys(vm.product.roundedCorners).forEach((key) => {\r\n\t\t\t\t\t\t\tvm.product.roundedCorners[key] = 0;\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tif (disabledItem == 'standardSizes') {\r\n\t\t\t\t\t\tconst container = document.querySelector('.js-custom-size');\r\n\t\t\t\t\t\tif (container) {\r\n\t\t\t\t\t\t\tconst selectors = container.querySelectorAll(\r\n\t\t\t\t\t\t\t\t'#width, #length, #height, #diameter, .js-select-unit'\r\n\t\t\t\t\t\t\t);\r\n\t\t\t\t\t\t\tsetTimeout(function () {\r\n\t\t\t\t\t\t\t\tselectors.forEach(function (invalidField) {\r\n\t\t\t\t\t\t\t\t\tinvalidField.disabled = true;\r\n\t\t\t\t\t\t\t\t\tinvalidField.classList.add('disabled');\r\n\t\t\t\t\t\t\t\t\tinvalidField.classList.remove('selected');\r\n\t\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t\t}, 10);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tif (disabledItem == 'drilled-holes') {\r\n\t\t\t\t\t\tvm.product.holes.distanceFromEdge = 0;\r\n\t\t\t\t\t\tvm.product.holes.holeSize = 0;\r\n\r\n\t\t\t\t\t\tconst holes = document.querySelectorAll('.drill-hole-wrapper input[type=checkbox]');\r\n\t\t\t\t\t\tholes.forEach(function (hole) {\r\n\t\t\t\t\t\t\thole.checked = false;\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t\tvm.product.placement = [];\r\n\r\n\t\t\t\t\t\tdocument.querySelector('.drill-box').classList.add('disabled');\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tconst container = document.getElementById(disabledItem);\r\n\t\t\t\t\tif (container) {\r\n\t\t\t\t\t\tconst selectors = container.querySelectorAll('.selector, .form-group, .custom-checkbox');\r\n\t\t\t\t\t\tselectors.forEach(function (invalidField) {\r\n\t\t\t\t\t\t\tif (invalidField.nodeName == 'DIV') {\r\n\t\t\t\t\t\t\t\tconst selects = invalidField.querySelectorAll('select, input');\r\n\t\t\t\t\t\t\t\tselects.forEach(function (selectItem) {\r\n\t\t\t\t\t\t\t\t\tselectItem.disabled = true;\r\n\t\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\tinvalidField.classList.add('disabled');\r\n\t\t\t\t\t\t\tinvalidField.classList.remove('selected');\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t}\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t},\r\n\t\tremoveDisabledItems: function () {\r\n\t\t\tconst vm = this;\r\n\r\n\t\t\tconst disabledErrors = document.querySelectorAll('.disabled-error');\r\n\t\t\tdisabledErrors.forEach(function (disabledError) {\r\n\t\t\t\tdisabledError.remove();\r\n\t\t\t});\r\n\r\n\t\t\tif (vm.productRules) {\r\n\t\t\t\tvm.productRules.forEach((productRule) => {\r\n\t\t\t\t\tif (productRule.rule) {\r\n\t\t\t\t\t\tproductRule.rule.disabled.forEach((disabledItem) => {\r\n\t\t\t\t\t\t\tif (disabledItem == 'standardSizes') {\r\n\t\t\t\t\t\t\t\tconst standardContainer = document.querySelector('.js-custom-size');\r\n\t\t\t\t\t\t\t\tif (standardContainer) {\r\n\t\t\t\t\t\t\t\t\tconst standardCSelectors = standardContainer.querySelectorAll(\r\n\t\t\t\t\t\t\t\t\t\t'#width, #length, #height, #diameter, .js-select-unit'\r\n\t\t\t\t\t\t\t\t\t);\r\n\t\t\t\t\t\t\t\t\tstandardCSelectors.forEach(function (invalidField) {\r\n\t\t\t\t\t\t\t\t\t\tinvalidField.disabled = false;\r\n\t\t\t\t\t\t\t\t\t\tinvalidField.classList.remove('disabled');\r\n\t\t\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\t\tconst container = document.getElementById(disabledItem);\r\n\t\t\t\t\t\t\t\tif (container) {\r\n\t\t\t\t\t\t\t\t\tconst selectors = container.querySelectorAll(\r\n\t\t\t\t\t\t\t\t\t\t'.selector, .form-group, .custom-checkbox'\r\n\t\t\t\t\t\t\t\t\t);\r\n\t\t\t\t\t\t\t\t\tselectors.forEach(function (invalidField) {\r\n\t\t\t\t\t\t\t\t\t\tif (invalidField.nodeName == 'DIV') {\r\n\t\t\t\t\t\t\t\t\t\t\tconst selects = invalidField.querySelectorAll('select, input');\r\n\t\t\t\t\t\t\t\t\t\t\tselects.forEach(function (selectItem) {\r\n\t\t\t\t\t\t\t\t\t\t\t\tselectItem.disabled = false;\r\n\t\t\t\t\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t\tinvalidField.classList.remove('disabled');\r\n\t\t\t\t\t\t\t\t\t});\r\n\r\n\t\t\t\t\t\t\t\t\tif (disabledItem == 'drilled-holes') {\r\n\t\t\t\t\t\t\t\t\t\tdocument.querySelector('.drill-box').classList.remove('disabled');\r\n\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t}\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t},\r\n\t\tcheckDisabled: function (value) {\r\n\t\t\tconst vm = this;\r\n\t\t\tvm.disabledProps = false;\r\n\r\n\t\t\tif (vm.productRules) {\r\n\t\t\t\tvm.productRules.forEach((productRule) => {\r\n\t\t\t\t\tif (productRule.rule) {\r\n\t\t\t\t\t\tvar operators = {\r\n\t\t\t\t\t\t\t'>': function (a, b) {\r\n\t\t\t\t\t\t\t\treturn a > b;\r\n\t\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\t'<': function (a, b) {\r\n\t\t\t\t\t\t\t\treturn a < b;\r\n\t\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\t'<=': function (a, b) {\r\n\t\t\t\t\t\t\t\treturn a <= b;\r\n\t\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\t'>=': function (a, b) {\r\n\t\t\t\t\t\t\t\treturn a >= b;\r\n\t\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\t'=': function (a, b) {\r\n\t\t\t\t\t\t\t\treturn a == b;\r\n\t\t\t\t\t\t\t},\r\n\t\t\t\t\t\t};\r\n\r\n\t\t\t\t\t\tif (productRule.rule) {\r\n\t\t\t\t\t\t\tlet amountOfVariables = 0;\r\n\t\t\t\t\t\t\tlet tempOfValidErrors = [];\r\n\t\t\t\t\t\t\tlet tempListOfDisable = [];\r\n\r\n\t\t\t\t\t\t\tObject.keys(productRule.rule).forEach((innerRule) => {\r\n\t\t\t\t\t\t\t\tif (productRule.rule[innerRule]) {\r\n\t\t\t\t\t\t\t\t\tconst propertyName = innerRule;\r\n\t\t\t\t\t\t\t\t\tconst $innerRule = productRule.rule[innerRule];\r\n\r\n\t\t\t\t\t\t\t\t\tif (typeof $innerRule === 'object' && $innerRule.value) {\r\n\t\t\t\t\t\t\t\t\t\tamountOfVariables = amountOfVariables + 1;\r\n\t\t\t\t\t\t\t\t\t\tconst operator = $innerRule.operator;\r\n\t\t\t\t\t\t\t\t\t\tlet ruleValue = parseInt($innerRule.value);\r\n\t\t\t\t\t\t\t\t\t\tlet numberValue = vm.product.dimensions[propertyName];\r\n\r\n\t\t\t\t\t\t\t\t\t\tif (operator) {\r\n\t\t\t\t\t\t\t\t\t\t\tif (operators[operator](numberValue, ruleValue)) {\r\n\t\t\t\t\t\t\t\t\t\t\t\ttempListOfDisable.push(productRule.rule.disabled);\r\n\t\t\t\t\t\t\t\t\t\t\t\ttempOfValidErrors.push($innerRule);\r\n\t\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t});\r\n\r\n\t\t\t\t\t\t\t// if the number of errors equals the total amount of rules then add the errors to the page\r\n\t\t\t\t\t\t\tif (tempOfValidErrors.length === amountOfVariables) {\r\n\t\t\t\t\t\t\t\ttempListOfDisable.forEach((disableThisItem) => {\r\n\t\t\t\t\t\t\t\t\tvm.disableItems(disableThisItem);\r\n\t\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t\t\tvm.disabledProps = true;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t});\r\n\t\t\t}\r\n\r\n\t\t\tif (!vm.disabledProps) {\r\n\t\t\t\tvm.removeDisabledItems();\r\n\t\t\t}\r\n\t\t},\r\n\t}\r\n};\r\n","/**\r\n * Moves the discount tiers mixin properties up and down.\r\n */\r\nvar discountTiersMixin = {\r\n\tdata: function () {\r\n\t\treturn {\r\n\t\t\tdiscountTiers: vueProduct_DATA.discountTiers,\r\n\t\t\tdiscountBarStyle: {\r\n\t\t\t\twidth: '0%',\r\n\t\t\t\tleft: '0%'\r\n\t\t\t},\r\n\t\t}\r\n\t},\r\n\tmethods: {\r\n\t\t/**\r\n\t\t* Calculates the style of the discount bar based on the product quantity and discount tiers.\r\n\t\t*/\r\n\t\tcalculateDiscountBarStyle() {\r\n\t\t\tconst quantity = this.product.quantity;\r\n\t\t\tconst discountTiers = this.discountTiers;\r\n\r\n\t\t\tlet currentTier;\r\n\t\t\tlet tierQuantity;\r\n\t\t\tlet nextTier;\r\n\r\n\t\t\tdiscountTiers.forEach((element, index) => {\r\n\t\t\t\tif (element.key <= quantity) {\r\n\t\t\t\t\tcurrentTier = index;\r\n\t\t\t\t\ttierQuantity = parseInt(element.key);\r\n\t\t\t\t}\r\n\t\t\t});\r\n\r\n\t\t\tif (discountTiers[currentTier + 1] !== undefined) {\r\n\t\t\t\tlet nextTierTemp = discountTiers[currentTier + 1];\r\n\t\t\t\tnextTier = nextTierTemp ? parseInt(nextTierTemp.key) : NaN;\r\n\t\t\t} else {\r\n\t\t\t\tnextTier = 99999999;\r\n\t\t\t}\r\n\r\n\t\t\tconst addOn = (100 * 1) / discountTiers.length;\r\n\t\t\tlet widthPercentage = 0;\r\n\r\n\t\t\tif ((100 * currentTier) / discountTiers.length + addOn !== addOn) {\r\n\t\t\t\tif (quantity < nextTier && quantity >= tierQuantity) {\r\n\t\t\t\t\twidthPercentage = (100 * currentTier) / discountTiers.length;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tconst leftPercentage = (100 * 1) / discountTiers.length;\r\n\r\n\t\t\t// Update the reactive `discountBarStyle` property\r\n\t\t\tthis.discountBarStyle = {\r\n\t\t\t\twidth: `calc(${widthPercentage}% + 10px)`,\r\n\t\t\t\tleft: `${leftPercentage}%`\r\n\t\t\t};\r\n\t\t}\r\n\t},\r\n};\r\n","const holesMixin = {\r\n\tdata: function () {\r\n\t\treturn {\r\n\t\t\tshowDistanceFromEdge: true,\r\n\t\t\tdisableCounterSunk: true,\r\n\t\t\tproduct: {\r\n\t\t\t\tholes: this.defaultDrilledHoles(),\r\n\t\t\t},\r\n\t\t};\r\n\t},\r\n\tmethods: {\r\n\t\tdefaultDrilledHoles: function () {\r\n\t\t\treturn {\r\n\t\t\t\thasDrilledHoles: false,\r\n\t\t\t\tholeSize: 0,\r\n\t\t\t\tdistanceFromEdge: 0,\r\n\t\t\t\tcountersunk: false,\r\n\t\t\t\tplacement: [],\r\n\t\t\t};\r\n\t\t},\r\n\t\ttoggleDrillHole: function (event) {\r\n\t\t\tconst vm = this;\r\n\t\t\tconst holes = vm.product.holes.placement;\r\n\t\t\tconst value = event.target.value;\r\n\t\t\tconst holeArrayPosition = holes.indexOf(value);\r\n\r\n\t\t\t//add item\r\n\t\t\tif (holeArrayPosition === -1) {\r\n\t\t\t\tholes.push(value);\r\n\t\t\t\tholes.sort();\r\n\t\t\t} else {\r\n\t\t\t\t//delete item\r\n\t\t\t\tholes.splice(holeArrayPosition, 1);\r\n\t\t\t}\r\n\r\n\t\t\tif (holes.length == 1 && holes[0] == 'center') {\r\n\t\t\t\tvm.showDistanceFromEdge = false;\r\n\t\t\t\tvm.product.holes.distanceFromEdge = vm.defaultDrilledHoles.distanceFromEdge;\r\n\t\t\t\tdocument.getElementById('drill-hole-distance').classList.remove('is-invalid');\r\n\t\t\t} else {\r\n\t\t\t\tif (vm.showDistanceFromEdge == false) {\r\n\t\t\t\t\tvm.product.holes.distanceFromEdge = 0;\r\n\t\t\t\t}\r\n\t\t\t\tvm.showDistanceFromEdge = true;\r\n\t\t\t}\r\n\r\n\t\t\tif (holes.length > 0) {\r\n\t\t\t\tconst holes = document.querySelectorAll('.drill-hole-wrapper input[type=checkbox]');\r\n\t\t\t\tholes.forEach(function (hole) {\r\n\t\t\t\t\thole.classList.remove('is-invalid');\r\n\t\t\t\t\thole.parentElement.classList.remove('is-invalid');\r\n\t\t\t\t});\r\n\t\t\t}\r\n\r\n\t\t\tsetTimeout(function () {\r\n\t\t\t\tif (!document.querySelector('.is-invalid')) {\r\n\t\t\t\t\tvm.updateProductPrice();\r\n\t\t\t\t}\r\n\t\t\t}, 100);\r\n\r\n\t\t\tconst errorMessages = document.querySelectorAll(\"#drilled-holes [id$='-error']\");\r\n\r\n\t\t\tvm.clearServerSideErrors(errorMessages);\r\n\t\t},\r\n\t\ttoggleCounterSunk: function (value) {\r\n\t\t\tconst vm = this;\r\n\t\t\tvm.product.holes.countersunk = value;\r\n\t\t},\r\n\t},\r\n\twatch: {\r\n\t\t'product.holes.holeSize': function (holeSize) {\r\n\t\t\tconst vm = this;\r\n\r\n\t\t\tif (holeSize <= 10) {\r\n\t\t\t\tvm.disableCounterSunk = false;\r\n\t\t\t} else {\r\n\t\t\t\tvm.product.holes.countersunk = false;\r\n\t\t\t\tvm.disableCounterSunk = true;\r\n\t\t\t\tvm.$refs['countersink-2-label'].click();\r\n\t\t\t}\r\n\t\t},\r\n\t},\r\n};\r\n","var edgeFinishingMixin = {\r\n data: function () {\r\n return {\r\n product: {\r\n edgeFinishing: 0\r\n }\r\n }\r\n },\r\n methods: {\r\n selectEdgeFinish: function (edgeFinishing) {\r\n const vm = this;\r\n vm.product.edgeFinishing = Number(edgeFinishing);\r\n vm.updateProductPrice();\r\n }\r\n },\r\n}","var hatchMixin = {\r\n data: function () {\r\n return {\r\n product: {\r\n hatch: 0\r\n }\r\n }\r\n },\r\n methods: {\r\n selectHatch: function (hatch) {\r\n const vm = this;\r\n vm.product.hatch = Number(hatch);\r\n vm.updateProductPrice();\r\n }\r\n },\r\n}","var minMaxMixin = {\r\n\tdata: function () {\r\n\t\treturn {\r\n\t\t\tcombinedMessage: null,\r\n\t\t\tselectedThickness: null,\r\n\t\t\tproductItem: null,\r\n\t\t\tminMaxdimensions: {\r\n\t\t\t\tminheight: {\r\n\t\t\t\t\tmessage: '',\r\n\t\t\t\t\terror: false,\r\n\t\t\t\t},\r\n\t\t\t\tmaxheight: {\r\n\t\t\t\t\tmessage: '',\r\n\t\t\t\t\terror: false,\r\n\t\t\t\t},\r\n\t\t\t\tminwidth: {\r\n\t\t\t\t\tmessage: '',\r\n\t\t\t\t\terror: false,\r\n\t\t\t\t},\r\n\t\t\t\tmaxwidth: {\r\n\t\t\t\t\tmessage: '',\r\n\t\t\t\t\terror: false,\r\n\t\t\t\t},\r\n\t\t\t\tmindiameter: {\r\n\t\t\t\t\tmessage: '',\r\n\t\t\t\t\terror: false,\r\n\t\t\t\t},\r\n\t\t\t\tmaxdiameter: {\r\n\t\t\t\t\tmessage: '',\r\n\t\t\t\t\terror: false,\r\n\t\t\t\t},\r\n\t\t\t\tmintubelength: {\r\n\t\t\t\t\tmessage: '',\r\n\t\t\t\t\terror: false,\r\n\t\t\t\t},\r\n\t\t\t\tmaxtubelength: {\r\n\t\t\t\t\tmessage: '',\r\n\t\t\t\t\terror: false,\r\n\t\t\t\t},\r\n\t\t\t\tminlength: {\r\n\t\t\t\t\tmessage: '',\r\n\t\t\t\t\terror: false,\r\n\t\t\t\t},\r\n\t\t\t\tmaxlength: {\r\n\t\t\t\t\tmessage: '',\r\n\t\t\t\t\terror: false,\r\n\t\t\t\t},\r\n\t\t\t},\r\n\t\t\tunits: '',\r\n\t\t};\r\n\t},\r\n\tmethods: {\r\n\t\theightFunction: function (element, fromWhere) {\r\n\t\t\tconst vm = this;\r\n\r\n\t\t\tif (fromWhere == 'select') {\r\n\t\t\t\tvm.checkMinMax(\r\n\t\t\t\t\t'height',\r\n\t\t\t\t\tvm.product.dimensions.height,\r\n\t\t\t\t\telement.thickness.properties.height.min,\r\n\t\t\t\t\telement.thickness.properties.height.max\r\n\t\t\t\t);\r\n\t\t\t}\r\n\r\n\t\t\tlet minMaxHeightMessage = element.thickness.properties.height.errorMessage;\r\n\t\t\tvm.minMaxdimensions.minheight.message = minMaxHeightMessage;\r\n\t\t\tvm.minMaxdimensions.maxheight.message = minMaxHeightMessage;\r\n\t\t},\r\n\r\n\t\tdifferentErrorMessages: function (element, fromWhere) {\r\n\t\t\tconst vm = this;\r\n\r\n\t\t\t// width errors\r\n\t\t\tif (element.thickness.properties.width && document.getElementById('width')) {\r\n\t\t\t\tif (fromWhere == 'select') {\r\n\t\t\t\t\tvm.checkMinMax(\r\n\t\t\t\t\t\t'width',\r\n\t\t\t\t\t\tvm.product.dimensions.width,\r\n\t\t\t\t\t\telement.thickness.properties.width.min,\r\n\t\t\t\t\t\telement.thickness.properties.width.max\r\n\t\t\t\t\t);\r\n\t\t\t\t}\r\n\r\n\t\t\t\tlet minMaxWidthMessage = element.thickness.properties.width.errorMessage;\r\n\t\t\t\tvm.minMaxdimensions.minwidth.message = minMaxWidthMessage;\r\n\t\t\t\tvm.minMaxdimensions.maxwidth.message = minMaxWidthMessage;\r\n\r\n\t\t\t\tif (element.thickness.properties.height && document.getElementById('height')) {\r\n\t\t\t\t\tvm.heightFunction(element, fromWhere);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\t// height errors\r\n\t\t\telse if (element.thickness.properties.height && document.getElementById('height')) {\r\n\t\t\t\tvm.heightFunction(element, fromWhere);\r\n\t\t\t}\r\n\r\n\t\t\t// tube diameter errors\r\n\t\t\telse if (element.thickness.properties.length && document.getElementById('length')) {\r\n\t\t\t\tif (fromWhere == 'select') {\r\n\t\t\t\t\tvm.checkMinMax(\r\n\t\t\t\t\t\t'length',\r\n\t\t\t\t\t\tvm.product.dimensions.length,\r\n\t\t\t\t\t\telement.thickness.properties.length.min,\r\n\t\t\t\t\t\telement.thickness.properties.length.max\r\n\t\t\t\t\t);\r\n\t\t\t\t}\r\n\t\t\t\tlet minMaxTubeLengthMessage = element.thickness.properties.length.errorMessage;\r\n\r\n\t\t\t\tvm.minMaxdimensions.mintubelength.message = minMaxTubeLengthMessage;\r\n\t\t\t\tvm.minMaxdimensions.maxtubelength.message = minMaxTubeLengthMessage;\r\n\t\t\t}\r\n\r\n\t\t\t// diameter errors\r\n\t\t\telse if (element.thickness.properties.diameter && document.getElementById('diameter')) {\r\n\t\t\t\t// rod pages where there is a diameter dropdown as well as length dimensions - skip this one then go length\r\n\t\t\t\tif (fromWhere != 'length') {\r\n\t\t\t\t\tif (fromWhere == 'select') {\r\n\t\t\t\t\t\tvm.checkMinMax(\r\n\t\t\t\t\t\t\t'diameter',\r\n\t\t\t\t\t\t\tvm.product.dimensions.diameter,\r\n\t\t\t\t\t\t\telement.thickness.properties.diameter.min,\r\n\t\t\t\t\t\t\telement.thickness.properties.diameter.max\r\n\t\t\t\t\t\t);\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tlet minMaxDiameterMessage = element.thickness.properties.diameter.errorMessage;\r\n\t\t\t\t\tvm.minMaxdimensions.mindiameter.message = minMaxDiameterMessage;\r\n\t\t\t\t\tvm.minMaxdimensions.maxdiameter.message = minMaxDiameterMessage;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t},\r\n\t\tgetErrorMessages: function (value, fromWhere) {\r\n\t\t\tconst vm = this;\r\n\t\t\tconst $minmaxerror = document.getElementById('dimensions-minmax-error');\r\n\r\n\t\t\tvm.productItem = null;\r\n\t\t\tvm.selectedThickness = value;\r\n\t\t\tlet matched = false;\r\n\r\n\t\t\tif (vm.maxMinRules) {\r\n\t\t\t\tvm.maxMinRules.forEach((element) => {\r\n\t\t\t\t\tif (element.thickness) {\r\n\t\t\t\t\t\tif (element.thickness.value == value) {\r\n\t\t\t\t\t\t\tmatched = true;\r\n\r\n\t\t\t\t\t\t\tvm.units = vm.product.dimensions.unit;\r\n\r\n\t\t\t\t\t\t\tif (element.thickness.value == vm.selectedThickness) {\r\n\t\t\t\t\t\t\t\tvm.productItem = element;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\tvm.differentErrorMessages(element, fromWhere);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t});\r\n\r\n\t\t\t\tif (!matched) {\r\n\t\t\t\t\tvm.maxMinRules.forEach((element) => {\r\n\t\t\t\t\t\tif (element.thickness) {\r\n\t\t\t\t\t\t\tif (!element.thickness.key) {\r\n\t\t\t\t\t\t\t\tvm.units = vm.product.dimensions.unit;\r\n\r\n\t\t\t\t\t\t\t\tif (element.thickness.value == vm.selectedThickness) {\r\n\t\t\t\t\t\t\t\t\tvm.productItem = element;\r\n\t\t\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t\t\tvm.differentErrorMessages(element, fromWhere);\r\n\t\t\t\t\t\t\t\treturn false;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t});\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\t// show combined error message and replace values\r\n\t\t\tif (document.querySelectorAll('.is-invalid-minmax').length > 1) {\r\n\t\t\t\tlet hasSelectedThickness = false;\r\n\t\t\t\t// match selected thickness to maxMinRule\r\n\t\t\t\tif (vm.maxMinRules) {\r\n\t\t\t\t\tvm.maxMinRules.forEach((element) => {\r\n\t\t\t\t\t\tif (element.thickness.value == vm.selectedThickness) {\r\n\t\t\t\t\t\t\tvm.productItem = element;\r\n\t\t\t\t\t\t\thasSelectedThickness = true;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t});\r\n\r\n\t\t\t\t\tif (!hasSelectedThickness) {\r\n\t\t\t\t\t\tvm.productItem = vm.maxMinRules[0];\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (vm.productItem) {\r\n\t\t\t\t\tlet combinedErrorMessage = vm.productItem.thickness.properties.combinedErrorMessage;\r\n\r\n\t\t\t\t\tvm.combinedMessage = combinedErrorMessage;\r\n\r\n\t\t\t\t\t$minmaxerror.classList.remove('d-none');\r\n\t\t\t\t\t$minmaxerror.innerHTML = vm.combinedMessage;\r\n\t\t\t\t}\r\n\t\t\t} else if (document.querySelectorAll('.is-invalid-minmax').length == 1) {\r\n\t\t\t\t// match selected thickness to maxMinRule\r\n\t\t\t\tif (vm.maxMinRules) {\r\n\t\t\t\t\tvm.maxMinRules.forEach((element) => {\r\n\t\t\t\t\t\tif (element.thickness.value == vm.selectedThickness) {\r\n\t\t\t\t\t\t\tvm.productItem = element;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t});\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (vm.productItem) {\r\n\t\t\t\t\t// if only 1 error\r\n\t\t\t\t\t$minmaxerror.classList.remove('d-none');\r\n\t\t\t\t\t// set error message for correct item\r\n\t\t\t\t\tconst errorType = document.querySelector('.is-invalid-minmax').id;\r\n\t\t\t\t\tlet singleErrorMessage = '';\r\n\r\n\t\t\t\t\tsingleErrorMessage = vm.productItem.thickness.properties[errorType].errorMessage;\r\n\r\n\t\t\t\t\t$minmaxerror.innerHTML = singleErrorMessage;\r\n\t\t\t\t\tvm.combinedMessage = null;\r\n\t\t\t\t} else {\r\n\t\t\t\t\t// use fallback error message if there isn't one matching (the one with no key)\r\n\t\t\t\t\tconst errorType = document.querySelector('.is-invalid-minmax').id;\r\n\r\n\t\t\t\t\tlet singleErrorMessage = '';\r\n\r\n\t\t\t\t\tsingleErrorMessage = vm.maxMinRules[0].thickness.properties[errorType].errorMessage;\r\n\r\n\t\t\t\t\t$minmaxerror.innerHTML = singleErrorMessage;\r\n\t\t\t\t\t$minmaxerror.classList.remove('d-none');\r\n\r\n\t\t\t\t\tvm.combinedMessage = null;\r\n\t\t\t\t}\r\n\t\t\t} else {\r\n\t\t\t\tif ($minmaxerror) {\r\n\t\t\t\t\t$minmaxerror.classList.add('d-none');\r\n\t\t\t\t\t$minmaxerror.innerHTML = '';\r\n\t\t\t\t}\r\n\t\t\t\tvm.combinedMessage = null;\r\n\t\t\t}\r\n\t\t},\r\n\t\tsetError: function (element, minMax, message) {\r\n\t\t\tconst vm = this;\r\n\t\t\tconst errorItem = minMax + element.id;\r\n\r\n\t\t\tvm.minMaxdimensions[errorItem].message = message;\r\n\t\t\tvm.minMaxdimensions[errorItem].error = true;\r\n\t\t},\r\n\t\tcheckMinMax: function (element, value, minVal, maxVal) {\r\n\t\t\tconst vm = this;\r\n\r\n\t\t\tif (!value) {\r\n\t\t\t\tvalue = vm.product.dimensions[element];\r\n\t\t\t}\r\n\r\n\t\t\tlet elementValue;\r\n\t\t\tconst $element = document.getElementById(element);\r\n\r\n\t\t\tconst $thickness = document.getElementById('thickness');\r\n\t\t\tconst $diameter = document.getElementById('diameter');\r\n\t\t\tconst errorMessage = $element.getAttribute('data-error-message');\r\n\t\t\t// elementValue = parseInt($element.value);\r\n\t\t\telementValue = parseInt(value);\r\n\r\n\t\t\tif (minVal != null && maxVal != null) {\r\n\t\t\t\tif (elementValue < minVal) {\r\n\t\t\t\t\t$element.classList.add('is-invalid-minmax');\r\n\t\t\t\t\tvm.setError($element, 'min', errorMessage);\r\n\t\t\t\t} else if (elementValue > maxVal) {\r\n\t\t\t\t\t$element.classList.add('is-invalid-minmax');\r\n\t\t\t\t\tvm.setError($element, 'max', errorMessage);\r\n\t\t\t\t} else {\r\n\t\t\t\t\t$element.classList.remove('is-invalid-minmax');\r\n\t\t\t\t}\r\n\t\t\t\tif ($thickness && $thickness.value > 0) {\r\n\t\t\t\t\tvm.getErrorMessages($thickness.value, element);\r\n\t\t\t\t} else if ($diameter) {\r\n\t\t\t\t\tvm.getErrorMessages($diameter.value, element);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t},\r\n\t},\r\n\twatch: {},\r\n};\r\n","const onLoadPropertiesMixin = {\r\n\tdata: function () {\r\n\t\treturn {\r\n\t\t\tdefaultValues: [],\r\n\t\t\tmaxProperties: {\r\n\t\t\t\twidth: 0,\r\n\t\t\t\theight: 0,\r\n\t\t\t\tdiameter: 0,\r\n\t\t\t\tlength: 0,\r\n\t\t\t},\r\n\t\t};\r\n\t},\r\n\tmethods: {\r\n\t\t/**\r\n\t\t * Loads a default value if specified in the backend\r\n\t\t * @param {object} model the data model to update/check\r\n\t\t */\r\n\t\tsetDefaultValues: function (model) {\r\n\t\t\tconst vm = this;\r\n\t\t\tObject.keys(vm.$refs).forEach((ref) => {\r\n\t\t\t\tconst element = vm.$refs[ref];\r\n\t\t\t\tconst defaultValue = element.dataset.defaultValue;\r\n\t\t\t\tif (defaultValue !== undefined) {\r\n\t\t\t\t\tvm.$set(model, element.id, defaultValue);\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t},\r\n\t\t/**\r\n\t\t * Sets the max and minimum properties of the form field.These values come from the defaultValues object\r\n\t\t * @param {string} field property to set e.g.max / min.\r\n\t\t * @param {string} property field to set property on.\r\n\t\t */\r\n\t\tsetMaxMinProperties: function (value = '0') {\r\n\t\t\tconst vm = this;\r\n\r\n\t\t\tif (vm.isNullOrEmpty(vm.maxMinRules)) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tlet result = undefined;\r\n\t\t\tvm.maxMinRules.forEach((obj) => {\r\n\t\t\t\tif (obj.thickness.value === value) {\r\n\t\t\t\t\tresult = obj;\r\n\t\t\t\t}\r\n\t\t\t});\r\n\r\n\t\t\t// let result = vm.maxMinRules.filter((obj) => obj.thickness.value === value)[0];\r\n\r\n\t\t\tif (value == '0' && result == undefined) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tif (result == undefined) {\r\n\t\t\t\tvm.setMaxMinProperties();\r\n\t\t\t}\r\n\r\n\t\t\tif (result) {\r\n\t\t\t\tlet properties = result.thickness.properties;\r\n\r\n\t\t\t\tfor (var prop in properties) {\r\n\t\t\t\t\tvar el = document.getElementById(prop);\r\n\t\t\t\t\tif (el == undefined) {\r\n\t\t\t\t\t\tcontinue;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tfor (var nestedProp in properties[prop]) {\r\n\t\t\t\t\t\tel.dataset[nestedProp] = properties[prop][nestedProp];\r\n\t\t\t\t\t\tif (nestedProp == 'max') {\r\n\t\t\t\t\t\t\tthis.$set(this.maxProperties, prop, properties[prop][nestedProp]);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\t// console.log(prop + '- ' + nestedProp + ': ' + properties[prop][nestedProp]);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\treturn null;\r\n\t\t},\r\n\t\tsetMinValue: function (field) {\r\n\t\t\tconst vm = this;\r\n\t\t\treturn vm.setMaxMinProperties(field, 'min');\r\n\t\t},\r\n\t\tsetMaxValue: function (field) {\r\n\t\t\tconst vm = this;\r\n\t\t\treturn vm.setMaxMinProperties(field, 'max');\r\n\t\t},\r\n\t},\r\n\twatch: {\r\n\t\t'maxProperties.maxheight': function (value) {\r\n\t\t\tconst vm = this;\r\n\t\t\tvm.checkMinMax('height', null, 'max', value);\r\n\t\t},\r\n\t\t'maxProperties.maxwidth': function (value) {\r\n\t\t\tconst vm = this;\r\n\t\t\tvm.checkMinMax('width', null, 'max', value);\r\n\t\t},\r\n\t\t'maxProperties.maxdiameter': function (value) {\r\n\t\t\tconst vm = this;\r\n\t\t\tvm.checkMinMax('diameter', null, 'max', value);\r\n\t\t},\r\n\t\t'maxProperties.maxlength': function (value) {\r\n\t\t\tconst vm = this;\r\n\t\t\tvm.checkMinMax('length', null, 'max', value);\r\n\t\t},\r\n\t},\r\n};\r\n","var optionalExtrasMixin = {\r\n\tdata: function () {\r\n\t\treturn {\r\n\t\t\tshowOptionalExtras: false,\r\n\t\t};\r\n\t},\r\n\tmounted() {\r\n\t\tconst vm = this;\r\n\t\tvm.countOptions();\r\n\t},\r\n\tmethods: {\r\n\t\t/**\r\n\t\t * Loads a default value if specified in the backend\r\n\t\t */\r\n\t\tcountOptions: function () {\r\n\t\t\tconst options = document.querySelectorAll('.optional-extra-block .optional-single:not(.weight)');\r\n\t\t\tif (options.length > 0) {\r\n\t\t\t\tconst vm = this;\r\n\t\t\t\tvm.showOptionalExtras = true;\r\n\t\t\t}\r\n\t\t},\r\n\t\t/**\r\n\t\t * Clears the data from the optional extras and updates the price\r\n\t\t * @param {string} id - element that has been clicked\r\n\t\t */\r\n\t\tclearOptionalExtras: function (id) {\r\n\t\t\tconst vm = this;\r\n\r\n\t\t\tswitch (id) {\r\n\t\t\t\tcase 'edge-finishing':\r\n\t\t\t\t\tvm.product.edgeFinishing = 0;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase 'round-corners':\r\n\t\t\t\t\tvm.product.roundedCorners = {\r\n\t\t\t\t\t\tbottomLeftRadius: 0,\r\n\t\t\t\t\t\tbottomRightRadius: 0,\r\n\t\t\t\t\t\ttopLeftRadius: 0,\r\n\t\t\t\t\t\ttopRightRadius: 0,\r\n\t\t\t\t\t};\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase 'drilled-holes':\r\n\t\t\t\t\tvm.product.holes = vm.defaultDrilledHoles();\r\n\t\t\t\t\tvm.$refs['drilled-holes-error'].classList.add('d-none');\r\n\t\t\t\t\tvm.$refs['countersink-2-label'].click();\r\n\t\t\t\t\tvm.$refs['drill-hole-size'].required = false;\r\n\t\t\t\t\tvm.$refs['drill-hole-distance'].required = false;\r\n\r\n\t\t\t\t\tconst drillHoles = document.querySelectorAll('input[name=\"drill-hole\"]');\r\n\t\t\t\t\tdrillHoles.forEach(function (drillHole) {\r\n\t\t\t\t\t\tdrillHole.required = false;\r\n\t\t\t\t\t});\r\n\r\n\t\t\t\t\tconst checkBoxes = document.querySelectorAll('.drill-hole-wrapper input:checked');\r\n\t\t\t\t\tcheckBoxes.forEach(function (checkBox) {\r\n\t\t\t\t\t\tcheckBox.checked = false;\r\n\t\t\t\t\t});\r\n\r\n\t\t\t\t\tconst invalidFields = document.querySelectorAll('#drilled-holes .is-invalid');\r\n\t\t\t\t\tinvalidFields.forEach(function (invalidField) {\r\n\t\t\t\t\t\tinvalidField.classList.remove('is-invalid');\r\n\t\t\t\t\t\tinvalidField.parentElement.classList.remove('is-invalid');\r\n\t\t\t\t\t});\r\n\r\n\t\t\t\t\tconst errorMessages = document.querySelectorAll(\"#drilled-holes [id$='-error']\");\r\n\r\n\t\t\t\t\tvm.clearServerSideErrors(errorMessages);\r\n\r\n\t\t\t\t\tvm.updateProductPrice();\r\n\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase 'additional-instructions':\r\n\t\t\t\t\tvm.product.additionalInstructions = '';\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tdefault:\r\n\t\t\t}\r\n\r\n\t\t\tswitch (id) {\r\n\t\t\t\tcase 'edge-finishing': \r\n\t\t\t\tcase 'round-corners':\r\n\t\t\t\tcase 'drilled-holes':\r\n\t\t\t\t\tvm.updateProductPrice();\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tdefault:\r\n\t\t\t}\r\n\t\t},\r\n\t\topenOptionalExtras: function (id) {\r\n\t\t\tconst vm = this;\r\n\t\t\tswitch (id) {\r\n\t\t\t\tcase 'drilled-holes':\r\n\t\t\t\t\t//add required to all fields \r\n\t\t\t\t\tvm.$refs['drill-hole-size'].required = true;\r\n\t\t\t\t\tvm.$refs['drill-hole-distance'].required = true;\r\n\t\t\t\t\tvm.product.holes.hasDrilledHoles = true;\r\n\t\t\t\t\tconst drillHoles = document.querySelectorAll('input[name=\"drill-hole\"]');\r\n\t\t\t\t\tdrillHoles.forEach(function (drillHole) {\r\n\t\t\t\t\t\tdrillHole.required = true;\r\n\t\t\t\t\t});\r\n\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tdefault:\r\n\t\t\t}\r\n\t\t},\r\n\t\tpricePer: function (property, incVat) {\r\n\t\t\tlet thickness = vueProduct.product.dimensions.thickness;\r\n\t\t\tif (thickness > 0) {\r\n\t\t\t\tthis.from = \"\";\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\tthickness = 1\r\n\t\t\t}\r\n\r\n\t\t\tconst item = vueProduct_DATA.optionalExtrasPricePer.find(item => item.thickness === thickness);\r\n\r\n\t\t\tif (!item) return null; \r\n\r\n\t\t\treturn incVat ? item[property].formattedPriceIncVat : item[property].formattedPriceExVat;\r\n\t\t}\r\n\t},\r\n};\r\n","var productMixin = {\r\n\tdata: function () {\r\n\t\treturn {\r\n\t\t\tproduct: {\r\n\t\t\t\tid: GLOBAL.PRODUCT.ID,\r\n\t\t\t},\r\n\t\t\tcolourMessage: vueProduct_DATA.colourMessage,\r\n\t\t\tinitialPrice: vueProduct_DATA.initialPrice,\r\n\t\t\tpriceResponse: vueProduct_DATA.initialPrice,\r\n\t\t\tquantity: 1,\r\n\t\t\tisAvailable: true,\r\n\t\t\taddToCartButtonDisabled: false,\r\n\t\t\tprice: 0,\r\n\t\t\tsalePrice: 0,\r\n\t\t\tquantityPrice: 0,\r\n\t\t\tquantitySalePrice: 0,\r\n\t\t\tshowFromPrice: true,\r\n\t\t\tisUpdating: false,\r\n\t\t\tisAddingToCart: false,\r\n\t\t\tshowLimitedStock: false,\r\n\t\t\tshowNonStandard: false,\r\n\t\t\tshowProductRedirect: false,\r\n\t\t\tshowPleaseContactUs: false,\r\n\t\t\tquoteMe: false\r\n\t\t};\r\n\t},\r\n\tmixins: [minMaxMixin, disableMixin],\r\n methods: {\r\n /**\r\n * Handles the change event for the global product form. \r\n * It is triggered when a change is detected within the vueProduct element.\r\n * It updates the 'showFromPrice' property to false.\r\n */\r\n handleGlobalFromPriceChange() {\r\n this.showFromPrice = false;\r\n },\r\n /**\r\n * Checks whether the product is in stock depending on the thickness.\r\n * The data comes from the thickness object.\r\n */\r\n isLimitedOrOutOfStock: function () {\r\n const vm = this;\r\n vm.isAvailable = true;\r\n vm.inStock = true;\r\n vm.showPleaseContactUs = false;\r\n vm.showNonStandard = false;\r\n vm.showLimitedStock = false;\r\n\r\n if (vm.thicknesses.length) {\r\n let thickness = null;\r\n switch (vm.productType) {\r\n case 'Disc':\r\n case 'Sheet':\r\n case 'Lettering':\r\n thickness = vm.thicknesses.filter(\r\n (d) => d.value.toString() === vm.product.dimensions.thickness.toString()\r\n )[0];\r\n break;\r\n case 'Rod':\r\n thickness = vm.thicknesses.filter(\r\n (d) => d.value.toString() === vm.product.dimensions.diameter.toString()\r\n )[0];\r\n break;\r\n case 'Tube':\r\n thickness = vm.thicknesses.filter(\r\n (d) => d.value.toString() === vm.product.dimensions.tubeDiameter.toString()\r\n )[0];\r\n break;\r\n }\r\n\r\n if (thickness === undefined) {\r\n return;\r\n }\r\n\r\n switch (thickness.status) {\r\n case 1: //standard\r\n break;\r\n case 2: //non-standard\r\n vm.showNonStandard = true;\r\n break;\r\n case 3: //not available (should be hidden)\r\n break;\r\n case 4: //out of stock\r\n vm.showPleaseContactUs = true;\r\n vm.inStock = false;\r\n break;\r\n case 5: //limited stock\r\n vm.showLimitedStock = true;\r\n vm.inStock = false;\r\n break;\r\n case 6: //redirect\r\n vueRedirectProductModal.open(thickness.redirectMeta);\r\n vm.isAvailable = false;\r\n break;\r\n }\r\n }\r\n }\r\n },\r\n watch: {\r\n 'product.dimensions.height': function (value) {\r\n const vm = this;\r\n if (document.querySelector('.is-invalid')) {\r\n vm.requiredFieldsAreValid();\r\n }\r\n const el = document.getElementById('height');\r\n const minValue = parseInt(el.dataset.min);\r\n const maxValue = parseInt(el.dataset.max);\r\n vm.checkMinMax('height', vm.product.dimensions.height, minValue, maxValue);\r\n vm.getErrorMessages(value, 'height');\r\n vm.checkDisabled(value);\r\n },\r\n 'product.dimensions.width': function (value) {\r\n const vm = this;\r\n if (document.querySelector('.is-invalid')) {\r\n vm.requiredFieldsAreValid();\r\n }\r\n const el = document.getElementById('width');\r\n const minValue = parseInt(el.dataset.min);\r\n const maxValue = parseInt(el.dataset.max);\r\n vm.checkMinMax('width', vm.product.dimensions.width, minValue, maxValue);\r\n vm.getErrorMessages(value, 'width');\r\n vm.checkDisabled(value);\r\n },\r\n 'product.dimensions.thickness': function (value) {\r\n const vm = this;\r\n\r\n vm.getErrorMessages(value, 'select');\r\n\r\n if (document.querySelector('.is-invalid')) {\r\n vm.requiredFieldsAreValid();\r\n }\r\n\r\n vm.checkDisabled(value);\r\n\r\n vm.isLimitedOrOutOfStock();\r\n },\r\n 'product.dimensions.tubeDiameter': function (value) {\r\n const vm = this;\r\n vm.getErrorMessages(value, 'select');\r\n vm.checkDisabled(value);\r\n\r\n vm.isLimitedOrOutOfStock();\r\n },\r\n 'product.dimensions.unit': function (value) {\r\n const vm = this;\r\n const dimensions = ['width', 'diameter', 'height', 'length', 'tubeDiameter'];\r\n dimensions.forEach((dimension) => {\r\n if (document.getElementById(dimension)) {\r\n if (document.getElementById(dimension).tagName == 'SELECT') {\r\n return;\r\n }\r\n const minValue = parseInt(document.getElementById(dimension).dataset.min);\r\n const maxValue = parseInt(document.getElementById(dimension).dataset.max);\r\n vm.checkMinMax(dimension, vm.product.dimensions[dimension], minValue, maxValue);\r\n }\r\n });\r\n },\r\n 'product.dimensions.diameter': function (value) {\r\n const vm = this;\r\n const el = document.getElementById('diameter');\r\n\r\n if (el.type == 'text') {\r\n const minValue = parseInt(el.dataset.min);\r\n const maxValue = parseInt(el.dataset.max);\r\n vm.checkMinMax('diameter', vm.product.dimensions.diameter, minValue, maxValue);\r\n } else {\r\n vm.getErrorMessages(value, 'select');\r\n }\r\n\r\n vm.checkDisabled(value);\r\n\r\n vm.isLimitedOrOutOfStock();\r\n },\r\n 'product.dimensions.length': function (value) {\r\n const vm = this;\r\n if (document.querySelector('.is-invalid')) {\r\n vm.requiredFieldsAreValid();\r\n }\r\n const el = document.getElementById('length');\r\n const minValue = parseInt(el.dataset.min);\r\n const maxValue = parseInt(el.dataset.max);\r\n vm.getErrorMessages(value, 'length');\r\n vm.checkDisabled(value);\r\n vm.checkMinMax('length', vm.product.dimensions.length, minValue, maxValue);\r\n },\r\n\r\n 'product.text': function (value) {\r\n const vm = this;\r\n vm.checkCharacters(value);\r\n },\r\n 'product.holes.holeSize': function (value) {\r\n //if (value > 0) {\r\n //\tdocument.querySelector('#drill-hole-size').classList.remove('is-invalid');\r\n //\tdocument.querySelector('#drill-hole-size').parentElement.classList.remove('is-invalid');\r\n //} \r\n },\r\n 'product.holes.placement': function (value) {\r\n //if (value.length > 0) {\r\n //\tdocument.querySelector('.drill-box').classList.remove('is-invalid');\r\n //\tdocument.querySelector('.drill-box').parentElement.classList.remove('is-invalid');\r\n //}\r\n },\r\n 'product.holes.distanceFromEdge': function (value) {\r\n //if (value > 0) {\r\n //\tdocument.querySelector('#drill-hole-distance').classList.remove('is-invalid');\r\n //\tdocument.querySelector('#drill-hole-distance').parentElement.classList.remove('is-invalid');\r\n //}\r\n }\r\n },\r\n};\r\n","var quantityMixin = {\r\n data: function () {\r\n return {\r\n inStock: true,\r\n product: {\r\n quantity: 1\r\n },\r\n debouncedUpdateTextQuantityPrice: null\r\n }\r\n },\r\n created() {\r\n this.debouncedUpdateTextQuantityPrice = _.debounce(this.getProductPrice, 1000);\r\n },\r\n methods: {\r\n addQuantity: function () {\r\n const vm = this;\r\n\r\n vueProduct.product.quantity++;\r\n\r\n this.debouncedUpdateTextQuantityPrice();\r\n },\r\n subtractQuantity: function () {\r\n const vm = this;\r\n\r\n if (vueProduct.product.quantity > 1)\r\n vueProduct.product.quantity--;\r\n\r\n this.debouncedUpdateTextQuantityPrice();\r\n }\r\n },\r\n watch: {\r\n \"product.quantity\": function (newQuantity) {\r\n const vm = this;\r\n vm.showFromPrice = false;\r\n this.debouncedUpdateTextQuantityPrice();\r\n }\r\n }\r\n}","var ratingsMixin = {\r\n\tmethods: {\r\n\t\tgetStars: function (rating) {\r\n\t\t\tlet ratings = [];\r\n\r\n\t\t\t// if there is a decimal\r\n\t\t\tif (rating % 1 != 0) {\r\n\t\t\t\tconst wholeNumbers = Math.floor(rating);\r\n\t\t\t\tfor (let i = 0; i < wholeNumbers; i++) {\r\n\t\t\t\t\tratings.push('');\r\n\t\t\t\t}\r\n\r\n\t\t\t\tratings.push('half-star');\r\n\r\n\t\t\t\tconst remainder = 5 - (rating + 0.5);\r\n\t\t\t\tfor (let j = 0; j < remainder; j++) {\r\n\t\t\t\t\tratings.push('text-gray-200');\r\n\t\t\t\t}\r\n\t\t\t} else {\r\n\t\t\t\tconst remainder = 5 - rating;\r\n\r\n\t\t\t\tfor (let step = 0; step < rating; step++) {\r\n\t\t\t\t\tratings.push('');\r\n\t\t\t\t}\r\n\r\n\t\t\t\tfor (let step = 0; step < remainder; step++) {\r\n\t\t\t\t\tratings.push('text-gray-200');\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\treturn ratings;\r\n\t\t},\r\n\t},\r\n};\r\n","var roundedCornersMixin = {\r\n data: function () {\r\n return {\r\n product: {\r\n roundedCorners: {\r\n bottomLeftRadius: 0,\r\n bottomRightRadius: 0,\r\n topLeftRadius: 0,\r\n topRightRadius: 0\r\n }\r\n }\r\n }\r\n }\r\n}","var socketCutOutsMixin = {\r\n data: function () {\r\n return {\r\n product: {\r\n socketCutOuts: {\r\n noOfCutOuts: 0,\r\n additionalInfo: ''\r\n },\r\n socketCutOutUploads: ''\r\n }\r\n }\r\n },\r\n methods: {\r\n /**\r\n * Determines whether the dropzone exists and if there are any images there to upload\r\n */\r\n hasSocketCutOutsToUpload: function () {\r\n if (document.querySelector(\"#vueProduct #file-uploads\")) {\r\n const vm = this;\r\n\r\n const socketUploads = Dropzone.forElement('#' + vm.$el.id + \" #file-uploads\");\r\n\r\n if (socketUploads.files.length === 0)\r\n return false;\r\n\r\n return true;\r\n };\r\n },\r\n /**\r\n * Uploads socket cut out files\r\n */\r\n uploadSocketCutOuts: function () {\r\n const vm = this;\r\n const socketUploads = Dropzone.forElement('#' + vm.$el.id + \" #file-uploads\");\r\n\r\n socketUploads.processQueue();\r\n\r\n socketUploads.on(\"successmultiple\", function (file, response) {\r\n vm.product.socketCutOutUploads = response;\r\n console.log('uploaded')\r\n vm.addConfiguredProduct();\r\n });\r\n socketUploads.on(\"error\", function (file, response) {\r\n return false;\r\n });\r\n\r\n return true;\r\n }\r\n },\r\n}","var standardSizesMixin = {\r\n\tmethods: {\r\n\t\tsetSheetStandardSize: function (event) {\r\n\t\t\tconst value = event.target.value;\r\n\t\t\tconst dimensions = value.split('x');\r\n\t\t\tconst vm = this;\r\n\r\n\t\t\tconst height = dimensions[0];\r\n\t\t\tconst width = dimensions[1];\r\n\r\n\t\t\tif (value != 0) {\r\n\t\t\t\t// standard sizes always mm\r\n\t\t\t\tvm.product.dimensions.unit = 'mm';\r\n\r\n\t\t\t\tvm.product.dimensions.height = height;\r\n\t\t\t\tvm.product.dimensions.width = width;\r\n\t\t\t\tvm.displayDimensions.width = width;\r\n\t\t\t\tvm.displayDimensions.height = height;\r\n\t\t\t}\r\n\r\n\t\t\tvm.$refs['height'].classList.remove('is-invalid');\r\n\t\t\tvm.$refs['width'].classList.remove('is-invalid');\r\n\r\n\t\t\tvm.$refs['height'].parentElement.classList.remove('is-invalid');\r\n\t\t\tvm.$refs['width'].parentElement.classList.remove('is-invalid');\r\n\r\n\t\t\tvm.updateProductPrice();\r\n\t\t},\r\n\t\tsetRodDiscStandardSize: function (event) {\r\n\t\t\tconst value = event.target.value;\r\n\t\t\tconst vm = this;\r\n\r\n\t\t\tif (value != 0) {\r\n\t\t\t\t// standard sizes always mm\r\n\t\t\t\tvm.product.dimensions.unit = 'mm';\r\n\r\n\t\t\t\tif (document.querySelector('input#diameter')) {\r\n\t\t\t\t\tvm.product.dimensions.diameter = value;\r\n\t\t\t\t\tvm.displayDimensions.diameter = value;\r\n\r\n\t\t\t\t\tdocument.querySelector('input#diameter').classList.remove('is-invalid');\r\n\t\t\t\t\tdocument.querySelector('input#diameter').parentElement.classList.remove('is-invalid');\r\n\t\t\t\t} else {\r\n\t\t\t\t\tvm.product.dimensions.length = value;\r\n\t\t\t\t\tvm.displayDimensions.length = value;\r\n\r\n\t\t\t\t\tdocument.querySelector('input#length').classList.remove('is-invalid');\r\n\t\t\t\t\tdocument.querySelector('input#length').parentElement.classList.remove('is-invalid');\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tvm.updateProductPrice();\r\n\t\t},\r\n\t},\r\n};\r\n","var toggleMixin = {\r\n\tmethods: {\r\n\t\tslideUp: function (target, duration = 500) {\r\n\t\t\ttarget.style.transitionProperty = 'height, margin, padding';\r\n\t\t\ttarget.style.transitionDuration = duration + 'ms';\r\n\t\t\ttarget.style.boxSizing = 'border-box';\r\n\t\t\ttarget.style.height = target.offsetHeight + 'px';\r\n\t\t\ttarget.offsetHeight;\r\n\t\t\ttarget.style.overflow = 'hidden';\r\n\t\t\ttarget.style.height = 0;\r\n\t\t\ttarget.style.paddingTop = 0;\r\n\t\t\ttarget.style.paddingBottom = 0;\r\n\t\t\ttarget.style.marginTop = 0;\r\n\t\t\ttarget.style.marginBottom = 0;\r\n\t\t\twindow.setTimeout(() => {\r\n\t\t\t\ttarget.style.display = 'none';\r\n\t\t\t\ttarget.style.removeProperty('height');\r\n\t\t\t\ttarget.style.removeProperty('padding-top');\r\n\t\t\t\ttarget.style.removeProperty('padding-bottom');\r\n\t\t\t\ttarget.style.removeProperty('margin-top');\r\n\t\t\t\ttarget.style.removeProperty('margin-bottom');\r\n\t\t\t\ttarget.style.removeProperty('overflow');\r\n\t\t\t\ttarget.style.removeProperty('transition-duration');\r\n\t\t\t\ttarget.style.removeProperty('transition-property');\r\n\t\t\t\t//alert(\"!\");\r\n\t\t\t}, duration);\r\n\t\t},\r\n\t\tslideDown: function (target, duration = 500) {\r\n\t\t\ttarget.style.removeProperty('display');\r\n\t\t\tlet display = window.getComputedStyle(target).display;\r\n\t\t\tif (display === 'none') display = 'block';\r\n\t\t\ttarget.style.display = display;\r\n\t\t\tlet height = target.offsetHeight;\r\n\t\t\ttarget.style.overflow = 'hidden';\r\n\t\t\ttarget.style.height = 0;\r\n\t\t\ttarget.style.paddingTop = 0;\r\n\t\t\ttarget.style.paddingBottom = 0;\r\n\t\t\ttarget.style.marginTop = 0;\r\n\t\t\ttarget.style.marginBottom = 0;\r\n\t\t\ttarget.offsetHeight;\r\n\t\t\ttarget.style.boxSizing = 'border-box';\r\n\t\t\ttarget.style.transitionProperty = 'height, margin, padding';\r\n\t\t\ttarget.style.transitionDuration = duration + 'ms';\r\n\t\t\ttarget.style.height = height + 'px';\r\n\t\t\ttarget.style.removeProperty('padding-top');\r\n\t\t\ttarget.style.removeProperty('padding-bottom');\r\n\t\t\ttarget.style.removeProperty('margin-top');\r\n\t\t\ttarget.style.removeProperty('margin-bottom');\r\n\t\t\twindow.setTimeout(() => {\r\n\t\t\t\ttarget.style.removeProperty('height');\r\n\t\t\t\ttarget.style.removeProperty('overflow');\r\n\t\t\t\ttarget.style.removeProperty('transition-duration');\r\n\t\t\t\ttarget.style.removeProperty('transition-property');\r\n\t\t\t}, duration);\r\n\t\t},\r\n\t\t/**\r\n\t\t * Toggles a div. Event passed in and target retrieved from data attribute called toggle\r\n\t\t * @param {any} event\r\n\t\t * @param {any} duration\r\n\t\t */\r\n\t\tslideToggle: function (event, duration = 500) {\r\n\t\t\tconst vm = this;\r\n\t\t\tconst id = event.target.dataset.toggle;\r\n\t\t\tconst target = document.getElementById(id);\r\n\r\n\t\t\tif (window.getComputedStyle(target).display === 'none') {\r\n\t\t\t\treturn vm.slideDown(target, duration);\r\n\t\t\t} else {\r\n\t\t\t\treturn vm.slideUp(target, duration);\r\n\t\t\t}\r\n\t\t},\r\n\t\tslideToggleByElement: function (element, duration = 500) {\r\n\t\t\tconst vm = this;\r\n\t\t\tconst target = document.querySelector(element);\r\n\r\n\t\t\tif (window.getComputedStyle(target).display === 'none') {\r\n\t\t\t\treturn vm.slideDown(target, duration);\r\n\t\t\t} else {\r\n\t\t\t\treturn vm.slideUp(target, duration);\r\n\t\t\t}\r\n\t\t},\r\n\t\ttoggleToolTip: function (target, duration = 500) {\r\n\t\t\tconst vm = this;\r\n\t\t\tif (window.getComputedStyle(target).display === 'none') {\r\n\t\t\t\treturn vm.slideDown(target, duration);\r\n\t\t\t} else {\r\n\t\t\t\treturn vm.slideUp(target, duration);\r\n\t\t\t}\r\n\t\t},\r\n\t\ttriggerToggle: function (event) {\r\n\t\t\tconst vm = this;\r\n\t\t\tlet id;\r\n\t\t\tid = event.target.dataset.toggle;\r\n\t\t\tconst target = document.getElementById(id);\r\n\r\n\t\t\tvm.toggleToolTipIcon(id);\r\n\t\t\tvm.toggleToolTip(target);\r\n\t\t},\r\n\t\t/**\r\n\t\t * Toggles the optional extras on a product\r\n\t\t * @param {any} event\r\n\t\t */\r\n\t\tslideOptionalExtraPanel: function (event) {\r\n\t\t\tconst vm = this;\r\n\r\n\t\t\tconst el = event.target.closest('div');\r\n\t\t\tconst yesButton = el.querySelector('.trigger-show').classList;\r\n\t\t\tconst noButton = el.querySelector('.trigger-hide').classList;\r\n\t\t\tconst id = event.target.dataset.toggle;\r\n\t\t\tconst target = document.getElementById(id);\r\n\t\t\tconst thisButton = event.target.classList;\r\n\r\n\t\t\tif (thisButton.contains('trigger-hide')) {\r\n\t\t\t\t// console.log('no button clicked')\r\n\t\t\t\tyesButton.remove('btn-green');\r\n\t\t\t\tyesButton.add('btn-secondary');\r\n\t\t\t\tnoButton.remove('btn-secondary');\r\n\t\t\t\tnoButton.add('btn-green');\r\n\t\t\t\tvm.slideUp(target, 200);\r\n\t\t\t\tvm.clearOptionalExtras(id);\r\n\t\t\t} else {\r\n\t\t\t\t// console.log('yes button clicked');\r\n\t\t\t\tyesButton.remove('btn-secondary');\r\n\t\t\t\tyesButton.add('btn-green');\r\n\t\t\t\tnoButton.add('btn-secondary');\r\n\t\t\t\tnoButton.remove('btn-green');\r\n\t\t\t\tvm.slideDown(target, 200);\r\n\t\t\t\tvm.openOptionalExtras(id);\r\n\t\t\t}\r\n\t\t},\r\n\t\t/**\r\n\t\t * Close the tooltip and toggles the icon. Called from the 'x'.\r\n\t\t * @param {any} event\r\n\t\t * @param {any} attr\r\n\t\t */\r\n\t\tcloseToolTip: function (event, attr = 'toggle') {\r\n\t\t\tconst id = event.target.closest('div.' + attr).id;\r\n\t\t\tconst toolTipToToggle = document.getElementById(id);\r\n\t\t\tthis.toggleToolTipIcon(id);\r\n\t\t\tthis.toggleToolTip(toolTipToToggle);\r\n\t\t},\r\n\t\t/**\r\n\t\t * Toggles the tooltip icon between green and filled and not filled.\r\n\t\t * @param {any} id\r\n\t\t */\r\n\t\ttoggleToolTipIcon: function (id) {\r\n\t\t\tconst vm = this;\r\n\t\t\tconst toolTipToToggle = document.getElementById(id);\r\n\t\t\tvar icons = document.querySelector(\"[data-toggle='\" + id + \"']\");\r\n\r\n\t\t\ticons.classList.toggle('fc-green');\r\n\t\t\ticons.classList.toggle('tooltip-active');\r\n\t\t\tif (icons.querySelector('svg').length < 1) {\r\n\t\t\t\ticons.innerText = icons.classList.contains('fc-green') ? 'info' : 'info_outline';\r\n\t\t\t}\r\n\t\t},\r\n\t},\r\n};\r\n","var unitsMixin = {\r\n\tdata: function () {\r\n\t\treturn {\r\n\t\t\tproduct: {\r\n\t\t\t\tdimensions: {\r\n\t\t\t\t\tunit: 'mm',\r\n\t\t\t\t},\r\n\t\t\t},\r\n\t\t};\r\n\t},\r\n\tmethods: {\r\n\t\t/**\r\n\t\t * Converts units\r\n\t\t * @param {string} oldUnit The unit to convert from\r\n\t\t * @param {string} event The form field and all its properties\r\n\t\t */\r\n\t\tchangeUnit: function (oldUnit, event) {\r\n\t\t\tconst vm = this;\r\n\r\n\t\t\tconst newUnit = event.target.value;\r\n\r\n\t\t\tvm.product.dimensions.unit = newUnit;\r\n\r\n\t\t\tconst height = vm.$refs.height;\r\n\t\t\tconst width = vm.$refs.width;\r\n\t\t\tconst length = vm.$refs.length;\r\n\t\t\tconst diameter = vm.$refs.diameter;\r\n\r\n\t\t\tvar el = null;\r\n\t\t\tif (vm.elementExists(height)) {\r\n\t\t\t\tel = height;\r\n\t\t\t\tvm.displayDimensions.height = this.convert(Number(vm.displayDimensions.height), oldUnit, newUnit);\r\n\t\t\t}\r\n\r\n\t\t\tif (vm.elementExists(width)) {\r\n\t\t\t\tel = width;\r\n\t\t\t\tvm.displayDimensions.width = this.convert(Number(vm.displayDimensions.width), oldUnit, newUnit);\r\n\t\t\t}\r\n\r\n\t\t\tif (vm.elementExists(length)) {\r\n\t\t\t\tel = length;\r\n\t\t\t\tvm.displayDimensions.length = this.convert(Number(vm.displayDimensions.length), oldUnit, newUnit);\r\n\t\t\t}\r\n\r\n\t\t\tif (vm.elementExists(diameter)) {\r\n\t\t\t\tel = diameter;\r\n\t\t\t\tvm.displayDimensions.diameter = this.convert(Number(vm.displayDimensions.diameter), oldUnit, newUnit);\r\n\t\t\t}\r\n\r\n\t\t\tel.min = this.convert(Number(el.min), oldUnit, newUnit);\r\n\t\t\tel.max = this.convert(Number(el.max), oldUnit, newUnit);\r\n\t\t},\r\n\t\tconvert: function (value, oldUnit, newUnit) {\r\n\t\t\tconst vm = this;\r\n\r\n\t\t\t// Define conversion factors\r\n\t\t\tconst conversionFactors = {\r\n\t\t\t\tmm: { cm: 0.1, meters: 0.001 },\r\n\t\t\t\tcm: { mm: 10, meters: 0.01 },\r\n\t\t\t\tmeters: { mm: 1000, cm: 100 },\r\n\t\t\t};\r\n\r\n\t\t\tif (!conversionFactors[oldUnit] || !conversionFactors[oldUnit][newUnit]) {\r\n\t\t\t\tthrow new Error('Invalid units provided');\r\n\t\t\t}\r\n\r\n\t\t\tconst conversionFactor = conversionFactors[oldUnit][newUnit];\r\n\t\t\tconst newValue = value * conversionFactor;\r\n\r\n\t\t\treturn newValue;\r\n\t\t},\r\n\t\tdecimalRounding: function (vm, el, value, shapeProperty) {\r\n\t\t\tif (vm.product.dimensions.unit == 'mm') {\r\n\t\t\t\t// remove any decimal if mm\r\n\t\t\t\tvalue = Math.round(value);\r\n\r\n\t\t\t\tel.value = value;\r\n\t\t\t\tel.dispatchEvent(new Event('input'));\r\n\t\t\t\t// save it to the product props\r\n\t\t\t\tvm.product.dimensions[shapeProperty] = value;\r\n\t\t\t} else {\r\n\t\t\t\tlet zeros;\r\n\t\t\t\t// zeros: 10 = 1 decimal place, 100 = 2 etc\r\n\t\t\t\tif (vm.product.dimensions.unit == 'cm') {\r\n\t\t\t\t\tzeros = 10;\r\n\r\n\t\t\t\t\t// save it to the product props\r\n\t\t\t\t\tvm.product.dimensions[shapeProperty] = value * 10;\r\n\t\t\t\t} else {\r\n\t\t\t\t\tzeros = 1000;\r\n\r\n\t\t\t\t\t// save it to the product props\r\n\t\t\t\t\tvm.product.dimensions[shapeProperty] = value * 1000;\r\n\t\t\t\t}\r\n\t\t\t\t//check if decimal and if so round to X decimal place(s)\r\n\t\t\t\tif (!Number.isInteger(value)) {\r\n\t\t\t\t\tvalue = Math.round(value * zeros) / zeros;\r\n\t\t\t\t\tel.value = value;\r\n\t\t\t\t\tel.dispatchEvent(new Event('input'));\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\t// save it to the product props\r\n\t\t\tvm.displayDimensions[shapeProperty] = value;\r\n\t\t},\r\n\t},\r\n\twatch: {\r\n\t\t'displayDimensions.length': function (value) {\r\n\t\t\tconst vm = this;\r\n\t\t\tlet el = document.getElementById('length');\r\n\t\t\tif (value) {\r\n\t\t\t\tthis.decimalRounding(vm, el, value, 'length');\r\n\t\t\t}\r\n\t\t},\r\n\t\t'displayDimensions.height': function (value) {\r\n\t\t\tconst vm = this;\r\n\t\t\tlet el = document.getElementById('height');\r\n\t\t\tif (value) {\r\n\t\t\t\tthis.decimalRounding(vm, el, value, 'height');\r\n\t\t\t}\r\n\t\t},\r\n\t\t'displayDimensions.width': function (value) {\r\n\t\t\tconst vm = this;\r\n\t\t\tlet el = document.getElementById('width');\r\n\t\t\tif (value) {\r\n\t\t\t\tthis.decimalRounding(vm, el, value, 'width');\r\n\t\t\t}\r\n\t\t},\r\n\t\t'displayDimensions.diameter': function (value) {\r\n\t\t\tconst vm = this;\r\n\t\t\tlet el = document.getElementById('diameter');\r\n\t\t\tif (value) {\r\n\t\t\t\tthis.decimalRounding(vm, el, value, 'diameter');\r\n\t\t\t}\r\n\t\t},\r\n\t\t'product.dimensions.thickness': function (value) {\r\n\t\t\tconst vm = this;\r\n\t\t\tvm.setMaxMinProperties(value.toString());\r\n\t\t},\r\n\t\t'product.dimensions.diameter': function (value) {\r\n\t\t\tconst vm = this;\r\n\t\t\tconst diameterElement = document.getElementById('diameter');\r\n\t\t\tif (diameterElement.tagName == 'SELECT') {\r\n\t\t\t\tvm.setMaxMinProperties(value.toString());\r\n\t\t\t}\r\n\t\t},\r\n\t\t'product.dimensions.tubeDiameter': function (value) {\r\n\t\t\tconst vm = this;\r\n\t\t\tvm.setMaxMinProperties(value.toString());\r\n\t\t},\r\n\t},\r\n};\r\n","/**\r\n * Validation for configured product\r\n */\r\nvar validationMixin = {\r\n\tdata: {\r\n\t\tinvalidFields: [],\r\n\t\tshowStandardSizesOnly: false,\r\n\t\tshowSocketCutouts: true,\r\n\t\tserverSideValidationPassed: false,\r\n\t},\r\n\tmounted() {\r\n\t\tconst vm = this;\r\n\t},\r\n\tmethods: {\r\n\t\thandleClearError: function (e) {\r\n\t\t\tconst vm = this;\r\n\r\n\t\t\tif (e.srcElement.classList.contains('is-invalid')) {\r\n\t\t\t\te.srcElement.classList.remove('is-invalid');\r\n\t\t\t\te.srcElement.parentElement.classList.remove('is-invalid');\r\n\t\t\t}\r\n\t\t\tif (e.srcElement.classList.contains('is-invalid-property')) {\r\n\t\t\t\te.srcElement.classList.remove('is-invalid-property');\r\n\t\t\t\te.srcElement.parentElement.classList.remove('is-invalid-property');\r\n\t\t\t}\r\n\t\t},\r\n\t\t/**\r\n\t\t * Clears error message fields\r\n\t\t */\r\n\t\tclearErrors: function () {\r\n\t\t\tconst vm = this;\r\n\r\n\t\t\tvm.inStock = true;\r\n\r\n\t\t\tconst errorMessages = document.querySelectorAll(\"[id$='-error']\");\r\n\r\n\t\t\tvm.clearServerSideErrors(errorMessages);\r\n\r\n\t\t\tconst invalidFields = document.querySelectorAll('.is-invalid');\r\n\r\n\t\t\tif (invalidFields.length > 0) {\r\n\t\t\t\tinvalidFields.forEach((invalidField) => {\r\n\t\t\t\t\tinvalidField.classList.remove('is-invalid');\r\n\t\t\t\t\tinvalidField.parentElement.classList.remove('is-invalid');\r\n\t\t\t\t\tinvalidField.classList.remove('is-invalid-property');\r\n\t\t\t\t\tinvalidField.parentElement.classList.remove('is-invalid-property');\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t},\r\n\t\t/**\r\n\t\t * Clear server side error messages\r\n\t\t */\r\n\t\tclearServerSideErrors: function (errorMessages) {\r\n\t\t\tconst vm = this;\r\n\r\n\t\t\tif (errorMessages.length > 0) {\r\n\t\t\t\terrorMessages.forEach((el) => {\r\n\t\t\t\t\tel.classList.add('d-none');\r\n\t\t\t\t\tel.classList.forEach((className) => {\r\n\t\t\t\t\t\tif (className.startsWith('error-')) {\r\n\t\t\t\t\t\t\tel.classList.remove(className);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t});\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t},\r\n\t\t/**\r\n\t\t * Clear server side error messages\r\n\t\t */\r\n\t\tclearAllServerSideErrors: function (errorMessages) {\r\n\t\t\tconst vm = this;\r\n\r\n\t\t\tif (errorMessages.length > 0) {\r\n\t\t\t\terrorMessages.forEach((el) => {\r\n\t\t\t\t\tel.classList.add('d-none');\r\n\t\t\t\t\tel.classList.forEach((className) => {\r\n\t\t\t\t\t\tif (className.startsWith('error-')) {\r\n\t\t\t\t\t\t\tel.classList.remove(className);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t});\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t},\r\n\r\n\t\t/**\r\n\t\t * Loops through all fields with a ref attribute (used by vue). Checks to see if it has a data-required attribute. Adds it if it has.\r\n\t\t */\r\n\t\taddRequiredAttributes: function () {\r\n\t\t\tObject.keys(this.$refs).forEach((ref) => {\r\n\t\t\t\tconst element = this.$refs[ref];\r\n\t\t\t\tif (element.dataset.required === 'True') {\r\n\t\t\t\t\telement.required = true;\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t},\r\n\t\t/**\r\n\t\t * Performs a basic check on required field attributes.\r\n\t\t * @returns {boolean} True if everything is okay.\r\n\t\t */\r\n\t\tvalidateThisField: function () {},\r\n\r\n\t\t/**\r\n\t\t * Performs a basic check on required field attributes.\r\n\t\t * @returns {boolean} True if everything is okay.\r\n\t\t */\r\n\t\trequiredFieldsAreValid: function () {\r\n\t\t\tconst vm = this;\r\n\t\t\tconst requiredAttributes = document.querySelectorAll(\r\n\t\t\t\t'#vueProduct select[required], #vueProduct input[required]'\r\n\t\t\t);\r\n\r\n\t\t\tvm.invalidFields = [];\r\n\t\t\tlet letterRadios = false;\r\n\r\n\t\t\tlet drilledHoles = false;\r\n\t\t\tlet typefaceName = '';\r\n\t\t\tlet drilledHoleName = '';\r\n\t\t\tlet radiosSelected = false;\r\n\t\t\tlet drilledSelected = false;\r\n\t\t\trequiredAttributes.forEach(function (el) {\r\n\t\t\t\tel.classList.remove('is-invalid');\r\n\t\t\t\tel.parentElement.classList.remove('is-invalid');\r\n\r\n\t\t\t\tif (el.type === 'number' && !Number(el.value)) {\r\n\t\t\t\t\tvm.invalidFields.push(el.id);\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (el.type === 'checkbox') {\r\n\t\t\t\t\tif (el.parentElement.parentElement.classList.contains('drill-hole-group')) {\r\n\t\t\t\t\t\tdrilledHoles = true;\r\n\t\t\t\t\t\tdrilledHoleName = el.name;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (el.type === 'radio') {\r\n\t\t\t\t\tif (el.parentElement.parentElement.classList.contains('typeface')) {\r\n\t\t\t\t\t\tletterRadios = true;\r\n\t\t\t\t\t\ttypefaceName = el.name;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (el.type === 'select-one' && el.value === '0') {\r\n\t\t\t\t\tvm.invalidFields.push(el.id);\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (el.type === 'select-one' && el.id === 'type-of-plastic' && vm.product.materialId === 0) {\r\n\t\t\t\t\tvm.invalidFields.push(el.id);\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (el.id === 'standardSizes' && el.value === '0') {\r\n\t\t\t\t\tvm.invalidFields.push(el.id);\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (el.type === 'text' && el.id === 'select-color') {\r\n\t\t\t\t\tif (vm.isEmpty(vm.product.colour)) {\r\n\t\t\t\t\t\tvm.invalidFields.push(el.id);\r\n\t\t\t\t\t}\r\n\t\t\t\t} else if (el.type === 'text' && el.value.length === 0) {\r\n\t\t\t\t\tvm.invalidFields.push(el.id);\r\n\t\t\t\t}\r\n\t\t\t});\r\n\r\n\t\t\tif (letterRadios) {\r\n\t\t\t\tif (document.querySelector('input[name=\"' + typefaceName + '\"]:checked')) {\r\n\t\t\t\t\tradiosSelected = true;\r\n\t\t\t\t\tdocument.querySelector('.selector-slider.typeface').classList.remove('is-invalid');\r\n\t\t\t\t} else {\r\n\t\t\t\t\tconst letterRadioInputs = document.querySelectorAll('input[name=\"' + typefaceName + '\"]');\r\n\t\t\t\t\tletterRadioInputs.forEach(function (radioInput) {\r\n\t\t\t\t\t\tvm.invalidFields.push(radioInput.id);\r\n\t\t\t\t\t});\r\n\t\t\t\t\tdocument.querySelector('.selector-slider.typeface').classList.add('is-invalid');\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tif (drilledHoles) {\r\n\t\t\t\tif (document.querySelector('input[name=\"' + drilledHoleName + '\"]:checked')) {\r\n\t\t\t\t\tdrilledSelected = true;\r\n\t\t\t\t\tdocument.querySelector('.drill-box').classList.remove('is-invalid');\r\n\t\t\t\t} else {\r\n\t\t\t\t\tconst drilledHoleInputs = document.querySelectorAll('input[name=\"' + drilledHoleName + '\"]');\r\n\t\t\t\t\tdrilledHoleInputs.forEach(function (holeInput) {\r\n\t\t\t\t\t\tvm.invalidFields.push(holeInput.id);\r\n\t\t\t\t\t});\r\n\t\t\t\t\tdocument.querySelector('.drill-box').classList.add('is-invalid');\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tif (vm.invalidFields.length === 0) {\r\n\t\t\t\treturn true;\r\n\t\t\t}\r\n\r\n\t\t\tvm.invalidFields.forEach(function (id, index) {\r\n\t\t\t\tlet el = vm.getById(id);\r\n\t\t\t\tel.classList.add('is-invalid');\r\n\r\n\t\t\t\tif (el.parentElement.classList.contains('select-color')) {\r\n\t\t\t\t\tel.parentElement.parentElement.classList.add('is-invalid');\r\n\t\t\t\t} else {\r\n\t\t\t\t\tel.parentElement.classList.add('is-invalid');\r\n\t\t\t\t}\r\n\r\n\t\t\t\t//focus on first unless already focused in an input\r\n\t\t\t\tif (index === 0 && document.activeElement.nodeName != 'INPUT') {\r\n\t\t\t\t\tel.focus();\r\n\t\t\t\t}\r\n\t\t\t});\r\n\r\n\t\t\treturn false;\r\n\t\t},\r\n\t},\r\n};\r\n","var vatMixin = {\r\n data: function () {\r\n return {\r\n\t\t\tincVATTranslation: GLOBAL.TRANSLATIONS.INCVAT,\r\n\t\t\texVATTranslation: GLOBAL.TRANSLATIONS.EXVAT,\r\n }\r\n },\r\n\tmethods: { \r\n\t\tincVAT: function () {\r\n\t\t\treturn vueCurrency.incVAT == 1;\r\n\t\t}\r\n\t},\r\n};\r\n"]}