{"version":3,"sources":["webpack:///./Avensia.Common/Features/Shared/SharedComponents/atoms/Pagination.tsx","webpack:///./Avensia.Common/Features/Shared/Icons/glyphs/Sort_12x12.svg","webpack:///./Avensia.Common/Features/Shared/Icons/Glyphs/Filter_12x12.svg","webpack:///./Avensia.Common/Features/Shared/Facet/toggle-facet.tsx","webpack:///./Avensia.Common/Features/Shared/Icons/Sort.tsx","webpack:///./Avensia.Common/Features/Shared/SharedComponents/atoms/ProductSort.tsx","webpack:///./Avensia.Common/Features/Shared/Icons/Filter.tsx","webpack:///./Avensia.Common/Features/Product/ProductListing/FilterModal/OptionCard.tsx","webpack:///./Avensia.Common/Features/Shared/SharedComponents/atoms/DoubleSlider.tsx","webpack:///./Avensia.Common/Features/Product/ProductListing/FilterModal/PriceSlider.tsx","webpack:///./Avensia.Common/Features/Product/ProductListing/FilterModal/FilterSection.tsx","webpack:///./Avensia.Common/Features/Product/ProductListing/FilterModal/SwitchOption.tsx","webpack:///./Avensia.Common/Features/Product/ProductListing/ActiveFilters.tsx","webpack:///./Avensia.Common/Features/Product/ProductListing/FilterModal/index.tsx","webpack:///./Avensia.Common/Features/Product/ProductListing/index.tsx","webpack:///./Avensia.Common/Features/Search/Listing/CmsPageCard.tsx","webpack:///./Avensia.Common/Features/Search/Listing/CmsPageListing.tsx","webpack:///./Avensia.Common/Features/Search/SearchPageTop/index.tsx","webpack:///./Avensia.Common/Features/Search/SearchPage.tsx"],"names":["PagingWrap","div","marginTop","display","flexDirection","alignItems","gap","PagingInner","width","PagingLeftWrap","flexGrow","PagingNumberWrap","PagingRightWrap","textAlign","Pagination","state","currentBreakpoint","props","pageCount","currentPage","navigateToPage","totalItemCount","currentlyDisplayedItemCount","totalItemCountLabel","totalItemCountTextColor","inactiveColorAlpha","secondaryColor","monochrome","black","pages","i","pageNum","lastPageNumInArr","length","push","String","undefined","css","cursor","color","onClick","map","page","idx","Div","rgbaFilters","black50","key","fontSize","D32_M32","Number","React","Sort12x12","createElement","defaultProps","module","exports","default","Filter12x12","allSelectedValues","values","selectedValuess","filter","v","selected","forEach","childValues","SortWrap","position","marginRight","RadioChecked","SortOptions","form","backgroundColor","extraLightGrey","borderRadius","right","zIndex","flexFlow","overflow","property","duration","timingFunction","padding","xy","SortOption","input","appearance","SortLabel","label","whiteSpace","marginBottom","ButtonIcon","marginLeft","sort","handleChange","toggleModal","showModal","isMobile","modalRef","sortRef","handleClickEvent","e","current","contains","target","window","addEventListener","removeEventListener","ref","theme","WhiteToBlack","text","iconAfter","height","Filter","x","onSubmit","onChange","options","opt","type","name","value","OptionCardWrap","background","white","border","style","boxShadow","y","OptionCardWrapSelected","OptionCardImage","IconText","Text","ColorOptionCardWrap","justifyContent","ColorOptionCardWrapSelected","ColorCircle","ColorOptionCard","toggleSelected","Wrap","id","D10_M10","upperCase","displayName","TextElement","icon","src","url","alt","ratio","OneToOneFill","D12_M12","Label","span","textTransform","fontWeight","lineHeight","boxSizing","LabelWrap","pointerEvents","top","minHeight","FromInput","darkGrey","ToInput","connect","culture","appShellData","currency","market","min","max","selectedMin","selectedMax","updateValue","sliderRange","valueToPercentage","Math","round","percentageToValue","percentage","fromSliderRef","toSliderRef","fromPosition","setFromPosition","toPosition","setToPosition","sliderFromWidth","setSliderFromWidth","sliderToWidth","setSliderToWidth","updateValueDebounced","newSelectedMin","newSelectedMax","updateWidth","isFirst","offsetWidth","parseInt","transform","backgroundImage","minSelected","maxSelected","SectionWrap","columnGap","rowGap","PriceWrap","paddingTop","PriceHeading","paddingBottom","filterId","subHeading","onFilterValuesUpdated","onPriceUpdated","templateColumns","repeat","gridTemplateColumns","filterValue","ticket","ToggleLabel","outlineStyle","ToggleInput","left","ToggleSwitch","content","bottom","LabelText","facet","transitionDuration","checked","brandColors","green","ActiveFilterContainer","flexBasis","flexWrap","margin","ActiveFilter","font","size","weight","RemoveIcon","Close","getActiveFacets","facets","toLowerCase","selectedCount","onRemoveFacet","activeFacets","compose","itemCss","activeFacet","facetValue","FilterButtonsWrap","FilterOnlyInStockWrap","FilterOnlyInStockItem","AccordionItem","Accordion","ActiveFacets","ActiveFilters","ModalScrollableContentContainer","Modal","changeFilterValue","filters","changedFilter","filterValues","isActiveFilter","filterIndex","valueIndex","ActiveFilterHeading","modalIsShown","hideModal","heading","onFiltersUpdated","onFiltersReset","clearFiltersLabel","showProductsLabel","activeFiltersLabel","removeActiveFilter","filterIdOpen","setFilterIdOpen","isOnLeft","textAboveHeading","bottomPadding","closeModal","closeIconSize","index","isOpen","onToggle","upperCaseHeading","disabled","toUpperCase","header","borderWidth","iconWidth","changedFilters","TransparentBlack","BlackToWhite","Filters","ProductListHeading","alignSelf","ListHeading","ProductListTop","RowWrap","ItemWrap","ProductListTopWrap","headerHeight","UI","dispatch","getWithSpinner","thenAction","canonicalUrl","then","r","json","finally","productList","hideFacetAndSort","showProductSortModal","setShowProductSortModal","filterModalIsShown","setFilterModalIsShown","selectedFacets","setSelectedFacets","selectedSortBy","setSelectedSortBy","productListTop","getParsedCurrentUrl","searchParams","delete","appendFilterPath","pathname","onFacetValueChange","currentFacet","currentValue","curr","updatedFacets","setFilterResults","queryParams","set","urlName","append","renderAsCheckBox","toString","addressBarUrl","offsetTop","sortOptions","bindFilterResults","displayUrl","totalCount","visibleCount","products","filterStickyTop","listContentItems","reduce","obj","mobileIndex","desktopIndex","items","MainContent","topContentArea","for","totalCountTitle","labels","displayingItems","listItem","SomeComponent","componentName","className","layout","ProductCard","product","listIndex","GalleryContent","item","activeFilters","bind","this","onResetFacetValues","clearFilter","showProducts","nrItems","elm","sortBy","currentPageIndex","totalPages","number","a11ygrey","cmsPage","isCompact","Link","to","draggable","Ratio","image","title","FourToThree","preset","CmsListItem","articleTag","shouldAlwaysClaimHeight","D24_M24","articleTags","slice","join","textDecoration","itemsPerRow","breakPoint","cmsListViewModel","setCmsListViewModel","topRef","scrollTo","behavior","cmsPages","itemClassName","mapping","row","CmsPage","j","CmsPageCard","SearchInput","SearchContainer","SearchButton","button","InlineLabelInactive","InlineLabelActive","NoResultText","p","negativeColors","negative","Container","FlexWrap","HiddenField","searchSpanRef","searchInputRef","totalResultCount","searchGroupsListFiltered","selectGroup","selectedGroup","searchInputVisible","setSearchInputVisible","timeoutNumber","setTimeoutNumber","handleSearchInputChange","innerText","clearTimeout","newSearchPhrase","setSearchPhrase","setTimeout","executeSearch","leaveSearchInput","e2","tagName","keyCode","which","charCode","searchPhrase","focus","searchResult","searchGroup","SearchGroupLabelType","translation","noResultsFor","noResultsDescription","D96_M40","onBlur","onKeyPress","preventDefault","handleShowSearchInput","modifySearch","ContentAreaWrap","SearchPage","originalSearchPhrase","productResult","setProductResult","cmsResult","setCmsResult","recommendations","setRecommendations","getSearchGroups","enabled","searchGrops","tabGroups","setSearchGroups","setSelectedGroup","cmsList","groups","find","productListProps","searchCmsPage","Page","group","query","newUrl","searchText","ProductListing","get","result","isLoading","CmsPageListing","uppercase","cmsPageList","contentArea"],"mappings":"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","file":"assets/22.chunk.2a0a627b6bc72ae59448.js","sourcesContent":["import connect from 'Shared/connect';\r\nimport { isCompact as functionIsCompact } from 'Shared/Viewport';\r\nimport { styled } from '@glitz/react';\r\nimport { Left32x32, Right32x32 } from 'Shared/Icons/ArrowCircle';\r\nimport { TextBlock, TextLabel, ResponsiveSize } from 'Shared/SharedComponents/atoms/Typography';\r\nimport { translate } from '@polarnopyret/scope/index';\r\nimport React from 'react';\r\nimport * as style from 'Shared/Style';\r\n\r\nconst SHOW_ALL_PAGES = 6\r\n\r\nconst PagingWrap = styled.div({\r\n marginTop: '80px',\r\n display: 'flex',\r\n flexDirection: 'column',\r\n alignItems: 'center',\r\n gap: '16px',\r\n})\r\n\r\nconst PagingInner = styled.div({\r\n display: 'flex',\r\n flexDirection: 'row',\r\n ['@media ' + style.mediaUpToLarge]: {\r\n width: '100%'\r\n },\r\n ['@media ' + style.mediaMinLarge]: {\r\n gap: '32px'\r\n },\r\n})\r\n\r\nconst PagingLeftWrap = styled.div({\r\n ['@media ' + style.mediaUpToLarge]: {\r\n flexGrow: 1,\r\n },\r\n})\r\n\r\nconst PagingNumberWrap = styled.div({\r\n display: 'flex',\r\n flexDirection: 'row',\r\n gap: '24px',\r\n ['@media ' + style.mediaMinLarge]: {\r\n gap: '16px',\r\n },\r\n})\r\n\r\nconst PagingRightWrap = styled.div({\r\n ['@media ' + style.mediaUpToLarge]: {\r\n flexGrow: 1,\r\n textAlign: 'right'\r\n },\r\n})\r\n\r\nconst Pagination = connect((state) => ({\r\n currentBreakpoint: state.currentBreakpoint,\r\n}))(\r\n (props: {\r\n pageCount: number;\r\n currentPage: number;\r\n totalItemCount: number;\r\n totalItemCountTextColor: string;\r\n currentlyDisplayedItemCount: number;\r\n navigateToPage: (page: number) => void;\r\n currentBreakpoint: number;\r\n totalItemCountLabel?: string;\r\n inactiveColorAlpha?: number;\r\n }) => {\r\n const { pageCount, currentPage, navigateToPage, totalItemCount, currentlyDisplayedItemCount, totalItemCountLabel, totalItemCountTextColor, inactiveColorAlpha = 0.6 } =\r\n props;\r\n const isCompact = functionIsCompact(props.currentBreakpoint);\r\n const secondaryColor = style.hex2rgba(style.colors.monochrome.black, inactiveColorAlpha);\r\n \r\n let pages: string[] = []\r\n for (let i = 0; i < pageCount; i++) {\r\n const pageNum = i + 1\r\n const lastPageNumInArr: String | undefined = pages[pages.length - 1]\r\n\r\n if (pageCount <= SHOW_ALL_PAGES) {\r\n pages.push(String(pageNum))\r\n continue;\r\n }\r\n\r\n if (pageNum === 1) {\r\n // First page, add this - Always visible\r\n pages.push(String(pageNum))\r\n continue;\r\n }\r\n\r\n if (pageNum === pageCount) {\r\n // Last page, add this - Always visible\r\n pages.push(String(pageNum))\r\n continue\r\n }\r\n\r\n if (pageNum === currentPage - 1 && pageNum + 3 !== pageCount) {\r\n pages.push(String(pageNum))\r\n continue\r\n }\r\n\r\n if (pageNum === currentPage + 1 && pageNum - 3 !== 1) {\r\n pages.push(String(pageNum))\r\n continue \r\n }\r\n\r\n if (currentPage === 1 && pageNum === 3) {\r\n pages.push(String(pageNum))\r\n continue \r\n }\r\n\r\n if (pageNum === currentPage) {\r\n pages.push(String(pageNum))\r\n continue\r\n }\r\n\r\n if (lastPageNumInArr !== undefined && lastPageNumInArr !== '...') {\r\n pages.push('...')\r\n continue\r\n }\r\n }\r\n\r\n return (\r\n <PagingWrap>\r\n {pageCount > 1 && \r\n <PagingInner>\r\n <PagingLeftWrap>\r\n <Left32x32\r\n css={{\r\n cursor: currentPage === 1 ? undefined : 'pointer',\r\n color:\r\n currentPage === 1\r\n ? secondaryColor\r\n : style.colors.monochrome.black,\r\n }}\r\n onClick={() => {\r\n if (currentPage !== 1) {\r\n navigateToPage(currentPage - 1);\r\n }\r\n }}\r\n />\r\n </PagingLeftWrap>\r\n <PagingNumberWrap>\r\n {pages.map((page, idx) => {\r\n if (page === '...') {\r\n return <styled.Div\r\n css={{\r\n color: `${style.colors.rgbaFilters.black50}`,\r\n }}\r\n key={idx}\r\n >\r\n <TextBlock fontSize={ResponsiveSize.D32_M32}>...</TextBlock>\r\n </styled.Div>\r\n }\r\n\r\n return <styled.Div\r\n onClick={() => navigateToPage(Number(page))}\r\n key={idx}\r\n css={{\r\n color:\r\n currentPage === Number(page)\r\n ? `${style.colors.monochrome.black}`\r\n : `${style.colors.rgbaFilters.black50}`,\r\n cursor: 'pointer',\r\n }}\r\n >\r\n <TextBlock fontSize={ResponsiveSize.D32_M32}>{page}</TextBlock>\r\n </styled.Div>\r\n })}\r\n </PagingNumberWrap>\r\n <PagingRightWrap>\r\n <Right32x32\r\n css={{\r\n cursor: currentPage === pageCount ? undefined : 'pointer',\r\n color:\r\n currentPage === pageCount\r\n ? secondaryColor\r\n : style.colors.monochrome.black,\r\n }}\r\n onClick={() => {\r\n if (currentPage !== pageCount) {\r\n navigateToPage(currentPage + 1);\r\n }\r\n }}\r\n />\r\n </PagingRightWrap>\r\n </PagingInner>\r\n }\r\n <TextLabel color={totalItemCountTextColor}>\r\n {totalItemCountLabel ?? translate('/site/shared/displaynritems', currentlyDisplayedItemCount, totalItemCount)}\r\n </TextLabel>\r\n </PagingWrap>\r\n );\r\n },\r\n);\r\n\r\nexport default Pagination;\r\n","var React = require('react');\n\nfunction Sort12x12 (props) {\n return React.createElement(\"svg\",props,React.createElement(\"g\",{\"id\":\"Property 1=Sort+filter\"},React.createElement(\"path\",{\"id\":\"Vector 220\",\"d\":\"M1 1h10M1 6h5.556M1 11h1.111\",\"stroke\":\"currentColor\",\"strokeWidth\":\"2\",\"strokeLinecap\":\"round\"})));\n}\n\nSort12x12.defaultProps = {\"width\":\"12\",\"height\":\"12\",\"viewBox\":\"0 0 12 12\",\"fill\":\"none\"};\n\nmodule.exports = Sort12x12;\n\nSort12x12.default = Sort12x12;\n","var React = require('react');\n\nfunction Filter12x12 (props) {\n return React.createElement(\"svg\",props,React.createElement(\"g\",{\"id\":\"Property 1=filter\"},[React.createElement(\"path\",{\"id\":\"Vector 221\",\"d\":\"M0.5 2H11.5\",\"stroke\":\"currentColor\",\"strokeWidth\":\"2\",\"strokeLinecap\":\"round\",\"key\":0}),React.createElement(\"path\",{\"id\":\"Vector 222\",\"d\":\"M0.5 6H11.5\",\"stroke\":\"currentColor\",\"strokeWidth\":\"2\",\"strokeLinecap\":\"round\",\"key\":1}),React.createElement(\"path\",{\"id\":\"Vector 223\",\"d\":\"M0.5 10H11.5\",\"stroke\":\"currentColor\",\"strokeWidth\":\"2\",\"strokeLinecap\":\"round\",\"key\":2}),React.createElement(\"circle\",{\"id\":\"Ellipse 147\",\"cx\":\"8.5\",\"cy\":\"6\",\"r\":\"1.5\",\"fill\":\"currentColor\",\"key\":3}),React.createElement(\"circle\",{\"id\":\"Ellipse 148\",\"cx\":\"2.5\",\"cy\":\"2\",\"r\":\"1.5\",\"fill\":\"currentColor\",\"key\":4}),React.createElement(\"circle\",{\"id\":\"Ellipse 149\",\"cx\":\"2.5\",\"cy\":\"10\",\"r\":\"1.5\",\"fill\":\"currentColor\",\"key\":5})]));\n}\n\nFilter12x12.defaultProps = {\"width\":\"12\",\"height\":\"12\",\"viewBox\":\"0 0 12 12\",\"fill\":\"none\"};\n\nmodule.exports = Filter12x12;\n\nFilter12x12.default = Filter12x12;\n","import * as clone from 'clone';\r\nimport FacetViewModel from 'Shared/Facet/FacetViewModel.type';\r\nimport FacetValueViewModel from 'Shared/Facet/FacetValueViewModel.type';\r\n\r\nexport default (facets: FacetViewModel[], fieldName: string, facetValue: FacetValueViewModel, selected: boolean) => {\r\n const newFacets = clone(facets);\r\n\r\n const facet = newFacets.find(f => f.id === fieldName);\r\n if (!facet) {\r\n return facets;\r\n }\r\n // The path contains an array of values where the last element is the current\r\n const path = findValuePath(facet.values, facetValue.id, facetValue.id);\r\n const current = path[path.length - 1];\r\n if (!current || current.selected === selected) {\r\n return facets;\r\n }\r\n\r\n current.selected = selected;\r\n setChildSelections(current.childValues, selected);\r\n\r\n if (!selected) {\r\n path.forEach(v => (v.selected = false));\r\n }\r\n\r\n if (selected) {\r\n for (let i = path.length - 1; i >= 0; i--) {\r\n const value = path[i];\r\n if (value.childValues.every(c => c.selected)) {\r\n value.selected = true;\r\n }\r\n }\r\n }\r\n\r\n return newFacets;\r\n};\r\n\r\nfunction findValuePath(\r\n values: FacetValueViewModel[],\r\n fieldName: string,\r\n id: string,\r\n path: FacetValueViewModel[] = [],\r\n): FacetValueViewModel[] {\r\n const value = values.find(v => v.id === id && v.id === fieldName);\r\n if (value) {\r\n path.push(value);\r\n return path;\r\n }\r\n\r\n for (let i = 0; i < values.length; i++) {\r\n path = findValuePath(values[i].childValues, fieldName, id);\r\n if (path) {\r\n path.unshift(values[i]);\r\n return path;\r\n }\r\n }\r\n}\r\n\r\nexport function allSelectedValues(values: FacetValueViewModel[], selectedValuess: FacetValueViewModel[] = []) {\r\n selectedValuess.push(...values.filter(v => v.selected));\r\n values.forEach(v => allSelectedValues(v.childValues, selectedValuess));\r\n return selectedValuess;\r\n}\r\n\r\nfunction setChildSelections(children: FacetValueViewModel[], selected: boolean) {\r\n children.forEach(c => {\r\n c.selected = selected;\r\n setChildSelections(c.childValues, selected);\r\n });\r\n}\r\n","import factory from './icon';\r\nimport Svg12x12 from './glyphs/Sort_12x12.svg';\r\n\r\nexport const Sort12x12 = factory(Svg12x12, 12, 12);","import React, { useEffect, useRef } from 'react';\r\nimport { styled } from '@glitz/react';\r\nimport { Sort12x12 } from 'Shared/Icons/Sort';\r\nimport { Unchecked16x16, Checked16x16 } from 'Shared/Icons/Radio';\r\nimport { ButtonHeight, ButtonTheme, SolidButton } from 'Shared/TextButtons';\r\nimport Select from 'Shared/Fields/Select.type';\r\nimport * as style from 'Shared/Style';\r\nimport { pseudo } from '@glitz/core';\r\n\r\nconst SortWrap = styled.div({\r\n position: 'relative',\r\n})\r\n\r\nconst Radio = styled(Unchecked16x16, {\r\n marginRight: '8px',\r\n});\r\n\r\nconst RadioChecked = styled(Checked16x16, {\r\n marginRight: '8px',\r\n});\r\n\r\nconst SortOptions = styled.form({\r\n display: 'flex',\r\n position: 'absolute',\r\n backgroundColor: style.colors.monochrome.extraLightGrey,\r\n borderRadius: '8px',\r\n right: 'calc(-100% - 100px)',\r\n zIndex: 20,\r\n flexFlow: 'column',\r\n overflow: 'hidden',\r\n ...style.transition({ property: 'right', duration: '300ms', timingFunction: 'ease-out' }),\r\n marginTop: '8px',\r\n padding: {\r\n xy: '12px',\r\n },\r\n\r\n ['@media ' + style.mediaMinLarge]: {\r\n marginTop: '12px',\r\n padding: {\r\n xy: '16px',\r\n },\r\n },\r\n});\r\n\r\nconst SortOption = styled.input({\r\n position: 'relative',\r\n display: 'inline-block',\r\n appearance: 'none',\r\n});\r\n\r\nconst SortLabel = styled.label({\r\n display: 'flex',\r\n whiteSpace: 'nowrap',\r\n cursor: 'pointer',\r\n alignItems: 'center',\r\n marginBottom: '12px',\r\n\r\n ['@media ' + style.mediaMinLarge]: {\r\n marginBottom: '8px',\r\n },\r\n\r\n ...pseudo(':last-child', {\r\n marginBottom: '0px',\r\n }),\r\n});\r\n\r\nconst ButtonIcon = styled(Sort12x12, {\r\n marginLeft: '8px'\r\n})\r\n\r\ntype ProductSortProps = {\r\n handleChange?: Function;\r\n toggleModal?: () => void;\r\n label: string;\r\n selected?: string;\r\n sort: Select;\r\n showModal?: boolean;\r\n isMobile: boolean;\r\n};\r\n\r\nconst ProductSort = (props: ProductSortProps) => {\r\n const { label, sort, handleChange = () => { }, toggleModal = () => { }, showModal = false, selected, isMobile } = props;\r\n const modalRef = useRef<any>(null)\r\n const sortRef = useRef<any>(null)\r\n useEffect(() => {\r\n if (!showModal) {\r\n return () => { }\r\n }\r\n\r\n const handleClickEvent = (e: MouseEvent) => {\r\n if (modalRef.current) {\r\n const isClickInsideSort = modalRef.current.contains(e.target)\r\n if (!isClickInsideSort) {\r\n toggleModal();\r\n }\r\n }\r\n }\r\n\r\n window.addEventListener(\"click\", handleClickEvent);\r\n return () => {\r\n window.removeEventListener(\"click\", handleClickEvent);\r\n }\r\n }, [showModal])\r\n\r\n return (\r\n <SortWrap ref={modalRef}>\r\n <SolidButton\r\n theme={ButtonTheme.WhiteToBlack}\r\n text={label}\r\n iconAfter={<ButtonIcon />}\r\n onClick={() => { toggleModal(); }}\r\n height={ButtonHeight.Filter}\r\n padding={{ x: isMobile ? 12 : 24 }}\r\n />\r\n <SortOptions\r\n css={{\r\n ...(showModal && {\r\n right: '0px',\r\n }),\r\n }}\r\n\r\n onSubmit={(e) => {\r\n return false;\r\n }}\r\n onChange={(e) => {\r\n handleChange(e?.target);\r\n }}\r\n ref={sortRef}\r\n >\r\n {sort.options.map((opt, idx) => {\r\n return (\r\n <SortLabel key={idx}>\r\n <SortOption type=\"radio\" name=\"ProductSort\" value={opt.value} />\r\n {opt.value === selected && <RadioChecked />}\r\n {opt.value !== selected && <Radio />}\r\n {opt.text}\r\n </SortLabel>\r\n );\r\n })}\r\n </SortOptions>\r\n </SortWrap>\r\n );\r\n};\r\n\r\nexport default ProductSort;\r\n","import factory from './icon';\r\nimport Svg12x12 from './Glyphs/Filter_12x12.svg';\r\n\r\nexport const Filter12x12 = factory(Svg12x12, 12, 12);\r\n","import React from 'react';\r\nimport { styled } from '@glitz/react';\r\nimport FacetValueViewModel from 'Shared/Facet/FacetValueViewModel.type';\r\nimport * as style from 'Shared/Style';\r\nimport Image, { Ratio as ImageRatio } from 'Shared/Image/Ratio';\r\nimport { TextInline, ResponsiveSize } from 'Shared/SharedComponents/atoms/Typography';\r\n\r\ntype PropType = { value: FacetValueViewModel; toggleSelected: () => void };\r\n\r\nconst OptionCardWrap = styled.div({\r\n background: style.colors.monochrome.white,\r\n border: {\r\n xy: {\r\n width: '1px',\r\n style: 'solid',\r\n color: style.colors.monochrome.white,\r\n },\r\n },\r\n boxShadow: '0px 1px 2px rgba(0, 0, 0, 0.15)',\r\n borderRadius: '8px',\r\n display: 'flex',\r\n flexDirection: 'row',\r\n alignItems: 'center',\r\n padding: { x: '12px', y: '14px' },\r\n gap: '4px',\r\n cursor: 'pointer',\r\n})\r\n\r\nconst OptionCardWrapSelected = styled(OptionCardWrap, {\r\n border: {\r\n xy: {\r\n color: style.colors.monochrome.black,\r\n },\r\n },\r\n})\r\n\r\nconst OptionCardImage = styled(Image, {\r\n width: '16px',\r\n})\r\n\r\nconst IconText = styled(TextInline, {\r\n textAlign: 'center',\r\n display: 'block',\r\n width: '100%',\r\n})\r\n\r\nconst Text = styled(TextInline, {\r\n textAlign: 'center',\r\n})\r\n\r\nconst OptionCard = ({ value, toggleSelected }: PropType) => {\r\n\r\n const TextElement = value.icon ? IconText : Text;\r\n const Wrap = value.selected ? OptionCardWrapSelected : OptionCardWrap;\r\n\r\n return (\r\n <Wrap\r\n onClick={toggleSelected}\r\n css={{\r\n justifyContent: value.icon ? 'left' : 'center',\r\n }}\r\n >\r\n {value.icon && (\r\n <OptionCardImage\r\n src={{ url: value.icon?.url }}\r\n alt={value.displayName}\r\n ratio={ImageRatio.OneToOneFill}\r\n />\r\n )}\r\n <TextElement fontSize={ResponsiveSize.D12_M12} upperCase>\r\n {value.displayName}\r\n </TextElement>\r\n </Wrap>\r\n );\r\n};\r\n\r\nconst ColorOptionCardWrap = styled.div({\r\n background: style.colors.monochrome.white,\r\n border: {\r\n xy: {\r\n width: '1px',\r\n style: 'solid',\r\n color: style.colors.monochrome.white\r\n },\r\n },\r\n boxShadow: '0px 1px 2px rgba(0, 0, 0, 0.15)',\r\n borderRadius: '8px',\r\n display: 'flex',\r\n flexDirection: 'column',\r\n justifyContent: 'center',\r\n alignItems: 'center',\r\n padding: { x: '12px', y: '14px' },\r\n gap: '8px',\r\n cursor: 'pointer',\r\n})\r\n\r\nconst ColorOptionCardWrapSelected = styled(ColorOptionCardWrap, {\r\n border: {\r\n xy: {\r\n color: style.colors.monochrome.black,\r\n },\r\n },\r\n})\r\n\r\nconst ColorCircle = styled.div({\r\n width: '24px',\r\n height: '24px',\r\n border: {\r\n xy: {\r\n width: '1px',\r\n style: 'solid',\r\n color: 'rgba(0, 0, 0, 0.3)',\r\n },\r\n },\r\n borderRadius: '48px',\r\n})\r\n\r\nexport const ColorOptionCard = ({ value, toggleSelected }: PropType) => {\r\n const Wrap = value.selected ? ColorOptionCardWrapSelected : ColorOptionCardWrap;\r\n\r\n return (\r\n <Wrap onClick={toggleSelected}>\r\n <ColorCircle css={{ background: value.id, }} />\r\n <TextInline fontSize={ResponsiveSize.D10_M10} upperCase>\r\n {value.displayName}\r\n </TextInline>\r\n </Wrap>\r\n );\r\n};\r\n\r\nexport default OptionCard;\r\n","import React, { useEffect, useMemo, useRef, useState } from 'react';\r\nimport connect from 'Shared/connect';\r\nimport { styled } from '@glitz/react';\r\nimport * as style from 'Shared/Style';\r\nimport { debounce } from 'lodash';\r\nimport { formatPrice } from 'Shared/number-format';\r\n\r\ntype PropType = {\r\n min: number;\r\n max: number;\r\n selectedMin: number;\r\n selectedMax: number;\r\n culture: string;\r\n currency: string;\r\n updateValue: (selectedMin: number, selectedMax: number) => void;\r\n};\r\n\r\nconst Label = styled.span({\r\n display: 'inline-block',\r\n textAlign: 'center', \r\n padding: {\r\n y: '5px',\r\n x: '8px',\r\n }, \r\n fontSize: '14px',\r\n textTransform: 'uppercase',\r\n fontWeight: 500,\r\n lineHeight: '100%',\r\n color: style.colors.monochrome.black,\r\n boxSizing: 'border-box',\r\n})\r\n\r\nconst LabelWrap = styled.div({\r\n position: 'absolute',\r\n zIndex: 2,\r\n pointerEvents: 'none',\r\n top: '-5px',\r\n})\r\n\r\nconst Wrap = styled.div({\r\n position: 'relative', \r\n minHeight: '25px', \r\n marginTop: '12px', \r\n width: '100%'\r\n})\r\n\r\nconst FromInput = styled.input({\r\n position: 'absolute',\r\n appearance: 'none',\r\n height: 0,\r\n width: '100%',\r\n backgroundColor: style.colors.monochrome.darkGrey,\r\n zIndex: 1,\r\n pointerEvents: 'none',\r\n '::-webkit-slider-thumb': {\r\n appearance: 'none',\r\n pointerEvents: 'all',\r\n height: '24px',\r\n backgroundColor: style.colors.monochrome.white,\r\n border: { xy: { width: '1px', style: 'solid', color: style.colors.monochrome.black } },\r\n borderRadius: '48px',\r\n cursor: 'pointer',\r\n padding: {\r\n y: '5px',\r\n x: '8px',\r\n },\r\n },\r\n})\r\n\r\nconst ToInput = styled.input({\r\n position: 'absolute',\r\n appearance: 'none',\r\n height: '2px',\r\n width: '100%',\r\n backgroundColor: style.colors.monochrome.darkGrey,\r\n pointerEvents: 'none',\r\n '::-webkit-slider-thumb': {\r\n appearance: 'none',\r\n pointerEvents: 'all',\r\n height: '24px',\r\n padding: {\r\n y: '5px',\r\n x: '8px',\r\n },\r\n backgroundColor: style.colors.monochrome.white,\r\n border: { xy: { width: '1px', style: 'solid', color: style.colors.monochrome.black } },\r\n borderRadius: '48px',\r\n cursor: 'pointer',\r\n },\r\n})\r\n\r\nconst DoubleSlider = connect(state => ({\r\n culture: state.appShellData.culture,\r\n currency: state.appShellData.market.currency,\r\n}))\r\n(({ min, max, selectedMin, selectedMax, currency, culture, updateValue }: PropType) => {\r\n \r\n if(min === max) {\r\n return <></>;\r\n }\r\n\r\n const sliderRange = (max - min === 0 ? 1 : max -min);\r\n const valueToPercentage = (value: number) => {\r\n return Math.round(((value - min) * 100) / sliderRange);\r\n };\r\n\r\n const percentageToValue = (percentage: number) => {\r\n return Math.round((percentage * sliderRange) / 100 + min);\r\n };\r\n \r\n const fromSliderRef = useRef<HTMLInputElement>(null);\r\n const toSliderRef = useRef<HTMLInputElement>(null);\r\n const [fromPosition, setFromPosition] = useState(valueToPercentage(selectedMin ?? min));\r\n const [toPosition, setToPosition] = useState(valueToPercentage(selectedMax ?? max));\r\n const [sliderFromWidth, setSliderFromWidth] = useState(0);\r\n const [sliderToWidth, setSliderToWidth] = useState(0);\r\n\r\n const updateValueDebounced = useMemo(() => debounce(updateValue, 1000), [updateValue]);\r\n\r\n useEffect(() => {\r\n const newSelectedMin = percentageToValue(fromPosition);\r\n const newSelectedMax = percentageToValue(toPosition);\r\n if (newSelectedMin !== selectedMin || newSelectedMax !== selectedMax) {\r\n updateValueDebounced(newSelectedMin, newSelectedMax);\r\n }\r\n }, [fromPosition, toPosition]);\r\n\r\n const updateWidth = (e: HTMLSpanElement, isFirst: boolean) => {\r\n if (e) {\r\n if(isFirst) {\r\n setSliderFromWidth(e.offsetWidth);\r\n } else {\r\n setSliderToWidth(e.offsetWidth);\r\n }\r\n }\r\n }\r\n\r\n return (\r\n <Wrap>\r\n <FromInput\r\n ref={fromSliderRef}\r\n type=\"range\"\r\n value={fromPosition}\r\n onChange={(e) => setFromPosition(parseInt(e.target.value, 10))}\r\n css={{\r\n '::-webkit-slider-thumb': {\r\n width: `${sliderFromWidth}px`,\r\n },\r\n }}\r\n />\r\n <LabelWrap\r\n css={{\r\n width: `calc(100% - ${sliderFromWidth}px)`,\r\n transform: `translate(${fromPosition}%, -7px)`,\r\n }}\r\n >\r\n <Label ref={ref => ref ? updateWidth(ref, true) : null}>\r\n {formatPrice(percentageToValue(fromPosition), currency, culture)}\r\n </Label>\r\n </LabelWrap>\r\n <ToInput\r\n ref={toSliderRef}\r\n type=\"range\"\r\n value={toPosition}\r\n onChange={(e) => setToPosition(parseInt(e.target.value, 10))}\r\n css={{\r\n backgroundImage: `linear-gradient(\r\n to right,\r\n ${style.colors.monochrome.darkGrey} 0%,\r\n ${style.colors.monochrome.darkGrey} ${fromPosition}%,\r\n ${style.colors.monochrome.black} ${fromPosition}%,\r\n ${style.colors.monochrome.black} ${toPosition}%, \r\n ${style.colors.monochrome.darkGrey} ${toPosition}%, \r\n ${style.colors.monochrome.darkGrey} 100%)`,\r\n '::-webkit-slider-thumb': {\r\n width: `${sliderToWidth}px`,\r\n },\r\n }}\r\n />\r\n <LabelWrap\r\n css={{\r\n width: `calc(100% - ${sliderToWidth}px)`,\r\n transform: `translate(${toPosition}%, -7px)`,\r\n }}\r\n >\r\n <Label ref={ref => ref ? updateWidth(ref, false) : null}>\r\n {formatPrice(percentageToValue(toPosition), currency, culture)}\r\n </Label>\r\n </LabelWrap>\r\n </Wrap>\r\n );\r\n});\r\n\r\nexport default DoubleSlider;\r\n","import React, { useEffect } from 'react';\r\nimport FacetViewModel from 'Shared/Facet/FacetViewModel.type';\r\nimport DoubleSlider from 'Shared/SharedComponents/atoms/DoubleSlider';\r\n\r\ntype PropType = { filter: FacetViewModel; updateValue: (filter: FacetViewModel) => void };\r\n\r\nconst PriceSlider = ({ filter, updateValue }: PropType) => {\r\n const updatePriceRange = (selectedMin: number, selectedMax: number) => {\r\n updateValue({\r\n ...filter,\r\n minSelected: selectedMin,\r\n maxSelected: selectedMax,\r\n });\r\n };\r\n \r\n return ( \r\n <DoubleSlider\r\n min={filter.min}\r\n max={filter.max}\r\n selectedMin={filter.minSelected}\r\n selectedMax={filter.maxSelected}\r\n updateValue={updatePriceRange}\r\n />\r\n );\r\n};\r\n\r\nexport default PriceSlider;\r\n","import React from 'react';\r\nimport { styled } from '@glitz/react';\r\nimport FacetValueViewModel from 'Shared/Facet/FacetValueViewModel.type';\r\nimport OptionCard, { ColorOptionCard } from './OptionCard';\r\nimport FacetViewModel from 'Shared/Facet/FacetViewModel.type';\r\nimport PriceSlider from './PriceSlider';\r\n\r\nconst numberOfColumns = (filterId: string) => (filterId === 'size' || filterId === 'color_base_groups' ? 4 : 2);\r\n\r\nconst SectionWrap = styled.div({\r\n display: 'grid',\r\n columnGap: '8px',\r\n rowGap: '8px',\r\n padding: { xy: '1px' },\r\n overflow: 'hidden',\r\n marginTop: '24px'\r\n});\r\n\r\nconst PriceWrap = styled.div({\r\n paddingTop: '24px'\r\n})\r\n\r\nconst PriceHeading = styled.span({\r\n fontWeight: 500,\r\n fontSize: '12px',\r\n lineHeight: '100%',\r\n display: 'block',\r\n paddingBottom: '16px',\r\n textTransform: 'uppercase',\r\n})\r\n\r\ntype PropType = {\r\n filter: FacetViewModel;\r\n subHeading?: string;\r\n onFilterValuesUpdated: (filterValues: FacetValueViewModel[], ticket: string) => void;\r\n onPriceUpdated: (filter: FacetViewModel, ticket: string) => void;\r\n};\r\n\r\nconst FilterSection = ({ filter, subHeading, onFilterValuesUpdated, onPriceUpdated }: PropType) => {\r\n const templateColumns = '1fr '.repeat(numberOfColumns(filter.id));\r\n if (filter.id === 'price') {\r\n return (\r\n <PriceWrap>\r\n <PriceHeading>{subHeading}</PriceHeading>\r\n <PriceSlider\r\n filter={filter}\r\n updateValue={(filter) => {\r\n onPriceUpdated(filter, 'price');\r\n }}\r\n />\r\n </PriceWrap>\r\n );\r\n }\r\n\r\n if(filter.type === \"CHECKBOX\") {\r\n return (\r\n <></>\r\n );\r\n }\r\n\r\n return (\r\n <SectionWrap\r\n css={{\r\n gridTemplateColumns: templateColumns,\r\n }}\r\n >\r\n {filter?.values.map((filterValue) =>\r\n filter.id === 'color_base_groups' ? (\r\n <ColorOptionCard\r\n key={filterValue.id}\r\n value={filterValue}\r\n toggleSelected={() => {\r\n filterValue.selected = !filterValue.selected;\r\n onFilterValuesUpdated(filter.values, filterValue.ticket);\r\n }}\r\n />\r\n ) : (\r\n <OptionCard\r\n key={filterValue.id}\r\n value={filterValue}\r\n toggleSelected={() => {\r\n filterValue.selected = !filterValue.selected;\r\n onFilterValuesUpdated(filter.values, filterValue.ticket);\r\n }}\r\n />\r\n ),\r\n )}\r\n </SectionWrap>\r\n );\r\n};\r\n\r\nexport default FilterSection;\r\n","import React from 'react';\r\nimport { styled } from '@glitz/react';\r\nimport FacetValueViewModel from 'Shared/Facet/FacetValueViewModel.type';\r\nimport FacetViewModel from 'Shared/Facet/FacetViewModel.type';\r\nimport * as style from 'Shared/Style';\r\n\r\ntype PropType = { \r\n facet: FacetViewModel;\r\n onFilterValuesUpdated: (filterValues: FacetValueViewModel[], ticket: string) => void;\r\n};\r\n\r\nconst ToggleLabel = styled.label({\r\n position: 'relative',\r\n outlineStyle: 'none',\r\n display: 'inline-flex',\r\n alignItems: 'center',\r\n flexDirection: 'row-reverse',\r\n cursor: 'pointer',\r\n})\r\n\r\nconst ToggleInput = styled.input({\r\n position: 'absolute',\r\n top: '-99999px',\r\n left: '-99999px',\r\n})\r\n\r\nconst ToggleSwitch = styled.div({\r\n position: 'relative',\r\n cursor: 'pointer',\r\n marginRight: '8px',\r\n height: '16px',\r\n width: '28px',\r\n border: {\r\n xy: {\r\n width: '1px',\r\n style: 'solid',\r\n color: style.colors.monochrome.black,\r\n },\r\n },\r\n borderRadius: '38px',\r\n ':before': {\r\n position: 'absolute',\r\n content: \"''\",\r\n height: '12px',\r\n width: '12px',\r\n left: '1px',\r\n bottom: '1px',\r\n borderRadius: '50%',\r\n },\r\n})\r\n\r\nconst LabelText = styled.span({\r\n color: style.colors.monochrome.black,\r\n fontSize: '14px',\r\n lineHeight: '130%'\r\n});\r\n\r\n\r\nconst SwitchOption = ({ facet, onFilterValuesUpdated }: PropType) => {\r\n const value = facet.values[0];\r\n\r\n const toggleSelected = () => {\r\n value.selected = !value.selected;\r\n onFilterValuesUpdated(facet.values, value.ticket);\r\n }\r\n\r\n const TRANSITION_DURATION = '.4s';\r\n return (\r\n <ToggleLabel\r\n css={{\r\n transitionDuration: TRANSITION_DURATION,\r\n \r\n }}\r\n >\r\n <LabelText>{value.displayName}</LabelText>\r\n <ToggleInput\r\n type=\"checkbox\"\r\n checked={value.selected}\r\n onChange={toggleSelected}\r\n />\r\n <ToggleSwitch\r\n css={{\r\n border: {\r\n xy: {\r\n color: value.selected ? style.colors.brandColors.green : style.colors.monochrome.black,\r\n },\r\n },\r\n transitionDuration: TRANSITION_DURATION,\r\n backgroundColor: value.selected ? style.colors.brandColors.green : style.colors.monochrome.white,\r\n ':before': {\r\n backgroundColor: value.selected ? style.colors.monochrome.white : style.colors.monochrome.black,\r\n transitionDuration: TRANSITION_DURATION,\r\n transform: value.selected ? 'translateX(12px)' : undefined,\r\n },\r\n }}\r\n ></ToggleSwitch>\r\n </ToggleLabel>\r\n );\r\n};\r\n\r\nexport default SwitchOption;\r\n","import React from 'react';\r\nimport { styled, StyledProps } from '@glitz/react';\r\nimport { Style, StyleOrStyleArray } from '@glitz/type';\r\nimport { StyledDecorator } from '@glitz/react/types/styled/decorator';\r\nimport { Close12x12 as Close } from 'Shared/Icons/Close';\r\nimport FacetViewModel from 'Shared/Facet/FacetViewModel.type';\r\nimport FacetValueViewModel from 'Shared/Facet/FacetValueViewModel.type';\r\nimport * as style from 'Shared/Style';\r\n\r\ntype PropType = {\r\n activeFacets: FacetViewModel[];\r\n onRemoveFacet?: Function;\r\n css?: StyledDecorator | StyleOrStyleArray<Style>;\r\n itemCss?: StyledDecorator | StyleOrStyleArray<Style>;\r\n}\r\n\r\nconst ActiveFilterContainer = styled.div({\r\n width: '100%',\r\n flexBasis: '100%',\r\n display: 'flex',\r\n flexWrap: 'wrap',\r\n gap: '8px',\r\n margin: { bottom: '24px', top: '-12px'}\r\n})\r\n\r\nexport const ActiveFilter = styled.div({\r\n display:'flex',\r\n borderRadius: '100px',\r\n textTransform: 'uppercase',\r\n padding: { y:'8px', x:'12px' },\r\n justifyContent: 'center',\r\n alignItems: 'center',\r\n font: { size:'12px', weight: 500 },\r\n cursor: 'pointer',\r\n})\r\n\r\nconst RemoveIcon = styled(Close, {\r\n marginLeft: '6px'\r\n})\r\n\r\nexport const getActiveFacets = (facets: FacetViewModel[]) => {\r\n return facets?.filter((facet) => {\r\n if (facet.type.toLowerCase() === 'range') {\r\n return facet.max !== facet.maxSelected || facet.min !== facet.minSelected\r\n }\r\n\r\n return facet.selectedCount > 0})\r\n}\r\n\r\nexport default (props: PropType & StyledProps) => {\r\n const { onRemoveFacet = () => {}, activeFacets = [], compose, itemCss = {backgroundColor: style.colors.monochrome.extraLightGrey } } = props\r\n\r\n return <ActiveFilterContainer css={compose(props.css)}>\r\n {activeFacets.map((activeFacet: FacetViewModel) => {\r\n\r\n if (activeFacet.type.toLowerCase() === 'range') {\r\n return <ActiveFilter css={ itemCss } key={activeFacet.id} onClick={() => { onRemoveFacet(activeFacet) }}>\r\n <span>{activeFacet.minSelected} - {activeFacet.maxSelected}</span><RemoveIcon />\r\n </ActiveFilter>\r\n }\r\n\r\n return activeFacet.values.map((facetValue: FacetValueViewModel) => {\r\n if (facetValue.selected === false) {\r\n return undefined\r\n }\r\n \r\n return <ActiveFilter css={ itemCss } key={facetValue.id} onClick={() => { onRemoveFacet(activeFacet, facetValue) }}>\r\n <span>{facetValue.displayName}</span><RemoveIcon />\r\n </ActiveFilter>\r\n })\r\n })}\r\n </ActiveFilterContainer>\r\n}\r\n\r\n","import React, { useState } from 'react';\r\nimport { styled } from '@glitz/react';\r\nimport Modal, { ModalScrollableContent, ModalTopContent } from 'Shared/SharedComponents/atoms/Modal';\r\nimport FacetViewModel from 'Shared/Facet/FacetViewModel.type';\r\nimport Accordion from 'Shared/Accordion';\r\nimport FilterSection from './FilterSection';\r\nimport * as style from 'Shared/Style';\r\nimport { ButtonTheme, SolidButton } from 'Shared/TextButtons';\r\nimport FacetValueViewModel from 'Shared/Facet/FacetValueViewModel.type';\r\nimport SwitchOption from './SwitchOption';\r\nimport { TextBlockTiny } from 'Shared/SharedComponents/atoms/Typography';\r\nimport ActiveFilters, { ActiveFilter as FilterItem, getActiveFacets } from '../ActiveFilters';\r\n\r\nconst FilterButtonsWrap = styled.div({\r\n width: '100%', \r\n display: 'flex', \r\n flexDirection: 'row', \r\n justifyContent: 'space-between',\r\n});\r\n\r\nconst FilterOnlyInStockWrap = styled.div({\r\n marginTop: '24px'\r\n});\r\n\r\nconst FilterOnlyInStockItem = styled.div({\r\n marginTop: '16px'\r\n});\r\n\r\nconst AccordionItem = styled(Accordion, {\r\n padding: {\r\n y: '16px'\r\n },\r\n margin: {\r\n y: 0,\r\n },\r\n})\r\n\r\nconst ActiveFacets = styled(ActiveFilters, {\r\n margin: {\r\n top: '16px',\r\n bottom: '0'\r\n }\r\n})\r\n\r\nconst ModalScrollableContentContainer = styled(ModalScrollableContent, {\r\n display: 'flex', \r\n flexDirection: 'column', \r\n alignItems: 'stretch'\r\n})\r\n\r\nconst changeFilterValue = (\r\n filters: FacetViewModel[],\r\n changedFilter: FacetViewModel,\r\n filterValues: FacetValueViewModel[],\r\n) => {\r\n return filters.map((filter) => {\r\n if (changedFilter.id === filter.id) {\r\n filter.values = filterValues;\r\n }\r\n\r\n return filter;\r\n });\r\n};\r\n\r\nconst isActiveFilter = (filters: FacetViewModel[]): boolean => {\r\n if(filters === null || filters?.length < 1) {\r\n return false;\r\n }\r\n\r\n for (let filterIndex = 0; filterIndex < filters.length; filterIndex++) {\r\n if (\r\n (filters[filterIndex].minSelected && filters[filterIndex].minSelected !== filters[filterIndex].min) ||\r\n (filters[filterIndex].maxSelected && filters[filterIndex].maxSelected !== filters[filterIndex].max)\r\n ) {\r\n return true;\r\n }\r\n\r\n const values = filters[filterIndex].values;\r\n for (let valueIndex = 0; valueIndex < values.length; valueIndex++) {\r\n if (values[valueIndex].selected) {\r\n return true;\r\n }\r\n }\r\n }\r\n\r\n return false;\r\n};\r\n\r\nconst ActiveFilterHeading = styled.div({\r\n margin: {top: '24px'},\r\n textTransform: 'uppercase',\r\n font: {\r\n weight: 500,\r\n size: '14px'\r\n }\r\n})\r\n\r\ntype PropType = {\r\n modalIsShown: boolean;\r\n hideModal: () => void;\r\n heading: string;\r\n filters: FacetViewModel[];\r\n onFiltersUpdated: (filters: FacetViewModel[], ticket: string) => void;\r\n onFiltersReset: () => void;\r\n clearFiltersLabel: string;\r\n showProductsLabel: string;\r\n activeFiltersLabel?: string | boolean;\r\n removeActiveFilter?: () => void;\r\n};\r\n\r\nconst FilterModal = ({\r\n modalIsShown,\r\n hideModal,\r\n heading,\r\n filters,\r\n onFiltersUpdated,\r\n onFiltersReset,\r\n clearFiltersLabel,\r\n showProductsLabel,\r\n activeFiltersLabel = false,\r\n removeActiveFilter\r\n}: PropType) => {\r\n const [filterIdOpen, setFilterIdOpen] = useState('');\r\n \r\n const activeFacets = getActiveFacets(filters)\r\n\r\n const itemCss = {\r\n backgroundColor: '#ffffff',\r\n boxShadow: '0px 1px 2px rgba(0, 0, 0, 0.15)'\r\n }\r\n\r\n return (\r\n <Modal\r\n modalIsShown={modalIsShown}\r\n hideModal={hideModal}\r\n backgroundColor={style.colors.monochrome.extraLightGrey}\r\n isOnLeft\r\n >\r\n <ModalTopContent textAboveHeading=\"\" bottomPadding={24} heading={heading} closeModal={hideModal} closeIconSize={24}>\r\n {(activeFacets?.length ?? 0) > 0 ? <>\r\n {activeFiltersLabel ? <ActiveFilterHeading>{activeFiltersLabel}</ActiveFilterHeading> : ''}\r\n <ActiveFacets itemCss={ itemCss } onRemoveFacet={removeActiveFilter} activeFacets={activeFacets} />\r\n </> : <></>}\r\n </ModalTopContent>\r\n <ModalScrollableContentContainer>\r\n {!!filters &&\r\n filters.map((filter, index) => {\r\n if(filter.id.toLowerCase() === \"onlyinstock\") {\r\n return (\r\n <FilterOnlyInStockWrap key={filter.id}>\r\n <TextBlockTiny upperCase >\r\n {filter.displayName}\r\n </TextBlockTiny>\r\n <FilterOnlyInStockItem>\r\n <SwitchOption \r\n facet={filter}\r\n onFilterValuesUpdated={(filterValues, ticket) => {\r\n filters = changeFilterValue(filters, filter, filterValues);\r\n onFiltersUpdated(filters, ticket);\r\n }}\r\n />\r\n </FilterOnlyInStockItem> \r\n </FilterOnlyInStockWrap>\r\n );\r\n }\r\n\r\n return (\r\n <AccordionItem\r\n key={filter.id}\r\n isOpen={filter.id === filterIdOpen}\r\n onToggle={() => {\r\n setFilterIdOpen(filter.id === filterIdOpen ? '' : filter.id);\r\n }}\r\n upperCaseHeading\r\n disabled={(filter.values.length <= 0 && filter.type.toUpperCase() === 'TEXT') || (filter.type.toUpperCase() === \"RANGE\" && filter.min === filter.max)}\r\n header={filter.selectedCount > 0 && filter.id !== 'price' ? `${filter.displayName} (${filter.selectedCount})` : filter.displayName}\r\n borderWidth={2}\r\n iconWidth={'16px'}\r\n >\r\n <FilterSection\r\n filter={filter}\r\n subHeading={filter.id === 'price' ? filter.displayName : ''}\r\n onFilterValuesUpdated={(filterValues, ticket) => {\r\n filters = changeFilterValue(filters, filter, filterValues);\r\n onFiltersUpdated(filters, ticket);\r\n }}\r\n onPriceUpdated={(changedFilter, ticket) => {\r\n const changedFilters = filters.map((filter) => {\r\n if (changedFilter.id === filter.id) {\r\n return changedFilter;\r\n }\r\n\r\n return filter;\r\n });\r\n onFiltersUpdated(changedFilters, ticket);\r\n }}\r\n />\r\n </AccordionItem>\r\n );\r\n })}\r\n </ModalScrollableContentContainer>\r\n <FilterButtonsWrap>\r\n <SolidButton\r\n text={clearFiltersLabel}\r\n onClick={() => {\r\n onFiltersReset();\r\n hideModal();\r\n }}\r\n disabled={!isActiveFilter(filters)}\r\n theme={ButtonTheme.TransparentBlack}\r\n />\r\n <SolidButton text={showProductsLabel} onClick={hideModal} theme={ButtonTheme.BlackToWhite} />\r\n </FilterButtonsWrap>\r\n </Modal>\r\n );\r\n};\r\n\r\nexport default FilterModal;\r\n","import React, { useEffect, useState, useRef } from 'react';\r\nimport connect from 'Shared/connect';\r\nimport { styled } from '@glitz/react';\r\nimport { replaceState, scrollTo, URLX, hideSpinner, showSpinner } from '@polarnopyret/scope';\r\nimport {\r\n currentUrl,\r\n get,\r\n resolveSyncIfLoadedOrThrow,\r\n} from '@polarnopyret/scope';\r\nimport ProductCard from '../ProductCard';\r\nimport ProductsListingViewModelType from './IProductsListingViewModel.type';\r\nimport FacetViewModel from 'Shared/Facet/FacetViewModel.type';\r\nimport FacetValueViewModel from 'Shared/Facet/FacetValueViewModel.type';\r\nimport { allSelectedValues } from 'Shared/Facet/toggle-facet';\r\nimport { PageType } from 'Shared/State';\r\nimport CategoryDataModel from '../../Category/CategoryPage.type';\r\nimport { isCompact } from 'Shared/Viewport';\r\nimport { SEARCH_QUERY_NAME } from 'Search/action-creators';\r\nimport { EpiProperty } from '@polarnopyret/scope-episerver';\r\nimport Pagination from 'Shared/SharedComponents/atoms/Pagination';\r\nimport ProductSort from 'Shared/SharedComponents/atoms/ProductSort';\r\nimport ProductListViewModel from 'Product/ProductListing/ProductListViewModel.type';\r\nimport { ButtonHeight, ButtonTheme, SolidButton } from 'Shared/TextButtons';\r\nimport { Filter12x12 } from 'Shared/Icons/Filter';\r\nimport FilterModal from './FilterModal';\r\nimport { createGridClasses } from 'Shared/grid';\r\nimport { GridWrap } from 'Shared/PageLayout';\r\nimport ActiveFilters, { getActiveFacets } from './ActiveFilters';\r\nimport * as style from 'Shared/Style';\r\nimport { Dispatch } from 'Shared/State';\r\nimport { getCurrentBaseUrl } from 'Shared/utils';\r\nimport { updateCanonicalUrl } from 'Shared/reducers';\r\n\r\nconst ActiveFacets = styled(ActiveFilters, {})\r\n\r\ntype ConnectedPropType = {\r\n currentBreakpoint: number;\r\n headerHeight: number;\r\n currentPage: PageType;\r\n};\r\n\r\ntype RequiredPropType = ProductsListingViewModelType & {\r\n queryParams?: string;\r\n className?: string;\r\n title?: string;\r\n content?: CategoryDataModel;\r\n setFilterResults?: (value: any) => void;\r\n};\r\n\r\ntype PropType = RequiredPropType &\r\n ConnectedPropType & {\r\n uppercase?: boolean;\r\n hideFacetAndSort?: boolean;\r\n };\r\n\r\nconst Filters = styled.div({\r\n});\r\n\r\nconst ProductListHeading = styled.div({\r\n display: 'flex',\r\n justifyContent: 'center',\r\n alignSelf: 'center',\r\n width: '100%',\r\n});\r\n\r\nconst ListHeading = styled.span({\r\n fontSize: '14px',\r\n fontWeight: 450,\r\n lineHeight: '130%',\r\n});\r\n\r\nconst ProductListTop = styled.div({\r\n display: 'flex',\r\n marginBottom: '24px',\r\n});\r\n\r\nconst RowWrap = styled(GridWrap, {\r\n marginBottom: '24px'\r\n})\r\n\r\nconst ItemWrap = styled.div({\r\n marginBottom: '24px'\r\n})\r\n\r\nconst ProductListTopWrap = styled(GridWrap, {\r\n position: 'sticky',\r\n zIndex: 2,\r\n})\r\n\r\nfunction getWithSpinner(\r\n url: URLX,\r\n thenAction: (any: any) => void,\r\n canonicalUrl?: string,\r\n) {\r\n return (dispatch: Dispatch) => {\r\n dispatch(showSpinner());\r\n return get(url, {})\r\n .then((r) => r.json())\r\n .then(thenAction)\r\n .finally(() => {\r\n if (canonicalUrl) {\r\n dispatch(updateCanonicalUrl(canonicalUrl));\r\n }\r\n dispatch(hideSpinner());\r\n });\r\n };\r\n}\r\n\r\nfunction ProductsListing(props: PropType & {\r\n getWithSpinner: (\r\n url: URLX,\r\n thenAction: (any: any) => void,\r\n canonicalUrl?: string,\r\n ) => Promise<void>;\r\n}) {\r\n const {\r\n currentBreakpoint,\r\n content,\r\n productList,\r\n headerHeight,\r\n hideFacetAndSort = false,\r\n getWithSpinner\r\n } = props;\r\n\r\n const [showProductSortModal, setShowProductSortModal] = useState(false);\r\n const [filterModalIsShown, setFilterModalIsShown] = useState(false);\r\n const [selectedFacets, setSelectedFacets] = useState(productList.facets);\r\n const [selectedSortBy, setSelectedSortBy] = useState(productList.sortOptions?.value);\r\n const productListTop = useRef<HTMLDivElement>(null)\r\n const itemsPerRow = 4;\r\n\r\n useEffect(() => {\r\n setSelectedFacets(productList.facets);\r\n }, productList.facets);\r\n\r\n useEffect(() => {\r\n setSelectedSortBy(productList.sortOptions?.value);\r\n }, productList.sortOptions?.options);\r\n\r\n function getParsedCurrentUrl() {\r\n const url = currentUrl();\r\n url.searchParams.delete('page');\r\n return url;\r\n }\r\n\r\n function appendFilterPath(url: URLX) {\r\n url.pathname = url.pathname + '/filter';\r\n return url;\r\n }\r\n\r\n function onRemoveFacet(facet: FacetViewModel, value: FacetValueViewModel | undefined) {\r\n if (facet.type.toLowerCase() === 'range') {\r\n const updatedFacets = selectedFacets.map((curr) => {\r\n if (curr.id === facet.id) {\r\n curr.maxSelected = curr.max\r\n curr.minSelected = curr.min\r\n }\r\n return curr\r\n })\r\n onFacetValueChange(updatedFacets)\r\n return\r\n }\r\n\r\n const updatedFacets = selectedFacets.map((currentFacet) => {\r\n currentFacet.values = currentFacet.values.map((currentValue) => {\r\n if (value.id === currentValue.id) {\r\n currentValue.selected = false\r\n }\r\n return currentValue\r\n })\r\n return currentFacet\r\n })\r\n\r\n onFacetValueChange(updatedFacets)\r\n }\r\n\r\n function onFacetValueChange(updatedFacets: FacetViewModel[], ticket: string = '') {\r\n if (!props.setFilterResults) {\r\n return;\r\n }\r\n\r\n const url = getParsedCurrentUrl();\r\n\r\n if (props.queryParams) {\r\n url.searchParams.set(SEARCH_QUERY_NAME, props.queryParams);\r\n }\r\n\r\n for (const facet of updatedFacets) {\r\n url.searchParams.delete(facet.urlName);\r\n for (const selected of allSelectedValues(facet.values)) {\r\n url.searchParams.append(facet.urlName, selected.renderAsCheckBox ? selected.selected.toString() : selected.id);\r\n }\r\n\r\n if (facet.id === 'price' && (facet.min !== facet.minSelected || facet.max !== facet.maxSelected)) {\r\n url.searchParams.append(facet.urlName, `${facet.minSelected}-${facet.maxSelected}`);\r\n }\r\n }\r\n\r\n const addressBarUrl = url.toString();\r\n getWithSpinner(appendFilterPath(url), (json: ProductListViewModel) => {\r\n props.setFilterResults(json);\r\n setSelectedFacets(json.facets);\r\n replaceState(addressBarUrl, null, false);\r\n }).then(() => {\r\n scrollTo(productListTop.current.offsetTop, 500);\r\n });\r\n }\r\n\r\n function onResetFacetValues() {\r\n if (!props.setFilterResults) {\r\n return;\r\n }\r\n\r\n const url = getParsedCurrentUrl();\r\n props.productList.facets.forEach((facet) => {\r\n url.searchParams.delete(facet.urlName);\r\n })\r\n\r\n const addressBarUrl = url.toString();\r\n getWithSpinner(appendFilterPath(url), (json: ProductListViewModel) => {\r\n props.setFilterResults(json);\r\n setSelectedFacets(json.facets);\r\n replaceState(addressBarUrl, null, false);\r\n }).then(() => {\r\n scrollTo(productListTop.current.offsetTop, 500);\r\n });\r\n }\r\n\r\n const toggleSortModal = () => {\r\n setShowProductSortModal(!showProductSortModal);\r\n if (filterModalIsShown && showProductSortModal) {\r\n setFilterModalIsShown(false);\r\n }\r\n };\r\n\r\n const handleProductSortChange = (elm: HTMLInputElement) => {\r\n const sortBy = elm.value;\r\n setSelectedSortBy(sortBy);\r\n setShowProductSortModal(false);\r\n const url = getParsedCurrentUrl();\r\n url.searchParams.set('sort', sortBy);\r\n bindFilterResults(url);\r\n };\r\n\r\n const navigateToPage = (number: number) => {\r\n const url = currentUrl();\r\n url.searchParams.set('page', number.toString());\r\n const canonicalUrl = getCurrentBaseUrl();\r\n if (number > 1) {\r\n canonicalUrl.searchParams.set('page', number.toString());\r\n }\r\n bindFilterResults(url, canonicalUrl.toString());\r\n };\r\n\r\n const bindFilterResults = (url: URLX, canonicalUrl?: string) => {\r\n if (!props.setFilterResults) {\r\n return;\r\n }\r\n const displayUrl = url.toString();\r\n // Scroll to top first to keep images from getting into view when scrolling up. Messes up lazy loading\r\n if (productListTop.current) {\r\n scrollTo(productListTop.current.offsetTop, 500);\r\n }\r\n\r\n getWithSpinner(appendFilterPath(url), (json: ProductListViewModel) => {\r\n props.setFilterResults(json);\r\n replaceState(displayUrl, null, false);\r\n }, canonicalUrl).then(() => {\r\n\r\n });\r\n };\r\n\r\n const totalCount = productList.totalItemCount;\r\n const visibleCount = productList.products.length;\r\n const isMobile = isCompact(currentBreakpoint);\r\n const filterStickyTop = headerHeight + 16;\r\n const activeFacets: FacetViewModel[] = getActiveFacets(productList.facets)\r\n\r\n const listContentItems = productList.listContentItems && productList.listContentItems.reduce((map, obj) => (map[isMobile ? obj.mobileIndex : obj.desktopIndex] = obj.content?.items[0], map), {});\r\n\r\n const MainContent = content && content.topContentArea && <EpiProperty for={content.topContentArea} />;\r\n const totalCountTitle = productList.labels?.displayingItems;\r\n const items: any[] = [];\r\n\r\n for (let i = 0; i < visibleCount; i++) {\r\n if (listContentItems) {\r\n const listItem = listContentItems[i + 1];\r\n if (listItem) {\r\n const SomeComponent = resolveSyncIfLoadedOrThrow(listItem.componentName);\r\n items.push(<ItemWrap key={'b' + i} className={createGridClasses(12, 6)}><SomeComponent {...listItem} layout='list' /></ItemWrap>);\r\n }\r\n }\r\n\r\n items.push(<ItemWrap key={'i' + i} className={createGridClasses(6, (12 / itemsPerRow))}><ProductCard product={productList.products[i]} listIndex={i} /></ItemWrap>);\r\n }\r\n\r\n const GalleryContent = (\r\n <RowWrap className='grid'>\r\n {items.map((item) => {\r\n return item;\r\n })}\r\n </RowWrap>\r\n );\r\n\r\n return (\r\n <div>\r\n {MainContent}\r\n <ProductListTopWrap css={{ top: `${filterStickyTop}px` }}>\r\n <ProductListTop ref={productListTop}>\r\n {!hideFacetAndSort && (\r\n <Filters>\r\n <SolidButton\r\n onClick={() => { setFilterModalIsShown(true); setShowProductSortModal(false); }}\r\n theme={ButtonTheme.WhiteToBlack}\r\n text={productList.labels.filter}\r\n iconAfter={<Filter12x12 css={{ marginLeft: 8 }} />}\r\n height={ButtonHeight.Filter}\r\n />\r\n <FilterModal\r\n modalIsShown={filterModalIsShown}\r\n hideModal={() => setFilterModalIsShown(false)}\r\n heading={productList.labels.filters}\r\n activeFiltersLabel={productList.labels.activeFilters ?? 'productList.labels.activeFilters'}\r\n removeActiveFilter={onRemoveFacet.bind(this)}\r\n filters={selectedFacets}\r\n onFiltersUpdated={(facets, ticket) => onFacetValueChange(facets, ticket)}\r\n onFiltersReset={() => onResetFacetValues()}\r\n clearFiltersLabel={productList.labels.clearFilter}\r\n showProductsLabel={productList.labels.showProducts}\r\n />\r\n </Filters>\r\n )}\r\n {productList.labels &&\r\n <ProductListHeading>\r\n <ListHeading>{productList.labels.nrItems}</ListHeading>\r\n </ProductListHeading>\r\n }\r\n {!hideFacetAndSort && (\r\n <ProductSort\r\n toggleModal={() => toggleSortModal()}\r\n handleChange={handleProductSortChange}\r\n showModal={showProductSortModal}\r\n label={productList.labels.sort}\r\n sort={productList.sortOptions}\r\n selected={selectedSortBy || productList.sortOptions.value}\r\n isMobile={isMobile}\r\n />\r\n )}\r\n\r\n </ProductListTop>\r\n </ProductListTopWrap>\r\n {(activeFacets?.length ?? 0) > 0 && <GridWrap><ActiveFacets onRemoveFacet={onRemoveFacet} activeFacets={activeFacets} /></GridWrap>}\r\n {GalleryContent}\r\n <GridWrap>\r\n <Pagination\r\n currentPage={productList.currentPageIndex}\r\n currentlyDisplayedItemCount={visibleCount}\r\n pageCount={productList.totalPages}\r\n totalItemCount={totalCount}\r\n totalItemCountLabel={totalCountTitle}\r\n navigateToPage={navigateToPage}\r\n totalItemCountTextColor={style.colors.monochrome.a11ygrey}\r\n />\r\n </GridWrap>\r\n </div>\r\n )\r\n};\r\n\r\nexport default connect((state) => ({\r\n currentBreakpoint: state.currentBreakpoint,\r\n headerHeight: state.UI.headerHeight,\r\n currentPage: state.currentPage,\r\n}),\r\n (dispatch) => ({\r\n getWithSpinner(url: URLX, thenAction: (any: any) => void, canonicalUrl?: string) {\r\n return dispatch(getWithSpinner(url, thenAction, canonicalUrl));\r\n },\r\n }),)(ProductsListing);","import React from 'react';\r\nimport ContentViewModel from 'Shared/ViewModels/ContentViewModel.type';\r\nimport { styled, StyledProps } from '@glitz/react';\r\nimport { Preset, Ratio, RatioPicture } from 'Shared/Image/Ratio';\r\nimport Link from 'Shared/Link';\r\nimport { ArticleTag, ResponsiveSize, H2 } from 'Shared/SharedComponents/atoms/Typography';\r\n\r\ntype PropType = StyledProps & {\r\n cmsPage: ContentViewModel;\r\n isCompact: boolean;\r\n className?: string;\r\n breakPoint: number;\r\n};\r\n\r\nexport default styled((props: PropType) => {\r\n const { cmsPage, isCompact } = props;\r\n return (\r\n <Link\r\n className={props.className}\r\n to={cmsPage.url}\r\n css={{\r\n textDecoration: 'none',\r\n color: 'black',\r\n width: '100%',\r\n }}\r\n draggable={false}\r\n >\r\n <RatioPicture\r\n src={cmsPage.image}\r\n title={cmsPage.title}\r\n alt={cmsPage.title}\r\n ratio={Ratio.FourToThree}\r\n preset={Preset.CmsListItem}\r\n borderRadius={8}\r\n css={{\r\n marginBottom: '16px',\r\n }}\r\n />\r\n <styled.Div\r\n css={{\r\n gap: '12px',\r\n ...(isCompact && {\r\n padding: {\r\n top: '0px',\r\n right: '16px',\r\n bottom: '0px',\r\n left: '0px',\r\n },\r\n }),\r\n }}\r\n >\r\n {cmsPage.articleTag && <ArticleTag upperCase shouldAlwaysClaimHeight>{cmsPage.articleTag}</ArticleTag>}\r\n <H2 upperCase={false} fontSize={ResponsiveSize.D24_M24} shouldAlwaysClaimHeight>\r\n {cmsPage.title}\r\n </H2>\r\n {cmsPage.articleTags?.length > 0 && (\r\n <ArticleTag upperCase shouldAlwaysClaimHeight>\r\n {cmsPage.articleTags?.slice(0, 3).join(', ')}\r\n {(cmsPage.articleTags?.length ?? 0) > 3 && `, +${cmsPage.articleTags?.length - 3}`}\r\n </ArticleTag>\r\n )}\r\n </styled.Div>\r\n </Link>\r\n );\r\n});\r\n","import React, { useState, Ref, useRef } from 'react';\r\nimport {\r\n currentUrl, get, replaceState, URLX\r\n} from '@polarnopyret/scope';\r\nimport ContentViewModel from 'Shared/ViewModels/ContentViewModel.type';\r\nimport CmsPageListViewModel from '../CmsPageListViewModel.type';\r\nimport CmsPageCard from './CmsPageCard';\r\nimport { styled, StyledProps } from '@glitz/react';\r\nimport { createGridClasses } from 'Shared/grid';\r\nimport { GridWrap } from 'Shared/PageLayout';\r\nimport Pagination from 'Shared/SharedComponents/atoms/Pagination';\r\nimport * as style from 'Shared/Style';\r\n\r\ntype PropType = StyledProps & {\r\n cmsPageList: CmsPageListViewModel;\r\n uppercase: boolean;\r\n isMobile: boolean;\r\n breakPoint: number;\r\n};\r\n\r\nexport default styled((props: PropType) => {\r\n const {\r\n isMobile,\r\n breakPoint,\r\n } = props;\r\n \r\n const [cmsListViewModel, setCmsListViewModel] = useState<CmsPageListViewModel | undefined>(\r\n props.cmsPageList,\r\n );\r\n const topRef: Ref<HTMLDivElement> = useRef();\r\n\r\n const navigateToPage = (number: number) => {\r\n const url = currentUrl();\r\n url.searchParams.set('page', number.toString());\r\n bindFilterResults(url);\r\n };\r\n\r\n const bindFilterResults = (url: URLX) => {\r\n const displayUrl = url.toString();\r\n url.pathname = url.pathname + '/filtercms';\r\n if (setCmsListViewModel) {\r\n get(url, {})\r\n .then((r) => r.json())\r\n .then((json: CmsPageListViewModel) => {\r\n setCmsListViewModel(json);\r\n replaceState(displayUrl, null, false);\r\n if (topRef.current) {\r\n window.scrollTo({\r\n top: topRef.current.offsetTop - 150,\r\n left: 0,\r\n behavior: 'smooth',\r\n });\r\n }\r\n });\r\n }\r\n };\r\n\r\n let itemsPerRow: number;\r\n\r\n if (isMobile) {\r\n itemsPerRow = 2;\r\n } else {\r\n itemsPerRow = 3;\r\n }\r\n\r\n const visibleCount = cmsListViewModel.cmsPages.length;\r\n const itemClassName = createGridClasses(6, (12 / itemsPerRow));\r\n const mapping: ContentViewModel[][] = [];\r\n \r\n let row = [];\r\n for (let i = 0; i < visibleCount; i++) {\r\n row.push(cmsListViewModel.cmsPages[i]);\r\n if (row.length === itemsPerRow || i === visibleCount - 1) {\r\n mapping.push(row);\r\n row = [];\r\n }\r\n }\r\n\r\n const totalCount = cmsListViewModel.totalItemCount;\r\n const totalCountTitle = cmsListViewModel.labels?.displayingItems;\r\n\r\n return (\r\n <styled.Div ref={topRef}>\r\n {mapping.map((row: ContentViewModel[], i: number) => {\r\n const Row = (\r\n <GridWrap \r\n className='grid' \r\n key={i}\r\n css={{\r\n marginBottom: isMobile ? '40px' : '48px'\r\n }} \r\n >\r\n {row.map((CmsPage: ContentViewModel, j: number) => {\r\n return (\r\n <CmsPageCard\r\n key={j}\r\n breakPoint={breakPoint}\r\n isCompact={isMobile}\r\n className={itemClassName}\r\n cmsPage={CmsPage}\r\n />\r\n )\r\n })}\r\n </GridWrap>\r\n );\r\n return Row;\r\n })}\r\n <GridWrap>\r\n <Pagination\r\n currentPage={cmsListViewModel.currentPageIndex}\r\n currentlyDisplayedItemCount={visibleCount}\r\n pageCount={cmsListViewModel.totalPages}\r\n totalItemCount={totalCount}\r\n totalItemCountLabel={totalCountTitle}\r\n navigateToPage={navigateToPage}\r\n totalItemCountTextColor={style.colors.monochrome.a11ygrey}\r\n />\r\n </GridWrap>\r\n </styled.Div >\r\n );\r\n});\r\n","import React, { useRef, useEffect, useState } from 'react';\r\nimport connect from 'Shared/connect';\r\nimport { styled } from '@glitz/react';\r\nimport {\r\n MIN_SEARCH_LENGTH,\r\n DELAY_SEARCH_IN_MS,\r\n} from 'Search/action-creators';\r\nimport { SearchGroup } from '../SearchPage';\r\nimport { getResposiveFontSize, InlineLabel, ResponsiveSize } from 'Shared/SharedComponents/atoms/Typography';\r\nimport { createGridClasses, createOffsetGridClassLarge } from 'Shared/grid';\r\nimport { GridWrap } from 'Shared/PageLayout';\r\nimport * as style from 'Shared/Style';\r\n\r\nexport type PropType = {\r\n totalResultCount: number;\r\n searchGroupsListFiltered: SearchGroup[];\r\n selectedGroup: SearchGroup;\r\n searchPhrase: string;\r\n labels: {[key: string]: string};\r\n selectGroup: (group: SearchGroup) => void;\r\n executeSearch: (query: string) => void;\r\n setSearchPhrase: (query: string) => void;\r\n isMobile: boolean;\r\n};\r\n\r\nconst SearchInput = styled.input({\r\n border: {\r\n xy: {\r\n width: '0',\r\n style: 'none',\r\n },\r\n },\r\n margin: {\r\n xy: '0px',\r\n },\r\n padding: {\r\n xy: '0px',\r\n }, \r\n lineHeight: '100%',\r\n textTransform: 'uppercase',\r\n background: 'none',\r\n color: 'black',\r\n fontWeight: 500,\r\n});\r\n\r\nconst SearchContainer = styled.div({\r\n display: 'flex',\r\n flexWrap: 'wrap',\r\n alignItems: 'baseline',\r\n gap: '8px',\r\n});\r\n\r\nconst SearchButton = styled.button({\r\n fontWeight: 500,\r\n fontSize: '14px',\r\n lineHeight: '100%',\r\n textTransform: 'uppercase',\r\n whiteSpace: 'nowrap',\r\n color: style.colors.monochrome.a11ygrey,\r\n cursor: 'pointer',\r\n padding: {\r\n xy: 0\r\n },\r\n background: 'none',\r\n border: {\r\n xy: {\r\n width: '0',\r\n style: 'none',\r\n },\r\n },\r\n});\r\n\r\nconst InlineLabelInactive = styled(InlineLabel, {\r\n color: style.colors.monochrome.a11ygrey,\r\n})\r\n\r\nconst InlineLabelActive = styled(InlineLabel, {\r\n paddingBottom: '4px',\r\n border: {\r\n bottom: {\r\n width: '2px',\r\n style: 'solid',\r\n color: style.colors.monochrome.black\r\n },\r\n },\r\n})\r\n\r\nconst NoResultText = styled.p({\r\n color: style.colors.negativeColors.negative,\r\n textTransform: 'uppercase',\r\n fontWeight: 500,\r\n fontSize: '14px',\r\n lineHeight: '100%',\r\n padding: {\r\n xy: 0\r\n },\r\n margin: {\r\n xy: 0\r\n },\r\n})\r\n\r\nconst Container = styled.div({\r\n display: 'flex',\r\n gap: '16px',\r\n});\r\n\r\nconst Wrap = styled(GridWrap, {\r\n paddingTop: '48px',\r\n paddingBottom: '48px',\r\n ['@media ' + style.mediaMinLarge]: {\r\n paddingBottom: '80px'\r\n },\r\n})\r\n\r\nconst FlexWrap = styled.div({\r\n display: 'flex',\r\n flexDirection: 'column',\r\n gap: '16px'\r\n})\r\n\r\nconst HiddenField = styled.span({\r\n lineHeight: '100%',\r\n textTransform: 'uppercase',\r\n width: 'auto',\r\n fontWeight: 500,\r\n})\r\n\r\nconst SearchPageTop = connect(\r\n (state) => ({\r\n currentBreakpoint: state.currentBreakpoint,\r\n }),\r\n)(\r\n (props: PropType) => {\r\n\r\n const searchSpanRef = useRef<HTMLSpanElement>(null);\r\n let searchInputRef = useRef<HTMLInputElement>(null);\r\n \r\n const { totalResultCount, searchGroupsListFiltered, selectGroup, selectedGroup, isMobile, labels = {} } = props;\r\n \r\n //const [searchPhrase, setSearchPhrase] = useState<string>(props.searchPhrase);\r\n const [searchInputVisible, setSearchInputVisible] = useState<boolean>(false);\r\n const [timeoutNumber, setTimeoutNumber] = useState(undefined);\r\n \r\n const handleSearchInputChange = (elm: HTMLInputElement) => {\r\n searchSpanRef.current.innerText = searchInputRef.current.value;\r\n searchInputRef.current.style.width = `${searchSpanRef.current.offsetWidth}px`;\r\n \r\n if (timeoutNumber !== undefined) {\r\n clearTimeout(timeoutNumber);\r\n }\r\n const newSearchPhrase = elm.value\r\n const filterOnInputValue = () => {\r\n if (newSearchPhrase.length < MIN_SEARCH_LENGTH) {\r\n // Not enough letters, exit\r\n return;\r\n }\r\n props.executeSearch(newSearchPhrase);\r\n };\r\n\r\n props.setSearchPhrase(newSearchPhrase);\r\n setTimeoutNumber(setTimeout(filterOnInputValue, DELAY_SEARCH_IN_MS));\r\n }\r\n \r\n const handleShowSearchInput = (e: React.MouseEvent<HTMLElement>) => {\r\n e.preventDefault();\r\n searchInputRef.current.style.width = `${searchSpanRef.current.offsetWidth}px`;\r\n setSearchInputVisible(true);\r\n searchInputRef.current.focus(); \r\n }\r\n \r\n const leaveSearchInput = (e: HTMLInputElement, e2: React.KeyboardEvent<HTMLElement>) => {\r\n if(e2) {\r\n if ((e2.target as HTMLElement).tagName.toLowerCase() === 'input' && (e2.keyCode || e2.which || e2.charCode || e2.key || 0) === 13) {\r\n handleSearchInputChange(e2.target as HTMLInputElement);\r\n setSearchInputVisible(false);\r\n }\r\n return;\r\n }\r\n \r\n setSearchInputVisible(false);\r\n }\r\n\r\n useEffect(() => {\r\n searchSpanRef.current.innerText = searchInputRef.current.value;\r\n searchInputRef.current.style.width = `${searchSpanRef.current.offsetWidth}px`;\r\n }, []);\r\n\r\n useEffect(() => {\r\n searchSpanRef.current.innerText = searchInputRef.current.value;\r\n searchInputRef.current.style.width = `${searchSpanRef.current.offsetWidth}px`;\r\n }, [props.searchPhrase]);\r\n\r\n useEffect(() => {\r\n if(searchInputVisible) {\r\n searchInputRef.current.focus();\r\n }\r\n }, [searchInputVisible]);\r\n\r\n return (\r\n <Wrap className=\"grid\">\r\n <div className={createGridClasses(12, 10, createOffsetGridClassLarge(2))}>\r\n <FlexWrap>\r\n <Container>\r\n {totalResultCount > 0 && \r\n <>\r\n <div key={'sök'}>\r\n <InlineLabel>{labels.searchResult}:</InlineLabel>\r\n </div>\r\n {searchGroupsListFiltered.map((searchGroup, i: number) => {\r\n const SearchGroupLabelType = searchGroup.type === selectedGroup?.type ? InlineLabelActive : InlineLabelInactive;\r\n return (\r\n <styled.Div css={{ cursor: 'pointer' }} key={searchGroup.type} onClick={() => selectGroup(searchGroup)}>\r\n <SearchGroupLabelType>{searchGroup.translation}</SearchGroupLabelType>\r\n </styled.Div>\r\n );\r\n })}\r\n </>\r\n }\r\n {totalResultCount === 0 &&\r\n <NoResultText>\r\n {labels.noResultsFor} \"{props.searchPhrase}\"\r\n {labels.noResultsDescription && \r\n <>\r\n <br />\r\n {labels.noResultsDescription}\r\n </>\r\n }\r\n </NoResultText>\r\n }\r\n </Container>\r\n <SearchContainer>\r\n <HiddenField ref={searchSpanRef}\r\n className='visually-hidden'\r\n css={{\r\n fontSize: getResposiveFontSize(ResponsiveSize.D96_M40, isMobile),\r\n }}\r\n >{props.searchPhrase}</HiddenField>\r\n <SearchInput\r\n ref={searchInputRef}\r\n type=\"text\"\r\n value={props.searchPhrase}\r\n onChange={(e) => handleSearchInputChange(e.target)}\r\n onBlur={(e) => leaveSearchInput(e.target, null)}\r\n onKeyPress={(e) => leaveSearchInput(null, e)}\r\n disabled={!searchInputVisible}\r\n css={{\r\n fontSize: getResposiveFontSize(ResponsiveSize.D96_M40, isMobile),\r\n }}\r\n />\r\n {!searchInputVisible && <SearchButton onClick={(e) => handleShowSearchInput(e)}>{labels.modifySearch}</SearchButton>}\r\n </SearchContainer>\r\n </FlexWrap>\r\n </div>\r\n </Wrap>\r\n );\r\n})\r\n\r\nexport default SearchPageTop;","/**\r\n * @ComponentFor SearchPageViewModel\r\n */\r\n\r\nimport React, { useState, useEffect } from 'react';\r\nimport connect from 'Shared/connect';\r\nimport { currentUrl, equalsUrl, URLX } from '@polarnopyret/scope/index';\r\nimport { styled } from '@glitz/react';\r\nimport { get, replaceState } from '@polarnopyret/scope';\r\nimport { EpiProperty, epiPropertyValue } from '@polarnopyret/scope-episerver';\r\nimport {PageType} from 'Shared/State';\r\nimport ProductListing from 'Product/ProductListing';\r\nimport CmsPageListing from 'Search/Listing/CmsPageListing';\r\nimport SearchPageViewModelType from './SearchPageViewModel.type';\r\nimport Page from 'Shared/Page';\r\nimport {isCompact} from 'Shared/Viewport';\r\nimport SearchPageTop from './SearchPageTop';\r\nimport ProductListViewModel from 'Product/ProductListing/ProductListViewModel.type';\r\nimport ProductListItemViewModel from 'Product/ProductListing/ProductListItemViewModel.type';\r\nimport CmsPageListViewModel from './CmsPageListViewModel.type';\r\nimport { SEARCH_QUERY_NAME } from 'Search/action-creators';\r\n\r\nexport type AlignmentStringType = 'left' | 'right' | 'center';\r\n\r\nexport type SearchGroup = {\r\n type: string;\r\n translation: string;\r\n enabled: boolean;\r\n};\r\n\r\ntype ConnectedPropType = {\r\n currentBreakpoint: number;\r\n};\r\n\r\ntype RequiredPropType = SearchPageViewModelType & PageType;\r\ntype PropType = RequiredPropType & ConnectedPropType;\r\n\r\nconst ContentAreaWrap = styled.div({\r\n marginBottom: '40px',\r\n marginTop: '40px'\r\n})\r\n\r\nconst SearchPage = connect(\r\n (state) => ({\r\n currentBreakpoint: state.currentBreakpoint,\r\n }),\r\n)(\r\n (props: PropType) => { \r\n const {\r\n originalSearchPhrase,\r\n page,\r\n currentBreakpoint,\r\n labels = {},\r\n } = props;\r\n\r\n const isMobile = isCompact(currentBreakpoint);\r\n \r\n const [productResult, setProductResult] = useState<ProductListViewModel>(props.productList);\r\n const [cmsResult, setCmsResult] = useState<CmsPageListViewModel>(props.cmsList);\r\n const [recommendations, setRecommendations] = useState<ProductListItemViewModel[]>(props.recommendations);\r\n const [searchPhrase, setSearchPhrase] = useState<string>(originalSearchPhrase);\r\n\r\n const getSearchGroups = () => {\r\n return [\r\n { type: 'product', translation: props.labels.products, enabled: (productResult?.totalItemCount ?? 0) > 0 },\r\n { type: 'cmspage', translation: props.labels.pages, enabled: (cmsResult?.cmsPages?.length ?? 0) > 0 },\r\n ]\r\n }\r\n\r\n const searchGrops = getSearchGroups();\r\n const [tabGroups, setSearchGroups] = useState<SearchGroup[]>(searchGrops);\r\n const [selectedGroup, setSelectedGroup] = useState<SearchGroup>(searchGrops.find(x => x.enabled));\r\n \r\n useEffect(() => {\r\n if(searchPhrase !== originalSearchPhrase) {\r\n setSearchPhrase(originalSearchPhrase);\r\n setCmsResult(props.cmsList);\r\n setProductResult(props.productList);\r\n setRecommendations(props.recommendations);\r\n }\r\n }, [originalSearchPhrase]);\r\n \r\n useEffect(() => {\r\n const groups = getSearchGroups();\r\n setSearchGroups(groups);\r\n setSelectedGroup(groups.find(x => x.enabled))\r\n }, [cmsResult, productResult]);\r\n\r\n const getQueryParams = () => {\r\n const url = currentUrl();\r\n return url.searchParams.get(SEARCH_QUERY_NAME);\r\n }\r\n\r\n const searchUrl = (searchText: string) => {\r\n const url = new URLX(currentUrl());\r\n url.searchParams.set(SEARCH_QUERY_NAME, searchText);\r\n return url;\r\n };\r\n\r\n const search = (query: string) => {\r\n if (query.length) {\r\n const newUrl = searchUrl(query);\r\n if (!equalsUrl(currentUrl(), newUrl)) {\r\n const displayUrl = newUrl.toString();\r\n newUrl.pathname = newUrl.pathname + '/search';\r\n \r\n get(newUrl, {})\r\n .then((r) => r.json())\r\n .then((json: SearchPageViewModelType) => {\r\n setProductResult(json.productList);\r\n setCmsResult(json.cmsList);\r\n setRecommendations(json.recommendations);\r\n replaceState(displayUrl, null, false);\r\n });\r\n }\r\n }\r\n }\r\n\r\n const selectGroup = (newSelectedGroup: SearchGroup) => {\r\n setSelectedGroup(newSelectedGroup);\r\n }\r\n\r\n const setFilterResult = (newResult: ProductListViewModel) => {\r\n setProductResult(newResult);\r\n }\r\n\r\n const productListProps: PropType = { ...props, productList: productResult };\r\n const searchCmsPage = cmsResult?.cmsPages || []; \r\n const totalResultCount = (productResult?.totalItemCount ?? 0) + searchCmsPage.length;\r\n\r\n return (\r\n <Page>\r\n <h1 className='visually-hidden'>{epiPropertyValue(page.name)}</h1>\r\n <SearchPageTop\r\n totalResultCount={totalResultCount}\r\n searchGroupsListFiltered={tabGroups}\r\n selectedGroup={selectedGroup}\r\n isMobile={isMobile}\r\n searchPhrase={searchPhrase}\r\n labels={labels}\r\n selectGroup={(group: SearchGroup) => selectGroup(group)}\r\n executeSearch={search}\r\n setSearchPhrase={setSearchPhrase}\r\n />\r\n \r\n {(productResult?.totalItemCount ?? 0) > 0 && selectedGroup?.type === 'product' && (\r\n <ProductListing {...productListProps} queryParams={getQueryParams()} setFilterResults={(result: ProductListViewModel) => setFilterResult(result)} />\r\n )}\r\n {recommendations && recommendations.length > 0 && (\r\n <ProductListing hideFacetAndSort={true} productList={{products: recommendations, facets: null, sortOptions: null, listContentItems: null, currentPageIndex: 0, labels: null, totalItemCount: props.recommendations?.length ?? 0, totalPages: 1}} isLoading={false} /> )}\r\n {(cmsResult?.cmsPages.length ?? 0) > 0 && selectedGroup?.type === 'cmspage' && (\r\n <CmsPageListing\r\n breakPoint={currentBreakpoint}\r\n uppercase={true}\r\n cmsPageList={cmsResult}\r\n isMobile={isMobile}\r\n />\r\n )}\r\n \r\n <ContentAreaWrap>\r\n <EpiProperty for={page.contentArea} />\r\n </ContentAreaWrap>\r\n </Page>\r\n );\r\n }\r\n)\r\n\r\nexport default SearchPage;\r\n"],"sourceRoot":""}