{"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","option2","submitButton","selectedCount","swatches","swatchLimit","init","dataset","swatchBasketInitialised","watchInputs","watchOptions","bindStatusClick","getPreselected","updateBasket","orderSwatchesOverlay","addEventListener","preventDefault","Overlay","render","sidebar","modifiers","Soho","formTemplate","undefined","popupOpen","click","selected","swatchesSelected","get","split","map","code","getElementById","checked","getAttribute","filter","id","forEach","stopImmediatePropagation","currentTarget","closest","dispatchEvent","CustomEvent","onchange","change","bind","removeFromBasket","swatch","target","swatchExists","canAddSwatch","addSwatch","removeSwatch","resetBasket","indexOf","push","index","splice","updateSwatchCount","_this","innerHTML","concat","j","swatchDisplay","style","backgroundImage","swatchText","classList","remove","checkbox","value","setAttribute","add","removeAttribute","set","join","swatchBasket","SwatchOrderForm","orderForm","swatchOrderInitialised","ajax","countrySelect","onFormSubmit","onCountrySelectChange","localeSelect","swatchPopupClose","event","_this2","clearErrors","appendChild","cloneNode","formData","FormData","fetch","action","method","body","then","response","json","data","payload","errors","addErrors","redirect","window","location","href","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    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.option2 = document.querySelectorAll('.js-swatch-basket__option-2');\n    this.submitButton = document.querySelector('.js-swatch-basket__submit');\n    this.selectedCount = document.querySelectorAll('.js-swatch-basket__selected-count');\n\n    this.swatches = [];\n    this.swatchLimit = this.option.length;\n\n    // Begin\n    this.init = function () {\n        if (!this.el) {\n            this.updateBasket();\n            return;\n        }\n\n        if (this.el.dataset.swatchBasketInitialised) {\n            return;\n        }\n\n        this.el.dataset.swatchBasketInitialised = 'true';\n\n        this.watchInputs();\n        this.watchOptions();\n        this.bindStatusClick();\n\n        this.swatches = this.getPreselected();\n\n        if (this.swatches.length) {\n            this.updateBasket();\n        }\n\n        const orderSwatchesOverlay = document.querySelector('#order-swatches');\n\n        if (this.submitButton && orderSwatchesOverlay) {\n            this.submitButton.addEventListener('click', (e) => {\n                e.preventDefault();\n\n                Overlay.render(`#order-swatches`, {\n                    sidebar: true,\n                    modifiers: ['sidebar', 'sidebar-right', 'swatch-details'],\n                    callback: () => {\n                        if (Soho.formTemplate) {\n                            Soho.formTemplate();\n                        }\n                    }\n                });\n            });\n\n            if (this.submitButton.dataset.popupOpen !== undefined) {\n                this.submitButton.click();\n            }\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        this.selectedCount.forEach((el) => {\n            el.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.getElementById(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        this.option2 = document.querySelectorAll('.js-swatch-basket__option-2');\n        this.selectedCount = document.querySelectorAll('.js-swatch-basket__selected-count');\n\n        loop.array(this.option, function (option, i) {\n            [option[i], self.option2[i]].forEach((el, j) => {\n                if (!el) {\n                    return;\n                }\n\n                const swatchDisplay = el.querySelector('.swatch__display');\n                if (swatchDisplay) {\n                    swatchDisplay.style.backgroundImage = 'none';\n                }\n\n                const swatchText = el.querySelector('.swatch__text');\n                if (swatchText) {\n                    swatchText.innerHTML = 'Add swatch';\n                    if (j === 1) {\n                        swatchText.classList.remove('swatch__text--visible');\n                    }\n                }\n\n                const checkbox = el.querySelector('input[type=\"checkbox\"]');\n                if (checkbox) {\n                    checkbox.value = null;\n                    checkbox.checked = false;\n                    checkbox.setAttribute('disabled', true);\n                }\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        this.option2 = document.querySelectorAll('.js-swatch-basket__option-2');\n        this.selectedCount = document.querySelectorAll('.js-swatch-basket__selected-count');\n\n        loop.array(this.swatches, function (swatches, i) {\n            const swatch = swatches[i];\n            const input = document.getElementById(swatch);\n\n            [self.option[i], self.option2[i]].forEach((el, j) => {\n                if (!el) {\n                    return;\n                }\n\n                const swatchDisplay = el.querySelector('.swatch__display');\n                if (swatchDisplay) {\n                    swatchDisplay.style.backgroundImage = 'url(' + input.getAttribute('data-colour-image') + ')';\n                }\n\n                const swatchText = el.querySelector('.swatch__text');\n                if(swatchText) {\n                    swatchText.innerHTML = input.getAttribute('data-colour-label');\n                    if (j === 1) {\n                        swatchText.classList.add('swatch__text--visible');\n                    }\n                }\n\n                const checkbox = el.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\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\n        if (!this.orderForm || this.orderForm.dataset.swatchOrderInitialised) {\n            return;\n        }\n\n        this.orderForm.dataset.swatchOrderInitialised = 'true';\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                .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\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\n        if (!this.orderForm || this.orderForm.dataset.swatchOrderInitialised) {\n            return;\n        }\n\n        this.orderForm.dataset.swatchOrderInitialised = 'true';\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                .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"],"sourceRoot":"../../../../resources/javascript"}