{"version":3,"file":"js/8823.chunk.js?v=1742528680091","mappings":"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","sources":["webpack://fed-boilerplate/./src/3-components/breadcrumbs/index.jsx","webpack://fed-boilerplate/./src/3-components/discover-panel/index.jsx","webpack://fed-boilerplate/./src/4-sections/product-catalogue/constants/filter-types.js","webpack://fed-boilerplate/./src/4-sections/product-catalogue/utils/active-filters.js","webpack://fed-boilerplate/./src/4-sections/product-catalogue/constants/filter-keys.js","webpack://fed-boilerplate/./src/4-sections/product-catalogue/constants/querystring-whitelist.js","webpack://fed-boilerplate/./src/4-sections/product-catalogue/utils/filters/filter-helpers.js","webpack://fed-boilerplate/./src/4-sections/product-catalogue/utils/query-string.js","webpack://fed-boilerplate/./src/4-sections/product-catalogue/active-filters/index.jsx","webpack://fed-boilerplate/./src/4-sections/product-catalogue/filters/multi-checkbox-filter/index.jsx","webpack://fed-boilerplate/./src/4-sections/product-catalogue/filters/index.jsx","webpack://fed-boilerplate/./src/4-sections/product-catalogue/toolbar/sort-by/index.jsx","webpack://fed-boilerplate/./src/4-sections/product-catalogue/toolbar/page-size/index.jsx","webpack://fed-boilerplate/./src/4-sections/product-catalogue/items/ItemPagination.jsx","webpack://fed-boilerplate/./src/4-sections/product-catalogue/toolbar/index.jsx","webpack://fed-boilerplate/./src/3-components/tiles/BaseTile.jsx","webpack://fed-boilerplate/./src/3-components/tiles/ProductTile.jsx","webpack://fed-boilerplate/./src/3-components/tiles/ProductTileList.jsx","webpack://fed-boilerplate/./src/4-sections/product-catalogue/items/ListingItem.jsx","webpack://fed-boilerplate/./src/4-sections/tile-container/TileContainer.jsx","webpack://fed-boilerplate/./src/4-sections/product-catalogue/items/NoItems.jsx","webpack://fed-boilerplate/./src/4-sections/product-catalogue/items/index.jsx","webpack://fed-boilerplate/./src/js/utils/find-matching-properties.js","webpack://fed-boilerplate/./src/4-sections/product-catalogue/utils/filters/multi-checkbox.js","webpack://fed-boilerplate/./src/4-sections/product-catalogue/utils/item-filter.js","webpack://fed-boilerplate/./src/4-sections/product-catalogue/utils/filters/keywords.js","webpack://fed-boilerplate/./src/4-sections/product-catalogue/utils/filters/multi-checkbox-hierarchy.js","webpack://fed-boilerplate/./src/4-sections/product-catalogue/utils/filters/price-range.js","webpack://fed-boilerplate/./src/4-sections/product-catalogue/utils/filters/single-checkbox.js","webpack://fed-boilerplate/./src/4-sections/product-catalogue/index.jsx","webpack://fed-boilerplate/./src/4-sections/product-catalogue/utils/querystring-whitelist-helpers.js","webpack://fed-boilerplate/./src/4-sections/server-net/App.jsx","webpack://fed-boilerplate/./src/4-sections/server-net/export-client-app.js","webpack://fed-boilerplate/./src/js/utils/stringHelper.js"],"sourcesContent":["import React from 'react';\nimport { arrayOf, object } from 'prop-types';\n// import { window } from 'components/global/global';\n// import Icon from '../icon';\n\nexport default class Breadcrumbs extends React.Component {\n shouldComponentUpdate() {\n // This component should not re-render once its on page\n return false;\n }\n\n render() {\n // const backTo = window.location.search.split('backto=')[1];\n return (\n <div className=\"c-breadcrumbs\">\n {/* {backTo && (\n <React.Fragment key={-1}>\n <Icon glyph=\"chevron-left\" className=\"icon-back\" />\n <a\n href={decodeURIComponent(backTo)}\n className=\"CMSBreadCrumbsLink\"\n >\n Back to search results\n </a>\n <span className=\"space-separator\" />\n </React.Fragment>\n )} */}\n <a href=\"/\" className=\"CMSBreadCrumbsLink\">\n Home\n </a>\n {this.props.items.map(item => {\n return (\n <React.Fragment key={item.id}>\n <span className=\"breadcrumb-separator\" />\n <a href={item.url} className=\"CMSBreadCrumbsLink\">\n {item.name}\n </a>\n </React.Fragment>\n );\n })}\n </div>\n );\n }\n}\n\nBreadcrumbs.propTypes = { items: arrayOf(object) };\nBreadcrumbs.defaultProps = { items: [] };\n","/* eslint-disable react/no-danger */\nimport React from 'react';\nimport { object } from 'prop-types';\n\nconst DiscoverPanel = props => {\n if (!props.panel.title) {\n return null;\n }\n\n return (\n <div className=\"c-discover-panel related-slider\" id={props.panelId}>\n <div className=\"discover-panel c-slider\">\n <div className=\"inner\">\n {props.panel && (\n <div key={props.panel.id} className=\"panel-slide\">\n <div\n className=\"panel-image\"\n style={{ backgroundImage: `url(${props.panel.image})` }}\n >\n <img src={props.panel.image} alt={props.panel.title} loading=\"eager\" fetchPriority=\"high\" />\n </div>\n </div>\n )}\n </div>\n </div>\n\n <div className=\"discover-panel-text\">\n <div className=\"inner\">\n {props.panel && (\n <div key={props.panel.id} className=\"panel-slide\">\n <h3>{props.panel.title}</h3>\n <div className=\"panel-content\" dangerouslySetInnerHTML={{ __html: props.panel.content }} />\n <div className=\"panel-content-data\" style={{ display: 'none' }} dangerouslySetInnerHTML={{ __html: props.panel.content }} />\n </div>\n )}\n </div>\n </div>\n </div>\n );\n};\n\nDiscoverPanel.propTypes = { panel: object };\n\nDiscoverPanel.defaultProps = { panel: {} };\n\nexport default DiscoverPanel;\n","// The filter type names, these need to match the filter type value specified from the API data on each of the filter options\nexport const FILTER_TYPE_MULTI_CHECKBOX = 'multi-checkbox';\nexport const FILTER_TYPE_MULTI_CHECKBOX_HIERARCHY = 'multi-checkbox-hierarchy';\nexport const FILTER_TYPE_SINGLE_CHECKBOX = 'single-checkbox';\nexport const FILTER_TYPE_KEYWORDS = 'keywords';\nexport const FILTER_TYPE_PRICE_RANGE = 'price-range';\nexport const FILTER_TYPE_TAGS = 'tags';\nexport const FILTER_TYPE_TAG = 'tag';\n","import clonedeep from 'lodash.clonedeep';\nimport * as FilterTypeConstants from '../constants/filter-types';\n\n/**\n * Return a new array of active filters with empty values based on filterOptions object from api data\n *\n * @param {Array} filters - The filters to update\n * @returns {Array} Returns - A filtered set of data\n *\n * Example usage:\n *\n * this.setState({\n * activeFilters: initActiveFilters(this.props.data.filterOptions);\n *\n * });\n */\nexport function initActiveFilters(filters) {\n // Early return if filters is not supplied\n if (!filters || !filters.length) {\n return [];\n }\n\n // reset values of the default active filters to empty array\n let defaultActiveFilters = clonedeep(filters);\n defaultActiveFilters = defaultActiveFilters.map(filter => {\n filter.values = [];\n return filter;\n });\n\n return defaultActiveFilters;\n}\n\n/**\n * Returns the passed in active filters with the targeted filter's value updated\n *\n * @param {Array} activeFilters - The active filters, this is an array of objects, each object must at least have the 'code' and 'values' properties\n * @param {string} targetCode - The targeted filter code\n * @param {string} value - The value to be added / removed from the targeted filter\n * @param {bool} forceClear - Force the active filters' value to be cleared (for all filters other than multi checkbox)\n * @returns {Array} Returns - updated active filters\n */\nexport function manageActiveFilters(\n activeFilters,\n targetCode,\n value,\n forceClear\n) {\n // Return early if we dont have enough info\n if (!activeFilters || !targetCode) {\n return activeFilters;\n }\n\n // Clone and loop through the active filters to check against the targeted filter targetCode and\n // to add / remove the specified value from the filter's value list\n const clonedActiveFilters = clonedeep(activeFilters);\n\n clonedActiveFilters.forEach(item => {\n // Skip item if it does not match our target code\n if (!item || item.code !== targetCode) {\n return;\n }\n\n // If filter is checkbox, we toggle the values on / off\n if (\n item.type === FilterTypeConstants.FILTER_TYPE_MULTI_CHECKBOX ||\n item.type === FilterTypeConstants.FILTER_TYPE_SINGLE_CHECKBOX ||\n item.type === FilterTypeConstants.FILTER_TYPE_PRICE_RANGE ||\n item.type ===\n FilterTypeConstants.FILTER_TYPE_MULTI_CHECKBOX_HIERARCHY ||\n item.type === FilterTypeConstants.FILTER_TYPE_TAGS\n ) {\n const found = item.values.find(val => {\n return val.id === value.id;\n });\n if (found) {\n // filter out all values from item's values array\n // that are NOT equal to the deselected value\n item.values = item.values.filter(val => {\n return val.id !== value.id;\n });\n } else {\n // add value to values array of this specific active filter\n item.values = [...item.values, value];\n }\n } else if (!value || forceClear) {\n // All other types of filter, we simply wipe and update the active filter value\n item.values = [];\n } else {\n item.values = [value];\n }\n });\n\n return clonedActiveFilters;\n}\n\n/**\n * Return a new array of active filters with empty values based on filterOptions object from api data\n *\n * @param {Array} activeFilters - The active filters to check\n * @param {String} groupCode - The group code to remove\n * @returns {Array} Returns - the active filters that has values\n */\nexport function removeActiveFilterGroup(activeFilters, groupCode) {\n // Return early if we dont have enough info\n if (!activeFilters || !groupCode) {\n return activeFilters;\n }\n\n // Copy and loop through the active filters to check against the targeted filter groupCode and remove the matching item's values\n const clonedActiveFilters = clonedeep(activeFilters);\n\n clonedActiveFilters.forEach(item => {\n // Skip item if it does not match our target code\n if (!item || item.code !== groupCode) {\n return;\n }\n\n // Remove the values from the matching group\n item.values = [];\n });\n\n return clonedActiveFilters;\n}\n\n/**\n * Return a new array of active filters with empty values based on filterOptions object from api data\n *\n * @param {Array} filters - The active filters to check\n * @returns {Array} Returns - the active filters that has values\n */\nexport function getActiveFiltersWithValues(filters) {\n // Early return if filters is not supplied\n if (!filters || !filters.length) {\n return [];\n }\n\n // Only return the filter items with values\n // return filters.filter(item => item.values && item.values.length);\n return filters.filter(item => {\n return item.values && item.values.length;\n });\n}\n\n// Find the active filter values of the specific filter\nexport function getActiveValues(filter, activeFilters) {\n const found = activeFilters.find(item => {\n return item.code === filter.code;\n });\n let foundArray = found ? found.values : [];\n if (found && typeof found.values[0] === 'object') {\n foundArray = found.values.map(val => {\n return val.id;\n });\n }\n\n return foundArray;\n}\n","// The filter key names, these need to match the queryParam value specified from the API data on each of the filter options\nexport const QUERY_PARAM_SORT = 'currentSort';\nexport const QUERY_PARAM_PAGE = 'currentPage';\n","import { QUERY_PARAM_SORT, QUERY_PARAM_PAGE } from './filter-keys';\n\nexport default [QUERY_PARAM_SORT, QUERY_PARAM_PAGE];\n","/**\n * Return a new array of key strings\n *\n * @param {Object} filters - filter items\n * @returns {Array} Returns - Array containing list of keys\n *\n * Example usage:\n * const filterKeys = getFilterKeys(this.props.filters);\n * const activeFiltersKeys = getFilterKeys(this.props.activeFilters);\n *\n */\nexport default function getFilterKeys(filters = []) {\n const filterKeys = [];\n\n filters.map(key => {\n return filterKeys.push(key.queryParam);\n });\n\n return filterKeys;\n}\n","import clonedeep from 'lodash.clonedeep';\n// import { window } from 'components/global/global';\nimport { getActiveFiltersWithValues } from './active-filters';\nimport querystringWhitelist from '../constants/querystring-whitelist';\nimport { QUERY_PARAM_SORT, QUERY_PARAM_PAGE } from '../constants/filter-keys';\nimport getFilterKeys from './filters/filter-helpers';\nimport validateAgainstWhitelist from './querystring-whitelist-helpers';\n/**\n * Return a new String of of url query params\n *\n * @returns {String} Returns - String of query params for current page url\n *\n * Example usage:\n * const queryString = getQueryString;\n *\n */\nexport function getQueryString() {\n return window.location.search.substring(1);\n}\n\n/**\n * Return a new array of strings\n *\n * @param {Array} queryStringParams - Array of queryString key/value pairs\n * @returns {Array} Returns - New array of strings\n *\n * Example usage:\n * const vars = url.split('&');\n * const qsKys = getQueryStringKeys(vars);\n *\n */\nfunction getQueryStringKeys(queryStringParams) {\n const keys = [];\n\n queryStringParams.forEach(key => {\n const k = key.replace(/=(.+)/, '');\n keys.push(k);\n });\n\n return keys;\n}\n\n/**\n * Return a new array of invalid strings\n *\n * @param {Object} filters - object of available filters\n * @param {string} urlParams - Optional string of url query params (used for testing purposes)\n * @returns {Array} Returns - Array containing strings of invalid url params\n *\n * Example usage:\n * let filterString = persistQueryString(state.activeFilters);\n *\n */\nexport function persistQueryString(\n filters,\n urlParams = window.location.search.substring(1)\n) {\n const queryString = urlParams.split('&');\n const urlKeys = getQueryStringKeys(queryString);\n const filterKeys = getFilterKeys(filters);\n const whitelist = [...querystringWhitelist, ...filterKeys];\n // filter out the invalid key/value pairs from the whitelist and add them to filterString\n if (urlKeys[0] !== '') {\n const invalidKeys = urlKeys.filter(item => {\n return !whitelist.includes(item);\n });\n\n // get the array items from queryString that match the invalid keys\n // assign them to filterString\n return queryString.filter(item => {\n const found = invalidKeys.find(key => {\n return item.startsWith(`${key}=`);\n });\n return found !== undefined;\n });\n }\n\n return [];\n}\n\nexport function parseQueryString(\n queryString,\n filters,\n // eslint-disable-next-line default-param-last\n pageNum = 0, // disable due to causing odd bug that adds `?currentPage=NaN` to querystring\n completeFilters,\n completeSortBy\n) {\n // Default (empty) object of possible filters\n const obj = {\n activeFilters: clonedeep(filters),\n currentPage: pageNum,\n currentSort: 'default',\n };\n\n // Return default object if query string is not set\n if (!queryString) {\n return obj;\n }\n\n // Map the variables to an object\n const variables = queryString.split('&');\n\n const varKeys = getQueryStringKeys(variables);\n const filterKeys = getFilterKeys(filters);\n const whitelist = [...querystringWhitelist, ...filterKeys];\n const hasValidParams = validateAgainstWhitelist(whitelist, varKeys);\n\n // If the url does NOT have params in our whitelist, return null\n // prevents updating the url\n if (!hasValidParams) {\n return null;\n }\n\n variables.forEach(variable => {\n const arr = variable.split('=');\n const key = arr[0];\n const options = arr[1].split(',');\n const isValidKey = whitelist.includes(key);\n\n // early return if undefined on the query string\n if (options.indexOf('undefined') >= 0) {\n return;\n }\n\n // Only parse the string if key is in our whitelist AND we have options\n if (!isValidKey && (!options.length || !options[0])) {\n return;\n }\n\n if (key === QUERY_PARAM_SORT) {\n // Check if the current sort matches to any ID in the complete sort list\n const matchedSort = completeSortBy.find(\n sort => {\n return sort.id === options[0];\n }\n );\n if (matchedSort) {\n obj[key] = matchedSort;\n } else {\n // Simple single value options\n obj[key] = decodeURIComponent(options[0]);\n }\n } else if (key === QUERY_PARAM_PAGE) {\n if ((/\\d$/gi).test(options[0])) {\n // If we have only digits\n obj[key] = options[0]; // eslint-disable-line prefer-destructuring\n }\n } else {\n // Parse active filters\n const currentFilters = decodeURIComponent(options[0]).split('+');\n\n obj.activeFilters.forEach(filter => {\n if (filter.queryParam === key) {\n const filterConfig = completeFilters.find(\n f => {\n return f.queryParam === key;\n }\n );\n\n currentFilters.forEach(current => {\n if (current === 'true') {\n filter.values.push(true);\n } else if (current === 'false') {\n filter.values.push(false);\n } else if (\n filterConfig.values &&\n typeof filterConfig.values[0] === 'object'\n ) {\n filter.values.push(\n filterConfig.values.find(v => {\n return v.id === current;\n })\n );\n } else {\n filter.values.push(current);\n }\n });\n }\n });\n }\n });\n\n return obj;\n}\n\n// Build the query string from the object provided\nexport function buildQueryString(\n value,\n url = window.location.search.substring(1)\n) {\n // If we're passed null we assume filters are being cleared\n if (!value) {\n return '';\n }\n\n // Map the value from a complicated object\n let filterString = [];\n\n Object.keys(value).forEach(key => {\n // Handle the selectedFilters key differently to nomal values (just like in parseQueryString())\n if (key === 'activeFilters') {\n const selectedFilters = getActiveFiltersWithValues(\n value.activeFilters\n );\n selectedFilters.forEach(filter => {\n const opts = filter.values.map(opt => {\n if (typeof opt === 'object') {\n return encodeURIComponent(opt.id);\n }\n return encodeURIComponent(opt);\n });\n filterString.push(`${filter.queryParam}=${opts.join('+')}`);\n });\n } else if (key === QUERY_PARAM_SORT && value[key] !== 'default') {\n if (value[key].id) {\n // If we have an ID on the sort object, just use that in the filter string\n filterString.push(`${key}=${value[key].id}`);\n } else {\n // If we dont have id in the sort object, then we put the whole thing into the filter string\n filterString.push(`${key}=${encodeURIComponent(value[key])}`);\n }\n } else if (key === QUERY_PARAM_PAGE && value[key] !== 0) {\n filterString.push(`${key}=${value[key]}`);\n }\n });\n\n // append non filterable query params to end of built url string\n const invalidParams = persistQueryString(value.activeFilters, url);\n filterString = [...filterString, ...invalidParams];\n\n return filterString.length ? `?${filterString.join('&')}` : '';\n}\n","import React from 'react';\nimport { shape, arrayOf, func, string, object } from 'prop-types';\nimport Icon from '../../../3-components/icon/index.jsx';\nimport { FILTER_TYPE_SINGLE_CHECKBOX } from '../constants/filter-types.js';\n\nexport default function ActiveFiltersSection({\n activeFilters,\n resetFilters,\n toggleFilters,\n}) {\n return (\n <div className=\"listing-active-filters\">\n <div className=\"active-filters-container\">\n <div className=\"active-filters\">\n {activeFilters.map(filter => {\n return filter.values.map(value => {\n return (\n <div\n key={`${filter.code}-${value.id}`}\n className=\"active-filter-item\"\n onClick={e => {\n return toggleFilters(e, filter, [value], true);\n }}\n onKeyPress={e => {\n return toggleFilters(e, filter, [value], true);\n }}\n role=\"button\"\n tabIndex=\"0\"\n >\n <Icon glyph=\"cross\" />\n <span>\n {filter.type === FILTER_TYPE_SINGLE_CHECKBOX\n ? filter.label\n : value.name}\n </span>\n </div>\n );\n });\n }\n )}\n\n {activeFilters.length ? (\n <span className=\"active-filters-reset\" key=\"clear\">\n <div\n className=\"btn-text\"\n onClick={resetFilters}\n onKeyPress={resetFilters}\n role=\"button\"\n tabIndex=\"0\"\n key=\"clear\"\n >\n Clear all\n </div>\n </span>\n ) : (\n ''\n )}\n </div>\n </div>\n </div>\n );\n}\n\nActiveFiltersSection.propTypes = {\n activeFilters: arrayOf(\n shape({\n code: string.isRequired,\n label: string.isRequired,\n values: arrayOf(object).isRequired,\n })\n ).isRequired,\n resetFilters: func.isRequired,\n toggleFilters: func.isRequired,\n};\n","import React from 'react';\nimport $ from 'jquery';\nimport { object, string, shape, arrayOf, func, number, bool, oneOfType } from 'prop-types';\nimport { attachEnterAsClickDecorator } from '../../../../js/utils/attachEnterAsClick.js';\n\nexport default class MultiCheckboxFilter extends React.Component {\n constructor(props) {\n super(props);\n this.filterData = {};\n this.usedData = [];\n }\n\n componentDidMount() {\n if (this.props.isExpanded) {\n $(this.thisElement).addClass('is-open');\n $(this.thisElement).find('.multi-checkbox-filter-panel')\n .show();\n }\n }\n\n componentWillUpdate() {\n this.usedData = [];\n }\n\n handleTitleClick = () => {\n $(this.thisElement).toggleClass('is-open');\n $(this.thisElement).find('.multi-checkbox-filter-panel')\n .slideToggle(300);\n };\n\n fillTopNodes = (filled, remaining) => {\n if (!remaining.length) {\n return filled;\n }\n\n // Find the top level number and the nodes of that top level in the remaining node list\n const entryFilterTypes = this.props.filtersType.trim().split(',');\n const newTopNodes = [];\n remaining.forEach(item => {\n // Make a reference to the item in teh filter data for faster access\n this.filterData[item.id] = item;\n\n // Find the highest level items\n if (entryFilterTypes.length && entryFilterTypes[0] !== '') {\n if (entryFilterTypes.includes(item.id)) {\n newTopNodes.push(item);\n }\n } else if (item.pid === '0' || !item.pid) {\n newTopNodes.push(item);\n }\n });\n\n return [...filled, ...newTopNodes];\n };\n\n handleToggleClick = e => {\n const $currentElement = $(e.currentTarget);\n if ($currentElement.hasClass('animating')) {\n return;\n }\n $currentElement.addClass('animating');\n\n if ($currentElement.hasClass('active')) {\n $currentElement.siblings('.checkbox-item').slideUp(300, () => {\n $currentElement.removeClass('animating');\n });\n $currentElement.removeClass('active');\n } else {\n $currentElement.siblings('.checkbox-item').slideDown(300, () => {\n $currentElement.removeClass('animating');\n });\n $currentElement.addClass('active');\n }\n };\n\n handleChildCheckboxCheck = (e, value) => {\n const valueArray = [];\n\n window.dataLayer = window.dataLayer || [];\n\n // values for datalayer pushes\n const filterCategory = $(e.currentTarget)\n .closest('.multi-checkbox-filter')\n .find('.expand-header')[0].innerText;\n const filterSubCategory = $(e.currentTarget)\n .parents('.checkbox-item')\n .last()\n .find('label')[0].innerText;\n\n // Get the parent checkbox\n const checkedNodes = $(e.currentTarget).parents('.checkbox-item')\n .find('> input:checked');\n if (e.currentTarget.checked) {\n // Uncheck parent\n if ($(checkedNodes).first()\n .attr('id') !== $(e.currentTarget).attr('id')) {\n const nodeVal = JSON.parse($(checkedNodes).first()\n .val());\n valueArray.push(nodeVal);\n }\n\n // Each checkbox can also be the parent, we want to uncheck all children\n const childrenNodes = $(e.currentTarget).siblings('.checkbox-item')\n .find('input:checked');\n childrenNodes.each(function() {\n const nodeVal = JSON.parse($(this).val());\n valueArray.push(nodeVal);\n });\n window.dataLayer.push({\n event: 'filter_clicked',\n filter_action: 'filter selected',\n filter_category: filterCategory,\n filter_name: $(`label[for=\"${e.currentTarget.id}\"]`).html(),\n filter_sub_category: filterSubCategory,\n });\n } else {\n window.dataLayer.push({\n event: 'filter_clicked',\n filter_action: 'filter deselected',\n filter_category: filterCategory,\n filter_name: $(`label[for=\"${e.currentTarget.id}\"]`).html(),\n filter_sub_category: filterSubCategory,\n });\n }\n\n valueArray.push(value);\n this.props.toggleFilters(e, this.props.filter, valueArray);\n };\n\n renderFilterNode = (childNode, listId, depth = 4) => {\n // If the node has already been used, we skip it\n if (this.usedData.includes(childNode.id)) {\n return null;\n }\n\n this.usedData.push(childNode.id);\n\n // @HACK - we add rule here to expand the \"document\" type by default\n if (childNode.id === 'document') {\n childNode.hasActiveChildren = true;\n }\n\n const grandChild = this.getChildren(childNode.children, listId, depth - 1);\n\n return (\n <div className=\"checkbox-item\" key={childNode.id}>\n {grandChild.length > 0 ? (\n <span\n className={childNode.hasActiveChildren ? 'toggle active' : 'toggle'}\n role=\"button\"\n tabIndex=\"-1\"\n onClick={this.handleToggleClick}\n onKeyPress={attachEnterAsClickDecorator(this.handleToggleClick)}\n >\n <i className=\"plus\">+</i><i className=\"minus\">-</i>\n </span>\n ) : ''}\n <input\n id={`${listId}-${childNode.id}`}\n onChange={e => {\n return this.handleChildCheckboxCheck(e, childNode);\n }}\n onKeyPress={e => {\n return this.handleChildCheckboxCheck(e, childNode);\n }}\n type=\"checkbox\"\n value={JSON.stringify(childNode)}\n checked={this.props.selectedItems.includes(childNode.id) ? 'checked' : ''}\n />\n <label htmlFor={`${listId}-${childNode.id}`}>{childNode.name}</label>\n {grandChild}\n </div>\n );\n };\n\n getChildren = (childIds, listId, depth) => {\n const childs = [];\n\n if (!childIds || childIds.length === 0 || depth === 0) {\n return childs;\n }\n\n childIds.forEach(childId => {\n const childNode = this.props.filter.values.find(node => {\n return node.id === childId;\n });\n if (!childNode) {\n return;\n }\n\n childs.push(this.renderFilterNode(childNode, listId, depth));\n });\n\n return childs;\n };\n\n render() {\n const listId = `multi-checkbox-${this.props.filter.code}`;\n let topNodes = this.props.filter.values;\n\n if (this.props.isHierarchy) {\n topNodes = this.fillTopNodes([], [...this.props.filter.values]);\n }\n\n const checkboxItems = topNodes.map(value => {\n return this.renderFilterNode(value, listId);\n });\n\n return (\n <div\n className={`multi-checkbox-filter depth-4 ${this.props.classModifier}`} ref={c => {\n this.thisElement = c;\n }}\n >\n <div\n className=\"expand-header\"\n onClick={this.handleTitleClick}\n onKeyPress={this.handleTitleClick}\n role=\"combobox\"\n aria-controls={listId}\n aria-expanded=\"false\"\n tabIndex=\"0\"\n >\n <p>{this.props.filter.label}</p>\n </div>\n <div className={`multi-checkbox-filter-panel ${checkboxItems.length > 0 ? 'has-children' : ''}`} id={listId} style={{ display: 'none' }}>\n <div className=\"checkbox-wrapper\" id={listId}>\n <div className=\"input-wrapper\">\n {checkboxItems}\n </div>\n </div>\n </div>\n </div>\n );\n }\n}\n\nMultiCheckboxFilter.propTypes = {\n filter: shape({\n code: string.isRequired,\n label: string.isRequired,\n values: arrayOf(object).isRequired,\n }).isRequired,\n classModifier: string,\n selectedItems: arrayOf(oneOfType([string, number, bool])).isRequired,\n toggleFilters: func.isRequired,\n isHierarchy: bool,\n isExpanded: bool,\n filtersType: string,\n};\n\nMultiCheckboxFilter.defaultProps = {\n classModifier: '',\n isHierarchy: false,\n isExpanded: false,\n filtersType: '',\n};\n","import React from 'react';\nimport { shape, arrayOf, func, string, object } from 'prop-types';\nimport { attachEnterAsClickDecorator } from '../../../js/utils/attachEnterAsClick';\nimport * as FilterTypeConstants from '../constants/filter-types.js';\nimport { getActiveValues } from '../utils/active-filters.js';\nimport ActiveFiltersSection from '../active-filters/index.jsx';\nimport MultiCheckboxFilter from './multi-checkbox-filter/index.jsx';\n\nexport default class FiltersSection extends React.Component {\n handleMobileClose = () => {\n this.filterSection.classList.toggle('mobile-active');\n };\n\n render() {\n const {\n filters,\n activeFilters,\n toggleFilters,\n resetFilters,\n filtersType,\n } = this.props;\n\n return (\n <div\n className=\"filters-section\"\n ref={c => {\n this.filterSection = c;\n }}\n >\n <div className=\"filters-container\">\n <button\n className=\"filters-mobile-close\"\n type=\"button\"\n onClick={this.handleMobileClose}\n >\n <span className=\"flex-wrapper\">\n <span className=\"hamburger-box\">\n <span className=\"hamburger-inner\" />\n </span>\n Close\n </span>\n </button>\n <div className=\"filters\">\n <div className=\"filters-heading\">Refine by</div>\n\n <ActiveFiltersSection\n activeFilters={activeFilters}\n resetFilters={resetFilters}\n toggleFilters={attachEnterAsClickDecorator(\n toggleFilters\n )}\n />\n\n {!filters.length ? (\n <div className=\"filters-empty\">\n No applicable filter for the current set of\n items.\n </div>\n ) : (\n ''\n )}\n\n {filters.map((filter, index) => {\n const activeValues = getActiveValues(\n filter,\n activeFilters\n );\n const hasActive = activeFilters.find(\n active => {\n return active.code === filter.code;\n }\n );\n switch (filter.type) {\n case FilterTypeConstants.FILTER_TYPE_MULTI_CHECKBOX_HIERARCHY:\n case FilterTypeConstants.FILTER_TYPE_PRICE_RANGE:\n case FilterTypeConstants.FILTER_TYPE_MULTI_CHECKBOX: {\n return (\n <MultiCheckboxFilter\n key={filter.code}\n filter={filter}\n selectedItems={activeValues}\n toggleFilters={toggleFilters}\n classModifier=\"filter-item\"\n isHierarchy={\n filter.type ===\n FilterTypeConstants.FILTER_TYPE_MULTI_CHECKBOX_HIERARCHY\n }\n isExpanded={\n index === 0 || !!hasActive\n }\n filtersType={\n filter.type ===\n FilterTypeConstants.FILTER_TYPE_MULTI_CHECKBOX_HIERARCHY\n ? filtersType\n : ''\n }\n />\n );\n }\n default:\n return null;\n }\n })}\n </div>\n </div>\n </div>\n );\n }\n}\n\nFiltersSection.propTypes = {\n filters: arrayOf(\n shape({\n code: string.isRequired,\n label: string.isRequired,\n values: arrayOf(object),\n })\n ).isRequired,\n activeFilters: arrayOf(\n shape({\n code: string.isRequired,\n label: string.isRequired,\n values: arrayOf(object).isRequired,\n })\n ).isRequired,\n toggleFilters: func.isRequired,\n resetFilters: func.isRequired,\n filtersType: string.isRequired,\n};\n","import React from 'react';\nimport { object, arrayOf, func, string, oneOfType } from 'prop-types';\n\nexport default function SortBy({\n items,\n currentSort,\n updateSort,\n sortId,\n toggleSortFilter,\n openedSortFilter,\n}) {\n if (!items || !items.length) {\n return null;\n }\n const isAscending =\n currentSort && typeof currentSort === 'object'\n ? currentSort.ascending\n : true;\n\n let [{ displayText: selectedDisplayText }] = items;\n const [currentItem] = items.filter(\n i => {\n return JSON.stringify(i) === JSON.stringify(currentSort);\n }\n );\n\n if (currentItem && currentItem.displayText) {\n selectedDisplayText = currentItem.displayText;\n } else if (currentItem && currentItem.label) {\n selectedDisplayText = currentItem.label;\n } else {\n selectedDisplayText = items[0].displayText\n ? items[0].displayText\n : items[0].label;\n }\n\n const selectOption = sort => {\n updateSort(sort);\n toggleSortFilter(sortId);\n };\n\n return (\n <div\n className={`sort-by ${isAscending ? 'asc' : 'desc'} ${\n openedSortFilter === sortId ? 'open' : ''\n }`}\n >\n <div className=\"select-wrapper\">\n <div className=\"input-wrapper\">\n <span\n role=\"button\"\n tabIndex=\"0\"\n className=\"display-text\"\n onClick={() => {\n return toggleSortFilter(sortId);\n }}\n onKeyPress={() => {\n return toggleSortFilter(sortId);\n }}\n >\n {selectedDisplayText}\n </span>\n\n <div className=\"options-dropdown\">\n {items.map(sort => {\n return (\n <span\n role=\"button\"\n tabIndex=\"0\"\n key={sort.id}\n onClick={() => {\n return selectOption(sort);\n }}\n onKeyPress={() => {\n return selectOption(sort);\n }}\n >\n {sort.label}\n </span>\n );\n })}\n </div>\n </div>\n </div>\n </div>\n );\n}\n\nSortBy.propTypes = {\n items: arrayOf(object).isRequired,\n currentSort: oneOfType([string, object]),\n updateSort: func.isRequired,\n toggleSortFilter: func.isRequired,\n sortId: string.isRequired,\n openedSortFilter: oneOfType([string, object]).isRequired,\n};\n\nSortBy.defaultProps = { currentSort: '' };\n","import React from 'react';\nimport { arrayOf, func, number } from 'prop-types';\n\nexport default function PageSize({ sizes, currentPageSize, updatePageSize }) {\n if (!sizes || !sizes.length) {\n return null;\n }\n\n return (\n <div className=\"page-size\">\n <div className=\"select-wrapper\">\n <div className=\"input-wrapper\">\n {/* custom select not working since react did not get the onchange event */}\n <select\n className=\"no-custom-select\"\n id=\"listing-pagesize\"\n value={currentPageSize}\n onChange={e => {\n return updatePageSize(e.target.value);\n }}\n >\n {sizes.map(pagesize => {\n return (\n <option key={pagesize} value={pagesize}>\n {pagesize} per page\n </option>\n );\n })}\n </select>\n </div>\n </div>\n </div>\n );\n}\n\nPageSize.propTypes = {\n sizes: arrayOf(number).isRequired,\n currentPageSize: number,\n updatePageSize: func.isRequired,\n};\n\nPageSize.defaultProps = { currentPageSize: 24 };\n","import React from 'react';\nimport { number, func, string } from 'prop-types';\nimport ReactPaginate from '../../../3-components/pagination/index.jsx';\n\nexport default class ItemPagination extends React.Component {\n constructor(props) {\n super(props);\n this.clickPage = this.clickPage.bind(this);\n }\n\n clickPage(value) {\n this.props.changePage(value.selected);\n }\n\n render() {\n if (this.props.totalPages <= 1) {\n return null;\n }\n\n return (\n <div className=\"pagination-wrapper\">\n <ReactPaginate\n pageNum={this.props.totalPages}\n pageRangeDisplayed={5}\n marginPagesDisplayed={1}\n clickCallback={this.clickPage}\n forceSelected={this.props.currentPage}\n initialSelected={this.props.currentPage}\n previousLabel=\"Previous\"\n prevIcon=\"caret-left\"\n nextLabel=\"Next\"\n nextIcon=\"caret-right\"\n containerClassName=\"c-pagination mobile-view\"\n pageClassName=\"page\"\n mobileBreakpoint={768}\n serverPageUrl={this.props.serverPageUrl}\n />\n </div>\n );\n }\n}\n\nItemPagination.propTypes = {\n totalPages: number.isRequired,\n currentPage: number.isRequired,\n changePage: func.isRequired,\n serverPageUrl: string.isRequired,\n};\n","import React from 'react';\nimport {\n arrayOf,\n func,\n string,\n number,\n bool,\n shape,\n oneOfType,\n object\n} from 'prop-types';\nimport SortBy from './sort-by/index.jsx';\nimport PageSize from './page-size/index.jsx';\nimport ItemPagination from '../items/ItemPagination.jsx';\n\nexport default function ToolbarSection({\n sortBy,\n currentSort,\n totalPages,\n sort,\n defaultItemPerpage,\n currentPage,\n currentPageSize,\n updateSort,\n changePage,\n changePageSize,\n serverPageUrl,\n}) {\n const pageSizeOption = [24, 48, 60, 72];\n\n if (\n defaultItemPerpage > 0 &&\n pageSizeOption.indexOf(defaultItemPerpage) < 0\n ) {\n pageSizeOption.push(defaultItemPerpage);\n pageSizeOption.sort((a, b) => {\n return a - b;\n });\n }\n\n return (\n <div className=\"listing-toolbar\">\n <div className=\"toolbar-container\">\n <div className=\"tool-bar-front\">\n <SortBy\n sortId={sort.sortId}\n openedSortFilter={sort.openedSortFilter}\n toggleSortFilter={sort.toggleSortFilter}\n items={sortBy}\n currentSort={currentSort}\n updateSort={updateSort}\n />\n <PageSize\n sizes={pageSizeOption}\n currentPageSize={currentPageSize}\n updatePageSize={changePageSize}\n />\n </div>\n <div className=\"tool-bar-front\">\n <ItemPagination\n totalPages={totalPages}\n currentPage={currentPage}\n changePage={changePage}\n serverPageUrl={serverPageUrl}\n />\n </div>\n </div>\n </div>\n );\n}\n\nToolbarSection.propTypes = {\n sortBy: arrayOf(\n shape({\n label: string.isRequired,\n field: string.isRequired,\n ascending: bool.isRequired,\n })\n ),\n sort: oneOfType([string, object]).isRequired,\n currentSort: oneOfType([string, object]),\n totalPages: number.isRequired,\n currentPage: number.isRequired,\n currentPageSize: number.isRequired,\n changePage: func.isRequired,\n changePageSize: func.isRequired,\n updateSort: func.isRequired,\n defaultItemPerpage: number,\n};\n\nToolbarSection.defaultProps = {\n sortBy: [],\n currentSort: '',\n defaultItemPerpage: 0,\n};\n","/* eslint-disable react/no-danger */\nimport React from 'react';\n// import DOMPurify from 'dompurify';\nimport { string, shape } from 'prop-types';\n\nexport default function BaseTile({ item }) {\n return (\n <a href={item.url} className=\"c-base-tile\">\n {item.thumbnail && (\n <div className=\"base-tile-image\">\n <img src={item.thumbnail} alt={item.title} />\n </div>\n )}\n <div className=\"base-tile-content\">\n <h3\n className=\"base-tile-title\"\n dangerouslySetInnerHTML={{ __html: item.title }}\n />\n\n {item.subtext && (\n <p className=\"base-tile-text\">{item.subtext}</p>\n )}\n\n {item.cta && (\n <button className=\"base-tile-btn btn-skin-1\" type=\"button\">\n {item.cta}\n </button>\n )}\n </div>\n </a>\n );\n}\n\nBaseTile.propTypes = {\n item: shape({\n url: string.isRequired,\n title: string.isRequired,\n subtext: string,\n cta: string,\n excerpt: string,\n thumbnail: string,\n }).isRequired,\n};\n","/* eslint-disable react/no-danger */\nimport React from 'react';\nimport { string, shape, bool, arrayOf, object, number } from 'prop-types';\nimport Loader from '../loader/index.jsx';\n\nexport default class ProductTile extends React.Component {\n constructor(props) {\n super(props);\n\n this.state = {\n selectedColourIndex: 0,\n selectedColourId: '',\n statusError: false,\n };\n }\n\n shouldComponentUpdate(nextProps, nextState) {\n if (\n this.props.item.url !== nextProps.item.url ||\n this.props.item.srcUrl !== nextProps.item.srcUrl ||\n this.props.item.title !== nextProps.item.title ||\n this.props.item.images !== nextProps.item.images ||\n this.props.item.productId !== nextProps.item.productId ||\n this.props.item.statusNew !== nextProps.item.statusNew ||\n this.props.item.statusSale !== nextProps.item.statusSale ||\n this.props.item.statusStock !== nextProps.item.statusStock ||\n this.props.item.discountinued !== nextProps.item.discountinued ||\n this.props.item.isDiscontinued !== nextProps.item.isDiscontinued ||\n this.props.item.description !== nextProps.item.description ||\n this.props.item.thumbnail !== nextProps.item.thumbnail ||\n this.props.item.loadingDetail !== nextProps.item.loadingDetail ||\n this.state.selectedColourIndex !== nextState.selectedColourIndex ||\n this.state.selectedColourId !== nextState.selectedColourId ||\n this.state.statusError !== nextState.statusError\n ) {\n return true;\n }\n\n return false;\n }\n\n componentDidUpdate() {\n if (this.state.statusError) {\n throw new Error(`Items data missing for ${this.props.item.id}`);\n }\n }\n\n renderPrice = () => {\n if (!this.props.item.items) {\n this.setState({ statusError: true });\n return null;\n }\n const currentProd = this.props.item.items[this.state.selectedColourIndex];\n\n if (this.props.productView === 'staff') {\n if (currentProd.staff !== '' && currentProd.staff !== null) {\n return (\n <div className=\"price-labels\">\n <div className=\"price-sub\">\n Retail{' '}\n <span className=\"price-val\">\n <del>{currentProd.retail}</del>\n </span>\n </div>\n <div className=\"price-main\">\n Staff{' '}\n <span className=\"price-highlight\">\n {currentProd.staff}\n </span>\n </div>\n </div>\n );\n }\n return (\n <div className=\"price-labels\">\n <div className=\"price-sub\">\n Retail{' '}\n <span className=\"price-val\">\n {currentProd.retail\n ? `${currentProd.retail}`\n : 'n/a'}\n </span>\n </div>\n <div className=\"price-main\">\n Staff{' '}\n <span className=\"price-highlight\">\n {this.props.noPriceLabel}\n </span>\n </div>\n </div>\n );\n }\n\n if (this.props.productView === 'showroom') {\n if (\n currentProd.showroom === '' ||\n currentProd.showroom === null ||\n currentProd.showroom === undefined\n ) {\n return (\n <div className=\"price-labels\">\n <div className=\"price-sub\">\n Retail{' '}\n <span className=\"price-val\">\n {currentProd.retail\n ? `${currentProd.retail}`\n : 'n/a'}\n </span>\n </div>\n <div className=\"price-main\">\n Showroom{' '}\n <span className=\"price-highlight\">\n {this.props.noPriceLabel}\n </span>\n </div>\n </div>\n );\n }\n return (\n <div className=\"price-labels\">\n <div className=\"price-sub\">\n Retail{' '}\n <span className=\"price-val\">\n <del>{currentProd.retail}</del>\n </span>\n </div>\n <div className=\"price-main\">\n Showroom{' '}\n <span className=\"price-highlight\">\n {currentProd.showroom}\n </span>\n </div>\n </div>\n );\n }\n\n if (this.props.productView === 'trade') {\n return (\n <div className=\"price-labels\">\n <div className=\"price-main\">\n Retail{' '}\n <span className=\"price-val\">\n {currentProd.retail\n ? `${currentProd.retail}`\n : 'n/a'}\n </span>\n </div>\n </div>\n );\n }\n\n if (\n currentProd.contactDistributor &&\n currentProd.contactDistributor !== 'false'\n ) {\n return (\n <div className=\"price-labels\">\n <div className=\"price-main\">\n <span className=\"contact-distributor\">\n {this.props.contactDistributor}\n </span>\n </div>\n </div>\n );\n }\n\n if (\n currentProd.comingSoon &&\n currentProd.comingSoon !== 'false'\n ) {\n return (\n <div className=\"price-labels\">\n <div className=\"price-main\" />\n </div>\n );\n }\n\n // By default return retail price\n if (currentProd.retail) {\n return (\n <div className=\"price-labels\">\n <div className=\"price-main\">\n {currentProd.retail &&\n (!currentProd.contactDistributor ||\n currentProd.contactDistributor !== 'true')\n ? `From ${currentProd.retail} (RRP)`\n : this.props.contactDistributor}\n {/* {currentProd.retail &&\n (!currentProd.comingSoon ||\n currentProd.comingSoon !== 'true')\n ? `From ${currentProd.retail} (RRP)`\n : ''} */}\n </div>\n </div>\n );\n }\n\n return null;\n };\n\n getProductImage = () => {\n if (\n this.props.item.items &&\n this.props.item.items.length &&\n this.props.item.items[this.state.selectedColourIndex].image\n ) {\n return (\n this.props.item.baseImageUrl +\n this.props.item.items[this.state.selectedColourIndex].image\n );\n }\n\n return this.props.item.thumbnail;\n };\n\n getProductTitle = () => {\n if (\n this.props.item.items &&\n this.props.item.items.length &&\n this.props.item.items[this.state.selectedColourIndex].description\n ) {\n return (\n this.props.item.items[this.state.selectedColourIndex].description\n );\n }\n\n return this.props.item.title;\n };\n\n renderPriceDom = () => {\n const { productView, item } = this.props;\n if (!productView || !item.items || !item.items.length) {\n this.setState({ statusError: true });\n return null;\n }\n return (\n <>\n {productView !== 'noprice' && this.renderPrice()}\n <div className=\"price-colours\">\n {item.items.map((color, index) => {\n if (index >= 6) {\n return null;\n }\n const classes =\n index >= 4 ? 'hidden-sm hidden-md' : '';\n return (\n <div\n key={color.id}\n className={`colour-option ${\n index === this.state.selectedColourIndex\n ? 'selected'\n : ''\n }${classes}`}\n style={{ backgroundColor: color.rgb }}\n onClick={e => {\n e.stopPropagation();\n e.preventDefault();\n return this.setState({\n selectedColourIndex: index,\n selectedColourId: color.id,\n });\n }}\n />\n );\n })}\n {item.items.length > 4 && (\n <span className=\"colour-more hidden-xs hidden-lg\">\n +{item.items.length - 4}\n </span>\n )}\n {item.items.length > 6 && (\n <span className=\"colour-more hidden-sm hidden-md\">\n +{item.items.length - 6}\n </span>\n )}\n </div>\n </>\n );\n };\n\n sendClickData() {\n window.dataLayer.push({\n event: 'search_result_clicked',\n filter_category: 'Product',\n filter_sub_category: null,\n search_page_position: this.props.currentPage + 1,\n search_result_position: this.props.resultPosition,\n site_search_category: 'Federated Search',\n site_search_keyword: this.props.keywords,\n search_term: this.props.keywords,\n });\n }\n\n render() {\n let discountinuedFlag = false;\n if (\n this.props.item.items &&\n this.props.item.items.length &&\n this.props.item.items[this.state.selectedColourIndex]\n ) {\n discountinuedFlag =\n this.props.item.items[this.state.selectedColourIndex]\n .discontinued;\n }\n\n let comingSoonFlag = false;\n if (\n this.props.item.items &&\n this.props.item.items.length &&\n this.props.item.items[this.state.selectedColourIndex]\n ) {\n comingSoonFlag =\n this.props.item.items[this.state.selectedColourIndex]\n .comingSoon;\n }\n\n const {\n rangeDescription,\n productName,\n shortDescription,\n overlayLabel,\n } = this.props.item;\n const useTitle =\n !rangeDescription ||\n rangeDescription === '' ||\n !productName ||\n productName === '' ||\n !shortDescription ||\n shortDescription === '';\n\n let productUrl = this.props.item.url;\n\n if (this.state.selectedColourId) {\n productUrl = this.props.item.url.split('?')[0];\n productUrl = `${productUrl}?itemno=${this.state.selectedColourId}`;\n }\n\n // let backto = this.props.item.url.indexOf('?') >= 0 ? '&' : '?';\n\n // backto = this.props.item.url.indexOf('?') >= 0 ? '&' : '?';\n // backto = this.props.item.srcUrl\n // ? `${backto}backto=${this.props.item.srcUrl}`\n // : '';\n\n return (\n <a\n href={`${productUrl}`}\n title={this.props.item.title\n .replace('<em>', '')\n .replace('</em>', '')} // due to poor data passed from Search API\n onClick={() => {\n return this.sendClickData();\n }}\n className=\"c-product-tile\"\n aria-label={this.props.item.title}\n >\n <div className=\"tile-image\">\n <img\n src={this.getProductImage()}\n alt={this.props.item.title}\n loading={this.props.loadLazy ? 'lazy': null}\n onError={e => {\n e.currentTarget.onerror = null;\n e.currentTarget.src = this.props.item.altImage;\n }}\n />\n </div>\n <div className=\"tile-content\">\n <div className=\"status-container\">\n {this.props.item.statusNew && (\n <span className=\"status new\">New</span>\n )}\n {this.props.item.statusSale && (\n <span className=\"status sale\">Sale</span>\n )}\n {overlayLabel && (\n <span className=\"status skin-only\">\n {overlayLabel}\n </span>\n )}\n {this.props.item.statusStock && (\n <span className=\"status outofstock\">\n Item out of stock\n </span>\n )}\n {/* {this.props.item.energyEfficient && <span className=\"energyEfficient\"><Icon glyph=\"pictogram-leaf\" /></span>} */}\n {discountinuedFlag && discountinuedFlag !== 'false' && (\n <p className=\"body-small\">\n <span className=\"discountinued\">\n Discontinued\n </span>\n </p>\n )}\n {comingSoonFlag && comingSoonFlag !== 'false' && (\n <p className=\"body-small\">\n <span className=\"coming-soon\">\n Coming Soon\n </span>\n </p>\n )}\n {comingSoonFlag && comingSoonFlag !== 'false' && (\n <p className=\"body-small\">\n <span className=\"coming-soon\">\n Coming Soon\n </span>\n </p>\n )}\n </div>\n\n <p className=\"body-small\">\n <span\n className=\"product-id\"\n dangerouslySetInnerHTML={{ __html: this.props.item.productId }}\n />\n </p>\n\n {useTitle && (\n <div\n className=\"tile-title\"\n dangerouslySetInnerHTML={{ __html: this.getProductTitle() }}\n />\n )}\n\n {\n !useTitle && (\n <div className=\"tile-title\">\n {rangeDescription} {productName}\n </div>\n )\n }\n\n {!useTitle && (\n <p className=\"product-description small-desktop\">\n {shortDescription}\n </p>\n )}\n\n {this.props.item.description && (\n <p className=\"product-description small-desktop\">\n {this.props.item.description}\n </p>\n )}\n\n {this.renderPriceDom()}\n\n {this.props.item.loadingDetail &&\n this.props.productView !== 'noprice' && (\n <p className=\"product-description small-desktop loading-text\">\n <Loader tag=\"span\" />\n <span>Loading price...</span>\n </p>\n )}\n </div>\n </a>\n );\n }\n}\n\nProductTile.propTypes = {\n item: shape({\n url: string.isRequired,\n title: string.isRequired,\n rangeDescription: string,\n productName: string,\n shortDescription: string,\n productId: string.isRequired,\n srcUrl: string.isRequired,\n price: string,\n colors: arrayOf(string),\n range: string,\n description: string,\n items: arrayOf(object),\n statusNew: bool,\n statusSale: bool,\n statusSkin: bool,\n statusStock: bool,\n discountinued: bool,\n comingSoon: bool,\n thumbnail: string,\n baseImageUrl: string,\n altImage: string,\n loadingDetail: bool,\n }).isRequired,\n resultPosition: number,\n currentPage: number,\n productView: string,\n noPriceLabel: string,\n contactDistributor: string,\n keywords: string,\n loadLazy: bool,\n};\n\nProductTile.defaultProps = {\n productView: '',\n noPriceLabel: '',\n contactDistributor: '',\n};\n","/* eslint-disable react/no-danger */\nimport React from 'react';\nimport { string, shape, bool, arrayOf, number } from 'prop-types';\nimport Loader from '../loader/index.jsx';\n\nexport default class ProductTileList extends React.Component {\n constructor(props) {\n super(props);\n\n this.state = {\n selectedColourIndex: 0,\n selectedColourId: '',\n statusError: false,\n };\n }\n\n shouldComponentUpdate(nextProps, nextState) {\n if (\n this.props.item.url !== nextProps.item.url ||\n this.props.item.srcUrl !== nextProps.item.srcUrl ||\n this.props.item.title !== nextProps.item.title ||\n this.props.item.productId !== nextProps.item.productId ||\n this.props.item.statusNew !== nextProps.item.statusNew ||\n this.props.item.statusSale !== nextProps.item.statusSale ||\n this.props.item.statusStock !== nextProps.item.statusStock ||\n this.props.item.discountinued !== nextProps.item.discountinued ||\n this.props.item.comingSoon !== nextProps.item.comingSoon ||\n this.props.item.description !== nextProps.item.description ||\n this.props.item.thumbnail !== nextProps.item.thumbnail ||\n this.props.item.loadingDetail !== nextProps.item.loadingDetail ||\n this.state.selectedColourIndex !== nextState.selectedColourIndex ||\n this.state.selectedColourId !== nextState.selectedColourId ||\n this.state.statusError !== nextState.statusError\n ) {\n return true;\n }\n\n return false;\n }\n\n componentDidUpdate() {\n if (this.state.statusError) {\n throw new Error(`Items data missing for ${this.props.item.id}`);\n }\n }\n\n renderPrice = () => {\n const currentProd = this.props.item.items[this.state.selectedColourIndex];\n const { productView, item } = this.props;\n\n if (!currentProd) {\n this.setState({ statusError: true });\n return null;\n }\n\n if (!productView || !item.items || !item.items.length) {\n this.setState({ statusError: true });\n return null;\n }\n\n if (this.props.productView === 'staff') {\n if (currentProd.staff !== '' && currentProd.staff !== null) {\n return (\n <div className=\"price-labels\">\n <div className=\"price-sub\">\n Retail{' '}\n <span className=\"price-val\">\n <del>{currentProd.retail}</del>\n </span>\n </div>\n <div className=\"price-main\">\n Staff{' '}\n <span className=\"price-highlight\">\n {currentProd.staff}\n </span>\n </div>\n </div>\n );\n }\n return (\n <div className=\"price-labels\">\n <div className=\"price-sub\">\n Retail{' '}\n <span className=\"price-val\">\n {currentProd.retail\n ? `${currentProd.retail}`\n : 'n/a'}\n </span>\n </div>\n <div className=\"price-main\">\n Staff{' '}\n <span className=\"price-highlight\">\n {this.props.noPriceLabel}\n </span>\n </div>\n </div>\n );\n }\n\n if (this.props.productView === 'showroom') {\n if (\n currentProd.showroom === '' ||\n currentProd.showroom === null ||\n currentProd.showroom === undefined\n ) {\n return (\n <div className=\"price-labels\">\n <div className=\"price-sub\">\n Retail{' '}\n <span className=\"price-val\">\n {currentProd.retail\n ? `${currentProd.retail}`\n : 'n/a'}\n </span>\n </div>\n <div className=\"price-main\">\n Showroom{' '}\n <span className=\"price-highlight\">\n {this.props.noPriceLabel}\n </span>\n </div>\n </div>\n );\n }\n return (\n <div className=\"price-labels\">\n <div className=\"price-sub\">\n Retail{' '}\n <span className=\"price-val\">\n <del>{currentProd.retail}</del>\n </span>\n </div>\n <div className=\"price-main\">\n Showroom{' '}\n <span className=\"price-highlight\">\n {currentProd.showroom}\n </span>\n </div>\n </div>\n );\n }\n\n if (this.props.productView === 'trade') {\n return (\n <div className=\"price-labels\">\n <div className=\"price-main\">\n Retail{' '}\n <span className=\"price-val\">\n {currentProd.retail\n ? `${currentProd.retail}`\n : 'n/a'}\n </span>\n </div>\n </div>\n );\n }\n\n if (\n currentProd.contactDisclaimer &&\n currentProd.contactDistributor !== 'false'\n ) {\n return (\n <div className=\"price-labels\">\n <div className=\"price-main\">\n Contact your local Distributor for pricing\n </div>\n </div>\n );\n }\n\n if (\n currentProd.comingSoon &&\n currentProd.comingSoon !== 'false'\n ) {\n return (\n <div className=\"price-labels\">\n <div className=\"price-main\" />\n </div>\n );\n }\n\n // By default return retail price\n if (currentProd.retail) {\n return (\n <div className=\"price-labels\">\n <div className=\"price-main\">\n {currentProd.retail &&\n (!currentProd.contactDistributor ||\n currentProd.contactDistributor !== 'true')\n ? `From ${currentProd.retail} (RRP)`\n : this.props.contactDistributor}\n {/* {currentProd.retail &&\n (!currentProd.comingSoon ||\n currentProd.comingSoon !== 'true')\n ? `From ${currentProd.retail} (RRP)`\n : ''} */}\n </div>\n </div>\n );\n }\n\n return null;\n };\n\n getProductImage = () => {\n if (\n this.props.item.items &&\n this.props.item.items.length &&\n this.props.item.items[this.state.selectedColourIndex].image\n ) {\n return (\n this.props.item.baseImageUrl +\n this.props.item.items[this.state.selectedColourIndex].image\n );\n }\n\n return this.props.item.thumbnail;\n };\n\n getProductTitle = () => {\n if (\n this.props.item.items &&\n this.props.item.items.length &&\n this.props.item.items[this.state.selectedColourIndex].description\n ) {\n return (\n this.props.item.items[this.state.selectedColourIndex].description\n );\n }\n\n return this.props.item.title;\n };\n\n getStatus = clasess => {\n if (\n this.props.item.statusNew ||\n this.props.item.statusSale ||\n this.props.item.statusStock ||\n this.props.item.energyEfficient ||\n this.props.item.overlayLabel\n ) {\n return (\n <div className={`${clasess} status-container`}>\n {/* {this.props.item.energyEfficient && <span className=\"energyEfficient\"><Icon glyph=\"pictogram-leaf\" /></span>} */}\n {this.props.item.overlayLabel && (\n <span className=\"status skin-only\">\n {this.props.item.overlayLabel}\n </span>\n )}\n {this.props.item.statusNew && (\n <span className=\"status new\">New</span>\n )}\n {this.props.item.statusSale && (\n <span className=\"status sale\">Sale</span>\n )}\n {this.props.item.statusStock && (\n <span className=\"status outodstock\">\n Item out of stock\n </span>\n )}\n </div>\n );\n }\n\n return null;\n };\n\n sendClickData() {\n window.dataLayer.push({\n event: 'search_result_clicked',\n filter_category: 'Product',\n filter_sub_category: null,\n search_page_position: this.props.currentPage + 1,\n search_result_position: this.props.resultPosition,\n site_search_category: 'Federated Search',\n site_search_keyword: this.props.keywords,\n search_term: this.props.keywords,\n });\n }\n\n render() {\n let discountinuedFlag = false;\n if (\n this.props.item.items &&\n this.props.item.items.length &&\n this.props.item.items[this.state.selectedColourIndex]\n ) {\n discountinuedFlag =\n this.props.item.items[this.state.selectedColourIndex]\n .discontinued;\n }\n\n const { rangeDescription, productName, shortDescription } =\n this.props.item;\n const useTitle =\n !rangeDescription ||\n rangeDescription === '' ||\n !productName ||\n productName === '' ||\n !shortDescription ||\n shortDescription === '';\n\n let productUrl = this.props.item.url;\n\n if (this.state.selectedColourId) {\n productUrl = this.props.item.url.split('?')[0];\n productUrl = `${productUrl}?itemno=${this.state.selectedColourId}`;\n }\n\n // let backto = this.props.item.url.indexOf('?') >= 0 ? '&' : '?';\n\n // backto = this.props.item.url.indexOf('?') >= 0 ? '&' : '?';\n // backto = this.props.item.srcUrl\n // ? `${backto}backto=${this.props.item.srcUrl}`\n // : '';\n\n return (\n <a\n href={`${productUrl}`}\n onClick={() => {\n return this.sendClickData();\n }}\n className=\"c-product-tile list-view\"\n aria-label={this.props.item.title}\n >\n <div className=\"tile-image\">\n <img\n src={this.getProductImage()}\n loading={this.props.loadLazy ? 'lazy': null}\n alt={this.props.item.title}\n onError={e => {\n e.currentTarget.onerror = null;\n e.currentTarget.src = this.props.item.altImage;\n }}\n />\n </div>\n <div className=\"tile-content\">\n {this.getStatus('hidden-sm hidden-md hidden-lg mobile-ver')}\n\n <p className=\"body-small\">\n <span\n className=\"product-id\"\n dangerouslySetInnerHTML={{ __html: this.props.item.productId }}\n />\n {discountinuedFlag && discountinuedFlag !== 'false' && (\n <span className=\"discountinued\">Discontinued</span>\n )}\n {/* {comingSoonFlag && comingSoonFlag !== 'false' && (\n <span className=\"coming-soon\">Coming Soon</span>\n )} */}\n </p>\n\n {useTitle && (\n <div\n className=\"tile-title\"\n dangerouslySetInnerHTML={{ __html: this.getProductTitle() }}\n />\n )}\n {!useTitle && (\n <div className=\"tile-title\">\n {rangeDescription} {productName}\n </div>\n )}\n\n {!useTitle && (\n <p className=\"product-description small-desktop\">\n {shortDescription}\n </p>\n )}\n\n {this.props.item.description && (\n <p className=\"product-description small-desktop\">\n {this.props.item.description}\n </p>\n )}\n\n {this.props.productView &&\n this.props.productView === 'noprice' &&\n this.props.item.items &&\n this.props.item.items.length > 0 && (\n <div className=\"price-colours\">\n {this.props.item.items.map((color, index) => {\n if (index >= 7) {\n return null;\n }\n return (\n <div\n key={color.id}\n className={`colour-option ${\n index ===\n this.state.selectedColourIndex\n ? 'selected'\n : ''\n }`}\n style={{ backgroundColor: color.rgb }}\n onClick={e => {\n e.stopPropagation();\n e.preventDefault();\n return this.setState({\n selectedColourIndex: index,\n selectedColourId: color.id,\n });\n }}\n />\n );\n })}\n {this.props.item.items.length > 7 && (\n <span className=\"colour-more\">\n +{this.props.item.items.length - 7}\n </span>\n )}\n </div>\n )}\n\n {this.props.productView &&\n this.props.productView !== 'noprice' &&\n this.props.item.items &&\n this.props.item.items.length > 0 && (\n <>\n {this.renderPrice()}\n <div className=\"price-colours\">\n {this.props.item.items.map(\n (color, index) => {\n if (index >= 7) {\n return null;\n }\n return (\n <button\n key={color.id}\n type=\"button\"\n className={`colour-option ${\n index ===\n this.state\n .selectedColourIndex\n ? 'selected'\n : ''\n }`}\n style={{\n backgroundColor:\n color.rgb,\n }}\n onClick={e => {\n e.preventDefault();\n return this.setState({\n selectedColourIndex: index,\n selectedColourId: color.id,\n });\n }}\n />\n );\n }\n )}\n {this.props.item.items.length > 7 && (\n <span className=\"colour-more\">\n +{this.props.item.items.length - 7}\n </span>\n )}\n </div>\n </>\n )}\n\n {this.props.item.loadingDetail && (\n <p className=\"product-description small-desktop loading-text\">\n <Loader />\n <span>Loading price...</span>\n </p>\n )}\n </div>\n\n {this.getStatus('hidden-xs')}\n </a>\n );\n }\n}\n\nProductTileList.propTypes = {\n item: shape({\n url: string.isRequired,\n title: string.isRequired,\n rangeDescription: string,\n productName: string,\n shortDescription: string,\n productId: string.isRequired,\n colors: arrayOf(string),\n statusNew: bool,\n statusSale: bool,\n statusStock: bool,\n discountinued: bool,\n thumbnail: string,\n altImage: string,\n }).isRequired,\n resultPosition: number,\n currentPage: number,\n productView: string,\n noPriceLabel: string,\n contactDistributor: string,\n keywords: string,\n};\n\nProductTileList.defaultProps = { productView: '', noPriceLabel: '' };\n","import React from 'react';\nimport { shape, string, bool } from 'prop-types';\nimport BaseTile from '../../../3-components/tiles/BaseTile.jsx';\nimport ProductTile from '../../../3-components/tiles/ProductTile.jsx';\nimport ProductTileList from '../../../3-components/tiles/ProductTileList.jsx';\nimport { ProductTileErrorBoundary } from '../../../3-components/tiles/ProductTileErrorBoundary.jsx';\n\nexport default class ListingItem extends React.Component {\n shouldComponentUpdate(nextProps) {\n if (\n this.props.tileType !== nextProps.tileType ||\n this.props.loadLazy !== nextProps.loadLazy ||\n this.props.item.srcUrl !== nextProps.item.srcUrl ||\n this.props.item.url !== nextProps.item.url ||\n this.props.item.title !== nextProps.item.title ||\n this.props.item.productId !== nextProps.item.productId ||\n this.props.item.itemType !== nextProps.item.itemType ||\n this.props.item.statusNew !== nextProps.item.statusNew ||\n this.props.item.statusSale !== nextProps.item.statusSale ||\n this.props.item.statusStock !== nextProps.item.statusStock ||\n this.props.item.discountinued !== nextProps.item.discountinued ||\n this.props.item.comingSoon !== nextProps.item.comingSoon ||\n this.props.item.description !== nextProps.item.description ||\n // || this.props.item.outOfStock !== nextProps.item.outOfStock\n this.props.item.loadingDetail !== nextProps.item.loadingDetail ||\n this.props.item.thumbnail !== nextProps.item.thumbnail\n ) {\n return true;\n }\n\n return false;\n }\n\n render() {\n // Determine which tile component gets rendered\n switch (this.props.tileType) {\n case 'product-tile':\n case 'product-tile-list': {\n const productItem = {\n srcUrl: this.props.item.srcUrl,\n url: this.props.item.url,\n title: this.props.item.title,\n rangeDescription: this.props.item.rangeDescription,\n productName: this.props.item.productName,\n shortDescription: this.props.item.shortDescription,\n productId: this.props.item.code\n ? this.props.item.code\n : this.props.item.id,\n // price: (this.props.item.price && this.props.item.price.length) ? `$${Math.min(...this.props.item.price)}` : '',\n // showFrom: (this.props.item.price && this.props.item.price.length) ? this.props.item.price.length > 1 : false,\n colors: this.props.item.colors\n ? this.props.item.colors\n : [],\n range: this.props.item.range,\n description: this.props.item.description,\n items: this.props.item.items,\n thumbnail: this.props.item.image,\n baseImageUrl: this.props.item.baseImageUrl,\n itemType: this.props.item.itemType,\n statusNew: false,\n statusSale: false,\n statusStock: this.props.item.outOfStock,\n // energyEfficient: false,\n discountinued: false,\n comingSoon: false,\n loadingDetail: this.props.item.loadingDetail,\n altImage: this.props.altImage,\n overlayLabel: this.props.item.overlayLabel,\n };\n\n // Check the tags filter option for status flags\n const tagStatus = this.props.item.filterOptions.find(\n tagFilter => {\n return tagFilter.code === 'tag';\n }\n );\n if (tagStatus && tagStatus.values && tagStatus.values.length) {\n tagStatus.values.forEach(tagVal => {\n switch (tagVal) {\n case 'new':\n productItem.statusNew = true;\n break;\n case 'sale':\n productItem.statusSale = true;\n break;\n case 'outofstock':\n productItem.statusStock = true;\n break;\n case 'discontinued':\n productItem.discountinued = true;\n break;\n default:\n }\n });\n }\n\n if (this.props.tileType === 'product-tile') {\n return (\n <ProductTileErrorBoundary\n itemID={this.props.item.id}\n >\n <ProductTile\n item={productItem}\n loadLazy={this.props.loadLazy}\n productView={this.props.productView}\n noPriceLabel={this.props.noPriceLabel}\n contactDistributor={this.props.contactDistributor}\n comingSoon={this.props.comingSoon}\n />\n </ProductTileErrorBoundary>\n );\n }\n\n return (\n <ProductTileErrorBoundary\n itemID={this.props.item.id}\n >\n <ProductTileList\n item={productItem}\n loadLazy={this.props.loadLazy}\n productView={this.props.productView}\n noPriceLabel={this.props.noPriceLabel}\n contactDistributor={this.props.contactDistributor}\n />\n </ProductTileErrorBoundary>\n );\n }\n\n default:\n return <BaseTile item={this.props.item} />;\n }\n }\n}\n\nListingItem.propTypes = {\n item: shape({ title: string.isRequired }).isRequired,\n tileType: string.isRequired,\n altImage: string,\n productView: string,\n noPriceLabel: string,\n contactDistributor: string,\n loadLazy: bool,\n};\n\nListingItem.defaultProps = { altImage: '', productView: '', noPriceLabel: '' };\n\n","import React from 'react';\nimport { string, arrayOf, object } from 'prop-types';\nimport ListingItem from '../product-catalogue/items/ListingItem.jsx';\nimport DiscoverPanel from '../../3-components/discover-panel/index.jsx';\n\nexport default function TileContainer({\n items,\n columnClass,\n tileWrap,\n discoverPanel,\n tileType,\n altImage,\n currentUrl,\n productView,\n noPriceLabel,\n contactDistributor,\n}) {\n // Use case if less than 3 items are listed so discover panel can display on desktop\n // Let's avoid modifying props directly\n const modifiedItems = [...items];\n while (modifiedItems.length < 3) {\n modifiedItems.push({});\n }\n\n return (\n <div className={`fl-tile-container ${columnClass}`}>\n <div className={`tile-container-row row ${tileWrap}`}>\n {modifiedItems.map((item, index) => {\n item.srcUrl = currentUrl;\n return (\n // <React.Fragment key={item.id ? item.id : item._id}> // search version\n <React.Fragment\n key={item.id ? item.id : `placeholder-${index}`}\n >\n {discoverPanel.title && index === 2 ? (\n <div className=\"discover-panel-holder\">\n <div className=\"discover-container\">\n <DiscoverPanel\n panelId=\"discover-desktop-view\"\n panel={discoverPanel}\n />\n </div>\n </div>\n ) : (\n ''\n )}\n {discoverPanel.title && index === 4 ? (\n <div className=\"discover-panel-holder\" />\n ) : (\n ''\n )}\n\n {item.title ? (\n <ListingItem\n /* eslint-disable react/no-array-index-key */\n // @NOTE - ideally the key should be item.guid but this creates a jumpy effect with React transition group, so we will\n // keep using index for now until we find a better solution\n item={item}\n loadLazy={index > 7}\n altImage={altImage}\n tileType={tileType}\n productView={productView}\n noPriceLabel={noPriceLabel}\n contactDistributor={contactDistributor}\n /* eslint-enable react/no-array-index-key */\n />\n ) : (\n ''\n )}\n\n {Boolean(\n !item.title &&\n discoverPanel.title\n ) && (\n <div\n className=\"c-product-tile\"\n style={{ height: '150px' }}\n />\n )}\n </React.Fragment>\n );\n })}\n </div>\n </div>\n );\n}\n\nTileContainer.propTypes = {\n items: arrayOf(object).isRequired,\n columnClass: string.isRequired,\n tileType: string.isRequired,\n tileWrap: string.isRequired,\n discoverPanel: object.isRequired,\n currentUrl: string.isRequired,\n altImage: string,\n productView: string,\n noPriceLabel: string,\n contactDistributor: string,\n};\n\nTileContainer.defaultProps = {\n discoverPanel: {},\n altImage: '',\n productView: '',\n noPriceLabel: '',\n contactDistributor: '',\n};\n","import React from 'react';\nimport { object, arrayOf, string } from 'prop-types';\nimport Icon from '../../../3-components/icon/index.jsx';\n\nexport default function NoItems({\n items,\n emptyResultInfo,\n emptyResultMessage,\n}) {\n if (items && items.length) {\n return null;\n }\n\n return (\n <div className=\"listing-no-results\">\n <div className=\"empty-info\">\n <Icon glyph=\"exclamation\" />\n {emptyResultInfo}\n </div>\n <p>{emptyResultMessage}</p>\n </div>\n );\n}\n\nNoItems.propTypes = {\n items: arrayOf(object).isRequired,\n emptyResultInfo: string.isRequired,\n emptyResultMessage: string.isRequired,\n};\n","import React from 'react';\nimport { object, string, arrayOf } from 'prop-types';\nimport TileContainer from '../../tile-container/TileContainer.jsx';\nimport NoItems from './NoItems.jsx';\n\nexport default function ListingItemsSection({\n listingItems,\n tileContainerColumnClass,\n tileContainerTilesWrap,\n tileType,\n noPriceLabel,\n discoverPanel,\n emptyResultInfo,\n emptyResultMessage,\n altImage,\n currentUrl,\n productView,\n contactDistributor,\n}) {\n return (\n <div className=\"listing-items\">\n <div className=\"listing-items-container\">\n <div className=\"items-wrapper\">\n <NoItems\n items={listingItems}\n emptyResultInfo={emptyResultInfo}\n emptyResultMessage={emptyResultMessage}\n />\n\n <TileContainer\n items={listingItems}\n altImage={altImage}\n columnClass={tileContainerColumnClass}\n tileWrap={tileContainerTilesWrap}\n tileType={tileType}\n discoverPanel={discoverPanel}\n currentUrl={currentUrl}\n productView={productView}\n noPriceLabel={noPriceLabel}\n contactDistributor={contactDistributor}\n />\n </div>\n </div>\n </div>\n );\n}\n\nListingItemsSection.propTypes = {\n listingItems: arrayOf(object).isRequired,\n tileContainerColumnClass: string.isRequired,\n tileContainerTilesWrap: string.isRequired,\n tileType: string.isRequired,\n discoverPanel: object,\n emptyResultInfo: string.isRequired,\n emptyResultMessage: string.isRequired,\n currentUrl: string.isRequired,\n altImage: string,\n productView: string,\n noPriceLabel: string,\n contactDistributor: string,\n};\n\nListingItemsSection.defaultProps = {\n discoverPanel: {},\n altImage: '',\n productView: '',\n noPriceLabel: '',\n};\n","/**\n * Return an array of objects which have properties and values that matches the passed properties object\n *\n * @param {Array} set - the array of objects\n * @param {Object} properties - the object to match with\n * @returns {Array} Returns - An array of objects that matched the passed in properties object\n */\nexport default function findByMatchingProperties(set, properties) {\n // turning off eslint for readability\n // eslint-disable-next-line arrow-body-style\n return set.filter(entry => {\n return Object.keys(properties).every(\n key => {\n return entry[key] === properties[key];\n }\n );\n });\n}\n","import intersection from 'lodash.intersection';\nimport findByMatchingProperties from '../../../../js/utils/find-matching-properties';\n\nexport default function passesMultiCheckboxFilter(item, filter) {\n // IF the active filter does not have values then we pass the check without question\n if (!filter.values.length) {\n return true;\n }\n\n // Find the filter option on the item that matches the active filter\n const matchedItemFilterOptions = findByMatchingProperties(\n item.filterOptions,\n { code: filter.code }\n );\n\n // if we did not find a match, then this item does not pass the filtering\n if (!matchedItemFilterOptions || !matchedItemFilterOptions.length) {\n return false;\n }\n\n // Get the array of filter values\n const filterValues =\n typeof filter.values[0] === 'object'\n ? filter.values.map(v => {\n return v.id;\n })\n : filter.values;\n\n // then check if all matched filter options have a match between their values array and the filter's values\n // if the array returned by intersection() has a length greater than zero, than it means there's a match\n const noMatch = matchedItemFilterOptions.find(\n option => {\n return !intersection(option.values, filterValues).length;\n }\n );\n return noMatch === undefined;\n}\n","import clonedeep from 'lodash.clonedeep';\nimport intersection from 'lodash.intersection';\n\nimport { getActiveFiltersWithValues } from './active-filters';\nimport * as FilterTypeConstants from '../constants/filter-types';\nimport passesMultiCheckboxFilter from './filters/multi-checkbox';\nimport passesMultiCheckboxHierarchyFilter from './filters/multi-checkbox-hierarchy';\nimport passesSingleCheckboxFilter from './filters/single-checkbox';\nimport passesKeywordsFilter from './filters/keywords';\nimport passesPriceRangeFilter from './filters/price-range';\n\n/**\n * Return a filtered set of items based on a filter object and object keys\n *\n * @param {Array} filters - The array of filter objects to filter the items array by\n * @param {Array} items - The items to filter\n * @returns {Array} Returns - A filtered set of data\n */\nexport function filterItems(\n filters,\n items,\n keywordSearchableFields,\n filterOptions\n) {\n // Make a clone of the items so filtering doesn't affect the main set\n let filteredItems = clonedeep(items);\n const excludeByDefaults = {};\n\n // get excludeByDefault filter code and id\n if (filterOptions) {\n for (let i = 0; i < filterOptions.length; i += 1) {\n switch (filterOptions[i].code) {\n case FilterTypeConstants.FILTER_TYPE_TAG:\n if (filterOptions[i].values) {\n const ids = [];\n\n for (\n let x = 0;\n x < filterOptions[i].values.length;\n x += 1\n ) {\n if (filterOptions[i].values[x].excludeByDefault) {\n ids.push(filterOptions[i].values[x].id);\n }\n }\n\n if (ids.length > 0) {\n excludeByDefaults[filterOptions[i].code] = ids;\n }\n }\n break;\n default:\n }\n }\n }\n\n // Only keep th items that matches the filter and keyword search\n filteredItems = filteredItems.filter(item => {\n let filterPass = true;\n\n // hide item by default if it have excludeByDefault filter\n if (filterOptions) {\n for (let i = 0; i < item.filterOptions.length; i += 1) {\n const opt = item.filterOptions[i];\n\n switch (opt.code) {\n case FilterTypeConstants.FILTER_TYPE_TAG:\n if (\n excludeByDefaults[opt.code] &&\n intersection(\n opt.values,\n excludeByDefaults[opt.code]\n ).length\n ) {\n filterPass = false;\n }\n break;\n default:\n }\n }\n }\n\n // If no filters supplied, then the item passes without question\n if (!filters || !filters.length) {\n return filterPass;\n }\n\n // find filters that have values. I.e. activeFilters.\n const activeFilters = getActiveFiltersWithValues(filters);\n\n // loop through every activeFilter\n activeFilters.forEach(filter => {\n // Handles different types of filters differently\n switch (filter.type) {\n case FilterTypeConstants.FILTER_TYPE_KEYWORDS:\n if (\n !passesKeywordsFilter(\n item,\n filter,\n keywordSearchableFields\n )\n ) {\n filterPass = false;\n }\n break;\n\n case FilterTypeConstants.FILTER_TYPE_MULTI_CHECKBOX_HIERARCHY:\n if (!passesMultiCheckboxHierarchyFilter(item, filter)) {\n filterPass = false;\n }\n break;\n\n case FilterTypeConstants.FILTER_TYPE_PRICE_RANGE:\n if (!passesPriceRangeFilter(item, filter)) {\n filterPass = false;\n }\n break;\n\n case FilterTypeConstants.FILTER_TYPE_MULTI_CHECKBOX:\n if (!passesMultiCheckboxFilter(item, filter)) {\n filterPass = false;\n } else {\n filterPass = true;\n }\n break;\n\n case FilterTypeConstants.FILTER_TYPE_SINGLE_CHECKBOX:\n if (!passesSingleCheckboxFilter(item, filter)) {\n filterPass = false;\n }\n break;\n\n case FilterTypeConstants.FILTER_TYPE_TAGS:\n if (!passesMultiCheckboxFilter(item, filter)) {\n filterPass = false;\n }\n break;\n\n default:\n // No filter type found, make the filter fail\n filterPass = false;\n }\n });\n\n // Return filter pass result\n return filterPass;\n });\n\n return filteredItems;\n}\n\n/**\n * Sort the items passed in based on the sort object\n *\n * @param {Array} items - The items to sort - it has to be an array of objects\n * @param {object} currentSort - The sort to apply, it has to be an object with 'field' and 'ascending' attribute\n * @returns {Array} Returns - A sorted set of data\n */\nexport function sortItems(items, currentSort) {\n // If sort is not specified, return items as they are\n if (!currentSort) {\n return items;\n }\n\n // Sort the items based on the current sort target field and direction\n return items.sort((a, b) => {\n if (Array.isArray(a[currentSort.field])) {\n if (a[currentSort.field][0] < b[currentSort.field][0]) {\n return currentSort.ascending ? -1 : 1;\n }\n\n if (a[currentSort.field][0] > b[currentSort.field][0]) {\n return currentSort.ascending ? 1 : -1;\n }\n } else {\n if (a[currentSort.field] < b[currentSort.field]) {\n return currentSort.ascending ? -1 : 1;\n }\n\n if (a[currentSort.field] > b[currentSort.field]) {\n return currentSort.ascending ? 1 : -1;\n }\n }\n\n return 0;\n });\n}\n\nexport function paginateItems(items, currentPage, perPage) {\n const startAt = perPage * currentPage;\n const paged = items.filter(\n (item, index) => {\n return index >= startAt && index < startAt + perPage;\n }\n );\n return paged;\n}\n","export default function passesKeywordsFilter(item, filter, searchFields) {\n // If no keyword supplied, then the item passes without question\n if (!filter.values.length || !filter.values[0]) {\n return true;\n }\n\n // For each field specified in the strings array, build a string to search through - if not specified we search the title and excerpt\n const stringFields =\n searchFields && searchFields.length\n ? searchFields\n : ['title', 'excerpt'];\n let searchString = '';\n\n stringFields.forEach(field => {\n // Handle arrays differently\n if (Array.isArray(item[field])) {\n searchString += item[field].join(' ').toLowerCase();\n } else {\n searchString += `${item[field]} `.toLowerCase();\n }\n });\n\n // Return the item if the string matches our input\n return searchString.indexOf(filter.values[0].toLowerCase()) !== -1;\n}\n","import findByMatchingProperties from '../../../../js/utils/find-matching-properties';\n\nexport default function passesMultiCheckboxHierarchyFilter(item, filter) {\n // IF the active filter does not have values then we pass the check without question\n if (!filter.values.length) {\n return true;\n }\n\n // Find the filter option on the item that matches the active filter\n const matchedItemFilterOptions = findByMatchingProperties(\n item.filterOptions,\n { code: filter.code }\n );\n\n // if we did not find a match, then this item does not pass the filtering\n if (!matchedItemFilterOptions || !matchedItemFilterOptions.length) {\n return false;\n }\n\n // Hierarchy filter value on the item should only populate the first item in the value array as pipe delimited value\n // such as \"1|4|54|23|2|4\"\n let hasPassed = false;\n filter.values.forEach(val => {\n matchedItemFilterOptions.forEach(option => {\n if (option.values.join('|').split('|')\n .indexOf(val.id) >= 0) {\n hasPassed = true;\n }\n });\n });\n\n return hasPassed;\n}\n","export default function passesPriceRangeFilter(item, filter) {\n // IF the active filter does not have value or the first value is blank, then we pass the check without question\n if (!filter.values.length || !filter.values[0]) {\n return true;\n }\n\n // If the item has no price - then we fail the check\n if (!item.price || !item.price.length) {\n return false;\n }\n\n // See if the item's price falls between the price range\n let passCheck = false;\n item.price.forEach(price => {\n if (price >= filter.values[0].min && price <= filter.values[0].max) {\n passCheck = true;\n }\n });\n\n return passCheck;\n}\n","import findByMatchingProperties from '../../../../js/utils/find-matching-properties';\n\nexport default function passesSingleCheckboxFilter(item, filter) {\n // IF the active filter does not have value or the first value is blank, then we pass the check without question\n if (!filter.values.length || !filter.values[0]) {\n return true;\n }\n\n // Find the filter option on the item that matches the active filter\n const matchedItemFilterOptions = findByMatchingProperties(\n item.filterOptions,\n { code: filter.code }\n );\n\n // if we did not find a match, then this item does not pass the filtering\n if (!matchedItemFilterOptions || !matchedItemFilterOptions.length) {\n return false;\n }\n\n // then check if all matched filter options have a match between their values array and the filter's values\n // if the array returned by intersection() has a length greater than zero, than it means there's a match\n const noMatch = matchedItemFilterOptions.find(\n option => {\n return !option.values.includes(filter.values[0]);\n }\n );\n return noMatch === undefined;\n}\n","/* eslint-disable react/no-danger */\n/* eslint-disable no-console */\n/* eslint-disable prefer-destructuring */\nimport React from 'react';\nimport { string, number, bool, object, array } from 'prop-types';\nimport clonedeep from 'lodash.clonedeep';\nimport { attachEnterAsClickDecorator } from '../../js/utils/attachEnterAsClick.js';\nimport { capitalizeCase } from '../../js/utils/stringHelper.js';\nimport Breadcrumbs from '../../3-components/breadcrumbs/index.jsx';\nimport DiscoverPanel from '../../3-components/discover-panel/index.jsx';\nimport Icon from '../../3-components/icon/index.jsx';\nimport {\n initActiveFilters,\n manageActiveFilters,\n removeActiveFilterGroup,\n getActiveFiltersWithValues\n} from './utils/active-filters';\nimport { parseQueryString, buildQueryString } from './utils/query-string';\nimport * as FilterTypeConstants from './constants/filter-types';\nimport FiltersSection from './filters/index.jsx';\nimport SortBy from './toolbar/sort-by/index.jsx';\nimport ToggleView from '../../3-components/toggle-view/index.jsx';\nimport ToolbarSection from './toolbar/index.jsx';\nimport ListingItemsSection from './items/index.jsx';\nimport { filterItems, paginateItems, sortItems } from './utils/item-filter';\n\nexport default class ProductCatalogue extends React.Component {\n constructor(props) {\n super(props);\n\n this.state = {\n filterOptions: [],\n sortOptions: [],\n data: [],\n APIStatus: '',\n APIMessage: '',\n discoverPanelData: {},\n activeFilters: [],\n currentSort: 'default',\n currentView: 'grid',\n currentPageSize: 24,\n currentPage: 0, // page 1 is 0 (array index value)\n breadcrumbItems: [],\n openedSortFilter: '',\n currentItemIds: [],\n productItems: {},\n productsData: [],\n };\n\n this.finalFiltersType = this.props.filtersType;\n this.singleChildParentId = [];\n this.filterItems = {};\n this.toggleFilters = this.toggleFilters.bind(this);\n this.resetFilters = this.resetFilters.bind(this);\n this.resetFilterGroup = this.resetFilterGroup.bind(this);\n this.changePage = this.changePage.bind(this);\n this.changePageSize = this.changePageSize.bind(this);\n this.updateSort = this.updateSort.bind(this);\n this.toggleSortFilter = this.toggleSortFilter.bind(this);\n this.updateView = this.updateView.bind(this);\n this.toggleFocus = this.toggleFocus.bind(this);\n }\n\n componentWillMount() {\n const newState = { ...this.state };\n newState.currentPageSize = this.props.itemsPerPage;\n\n if (this.props.apiUrlData && this.props.hierarchyApiUrlData) {\n // convert the page contents to JSON format & set to state\n const jsonapiUrlData = this.props.apiUrlData;\n const jsonServerHierarchyData = this.props.hierarchyApiUrlData;\n\n this.setData(jsonapiUrlData, jsonServerHierarchyData, newState);\n\n newState.activeFilters = initActiveFilters(jsonServerHierarchyData.filterOptions);\n\n this.prePopulateFilters(newState);\n }\n\n // update the app state with new preset filter values\n this.setState(prevState => {\n return { ...prevState, ...newState };\n });\n }\n\n // Only render the app if states change\n shouldComponentUpdate(nextProps, nextState) {\n const thisActiveFilters = JSON.stringify(this.state.activeFilters);\n const nextActiveFilters = JSON.stringify(nextState.activeFilters);\n if (\n this.state.filterOptions.length !==\n nextState.filterOptions.length ||\n this.state.sortOptions.length !== nextState.sortOptions.length ||\n this.state.data !== nextState.data ||\n this.state.APIStatus !== nextState.APIStatus ||\n this.state.APIMessage !== nextState.APIMessage ||\n this.state.discoverPanelData !==\n nextState.discoverPanelData ||\n thisActiveFilters !== nextActiveFilters ||\n this.state.currentSort !== nextState.currentSort ||\n this.state.currentView !== nextState.currentView ||\n this.state.currentPageSize !== nextState.currentPageSize ||\n this.state.currentPage !== nextState.currentPage ||\n this.state.breadcrumbItems.length !==\n nextState.breadcrumbItems.length ||\n this.state.productItems !== nextState.productItems ||\n this.state.openedSortFilter !== nextState.openedSortFilter\n ) {\n return true;\n }\n return false;\n }\n\n componentWillUpdate(newProps, newState) {\n const queryParams = buildQueryString(newState);\n const pathString = `${window.location.pathname}${queryParams}`;\n\n window.history.replaceState(\n { path: pathString },\n '',\n pathString\n );\n\n if (\n this.listingSection &&\n newState.currentPage !== this.state.currentPage\n ) {\n this.listingSection.scrollIntoView({ behavior: 'smooth' });\n }\n }\n\n setData(productApiData, hierarchyData, newState) {\n // set results & settings\n newState.sortOptions = hierarchyData.sortOptions;\n newState.data = productApiData.data.map(item => {\n // set the image / placeholder iagme based on item type\n const type = item.itemType ? item.itemType : 'product';\n // const placeholderImg = \"/SchneiderElectric-FED/assets/images/placeholder-product.png\";\n const placeholderImg =\n type === 'product' && this.props.altImage\n ? this.props.altImage\n : '';\n\n // Set url and the image of the item\n item.url = this.props.productDetailsPageUrl + item.url;\n item.image = item.image\n ? productApiData.baseImageUrl + item.image\n : placeholderImg;\n item.baseImageUrl = productApiData.baseImageUrl;\n item.placeholderImg = placeholderImg;\n\n // For product type, we need to make sure the product id / code in the title is all caps\n item.title = capitalizeCase(item.title);\n if (type === 'product') {\n const regEx = new RegExp(item.id, 'ig');\n item.title = item.title.replace(regEx, item.id.toUpperCase());\n }\n\n return item;\n });\n\n // Check if we have any discover data panel data\n const discoverPanel = this.props.discoverPanelData;\n if (discoverPanel) {\n newState.discoverPanelData = discoverPanel;\n }\n\n // Define the default product catalogue breadcrumb item\n let breadcrumbItems = [];\n\n // Check if the breadcrumb data was passed in from on page var or not\n // If we have the data from the page, we use it to override the breadcrumb items\n const preBreadcrumbs = this.props.breadcrumbData;\n breadcrumbItems = preBreadcrumbs;\n\n // Set the breadcrumb items in the new state here\n newState.breadcrumbItems = breadcrumbItems;\n\n // set filters if they exist\n if (hierarchyData.filterOptions && hierarchyData.filterOptions.length) {\n // We need to do some special treatment for our hierarchy filter first....\n // we will only display the items at top (n) levels\n\n const usefulFilters = hierarchyData.filterOptions.map(opt => {\n if (\n opt.type !==\n FilterTypeConstants.FILTER_TYPE_MULTI_CHECKBOX_HIERARCHY\n ) {\n return opt;\n }\n\n // We are only dealing with the hierarchy filter here\n const { prunedTreeData, itemsTopLevel } =\n this.pruneHiearachyTree([...opt.values]);\n let finalValuesArray = [];\n\n // helper function to loop finding child of node\n // the depth here must macth with depth in multicheckbox, other ways it will show the lowest\n const topLevelNodesToSkip = []; // Some top level nodes may be child of another top level node - we need to skip these\n const getChildByNode = (node, depth = 4) => {\n if (depth === 0) {\n return;\n }\n\n finalValuesArray.push(node);\n\n if (node.children) {\n node.children.forEach(childId => {\n // Check if this node is also listed as a top level node, if so note it\n // so we can skip it when we come to it\n if (\n itemsTopLevel.find(\n topNode => {\n return topNode.id === childId;\n }\n )\n ) {\n topLevelNodesToSkip.push(childId);\n }\n const child = prunedTreeData[childId];\n if (!child) {\n return;\n }\n\n getChildByNode(child, depth - 1);\n });\n }\n };\n\n itemsTopLevel.forEach(node => {\n if (!topLevelNodesToSkip.includes(node.id)) {\n getChildByNode(node);\n }\n });\n\n // If we have top level nodes to skip, we remove that node from itemsTopLevel\n let finalItemsTopLevel = itemsTopLevel.filter(\n topNode => {\n return !topLevelNodesToSkip.includes(topNode.id);\n }\n );\n while (\n finalItemsTopLevel.length &&\n finalItemsTopLevel.length === 1\n ) {\n // check how many top level items we have - if we only have 1,\n // then we want to bring all the children up and remove that top level node\n\n finalValuesArray = finalValuesArray.filter(\n /* eslint-disable-next-line no-loop-func */\n final => {\n return final.id !== finalItemsTopLevel[0].id;\n }\n );\n finalItemsTopLevel = finalItemsTopLevel[0].children.map(\n finalChildId => {\n return this.filterItems[finalChildId];\n }\n );\n }\n this.finalFiltersType = finalItemsTopLevel\n .map(finalTop => {\n return finalTop.id;\n })\n .join(',');\n\n opt.values = finalValuesArray;\n return opt;\n });\n\n newState.filterOptions = this.pruneFilters(\n usefulFilters,\n newState.data,\n [],\n newState\n );\n }\n }\n\n // When active filters are provided then this thing gets a lot more complex...\n // ... complex that it'd need to filter down the filter based on the active filters too\n pruneFiltersWithActiveFilters = (\n completeFilters,\n itemData,\n activeFilters,\n completeData\n ) => {\n // Check if we actually have active filters, if not then just return the complete filters\n if (!activeFilters || !activeFilters.length) {\n return completeFilters;\n }\n\n // Each \"group\" of filters are applied as an \"OR\" filter condition to the data\n // Thus in order to find the list of filters that is applicable within each \"group\"\n // we need to see how many filters in the group are applicable based on all the\n // other active filters groups..... however much sense this makes....\n const prunedFilters = [];\n completeFilters.forEach(filter => {\n // Loop through each of the filters\n const hasActive = activeFilters.find(\n active => {\n return active.code === filter.code;\n }\n );\n if (!hasActive) {\n // Check if any active filter in this group is currently applied\n // if no, then prune the complete filters based on the itemData\n // and include in the resulting filter\n const noActivePruned = this.pruneFilters(\n completeFilters,\n itemData,\n activeFilters\n );\n const noActiveRemaining = noActivePruned.find(\n noActive => {\n return noActive.code === filter.code;\n }\n );\n if (noActiveRemaining) {\n prunedFilters.push(noActiveRemaining);\n }\n } else {\n // If we have active filter in this group, then we need to prune\n // the compelte filters based on a set of active filters that does not include\n // any filters from this group\n const alteredActiveFilters = activeFilters.filter(\n active => {\n return active.code !== filter.code;\n }\n );\n const hasActiveData = filterItems(\n alteredActiveFilters,\n completeData,\n []\n );\n const hasActivePruned = this.pruneFilters(\n completeFilters,\n hasActiveData,\n activeFilters\n );\n const hasActiveRemaining = hasActivePruned.find(\n noActive => {\n return noActive.code === filter.code;\n }\n );\n if (hasActiveRemaining) {\n prunedFilters.push(hasActiveRemaining);\n }\n }\n });\n\n // Finally return the pruned down filters\n return prunedFilters;\n };\n\n // Prune down the filters to only keep the filters that can return results\n pruneFilters = (completeFilters, itemData, activeFilters) => {\n let uselessFilters = clonedeep(completeFilters);\n\n // Here we need to filter down the filter options to only show the filters that is meaningful to our remaining result set\n itemData.forEach(item => {\n uselessFilters = uselessFilters.map(opt => {\n // Going through all the filters and keeping behind the filter (and the values) that does\n // not apply to the item in each iteration\n // First we check if the filter option is a price range, if so\n // we check it against the item's price array first\n if (opt.type === FilterTypeConstants.FILTER_TYPE_PRICE_RANGE) {\n opt.values = opt.values.filter(val => {\n let passCheck = false;\n item.price.forEach(price => {\n if (price >= val.min && price <= val.max) {\n passCheck = true;\n }\n });\n return !passCheck;\n });\n\n return opt;\n }\n\n // If the filter is not price range, then we need to check it against the item's\n // list of filterOptions\n item.filterOptions.forEach(itemFilter => {\n if (opt.code !== itemFilter.code) {\n return;\n }\n\n // The \"multi-checkbox-hierarchy\" type is a special case for checking condition\n if (\n opt.type ===\n FilterTypeConstants.FILTER_TYPE_MULTI_CHECKBOX_HIERARCHY\n ) {\n if (itemFilter.values.length) {\n const itemFilters = itemFilter.values\n .join('|')\n .split('|');\n opt.values = opt.values.filter(val => {\n if (itemFilters.indexOf(val.id) >= 0) {\n return false;\n }\n\n return true;\n });\n }\n } else {\n opt.values = opt.values.filter(\n val => {\n return !itemFilter.values.includes(val.id);\n }\n );\n }\n });\n\n return opt;\n });\n });\n\n uselessFilters = uselessFilters.filter(opt => {\n return opt.values.length > 0;\n });\n\n // Remove the useless filters from the data filter options\n let usefulFilters = clonedeep(completeFilters).map(opt => {\n const useless = uselessFilters.find(less => {\n return less.code === opt.code;\n });\n if (!useless) {\n return opt;\n }\n\n const activeOpt = activeFilters.find(\n active => {\n return active.code === opt.code;\n }\n );\n const activeVals = activeOpt\n ? activeOpt.values.map(val => {\n return val.id;\n })\n : [];\n const uselessVals = useless.values.map(val => {\n return val.id;\n });\n opt.values = opt.values.filter(val => {\n // The option value is only included if its not useless\n if (!uselessVals.includes(val.id)) {\n return true;\n }\n\n // or if its in the active filter selection\n if (activeVals.includes(val.id)) {\n return true;\n }\n\n return false;\n });\n return opt;\n });\n\n // If a filter has only 0 option left, then its pretty much useless, might as well remove it\n usefulFilters = usefulFilters.filter(opt => {\n return !!opt.values.length;\n });\n\n // Final pruning on the hierarchy filter, if an option has only 1 child, remove the child\n usefulFilters = usefulFilters.map(opt => {\n if (\n opt.type !==\n FilterTypeConstants.FILTER_TYPE_MULTI_CHECKBOX_HIERARCHY\n ) {\n return opt;\n }\n\n opt.values = opt.values.filter(val => {\n // We only want to deal with 2nd+ level nodes\n const parentNode = opt.values.find(\n parentVal => {\n return parentVal.id === val.pid;\n }\n );\n if (!parentNode) {\n return true;\n }\n\n // Check if we have multiple siblings\n const siblings = opt.values.filter(\n siblingVal => {\n return siblingVal.pid === val.pid;\n }\n );\n return siblings.length > 1;\n });\n return opt;\n });\n\n return usefulFilters;\n };\n\n handleMobileFilterToggle = () => {\n const filtersSection =\n this.thisCatalogue.querySelector('.filters-section');\n if (filtersSection) {\n filtersSection.classList.toggle('mobile-active');\n }\n };\n\n prePopulateFilters(newState) {\n const serverParam = this.props.serverPageUrl.split('?');\n const url = serverParam.length > 1 ? serverParam[1] : '';\n\n const activeFilters =\n newState.activeFilters.length > 0\n ? newState.activeFilters\n : initActiveFilters(newState.filterOptions);\n\n const presetFilters = parseQueryString(\n url,\n activeFilters,\n newState.currentPage,\n newState.filterOptions,\n newState.sortOptions\n );\n\n if (presetFilters) {\n if (\n JSON.stringify(presetFilters.activeFilters) !==\n JSON.stringify(newState.activeFilters)\n ) {\n newState.activeFilters = presetFilters.activeFilters;\n }\n\n if (presetFilters.currentSort !== newState.currentSort) {\n newState.currentSort = presetFilters.currentSort;\n }\n\n if (parseInt(presetFilters.currentPage, 10) !== 0) {\n newState.currentPage = parseInt(presetFilters.currentPage, 10);\n }\n }\n }\n\n resetFilters(event) {\n event.preventDefault();\n this.setState(prevState => {\n return {\n activeFilters: initActiveFilters(prevState.filterOptions),\n currentPage: 0,\n };\n });\n }\n\n resetFilterGroup(groupCode) {\n this.setState(prevState => {\n return {\n activeFilters: removeActiveFilterGroup(\n prevState.activeFilters,\n groupCode\n ),\n currentPage: 0,\n };\n });\n }\n\n toggleFilters(evt, filter, valueArray, forceClear = false) {\n this.setState(prevState => {\n let updatedActiveFilter = prevState.activeFilters;\n valueArray.forEach(val => {\n updatedActiveFilter = manageActiveFilters(\n updatedActiveFilter,\n filter.code,\n val,\n forceClear\n );\n });\n return {\n activeFilters: updatedActiveFilter,\n currentPage: 0,\n };\n });\n }\n\n changePage(pageNum) {\n this.setState({ currentPage: parseInt(pageNum, 10) });\n }\n\n changePageSize(pageSize) {\n this.setState({\n currentPageSize: parseInt(pageSize, 10),\n currentPage: 0,\n });\n }\n\n updateSort(sort) {\n this.setState({\n currentSort: sort,\n currentPage: 0,\n });\n }\n\n toggleSortFilter(sortID) {\n this.setState(prevState => {\n return {\n openedSortFilter:\n prevState.openedSortFilter === sortID ? '' : sortID,\n };\n });\n }\n\n updateView() {\n this.setState(prevState => {\n return {\n currentView: prevState.currentView === 'grid' ? 'list' : 'grid',\n currentPageSize:\n prevState.currentView === 'grid'\n ? prevState.currentPageSize * 2\n : prevState.currentPageSize / 2,\n currentPage: 0,\n };\n });\n }\n\n toggleFocus(filter) {\n this.setState({ focusedFilter: filter ? filter.code : null });\n }\n\n recursiveCheckNode(parentItem, item) {\n // No checking needed for root level item - i.e. parentItem is missing\n if (!parentItem) {\n return item;\n }\n\n // No name or is single child\n if (\n !item.name ||\n item.name === parentItem.name ||\n this.singleChildParentId.includes(parentItem.id)\n ) {\n // If this item is a single child, then we move its children up and remove the id from\n // the single child prarent id list\n if (this.singleChildParentId.includes(parentItem.id)) {\n this.singleChildParentId = this.singleChildParentId.filter(\n parentId => {\n return parentId !== item.pid;\n }\n );\n }\n\n // Remove this child id from the parent node's children id array\n parentItem.children = parentItem.children.filter(\n childId => {\n return childId !== item.id;\n }\n );\n\n // Try move the children up\n item.children.forEach(childId => {\n // find the child\n let childNode = this.filterItems[childId];\n childNode = this.recursiveCheckNode(parentItem, childNode);\n return childNode; // returning here has no meaning, its dont to stop eslint from complaining\n });\n return null;\n }\n\n // update child parent id\n if (parentItem.id !== item.pid) {\n item.pid = parentItem.id;\n parentItem.children.push(item.id);\n }\n\n return item;\n }\n\n pruneHiearachyTree(treeData) {\n const itemsTopLevel = [];\n const prunedTreeData = {};\n const entryFilterTypes = this.finalFiltersType.trim().split(',');\n\n treeData.forEach(item => {\n // Store each of the filter value into an object to\n // easily access it via the item.id\n this.filterItems[item.id] = item;\n\n // Find the highest level items\n if (entryFilterTypes.length && entryFilterTypes[0] !== '') {\n if (entryFilterTypes.includes(item.id)) {\n itemsTopLevel.push(item);\n }\n } else if (item.pid === '0' || !item.pid) {\n itemsTopLevel.push(item);\n }\n\n // Find single child parents\n if (item.children.length === 1) {\n this.singleChildParentId.push(item.id);\n }\n });\n\n treeData.forEach(item => {\n if (!item) {\n return;\n }\n\n const newItem = this.recursiveCheckNode(\n this.filterItems[item.pid],\n item\n );\n\n if (newItem) {\n prunedTreeData[newItem.id] = newItem;\n }\n });\n\n return { prunedTreeData, itemsTopLevel };\n }\n\n render() {\n const activeFilters = getActiveFiltersWithValues(\n this.state.activeFilters\n );\n const filteredItems = filterItems(\n activeFilters,\n this.state.data,\n [],\n this.state.filterOptions\n );\n const filteredItemsForPrune = filterItems(\n activeFilters,\n this.state.data,\n []\n );\n\n const sortedItems = sortItems(filteredItems, this.state.currentSort);\n\n const pagedItems = paginateItems(\n sortedItems,\n this.state.currentPage,\n this.state.currentPageSize\n );\n const displayingFilters = this.pruneFiltersWithActiveFilters(\n this.state.filterOptions,\n filteredItemsForPrune,\n activeFilters,\n this.state.data\n );\n const itemType =\n filteredItems.length > 1\n ? this.props.itemTypePlural\n : this.props.itemTypeSingular;\n let pageTitle = this.props.appTitle;\n\n if (!pageTitle) {\n const filtersTypeArray = this.props.filtersType.trim().split(',');\n for (\n let i = this.state.breadcrumbItems.length - 1;\n i >= 0;\n i -= 1\n ) {\n if (this.state.breadcrumbItems[i].name) {\n pageTitle = this.state.breadcrumbItems[i].name;\n break;\n }\n }\n if (filtersTypeArray.length === 1 && filtersTypeArray[0] !== '') {\n if (this.filterItems[filtersTypeArray[0]].name !== '') {\n pageTitle = this.filterItems[filtersTypeArray[0]].name;\n }\n }\n }\n\n // ties into the backto\n // let currentUrl = '';\n\n // if (!window.isServer) {\n // currentUrl = buildQueryString(this.state).split('backto=')[0];\n // currentUrl = encodeURIComponent(\n // `${window.location.pathname}${currentUrl}`\n // );\n // currentUrl = this.props.includeBackto ? currentUrl : '';\n // }\n\n return (\n <div\n className={`layout-filters-side${\n this.props.listOnly ? ' list-only' : ''\n }`}\n ref={c => {\n this.thisCatalogue = c;\n }}\n >\n {!this.props.listOnly && (\n <div className=\"filter-heading\">\n <div className=\"filter-container\">\n <Breadcrumbs items={this.state.breadcrumbItems} />\n\n <div className=\"desktop-wrapper\">\n <div className=\"filter-heading-wrapper\">\n <h1\n className=\"filter-heading-title\"\n dangerouslySetInnerHTML={{\n // __html: DOMPurify.sanitize(\n // pageTitle\n // ),\n __html: pageTitle,\n }}\n />\n </div>\n\n <div className=\"util-bar desktop-view\">\n <div className=\"filter-detail\">\n <div className=\"result-count\">\n <span>\n {filteredItems.length}{' '}\n {itemType},{' '}\n {this.state.currentPageSize} per\n page\n </span>\n </div>\n\n {activeFilters.length > 0 ? (\n <div\n className=\"header-btn\"\n onClick={this.resetFilters}\n onKeyPress={this.resetFilters}\n role=\"button\"\n tabIndex=\"0\"\n >\n View All\n </div>\n ) : (\n ''\n )}\n\n <ToggleView\n currentView={this.state.currentView}\n updateView={this.updateView}\n />\n <SortBy\n sortId=\"desktop-top\"\n openedSortFilter={\n this.state.openedSortFilter\n }\n toggleSortFilter={\n this.toggleSortFilter\n }\n items={this.state.sortOptions}\n currentSort={this.state.currentSort}\n updateSort={this.updateSort}\n />\n </div>\n </div>\n </div>\n\n <div className=\"util-bar mobile-view\">\n {this.state.discoverPanelData ? (\n <DiscoverPanel\n panelId=\"discover-mobile-view\"\n panel={this.state.discoverPanelData}\n />\n ) : (\n ''\n )}\n\n <div className=\"filter-detail\">\n <div\n className=\"filter-trigger\"\n onClick={this.handleMobileFilterToggle}\n onKeyPress={\n this.handleMobileFilterToggle\n }\n role=\"button\"\n tabIndex=\"0\"\n >\n <Icon glyph=\"settings\" />{' '}\n <span>Filter</span>\n </div>\n <div className=\"result-count\">\n <span>\n {filteredItems.length} {itemType}\n </span>\n </div>\n <SortBy\n sortId=\"mobile-top\"\n openedSortFilter={\n this.state.openedSortFilter\n }\n toggleSortFilter={this.toggleSortFilter}\n items={this.state.sortOptions}\n currentSort={this.state.currentSort}\n updateSort={this.updateSort}\n />\n </div>\n </div>\n </div>\n </div>\n )}\n\n <div className=\"layout-filters-side-container\">\n <div className=\"layout-filters-side-row\">\n {!this.props.listOnly && (\n <div\n className={`filters-wrapper${\n this.state.mobileFilterOpen\n ? ' opened'\n : ' closed'\n }`}\n >\n <FiltersSection\n filters={displayingFilters}\n activeFilters={activeFilters}\n toggleFilters={attachEnterAsClickDecorator(\n this.toggleFilters\n )}\n resetFilters={this.resetFilters}\n filtersType={this.finalFiltersType}\n />\n </div>\n )}\n <div\n className=\"listing-wrapper\"\n ref={c => {\n this.listingSection = c;\n }}\n >\n <ListingItemsSection\n listingItems={pagedItems}\n altImage={this.props.altImage}\n tileContainerColumnClass={\n this.state.currentView === 'grid'\n ? 'col-four'\n : 'col-one no-discover-panel'\n }\n tileContainerTilesWrap=\"tiles-wrap\"\n tileType={`product-tile${\n this.state.currentView === 'grid'\n ? ''\n : '-list'\n }`}\n totalPages={Math.ceil(\n filteredItems.length /\n this.state.currentPageSize\n )}\n currentPage={this.state.currentPage}\n changePage={this.changePage}\n resetFilters={this.resetFilters}\n discoverPanel={this.state.discoverPanelData}\n emptyResultInfo={this.props.emptyResultInfo}\n emptyResultMessage={\n this.props.emptyResultMessage\n }\n // currentUrl={currentUrl} // need to fix\n currentUrl={''}\n productView={this.props.productView}\n noPriceLabel={this.props.noPriceLabel}\n contactDistributor={\n this.props.contactDistributor\n }\n />\n\n {filteredItems.length > 0 &&\n !this.props.listOnly ? (\n <div className=\"tool-bar\">\n <ToolbarSection\n sort={{\n sortId: 'toolbar-sort',\n openedSortFilter:\n this.state.openedSortFilter,\n toggleSortFilter:\n this.toggleSortFilter,\n }}\n sortBy={this.state.sortOptions}\n currentSort={this.state.currentSort}\n updateSort={this.updateSort}\n currentPageSize={\n this.state.currentPageSize\n }\n changePageSize={this.changePageSize}\n currentItems={\n (this.state.currentPage + 1) *\n this.state.currentPageSize\n }\n itemCount={filteredItems.length}\n totalPages={Math.ceil(\n filteredItems.length /\n this.state.currentPageSize\n )}\n currentPage={this.state.currentPage}\n changePage={this.changePage}\n defaultItemPerpage={\n this.props.itemsPerPage\n }\n serverPageUrl={this.props.serverPageUrl}\n />\n </div>\n ) : (\n ''\n )}\n </div>\n </div>\n </div>\n </div>\n );\n }\n}\n\nProductCatalogue.propTypes = {\n appTitle: string,\n filtersType: string,\n productDetailsPageUrl: string,\n itemsPerPage: number,\n itemTypeSingular: string,\n itemTypePlural: string,\n discoverPanelData: object,\n emptyResultInfo: string,\n emptyResultMessage: string,\n breadcrumbData: array,\n // includeBackto: string,\n altImage: string,\n productView: string,\n noPriceLabel: string,\n listOnly: bool,\n contactDistributor: string,\n apiUrlData: object,\n hierarchyApiUrlData: object,\n serverPageUrl: string,\n};\n\nProductCatalogue.defaultProps = {\n appTitle: '',\n filtersType: '',\n productDetailsPageUrl: '',\n itemsPerPage: 24,\n discoverPanelData: {},\n emptyResultInfo: 'Your search has returned no results.',\n emptyResultMessage: 'Try adjusting the filters and try again.',\n breadcrumbData: [],\n // includeBackto: '',\n altImage: '',\n productView: '',\n noPriceLabel: '',\n listOnly: false,\n contactDistributor: '',\n apiUrlData: {},\n hierarchyApiUrlData: {},\n serverPageUrl: '',\n};\n","/**\n * determine if an array contains one or more items from another array.\n *\n * @param {array} whitelist the array to search.\n * @param {array} urlParams the array providing items to check for in the whitelist.\n * @return {boolean} true|false if whitelist contains at least one item from urlParams.\n *\n * Example usage:\n * const hasValidParams = validateAgainstWhitelist(whitelist, params);\n *\n */\nexport default function validateAgainstWhitelist(whitelist, urlParams) {\n return urlParams.some(v => {\n return whitelist.includes(v);\n });\n}\n","import React from 'react';\nimport { string, object, array } from 'prop-types';\nimport ProductCatalogue from '../product-catalogue/index';\n\nconst App = props => {\n return (\n <section className=\"s-product-catalogue server-render\" data-testid=\"app-body\">\n <ProductCatalogue\n apiUrlData={props.apiUrlData}\n hierarchyApiUrlData={props.hierarchyApiUrlData}\n appTitle={props.appTitle}\n filtersType={props.filtersType}\n productDetailsPageUrl={props.productDetailsPageUrl}\n itemsPerPage={props.itemsPerPage}\n itemTypeSingular={props.itemTypeSingular}\n itemTypePlural={props.itemTypePlural}\n breadcrumbData={props.breadcrumbData}\n discoverPanelData={props.discoverPanelData}\n showSearchInput={props.showSearchInput}\n searchKeyword={props.searchInputKeyword}\n searchApiUrl={props.searchApiUrl}\n searchResultsUrl={props.searchResultsUrl}\n emptyResultInfo={props.emptyResultInfo}\n emptyResultMessage={props.emptyResultMessage}\n altImage={props.altImage}\n productView={props.productView}\n noPriceLabel={props.noPriceLabel}\n productItemsApiUrl={props.productItemsApiUrl}\n productItemsApiUrlData={props.productItemsApiUrlData}\n productItemsApiUrlVersion={props.productItemsApiUrlVersion}\n querystring={props.querystring}\n serverPageUrl={props.serverPageUrl}\n contactDistributor={props.contactDistributor}\n />\n </section>\n );\n};\n\nApp.propTypes = {\n apiUrlData: object,\n hierarchyApiUrlData: object,\n appTitle: string,\n filtersType: string,\n productDetailsPageUrl: string,\n itemsPerPage: string,\n itemTypePlural: string,\n itemTypeSingular: string,\n breadcrumbData: array,\n discoverPanelData: object,\n showSearchInput: string,\n searchInputKeyword: string,\n searchApiUrl: string,\n searchResultsUrl: string,\n emptyResultInfo: string,\n emptyResultMessage: string,\n altImage: string,\n productView: string,\n noPriceLabel: string,\n productItemsApiUrl: string,\n productItemsApiUrlData: string,\n productItemsApiUrlVersion: string,\n querystring: string,\n serverPageUrl: string,\n contactDistributor: string\n};\n\nApp.defaultProps = {\n apiUrlData: {},\n hierarchyApiUrlData: {},\n appTitle: '',\n filtersType: '',\n productDetailsPageUrl: '',\n itemsPerPage: '',\n itemTypePlural: '',\n itemTypeSingular: '',\n breadcrumbData: [],\n discoverPanelData: {},\n showSearchInput: '',\n searchInputKeyword: '',\n searchApiUrl: '',\n searchResultsUrl: '',\n emptyResultInfo: '',\n emptyResultMessage: '',\n altImage: '',\n productView: '',\n noPriceLabel: '',\n productItemsApiUrl: '',\n productItemsApiUrlData: '',\n productItemsApiUrlVersion: '',\n querystring: '',\n serverPageUrl: '',\n contactDistributor: ''\n};\n\nexport default App;\n","import React from 'react';\nimport ReactDOM from 'react-dom';\nimport App from './App';\n\nglobal.React = React;\nglobal.ReactDOM = ReactDOM;\n\nglobal.Components = { App };\n","// This function makes a string title case\nexport function titleCase(str) {\n return str.replace(\n /\\w\\S*/g,\n txt => {\n return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase();\n }\n );\n}\n\nexport function capitalizeCase(str) {\n return str.replace(/(?:^|\\s)\\S/g, a => {\n return a.toUpperCase();\n });\n}\n\n// This function makes a string sentence case\nexport function sentenceCase(str) {\n const n = str.toLowerCase().split('.');\n let vfinal = '';\n for (let i = 0; i < n.length; i += 1) {\n let spaceput = '';\n const spaceCount = n[i].replace(/^(\\s*).*$/, '$1').length;\n n[i] = n[i].replace(/^\\s+/, '');\n const newstring = n[i].charAt(n[i]).toUpperCase() + n[i].slice(1);\n for (let j = 0; j < spaceCount; j += 1) {\n spaceput += ' ';\n }\n vfinal += `${spaceput}${newstring}.`;\n }\n vfinal = vfinal.substring(0, vfinal.length - 1);\n return vfinal;\n}\n\nexport const isColor = text => {\n const regexRgb = /^rgba?\\(|^#/;\n return regexRgb.test(text);\n};\n\nexport const getExt = filename => {\n const regexExt = /(?:\\.([^.]+))?$/;\n return regexExt.exec(filename)[1];\n};\n\nexport const trimFileName = (filename, maxChars) => {\n const ext = getExt(filename) || '';\n if (filename.length - ext.length - 1 > maxChars) {\n return `${filename.substring(0, maxChars)}...${ext}`;\n }\n return filename;\n};\n\nexport const clearHTMLTags = strToSanitize => {\n return strToSanitize.replace(/(<([^>]+)>)/gi, '');\n};\n"],"names":["Breadcrumbs","_React$Component","_classCallCheck","_callSuper","arguments","_inherits","key","value","React","className","href","this","props","items","map","item","id","url","name","propTypes","arrayOf","object","defaultProps","DiscoverPanel","panel","title","panelId","style","backgroundImage","concat","image","src","alt","loading","fetchPriority","dangerouslySetInnerHTML","__html","content","display","FILTER_TYPE_MULTI_CHECKBOX","FILTER_TYPE_MULTI_CHECKBOX_HIERARCHY","FILTER_TYPE_SINGLE_CHECKBOX","FILTER_TYPE_PRICE_RANGE","FILTER_TYPE_TAGS","initActiveFilters","filters","length","defaultActiveFilters","clonedeep","filter","values","removeActiveFilterGroup","activeFilters","groupCode","clonedActiveFilters","forEach","code","getActiveFiltersWithValues","QUERY_PARAM_SORT","QUERY_PARAM_PAGE","getFilterKeys","filterKeys","undefined","push","queryParam","getQueryStringKeys","queryStringParams","keys","k","replace","ActiveFiltersSection","_ref","resetFilters","toggleFilters","onClick","e","onKeyPress","role","tabIndex","Icon","glyph","type","label","shape","string","isRequired","func","MultiCheckboxFilter","_this","handleTitleClick","$","thisElement","toggleClass","find","slideToggle","fillTopNodes","filled","remaining","entryFilterTypes","filtersType","trim","split","newTopNodes","filterData","includes","pid","_toConsumableArray","handleToggleClick","$currentElement","currentTarget","hasClass","addClass","siblings","slideUp","removeClass","slideDown","handleChildCheckboxCheck","valueArray","window","dataLayer","filterCategory","closest","innerText","filterSubCategory","parents","last","checkedNodes","checked","first","attr","nodeVal","JSON","parse","val","each","event","filter_action","filter_category","filter_name","html","filter_sub_category","renderFilterNode","childNode","listId","depth","usedData","hasActiveChildren","grandChild","getChildren","children","attachEnterAsClickDecorator","onChange","stringify","selectedItems","htmlFor","childIds","childs","childId","node","isExpanded","show","_this2","topNodes","isHierarchy","checkboxItems","classModifier","ref","c","oneOfType","number","bool","FiltersSection","_len","args","Array","_key","handleMobileClose","filterSection","classList","toggle","_this$props","index","activeValues","found","foundArray","_typeof","getActiveValues","hasActive","active","FilterTypeConstants","SortBy","currentSort","updateSort","sortId","toggleSortFilter","openedSortFilter","isAscending","ascending","selectedDisplayText","_slicedToArray","displayText","currentItem","i","selectOption","sort","PageSize","sizes","currentPageSize","updatePageSize","target","pagesize","ItemPagination","clickPage","bind","changePage","selected","totalPages","ReactPaginate","pageNum","pageRangeDisplayed","marginPagesDisplayed","clickCallback","forceSelected","currentPage","initialSelected","previousLabel","prevIcon","nextLabel","nextIcon","containerClassName","pageClassName","mobileBreakpoint","serverPageUrl","ToolbarSection","sortBy","defaultItemPerpage","changePageSize","pageSizeOption","indexOf","a","b","BaseTile","thumbnail","subtext","cta","field","excerpt","ProductTile","renderPrice","setState","statusError","currentProd","state","selectedColourIndex","productView","staff","retail","noPriceLabel","showroom","contactDistributor","comingSoon","getProductImage","baseImageUrl","getProductTitle","description","renderPriceDom","color","classes","backgroundColor","rgb","stopPropagation","preventDefault","selectedColourId","nextProps","nextState","srcUrl","images","productId","statusNew","statusSale","statusStock","discountinued","isDiscontinued","loadingDetail","Error","search_page_position","search_result_position","resultPosition","site_search_category","site_search_keyword","keywords","search_term","discountinuedFlag","discontinued","comingSoonFlag","_this$props$item","rangeDescription","productName","shortDescription","overlayLabel","useTitle","productUrl","sendClickData","loadLazy","onError","onerror","altImage","Loader","tag","price","colors","range","statusSkin","ProductTileList","contactDisclaimer","getStatus","clasess","energyEfficient","ListingItem","tileType","itemType","productItem","outOfStock","tagStatus","filterOptions","tagFilter","tagVal","ProductTileErrorBoundary","itemID","TileContainer","columnClass","tileWrap","discoverPanel","currentUrl","modifiedItems","Boolean","height","NoItems","emptyResultInfo","emptyResultMessage","ListingItemsSection","listingItems","tileContainerColumnClass","tileContainerTilesWrap","findByMatchingProperties","set","properties","entry","Object","every","passesMultiCheckboxFilter","matchedItemFilterOptions","filterValues","v","option","intersection","filterItems","keywordSearchableFields","filteredItems","excludeByDefaults","ids","x","excludeByDefault","filterPass","opt","searchFields","stringFields","searchString","isArray","join","toLowerCase","passesKeywordsFilter","hasPassed","passesMultiCheckboxHierarchyFilter","passCheck","min","max","passesPriceRangeFilter","passesSingleCheckboxFilter","ProductCatalogue","pruneFiltersWithActiveFilters","completeFilters","itemData","completeData","prunedFilters","hasActiveData","hasActiveRemaining","pruneFilters","noActive","noActiveRemaining","uselessFilters","itemFilter","itemFilters","usefulFilters","useless","less","activeOpt","activeVals","uselessVals","parentVal","siblingVal","handleMobileFilterToggle","filtersSection","thisCatalogue","querySelector","sortOptions","data","APIStatus","APIMessage","discoverPanelData","currentView","breadcrumbItems","currentItemIds","productItems","productsData","finalFiltersType","singleChildParentId","resetFilterGroup","updateView","toggleFocus","newState","_objectSpread","itemsPerPage","apiUrlData","hierarchyApiUrlData","jsonapiUrlData","jsonServerHierarchyData","setData","prePopulateFilters","prevState","thisActiveFilters","nextActiveFilters","newProps","queryParams","location","search","substring","filterString","opts","encodeURIComponent","invalidParams","queryString","urlKeys","whitelist","querystringWhitelist","invalidKeys","startsWith","persistQueryString","buildQueryString","pathString","pathname","history","replaceState","path","listingSection","scrollIntoView","behavior","productApiData","hierarchyData","placeholderImg","productDetailsPageUrl","capitalizeCase","regEx","RegExp","toUpperCase","breadcrumbData","_this2$pruneHiearachy","pruneHiearachyTree","prunedTreeData","itemsTopLevel","finalValuesArray","topLevelNodesToSkip","getChildByNode","topNode","child","finalItemsTopLevel","final","finalChildId","finalTop","serverParam","presetFilters","completeSortBy","obj","variables","varKeys","urlParams","some","validateAgainstWhitelist","variable","arr","options","isValidKey","matchedSort","decodeURIComponent","test","currentFilters","filterConfig","f","current","parseQueryString","parseInt","evt","forceClear","updatedActiveFilter","targetCode","manageActiveFilters","pageSize","sortID","focusedFilter","parentItem","_this3","parentId","recursiveCheckNode","treeData","_this4","newItem","_this5","filteredItemsForPrune","pagedItems","perPage","startAt","paginateItems","displayingFilters","itemTypePlural","itemTypeSingular","pageTitle","appTitle","filtersTypeArray","listOnly","ToggleView","mobileFilterOpen","Math","ceil","currentItems","itemCount","array","App","showSearchInput","searchKeyword","searchInputKeyword","searchApiUrl","searchResultsUrl","productItemsApiUrl","productItemsApiUrlData","productItemsApiUrlVersion","querystring","global","ReactDOM","Components","str","isColor","text","trimFileName","filename","maxChars","ext","exec","getExt","clearHTMLTags","strToSanitize"],"sourceRoot":""}