{"version":3,"sources":["quick-add-cta.js"],"names":["Soho","plugins","delegate","document","e","preventDefault","form","target","button","querySelector","span","$count","labelDefault","dataset","label","labelAdded","labelError","onOverlay","closest","disabled","handleError","classList","add","innerHTML","setTimeout","remove","$","ajax","url","getAttribute","type","data","URLSearchParams","FormData","toString","success","result","payload","count","overlayAddedButtons","push","resetButton","window","dataLayer","event","ecommerce","currencyCode","trackingCurrency","products","item","error","tagName","parentNode","forms","querySelectorAll","items","forEach","subForm","keyInput","qtyInput","value","param","key","repositionAddForm","el","link","placeholder","bottom","getBoundingClientRect","style","concat","opacity","viewport","resize","overlay","observer","MutationObserver","mutations","mutation","attributeName","contains","buttonData","observe","attributes","attributeFilter"],"mappings":"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","file":"../../javascript/quick-add-cta.js","sourcesContent":["Soho.plugins.delegate(document, 'submit', '.js-quick-add-cta', function(e) {\n    e.preventDefault();\n\n    var form = e.target;\n    var button = form.querySelector('button[type=\"submit\"]');\n    var span = button.querySelector('span');\n    var $count = document.querySelector('.js-basket-count .header-action__count');\n    var labelDefault = button.dataset.label || 'Add to basket';\n    var labelAdded = button.dataset.labelAdded || 'Added to basket';\n    var labelError = button.dataset.labelError || 'Failed to add';\n    var onOverlay = button.closest('#overlay') ? true : false;\n\n    if (button.disabled) {\n        return;\n    }\n\n    button.disabled = true;\n\n    var handleError = function() {\n        button.disabled = false;\n        button.classList.add('product-add-to-basket-form__quick-add--error');\n        if (span) {\n            span.innerHTML = labelError;\n        }\n\n        setTimeout(function() {\n            button.classList.remove('product-add-to-basket-form__quick-add--error');\n            if (span) {\n                span.innerHTML = labelDefault;\n            }\n        }, 3000);\n    };\n\n    $.ajax({\n        url: form.getAttribute('action'),\n        type: form.getAttribute('method'),\n        data: new URLSearchParams(new FormData(form)).toString(),\n        success: function(data) {\n            if (data.result) {\n                if ($count) {\n                    $count.innerHTML = data.payload.count;\n                }\n\n                button.classList.add('product-add-to-basket-form__quick-add--added');\n                if (span) {\n                    span.innerHTML = labelAdded;\n                }\n\n                if (!onOverlay) {\n                    setTimeout(function() {\n                        resetButton(button, span, labelDefault);\n                    }, 3000);\n                } else {\n                    // Track button for reset when overlay closes\n                    overlayAddedButtons.push({\n                        button: button,\n                        span: span,\n                        labelDefault: labelDefault\n                    });\n                }\n\n                if (window.dataLayer) {\n                    window.dataLayer.push({\n                        'event': 'addToCart',\n                        'ecommerce': {\n                            'currencyCode': data.payload.trackingCurrency,\n                            'add': {\n                                'products': [data.payload.item]\n                            }\n                        }\n                    });\n                }\n            } else {\n                handleError();\n            }\n        },\n        error: handleError\n    });\n});\n\nSoho.plugins.delegate(document, 'click', '.js-quick-add-all', function(e) {\n    e.preventDefault();\n\n    if (e.target.tagName == 'SPAN') {\n        var span = e.target;\n        var button = span.parentNode;\n    } else {\n        var button = e.target;\n        var span = button.querySelector('span');\n    }\n    var overlay = document.querySelector('#overlay');\n    var forms = overlay.querySelectorAll('.js-quick-add-cta');\n    var count = document.querySelector('.js-basket-count .header-action__count');\n    var labelDefault = button.dataset.label || 'Add all to basket';\n    var labelAdded = button.dataset.labelAdded || 'Added all to basket';\n    var labelError = button.dataset.labelError || 'Failed to add all';\n    var onOverlay = button.closest('#overlay') ? true : false;\n\n    if (button.disabled) {\n        return;\n    }\n\n    button.disabled = true;\n\n    var items = {};\n    forms.forEach(function(subForm) {\n        var keyInput = subForm.querySelector('[name=\"key\"]');\n        if (keyInput) {\n            var qtyInput = subForm.querySelector('[name=\"qty\"]');\n            items[keyInput.value] = qtyInput ? qtyInput.value : 1;\n        }\n    });\n\n    var handleError = function() {\n        button.disabled = false;\n        button.classList.add('product-add-to-basket-form__quick-add--error');\n        if (span) {\n            span.innerHTML = labelError;\n        }\n\n        setTimeout(function() {\n            button.classList.remove('product-add-to-basket-form__quick-add--error');\n            if (span) {\n                span.innerHTML = labelDefault;\n            }\n        }, 3000);\n    };\n\n\n    $.ajax({\n        url: '/basket/add',\n        type: 'get',\n        data: $.param({ key: items }),\n        success: function(data) {\n            if (data.result) {\n                if (count) {\n                    count.innerHTML = data.payload.count;\n                }\n\n                button.classList.add('product-add-to-basket-form__quick-add--added');\n                if (span) {\n                    span.innerHTML = labelAdded;\n                }\n\n                if (!onOverlay) {\n                    setTimeout(function() {\n                        resetButton(button, span, labelDefault);\n                    }, 3000);\n                } else {\n                    // Track button for reset when overlay closes\n                    overlayAddedButtons.push({\n                        button: button,\n                        span: span,\n                        labelDefault: labelDefault\n                    });\n                }\n\n                if (window.dataLayer) {\n                    window.dataLayer.push({\n                        'event': 'addToCart',\n                        'ecommerce': {\n                            'currencyCode': data.payload.trackingCurrency,\n                            'add': {\n                                'products': [data.payload.item]\n                            }\n                        }\n                    });\n                }\n            } else {\n                handleError();\n            }\n        },\n        error: handleError\n    });\n});\n\nconst repositionAddForm = () => {\n    document.querySelectorAll('.product__quick-add-form').forEach((el) => {\n        const link = el.parentNode;\n        const placeholder = link.querySelector('.product__quick-add-form-placeholder');\n\n        if (placeholder) {\n            const bottom = link.getBoundingClientRect().bottom - placeholder.getBoundingClientRect().bottom;\n\n            el.style.bottom = `${bottom}px`;\n            el.style.opacity = 1;\n        }\n    });\n}\n\nrepositionAddForm();\n\nviewport.resize(repositionAddForm);\n\n// Track buttons added while overlay is open\nlet overlayAddedButtons = [];\n\n// Reset button state immediately when overlay closes\nconst resetButton = (button, span, labelDefault) => {\n    button.disabled = false;\n    button.classList.remove('product-add-to-basket-form__quick-add--added');\n    if (span) {\n        span.innerHTML = labelDefault;\n    }\n};\n\n// Watch for overlay close event by monitoring class changes\nconst overlay = document.querySelector('#overlay');\nif (overlay) {\n    const observer = new MutationObserver((mutations) => {\n        mutations.forEach((mutation) => {\n            if (mutation.attributeName === 'class') {\n                // Check if overlay--active class was removed (overlay is closing)\n                if (!overlay.classList.contains('overlay--active') && overlay.classList.contains('overlay--closing')) {\n                    // Reset all tracked buttons\n                    overlayAddedButtons.forEach((buttonData) => {\n                        resetButton(buttonData.button, buttonData.span, buttonData.labelDefault);\n                    });\n                    overlayAddedButtons = [];\n                }\n            }\n        });\n    });\n\n    observer.observe(overlay, { attributes: true, attributeFilter: ['class'] });\n}\n"],"sourceRoot":"../../../../resources/javascript"}