{"version":3,"sources":["add-to-cart.js"],"names":["mounted","onLoad","document","addEventListener","e","target","context","arguments","length","undefined","querySelectorAll","forEach","element","_element$querySelecto","fields","field","index","products","$data","filter","p","Array","from","f","i","every","fieldValues","some","fv","id","dataset","fieldId","value","product","nextField","appendOptions","disabled","dispatchEvent","CustomEvent","bubbles","detail","data","find","Event","querySelector","items","name","categoryName","productListing","brandName","taxRate","price","quantity","values","JSON","parse","v","options","remove","_loop","_i","option","createElement","textContent","image","cannotOrderCssClass","canOrder","classList","add","appendChild"],"mappings":"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","file":"add-to-cart.js","sourcesContent":["import { mounted } from 'component-utils';\r\n\r\nonLoad();\r\n\r\ndocument.addEventListener('DOMContentUpdated', e => onLoad(e.target));\r\n\r\nexport function onLoad(context = document) {\r\n context.querySelectorAll('.add-to-cart').forEach(element => {\r\n const fields = element.querySelectorAll('.field');\r\n\r\n fields.forEach((field, index) => {\r\n field.addEventListener('change', () => {\r\n // Get the matching products for the current fields.\r\n const products = element.$data.products.filter(p => Array.from(fields).filter((f, i) => i <= index).every(f => p.fieldValues.some(fv => fv.field.id == f.dataset.fieldId && fv.value == f.value)));\r\n\r\n // Get the first product (if there are any).\r\n let product = products.length > 0 ? products[0] : null;\r\n\r\n // If there is a next field.\r\n if (fields.length > index + 1) {\r\n // Get the next field.\r\n const nextField = fields[index + 1];\r\n\r\n // Append the options.\r\n appendOptions(nextField, products);\r\n\r\n // Enable the field.\r\n nextField.disabled = false;\r\n\r\n // Reset any unreachable fields.\r\n Array.from(fields).filter((f, i) => i > index + 1).forEach(f => {\r\n f.value = '';\r\n f.disabled = true;\r\n });\r\n\r\n // Reset the product.\r\n product = null;\r\n }\r\n\r\n // Set the product.\r\n element.$data.product = product;\r\n\r\n // Trigger the \"product:update\" event.\r\n element.dispatchEvent(new CustomEvent('product:update', { bubbles: true, detail: product }));\r\n });\r\n });\r\n\r\n if (fields.length > 0) {\r\n mounted(element, data => {\r\n // Append the options to the first field.\r\n appendOptions(fields[0], data.products);\r\n\r\n // If a product has been set then set the field values.\r\n if (data.product != null) {\r\n const product = data.product;\r\n\r\n fields.forEach(field => {\r\n field.value = product.fieldValues.find(fv => fv.field.id == field.dataset.fieldId).value;\r\n field.dispatchEvent(new Event('change'));\r\n });\r\n }\r\n });\r\n }\r\n\r\n // Make sure a form exists within the element. This might not be the case, e.g. for a product stock notification.\r\n element.querySelector('form')?.addEventListener('success', () => {\r\n // Trigger the \"cart:added\" event.\r\n element.dispatchEvent(new CustomEvent('cart:added', { bubbles: true, detail: { items: [{ id: element.$data.product.id, name: element.$data.product.name, categoryName: element.$data.productListing.categoryName, brandName: element.$data.product.brandName, taxRate: element.$data.product.taxRate, price: element.$data.product.price, quantity: element.$data.quantity }] } }));\r\n });\r\n });\r\n}\r\n\r\nfunction appendOptions(field, products) {\r\n // Get the matching values for the field.\r\n const values = JSON.parse(field.dataset.fieldValues).filter(v => products.some(p => p.fieldValues.some(fv => fv.field.id == field.dataset.fieldId && fv.value == v.value)));\r\n\r\n // Remove the existing options.\r\n for (let i = field.options.length - 1; i >= 1; i--) {\r\n field.remove(i);\r\n }\r\n\r\n // Add the options.\r\n for (let i = 0; i < values.length; i++) {\r\n const option = document.createElement('option');\r\n\r\n option.textContent = option.value = values[i].value;\r\n option.dataset.image = values[i].image;\r\n\r\n // If there are no products available to order for this option then add the specified class (if applicable).\r\n if (field.dataset.cannotOrderCssClass && !products.some(p => p.canOrder && p.fieldValues.some(fv => fv.field.id == field.dataset.fieldId && fv.value == values[i].value)))\r\n option.classList.add(field.dataset.cannotOrderCssClass);\r\n\r\n field.appendChild(option);\r\n }\r\n}"]}