{"version":3,"sources":["modular.js","plugins/modular.js"],"names":["_typeof","o","Symbol","iterator","constructor","prototype","_toConsumableArray","r","_arrayWithoutHoles","_iterableToArray","_unsupportedIterableToArray","_nonIterableSpread","TypeError","a","_arrayLikeToArray","t","toString","call","slice","name","Array","from","test","isArray","length","e","n","_classCallCheck","_defineProperties","enumerable","configurable","writable","Object","defineProperty","_toPropertyKey","key","_createClass","_defineProperty","value","i","_toPrimitive","toPrimitive","String","Number","_classPrivateFieldInitSpec","_checkPrivateRedeclaration","set","has","_classPrivateFieldGet","s","get","_assertClassBrand","_classPrivateFieldSet","arguments","_qtyControls","WeakMap","_qtyControlBtns","_normalPrice","_membershipPrice","_locale","_endMissing","_overlayCloseMethod","_skipEndWarning","Modular","_this","this","window","locale","undefined","buttons","forEach","button","addEventListener","eventHandle","qtyInputs","input","missingEndWarning","Overlay","modifiers","push","render","callback","_document$querySelect","updateMissingEndWarningText","document","querySelector","overlayCloseMethod","close","closed","missingEndWarningClosed","addToBasketBtn","endMissing","skipEndWarning","preventDefault","missingEndWarningCallback","includes","endInput","find","dataset","recommendedEndPiece","parseInt","dispatchEvent","MouseEvent","querySelectorAll","el","innerHTML","replace","_document$querySelect2","_document$querySelect3","renderLeadMessageToDom","toggleDisableButton","renderPricesToDom","toggleFromLabels","checkForEnds","filter","requiresEndPiece","endsQty","isEndPiece","map","reduce","b","updateEndMissing","active","fromPriceLabels","label","hidden","qtySelected","disabled","normalTotal","sum","lowestNormalItemPrice","membershipTotal","lowestMembershipItemPrice","innerText","formatPrice","inputsWithQty","longestLeadMessage","leadTimeMessage","fireDynamicAnchorLinkEvent","Soho","popup","anchorLink","event","CustomEvent","DYNAMIC_ADD_EVENT","detail","target","array","acc","maxLead","maxLeadTime","membership","parseFloat","totalPrice","accumulator","currentVal","price","localesArgument","geoLocale","split","concat","country","Intl","NumberFormat","minimumFractionDigits","trailingZeroDisplay","style","currency","global_e","format","controls","bind","setLowestPriceOnLoad","setLeadTimeOnLoad","init","self","qty","Math","min","apply","priceArray","modular"],"mappings":"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","file":"../../javascript/modular.js","sourcesContent":["class Modular {\n    #qtyControls;\n    #qtyControlBtns;\n    #normalPrice = \"price\";\n    #membershipPrice = \"membershipPrice\";\n    #locale = window.locale;\n    #endMissing = 0;\n    #overlayCloseMethod = undefined;\n    #skipEndWarning = false;\n\n    constructor() {\n        this.#qtyControls = [\n            ...document.querySelectorAll(\"[quantity-control]\"),\n        ];\n        this.#qtyControlBtns = document.querySelectorAll(\n            \".quantity-control__button\"\n        );\n        this.normalTotal = document.querySelector(\".js-modular-total\");\n        this.membershipTotal = document.querySelector(\n            \".js-modular-total-member\"\n        );\n        this.fromPriceLabels = document.querySelectorAll(\"[data-from]\");\n        this.leadTimeMessage = document.querySelector(\".js-lead-time\");\n        this.addToBasketBtn = document.querySelector(\n            \".js-basket-form button[type=submit]\"\n        );\n\n        this.missingEndWarning = document.querySelector('.js-missing-end-warning');\n\n        if (this.locale) {\n            this.init();\n        } else {\n            var self = this;\n            document.addEventListener('locale_loaded', function () {\n                self.locale = window.locale;\n                self.init();\n            });\n        }\n    }\n\n    get controls() {\n        return this.#qtyControls;\n    }\n\n    set locale(locale) {\n        this.#locale = locale;\n    }\n\n    get locale() {\n        return this.#locale;\n    }\n\n    get buttons() {\n        return this.#qtyControlBtns;\n    }\n\n    get qtyInputs() {\n        return this.controls.map((qty) => qty.querySelector(\"input\"));\n    }\n\n    get lowestNormalItemPrice() {\n        return Math.min(...this.priceArray());\n    }\n\n    get lowestMembershipItemPrice() {\n        return Math.min(...this.priceArray(this.#membershipPrice));\n    }\n\n    get qtySelected() {\n        return this.sum() > 0;\n    }\n\n    get endMissing() {\n        return this.#endMissing\n    }\n\n    set endMissing(endMissing) {\n        this.#endMissing = endMissing;\n    }\n\n    get overlayCloseMethod() {\n        return this.#overlayCloseMethod\n    }\n\n    set overlayCloseMethod(overlayCloseMethod) {\n        this.#overlayCloseMethod = overlayCloseMethod;\n    }\n\n    get skipEndWarning() {\n        return this.#skipEndWarning\n    }\n\n    /**\n     * Bind the events\n     */\n    bind = () => {\n        this.buttons.forEach((button) =>\n            button.addEventListener(\"click\", this.eventHandle)\n        );\n        this.qtyInputs.forEach((input) =>\n            input.addEventListener(\"change\", this.eventHandle)\n        );\n        if (this.missingEndWarning) {\n            this.missingEndWarning.addEventListener('click', () => {\n                Overlay.modifiers.push('missing-end-warning');\n                Overlay.render('#missing-end-warning', {\n                    modifiers: ['missing-end-warning'],\n                    callback: () => {\n                        this.updateMissingEndWarningText();\n                        document.querySelector('.js-ends-add')?.addEventListener('click', () => {\n                            this.overlayCloseMethod = 'add';\n                            Overlay.close();\n                        });\n                    },\n                    closed: this.missingEndWarningClosed,\n                });\n            });\n            this.addToBasketBtn.addEventListener('click', (e) => {\n                if (this.endMissing > 0 && this.skipEndWarning === false) {\n                    e.preventDefault();\n                    Overlay.modifiers = ['missing-end-warning', 'missing-end-warning-submit'];\n                    Overlay.render('#missing-end-warning', {\n                        modifiers: ['missing-end-warning', 'missing-end-warning-submit'],\n                        callback: this.missingEndWarningCallback,\n                        closed: this.missingEndWarningClosed,\n                    });\n                }\n            });\n        }\n    }\n\n    missingEndWarningClosed = () => {\n        if (['addcontinue', 'add'].includes(this.overlayCloseMethod)) {\n            const endInput = this.qtyInputs.find(input => input.dataset.recommendedEndPiece === 'true');\n\n            if (endInput) {\n                endInput.value = parseInt(endInput.value) + this.endMissing;\n                endInput.dispatchEvent(new MouseEvent('change'));\n            }\n        }\n\n        if (['addcontinue', 'ignore'].includes(this.overlayCloseMethod)) {\n            this.#skipEndWarning = true;\n            this.addToBasketBtn.dispatchEvent(new MouseEvent('click'));\n        }\n\n        this.overlayCloseMethod = undefined;\n        this.#skipEndWarning = false;\n    }\n\n    updateMissingEndWarningText = () => {\n        document.querySelectorAll('.js-missing-end-warning-text').forEach((el) => {\n            el.innerHTML = el.dataset[this.endMissing === 1 ? 'single' : 'multiple'].replace('{count}', this.endMissing);\n        });\n    }\n\n    missingEndWarningCallback = () => {\n        this.updateMissingEndWarningText();\n        document.querySelector('.js-ends-add')?.addEventListener('click', () => {\n            this.overlayCloseMethod = 'addcontinue';\n            Overlay.close();\n        });\n        document.querySelector('.js-end-warning-continue')?.addEventListener('click', () => {\n            this.overlayCloseMethod = 'ignore';\n            Overlay.close();\n        });\n    }\n\n    eventHandle = () => {\n        this.renderLeadMessageToDom();\n        this.toggleDisableButton();\n        this.renderPricesToDom();\n        this.toggleFromLabels();\n        this.checkForEnds();\n    }\n\n    checkForEnds = () => {\n        const inputsWithQtyAndRequiringEnd = this.qtyInputs.filter(\n            (input) => input.value != 0 && input.dataset.requiresEndPiece === 'true'\n        );\n\n        if (!inputsWithQtyAndRequiringEnd.length) {\n            this.updateEndMissing(0);\n            return;\n        }\n\n        const inputsWithQtyAndIsEnd = this.qtyInputs.filter(\n            (input) => input.value != 0 && input.dataset.isEndPiece === 'true'\n        );\n\n        const endsQtyArr = inputsWithQtyAndIsEnd.map(\n            (input) => parseInt(input.value)\n        );\n\n        const endsQty = endsQtyArr.reduce((a, b) => a + b, 0);\n\n        this.updateEndMissing(2 - endsQty);\n    }\n\n    updateEndMissing = (endMissing) => {\n        this.endMissing = endMissing;\n\n        this.updateMissingEndWarningText();\n\n        if (this.missingEndWarning) {\n            this.missingEndWarning.dataset.active = this.endMissing > 0;\n        }\n    }\n\n    toggleFromLabels = () =>\n        this.fromPriceLabels.forEach((label) => (label.hidden = this.qtySelected));\n\n\n    toggleDisableButton = () => this.addToBasketBtn.disabled = !this.qtySelected;\n\n    renderPricesToDom = () => {\n        const normalTotal = this.sum() || this.lowestNormalItemPrice;\n        const membershipTotal =\n            this.sum(this.#membershipPrice) || this.lowestMembershipItemPrice;\n\n        this.normalTotal.innerText = this.formatPrice(normalTotal);\n        this.membershipTotal.innerText = this.formatPrice(membershipTotal);\n    }\n\n    renderLeadMessageToDom = () => {\n        const inputsWithQty = this.qtyInputs.filter(\n            (input) => input.value != 0\n        );\n        const longestLeadMessage = this.longestLeadMessage(inputsWithQty);\n\n        this.leadTimeMessage.innerHTML = longestLeadMessage;\n\n        this.fireDynamicAnchorLinkEvent()\n\n        Soho.popup();\n    }\n\n    fireDynamicAnchorLinkEvent = () => {\n        const anchorLink = this.leadTimeMessage.querySelector('.js-anchor-link');\n        if (!anchorLink) {\n            return;\n        }\n        const event = new CustomEvent(Soho.anchorLink.DYNAMIC_ADD_EVENT, {\n            detail: {\n                target: anchorLink,\n            }\n        })\n\n        document.dispatchEvent(event)\n    }\n\n    /**\n     * If no quantities are selected we want to display the lead time\n     * based on all of the unselected quantities.\n     * @param {array} quantity inputs\n     * @returns {string} longest lead time\n     */\n    longestLeadMessage = (array) => {\n        if (!array.length) {\n            return this.longestLeadMessage(this.qtyInputs);\n        }\n\n        const max = array.reduce((acc, input) => {\n            let maxLead = parseInt(acc.dataset.maxLeadTime);\n            let thisLead = parseInt(input.dataset.maxLeadTime);\n\n            return thisLead > maxLead ? input : acc;\n        });\n\n        return max.dataset.leadTimeMessage;\n    }\n\n    /**\n     * @param {string} membership\n     * @returns {array} prices\n     */\n    priceArray = (membership = this.#normalPrice) =>\n        this.qtyInputs.map((input) => parseFloat(input.dataset[membership]));\n\n    /**\n     * @param {string} membership\n     * @returns {float} sum of selected items\n     */\n    sum = (membership = this.#normalPrice) => {\n        return this.totalPrice(membership).reduce(\n            (accumulator, currentVal) => accumulator + currentVal\n        );\n    };\n\n    /**\n     * @param {string} membership\n     * @returns {array} product of prices and quantity\n     */\n    totalPrice = (membership = this.#normalPrice) =>\n        this.qtyInputs.map(\n            (input) => parseFloat(input.dataset[membership]) * input.value\n        );\n\n    /**\n     * Set the from price to the lowest item price\n     */\n    setLowestPriceOnLoad = () => {\n        this.normalTotal.innerText = this.formatPrice(\n            this.lowestNormalItemPrice\n        );\n        this.membershipTotal.innerText = this.formatPrice(\n            this.lowestMembershipItemPrice\n        );\n    };\n\n    /**\n     * Set the max lead time on load\n     */\n    setLeadTimeOnLoad = () => {\n        this.leadTimeMessage.innerHTML = this.longestLeadMessage(\n            this.qtyInputs\n        )\n\n        this.fireDynamicAnchorLinkEvent()\n    }\n\n    /**\n     *\n     * @param {float} price\n     * @returns {string} formatted price\n     */\n    formatPrice = (price) => {\n        let localeParts = this.locale.geoLocale.split('_');\n        const localesArgument = localeParts[0] + `-${this.locale.country}`;\n\n        return new Intl.NumberFormat(localesArgument, {\n            minimumFractionDigits: 2,\n            trailingZeroDisplay: \"stripIfInteger\",\n            style: \"currency\",\n            currency: window.global_e ? 'GBP' : this.locale.currency,\n        }).format(price);\n    };\n\n    init = () => {\n        if (!this.controls.length) {\n            return;\n        }\n\n        this.bind();\n        this.setLowestPriceOnLoad();\n        this.setLeadTimeOnLoad();\n        Soho.popup();\n    };\n}\n\n\nSoho.modular = new Modular();\n","class Modular {\n    #qtyControls;\n    #qtyControlBtns;\n    #normalPrice = \"price\";\n    #membershipPrice = \"membershipPrice\";\n    #locale = window.locale;\n    #endMissing = 0;\n    #overlayCloseMethod = undefined;\n    #skipEndWarning = false;\n\n    constructor() {\n        this.#qtyControls = [\n            ...document.querySelectorAll(\"[quantity-control]\"),\n        ];\n        this.#qtyControlBtns = document.querySelectorAll(\n            \".quantity-control__button\"\n        );\n        this.normalTotal = document.querySelector(\".js-modular-total\");\n        this.membershipTotal = document.querySelector(\n            \".js-modular-total-member\"\n        );\n        this.fromPriceLabels = document.querySelectorAll(\"[data-from]\");\n        this.leadTimeMessage = document.querySelector(\".js-lead-time\");\n        this.addToBasketBtn = document.querySelector(\n            \".js-basket-form button[type=submit]\"\n        );\n\n        this.missingEndWarning = document.querySelector('.js-missing-end-warning');\n\n        if (this.locale) {\n            this.init();\n        } else {\n            var self = this;\n            document.addEventListener('locale_loaded', function () {\n                self.locale = window.locale;\n                self.init();\n            });\n        }\n    }\n\n    get controls() {\n        return this.#qtyControls;\n    }\n\n    set locale(locale) {\n        this.#locale = locale;\n    }\n\n    get locale() {\n        return this.#locale;\n    }\n\n    get buttons() {\n        return this.#qtyControlBtns;\n    }\n\n    get qtyInputs() {\n        return this.controls.map((qty) => qty.querySelector(\"input\"));\n    }\n\n    get lowestNormalItemPrice() {\n        return Math.min(...this.priceArray());\n    }\n\n    get lowestMembershipItemPrice() {\n        return Math.min(...this.priceArray(this.#membershipPrice));\n    }\n\n    get qtySelected() {\n        return this.sum() > 0;\n    }\n\n    get endMissing() {\n        return this.#endMissing\n    }\n\n    set endMissing(endMissing) {\n        this.#endMissing = endMissing;\n    }\n\n    get overlayCloseMethod() {\n        return this.#overlayCloseMethod\n    }\n\n    set overlayCloseMethod(overlayCloseMethod) {\n        this.#overlayCloseMethod = overlayCloseMethod;\n    }\n\n    get skipEndWarning() {\n        return this.#skipEndWarning\n    }\n\n    /**\n     * Bind the events\n     */\n    bind = () => {\n        this.buttons.forEach((button) =>\n            button.addEventListener(\"click\", this.eventHandle)\n        );\n        this.qtyInputs.forEach((input) =>\n            input.addEventListener(\"change\", this.eventHandle)\n        );\n        if (this.missingEndWarning) {\n            this.missingEndWarning.addEventListener('click', () => {\n                Overlay.modifiers.push('missing-end-warning');\n                Overlay.render('#missing-end-warning', {\n                    modifiers: ['missing-end-warning'],\n                    callback: () => {\n                        this.updateMissingEndWarningText();\n                        document.querySelector('.js-ends-add')?.addEventListener('click', () => {\n                            this.overlayCloseMethod = 'add';\n                            Overlay.close();\n                        });\n                    },\n                    closed: this.missingEndWarningClosed,\n                });\n            });\n            this.addToBasketBtn.addEventListener('click', (e) => {\n                if (this.endMissing > 0 && this.skipEndWarning === false) {\n                    e.preventDefault();\n                    Overlay.modifiers = ['missing-end-warning', 'missing-end-warning-submit'];\n                    Overlay.render('#missing-end-warning', {\n                        modifiers: ['missing-end-warning', 'missing-end-warning-submit'],\n                        callback: this.missingEndWarningCallback,\n                        closed: this.missingEndWarningClosed,\n                    });\n                }\n            });\n        }\n    }\n\n    missingEndWarningClosed = () => {\n        if (['addcontinue', 'add'].includes(this.overlayCloseMethod)) {\n            const endInput = this.qtyInputs.find(input => input.dataset.recommendedEndPiece === 'true');\n\n            if (endInput) {\n                endInput.value = parseInt(endInput.value) + this.endMissing;\n                endInput.dispatchEvent(new MouseEvent('change'));\n            }\n        }\n\n        if (['addcontinue', 'ignore'].includes(this.overlayCloseMethod)) {\n            this.#skipEndWarning = true;\n            this.addToBasketBtn.dispatchEvent(new MouseEvent('click'));\n        }\n\n        this.overlayCloseMethod = undefined;\n        this.#skipEndWarning = false;\n    }\n\n    updateMissingEndWarningText = () => {\n        document.querySelectorAll('.js-missing-end-warning-text').forEach((el) => {\n            el.innerHTML = el.dataset[this.endMissing === 1 ? 'single' : 'multiple'].replace('{count}', this.endMissing);\n        });\n    }\n\n    missingEndWarningCallback = () => {\n        this.updateMissingEndWarningText();\n        document.querySelector('.js-ends-add')?.addEventListener('click', () => {\n            this.overlayCloseMethod = 'addcontinue';\n            Overlay.close();\n        });\n        document.querySelector('.js-end-warning-continue')?.addEventListener('click', () => {\n            this.overlayCloseMethod = 'ignore';\n            Overlay.close();\n        });\n    }\n\n    eventHandle = () => {\n        this.renderLeadMessageToDom();\n        this.toggleDisableButton();\n        this.renderPricesToDom();\n        this.toggleFromLabels();\n        this.checkForEnds();\n    }\n\n    checkForEnds = () => {\n        const inputsWithQtyAndRequiringEnd = this.qtyInputs.filter(\n            (input) => input.value != 0 && input.dataset.requiresEndPiece === 'true'\n        );\n\n        if (!inputsWithQtyAndRequiringEnd.length) {\n            this.updateEndMissing(0);\n            return;\n        }\n\n        const inputsWithQtyAndIsEnd = this.qtyInputs.filter(\n            (input) => input.value != 0 && input.dataset.isEndPiece === 'true'\n        );\n\n        const endsQtyArr = inputsWithQtyAndIsEnd.map(\n            (input) => parseInt(input.value)\n        );\n\n        const endsQty = endsQtyArr.reduce((a, b) => a + b, 0);\n\n        this.updateEndMissing(2 - endsQty);\n    }\n\n    updateEndMissing = (endMissing) => {\n        this.endMissing = endMissing;\n\n        this.updateMissingEndWarningText();\n\n        if (this.missingEndWarning) {\n            this.missingEndWarning.dataset.active = this.endMissing > 0;\n        }\n    }\n\n    toggleFromLabels = () =>\n        this.fromPriceLabels.forEach((label) => (label.hidden = this.qtySelected));\n\n\n    toggleDisableButton = () => this.addToBasketBtn.disabled = !this.qtySelected;\n\n    renderPricesToDom = () => {\n        const normalTotal = this.sum() || this.lowestNormalItemPrice;\n        const membershipTotal =\n            this.sum(this.#membershipPrice) || this.lowestMembershipItemPrice;\n\n        this.normalTotal.innerText = this.formatPrice(normalTotal);\n        this.membershipTotal.innerText = this.formatPrice(membershipTotal);\n    }\n\n    renderLeadMessageToDom = () => {\n        const inputsWithQty = this.qtyInputs.filter(\n            (input) => input.value != 0\n        );\n        const longestLeadMessage = this.longestLeadMessage(inputsWithQty);\n\n        this.leadTimeMessage.innerHTML = longestLeadMessage;\n\n        this.fireDynamicAnchorLinkEvent()\n\n        Soho.popup();\n    }\n\n    fireDynamicAnchorLinkEvent = () => {\n        const anchorLink = this.leadTimeMessage.querySelector('.js-anchor-link');\n        if (!anchorLink) {\n            return;\n        }\n        const event = new CustomEvent(Soho.anchorLink.DYNAMIC_ADD_EVENT, {\n            detail: {\n                target: anchorLink,\n            }\n        })\n\n        document.dispatchEvent(event)\n    }\n\n    /**\n     * If no quantities are selected we want to display the lead time\n     * based on all of the unselected quantities.\n     * @param {array} quantity inputs\n     * @returns {string} longest lead time\n     */\n    longestLeadMessage = (array) => {\n        if (!array.length) {\n            return this.longestLeadMessage(this.qtyInputs);\n        }\n\n        const max = array.reduce((acc, input) => {\n            let maxLead = parseInt(acc.dataset.maxLeadTime);\n            let thisLead = parseInt(input.dataset.maxLeadTime);\n\n            return thisLead > maxLead ? input : acc;\n        });\n\n        return max.dataset.leadTimeMessage;\n    }\n\n    /**\n     * @param {string} membership\n     * @returns {array} prices\n     */\n    priceArray = (membership = this.#normalPrice) =>\n        this.qtyInputs.map((input) => parseFloat(input.dataset[membership]));\n\n    /**\n     * @param {string} membership\n     * @returns {float} sum of selected items\n     */\n    sum = (membership = this.#normalPrice) => {\n        return this.totalPrice(membership).reduce(\n            (accumulator, currentVal) => accumulator + currentVal\n        );\n    };\n\n    /**\n     * @param {string} membership\n     * @returns {array} product of prices and quantity\n     */\n    totalPrice = (membership = this.#normalPrice) =>\n        this.qtyInputs.map(\n            (input) => parseFloat(input.dataset[membership]) * input.value\n        );\n\n    /**\n     * Set the from price to the lowest item price\n     */\n    setLowestPriceOnLoad = () => {\n        this.normalTotal.innerText = this.formatPrice(\n            this.lowestNormalItemPrice\n        );\n        this.membershipTotal.innerText = this.formatPrice(\n            this.lowestMembershipItemPrice\n        );\n    };\n\n    /**\n     * Set the max lead time on load\n     */\n    setLeadTimeOnLoad = () => {\n        this.leadTimeMessage.innerHTML = this.longestLeadMessage(\n            this.qtyInputs\n        )\n\n        this.fireDynamicAnchorLinkEvent()\n    }\n\n    /**\n     *\n     * @param {float} price\n     * @returns {string} formatted price\n     */\n    formatPrice = (price) => {\n        let localeParts = this.locale.geoLocale.split('_');\n        const localesArgument = localeParts[0] + `-${this.locale.country}`;\n\n        return new Intl.NumberFormat(localesArgument, {\n            minimumFractionDigits: 2,\n            trailingZeroDisplay: \"stripIfInteger\",\n            style: \"currency\",\n            currency: window.global_e ? 'GBP' : this.locale.currency,\n        }).format(price);\n    };\n\n    init = () => {\n        if (!this.controls.length) {\n            return;\n        }\n\n        this.bind();\n        this.setLowestPriceOnLoad();\n        this.setLeadTimeOnLoad();\n        Soho.popup();\n    };\n}\n"],"sourceRoot":"../../../../resources/javascript"}