{"version":3,"file":"grouped-category-97388a91.js","sources":["../../../client/src/javascripts/customer_pages/_grouped-category/calendar-dates.js","../../../client/src/javascripts/customer_pages/_grouped-category/price-and-product-create.jsx","../../../client/src/javascripts/customer_pages/_grouped-category/_common/grouped-category-base.jsx","../../../client/src/javascripts/customer_pages/_grouped-category/calendar-start-date-selector.jsx","../../../client/src/javascripts/customer_pages/_grouped-category/designer.jsx","../../../client/src/javascripts/customer_pages/_grouped-category/filter-comparison.jsx","../../../client/src/javascripts/customer_pages/_grouped-category/filter-nothing-selectable.jsx","../../../client/src/javascripts/customer_pages/_grouped-category/filter-selectors-mixin.jsx","../../../client/src/javascripts/customer_pages/_grouped-category/filter-color-criteron.jsx","../../../client/src/javascripts/customer_pages/_grouped-category/filter-image-criteron.jsx","../../../client/src/javascripts/customer_pages/_grouped-category/filter-text-criteron.jsx","../../../client/src/javascripts/customer_pages/_grouped-category/filter.jsx","../../../client/src/javascripts/customer_pages/_grouped-category/filters.jsx","../../../client/src/javascripts/customer_pages/_grouped-category/button-option.jsx","../../../client/src/javascripts/customer_pages/_grouped-category/button-option-selector.jsx","../../../client/src/javascripts/customer_pages/_grouped-category/button-option-selectors.jsx","../../../client/src/javascripts/customer_pages/_grouped-category/option-selector.jsx","../../../client/src/javascripts/customer_pages/_grouped-category/option-selectors.jsx","../../../client/src/javascripts/customer_pages/_grouped-category/product-description.jsx","../../../client/src/javascripts/customer_pages/_utils/tools/image-tools.js","../../../client/src/javascripts/customer_pages/_grouped-category/folded-card-product-image.jsx","../../../client/src/javascripts/customer_pages/_grouped-category/metallic-card-product-image.jsx","../../../client/src/javascripts/customer_pages/_grouped-category/product-image.jsx","../../../client/src/javascripts/customer_pages/_grouped-category/product-image-thumbnail.jsx","../../../client/src/javascripts/customer_pages/_grouped-category/product-video.jsx","../../../client/src/javascripts/customer_pages/_grouped-category/product-images.jsx","../../../client/src/javascripts/customer_pages/_grouped-category/product-not-available.jsx","../../../client/src/javascripts/customer_pages/_grouped-category/product-flags.jsx","../../../client/src/javascripts/customer_pages/_grouped-category/grouped-category.jsx"],"sourcesContent":["const defaultDates = [\n {\n from: {day: 1, month: 10},\n to: {day: 31, month: 12},\n defaultsTo: { month: 1, year: 1 }\n },\n {\n from: {day: 1, month: 1},\n to: {day: 31, month: 1},\n defaultsTo: { month: 1, year: 0 }\n },\n {\n from: {day: 1, month: 2},\n to: {day: 31, month: 9},\n defaultsTo: { month: 13, year: 0 } // 13 indicates next month\n }\n];\nconst backDates = [{\n from: {day: 1, month: 1},\n to: {day: 30, month: 6},\n earliest: { month: 1, year: 0 }\n }, {\n from: {day: 1, month: 7},\n to: {day: 31, month: 12},\n earliest: { month: 7, year: 0 }\n }\n];\nconst forwardDate = {month: 1, year: 5};\n\nconst CalendarDates = {\n todayDate: new Date(),\n\n getOptions() {\n // Generate Month Options\n const monthNames = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'];\n const { earliest } = this.findPeriod(backDates);\n let monthOptions = [];\n for (let i = earliest.year; i <= forwardDate.year; i++) {\n const startMonth = (i === earliest.year) ? earliest.month - 1 : 0;\n const noOfMonths = (i === forwardDate.year) ? forwardDate.month : 12;\n\n for (let j = startMonth; j < noOfMonths; j++) {\n const date = new Date(this.todayDate.getFullYear() + i, j);\n monthOptions.push(\n {\n label: `${ monthNames[date.getMonth()]}, ${ date.getFullYear() }`,\n value: date.getTime()\n }\n );\n }\n }\n\n return monthOptions;\n },\n\n getDefaultValue() {\n // Get Default Starting Date\n const { defaultsTo: { year, month } } = this.findPeriod(defaultDates);\n const defaultMonth = month <= 12 ? month - 1 : this.todayDate.getMonth() + (month - 12);\n const defaultTimeStamp = (new Date(this.todayDate.getFullYear() + year, defaultMonth)).getTime();\n\n return this.getOptions().find((mO) =>\n mO.value === defaultTimeStamp\n );\n },\n findPeriod(periodsArray) {\n return periodsArray.find((period) => {\n return (\n (period.from.month - 1) <= CalendarDates.todayDate.getMonth() &&\n (period.from.day) <= CalendarDates.todayDate.getDate() &&\n (period.to.month - 1) >= CalendarDates.todayDate.getMonth() &&\n (period.to.day) >= CalendarDates.todayDate.getDate()\n );\n }) || periodsArray[0];\n }\n}\n\nexport default CalendarDates;\n","import createReactClass from 'create-react-class';\n'use strict';\n\n// Import Libraries\nimport React from 'react';\nimport classNames from 'classnames';\n// Import JSX Modules\nimport Price from './price';\nimport ProgressButton from '../_utils/progress-button';\n// Import JS Modules\nimport { PrismUI, builderDispatch } from '../_utils/ui';\nimport genericHelpers from '../_utils/generic-helpers';\nimport translate from '../_utils/tools/translate';\nimport Currency from '../_utils/tools/currency';\nimport QuantityPricingTools from './quantity-pricing-tools';\nimport UrlBuilder from '../_utils/url-building';\n\n// -----------------------------------------------------------\n// PriceAndProductCreate\n// -----------------------------------------------------------\nvar PriceAndProductCreate = createReactClass({\n render() {\n if (this.props.products.length === 0)\n return null;\n\n const { product, $price } = (() => {\n if (this.props.products.length === 1) {\n const [product] = this.props.products;\n\n return {\n product,\n $price: this.renderPrice(product, true)\n };\n }\n\n const product = this.productWithMinimumPrice();\n\n return {\n product,\n $price: this.renderPrice(product)\n };\n })();\n\n const $quantityDropdown = (() => {\n if (product.show_quantity_dropdown) {\n return (\n <div className=\"col-12\">\n <div className=\"row \">\n <div className=\"col-6 offset-6 col-md-12 offset-md-0 text-sm-right\">\n { this.renderQuantityDropdown(product) }\n </div>\n </div>\n </div>\n );\n }\n })();\n\n const action = this.action(product);\n\n return (\n <div className='row price-and-create'>\n { $quantityDropdown }\n <div className=\"col-6 col-lg-12 product-price\">\n <h2 className=\"price text-lg-right\">\n { $price }\n </h2>\n </div>\n { this.renderCreateNow(action, $price) }\n </div>\n );\n },\n\n renderCreateNow(action, price) {\n const isMobile = (() => {\n if (typeof document !== 'undefined') {\n return document.documentElement.clientWidth < 768;\n }\n \n return false;\n })();\n\n if (isMobile) {\n return (\n <div className=\"row price-and-create-mobile\">\n <div className=\"col-6 col-lg-12 product-price\">\n <div className=\"price text-lg-right\">\n { price }\n </div>\n </div>\n <div className=\"col-6 col-lg-12 create-now\">\n {\n <ProgressButton href={ action }\n className=\"btn btn-primary btn-lg btn-block create-now\"\n onClick={ this.props.onClick }>\n { this.renderProgressButtonLabel(action) }\n </ProgressButton>\n }\n </div>\n </div>\n );\n } else {\n return (\n <div className=\"col-6 col-lg-12 create-now\">\n {\n <ProgressButton href={ action }\n className=\"btn btn-primary btn-lg btn-block create-now\"\n onClick={ this.props.onClick }>\n { this.renderProgressButtonLabel(action) }\n </ProgressButton>\n }\n </div>\n );\n }\n },\n\n renderProgressButtonLabel(action) {\n return /^\\/product\\/add/.test(action) ? `Add to ${ translate('Cart') }` : 'Create Now';\n },\n\n renderQuantityDropdown(product) {\n const {copies} = this.props;\n\n return (\n <div className=\"row no-gutters align-items-center quantity\">\n <label className=\"col mr-2\" id=\"quantity-and-price-label\">Quantity</label>\n <div className=\"dropup\">\n <button className=\"btn btn-link dropdown-toggle\"\n role=\"combobox\"\n data-toggle=\"dropdown\" aria-label=\"quantity\">\n {copies}\n </button>\n <div className=\"dropdown-menu dropdown-menu-right\"\n aria-labelledby=\"quantity-and-price-label\">\n {\n (new QuantityPricingTools(product)).generateOptions().map(({product, quantity, unitPrice, cost}) => {\n const active = copies == quantity;\n\n return (\n <button key={ quantity }\n className={ classNames('btn btn-link dropdown-item', {active}) }\n onClick={ this.handleCopiesChanged.bind(this, quantity) }>\n <i className={ classNames('fas fa-check mr-2', {'invisible': !active}) } />\n {quantity} {product} {Currency.format(cost)} <small>({Currency.format(unitPrice)} each)</small>\n </button>\n );\n })\n }\n </div>\n </div>\n </div>\n );\n },\n\n renderPrice(product, displayWas) {\n const copies = this.props.copies;\n\n const { price, includeFrom } = (() => {\n const options = this.productOptions(product).filter(option => option.affectsPrice);\n\n if (options.length === 1) {\n const [option] = options;\n\n return {\n price: option.minimumPrice * copies,\n includeFrom: option.priceIsFrom\n };\n }\n\n const price = (() => {\n if (product.show_quantity_dropdown) {\n return (new QuantityPricingTools(product)).getUnitPriceForQuantity(copies) * copies;\n }\n\n return product.minimum_price;\n })();\n\n return {\n price,\n includeFrom: this.shouldDisplayFrom()\n };\n })();\n\n const wasPrice = (() => {\n if (!displayWas) {\n return;\n }\n\n const wasPrice = (product.was_price || []).reduce((memo, wp) => {\n if (wp.quantity <= copies) {\n return Object.assign({}, wp, {value: wp.value * copies});\n }\n\n return memo;\n }, {});\n\n if (genericHelpers.isWasPriceValid({ was_price: wasPrice, price })) {\n return wasPrice.value;\n }\n })();\n\n return (\n <Price now={ price }\n was={ wasPrice }\n includeFrom={ includeFrom }\n displayWas={ displayWas} />\n );\n },\n\n shouldDisplayFrom() {\n const productPrice = this.props.products[0].minimum_price;\n for (let i = 0; i < this.props.products.length; i++) {\n let product = this.props.products[i];\n if ((product.price_is_from) || (productPrice !== product.minimum_price)) {\n return true;\n }\n }\n return false;\n },\n\n productWithMinimumPrice() {\n return this.props.products.reduce((memo, product) => {\n return memo.minimum_price < product.minimum_price ? memo : product;\n });\n },\n\n action(product) {\n // Determines the Create Now button action\n const params = {\n theme: this.props.theme,\n copies: this.props.copies,\n selected_delivery_option: this.props.deliveryOption && this.props.deliveryOption.key\n };\n\n if (this.props.variantName) {\n params.variant_name = this.props.variantName;\n }\n\n if (this.props.selectedDeliveryOptions) {\n params.selected_delivery_option = this.props.selectedDeliveryOptions\n }\n\n if (product.is_calendar && this.props.calendar_start_date) {\n const date = new Date(this.props.calendar_start_date);\n params.yearSel = date.getFullYear();\n params.monthSel = date.getMonth() + 1;\n }\n\n this.productOptions(product).forEach(option => {\n params['custom_' + option.key] = option.value.toLowerCase();\n });\n\n const queryString = UrlBuilder.buildURLQuery(params);\n if (product.action.includes('?')) {\n return product.action + '&' + UrlBuilder.buildURLQuery(params);\n }\n\n return product.action + '?' + queryString;\n },\n\n productOptions(product) {\n return product.options.map(option => {\n const key = option.id,\n value = (this.props.options[key] && this.props.options[key].value) || option.options[0].value,\n subOption = option.options.find(option => option.value == value);\n\n return {\n key,\n value,\n affectsPrice: option.affects_price,\n minimumPrice: subOption.minimum_price,\n priceIsFrom: subOption.price_is_from\n };\n });\n },\n\n handleCopiesChanged(value) {\n builderDispatch.dispatch({\n type: PrismUI.EVENT_QUANTITY_CHANGED,\n value\n });\n }\n});\n\nexport default PriceAndProductCreate;\n","import React from 'react';\n\n// Import JS Modules\nimport PropTypes from 'prop-types';\nimport parseQueryString from '../../_utils/parse-query-string';\nimport UrlBuilder from '../../_utils/url-building';\nimport setCanonicalUrl from '../../_utils/tools/canonical-url';\nimport merge from 'lodash/merge';\nimport QuantityPricingTools from '../quantity-pricing-tools';\nimport PriceAndProductCreate from '../price-and-product-create';\n\nclass GroupedCategoryBase extends React.PureComponent {\n constructor(props) {\n super(props);\n\n this.productAndFilters = React.createRef();\n\n this.state = {\n filters: {},\n options: {},\n copies: this.getInitialCopies(this.props.data.products),\n };\n }\n\n componentDidMount() {\n this.setDefaultFilters();\n }\n\n getCurrentProductIdAccordingToUrl = () => {\n return parseInt(parseQueryString().product, 10);\n };\n\n getCurrentShelfFiltersFromUrl = () => {\n // Try to map Shelf Filters to Item's\n // If a map fails, the corresponding filter will be unselected\n return Object.entries(parseQueryString()).reduce(\n (filters, [key, value]) => {\n value = value.replace(/\\\"/g, '');\n\n const product = this.props.data.products.find(\n p => (p.filters[key] || '').replace(/\\\"/g, '') === value\n );\n\n if (product) {\n filters[key] = product.filters[key];\n }\n\n return filters;\n },\n {}\n );\n };\n\n getDefaultFilters = () => {\n const defaultFilters = {};\n this.props.data.filters\n .filter(function(filter) {\n return filter.options.some(option => option.default === true);\n })\n .forEach(function(filter) {\n const defaultOptionTitle =\n (filter.options || {}).find(option => option.default === true) || {};\n if (Object.keys(defaultOptionTitle).length > 0) {\n defaultFilters[filter.title] = defaultOptionTitle.title;\n }\n });\n return defaultFilters;\n };\n\n setDefaultFilters = (\n productId = this.getCurrentProductIdAccordingToUrl()\n ) => {\n const productFilters = (() => {\n const product = this.props.data.products.find(p => p.id == productId);\n\n if (product) {\n return product.filters;\n }\n })();\n\n const mergedFilters = merge(\n this.getDefaultFilters(),\n this.getCurrentShelfFiltersFromUrl()\n );\n\n this.setState({\n filters: productFilters || mergedFilters,\n });\n\n const { canonical_url_parameters: canonicalUrlParameters } = this.props;\n\n setCanonicalUrl(window, canonicalUrlParameters);\n };\n\n getInitialCopies = products => {\n const currentProductId = this.getCurrentProductIdAccordingToUrl();\n const product =\n products.find(prod => prod.id === currentProductId) || products[0];\n\n if (!product) return;\n\n const [theme] = product.themes,\n defaultCopies = product.set_copies && theme && theme.default_copies;\n\n return (\n defaultCopies ||\n new QuantityPricingTools(product).currentOrFirstAvailableCopies(1)\n );\n };\n\n handleCreateNowClick = (e, button) => {\n const currentProducts = this.getCurrentProducts();\n\n if (currentProducts.length > 1) {\n e.preventDefault();\n\n this.productAndFilters.current.scrollIntoView({ behavior: 'smooth', block: 'start' });\n\n this.setState(\n {\n validateOptionsChosen: true,\n },\n () => {\n button.reset();\n }\n );\n }\n };\n\n getCurrentProducts = () => {\n const { filters } = this.state;\n let { products } = this.props.data;\n\n for (const filter in filters) {\n products = products.filter(\n product =>\n product.filters[filter] === filters[filter] &&\n product.delivery_options.length\n );\n }\n\n return products;\n };\n\n handleOptionChange = (name, value, asset) => {\n this.setState({\n options: {\n ...this.state.options,\n [name]: {\n value: value,\n asset: asset\n }\n },\n });\n };\n\n handleFilterCriteronSelected = (title, criteron) => {\n this.setState({\n filters: {\n ...this.state.filters,\n [title]: criteron,\n },\n options: {}\n });\n };\n\n setInnerHtmlDescription(description) {\n return (\n <div\n className=\"product-description-text\"\n dangerouslySetInnerHTML={{ __html: description }}\n />\n );\n }\n\n renderPriceAndProductCreate = (\n currentProducts,\n selectedTheme,\n calendarStartDate = null,\n copies,\n options,\n variantName,\n selectedDeliveryOptions\n ) => {\n return (\n <PriceAndProductCreate\n products={currentProducts}\n theme={selectedTheme && selectedTheme.name}\n calendar_start_date={calendarStartDate}\n options={options}\n copies={copies}\n onClick={this.handleCreateNowClick}\n variantName={variantName}\n selectedDeliveryOptions={selectedDeliveryOptions}\n />\n );\n };\n\n setPageAttributesForProduct = (...currentProductParams) => {\n\n if (typeof window === 'undefined' || typeof document === 'undefined') {\n return;\n }\n\n // dont' start manipulating the push state until we've seen the default product\n this.pushUrlState.call(\n this,\n !this.defaultProductHasBeenSeen,\n ...currentProductParams\n );\n this.defaultProductHasBeenSeen = true;\n };\n\n pushUrlState = (\n firstTime,\n currentProduct,\n selectedTheme,\n defaultDesignCode,\n variantName,\n selectedDeliveryOptions\n ) => {\n if (\n window.history &&\n (this.getCurrentProductIdAccordingToUrl() != currentProduct.id ||\n firstTime)\n ) {\n // url doesn't match the current product\n const params = {\n product: currentProduct.slug || currentProduct.id, // || currentProduct.id for zero-downtime only\n theme: selectedTheme && selectedTheme.name,\n ...(defaultDesignCode && { design_code: defaultDesignCode }),\n };\n\n if (variantName) {\n params.variant_name = variantName\n }\n\n if (selectedDeliveryOptions) {\n params.selected_delivery_options = selectedDeliveryOptions\n }\n\n // We want to persist certain params for tracking / analytics purposes\n const queryParams = parseQueryString();\n const whitelistedParamsRegex = /^utm_.*$|^veh$|^adid$/;\n\n for (const key in queryParams) {\n if (key.match(whitelistedParamsRegex)) {\n params[key] = queryParams[key];\n }\n }\n\n const path = `${window.location.origin +\n window.location.pathname}?${UrlBuilder.buildURLQuery(params)}`;\n if (firstTime) {\n window.history.replaceState(\n {\n product_id: currentProduct.id,\n },\n '',\n path\n );\n } else {\n window.history.pushState(\n {\n product_id: currentProduct.id,\n },\n '',\n path\n );\n }\n }\n const { canonical_url_parameters: canonicalUrlParameters } = this.props;\n\n setCanonicalUrl(window, canonicalUrlParameters);\n };\n\n handlePopState = (e) => {\n const { state } = e;\n if (state) {\n this.setDefaultFilters(state.product_id);\n }\n };\n\n handlePageShow(e) {\n let historyTraversal =\n e.persisted ||\n (typeof window.performance != 'undefined' &&\n window.performance.getEntriesByType('navigation')[0].type ===\n 'back_forward');\n if (historyTraversal) {\n window.location.reload(true);\n }\n }\n}\n\nGroupedCategoryBase.propTypes = {\n canonical_url_parameters: PropTypes.arrayOf(PropTypes.string),\n};\n\nGroupedCategoryBase.defaultProps = {\n canonical_url_parameters: [],\n};\n\nexport default GroupedCategoryBase;\n\n","'use strict';\n\n// Import Libraries\nimport React from 'react';\n// Import JSX Modules\nimport Select from '../_utils/select-wrapper';\nimport CalendarDates from './calendar-dates';\n\nexport default class CalendarStartDateSelector extends React.Component {\n constructor(props) {\n super(props);\n this.monthOptions = CalendarDates.getOptions();\n this.handleChange = this.handleChange.bind(this);\n }\n render() {\n const selectedOption = this.monthOptions.find((mO) => mO.value === this.props.value) || CalendarDates.getDefaultValue();\n\n return (\n <div className=\"filter\">\n <div className=\"title-and-value\">\n <label for=\"startingMonthSelect\">\n <strong className=\"title\">Starting Month:</strong>\n </label>\n <span aria-hidden=\"true\"className=\"value\">{ selectedOption.label }</span>\n <div className=\"list\">\n <Select options={ this.monthOptions }\n value={ selectedOption.value }\n onChange={ this.handleChange }\n id='startingMonthSelect' />\n </div>\n </div>\n </div>\n );\n }\n\n handleChange(value) {\n this.props.onChange(parseInt(value, 10));\n }\n}\n","import createReactClass from 'create-react-class';\n'use strict';\n\n// Import Libraries\nimport React from 'react';\n\n// -----------------------------------------------------------\n// Designer\n// -----------------------------------------------------------\nvar Designer = createReactClass({\n render() {\n return <p className=\"designers\">\n <span>By: </span>\n <a href={ this.props.url + '?designer=' + encodeURIComponent(this.props.name.toLowerCase()) }>\n { this.props.name }\n </a>\n </p>;\n }\n});\n\nexport default Designer;\n","'use strict';\n\n// Import Libraries\nimport React from 'react';\nimport ReactDOM from 'react-dom';\nimport PropTypes from 'prop-types';\nimport ReactDOMServer from 'react-dom/server';\nimport DeliveryOptionCalculator from \"../_utils/_delivery-options/calculator\";\n// Import JS Modules\n\n// -----------------------------------------------------------\n// FilterComparison\n// -----------------------------------------------------------\nclass FilterComparison extends React.Component {\n\n componentDidMount() {\n if (typeof window !== 'undefined') {\n this.createPopover();\n window.addEventListener('touchend', this.hideFlyoutFromOutsideTouch);\n }\n }\n\n componentWillUnmount() {\n if (typeof window !== 'undefined') {\n window.removeEventListener('touchend', this.hideFlyoutFromOutsideTouch);\n }\n }\n\n render() {\n if (this.props.fields.length && this.props.options.some(o => Object.keys(o.comparison_data).length)) {\n return (\n <a ref={ref => this.trigger = ref}\n href=\"#\"\n aria-label=\"More information about these options\"\n tabIndex=\"0\"\n role=\"button\"\n onClick={e => e.preventDefault()}>\n <i className=\"fa fa-info-circle\" />\n </a>\n );\n }\n\n return null;\n }\n\n hideFlyoutFromOutsideTouch = (event) => {\n if ($('.popover').length > 0 && $(event.target).closest('.filter-comparison').length === 0) {\n $(ReactDOM.findDOMNode(this.trigger)).popover('hide');\n }\n }\n\n createPopover() {\n if (!this.trigger) {\n return;\n }\n\n const $trigger = $(ReactDOM.findDOMNode(this.trigger));\n\n $trigger.popover({\n container: 'body',\n content: this.popoverHTML,\n html: true,\n placement: 'auto',\n template: ReactDOMServer.renderToString(\n <div className=\"filter-comparison popover\" role=\"tooltip\">\n <div className=\"arrow\" />\n <h3 className=\"popover-header\" />\n <div className=\"popover-body\" />\n </div>\n ),\n trigger: 'ontouchstart' in window ? 'hover click' : 'hover click'\n });\n }\n\n get popoverHTML() {\n return this.props.options.map(this.renderOption, this).\n filter(Boolean).\n map(ReactDOMServer.renderToString).\n join('');\n }\n\n renderOption(option, index) {\n const $rows = this.props.fields.slice(1).map((field, index) => this.renderRow(option, field, index)).\n filter(Boolean);\n\n if ($rows.length) {\n return (\n <div key={index} className='comparison'>\n {this.renderHeader(option, this.props.fields[0])}\n <div className=\"row\">\n {\n this.context.useIconsInComparisonFields && option.image ? (\n <div className=\"col-4\">\n <img className=\"img-fluid comparison-image\" src={option.image} />\n </div>\n ) : null\n }\n <div className=\"col\">\n <ul>\n {$rows}\n </ul>\n </div>\n </div>\n </div>\n );\n }\n }\n\n renderHeader(option, field) {\n const data = this.comparisonData(option, field);\n\n if (data) {\n return (\n <p className='comparison-header m-0'>\n {data}\n {this.getDeliveryOptionsIconsForKeys(\n this.deliveryOptionsForFilterField(option),\n this.props.deliveryOptions\n )}\n </p>\n );\n }\n\n return null;\n }\n\n renderRow(option, field, index) {\n const data = this.comparisonData(option, field);\n\n if (data) {\n return (\n <li key={index}>\n {data}\n </li>\n );\n }\n\n return null;\n }\n\n getDeliveryOptionsIconsForKeys(deliveryOptionsForFilter, deliveryOptions) {\n const { hasShipping, hasOneHourPickup, hasSameDayPickup } = DeliveryOptionCalculator.productsDeliveryOptionsTiers(deliveryOptionsForFilter, deliveryOptions);\n\n return (\n <span>\n {hasShipping ? <i className=\"fas fa-truck\" /> : null}\n {hasOneHourPickup ? <i className=\"far fa-clock\" /> : null}\n {hasSameDayPickup ? <i className=\"fas fa-store\" /> : null}\n </span>\n );\n }\n\n comparisonData(option, field) {\n return (option.comparison_data || {})[field];\n }\n\n deliveryOptionsForFilterField(option) {\n const deliveryOptionsForFilter = [];\n\n (this.props.products || []).forEach(function (item) {\n for (let key in item.filters) {\n if (item.filters.hasOwnProperty(key) && (item.filters[key] === option.title)) {\n item.delivery_options.forEach(function (opt) {\n if (deliveryOptionsForFilter.indexOf(opt) === -1) {\n deliveryOptionsForFilter.push(opt);\n }\n })\n }\n }\n });\n\n return deliveryOptionsForFilter;\n }\n}\n\nFilterComparison.contextTypes = {\n useIconsInComparisonFields: PropTypes.bool\n};\n\nexport default FilterComparison;\n","import React from 'react';\nimport PropTypes from 'prop-types';\n\nimport DecapitalisedTitle from '../_utils/decapitalised-title';\nimport FilterComparison from './filter-comparison';\nimport genericHelpers from '../_utils/generic-helpers';\n\nexport default function FilterNothingSelectable({ level, option }) {\n return (\n <div className='row filter filter__single-choice'>\n <div className='col-12 title-and-value'>\n <strong className='title'>\n <DecapitalisedTitle>{genericHelpers.tidyTitleFilter(level.title)}</DecapitalisedTitle>\n :\n </strong>\n <FilterComparison fields={level.comparison_fields}\n options={level.options} />\n <span className=\"value\">{option.title}</span>\n </div>\n </div>\n );\n}\n\nFilterNothingSelectable.propTypes = {\n level: PropTypes.shape({\n title: PropTypes.string,\n comparison_fields: PropTypes.array,\n options: PropTypes.array,\n }).isRequired,\n option: PropTypes.shape({\n title: PropTypes.string,\n }).isRequired,\n}\n","\nimport React from 'react';\n\n// -----------------------------------------------------------\n// FilterSelectorsMixin\n// -----------------------------------------------------------\nconst FilterSelectorsMixin = {\n componentDidUpdate() {\n // Calculate right angle for disabled option css:\n // Math.atan(h / w) * 180 / 3.14159 <= Formula\n if (this.props.disabled) {\n const option = $(this.refs.option);\n\n const deg = Math.atan(option.outerHeight() / option.outerWidth()) * (180 / 3.14159) - 1;\n const lineWidth = Math.sqrt(option.outerWidth() * option.outerWidth() + option.outerHeight() * option.outerHeight());\n\n $(this.refs.disabledOverlay).css({\n '-webkit-transform': `rotate(-${deg}deg)`,\n '-moz-transform': `rotate(-${deg}deg)`,\n '-ms-transform': `rotate(-${deg}deg)`,\n '-o-transform': `rotate(-${deg}deg)`,\n transform: `rotate(-${deg}deg)`,\n '-webkit-transform-origin': 'bottom left',\n '-moz-transform-origin': 'bottom left',\n '-ms-transform-origin': 'bottom left',\n '-o-transform-origin': 'bottom left',\n 'transform-origin': 'bottom left',\n width: `${lineWidth}px`,\n });\n }\n },\n disabledOverlay() {\n return this.props.disabled && <div className=\"disabled-line\" ref=\"disabledOverlay\" />;\n },\n handleSelected() {\n this.props.onSelected(this.props.title);\n },\n handleMouseEnter() {\n this.props.onMouseEnter(this.props.title);\n },\n handleMouseLeave() {\n this.props.onMouseLeave(this.props.title);\n },\n};\n\nexport default FilterSelectorsMixin;\n","import createReactClass from 'create-react-class';\n'use strict';\n\n// Import Libraries\nimport React from 'react';\nimport classNames from 'classnames';\n// Import JSX Modules\nimport FilterSelectorsMixin from './filter-selectors-mixin';\n\n// -----------------------------------------------------------\n// FilterColorCriteron\n// -----------------------------------------------------------\nconst FilterColorCriteron = createReactClass({\n mixins: [FilterSelectorsMixin],\n render() {\n const label = this.props.title.toLowerCase();\n\n return (\n <button\n className={classNames('btn selector square', { selected: this.props.selected, disabled: this.props.disabled })}\n ref='option'\n aria-disabled={this.props.disabled}\n aria-label={label}\n aria-pressed={this.props.selected}\n onMouseEnter={this.handleMouseEnter}\n onMouseLeave={this.handleMouseLeave}\n onClick={this.handleSelected}\n >\n <div className=\"selector-colour\" style={{ background: label }} />\n {this.disabledOverlay()}\n </button>\n );\n }\n});\n\nexport default FilterColorCriteron;\n","import createReactClass from 'create-react-class';\n'use strict';\n\n// Import Libraries\nimport React from 'react';\nimport classNames from 'classnames';\n// Import JSX Modules\nimport FilterSelectorsMixin from './filter-selectors-mixin';\n\n// -----------------------------------------------------------\n// FilterImageCriteron\n// -----------------------------------------------------------\nconst FilterImageCriteron = createReactClass({\n mixins: [FilterSelectorsMixin],\n render() {\n return (\n <button\n className={classNames('btn selector square', { selected: this.props.selected, disabled: this.props.disabled })}\n ref='option'\n aria-disabled={this.props.disabled}\n aria-label={this.props.title}\n aria-pressed={this.props.selected}\n onMouseEnter={this.handleMouseEnter}\n onMouseLeave={this.handleMouseLeave}\n onClick={this.handleSelected}\n >\n <img src={this.props.image} className=\"img-fluid mx-auto\" alt={this.props.title} />\n {this.disabledOverlay()}\n </button>\n );\n }\n});\n\nexport default FilterImageCriteron;\n","import createReactClass from 'create-react-class';\n'use strict';\n\n// Import Libraries\nimport React from 'react';\nimport classNames from 'classnames';\n// Import JS Modules\nimport DecapitalisedTitle from '../_utils/decapitalised-title';\nimport AppleDeviceNameCapitaliser from '../_utils/apple-device-name-capitaliser';\n// Import JSX Modules\nimport FilterSelectorsMixin from './filter-selectors-mixin';\n\n// -----------------------------------------------------------\n// FilterTextCriteron\n// -----------------------------------------------------------\n\nconst FilterTextCriteron = createReactClass({\n mixins: [FilterSelectorsMixin],\n render() {\n return (\n <button\n className={classNames('btn selector text mw-100 text-truncate', { selected: this.props.selected, disabled: this.props.disabled })}\n ref=\"option\"\n aria-disabled={this.props.disabled}\n aria-label={this.props.title}\n aria-pressed={this.props.selected}\n onMouseEnter={this.handleMouseEnter}\n onMouseLeave={this.handleMouseLeave}\n onClick={this.handleSelected}\n >\n <DecapitalisedTitle>\n <AppleDeviceNameCapitaliser>\n {this.props.title}\n </AppleDeviceNameCapitaliser>\n </DecapitalisedTitle>\n {this.disabledOverlay()}\n </button>\n );\n }\n});\n\nexport default FilterTextCriteron;\n","import createReactClass from 'create-react-class';\n'use strict';\n\n// Import Libraries\nimport React from 'react';\nimport PropTypes from 'prop-types';\n// Import JSX Modules\nimport DecapitalisedTitle from '../_utils/decapitalised-title';\nimport AppleDeviceNameCapitaliser from '../_utils/apple-device-name-capitaliser';\nimport FilterColorCriteron from './filter-color-criteron';\nimport FilterImageCriteron from './filter-image-criteron';\nimport FilterTextCriteron from './filter-text-criteron';\nimport FilterComparison from './filter-comparison';\n// Import JS Modules\nimport genericHelpers from '../_utils/generic-helpers';\nimport filterPropertyTitleToUpperCase from '../_utils/product-filter-property-title-to-uppercase';\n\nconst Filter = createReactClass({\n getInitialState() {\n return {\n };\n },\n render() {\n const $criteria = this.props.level.options.map((criteron, i) => {\n const disabled = !this.props.currentProducts.some(product => product.filters[this.props.level.title] === criteron.title);\n\n return React.createElement(this.selectorType(), {\n key: criteron.title + i,\n title: filterPropertyTitleToUpperCase(criteron.title),\n image: criteron.image,\n selected: criteron.title === this.props.selected,\n disabled,\n onSelected: this.handleCriteronSelected,\n onMouseEnter: this.handleCriteronOnMouseEnter,\n onMouseLeave: this.handleCriteronOnMouseLeave\n });\n });\n\n return (\n <div className=\"clearfix filter filter__multiple-choice\">\n <div className=\"d-flex align-content-center title-and-value mw-100\">\n <strong className=\"title\"><DecapitalisedTitle>{genericHelpers.tidyTitleFilter(this.props.level.title)}</DecapitalisedTitle>:</strong>\n <FilterComparison\n fields={this.props.level.comparison_fields}\n options={this.props.level.options}\n products={this.props.products}\n deliveryOptions={this.props.deliveryOptions}\n />\n {this.renderLabel()}\n </div>\n <ul className=\"list-inline\">\n {\n $criteria.map(($criteron, i) => (\n <li className=\"list-inline-item mw-100\" key={i}>\n {$criteron}\n </li>\n ))\n }\n </ul>\n </div>\n );\n },\n renderLabel() {\n const label = filterPropertyTitleToUpperCase(this.state.label || this.props.selected);\n if (label) {\n return (\n <span className=\"value text-truncate\" key={label}>\n <DecapitalisedTitle>\n <AppleDeviceNameCapitaliser>\n {label}\n </AppleDeviceNameCapitaliser>\n </DecapitalisedTitle>\n </span>\n );\n }\n\n if (this.context.validateOptionsChosen) {\n return (\n <span className=\"no-capitalize error-text\">\n Choose an option \n <i className=\"validation-marker validation-marker-error fas fa-exclamation-circle\">\n <span className=\"sr-only\">Please select an option</span>\n </i>\n </span>\n );\n }\n\n return (\n <span className=\"no-capitalize\">\n Choose an option\n </span>\n );\n },\n selectorType() {\n if (this.isColor())\n return FilterColorCriteron;\n\n if (this.isImage())\n return FilterImageCriteron;\n\n return FilterTextCriteron;\n },\n isColor() {\n const name = this.props.level.title.toLowerCase();\n\n return ['color', 'colour'].some(term => name === term);\n },\n isImage() {\n const [option] = this.props.level.options;\n\n return option && option.image && this.context.useIconsNotTextInFilters;\n },\n handleCriteronOnMouseEnter(label) {\n this.setState({ label: label });\n },\n handleCriteronOnMouseLeave() {\n this.setState({ label: undefined });\n },\n handleCriteronSelected(filterCriteron) {\n this.props.onCriteronSelected(this.props.level.title, (c => c && c.toLowerCase())(filterCriteron));\n }\n});\n\nFilter.contextTypes = {\n validateOptionsChosen: PropTypes.bool,\n useIconsNotTextInFilters: PropTypes.bool\n};\n\nexport default Filter;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport cloneDeep from 'lodash.clonedeep';\n\nimport FilterNothingSelectable from './filter-nothing-selectable';\nimport Filter from './filter';\n\nconst optionsForLevel = (level, products) => {\n return level.options.filter(option =>\n products.some(product => product.filters[level.title] === option.title)\n );\n};\n\nconst filteredProducts = (level, products, selectedProp) => {\n const selected = cloneDeep(selectedProp);\n delete selected[level.title];\n\n // Should take care of all other selected filter but not itself\n if (Object.keys(selected).length) {\n return Object.keys(selected).reduce(\n (acc, filter) => acc.filter(product => product.filters[filter] === selected[filter]), products);\n }\n\n return products;\n}\n\nexport default function Filters(props) {\n const { products, selected, levels, deliveryOptions, onCriteronSelected } = props;\n const $filters = [];\n\n levels.forEach(level => {\n let $filter;\n\n // do the products include this option?\n if (products.some(product => product.filters[level.title] && level.options.map(option => option.title).indexOf(product.filters[level.title]) > -1)) {\n const options = optionsForLevel(level, products);\n\n if (options.length === 1) {\n $filter = <FilterNothingSelectable key={level.title} level={level} option={options[0]} />;\n } else {\n $filter = <Filter\n key={level.title}\n level={level}\n selected={selected[level.title]}\n products={products}\n currentProducts={filteredProducts(level, products, selected)}\n deliveryOptions={deliveryOptions}\n onCriteronSelected={onCriteronSelected} />\n }\n }\n\n if ($filter) {\n $filters.push($filter);\n }\n });\n\n if ($filters.length === 0) {\n return <div dangerouslySetInnerHTML={{ __html: products[0].absence_of_options_message }} />; // eslint-disable-line react/no-danger\n }\n\n return (<div>{$filters}</div>);\n}\n\nFilters.propTypes = {\n products: PropTypes.arrayOf(PropTypes.object).isRequired,\n selected: PropTypes.object, // eslint-disable-line react/forbid-prop-types\n levels: PropTypes.arrayOf(PropTypes.object),\n deliveryOptions: PropTypes.arrayOf(PropTypes.object).isRequired,\n onCriteronSelected: PropTypes.func.isRequired,\n}\n\nFilters.defaultProps = {\n selected: {},\n levels: [],\n}\n","import React from 'react';\nimport classNames from 'classnames';\n\nfunction ButtonOption({\n asset,\n name,\n value,\n handleOptionOnMouse,\n handleOptionOnMouseLeave,\n handleChange,\n disabled,\n selected,\n}) {\n const handleOnChangeOptions = () => {\n handleChange(value, asset);\n };\n\n const handleOptionOnMouseEnter = () => handleOptionOnMouse(name);\n\n return (\n <li className=\"list-inline-item mw-100\">\n <button\n className={classNames('btn selector text mw-100 text-truncate', {\n selected: selected,\n })}\n aria-disabled={disabled}\n aria-label=\"floating\"\n aria-pressed=\"false\"\n onClick={handleOnChangeOptions}\n onMouseEnter={handleOptionOnMouseEnter}\n onMouseLeave={handleOptionOnMouseLeave}\n key={value}>\n <span>{name}</span>\n </button>\n </li>\n );\n}\n\nexport default ButtonOption;\n","import React, { useState } from 'react';\nimport ButtonOption from './button-option';\n\nfunction ButtonOptionSelector({ name, options, handleChange, id, selected }) {\n const [labelLine, setLabelLine] = useState();\n const setSelectedValue = () => {\n if (Object.keys(selected).length !== 0){\n const [_selectedOption] = options.filter(option => option.value === Object.values(selected[id])[0])\n setSelectedOption(_selectedOption)\n } else {\n setDefaultValue();\n }\n }\n const setDefaultValue = () => {\n const [_defaultOption] = options.filter(option => option.is_default === true);\n setLabelLine(_defaultOption.name);\n handleChange(id, _defaultOption.value, _defaultOption.asset);\n return _defaultOption;\n }\n const [selectedOption, setSelectedOption] = useState(selected)\n\n React.useEffect(() => {\n setSelectedValue();\n }, [selected])\n\n const handleOptionOnMouseEnter = label => {\n setLabelLine(label);\n };\n\n const handleOptionOnMouseLeave = () => {\n if (Object.entries(selectedOption).length !== 0){\n setLabelLine(selectedOption.name);\n }\n };\n\n const handleOnChangeOptions = (value, asset) => {\n handleChange(id, value, asset);\n };\n\n const $options = options.map(option => {\n return (\n <ButtonOption\n name={option.name}\n value={option.value}\n handleOptionOnMouse={handleOptionOnMouseEnter}\n handleOptionOnMouseLeave={handleOptionOnMouseLeave}\n handleChange={handleOnChangeOptions}\n key={option.name}\n disabled={false}\n id={option.id}\n selected={selectedOption.value === option.value}\n asset={option.asset}\n />\n );\n });\n return (\n <>\n <div className=\"d-flex align-content-center title-and-value mw-100\">\n <strong className=\"title\">\n <span>{name}</span>:\n </strong>\n <span className=\"value text-truncate\">\n <span>{labelLine}</span>\n </span>\n </div>\n <ul className=\"list-inline\">{$options}</ul>\n </>\n );\n}\n\nexport default ButtonOptionSelector;\n","import React, { useState } from 'react';\nimport ButtonOptionSelector from './button-option-selector';\n\nfunction ButtonOptionSelectors({ options, selected, onChange }) {\n const $optionsSelectors = (options || []).map(option => {\n return (\n <ButtonOptionSelector\n name={option.name}\n type={option.type}\n id={option.id}\n key={option.name}\n options={option.options}\n selected={selected}\n handleChange={onChange}\n asset={option.asset}\n />\n );\n });\n //\n return (\n <div>\n <div className=\"clearfix filter filter__multiple-choice\">\n {$optionsSelectors}\n </div>\n </div>\n );\n}\n\nexport default ButtonOptionSelectors;\n","'use strict';\n\n// Import Libraries\nimport React from 'react';\n// Import JSX Modules\nimport Select from '../_utils/select-wrapper';\n\n// -----------------------------------------------------------\n// OptionSelector\n// -----------------------------------------------------------\nconst OptionSelector = ({id, name, options, selected, onChange}) => {\n options = options.map((option) => {\n return {\n label: option.name,\n value: option.value,\n isDefault: option.is_default\n };\n });\n\n const handleChange = (value) => {\n onChange(id, value)\n };\n\n const optionValue = () => {\n return selected ||\n (options.find(option => option.isDefault) || {}).value ||\n (options[0] && options[0].value)\n };\n\n return (\n <div className=\"filter\">\n <h4>{ name }</h4>\n <Select options={ options }\n value={ optionValue() }\n onChange={ handleChange } />\n </div>\n );\n};\n\n\nexport default OptionSelector;\n","'use strict';\n\n// Import Libraries\nimport React from 'react';\n// Import JSX Modules\nimport OptionSelector from './option-selector';\n\n// -----------------------------------------------------------\n// OptionSelectors\n// -----------------------------------------------------------\nconst OptionSelectors = ({options, selected, onChange}) => {\n return (\n <div>\n {\n (options || []).map((option, i) => {\n return <OptionSelector { ...option }\n key={ i }\n selected={ selected[option.id] }\n onChange={ onChange } />;\n })\n }\n </div>\n );\n};\n\nexport default OptionSelectors;\n","'use strict';\n\n// Import Libraries\nimport React from 'react';\nimport PropTypes from 'prop-types';\n// Import JSX Modules\nimport PricesTable from './prices-table';\n\n// -----------------------------------------------------------\n// ProductDescription\n// -----------------------------------------------------------\nconst ProductDescription = ({currentProduct, products, deliveryOptions}, {showPricesTable, description}) => {\n description = (currentProduct && currentProduct.description) || description;\n\n if (showPricesTable) {\n return (\n <div className=\"product-description\">\n <div className=\"row\">\n <div className=\"col-md-6 col-12\" dangerouslySetInnerHTML={{__html: description}} />\n <div className=\"col-md-6 col-12\">\n <PricesTable products={ products } delivery_options={ deliveryOptions } />\n </div>\n </div>\n </div>\n );\n }\n\n if (description) {\n return (\n <div className=\"row\">\n <div className=\"col-12 col-sm-12 col-md-8\">\n <div className=\"product-description\" dangerouslySetInnerHTML={{__html: description}} />\n </div>\n </div>\n );\n }\n\n return null;\n};\n\nProductDescription.contextTypes = {\n description: PropTypes.string,\n showPricesTable: PropTypes.bool\n}\n\nexport default ProductDescription;\n","export const calculateDimensions = (url) => new Promise((resolve, reject) => {\n const image = new Image();\n\n image.src = url;\n image.onload = () => {\n resolve({\n width: image.width,\n height: image.height,\n });\n };\n\n image.onerror = () => reject();\n});\n","'use strict';\n\n// Import Libraries\nimport React from 'react';\nimport classNames from 'classnames';\n// Import JSX Modules\nimport Spinner from '../_utils/spinner';\nimport { calculateDimensions } from '../_utils/tools/image-tools';\n// -----------------------------------------------------------\n// FoldedCardProductImage\n// -----------------------------------------------------------\nexport default class FoldedCardProductImage extends React.PureComponent {\n constructor(props) {\n super(props);\n\n this.state = {};\n }\n\n componentDidMount() {\n this.updateImageDimensions();\n }\n\n componentDidUpdate(prevProps) {\n if (prevProps.url != this.props.url) {\n this.updateImageDimensions();\n }\n }\n\n render() {\n if (!this.state.loaded) {\n return <Spinner />;\n }\n\n const backgroundImages = ['url('+this.props.url+')'],\n backgroundSizes = [],\n class_names = ['product-image-selected', 'folded-card'],\n ratio = this.state.height / this.state.width;\n\n if (ratio <= 1) {\n class_names.push('landscape');\n backgroundImages.push('url(/stylesheets/walmart/images/fake_folded_card_backs/landscape.png)');\n backgroundSizes.push('93% auto');\n backgroundSizes.push('7% ' + (((ratio * 100) - 10) * 1.6) + '%');\n } else {\n class_names.push('portrait');\n backgroundImages.push('url(/stylesheets/walmart/images/fake_folded_card_backs/portrait.png)');\n backgroundSizes.push('auto 92%');\n backgroundSizes.push(((1 / ratio) * 92 )+ '% 7%');\n }\n\n return (\n <div className={ classNames(class_names) }\n style={\n {\n backgroundSize: backgroundSizes.join(','),\n backgroundImage: backgroundImages.join(',')\n }\n }>\n </div>\n );\n }\n\n updateImageDimensions() {\n calculateDimensions(this.props.url).then(({ height, width }) => {\n this.setState({\n height,\n width,\n loaded: true\n });\n }).catch(() => {\n this.setState({\n loaded: false\n });\n });\n }\n}\n","'use strict';\n\n// Import Libraries\nimport React from 'react';\n// Import JS Modules\nimport classNames from 'classnames';\nimport { calculateDimensions } from '../_utils/tools/image-tools';\n// Import JSX Modules\nimport Spinner from '../_utils/spinner';\n\n// -----------------------------------------------------------\n// MetallicCardProductImage\n// -----------------------------------------------------------\nclass MetallicCardProductImage extends React.PureComponent {\n constructor(props) {\n super(props);\n\n this.state = {\n loaded: false\n };\n }\n\n componentDidMount() {\n this.updateImageDimensions();\n }\n\n render() {\n if (!this.state.loaded) {\n return <Spinner />;\n }\n\n const { width, height } = this.state;\n let portraitClassName;\n\n if (height > width && height > 640) {\n portraitClassName = 'contain-portrait-height';\n } else if (height > width) {\n portraitClassName = 'contain-portrait';\n }\n\n return (\n <div className=\"product-image-selected shadowing-for-cards metallic-card\">\n <img src={ this.props.url } className={ classNames('img-fluid mx-auto product-image', portraitClassName) } />\n </div>\n );\n }\n\n updateImageDimensions() {\n calculateDimensions(this.props.url).then(({ height, width }) => {\n this.setState({\n height,\n width,\n loaded: true\n });\n }).catch(() => {\n this.setState({\n loaded: false\n });\n });\n }\n}\n\nexport default MetallicCardProductImage;\n","import React, { useEffect, useState } from 'react';\nimport classNames from 'classnames';\nimport screenAndStyle from '../_utils/screen-and-style';\nimport { calculateDimensions } from '../_utils/tools/image-tools';\nimport Spinner from '../_utils/spinner';\n\nconst maskSrc = (isScalloped, portrait) => {\n const edge = isScalloped ? 'scallop' : 'elegant';\n const orientation = portrait ? 'portrait' : 'landscape';\n const ext = screenAndStyle.isSafari() || screenAndStyle.isEdge() ? '.png' : '.svg';\n\n return `/stylesheets/walmart/images/scalloped_edges_and_elegant_corners/5x7_${edge}_mask_${orientation}${ext}`;\n};\n\nconst RenderNormal = ({ url, alt, isCard, isRounded, dimensions, onLoad }) => {\n const { width, height } = dimensions;\n\n return (\n <div className=\"product-image\">\n <img\n className={classNames('img-fluid lazyload', { 'card-shadow': isCard, 'rounded-corners': isRounded })}\n data-src={url}\n alt={alt}\n width={width}\n height={height}\n onLoad={onLoad}\n />\n </div>\n );\n};\n\nconst RenderMasked = ({ portrait, isScalloped, url }) => {\n const getPortraitDimensions = () => {\n return portrait\n ? { paddingTop: '97%', width: '71.5%' }\n : { paddingTop: '71.5%', width: '100%' };\n };\n\n const { paddingTop, width } = getPortraitDimensions();\n const maskedSrc = maskSrc(isScalloped, portrait);\n\n return (\n <div\n className=\"product-image corners-product-image mx-auto\"\n data-test-id=\"masked-image\"\n style={{ backgroundImage: `url(${maskedSrc}), url(${url})`, paddingTop, width }}\n />\n );\n};\nconst RenderCustomisationOverlay = ({url, optionAsset}) => {\n return (\n <div\n className=\"product-image corners-product-image mx-auto\"\n data-test-id=\"masked-image\"\n style={{ backgroundImage: `url(${optionAsset}), url(${url})`, paddingTop: '100%', width: '100%' }}\n />\n );\n};\nconst ProductImage = ({ url, alt, isCard, isRounded, isElegant, isScalloped, optionAsset }) => {\n const [dimensions, setDimensions] = useState({ height: 0, width: 0 });\n const [loaded, setLoaded] = useState(false);\n const [portrait, setPortrait] = useState(false);\n let mounted = false;\n\n useEffect(() => {\n mounted = true;\n\n if (!loaded) {\n updateImageDimensions(url);\n }\n\n return () => {\n mounted = false;\n }\n }, [loaded, url]);\n\n const updateImageDimensions = (url) => {\n calculateDimensions(url)\n .then(({ height, width }) => {\n if (mounted) {\n setDimensions({ height, width });\n setLoaded(true);\n setPortrait(height > width);\n }\n })\n .catch(() => {\n if (mounted) {\n setLoaded(false);\n }\n });\n };\n\n const renderTemplate = () => {\n if (optionAsset) {\n return <RenderCustomisationOverlay url={url} optionAsset={optionAsset} />\n } else if (isElegant || isScalloped) {\n return <RenderMasked portrait={portrait} isScalloped={isScalloped} url={url} />\n } else {\n return <RenderNormal url={url} alt={alt} isCard={isCard} isRounded={isRounded} dimensions={dimensions} onLoad={() => updateImageDimensions(url)}/>\n }\n }\n\n if (loaded) {\n return renderTemplate();\n } else {\n return <Spinner />;\n }\n};\n\nexport default ProductImage;\n","'use strict';\n\n// Import Libraries\nimport React from 'react';\n// Import JS Modules\nimport classNames from 'classnames';\n// Import JSX Modules\nimport ProductImage from './product-image';\n\n// -----------------------------------------------------------\n// ProductImageThumbnail\n// -----------------------------------------------------------\nconst ProductImageThumbnail = props => {\n const thumbnailUrl = (() => {\n let urlParts = props.thumbnail.split('/');\n\n urlParts[urlParts.length - 1] = urlParts[urlParts.length - 1].replace(\n /^_hd_product/,\n '_hd_thm_product'\n );\n\n return urlParts.join('/');\n })();\n\n return (\n <div\n className={classNames(\n 'thumbnail d-flex align-items-center justify-content-center',\n { selected: props.selected }\n )}\n role=\"radio\"\n aria-checked={props.selected}\n onClick={handleClick}\n onKeyDown={onKeyPressed}\n tabIndex=\"0\">\n <ProductImage {...props} url={thumbnailUrl} optionAsset={props.index == 0 && props.optionAsset}/>\n </div>\n );\n\n function handleClick() {\n props.onClick(props.index);\n }\n\n function onKeyPressed(event) {\n if (event.keyCode === 13) {\n props.onClick(props.index);\n }\n }\n};\n\nexport default ProductImageThumbnail;\n","import React from 'react';\n\n// -----------------------------------------------------------\n// ProductVideo\n// -----------------------------------------------------------\nconst ProductVideo = (props) => {\n return (\n <video className=\"img-fluid\"\n poster={props.thumbnail}\n type=\"video/mp4\"\n src={props.url}\n autoPlay\n loop\n muted\n playsInline />\n );\n}\n\nexport default ProductVideo;\n","import createReactClass from 'create-react-class';\n'use strict';\n\n// Import Libraries\nimport React from 'react';\n// Import JSX Modules\nimport FoldedCardProductImage from './folded-card-product-image';\nimport MetallicCardProductImage from './metallic-card-product-image';\nimport ProductImage from './product-image';\nimport ProductImageThumbnail from './product-image-thumbnail';\nimport ProductVideo from './product-video';\n\n// -----------------------------------------------------------\n// ProductImages\n// -----------------------------------------------------------\nvar ProductImages = createReactClass({\n getInitialState() {\n return {\n index: 0\n };\n },\n render() {\n if (!this.props.product) {\n return null;\n }\n\n const {\n selectedTheme,\n product: {\n title: productTitle,\n theme_and_product_images: productImages\n }\n } = this.props;\n \n if (productImages.length == 0) {\n return null;\n }\n\n const attributes = {\n isRounded: this.props.rounded_corners,\n isElegant: this.props.elegant_corners,\n isScalloped: this.props.scalloped_edges,\n isCard: this.props.product.is_card\n };\n\n const alt = selectedTheme ? `${productTitle} with ${selectedTheme.title} design` : productTitle;\n const optionAsset = this.customisationOptionAsset();\n\n const $resource = ((asset, i ) => {\n if (asset.type == 'video') {\n return <ProductVideo url={asset.url} />;\n }\n if (asset.type == 'image') {\n if (this.isProductFoldedCard())\n return <FoldedCardProductImage url={asset.url} />;\n\n if (this.isProductMetallicCard())\n return <MetallicCardProductImage url={asset.url} />;\n\n return <ProductImage key={this.state.index} \n url={asset.url}\n alt={`${alt} ${i + 1}`}\n { ...attributes }\n optionAsset={optionAsset} />;\n }\n\n return (\n <div className=\"flex-video\">\n <iframe key={ this.state.index }\n src={ asset.url }\n scrolling=\"no\"\n frameBorder=\"no\"\n className=\"img-fluid mx-auto\"\n allowFullScreen />\n </div>\n );\n })(productImages[this.state.index], this.state.index);\n\n const $thumbnails = productImages.map((product_image, i) => {\n return <ProductImageThumbnail key={i}\n { ...product_image }\n { ...attributes }\n alt={`Thumbnail for ${alt} ${i + 1}`}\n index={i}\n selected={i == this.state.index}\n onClick={this.handleSelected}\n optionAsset={optionAsset} />;\n });\n\n // key is used to reset the state back to zero when the selected product changes\n if ($thumbnails.length > 1) {\n return (\n <div className=\"thumbnails-wrapper\">\n { $resource }\n <ul className=\"list-inline thumbnails d-flex flex-wrap justify-content-center\" role=\"radiogroup\">\n {\n $thumbnails.map(($thumbnail, i) => {\n return (\n <li className=\"list-inline-item\" key={ i }>\n { $thumbnail }\n </li>\n );\n })\n }\n </ul>\n </div>\n );\n }\n\n return $resource;\n },\n isProductFoldedCard() {\n return this.isProductMatch([/Folded Card/i, /Note Card/i]);\n },\n isProductMetallicCard() {\n return this.isProductMatch(/Metallic(\\W*)Greeting Card/i);\n },\n isProductMatch(titleRegexes) {\n titleRegexes = [].concat(titleRegexes);\n\n return titleRegexes.some(regex => {\n return regex.test(this.props.product.title);\n });\n },\n customisationOptionAsset() {\n const {index} = this.state;\n const {selectedOptions = {}, productOptions = []} = this.props;\n const [{id, display_overlay_preview: displayOverlayPreview} = {}] = productOptions;\n const {[id]: {asset} = {} } = {} = selectedOptions;\n\n return index === 0 && displayOverlayPreview ? asset : undefined;\n },\n handleSelected(index) {\n this.setState(prevState => {\n if (index != prevState.index)\n return {\n index\n };\n });\n }\n});\n\nexport default ProductImages;\n","'use strict';\n\n// Import Libraries\nimport React from 'react';\n\n// -----------------------------------------------------------\n// ProductNotAvailable\n// -----------------------------------------------------------\nconst ProductNotAvailable = ({visible}) => {\n if (!visible)\n return null;\n\n return <div className=\"product-not-available\">\n <strong>This item is not available</strong> with these options.\n <br />\n Please choose different options to purchase this product.\n </div>;\n};\n\nexport default ProductNotAvailable;\n","// Import Libraries\nimport React from 'react';\n// Import JS Modules\nimport QuantityPricingTools from './quantity-pricing-tools';\n// Import JSX Modules\nimport ProductFlagsBase from '../_utils/product-flags';\n\n// -----------------------------------------------------------\nexport default props => {\n const wasPrice = (props.was_price || []).reduce((memo, wp) => {\n if (wp.quantity <= props.copies) {\n return wp;\n }\n\n return memo;\n }, {});\n\n const price = new QuantityPricingTools({prices: props.prices}).getUnitPriceForQuantity(props.copies);\n\n return (\n <ProductFlagsBase {...props}\n price={price}\n was_price={wasPrice} />\n );\n};\n","import React from 'react';\nimport PropTypes from 'prop-types';\n\n// Import JS Modules\nimport { builderDispatch, WebUI, PrismUI } from '../_utils/ui';\nimport get from 'lodash/get';\nimport ShelfEvents from '../_shelf-category/flux-events';\nimport QuantityPricingTools from './quantity-pricing-tools';\nimport CalendarDates from './calendar-dates';\n// Import JSX Modules\nimport GroupedCategoryBase from './_common/grouped-category-base';\nimport DeliveryOptionCalculator from '../_utils/_delivery-options/calculator';\nimport GroupedCategoryChangeEvents from './grouped-category-change-events';\nimport CalendarStartDateSelector from './calendar-start-date-selector';\nimport DeliveryOptions from './delivery-options';\nimport Designer from './designer';\nimport Filters from './filters';\nimport ButtonOptionSelectors from './button-option-selectors';\nimport OptionSelectors from './option-selectors';\nimport ProductDescription from './product-description';\nimport ProductImages from './product-images';\nimport ProductNotAvailable from './product-not-available';\nimport Pickup from './pickup';\nimport Shipping from './shipping';\nimport Breadcrumb from '../_utils/breadcrumb';\nimport DeliveryOptionsList from '../_utils/_delivery-options/delivery-options-list';\nimport MobileFullScreen from '../_utils/mobile-full-screen';\nimport Favouritable from '../_utils/favouritable';\nimport {\n removeInlineSeo,\n shouldDisplayTheme,\n} from '../_utils/tools/seo-helpers';\nimport ProductFlags from './product-flags';\nimport CrossSellCollection from './_common/cross-sell/cross-sell-collection';\n\n// Main Section\nclass GroupedCategory extends GroupedCategoryBase {\n constructor(props) {\n super(props);\n const { favourited } = this.props;\n this.state = Object.assign(this.state, {\n leftArrowPosition: '20px',\n calendarStartDate: CalendarDates.getDefaultValue().value,\n favourited,\n pickupOpen: false,\n shippingOpen: false,\n });\n }\n\n componentDidMount() {\n super.componentDidMount();\n this.builderDispatchToken = builderDispatch.register((payload) => {\n switch (payload.type) {\n case WebUI.LOGIN:\n if (!payload.previous_basket_contents) {\n this.handleReload();\n }\n break;\n case WebUI.CART_MERGED:\n this.handleReload();\n break;\n case ShelfEvents.FAVOURITED:\n this.handleFavourited();\n break;\n case PrismUI.EVENT_QUANTITY_CHANGED:\n this.setState({\n copies: payload.value,\n quantityChanged: true,\n });\n break;\n }\n });\n\n if (typeof document !== 'undefined') {\n document.addEventListener('click', this.handleClosePickupShipping);\n }\n\n if (typeof window !== 'undefined') {\n window.addEventListener('popstate', this.handlePopState);\n window.addEventListener('pageshow', this.handlePageShow);\n }\n }\n\n componentWillUnmount() {\n if (typeof document !== 'undefined') {\n document.removeEventListener('click', this.handleClosePickupShipping);\n }\n\n if (typeof window !== 'undefined') {\n window.removeEventListener('popstate', this.handlePopState);\n window.removeEventListener('pageshow', this.handlePageShow);\n }\n }\n\n getChildContext() {\n const {\n data: {\n description,\n show_prices_table: showPricesTable,\n use_icons_not_text_in_filters: useIconsNotTextInFilters,\n use_icons_in_comparison_fields: useIconsInComparisonFields,\n },\n urls: { locations: locationsUrl },\n } = this.props,\n { validateOptionsChosen } = this.state;\n\n return {\n description,\n showPricesTable,\n useIconsNotTextInFilters,\n useIconsInComparisonFields,\n validateOptionsChosen,\n locationsUrl,\n };\n }\n\n render() {\n const {\n data: {\n title,\n filters,\n delivery_options: deliveryOptions,\n products,\n breadcrumbs,\n prints_item_page: printsItemPage,\n },\n design_code: defaultDesignCode,\n features: {\n change_delivery_opts_before_checkout: changeDeliveryOptsBeforeCheckout,\n },\n item_page_insert: itemPageInsert,\n } = this.props;\n\n const variantName = () => {\n if (!selectedTheme) return\n if (this.props.variant && this.props.variant in selectedTheme.variants_thumbs) {\n return this.props.variant\n } else if (selectedTheme.default_variant) {\n return selectedTheme.default_variant.name\n }\n }\n\n const selectedDeliveryOptions = () => {\n return this.props.selected_delivery_options\n }\n\n if (products.length === 0) {\n return (\n <div className=\"alert alert-warning\" role=\"alert\">\n <strong>Sorry:</strong> No products were found.\n </div>\n );\n }\n\n removeInlineSeo();\n\n const currentProducts = this.getCurrentProducts(),\n [defaultProduct] = currentProducts.length ? currentProducts : products,\n [selectedTheme] = defaultProduct.themes;\n\n let $priceAndCreate,\n $designer,\n $page,\n currentProduct,\n $itemPageInsert,\n { copies, quantityChanged } = this.state;\n\n if (defaultProduct.default_quantity && !quantityChanged) {\n copies = defaultProduct.default_quantity;\n }\n\n if (\n defaultDesignCode &&\n selectedTheme &&\n selectedTheme.designers_names &&\n selectedTheme.designers_names[0]\n ) {\n $designer = (\n <Designer\n name={selectedTheme.designers_names[0]}\n url={breadcrumbs[breadcrumbs.length - 2].url}\n />\n );\n }\n\n if (currentProducts.length === 1) {\n [currentProduct] = currentProducts;\n currentProduct.price = currentProduct.minimum_price;\n\n if (\n selectedTheme &&\n selectedTheme.designers_names &&\n selectedTheme.designers_names[0]\n ) {\n $designer = (\n <Designer\n name={selectedTheme.designers_names[0]}\n url={breadcrumbs[breadcrumbs.length - 2].url}\n />\n );\n }\n\n this.setPageAttributesForProduct(\n currentProduct,\n selectedTheme,\n defaultDesignCode,\n variantName(),\n selectedDeliveryOptions()\n );\n\n $page = this.setInnerHtmlDescription(currentProduct.page_html);\n\n copies = (() => {\n const quantityPricingTools = new QuantityPricingTools(currentProduct);\n return quantityPricingTools.currentOrFirstAvailableCopies(copies);\n })();\n\n if (\n get(this.productSelectedAnalyticsSentFor, 'product') !==\n currentProduct.id ||\n get(this.productSelectedAnalyticsSentFor, 'copies') !== copies\n ) {\n builderDispatch.dispatch({\n type: GroupedCategoryChangeEvents.PRODUCT_SELECTED,\n product: currentProduct,\n deliveryOptions,\n breadcrumbs,\n copies,\n printsItemPage,\n });\n\n this.productSelectedAnalyticsSentFor = {\n product: currentProduct.id,\n copies,\n };\n }\n }\n\n if (currentProducts.length === products.length) {\n if (!this.landingAnalyticsSent) {\n builderDispatch.dispatch({\n type: GroupedCategoryChangeEvents.PAGE_LOADED,\n product: currentProducts[0],\n deliveryOptions,\n breadcrumbs,\n printsItemPage,\n });\n\n this.landingAnalyticsSent = true;\n }\n }\n\n $priceAndCreate = this.renderPriceAndProductCreate(\n currentProducts,\n selectedTheme,\n this.state.calendarStartDate,\n copies,\n this.state.options,\n variantName(),\n selectedDeliveryOptions()\n );\n $itemPageInsert = (\n <div dangerouslySetInnerHTML={{ __html: itemPageInsert }} />\n );\n\n let $deliveryOptions,\n $deliveryOptionsDropdowns = [];\n if (changeDeliveryOptsBeforeCheckout) {\n $deliveryOptions = (\n <DeliveryOptionsList\n options={deliveryOptions}\n product={currentProduct}\n selectedDeliveryOptions={selectedDeliveryOptions()}\n />\n );\n } else {\n $deliveryOptions = (\n <DeliveryOptions\n options={deliveryOptions}\n products={currentProducts}\n pickupOpen={this.state.pickupOpen}\n shippingOpen={this.state.shippingOpen}\n handleOpenPickup={this.handleOpenPickup}\n handleOpenShipping={this.handleOpenShipping}\n />\n );\n\n let productsDeliveryOptions = [];\n for (const product of products) {\n productsDeliveryOptions = productsDeliveryOptions.concat(\n product.delivery_options\n );\n }\n const {\n hasOneHourPickup,\n } = DeliveryOptionCalculator.productsDeliveryOptionsTiers(\n productsDeliveryOptions,\n deliveryOptions\n );\n\n $deliveryOptionsDropdowns = [\n <Pickup\n key=\"pickup\"\n deliveryTimes={deliveryTimes(\n deliveryOption => deliveryOption.type === 'PICKUP'\n )}\n hasOneHourPickup={hasOneHourPickup}\n open={this.state.pickupOpen}\n disabled={this.state.pickupDisabled}\n leftArrowPosition={this.state.leftArrowPosition}\n />,\n <Shipping\n key=\"shipping\"\n deliveryTimes={deliveryTimes(\n deliveryOption => deliveryOption.type !== 'PICKUP'\n )}\n open={this.state.shippingOpen}\n disabled={this.state.shippingDisabled}\n leftArrowPosition={this.state.leftArrowPosition}\n />,\n ];\n }\n\n const $favoritable = (() => {\n if (typeof App !== 'undefined' && App.order.logged_in()) {\n return (\n <Favouritable\n designCode={defaultDesignCode}\n favourited={this.state.favourited}\n />\n );\n }\n })();\n\n const itemThemeTitle =\n (defaultDesignCode && selectedTheme && selectedTheme.title) || title;\n\n const breadCrumbTitle = () => {\n if (currentProduct) {\n return currentProduct.title\n } else {\n return shouldDisplayTheme() ? `${title} - ${itemThemeTitle}` : title\n }\n }\n\n return (\n <div>\n <Breadcrumb segments={breadcrumbs} title={breadCrumbTitle()} />\n <p className=\"item-theme-title\">\n {itemThemeTitle}\n {$favoritable}\n </p>\n {$designer}\n {$page}\n <div className=\"heading-flags\">{currentProduct && renderFlag()}</div>\n <div className=\"row mt-5\">\n <div className=\"col-12 col-md-6 product-images\">\n <ProductImages\n product={defaultProduct}\n key={defaultProduct.id}\n selectedTheme={selectedTheme}\n rounded_corners={this.roundOptionActive()}\n scalloped_edges={this.scallopedOptionActive()}\n elegant_corners={this.elegantOptionActive()}\n selectedOptions={this.state.options}\n productOptions={currentProduct && currentProduct.options}\n />\n </div>\n <div className=\"col-12 col-md-6 product-details\">\n <div className=\"card filters-and-product\" ref={this.productAndFilters}>\n <div className=\"card-header filters\">\n <Filters\n levels={filters}\n selected={this.state.filters}\n products={products}\n currentProducts={currentProducts}\n deliveryOptions={deliveryOptions}\n onCriteronSelected={this.handleFilterCriteronSelected}\n />\n {renderCalendarSelector.call(this)}\n {this.props.show_button_for_frames ?\n (\n <ButtonOptionSelectors\n options={currentProduct && currentProduct.options}\n selected={this.state.options}\n onChange={this.handleOptionChange}\n />\n ) : (\n <OptionSelectors\n options={currentProduct && currentProduct.options}\n selected={this.state.options}\n onChange={this.handleOptionChange}\n />\n )}\n </div>\n <div className=\"card-body product\">\n <div className=\"d-lg-none\">\n <ProductNotAvailable visible={currentProducts.length === 0} />\n {changeDeliveryOptsBeforeCheckout && $deliveryOptions}\n {$priceAndCreate}\n {changeDeliveryOptsBeforeCheckout || $deliveryOptions}\n </div>\n <div className=\"row d-none d-lg-flex\">\n <ProductNotAvailable visible={currentProducts.length === 0} />\n <div className=\"col-6 col-xl-8 align-self-end\">\n {$deliveryOptions}\n </div>\n <div className=\"col-6 col-xl-4 align-self-end\">\n {$priceAndCreate}\n </div>\n </div>\n </div>\n <div>{$itemPageInsert}</div>\n {$deliveryOptionsDropdowns}\n </div>\n {this.renderCrossSellCollection(\n currentProducts.length ? currentProducts : products,\n selectedTheme\n )}\n </div>\n </div>\n\n <ProductDescription\n currentProduct={currentProduct}\n products={products}\n deliveryOptions={deliveryOptions}\n />\n\n <MobileFullScreen\n smallScreenOnly\n open={this.state.pickupOpen}\n onBack={this.handleClosePickupShipping}>\n {$deliveryOptionsDropdowns[0]}\n </MobileFullScreen>\n <MobileFullScreen\n smallScreenOnly\n open={this.state.shippingOpen}\n onBack={this.handleClosePickupShipping}>\n {$deliveryOptionsDropdowns[1]}\n </MobileFullScreen>\n </div>\n );\n function renderFlag() {\n const props = {};\n\n if (currentProduct) {\n props.prices = currentProduct.prices;\n props.was_price = currentProduct.was_price;\n props.flag =\n (currentProduct.flag || 0) + ((selectedTheme || {}).flag || 0);\n }\n\n return <ProductFlags className=\"right\" {...props} copies={copies} />;\n }\n\n function renderCalendarSelector() {\n if (defaultProduct.is_calendar) {\n return (\n <CalendarStartDateSelector\n value={this.state.calendarStartDate}\n onChange={this.handleCalendarStartChange}\n />\n );\n }\n }\n\n function deliveryTimes(predicate) {\n const deliveryDays = {};\n\n for (const currentProduct of currentProducts) {\n for (const deliveryKey of currentProduct.delivery_options) {\n const deliveryOption = deliveryOptions.find(\n deliveryOpt => deliveryOpt.key == deliveryKey\n );\n if (predicate(deliveryOption)) {\n deliveryDays[deliveryOption.type] = deliveryOption.time_hours;\n }\n }\n }\n\n return deliveryDays;\n }\n }\n\n handleReload() {\n fetch('/favourites', {\n credentials: 'same-origin',\n })\n .then((response) => response.json())\n .then((favourites) => {\n this.setState({\n favourited: favourites.includes(this.props.design_code),\n });\n })\n .catch(() => {});\n }\n\n handleFavourited() {\n this.setState((prevState) => {\n return {\n favourited: !prevState.favourited,\n };\n });\n }\n\n handleCalendarStartChange = (timestamp) => {\n this.setState({\n calendarStartDate: timestamp,\n });\n };\n\n handleOpenPickup = (element, disabled) => {\n this.setState({\n leftArrowPosition: this.calculateLeftArrowPosition(element),\n pickupOpen: !this.state.pickupOpen,\n pickupDisabled: !!disabled,\n shippingOpen: false,\n });\n };\n\n handleOpenShipping = (element, disabled) => {\n this.setState({\n leftArrowPosition: this.calculateLeftArrowPosition(element),\n pickupOpen: false,\n shippingOpen: !this.state.shippingOpen,\n shippingDisabled: !!disabled,\n });\n };\n\n handleClosePickupShipping = e => {\n if (!this.state.pickupOpen && !this.state.shippingOpen) return;\n\n if (\n e &&\n $(e.target).closest('.delivery-info, .delivery-box, .mobile-full-screen')\n .length > 0\n ) {\n return;\n }\n\n this.setState({\n pickupOpen: false,\n shippingOpen: false,\n });\n };\n\n calculateLeftArrowPosition = element => {\n // Calculate the left space to position the arrow in the middle of the delivery-box location message\n let $element = $(element),\n $locationMessage = $element\n .closest('.delivery-box')\n .find('.see-locations-message'),\n leftArrowPosition;\n\n leftArrowPosition =\n $locationMessage.offset().left +\n $locationMessage.width() / 2 -\n $element.closest('.product').offset().left -\n 12.7;\n\n return `${leftArrowPosition}px`;\n };\n\n renderCrossSellCollection = (products, theme) => {\n const { collections } = this.props.data;\n\n if (!collections || !products || !theme) {\n return null;\n }\n\n const collectionToDisplay = collections.filter(\n collectionProduct =>\n !products.some(\n product => collectionProduct.product_id === product.id\n ) && // do not display products from the same group\n collectionProduct.thumbnails &&\n collectionProduct.thumbnails.length > 0 &&\n collectionProduct.unit_prices &&\n collectionProduct.unit_prices.length\n );\n\n if (collectionToDisplay.length === 0) {\n return null;\n }\n\n return (\n <CrossSellCollection\n id=\"crossSellCollection\"\n collection={collectionToDisplay}\n slidesToShow={3}\n />\n );\n };\n\n roundOptionActive() {\n let found_active_round_option = false,\n rounded_corners_option,\n filter;\n\n for (const selected_filter_key in this.state.filters) {\n rounded_corners_option = null;\n\n for (const filter of this.props.data.filters) {\n if (\n filter.title === selected_filter_key &&\n !!filter.rounded_corners_option\n ) {\n rounded_corners_option = filter.rounded_corners_option;\n\n break;\n }\n }\n\n if (\n !!rounded_corners_option &&\n this.state.filters[selected_filter_key] === rounded_corners_option\n ) {\n found_active_round_option = true;\n\n break;\n }\n }\n return found_active_round_option;\n }\n\n scallopedOptionActive() {\n return this.props.data.filters.some(\n f =>\n !!f.scalloped_edges_option &&\n f.scalloped_edges_option === this.state.filters[f.title]\n );\n }\n\n elegantOptionActive() {\n return this.props.data.filters.some(\n f =>\n !!f.elegant_corners_option &&\n f.elegant_corners_option === this.state.filters[f.title]\n );\n }\n}\n\nGroupedCategory.childContextTypes = {\n description: PropTypes.string,\n showPricesTable: PropTypes.bool,\n useIconsNotTextInFilters: PropTypes.bool,\n useIconsInComparisonFields: PropTypes.bool,\n validateOptionsChosen: PropTypes.bool,\n locationsUrl: PropTypes.string,\n};\n\nexport default GroupedCategory;\n"],"names":["defaultDates","backDates","forwardDate","CalendarDates","monthNames","earliest","monthOptions","i","startMonth","noOfMonths","j","date","year","month","defaultMonth","defaultTimeStamp","mO","periodsArray","period","PriceAndProductCreate","createReactClass","product","$price","$quantityDropdown","React","action","price","ProgressButton","translate","copies","QuantityPricingTools","quantity","unitPrice","cost","active","classNames","Currency","displayWas","includeFrom","options","option","wasPrice","memo","wp","genericHelpers","Price","productPrice","params","queryString","UrlBuilder","key","value","subOption","builderDispatch","PrismUI","GroupedCategoryBase","props","__publicField","parseQueryString","filters","p","defaultFilters","filter","defaultOptionTitle","productId","productFilters","mergedFilters","merge","canonicalUrlParameters","setCanonicalUrl","products","currentProductId","prod","theme","button","name","asset","title","criteron","currentProducts","selectedTheme","calendarStartDate","variantName","selectedDeliveryOptions","currentProductParams","firstTime","currentProduct","defaultDesignCode","queryParams","whitelistedParamsRegex","path","state","description","PropTypes","CalendarStartDateSelector","selectedOption","Select","Designer","FilterComparison","event","ReactDOM","o","ref","ReactDOMServer","index","$rows","field","data","deliveryOptionsForFilter","deliveryOptions","hasShipping","hasOneHourPickup","hasSameDayPickup","DeliveryOptionCalculator","item","opt","FilterNothingSelectable","level","DecapitalisedTitle","FilterSelectorsMixin","deg","lineWidth","FilterColorCriteron","label","FilterImageCriteron","FilterTextCriteron","AppleDeviceNameCapitaliser","Filter","$criteria","disabled","filterPropertyTitleToUpperCase","$criteron","term","filterCriteron","c","optionsForLevel","filteredProducts","selectedProp","selected","cloneDeep","acc","Filters","levels","onCriteronSelected","$filters","$filter","ButtonOption","handleOptionOnMouse","handleOptionOnMouseLeave","handleChange","handleOnChangeOptions","handleOptionOnMouseEnter","ButtonOptionSelector","id","labelLine","setLabelLine","useState","setSelectedValue","_selectedOption","setSelectedOption","setDefaultValue","_defaultOption","$options","ButtonOptionSelectors","onChange","$optionsSelectors","OptionSelector","optionValue","OptionSelectors","ProductDescription","showPricesTable","PricesTable","calculateDimensions","url","resolve","reject","image","FoldedCardProductImage","prevProps","Spinner","backgroundImages","backgroundSizes","class_names","ratio","height","width","MetallicCardProductImage","portraitClassName","maskSrc","isScalloped","portrait","edge","orientation","ext","screenAndStyle","RenderNormal","alt","isCard","isRounded","dimensions","onLoad","RenderMasked","getPortraitDimensions","paddingTop","maskedSrc","RenderCustomisationOverlay","optionAsset","ProductImage","isElegant","setDimensions","loaded","setLoaded","setPortrait","mounted","useEffect","updateImageDimensions","renderTemplate","ProductImageThumbnail","thumbnailUrl","urlParts","handleClick","onKeyPressed","ProductVideo","ProductImages","productTitle","productImages","attributes","$resource","$thumbnails","product_image","$thumbnail","titleRegexes","regex","selectedOptions","productOptions","displayOverlayPreview","prevState","ProductNotAvailable","visible","ProductFlags","ProductFlagsBase","GroupedCategory","timestamp","element","$element","$locationMessage","leftArrowPosition","collections","collectionToDisplay","collectionProduct","CrossSellCollection","favourited","payload","WebUI","ShelfEvents","useIconsNotTextInFilters","useIconsInComparisonFields","locationsUrl","validateOptionsChosen","breadcrumbs","printsItemPage","changeDeliveryOptsBeforeCheckout","itemPageInsert","removeInlineSeo","defaultProduct","$priceAndCreate","$designer","$page","$itemPageInsert","quantityChanged","get","GroupedCategoryChangeEvents","$deliveryOptions","$deliveryOptionsDropdowns","DeliveryOptionsList","DeliveryOptions","productsDeliveryOptions","Pickup","deliveryTimes","deliveryOption","Shipping","$favoritable","Favouritable","itemThemeTitle","breadCrumbTitle","shouldDisplayTheme","Breadcrumb","renderFlag","renderCalendarSelector","MobileFullScreen","predicate","deliveryDays","deliveryKey","deliveryOpt","response","favourites","found_active_round_option","rounded_corners_option","selected_filter_key","f"],"mappings":"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"}