{"version":3,"sources":["quick-add-cta.js"],"names":["sendToGTM","data","isCrossSell","window","dataLayer","Soho","GTM","trackOmetriaBasket","payload","ometriaBasket","push","event","ecommerce","currencyCode","trackingCurrency","add","products","item","isQuickAdd","plugins","delegate","document","e","preventDefault","form","target","hasAttribute","button","querySelector","span","$count","labelDefault","dataset","label","labelAdded","labelError","onOverlay","closest","disabled","handleError","classList","innerHTML","setTimeout","remove","$","ajax","url","getAttribute","type","URLSearchParams","FormData","toString","success","result","count","overlayAddedButtons","resetButton","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","MutationObserver","mutations","mutation","attributeName","contains","buttonData","observe","attributes","attributeFilter"],"mappings":"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","file":"../../javascript/quick-add-cta.js","sourcesContent":["(function () {\n    function sendToGTM(data, isCrossSell) {\n        if (window.dataLayer) {\n            if (Soho.GTM && typeof Soho.GTM.trackOmetriaBasket === 'function') {\n                Soho.GTM.trackOmetriaBasket(data.payload.ometriaBasket);\n            }\n\n            window.dataLayer.push({\n                'event': 'addToCart',\n                'ecommerce': {\n                    'currencyCode': data.payload.trackingCurrency,\n                    'add': {\n                        'products': [data.payload.item]\n                    }\n                },\n                'isCrossSell': isCrossSell,\n                'isQuickAdd': true,\n            });\n\n            window.dataLayer.push({\n                'event': 'quickAddToCart',\n                'ecommerce': {\n                    'currencyCode': data.payload.trackingCurrency,\n                    'add': {\n                        'products': [data.payload.item]\n                    }\n                },\n            });\n\n            // Reset the var back to nothing\n            window.dataLayer.push({\n                'isCrossSell': false,\n                'isQuickAdd': false,\n            });\n        }\n    }\n\n    Soho.plugins.delegate(document, 'submit', '.js-quick-add-cta', function(e) {\n        e.preventDefault();\n\n        var form = e.target;\n        var isCrossSell = form.hasAttribute('data-is-cross-sell');\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                    sendToGTM(data, isCrossSell);\n                } else {\n                    handleError();\n                }\n            },\n            error: handleError\n        });\n    });\n\n    Soho.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        var isCrossSell = false;\n        forms.forEach(function(subForm) {\n            var keyInput = subForm.querySelector('[name=\"key\"]');\n            if (subForm.hasAttribute('data-is-cross-sell')) {\n                isCrossSell = true;\n            }\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                    sendToGTM(data, isCrossSell);\n                } else {\n                    handleError();\n                }\n            },\n            error: handleError\n        });\n    });\n\n    const 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\n    repositionAddForm();\n\n    viewport.resize(repositionAddForm);\n\n    // Track buttons added while overlay is open\n    let overlayAddedButtons = [];\n\n    // Reset button state immediately when overlay closes\n    const 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\n    const overlay = document.querySelector('#overlay');\n    if (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})();\n"],"sourceRoot":"../../../../resources/javascript"}