{"version":3,"sources":["webpack:///./app/javascript/components/ui/FilterDrawerItem.jsx","webpack:///./app/javascript/components/ui/Range.jsx","webpack:///./app/javascript/components/ui/FilterDrawerListItem.jsx","webpack:///./app/javascript/components/ui/FilterDrawerTrigger.jsx","webpack:///./app/javascript/components/ui/FilterOptionAll.jsx","webpack:///./app/javascript/components/scrollSnapSlider.js","webpack:///./app/javascript/components/ui/Button.jsx","webpack:///./app/javascript/components/ui/SortOption.jsx","webpack:///./app/javascript/components/ui/FilterList.jsx","webpack:///./app/javascript/components/SpecialistSearch/SpecialistSearch.jsx","webpack:///./app/javascript/components/ui/FilterDrawerSelectItem.jsx","webpack:///./app/javascript/components/ui/ToggleCheckbox.jsx","webpack:///./app/javascript/components/ui/FilterOption.jsx"],"names":["PRICE_FILTERS_COUNT","PRICE_FILTERS_SKIP_COUNT","FilterDrawerItem","allCount","isDesktop","name","count","disabled","options","excludeFromForm","title","allowAll","allText","elasticSearchProps","withoutButton","noWrap","selectedFilters","setSelectedFilter","removeSelectedFilters","totalCounts","useSelector","state","filterControls","checkboxOrRadio","isFilterArray","includes","replace","join","undefined","hasSelectedOptions","type","parentTitle","map","value","optionCount","label","prelabel","enabled","selected","indexOf","key","onSelect","id","defaultProps","Range","data","onChange","labels","classes","args","useState","setvalue","background","setBackground","input","useRef","className","classnames","useEffect","bgValue","current","min","max","ref","length","step","event","target","style","index","isFirst","isLast","labelClassName","Number","FilterDrawerListItem","children","dropdownRef","updatedRef","theme","selectedDropdown","isVans","controller","filtersUpdated","dispatch","useDispatch","submitForm","immediate","form","document","querySelector","setTimeout","dispatchEvent","Event","bubbles","cancelable","payload","handleOutsideClicks","window","innerWidth","dropdown","contains","stopPropagation","stopImmediatePropagation","removeEventListener","addEventListener","handleClick","open","onClick","role","tabIndex","onKeyDown","e","toLowerCase","replaceAll","toLocaleString","FilterDrawerTrigger","withCount","buttonRef","width","height","fill","xmlns","d","FilterOptionAll","checked","ScrollSnapSlider","slider","leftArrow","rightArrow","this","addEventListeners","scrollTo","updateArrows","bind","arrowOnClick","positions","getScrollSnapPositions","getCoordinates","x","scrollLeft","positionsLeft","positionsRight","toggleArrows","arrow","show","classList","toggle","direction","scrollSnapToNext","items","midpoint","threshold","lesser","greater","forEach","item","Math","abs","push","Button","variant","SortOption","htmlFor","FilterList","heading","ModelSearch","makesPath","makes","models","setState","makeRef","modelRef","axios","get","headers","Accept","then","response","getModels","make","slug","model","preventDefault","path","Turbolinks","visit","FilterDrawerSelectItem","dropdownOpen","setDropdownOpen","display","ToggleCheckbox","setSingleCheckboxFilter","labelPosition","greenToggle","isDesktopVersion","isDisabled","setIsDisabled","random","toString","substring","handleResize","windowWidth","appearance","persist","closest","FilterOption","safe_id","idToProcess"],"mappings":"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","file":"js/application~27a58e25-87863467a248b2b38068.chunk.js","sourcesContent":["import React from 'react';\nimport PropTypes from 'prop-types';\nimport { useSelector } from 'react-redux';\n\nimport { isFilterArray } from '../../utils';\nimport { elasticSearchFilterOptionPropTypes, elasticSearchPropsPropTypes } from '../../propTypes/elasticSearch';\n\nimport FilterDrawerListItem from './FilterDrawerListItem';\nimport FilterOption from './FilterOption';\nimport FilterOptionAll from './FilterOptionAll';\n\nconst PRICE_FILTERS_COUNT = ['monthly_prices', 'funder'];\nconst PRICE_FILTERS_SKIP_COUNT = ['term', 'mileage', 'initial_payment'];\n\nconst FilterDrawerItem = ({\n isDesktop,\n name,\n count,\n disabled,\n options,\n excludeFromForm,\n title,\n allowAll,\n allText,\n elasticSearchProps,\n withoutButton,\n noWrap,\n}) => {\n const { selectedFilters, setSelectedFilter, removeSelectedFilters } = elasticSearchProps;\n\n const { totalCounts } = useSelector((state) => state.filterControls);\n\n const checkboxOrRadio = isFilterArray(name) ? 'checkbox' : 'radio';\n let allCount;\n\n if (PRICE_FILTERS_COUNT.includes(name) && totalCounts[name.replace('[]', '')] > totalCounts.count) {\n allCount = totalCounts.count;\n } else if (PRICE_FILTERS_SKIP_COUNT.includes(name)) {\n allCount = '';\n } else {\n allCount = totalCounts[name.replace('[]', '')];\n }\n\n if (!count) {\n if (isFilterArray(name)) {\n count = selectedFilters[name] ? selectedFilters[name].join(', ') : undefined;\n } else {\n count = selectedFilters[name] || undefined; // TODO: improve\n }\n }\n\n return (\n <FilterDrawerListItem\n count={count}\n title={title}\n disabled={disabled}\n isDesktop={isDesktop}\n withoutButton={withoutButton}\n hasSelectedOptions={!!selectedFilters[name]}\n noWrap={noWrap}\n >\n {allowAll && (\n <FilterOptionAll\n type={checkboxOrRadio}\n allText={allText}\n allCount={allCount}\n name={name}\n selectedFilters={selectedFilters}\n removeSelectedFilters={removeSelectedFilters}\n parentTitle={title}\n />\n )}\n {options.map(({ value, count: optionCount, label, prelabel, enabled }) => {\n const selected = isFilterArray(name)\n ? (selectedFilters[name] || []).indexOf(value) > -1\n : selectedFilters[name] === value;\n\n return (\n <FilterOption\n key={value}\n type={checkboxOrRadio}\n value={value}\n count={optionCount || ''}\n name={name}\n excludeFromForm={excludeFromForm}\n label={label}\n prelabel={prelabel}\n enabled={enabled}\n selected={selected}\n onSelect={setSelectedFilter}\n parentTitle={title}\n id={isDesktop ? `${name}-${value}-desktop` : `${name}-${value}-mobile`}\n />\n );\n })}\n </FilterDrawerListItem>\n );\n};\n\nFilterDrawerItem.propTypes = {\n isDesktop: PropTypes.bool,\n name: PropTypes.string.isRequired,\n count: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),\n disabled: PropTypes.bool,\n options: PropTypes.arrayOf(elasticSearchFilterOptionPropTypes).isRequired,\n excludeFromForm: PropTypes.bool,\n title: PropTypes.string.isRequired,\n allowAll: PropTypes.bool,\n allText: PropTypes.string,\n elasticSearchProps: elasticSearchPropsPropTypes.isRequired,\n withoutButton: PropTypes.bool,\n noWrap: PropTypes.bool,\n};\n\nFilterDrawerItem.defaultProps = {\n isDesktop: false,\n count: undefined,\n disabled: false,\n excludeFromForm: false,\n allowAll: true,\n allText: 'All',\n withoutButton: false,\n noWrap: false,\n};\n\nexport default FilterDrawerItem;\n","import React, { useState, useEffect, useRef } from 'react';\nimport PropTypes from 'prop-types';\nimport classnames from 'classnames';\n\nconst Range = ({ data, selected, onChange, labels = data, classes = '', ...args }) => {\n const [value, setvalue] = useState(data.indexOf(selected) + 1);\n const [background, setBackground] = useState('');\n const input = useRef();\n\n const className = classnames('drv-range', classes);\n\n useEffect(() => {\n const bgValue = ((value - input.current.min) / (input.current.max - input.current.min)) * 100;\n setBackground(`linear-gradient(to right, #003765 0%, #003765 ${bgValue}%, #d1d1d1 ${bgValue}%, #d1d1d1 100%)`);\n\n onChange(value);\n }, [value]);\n\n return (\n <div className={className}>\n <div className=\"drv-range__input-wrapper\">\n <input\n ref={input}\n className=\"drv-range__input\"\n type=\"range\"\n min=\"1\"\n value={value}\n max={data.length}\n step=\"1\"\n data-ui-range-slider-target=\"input\"\n data-action=\"ui-range-slider#update\"\n onChange={(event) => setvalue(event.target.value)}\n // eslint-disable-next-line react/jsx-props-no-spreading\n {...args}\n />\n <div className=\"drv-range__bg\" style={{ background }} />\n <ul className=\"drv-range__list\">\n {labels.map((label, index) => {\n const isFirst = index === 0;\n const isLast = index === labels.length - 1;\n const labelClassName = classnames('drv-range__option', {\n 'drv-range__option--first': isFirst,\n 'drv-range__option--last': isLast,\n 'drv-range__option--selected': Number(value) === index + 1,\n });\n\n return (\n <li key={label} className={labelClassName}>\n {(isFirst || isLast) && label}\n </li>\n );\n })}\n </ul>\n </div>\n </div>\n );\n};\n\nRange.propTypes = {\n data: PropTypes.arrayOf(PropTypes.number).isRequired,\n selected: PropTypes.number,\n onChange: PropTypes.func.isRequired,\n // eslint-disable-next-line react/require-default-props\n labels: PropTypes.arrayOf(PropTypes.number),\n classes: PropTypes.string,\n};\n\nRange.defaultProps = {\n selected: null,\n classes: '',\n};\n\nexport default Range;\n","import React, { useEffect, useRef } from 'react';\nimport PropTypes from 'prop-types';\nimport { useSelector, useDispatch } from 'react-redux';\nimport classnames from 'classnames';\n\nimport FilterDrawerTrigger from './FilterDrawerTrigger';\n\nconst FilterDrawerListItem = ({\n title,\n count,\n disabled,\n isDesktop,\n withoutButton,\n children,\n hasSelectedOptions,\n noWrap,\n}) => {\n const dropdownRef = useRef();\n const updatedRef = useRef();\n const { totalCounts, theme, selectedDropdown, isVans, controller, filtersUpdated } = useSelector(\n (state) => state.filterControls,\n );\n const dispatch = useDispatch();\n\n const submitForm = (immediate = false) => {\n const form = document.querySelector(`#${controller}-filters`);\n setTimeout(\n () => {\n if (updatedRef.current) {\n form.dispatchEvent(new Event('submit', { bubbles: true, cancelable: true }));\n dispatch({ type: 'SET_FILTERS_UPDATED', payload: false });\n if (immediate) {\n dispatch({ type: 'SET_SELECTED_DROPDOWN', payload: '' });\n }\n }\n },\n immediate ? 0 : 1,\n );\n };\n\n const handleOutsideClicks = (event) => {\n if (window.innerWidth <= 1200 || selectedDropdown !== title) {\n return;\n }\n const dropdown = dropdownRef.current;\n if (!dropdown) return;\n\n const isClickInside = dropdown.contains(event.target);\n if (isClickInside) {\n event.stopPropagation();\n event.stopImmediatePropagation();\n } else {\n dispatch({ type: 'SET_SELECTED_DROPDOWN', payload: '' });\n submitForm();\n }\n };\n\n useEffect(() => {\n if (isDesktop) {\n document.removeEventListener('mousedown', handleOutsideClicks, true);\n document.addEventListener('mousedown', handleOutsideClicks, true);\n return () => {\n document.removeEventListener('mousedown', handleOutsideClicks, true);\n };\n }\n }, [selectedDropdown === title, title]);\n\n const handleClick = () => {\n if (selectedDropdown === title) {\n submitForm();\n }\n dispatch({ type: 'SET_SELECTED_DROPDOWN', payload: title });\n };\n\n const handleButton = () => {\n dispatch({ type: 'SET_SELECTED_DROPDOWN', payload: '' });\n submitForm();\n };\n\n useEffect(() => {\n updatedRef.current = filtersUpdated;\n }, [filtersUpdated]);\n\n return (\n <li\n className={classnames('drv-filter-drawer-list-item', {\n 'drv-filter-drawer-list-item--closed': selectedDropdown !== title,\n 'drv-filter-drawer-list-item--open': selectedDropdown === title,\n 'drv-filter-drawer-list-item--disabled': disabled,\n 'drv-filter-drawer-list-item--dropdown': isDesktop,\n 'drv-filter-drawer-list-item--selected': isDesktop && hasSelectedOptions,\n [`drv-filter-drawer-list-item--${theme}`]: theme,\n })}\n ref={dropdownRef}\n >\n <FilterDrawerTrigger\n title={title}\n handleClick={handleClick}\n open={selectedDropdown === title}\n count={count}\n disabled={disabled}\n isDesktop={isDesktop}\n />\n\n <div\n className={classnames('drv-filter-drawer-list-options-container drv-mb-1', {\n 'drv-filter-drawer-list-options-container--open': selectedDropdown === title,\n 'drv-filter-drawer-list-options-container--nowrap': noWrap,\n })}\n >\n <div\n className={classnames('drv-filter-drawer-list-options', {\n 'pb-2': withoutButton,\n })}\n onClick={() => {\n if (withoutButton) submitForm(true);\n }}\n role=\"button\"\n tabIndex={0}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n submitForm(true);\n }\n }}\n >\n <ul>{children}</ul>\n </div>\n {isDesktop && !withoutButton && (\n <div className=\"drv-filter-drawer-list-submit\">\n <button\n className=\"drv-button drv-button--blue\"\n type=\"button\"\n data-action=\"click->ga-filters#push\"\n data-ga-filters-event-action=\"applied_filter_category_desktop\"\n data-ga-filters-filter-name={title.toLowerCase().replaceAll(' ', '_')}\n onClick={handleButton}\n >\n View {totalCounts.count && totalCounts.count.toLocaleString('en-GB')} {isVans ? 'vans' : 'cars'}\n </button>\n </div>\n )}\n </div>\n </li>\n );\n};\n\nFilterDrawerListItem.propTypes = {\n title: PropTypes.string.isRequired,\n count: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),\n disabled: PropTypes.bool,\n isDesktop: PropTypes.bool.isRequired,\n withoutButton: PropTypes.bool,\n children: PropTypes.node.isRequired,\n hasSelectedOptions: PropTypes.bool,\n noWrap: PropTypes.bool,\n};\n\nFilterDrawerListItem.defaultProps = {\n disabled: false,\n hasSelectedOptions: false,\n count: undefined,\n withoutButton: false,\n noWrap: false,\n};\n\nexport default FilterDrawerListItem;\n","import React, { useRef } from 'react';\nimport PropTypes from 'prop-types';\nimport { useSelector } from 'react-redux';\n\nconst FilterDrawerTrigger = ({ title, open, count, isDesktop, disabled, handleClick }) => {\n const withCount = typeof count !== 'undefined';\n const buttonRef = useRef();\n\n const { theme } = useSelector((state) => state.filterControls);\n\n return (\n <button\n ref={buttonRef}\n type=\"button\"\n onClick={(e) => handleClick(e.target)}\n disabled={disabled}\n className=\"drv-filter-drawer-trigger\"\n data-action=\"ga-filters#push\"\n data-ga-filters-event-action={open ? 'closed_filter_category' : 'expanded_filter_category'}\n data-ga-filters-filter-name={title.toLowerCase().replaceAll(' ', '_')}\n >\n {title}\n {!open && withCount && !isDesktop && (\n <>\n {count !== 'Not selected' && (\n <svg\n className=\"drv-filter-drawer-trigger__check\"\n width=\"18\"\n height=\"18\"\n fill={theme === 'electric' ? '#002b49' : '#ac8c30'}\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M6.465 15.703a.83.83 0 001.156 0l9.188-9.187a.83.83 0 000-1.157l-1.125-1.125a.792.792 0 00-1.125 0l-7.5 7.5-3.531-3.5a.792.792 0 00-1.125 0L1.278 9.36a.83.83 0 000 1.157l5.187 5.187z\"\n fill=\"#000\"\n />\n <path d=\"M6.465 15.703a.83.83 0 001.156 0l9.188-9.187a.83.83 0 000-1.157l-1.125-1.125a.792.792 0 00-1.125 0l-7.5 7.5-3.531-3.5a.792.792 0 00-1.125 0L1.278 9.36a.83.83 0 000 1.157l5.187 5.187z\" />\n </svg>\n )}\n <span className=\"drv-filter-drawer-trigger__count\">({count})</span>\n </>\n )}\n </button>\n );\n};\n\nFilterDrawerTrigger.propTypes = {\n title: PropTypes.string.isRequired,\n open: PropTypes.bool,\n count: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),\n isDesktop: PropTypes.bool,\n disabled: PropTypes.bool,\n handleClick: PropTypes.func.isRequired,\n};\n\nFilterDrawerTrigger.defaultProps = {\n open: false,\n count: undefined,\n isDesktop: false,\n disabled: false,\n};\n\nexport default FilterDrawerTrigger;\n","import React from 'react';\nimport PropTypes from 'prop-types';\n\nimport FilterOption from './FilterOption';\n\nconst FilterOptionAll = ({ name, type, allText, allCount, selectedFilters, removeSelectedFilters, parentTitle }) => (\n <FilterOption\n key=\"all\"\n id={`${name}-All`}\n count={allCount !== 0 ? allCount : ''}\n type={type}\n value={allText}\n enabled\n selected={!selectedFilters[name]}\n onSelect={(event) => {\n if (event.target.checked) {\n removeSelectedFilters(name);\n }\n }}\n parentTitle={parentTitle}\n />\n);\n\nFilterOptionAll.propTypes = {\n name: PropTypes.string.isRequired,\n type: PropTypes.string.isRequired,\n allText: PropTypes.string,\n allCount: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\n selectedFilters: PropTypes.shape({}).isRequired,\n removeSelectedFilters: PropTypes.func.isRequired,\n parentTitle: PropTypes.string,\n};\n\nFilterOptionAll.defaultProps = {\n allText: 'All',\n allCount: 0,\n parentTitle: '',\n};\n\nexport default FilterOptionAll;\n","import { scrollSnapToNext, getScrollSnapPositions } from 'scroll-snap-api';\n\nexport class ScrollSnapSlider {\n constructor(slider, leftArrow, rightArrow) {\n this.slider = slider;\n this.leftArrow = leftArrow;\n this.rightArrow = rightArrow;\n\n this.addEventListeners();\n }\n\n addEventListeners() {\n this.slider.scrollTo(0, 0);\n this.slider.addEventListener('scroll', this.updateArrows.bind(this));\n\n this.leftArrow.addEventListener('click', this.arrowOnClick.bind(this, 'left'));\n this.rightArrow.addEventListener('click', this.arrowOnClick.bind(this, 'right'));\n }\n\n updateArrows() {\n const positions = getScrollSnapPositions(this.slider);\n\n const [positionsLeft, positionsRight] = this.getCoordinates(positions.x, this.slider.scrollLeft, 2);\n\n this.toggleArrows(this.leftArrow, positionsLeft.length > 0);\n this.toggleArrows(this.rightArrow, positionsRight.length > 0);\n }\n\n toggleArrows(arrow, show) {\n if (arrow) {\n arrow.classList.toggle('disabled', !show);\n }\n }\n\n arrowOnClick(direction) {\n scrollSnapToNext(this.slider, direction);\n }\n\n getCoordinates(items, midpoint, threshold) {\n const lesser = [];\n const greater = [];\n items.forEach((item) => {\n if (Math.abs(item - midpoint) <= threshold) {\n return;\n }\n if (item < midpoint) {\n lesser.push(item);\n }\n if (item > midpoint) {\n greater.push(item);\n }\n });\n return [lesser, greater];\n }\n}\n","/* eslint-disable react/jsx-props-no-spreading */\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport classnames from 'classnames';\n\nconst Button = ({ type, variant, children, classes, ...args }) => {\n const className = classnames('drv-button', `drv-button--${variant || 'primary'}`, classes);\n\n return (\n <button className={className} type={type} {...args}>\n {children}\n </button>\n );\n};\n\nButton.propTypes = {\n type: PropTypes.oneOf(['button', 'submit', 'reset']),\n children: PropTypes.node.isRequired,\n variant: PropTypes.oneOf(['primary', 'gold', 'white', 'blue', 'electric', 'electric-dark']),\n classes: PropTypes.string,\n};\n\nButton.defaultProps = {\n type: 'button',\n variant: 'primary',\n classes: '',\n};\n\nexport default Button;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport classnames from 'classnames';\n\nconst SortOption = ({ name, value, id = `${name}-${value}`, label = value, enabled, type, selected, onSelect }) => {\n return (\n <li className=\"drv-sort-option\">\n <input\n type={type}\n name={name}\n id={id}\n className={classnames('drv-checkbox', {\n 'drv-checkbox--radio': type === 'radio',\n })}\n data-action=\"ga-filters#push\"\n data-ga-filters-event-action=\"sort_applied\"\n data-ga-filters-sort-applied={label.toLowerCase().replaceAll(' ', '_')}\n value={value}\n checked={selected}\n disabled={!enabled}\n onChange={onSelect}\n />\n\n <label htmlFor={id} className=\"drv-sort-option__label drv-ml-1\">\n {label}\n </label>\n </li>\n );\n};\n\nSortOption.propTypes = {\n id: PropTypes.string.isRequired,\n name: PropTypes.string.isRequired,\n value: PropTypes.string.isRequired,\n label: PropTypes.string.isRequired,\n selected: PropTypes.bool.isRequired,\n onSelect: PropTypes.func.isRequired,\n enabled: PropTypes.bool,\n type: PropTypes.string,\n};\n\nSortOption.defaultProps = {\n enabled: true,\n type: 'checkbox',\n};\n\nexport default SortOption;\n","import React from 'react';\nimport PropTypes from 'prop-types';\n\nconst FilterList = ({ heading, isDesktop, children }) => {\n if (isDesktop) {\n return children;\n }\n return (\n <>\n {heading && <h3 className=\"drv-filter-list__heading drv-mt-4 drv-mb-4\">{heading}</h3>}\n\n <ul className=\"drv-block drv-mb-4\">{children}</ul>\n </>\n );\n};\n\nFilterList.propTypes = {\n heading: PropTypes.string,\n isDesktop: PropTypes.bool.isRequired,\n children: PropTypes.node.isRequired,\n};\n\nFilterList.defaultProps = {\n heading: '',\n};\n\nexport default FilterList;\n","import React, { useState, useRef, useEffect } from 'react';\nimport PropTypes from 'prop-types';\nimport axios from 'axios';\n\nconst ModelSearch = ({ makesPath, id }) => {\n const [state, setState] = useState({\n makes: [],\n models: [],\n });\n\n const makeRef = useRef(null);\n const modelRef = useRef(null);\n\n const getMakes = () => {\n axios\n .get('/car-leasing/bodytypes/specialist/makes.json', {\n headers: {\n 'Content-Type': 'application/json',\n Accept: 'application/json',\n },\n })\n .then((response) => {\n setState({ ...state, makes: response.data });\n });\n };\n\n const getModels = (event) => {\n axios\n .get(`/car-leasing/bodytypes/specialist/makes/${event.target.value}/model_ranges.json`, {\n headers: {\n 'Content-Type': 'application/json',\n Accept: 'application/json',\n },\n })\n .then((response) => {\n setState({ ...state, models: response.data });\n });\n };\n\n const handleSubmit = (event) => {\n event.preventDefault();\n\n let path = makesPath;\n\n if (makeRef.current.value !== '' || modelRef.current.value !== '') {\n path = `/car-leasing/${makeRef.current.value}${modelRef.current.value ? `/${modelRef.current.value}` : ''}`;\n }\n\n Turbolinks.visit(path);\n };\n\n useEffect(() => {\n getMakes();\n }, []);\n\n return (\n <>\n <div className=\"b-form-group c-search__form-group c-search__form-group--manufacturer\">\n <label className=\"sr-only\" htmlFor={`specialist-search-make-${id}`}>\n Manufacturer\n </label>\n <select\n className=\"c-search__form-control c-search__form-select\"\n name={`specialist-search-make-${id}`}\n id={`specialist-search-make-${id}`}\n onChange={(event) => getModels(event)}\n ref={makeRef}\n >\n <option value=\"\">Any make...</option>\n {state.makes.map((make) => (\n <option value={make.slug} key={make.id}>\n {make.name}\n </option>\n ))}\n </select>\n </div>\n\n <div className=\"b-form-group c-search__form-group c-search__form-group--model\">\n <label className=\"sr-only\" htmlFor={`specialist-search-model-${id}`}>\n Model\n </label>\n <select\n className=\"c-search__form-control c-search__form-select\"\n name={`specialist-search-model-${id}`}\n id={`specialist-search-model-${id}`}\n ref={modelRef}\n >\n <option value=\"\">Any model...</option>\n {state.models.map((model) => (\n <option value={model.slug} key={model.id}>\n {model.name}\n </option>\n ))}\n </select>\n </div>\n\n <div className=\"c-search__form-group c-search__form-group--submit\">\n <button className=\"c-search__button\" onClick={handleSubmit}>\n Search Cars\n </button>\n </div>\n </>\n );\n};\n\nModelSearch.propTypes = {\n makesPath: PropTypes.string.isRequired,\n id: PropTypes.string.isRequired,\n};\n\nexport default ModelSearch;\n","import React, { useState, useEffect, useRef } from 'react';\nimport PropTypes from 'prop-types';\n\nconst FilterDrawerSelectItem = ({ title, disabled, children }) => {\n const [dropdownOpen, setDropdownOpen] = useState(false);\n const dropdownRef = useRef();\n\n const handleOutsideClicks = (event) => {\n if (dropdownOpen && dropdownRef.current && !dropdownRef.current.contains(event.target)) {\n setDropdownOpen(false);\n }\n };\n\n useEffect(() => {\n document.addEventListener('mousedown', handleOutsideClicks);\n return () => {\n document.removeEventListener('mousedown', handleOutsideClicks);\n };\n }, [dropdownOpen]);\n\n const handleToggle = () => {\n setDropdownOpen(!dropdownOpen);\n };\n\n return (\n <div className=\"multiselect\" ref={dropdownRef}>\n {/* eslint-disable-next-line jsx-a11y/click-events-have-key-events */}\n <div className=\"selectBox\" onClick={handleToggle} role=\"button\" tabIndex={0}>\n <select disabled={disabled}>\n <option>{title}</option>\n </select>\n <div className=\"overSelect\" />\n </div>\n <div className=\"filter-inner\" style={{ display: dropdownOpen && !disabled ? 'block' : 'none' }}>\n <ul className=\"filter-checkboxes\">{children}</ul>\n <button className=\"drv-button drv-button--gold\" type=\"button\">\n View XX results\n </button>\n </div>\n </div>\n );\n};\n\nFilterDrawerSelectItem.propTypes = {\n title: PropTypes.string.isRequired,\n disabled: PropTypes.bool,\n children: PropTypes.node.isRequired,\n};\n\nFilterDrawerSelectItem.defaultProps = {\n disabled: false,\n};\n\nexport default FilterDrawerSelectItem;\n","import React, { useState, useEffect } from 'react';\nimport PropTypes from 'prop-types';\n\nconst ToggleCheckbox = ({\n id,\n name,\n value,\n setSingleCheckboxFilter,\n label,\n labelPosition,\n selectedFilters,\n greenToggle,\n isDesktopVersion,\n}) => {\n const [isDisabled, setIsDisabled] = useState(false);\n\n const onChange = (e) => {\n e.persist();\n setSingleCheckboxFilter(e);\n setTimeout(() => {\n e.target.closest('form').dispatchEvent(new Event('submit', { bubbles: true, cancelable: true }));\n }, 1);\n };\n\n if (!id) id = (Math.random() + 1).toString(36).substring(2);\n\n const selected = (selectedFilters[name] || []).indexOf(value) > -1 || selectedFilters[name] === value;\n\n const updateCheckboxDisabledState = () => {\n const windowWidth = window.innerWidth;\n const breakpoint = 1200;\n const isMobileView = windowWidth < breakpoint;\n\n setIsDisabled(isMobileView ? isDesktopVersion : !isDesktopVersion);\n };\n\n useEffect(() => {\n const handleResize = () => {\n updateCheckboxDisabledState();\n };\n\n handleResize();\n window.addEventListener('resize', handleResize);\n\n return () => window.removeEventListener('resize', handleResize);\n }, [isDesktopVersion]);\n\n return (\n <div className=\"c-checkbox__slider\">\n {labelPosition === 'left' && (\n <label className=\"c-checkbox__slider--label\" htmlFor={id}>\n {label}\n </label>\n )}\n {/* eslint-disable-next-line jsx-a11y/label-has-associated-control */}\n <label className=\"c-checkbox__slider--switch\">\n <input\n style={{ appearance: 'auto' }}\n type=\"checkbox\"\n id={id}\n name={name}\n value={value}\n onChange={onChange}\n checked={selected}\n disabled={isDisabled}\n />\n <span className={`c-checkbox__slider--slide ${greenToggle && 'c-checkbox__slider--slide-green'}`} />\n </label>\n {labelPosition !== 'left' && (\n <label className=\"c-checkbox__slider--label\" htmlFor={id}>\n {label}\n </label>\n )}\n </div>\n );\n};\n\nToggleCheckbox.propTypes = {\n id: PropTypes.string,\n name: PropTypes.string.isRequired,\n value: PropTypes.string.isRequired,\n setSingleCheckboxFilter: PropTypes.func.isRequired,\n selectedFilters: PropTypes.shape({}).isRequired,\n label: PropTypes.string.isRequired,\n labelPosition: PropTypes.oneOf(['left', 'right']).isRequired,\n isDesktopVersion: PropTypes.bool,\n greenToggle: PropTypes.bool,\n};\n\nToggleCheckbox.defaultProps = {\n id: null,\n greenToggle: false,\n isDesktopVersion: true,\n};\n\nexport default ToggleCheckbox;\n","/* eslint-disable react/require-default-props */\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport { useDispatch } from 'react-redux';\nimport classnames from 'classnames';\n\nconst FilterOption = ({\n name,\n value,\n count,\n id = `${name}-${value}`,\n label = value,\n prelabel,\n enabled = true,\n type = 'checkbox',\n excludeFromForm = false,\n selected,\n onSelect,\n parentTitle,\n}) => {\n const dispatch = useDispatch();\n\n const handleSelect = (event) => {\n onSelect(event);\n dispatch({ type: 'SET_FILTERS_UPDATED', payload: true });\n };\n\n const safe_id = (idToProcess) => {\n return idToProcess.toLowerCase().replace(/[^a-z0-9]/g, '-');\n };\n\n return (\n <li className=\"drv-filter-option\">\n <input\n type={type}\n name={excludeFromForm ? null : name}\n id={safe_id(id)}\n className={classnames('drv-checkbox', {\n 'drv-checkbox--radio': type === 'radio',\n })}\n data-action=\"ga-filters#push\"\n data-ga-filters-parent-title={parentTitle.toLowerCase().replaceAll(' ', '_')}\n data-ga-filters-event-action={selected ? 'selected_filter_option' : 'deselected_filter_option'}\n data-ga-filters-filter-option={value}\n value={value}\n checked={selected}\n disabled={!enabled}\n onChange={(e) => handleSelect(e)}\n />\n\n <label\n htmlFor={safe_id(id)}\n className={classnames('drv-filter-option__label drv-ml-1', {\n 'drv-filter-option__label--disabled': !enabled,\n })}\n >\n {prelabel && <span className=\"drv-filter-option__pre-label\">{prelabel}</span>} {label}{' '}\n {(count || count === 0) && (\n <span className=\"drv-filter-option__post-label drv-ml-2\">({count.toLocaleString('en-GB')})</span>\n )}\n </label>\n </li>\n );\n};\n\nFilterOption.propTypes = {\n id: PropTypes.string,\n label: PropTypes.string,\n name: PropTypes.string,\n value: PropTypes.oneOfType([PropTypes.string, PropTypes.number]).isRequired,\n count: PropTypes.oneOfType([PropTypes.string, PropTypes.number, PropTypes.oneOf([null])]),\n prelabel: PropTypes.string,\n enabled: PropTypes.bool,\n type: PropTypes.oneOf(['checkbox', 'radio']),\n excludeFromForm: PropTypes.bool,\n selected: PropTypes.bool.isRequired,\n onSelect: PropTypes.func.isRequired,\n parentTitle: PropTypes.string.isRequired,\n};\n\nexport default FilterOption;\n"],"sourceRoot":""}