{"version":3,"sources":["swatch-basket.js","components/swatch-basket.js","components/swatch-order-form.js"],"names":["_typeof","o","Symbol","iterator","constructor","prototype","_classCallCheck","a","n","TypeError","_defineProperties","e","r","t","length","enumerable","configurable","writable","Object","defineProperty","_toPropertyKey","key","_createClass","i","_toPrimitive","toPrimitive","call","String","Number","Loop","this","object","obj","callback","keys","array","reverse","SwatchBasket","el","self","loop","basketStorage","LocalStorageManager","document","querySelector","input","querySelectorAll","status","option","submitButton","selectedCount","swatches","swatchLimit","init","watchInputs","watchOptions","bindStatusClick","getPreselected","updateBasket","selected","dataset","swatchesSelected","get","split","map","code","getElementById","checked","getAttribute","filter","id","forEach","addEventListener","preventDefault","stopImmediatePropagation","currentTarget","closest","dispatchEvent","CustomEvent","onchange","change","bind","removeFromBasket","swatch","target","swatchExists","canAddSwatch","addSwatch","removeSwatch","resetBasket","indexOf","push","index","splice","updateSwatchCount","innerHTML","concat","swatchItem","classList","add","swatchDisplay","style","backgroundImage","swatchText","checkbox","value","setAttribute","swatchItems","remove","removeAttribute","set","join","Soho","swatchBasket","SwatchOrderForm","orderForm","ajax","countrySelect","onFormSubmit","onCountrySelectChange","localeSelect","swatchPopupClose","click","event","_this","clearErrors","appendChild","cloneNode","formData","FormData","fetch","action","method","body","then","response","json","data","payload","errors","addErrors","redirect","window","location","href","finally","adaptivePlaceholder","catch","error","console","field","addError","message","wrap","parentElement","contains","errorP","createElement","textContent","fields","swatchOrderForm"],"mappings":"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","file":"../../javascript/swatch-basket.js","sourcesContent":["function Loop() {\n\n    this.object = function(obj, callback) {\n        var keys = Object.keys(obj);\n        for (var i = 0; i < keys.length; i++) {\n            (function(i) {\n                callback(keys, i);\n            })(i);\n        }\n    }\n\n    this.array = function(array, callback, reverse) {\n        if (reverse) {\n            for (var i = array.length - 1; i > -1; i--) {\n                (function(i) {\n                    callback(array, i);\n                })(i);\n            }\n        } else {\n            for (var i = 0; i < array.length; i++) {\n                (function(i) {\n                    callback(array, i);\n                })(i);\n            }\n        }\n    }\n}\n\n\n/**\n * @param {HTMLElement} el\n * @constructor\n */\nfunction SwatchBasket(el) {\n    const self = this;\n    const loop = new Loop();\n    const basketStorage = new LocalStorageManager();\n\n    this.el = el || document.querySelector('.js-swatch-basket');\n    this.input = document.querySelectorAll('.js-swatch-input');\n    this.status = document.querySelectorAll('.js-swatch-status');\n    this.option = document.querySelectorAll('.js-swatch-basket__option');\n    this.submitButton = document.querySelector('.js-swatch-basket__submit');\n    this.selectedCount = document.querySelector('.js-swatch-basket__selected-count');\n\n    this.swatches = [];\n    this.swatchLimit = this.option.length;\n\n    // Begin\n    this.init = function () {\n        this.watchInputs();\n        this.watchOptions();\n        this.bindStatusClick();\n\n        if (!this.el) {\n            this.updateBasket();\n            return;\n        }\n\n        this.swatches = this.getPreselected();\n\n        if (this.swatches.length) {\n            this.updateBasket();\n        }\n    };\n\n    this.getPreselected = function () {\n        let selected = this.el.dataset.swatchesSelected ? this.el.dataset.swatchesSelected : basketStorage.get('swatch-basket-swatches', '');\n\n        if (typeof selected === 'undefined' || selected === '') {\n            return [];\n        } else {\n            selected = selected.split(',');\n        }\n\n        if (selected.length > 0) {\n            selected = selected\n                .map(function (code) {\n                    let input = document.querySelector('.js-swatch-input[value=' + code + ']');\n                    if (!input) {\n                        input = document.getElementById(code);\n                        if (!input) {\n                            return null;\n                        }\n                    }\n                    input.checked = true;\n                    return input.getAttribute('id')\n                }).filter(function (id) {\n                    return id !== null;\n                });\n        }\n\n        return selected;\n    };\n\n    // Bind status click, remove the swatch from the basket\n    this.bindStatusClick = function () {\n        this.status.forEach(status => {\n            status.addEventListener('click', e => {\n                e.preventDefault();\n                e.stopImmediatePropagation();\n                const input = e.currentTarget.closest('.swatch-group__option').querySelector('input');\n                if (input) {\n                    input.checked = false;\n                    input.dispatchEvent(new CustomEvent('change'));\n                }\n            });\n        });\n    };\n\n    // Watch all swatch inputs for changes (can be added or removed)\n    this.watchInputs = function () {\n        loop.array(this.input, function (input, i) {\n            input[i].onchange = self.change.bind(self);\n        });\n    };\n\n    // Watch all basket options for changes (can be removed)\n    this.watchOptions = function () {\n        loop.array(this.option, function (option, i) {\n            option[i].onchange = self.removeFromBasket.bind(self);\n        });\n    };\n\n    // Toggle the state of a swatch - either add it to the basket or remove it from the basket\n    this.change = function (e) {\n        const swatch = e.target.id;\n\n        if (e.target.checked && !this.swatchExists(swatch)) {\n            if (this.canAddSwatch()) {\n                this.addSwatch(swatch);\n            } else {\n                e.target.checked = false;\n            }\n        }\n\n        if (!e.target.checked && this.swatchExists(swatch)) {\n            this.removeSwatch(swatch);\n        }\n\n        this.resetBasket();\n        this.updateBasket();\n    };\n\n    // Can a swatch be added to the swatches array?\n    this.canAddSwatch = function () {\n        return this.swatches.length < this.swatchLimit;\n    };\n\n    // Does the swatch exist in the swatches array\n    this.swatchExists = function (swatch) {\n        return this.swatches.indexOf(swatch) > -1;\n    };\n\n    // Add the swatch to the swatches array\n    this.addSwatch = function (swatch) {\n        this.swatches.push(swatch);\n    };\n\n    // Remove the swatch from the swatches array\n    this.removeSwatch = function (swatch) {\n        const index = this.swatches.indexOf(swatch);\n\n        this.swatches.splice(index, 1);\n    };\n\n    // Update the swatch count\n    this.updateSwatchCount = function() {\n        if (this.selectedCount) {\n            this.selectedCount.innerHTML = `(${this.swatches.length}/${this.swatchLimit})`;\n        }\n    };\n\n    // Remove a swatch from the basket\n    this.removeFromBasket = function (e) {\n        const swatch = e.target.getAttribute('data-trigger');\n\n        if (!e.target.checked && this.swatchExists(swatch)) {\n            const input = document.querySelector('#' + swatch);\n\n            input.checked = false;\n            input.dispatchEvent(new CustomEvent('change'));\n        }\n    };\n\n    // Reset all options within the basket\n    this.resetBasket = function () {\n        loop.array(this.option, function (option, i) {\n            var option = option[i];\n\n            const swatchItem = option.querySelector('.swatch');\n            if (swatchItem) {\n                swatchItem.classList.add('swatch--empty');\n            }\n\n            const swatchDisplay = option.querySelector('.swatch__display');\n            if (swatchDisplay) {\n                swatchDisplay.style.backgroundImage = 'none';\n            }\n\n            const swatchText = option.querySelector('.swatch__text');\n            if (swatchText) {\n                swatchText.innerHTML = 'Add swatch';\n            }\n\n            const checkbox = option.querySelector('input[type=\"checkbox\"]');\n            if (checkbox) {\n                checkbox.value = null;\n                checkbox.checked = false;\n                checkbox.setAttribute('disabled', true);\n            }\n        });\n\n        if (this.submitButton) {\n            this.submitButton.setAttribute('disabled', 'disabled');\n        }\n    };\n\n    // Update the basket, adding each item from the swatches array into the basket\n    this.updateBasket = function () {\n        loop.array(this.swatches, function (swatches, i) {\n            const swatch = swatches[i];\n            const option = self.option[i];\n            const input = document.querySelector('#' + swatch);\n\n            const swatchItems = option.querySelector('.swatch');\n            if (swatchItems) {\n                swatchItems.classList.remove('swatch--empty');\n            }\n\n            const swatchDisplay = option.querySelector('.swatch__display');\n            if (swatchDisplay) {\n                swatchDisplay.style.backgroundImage = 'url(' + input.getAttribute('data-colour-image') + ')';\n            }\n\n            const swatchText = option.querySelector('.swatch__text');\n            if(swatchText) {\n                swatchText.innerHTML = input.getAttribute('data-colour-label');\n            }\n\n            const checkbox = option.querySelector('input[type=\"checkbox\"]');\n            if (checkbox) {\n                checkbox.value = input.getAttribute('data-colour-id');\n                checkbox.checked = true;\n                checkbox.setAttribute('data-trigger', swatch);\n                checkbox.removeAttribute('disabled');\n            }\n        });\n\n        if (this.swatches.length !== 0 && this.submitButton) {\n            this.submitButton.removeAttribute('disabled');\n            basketStorage.set('swatch-basket-swatches', this.swatches.join(','));\n        }\n\n        this.updateSwatchCount();\n    }\n}\n\nSoho.swatchBasket = (function() {\n    const swatchBasket = new SwatchBasket();\n    swatchBasket.init();\n\n    return swatchBasket;\n})();\n\n/**\n * Swatch Order Form\n *  - Handles both /swatches and Fabric Overlay swatches form\n */\nclass SwatchOrderForm {\n    /**\n     * @param {HTMLElement} orderForm\n     */\n    constructor(orderForm) {\n        this.orderForm = orderForm || document.querySelector('.js-swatch-order');\n        this.ajax = typeof this.orderForm.dataset.ajax !== 'undefined';\n        this.countrySelect = document.getElementById('order_delivery_address_address_country');\n        this.swatches = [];\n\n        this.bind();\n    }\n\n    /**\n     * Bind events to the form\n     */\n    bind() {\n        this.orderForm.addEventListener('submit', this.onFormSubmit.bind(this));\n        this.countrySelect.addEventListener('change', this.onCountrySelectChange.bind(this));\n    }\n\n    /**\n     * Handle the country select change\n     */\n    onCountrySelectChange() {\n        const localeSelect = document.querySelector('.js-change-shipping-country');\n        const swatchPopupClose = document.querySelector('.mfp-close');\n\n        if (null !== localeSelect) {\n            swatchPopupClose.click();\n            localeSelect.click();\n        }\n    }\n\n    /**\n     * Handle the form submission\n     *\n     * @param {*} event \n     * @returns \n     */\n    onFormSubmit(event) {\n        // Clear any existing errors\n        this.clearErrors();\n\n        // Remove any existing swatch-basket inputs\n        this.orderForm.querySelectorAll('[name=\"swatch-basket\"]').forEach((input) => input.remove());\n\n        // Add any swatch-basket inputs to the form, \n        document.querySelectorAll('input[form=\"swatch-order\"]').forEach(\n            (input) => document.getElementById('swatch-order').appendChild(input.cloneNode())\n        );\n\n        // If the form is set to AJAX\n        if (this.ajax) {\n            event.preventDefault();\n\n            const formData = new FormData(this.orderForm);\n\n            fetch(this.orderForm.action + '?ajax=1', {\n                method: 'post',\n                body: formData,\n            })\n                .then((response) => response.json())\n                .then((data) => {\n                    if (typeof data.payload.errors !== 'undefined') {\n                        this.addErrors(data.payload.errors);\n                    }\n\n                    if (typeof data.payload.redirect !== 'undefined') {\n                        window.location.href = data.payload.redirect;\n                    }\n                })\n                .finally(() => {\n                    Soho.adaptivePlaceholder();\n                })\n                .catch((error) => {\n                    console.error('Error:', error);\n                });\n\n            return false;\n        }\n    }\n\n    /**\n     * Add errors to the form\n     *\n     * @param {object} errors\n     */\n    addErrors(errors) {\n        for (const field in errors) {\n            const error = errors[field];\n            this.addError(field, error);\n        }\n    }\n\n    /**\n     * Add an error message to a field\n     *\n     * @param {string} field\n     * @param {string} message\n     */\n    addError(field, message) {\n        let wrap = this.orderForm.querySelector('#' + field + '_wrap');\n\n        if (!wrap) {\n            return;\n        }\n\n        if (wrap.parentElement.classList.contains('checkout-address-form__address')) {\n            wrap.parentElement.parentElement.classList.add('checkout-address-form--manual');\n        }\n\n        wrap.classList.add('field-error');\n\n        let errorP = wrap.querySelector('p.error');\n        if (!errorP) {\n            errorP = document.createElement('p');\n            errorP.classList.add('error');\n            wrap.appendChild(errorP);\n        }\n\n        errorP.innerHTML = message;\n    }\n\n    /**\n     * Ensure all errors are purged from the view\n     */\n    clearErrors() {\n        const errors = this.orderForm.querySelectorAll('p.error');\n        for (let index = 0; index < errors.length; index++) {\n            const element = errors[index];\n            element.textContent = '';\n        }\n\n        const fields = this.orderForm.querySelectorAll('.field-error');\n        for (let index = 0; index < fields.length; index++) {\n            const element = fields[index];\n            element.classList.remove('field-error');\n        }\n    }\n}\n\nSoho.swatchOrderForm = () => new SwatchOrderForm();\n\n\n\nSoho.swatchOrderForm();","Soho.swatchBasket = (function() {\n    const swatchBasket = new SwatchBasket();\n    swatchBasket.init();\n\n    return swatchBasket;\n})();\n","/**\n * Swatch Order Form\n *  - Handles both /swatches and Fabric Overlay swatches form\n */\nclass SwatchOrderForm {\n    /**\n     * @param {HTMLElement} orderForm\n     */\n    constructor(orderForm) {\n        this.orderForm = orderForm || document.querySelector('.js-swatch-order');\n        this.ajax = typeof this.orderForm.dataset.ajax !== 'undefined';\n        this.countrySelect = document.getElementById('order_delivery_address_address_country');\n        this.swatches = [];\n\n        this.bind();\n    }\n\n    /**\n     * Bind events to the form\n     */\n    bind() {\n        this.orderForm.addEventListener('submit', this.onFormSubmit.bind(this));\n        this.countrySelect.addEventListener('change', this.onCountrySelectChange.bind(this));\n    }\n\n    /**\n     * Handle the country select change\n     */\n    onCountrySelectChange() {\n        const localeSelect = document.querySelector('.js-change-shipping-country');\n        const swatchPopupClose = document.querySelector('.mfp-close');\n\n        if (null !== localeSelect) {\n            swatchPopupClose.click();\n            localeSelect.click();\n        }\n    }\n\n    /**\n     * Handle the form submission\n     *\n     * @param {*} event \n     * @returns \n     */\n    onFormSubmit(event) {\n        // Clear any existing errors\n        this.clearErrors();\n\n        // Remove any existing swatch-basket inputs\n        this.orderForm.querySelectorAll('[name=\"swatch-basket\"]').forEach((input) => input.remove());\n\n        // Add any swatch-basket inputs to the form, \n        document.querySelectorAll('input[form=\"swatch-order\"]').forEach(\n            (input) => document.getElementById('swatch-order').appendChild(input.cloneNode())\n        );\n\n        // If the form is set to AJAX\n        if (this.ajax) {\n            event.preventDefault();\n\n            const formData = new FormData(this.orderForm);\n\n            fetch(this.orderForm.action + '?ajax=1', {\n                method: 'post',\n                body: formData,\n            })\n                .then((response) => response.json())\n                .then((data) => {\n                    if (typeof data.payload.errors !== 'undefined') {\n                        this.addErrors(data.payload.errors);\n                    }\n\n                    if (typeof data.payload.redirect !== 'undefined') {\n                        window.location.href = data.payload.redirect;\n                    }\n                })\n                .finally(() => {\n                    Soho.adaptivePlaceholder();\n                })\n                .catch((error) => {\n                    console.error('Error:', error);\n                });\n\n            return false;\n        }\n    }\n\n    /**\n     * Add errors to the form\n     *\n     * @param {object} errors\n     */\n    addErrors(errors) {\n        for (const field in errors) {\n            const error = errors[field];\n            this.addError(field, error);\n        }\n    }\n\n    /**\n     * Add an error message to a field\n     *\n     * @param {string} field\n     * @param {string} message\n     */\n    addError(field, message) {\n        let wrap = this.orderForm.querySelector('#' + field + '_wrap');\n\n        if (!wrap) {\n            return;\n        }\n\n        if (wrap.parentElement.classList.contains('checkout-address-form__address')) {\n            wrap.parentElement.parentElement.classList.add('checkout-address-form--manual');\n        }\n\n        wrap.classList.add('field-error');\n\n        let errorP = wrap.querySelector('p.error');\n        if (!errorP) {\n            errorP = document.createElement('p');\n            errorP.classList.add('error');\n            wrap.appendChild(errorP);\n        }\n\n        errorP.innerHTML = message;\n    }\n\n    /**\n     * Ensure all errors are purged from the view\n     */\n    clearErrors() {\n        const errors = this.orderForm.querySelectorAll('p.error');\n        for (let index = 0; index < errors.length; index++) {\n            const element = errors[index];\n            element.textContent = '';\n        }\n\n        const fields = this.orderForm.querySelectorAll('.field-error');\n        for (let index = 0; index < fields.length; index++) {\n            const element = fields[index];\n            element.classList.remove('field-error');\n        }\n    }\n}\n\nSoho.swatchOrderForm = () => new SwatchOrderForm();\n\n"],"sourceRoot":"../../../../resources/javascript"}