{"version":3,"sources":["webpack:///./src/hooks/useFocusWithin.ts","webpack:///./src/img/icons/pin.svg","webpack:///./src/img/icons/x.svg","webpack:///./src/img/icons/tick-green.svg","webpack:///./src/stories/Components/FormFields/CheckboxSelectField/CheckboxSelectField.styles.ts","webpack:///./src/stories/Components/FormFields/CheckboxSelectField/CheckboxSelectField.tsx","webpack:///./src/stories/Components/Modals/PostcodeModal/PostcodeModal.styles.ts","webpack:///./src/stories/Components/Modals/PostcodeModal/PostcodeModal.tsx","webpack:///./src/stories/Components/APLFilters/SearchField/SearchField.styles.ts","webpack:///./src/stories/Components/APLFilters/SearchField/SearchField.tsx","webpack:///./src/stories/Components/APLFilters/APLFilters.tsx","webpack:///./src/stories/Components/APLFiltersMobile/APLFiltersMobile.styles.ts","webpack:///./src/stories/Components/APLFiltersMobile/List/FilterList.styles.ts","webpack:///./src/stories/Components/APLFiltersMobile/List/FilterList.tsx","webpack:///./src/stories/Components/APLFiltersMobile/SelectedList/SelectedList.tsx","webpack:///./src/stories/Components/Inputs/RadioBtn/RadioBtn.styles.ts","webpack:///./src/stories/Components/Inputs/RadioBtn/RadioBtn.tsx","webpack:///./src/stories/Components/APLFiltersMobile/SelectedRadioList/SelectedRadioList.tsx","webpack:///./src/stories/Components/APLFiltersMobile/APLFiltersMobile.tsx","webpack:///./src/stories/Components/APLFilteredListing/APLFilteredListing.styles.ts","webpack:///./src/stories/Components/APLFilteredListing/APLFilteredListing.tsx","webpack:///./src/stories/Widgets/Listings/AplLandscaperListing/AplLandscaperListing.styles.ts","webpack:///./src/stories/Widgets/Listings/AplLandscaperListing/AplLandscaperListing.tsx"],"names":["useFocusWithin","ref","focusWithin","setFocusWithin","React","current","addEventListener","onFocusChange","onBlur","removeEventListener","document","activeElement","isActive","contains","event","relatedTarget","_g","_extends","Object","assign","target","i","arguments","length","source","key","prototype","hasOwnProperty","call","apply","this","SvgPin","props","xmlns","viewBox","fill","stroke","strokeLinecap","strokeLinejoin","d","SvgX","strokeWidth","CheckboxSelectStyles","DropdownContainer","styled","div","cssVar","from","Device","Desktop","svgChevronDown","ActiveDropdown","fonts","sourceSansPro","regular","semiBold","Dropdown","brand","white","greyLight","DropdownItem","black","svgTickGreen","apl","greenLight","CheckboxSelect","filters","values","updateFilters","allowMulti","selectRef","useRef","activeDropdown","setActiveDropdown","useState","useEffect","handleClickOutside","dropdownTitle","title","options","find","option","value","text","createElement","S","onClick","dangerouslySetInnerHTML","__html","map","index","id","includes","e","Container","section","SitePadding","Layers","Modal","Close","button","srOnly","until","Inner","Tablet","Input","input","greyVeryLight","Heading","p","HeadingStyles","H5Styles","Intro","ParagraphStyles","RegularStyles","PostcodeModal","visible","onClose","onSubmit","searchTerm","setSearchTerm","SvgClose","placeholder","type","onChange","Button","themeOption","preventDefault","TabletLarge","Submit","green","SubmitLabel","span","SubmitIcon","SvgSearch","CloseIcon","SvgSearchClose","CloseLabel","ResultsContainer","m","ResultItem","a","light","ResultItemText","SearchField","searchResultsPlaceholder","visibleCount","onSearchTermChange","initialValue","items","data","setData","abortController","window","AbortController","undefined","async","signal","res","fetch","API_URLS","landscapersTypeahead","ok","json","fetchApi","then","abort","useApi","refContainer","refResultsContainer","refInput","showResults","useLockBodyScroll","onKeyDown","toLowerCase","nextResult","nextElementSibling","focus","firstResult","firstChild","handleArrowDown","previousResult","previousElementSibling","handleArrowUp","handleEscape","handleSubmit","AnimatePresence","initial","animate","exit","variants","hidden","opacity","transition","ease","slice","item","url","href","tabIndex","getAttribute","APLFilters","alignment","filterTheme","sortByOptions","sortByValue","professionFilters","professionValues","countyFilters","countyValues","servicesFilters","servicesValues","onFilterChange","onSortChange","noop","onPostcodeSearch","onPostcodeSubmit","showPostcodeModal","onPostcodeModalClose","postcodeValue","onClearPostcode","onClearSelected","onClearAllFilters","selectedValues","flat","theme","Title","FiltersRow","Filter","ClearFilter","stopPropagation","tempValues","newList","filter","prof","push","PostcodeSearchButton","SelectedFiltersContainer","SelectedFilters","SelectedFilterValue","icon","ClearAllSelected","setCssVar","hta","rss","grey","Open","CheckboxStyles","Overlay","Background","ItemList","hortHouse","greenAlt","Item","Arrow","Tick","Clear","CheckboxArea","CheckboxAreaLabel","RadioArea","ApplyFilters","RemoveFilters","BtnHolder","FilterBtns","AdditionalFilterBtn","ButtonReset","FilterList","onApply","onCancel","onClear","onRemove","onSelect","disabled","SvgChevronLeft","as","SvgChevronRight","selectedFilters","Checkbox","checked","name","labelText","SvgTick","RadioBtnItem","label","RadioBtnInput","RadioBtnText","SmallStyles","RadioBtn","forwardRef","className","htmlFor","otherProps","displayName","SelectedRadioList","selectedValue","APLFiltersMobile","activeFilters","setActiveFilters","activeValues","setActiveValues","setVisible","totalSelected","useScrollLock","Fragment","SelectedList","renderActiveList","SectionWrapper","FiltersStyles","APLFiltersStyles","Message","Loading","CtaWrapper","ListTitle","h2","H2Styles","FilteredListing","buttonThemeOption","error","errorText","filtersProps","flush","listTitle","loading","pageIndex","renderItems","totalItems","onPageChange","LoadingOverlay","message","renderError","renderResults","withQueryParams","filterTitle","initialData","professionFilter","countyFilter","servicesFilter","randomSeed","sustainabilityLink","isFirstMount","useFirstMountState","location","useLocation","history","useHistory","queryParams","setQueryParams","queryString","parse","search","shouldSendAPIRequest","setShouldSendAPIRequest","updateQueryParams","params","sortBy","profession","county","services","postcode","postcodeModalData","setPostcodeModalData","show","parameters","stringify","pageSize","join","apiUrl","landscapers","InnerPageHero","APLFilteredListing","val","reset","x","parseInt","MemberCard","showButton","toString"],"mappings":"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","file":"AplLandscaperListing-ff5c37c3eb5c33051296.js","sourcesContent":["import * as React from 'react';\r\nexport default function useFocusWithin(ref) {\r\n const [focusWithin, setFocusWithin] = React.useState(false);\r\n // Ensure typeahead results show when focus within container.\r\n React.useEffect(() => {\r\n ref.current?.addEventListener('focus', onFocusChange, true);\r\n ref.current?.addEventListener('blur', onBlur, true);\r\n return () => {\r\n ref.current?.removeEventListener('focus', onFocusChange);\r\n ref.current?.removeEventListener('blur', onBlur);\r\n };\r\n }, []);\r\n return focusWithin;\r\n function onFocusChange() {\r\n if (!ref.current) {\r\n return setFocusWithin(false);\r\n }\r\n if (!document.activeElement) {\r\n return setFocusWithin(false);\r\n }\r\n const isActive = ref.current.contains(document.activeElement);\r\n return setFocusWithin(isActive);\r\n }\r\n function onBlur(event) {\r\n if (!ref.current) {\r\n return setFocusWithin(false);\r\n }\r\n if (!event.relatedTarget) {\r\n return setFocusWithin(false);\r\n }\r\n const isActive = ref.current.contains(event.relatedTarget);\r\n return setFocusWithin(isActive);\r\n }\r\n}\r\n","var _g;\n\nfunction _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n\nimport * as React from \"react\";\n\nfunction SvgPin(props) {\n return /*#__PURE__*/React.createElement(\"svg\", _extends({\n xmlns: \"http://www.w3.org/2000/svg\",\n viewBox: \"0 0 19.997 29.496\"\n }, props), _g || (_g = /*#__PURE__*/React.createElement(\"g\", {\n \"data-name\": \"streamline-icon-pin@140x140\",\n fill: \"none\",\n stroke: \"currentColor\",\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\"\n }, /*#__PURE__*/React.createElement(\"path\", {\n \"data-name\": \"Path 66\",\n d: \"M5.249 9.999A4.749 4.749 0 109.998 5.25a4.749 4.749 0 00-4.749 4.749z\"\n }), /*#__PURE__*/React.createElement(\"path\", {\n \"data-name\": \"Path 67\",\n d: \"M9.999.5a9.5 9.5 0 019.5 9.5c0 4.315-6.426 15.134-8.707 18.573a.95.95 0 01-1.583 0C6.928 25.135.502 14.315.502 10a9.5 9.5 0 019.5-9.5z\"\n }))));\n}\n\nexport default __webpack_public_path__ + \"6b23b81554479f4d0b4fefe4bb6aad5e.svg\";\nexport { SvgPin as ReactComponent };","var _g;\n\nfunction _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n\nimport * as React from \"react\";\n\nfunction SvgX(props) {\n return /*#__PURE__*/React.createElement(\"svg\", _extends({\n xmlns: \"http://www.w3.org/2000/svg\",\n viewBox: \"0 0 12.121 12.121\"\n }, props), _g || (_g = /*#__PURE__*/React.createElement(\"g\", {\n \"data-name\": \"Group 33078\",\n fill: \"none\",\n stroke: \"currentColor\",\n strokeLinecap: \"round\",\n strokeWidth: 1.5\n }, /*#__PURE__*/React.createElement(\"path\", {\n \"data-name\": \"Line 172\",\n d: \"M1.061 1.061l10 10\"\n }), /*#__PURE__*/React.createElement(\"path\", {\n \"data-name\": \"Line 173\",\n d: \"M11.061 1.061l-10 10\"\n }))));\n}\n\nexport default __webpack_public_path__ + \"451f3d8f9677560bc626e802619118fd.svg\";\nexport { SvgX as ReactComponent };","var _path;\n\nfunction _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n\nimport * as React from \"react\";\n\nfunction SvgTickGreen(props) {\n return /*#__PURE__*/React.createElement(\"svg\", _extends({\n xmlns: \"http://www.w3.org/2000/svg\",\n width: 17.15,\n height: 12.469\n }, props), _path || (_path = /*#__PURE__*/React.createElement(\"path\", {\n \"data-name\": \"Path 767\",\n d: \"M.707 5.664l5.391 5.391L16.444.707\",\n fill: \"none\",\n stroke: \"#7bb945\",\n strokeWidth: 2\n })));\n}\n\nexport default __webpack_public_path__ + \"892452978d4e295c40217e5f30c151ef.svg\";\nexport { SvgTickGreen as ReactComponent };","import brand from '@helpers/brand';\r\nimport { cssVar } from '@helpers/cssVar';\r\nimport fonts from '@helpers/fonts';\r\nimport { Device, from } from '@helpers/media';\r\nimport svgChevronDown from '@img/icons/chevron-down.svg';\r\nimport svgTickGreen from '@img/icons/tick-green.svg';\r\nimport styled from 'styled-components';\r\nconst DropdownContainer = styled.div `\r\n display: flex;\r\n align-items: center;\r\n appearance: none;\r\n border: 1px solid ${cssVar('fgColor')};\r\n border-radius: 9px;\r\n color: ${cssVar('fgColor')};\r\n height: 48px;\r\n width: 100%;\r\n position: relative;\r\n cursor: pointer;\r\n\r\n &[aria-current='true'] {\r\n border-radius: 9px 9px 0 0;\r\n\r\n &::after {\r\n transform: rotate(180deg);\r\n }\r\n }\r\n\r\n @media ${from(Device.Desktop)} {\r\n background-position: center right 18px;\r\n }\r\n\r\n &::after {\r\n content: '';\r\n position: absolute;\r\n right: 0;\r\n top: 0;\r\n height: 48px;\r\n width: 42px;\r\n background: transparent url('${svgChevronDown}') no-repeat;\r\n background-position: center;\r\n background-size: 16px 8px;\r\n transition: transform 0.33s ease;\r\n }\r\n`;\r\nconst ActiveDropdown = styled.div `\r\n ${fonts.sourceSansPro.regular};\r\n padding: 0 30px 0 12px;\r\n font-size: 16px;\r\n line-height: 20px;\r\n overflow: hidden;\r\n white-space: nowrap;\r\n text-overflow: ellipsis;\r\n\r\n @media ${from(Device.Desktop)} {\r\n font-size: 20px;\r\n line-height: 24px;\r\n padding: 0 42px 0 24px;\r\n }\r\n\r\n strong {\r\n ${fonts.sourceSansPro.semiBold};\r\n }\r\n`;\r\nconst Dropdown = styled.div `\r\n display: none;\r\n position: absolute;\r\n top: 100%;\r\n left: -1px;\r\n width: calc(100% + 2px);\r\n z-index: 2;\r\n max-height: 300px;\r\n overflow-y: auto;\r\n background-color: ${brand.white};\r\n border: 1px solid ${brand.greyLight};\r\n\r\n &[aria-current='true'] {\r\n display: block;\r\n }\r\n`;\r\nconst DropdownItem = styled.div `\r\n display: flex;\r\n align-items: center;\r\n border-bottom: 1px solid ${brand.greyLight};\r\n padding: 12px;\r\n ${fonts.sourceSansPro.regular};\r\n font-size: 16px;\r\n line-height: 20px;\r\n position: relative;\r\n min-height: 48px;\r\n transition: background-color 0.3s ease-in-out;\r\n\r\n @media ${from(Device.Desktop)} {\r\n font-size: 20px;\r\n line-height: 24px;\r\n padding: 12px 24px;\r\n }\r\n\r\n &[aria-multi='true'] {\r\n padding-left: 48px;\r\n\r\n &:before {\r\n content: '';\r\n position: absolute;\r\n left: 10px;\r\n top: 50%;\r\n transform: translateY(-50%);\r\n border: 1px solid ${brand.black};\r\n width: 24px;\r\n height: 24px;\r\n }\r\n }\r\n\r\n &[aria-current='true'][aria-multi='true'] {\r\n background-color: ${brand.white};\r\n\r\n &:before {\r\n background: transparent url('${svgTickGreen}') no-repeat;\r\n background-position: center center;\r\n background-size: 17px 12px;\r\n }\r\n }\r\n\r\n &:hover,\r\n &[aria-current='true'],\r\n &[aria-current='true'][aria-multi='true']:hover {\r\n background-color: ${brand.apl.greenLight};\r\n }\r\n`;\r\nexport const CheckboxSelectStyles = {\r\n DropdownContainer,\r\n ActiveDropdown,\r\n Dropdown,\r\n DropdownItem,\r\n};\r\n","import React, { useEffect, useRef, useState } from 'react';\r\nimport { CheckboxSelectStyles as S } from './CheckboxSelectField.styles';\r\nconst CheckboxSelect = ({ filters, values, updateFilters, allowMulti = false, }) => {\r\n const selectRef = useRef(null);\r\n const [activeDropdown, setActiveDropdown] = useState(false);\r\n useEffect(() => {\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n function handleClickOutside(event) {\r\n if (selectRef.current && !selectRef.current.contains(event.target)) {\r\n setActiveDropdown(false);\r\n }\r\n }\r\n document.addEventListener('mousedown', handleClickOutside);\r\n return () => {\r\n document.removeEventListener('mousedown', handleClickOutside);\r\n };\r\n }, [selectRef]);\r\n const dropdownTitle = !allowMulti && values?.length === 1\r\n ? `${filters.title}: ${filters.options.find((option) => option.value === values[0])?.text}`\r\n : filters.title;\r\n return (React.createElement(S.DropdownContainer, { \"aria-current\": activeDropdown, onClick: () => setActiveDropdown(!activeDropdown), ref: selectRef },\r\n React.createElement(S.ActiveDropdown, { dangerouslySetInnerHTML: { __html: dropdownTitle } }),\r\n React.createElement(S.Dropdown, { \"aria-current\": activeDropdown }, filters.options.map((option, index) => (React.createElement(S.DropdownItem, { key: `${option.id}-${index}`, \"aria-current\": values?.includes(option.value), \"aria-multi\": allowMulti, onClick: (e) => {\r\n updateFilters(filters.key, option.value, e);\r\n if (!allowMulti) {\r\n setActiveDropdown(false);\r\n }\r\n } }, option.text))))));\r\n};\r\nexport default CheckboxSelect;\r\n","import brand from '@helpers/brand';\r\nimport srOnly from '@helpers/srOnly';\r\nimport { Layers } from '@helpers/layers';\r\nimport { Device, until, from } from '@helpers/media';\r\nimport { SitePadding } from '@stories/Components/Global/SiteWide/SiteWide.styles';\r\nimport ParagraphStyles from '@stories/Components/Global/Typography/Paragraph.styles';\r\nimport HeadingStyles from '@stories/Components/Global/Typography/Heading.styles';\r\nimport styled from 'styled-components';\r\nconst Container = styled.section `\r\n position: fixed;\r\n top: 0;\r\n left: 0;\r\n display: grid;\r\n align-items: center;\r\n background: rgba(0, 0, 0, 0.75);\r\n height: 100%;\r\n justify-content: center;\r\n padding: 0 ${SitePadding}px;\r\n width: 100%;\r\n z-index: ${Layers.Modal};\r\n`;\r\nconst Close = styled.button `\r\n position: absolute;\r\n top: -35px;\r\n left: -5px;\r\n display: block;\r\n background: none;\r\n border: 0;\r\n transform: scale(1);\r\n transition: transform 0.1s ease-out;\r\n\r\n > svg {\r\n display: block;\r\n height: 20px;\r\n width: 20px;\r\n }\r\n\r\n > span {\r\n ${srOnly}\r\n }\r\n\r\n &:focus,\r\n &:hover {\r\n transform: scale(1.2);\r\n }\r\n\r\n @media ${until(Device.Desktop)} {\r\n > svg {\r\n color: ${brand.white};\r\n }\r\n }\r\n\r\n @media ${from(Device.Desktop)} {\r\n top: 20px;\r\n left: auto;\r\n right: 20px;\r\n\r\n > svg {\r\n width: 15px;\r\n height: 15px;\r\n }\r\n }\r\n`;\r\nconst Inner = styled.div `\r\n position: relative;\r\n background: ${brand.white};\r\n margin-top: 30px;\r\n height: calc(100% - 70px);\r\n padding: 32px 16px;\r\n width: 100%;\r\n text-align: center;\r\n\r\n @media ${from(Device.Tablet)} {\r\n max-height: 500px;\r\n max-width: 400px;\r\n }\r\n\r\n @media ${from(Device.Desktop)} {\r\n padding: 64px 32px;\r\n }\r\n`;\r\nconst Input = styled.input `\r\n display: block;\r\n flex: 1 1 auto;\r\n width: 100%;\r\n background: ${brand.greyVeryLight};\r\n border: 1px solid ${brand.black};\r\n border-radius: 9px;\r\n color: ${brand.black};\r\n font-size: 16px;\r\n line-height: 24px;\r\n outline: none;\r\n padding: 9px 14px;\r\n transition: border-color 0.15s ease-out;\r\n margin-bottom: 24px;\r\n`;\r\nconst Heading = styled.p `\r\n ${HeadingStyles.H5Styles}\r\n`;\r\nconst Intro = styled.p `\r\n ${ParagraphStyles.RegularStyles}\r\n\r\n margin-bottom: 24px;\r\n`;\r\nexport default {\r\n Container,\r\n Close,\r\n Inner,\r\n Input,\r\n Heading,\r\n Intro,\r\n};\r\n","import * as React from 'react';\r\nimport { ReactComponent as SvgClose } from '@img/icons/close.svg';\r\nimport S from './PostcodeModal.styles';\r\nimport Button from '@stories/Components/Buttons/Button/Button';\r\nconst PostcodeModal = ({ visible, onClose, onSubmit }) => {\r\n const [searchTerm, setSearchTerm] = React.useState('');\r\n if (!visible) {\r\n return null;\r\n }\r\n return (React.createElement(S.Container, null,\r\n React.createElement(S.Inner, null,\r\n React.createElement(S.Close, { onClick: onClose },\r\n React.createElement(SvgClose, { \"aria-hidden\": true }),\r\n React.createElement(\"span\", null, \"Close\")),\r\n React.createElement(S.Heading, null, \"Postcode Filter\"),\r\n React.createElement(S.Intro, null, \"In order to help us find the landscapers closest to you, please input your postcode:\"),\r\n React.createElement(S.Input, { placeholder: \"Postcode\", type: \"search\", value: searchTerm, onChange: (event) => {\r\n setSearchTerm(event.target.value);\r\n } }),\r\n React.createElement(Button, { themeOption: 'aplGreen', title: \"Sort Results\", type: \"submit\", onClick: (e) => {\r\n e.preventDefault();\r\n onSubmit(searchTerm);\r\n setSearchTerm('');\r\n } }))));\r\n};\r\nexport default PostcodeModal;\r\n","import brand from '@helpers/brand';\r\nimport fonts from '@helpers/fonts';\r\nimport { Device, from, until } from '@helpers/media';\r\nimport srOnly from '@helpers/srOnly';\r\nimport { ReactComponent as SvgSearchClose } from '@img/icons/close.svg';\r\nimport { ReactComponent as SvgSearch } from '@img/icons/search.svg';\r\nimport { m } from 'framer-motion';\r\nimport styled from 'styled-components';\r\nconst Container = styled.div `\r\n max-width: 400px;\r\n\r\n @media ${until(Device.TabletLarge)} {\r\n display: none;\r\n background: ${brand.greyVeryLight};\r\n height: 66px;\r\n padding: 8px 10px;\r\n width: 100%;\r\n position: absolute;\r\n top: 0;\r\n left: 0;\r\n z-index: 2;\r\n }\r\n\r\n @media ${from(Device.TabletLarge)} {\r\n position: relative;\r\n padding-top: 0;\r\n }\r\n`;\r\nconst Inner = styled.div `\r\n position: relative;\r\n display: flex;\r\n\r\n @media ${from(Device.TabletLarge)} {\r\n display: block;\r\n }\r\n`;\r\nconst Input = styled.input `\r\n display: block;\r\n flex: 1 1 auto;\r\n width: 100%;\r\n background: ${brand.greyVeryLight};\r\n border: 1px solid ${brand.black};\r\n border-radius: 9px;\r\n color: ${brand.black};\r\n font-size: 16px;\r\n line-height: 30px;\r\n outline: none;\r\n padding: 8px 50px 8px 14px;\r\n transition: border-color 0.15s ease-out;\r\n\r\n &:focus {\r\n outline: none;\r\n }\r\n\r\n &.focus-visible {\r\n border-color: ${brand.black};\r\n }\r\n`;\r\nconst Submit = styled.button `\r\n position: absolute;\r\n right: 1px;\r\n top: 1px;\r\n display: flex;\r\n align-content: center;\r\n align-items: center;\r\n background-color: ${brand.apl.green};\r\n border: none;\r\n color: ${brand.white};\r\n flex: 0 0 45px;\r\n height: 46px;\r\n padding: 10px;\r\n justify-content: center;\r\n justify-items: center;\r\n width: 46px;\r\n border-radius: 9px;\r\n\r\n &:focus {\r\n outline: none;\r\n }\r\n`;\r\nconst SubmitLabel = styled.span `\r\n ${srOnly}\r\n`;\r\nconst SubmitIcon = styled(SvgSearch) `\r\n display: block;\r\n color: currentColor;\r\n height: 26px;\r\n width: 26px;\r\n transition: color 0.3s;\r\n\r\n @media ${from(Device.TabletLarge)} {\r\n height: 18px;\r\n width: 18px;\r\n }\r\n`;\r\nconst Close = styled.button `\r\n display: flex;\r\n align-content: center;\r\n align-items: center;\r\n background: none;\r\n border: none;\r\n color: ${brand.white};\r\n flex: 0 0 45px;\r\n height: 50px;\r\n margin: 0 0 0 16px;\r\n padding: 0;\r\n justify-content: center;\r\n justify-items: center;\r\n width: 45px;\r\n\r\n &:focus {\r\n outline: none;\r\n }\r\n\r\n @media ${from(Device.TabletLarge)} {\r\n display: none;\r\n }\r\n`;\r\nconst CloseIcon = styled(SvgSearchClose) `\r\n display: block;\r\n color: currentColor;\r\n height: 23px;\r\n width: 23px;\r\n`;\r\nconst CloseLabel = styled.span `\r\n ${srOnly}\r\n`;\r\nconst ResultsContainer = styled(m.div) `\r\n position: absolute;\r\n top: 100%;\r\n left: 0;\r\n background: ${brand.greyVeryLight};\r\n box-shadow: 0px 2px 3px 0px rgba(0, 0, 0, 0.2);\r\n max-height: 410px;\r\n width: 100%;\r\n z-index: 3;\r\n\r\n @media ${until(Device.TabletLarge)} {\r\n height: calc(100vh - 65px);\r\n max-height: none;\r\n }\r\n`;\r\nconst ResultItem = styled.a `\r\n ${fonts.sourceSansPro.light}\r\n position: relative;\r\n display: flex;\r\n align-items: center;\r\n color: ${brand.black};\r\n height: 45px;\r\n font-size: 18px;\r\n line-height: 23px;\r\n overflow: hidden;\r\n padding: 0 10px 0 50px;\r\n text-decoration: none;\r\n text-indent: 4px;\r\n white-space: nowrap;\r\n\r\n &:focus,\r\n &:hover {\r\n color: ${brand.black};\r\n text-decoration: underline;\r\n\r\n ${() => ResultItemText} {\r\n transform: translate3d(10px, 0, 0.1px);\r\n }\r\n }\r\n\r\n &::after {\r\n content: '';\r\n position: absolute;\r\n bottom: 0;\r\n left: 0;\r\n display: block;\r\n border-bottom: 1px solid ${brand.greyVeryLight};\r\n margin: 0 10px;\r\n width: 100%;\r\n }\r\n\r\n &:last-child::after {\r\n content: none;\r\n }\r\n`;\r\nconst ResultItemText = styled.span `\r\n overflow: hidden;\r\n text-overflow: ellipsis;\r\n transform: translate3d(0, 0, 0.1px);\r\n transition: transform ease-out 0.15s;\r\n`;\r\nexport default {\r\n Close,\r\n CloseIcon,\r\n CloseLabel,\r\n Container,\r\n Inner,\r\n Input,\r\n ResultItem,\r\n ResultItemText,\r\n ResultsContainer,\r\n Submit,\r\n SubmitIcon,\r\n SubmitLabel,\r\n};\r\n","import { API_URLS } from '@helpers/api';\r\nimport useFocusWithin from '@hooks/useFocusWithin';\r\nimport { AnimatePresence } from 'framer-motion';\r\nimport * as React from 'react';\r\nimport { useLockBodyScroll } from 'react-use';\r\nimport S from './SearchField.styles';\r\nconst SearchField = ({ searchResultsPlaceholder, visibleCount = 9, onSearchTermChange, initialValue, }) => {\r\n const [searchTerm, setSearchTerm] = React.useState(initialValue);\r\n const items = useApi(searchTerm);\r\n // used when term is cleared\r\n React.useEffect(() => {\r\n setSearchTerm(initialValue);\r\n }, [initialValue]);\r\n const refContainer = React.useRef(null);\r\n const refResultsContainer = React.useRef(null);\r\n const refInput = React.useRef(null);\r\n const showResults = useFocusWithin(refContainer);\r\n useLockBodyScroll(showResults && !!items.length);\r\n return (React.createElement(S.Container, { ref: refContainer, showResults: showResults && !!items.length, onKeyDown: (event) => {\r\n if (event.key.toLowerCase() === 'arrowdown') {\r\n handleArrowDown(event);\r\n }\r\n if (event.key.toLowerCase() === 'arrowup') {\r\n handleArrowUp(event);\r\n }\r\n if (event.key.toLowerCase() === 'escape') {\r\n handleEscape(event);\r\n }\r\n if (event.key.toLowerCase() === 'enter') {\r\n handleSubmit(event);\r\n }\r\n } },\r\n React.createElement(S.Inner, null,\r\n React.createElement(S.Input, { ref: refInput, placeholder: searchResultsPlaceholder, type: \"search\", value: searchTerm, onChange: (event) => {\r\n setSearchTerm(event.target.value);\r\n } }),\r\n React.createElement(S.Submit, { type: \"submit\", onClick: handleSubmit },\r\n React.createElement(S.SubmitLabel, null, \"Search\"),\r\n React.createElement(S.SubmitIcon, null)),\r\n React.createElement(AnimatePresence, null, showResults && !!items?.length && (React.createElement(S.ResultsContainer, { ref: refResultsContainer, initial: 'hidden', animate: 'visible', exit: 'hidden', variants: {\r\n hidden: {\r\n opacity: 0,\r\n transition: { type: 'tween', ease: 'easeOut' },\r\n },\r\n visible: {\r\n opacity: 1,\r\n transition: { type: 'tween', ease: 'easeOut' },\r\n },\r\n } }, items?.slice(0, visibleCount).map((item) => (React.createElement(S.ResultItem, { key: item.url, href: item.url, tabIndex: -1, \"data-value\": item.value },\r\n React.createElement(S.ResultItemText, null, item.value))))))))));\r\n function handleArrowDown(event) {\r\n event.preventDefault();\r\n if (showResults) {\r\n const resultSelected = refResultsContainer.current?.contains(document.activeElement);\r\n if (resultSelected) {\r\n const nextResult = document.activeElement?.nextElementSibling;\r\n if (nextResult) {\r\n nextResult.focus();\r\n }\r\n }\r\n else {\r\n const firstResult = refResultsContainer.current?.firstChild;\r\n if (firstResult) {\r\n firstResult.focus();\r\n }\r\n }\r\n }\r\n }\r\n function handleArrowUp(event) {\r\n event.preventDefault();\r\n if (showResults) {\r\n const resultSelected = refResultsContainer.current?.contains(document.activeElement);\r\n if (resultSelected) {\r\n const previousResult = document.activeElement?.previousElementSibling;\r\n if (previousResult) {\r\n previousResult.focus();\r\n }\r\n }\r\n }\r\n }\r\n function handleEscape(event) {\r\n event.preventDefault();\r\n if (showResults) {\r\n const resultSelected = refResultsContainer.current?.contains(document.activeElement);\r\n if (resultSelected) {\r\n refInput.current?.focus();\r\n }\r\n }\r\n }\r\n function handleSubmit(event) {\r\n event.preventDefault();\r\n if (showResults) {\r\n const resultSelected = refResultsContainer.current?.contains(document.activeElement);\r\n if (resultSelected) {\r\n if (document.activeElement?.getAttribute('data-value')) {\r\n onSearchTermChange(document.activeElement?.getAttribute('data-value'));\r\n }\r\n }\r\n else {\r\n onSearchTermChange(searchTerm);\r\n }\r\n }\r\n }\r\n};\r\nexport default SearchField;\r\n/** Use typeahead results for search term. */\r\nfunction useApi(searchTerm) {\r\n const [data, setData] = React.useState([]);\r\n React.useEffect(() => {\r\n if (!searchTerm || searchTerm.length < 3) {\r\n return setData([]);\r\n }\r\n // Check for AbortController support (ie11).\r\n const abortController = window.AbortController ? new AbortController() : undefined;\r\n fetchApi(searchTerm, abortController?.signal).then((data) => setData(data));\r\n return function cancel() {\r\n abortController?.abort();\r\n };\r\n }, [searchTerm]);\r\n return data;\r\n}\r\n/** Call typeahead API endpoint. */\r\nasync function fetchApi(searchTerm, signal) {\r\n const res = await fetch(`${API_URLS.landscapersTypeahead}?query=${searchTerm}`, { signal });\r\n if (!res.ok) {\r\n return [];\r\n }\r\n const data = await res.json();\r\n if (!data) {\r\n return [];\r\n }\r\n return data;\r\n}\r\n","import { ReactComponent as SvgPin } from '@img/icons/pin.svg';\r\nimport { ReactComponent as SvgX } from '@img/icons/x.svg';\r\nimport noop from 'lodash/noop';\r\nimport React from 'react';\r\nimport CheckboxSelect from '../FormFields/CheckboxSelectField/CheckboxSelectField';\r\nimport PostcodeModal from '../Modals/PostcodeModal/PostcodeModal';\r\nimport S from './APLFilters.styles';\r\nimport SearchField from './SearchField/SearchField';\r\nconst APLFilters = ({ alignment = 'center', filterTheme = 'lightGrey', sortByOptions, sortByValue, title, professionFilters, professionValues, countyFilters, countyValues, servicesFilters, servicesValues, onFilterChange, onSearchTermChange, searchTerm, onSortChange = noop, onPostcodeSearch = noop, onPostcodeSubmit = noop, showPostcodeModal = false, onPostcodeModalClose = noop, postcodeValue, onClearPostcode = noop, onClearSelected = noop, onClearAllFilters = noop, }) => {\r\n const selectedValues = [professionValues, countyValues, servicesValues].flat();\r\n function updateProfessionFilters(key, value, e) {\r\n e.stopPropagation();\r\n if (professionValues && onFilterChange) {\r\n const tempValues = professionValues;\r\n if (!tempValues.includes(value)) {\r\n tempValues.push(value);\r\n onFilterChange(key, tempValues);\r\n }\r\n else {\r\n const newList = tempValues.filter((prof) => prof !== value);\r\n onFilterChange(key, newList);\r\n }\r\n }\r\n }\r\n function updateCountyFilters(key, value, e) {\r\n e.stopPropagation();\r\n if (countyValues && onFilterChange) {\r\n const tempValues = countyValues;\r\n if (!tempValues.includes(value)) {\r\n tempValues.push(value);\r\n onFilterChange(key, tempValues);\r\n }\r\n else {\r\n const newList = tempValues.filter((prof) => prof !== value);\r\n onFilterChange(key, newList);\r\n }\r\n }\r\n }\r\n function updateServicesFilters(key, value, e) {\r\n e.stopPropagation();\r\n if (servicesValues && onFilterChange) {\r\n const tempValues = servicesValues;\r\n if (!tempValues.includes(value)) {\r\n tempValues.push(value);\r\n onFilterChange(key, tempValues);\r\n }\r\n else {\r\n const newList = tempValues.filter((prof) => prof !== value);\r\n onFilterChange(key, newList);\r\n }\r\n }\r\n }\r\n function updateSortByFilter(key, value, e) {\r\n e.stopPropagation();\r\n onSortChange(value);\r\n }\r\n return (React.createElement(S.Container, { theme: filterTheme },\r\n title && React.createElement(S.Title, null, title),\r\n React.createElement(S.FiltersRow, { alignment: alignment },\r\n React.createElement(S.Filter, null,\r\n React.createElement(SearchField, { onSearchTermChange: onSearchTermChange, searchResultsPlaceholder: 'Search by member nameā€¦', initialValue: searchTerm }),\r\n searchTerm !== '' ? (React.createElement(S.ClearFilter, null,\r\n React.createElement(\"button\", { onClick: () => onSearchTermChange('') }, \"clear search\"))) : null),\r\n React.createElement(S.Filter, null,\r\n React.createElement(CheckboxSelect, { filters: professionFilters, values: professionValues, updateFilters: updateProfessionFilters, allowMulti: true }),\r\n professionValues?.length ? (React.createElement(S.ClearFilter, null,\r\n React.createElement(\"button\", { onClick: () => onFilterChange(professionFilters.key, []) }, \"clear filter\"))) : null),\r\n React.createElement(S.Filter, null,\r\n React.createElement(CheckboxSelect, { filters: countyFilters, values: countyValues, updateFilters: updateCountyFilters, allowMulti: true }),\r\n countyValues?.length ? (React.createElement(S.ClearFilter, null,\r\n React.createElement(\"button\", { onClick: () => onFilterChange(countyFilters.key, []) }, \"clear filter\"))) : null),\r\n React.createElement(S.Filter, null,\r\n React.createElement(CheckboxSelect, { filters: servicesFilters, values: servicesValues, updateFilters: updateServicesFilters, allowMulti: true }),\r\n servicesValues?.length ? (React.createElement(S.ClearFilter, null,\r\n React.createElement(\"button\", { onClick: () => onFilterChange(servicesFilters.key, []) }, \"clear filter\"))) : null),\r\n React.createElement(S.Filter, null,\r\n React.createElement(S.PostcodeSearchButton, { onClick: onPostcodeSearch },\r\n React.createElement(SvgPin, null),\r\n \" \",\r\n React.createElement(\"strong\", null, \"Postcode:\"),\r\n \" \",\r\n postcodeValue ? postcodeValue : 'Search'),\r\n postcodeValue && (React.createElement(S.ClearFilter, null,\r\n React.createElement(\"button\", { onClick: () => onClearPostcode(false), title: \"Edit\" }, postcodeValue),\r\n React.createElement(\"button\", { onClick: () => onClearPostcode(true), title: \"Clear Filter\" }, \"\\u00D7\")))),\r\n sortByOptions && (React.createElement(S.Filter, null,\r\n React.createElement(CheckboxSelect, { filters: { key: 'sortBy', options: sortByOptions, title: 'Sort by' }, values: [sortByValue], updateFilters: updateSortByFilter })))),\r\n React.createElement(PostcodeModal, { visible: showPostcodeModal, onClose: onPostcodeModalClose, onSubmit: onPostcodeSubmit }),\r\n selectedValues.length > 0 ? (React.createElement(S.SelectedFiltersContainer, null,\r\n React.createElement(S.Title, null, \"Selected Filters\"),\r\n React.createElement(S.SelectedFilters, null,\r\n selectedValues.map((value) => (React.createElement(S.SelectedFilterValue, { key: `selected-filter-option-${value}`, themeOption: \"aplGreenLight\", title: value, icon: SvgX, onClick: () => onClearSelected(value) }))),\r\n selectedValues.length > 1 && (React.createElement(S.ClearAllSelected, { themeOption: \"blackOutline\", title: \"Clear All\", icon: SvgX, onClick: onClearAllFilters }))))) : null));\r\n};\r\nexport default APLFilters;\r\n","import brand from '@helpers/brand';\r\nimport { cssVar, setCssVar } from '@helpers/cssVar';\r\nimport fonts from '@helpers/fonts';\r\nimport { Layers } from '@helpers/layers';\r\nimport { Device, from } from '@helpers/media';\r\nimport srOnly from '@helpers/srOnly';\r\nimport styled from 'styled-components';\r\nimport CheckboxStyles from '../Inputs/Checkbox/Checkbox.styles';\r\nconst Container = styled.section `\r\n ${setCssVar('accentColor', brand.hta.green)};\r\n ${setCssVar('bgColor', brand.greyVeryLight)};\r\n ${setCssVar('bgColorAlt', brand.white)};\r\n ${setCssVar('fgColor', brand.black)};\r\n\r\n .theme-rss & {\r\n ${setCssVar('accentColor', brand.rss.green)};\r\n ${setCssVar('bgColor', brand.rss.grey)};\r\n ${setCssVar('bgColorAlt', brand.white)};\r\n ${setCssVar('fgColor', brand.white)};\r\n }\r\n\r\n .theme-apl & {\r\n ${setCssVar('accentColor', brand.apl.green)};\r\n ${setCssVar('bgColor', brand.greyVeryLight)};\r\n ${setCssVar('bgColorAlt', brand.white)};\r\n ${setCssVar('fgColor', brand.black)};\r\n }\r\n\r\n .theme-rss & {\r\n ${setCssVar('accentColor', brand.rss.green)};\r\n ${setCssVar('bgColor', brand.rss.grey)};\r\n ${setCssVar('bgColorAlt', brand.white)};\r\n ${setCssVar('fgColor', brand.white)};\r\n }\r\n\r\n display: flex;\r\n flex-wrap: wrap;\r\n margin: 22px 0;\r\n\r\n @media ${from(Device.TabletLarge)} {\r\n display: none;\r\n }\r\n`;\r\nconst Open = styled.button `\r\n display: flex;\r\n align-items: center;\r\n background: none;\r\n border: 1px solid ${brand.black};\r\n border-radius: 11px;\r\n color: ${brand.black};\r\n height: 48px;\r\n padding: 0 16px;\r\n\r\n .theme-rss & {\r\n border: 1px solid ${cssVar('fgColor')};\r\n color: ${cssVar('fgColor')};\r\n }\r\n\r\n > svg {\r\n display: block;\r\n height: 14px;\r\n margin-left: 16px;\r\n width: 14px;\r\n }\r\n\r\n > span {\r\n ${fonts.sourceSansPro.regular};\r\n font-size: 20px;\r\n line-height: 32px;\r\n\r\n strong {\r\n color: ${brand.grey};\r\n ${fonts.sourceSansPro.semiBold};\r\n }\r\n }\r\n\r\n ${CheckboxStyles.Container} {\r\n margin-left: 0;\r\n }\r\n`;\r\nconst Overlay = styled.div `\r\n position: fixed;\r\n top: 0;\r\n right: 0;\r\n background: ${brand.white};\r\n height: 100dvh;\r\n overflow: auto;\r\n transform: translateX(100vw);\r\n transition: transform 0.3s ease-out;\r\n width: calc(100% - 48px);\r\n z-index: ${Layers.Modal};\r\n\r\n .theme-rss & {\r\n background: ${cssVar('bgColor')};\r\n }\r\n\r\n [aria-active='true'] & {\r\n transform: translateX(0vw);\r\n }\r\n`;\r\nconst Close = styled.button `\r\n position: absolute;\r\n top: 0;\r\n left: 0;\r\n display: flex;\r\n align-items: center;\r\n background: none;\r\n border: 0;\r\n color: ${brand.white};\r\n height: 48px;\r\n justify-content: center;\r\n margin: 0;\r\n padding: 0;\r\n transform: translateX(-100%);\r\n width: 48px;\r\n\r\n > svg {\r\n display: block;\r\n height: 20px;\r\n width: 20px;\r\n }\r\n\r\n > span {\r\n ${srOnly};\r\n }\r\n`;\r\nconst Background = styled.div `\r\n position: fixed;\r\n top: 0;\r\n right: 0;\r\n background: ${brand.black};\r\n height: 100%;\r\n opacity: 0;\r\n pointer-events: none;\r\n transition: opacity 0.3s ease-out;\r\n width: 100%;\r\n z-index: ${Layers.Modal - 1};\r\n\r\n [aria-active='true'] & {\r\n opacity: 0.85;\r\n pointer-events: all;\r\n }\r\n`;\r\nconst SelectedFilters = styled.div `\r\n flex: 1 0 100%;\r\n`;\r\nexport default {\r\n Background,\r\n Close,\r\n Container,\r\n Open,\r\n Overlay,\r\n SelectedFilters,\r\n};\r\n","import brand from '@helpers/brand';\r\nimport { cssVar, setCssVar } from '@helpers/cssVar';\r\nimport fonts from '@helpers/fonts';\r\nimport { ButtonReset } from '@helpers/global';\r\nimport { Device, from } from '@helpers/media';\r\nimport svgTickGreen from '@img/icons/tick-green.svg';\r\nimport Button from '@stories/Components/Buttons/Button/Button';\r\nimport styled from 'styled-components';\r\nconst ItemList = styled.div `\r\n ${setCssVar('accentColor', brand.hta.green)};\r\n ${setCssVar('bgColor', brand.hta.green)};\r\n ${setCssVar('bgColorAlt', brand.hta.greenLight)};\r\n ${setCssVar('fgColor', brand.white)};\r\n\r\n .theme-hh & {\r\n ${setCssVar('accentColor', brand.hortHouse.green)};\r\n ${setCssVar('fgColor', brand.black)};\r\n ${setCssVar('bgColor', brand.hortHouse.green)};\r\n ${setCssVar('bgColorAlt', brand.hortHouse.greenLight)};\r\n }\r\n\r\n .theme-apl & {\r\n ${setCssVar('accentColor', brand.apl.green)};\r\n ${setCssVar('fgColor', brand.black)};\r\n ${setCssVar('bgColor', brand.apl.greenAlt)};\r\n ${setCssVar('bgColorAlt', brand.apl.greenLight)};\r\n }\r\n\r\n .theme-rss & {\r\n ${setCssVar('accentColor', brand.rss.green)};\r\n ${setCssVar('fgColor', brand.white)};\r\n ${setCssVar('bgColor', brand.greyVeryLight)};\r\n ${setCssVar('bgColorAlt', brand.rss.greenLight)};\r\n }\r\n\r\n display: flex;\r\n flex-direction: column;\r\n min-height: 100%;\r\n`;\r\nconst Title = styled.button `\r\n display: flex;\r\n align-items: center;\r\n background: none;\r\n border: 0;\r\n ${fonts.sourceSansPro.semiBold};\r\n font-size: 18px;\r\n line-height: 24px;\r\n padding: 12px 24px;\r\n margin-bottom: 12px;\r\n\r\n .theme-rss & {\r\n color: ${cssVar('fgColor')};\r\n }\r\n\r\n > svg {\r\n display: block;\r\n height: 16px;\r\n margin-right: 12px;\r\n width: 16px;\r\n }\r\n`;\r\nconst Item = styled.button `\r\n display: flex;\r\n align-items: center;\r\n background: none;\r\n border: 0;\r\n ${fonts.sourceSansPro.regular};\r\n font-size: 18px;\r\n line-height: 24px;\r\n padding: 12px 24px;\r\n\r\n .theme-rss & {\r\n color: ${cssVar('fgColor')};\r\n }\r\n\r\n &[data-selected='true'] {\r\n ${fonts.sourceSansPro.semiBold};\r\n }\r\n\r\n &[data-postcode='true'] {\r\n position: relative;\r\n z-index: 1;\r\n flex-direction: column;\r\n width: 100%;\r\n }\r\n\r\n span > span {\r\n width: 25px;\r\n height: 25px;\r\n ${fonts.sourceSansPro.regular};\r\n font-size: 14px;\r\n border-radius: 50%;\r\n background-color: ${brand.apl.green};\r\n color: ${brand.white};\r\n margin-left: 10px;\r\n }\r\n`;\r\nconst Arrow = styled.span `\r\n display: block;\r\n color: ${brand.black};\r\n height: 16px;\r\n margin-left: auto;\r\n width: 16px;\r\n\r\n .theme-rss & {\r\n color: ${cssVar('fgColor')};\r\n }\r\n`;\r\nconst Tick = styled.span `\r\n display: block;\r\n color: ${brand.hta.green};\r\n height: 11px;\r\n margin-left: auto;\r\n width: 16px;\r\n\r\n .theme-rss & {\r\n color: ${cssVar('accentColor')};\r\n }\r\n`;\r\nconst Clear = styled.button `\r\n display: block;\r\n background: none;\r\n border: 0;\r\n ${fonts.sourceSansPro.semiBold};\r\n font-size: 18px;\r\n line-height: 24px;\r\n margin: auto 0 0;\r\n padding: 12px 24px;\r\n\r\n .theme-rss & {\r\n color: ${cssVar('fgColor')};\r\n }\r\n`;\r\nconst CheckboxArea = styled.div `\r\n padding: 12px 24px;\r\n`;\r\nconst CheckboxAreaLabel = styled.p `\r\n ${fonts.sourceSansPro.semiBold};\r\n font-size: 18px;\r\n line-height: 34px;\r\n`;\r\nconst RadioArea = styled.div `\r\n padding: 12px 24px;\r\n\r\n > div {\r\n margin: 0 0 24px !important;\r\n }\r\n\r\n label > span {\r\n padding: 0 40px 0 0;\r\n\r\n &::before {\r\n display: none;\r\n }\r\n\r\n &::after {\r\n background: transparent url('${svgTickGreen}') no-repeat center;\r\n right: 0;\r\n left: auto;\r\n top: 0;\r\n padding: 0;\r\n height: 26px;\r\n }\r\n }\r\n\r\n input:checked + span {\r\n font-weight: bold;\r\n }\r\n`;\r\nconst ApplyFilters = styled(Button) `\r\n background-color: ${brand.hta.green};\r\n border-color: ${brand.hta.green};\r\n\r\n .theme-apl & {\r\n background-color: ${brand.apl.green};\r\n border-color: ${brand.apl.green};\r\n }\r\n\r\n .theme-hh & {\r\n background-color: ${brand.hortHouse.green};\r\n border-color: ${brand.hortHouse.green};\r\n }\r\n\r\n &:hover {\r\n background-color: ${cssVar('bgColorAlt')};\r\n border-color: ${cssVar('bgColorAlt')};\r\n }\r\n span {\r\n color: ${brand.black};\r\n }\r\n`;\r\nconst RemoveFilters = styled(Button) `\r\n margin-top: 15px;\r\n border-color: ${brand.black};\r\n\r\n span {\r\n color: ${brand.black};\r\n }\r\n\r\n &:hover {\r\n background-color: ${cssVar('bgColorAlt')};\r\n border-color: ${cssVar('bgColorAlt')};\r\n }\r\n\r\n .theme-rss & {\r\n border-color: ${brand.white};\r\n\r\n span {\r\n color: ${brand.white};\r\n }\r\n\r\n &:hover {\r\n border-color: ${cssVar('bgColorAlt')};\r\n\r\n span {\r\n color: ${brand.black};\r\n }\r\n }\r\n }\r\n`;\r\nconst BtnHolder = styled.div ``;\r\nconst FilterBtns = styled.div `\r\n display: flex;\r\n flex-direction: column;\r\n justify-content: flex-end;\r\n flex: 1 0 auto;\r\n padding: 30px;\r\n`;\r\nconst AdditionalFilterBtn = styled.button `\r\n padding: 4px 8px;\r\n`;\r\nconst PostcodeSearchButton = styled.button `\r\n ${ButtonReset}\r\n display: flex;\r\n align-items: center;\r\n border: 1px solid ${cssVar('fgColor')};\r\n border-radius: 9px;\r\n color: ${cssVar('fgColor')};\r\n height: 48px;\r\n width: 100%;\r\n position: relative;\r\n ${fonts.sourceSansPro.regular};\r\n padding: 0 30px 0 12px;\r\n font-size: 16px;\r\n line-height: 20px;\r\n overflow: hidden;\r\n white-space: nowrap;\r\n text-overflow: ellipsis;\r\n cursor: pointer;\r\n\r\n @media ${from(Device.Desktop)} {\r\n font-size: 20px;\r\n line-height: 24px;\r\n }\r\n\r\n strong {\r\n ${fonts.sourceSansPro.semiBold};\r\n margin-right: 4px;\r\n }\r\n\r\n svg {\r\n width: 17px;\r\n color: ${brand.apl.green};\r\n margin-right: 8px;\r\n }\r\n`;\r\nconst ClearFilter = styled.span `\r\n display: flex;\r\n margin: 6px auto -30px;\r\n width: fit-content;\r\n\r\n button {\r\n padding: 3px 6px;\r\n border: 0;\r\n text-transform: capitalize;\r\n\r\n &:first-of-type {\r\n background-color: ${brand.greyLight};\r\n }\r\n\r\n &:last-of-type {\r\n background-color: ${brand.grey};\r\n color: ${brand.white};\r\n }\r\n }\r\n`;\r\nexport default {\r\n ApplyFilters,\r\n Arrow,\r\n BtnHolder,\r\n CheckboxArea,\r\n CheckboxAreaLabel,\r\n RadioArea,\r\n Clear,\r\n FilterBtns,\r\n Item,\r\n ItemList,\r\n RemoveFilters,\r\n Tick,\r\n Title,\r\n AdditionalFilterBtn,\r\n PostcodeSearchButton,\r\n ClearFilter,\r\n};\r\n","import { ReactComponent as SvgChevronLeft } from '@img/icons/chevron-left.svg';\r\nimport { ReactComponent as SvgChevronRight } from '@img/icons/chevron-right.svg';\r\nimport { ReactComponent as SvgPin } from '@img/icons/pin.svg';\r\nimport React from 'react';\r\nimport S from './FilterList.styles';\r\nconst FilterList = ({ professionFilters, countyFilters, servicesFilters, professionValues, postcodeValue, countyValues, servicesValues, title, onApply, onCancel, onClear, onClearPostcode, onPostcodeSearch, onRemove, onSelect, }) => {\r\n return (React.createElement(S.ItemList, null,\r\n React.createElement(S.Title, { disabled: !onCancel, onClick: (event) => {\r\n event.preventDefault();\r\n onCancel && onCancel();\r\n } },\r\n onCancel && React.createElement(SvgChevronLeft, null),\r\n title),\r\n React.createElement(S.Item, { onClick: (event) => {\r\n event.preventDefault();\r\n onSelect(professionFilters, 'profession');\r\n } },\r\n React.createElement(\"span\", null,\r\n professionFilters.title,\r\n professionValues && professionValues.length > 0 && (React.createElement(\"span\", null, professionValues.length))),\r\n React.createElement(S.Arrow, { as: SvgChevronRight })),\r\n React.createElement(S.Item, { onClick: (event) => {\r\n event.preventDefault();\r\n onSelect(countyFilters, 'county');\r\n } },\r\n React.createElement(\"span\", null,\r\n countyFilters.title,\r\n countyValues && countyValues.length > 0 && React.createElement(\"span\", null, countyValues.length)),\r\n React.createElement(S.Arrow, { as: SvgChevronRight })),\r\n React.createElement(S.Item, { onClick: (event) => {\r\n event.preventDefault();\r\n onSelect(servicesFilters, 'services');\r\n } },\r\n React.createElement(\"span\", null,\r\n servicesFilters.title,\r\n servicesValues && servicesValues.length > 0 && React.createElement(\"span\", null, servicesValues.length)),\r\n React.createElement(S.Arrow, { as: SvgChevronRight })),\r\n React.createElement(S.Item, { onClick: (event) => {\r\n event.preventDefault();\r\n onSelect({ key: '', options: [], title: '' }, 'sortBy');\r\n } },\r\n React.createElement(\"span\", null, \"Sort by\"),\r\n React.createElement(S.Arrow, { as: SvgChevronRight })),\r\n React.createElement(S.Item, { \"data-postcode\": \"true\" },\r\n React.createElement(S.PostcodeSearchButton, { onClick: onPostcodeSearch },\r\n React.createElement(SvgPin, null),\r\n \" \",\r\n React.createElement(\"strong\", null, \"Postcode:\"),\r\n \" \",\r\n postcodeValue ? postcodeValue : 'Search'),\r\n postcodeValue && (React.createElement(S.ClearFilter, null,\r\n React.createElement(\"button\", { onClick: () => onClearPostcode(false), title: \"Edit\" }, postcodeValue),\r\n React.createElement(\"button\", { onClick: () => onClearPostcode(true), title: \"Clear Filter\" }, \"\\u00D7\")))),\r\n onApply && (React.createElement(S.FilterBtns, null,\r\n React.createElement(S.BtnHolder, null,\r\n React.createElement(S.ApplyFilters, { title: \"Apply Filters\", themeOption: \"rssGreen\", onClick: (event) => {\r\n event.preventDefault();\r\n onApply && onApply();\r\n } })),\r\n React.createElement(S.BtnHolder, null,\r\n React.createElement(S.RemoveFilters, { title: \"Remove Filters\", themeOption: \"rssWhiteOutline\", onClick: (event) => {\r\n event.preventDefault();\r\n onRemove && onRemove();\r\n } })))),\r\n onClear && (React.createElement(S.Clear, { onClick: (event) => {\r\n event.preventDefault();\r\n onClear();\r\n } }, \"Clear\"))));\r\n};\r\nexport default FilterList;\r\n","import { ReactComponent as SvgChevronLeft } from '@img/icons/chevron-left.svg';\r\nimport React from 'react';\r\nimport S from '../List/FilterList.styles';\r\nimport Checkbox from '@stories/Components/Inputs/Checkbox/Checkbox';\r\nconst FilterList = ({ selectedFilters, selectedValues, title, onApply, onCancel, onClear, onRemove, onFilterChange, }) => {\r\n function updateFilters(key, value, e) {\r\n e.stopPropagation();\r\n if (selectedFilters && onFilterChange) {\r\n const tempValues = selectedValues;\r\n if (tempValues && !tempValues.includes(value)) {\r\n tempValues.push(value);\r\n onFilterChange(key, tempValues);\r\n }\r\n else {\r\n if (tempValues) {\r\n const newList = tempValues.filter((prof) => prof !== value);\r\n onFilterChange(key, newList);\r\n }\r\n }\r\n }\r\n }\r\n return (React.createElement(S.ItemList, null,\r\n React.createElement(S.Title, { disabled: !onCancel, onClick: (event) => {\r\n event.preventDefault();\r\n onCancel && onCancel();\r\n } },\r\n onCancel && React.createElement(SvgChevronLeft, null),\r\n title),\r\n React.createElement(S.CheckboxArea, null, selectedFilters &&\r\n selectedFilters.options?.map((item) => (React.createElement(Checkbox, { key: item.id, type: \"checkbox\", checked: selectedValues?.includes(item.value), id: item.id, name: item.text, value: item.value, labelText: item.text, onChange: (event) => updateFilters(selectedFilters.key, event.target.value, event) })))),\r\n onApply && (React.createElement(S.FilterBtns, null,\r\n React.createElement(S.BtnHolder, null,\r\n React.createElement(S.ApplyFilters, { title: \"Apply Filters\", themeOption: \"rssGreen\", onClick: (event) => {\r\n event.preventDefault();\r\n onApply && onApply();\r\n } })),\r\n React.createElement(S.BtnHolder, null,\r\n React.createElement(S.RemoveFilters, { title: \"Remove Filters\", themeOption: \"rssWhiteOutline\", onClick: (event) => {\r\n event.preventDefault();\r\n onRemove && onRemove();\r\n } })))),\r\n onClear && (React.createElement(S.Clear, { onClick: (event) => {\r\n event.preventDefault();\r\n onClear();\r\n } }, \"Clear\"))));\r\n};\r\nexport default FilterList;\r\n","import { cssVar } from '@helpers/cssVar';\r\nimport { Device, from } from '@helpers/media';\r\nimport srOnly from '@helpers/srOnly';\r\nimport ParagraphStyles from '@stories/Components/Global/Typography/Paragraph.styles';\r\nimport { ReactComponent as SvgTick } from '@img/icons/tick.svg';\r\nimport styled from 'styled-components';\r\nconst Container = styled.div `\r\n position: relative;\r\n display: block;\r\n width: auto;\r\n\r\n & + & {\r\n margin-left: 24px;\r\n }\r\n\r\n @media ${from(Device.Tablet)} {\r\n & + & {\r\n margin-left: 56px;\r\n }\r\n }\r\n`;\r\nconst Tick = styled(SvgTick) `\r\n position: absolute;\r\n left: 3px;\r\n top: 5px;\r\n color: ${cssVar('accentColor')};\r\n width: 18px;\r\n opacity: 0;\r\n`;\r\nconst RadioBtnItem = styled.label `\r\n position: relative;\r\n display: block;\r\n`;\r\nconst RadioBtnInput = styled.input `\r\n ${srOnly}\r\n`;\r\nconst RadioBtnText = styled.span `\r\n display: block;\r\n ${ParagraphStyles.SmallStyles};\r\n margin: 0;\r\n padding: 0 0 0 32px;\r\n\r\n &::after,\r\n &::before {\r\n content: '';\r\n position: absolute;\r\n top: 0;\r\n left: 0;\r\n display: block;\r\n border-radius: 50%;\r\n box-sizing: border-box;\r\n height: 25px;\r\n width: 25px;\r\n }\r\n\r\n &::before {\r\n border: 1px solid ${cssVar('fgColor')};\r\n z-index: 1;\r\n }\r\n\r\n &::after {\r\n background: ${cssVar('accentColor')};\r\n background-clip: content-box;\r\n opacity: 0;\r\n padding: 4px;\r\n transition: opacity 0.15s ease-out;\r\n z-index: 2;\r\n }\r\n\r\n ${RadioBtnInput}:checked + &::after {\r\n opacity: 1;\r\n }\r\n`;\r\nexport default {\r\n Container,\r\n RadioBtnInput,\r\n RadioBtnItem,\r\n RadioBtnText,\r\n Tick,\r\n};\r\n","import React from 'react';\r\nimport S from './RadioBtn.styles';\r\nconst RadioBtn = React.forwardRef(({ className, htmlFor, labelText, ...otherProps }, ref) => {\r\n return (React.createElement(S.Container, { className: className },\r\n React.createElement(S.RadioBtnItem, { htmlFor: htmlFor },\r\n React.createElement(S.RadioBtnInput, { ref: ref, ...otherProps }),\r\n React.createElement(S.RadioBtnText, null, labelText))));\r\n});\r\nRadioBtn.displayName = 'RadioBtn';\r\nexport default RadioBtn;\r\n","import { ReactComponent as SvgChevronLeft } from '@img/icons/chevron-left.svg';\r\nimport RadioBtn from '@stories/Components/Inputs/RadioBtn/RadioBtn';\r\nimport * as React from 'react';\r\nimport S from '../List/FilterList.styles';\r\nconst SelectedRadioList = ({ title, name, onCancel, selectedFilters, selectedValue = '', onFilterChange, }) => (React.createElement(S.ItemList, null,\r\n React.createElement(S.Title, { disabled: !onCancel, onClick: (event) => {\r\n event.preventDefault();\r\n onCancel && onCancel();\r\n } },\r\n onCancel && React.createElement(SvgChevronLeft, null),\r\n title),\r\n React.createElement(S.RadioArea, null, selectedFilters &&\r\n selectedFilters?.map((filter, i) => (React.createElement(RadioBtn, { key: `selected-radio-${i}`, htmlFor: filter.value, labelText: filter.text, id: filter.value, type: \"radio\", name: name, value: filter.value, checked: filter.value === selectedValue, onChange: (e) => onFilterChange(e.target.value) }))))));\r\nexport default SelectedRadioList;\r\n","import useScrollLock from '@hooks/useBodyScrollLock';\r\nimport { ReactComponent as SvgChevronRight } from '@img/icons/chevron-right.svg';\r\nimport { ReactComponent as SvgClose } from '@img/icons/close.svg';\r\nimport noop from 'lodash/noop';\r\nimport React from 'react';\r\nimport PostcodeModal from '../Modals/PostcodeModal/PostcodeModal';\r\nimport S from './APLFiltersMobile.styles';\r\nimport FilterList from './List/FilterList';\r\nimport SelectedList from './SelectedList/SelectedList';\r\nimport SelectedRadioList from './SelectedRadioList/SelectedRadioList';\r\nconst APLFiltersMobile = ({ professionFilters, countyFilters, servicesFilters, countyValues, professionValues, servicesValues, onFilterChange, onPostcodeSearch = noop, onPostcodeSubmit = noop, showPostcodeModal = false, postcodeValue, onPostcodeModalClose = noop, onClearPostcode = noop, onClearAllFilters = noop, sortByOptions, sortByValue, onSortChange = noop, }) => {\r\n const ref = React.useRef(null);\r\n const [activeFilters, setActiveFilters] = React.useState();\r\n const [activeValues, setActiveValues] = React.useState();\r\n const [visible, setVisible] = React.useState(false);\r\n const totalSelected = [professionValues, countyValues, servicesValues].flat().length;\r\n useScrollLock(ref.current, visible);\r\n return (React.createElement(S.Container, { \"aria-active\": visible },\r\n React.createElement(S.Open, { onClick: (event) => {\r\n event.preventDefault();\r\n setVisible(true);\r\n } },\r\n React.createElement(\"span\", null,\r\n \"Filters\",\r\n totalSelected > 0 ? React.createElement(\"strong\", null,\r\n \": \",\r\n totalSelected,\r\n \" selected\") : null),\r\n React.createElement(SvgChevronRight, null)),\r\n React.createElement(S.Overlay, { ref: ref },\r\n React.createElement(S.Close, { onClick: (event) => {\r\n event.preventDefault();\r\n setActiveFilters(undefined);\r\n setVisible(false);\r\n } },\r\n React.createElement(SvgClose, null),\r\n React.createElement(\"span\", null, \"Close\")),\r\n activeFilters === undefined ? renderTopLevelList() : renderActiveList()),\r\n React.createElement(S.Background, { onClick: (event) => {\r\n event.preventDefault();\r\n setActiveFilters(undefined);\r\n setVisible(false);\r\n } }),\r\n React.createElement(PostcodeModal, { visible: showPostcodeModal, onClose: onPostcodeModalClose, onSubmit: onPostcodeSubmit })));\r\n function renderTopLevelList() {\r\n return (React.createElement(FilterList, { title: \"Filters\", professionFilters: professionFilters, countyFilters: countyFilters, servicesFilters: servicesFilters, professionValues: professionValues, countyValues: countyValues, servicesValues: servicesValues, postcodeValue: postcodeValue, onApply: () => {\r\n setActiveFilters(undefined);\r\n setActiveValues(undefined);\r\n setVisible(false);\r\n }, onClearPostcode: onClearPostcode, onPostcodeSearch: onPostcodeSearch, onRemove: () => {\r\n onClearAllFilters();\r\n }, onSelect: (filters, values) => {\r\n setActiveFilters(filters);\r\n setActiveValues(values);\r\n } }));\r\n }\r\n function renderActiveList() {\r\n if (activeFilters === undefined) {\r\n return React.createElement(\"div\", null);\r\n }\r\n let selectedValues = [];\r\n switch (activeValues) {\r\n case 'profession':\r\n selectedValues = professionValues;\r\n break;\r\n case 'county':\r\n selectedValues = countyValues;\r\n break;\r\n case 'services':\r\n selectedValues = servicesValues;\r\n break;\r\n case 'sortBy':\r\n return (React.createElement(React.Fragment, null,\r\n React.createElement(SelectedRadioList, { name: \"sortBy\", selectedFilters: sortByOptions, selectedValue: sortByValue, onFilterChange: onSortChange, title: 'Sort by', onCancel: () => {\r\n setActiveFilters(undefined);\r\n } })));\r\n }\r\n return (React.createElement(SelectedList, { selectedFilters: activeFilters, selectedValues: selectedValues, onFilterChange: onFilterChange, title: activeFilters.title ?? '', onCancel: () => {\r\n setActiveFilters(undefined);\r\n }, onClear: () => {\r\n setActiveFilters(undefined);\r\n onFilterChange(activeFilters.key, []);\r\n } }));\r\n }\r\n};\r\nexport default APLFiltersMobile;\r\n","import brand from '@helpers/brand';\r\nimport { cssVar, setCssVar } from '@helpers/cssVar';\r\nimport FiltersStyles from '@stories/Components/Filters/Filters.styles';\r\nimport ParagraphStyles from '@stories/Components/Global/Typography/Paragraph.styles';\r\nimport SectionWrapper from '@stories/Components/SectionWrapper/SectionWrapper';\r\nimport styled from 'styled-components';\r\nimport APLFiltersStyles from '../APLFilters/APLFilters.styles';\r\nimport HeadingStyles from '../Global/Typography/Heading.styles';\r\nconst Container = styled(SectionWrapper) `\r\n ${setCssVar('fgColor', brand.black)};\r\n\r\n .theme-apl & {\r\n ${setCssVar('fgColor', brand.black)};\r\n }\r\n\r\n .theme-hh & {\r\n ${setCssVar('fgColor', brand.white)};\r\n }\r\n\r\n .theme-rss & {\r\n ${setCssVar('fgColor', brand.white)};\r\n }\r\n\r\n ${FiltersStyles.Container}, ${APLFiltersStyles.Container} {\r\n margin: 0 0 var(--sectionMargin);\r\n }\r\n`;\r\nconst Message = styled.p `\r\n ${ParagraphStyles.RegularStyles}\r\n margin-top: var(--sectionMargin);\r\n`;\r\nconst Loading = styled.div `\r\n position: fixed;\r\n top: 0;\r\n left: 0;\r\n display: flex;\r\n align-items: center;\r\n background: rgba(0, 0, 0, 0.65);\r\n height: 100%;\r\n justify-content: center;\r\n width: 100%;\r\n z-index: 100;\r\n`;\r\nconst CtaWrapper = styled.div `\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n margin-top: 84px;\r\n`;\r\nconst ListTitle = styled.h2 `\r\n ${HeadingStyles.H2Styles};\r\n color: ${cssVar('fgColor')};\r\n margin: 50px 0 30px;\r\n`;\r\nexport default {\r\n Container,\r\n CtaWrapper,\r\n ListTitle,\r\n Loading,\r\n Message,\r\n};\r\n","import noop from 'lodash/noop';\r\nimport React from 'react';\r\nimport APLFilters from '../APLFilters/APLFilters';\r\nimport APLFiltersMobile from '../APLFiltersMobile/APLFiltersMobile';\r\nimport Button from '../Buttons/Button/Button';\r\nimport LoadingOverlay from '../LoadingOverlay/LoadingOverlay';\r\nimport S from './APLFilteredListing.styles';\r\nfunction FilteredListing({ buttonThemeOption = 'aplGreen', error, errorText, filtersProps, flush = 'top', items, listTitle, loading = false, pageIndex = 0, renderItems, totalItems = 0, onPageChange = noop, }) {\r\n return (React.createElement(S.Container, { flush: flush },\r\n listTitle && React.createElement(S.ListTitle, null, listTitle),\r\n filtersProps && React.createElement(APLFilters, { ...filtersProps }),\r\n filtersProps && React.createElement(APLFiltersMobile, { ...filtersProps }),\r\n loading && renderLoading(),\r\n error && renderError(error),\r\n items && renderResults(items)));\r\n function renderError(error) {\r\n return React.createElement(S.Message, null, error.message);\r\n }\r\n function renderLoading() {\r\n return React.createElement(LoadingOverlay, null);\r\n }\r\n function renderResults(items) {\r\n if (items.length === 0) {\r\n return React.createElement(S.Message, null, errorText);\r\n }\r\n return (React.createElement(React.Fragment, null,\r\n renderItems(items),\r\n items.length < totalItems && (React.createElement(S.CtaWrapper, null,\r\n React.createElement(Button, { themeOption: buttonThemeOption, title: \"Load More\", onClick: (event) => {\r\n event.preventDefault();\r\n onPageChange(pageIndex + 1);\r\n } })))));\r\n }\r\n}\r\nexport default FilteredListing;\r\n","import { Device, from } from '@helpers/media';\r\nimport styled from 'styled-components';\r\nconst ItemList = styled.div `\r\n display: grid;\r\n gap: 10px;\r\n grid-template-columns: repeat(12, 1fr);\r\n\r\n @media ${from(Device.Tablet)} {\r\n gap: 30px;\r\n }\r\n`;\r\nconst Item = styled.div `\r\n grid-column: span 12;\r\n\r\n @media ${from(Device.Tablet)} {\r\n grid-column: span 6;\r\n }\r\n\r\n @media ${from(Device.TabletLarge)} {\r\n grid-column: span 4;\r\n }\r\n`;\r\nexport default {\r\n Item,\r\n ItemList,\r\n};\r\n","import { API_URLS } from '@helpers/api';\r\nimport { withQueryParams } from '@hoc/withQueryParams';\r\nimport { useApi } from '@hooks/useApi';\r\nimport APLFilteredListing from '@stories/Components/APLFilteredListing/APLFilteredListing';\r\nimport MemberCard from '@stories/Components/Cards/HTAMemberCard/HTAMemberCard';\r\nimport InnerPageHero from '@stories/Widgets/InnerPageHero/InnerPageHero';\r\nimport queryString from 'query-string';\r\nimport React from 'react';\r\nimport { useHistory, useLocation } from 'react-router-dom';\r\nimport { useFirstMountState } from 'react-use';\r\nimport S from './AplLandscaperListing.styles';\r\nconst AplLandscaperListing = ({ filterTitle, initialData, professionFilter, countyFilter, servicesFilter, title, randomSeed, errorText, sortByOptions, sustainabilityLink, }) => {\r\n const isFirstMount = useFirstMountState();\r\n /**\r\n * Manage query params via useLocation to ensure that multiple instances of a value being passed through\r\n * eg. ?profession=landscaper&profession=garden+designer&profession=professional+gardener\r\n * are handled correctly.\r\n *\r\n * useQueryParams either formats as an array, or returns only the first value\r\n */\r\n const location = useLocation();\r\n const history = useHistory();\r\n const [queryParams, setQueryParams] = React.useState(queryString.parse(location.search));\r\n const [shouldSendAPIRequest, setShouldSendAPIRequest] = React.useState(false);\r\n function updateQueryParams(params) {\r\n setQueryParams({ ...queryParams, ...params });\r\n }\r\n // Get additional filters.\r\n const name = queryParams.name ?? '';\r\n // const location = queryParams.location ?? '';\r\n // Get Search term\r\n const searchTerm = queryParams.searchTerm ?? '';\r\n // Get page index or default.\r\n const pageIndex = queryParams.pageIndex\r\n ? typeof queryParams.pageIndex === 'string'\r\n ? queryParams.pageIndex\r\n : queryParams.pageIndex[0]\r\n : '1';\r\n // Get sort by or default.\r\n const sortByValue = queryParams.sortBy\r\n ? typeof queryParams.sortBy === 'string'\r\n ? queryParams.sortBy\r\n : queryParams.sortBy[0]\r\n : sortByOptions[0].value;\r\n // Get profession values, and convert to array if required\r\n const professionValues = queryParams.profession\r\n ? typeof queryParams.profession === 'string'\r\n ? [queryParams.profession]\r\n : queryParams.profession\r\n : [];\r\n // Get county values, and convert to array if required\r\n const countyValues = queryParams.county\r\n ? typeof queryParams.county === 'string'\r\n ? [queryParams.county]\r\n : queryParams.county\r\n : [];\r\n // Get profession values, and convert to array if required\r\n const servicesValues = queryParams.services\r\n ? typeof queryParams.services === 'string'\r\n ? [queryParams.services]\r\n : queryParams.services\r\n : [];\r\n // Get postcode\r\n const postcodeValue = queryParams.postcode\r\n ? typeof queryParams.postcode === 'string'\r\n ? queryParams.postcode\r\n : queryParams.postcode[0]\r\n : '';\r\n const [postcodeModalData, setPostcodeModalData] = React.useState({\r\n show: false,\r\n });\r\n // Construct API url.\r\n const parameters = queryString.stringify({\r\n name: name,\r\n // location: location,\r\n pageIndex: pageIndex,\r\n pageSize: 12,\r\n searchTerm: searchTerm,\r\n profession: professionValues.join('+'),\r\n county: countyValues.join('+'),\r\n services: servicesValues.join('+'),\r\n randomSeed: randomSeed,\r\n sortBy: sortByValue,\r\n postcode: postcodeValue,\r\n });\r\n const apiUrl = `${API_URLS.landscapers}?${parameters}`;\r\n // Ensure page url is updated when queryParams change\r\n React.useEffect(() => history.push({ search: queryString.stringify(queryParams) }), [queryParams]);\r\n // Fetch data.\r\n const { data, loading, error } = useApi(apiUrl, shouldSendAPIRequest);\r\n React.useEffect(() => {\r\n if (isFirstMount) {\r\n return;\r\n }\r\n // Don't set it on first mount //\r\n setShouldSendAPIRequest(true);\r\n }, [queryParams]);\r\n React.useEffect(() => {\r\n if (shouldSendAPIRequest && !loading) {\r\n setShouldSendAPIRequest(false);\r\n }\r\n }, [shouldSendAPIRequest, loading]);\r\n // Get items from response or initial items.\r\n const items = data?.items ?? initialData.items;\r\n const totalItems = data?.totalItems ?? initialData.totalItems;\r\n return (React.createElement(React.Fragment, null,\r\n React.createElement(InnerPageHero, { title: title }),\r\n React.createElement(APLFilteredListing, { errorText: errorText, error: error, filtersProps: {\r\n alignment: 'left',\r\n professionValues,\r\n countyValues,\r\n servicesValues,\r\n professionFilters: professionFilter,\r\n countyFilters: countyFilter,\r\n servicesFilters: servicesFilter,\r\n title: filterTitle,\r\n onFilterChange: (key, val) => updateQueryParams({ [key]: val, pageIndex: '1' }),\r\n onSearchTermChange: (val) => updateQueryParams({ searchTerm: val, pageIndex: '1' }),\r\n searchTerm: searchTerm,\r\n onSortChange: (val) => {\r\n updateQueryParams({ sortBy: val });\r\n },\r\n onPostcodeSearch: () => {\r\n setPostcodeModalData({ show: true });\r\n },\r\n onPostcodeSubmit: (val) => {\r\n updateQueryParams({ postcode: val, pageIndex: '1' });\r\n setPostcodeModalData({ show: false });\r\n },\r\n sortByOptions: sortByOptions,\r\n sortByValue: sortByValue,\r\n showPostcodeModal: postcodeModalData.show,\r\n onPostcodeModalClose: () => {\r\n setPostcodeModalData({ show: false });\r\n },\r\n postcodeValue,\r\n onClearPostcode: (reset) => {\r\n if (reset) {\r\n updateQueryParams({ postcode: '' });\r\n }\r\n else {\r\n updateQueryParams({ postcode: '' });\r\n setPostcodeModalData({ show: true });\r\n }\r\n },\r\n onClearSelected: (value) => {\r\n const profession = professionFilter.options.filter((x) => x.value === value).length > 0;\r\n const county = countyFilter.options.filter((x) => x.value === value).length > 0;\r\n const services = servicesFilter.options.filter((x) => x.value === value).length > 0;\r\n if (profession) {\r\n updateQueryParams({\r\n [professionFilter.key]: professionValues.filter((x) => x !== value),\r\n });\r\n }\r\n else if (county) {\r\n updateQueryParams({\r\n [countyFilter.key]: countyValues.filter((x) => x !== value),\r\n });\r\n }\r\n else if (services) {\r\n updateQueryParams({\r\n [servicesFilter.key]: servicesValues.filter((x) => x !== value),\r\n });\r\n }\r\n else {\r\n return;\r\n }\r\n },\r\n onClearAllFilters: () => updateQueryParams({\r\n [professionFilter.key]: [],\r\n [countyFilter.key]: [],\r\n [servicesFilter.key]: [],\r\n postcode: '',\r\n sortBy: '',\r\n }),\r\n }, items: items, loading: loading, pageIndex: parseInt(pageIndex), renderItems: (items) => (React.createElement(S.ItemList, null, items.map((item) => (React.createElement(S.Item, { key: item.id },\r\n React.createElement(MemberCard, { ...item, showButton: !!item.url, sustainabilityLink: sustainabilityLink })))))), totalItems: totalItems, onPageChange: (pageIndex) => {\r\n updateQueryParams({ pageIndex: pageIndex.toString() });\r\n } })));\r\n};\r\nexport default withQueryParams(AplLandscaperListing);\r\n"],"sourceRoot":""}