{"version":3,"sources":["webpack:///./app/javascript/components/Filters/SpecialOffersFilters/filterPills/Pill.jsx","webpack:///./app/javascript/components/Filters/ElasticSearch.jsx","webpack:///./app/javascript/components/Filters/SpecialOffersFilters/AnnualMileage.jsx","webpack:///./app/javascript/components/Filters/SpecialOffersFilters/InitialPayment.jsx","webpack:///./app/javascript/components/Filters/SpecialOffersFilters/ContractLength.jsx","webpack:///./app/javascript/components/Filters/SpecialOffersFilters/Manufacturer.jsx","webpack:///./app/javascript/components/Filters/SpecialOffersFilters/Model.jsx","webpack:///./app/javascript/components/Filters/SpecialOffersFilters/FuelType.jsx","webpack:///./app/javascript/components/EligibilityChecker/steps.js","webpack:///./app/javascript/components/Filters/SpecialOffersFilters/Transmission.jsx","webpack:///./app/javascript/components/Filters/SpecialOffersFilters/Budget.jsx","webpack:///./app/javascript/components/Filters/SpecialOffersFilters/BodyType.jsx","webpack:///./app/javascript/components/Filters/ModelFiltersContext.jsx","webpack:///./app/javascript/components/Filters/utils.js","webpack:///./app/javascript/components/Filters/SpecialOffersFilters/Seats.jsx","webpack:///./app/javascript/components/Filters/QuickDeliveryToggle.jsx","webpack:///./app/javascript/components/Filters/PromotionalToggle.jsx","webpack:///./app/javascript/components/Filters/SpecialOffersFilters/filterPills/Pills.jsx","webpack:///./app/javascript/components/Filters/InStockToggle.jsx","webpack:///./app/javascript/components/Filters/CategoryFilters.jsx","webpack:///./app/javascript/components/Filters/VanBodytypeFilter.jsx","webpack:///./app/javascript/components/Filters/SpecialOffersFilters.jsx","webpack:///./app/javascript/components/DerivativeFilters/DerivativeFilters.jsx","webpack:///./app/javascript/components/EligibilityChecker/Step.jsx","webpack:///./app/javascript/components/EligibilityChecker/FinalScreen.jsx","webpack:///./app/javascript/components/Filters/AllSpecialOffersFilters.jsx","webpack:///./app/javascript/components/Filters/BodyTypeFilters.jsx","webpack:///./app/javascript/components/Filters/BudgetFilters.jsx","webpack:///./app/javascript/components/Filters/DesktopModelFilters.jsx","webpack:///./app/javascript/components/Filters/ElectricSpecialOffersFilters.jsx","webpack:///./app/javascript/components/Filters/SpecialOffersFilters/Range.jsx","webpack:///./app/javascript/components/Filters/EstimatedDeliveryDropdown.jsx","webpack:///./app/javascript/components/Filters/FilterControls.jsx","webpack:///./app/javascript/components/Filters/SpecialOffersFilters/filterPills/ElectricPills.jsx","webpack:///./app/javascript/components/Filters/SpecialOffersFilters/filterPills/MakePills.jsx","webpack:///./app/javascript/components/Filters/SpecialOffersFilters/filterPills/FuelTypePills.jsx","webpack:///./app/javascript/components/Filters/SpecialOffersFilters/filterPills/BudgetPills.jsx","webpack:///./app/javascript/components/Filters/SpecialOffersFilters/filterPills/BodyTypePills.jsx","webpack:///./app/javascript/components/Filters/SpecialOffersFilters/filterPills/TransmissionPills.jsx","webpack:///./app/javascript/components/Filters/SpecialOffersFilters/filterPills/SeatsPills.jsx","webpack:///./app/javascript/components/Filters/SpecialOffersFilters/filterPills/TermPills.jsx","webpack:///./app/javascript/components/Filters/SpecialOffersFilters/filterPills/MileagePills.jsx","webpack:///./app/javascript/components/Filters/SpecialOffersFilters/filterPills/InitialPaymentPills.jsx","webpack:///./app/javascript/components/Filters/SpecialOffersFilters/filterPills/EstimatedDeliveryPills.jsx","webpack:///./app/javascript/components/Filters/SpecialOffersFilters/filterPills/InStockPills.jsx","webpack:///./app/javascript/components/Filters/SpecialOffersFilters/filterPills/PromotionalPills.jsx","webpack:///./app/javascript/components/Filters/SpecialOffersFilters/filterPills/FunderPills.jsx","webpack:///./app/javascript/components/Filters/SpecialOffersFilters/filterPills/RangePills.jsx","webpack:///./app/javascript/components/Filters/SpecialOffersFilters/filterPills/PayloadPills.jsx","webpack:///./app/javascript/components/Filters/SpecialOffersFilters/filterPills/LoadLengthPills.jsx","webpack:///./app/javascript/components/Filters/SortByDropdown.jsx","webpack:///./app/javascript/components/Filters/FundersDropdown.jsx","webpack:///./app/javascript/components/Filters/ShortTermSpecialOffersFilters.jsx","webpack:///./app/javascript/components/Filters/StockOffersFilters.jsx","webpack:///./app/javascript/components/Filters/VanSpecialOffersFilters.jsx","webpack:///./app/javascript/components/Filters/SpecialOffersFilters/Payload.jsx","webpack:///./app/javascript/components/Filters/SpecialOffersFilters/LoadLength.jsx","webpack:///./app/javascript/components/Filters/MobileFilterControls.jsx","webpack:///./app/javascript/components/Filters/MobileModelFilters.jsx","webpack:///./app/javascript/components/Filters/ModelPills.jsx","webpack:///./app/javascript/components/DerivativeFilters/PricingFilters.jsx","webpack:///./app/javascript/components/EligibilityChecker/EligibilityChecker.jsx","webpack:///./app/javascript/components/EnquireNow/EnquireNow.jsx","webpack:///./app/javascript/components/Filters/FiltersWrapper.jsx","webpack:///./app/javascript/components/Filters/MobileFilterActions.jsx","webpack:///./app/javascript/components/Filters/ModelFiltersWrapper.jsx","webpack:///./app/javascript/components/Filters/OptionList.jsx","webpack:///./app/javascript/components/Filters/SortByFilters.jsx","webpack:///./app/javascript/components/Filters/SpecialOffersFilters/EstimatedDelivery.jsx","webpack:///./app/javascript/components/Filters/SpecialOffersFilters/InStock.jsx"],"names":["Pill","category","value","label","dismissable","isMake","isLast","gaFilterName","dispatch","useDispatch","className","classnames","onClick","event","persist","type","payload","form","target","closest","setTimeout","dispatchEvent","Event","bubbles","cancelable","defaultProps","ElasticSearchContext","createContext","PRICE_FILTERS","PRICES_FILTERS_COUNT","ElasticSearchProvider","path","labelMapping","children","useState","allElasticSearchOptions","setAllElasticSearchOptions","availableElasticSearchOptions","setAvailableElasticSearchOptions","initialLoadCompleted","useRef","defaultSelectedFilters","getQueryStringParameters","selectedFilters","useSelector","state","filterControls","filters","filterParams","objectToQueryStringParameters","getAvailableCounts","data","counts","key","Object","prototype","hasOwnProperty","call","startsWith","replace","prices","doc_count","count","useEffect","fetchInitialData","a","current","axios","get","params","response","initialResponse","console","error","fetchFilteredData","filteredResponse","availableData","Provider","allFiltersFor","name","priceFilterName","allBuckets","availableBuckets","allOptions","availableOptions","includes","buckets","map","bucket","toString","option","enabled","find","o","deals","key_as_string","availableBucket","indexOf","availableFiltersFor","hasAnyOption","b","props","setSelectedFilter","checked","newSelectedFilters","push","length","index","splice","filter","item","setSelectedBodytype","removeSelectedFilters","Array","isArray","forEach","nameItem","setSingleCheckboxFilter","useElasticSearch","context","useContext","Error","ElasticSearchWrapper","store","AnnualMileage","options","isDesktop","withoutButton","elasticSearchProps","parseFloat","toLocaleString","sort","selected","title","allText","InitialPayment","concat","ContractLength","monthLabel","Manufacturer","Model","split","reverse","prelabel","join","undefined","disabled","FuelType","optionsOrder","sortedOptions","steps","image","mobileImage","icon","icon1","columns","question","description","icon2","score","icon3","icon4","icon5","icon6","finalScreenData","Transmission","Budget","BodyType","ModelFiltersContext","ModelFiltersProvider","isVans","controller","initialData","setInitialData","setAvailableData","dispatchAndUpdateCountElements","document","querySelectorAll","element","innerText","url","timer","clearTimeout","observer","MutationObserver","derivativesRows","querySelector","moreButton","rowCount","classList","add","remove","observe","childList","disconnect","contextValue","aggregations","availableOption","cheapest_motr","useModelFilters","ModelFiltersWrapper","showPromotionalToggle","showPromotion","action","filterOptions","default","Seats","QuickDeliveryToggle","isDesktopVersion","elasticSearch","style","flexShrink","marginTop","labelPosition","defaultChecked","quickDelivery","PromotionalToggle","lowerCaseValue","toLowerCase","greenToggle","selectedFilter","promotion_name","Pills","memo","InStockToggle","width","stock","CategoryFilters","categoryType","isOpen","isFixed","handleVisible","useCallback","filtersRect","getBoundingClientRect","isAtTop","top","isWideScreen","window","innerWidth","zIndex","addEventListener","removeEventListener","filtersWrapper","classNames","VanBodytypeFilter","sliderRef","selectedSlide","setSelectedSlide","match","fromEntries","entries","keys","slider","ScrollSnapSlider","prev","next","updateArrows","toggle","scrollLeft","offsetWidth","scrollWidth","slideTo","slide","src","ArrowLeftIcon","alt","srcSet","ref","allSelected","hybrid_or_electric","isAll","isElectric","htmlFor","id","onChange","handleSelect","ArrowRightIcon","SpecialOffersFilters","DerivativeOptions","dataGroups","setSelected","setData","dependentFields","alwaysEnabledFilters","isOptionDisabled","filterName","activeData","isAlwaysEnabled","activeOptions","getDataFromJSON","json","reduce","object","groupName","UpdateData","SelectFilter","updatedState","selectedField","selectedFieldName","unselectFields","fieldName","unselectWhenSelected","onUpdateDataEvent","detail","derivativeJSON","dataGroup","true","false","StepComponent","stepData","onAnswer","onNext","onPrevious","stepNumber","currentValue","currentStep","errorMessage","media","step","e","FinalScreen","href","pushData","stepName","AllSpecialOffersFilters","heading","BodytypeFilters","BudgetFilters","AllModelFilters","modelFilters","noWrap","ElectricSpecialOffersFilters","Range","EstimatedDeliveryDropdown","FilterControls","isAdmin","isOnlySortVisible","fundersVisible","pillsRef","arrowLeftRef","arrowRightRef","theme","totalCounts","isEmpty","setIsEmpty","filterList","setFilterList","isOverflown","setIsOverflown","filterControlsForm","filterWrapperRect","height","Math","max","clientWidth","filtersWithoutDefaults","customer_type","sort_by","showEstimatedDelivery","showFunders","showQuickDelivery","shouldShowFeature","showPromotionalStock","marginLeft","display","gap","ElectricPills","MakePills","make","makeIndex","makes","Fragment","model","modelIndex","models","FuelTypePills","display_fueltype","BudgetPills","monthly_prices","BodyTypePills","bodytype_categories","TransmissionPills","transmission","SeatsPills","TermPills","term","MileagePills","mileage","floor","InitialPaymentPills","initial_payment","EstimatedDeliveryPills","estimated_delivery","InStockPills","PromotionalPills","FunderPills","funder","PayloadPills","LoadLengthPills","load_length","SortByDropdown","open","setOpen","dropdownRef","handleOutsideClicks","contains","field","replaceAll","handleClick","FundersDropdown","ShortTermSpecialOffersFilters","StockOffersFilters","VanSpecialOffersFilters","Payload","LoadLength","ClearAllButton","fill","viewBox","xmlns","d","MobileFilterControls","showOnlyInStock","showOnlyPromotional","showSingleToggle","clearAll","MobileModelFilters","useMemo","ModelPills","clearAllButton","mobile","trim","PricingFilters","noValidate","acceptCharset","method","placeholder","EligibilityChecker","eligibilityChecker","allAnswered","areAllQuestionsAnswered","currentScore","calculateCurrentScore","stepsData","about_you","address_history","employment_status","employment_history","affordability","credit_history","finalScreen","setFinalScreen","setErrorMessage","componentRef","Image","values","screen","componentTop","innerHeight","scrollTo","scrollY","behavior","stepComponentData","setEligibilityAnswer","goToNextStep","goToPreviousStep","EligibilityCheckerProvider","EnquireNow","postURL","channelID","isPersonal","geotargetly","pricing","personal_sources","business_sources","featured_deal","offer_id","derivative_id","initial_payment_months","salesAdmin","vehicleId","vehicleStatus","query","Deal","offerId","selectedOfferId","derivativeId","selectedTerm","contractLength","selectedMileage","annualMileage","maintenanceSelected","initialPaymentMonths","initialMonths","selectedOptionIds","actuallySelectedOptionIds","firstName","lastName","businessName","email","telephone","source","disposal","soon","time","comments","timeTrading","businessType","fleetSize","mailList","authenticity_token","leadType","setState","geotargetlyInit","useForm","mode","reValidateMode","register","handleSubmit","errors","getValues","formRef","onSubmit","content","formName","isVan","isShortTerm","form_name","lease_type","signup","monthlyPrice","item_name","item_brand","item_variant","item_category","item_category2","item_category3","fueltype","price","duration","annual_miles","initial_payment_duration","initial_payment_price","initialPaymentPrice","maintenance","maintenance_price","maintainedMonthlyPrice","user_data","phone_number","submit","labelText","required","hasError","first_name","last_name","company_name","contact_business_type","variant","text","contact_fleet_size","pattern","contact_email","validate","isValidNumber","contact_telephone","contact_time","lead_type","contact_source","on_dark","EnquireNowWrapper","FiltersWrapper","actionName","controllerName","useWindowSize","specialOffersFiltersPortal","categoryFiltersPortal","specialOffersPortalElement","getElementById","categoryPortalElement","vehiclesPortalElement","ReactDOM","createPortal","MobileFilterActions","preventDefault","submitForm","MobileFilterActionsWrapper","ModelFilters","mobileFiltersPortal","mobileFiltersElement","OptionList","Item","gaEventAction","gaFilterOption","propTypes","PropTypes","string","isRequired","bool","oneOf","node","func","SortByFilters","onSelect","SortByFiltersWrapper","EstimatedDelivery","InStock","getLabel"],"mappings":"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","file":"js/application~567d3491-0ce2a2722ecc9b805843.chunk.js","sourcesContent":["import React from 'react';\nimport PropTypes from 'prop-types';\nimport { useDispatch } from 'react-redux';\nimport classnames from 'classnames';\n\nfunction Pill({ category, value, label = value, dismissable, isMake, isLast, gaFilterName }) {\n  const dispatch = useDispatch();\n\n  const handleDismiss = (event) => {\n    event.persist();\n\n    if (dismissable) {\n      dispatch({\n        type: 'SET_FILTER',\n        payload: { category, value },\n      });\n\n      const form = event.target.closest('form');\n\n      setTimeout(() => {\n        form.dispatchEvent(new Event('submit', { bubbles: true, cancelable: true }));\n      }, 100);\n    }\n  };\n\n  return (\n    // eslint-disable-next-line jsx-a11y/click-events-have-key-events, jsx-a11y/no-static-element-interactions\n    <div\n      className={classnames('drv-pill', {\n        'drv-pill--close': dismissable,\n        'drv-pill--make': isMake,\n        'drv-pill--last': isLast,\n      })}\n      data-action=\"click->ga-filters#push\"\n      data-ga-filters-event-action=\"pill_deleted\"\n      data-ga-filters-filter-name={gaFilterName}\n      data-ga-filters-filter-option={value}\n      onClick={handleDismiss}\n    >\n      {label}\n    </div>\n  );\n}\n\nPill.propTypes = {\n  category: PropTypes.string.isRequired,\n  value: PropTypes.string.isRequired,\n  // eslint-disable-next-line react/require-default-props\n  label: PropTypes.string,\n  dismissable: PropTypes.bool,\n  isMake: PropTypes.bool,\n  isLast: PropTypes.bool,\n  gaFilterName: PropTypes.string,\n};\n\nPill.defaultProps = {\n  dismissable: true,\n  isMake: false,\n  isLast: false,\n  gaFilterName: '',\n};\n\nexport default Pill;\n","/* eslint-disable eqeqeq */\nimport React, { useState, useEffect, createContext, useContext, useRef } from 'react';\nimport PropTypes from 'prop-types';\nimport axios from 'axios';\nimport { Provider, useDispatch, useSelector } from 'react-redux';\nimport store from '../../store/store';\nimport { getQueryStringParameters, objectToQueryStringParameters } from '../../utils';\n\n// Create a context\nconst ElasticSearchContext = createContext(null);\n\nconst PRICE_FILTERS = ['monthly_prices', 'term', 'mileage', 'initial_payment', 'funder'];\n\nconst PRICES_FILTERS_COUNT = ['monthly_prices', 'funder'];\n\n// Context provider component\nexport const ElasticSearchProvider = ({ path, labelMapping, children }) => {\n  const [allElasticSearchOptions, setAllElasticSearchOptions] = useState({});\n  const [availableElasticSearchOptions, setAvailableElasticSearchOptions] = useState({});\n\n  const initialLoadCompleted = useRef(false);\n\n  const defaultSelectedFilters = {\n    ...getQueryStringParameters(),\n  };\n\n  const { filters: selectedFilters } = useSelector((state) => state.filterControls);\n  const dispatch = useDispatch();\n\n  const setSelectedFilter = (event) => {\n    const { name, value, checked, type } = event.target;\n\n    const newSelectedFilters = { ...selectedFilters };\n\n    if (checked) {\n      if (type === 'radio') {\n        newSelectedFilters[name] = value;\n      } else if (type === 'checkbox') {\n        newSelectedFilters[name] = newSelectedFilters[name] || [];\n        newSelectedFilters[name].push(value);\n      }\n    } else if (type === 'radio') {\n      delete newSelectedFilters[name];\n    } else if (type === 'checkbox') {\n      if (newSelectedFilters[name].length === 1) {\n        // Delete the whole entry if there's only one left\n        delete newSelectedFilters[name];\n      } else {\n        // Remove item from array\n        const index = newSelectedFilters[name].indexOf(value);\n        newSelectedFilters[name].splice(index, 1);\n      }\n\n      // Remove models when make is unselected\n      if (name === 'make[]' && newSelectedFilters['make_model_range[]']) {\n        newSelectedFilters['make_model_range[]'] = newSelectedFilters['make_model_range[]'].filter((item) => {\n          return item.indexOf(value) !== 0;\n        });\n      }\n    }\n\n    dispatch({ type: 'SET_FILTERS', payload: newSelectedFilters });\n  };\n\n  const setSelectedBodytype = (event) => {\n    dispatch({ type: 'SET_BODYTYPE_FILTERS', payload: event.target.value });\n  };\n\n  const setSingleCheckboxFilter = (event) => {\n    const { name, value, checked } = event.target;\n    const newSelectedFilters = { ...selectedFilters };\n    if (checked) {\n      newSelectedFilters[name] = value;\n    } else {\n      delete newSelectedFilters[name];\n    }\n    dispatch({ type: 'SET_FILTERS', payload: newSelectedFilters });\n  };\n\n  const removeSelectedFilters = (name) => {\n    const newSelectedFilters = { ...selectedFilters };\n\n    if (Array.isArray(name)) {\n      name.forEach((nameItem) => delete newSelectedFilters[nameItem]);\n    } else {\n      delete newSelectedFilters[name];\n    }\n\n    dispatch({ type: 'SET_FILTERS', payload: newSelectedFilters });\n  };\n\n  const filterParams = objectToQueryStringParameters(selectedFilters);\n\n  const initialiseReduxState = () => {\n    dispatch({ type: 'INITIALISE_FILTERS', payload: defaultSelectedFilters });\n  };\n\n  const getAvailableCounts = (data) => {\n    const counts = {};\n\n    for (const key in data) {\n      if (Object.prototype.hasOwnProperty.call(data, key)) {\n        if (key.startsWith('prices.')) {\n          counts[key.replace('prices.', '')] = data[key].prices[key].doc_count;\n        } else {\n          counts[key] = data[key].doc_count;\n        }\n      }\n    }\n\n    counts.count = data.count;\n\n    return counts;\n  };\n\n  useEffect(() => {\n    const fetchInitialData = async () => {\n      if (path && !initialLoadCompleted.current) {\n        try {\n          const initialResponse = await axios.get(`${path}.json`, {\n            params: { response: 'json' },\n          });\n          setAllElasticSearchOptions(initialResponse.data);\n          initialiseReduxState();\n          initialLoadCompleted.current = true;\n        } catch (error) {\n          console.error('Failed to fetch initial ElasticSearch options', error);\n        }\n      }\n    };\n\n    fetchInitialData();\n  }, [path]);\n\n  useEffect(() => {\n    const fetchFilteredData = async () => {\n      if (path) {\n        try {\n          const filteredResponse = await axios.get(`${path}.json?${filterParams}`, {\n            params: { response: 'json' },\n          });\n          const availableData = filteredResponse.data;\n\n          if (availableData) {\n            dispatch({\n              type: 'TOTAL_COUNTS',\n              payload: getAvailableCounts(availableData),\n            });\n            setAvailableElasticSearchOptions(availableData);\n          }\n        } catch (error) {\n          console.error('Failed to fetch filtered ElasticSearch options', error);\n        }\n      }\n    };\n\n    fetchFilteredData();\n  }, [filterParams]);\n\n  const allFiltersFor = (name) => {\n    let priceFilterName;\n    let allBuckets;\n    let availableBuckets;\n    let allOptions;\n    let availableOptions;\n\n    if (PRICE_FILTERS.includes(name)) {\n      priceFilterName = `prices.${name}`;\n      if (!allElasticSearchOptions[priceFilterName] || !availableElasticSearchOptions[priceFilterName]) return [];\n\n      allBuckets = allElasticSearchOptions[priceFilterName].prices[priceFilterName][name].buckets;\n      availableBuckets = availableElasticSearchOptions[priceFilterName].prices[priceFilterName][name].buckets;\n      allOptions = allBuckets.map((bucket) => bucket.key.toString());\n      availableOptions = availableBuckets.map((bucket) => bucket.key.toString());\n      return allOptions.map((option) => ({\n        value: (labelMapping && labelMapping[option]) || option,\n        label: option,\n        enabled: availableBuckets.find((o) => o.key == option)\n          ? availableBuckets.find((o) => o.key == option).doc_count > 0\n          : false,\n        count:\n          PRICES_FILTERS_COUNT.includes(name) &&\n          availableBuckets.find((o) => o.key == option) &&\n          availableBuckets.find((o) => o.key == option).deals.doc_count,\n      }));\n    }\n    if (!allElasticSearchOptions[name] || !availableElasticSearchOptions[name]) return [];\n\n    allBuckets = allElasticSearchOptions[name].buckets;\n    availableBuckets = availableElasticSearchOptions[name].buckets;\n    allOptions = allBuckets.map((bucket) => bucket.key_as_string || bucket.key.toString());\n    availableOptions = availableBuckets.map((bucket) => bucket.key_as_string || bucket.key.toString());\n\n    return allOptions.map((option) => {\n      const availableBucket = availableBuckets.find((o) => o.key == option || o.key_as_string == option);\n      return {\n        value: option,\n        enabled: availableOptions.indexOf(option) > -1,\n        count: (!!availableBucket && availableBucket.doc_count) || 0,\n      };\n    });\n  };\n\n  const hasAnyOption = (name, value) => {\n    if (!allElasticSearchOptions[name]) return false;\n    // eslint-disable-next-line eqeqeq\n    const bucket = allElasticSearchOptions[name].buckets.find((b) => b.key_as_string === value || b.key == value);\n    if (!bucket) return false;\n    return bucket.doc_count > 0;\n  };\n\n  const availableFiltersFor = (name) => {\n    if (!availableElasticSearchOptions[name]) return [];\n\n    return availableElasticSearchOptions[name].buckets.map((bucket) => ({\n      value: bucket.key_as_string || bucket.key,\n      count: bucket.doc_count,\n    }));\n  };\n\n  // Provide the context with the values\n  return (\n    <ElasticSearchContext.Provider\n      // TODO: fix eslint error instead of disabling it\n      // eslint-disable-next-line react/jsx-no-constructed-context-values\n      value={{\n        allFiltersFor,\n        availableFiltersFor,\n        hasAnyOption,\n        props: {\n          selectedFilters,\n          setSelectedFilter,\n          setSelectedBodytype,\n          removeSelectedFilters,\n          setSingleCheckboxFilter,\n        },\n      }}\n    >\n      {children}\n    </ElasticSearchContext.Provider>\n  );\n};\n\n// Hook to use the context\nexport const useElasticSearch = () => {\n  const context = useContext(ElasticSearchContext);\n  if (!context) {\n    throw new Error('useElasticSearch must be used within a ElasticSearchProvider');\n  }\n  return context;\n};\n\nElasticSearchProvider.propTypes = {\n  path: PropTypes.string,\n  labelMapping: PropTypes.shape({}),\n  children: PropTypes.node,\n};\n\nElasticSearchProvider.defaultProps = {\n  path: '',\n  labelMapping: {},\n  children: null,\n};\n\n/* eslint-disable react/jsx-props-no-spreading */\n// Wrapper component to include Redux Provider\nexport default function ElasticSearchWrapper(props) {\n  return (\n    <Provider store={store}>\n      <ElasticSearchProvider {...props} />\n    </Provider>\n  );\n}\n/* eslint-enable */\n","import React from 'react';\nimport PropTypes from 'prop-types';\n\nimport FilterDrawerItem from '../../ui/FilterDrawerItem';\n\nimport { elasticSearchFilterOptionPropTypes, elasticSearchPropsPropTypes } from '../../../propTypes/elasticSearch';\n\nconst AnnualMileage = ({ name, options, isDesktop, withoutButton, elasticSearchProps }) => {\n  options = options.map((option) => {\n    const label = `${parseFloat(option.value).toLocaleString('en-GB')} miles`;\n\n    return { ...option, label };\n  });\n\n  options.sort((a, b) => a.value - b.value);\n\n  const selected =\n    elasticSearchProps.selectedFilters[name] &&\n    options.find((option) => option.value === elasticSearchProps.selectedFilters[name]);\n  const count = selected ? selected.label : '';\n\n  return (\n    <FilterDrawerItem\n      title=\"Annual mileage\"\n      allText=\"Any\"\n      count={count}\n      name={name}\n      options={options}\n      elasticSearchProps={elasticSearchProps}\n      isDesktop={isDesktop}\n      withoutButton={withoutButton}\n    />\n  );\n};\n\nAnnualMileage.propTypes = {\n  name: PropTypes.string.isRequired,\n  options: PropTypes.arrayOf(elasticSearchFilterOptionPropTypes),\n  isDesktop: PropTypes.bool,\n  elasticSearchProps: elasticSearchPropsPropTypes.isRequired,\n  withoutButton: PropTypes.bool,\n};\n\nAnnualMileage.defaultProps = {\n  options: [],\n  isDesktop: false,\n  withoutButton: false,\n};\n\nexport default AnnualMileage;\n","import React from 'react';\nimport PropTypes from 'prop-types';\n\nimport FilterDrawerItem from '../../ui/FilterDrawerItem';\nimport { elasticSearchFilterOptionPropTypes, elasticSearchPropsPropTypes } from '../../../propTypes/elasticSearch';\n\nconst InitialPayment = ({ name, options, isDesktop, withoutButton, elasticSearchProps }) => {\n  options = options.map((option) => {\n    let label = `${parseFloat(option.value).toLocaleString('en-GB')} month`;\n\n    if (option.value !== '1') {\n      label = label.concat('s');\n    }\n\n    return { ...option, label };\n  });\n\n  options.sort((a, b) => a.value - b.value);\n\n  const selected =\n    elasticSearchProps.selectedFilters[name] &&\n    options.find((option) => option.value === elasticSearchProps.selectedFilters[name]);\n  const count = selected ? selected.label : '';\n\n  return (\n    <FilterDrawerItem\n      title=\"Initial payment\"\n      allText=\"Any\"\n      count={count}\n      name={name}\n      options={options}\n      elasticSearchProps={elasticSearchProps}\n      isDesktop={isDesktop}\n      withoutButton={withoutButton}\n    />\n  );\n};\n\nInitialPayment.propTypes = {\n  name: PropTypes.string.isRequired,\n  options: PropTypes.arrayOf(elasticSearchFilterOptionPropTypes),\n  isDesktop: PropTypes.bool,\n  elasticSearchProps: elasticSearchPropsPropTypes.isRequired,\n  withoutButton: PropTypes.bool,\n};\n\nInitialPayment.defaultProps = {\n  options: [],\n  isDesktop: false,\n  withoutButton: false,\n};\n\nexport default InitialPayment;\n","import React from 'react';\nimport PropTypes from 'prop-types';\n\nimport FilterDrawerItem from '../../ui/FilterDrawerItem';\n\nimport { elasticSearchFilterOptionPropTypes, elasticSearchPropsPropTypes } from '../../../propTypes/elasticSearch';\n\nconst ContractLength = ({ name, options, isDesktop, withoutButton, elasticSearchProps }) => {\n  options = options.map((option) => {\n    const monthLabel = option.value === '60' ? 'months (Finance Lease Only)' : 'months';\n    const label = `${option.value} ${monthLabel}`;\n\n    return { ...option, label };\n  });\n\n  options.sort((a, b) => a.value - b.value);\n\n  const selected =\n    elasticSearchProps.selectedFilters[name] &&\n    options.find((option) => option.value === elasticSearchProps.selectedFilters[name]);\n  const count = selected ? selected.label : '';\n\n  return (\n    <FilterDrawerItem\n      title=\"Contract length\"\n      allText=\"Any\"\n      count={count}\n      name={name}\n      options={options}\n      elasticSearchProps={elasticSearchProps}\n      isDesktop={isDesktop}\n      withoutButton={withoutButton}\n    />\n  );\n};\n\nContractLength.propTypes = {\n  name: PropTypes.string.isRequired,\n  options: PropTypes.arrayOf(elasticSearchFilterOptionPropTypes),\n  isDesktop: PropTypes.bool,\n  elasticSearchProps: elasticSearchPropsPropTypes.isRequired,\n  withoutButton: PropTypes.bool,\n};\n\nContractLength.defaultProps = {\n  options: [],\n  isDesktop: false,\n  withoutButton: false,\n};\n\nexport default ContractLength;\n","import React from 'react';\nimport PropTypes from 'prop-types';\n\nimport FilterDrawerItem from '../../ui/FilterDrawerItem';\nimport { elasticSearchFilterOptionPropTypes, elasticSearchPropsPropTypes } from '../../../propTypes/elasticSearch';\n\nconst Manufacturer = ({ title, name, options, isDesktop, elasticSearchProps }) => {\n  const removeSelectedFilters = () => {\n    // also remove the Model when Manufacturer is set to All\n    elasticSearchProps.removeSelectedFilters([name, 'make_model_range[]']);\n  };\n\n  return (\n    <FilterDrawerItem\n      title={title}\n      name={name}\n      options={options}\n      elasticSearchProps={{ ...elasticSearchProps, removeSelectedFilters }}\n      isDesktop={isDesktop}\n    />\n  );\n};\n\nManufacturer.propTypes = {\n  title: PropTypes.string,\n  name: PropTypes.string.isRequired,\n  options: PropTypes.arrayOf(elasticSearchFilterOptionPropTypes),\n  isDesktop: PropTypes.bool,\n  elasticSearchProps: elasticSearchPropsPropTypes.isRequired,\n};\n\nManufacturer.defaultProps = {\n  title: 'Manufacturer',\n  options: [],\n  isDesktop: false,\n};\n\nexport default Manufacturer;\n","import React from 'react';\nimport PropTypes from 'prop-types';\n\nimport FilterDrawerItem from '../../ui/FilterDrawerItem';\nimport { elasticSearchFilterOptionPropTypes, elasticSearchPropsPropTypes } from '../../../propTypes/elasticSearch';\n\nconst Model = ({ name, options, isDesktop, elasticSearchProps }) => {\n  // e.g. \"Audi, A3\" is the Make and Model separated by ', '\n  const modelNameValueSeparator = ', ';\n\n  options = options.map((option) => {\n    // we reverse these so that \"label\" always exists even if the split fails\n    // e.g. an option value of \"Audi A3\" here would give us label = \"Audi A3\" and prelabel = undefined\n    // while an option value of \"Audi, A3\" here would give us label = \"A3\" and prelabel = \"Audi\"\n\n    // the use of 2 in the split ensures we always get a maximum of 2 parts\n    const [label, prelabel] = option.value.split(modelNameValueSeparator, 2).reverse();\n\n    return { ...option, prelabel, label };\n  });\n\n  const count = elasticSearchProps.selectedFilters[name]\n    ? elasticSearchProps.selectedFilters[name].map((value) => value.replace(modelNameValueSeparator, ' ')).join(', ')\n    : undefined;\n  const disabled = !elasticSearchProps.selectedFilters['make[]'];\n\n  return (\n    <FilterDrawerItem\n      title=\"Model\"\n      name={name}\n      count={count}\n      options={options}\n      disabled={disabled}\n      elasticSearchProps={elasticSearchProps}\n      isDesktop={isDesktop}\n    />\n  );\n};\n\nModel.propTypes = {\n  name: PropTypes.string.isRequired,\n  options: PropTypes.arrayOf(elasticSearchFilterOptionPropTypes),\n  isDesktop: PropTypes.bool,\n  elasticSearchProps: elasticSearchPropsPropTypes.isRequired,\n};\n\nModel.defaultProps = {\n  options: [],\n  isDesktop: false,\n};\n\nexport default Model;\n","import React from 'react';\nimport PropTypes from 'prop-types';\n\nimport FilterDrawerItem from '../../ui/FilterDrawerItem';\nimport { elasticSearchFilterOptionPropTypes, elasticSearchPropsPropTypes } from '../../../propTypes/elasticSearch';\n\nconst FuelType = ({ name, options, isDesktop, elasticSearchProps }) => {\n  const optionsOrder = ['Electric', 'Hybrid', 'Petrol', 'Diesel', 'Plug-in Hybrid', 'Other'].reverse();\n\n  // .reverse() -> we want all of the options not in this list to be last, but the default with the below sort is that they're first.\n  // so we reverse both lists so that the missing options are last instead.\n\n  const sortedOptions = [...options]\n    .sort((a, b) => {\n      return optionsOrder.indexOf(a.value) - optionsOrder.indexOf(b.value);\n    })\n    .reverse();\n\n  return (\n    <FilterDrawerItem\n      title=\"Fuel type\"\n      name={name}\n      options={sortedOptions}\n      elasticSearchProps={elasticSearchProps}\n      isDesktop={isDesktop}\n    />\n  );\n};\n\nFuelType.propTypes = {\n  name: PropTypes.string.isRequired,\n  options: PropTypes.arrayOf(elasticSearchFilterOptionPropTypes),\n  isDesktop: PropTypes.bool,\n  elasticSearchProps: elasticSearchPropsPropTypes.isRequired,\n};\n\nFuelType.defaultProps = {\n  options: [],\n  isDesktop: false,\n};\n\nexport default FuelType;\n","// Asset Imports\nimport icon1 from '../../../assets/images/ec-icon-1.svg';\nimport icon2 from '../../../assets/images/ec-icon-2.svg';\nimport icon3 from '../../../assets/images/ec-icon-3.svg';\nimport icon4 from '../../../assets/images/ec-icon-4.svg';\nimport icon5 from '../../../assets/images/ec-icon-5.svg';\nimport icon6 from '../../../assets/images/ec-icon-6.svg';\n\nexport const steps = [\n  {\n    name: 'about_you',\n    title: 'About you',\n    image:\n      'https://res.cloudinary.com/ho5waxsnl/image/upload/f_auto,q_auto/v1/eligibility-checker/mztobcwtkqgyuwizfhhz',\n    mobileImage:\n      'https://res.cloudinary.com/ho5waxsnl/image/upload/f_auto,q_auto/v1/eligibility-checker/mztobcwtkqgyuwizfhhz',\n    icon: icon1,\n    columns: 2,\n    question: 'Are you over 18?',\n    description: 'You must be 18 years old or older to apply for finance for a lease vehicle.',\n    options: [\n      {\n        label: 'Over 18 years old',\n        value: 'over_18',\n        description: 'I confirm I am 18 years old or older.',\n      },\n      {\n        label: 'Under 18 years old',\n        value: 'under_18',\n        description: 'I am not yet 18 years old.',\n      },\n    ],\n  },\n  {\n    name: 'address_history',\n    title: 'Address History',\n    image:\n      'https://res.cloudinary.com/ho5waxsnl/image/upload/f_auto,q_auto/v1/eligibility-checker/ljuo2o6yuxvsahpxnuwo',\n    mobileImage:\n      'https://res.cloudinary.com/ho5waxsnl/image/upload/f_auto,q_auto/v1/eligibility-checker/qra9mfl1fjuzezijmghv',\n    icon: icon2,\n    columns: 2,\n    question: 'How many years address history can you provide?',\n    description: 'A minimum of 3 years address history is required to assess your application.',\n    options: [\n      {\n        label: '0 to 2 years',\n        value: '0_to_2',\n        description: 'Address history available',\n        score: 3,\n      },\n      {\n        label: '2 to 3 years',\n        value: '2_to_3',\n        description: 'Address history available',\n        score: 3,\n      },\n      {\n        label: '3 to 5 years',\n        value: '3_to_5',\n        description: 'Address history available',\n        score: 1,\n      },\n      {\n        label: 'Over 5 years',\n        value: 'over_5',\n        description: 'Address history available',\n        score: 1,\n      },\n    ],\n  },\n  {\n    name: 'employment_status',\n    title: 'Employment status',\n    columns: 3,\n    image:\n      'https://res.cloudinary.com/ho5waxsnl/image/upload/f_auto,q_auto/v1/eligibility-checker/xq3zjs5belrtyg3zyda6',\n    mobileImage:\n      'https://res.cloudinary.com/ho5waxsnl/image/upload/f_auto,q_auto/v1/eligibility-checker/xq3zjs5belrtyg3zyda6',\n    icon: icon3,\n    question: 'What best describes your employment status?',\n    options: [\n      {\n        label: 'Full time',\n        value: 'full_time',\n        description: '',\n        score: 1,\n      },\n      {\n        label: 'Part time',\n        value: 'part_time',\n        description: '',\n        score: 1,\n      },\n      {\n        label: 'Contractor',\n        value: 'contractor',\n        description: '',\n        score: 1,\n      },\n      {\n        label: 'Self employed',\n        value: 'self_employed',\n        description: '',\n        score: 1,\n      },\n      {\n        label: 'Unemployed',\n        value: 'unemployed',\n        description: '',\n        score: 2,\n      },\n      {\n        label: 'Home maker',\n        value: 'home_maker',\n        description: '',\n        score: 2,\n      },\n      {\n        label: 'Retired',\n        value: 'retired',\n        description: '',\n        score: 2,\n      },\n    ],\n  },\n  {\n    name: 'employment_history',\n    title: 'Employment history',\n    columns: 1,\n    image:\n      'https://res.cloudinary.com/ho5waxsnl/image/upload/f_auto,q_auto/v1/eligibility-checker/kl6c4byj5hjqc95yh4a2',\n    mobileImage:\n      'https://res.cloudinary.com/ho5waxsnl/image/upload/f_auto,q_auto/v1/eligibility-checker/dpeaguo0rioued6igaxj',\n    icon: icon4,\n    question: 'How many years of employment / regular income history can you provide?',\n    options: [\n      {\n        label: '0 to 3 years',\n        value: '0_to_3',\n        description: 'I can provide up to 3 years of employment / income history.',\n        score: 2,\n      },\n      {\n        label: '3 to 5 years',\n        value: '3_to_5',\n        description: 'I can provide between 3 and 5 years of employment / income history.',\n        score: 1,\n      },\n      {\n        label: 'Over 5 years',\n        value: 'over_5',\n        description: 'I can provide over 5 years of employment / income history.',\n        score: 1,\n      },\n    ],\n  },\n  {\n    name: 'affordability',\n    title: 'Affordability',\n    columns: 1,\n    image:\n      'https://res.cloudinary.com/ho5waxsnl/image/upload/f_auto,q_auto/v1/eligibility-checker/m5ibecrzlm5mh3pdz6e3',\n    mobileImage:\n      'https://res.cloudinary.com/ho5waxsnl/image/upload/f_auto,q_auto/v1/eligibility-checker/m5ibecrzlm5mh3pdz6e3',\n    icon: icon5,\n    question: 'Do you have regular income to afford the monthly lease payments?',\n    options: [\n      {\n        label: 'Yes',\n        value: 'yes',\n        description: 'I have regular income and can afford monthly lease payments.',\n        score: 1,\n      },\n      {\n        label: 'No',\n        value: 'no',\n        description: 'I do not currently have regular income.',\n        score: 3,\n      },\n    ],\n  },\n  {\n    name: 'credit_history',\n    title: 'Credit history',\n    columns: 1,\n    image:\n      'https://res.cloudinary.com/ho5waxsnl/image/upload/f_auto,q_auto/v1/eligibility-checker/afiicxzrshidv23ziiyi',\n    mobileImage:\n      'https://res.cloudinary.com/ho5waxsnl/image/upload/f_auto,q_auto/v1/eligibility-checker/afiicxzrshidv23ziiyi',\n    icon: icon6,\n    question: 'Do you have adverse credit on your credit report?',\n    description: 'For example any missed payments, CCJs, IVA scheme, bankruptcy.',\n    options: [\n      {\n        label: 'Yes',\n        value: 'yes',\n        description: 'I do have adverse credit on my credit report.',\n        score: 3,\n      },\n      {\n        label: 'No',\n        value: 'no',\n        description: 'No I do not have any adverse credit on my credit report.',\n        score: 1,\n      },\n      {\n        label: 'Not sure',\n        value: 'not_sure',\n        description: 'I am not sure whether I have have any adverse credit on my credit report.',\n        score: 2,\n      },\n    ],\n  },\n];\n\nexport const finalScreenData = {\n  1: {\n    title: 'Great news!',\n    image:\n      'https://res.cloudinary.com/ho5waxsnl/image/upload/f_auto,q_auto/v1/eligibility-checker/exbdp4mpsrcvtx3kzjfo',\n    mobileImage:\n      'https://res.cloudinary.com/ho5waxsnl/image/upload/f_auto,q_auto/v1/eligibility-checker/rkm4okms8lc0x4n7i2xu',\n    description: `Your answers indicate you'll be eligible for finance with our panel of lenders. Let's look at the best deal for you now.`,\n  },\n  2: {\n    title: 'Thanks for your answers!',\n    image:\n      'https://res.cloudinary.com/ho5waxsnl/image/upload/f_auto,q_auto/v1/eligibility-checker/ttrpmgoszaulb0icigiz',\n    mobileImage:\n      'https://res.cloudinary.com/ho5waxsnl/image/upload/f_auto,q_auto/v1/eligibility-checker/giyvchujk1szh1ffyrib',\n    description: `There's a good chance we'll be able to find a deal to suit you.  Contact us now to look at the best offers available for you now.`,\n  },\n  3: {\n    title: 'Thanks for your answers!',\n    image:\n      'https://res.cloudinary.com/ho5waxsnl/image/upload/f_auto,q_auto/v1/eligibility-checker/v4dn14iaajdnfbzaklf1',\n    mobileImage:\n      'https://res.cloudinary.com/ho5waxsnl/image/upload/f_auto,q_auto/v1/eligibility-checker/ybur61axjtr55vg8mmta',\n    description: 'We have some lenders who may consider your application. Please contact us to discuss further.',\n  },\n};\n","import React from 'react';\nimport PropTypes from 'prop-types';\n\nimport FilterDrawerItem from '../../ui/FilterDrawerItem';\nimport { elasticSearchFilterOptionPropTypes, elasticSearchPropsPropTypes } from '../../../propTypes/elasticSearch';\n\nconst Transmission = ({ name, options, isDesktop, elasticSearchProps }) => {\n  return (\n    <FilterDrawerItem\n      title=\"Gearbox\"\n      name={name}\n      options={options}\n      elasticSearchProps={elasticSearchProps}\n      isDesktop={isDesktop}\n    />\n  );\n};\n\nTransmission.propTypes = {\n  name: PropTypes.string.isRequired,\n  options: PropTypes.arrayOf(elasticSearchFilterOptionPropTypes),\n  isDesktop: PropTypes.bool,\n  elasticSearchProps: elasticSearchPropsPropTypes.isRequired,\n};\n\nTransmission.defaultProps = {\n  options: [],\n  isDesktop: false,\n};\n\nexport default Transmission;\n","import React from 'react';\nimport PropTypes from 'prop-types';\n\nimport FilterDrawerItem from '../../ui/FilterDrawerItem';\n\nimport { elasticSearchFilterOptionPropTypes, elasticSearchPropsPropTypes } from '../../../propTypes/elasticSearch';\n\nconst Budget = ({ name, options, isDesktop, elasticSearchProps }) => {\n  const selected =\n    elasticSearchProps.selectedFilters[name] &&\n    options.find((option) => option.value === elasticSearchProps.selectedFilters[name]);\n  const count = selected ? selected.label : '';\n\n  return (\n    <FilterDrawerItem\n      title=\"Budget\"\n      name={name}\n      allText=\"Any\"\n      options={options}\n      count={count}\n      elasticSearchProps={elasticSearchProps}\n      isDesktop={isDesktop}\n    />\n  );\n};\n\nBudget.propTypes = {\n  name: PropTypes.string.isRequired,\n  options: PropTypes.arrayOf(elasticSearchFilterOptionPropTypes),\n  isDesktop: PropTypes.bool,\n  elasticSearchProps: elasticSearchPropsPropTypes.isRequired,\n};\n\nBudget.defaultProps = {\n  options: [],\n  isDesktop: false,\n};\n\nexport default Budget;\n","import React from 'react';\nimport PropTypes from 'prop-types';\n\nimport FilterDrawerItem from '../../ui/FilterDrawerItem';\n\nimport { elasticSearchFilterOptionPropTypes, elasticSearchPropsPropTypes } from '../../../propTypes/elasticSearch';\n\nconst BodyType = ({ name, options, sort, isDesktop, elasticSearchProps }) => {\n  const optionsOrder = ['Pickup', 'Small Van', 'Medium Van', 'Large Van', 'Luton', 'Dropside', 'Tipper'].reverse();\n\n  // .reverse() -> we want all of the options not in this list to be last, but the default with the below sort is that they're first.\n  // so we reverse both lists so that the missing options are last instead.\n\n  const sortedOptions =\n    sort === 'custom'\n      ? [...options]\n          .sort((a, b) => {\n            return optionsOrder.indexOf(a.value) - optionsOrder.indexOf(b.value);\n          })\n          .reverse()\n      : options;\n\n  return (\n    <FilterDrawerItem\n      title=\"Body type\"\n      name={name}\n      options={sortedOptions}\n      elasticSearchProps={elasticSearchProps}\n      isDesktop={isDesktop}\n    />\n  );\n};\n\nBodyType.propTypes = {\n  name: PropTypes.string.isRequired,\n  options: PropTypes.arrayOf(elasticSearchFilterOptionPropTypes),\n  isDesktop: PropTypes.bool,\n  sort: PropTypes.string,\n  elasticSearchProps: elasticSearchPropsPropTypes.isRequired,\n};\n\nBodyType.defaultProps = {\n  options: [],\n  sort: '',\n  isDesktop: false,\n};\n\nexport default BodyType;\n","/* eslint-disable react/jsx-props-no-spreading */\nimport React, { useState, useEffect, createContext, useContext, useRef } from 'react';\nimport PropTypes from 'prop-types';\nimport axios from 'axios';\nimport { Provider, useDispatch, useSelector } from 'react-redux';\nimport store from '../../store/store';\nimport { getQueryStringParameters, objectToQueryStringParameters } from '../../utils';\n\nconst ModelFiltersContext = createContext(null);\n\nconst PRICE_FILTERS = ['initial_payment', 'mileage', 'term'];\n\nexport const ModelFiltersProvider = ({ path, children, isVans, controller }) => {\n  const [initialData, setInitialData] = useState(null);\n  const [availableData, setAvailableData] = useState(null);\n  const initialLoadCompleted = useRef(false);\n\n  const defaultSelectedFilters = {\n    ...getQueryStringParameters(),\n  };\n\n  const { filters: selectedFilters } = useSelector((state) => state.filterControls);\n  const dispatch = useDispatch();\n\n  useEffect(() => {\n    dispatch({ type: 'SET_IS_VANS', payload: isVans });\n    dispatch({ type: 'SET_CONTROLLER', payload: controller });\n  }, [dispatch, isVans, controller]);\n\n  const setSelectedFilter = (event) => {\n    const { name, value } = event.target;\n    const newSelectedFilters = { ...selectedFilters };\n\n    if (value) {\n      newSelectedFilters[name] = value;\n    } else {\n      delete newSelectedFilters[name];\n    }\n\n    dispatch({ type: 'SET_FILTERS', payload: newSelectedFilters });\n  };\n\n  const removeSelectedFilters = (name) => {\n    const newSelectedFilters = { ...selectedFilters };\n\n    if (Array.isArray(name)) {\n      name.forEach((nameItem) => delete newSelectedFilters[nameItem]);\n    } else {\n      delete newSelectedFilters[name];\n    }\n\n    dispatch({ type: 'SET_FILTERS', payload: newSelectedFilters });\n  };\n\n  const filterParams = objectToQueryStringParameters(selectedFilters);\n\n  const initialiseReduxState = () => {\n    dispatch({ type: 'INITIALISE_FILTERS', payload: defaultSelectedFilters });\n  };\n\n  const dispatchAndUpdateCountElements = (count) => {\n    dispatch({\n      type: 'TOTAL_COUNTS',\n      payload: { count },\n    });\n\n    const countElements = document.querySelectorAll('#item-count-element');\n    countElements.forEach((element) => {\n      element.innerText = `- ${count} vehicles found`;\n    });\n  };\n\n  // Fetch initial data on component mount or when URL parameters change\n  useEffect(() => {\n    const fetchInitialData = async () => {\n      if (path && !initialLoadCompleted.current) {\n        try {\n          const url = `${path}.json`;\n          const response = await axios.get(url);\n          setInitialData(response.data);\n          setAvailableData(response.data);\n\n          initialiseReduxState();\n\n          // Update count elements if there are no filters applied\n          if (!filterParams && response.data?.deals?.count !== undefined) {\n            dispatchAndUpdateCountElements(response.data.deals.count);\n          }\n\n          initialLoadCompleted.current = true;\n        } catch (error) {\n          console.error('Failed to fetch initial model data', error);\n        }\n      }\n    };\n\n    fetchInitialData();\n  }, [path, filterParams]);\n\n  // Fetch filtered data when filters change\n  useEffect(() => {\n    const fetchFilteredData = async () => {\n      if (path && initialLoadCompleted.current) {\n        try {\n          const response = await axios.get(`${path}.json?${filterParams}`);\n          setAvailableData(response.data);\n\n          if (response.data?.deals?.count !== undefined) {\n            dispatchAndUpdateCountElements(response.data.deals.count);\n          }\n        } catch (error) {\n          console.error('Failed to fetch filtered model data', error);\n        }\n      }\n    };\n\n    const timer = setTimeout(() => {\n      if (initialLoadCompleted.current) {\n        fetchFilteredData();\n      }\n    }, 0);\n\n    return () => clearTimeout(timer);\n  }, [filterParams]);\n\n  useEffect(() => {\n    const observer = new MutationObserver(() => {\n      const derivativesRows = document.querySelector('.g-derivatives__rows');\n      const moreButton = document.querySelector('.g-derivatives__more');\n\n      if (derivativesRows && moreButton) {\n        const rowCount = derivativesRows.children.length;\n        const totalCount = availableData?.deals?.count || 0;\n\n        if (totalCount > rowCount) {\n          moreButton.classList.add('g-derivatives__more--show');\n        } else {\n          moreButton.classList.remove('g-derivatives__more--show');\n        }\n      }\n    });\n\n    const derivativesRows = document.querySelector('.g-derivatives__rows');\n    if (derivativesRows) {\n      observer.observe(derivativesRows, { childList: true });\n    }\n\n    return () => observer.disconnect();\n  }, [availableData?.deals?.count]);\n\n  const allFiltersFor = (name) => {\n    if (!initialData?.aggregations?.[name]) return [];\n\n    const allOptions = initialData.aggregations[name];\n    const availableOptions = availableData?.aggregations?.[name] || [];\n\n    return allOptions.map((option) => {\n      const availableOption = availableOptions.find((o) => o.key === option.key);\n      return {\n        value: option.key.toString(),\n        label: option.key.toString(),\n        enabled: PRICE_FILTERS.includes(name) ? true : !!availableOption,\n        count: PRICE_FILTERS.includes(name) ? 0 : availableOption?.doc_count || 0,\n        cheapest_motr: option.cheapest_motr?.value,\n        selected: selectedFilters[name] === option.key.toString(),\n      };\n    });\n  };\n\n  const hasAnyOption = (name, value) => {\n    if (!initialData?.aggregations?.[name]) return false;\n    const option = initialData.aggregations[name].find((o) => o.key.toString() === value.toString());\n    return !!option && option.doc_count > 0;\n  };\n\n  const availableFiltersFor = (name) => {\n    if (!availableData?.aggregations?.[name]) return [];\n\n    return availableData.aggregations[name].map((option) => ({\n      value: option.key.toString(),\n      count: option.doc_count,\n    }));\n  };\n\n  // TODO: fix eslint error instead of disabling it\n  // eslint-disable-next-line react/jsx-no-constructed-context-values\n  const contextValue = {\n    allFiltersFor,\n    availableFiltersFor,\n    hasAnyOption,\n    props: {\n      selectedFilters,\n      setSelectedFilter,\n      removeSelectedFilters,\n    },\n  };\n\n  return <ModelFiltersContext.Provider value={contextValue}>{children}</ModelFiltersContext.Provider>;\n};\n\nexport const useModelFilters = () => {\n  const context = useContext(ModelFiltersContext);\n  if (!context) {\n    throw new Error('useModelFilters must be used within a ModelFiltersProvider');\n  }\n  return context;\n};\n\nModelFiltersProvider.propTypes = {\n  path: PropTypes.string,\n  children: PropTypes.node,\n  isVans: PropTypes.bool,\n  controller: PropTypes.string,\n};\n\nModelFiltersProvider.defaultProps = {\n  path: '',\n  children: null,\n  isVans: false,\n  controller: '',\n};\n\nexport default function ModelFiltersWrapper(props) {\n  return (\n    <Provider store={store}>\n      <ModelFiltersProvider {...props} />\n    </Provider>\n  );\n}\n","export const showPromotionalToggle = ({ showPromotion, controller, action, value, hasAnyOption }) => {\n  return (\n    showPromotion &&\n    controller === 'specials' &&\n    action !== 'promotional_collection' &&\n    hasAnyOption('promotion_name', value)\n  );\n};\n\nexport const filterOptions = (controller, action) => {\n  let options = [];\n\n  if (controller === 'specials') {\n    if (action === 'short_term') {\n      options = [\n        { name: 'Price lowest first', value: '', default: true },\n        { name: 'Price highest first', value: 'price|desc' },\n        { name: 'Recently added', value: 'created_at|asc' },\n        { name: 'Recommended', value: 'position|asc' },\n      ];\n    } else {\n      options = [\n        { name: 'Price lowest first', value: 'price|asc' },\n        { name: 'Price highest first', value: 'price|desc' },\n        { name: 'Recently added', value: 'created_at|asc' },\n        { name: 'Recommended', value: '', default: true },\n      ];\n    }\n  } else if (controller === 'vehicles') {\n    options = [\n      { name: 'Price lowest first', value: '', default: true },\n      { name: 'Price highest first', value: 'price|desc' },\n      { name: 'Recently added', value: 'recently_added|asc' },\n      { name: 'Newest', value: 'model_year|asc' },\n      { name: 'Oldest', value: 'model_year|desc' },\n    ];\n  } else {\n    options = [\n      { name: 'Price lowest first', value: ``, default: true },\n      { name: 'Price highest first', value: `price|desc` },\n      { name: 'Newest', value: 'created_at|asc' },\n      { name: 'Oldest', value: 'created_at|desc' },\n    ];\n  }\n\n  return options;\n};\n","import React from 'react';\nimport PropTypes from 'prop-types';\n\nimport FilterDrawerItem from '../../ui/FilterDrawerItem';\nimport { elasticSearchFilterOptionPropTypes, elasticSearchPropsPropTypes } from '../../../propTypes/elasticSearch';\n\nconst Seats = ({ name, options, isDesktop, elasticSearchProps }) => {\n  return (\n    <FilterDrawerItem\n      title=\"No of seats\"\n      name={name}\n      options={options}\n      elasticSearchProps={elasticSearchProps}\n      isDesktop={isDesktop}\n    />\n  );\n};\n\nSeats.propTypes = {\n  name: PropTypes.string.isRequired,\n  options: PropTypes.arrayOf(elasticSearchFilterOptionPropTypes),\n  isDesktop: PropTypes.bool,\n  elasticSearchProps: elasticSearchPropsPropTypes.isRequired,\n};\n\nSeats.defaultProps = {\n  options: [],\n  isDesktop: false,\n};\n\nexport default Seats;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { useElasticSearch } from './ElasticSearch';\n\nimport ToggleCheckbox from '../ui/ToggleCheckbox';\n\nconst QuickDeliveryToggle = ({ isDesktopVersion }) => {\n  const elasticSearch = useElasticSearch();\n\n  return (\n    <div style={{ flexShrink: 0, marginTop: '3px' }}>\n      <ToggleCheckbox\n        name=\"quick_delivery\"\n        value=\"true\"\n        label=\"Quick delivery\"\n        labelPosition=\"left\"\n        isDesktopVersion={isDesktopVersion}\n        defaultChecked={\n          !!elasticSearch.props.selectedFilters && elasticSearch.props.selectedFilters.quickDelivery === 'true'\n        }\n        setSingleCheckboxFilter={elasticSearch.props.setSingleCheckboxFilter}\n        selectedFilters={elasticSearch.props.selectedFilters}\n      />\n    </div>\n  );\n};\n\nQuickDeliveryToggle.propTypes = {\n  isDesktopVersion: PropTypes.bool.isRequired,\n};\n\nexport default QuickDeliveryToggle;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { useElasticSearch } from './ElasticSearch';\nimport ToggleCheckbox from '../ui/ToggleCheckbox';\n\nconst PromotionalToggle = ({ isDesktopVersion, value }) => {\n  const elasticSearch = useElasticSearch();\n  const lowerCaseValue = value.toLowerCase();\n\n  return (\n    <div style={{ flexShrink: 0, marginTop: '3px' }}>\n      <ToggleCheckbox\n        name=\"promotion_name\"\n        value={lowerCaseValue}\n        greenToggle\n        isDesktopVersion={isDesktopVersion}\n        label=\"EV miles offer\"\n        labelPosition=\"left\"\n        defaultChecked={\n          !!elasticSearch.props.selectedFilter &&\n          elasticSearch.props.selectedFilters.promotion_name.includes(lowerCaseValue)\n        }\n        selectedFilters={elasticSearch.props.selectedFilters}\n        setSingleCheckboxFilter={elasticSearch.props.setSingleCheckboxFilter}\n      />\n    </div>\n  );\n};\n\nPromotionalToggle.propTypes = {\n  isDesktopVersion: PropTypes.bool.isRequired,\n  value: PropTypes.string.isRequired,\n};\n\nexport default PromotionalToggle;\n","import React, { memo } from 'react';\nimport PropTypes from 'prop-types';\n\nimport ElectricPills from './ElectricPills';\nimport MakePills from './MakePills';\nimport FuelTypePills from './FuelTypePills';\nimport BudgetPills from './BudgetPills';\nimport BodyTypePills from './BodyTypePills';\nimport TransmissionPills from './TransmissionPills';\nimport SeatsPills from './SeatsPills';\nimport TermPills from './TermPills';\nimport MileagePills from './MileagePills';\nimport InitialPaymentPills from './InitialPaymentPills';\nimport EstimatedDeliveryPills from './EstimatedDeliveryPills';\nimport InStockPills from './InStockPills';\nimport PromotionalPills from './PromotionalPills';\nimport FunderPills from './FunderPills';\nimport RangePills from './RangePills';\nimport PayloadPills from './PayloadPills';\nimport LoadLengthPills from './LoadLengthPills';\n\nconst Pills = memo(({ selectedFilters, labelMapping }) => {\n  return (\n    <>\n      <EstimatedDeliveryPills selectedFilters={selectedFilters} />\n      <InStockPills selectedFilters={selectedFilters} />\n      <PromotionalPills selectedFilters={selectedFilters} />\n      <InitialPaymentPills selectedFilters={selectedFilters} />\n      <ElectricPills selectedFilters={selectedFilters} />\n      <FuelTypePills selectedFilters={selectedFilters} />\n      <MakePills selectedFilters={selectedFilters} />\n      <RangePills selectedFilters={selectedFilters} />\n      <PayloadPills selectedFilters={selectedFilters} />\n      <LoadLengthPills selectedFilters={selectedFilters} />\n      <BudgetPills selectedFilters={selectedFilters} labelMapping={labelMapping} />\n      <BodyTypePills selectedFilters={selectedFilters} />\n      <TransmissionPills selectedFilters={selectedFilters} />\n      <SeatsPills selectedFilters={selectedFilters} />\n      <TermPills selectedFilters={selectedFilters} />\n      <MileagePills selectedFilters={selectedFilters} />\n      <FunderPills selectedFilters={selectedFilters} />\n    </>\n  );\n});\n\nPills.propTypes = {\n  selectedFilters: PropTypes.shape({}).isRequired,\n  labelMapping: PropTypes.shape({}).isRequired,\n};\n\nexport default Pills;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { useElasticSearch } from './ElasticSearch';\n\nimport ToggleCheckbox from '../ui/ToggleCheckbox';\n\nconst InStockToggle = ({ isDesktopVersion }) => {\n  const elasticSearch = useElasticSearch();\n\n  return (\n    <div style={{ width: '200px', flexShrink: 0, marginTop: '3px' }}>\n      <ToggleCheckbox\n        name=\"stock\"\n        value=\"true\"\n        label=\"Hide reserved\"\n        labelPosition=\"left\"\n        isDesktopVersion={isDesktopVersion}\n        defaultChecked={!!elasticSearch.props.selectedFilters && elasticSearch.props.selectedFilters.stock === 'true'}\n        setSingleCheckboxFilter={elasticSearch.props.setSingleCheckboxFilter}\n        selectedFilters={elasticSearch.props.selectedFilters}\n      />\n    </div>\n  );\n};\n\nInStockToggle.propTypes = {\n  isDesktopVersion: PropTypes.bool.isRequired,\n};\n\nexport default InStockToggle;\n","import React, { useEffect, useCallback } from 'react';\nimport PropTypes from 'prop-types';\nimport { useDispatch, useSelector } from 'react-redux';\nimport classNames from 'classnames';\n\nimport BudgetFilters from './BudgetFilters';\nimport BodyTypeFilters from './BodyTypeFilters';\n\nconst CategoryFilters = ({ isDesktop, categoryType, isVans, controller }) => {\n  const { isOpen, isFixed } = useSelector((state) => state.filterControls);\n\n  const dispatch = useDispatch();\n\n  useEffect(() => {\n    dispatch({ type: 'SET_OPEN', payload: true });\n    dispatch({ type: 'SET_IS_VANS', payload: isVans });\n    dispatch({ type: 'SET_CONTROLLER', payload: controller });\n  }, [dispatch, isVans, controller]);\n\n  const handleVisible = useCallback(() => {\n    const filtersRect = document.querySelector('.drv-filter-desktop').getBoundingClientRect();\n    const isAtTop = filtersRect.top <= 48;\n    const isWideScreen = window.innerWidth > 1500;\n\n    // If the state of isFixed needs to change, update it\n    if (isFixed !== isAtTop) {\n      dispatch({ type: 'SET_FIXED', payload: isAtTop });\n\n      // When isFixed changes to true, or when scrolling up past the sticky point\n      if ((isAtTop && !isOpen) || !isAtTop) {\n        dispatch({ type: 'SET_OPEN', payload: true });\n      }\n    }\n\n    // Ensure search bar layering is correct\n    const search = document.querySelector('.g-search');\n    search.style.zIndex = filtersRect.top <= 49 && isWideScreen ? '1' : '4';\n  }, [dispatch, isFixed, isOpen]);\n\n  useEffect(() => {\n    if (isDesktop) {\n      document.addEventListener('scroll', handleVisible);\n      document.addEventListener('resize', handleVisible);\n      return () => {\n        document.removeEventListener('scroll', handleVisible);\n        document.removeEventListener('resize', handleVisible);\n      };\n    }\n  }, [isDesktop, handleVisible]);\n\n  useEffect(() => {\n    if (isDesktop) {\n      const filtersWrapper = document.querySelector('.drv-filter-desktop');\n      if (isOpen) {\n        filtersWrapper.classList.add('drv-filter-desktop--open');\n        filtersWrapper.classList.remove('drv-filter-desktop--hidden');\n      } else {\n        filtersWrapper.classList.remove('drv-filter-desktop--open');\n        filtersWrapper.classList.add('drv-filter-desktop--hidden');\n      }\n    }\n  }, [isOpen, isDesktop]);\n\n  return (\n    <div className={`${isDesktop ? 'drv-desktop-filter-group' : ''}`}>\n      <ul\n        className={classNames([\n          isDesktop ? 'drv-desktop-filters' : 'drv-mobile-filters',\n          !isOpen && isDesktop && isFixed ? 'drv-desktop-filters--closed' : '',\n          categoryType === 'BodytypeCategory' ? 'drv-desktop-filters--bodytype' : '',\n        ])}\n      >\n        {(function () {\n          switch (categoryType) {\n            case 'BudgetCategory':\n              return <BudgetFilters isDesktop={isDesktop} />;\n            case 'BodytypeCategory':\n              return <BodyTypeFilters isDesktop={isDesktop} />;\n            default:\n          }\n        })()}\n      </ul>\n    </div>\n  );\n};\n\nCategoryFilters.propTypes = {\n  isDesktop: PropTypes.bool,\n  categoryType: PropTypes.string,\n  isVans: PropTypes.bool,\n  controller: PropTypes.string,\n};\n\nCategoryFilters.defaultProps = {\n  isDesktop: false,\n  categoryType: '',\n  isVans: false,\n  controller: '',\n};\n\nexport default CategoryFilters;\n","import React, { useEffect, useState, useRef } from 'react';\nimport PropTypes from 'prop-types';\nimport { useDispatch } from 'react-redux';\nimport classnames from 'classnames';\nimport { ScrollSnapSlider } from 'scroll-snap-slider';\n\nimport { useElasticSearch } from './ElasticSearch';\nimport { getQueryStringParameters } from '../../utils';\nimport ArrowLeftIcon from '../../../assets/images/arrow-left-white.svg';\nimport ArrowRightIcon from '../../../assets/images/arrow-right-white.svg';\n\nconst VanBodytypeFilter = ({ isDesktop }) => {\n  const dispatch = useDispatch();\n  const sliderRef = useRef();\n  const [selectedSlide, setSelectedSlide] = useState();\n  const options = [\n    { label: 'All vans', value: '', category: '' },\n    { label: 'Small', value: 'Small Van', category: 'bodytype_categories[]' },\n    { label: 'Medium', value: 'Medium Van', category: 'bodytype_categories[]' },\n    { label: 'Large', value: 'Large Van', category: 'bodytype_categories[]' },\n    { label: 'Pickup', value: 'Pickup', category: 'bodytype_categories[]' },\n    {\n      label: 'Conversions',\n      value: 'Conversions',\n      category: 'bodytype_categories[]',\n    },\n    { label: 'Electric', value: 'true', category: 'hybrid_or_electric' },\n  ];\n\n  const elasticSearch = useElasticSearch();\n\n  // Navigate to selected slide if filter is selected on page load\n  useEffect(() => {\n    const params = getQueryStringParameters();\n    const match =\n      params &&\n      Object.fromEntries(\n        Object.entries(params).filter(\n          ([key]) => key.includes('hybrid_or_electric') || key.includes('bodytype_categories[]'),\n        ),\n      );\n    const value =\n      Object.keys(match).length !== 0 && options.map((option) => option.value).indexOf(Object.entries(match)[0][1]);\n    setSelectedSlide(value);\n  }, []);\n\n  const handleSelect = (event) => {\n    switch (event.target.name) {\n      case '':\n        dispatch({ type: 'RESET_FILTERS' });\n        break;\n      case 'hybrid_or_electric':\n        dispatch({ type: 'SET_ELECTRIC' });\n        break;\n      default:\n        elasticSearch.props.setSelectedBodytype(event);\n        break;\n    }\n\n    const form = event.target.closest('form');\n\n    setTimeout(() => {\n      form.dispatchEvent(new Event('submit', { bubbles: true, cancelable: true }));\n    }, 100);\n  };\n\n  useEffect(() => {\n    const slider = new ScrollSnapSlider(sliderRef.current);\n\n    const prev = document.querySelector('.drv-filter-van-bodytypes .indicators .arrow.prev');\n    const next = document.querySelector('.drv-filter-van-bodytypes .indicators .arrow.next');\n\n    const updateArrows = function () {\n      prev.classList.toggle('disabled', sliderRef.current.scrollLeft === 0);\n      next.classList.toggle(\n        'disabled',\n        sliderRef.current.scrollLeft + sliderRef.current.offsetWidth === sliderRef.current.scrollWidth,\n      );\n    };\n\n    prev.addEventListener('click', () => {\n      slider.slideTo(slider.slide - 1);\n    });\n\n    next.addEventListener('click', () => {\n      slider.slideTo(slider.slide + 1);\n    });\n\n    slider.addEventListener('slide-pass', updateArrows);\n    slider.addEventListener('slide-stop', updateArrows);\n\n    if (selectedSlide) slider.slideTo(selectedSlide);\n  }, [sliderRef, selectedSlide]);\n\n  return (\n    <div\n      className={classnames('drv-filter-van-bodytypes', {\n        'drv-filter-van-bodytypes__mobile': !isDesktop,\n        'drv-filter-van-bodytypes__desktop': isDesktop,\n      })}\n    >\n      <div className=\"drv-filter-van-bodytypes__title\">Choose your body type</div>\n      <div className=\"indicators prev\">\n        <button type=\"button\" className=\"arrow prev disabled\">\n          <img src={ArrowLeftIcon} alt=\"\" srcSet=\"\" />\n        </button>\n      </div>\n      <div ref={sliderRef} className=\"scroll-snap-slider bodytype-slider\">\n        {options.map(({ value, label, category }, index) => {\n          const selected = elasticSearch.props.selectedFilters[category]?.includes(value);\n          const allSelected =\n            !elasticSearch.props.selectedFilters['bodytype_categories[]'] &&\n            !elasticSearch.props.selectedFilters.hybrid_or_electric;\n          const isAll = category === '';\n          const isElectric = category === 'hybrid_or_electric';\n\n          return (\n            <label\n              key={value}\n              htmlFor={`${category}-${label}`}\n              className={classnames(\n                `scroll-snap-slide drv-filter-van-bodytypes__button drv-filter-van-bodytypes__button--${\n                  label === 'All vans' ? 'all' : label.toLowerCase()\n                }`,\n                {\n                  'drv-filter-van-bodytypes__button--selected': selected || (isAll && allSelected),\n                  'drv-filter-van-bodytypes__button--electric': isElectric,\n                },\n              )}\n            >\n              <input\n                type=\"checkbox\"\n                name={category}\n                id={`${category}-${label}`}\n                data-index={index}\n                data-action=\"click->ga#push\"\n                data-ga-parent-title=\"Body Type\"\n                data-ga-event-action=\"selectedFilter\"\n                data-ga-filter-option={label}\n                value={value}\n                checked={isAll ? allSelected : selected}\n                onChange={(event) => handleSelect(event)}\n              />\n              <div className=\"icon\" />\n              {label}\n            </label>\n          );\n        })}\n      </div>\n      <div className=\"indicators next\">\n        <button type=\"button\" className=\"arrow next\">\n          <img src={ArrowRightIcon} alt=\"\" srcSet=\"\" />\n        </button>\n      </div>\n    </div>\n  );\n};\n\nVanBodytypeFilter.propTypes = {\n  isDesktop: PropTypes.bool.isRequired,\n};\n\nexport default VanBodytypeFilter;\n","import React, { useEffect, useCallback } from 'react';\nimport PropTypes from 'prop-types';\nimport { useDispatch, useSelector } from 'react-redux';\nimport classNames from 'classnames';\n\nimport AllSpecialOffersFilters from './AllSpecialOffersFilters';\nimport ShortTermSpecialOffersFilters from './ShortTermSpecialOffersFilters';\nimport ElectricSpecialOffersFilters from './ElectricSpecialOffersFilters';\nimport StockOffersFilters from './StockOffersFilters';\nimport VanSpecialOffersFilters from './VanSpecialOffersFilters';\n\nconst SpecialOffersFilters = ({ isDesktop, action, isVans, controller }) => {\n  const { isOpen, isFixed } = useSelector((state) => state.filterControls);\n\n  const dispatch = useDispatch();\n\n  useEffect(() => {\n    dispatch({ type: 'SET_IS_VANS', payload: isVans });\n    dispatch({ type: 'SET_CONTROLLER', payload: controller });\n  }, [dispatch, isVans, controller]);\n\n  const handleVisible = useCallback(() => {\n    const filtersRect = document.querySelector('.drv-filter-desktop').getBoundingClientRect();\n    const isAtTop = filtersRect.top <= 48;\n    const isWideScreen = window.innerWidth > 1500;\n\n    // Update isFixed only if its state needs to change\n    if (isFixed !== isAtTop) {\n      dispatch({ type: 'SET_FIXED', payload: isAtTop });\n    }\n\n    // Handle isOpen state\n    if (isAtTop) {\n      // Dispatch SET_OPEN only when transitioning from not fixed to fixed\n      if (!isFixed && isOpen) {\n        dispatch({ type: 'SET_OPEN', payload: false });\n      }\n    } else if (isOpen) {\n      // Reset isOpen to false when scrolling back up past the sticky point\n      // and only if isOpen is currently true\n      dispatch({ type: 'SET_OPEN', payload: false });\n    }\n\n    // Ensure search bar layering is correct\n    const search = document.querySelector('.g-search');\n    search.style.zIndex = filtersRect.top <= 49 && isWideScreen ? '1' : '4';\n  }, [dispatch, isFixed, isOpen]);\n\n  useEffect(() => {\n    if (isDesktop) {\n      document.addEventListener('scroll', handleVisible);\n      document.addEventListener('resize', handleVisible);\n      return () => {\n        document.removeEventListener('scroll', handleVisible);\n        document.removeEventListener('resize', handleVisible);\n      };\n    }\n  }, [isDesktop, handleVisible, isOpen]);\n\n  useEffect(() => {\n    if (isDesktop) {\n      const filtersWrapper = document.querySelector('.drv-filter-desktop');\n      if (filtersWrapper) {\n        if (isOpen) {\n          filtersWrapper.classList.add('drv-filter-desktop--open');\n        } else {\n          filtersWrapper.classList.remove('drv-filter-desktop--open');\n        }\n      }\n    }\n  }, [isOpen, isDesktop]);\n\n  return (\n    <div className={`${isDesktop ? 'drv-desktop-filter-group' : ''}`}>\n      <ul\n        className={classNames([\n          isDesktop ? 'drv-desktop-filters' : 'drv-mobile-filters',\n          !isOpen && isDesktop && isFixed ? 'drv-desktop-filters--condensed' : '',\n        ])}\n      >\n        {(() => {\n          switch (action) {\n            case 'all':\n            case 'used':\n            case 'promotional_collection':\n              return <AllSpecialOffersFilters isDesktop={isDesktop} />;\n            case 'short_term':\n            case 'subscription':\n              return <ShortTermSpecialOffersFilters isDesktop={isDesktop} />;\n            case 'electric':\n              return <ElectricSpecialOffersFilters isDesktop={isDesktop} />;\n            case 'vans':\n              return <VanSpecialOffersFilters isDesktop={isDesktop} />;\n            case 'stock':\n              return <StockOffersFilters isDesktop={isDesktop} />;\n            default:\n          }\n        })()}\n      </ul>\n    </div>\n  );\n};\n\nSpecialOffersFilters.propTypes = {\n  isDesktop: PropTypes.bool.isRequired,\n  action: PropTypes.string.isRequired,\n  isVans: PropTypes.bool,\n  controller: PropTypes.string,\n};\n\nSpecialOffersFilters.defaultProps = {\n  isVans: false,\n  controller: '',\n};\n\nexport default SpecialOffersFilters;\n","import React, { useState, useEffect } from 'react';\nimport PropTypes from 'prop-types';\nimport { getQueryStringParameters } from '../../utils';\n\nconst DerivativeOptions = ({ dataGroups }) => {\n  const [selected, setSelected] = useState(getQueryStringParameters());\n  const [data, setData] = useState({});\n  // const [state, setState] = useState({\n  //   selected: getQueryStringParameters(),\n  //   data: {},\n  // });\n\n  const dependentFields = {\n    // the value fields will be unselected when you select the key field\n    'search[make]': ['search[model_range]', 'search[model]', 'search[trim]'],\n  };\n\n  const alwaysEnabledFilters = {\n    // you can force filters to never have their options disabled\n    // e.g.\n    // 'make': true,\n  };\n\n  const unselectWhenSelected = (selectedField, state) => {\n    const selectedFieldName = selectedField.name;\n    const unselectFields = dependentFields[selectedFieldName];\n\n    if (unselectFields) {\n      const form = selectedField.closest('form');\n      unselectFields.forEach((fieldName) => {\n        if (form[fieldName]) form[fieldName].value = '';\n        delete state.selected[fieldName];\n      });\n    }\n  };\n\n  const isOptionDisabled = (filterName, option, activeData) => {\n    const isAlwaysEnabled = alwaysEnabledFilters[filterName];\n    if (typeof isAlwaysEnabled !== 'undefined') return !isAlwaysEnabled;\n\n    const activeOptions = activeData[filterName];\n    return activeOptions && activeOptions.length > 0 && activeOptions.indexOf(option) === -1;\n  };\n\n  const getDataFromJSON = (json) => {\n    const getKeys = (groupName) => {\n      if (!json[groupName]) return null;\n      return json[groupName].buckets.map(({ key, key_as_string }) => key_as_string || key);\n    };\n\n    // convert the array of dataGroups into an object including each group's filter values\n    return dataGroups.reduce((object, { key: value }) => ({ ...object, [value]: getKeys(value) }), {});\n  };\n\n  const UpdateData = (json) => {\n    setData(getDataFromJSON(json));\n  };\n\n  const SelectFilter = (event) => {\n    const updatedState = { ...{ selected, data } };\n\n    // select this field\n    updatedState.selected[event.target.name] = event.target.value;\n\n    // some fields might need to be unselected when this field is selected\n    unselectWhenSelected(event.target, updatedState);\n\n    event.target.closest('form').dispatchEvent(new Event('submit', { bubbles: true }));\n\n    setData(updatedState.data);\n    setSelected(updatedState.selected);\n  };\n\n  const onUpdateDataEvent = (event) => {\n    UpdateData(event.detail);\n  };\n\n  useEffect(() => {\n    // always get the filterable values from the page on load\n    UpdateData(window.derivativeJSON);\n\n    // listen out for more filterable values being sent back from Ajax responses after filtering\n    document.addEventListener('derivatives#update-data', onUpdateDataEvent);\n\n    // unbind the event listener when this component unmounts\n    return () => document.removeEventListener('derivatives#update-data', onUpdateDataEvent);\n  }, []);\n\n  return (\n    <>\n      {dataGroups.map(({ key: dataGroup, name }) => {\n        const options = data && data[dataGroup] ? data[dataGroup] : [];\n        if (options.length === 0) return null;\n\n        return (\n          <div className=\"form-group select optional\" key={dataGroup}>\n            <label className=\"select optional\" htmlFor={`search[${dataGroup}]`}>\n              {name}\n            </label>\n            <select\n              className=\"form-control select optional\"\n              name={`search[${dataGroup}]`}\n              id={`search[${dataGroup}]`}\n              onChange={SelectFilter}\n              value={selected[`search[${dataGroup}]`]}\n            >\n              <option value=\"\" />\n              {options.map((item) => (\n                <option disabled={isOptionDisabled(dataGroup, item, data)} key={item} value={item}>\n                  {{\n                    true: 'Yes',\n                    false: 'No',\n                  }[item] || item}\n                </option>\n              ))}\n            </select>\n          </div>\n        );\n      })}\n    </>\n  );\n};\n\nDerivativeOptions.propTypes = {\n  dataGroups: PropTypes.arrayOf(\n    PropTypes.shape({\n      key: PropTypes.string,\n      name: PropTypes.string,\n    }),\n  ).isRequired,\n};\n\nexport default DerivativeOptions;\n","/* eslint-disable react/forbid-prop-types */\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport classNames from 'classnames';\n\nconst StepComponent = ({\n  stepData,\n  onAnswer,\n  onNext,\n  onPrevious,\n  stepNumber,\n  currentValue,\n  steps,\n  currentStep,\n  errorMessage,\n}) => {\n  return (\n    <div className=\"c-survey-modern\">\n      <div className=\"c-survey-modern__background\">\n        <picture className=\"responsive-background\">\n          <source media=\"(min-width: 992px)\" srcSet={stepData.image} />\n          <source media=\"(max-width: 991px)\" srcSet={stepData.mobileImage} />\n          <img src={stepData.image} alt=\"Background\" className=\"responsive-background__image\" />\n        </picture>\n      </div>\n      <div className=\"c-survey-modern__content\">\n        <div className=\"c-survey-modern__inner-wrapper\">\n          <div className=\"c-survey-modern__progress-wrapper\">\n            <div className=\"c-progress-steps-modern\">\n              {steps.map((step, index) => (\n                <>\n                  <div\n                    key={step.name}\n                    className={classNames(\n                      'c-progress-steps-modern__step',\n                      index === currentStep && 'c-progress-steps-modern__step--active',\n                    )}\n                  >\n                    <div className=\"c-progress-steps-modern__circle\">\n                      <i className=\"c-progress-steps-modern__icon\">\n                        <img src={step.icon} alt={step.title} />\n                      </i>\n                    </div>\n                  </div>\n                  {index !== steps.length - 1 && <div className=\"c-progress-steps-modern__line\" />}\n                </>\n              ))}\n            </div>\n          </div>\n          <span className=\"c-survey-modern__step\">Step {stepNumber + 1} / 6</span>\n          <h4 className=\"c-survey-modern__heading\">{stepData.title}</h4>\n          <p className=\"c-survey-modern__question\">{stepData.question}</p>\n          {stepData.description && <p className=\"c-survey-modern__description\">{stepData.description}</p>}\n          <div\n            className={classNames({\n              'c-survey-modern__options': true,\n              'c-survey-modern__options--2-cols': stepData.columns === 2,\n              'c-survey-modern__options--3-cols': stepData.columns === 3,\n            })}\n          >\n            {stepData.options.map((option) => (\n              <div className=\"c-radio-as-button\" key={option.value}>\n                <input\n                  type=\"radio\"\n                  className=\"c-radio-as-button__input\"\n                  id={option.value}\n                  value={option.value}\n                  name={stepData.name}\n                  checked={option.value === currentValue}\n                  onChange={(e) => onAnswer(stepData.name, e.target.value, option.score)}\n                />\n                <label className=\"c-radio-as-button__label\" htmlFor={option.value}>\n                  <span>{option.label}</span>\n                  {option.description && <small>{option.description}</small>}\n                </label>\n              </div>\n            ))}\n          </div>\n          <div className=\"c-survey-modern__actions\">\n            <button className=\"c-survey-modern__prev-button\" onClick={() => onPrevious()}>\n              Previous step\n            </button>\n            <span>or</span>\n            <button className=\"c-survey-modern__next-button\" onClick={() => onNext()}>\n              Next step\n            </button>\n            {errorMessage && <div className=\"c-survey-modern__error\">{errorMessage}</div>}\n          </div>\n        </div>\n      </div>\n    </div>\n  );\n};\n\nStepComponent.propTypes = {\n  stepData: PropTypes.shape({\n    image: PropTypes.string.isRequired,\n    mobileImage: PropTypes.string.isRequired,\n    title: PropTypes.string.isRequired,\n    question: PropTypes.string.isRequired,\n    description: PropTypes.string,\n    columns: PropTypes.number.isRequired,\n    options: PropTypes.arrayOf(\n      PropTypes.shape({\n        label: PropTypes.string.isRequired,\n        value: PropTypes.string.isRequired,\n        description: PropTypes.string,\n      }),\n    ).isRequired,\n    name: PropTypes.string.isRequired,\n  }).isRequired,\n  onAnswer: PropTypes.func.isRequired,\n  onNext: PropTypes.func.isRequired,\n  onPrevious: PropTypes.func.isRequired,\n  stepNumber: PropTypes.number.isRequired,\n  currentValue: PropTypes.string,\n  steps: PropTypes.array.isRequired,\n  currentStep: PropTypes.string.isRequired,\n  errorMessage: PropTypes.string,\n};\n\nStepComponent.defaultProps = {\n  currentValue: '',\n  errorMessage: '',\n};\n\nexport default StepComponent;\n","/* eslint-disable react/forbid-prop-types */\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport classNames from 'classnames';\nimport { pushData } from '../../ga/eligibility-checker-ga-data';\n\nconst FinalScreen = ({ image, mobileImage, title, description, score }) => {\n  return (\n    <div className=\"c-survey-modern\">\n      <div className=\"c-survey-modern__background c-survey-modern__background--final\">\n        <picture className=\"responsive-background\">\n          <source media=\"(min-width: 992px)\" srcSet={image} />\n          <source media=\"(max-width: 991px)\" srcSet={mobileImage} />\n          <img src={image} alt=\"Background\" className=\"responsive-background__image\" />\n        </picture>\n      </div>\n      <div className=\"c-survey-modern__content c-survey-modern__content--final\">\n        <div className=\"c-survey-modern__inner-wrapper\">\n          <h4\n            className={classNames(\n              'c-survey-modern__heading c-survey-modern__heading--large',\n              score === 1 && 'c-survey-modern__heading--green',\n            )}\n          >\n            {title}\n          </h4>\n          <p className=\"c-survey-modern__final-description\">{description}</p>\n          <div>\n            <a\n              href=\"/special-offers\"\n              className=\"c-survey-modern__deals-link\"\n              onClick={() => {\n                pushData({\n                  step: 6,\n                  stepName: 'result',\n                  action: 'viewed_lease_deals',\n                });\n              }}\n            >\n              View lease deals\n            </a>\n          </div>\n        </div>\n      </div>\n    </div>\n  );\n};\n\nexport default FinalScreen;\n\nFinalScreen.propTypes = {\n  title: PropTypes.string.isRequired,\n  description: PropTypes.string.isRequired,\n  image: PropTypes.string.isRequired,\n  mobileImage: PropTypes.string.isRequired,\n  score: PropTypes.number.isRequired,\n};\n","import React, { useEffect } from 'react';\nimport PropTypes from 'prop-types';\nimport { useDispatch } from 'react-redux';\n\nimport FilterList from '../ui/FilterList';\nimport ContractLength from './SpecialOffersFilters/ContractLength';\nimport AnnualMileage from './SpecialOffersFilters/AnnualMileage';\nimport InitialPayment from './SpecialOffersFilters/InitialPayment';\nimport Budget from './SpecialOffersFilters/Budget';\n\nimport Manufacturer from './SpecialOffersFilters/Manufacturer';\nimport Model from './SpecialOffersFilters/Model';\nimport BodyType from './SpecialOffersFilters/BodyType';\nimport FuelType from './SpecialOffersFilters/FuelType';\nimport Transmission from './SpecialOffersFilters/Transmission';\nimport Seats from './SpecialOffersFilters/Seats';\nimport { useElasticSearch } from './ElasticSearch';\n\nconst AllSpecialOffersFilters = ({ isDesktop }) => {\n  const elasticSearch = useElasticSearch();\n\n  const dispatch = useDispatch();\n\n  useEffect(() => {\n    dispatch({ type: 'SET_THEME', payload: '' });\n  }, []);\n\n  return (\n    <>\n      <FilterList heading=\"Vehicle options\" isDesktop={isDesktop}>\n        <FuelType\n          name=\"display_fueltype[]\"\n          options={elasticSearch.allFiltersFor('display_fueltype')}\n          elasticSearchProps={elasticSearch.props}\n          isDesktop={isDesktop}\n        />\n\n        <Manufacturer\n          name=\"make[]\"\n          options={elasticSearch.allFiltersFor('make')}\n          elasticSearchProps={elasticSearch.props}\n          isDesktop={isDesktop}\n        />\n\n        <Model\n          name=\"make_model_range[]\"\n          options={elasticSearch.availableFiltersFor('make_model_range')}\n          elasticSearchProps={elasticSearch.props}\n          isDesktop={isDesktop}\n        />\n\n        <BodyType\n          name=\"bodytype_categories[]\"\n          options={elasticSearch.allFiltersFor('bodytype_categories')}\n          elasticSearchProps={elasticSearch.props}\n          isDesktop={isDesktop}\n        />\n\n        <Transmission\n          name=\"transmission\"\n          options={elasticSearch.allFiltersFor('transmission')}\n          elasticSearchProps={elasticSearch.props}\n          isDesktop={isDesktop}\n        />\n\n        <Seats\n          name=\"vehicle_seating_capacity[]\"\n          options={elasticSearch.allFiltersFor('vehicle_seating_capacity')}\n          elasticSearchProps={elasticSearch.props}\n          isDesktop={isDesktop}\n        />\n      </FilterList>\n\n      <FilterList heading=\"Leasing options\" isDesktop={isDesktop}>\n        <Budget\n          name=\"monthly_prices\"\n          options={elasticSearch.allFiltersFor('monthly_prices')}\n          elasticSearchProps={elasticSearch.props}\n          isDesktop={isDesktop}\n        />\n\n        <ContractLength\n          name=\"term\"\n          options={elasticSearch.allFiltersFor('term')}\n          elasticSearchProps={elasticSearch.props}\n          isDesktop={isDesktop}\n        />\n\n        <AnnualMileage\n          name=\"mileage\"\n          options={elasticSearch.allFiltersFor('mileage')}\n          elasticSearchProps={elasticSearch.props}\n          isDesktop={isDesktop}\n        />\n\n        <InitialPayment\n          name=\"initial_payment\"\n          options={elasticSearch.allFiltersFor('initial_payment')}\n          elasticSearchProps={elasticSearch.props}\n          isDesktop={isDesktop}\n        />\n      </FilterList>\n    </>\n  );\n};\n\nAllSpecialOffersFilters.propTypes = {\n  isDesktop: PropTypes.bool.isRequired,\n};\n\nexport default AllSpecialOffersFilters;\n","import React from 'react';\nimport PropTypes from 'prop-types';\n\nimport FilterList from '../ui/FilterList';\nimport Make from './SpecialOffersFilters/Manufacturer';\nimport Model from './SpecialOffersFilters/Model';\nimport Transmission from './SpecialOffersFilters/Transmission';\nimport FuelType from './SpecialOffersFilters/FuelType';\nimport { useElasticSearch } from './ElasticSearch';\n\nconst BodytypeFilters = ({ isDesktop }) => {\n  const elasticSearch = useElasticSearch();\n\n  return (\n    <FilterList heading=\"Choose vehicle details\" isDesktop={isDesktop}>\n      <FuelType\n        name=\"display_fueltype\"\n        options={elasticSearch.allFiltersFor('display_fueltype')}\n        elasticSearchProps={elasticSearch.props}\n        isDesktop={isDesktop}\n      />\n      <Make\n        name=\"make[]\"\n        options={elasticSearch.allFiltersFor('make')}\n        elasticSearchProps={elasticSearch.props}\n        isDesktop={isDesktop}\n      />\n      <Model\n        name=\"make_model_range[]\"\n        options={elasticSearch.availableFiltersFor('make_model_range')}\n        elasticSearchProps={elasticSearch.props}\n        isDesktop={isDesktop}\n      />\n      <Transmission\n        name=\"transmission\"\n        options={elasticSearch.allFiltersFor('transmission')}\n        elasticSearchProps={elasticSearch.props}\n        isDesktop={isDesktop}\n      />\n    </FilterList>\n  );\n};\n\nBodytypeFilters.propTypes = {\n  isDesktop: PropTypes.bool.isRequired,\n};\n\nexport default BodytypeFilters;\n","import React from 'react';\nimport PropTypes from 'prop-types';\n\nimport FilterList from '../ui/FilterList';\nimport Make from './SpecialOffersFilters/Manufacturer';\nimport Model from './SpecialOffersFilters/Model';\nimport Transmission from './SpecialOffersFilters/Transmission';\nimport FuelType from './SpecialOffersFilters/FuelType';\nimport BodyType from './SpecialOffersFilters/BodyType';\nimport { useElasticSearch } from './ElasticSearch';\n\nconst BudgetFilters = ({ isDesktop }) => {\n  const elasticSearch = useElasticSearch();\n\n  return (\n    <FilterList heading=\"Choose vehicle details\" isDesktop={isDesktop}>\n      <FuelType\n        name=\"display_fueltype\"\n        options={elasticSearch.allFiltersFor('display_fueltype')}\n        elasticSearchProps={elasticSearch.props}\n        isDesktop={isDesktop}\n      />\n      <Make\n        name=\"make[]\"\n        options={elasticSearch.allFiltersFor('make')}\n        elasticSearchProps={elasticSearch.props}\n        isDesktop={isDesktop}\n      />\n      <Model\n        name=\"make_model_range[]\"\n        options={elasticSearch.availableFiltersFor('make_model_range')}\n        elasticSearchProps={elasticSearch.props}\n        isDesktop={isDesktop}\n      />\n      <Transmission\n        name=\"transmission\"\n        options={elasticSearch.allFiltersFor('transmission')}\n        elasticSearchProps={elasticSearch.props}\n        isDesktop={isDesktop}\n      />\n      <BodyType\n        name=\"bodytype_categories[]\"\n        options={elasticSearch.allFiltersFor('bodytype_categories')}\n        elasticSearchProps={elasticSearch.props}\n        isDesktop={isDesktop}\n      />\n    </FilterList>\n  );\n};\n\nBudgetFilters.propTypes = {\n  isDesktop: PropTypes.bool.isRequired,\n};\n\nexport default BudgetFilters;\n","import React from 'react';\n\nimport FilterDrawerItem from '../ui/FilterDrawerItem';\nimport AnnualMileage from './SpecialOffersFilters/AnnualMileage';\nimport InitialPayment from './SpecialOffersFilters/InitialPayment';\nimport ContractLength from './SpecialOffersFilters/ContractLength';\n\nimport { useModelFilters } from './ModelFiltersContext';\n\nconst AllModelFilters = () => {\n  const modelFilters = useModelFilters();\n\n  return (\n    <ul className=\"drv-ui drv-model-filters drv-model-filters--desktop pt-0\">\n      <FilterDrawerItem\n        title=\"Trim level\"\n        name=\"trim\"\n        options={modelFilters.allFiltersFor('trim')}\n        elasticSearchProps={modelFilters.props}\n        isDesktop\n        noWrap\n      />\n\n      <FilterDrawerItem\n        title=\"Fuel type\"\n        name=\"display_fueltype\"\n        options={modelFilters.allFiltersFor('display_fueltype')}\n        elasticSearchProps={modelFilters.props}\n        isDesktop\n      />\n\n      <FilterDrawerItem\n        title=\"Gearbox\"\n        name=\"transmission\"\n        options={modelFilters.allFiltersFor('transmission')}\n        elasticSearchProps={modelFilters.props}\n        isDesktop\n      />\n\n      <InitialPayment\n        name=\"initial_payment\"\n        options={modelFilters.allFiltersFor('initial_payment')}\n        elasticSearchProps={modelFilters.props}\n        isDesktop\n      />\n\n      <AnnualMileage\n        name=\"mileage\"\n        options={modelFilters.allFiltersFor('mileage')}\n        elasticSearchProps={modelFilters.props}\n        isDesktop\n      />\n\n      <ContractLength\n        name=\"term\"\n        options={modelFilters.allFiltersFor('term')}\n        elasticSearchProps={modelFilters.props}\n        isDesktop\n      />\n    </ul>\n  );\n};\n\nexport default AllModelFilters;\n","import React, { useEffect } from 'react';\nimport PropTypes from 'prop-types';\nimport { useDispatch } from 'react-redux';\n\nimport FilterList from '../ui/FilterList';\nimport ContractLength from './SpecialOffersFilters/ContractLength';\nimport AnnualMileage from './SpecialOffersFilters/AnnualMileage';\nimport InitialPayment from './SpecialOffersFilters/InitialPayment';\nimport Budget from './SpecialOffersFilters/Budget';\n\nimport Manufacturer from './SpecialOffersFilters/Manufacturer';\nimport Model from './SpecialOffersFilters/Model';\nimport BodyType from './SpecialOffersFilters/BodyType';\nimport FuelType from './SpecialOffersFilters/FuelType';\nimport Range from './SpecialOffersFilters/Range';\nimport Seats from './SpecialOffersFilters/Seats';\nimport { useElasticSearch } from './ElasticSearch';\n\nconst ElectricSpecialOffersFilters = ({ isDesktop }) => {\n  const elasticSearch = useElasticSearch();\n\n  const dispatch = useDispatch();\n\n  useEffect(() => {\n    dispatch({ type: 'SET_THEME', payload: 'electric' });\n  }, []);\n\n  return (\n    <>\n      <FilterList heading=\"Vehicle options\" isDesktop={isDesktop}>\n        <FuelType\n          name=\"display_fueltype[]\"\n          options={elasticSearch.allFiltersFor('display_fueltype')}\n          elasticSearchProps={elasticSearch.props}\n          isDesktop={isDesktop}\n        />\n\n        <Manufacturer\n          name=\"make[]\"\n          options={elasticSearch.allFiltersFor('make')}\n          elasticSearchProps={elasticSearch.props}\n          isDesktop={isDesktop}\n        />\n\n        <Model\n          name=\"make_model_range[]\"\n          options={elasticSearch.availableFiltersFor('make_model_range')}\n          elasticSearchProps={elasticSearch.props}\n          isDesktop={isDesktop}\n        />\n\n        <BodyType\n          name=\"bodytype_categories[]\"\n          options={elasticSearch.allFiltersFor('bodytype_categories')}\n          elasticSearchProps={elasticSearch.props}\n          isDesktop={isDesktop}\n        />\n\n        <Range\n          name=\"range[]\"\n          options={elasticSearch.allFiltersFor('range')}\n          elasticSearchProps={elasticSearch.props}\n          isDesktop={isDesktop}\n        />\n\n        <Seats\n          name=\"vehicle_seating_capacity[]\"\n          options={elasticSearch.allFiltersFor('vehicle_seating_capacity')}\n          elasticSearchProps={elasticSearch.props}\n          isDesktop={isDesktop}\n        />\n      </FilterList>\n\n      <FilterList heading=\"Leasing options\" isDesktop={isDesktop}>\n        <Budget\n          name=\"monthly_prices\"\n          options={elasticSearch.allFiltersFor('monthly_prices')}\n          elasticSearchProps={elasticSearch.props}\n          isDesktop={isDesktop}\n        />\n\n        <ContractLength\n          name=\"term\"\n          options={elasticSearch.allFiltersFor('term')}\n          elasticSearchProps={elasticSearch.props}\n          isDesktop={isDesktop}\n        />\n\n        <InitialPayment\n          name=\"initial_payment\"\n          options={elasticSearch.allFiltersFor('initial_payment')}\n          elasticSearchProps={elasticSearch.props}\n          isDesktop={isDesktop}\n        />\n\n        <AnnualMileage\n          name=\"mileage\"\n          options={elasticSearch.allFiltersFor('mileage')}\n          elasticSearchProps={elasticSearch.props}\n          isDesktop={isDesktop}\n        />\n      </FilterList>\n    </>\n  );\n};\n\nElectricSpecialOffersFilters.propTypes = {\n  isDesktop: PropTypes.bool.isRequired,\n};\n\nexport default ElectricSpecialOffersFilters;\n","import React from 'react';\nimport PropTypes from 'prop-types';\n\nimport FilterDrawerItem from '../../ui/FilterDrawerItem';\nimport { elasticSearchFilterOptionPropTypes, elasticSearchPropsPropTypes } from '../../../propTypes/elasticSearch';\n\nconst Range = ({ name, options, isDesktop, elasticSearchProps }) => {\n  const optionsOrder = [\n    'Up to 100 miles',\n    '100-200 miles',\n    '200-300 miles',\n    '300-400 miles',\n    '400 miles and above',\n  ].reverse();\n\n  // .reverse() -> we want all of the options not in this list to be last, but the default with the below sort is that they're first.\n  // so we reverse both lists so that the missing options are last instead.\n\n  const sortedOptions = [...options]\n    .sort((a, b) => {\n      return optionsOrder.indexOf(a.value) - optionsOrder.indexOf(b.value);\n    })\n    .reverse();\n\n  return (\n    <FilterDrawerItem\n      title=\"Battery range\"\n      name={name}\n      options={sortedOptions}\n      elasticSearchProps={elasticSearchProps}\n      isDesktop={isDesktop}\n    />\n  );\n};\n\nRange.propTypes = {\n  name: PropTypes.string.isRequired,\n  options: PropTypes.arrayOf(elasticSearchFilterOptionPropTypes),\n  isDesktop: PropTypes.bool,\n  elasticSearchProps: elasticSearchPropsPropTypes.isRequired,\n};\n\nRange.defaultProps = {\n  options: [],\n  isDesktop: false,\n};\n\nexport default Range;\n","import React from 'react';\nimport { useElasticSearch } from './ElasticSearch';\nimport FilterDrawerItem from '../ui/FilterDrawerItem';\n\nconst EstimatedDeliveryDropdown = () => {\n  const elasticSearch = useElasticSearch();\n\n  return (\n    <div style={{ width: '244px', flexShrink: 0 }}>\n      <FilterDrawerItem\n        title=\"Estimated delivery\"\n        allText=\"Anytime\"\n        name=\"estimated_delivery\"\n        options={elasticSearch.allFiltersFor('estimated_delivery')}\n        elasticSearchProps={elasticSearch.props}\n        isDesktop\n      />\n    </div>\n  );\n};\n\nexport default EstimatedDeliveryDropdown;\n","import React, { useEffect, useState, useRef } from 'react';\nimport PropTypes from 'prop-types';\nimport classnames from 'classnames';\nimport { useDispatch, useSelector } from 'react-redux';\nimport { ScrollSnapSlider } from '../scrollSnapSlider';\n\nimport Pills from './SpecialOffersFilters/filterPills/Pills';\nimport { shouldShowFeature } from '../../splitTesting';\nimport { showPromotionalToggle } from './utils';\n\nimport SortByDropdown from './SortByDropdown';\nimport EstimatedDeliveryDropdown from './EstimatedDeliveryDropdown';\nimport QuickDeliveryToggle from './QuickDeliveryToggle';\nimport PromotionalToggle from './PromotionalToggle';\nimport FundersDropdown from './FundersDropdown';\nimport ArrowLeftIcon from '../../../assets/images/arrow-left.svg';\nimport ArrowRightIcon from '../../../assets/images/arrow-right.svg';\nimport { useElasticSearch } from './ElasticSearch';\nimport InStockToggle from './InStockToggle';\n\nconst FilterControls = ({\n  labelMapping,\n  isAdmin,\n  path,\n  controller,\n  action,\n  isOnlySortVisible,\n  fundersVisible,\n  showPromotion,\n  className,\n}) => {\n  const pillsRef = useRef();\n  const arrowLeftRef = useRef();\n  const arrowRightRef = useRef();\n\n  const { hasAnyOption } = useElasticSearch();\n\n  const { isOpen, isFixed, filters, theme, totalCounts } = useSelector((state) => state.filterControls);\n  const dispatch = useDispatch();\n  const [isEmpty, setIsEmpty] = useState(true);\n  const [filterList, setFilterList] = useState([]);\n  const [isOverflown, setIsOverflown] = useState(false);\n\n  const clearAll = (event) => {\n    const form = event.target.closest('form');\n\n    dispatch({ type: 'RESET_FILTERS' });\n\n    setTimeout(() => {\n      form.dispatchEvent(new Event('submit', { bubbles: true, cancelable: true }));\n    }, 1);\n  };\n\n  const handleOpen = () => {\n    dispatch({ type: 'SET_OPEN', payload: !isOpen });\n  };\n\n  useEffect(() => {\n    const filterControlsForm = document.querySelector('.filter-controls');\n    const filterWrapper = document.querySelector('.drv-filter-desktop');\n    const filterWrapperRect = filterWrapper.getBoundingClientRect() || 0;\n\n    if (isOpen && isFixed) {\n      filterControlsForm.style.top = `${filterWrapperRect.height + 48}px`;\n    } else if (['specials', 'vehicles'].includes(controller)) {\n      filterControlsForm.style.top = `${Math.max(filterWrapperRect.height, 125) + 32}px`;\n    } else {\n      filterControlsForm.style.top = '48px';\n    }\n  }, [isOpen, isFixed]);\n\n  useEffect(() => {\n    setFilterList(Object.keys(filters));\n  }, [filters]);\n\n  useEffect(() => {\n    setIsOverflown(pillsRef.current.scrollWidth > pillsRef.current.clientWidth);\n  }, [filters, isFixed]);\n\n  useEffect(() => {\n    const filtersWithoutDefaults = filters;\n    delete filtersWithoutDefaults.customer_type;\n    delete filtersWithoutDefaults.sort_by;\n\n    if (Object.keys(filtersWithoutDefaults).length === 0) {\n      setIsEmpty(true);\n    } else {\n      setIsEmpty(false);\n    }\n  }, [filters, filterList.map((name) => `filters[${name}]`)]);\n\n  useEffect(() => {\n    // eslint-disable-next-line no-new\n    new ScrollSnapSlider(pillsRef.current, arrowLeftRef.current, arrowRightRef.current);\n  }, []);\n\n  const showEstimatedDelivery = isAdmin && controller === 'specials' && !isOnlySortVisible;\n  const showFunders = isAdmin && fundersVisible;\n\n  const showQuickDelivery = shouldShowFeature('stock') && hasAnyOption('stock', 'true');\n  const showPromotionalStock = showPromotionalToggle({\n    showPromotion,\n    controller,\n    action,\n    value: 'eon promotion',\n    hasAnyOption,\n  });\n\n  return (\n    <div\n      className={classnames('drv-filter-controls__desktop', `${className}`, {\n        [`drv-filter-controls--${theme}`]: theme,\n        'drv-filter-controls__desktop--fixed': isFixed,\n      })}\n    >\n      {!isOnlySortVisible && (\n        <button className=\"drv-filter-controls__expand drv-button drv-button--blue\" type=\"button\" onClick={handleOpen}>\n          {isOpen ? 'Hide' : 'Expand'} Filters\n        </button>\n      )}\n      <div className=\"pills-group\">\n        <span className=\"results-count\">{totalCounts.count} results</span>\n        <div className={`indicators prev ${!isOverflown || isFixed ? 'hidden' : ''}`}>\n          <button ref={arrowLeftRef} type=\"button\" className=\"arrow prev disabled\">\n            <img src={ArrowLeftIcon} alt=\"\" srcSet=\"\" />\n          </button>\n        </div>\n        <div ref={pillsRef} data-ga-filters className=\"drv-pills drv-pills-slider\">\n          <Pills selectedFilters={filters} labelMapping={labelMapping} />\n        </div>\n        <div className={`indicators next ${!isOverflown || isFixed ? 'hidden' : ''}`}>\n          <button ref={arrowRightRef} type=\"button\" className=\"arrow next\">\n            <img src={ArrowRightIcon} alt=\"\" srcSet=\"\" />\n          </button>\n        </div>\n        {!isEmpty && (\n          <button\n            type=\"button\"\n            className={classnames('drv-filter-controls__clear drv-link', {\n              [`drv-link--${theme}`]: theme,\n              'drv-link--gold': !theme,\n            })}\n            data-action=\"click->ga-filters#push\"\n            data-ga-filters-event-action=\"cleared_all_filters\"\n            onClick={clearAll}\n          >\n            Clear all\n          </button>\n        )}\n        {controller === 'specials' && (\n          <div style={{ marginLeft: '50px', display: 'flex', gap: '1rem' }}>\n            {!isAdmin && showQuickDelivery && <QuickDeliveryToggle isDesktopVersion path={path} />}\n            {showPromotionalStock && <PromotionalToggle isDesktopVersion value=\"eon promotion\" />}\n          </div>\n        )}\n        {controller === 'vehicles' && (\n          <div style={{ marginLeft: '50px', display: 'flex', gap: '1rem' }}>\n            <InStockToggle isDesktopVersion path={path} />\n          </div>\n        )}\n      </div>\n      {showFunders && <FundersDropdown path={path} />}\n      {showEstimatedDelivery && <EstimatedDeliveryDropdown path={path} />}\n      <SortByDropdown controller={controller} action={action} />\n    </div>\n  );\n};\n\nFilterControls.propTypes = {\n  className: PropTypes.string,\n  labelMapping: PropTypes.shape({}).isRequired,\n  isAdmin: PropTypes.bool,\n  path: PropTypes.string.isRequired,\n  controller: PropTypes.string.isRequired,\n  action: PropTypes.string.isRequired,\n  isOnlySortVisible: PropTypes.bool,\n  fundersVisible: PropTypes.bool,\n  showPromotion: PropTypes.bool,\n};\n\nFilterControls.defaultProps = {\n  className: '',\n  isAdmin: false,\n  isOnlySortVisible: false,\n  fundersVisible: false,\n  showPromotion: true,\n};\n\nexport default FilterControls;\n","import React from 'react';\nimport PropTypes from 'prop-types';\n\nimport Pill from './Pill';\n\nconst ElectricPills = ({ selectedFilters }) => {\n  return (\n    !!selectedFilters.hybrid_or_electric && (\n      <Pill category=\"hybrid_or_electric\" label=\"Electric\" value={selectedFilters.hybrid_or_electric} />\n    )\n  );\n};\n\nElectricPills.propTypes = {\n  selectedFilters: PropTypes.shape({\n    hybrid_or_electric: PropTypes.string,\n  }).isRequired,\n};\n\nexport default ElectricPills;\n","import React from 'react';\nimport PropTypes from 'prop-types';\n\nimport Pill from './Pill';\n\nconst MakePills = ({ selectedFilters }) => {\n  return (\n    !!selectedFilters['make[]'] &&\n    selectedFilters['make[]'].map((make, makeIndex, makes) => (\n      <React.Fragment key={make}>\n        <Pill\n          category=\"make[]\"\n          value={make}\n          gaFilterName=\"manufacturer\"\n          isMake\n          isLast={\n            makeIndex + 1 === makes.length &&\n            selectedFilters['make_model_range[]'] &&\n            !selectedFilters['make_model_range[]'].filter((model) => model.startsWith(make)).length\n          }\n        />\n\n        {selectedFilters['make_model_range[]'] &&\n          selectedFilters['make_model_range[]']\n            .filter((model) => model.startsWith(make))\n            .map((model, modelIndex, models) => (\n              <Pill\n                key={model}\n                category=\"make_model_range[]\"\n                gaFilterName=\"model\"\n                label={model.replace(`${make},`, '')}\n                value={model}\n                isLast={makeIndex + 1 === makes.length && modelIndex + 1 === models.length}\n              />\n            ))}\n      </React.Fragment>\n    ))\n  );\n};\n\nMakePills.propTypes = {\n  selectedFilters: PropTypes.shape({\n    'make_model_range[]': PropTypes.arrayOf(PropTypes.string),\n  }).isRequired,\n};\n\nexport default MakePills;\n","import React from 'react';\nimport PropTypes from 'prop-types';\n\nimport Pill from './Pill';\n\nconst FuelTypePills = ({ selectedFilters }) => {\n  return (\n    <>\n      {selectedFilters['display_fueltype[]'] &&\n        selectedFilters['display_fueltype[]'].map((value) => (\n          <Pill key={value} category=\"display_fueltype[]\" value={value} gaFilterName=\"fuel_type\" />\n        ))}\n      {selectedFilters.display_fueltype && (\n        <Pill category=\"display_fueltype\" value={selectedFilters.display_fueltype} />\n      )}\n    </>\n  );\n};\n\nFuelTypePills.propTypes = {\n  selectedFilters: PropTypes.shape({\n    'display_fueltype[]': PropTypes.arrayOf(PropTypes.string),\n    display_fueltype: PropTypes.string,\n  }).isRequired,\n};\n\nexport default FuelTypePills;\n","import React from 'react';\nimport PropTypes from 'prop-types';\n\nimport Pill from './Pill';\n\nconst BudgetPills = ({ selectedFilters, labelMapping }) => {\n  const getKeyByValue = (object, value) => {\n    return Object.keys(object).find((key) => object[key] === value);\n  };\n\n  return (\n    !!selectedFilters.monthly_prices && (\n      <Pill\n        category=\"monthly_prices\"\n        label={getKeyByValue(labelMapping, selectedFilters.monthly_prices)}\n        value={selectedFilters.monthly_prices}\n        gaFilterName=\"budget\"\n      />\n    )\n  );\n};\n\nBudgetPills.propTypes = {\n  selectedFilters: PropTypes.shape({\n    monthly_prices: PropTypes.string,\n  }).isRequired,\n  labelMapping: PropTypes.shape({}).isRequired,\n};\n\nexport default BudgetPills;\n","import React from 'react';\nimport PropTypes from 'prop-types';\n\nimport Pill from './Pill';\n\nconst BodyTypePills = ({ selectedFilters }) => {\n  return (\n    <>\n      {selectedFilters['bodytype_categories[]'] &&\n        selectedFilters['bodytype_categories[]'].map((value) => (\n          <Pill key={value} category=\"bodytype_categories[]\" value={value} gaFilterName=\"body_type\" />\n        ))}\n      {selectedFilters.bodytype_categories && (\n        <Pill category=\"bodytype_categories\" value={selectedFilters.bodytype_categories} />\n      )}\n    </>\n  );\n};\n\nBodyTypePills.propTypes = {\n  selectedFilters: PropTypes.shape({\n    bodytype_categories: PropTypes.string,\n    'bodytype_categories[]': PropTypes.arrayOf(PropTypes.string),\n  }).isRequired,\n};\n\nexport default BodyTypePills;\n","import React from 'react';\nimport PropTypes from 'prop-types';\n\nimport Pill from './Pill';\n\nconst TransmissionPills = ({ selectedFilters }) => {\n  return (\n    !!selectedFilters.transmission && (\n      <Pill category=\"transmission\" value={selectedFilters.transmission} gaFilterName=\"gearbox\" />\n    )\n  );\n};\n\nTransmissionPills.propTypes = {\n  selectedFilters: PropTypes.shape({\n    transmission: PropTypes.string,\n  }).isRequired,\n};\n\nexport default TransmissionPills;\n","import React from 'react';\nimport PropTypes from 'prop-types';\n\nimport Pill from './Pill';\n\nconst SeatsPills = ({ selectedFilters }) => {\n  return (\n    !!selectedFilters['vehicle_seating_capacity[]'] &&\n    selectedFilters['vehicle_seating_capacity[]'].map((value) => (\n      <Pill\n        key={value}\n        category=\"vehicle_seating_capacity[]\"\n        label={`${value} seats`}\n        value={value}\n        gaFilterName=\"no_of_seats\"\n      />\n    ))\n  );\n};\n\nSeatsPills.propTypes = {\n  selectedFilters: PropTypes.shape({\n    'vehicle_seating_capacity[]': PropTypes.arrayOf(PropTypes.string),\n  }).isRequired,\n};\n\nexport default SeatsPills;\n","import React from 'react';\nimport PropTypes from 'prop-types';\n\nimport Pill from './Pill';\n\nconst TermPills = ({ selectedFilters }) => {\n  return (\n    !!selectedFilters.term && (\n      <Pill\n        category=\"term\"\n        label={`${selectedFilters.term} month term`}\n        value={selectedFilters.term}\n        gaFilterName=\"contract_length\"\n      />\n    )\n  );\n};\n\nTermPills.propTypes = {\n  selectedFilters: PropTypes.shape({\n    term: PropTypes.string,\n  }).isRequired,\n};\n\nexport default TermPills;\n","import React from 'react';\nimport PropTypes from 'prop-types';\n\nimport Pill from './Pill';\n\nconst MileagePills = ({ selectedFilters }) => {\n  return (\n    !!selectedFilters.mileage && (\n      <Pill\n        category=\"mileage\"\n        label={`${Math.floor(selectedFilters.mileage).toLocaleString('en-GB')} miles`}\n        value={selectedFilters.mileage}\n        gaFilterName=\"annual_mileage\"\n      />\n    )\n  );\n};\n\nMileagePills.propTypes = {\n  selectedFilters: PropTypes.shape({\n    mileage: PropTypes.string,\n  }).isRequired,\n};\n\nexport default MileagePills;\n","import React from 'react';\nimport PropTypes from 'prop-types';\n\nimport Pill from './Pill';\n\nconst InitialPaymentPills = ({ selectedFilters }) => {\n  return (\n    !!selectedFilters.initial_payment && (\n      <Pill\n        category=\"initial_payment\"\n        label={`${selectedFilters.initial_payment} Month initial payment`}\n        value={selectedFilters.initial_payment}\n        gaFilterName=\"initial_payment\"\n      />\n    )\n  );\n};\n\nInitialPaymentPills.propTypes = {\n  selectedFilters: PropTypes.shape({\n    initial_payment: PropTypes.string,\n  }).isRequired,\n};\n\nexport default InitialPaymentPills;\n","import React from 'react';\nimport PropTypes from 'prop-types';\n\nimport Pill from './Pill';\n\nconst EstimatedDeliveryPills = ({ selectedFilters }) => {\n  return (\n    !!selectedFilters.estimated_delivery && (\n      <Pill\n        category=\"estimated_delivery\"\n        label={`${selectedFilters.estimated_delivery} delivery`}\n        value={selectedFilters.estimated_delivery}\n      />\n    )\n  );\n};\n\nEstimatedDeliveryPills.propTypes = {\n  selectedFilters: PropTypes.shape({\n    estimated_delivery: PropTypes.string,\n  }).isRequired,\n};\n\nexport default EstimatedDeliveryPills;\n","import React from 'react';\nimport PropTypes from 'prop-types';\n\nimport Pill from './Pill';\n\nconst InStockPills = ({ selectedFilters }) => {\n  return !!selectedFilters.stock && <Pill category=\"stock\" label=\"In Stock\" value={selectedFilters.stock} />;\n};\n\nInStockPills.propTypes = {\n  selectedFilters: PropTypes.shape({\n    stock: PropTypes.string,\n  }).isRequired,\n};\n\nexport default InStockPills;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport Pill from './Pill';\n\nconst PromotionalPills = ({ selectedFilters }) => {\n  if (!selectedFilters.promotion_name) return null;\n\n  return <Pill value={selectedFilters.promotion_name.toString()} label=\"EV Miles Offer\" category=\"promotion_name\" />;\n};\n\nPromotionalPills.propTypes = {\n  selectedFilters: PropTypes.shape({\n    promotion_name: PropTypes.oneOfType([PropTypes.string, PropTypes.bool]),\n  }).isRequired,\n};\n\nexport default PromotionalPills;\n","import React from 'react';\nimport PropTypes from 'prop-types';\n\nimport Pill from './Pill';\n\nconst FunderPills = ({ selectedFilters }) => {\n  return !!selectedFilters.funder && <Pill category=\"funder\" value={selectedFilters.funder} />;\n};\n\nFunderPills.propTypes = {\n  selectedFilters: PropTypes.shape({\n    funder: PropTypes.string,\n  }).isRequired,\n};\n\nexport default FunderPills;\n","import React from 'react';\nimport PropTypes from 'prop-types';\n\nimport Pill from './Pill';\n\nconst Range = ({ selectedFilters }) => {\n  return (\n    !!selectedFilters['range[]'] &&\n    selectedFilters['range[]'].map((value) => <Pill key={value} category=\"range[]\" value={value} />)\n  );\n};\n\nRange.propTypes = {\n  selectedFilters: PropTypes.shape({\n    transmission: PropTypes.string,\n  }).isRequired,\n};\n\nexport default Range;\n","import React from 'react';\nimport PropTypes from 'prop-types';\n\nimport Pill from './Pill';\n\nconst PayloadPills = ({ selectedFilters }) => {\n  return (\n    !!selectedFilters.payload && (\n      <Pill category=\"payload\" label={`${selectedFilters.payload}`} value={selectedFilters.payload} />\n    )\n  );\n};\n\nPayloadPills.propTypes = {\n  selectedFilters: PropTypes.shape({\n    payload: PropTypes.string,\n  }).isRequired,\n};\n\nexport default PayloadPills;\n","import React from 'react';\nimport PropTypes from 'prop-types';\n\nimport Pill from './Pill';\n\nconst LoadLengthPills = ({ selectedFilters }) => {\n  return (\n    !!selectedFilters.load_length && (\n      <Pill category=\"load_length\" label={`${selectedFilters.load_length}`} value={selectedFilters.load_length} />\n    )\n  );\n};\n\nLoadLengthPills.propTypes = {\n  selectedFilters: PropTypes.shape({\n    load_length: PropTypes.string,\n  }).isRequired,\n};\n\nexport default LoadLengthPills;\n","import React, { useState, useEffect, useRef } from 'react';\nimport PropTypes from 'prop-types';\nimport { useDispatch, useSelector } from 'react-redux';\nimport { getQueryStringParameters } from '../../utils';\nimport { filterOptions } from './utils';\n\nconst SortByDropdown = ({ controller, action }) => {\n  const options = filterOptions(controller, action);\n  const { sort_by } = useSelector((state) => state.filterControls);\n  const dispatch = useDispatch();\n\n  const [open, setOpen] = useState(false);\n  const dropdownRef = useRef();\n\n  const handleOutsideClicks = (event) => {\n    if (open && dropdownRef.current && !dropdownRef.current.contains(event.target)) {\n      setOpen(false);\n    }\n  };\n\n  useEffect(() => {\n    dispatch({\n      type: 'SET_SORT_BY',\n      payload: getQueryStringParameters().sort_by || options.filter((option) => option.default)[0].value,\n    });\n  }, []);\n\n  useEffect(() => {\n    document.addEventListener('mousedown', handleOutsideClicks);\n    return () => {\n      document.removeEventListener('mousedown', handleOutsideClicks);\n    };\n  }, [open]);\n\n  const handleClick = (event) => {\n    event.persist();\n    dispatch({\n      type: 'SET_SORT_BY',\n      payload: options.find((field) => field.value === event.target.value).value,\n    });\n    setOpen(false);\n    setTimeout(() => {\n      event.target.closest('form').dispatchEvent(new Event('submit', { bubbles: true, cancelable: true }));\n    }, 1);\n  };\n\n  return (\n    <div className={`drv-filter-controls__sort ${open ? 'drv-filter-controls__sort--open' : ''}`} ref={dropdownRef}>\n      <button type=\"button\" className=\"drv-button drv-button--blue\" onClick={() => setOpen(!open)}>\n        Sort by\n      </button>\n      <div className=\"drv-filter-controls__sort-options\">\n        {options &&\n          options.map((field) => {\n            return (\n              <li key={field.value} className=\"drv-filter-option\">\n                <input\n                  type=\"radio\"\n                  id={field.name}\n                  name=\"sort_by\"\n                  className=\"drv-checkbox drv-checkbox--radio\"\n                  data-action=\"ga-filters#push\"\n                  data-ga-filters-event-action=\"sort_applied\"\n                  data-ga-filters-sort-applied={field.name.toLowerCase().replaceAll(' ', '_')}\n                  value={field.value}\n                  checked={sort_by === field.value}\n                  onChange={(event) => {\n                    handleClick(event);\n                  }}\n                />\n\n                <label htmlFor={field.name} className=\"drv-filter-option__label drv-ml-1\">\n                  {field.name}\n                </label>\n              </li>\n            );\n          })}\n      </div>\n    </div>\n  );\n};\n\nSortByDropdown.propTypes = {\n  controller: PropTypes.string,\n  action: PropTypes.string,\n};\n\nSortByDropdown.defaultProps = {\n  controller: '',\n  action: '',\n};\n\nexport default SortByDropdown;\n","import React from 'react';\nimport { useElasticSearch } from './ElasticSearch';\nimport FilterDrawerItem from '../ui/FilterDrawerItem';\n\nconst FundersDropdown = () => {\n  const elasticSearch = useElasticSearch();\n\n  return (\n    <div style={{ width: '230px', flexShrink: 0 }}>\n      <FilterDrawerItem\n        title=\"Funders\"\n        allText=\"Any\"\n        name=\"funder\"\n        options={elasticSearch.allFiltersFor('funder')}\n        elasticSearchProps={elasticSearch.props}\n        isDesktop\n      />\n    </div>\n  );\n};\n\nexport default FundersDropdown;\n","import React, { useEffect } from 'react';\nimport PropTypes from 'prop-types';\nimport { useDispatch } from 'react-redux';\n\nimport FilterList from '../ui/FilterList';\nimport AnnualMileage from './SpecialOffersFilters/AnnualMileage';\nimport InitialPayment from './SpecialOffersFilters/InitialPayment';\nimport Budget from './SpecialOffersFilters/Budget';\n\nimport Manufacturer from './SpecialOffersFilters/Manufacturer';\nimport Model from './SpecialOffersFilters/Model';\nimport BodyType from './SpecialOffersFilters/BodyType';\nimport FuelType from './SpecialOffersFilters/FuelType';\nimport Transmission from './SpecialOffersFilters/Transmission';\nimport Seats from './SpecialOffersFilters/Seats';\nimport { useElasticSearch } from './ElasticSearch';\n\nconst ShortTermSpecialOffersFilters = ({ isDesktop }) => {\n  const elasticSearch = useElasticSearch();\n  const dispatch = useDispatch();\n\n  useEffect(() => {\n    dispatch({ type: 'SET_THEME', payload: '' });\n  }, []);\n\n  return (\n    <>\n      <FilterList heading=\"Vehicle options\" isDesktop={isDesktop}>\n        <FuelType\n          name=\"display_fueltype[]\"\n          options={elasticSearch.allFiltersFor('display_fueltype')}\n          elasticSearchProps={elasticSearch.props}\n          isDesktop={isDesktop}\n        />\n\n        <Manufacturer\n          name=\"make[]\"\n          options={elasticSearch.allFiltersFor('make')}\n          elasticSearchProps={elasticSearch.props}\n          isDesktop={isDesktop}\n        />\n\n        <Model\n          name=\"make_model_range[]\"\n          options={elasticSearch.availableFiltersFor('make_model_range')}\n          elasticSearchProps={elasticSearch.props}\n          isDesktop={isDesktop}\n        />\n\n        <Budget\n          name=\"monthly_prices\"\n          options={elasticSearch.allFiltersFor('monthly_prices')}\n          elasticSearchProps={elasticSearch.props}\n          isDesktop={isDesktop}\n        />\n\n        <BodyType\n          name=\"bodytype_categories[]\"\n          options={elasticSearch.allFiltersFor('bodytype_categories')}\n          elasticSearchProps={elasticSearch.props}\n          isDesktop={isDesktop}\n        />\n\n        <Transmission\n          name=\"transmission\"\n          options={elasticSearch.allFiltersFor('transmission')}\n          elasticSearchProps={elasticSearch.props}\n          isDesktop={isDesktop}\n        />\n\n        <Seats\n          name=\"vehicle_seating_capacity[]\"\n          options={elasticSearch.allFiltersFor('vehicle_seating_capacity')}\n          elasticSearchProps={elasticSearch.props}\n          isDesktop={isDesktop}\n        />\n      </FilterList>\n\n      <FilterList heading=\"Contract options\" isDesktop={isDesktop}>\n        <AnnualMileage\n          name=\"mileage\"\n          options={elasticSearch.allFiltersFor('mileage')}\n          elasticSearchProps={elasticSearch.props}\n          isDesktop={isDesktop}\n        />\n\n        <InitialPayment\n          name=\"initial_payment\"\n          options={elasticSearch.allFiltersFor('initial_payment')}\n          elasticSearchProps={elasticSearch.props}\n          isDesktop={isDesktop}\n        />\n      </FilterList>\n    </>\n  );\n};\n\nShortTermSpecialOffersFilters.propTypes = {\n  isDesktop: PropTypes.bool.isRequired,\n};\n\nexport default ShortTermSpecialOffersFilters;\n","import React, { useEffect } from 'react';\nimport PropTypes from 'prop-types';\nimport { useDispatch } from 'react-redux';\n\nimport FilterList from '../ui/FilterList';\n\nimport ContractLength from './SpecialOffersFilters/ContractLength';\nimport AnnualMileage from './SpecialOffersFilters/AnnualMileage';\nimport InitialPayment from './SpecialOffersFilters/InitialPayment';\nimport { useElasticSearch } from './ElasticSearch';\n\nconst StockOffersFilters = ({ isDesktop }) => {\n  const elasticSearch = useElasticSearch();\n\n  const dispatch = useDispatch();\n\n  useEffect(() => {\n    dispatch({ type: 'SET_THEME', payload: '' });\n  }, []);\n\n  return (\n    <FilterList heading=\"Vehicle options\" isDesktop={isDesktop}>\n      <ContractLength\n        name=\"term\"\n        options={elasticSearch.allFiltersFor('term')}\n        elasticSearchProps={elasticSearch.props}\n        isDesktop={isDesktop}\n      />\n\n      <AnnualMileage\n        name=\"mileage\"\n        options={elasticSearch.allFiltersFor('mileage')}\n        elasticSearchProps={elasticSearch.props}\n        isDesktop={isDesktop}\n      />\n\n      <InitialPayment\n        name=\"initial_payment\"\n        options={elasticSearch.allFiltersFor('initial_payment')}\n        elasticSearchProps={elasticSearch.props}\n        isDesktop={isDesktop}\n      />\n    </FilterList>\n  );\n};\n\nStockOffersFilters.propTypes = {\n  isDesktop: PropTypes.bool.isRequired,\n};\n\nexport default StockOffersFilters;\n","import React, { useEffect } from 'react';\nimport PropTypes from 'prop-types';\nimport { useDispatch } from 'react-redux';\n\nimport FilterList from '../ui/FilterList';\n\nimport Budget from './SpecialOffersFilters/Budget';\nimport Manufacturer from './SpecialOffersFilters/Manufacturer';\nimport Model from './SpecialOffersFilters/Model';\nimport Payload from './SpecialOffersFilters/Payload';\nimport LoadLength from './SpecialOffersFilters/LoadLength';\nimport FuelType from './SpecialOffersFilters/FuelType';\nimport Transmission from './SpecialOffersFilters/Transmission';\nimport ContractLength from './SpecialOffersFilters/ContractLength';\nimport InitialPayment from './SpecialOffersFilters/InitialPayment';\nimport AnnualMileage from './SpecialOffersFilters/AnnualMileage';\nimport { useElasticSearch } from './ElasticSearch';\n\nconst VanSpecialOffersFilters = ({ isDesktop }) => {\n  const elasticSearch = useElasticSearch();\n\n  const dispatch = useDispatch();\n\n  useEffect(() => {\n    dispatch({ type: 'SET_THEME', payload: '' });\n  }, []);\n\n  return (\n    <>\n      <FilterList heading=\"Vehicle options\" isDesktop={isDesktop}>\n        <Manufacturer\n          name=\"make[]\"\n          options={elasticSearch.allFiltersFor('make')}\n          elasticSearchProps={elasticSearch.props}\n          isDesktop={isDesktop}\n        />\n\n        <Model\n          name=\"make_model_range[]\"\n          options={elasticSearch.availableFiltersFor('make_model_range')}\n          elasticSearchProps={elasticSearch.props}\n          isDesktop={isDesktop}\n        />\n\n        <FuelType\n          name=\"display_fueltype[]\"\n          options={elasticSearch.allFiltersFor('display_fueltype')}\n          elasticSearchProps={elasticSearch.props}\n          isDesktop={isDesktop}\n        />\n\n        <Transmission\n          name=\"transmission\"\n          options={elasticSearch.allFiltersFor('transmission')}\n          elasticSearchProps={elasticSearch.props}\n          isDesktop={isDesktop}\n        />\n\n        <Payload\n          name=\"payload\"\n          options={elasticSearch.allFiltersFor('payload')}\n          elasticSearchProps={elasticSearch.props}\n          isDesktop={isDesktop}\n        />\n\n        <LoadLength\n          name=\"load_length\"\n          options={elasticSearch.allFiltersFor('load_length')}\n          elasticSearchProps={elasticSearch.props}\n          isDesktop={isDesktop}\n        />\n      </FilterList>\n\n      <FilterList heading=\"Leasing options\" isDesktop={isDesktop}>\n        <Budget\n          name=\"monthly_prices\"\n          options={elasticSearch.allFiltersFor('monthly_prices')}\n          elasticSearchProps={elasticSearch.props}\n          isDesktop={isDesktop}\n        />\n\n        <ContractLength\n          name=\"term\"\n          options={elasticSearch.allFiltersFor('term')}\n          elasticSearchProps={elasticSearch.props}\n          isDesktop={isDesktop}\n        />\n\n        <InitialPayment\n          name=\"initial_payment\"\n          options={elasticSearch.allFiltersFor('initial_payment')}\n          elasticSearchProps={elasticSearch.props}\n          isDesktop={isDesktop}\n        />\n\n        <AnnualMileage\n          name=\"mileage\"\n          options={elasticSearch.allFiltersFor('mileage')}\n          elasticSearchProps={elasticSearch.props}\n          isDesktop={isDesktop}\n        />\n      </FilterList>\n    </>\n  );\n};\n\nVanSpecialOffersFilters.propTypes = {\n  isDesktop: PropTypes.bool.isRequired,\n};\n\nexport default VanSpecialOffersFilters;\n","import React from 'react';\nimport PropTypes from 'prop-types';\n\nimport FilterDrawerItem from '../../ui/FilterDrawerItem';\nimport { elasticSearchFilterOptionPropTypes, elasticSearchPropsPropTypes } from '../../../propTypes/elasticSearch';\n\nconst Payload = ({ name, options, isDesktop, elasticSearchProps }) => {\n  const optionsOrder = ['Up to 1000mm', '500kg - 1000kg', '1000kg - 1500 kg'].reverse();\n\n  // .reverse() -> we want all of the options not in this list to be last, but the default with the below sort is that they're first.\n  // so we reverse both lists so that the missing options are last instead.\n\n  const sortedOptions = [...options]\n    .sort((a, b) => {\n      return optionsOrder.indexOf(a.value) - optionsOrder.indexOf(b.value);\n    })\n    .reverse();\n\n  return (\n    <FilterDrawerItem\n      title=\"Payload\"\n      name={name}\n      options={sortedOptions}\n      elasticSearchProps={elasticSearchProps}\n      isDesktop={isDesktop}\n    />\n  );\n};\n\nPayload.propTypes = {\n  name: PropTypes.string.isRequired,\n  options: PropTypes.arrayOf(elasticSearchFilterOptionPropTypes),\n  isDesktop: PropTypes.bool,\n  elasticSearchProps: elasticSearchPropsPropTypes.isRequired,\n};\n\nPayload.defaultProps = {\n  options: [],\n  isDesktop: false,\n};\n\nexport default Payload;\n","import React from 'react';\nimport PropTypes from 'prop-types';\n\nimport FilterDrawerItem from '../../ui/FilterDrawerItem';\nimport { elasticSearchFilterOptionPropTypes, elasticSearchPropsPropTypes } from '../../../propTypes/elasticSearch';\n\nconst LoadLength = ({ name, options = [], isDesktop, elasticSearchProps }) => {\n  const optionsOrder = ['Up to 1000mm', '1000mm - 2400mm', '2400mm - 3000mm', '3000mm - 4000mm'].reverse();\n\n  // .reverse() -> we want all of the options not in this list to be last, but the default with the below sort is that they're first.\n  // so we reverse both lists so that the missing options are last instead.\n\n  const sortedOptions = [...options]\n    .sort((a, b) => {\n      return optionsOrder.indexOf(a.value) - optionsOrder.indexOf(b.value);\n    })\n    .reverse();\n\n  return (\n    <FilterDrawerItem\n      title=\"Load Length\"\n      name={name}\n      options={sortedOptions}\n      elasticSearchProps={elasticSearchProps}\n      isDesktop={isDesktop}\n    />\n  );\n};\n\nLoadLength.propTypes = {\n  name: PropTypes.string.isRequired,\n  options: PropTypes.arrayOf(elasticSearchFilterOptionPropTypes),\n  isDesktop: PropTypes.bool,\n  elasticSearchProps: elasticSearchPropsPropTypes.isRequired,\n};\n\nLoadLength.defaultProps = {\n  options: [],\n  isDesktop: false,\n};\n\nexport default LoadLength;\n","import React, { useEffect, useState, useRef } from 'react';\nimport PropTypes from 'prop-types';\nimport classnames from 'classnames';\n\nimport { useDispatch, useSelector } from 'react-redux';\n\nimport Pills from './SpecialOffersFilters/filterPills/Pills';\nimport QuickDeliveryToggle from './QuickDeliveryToggle';\nimport PromotionalToggle from './PromotionalToggle';\nimport { shouldShowFeature } from '../../splitTesting';\nimport { useElasticSearch } from './ElasticSearch';\nimport InStockToggle from './InStockToggle';\n\nimport { showPromotionalToggle } from './utils';\n\nconst ClearAllButton = ({ onClick, theme }) => (\n  // eslint-disable-next-line jsx-a11y/click-events-have-key-events, jsx-a11y/no-static-element-interactions\n  <span\n    className={classnames('drv-link', {\n      'drv-link--gold': !theme,\n      [`drv-link--${theme}`]: theme,\n    })}\n    data-action=\"click->ga-filters#push\"\n    data-ga-filters-event-action=\"cleared_all_filters\"\n    onClick={onClick}\n  >\n    Clear all\n    <svg\n      fill={theme === 'electric' ? '#00a3e0' : '#ac8c30'}\n      height=\"20\"\n      viewBox=\"228.61 210.78 10.21 12.02\"\n      width=\"20\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n    >\n      <path d=\"m233.71817501636602,222.80117904990522 c-2.8198594488203526,0 -5.10526180267334,-2.39004047670465 -5.10526180267334,-5.343179495041285 s2.2854023538529873,-5.343179495041285 5.10526180267334,-5.343179495041285 l0,-1.3352021604064999 l2.9201778432428833,1.8040021347066384 l-2.9201778432428833,1.6168557087302022 l0,-1.2514356213533258 c-2.377137526869774,0 -4.311553131788969,2.022983649566763 -4.311553131788969,4.50895943336427 c0,2.4859757837975067 1.9344156049191952,4.50895943336427 4.311553131788969,4.50895943336427 s4.311553131788969,-2.0062992483332227 4.311553131788969,-4.50895943336427 l0.7937086708843714,0 c0,2.9614812189534057 -2.2854023538529873,5.343179495041285 -5.10526180267334,5.343179495041285 z\" />\n    </svg>\n  </span>\n);\n\nClearAllButton.propTypes = {\n  onClick: PropTypes.func.isRequired,\n  theme: PropTypes.string,\n};\n\nClearAllButton.defaultProps = {\n  theme: '',\n};\n\nconst MobileFilterControls = ({ labelMapping, showPromotion, controller, action, path }) => {\n  const pillsRef = useRef();\n  const { hasAnyOption } = useElasticSearch();\n\n  const { filters, totalCounts, theme } = useSelector((state) => state.filterControls);\n  const dispatch = useDispatch();\n  const [isEmpty, setIsEmpty] = useState(true);\n  const [filterList, setFilterList] = useState([]);\n\n  const showQuickDelivery = shouldShowFeature('stock') && controller === 'specials' && hasAnyOption('stock', 'true');\n  const showPromotionalStock = showPromotionalToggle({\n    showPromotion,\n    controller,\n    action,\n    value: 'eon promotion',\n    hasAnyOption,\n  });\n\n  const showOnlyInStock = showQuickDelivery && !showPromotionalStock;\n  const showOnlyPromotional = showPromotionalStock && !showQuickDelivery;\n  const showSingleToggle = showOnlyInStock || showOnlyPromotional;\n\n  const clearAll = (event) => {\n    const form = event.target.closest('form');\n\n    dispatch({ type: 'RESET_FILTERS' });\n\n    setTimeout(() => {\n      form.dispatchEvent(new Event('submit', { bubbles: true, cancelable: true }));\n    }, 1);\n  };\n\n  useEffect(() => {\n    setFilterList(Object.keys(filters));\n  }, [filters]);\n\n  useEffect(() => {\n    const filtersWithoutDefaults = filters;\n    delete filtersWithoutDefaults.customer_type;\n    delete filtersWithoutDefaults.sort_by;\n\n    if (Object.keys(filtersWithoutDefaults).length === 0) {\n      setIsEmpty(true);\n    } else {\n      setIsEmpty(false);\n    }\n  }, [filters, filterList.map((name) => `filters[${name}]`)]);\n\n  return (\n    <>\n      {showQuickDelivery && showPromotionalStock && (\n        <div className=\"drv-filter-toggles\">\n          <QuickDeliveryToggle isDesktopVersion={false} />\n          <PromotionalToggle isDesktopVersion={false} value=\"eon promotion\" />\n        </div>\n      )}\n      {controller === 'vehicles' && (\n        <div className=\"drv-filter-toggles\">\n          <InStockToggle path={path} isDesktopVersion={false} />\n        </div>\n      )}\n      <div\n        className={classnames('drv-filter-controls__mobile', {\n          [`drv-filter-controls--${theme}`]: theme,\n        })}\n      >\n        <div className=\"drv-filter-controls__mobile--primary\">\n          <div>\n            <span className=\"drv-filter-controls__result-count\">{totalCounts.count}</span> results\n          </div>\n          {!isEmpty && ((showQuickDelivery && showPromotionalStock) || controller !== 'specials') && (\n            <ClearAllButton onClick={clearAll} theme={theme} />\n          )}\n          {showOnlyPromotional && <PromotionalToggle isDesktopVersion={false} value=\"eon promotion\" />}\n          {showOnlyInStock && <QuickDeliveryToggle isDesktopVersion={false} />}\n        </div>\n        {!isEmpty && (\n          <div className=\"pills-group\">\n            <div ref={pillsRef} className=\"drv-pills\">\n              <Pills selectedFilters={filters} labelMapping={labelMapping} />\n            </div>\n            {!isEmpty && showSingleToggle && <ClearAllButton onClick={clearAll} theme={theme} />}\n          </div>\n        )}\n      </div>\n    </>\n  );\n};\n\nMobileFilterControls.propTypes = {\n  labelMapping: PropTypes.shape({}).isRequired,\n  showPromotion: PropTypes.bool.isRequired,\n  controller: PropTypes.string.isRequired,\n  action: PropTypes.string.isRequired,\n  path: PropTypes.string.isRequired,\n};\n\nexport default MobileFilterControls;\n","import React, { useMemo } from 'react';\nimport FilterDrawerItem from '../ui/FilterDrawerItem';\nimport AnnualMileage from './SpecialOffersFilters/AnnualMileage';\nimport InitialPayment from './SpecialOffersFilters/InitialPayment';\nimport ContractLength from './SpecialOffersFilters/ContractLength';\nimport { useModelFilters } from './ModelFiltersContext';\n\nconst MobileModelFilters = () => {\n  const modelFilters = useModelFilters();\n\n  const withoutButton = useMemo(() => true, []);\n\n  return (\n    <div className=\"drv-ui\">\n      <hr className=\"drv-hr\" />\n      <h4 className=\"d-flex justify-content-center mt-4 drv-text-subheading drv-text-semi-bold\">\n        Choose your vehicle options\n      </h4>\n      <ul className=\"drv-model-filters drv-model-filters--mobile\">\n        <FilterDrawerItem\n          title=\"Trim level\"\n          name=\"trim\"\n          options={modelFilters.allFiltersFor('trim')}\n          elasticSearchProps={modelFilters.props}\n          isDesktop\n          withoutButton={withoutButton}\n        />\n        <FilterDrawerItem\n          title=\"Fuel type\"\n          name=\"display_fueltype\"\n          options={modelFilters.allFiltersFor('display_fueltype')}\n          elasticSearchProps={modelFilters.props}\n          isDesktop\n          withoutButton={withoutButton}\n        />\n        <FilterDrawerItem\n          title=\"Gearbox\"\n          name=\"transmission\"\n          options={modelFilters.allFiltersFor('transmission')}\n          elasticSearchProps={modelFilters.props}\n          isDesktop\n          withoutButton={withoutButton}\n        />\n      </ul>\n      <hr />\n      <h4 className=\"d-flex justify-content-center drv-text-subheading drv-text-semi-bold\">\n        Choose your contract options\n      </h4>\n      <ul className=\"drv-model-filters drv-model-filters--mobile\">\n        <InitialPayment\n          name=\"initial_payment\"\n          options={modelFilters.allFiltersFor('initial_payment')}\n          elasticSearchProps={modelFilters.props}\n          isDesktop\n          withoutButton={withoutButton}\n        />\n        <AnnualMileage\n          name=\"mileage\"\n          options={modelFilters.allFiltersFor('mileage')}\n          elasticSearchProps={modelFilters.props}\n          isDesktop\n          withoutButton={withoutButton}\n        />\n        <ContractLength\n          name=\"term\"\n          options={modelFilters.allFiltersFor('term')}\n          elasticSearchProps={modelFilters.props}\n          isDesktop\n          withoutButton={withoutButton}\n        />\n      </ul>\n    </div>\n  );\n};\n\nexport default MobileModelFilters;\n","import React, { useEffect, useState } from 'react';\nimport { useDispatch, useSelector } from 'react-redux';\nimport Pill from './SpecialOffersFilters/filterPills/Pill';\nimport { useModelFilters } from './ModelFiltersContext';\n\nconst ModelPills = () => {\n  const {\n    props: { selectedFilters },\n  } = useModelFilters();\n  const dispatch = useDispatch();\n  const [isEmpty, setIsEmpty] = useState(true);\n  const { totalCounts } = useSelector((state) => state.filterControls);\n\n  const clearAll = (event) => {\n    const form = event.target.closest('form');\n\n    dispatch({ type: 'RESET_FILTERS' });\n\n    setTimeout(() => {\n      form.dispatchEvent(new Event('submit', { bubbles: true, cancelable: true }));\n    }, 1);\n  };\n\n  useEffect(() => {\n    const filtersWithoutDefaults = { ...selectedFilters };\n    delete filtersWithoutDefaults.customer_type;\n    delete filtersWithoutDefaults.sort_by;\n\n    setIsEmpty(Object.keys(filtersWithoutDefaults).length === 0);\n  }, [selectedFilters]);\n\n  const clearAllButton = (options) => {\n    const className = options?.mobile ? 'd-lg-none' : 'd-none d-lg-block';\n\n    return (\n      !isEmpty && (\n        <button\n          className={`${className} drv-filter-controls__clear drv-link drv-link--gold`}\n          data-action=\"click->ga-filters#push\"\n          data-ga-filters-event-action=\"cleared_all_filters\"\n          onClick={clearAll}\n        >\n          Clear all\n        </button>\n      )\n    );\n  };\n\n  return (\n    <>\n      <div className=\"drv-filter-controls__mobile--primary mb-3 mt-2 align-items-end\">\n        <div className=\"d-lg-none\">\n          <span className=\"drv-filter-controls__result-count\">{totalCounts.count}</span> results\n        </div>\n        {clearAllButton({ mobile: true })}\n      </div>\n      <div className=\"d-flex justify-content-between mb-3\">\n        <div data-ga-filters className=\"drv-pills drv-pills-slider\">\n          {selectedFilters.trim && <Pill category=\"trim\" value={selectedFilters.trim} />}\n          {selectedFilters.display_fueltype && (\n            <Pill category=\"display_fueltype\" value={selectedFilters.display_fueltype} gaFilterName=\"fuel_type\" />\n          )}\n          {selectedFilters.transmission && (\n            <Pill category=\"transmission\" value={selectedFilters.transmission} gaFilterName=\"gearbox\" />\n          )}\n          {selectedFilters.initial_payment && (\n            <Pill\n              category=\"initial_payment\"\n              label={`${selectedFilters.initial_payment} Month initial payment`}\n              value={selectedFilters.initial_payment}\n              gaFilterName=\"initial_payment\"\n            />\n          )}\n          {selectedFilters.mileage && (\n            <Pill\n              category=\"mileage\"\n              label={`${Math.floor(selectedFilters.mileage).toLocaleString('en-GB')} miles`}\n              value={selectedFilters.mileage}\n              gaFilterName=\"annual_mileage\"\n            />\n          )}\n          {selectedFilters.term && (\n            <Pill\n              category=\"term\"\n              label={`${selectedFilters.term} month term`}\n              value={selectedFilters.term}\n              gaFilterName=\"contract_length\"\n            />\n          )}\n        </div>\n        {clearAllButton()}\n      </div>\n    </>\n  );\n};\n\nexport default ModelPills;\n","import React from 'react';\nimport PropTypes from 'prop-types';\n\n// Component Imports\nimport DerivativeFilters from './DerivativeFilters';\n\nconst PricingFilters = ({ path }) => {\n  const dataGroups = [\n    { key: 'channels', name: 'Channels' },\n    { key: 'condition', name: 'Condition' },\n    { key: 'managed_by', name: 'Managed by' },\n    { key: 'make', name: 'Make' },\n    { key: 'model_range', name: 'Model range' },\n    { key: 'model', name: 'Model' },\n    { key: 'trim', name: 'Trim' },\n    { key: 'model_year', name: 'Model year' },\n    { key: 'transmission', name: 'Transmission' },\n    { key: 'display_fueltype', name: 'Fuel type' },\n    { key: 'bodytype_categories', name: 'Bodytype' },\n    { key: 'winning_funders', name: 'Winning funder' },\n    { key: 'funder_special', name: 'Funder special' },\n    { key: 'total_care', name: 'Total care' },\n    { key: 'published_state', name: 'Visible state of derivative' },\n    { key: 'available_deals', name: 'Deal is published and live' },\n    { key: 'published_unavailable_deals', name: 'Deal is published but not live' },\n    { key: 'draft_deals', name: 'Deal is in draft' },\n    { key: 'stock_deals', name: 'Deal is in stock' },\n  ];\n\n  return (\n    <form\n      noValidate=\"novalidate\"\n      className=\"simple_form search\"\n      action=\"/backoffice/derivatives/pricing\"\n      acceptCharset=\"UTF-8\"\n      data-remote=\"true\"\n      method=\"get\"\n    >\n      <div className=\"form-group string optional search_keywords\">\n        <label className=\"string optional\" htmlFor=\"search_keywords\">\n          Cap ID or code\n        </label>\n        <input\n          className=\"form-control string optional\"\n          placeholder=\"e.g 012345\"\n          type=\"text\"\n          name=\"search[keywords]\"\n          id=\"search_keywords\"\n        />\n      </div>\n\n      <div className=\"form-group string optional\">\n        <label className=\"string optional\" htmlFor=\"date_range\">\n          Date standard deal was last updated\n        </label>\n        <input\n          className=\"form-control string optional datepicker\"\n          type=\"text\"\n          name=\"search[date_range]\"\n          id=\"date_range\"\n        />\n      </div>\n\n      <div className=\"form-group hidden search_sort_by\">\n        <input className=\"form-control hidden\" name=\"search[sort_by]\" type=\"hidden\" id=\"search_sort_by\" />\n      </div>\n\n      <DerivativeFilters dataGroups={dataGroups} path={path} />\n\n      <input\n        className=\"btn btn-success mt-3 w-100\"\n        type=\"submit\"\n        name=\"commit\"\n        value=\"Save Search\"\n        data-disable-with=\"Save Search\"\n      />\n    </form>\n  );\n};\n\nPricingFilters.propTypes = {\n  path: PropTypes.string.isRequired,\n};\n\nexport default PricingFilters;\n","/* eslint-disable react/jsx-props-no-spreading */\nimport React, { useEffect, useState, useRef } from 'react';\nimport { Provider, useDispatch, useSelector } from 'react-redux';\nimport { goToNextStep, goToPreviousStep, setEligibilityAnswer } from '../../store/reducers/eligibility-checker';\nimport { areAllQuestionsAnswered, calculateCurrentScore } from '../../store/selectors';\nimport { finalScreenData, steps } from './steps';\nimport { pushData } from '../../ga/eligibility-checker-ga-data';\nimport store from '../../store/store';\nimport Step from './Step';\nimport FinalScreen from './FinalScreen';\n\nconst preloadImages = () => {\n  steps.forEach((step) => {\n    const img = new Image();\n    img.src = step.image;\n    const mobileImg = new Image();\n    mobileImg.src = step.mobileImage;\n  });\n  Object.values(finalScreenData).forEach((screen) => {\n    const img = new Image();\n    img.src = screen.image;\n    const mobileImg = new Image();\n    mobileImg.src = screen.mobileImage;\n  });\n};\n\nconst EligibilityChecker = () => {\n  const dispatch = useDispatch();\n  const currentStep = useSelector((state) => state.eligibilityChecker.currentStep);\n  const allAnswered = useSelector((state) => areAllQuestionsAnswered(state.eligibilityChecker));\n  const currentScore = useSelector((state) => calculateCurrentScore(state.eligibilityChecker, steps));\n  const stepsData = useSelector((state) => ({\n    about_you: state.eligibilityChecker.about_you,\n    address_history: state.eligibilityChecker.address_history,\n    employment_status: state.eligibilityChecker.employment_status,\n    employment_history: state.eligibilityChecker.employment_history,\n    affordability: state.eligibilityChecker.affordability,\n    credit_history: state.eligibilityChecker.credit_history,\n  }));\n  const [finalScreen, setFinalScreen] = useState(null);\n  const [errorMessage, setErrorMessage] = useState('');\n  const componentRef = useRef(null);\n\n  useEffect(() => {\n    preloadImages();\n  }, []);\n\n  useEffect(() => {\n    const topBarHeight = 130;\n    const componentTop = componentRef.current.getBoundingClientRect().top;\n    if (componentTop < topBarHeight || componentTop > window.innerHeight) {\n      window.scrollTo({\n        top: componentTop + window.scrollY - topBarHeight,\n        behavior: 'smooth',\n      });\n    }\n  }, [currentStep, finalScreen]);\n\n  const handleNextStep = () => {\n    const stepName = steps[currentStep].name;\n    const currentValue = stepsData[stepName];\n\n    if (currentStep === 0 && currentValue !== 'over_18') {\n      setErrorMessage('You must be over 18 to proceed.');\n      return;\n    }\n\n    if (currentValue === '') {\n      setErrorMessage('Please select an answer');\n      return;\n    }\n\n    setErrorMessage('');\n    pushData({\n      step: currentStep,\n      stepName,\n      action: 'next step',\n      currentValue,\n    });\n\n    if (allAnswered) {\n      setFinalScreen(currentScore);\n    } else {\n      dispatch(goToNextStep());\n    }\n  };\n\n  const handlePreviousStep = () => {\n    setErrorMessage(''); // Reset error message when going back\n    const stepName = steps[currentStep].name;\n    pushData({\n      step: currentStep,\n      stepName,\n      action: 'previous step',\n      currentValue: stepsData[stepName],\n    });\n\n    dispatch(goToPreviousStep());\n  };\n\n  const handleSetAnswer = (step, value, score) => {\n    setErrorMessage(''); // Reset error message when a value is selected\n    dispatch(setEligibilityAnswer(step, value, score));\n  };\n\n  const stepComponentData = steps[currentStep];\n\n  return (\n    <div ref={componentRef}>\n      {finalScreen ? (\n        <FinalScreen\n          title={finalScreenData[finalScreen].title}\n          image={finalScreenData[finalScreen].image}\n          mobileImage={finalScreenData[finalScreen].mobileImage}\n          description={finalScreenData[finalScreen].description}\n          score={finalScreen}\n        />\n      ) : (\n        <Step\n          stepData={stepComponentData}\n          stepNumber={currentStep}\n          currentValue={stepsData[stepComponentData.name]}\n          onAnswer={handleSetAnswer}\n          onNext={handleNextStep}\n          onPrevious={handlePreviousStep}\n          steps={steps}\n          currentStep={currentStep}\n          errorMessage={errorMessage}\n        />\n      )}\n    </div>\n  );\n};\n\nexport default function EligibilityCheckerProvider(props) {\n  return (\n    <Provider store={store}>\n      <EligibilityChecker {...props} />\n    </Provider>\n  );\n}\n","/* eslint-disable react/require-default-props */\nimport React, { useState, useRef, useEffect } from 'react';\nimport PropTypes from 'prop-types';\nimport { useForm } from 'react-hook-form';\nimport { isValidNumber } from 'libphonenumber-js';\nimport { Provider, useSelector } from 'react-redux';\n\nimport store from '../../store/store';\n\n// Component Imports\nimport FormField from '../Forms/FormField';\nimport OptOut from '../Forms/OptOut';\n\nimport { pushData } from '../../ga/form_ga_data';\n\nimport { selectedOfferId, geotargetlyInit } from '../Deal/helpers';\n\nconst EnquireNow = ({\n  postURL,\n  channelID,\n  isPersonal,\n  geotargetly,\n  pricing,\n  personal_sources,\n  business_sources,\n  featured_deal,\n  offer_id,\n  derivative_id,\n  initial_payment_months,\n  term,\n  mileage,\n  salesAdmin,\n  vehicleId,\n  vehicleStatus,\n}) => {\n  // React Redux hooks\n  const query = useSelector((state) => state.Deal);\n  const offerId = offer_id || selectedOfferId(query);\n\n  const derivativeId = derivative_id || query.derivativeId;\n  const selectedTerm = query.contractLength || term;\n  const selectedMileage = (query.annualMileage > 0 ? query.annualMileage : 5000) || mileage;\n  const { maintenanceSelected } = query;\n  const initialPaymentMonths = initial_payment_months || query.initialMonths;\n  const selectedOptionIds = query.selected.actuallySelectedOptionIds;\n\n  const [state, setState] = useState({\n    firstName: '',\n    lastName: '',\n    businessName: '',\n    email: '',\n    telephone: '',\n    source: '',\n    disposal: '',\n    soon: '',\n    time: '',\n    comments: '',\n    timeTrading: '',\n    businessType: '',\n    fleetSize: '',\n    mailList: false,\n    authenticity_token: '',\n    disabled: false,\n    leadType: '',\n  });\n\n  useEffect(() => {\n    if (geotargetly) {\n      geotargetlyInit(document, 'script');\n    }\n  }, []);\n\n  const { register, handleSubmit, errors, getValues } = useForm({\n    mode: 'onBlur',\n    reValidateMode: 'onBlur',\n  });\n\n  const formRef = useRef(null);\n\n  const handleFormSubmission = () => {\n    if (state.disabled) {\n      return;\n    }\n\n    setState({\n      ...state,\n      disabled: true,\n      authenticity_token: document.querySelector('[name=csrf-token]').content,\n    });\n\n    let formName = 'Car Enquiry';\n    if (query.isVan) {\n      formName = 'Van Enquiry';\n    }\n    if (query.isShortTerm) {\n      formName = 'Short Term';\n    }\n\n    pushData({\n      form_name: formName,\n      lease_type: isPersonal ? 'Personal' : 'Business',\n      signup: !getValues('contact_opt_out'),\n      value: query.monthlyPrice,\n      item: {\n        item_name: query.model,\n        item_brand: query.make,\n        item_variant: query.trim,\n        item_category: query.isVan ? 'Van' : 'Car',\n        item_category2: query.transmission,\n        item_category3: query.fueltype,\n        price: query.price,\n        duration: query.contractLength,\n        annual_miles: query.annualMileage,\n        initial_payment_duration: query.initialMonths,\n        initial_payment_price: query.initialPaymentPrice,\n        maintenance: query.maintenanceSelected,\n        maintenance_price:\n          query.maintainedMonthlyPrice && Math.max(0, query.maintainedMonthlyPrice - query.monthlyPrice),\n      },\n      user_data: {\n        email: getValues('contact_email'),\n        phone_number: getValues('contact_telephone'),\n      },\n    });\n\n    setTimeout(() => {\n      formRef.current.submit();\n    }, 1000);\n  };\n\n  return (\n    <form\n      className=\"c-modal-enquire-now__form bootstrap-form\"\n      onSubmit={handleSubmit(handleFormSubmission)}\n      noValidate\n      ref={formRef}\n      action={postURL}\n      method=\"post\"\n    >\n      <input type=\"hidden\" name=\"authenticity_token\" value={state.authenticity_token} />\n      <input type=\"hidden\" name=\"channel_id\" value={channelID} />\n\n      {!!offerId && <input type=\"hidden\" name=\"offer_id\" value={offerId} />}\n\n      {(!!derivative_id || !offerId) && <input type=\"hidden\" name=\"derivative_id\" value={derivativeId} />}\n\n      {!offerId && <input type=\"hidden\" name=\"term\" value={selectedTerm} />}\n\n      {!offerId && <input type=\"hidden\" name=\"mileage\" value={selectedMileage} />}\n\n      {!!maintenanceSelected && <input type=\"hidden\" name=\"maintenance_selected\" value={maintenanceSelected} />}\n\n      {!!initialPaymentMonths && <input type=\"hidden\" name=\"initial_payment_months\" value={initialPaymentMonths} />}\n\n      {vehicleId && <input type=\"hidden\" name=\"vehicle_id\" value={vehicleId} />}\n\n      <div className={`geotargetlygeocontent${geotargetly}`}>\n        <input type=\"hidden\" name=\"office\" />\n      </div>\n\n      {selectedOptionIds.length > 0 &&\n        selectedOptionIds.map((option) => (\n          <input type=\"hidden\" name=\"selected_option_ids[]\" value={option} key={option} />\n        ))}\n\n      {pricing && <input type=\"hidden\" name=\"pricing\" value={pricing} />}\n\n      {featured_deal && <input type=\"hidden\" name=\"featured_deal\" value={featured_deal} />}\n\n      <div className=\"b-form-row\">\n        <FormField\n          labelText=\"First name\"\n          placeholder=\"First name\"\n          id=\"first_name\"\n          type=\"text\"\n          onChange={(event) => setState({ ...state, firstName: event.target.value })}\n          ref={register({ required: true })}\n          hasError={!!errors.first_name}\n          value={state.firstName}\n          errorMessage=\"Please enter your first name\"\n        />\n        <FormField\n          labelText=\"Last name\"\n          placeholder=\"Last name\"\n          id=\"last_name\"\n          type=\"text\"\n          onChange={(event) => setState({ ...state, lastName: event.target.value })}\n          ref={register({ required: true })}\n          hasError={!!errors.last_name}\n          value={state.lastName}\n          errorMessage=\"Please enter your last name\"\n        />\n        {!isPersonal && (\n          <>\n            <FormField\n              labelText=\"Business name\"\n              placeholder=\"Business name\"\n              id=\"company_name\"\n              type=\"text\"\n              onChange={(event) => setState({ ...state, businessName: event.target.value })}\n              ref={register({ required: true })}\n              hasError={!!errors.company_name}\n              value={state.businessName}\n              errorMessage=\"Please enter your business name\"\n            />\n            <FormField\n              labelText=\"Business Type\"\n              id=\"contact_business_type\"\n              onChange={(event) => setState({ ...state, businessType: event.target.value })}\n              ref={register({ required: true })}\n              hasError={!!errors.contact_business_type}\n              value={state.businessType}\n              variant=\"select\"\n              options={[\n                { value: '', text: 'Business type' },\n                { value: 'Limited Company', text: 'Limited Company' },\n                { value: 'Sole Trader', text: 'Sole Trader' },\n                {\n                  value: 'Partnership Four Partners',\n                  text: 'Partnership (4+ partners)',\n                },\n                {\n                  value: 'Partnership Two Three Partners',\n                  text: 'Partnership (2-3 partners)',\n                },\n                {\n                  value: 'Limited Liability Partnership',\n                  text: 'Limited Liability Partnership',\n                },\n                { value: 'PLC', text: 'PLC' },\n              ]}\n              errorMessage=\"Please select your business type.\"\n            />\n            <FormField\n              labelText=\"Fleet size\"\n              id=\"contact_fleet_size\"\n              onChange={(event) => setState({ ...state, fleetSize: event.target.value })}\n              ref={register({ required: true })}\n              hasError={!!errors.contact_fleet_size}\n              value={state.fleetSize}\n              variant=\"select\"\n              options={[\n                { value: '', text: 'Fleet size' },\n                { value: '1to9', text: '1-9' },\n                { value: '10to49', text: '10-49' },\n                { value: '50', text: '50+' },\n              ]}\n              errorMessage=\"Please select your fleet size.\"\n            />\n          </>\n        )}\n        <FormField\n          labelText=\"Email\"\n          placeholder=\"Email\"\n          id=\"contact_email\"\n          type=\"text\"\n          onChange={(event) => setState({ ...state, email: event.target.value })}\n          ref={register({\n            required: true,\n            pattern:\n              /^(([^<>()[\\]\\\\.,;:\\s@']+(\\.[^<>()[\\]\\\\.,;:\\s@']+)*)|('.+'))@(([[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\])|(([a-zA-Z\\-0-9]+\\.)+[a-zA-Z]{2,}))$/,\n          })}\n          hasError={!!errors.contact_email}\n          value={state.email}\n          errorMessage=\"Please enter a valid email address.\"\n        />\n        <FormField\n          labelText=\"Telephone\"\n          placeholder=\"Telephone\"\n          id=\"contact_telephone\"\n          type=\"text\"\n          onChange={(event) => setState({ ...state, telephone: event.target.value })}\n          ref={register({\n            required: true,\n            validate: (value) => isValidNumber(value, 'GB'),\n          })}\n          hasError={!!errors.contact_telephone}\n          value={state.telephone}\n          errorMessage=\"Please enter a valid telephone number.\"\n        />\n        {isPersonal && (\n          <FormField\n            labelText=\"Preferred contact time\"\n            id=\"contact_time\"\n            onChange={(event) => setState({ ...state, time: event.target.value })}\n            ref={register({ required: false })}\n            hasError={!!errors.contact_time}\n            value={state.time}\n            variant=\"select\"\n            options={[\n              { value: '', text: 'Contact time' },\n              { value: 'Any', text: 'Any' },\n              { value: 'Morning', text: 'Morning' },\n              { value: 'Afternoon', text: 'Afternoon' },\n              { value: 'After 6pm', text: 'After 6pm' },\n            ]}\n            errorMessage=\"Please select your preferred contact time.\"\n          />\n        )}\n        {salesAdmin && (\n          <FormField\n            labelText=\"Lead type\"\n            id=\"lead_type\"\n            onChange={(event) => setState({ ...state, leadType: event.target.value })}\n            ref={register({ required: true })}\n            hasError={!!errors.lead_type}\n            value={state.leadType}\n            variant=\"select\"\n            options={[\n              { value: '', text: 'Select lead type' },\n              { value: 'Incoming Call', text: 'Incoming Call' },\n              { value: 'Commversion Cold', text: 'Commversion Cold' },\n              { value: 'Commversion Warm', text: 'Commversion Warm' },\n            ]}\n            errorMessage=\"Please select lead type.\"\n          />\n        )}\n        {salesAdmin && (\n          <FormField\n            labelText=\"Select source\"\n            id=\"contact_source\"\n            onChange={(event) => setState({ ...state, source: event.target.value })}\n            ref={register({ required: true })}\n            hasError={!!errors.contact_source}\n            value={state.source}\n            variant=\"select\"\n            options={[\n              { value: '', text: 'Select source' },\n              ...(isPersonal ? personal_sources : business_sources).map((source) => ({ value: source, text: source })),\n            ]}\n            errorMessage=\"Please select a source.\"\n          />\n        )}\n        <FormField\n          labelText=\"Comments\"\n          id=\"contact_comments\"\n          placeholder=\"Comments\"\n          onChange={(event) => setState({ ...state, comments: event.target.value })}\n          value={state.comments}\n        />\n      </div>\n      <div className=\"b-form-row\">\n        <div className=\"col-12\">\n          <div className=\"c-modal-enquire-now__action\">\n            <button className=\"b-btn b-btn-shadowless b-btn-green\" type=\"submit\" disabled={state.disabled}>\n              {(() => {\n                if (state.disabled) return 'Sending...';\n                if (vehicleStatus === 'reserved') return 'Notify me';\n                return 'Send my enquiry';\n              })()}\n            </button>\n          </div>\n        </div>\n      </div>\n\n      <OptOut on_dark ref={register({ required: false })} />\n    </form>\n  );\n};\n\nconst enquireNowPropTypes = {\n  postURL: PropTypes.string.isRequired,\n  channelID: PropTypes.string.isRequired,\n  isPersonal: PropTypes.bool.isRequired,\n  geotargetly: PropTypes.string,\n  pricing: PropTypes.string,\n  personal_sources: PropTypes.arrayOf(PropTypes.string),\n  business_sources: PropTypes.arrayOf(PropTypes.string),\n  featured_deal: PropTypes.string,\n  offer_id: PropTypes.string,\n  derivative_id: PropTypes.string,\n  initial_payment_months: PropTypes.string,\n  term: PropTypes.number,\n  mileage: PropTypes.number,\n  salesAdmin: PropTypes.bool,\n  vehicleId: PropTypes.string,\n  vehicleStatus: PropTypes.string,\n};\n\nEnquireNow.propTypes = enquireNowPropTypes;\n\nexport default function EnquireNowWrapper({\n  postURL,\n  channelID,\n  isPersonal,\n  geotargetly,\n  pricing,\n  personal_sources,\n  business_sources,\n  featured_deal,\n  offer_id,\n  derivative_id,\n  initial_payment_months,\n  term,\n  mileage,\n  salesAdmin,\n  vehicleId,\n  vehicleStatus,\n}) {\n  return (\n    <Provider store={store}>\n      <EnquireNow\n        postURL={postURL}\n        channelID={channelID}\n        isPersonal={isPersonal}\n        geotargetly={geotargetly}\n        pricing={pricing}\n        personal_sources={personal_sources}\n        business_sources={business_sources}\n        featured_deal={featured_deal}\n        offer_id={offer_id}\n        derivative_id={derivative_id}\n        initial_payment_months={initial_payment_months}\n        term={term}\n        mileage={mileage}\n        salesAdmin={salesAdmin}\n        vehicleId={vehicleId}\n        vehicleStatus={vehicleStatus}\n      />\n    </Provider>\n  );\n}\n\nEnquireNowWrapper.propTypes = enquireNowPropTypes;\n","import React from 'react';\nimport ReactDOM from 'react-dom';\nimport PropTypes from 'prop-types';\nimport VanBodytypeFilter from './VanBodytypeFilter';\nimport CategoryFilters from './CategoryFilters';\nimport SpecialOffersFilters from './SpecialOffersFilters';\nimport FilterControls from './FilterControls';\nimport MobileFilterControls from './MobileFilterControls';\nimport ElasticSearchWrapper from './ElasticSearch';\nimport { useWindowSize } from '../../hooks';\n\nconst FiltersWrapper = ({\n  actionName,\n  isVans,\n  showPromotion,\n  controllerName,\n  path,\n  isPersonal,\n  categoryType,\n  labelMapping,\n  isAdmin,\n}) => {\n  const [width] = useWindowSize();\n  const specialOffersFiltersPortal = (\n    <SpecialOffersFilters\n      isPersonal={isPersonal}\n      labelMapping={labelMapping}\n      path={path}\n      isDesktop={false}\n      action={actionName}\n      isVans={isVans}\n      controller={controllerName}\n    />\n  );\n\n  const categoryFiltersPortal = (\n    <CategoryFilters\n      path={path}\n      isPersonal={isPersonal}\n      isDesktop={false}\n      categoryType={categoryType}\n      isVans={isVans}\n      controller={controllerName}\n    />\n  );\n  const specialOffersPortalElement = document.getElementById('special-offers-filters-portal');\n  const categoryPortalElement = document.getElementById('category-filters-portal');\n  const vehiclesPortalElement = document.getElementById('vehicles-filters-portal');\n\n  return (\n    <ElasticSearchWrapper path={path} isPersonal={isPersonal} labelMapping={labelMapping}>\n      <>\n        {width <= 1200 &&\n          isVans &&\n          controllerName === 'specials' &&\n          actionName !== 'vans_electric' &&\n          actionName !== 'short_term' && <VanBodytypeFilter path={path} isDesktop={false} />}\n        <div className=\"drv-filter-triggers\">\n          <div className=\"drv-filter-triggers__trigger drv-filter-triggers__trigger--filter\">\n            <button href=\"#\" data-drawer=\".g-drawer--filter\">\n              Filters\n            </button>\n          </div>\n          <div className=\"drv-filter-triggers__trigger drv-filter-triggers__trigger--sort\">\n            <button href=\"#\" data-drawer=\".g-drawer--sort\">\n              Sort by\n            </button>\n          </div>\n        </div>\n        <MobileFilterControls\n          labelMapping={labelMapping}\n          isAdmin={isAdmin}\n          controller={controllerName}\n          action={actionName}\n          path={path}\n          showPromotion={showPromotion}\n          className=\"\"\n        />\n        {actionName !== 'vans_electric' && (\n          <>\n            {width > 1200 && isVans && controllerName === 'specials' && actionName !== 'short_term' && (\n              <VanBodytypeFilter path={path} isDesktop />\n            )}\n            {controllerName === 'categories' && (\n              <div className=\"drv-filter-desktop\">\n                <CategoryFilters\n                  path={path}\n                  isPersonal={isPersonal}\n                  isDesktop\n                  categoryType={categoryType}\n                  isVans={isVans}\n                  controller={controllerName}\n                />\n              </div>\n            )}\n            {['specials', 'vehicles'].includes(controllerName) && (\n              <div className=\"drv-filter-desktop\">\n                <SpecialOffersFilters\n                  isPersonal={isPersonal}\n                  labelMapping={labelMapping}\n                  path={path}\n                  isDesktop\n                  action={actionName}\n                  isVans={isVans}\n                  showPromotion={showPromotion}\n                  controller={controllerName}\n                />\n              </div>\n            )}\n          </>\n        )}\n        <div className=\"filter-controls\">\n          <FilterControls\n            labelMapping={labelMapping}\n            isAdmin={isAdmin}\n            path={path}\n            controller={controllerName}\n            action={actionName}\n            showPromotion={showPromotion}\n            isOnlySortVisible={actionName === 'vans_electric'}\n            fundersVisible={actionName === 'all'}\n          />\n        </div>\n        {specialOffersPortalElement\n          ? ReactDOM.createPortal(specialOffersFiltersPortal, specialOffersPortalElement)\n          : null}\n        {categoryPortalElement ? ReactDOM.createPortal(categoryFiltersPortal, categoryPortalElement) : null}\n        {vehiclesPortalElement ? ReactDOM.createPortal(specialOffersFiltersPortal, vehiclesPortalElement) : null}\n      </>\n    </ElasticSearchWrapper>\n  );\n};\n\nFiltersWrapper.propTypes = {\n  actionName: PropTypes.string.isRequired,\n  isVans: PropTypes.bool.isRequired,\n  showPromotion: PropTypes.bool.isRequired,\n  controllerName: PropTypes.string.isRequired,\n  path: PropTypes.string.isRequired,\n  isPersonal: PropTypes.bool.isRequired,\n  categoryType: PropTypes.oneOfType([PropTypes.string, PropTypes.oneOf([null])]),\n  labelMapping: PropTypes.shape({}).isRequired,\n  isAdmin: PropTypes.bool.isRequired,\n};\n\nFiltersWrapper.defaultProps = {\n  categoryType: null,\n};\n\nexport default FiltersWrapper;\n","import React from 'react';\nimport { Provider, useDispatch, useSelector } from 'react-redux';\nimport classnames from 'classnames';\nimport store from '../../store/store';\nimport Button from '../ui/Button';\n\nconst MobileFilterActions = () => {\n  const dispatch = useDispatch();\n  const { totalCounts, theme, isVans, controller } = useSelector((state) => state.filterControls);\n\n  const clearAll = (event) => {\n    const form = event.target.closest('form');\n\n    dispatch({ type: 'RESET_FILTERS' });\n\n    setTimeout(() => {\n      form.dispatchEvent(new Event('submit', { bubbles: true, cancelable: true }));\n    }, 1);\n  };\n\n  const submitForm = (event) => {\n    event.preventDefault();\n    const form = document.querySelector(`#${controller}-filters`);\n\n    setTimeout(() => {\n      form.dispatchEvent(new Event('submit', { bubbles: true, cancelable: true }));\n    }, 1);\n  };\n\n  return (\n    <>\n      {/* eslint-disable-next-line jsx-a11y/click-events-have-key-events, jsx-a11y/no-static-element-interactions */}\n      <span\n        className={classnames('drv-link', 'drv-mb-4', {\n          'drv-link--gold': !theme,\n          [`drv-link--${theme}`]: theme,\n        })}\n        data-action=\"ga#push\"\n        data-ga-filter-name=\"Clear all\"\n        onClick={clearAll}\n      >\n        Clear all\n        <svg\n          fill={theme === 'electric' ? '#00a3e0' : '#ac8c30'}\n          height=\"20\"\n          viewBox=\"228.61 210.78 10.21 12.02\"\n          width=\"20\"\n          xmlns=\"http://www.w3.org/2000/svg\"\n        >\n          <path d=\"m233.71817501636602,222.80117904990522 c-2.8198594488203526,0 -5.10526180267334,-2.39004047670465 -5.10526180267334,-5.343179495041285 s2.2854023538529873,-5.343179495041285 5.10526180267334,-5.343179495041285 l0,-1.3352021604064999 l2.9201778432428833,1.8040021347066384 l-2.9201778432428833,1.6168557087302022 l0,-1.2514356213533258 c-2.377137526869774,0 -4.311553131788969,2.022983649566763 -4.311553131788969,4.50895943336427 c0,2.4859757837975067 1.9344156049191952,4.50895943336427 4.311553131788969,4.50895943336427 s4.311553131788969,-2.0062992483332227 4.311553131788969,-4.50895943336427 l0.7937086708843714,0 c0,2.9614812189534057 -2.2854023538529873,5.343179495041285 -5.10526180267334,5.343179495041285 z\" />\n        </svg>\n      </span>\n      <Button\n        variant={theme || 'primary'}\n        data-action=\"click->ga-filters#push\"\n        data-ga-filters-event-action=\"applied_filters_mobile\"\n        data-drawer-action=\"close\"\n        onClick={(e) => submitForm(e)}\n      >\n        View {totalCounts.count} {isVans ? 'vans' : 'cars'}\n      </Button>\n    </>\n  );\n};\n\n/* eslint-disable react/jsx-props-no-spreading */\nexport default function MobileFilterActionsWrapper(props) {\n  return (\n    <Provider store={store}>\n      <MobileFilterActions {...props} />\n    </Provider>\n  );\n}\n/* eslint-enable */\n","import React from 'react';\nimport ReactDOM from 'react-dom';\nimport PropTypes from 'prop-types';\nimport ModelFiltersWrapper from './ModelFiltersContext';\nimport DesktopModelFilters from './DesktopModelFilters';\nimport ModelPills from './ModelPills';\nimport MobileModelFilters from './MobileModelFilters';\n\nconst ModelFilters = ({ path, controllerName, isVans }) => {\n  const mobileFiltersPortal = <MobileModelFilters />;\n  const mobileFiltersElement = document.getElementById('mobile-model-filters-portal');\n\n  return (\n    <ModelFiltersWrapper path={path} controller={controllerName} isVans={isVans}>\n      <DesktopModelFilters />\n      <ModelPills />\n      {mobileFiltersElement ? ReactDOM.createPortal(mobileFiltersPortal, mobileFiltersElement) : null}\n    </ModelFiltersWrapper>\n  );\n};\n\nModelFilters.propTypes = {\n  path: PropTypes.string.isRequired,\n  controllerName: PropTypes.string.isRequired,\n  isVans: PropTypes.bool.isRequired,\n};\n\nexport default ModelFilters;\n","import React from 'react';\nimport PropTypes from 'prop-types';\n\nconst OptionList = ({ children }) => {\n  return <ul className=\"g-drawer__list\">{children}</ul>;\n};\n\nOptionList.propTypes = {\n  children: PropTypes.node.isRequired,\n};\n\nOptionList.Item = ({\n  id,\n  name,\n  value,\n  label,\n  checked,\n  onChange,\n  disabled,\n  type,\n  gaEventAction,\n  gaFilterName,\n  gaFilterOption,\n}) => {\n  return (\n    <li className=\"g-drawer__item\">\n      <div className={type === 'radio' ? 'custom-radio' : 'custom-checkbox'}>\n        <input\n          className=\"custom-control-input\"\n          type={type}\n          id={id}\n          name={name}\n          defaultChecked={checked}\n          value={value}\n          onChange={onChange}\n          disabled={disabled}\n          data-action=\"ga-filters#push\"\n          data-ga-filters-event-action={gaEventAction}\n          data-ga-filters-filter-name={gaFilterName}\n          data-ga-filters-filter-option={gaFilterOption}\n        />\n\n        <label className=\"custom-control-label\" htmlFor={id}>\n          {label}\n        </label>\n      </div>\n    </li>\n  );\n};\n\nOptionList.Item.propTypes = {\n  id: PropTypes.string.isRequired,\n  name: PropTypes.string,\n  value: PropTypes.string.isRequired,\n  checked: PropTypes.bool,\n  label: PropTypes.oneOf([PropTypes.string, PropTypes.node]).isRequired,\n  onChange: PropTypes.func,\n  disabled: PropTypes.bool,\n  type: PropTypes.oneOf(['checkbox', 'radio']),\n  gaEventAction: PropTypes.string,\n  gaFilterName: PropTypes.string,\n  gaFilterOption: PropTypes.string,\n};\n\nOptionList.Item.defaultProps = {\n  name: '',\n  type: 'radio',\n  checked: false,\n  onChange: () => {},\n  disabled: false,\n  gaEventAction: '',\n  gaFilterName: '',\n  gaFilterOption: '',\n};\n\nexport default OptionList;\n","import React, { useEffect } from 'react';\nimport PropTypes from 'prop-types';\nimport { Provider, useDispatch, useSelector } from 'react-redux';\nimport { getQueryStringParameters } from '../../utils';\nimport store from '../../store/store';\nimport { filterOptions } from './utils';\n\n// Component Imports\nimport SortOption from '../ui/SortOption';\n\nconst SortByFilters = ({ controller, action }) => {\n  const options = filterOptions(controller, action);\n\n  const { sort_by } = useSelector((state) => state.filterControls);\n  const dispatch = useDispatch();\n\n  useEffect(() => {\n    dispatch({\n      type: 'SET_SORT_BY',\n      payload: getQueryStringParameters().sort_by || options.filter((option) => option.default)[0].value,\n    });\n  }, []);\n\n  const handleClick = (event) => {\n    event.persist();\n    dispatch({\n      type: 'SET_SORT_BY',\n      payload: options.find((field) => field.value === event.target.value).value,\n    });\n    setTimeout(() => {\n      event.target.closest('form').dispatchEvent(new Event('submit', { bubbles: true, cancelable: true }));\n    }, 1);\n\n    // close sort drawer\n    event.target.closest('.g-drawer').classList.remove('drawer-open');\n    document.querySelector('body').classList.remove('has-drawer');\n    document.querySelector('.drawer-overlay').style.display = 'none';\n  };\n\n  return (\n    <div className=\"drv-sort\">\n      {options &&\n        options.map((field) => {\n          return (\n            <SortOption\n              key={field.value}\n              type=\"radio\"\n              value={field.value}\n              name=\"sort_by\"\n              label={field.name}\n              enabled\n              selected={sort_by === field.value}\n              onSelect={(event) => {\n                handleClick(event);\n              }}\n              id={`${field.name}-mobile`}\n            />\n          );\n        })}\n    </div>\n  );\n};\n\nSortByFilters.propTypes = {\n  controller: PropTypes.string,\n  action: PropTypes.string,\n};\n\nSortByFilters.defaultProps = {\n  controller: '',\n  action: '',\n};\n\n/* eslint-disable react/jsx-props-no-spreading */\nexport default function SortByFiltersWrapper(props) {\n  return (\n    <Provider store={store}>\n      <SortByFilters {...props} />\n    </Provider>\n  );\n}\n/* eslint-enable */\n","import React from 'react';\nimport PropTypes from 'prop-types';\n\nimport FilterDrawerItem from '../../ui/FilterDrawerItem';\nimport { elasticSearchFilterOptionPropTypes, elasticSearchPropsPropTypes } from '../../../propTypes/elasticSearch';\n\nconst EstimatedDelivery = ({ name, options = [], elasticSearchProps }) => {\n  const count = elasticSearchProps.selectedFilters[name] ? elasticSearchProps.selectedFilters[name] : 'Anytime';\n\n  return (\n    <FilterDrawerItem\n      title=\"Estimated delivery\"\n      allText=\"Anytime\"\n      count={count}\n      name={name}\n      options={options}\n      elasticSearchProps={elasticSearchProps}\n    />\n  );\n};\n\nEstimatedDelivery.propTypes = {\n  name: PropTypes.string.isRequired,\n  options: PropTypes.arrayOf(elasticSearchFilterOptionPropTypes),\n  elasticSearchProps: elasticSearchPropsPropTypes.isRequired,\n};\n\nEstimatedDelivery.defaultProps = {\n  options: [],\n};\n\nexport default EstimatedDelivery;\n","import React from 'react';\nimport PropTypes from 'prop-types';\n\nimport FilterDrawerItem from '../../ui/FilterDrawerItem';\nimport { elasticSearchFilterOptionPropTypes, elasticSearchPropsPropTypes } from '../../../propTypes/elasticSearch';\n\nconst InStock = ({ name, options, elasticSearchProps }) => {\n  const getLabel = (value) => (value === 'true' ? 'Yes' : 'No');\n\n  const count = elasticSearchProps.selectedFilters[name]\n    ? getLabel(elasticSearchProps.selectedFilters[name])\n    : undefined;\n\n  options = options.map((option) => ({ ...option, label: getLabel(option.value) }));\n\n  return (\n    <FilterDrawerItem\n      title=\"In stock?\"\n      name={name}\n      count={count}\n      options={options}\n      elasticSearchProps={elasticSearchProps}\n    />\n  );\n};\n\nInStock.propTypes = {\n  name: PropTypes.string.isRequired,\n  options: PropTypes.arrayOf(elasticSearchFilterOptionPropTypes),\n  elasticSearchProps: elasticSearchPropsPropTypes.isRequired,\n};\n\nInStock.defaultProps = {\n  options: [],\n};\n\nexport default InStock;\n"],"sourceRoot":""}