{"version":3,"file":"pdp.js","names":["#filterCategory"],"sources":["../resources/javascript/swatch/SwatchCategoryFilter.js","../resources/javascript/pdp/chooser.js","../resources/javascript/pdp/basket.js","../resources/javascript/pdp/hash.js","../resources/javascript/pdp.js"],"sourcesContent":["export class SwatchCategoryFilter {\n    constructor(container) {\n        if (!container) {\n            return;\n        }\n\n        this.container = container;\n\n        this.swatchCategorySelect = container.querySelector(\n            '[data-swatch-category-select]'\n        );\n        this.swatchCategoryContainers = container.querySelectorAll(\n            '[data-colour-category-id]'\n        );\n\n        if (!this.swatchCategorySelect) {\n            this.#filterCategory('');\n            return;\n        }\n\n        this.swatchCategorySelect.addEventListener('change', event => {\n            this.#filterCategory(event.currentTarget.value);\n        });\n\n        this.#filterCategory(this.swatchCategorySelect.value);\n    }\n\n    #filterCategory(value) {\n        const hasCategorySelection =\n            value !== undefined && value !== null && value !== '';\n\n        for (const grid of this.swatchCategoryContainers ?? []) {\n            const shouldShowContainer =\n                !hasCategorySelection ||\n                value === grid.dataset.colourCategoryId;\n\n            grid.toggleAttribute('hidden', !shouldShowContainer);\n        }\n    }\n}\n","// @ts-check\n\nimport {\n    applyOptionsToUrl,\n    initChoosersForContainer,\n    loadChooserOverlay,\n} from './chooser/chooser-helpers';\nimport { productOptionChanged } from './chooser/constants';\nimport { handleFragmentInit } from './fragments';\nimport { loadPageData } from './page';\nimport { replaceElementHTML } from './replace';\nimport { initQuantitySteppers } from './quantity-steppers';\nimport { SwatchCategoryFilter } from '../swatch/SwatchCategoryFilter.js';\nimport {\n    isOverlayOpen,\n    isQuickAddOverlayOpen,\n} from '../features/overlays/index.js';\n\nexport const initChoosers = () => {\n    handleFragmentInit(({ replace }) => {\n        if (replace?.productConfig) {\n            replaceElementHTML('.product-config', replace.productConfig);\n        }\n\n        const colorContainer = document.querySelector(\n            '[data-swatch-category-container]'\n        );\n        const swatchCategoryFilter = new SwatchCategoryFilter(colorContainer);\n        const productConfigContainer =\n            document.querySelector('.product-config');\n        initQuantitySteppers(productConfigContainer);\n\n        if (productConfigContainer instanceof HTMLElement) {\n            // Add click event handlers to any product chooser buttons, which open the\n            // corresponding chooser overlay.\n            productConfigContainer\n                .querySelectorAll(\n                    '.product-button:not(.product-button--read-only)'\n                )\n                .forEach(btn => {\n                    if (\n                        !(\n                            btn instanceof HTMLElement &&\n                            'overlayUrl' in btn.dataset\n                        )\n                    ) {\n                        return;\n                    }\n\n                    btn.addEventListener('click', () => {\n                        loadChooserOverlay(btn.dataset.overlayUrl);\n                    });\n                });\n\n            productConfigContainer\n                .querySelectorAll('[data-upsell-chooser]')\n                .forEach(btn => {\n                    btn.addEventListener('click', () => {\n                        if (\n                            btn instanceof HTMLElement &&\n                            'overlayUrl' in btn.dataset\n                        ) {\n                            loadChooserOverlay(btn.dataset.overlayUrl);\n                        }\n                    });\n                });\n\n            initChoosersForContainer(productConfigContainer);\n        }\n    });\n\n    // Auto-open a chooser overlay after page reload (e.g. \"Back to all colours\")\n    const reopenParam = new URL(window.location.href).searchParams.get(\n        'reopen'\n    );\n    if (reopenParam) {\n        const cleanUrl = new URL(window.location.href);\n        cleanUrl.searchParams.delete('reopen');\n        window.history.replaceState({}, '', cleanUrl.toString());\n\n        const buttons = document.querySelectorAll(\n            '.product-button[data-overlay-url]'\n        );\n        for (const btn of buttons) {\n            if (!(btn instanceof HTMLElement) || !btn.dataset.overlayUrl) {\n                continue;\n            }\n            // Match on the URL pathname to avoid false positives from query params\n            const overlayPath = new URL(\n                btn.dataset.overlayUrl,\n                window.location.href\n            ).pathname;\n            if (overlayPath.includes(reopenParam)) {\n                loadChooserOverlay(btn.dataset.overlayUrl);\n                break;\n            }\n        }\n    }\n\n    // When a product option is changed, load new data for the page.\n    // Will also removed has and scroll to top of page\n    document.body.addEventListener(productOptionChanged, e => {\n        // Ignore option changes while a quick-add overlay is open: the chooser\n        // overlays handle them, and we must not trigger a page reload underneath.\n        if (isQuickAddOverlayOpen()) {\n            return;\n        }\n\n        const { optionValues } = e.detail;\n\n        const url = new URL(window.location.href);\n        url.hash = '';\n\n        if (!isOverlayOpen()) {\n            window.scrollTo(0, 0);\n        }\n\n        applyOptionsToUrl(url, optionValues);\n        loadPageData(url);\n    });\n};\n","// @ts-check\n\nimport { initBasketForm } from '../features/basket';\nimport { handleFragmentInit } from './fragments';\nimport { replaceElementHTML } from './replace';\nimport { initEmbeddedListing } from '../listing/embedded';\n\n/**\n * Initialise the main add to basket form on the PDP.\n */\nexport const initBasket = () => {\n    handleFragmentInit(({ replace }) => {\n        if (replace?.addToBasket) {\n            replaceElementHTML('.product_basket', replace.addToBasket);\n        }\n\n        document\n            .querySelectorAll(\n                'form.product-details__action, form[data-add-basket]'\n            )\n            .forEach(form => {\n                if (form instanceof HTMLFormElement) {\n                    initBasketForm(form);\n                }\n            });\n\n        document.querySelectorAll('.listing--embedded').forEach(listing => {\n            initEmbeddedListing({ container: listing });\n        });\n    });\n};\n","// @ts-check\n\nimport { loadPageData } from './page';\n\nlet hashState = false;\n\nexport const initUrlHandlers = () => {\n    // On anchor click, store hash flag as true\n    document.body.addEventListener('click', e => {\n        if (!(e.target instanceof Element)) {\n            return;\n        }\n\n        const a = e.target.closest('a');\n        if (a && a.href.startsWith('#')) {\n            hashState = true;\n        }\n    });\n\n    // Check if the event is coming from an anchor, if so don't reload page.\n    window.addEventListener('popstate', e => {\n        if (hashState) {\n            e.preventDefault();\n            hashState = false;\n            return false;\n        }\n\n        loadPageData(new URL(window.location.href));\n    });\n\n    // Check for hash change, if true go to anchor if not scroll to top of page.\n    window.addEventListener('hashchange', () => {\n        const id = window.location.hash.slice(1);\n\n        if (id) {\n            document.getElementById(id)?.scrollIntoView();\n        } else {\n            window.scrollTo(0, 0);\n        }\n    });\n};\n","// @ts-check\n\nimport { onDOMContentLoaded } from './util/loaded';\nimport { initChoosers } from './pdp/chooser';\nimport { initGallery } from './pdp/gallery';\nimport { initDimensions } from './pdp/dimensions';\nimport { initTracking } from './pdp/tracking';\nimport { initInfo } from './pdp/info-overlays';\nimport { initBasket } from './pdp/basket';\nimport { initCylindo } from './pdp/cylindo';\nimport { initQuickAddBar } from './pdp/quick-add-overlay';\nimport { initUrlHandlers } from './pdp/hash';\nimport { initFinance } from './pdp/finance/index';\nimport { initPayPalMessaging } from './pdp/paypal-messaging.mjs';\n\n// Initialise bits when the DOM and deferred scripts have loaded.\nonDOMContentLoaded(() => {\n    initUrlHandlers();\n    initChoosers();\n    initGallery();\n    initDimensions();\n    initTracking();\n    initInfo();\n    initBasket();\n    initCylindo();\n    initFinance();\n    initPayPalMessaging();\n    initQuickAddBar();\n});\n"],"mappings":"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"}