{"version":3,"sources":["webpack:///./src/components/molecules/ProductPresentationSlider/ProductPresentationSlider.scss","webpack:///./src/components/molecules/ProductPresentationTabs/ProductPresentationTabs.scss","webpack:///./src/components/molecules/ProductContactInfo/ProductContactInfo.scss","webpack:///./src/components/molecules/ProductOpeningHours/ProductOpeningHours.scss","webpack:///./src/components/atoms/AdvantageCard/AdvantageCard.scss","webpack:///./src/components/atoms/AwardList/AwardList.scss","webpack:///./src/components/molecules/TagWrapper/TagWrapper.scss","webpack:///./src/containers/organisms/PageProductsContainer.jsx","webpack:///./src/components/molecules/ProductPresentationSlider/ProductPresentationSlider.jsx","webpack:///./src/components/molecules/ProductPresentationSlider/index.jsx","webpack:///./src/components/molecules/ProductPresentationTabs/ProductPresentationTabs.jsx","webpack:///./src/components/molecules/ProductPresentationTabs/index.jsx","webpack:///./src/components/molecules/ProductContactInfo/ProductContactInfo.jsx","webpack:///./src/components/molecules/ProductContactInfo/index.jsx","webpack:///./src/components/molecules/ProductOpeningHours/ProductOpeningHours.jsx","webpack:///./src/components/molecules/ProductOpeningHours/index.jsx","webpack:///./src/components/atoms/AdvantageCard/AdvantageCard.jsx","webpack:///./src/components/atoms/AdvantageCard/index.jsx","webpack:///./src/components/atoms/AwardList/AwardList.jsx","webpack:///./src/components/atoms/AwardList/index.jsx","webpack:///./src/utils/getFileName.js","webpack:///./src/components/organisms/EnturWidget/EnturWidget.jsx","webpack:///./src/components/organisms/EnturWidget/index.jsx","webpack:///./src/components/organisms/Product/Section.jsx","webpack:///./src/components/organisms/Product/PriceTable.jsx","webpack:///./src/components/organisms/Product/RoomTable.jsx","webpack:///./src/components/organisms/Product/FacilityList.jsx","webpack:///./src/components/organisms/Product/BookATableWidget.jsx","webpack:///./src/components/utilities/HTMLString/HTMLString.jsx","webpack:///./src/components/utilities/HTMLString/index.jsx","webpack:///./src/components/organisms/Product/ExpandableDescription.jsx","webpack:///./src/components/organisms/Product/SustainabilityTab.jsx","webpack:///./src/components/molecules/TagWrapper/TagWrapper.jsx","webpack:///./src/components/molecules/TagWrapper/index.jsx","webpack:///./src/components/organisms/Product/Product.jsx","webpack:///./src/components/organisms/Product/index.jsx","webpack:///./src/components/organisms/ProductFilter/FilterItem.jsx","webpack:///./src/components/organisms/ProductFilter/FilterGroup.jsx","webpack:///./src/components/organisms/ProductFilter/ProductFilter.jsx","webpack:///./src/components/organisms/ProductFilter/index.jsx","webpack:///./src/components/organisms/Product/Product.scss","webpack:///./src/components/organisms/ProductFilter/ProductFilter.scss"],"names":["module","exports","root","main","withThumbnailNavigation","mainItem","mainTrack","navContainer","nav","navTrack","navItem","navItemButton","navButton","next","prev","sliderRoot","videoBlockStyle","vimeo","youtube","overlayPlayIcon","slideContentContainer","slideContent","title","gallery","inline","imageContainer","modalClose","modal","tabs","tab","button","isCurrent","accordionTitle","buttonIcon","tabContent","accordionContent","accordionClosed","description","iconAfter","iconSustainabilityHeader","iconListItem","iconListIcon","socialContainer","social","clockIcon","showMore","markerIcon","timeHeading","icon","ticketInfo","showMoreDates","table","bgGrey","advantageCard","modalOpen","heading","readmore","modalBody","awardList","tagsHeader","tags","__webpack_require__","r","__webpack_exports__","redux_bundler_react__WEBPACK_IMPORTED_MODULE_1__","connect","_ref","_ref$pageProductsRaw","pageProductsRaw","_ref$pageProductsRaw$","data","hasMoreProducts","products","isFetching","doFetchMorePageProducts","children","Slider","lazy","Promise","all","e","then","bind","AutoPlay","SlideTrack","FadeTrack","SliderState","isExternalVideo","item","includes","externalLinkTypeName","ThumbNailNavigation","onSelect","_ref$items","items","_ref$chunkCount","chunkCount","chunks","useMemo","arrayChunk","map","_objectSpread","react_default","a","createElement","react","fallback","LoadingIndicator","className","styles","dragTreshold","direction","renderItem","_ref2","chunk","getItemProps","_extends","key","concat","url","Button","onClick","Image","classnames","_defineProperty","type","src","thumbnail_url","ratio","fit","cropDetails","_ref3","isLast","isFirst","actions","Fragment","disabled","Icon","chevronUp","role","size","chevronDown","propTypes","PropTypes","func","array","number","SlideContent","_ref4","index","images","color","btnRef","React","useRef","Container_Container","noPadding","Toggle","on","render","_ref5","toggle","setOff","style","backgroundColor","aria-live","aria-atomic","aria-label","translate","length","setTimeout","current","focus","openModal","grid","FocusLock","Modal","light","fullscreen","scrollLock","closeBtn","ref","plus","Body","lib_default","once","height","VideoPlayer","copy","copyright","name","string","ProductPresentationSlider","memo","_ref6","showThumbnailNavigation","_ref6$product","product","_ref6$product$images","_ref6$product$externa","externalLinks","_ref6$type","videos","filter","_useState2","_slicedToArray","useState","videoData","setVideoData","_useState4","hasNavigated","setHasNavigated","videoItems","video","imageItems","image","id","thumbnailItems","_toConsumableArray","allItems","slice","_useState6","selectedVideo","setSelectedVideo","useEffect","getVideoData","el","reduce","obj","Block","thumbnailUrl","disableLazy","interval","_ref7","_ref8","ProductPresentationSlider_ThumbNailNavigation","selectedItem","find","goTo","swipe","infinite","snap","_ref9","contain","_ref10","chevronLeft","chevronRight","ProductPresentationSlider_SlideContent","displayName","object","bool","isFullWidthSlider","defaultProps","Tab","label","hiddenStyle","display","Tabs","viewedTabs","getUrlForTab","props","ProductPresentationTabs_defineProperty","atoms_Button","href","data-cosmetic","data-no-scrolltop","transparent","full","Accordion","scrollIntoView","currentTabRef","forceCheck","behavior","block","tabId","aria-level","data-update","aria-expanded","aria-controls","sustainability","minus","aria-labelledby","ProductPresentationTabs","_ref4$mode","mode","modes","Children","toArray","ProductPresentationTabs_slicedToArray","setViewedTabs","state","ProductPresentationTabs_objectSpread","accordion","ProductPresentationTabs_Accordion","ProductPresentationTabs_Tabs","arrayOf","oneOfType","oneOf","Object","keys","isRequired","identifier","IconListItem","Text","any","node","ProductContactInfo","address","_ref2$contactInfo","contactInfo","externalSystemList","place","onAddressClick","street","postalCode","postalName","ProductContactInfo_IconListItem","marker","verticalAlign","telephone","phone","email","outlineEnvelope","breakWord","website","www","target","rel","externalSystem","buttonData","$c","mediaType","toLowerCase","invertImage","indexOf","isExternalSystemShown","SocialMediaLinkBlock","shape","ProductOpeningHours","openingHours","showInitial","groupedOpeningHours","values","result","currentObject","val1","val2","val3","push","setOn","TableList","caption","value","i","colSpan","getFormattedDate","startDay","endDay","hour","openingTimes","width","verticalCenter","nameOfStartDay","nameOfEndDay","align","oTime","k","dateTime","Date","closingTimes","AdvantageCardContent","imageTitle","imageUrl","prefix","note","alt","paddingTop","Heading","infoFill","AdvantageCard","targetUrl","onMouseEnter","currentTarget","onMouseLeave","AdvantageCard_AdvantageCardContent","maxWidth","onClose","shadow","AwardList","awardName","splitUrlName","splitUrl","split","fileEnding","splitName","ending","EnturWidget","Component","_this","_classCallCheck","this","_super","call","_this2","geoLocation","enturApiGet","latitude","longitude","res","features","_this2$props","featuresByName","f","properties","featuresByAddress","feature","setState","source_id","coordinates","geometry","_this$props","culture","_this$state","lang","encodeURIComponent","colorParams","fakeColorOpacity","Iframe","frameBorder","minHeight","minWidth","Section","accessibleTitle","uniqueSlug","VisuallyHidden","PriceTable","_ref$prices","prices","zebra","price","unitTypeName","priceDetails","priceBasisName","RoomTable","rooms","room","unitType","priceBasis","guidePrice","FacilityList","list","Product_Section","facilityGroup","sizes","heading3","gutterBottom","subFacilities","facility","checkmark","notes","BookATableWidget","_ref$baseColor","baseColor","_ref$language","language","ScriptSandbox","content","config","FORBID_TAGS","FORBID_ATTR","ADD_ATTR","HTMLString","_ref$as","as","Tag","_ref$html","html","_objectWithoutProperties","HTMLString_extends","dangerouslySetInnerHTML","__html","DOMPurify","sanitize","ExpandableDescription","text","truncatedLength","ExpandableDescription_slicedToArray","open","setOpen","isExpandable","fullContent","utilities_HTMLString","truncatedContent","clip","iconBefore","SustainabilityTab","sustainabilityData","productFacilities","groups","sustainabilityGroups","productNote","x","sustainabilityLeadHeader","sustainabilityLeadText","_sustainabilityData$s","blocks","_iconLookup$groups$i$","_groups$i$title","_groups$i$linkText","_groups$i$text","iconLookup","info","Link","linkHref","linkText","j","undefined","classNames","sustainabilityDisclaimerText","makeBlocks","classname","header","largeText","iconSpan","Count","SustainabilityGroups","TagWrapper","tagBlock","join","getTags","returnTags","Data","ProductEventList","TripAdvisorWidget","resolve","PRODUCTTYPE_NEWS","PRODUCTTYPE_EVENT","Product","breakpoint","hideEnturWidget","hideShortDescription","hidePriceInformation","isMobileView","BREAKPOINT_PHONE","isTabletView","BREAKPOINT_TABLET_PORTRAIT","isDesktopView","hierarchicalFacilityList","publicTransportDirections","awardListWithNames","upcomingEvents","tripAdvisorRating","productType","published","eventItems","bookingWebsite","myFavoritesId","advantageCardSettings","ecoSettings","_useSiteSettings","useSiteSettings","colorSettings","isNews","isEvent","tripAdvisorId","delve","hasMultipleImages","hasImages","hasContactInfo","showEventList","showOpeningHours","showMainInfo","showFacilities","showMapTransport","bookATable","external","isSustainable","readmoreLink","appendQueryParams","Product_defineProperty","routes","route","gpxRoute","productColor","productColors","others","mapRef","sliderRef","scrollToRef","showTabs","Container","molecules_ProductPresentationSlider","underline","shortPlainText","justifyContent","marginBottom","molecules_ProductContactInfo","FavouriteButtonContainer","FlexGrid","gutter","collapse","Column","shrink","atoms_AdvantageCard","Product_extends","molecules_ProductPresentationTabs","Product_ExpandableDescription","longRichText","longPlainText","atoms_AwardList","showHours","openingHoursLabel","molecules_ProductOpeningHours","showProductLink","Product_PriceTable","Product_RoomTable","Product_FacilityList","toggleGroups","groupByMonth","sustainabilityTabTitle","Product_SustainabilityTab","facilityList","molecules_TagWrapper","grow","Product_BookATableWidget","heading5","file","toUpperCase","getFileName","Product_objectSpread","heading2","TeaserMap","intro","organisms_EnturWidget","FilterItem","filterIds","active","compact","filterQuery","handleSetFilter","filtersActive","prototype","hasOwnProperty","tellusCategoryIds","_classnames","isFilterActive","useCallback","toString","isSelected","setIsSelected","newActiveFilters","replace","Array","isArray","forEach","String","parentID","useDefaultFilter","TRANSLATED_NAMES","AreaIds","AwardIds","CategoryIds","EventCategoryIds","FilterGroup","group","onToggle","filterPage","filterGroupChar","eventListView","filterTitle","filterType","allFilters","startsWith","filters","FilterGroup_objectSpread","queryArray","query","getIsFiltered","isFiltered","every","q","getNewQueryArray","newQuery","FilterGroup_toConsumableArray","dropdown","InlineDropdown","onChange","toggleable","newQueryArray","ProductFilter_FilterItem","heading4","ProductFilter","_ref$dropdown","filterGroup","_ref$compact","onSetFiltersBtnClick","ProductFilter_slicedToArray","ProductFilter_objectSpread","setFiltersActive","filtersChanged","setFiltersChanged","JSON","stringify","filtered","some","useSelectedFiltersQuery","hasOwn","ProductFilter_FilterGroup","ProductFilter_defineProperty","palette","ProductFilter_toConsumableArray","objectOf","presentationSlider","mainImage","shareAndFavoriteWrapper","facilities","aside","section","sectionTitle","sectionSubTitle","tripAdvisorRatingWidget","tripAdvisorSummaryWidget","tripAdvisorDetailWidget","productEventList","gridColumn","favouriteButton","bookingButton","readmoreButton","seeMoreImages","descriptionSection","descriptionSectionSpacey","m-bt-40","sustainabilityHeader","facilityNotes","disclaimer","sustainabilitySubText","sustainabilityInfoTextContainer","sustainabilityInfoText","sustainabilityIcon","sustainabilityLinkText","link","selected","eventFilter","buttonWrapper","useFiltersButton","resetFiltersButton"],"mappings":"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","file":"product.bundle.8c575386233ca8c5e890.js","sourcesContent":["// extracted by mini-css-extract-plugin\nmodule.exports = {\"root\":\"_2aFadc\",\"main\":\"xgOXg8\",\"withThumbnailNavigation\":\"_2gexnL\",\"mainItem\":\"qQZr0g\",\"mainTrack\":\"_2FfCmN\",\"navContainer\":\"j0so5r\",\"nav\":\"_3gQUWX\",\"navTrack\":\"_3mhXe6\",\"navItem\":\"_3XSn-c\",\"navItemButton\":\"_7D9rmc\",\"navButton\":\"Ds-AYa\",\"next\":\"_3GyH1v\",\"prev\":\"_1rYyCR\",\"sliderRoot\":\"_2kd7_w\",\"videoBlockStyle\":\"jmQGTR\",\"vimeo\":\"_2VwnDr\",\"youtube\":\"_1h6T5I\",\"overlayPlayIcon\":\"_1SxmLN\",\"slideContentContainer\":\"_1TXoKz\",\"slideContent\":\"_1GNJdN\",\"title\":\"_3OpdKf\",\"gallery\":\"_1Qw7gF\",\"inline\":\"_3pzk23\",\"imageContainer\":\"_9R2sN7\",\"modalClose\":\"_18JtQw\",\"modal\":\"_3axSKh\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"tabs\":\"_3wItPB\",\"tab\":\"_4qfipD\",\"button\":\"_32iNA8\",\"isCurrent\":\"_3mlykA\",\"accordionTitle\":\"_3qbN4o\",\"buttonIcon\":\"_2ynoGt\",\"tabContent\":\"_3-pPzz\",\"accordionContent\":\"_3OtCmo\",\"accordionClosed\":\"_6djhuT\",\"description\":\"_1MO5qa\",\"iconAfter\":\"_3Hk_13\",\"iconSustainabilityHeader\":\"_1ha0a0\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"iconListItem\":\"_2tpjAz\",\"iconListIcon\":\"_1Aj4is\",\"socialContainer\":\"_29tXOi\",\"social\":\"_1mwl6y\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"clockIcon\":\"_1AlbTB\",\"showMore\":\"_2gSd15\",\"markerIcon\":\"_2l7QdU\",\"timeHeading\":\"_3tPNOU\",\"icon\":\"_1OLZi-\",\"ticketInfo\":\"_24cvbB\",\"showMoreDates\":\"_1fS-6i\",\"table\":\"ufvzCO\",\"bgGrey\":\"_32v6Uh\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"advantageCard\":\"_2r3Eam\",\"modalOpen\":\"_38SFKb\",\"heading\":\"_3onvVZ\",\"icon\":\"_2gvFgI\",\"modal\":\"hQF3-Z\",\"readmore\":\"wNdVGQ\",\"modalBody\":\"_9haKC7\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"awardList\":\"_1I4Vup\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"tagsHeader\":\"cVILhQ\",\"tags\":\"EfsEx4\"};","import React from 'react';\nimport { connect } from 'redux-bundler-react';\n\nconst PageProductsContainer = ({\n pageProductsRaw: {\n data: { hasMoreProducts, products },\n isFetching,\n },\n doFetchMorePageProducts,\n children,\n}) =>\n children({\n products,\n isFetching,\n hasMoreProducts,\n doFetchMorePageProducts,\n });\n\nexport default connect(\n 'selectPageProductsRaw',\n 'doFetchMorePageProducts',\n PageProductsContainer,\n);\n","import React, {\n useState,\n useMemo,\n useEffect,\n useCallback,\n lazy,\n Suspense,\n} from 'react';\nimport PropTypes from 'prop-types';\nimport classnames from 'classnames';\nimport Image from 'components/atoms/Image';\nimport Block from 'components/atoms/Block';\nimport Button, { LinkButton } from 'components/atoms/Button/Button';\nimport Container from 'components/atoms/Container/Container';\nimport Icon from 'components/atoms/Icon';\nimport { H1 } from 'components/atoms/Heading';\nimport { translate } from 'utils/translate';\nimport Toggle from 'components/utilities/Toggle';\nimport FocusLock from 'components/utilities/FocusLock';\n\nimport LazyLoad from 'react-lazyload';\nimport Modal from 'components/utilities/Modal';\nimport {\n chevronDown,\n chevronUp,\n chevronLeft,\n chevronRight,\n grid,\n plus,\n} from 'components/atoms/Icon/icons';\nconst Slider = lazy(() =>\n import(\n /* webpackChunkName: \"slider\" */ /* webpackPreload: true */ 'packages/react-spring-slider/Slider'\n ),\n);\nconst AutoPlay = lazy(() =>\n import(\n /* webpackChunkName: \"slider\" */ /* webpackPreload: true */ 'packages/react-spring-slider/AutoPlay'\n ),\n);\nconst SlideTrack = lazy(() =>\n import(\n /* webpackChunkName: \"slider\" */ /* webpackPreload: true */ 'packages/react-spring-slider/SlideTrack'\n ),\n);\nconst FadeTrack = lazy(() =>\n import(\n /* webpackChunkName: \"slider\" */ /* webpackPreload: true */ 'packages/react-spring-slider/FadeTrack'\n ),\n);\nconst SliderState = lazy(() =>\n import(\n /* webpackChunkName: \"slider\" */ /* webpackPreload: true */ 'packages/react-spring-slider/SliderState'\n ),\n);\nimport arrayChunk from 'utils/arrayChunk';\nimport { getVideoData } from 'utils/utils';\nimport VideoPlayer from 'components/utilities/VideoPlayer';\nimport * as styles from './ProductPresentationSlider.scss';\nimport LoadingIndicator from 'components/utilities/LoadingIndicator';\nimport { stripHtml } from 'utils/utils';\n\nconst isExternalVideo = item =>\n ['Youtube Video', 'Vimeo Video'].includes(item.externalLinkTypeName);\n\nconst ThumbNailNavigation = ({ onSelect, items = [], chunkCount = 3 }) => {\n const chunks = useMemo(\n () =>\n arrayChunk(\n items.map(item => ({ ...item })),\n chunkCount,\n ),\n [items],\n );\n return (\n <Suspense fallback={<LoadingIndicator />}>\n <Slider items={chunks}>\n <div className={styles.navContainer}>\n <div className={styles.nav}>\n <SlideTrack\n dragTreshold={60}\n direction=\"vertical\"\n className={styles.navTrack}\n renderItem={({ item: chunk, getItemProps }) => (\n <div\n className={styles.navItem}\n {...getItemProps()}\n key={`chunk_${chunk[0].url}`}\n >\n {chunk.map(item => (\n <LinkButton\n className={styles.navItemButton}\n onClick={() => onSelect(item)}\n key={`item_${item.url}`}\n >\n <Image\n className={classnames({\n [styles.overlayPlayIcon]: item.type === 'video',\n })}\n src={item.thumbnail_url}\n ratio={[3, 2]}\n fit=\"cover\"\n cropDetails={item.cropDetails || []}\n />\n </LinkButton>\n ))}\n </div>\n )}\n />\n </div>\n <SliderState>\n {({ isLast, isFirst, actions }) => (\n <React.Fragment>\n <LinkButton\n className={classnames(styles.navButton, styles.prev)}\n onClick={actions.prev}\n disabled={isFirst}\n >\n <Icon\n icon={chevronUp}\n role=\"presentation\"\n size={['1.4em', '1.4em']}\n />\n </LinkButton>\n <LinkButton\n className={classnames(styles.navButton, styles.next)}\n onClick={actions.next}\n disabled={isLast}\n >\n <Icon\n icon={chevronDown}\n role=\"presentation\"\n size={['1.4em', '1.4em']}\n />\n </LinkButton>\n </React.Fragment>\n )}\n </SliderState>\n </div>\n </Slider>\n </Suspense>\n );\n};\nThumbNailNavigation.propTypes = {\n onSelect: PropTypes.func,\n items: PropTypes.array,\n chunkCount: PropTypes.number,\n};\n\nconst SlideContent = ({ index, images, color }) => {\n const btnRef = React.useRef();\n\n const openModal = toggle => {\n toggle();\n setTimeout(() => btnRef.current.focus(), 200);\n };\n return (\n <Container\n className={classnames(styles.slideContentContainer, styles.inline)}\n noPadding\n >\n <Toggle\n on={false}\n render={({ on, toggle, setOff }) => (\n <React.Fragment>\n <div\n className={styles.slideContent}\n style={{ backgroundColor: `${color}33` }}\n >\n <p role='status' aria-live='polite' aria-atomic='true' aria-label='slider position' className={styles.title}>\n {index + 1} {translate('/product/of')} {images.length}\n </p>\n <LinkButton\n onClick={() => openModal(toggle)}\n className={styles.gallery}\n >\n {translate('/product/gallery')}\n <Icon icon={grid} />\n </LinkButton>\n </div>\n\n {on && (\n <FocusLock>\n <Modal\n light\n fullscreen\n scrollLock\n closeBtn={\n <Button\n ref={btnRef}\n onClick={setOff}\n className={styles.modalClose}\n >\n <Icon icon={plus} />\n </Button>\n }\n >\n <Modal.Body className={styles.modal}>\n <LazyLoad once height=\"100%\">\n <div className={styles.imageContainer}>\n {images &&\n images.length > 0 &&\n images.map(item =>\n item.type === 'video' ? (\n <div key={item.url}>\n <VideoPlayer\n url={item.url}\n ratio={[3, 2]}\n fit=\"contain\"\n />\n </div>\n ) : (\n <Image\n key={item.url}\n src={item.url}\n copy={item.copyright}\n description={item.name}\n ratio={[3, 2]}\n fit=\"contain\"\n cropDetails={item.cropDetails || []}\n lazy={false}\n />\n ),\n )}\n </div>\n </LazyLoad>\n </Modal.Body>\n </Modal>\n </FocusLock>\n )}\n </React.Fragment>\n )}\n />\n </Container>\n );\n};\nSlideContent.propTypes = {\n index: PropTypes.number,\n images: PropTypes.array,\n color: PropTypes.string,\n};\n\nconst ProductPresentationSlider = React.memo(\n ({\n className,\n showThumbnailNavigation,\n product: { images = [], externalLinks = [] } = {},\n type = 'fade',\n color,\n }) => {\n const videos = useMemo(() => externalLinks.filter(isExternalVideo), [\n externalLinks,\n ]);\n const [videoData, setVideoData] = useState({});\n const [hasNavigated, setHasNavigated] = useState(false);\n const videoItems = useMemo(\n () =>\n videos.map((video, index) => ({\n ...video,\n ...videoData[video.url],\n type: 'video',\n index,\n })),\n [videos, videoData],\n );\n const imageItems = useMemo(\n () =>\n images.map((image, index) => ({\n ...image,\n type: 'image',\n thumbnail_url: image.url,\n index,\n id: image.url,\n })),\n [images],\n );\n const thumbnailItems = useMemo(() => [...videoItems, ...imageItems], [\n videoItems,\n imageItems,\n ]);\n const allItems = useMemo(\n () => [imageItems[0], ...videoItems, ...imageItems.slice(1)],\n [videoItems, imageItems],\n );\n const [selectedVideo, setSelectedVideo] = useState(null);\n useEffect(() => {\n // re-populate all video data\n if (videos && videos.length) {\n Promise.all(videos.map(video => getVideoData(video.url))).then(data =>\n setVideoData(\n data\n .filter(el => el != null)\n .reduce(\n (obj, item) => ({\n ...obj,\n [item.url]: item,\n }),\n {},\n ),\n ),\n );\n }\n }, [videos]);\n\n return type !== 'slide' ? (\n <Slider items={imageItems}>\n <div\n className={classnames(\n styles.root,\n className,\n showThumbnailNavigation && styles.withThumbnailNavigation,\n )}\n >\n {selectedVideo ? (\n <Block ratio={[3, 2]} className={styles.main}>\n <VideoPlayer\n url={selectedVideo.url}\n ratio={[16, 9]}\n thumbnailUrl={selectedVideo.thumbnail_url}\n disableLazy\n />\n </Block>\n ) : (\n <Block ratio={[3, 2]} className={styles.main}>\n {!hasNavigated && <AutoPlay interval={8000} />}\n <FadeTrack\n className={styles.mainTrack}\n renderItem={({ item, getItemProps }) => (\n <div\n {...getItemProps()}\n className={classnames(styles.sliderItem, styles.mainItem)}\n >\n <Image\n src={item.url}\n copy={item.copyright}\n description={item.name}\n ratio={[3, 2]}\n fit=\"cover\"\n cropDetails={item.cropDetails || []}\n />\n </div>\n )}\n />\n </Block>\n )}\n {thumbnailItems.length > 1 && showThumbnailNavigation && (\n <SliderState>\n {({ actions, index }) => (\n <ThumbNailNavigation\n items={thumbnailItems}\n selectedItem={\n selectedVideo ||\n thumbnailItems.find(\n item => item.index === index && item.type === 'image',\n )\n }\n onSelect={item => {\n setHasNavigated(true);\n if (item.type === 'video') {\n setSelectedVideo(item);\n } else {\n setSelectedVideo(null);\n actions.goTo(item.index);\n }\n }}\n />\n )}\n </SliderState>\n )}\n </div>\n </Slider>\n ) : (\n <Slider items={allItems}>\n <article\n className={classnames(styles.sliderRoot, styles.root, className)}\n >\n <SlideTrack\n direction=\"horizontal\"\n swipe={allItems.length > 1}\n infinite={allItems.length > 1}\n snap=\"center\"\n dragTreshold={100}\n height=\"item\"\n renderItem={({ item, isCurrent, getItemProps }) => {\n return (\n <Container\n {...getItemProps()}\n noPadding\n className={classnames(styles.largeSlide, {\n [styles.currentItem]: isCurrent,\n })}\n >\n {item.type === 'video' ? (\n <div>\n <VideoPlayer\n url={item.url}\n ratio={[3, 2]}\n fit=\"contain\"\n />\n </div>\n ) : (\n <Block ratio={[3, 2]} contain className={styles.wrapper}>\n <Image\n src={item.url}\n ratio={[3, 2]}\n fit=\"contain\"\n copy={item.copyright}\n description={item.name}\n cropDetails={item.cropDetails || []}\n />\n </Block>\n )}\n </Container>\n );\n }}\n />\n <SliderState>\n {({ items, index, actions }) => {\n return (\n <React.Fragment>\n {items.length > 1 && (\n <React.Fragment>\n <LinkButton\n className={classnames(styles.navButton, styles.prev)}\n onClick={actions.prev}\n >\n <Icon icon={chevronLeft} />\n </LinkButton>\n\n <LinkButton\n className={classnames(styles.navButton, styles.next)}\n onClick={actions.next}\n >\n <Icon icon={chevronRight} />\n </LinkButton>\n </React.Fragment>\n )}\n <SlideContent color={color} index={index} images={items} />\n </React.Fragment>\n );\n }}\n </SliderState>\n </article>\n </Slider>\n );\n },\n);\nProductPresentationSlider.displayName = 'ProductPresentationSlider';\nProductPresentationSlider.propTypes = {\n product: PropTypes.object,\n className: PropTypes.string,\n showThumbnailNavigation: PropTypes.bool,\n type: PropTypes.string,\n isFullWidthSlider: PropTypes.bool,\n color: PropTypes.string,\n};\nProductPresentationSlider.defaultProps = {\n showThumbnailNavigation: false,\n};\n\nexport default ProductPresentationSlider;\n","import ProductPresentationSlider from './ProductPresentationSlider';\nexport default ProductPresentationSlider","import React, { useState, useEffect, useRef } from 'react';\nimport PropTypes from 'prop-types';\nimport classnames from 'classnames';\nimport Button from 'components/atoms/Button';\nimport Icon from 'components/atoms/Icon';\nimport { plus, minus, marker, sustainability } from 'components/atoms/Icon/icons';\nimport * as styles from './ProductPresentationTabs.scss';\nimport { forceCheck } from 'react-lazyload';\nimport { remove } from 'lodash';\n\n// just mocking some stuff here until we see that it works as intended...\n\nconst Tab = ({ label, id, children }) => null;\n\nconst hiddenStyle = { display: 'none' };\n\nconst Tabs = ({ tabs, current, viewedTabs, getUrlForTab }) => (\n <React.Fragment>\n <ul className={styles.tabs}>\n {tabs.map(tab => (\n <li\n key={`tab-${tab.props.id}`}\n className={classnames(styles.tab, {\n [styles.isCurrent]: tab.props.id === current,\n })}\n >\n <Button\n href={getUrlForTab(tab.props.id)}\n className={styles.button}\n data-cosmetic\n data-no-scrolltop\n transparent\n full\n >\n {tab.props.label}\n </Button>\n </li>\n ))}\n </ul>\n {tabs.map(tab =>\n tab.props.id === current || viewedTabs[tab.props.id] ? (\n <div\n className={styles.tabContent}\n style={tab.props.id !== current ? hiddenStyle : null}\n key={`tabContent-${tab.props.id}`}\n >\n {tab.props.children}\n </div>\n ) : null,\n )}\n </React.Fragment>\n);\nconst Accordion = ({ tabs, current, getUrlForTab, scrollIntoView }) => {\n const currentTabRef = useRef(null);\n useEffect(() => {\n if (currentTabRef.current) {\n const ref = currentTabRef.current;\n forceCheck();\n setTimeout(() => {\n if (ref === currentTabRef.current && scrollIntoView) {\n currentTabRef.current.scrollIntoView({\n behavior: 'auto',\n block: 'start',\n inline: 'nearest',\n });\n }\n }, 300);\n }\n }, [current]);\n return (\n <dl>\n {tabs.map(tab => {\n const tabId = tab.props.id;\n const isCurrent = tabId === current;\n return (\n <React.Fragment key={tabId}>\n <dt\n id={`accordion-${tabId}`}\n className={classnames(styles.accordionTitle, {\n [styles.isCurrent]: isCurrent,\n })}\n ref={isCurrent ? currentTabRef : null}\n role=\"heading\"\n aria-level=\"2\"\n >\n <Button\n href={isCurrent ? getUrlForTab() : getUrlForTab(tab.props.id)}\n className={styles.button}\n data-update\n data-cosmetic\n data-no-scrolltop\n transparent\n full\n aria-expanded={isCurrent}\n aria-controls={`accordion-${tabId}`}\n >\n {tabId == 'sustainability' ? \n <Icon\n icon={sustainability} \n className={classnames(styles.iconAfter, styles.iconSustainabilityHeader)}\n /> \n : ''}\n {tab.props.label}\n <span className={styles.buttonIcon}>\n <Icon\n role=\"presentation\"\n icon={isCurrent ? minus : plus}\n className={styles.iconAfter}\n />\n </span>\n </Button>\n </dt>\n <dd\n className={classnames(\n styles.description,\n styles.accordionContent,\n {\n [styles.accordionClosed]: !isCurrent,\n },\n )}\n aria-labelledby={`accordion-${tabId}`}\n >\n {tab.props.lazy\n ? isCurrent\n ? tab.props.children\n : null\n : tab.props.children}\n </dd>\n </React.Fragment>\n );\n })}\n </dl>\n );\n};\n\nconst ProductPresentationTabs = ({\n children,\n current,\n getUrlForTab,\n scrollIntoView,\n mode = ProductPresentationTabs.modes.tabs,\n}) => {\n const tabs = React.Children.toArray(children);\n const [viewedTabs, setViewedTabs] = useState({});\n\n useEffect(() => {\n setViewedTabs(state => ({\n ...state,\n [current]: true,\n }));\n }, [current]);\n\n return mode === ProductPresentationTabs.modes.accordion ? (\n <Accordion\n tabs={tabs}\n current={current || null}\n getUrlForTab={getUrlForTab}\n scrollIntoView={scrollIntoView}\n />\n ) : (\n <Tabs\n tabs={tabs}\n current={current || tabs[0].props.id}\n viewedTabs={viewedTabs}\n getUrlForTab={getUrlForTab}\n />\n );\n};\n\nProductPresentationTabs.modes = {\n accordion: 'accordion',\n tabs: 'tabs',\n};\nProductPresentationTabs.propTypes = {\n current: PropTypes.string,\n children: PropTypes.arrayOf(PropTypes.oneOfType([Tab])),\n mode: PropTypes.oneOf(Object.keys(ProductPresentationTabs.modes)),\n getUrlForTab: PropTypes.func.isRequired,\n scrollIntoView: PropTypes.bool,\n};\nProductPresentationTabs.defaultProps = {\n identifier: 'slug',\n mode: ProductPresentationTabs.modes.tabs,\n scrollIntoView: true,\n};\n\nProductPresentationTabs.displayName = 'ProductPresentationTabs';\nProductPresentationTabs.propTypes = {};\nProductPresentationTabs.defaultProps = {};\nProductPresentationTabs.Tab = Tab;\n\nexport default ProductPresentationTabs;\n","import ProductPresentationTabs from './ProductPresentationTabs';\nexport default ProductPresentationTabs","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { Paragraph } from 'components/atoms/Text';\nimport { translate } from 'utils/translate';\nimport { LinkButton } from 'components/atoms/Button/Button';\nimport Icon from 'components/atoms/Icon';\nimport {\n marker,\n phone,\n outlineEnvelope,\n www,\n signpost,\n} from 'components/atoms/Icon/icons';\nimport SocialMediaLinkBlock from 'episerver/blocks/SocialMediaLinkBlock';\nimport * as styles from './ProductContactInfo.scss';\n\nconst IconListItem = ({ icon, children }) => (\n <Paragraph className={styles.iconListItem}>\n <Icon icon={icon} className={styles.iconListIcon} size={['.9em', '.9em']} />\n {children}\n </Paragraph>\n);\nIconListItem.propTypes = {\n icon: PropTypes.any,\n children: PropTypes.node,\n};\n\nconst isExternalSystemShown = externalSystem =>\n ['Facebook', 'Twitter', 'Instagram', 'FourSquare'].indexOf(externalSystem) !==\n -1;\n\nconst ProductContactInfo = ({\n address,\n contactInfo = {},\n place,\n externalSystemList,\n className,\n onAddressClick,\n}) => (\n <div className={className}>\n {!!address &&\n (!!address.street || !!address.postalCode || !!address.postalName) && (\n <IconListItem icon={marker}>\n {onAddressClick ? (\n <LinkButton\n onClick={onAddressClick}\n style={{ verticalAlign: 'middle', display: 'inline-block' }}\n >\n {address.street}\n {!!address.street &&\n (!!address.postalCode || !!address.postalName) && <br />}\n {address.postalCode} {address.postalName}\n </LinkButton>\n ) : (\n <span style={{ verticalAlign: 'middle', display: 'inline-block' }}>\n {address.street}\n {!!address.street &&\n (!!address.postalCode || !!address.postalName) && <br />}\n {address.postalCode} {address.postalName}\n </span>\n )}\n </IconListItem>\n )}\n {\n // TODO readd when SimpleView updated their API to enable localisation\n /* {!!place && (\n <IconListItem icon={signpost}>\n <span>{`${translate('/product/area')}: ${place}`}</span>\n </IconListItem>\n )} */\n }\n {!!contactInfo.telephone && (\n <IconListItem icon={phone}>\n <LinkButton href={`tel:${contactInfo.telephone}`}>\n {contactInfo.telephone}\n </LinkButton>\n </IconListItem>\n )}\n {!!contactInfo.email && (\n <IconListItem icon={outlineEnvelope} className={styles.email}>\n <LinkButton href={`mailto:${contactInfo.email}`} breakWord>\n {translate('/product/sendMail')}\n </LinkButton>\n </IconListItem>\n )}\n {!!contactInfo.website && (\n <IconListItem icon={www}>\n <LinkButton\n href={contactInfo.website}\n breakWord\n target=\"_blank\"\n rel=\"roopener noreferrer\"\n >\n {translate('/product/visitwebsite')}\n </LinkButton>\n </IconListItem>\n )}\n {!!externalSystemList && externalSystemList.length && (\n <div className={styles.socialContainer}>\n {externalSystemList.map(externalSystem => {\n // Fake social media link block-element\n const buttonData = {\n url: { $c: externalSystem.id },\n mediaType: { $c: externalSystem.externalSystem.toLowerCase() },\n invertImage: { $c: true },\n };\n return isExternalSystemShown(externalSystem.externalSystem) ? (\n <SocialMediaLinkBlock\n block={buttonData}\n key={externalSystem.externalSystem}\n />\n ) : null;\n })}\n </div>\n )}\n </div>\n);\nProductContactInfo.displayName = 'ProductContactInfo';\nProductContactInfo.propTypes = {\n address: PropTypes.object,\n place: PropTypes.string,\n contactInfo: PropTypes.object,\n externalSystemList: PropTypes.arrayOf(\n PropTypes.shape({\n externalSystem: PropTypes.string.isRequired,\n id: PropTypes.string.isRequired,\n }),\n ),\n className: PropTypes.string,\n onAddressClick: PropTypes.func,\n};\nProductContactInfo.defaultProps = {};\n\nexport default ProductContactInfo;\n","import ProductContactInfo from './ProductContactInfo';\nexport default ProductContactInfo","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { getFormattedDate } from 'utils/dateTime';\nimport Table, { Row, Column } from 'components/molecules/TableList';\nimport Toggle from 'components/utilities/Toggle';\nimport { IconButton } from 'components/atoms/Button/Button';\nimport Icon from 'components/atoms/Icon';\nimport { clock, chevronDown } from 'components/atoms/Icon/icons';\nimport { translate } from 'utils/translate';\n\nimport * as styles from './ProductOpeningHours.scss';\n\nconst ProductOpeningHours = props => {\n const { openingHours, showInitial } = props;\n const groupedOpeningHours = Object.values(\n openingHours.slice(0, showInitial).reduce((result, currentObject) => {\n const val1 = currentObject['startDay'];\n const val2 = currentObject['endDay'];\n const val3 = currentObject['description'];\n result[val1 + ' ' + val2 + ' ' + val3] =\n result[val1 + ' ' + val2 + ' ' + val3] || [];\n result[val1 + ' ' + val2 + ' ' + val3].push(currentObject);\n return result;\n }, {}),\n );\n return (\n <Toggle\n on={groupedOpeningHours.length === 1}\n render={({ on, setOn }) => (\n <React.Fragment>\n <Table\n className={styles.table}\n caption={translate('/product/openingHours')}\n >\n {groupedOpeningHours\n .slice(0, !on ? 1 : groupedOpeningHours.length)\n .map((value, i) => (\n <React.Fragment key={i}>\n <Row>\n <Column heading colSpan={3} className={styles.bgGrey}>\n {getFormattedDate(value[0].startDay, 'd')}.{' '}\n {getFormattedDate(value[0].startDay, 'MMM yyyy')}\n {!!value[0].endDay && (\n <React.Fragment>\n {'–'}\n {getFormattedDate(value[0].endDay, 'd')}.{' '}\n {getFormattedDate(value[0].endDay, 'MMM yyyy')}\n </React.Fragment>\n )}\n </Column>\n </Row>\n {value.map(\n (hour, index) =>\n !!hour.openingTimes && (\n <Row\n key={`openinghours_${hour.startDay}_${hour.endDay}_${\n hour.description\n }_${index + 1}`}\n >\n <Column width=\"160px\" verticalCenter={false}>\n {hour.nameOfStartDay}\n {hour.nameOfEndDay &&\n hour.nameOfEndDay !== hour.nameOfStartDay &&\n `–${hour.nameOfEndDay}`}\n </Column>\n <Column verticalCenter={false}>\n <em>{value[0].description}</em>\n </Column>\n <Column\n align=\"right\"\n width=\"126px\"\n verticalCenter={false}\n >\n {hour.openingTimes.map((oTime, k) => (\n <React.Fragment key={k}>\n <time dateTime={new Date(oTime)}>\n {getFormattedDate(oTime, 'p')}\n {!!hour.closingTimes[k] &&\n getFormattedDate(\n hour.closingTimes[k],\n '–p',\n )}\n </time>\n {hour.openingTimes.length > 1 &&\n k < hour.openingTimes.length - 1 &&\n ', '}\n </React.Fragment>\n ))}\n </Column>\n </Row>\n ),\n )}\n </React.Fragment>\n ))}\n </Table>\n {!on && (\n <p className={styles.showMore}>\n <IconButton\n onClick={setOn}\n iconAfter={chevronDown}\n className={styles.showMoreDates}\n transparent\n >\n {translate('/product/showMoreDates')}\n </IconButton>\n </p>\n )}\n </React.Fragment>\n )}\n />\n );\n};\nProductOpeningHours.displayName = 'ProductOpeningHours';\nProductOpeningHours.propTypes = {\n openingHours: PropTypes.array,\n showInitial: PropTypes.any,\n product: PropTypes.any,\n};\nProductOpeningHours.defaultProps = {};\n\nexport default ProductOpeningHours;\n","import ProductOpeningHours from './ProductOpeningHours';\nexport default ProductOpeningHours","import React, { useRef } from 'react';\nimport PropTypes from 'prop-types';\nimport Icon from 'components/atoms/Icon';\nimport { infoFill } from 'components/atoms/Icon/icons';\nimport FocusLock from 'components/utilities/FocusLock';\nimport Modal from 'components/utilities/Modal';\nimport Toggle from 'components/utilities/Toggle';\nimport Button, { LinkButton } from '../Button';\nimport * as styles from './AdvantageCard.scss';\nimport Heading, { H2 } from '../Heading';\nimport { translate } from 'utils/translate';\n\nconst AdvantageCardContent = ({ imageTitle, imageUrl, prefix, note }) => (\n <React.Fragment>\n <img src={imageUrl} alt={imageTitle} />\n <div style={{ paddingTop: '.75rem' }}>\n <H2 className={styles.heading}>{prefix}</H2>\n <span>{note}</span>\n </div>\n\n <Icon className={styles.icon} icon={infoFill} />\n </React.Fragment>\n);\n\nconst AdvantageCard = props => {\n const { imageUrl, imageTitle, targetUrl, description, color } = props;\n const btnRef = useRef(null);\n if (!description)\n return (\n <div\n className={styles.advantageCard}\n style={{ backgroundColor: `${color}33` }}\n onMouseEnter={e => {\n e.currentTarget.style.backgroundColor = `${color}66`;\n }}\n onMouseLeave={e => {\n e.currentTarget.style.backgroundColor = `${color}33`;\n }}\n >\n <LinkButton className={styles.modalOpen} href={targetUrl}>\n <AdvantageCardContent {...props} />\n </LinkButton>\n </div>\n );\n return (\n <Toggle\n on={false}\n render={({ on, toggle, setOff }) => (\n <React.Fragment>\n <div\n className={styles.advantageCard}\n style={{ backgroundColor: `${color}33` }}\n onMouseEnter={e => {\n e.currentTarget.style.backgroundColor = `${color}66`;\n }}\n onMouseLeave={e => {\n e.currentTarget.style.backgroundColor = `${color}33`;\n }}\n >\n <LinkButton\n className={styles.modalOpen}\n onClick={() => {\n toggle();\n setTimeout(() => {\n if (btnRef.current) btnRef.current.focus();\n }, 100);\n }}\n >\n <AdvantageCardContent {...props} />\n </LinkButton>\n </div>\n {on && (\n <FocusLock>\n <Modal\n light\n maxWidth={400}\n ref={btnRef}\n onClose={setOff}\n shadow\n className={styles.modal}\n >\n <Modal.Body\n className={styles.modalBody}\n style={{ backgroundColor: `${color}66` }}\n >\n <div>\n <img src={imageUrl} alt={imageTitle} />\n <p>{description}</p>\n </div>\n <Button href={targetUrl} className={styles.readmore}>\n {translate('/product/advantageCard/readMore')}\n </Button>\n </Modal.Body>\n </Modal>\n </FocusLock>\n )}\n </React.Fragment>\n )}\n />\n );\n};\nAdvantageCard.displayName = 'AdvantageCard';\nAdvantageCard.propTypes = {\n imageUrl: PropTypes.string.isRequired,\n imageTitle: PropTypes.string.isRequired,\n prefix: PropTypes.string.isRequired,\n targetUrl: PropTypes.string.isRequired,\n note: PropTypes.string,\n color: PropTypes.string,\n description: PropTypes.string,\n};\n\nexport default AdvantageCard;\n","import AdvantageCard from './AdvantageCard';\nexport default AdvantageCard","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { H2 } from 'components/atoms/Heading';\nimport { translate } from 'utils/translate';\nimport * as styles from './AwardList.scss';\n\nconst AwardList = ({ title, imageTitle, imageUrl, targetUrl }) => (\n <div className={styles.awardList}>\n <img src={imageUrl} alt={imageTitle} />\n <a href={targetUrl} target=\"_blank\" rel=\"noopener\">\n {title}\n </a>\n </div>\n);\nAwardList.displayName = 'AwardList';\nAwardList.propTypes = {\n title: PropTypes.string.isRequired,\n imageTitle: PropTypes.string.isRequired,\n imageUrl: PropTypes.string.isRequired,\n awardName: PropTypes.string.isRequired,\n targetUrl: PropTypes.string.isRequired,\n};\n\nAwardList.defaultProps = {\n title: translate('/product/ecoCertyficate'),\n};\n\nexport default AwardList;\n","import AwardList from './AwardList';\nexport default AwardList","import { translate } from 'utils/translate';\n\nexport const getFileName = (route) => \n{\n var file = splitUrlName(route.url);\n\n if(!!route.name && !!route.name.length)\n return route.name + ` (${file.ending.toUpperCase()})`;\n\n return file.ending.toLowerCase() === \"pdf\"\n ? file.name + ` (${file.ending.toUpperCase()})`\n : translate('/product/route');\n}\n\nexport const splitUrlName = (url) => {\n let splitUrl = url.split('.');\n let fileEnding = splitUrl[splitUrl.length - 1];\n let splitName = splitUrl[splitUrl.length - 2].split('/');\n let fileName = splitName[splitName.length - 1];\n\n return {\n name: fileName,\n ending: fileEnding\n };\n}\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport Iframe from 'components/utilities/Iframe';\nimport { enturApiGet } from 'server/api';\nimport { fakeColorOpacity } from 'utils/color';\nimport * as styles from './EnturWidget.scss';\n\nclass EnturWidget extends React.Component {\n constructor(props) {\n super(props);\n this.state = {};\n }\n\n componentDidMount() {\n const { geoLocation } = this.props;\n enturApiGet(\n `https://api.entur.io/geocoder/v1/reverse?point.lat=${geoLocation.latitude}&point.lon=${geoLocation.longitude}&boundary.circle.radius=1&size=10&layers=address`,\n ).then(res => {\n if (res && res.features.length > 0) {\n const { features } = res;\n const { address, name } = this.props;\n\n const featuresByName = features.filter(f =>\n f.properties.name.toLowerCase().includes(name.toLowerCase()),\n );\n\n const featuresByAddress = features.filter(\n f =>\n address.street.length &&\n f.properties.name\n .toLowerCase()\n .includes(address.street.toLowerCase()),\n );\n\n let feature = featuresByName.length && featuresByName[0];\n if (!feature) feature = featuresByAddress && featuresByAddress[0];\n\n if (feature)\n this.setState({\n id: feature.properties.source_id,\n coordinates: feature.geometry.coordinates,\n });\n }\n });\n }\n\n render() {\n const { address, color, culture, geoLocation } = this.props;\n const { id, coordinates } = this.state;\n const style = {\n width: '100%',\n height: '100%',\n minHeight: '275px',\n minWidth: '340px',\n display: 'block',\n };\n const lang = culture === 'no' ? 'nob' : 'eng';\n const longitude = coordinates ? coordinates[0] : geoLocation.longitude;\n const latitude = coordinates ? coordinates[1] : geoLocation.latitude;\n const src = `https://widget.entur.no/compact?target=_target&defaultLang=${lang}&suggestionLimit=1&toName=${encodeURIComponent(\n address.street.split(',')[0].split('-')[0],\n )}&toPlace=${encodeURIComponent(id) ||\n 0}&toCoords=${latitude}%2C${longitude}`;\n const colorParams = color\n ? `&bgrC=${encodeURIComponent(\n color,\n )}&btnGrpMngtActBgrCol=%23fff&fcBrdrBrndC=%23fff&fcTxtC=%23000&btnGrpMngtActBrdrCol=%23fff&btnGrpMngtBrdrCol=%23fff&btnGrpMngtBgrCol=${encodeURIComponent(\n fakeColorOpacity(color, 0.7),\n )}&btnGrpMngtTxtCol=%23000&btnGrpMngtActTxtCol=%23000`\n : '';\n return id ? (\n <Iframe\n title=\"Entur-widget\"\n frameBorder={0}\n style={style}\n src={src + colorParams}\n ></Iframe>\n ) : null;\n }\n}\nEnturWidget.displayName = 'EnturWidget';\n\nEnturWidget.propTypes = {\n color: PropTypes.string,\n geoLocation: PropTypes.object,\n address: PropTypes.object,\n culture: PropTypes.string,\n name: PropTypes.string,\n};\nEnturWidget.defaultProps = {};\n\nexport default EnturWidget;\n","import EnturWidget from './EnturWidget';\nexport default EnturWidget","import React from 'react';\nimport PropTypes from 'prop-types';\nimport classnames from 'classnames';\nimport VisuallyHidden from 'components/atoms/VisuallyHidden';\nimport Heading, { H3 } from 'components/atoms/Heading';\nimport uniqueSlug from 'unique-slug';\nimport * as styles from './Product.scss';\n\nconst Section = ({ children, className, title, accessibleTitle }) => {\n const id = uniqueSlug(title || accessibleTitle);\n return (\n <section\n className={classnames(styles.section, className)}\n aria-labelledby={id}\n >\n {!!accessibleTitle ? (\n <VisuallyHidden>\n <H3 id={id}>{accessibleTitle}</H3>\n </VisuallyHidden>\n ) : (\n <H3 id={id} className={styles.sectionTitle}>\n {title}\n </H3>\n )}\n {children}\n </section>\n );\n};\nSection.propTypes = {\n children: PropTypes.any,\n className: PropTypes.any,\n title: PropTypes.any,\n accessibleTitle: PropTypes.string,\n};\nexport default Section;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport Table, { Row, Column } from 'components/molecules/TableList';\nconst PriceTable = ({ prices = null }) => (\n <Table zebra>\n {prices &&\n prices.map(price => (\n <Row\n key={`price_table_row_${price.unitTypeName}_${price.priceDetails.priceBasisName}`}\n >\n <Column width=\"15%\" heading>\n {price.unitTypeName}\n </Column>\n <Column width=\"35%\">{price.name}</Column>\n <Column width=\"25%\">{price.priceDetails.priceBasisName}</Column>\n <Column width=\"25%\">{price.priceDetails.price}</Column>\n </Row>\n ))}\n </Table>\n);\nPriceTable.propTypes = {\n prices: PropTypes.any,\n};\n\nexport default PriceTable;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport Table, { Row, Column } from 'components/molecules/TableList';\nconst RoomTable = ({ rooms }) => (\n <Table zebra>\n {rooms.map(room => (\n <Row>\n <Column width=\"25%\" heading>\n {room.unitType}\n </Column>\n <Column width=\"25%\">{room.priceBasis}</Column>\n <Column width=\"25%\">{room.guidePrice}</Column>\n <Column width=\"25%\">{room.name}</Column>\n </Row>\n ))}\n </Table>\n);\nRoomTable.propTypes = {\n rooms: PropTypes.any,\n};\n\nexport default RoomTable;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport Heading, { H3 } from 'components/atoms/Heading';\nimport Section from './Section';\n\nimport Icon from 'components/atoms/Icon';\nimport { checkmark } from 'components/atoms/Icon/icons';\nimport * as styles from './Product.scss';\nconst FacilityList = ({ list }) => (\n <Section className={styles.facilities}>\n {list.map(facilityGroup => (\n <React.Fragment key={facilityGroup.name}>\n <H3\n alt\n size={Heading.sizes.heading3}\n className={styles.sectionSubTitle}\n gutterBottom\n >\n {facilityGroup.name}\n </H3>\n <ul className={styles.facilityList}>\n {facilityGroup.subFacilities.map(facility => (\n <li key={facility.name}>\n <Icon\n icon={checkmark}\n size={['0.9em', '0.9em']}\n role=\"presentation\"\n />\n {facility.name}\n {!!facility.notes && `: ${facility.notes}`}\n </li>\n ))}\n </ul>\n </React.Fragment>\n ))}\n </Section>\n);\nFacilityList.propTypes = {\n list: PropTypes.any,\n};\n\nexport default FacilityList;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport ScriptSandbox from 'components/utilities/ScriptSandbox';\n\nconst BookATableWidget = ({ id, baseColor = '#d1eef6', language = 'null' }) => (\n <ScriptSandbox\n style={{ width: 310 }}\n content={`\n <script type=\"text/javascript\" src=\"https://bda.bookatable.com/deploy/lbui.direct.min.js\"></script>\n <script type=\"text/javascript\">\n LBDirect_Embed({\n connectionid: \"NO-VISITOSLO:80497\",\n restaurantid: ${id},\n language: ${language},\n style: {\n baseColor: '${baseColor}'\n }\n });\n </script>\n `}\n />\n);\nBookATableWidget.propTypes = {\n id: PropTypes.any,\n baseColor: PropTypes.any,\n language: PropTypes.any,\n};\n\nexport default BookATableWidget;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport DOMPurify from 'dompurify';\n\nconst config = {\n FORBID_TAGS: ['style'],\n FORBID_ATTR: ['style'],\n ADD_ATTR: ['target'],\n};\n\nconst HTMLString = ({ as: Tag = 'div', html = '', ...props }) => (\n <Tag\n {...props}\n dangerouslySetInnerHTML={{ __html: DOMPurify.sanitize(html, config) }}\n />\n);\nHTMLString.displayName = 'HtmlString';\nHTMLString.propTypes = {};\nHTMLString.defaultProps = {};\n\nexport default HTMLString;\n","import HTMLString from \"./HTMLString\";\nexport default HTMLString;\n","import React, { useState } from 'react';\nimport PropTypes from 'prop-types';\nimport { IconButton } from 'components/atoms/Button/Button';\nimport HTMLString from 'components/utilities/HTMLString';\nimport { chevronDown, chevronUp } from 'components/atoms/Icon/icons';\nimport { translate } from 'utils/translate';\n\nimport clip from 'text-clipper';\n\nimport * as styles from './Product.scss';\n\nconst ExpandableDescription = ({ html, text, truncatedLength, className }) => {\n const [open, setOpen] = useState(false);\n\n const isExpandable = html\n ? html.length > truncatedLength\n : text.length > truncatedLength;\n\n const fullContent = html ? <HTMLString html={html} /> : <p>{text}</p>;\n if (!isExpandable) {\n return fullContent;\n }\n const truncatedContent = html ? (\n <HTMLString html={clip(html, truncatedLength - 150, { html: true })} />\n ) : (\n <p>{clip(text, truncatedLength)}</p>\n );\n return (\n <div className={className}>\n {open ? fullContent : truncatedContent}\n\n <IconButton\n onClick={() => setOpen(!open)}\n iconBefore={open ? chevronUp : chevronDown}\n className={styles.readmoreButton}\n transparent\n >\n {open ? translate('/product/readLess') : translate('/product/readMore')}\n </IconButton>\n </div>\n );\n};\nExpandableDescription.displayName = 'ExpandableDescription';\nExpandableDescription.propTypes = {\n html: PropTypes.any,\n text: PropTypes.string,\n truncatedLength: PropTypes.number,\n className: PropTypes.string,\n};\n\nExpandableDescription.defaultProps = {\n truncatedLength: 700,\n};\nexport default ExpandableDescription;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { H3 } from 'components/atoms/Heading';\nimport Text from 'components/atoms/Text';\nimport Icon from 'components/atoms/Icon';\nimport { info } from 'components/atoms/Icon/icons';\nimport Link from 'components/atoms/Link';\nimport Block from 'components/atoms/Block';\nimport HTMLString from 'components/utilities/HTMLString';\nimport classNames from 'classnames';\nimport { translate } from 'utils/translate';\nimport { iconLookup } from 'utils/iconLookUp';\nimport * as styles from './Product.scss';\n\nconst SustainabilityTab = ({ sustainabilityData, productFacilities }) => {\n const groups = sustainabilityData.sustainabilityGroups;\n\n // id here is the facility group id for facility-notes\n const productNote = productFacilities.find(x => x.id === 505443);\n\n function makeBlocks(groups, productNote) {\n const blocks = [];\n for (let i = 0; i < groups.length; i++) {\n blocks.push(\n <Block>\n <H3 className={styles.sustainabilityHeader}>\n <Icon\n name={iconLookup[groups[i].icon] ?? info}\n className={styles.sustainabilityIcon}\n />\n {groups[i].title ?? 'No text set'}\n </H3>\n <Link\n href={groups[i].linkHref}\n className={styles.sustainabilityLinkText}\n >\n {groups[i].linkText ?? 'No text set'}\n </Link>\n <Text\n as=\"p\"\n id=\"facilityInfoText\"\n className={styles.sustainabilityInfoText}\n >\n {groups[i].text ?? 'No text set'}\n </Text>\n </Block>,\n );\n for (let j = 0; j < groups[i].items.length; j++) {\n if (groups[i].items[j].text) {\n blocks.push(\n <Block className={styles.sustainabilityInfoTextContainer}>\n <Text\n as=\"p\"\n className={styles.sustainabilityInfoText}\n id=\"InfoSub\"\n >\n {groups[i].items[j].text}\n </Text>\n </Block>,\n );\n }\n }\n }\n /**\n * Check for facility notes,\n * the input might come from a rich text editor so we use <HTMLString> to print text\n */\n if (productNote != undefined) {\n blocks.push(\n <Block className={styles.sustainabilityInfoTextContainer}>\n <HTMLString\n className={styles.facilityNotes}\n html={productNote.notes}\n ></HTMLString>\n </Block>,\n );\n }\n\n blocks.push(\n <Block className={styles.sustainabilityInfoTextContainer}>\n <HTMLString\n className={classNames(styles.facilityNotes, styles.disclaimer)}\n html={\n sustainabilityData.sustainabilityDisclaimerText ??\n translate('/product/selfReporting')\n }\n ></HTMLString>\n </Block>,\n );\n return blocks;\n }\n\n return (\n <Block>\n <H3 className={styles.sustainabilityHeader}>\n {sustainabilityData.sustainabilityLeadHeader}\n </H3>\n <Text className={styles.sustainabilitySubText}>\n {sustainabilityData.sustainabilityLeadText}\n </Text>\n {makeBlocks(groups, productNote)}\n </Block>\n );\n};\n\nSustainabilityTab.PropTypes = {\n classname: PropTypes.any,\n header: PropTypes.any,\n largeText: PropTypes.any,\n linkHref: PropTypes.any,\n linkText: PropTypes.any,\n iconSpan: PropTypes.any,\n Icon: PropTypes.any,\n Count: PropTypes.any,\n SustainabilityGroups: PropTypes.any,\n};\n\nexport default SustainabilityTab;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { H3 } from 'components/atoms/Heading';\nimport Text from 'components/atoms/Text';\nimport * as styles from './TagWrapper.scss';\nimport Block from 'components/atoms/Block';\n\nimport { translate } from 'utils/translate';\n\nconst TagWrapper = ({ data }) => {\n\n const tags = data;\n\n /**\n * Get tag data and build it into correct format\n * returns a string of tags\n */\n function getTags(data){\n // assume it is a product page for now\n let tags = data.split(',').join(' #');\n return tags ? '#' + tags : '';\n }\n\n /**\n * Takes a string of tags and adds them to a block-paragraph,\n * returns the tag block\n */\n function returnTags(tags){\n const tagBlock = (\n <Block>\n <H3 className={styles.tagsHeader}>{translate('/product/tags')}</H3>\n <Text className={styles.tags}>{getTags(tags)}</Text>\n </Block>\n );\n\n return tags ? tagBlock : '';\n }\n\n return (\n returnTags(tags)\n ); \n};\n\n\n\nTagWrapper.PropTypes = {\n Data: PropTypes.any,\n};\n\nexport default TagWrapper;","import TagWrapper from './TagWrapper';\nexport * from './TagWrapper';\nexport default TagWrapper;\n","import React, { useRef, Suspense } from 'react';\nimport PropTypes from 'prop-types';\nimport delve from 'packages/inmeta-epi-react/utils/delve';\nimport classnames from 'classnames';\nimport Heading, { H2, H3, TitleXL } from 'components/atoms/Heading';\nimport Container from 'components/atoms/Container';\nimport Text, { SmallText } from 'components/atoms/Text';\nimport { BookingButton, LinkButton } from 'components/atoms/Button/Button';\nimport FlexGrid from 'components/utilities/FlexGrid';\nimport TeaserMap from 'components/molecules/TeaserMap';\nimport Slider from 'components/molecules/ProductPresentationSlider';\nimport Tabs from 'components/molecules/ProductPresentationTabs';\nimport ProductContactInfo from 'components/molecules/ProductContactInfo';\nimport ProductOpeningHours from 'components/molecules/ProductOpeningHours';\nimport FavouriteButtonContainer from 'containers/molecules/FavouriteButtonContainer';\n\nimport AdvantageCard from 'components/atoms/AdvantageCard';\nimport AwardList from 'components/atoms/AwardList';\nimport Image from 'components/atoms/Image';\nimport useSiteSettings from 'hooks/use-site-settings';\nimport { BREAKPOINT_PHONE, BREAKPOINT_TABLET_PORTRAIT } from 'utils/breakpoint';\nimport { appendQueryParams } from 'utils/bundle-helper';\nimport { translate } from 'utils/translate';\nimport { getFormattedDate } from 'utils/dateTime';\nimport { getFileName, splitUrlName } from 'utils/getFileName';\nimport LoadingIndicator from 'components/utilities/LoadingIndicator';\nimport Icon from 'components/atoms/Icon';\nimport { grid, marker } from 'components/atoms/Icon/icons';\nimport EnturWidget from '../EnturWidget';\n\n// product components\nimport Section from './Section';\nimport PriceTable from './PriceTable';\nimport RoomTable from './RoomTable';\nimport FacilityList from './FacilityList';\nimport BookATableWidget from './BookATableWidget';\nimport ExpandableDescription from './ExpandableDescription';\n\nimport * as styles from './Product.scss';\nimport Link from 'components/atoms/Link';\nimport SustainabilityTab from './SustainabilityTab';\nimport TagWrapper from 'components/molecules/TagWrapper';\n\nconst ProductEventList = React.lazy(() =>\n import(\n /* webpackChunkName: \"producteventlist\" */ /* webpackPreload: true */ 'components/molecules/ProductEventList'\n ),\n);\n\nconst TripAdvisorWidget = React.lazy(() =>\n import(\n /* webpackChunkName: \"tripadvisor\" */ /* webpackPreload: true */\n 'components/organisms/TripAdvisorWidget'\n ),\n);\n\nexport const PRODUCTTYPE_NEWS = 'News';\nexport const PRODUCTTYPE_EVENT = 'Event';\n\nconst Product = ({\n product,\n url,\n breakpoint,\n hideEnturWidget,\n hideShortDescription,\n hidePriceInformation,\n}) => {\n const isMobileView = breakpoint <= BREAKPOINT_PHONE;\n const isTabletView = breakpoint <= BREAKPOINT_TABLET_PORTRAIT;\n const isDesktopView = breakpoint > BREAKPOINT_TABLET_PORTRAIT;\n const {\n id,\n name,\n address,\n description,\n geoLocation,\n hierarchicalFacilityList,\n awardListWithNames,\n publicTransportDirections,\n upcomingEvents,\n openingHours,\n contactInfo,\n tripAdvisorRating,\n productType,\n published,\n ticketInfo,\n place,\n eventItems,\n bookingWebsite,\n rooms,\n myFavoritesId,\n advantageCardSettings,\n ecoSettings,\n externalSystemList,\n sustainability,\n tags,\n } = product;\n const { culture, colorSettings } = useSiteSettings();\n const isNews = productType === PRODUCTTYPE_NEWS;\n const isEvent = productType === PRODUCTTYPE_EVENT;\n const queryKey = 'show';\n const tripAdvisorId = delve(tripAdvisorRating, 'tripAdvisorId', false);\n const hasMultipleImages = !!product.images && product.images.length > 1;\n const hasImages = !!product.images && product.images.length > 0;\n const hasContactInfo = !!contactInfo;\n const showEventList = !isNews && !!eventItems && !!eventItems.length;\n const showOpeningHours =\n !isNews && !!openingHours && !!openingHours.length && !showEventList;\n const showMainInfo = !!description && isMobileView;\n const showFacilities =\n !!hierarchicalFacilityList && !!hierarchicalFacilityList.length;\n const showMapTransport = !!geoLocation || !!publicTransportDirections;\n const bookATable =\n externalSystemList &&\n externalSystemList.find(\n external => external.externalSystem === 'Bookatable',\n );\n const isSustainable = sustainability.sustainabilityGroups.length\n ? true\n : false;\n\n const readmoreLink = showMainInfo\n ? appendQueryParams(url, { [queryKey]: 'main-info' }).href\n : null;\n\n const routes = product.routes.filter(route => !!route.url);\n const gpxRoute =\n routes.find(\n route => splitUrlName(route.url).ending.toLowerCase() === 'gpx',\n ) || null;\n\n const productColor =\n colorSettings.productColors[productType.toLowerCase()] ||\n colorSettings.productColors.others;\n\n const mapRef = useRef();\n const sliderRef = useRef();\n const scrollToRef = ref => {\n ref.current.scrollIntoView({ behavior: 'smooth', block: 'center' });\n };\n\n const openingHoursLabel = () => {\n const showHours = showOpeningHours || showEventList;\n const showPrices = !!ticketInfo || !!rooms;\n if (showHours && showPrices) return translate('/product/openingHoursTab');\n if (showHours) return translate('/product/openingHours');\n return translate('/product/prices');\n };\n const showTabs =\n (!!showMainInfo && !isNews) ||\n showOpeningHours ||\n showEventList ||\n (!!ticketInfo && ticketInfo.prices) ||\n (!!rooms && rooms.length > 0) ||\n showFacilities ||\n !!upcomingEvents ||\n !!tripAdvisorId;\n return (\n <Container>\n {hasImages && isTabletView && (\n <Suspense fallback={<LoadingIndicator />}>\n <Slider\n className={styles.presentationSlider}\n product={product}\n type=\"slide\"\n color={productColor}\n />\n </Suspense>\n )}\n\n {!!name && (\n <TitleXL underline={productColor} className={styles.title}>\n {name}\n </TitleXL>\n )}\n {!hideShortDescription && description && description.shortPlainText && (\n <p className={styles.intro}>{description.shortPlainText}</p>\n )}\n {hasImages && isDesktopView && (\n <React.Fragment>\n <Image\n src={product.images[0].url}\n ratio={[3, 2]}\n fit=\"cover\"\n cropDetails={product.images[0].cropDetails || []}\n copy={product.images[0].copyright}\n lazy={false}\n description={product.images[0].name}\n className={styles.mainImage}\n />\n <div\n style={{\n display: 'flex',\n justifyContent: 'flex-end',\n marginBottom: '2rem',\n }}\n >\n {hasMultipleImages && (\n <LinkButton\n className={styles.seeMoreImages}\n onClick={() => scrollToRef(sliderRef)}\n >\n {translate('/pages/productListPage/showMoreImages')}\n <Icon icon={grid} />\n </LinkButton>\n )}\n </div>\n </React.Fragment>\n )}\n\n {isMobileView && (\n <React.Fragment>\n <ProductContactInfo\n className={styles.contactInfo}\n address={address}\n onAddressClick={() => scrollToRef(mapRef)}\n place={place}\n />\n <div className={styles.actions}>\n {!!bookingWebsite && (\n <BookingButton\n className={styles.bookingButton}\n href={bookingWebsite}\n target=\"_blank\"\n >\n {isEvent\n ? translate('/ticketInfo/findTickets')\n : translate('/product/bookNow')}\n </BookingButton>\n )}\n\n {!!myFavoritesId && (\n <FavouriteButtonContainer\n className={styles.favouriteButton}\n identifier={myFavoritesId}\n />\n )}\n </div>\n </React.Fragment>\n )}\n\n <FlexGrid gutter={isTabletView ? '24px' : '48px'} collapse={isMobileView}>\n <FlexGrid.Column width=\"64%\" className={styles.gridColumn} shrink>\n {!!advantageCardSettings && (\n <AdvantageCard color={productColor} {...advantageCardSettings} />\n )}\n {showTabs && (\n <Tabs\n current={delve(url, `query.${queryKey}`)}\n scrollIntoView={isMobileView}\n mode={Tabs.modes.accordion}\n getUrlForTab={id =>\n appendQueryParams(url, {\n [queryKey]: id || 'none',\n }).href\n }\n >\n {!!showMainInfo && !isNews && (\n <Tabs.Tab label={translate('/product/mainTab')} id=\"main-info\">\n {(!!description || !!ecoSettings) && isMobileView && (\n <Section\n accessibleTitle={!isNews && translate('/product/about')}\n >\n {!!description && (\n <ExpandableDescription\n truncatedLength={500}\n className={styles.description}\n html={description.longRichText}\n text={description.longPlainText}\n />\n )}\n {isNews && (\n <SmallText\n as=\"time\"\n className={styles.published}\n dateTime={getFormattedDate(published, 'yyyy-MM-dd')}\n >\n {`${translate(\n '/product/publishedDate',\n )} ${getFormattedDate(published, 'P')}`}\n </SmallText>\n )}\n {ecoSettings && <AwardList {...ecoSettings} />}\n\n <ProductContactInfo\n className={styles.contactInfo}\n contactInfo={contactInfo}\n externalSystemList={externalSystemList}\n />\n </Section>\n )}\n </Tabs.Tab>\n )}\n {(showOpeningHours ||\n showEventList ||\n (!!ticketInfo && ticketInfo.prices && !hidePriceInformation) ||\n (!!rooms && rooms.length > 0)) && (\n <Tabs.Tab label={openingHoursLabel()} id=\"openinghours\">\n {showOpeningHours && (\n <Section className={styles.openingHours}>\n <ProductOpeningHours\n openingHours={openingHours}\n product={product}\n />\n </Section>\n )}\n\n {showEventList && (\n <Section className={styles.productEventList}>\n <Suspense fallback={<LoadingIndicator />}>\n <ProductEventList\n products={eventItems}\n showProductLink={false}\n showInitial={3}\n title={translate('/product/openingHours')}\n />\n </Suspense>\n </Section>\n )}\n {!hidePriceInformation && !!ticketInfo && ticketInfo.prices && (\n <Section\n className={styles.prices}\n title={translate('/product/prices')}\n >\n <PriceTable prices={ticketInfo.prices} />\n </Section>\n )}\n {!!rooms && rooms.length > 0 && (\n <Section\n className={styles.rooms}\n title={translate('/product/prices')}\n >\n <RoomTable rooms={rooms} />\n </Section>\n )}\n </Tabs.Tab>\n )}\n\n {showFacilities && (\n <Tabs.Tab\n label={translate('/product/facilitiesTab')}\n id=\"facilities\"\n >\n <FacilityList list={hierarchicalFacilityList} />\n </Tabs.Tab>\n )}\n {!!upcomingEvents && (\n <Tabs.Tab\n label={translate('/product/upcomingEventsTab')}\n id=\"upcoming-events\"\n >\n <Suspense fallback={<LoadingIndicator />}>\n <Section>\n <ProductEventList\n products={upcomingEvents}\n toggleGroups\n groupByMonth\n />\n </Section>\n </Suspense>\n </Tabs.Tab>\n )}\n {!!tripAdvisorId && (\n <Tabs.Tab\n label={translate('/product/reviewsTab')}\n id=\"reviews\"\n lazy\n >\n <Suspense fallback={<LoadingIndicator />}>\n <Section>\n <TripAdvisorWidget\n type={isMobileView ? 'summary' : 'detail'}\n id={tripAdvisorId}\n className={\n !isDesktopView\n ? styles.tripAdvisorSummaryWidget\n : styles.tripAdvisorDetailWidget\n }\n culture={culture}\n />\n </Section>\n </Suspense>\n </Tabs.Tab>\n )}\n\n {isSustainable && (\n <Tabs.Tab\n label={sustainability.sustainabilityTabTitle}\n id=\"sustainability\"\n className={styles.sustainabilityTab}\n >\n <SustainabilityTab\n sustainabilityData={sustainability}\n productFacilities={product.facilityList}\n ></SustainabilityTab>\n </Tabs.Tab>\n )}\n </Tabs>\n )}\n\n {(!!description || !!ecoSettings) && (!isMobileView || isNews) && (\n <Section\n className={classnames(styles.descriptionSection, {\n [styles.descriptionSectionSpacey]: showTabs,\n })}\n accessibleTitle={\n !isNews && `${translate('/product/about')} ${name}`\n }\n >\n {!!description && (\n <ExpandableDescription\n html={description.longRichText}\n text={description.longPlainText}\n />\n )}\n {isNews && (\n <SmallText\n as=\"time\"\n className={styles.published}\n dateTime={getFormattedDate(published, 'yyyy-MM-dd')}\n >\n {`${translate('/product/publishedDate')} ${getFormattedDate(\n published,\n 'P',\n )}`}\n </SmallText>\n )}\n\n {ecoSettings && <AwardList {...ecoSettings} />}\n\n {isNews && (\n <ProductContactInfo\n className={styles.contactInfo}\n contactInfo={contactInfo}\n externalSystemList={externalSystemList}\n />\n )}\n </Section>\n )}\n\n <TagWrapper data={tags} />\n </FlexGrid.Column>\n <FlexGrid.Column width=\"34%\" className=\"gridColumn\" grow>\n {!isMobileView && (\n <React.Fragment>\n {!!bookingWebsite && (\n <BookingButton\n className={styles.bookingButton}\n href={bookingWebsite}\n target=\"_blank\"\n >\n {isEvent\n ? translate('/ticketInfo/findTickets')\n : translate('/product/bookNow')}\n </BookingButton>\n )}\n {!!bookATable && bookATable.id && (\n <BookATableWidget id={bookATable.id} />\n )}\n {!!myFavoritesId && (\n <FavouriteButtonContainer\n className={styles.favouriteButton}\n identifier={myFavoritesId}\n />\n )}\n {hasContactInfo && (\n <Section accessibleTitle={translate('/product/contact')}>\n <ProductContactInfo\n className={styles.contactInfo}\n contactInfo={contactInfo}\n address={address}\n externalSystemList={externalSystemList}\n place={place}\n onAddressClick={() => scrollToRef(mapRef)}\n />\n </Section>\n )}\n {routes && !!routes.length && (\n <Section>\n <H2 alt size={Heading.sizes.heading5} gutterBottom>\n {translate('/product/download')}\n </H2>\n {routes.map(route => (\n <p className={styles.contactInfo}>\n <a href={route.url}>{getFileName(route)}</a>\n </p>\n ))}\n </Section>\n )}\n </React.Fragment>\n )}\n </FlexGrid.Column>\n </FlexGrid>\n\n {hasMultipleImages && isDesktopView && (\n <div ref={sliderRef}>\n <Slider\n className={styles.presentationSlider}\n showThumbnailNavigation\n product={{ ...product, images: product.images.slice(1) }}\n type=\"fade\"\n />\n </div>\n )}\n {!!bookATable && bookATable.id && isMobileView && (\n <BookATableWidget id={bookATable.id} />\n )}\n\n {showMapTransport && (\n <div ref={mapRef} className={styles.map}>\n <H2 alt size={Heading.sizes.heading2} gutterBottom>\n {translate('/product/mapTab')}\n </H2>\n {!!publicTransportDirections && (\n <p> {publicTransportDirections.longPlainText}</p>\n )}\n {!!geoLocation && !!address && (\n <FlexGrid gutter=\"0px\" collapse={!isDesktopView}>\n <FlexGrid.Column grow>\n <TeaserMap\n items={[\n {\n id,\n title: name,\n intro:\n !!description &&\n (description.shortPlainText ||\n description.longPlainText),\n geoLocation,\n },\n ]}\n route={gpxRoute}\n readmoreLink={readmoreLink}\n />\n </FlexGrid.Column>\n <FlexGrid.Column shrink>\n {!hideEnturWidget ? (\n <EnturWidget\n address={address}\n geoLocation={geoLocation}\n culture={culture}\n color={productColor}\n name={name}\n />\n ) : (\n <React.Fragment />\n )}\n </FlexGrid.Column>\n </FlexGrid>\n )}\n </div>\n )}\n </Container>\n );\n};\n\nProduct.displayName = 'Product';\nProduct.propTypes = {\n product: PropTypes.object,\n url: PropTypes.object,\n breakpoint: PropTypes.number,\n hideEnturWidget: PropTypes.bool,\n hideShortDescription: PropTypes.bool,\n};\nProduct.defaultProps = {};\n\nexport default Product;\n","import Product from './Product';\nexport * from './Product';\nexport default Product","import React, { useState, useCallback, useEffect } from 'react';\nimport PropTypes from 'prop-types';\nimport classnames from 'classnames';\nimport Link from 'components/atoms/Link';\nimport { appendQueryParams } from 'utils/bundle-helper';\nimport { LinkButton } from 'components/atoms/Button';\nimport * as styles from './ProductFilter.scss';\n\nexport const FilterItem = ({\n filter,\n type,\n active,\n compact,\n filterQuery,\n url,\n handleSetFilter,\n filtersActive,\n}) => {\n let filterIds;\n if (Object.prototype.hasOwnProperty.call(filter, 'tellusCategoryIds')) {\n filterIds = [...filter.tellusCategoryIds];\n } else {\n filterIds = filter.id;\n }\n const isFilterActive = useCallback(() => {\n const typeExists =\n filtersActive &&\n Object.prototype.hasOwnProperty.call(filtersActive, type);\n return typeExists && filtersActive[type].includes(filterIds.toString());\n }, [filtersActive, type, filterIds, isSelected]);\n\n const handleFilterClick = () => {\n let newActiveFilters = { ...filtersActive };\n\n if (newActiveFilters[type]) {\n if (isFilterActive()) {\n newActiveFilters[type] = filtersActive[type]\n .replace(filterIds.toString(), '')\n .split(',')\n .filter(item => item !== '')\n .toString();\n\n newActiveFilters = Object.keys(newActiveFilters).reduce(\n (obj, key) => ({\n ...obj,\n ...(newActiveFilters[key] !== '' && {\n [key]: newActiveFilters[key],\n }),\n }),\n {},\n );\n } else if (Array.isArray(filterIds)) {\n filterIds.forEach(id => {\n newActiveFilters[type] += `,${String(id)}`;\n });\n } else {\n newActiveFilters[type] += `,${filterIds}`;\n }\n } else {\n newActiveFilters[type] = filterIds.toString();\n }\n handleSetFilter(newActiveFilters);\n };\n\n const [isSelected, setIsSelected] = useState(isFilterActive());\n\n useEffect(() => {\n setIsSelected(isFilterActive());\n }, [isFilterActive, isSelected]);\n\n if (compact) {\n return (\n <LinkButton\n key={filter.id}\n className={classnames(styles.link, {\n [styles.compact]: compact,\n [styles.selected]: isSelected,\n })}\n onClick={handleFilterClick}\n full\n >\n {filter.name}\n </LinkButton>\n );\n }\n return (\n <Link\n className={classnames(styles.link, {\n [styles.selected]: active,\n })}\n href={\n appendQueryParams(\n url,\n {\n [type]: filterQuery.join(','),\n },\n true,\n ).href\n }\n data-no-scrolltop\n >\n {filter.name}\n </Link>\n );\n};\n\nFilterItem.propTypes = {\n filter: PropTypes.shape({\n children: PropTypes.array,\n id: PropTypes.string,\n key: PropTypes.number,\n name: PropTypes.string,\n parentID: PropTypes.number,\n productType: PropTypes.string,\n tellusCategoryIds: PropTypes.arrayOf(PropTypes.string),\n useDefaultFilter: PropTypes.bool,\n }),\n type: PropTypes.string,\n active: PropTypes.bool,\n compact: PropTypes.bool,\n url: PropTypes.object,\n filterQuery: PropTypes.arrayOf(PropTypes.string),\n handleSetFilter: PropTypes.func,\n filtersActive: PropTypes.object,\n};\n\nexport default FilterItem;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport classnames from 'classnames';\n\nimport InlineDropdown from 'components/molecules/InlineDropdown';\nimport { translate } from 'utils/translate';\n\nimport Toggle from 'components/utilities/Toggle';\nimport Heading, { H1 } from 'components/atoms/Heading';\nimport { minus, plus } from 'components/atoms/Icon/icons';\nimport Button from 'components/atoms/Button';\nimport Icon from 'components/atoms/Icon';\nimport * as styles from './ProductFilter.scss';\nimport FilterItem from './FilterItem';\n\nconst TRANSLATED_NAMES = {\n AreaIds: '/pages/eventListPage/area',\n AwardIds: '/product/ecoCertyficate',\n CategoryIds: '/pages/productListPage/category',\n EventCategoryIds: '/pages/eventListPage/category',\n};\n\nconst FilterGroup = ({\n group,\n open,\n onToggle,\n filterPage,\n filterGroupChar,\n compact,\n url,\n className,\n index,\n filtersActive,\n handleSetFilter,\n}) => {\n const eventListView = filterPage === 'Event';\n const hideIndex = 10;\n const filterTitle = TRANSLATED_NAMES[filterPage + group.filterType]\n ? translate(TRANSLATED_NAMES[filterPage + group.filterType])\n : translate(TRANSLATED_NAMES[group.filterType]);\n // eslint-disable-next-line react/prop-types\n const isOrFilter = group.filterType.startsWith('Or');\n const allFilters = isOrFilter\n ? Object.values(group.filters).map(f => ({\n ...f,\n id: filterGroupChar + f.id,\n }))\n : Object.values(group.filters).map(f => ({\n ...f,\n id: f.id.toString(),\n }));\n const queryArray = (url.query[group.filterType] || '')\n .split(',')\n .filter(item => item !== '');\n\n const getIsFiltered = filter => {\n let isFiltered = false;\n if (Object.prototype.hasOwnProperty.call(filter, 'tellusCategoryIds')) {\n // Some filters contains the same tellusCategoryIds, and were therefore falsely set as isFiltered.\n // Set specifically to the eventListView to prevent possibly breaking something elsewhere.\n if (eventListView) {\n if (filter.tellusCategoryIds.every(id => queryArray.includes(id)))\n isFiltered = true;\n } else {\n queryArray.forEach(q => {\n if (filter.tellusCategoryIds.includes(q)) isFiltered = true;\n });\n }\n } else {\n isFiltered = queryArray.includes(filter.id);\n }\n return isFiltered;\n };\n\n const getNewQueryArray = (filter, isFiltered) => {\n if (Object.prototype.hasOwnProperty.call(filter, 'tellusCategoryIds')) {\n // Some filters contains the same tellusCategoryIds, and the existing setting of the queryArray\n // resulted in removing all these filters from the query when deselecting one of them.\n // Set specifically to the eventListView to prevent possibly breaking something elsewhere.\n\n const newQuery = [...queryArray]\n .toString()\n .replace(filter.tellusCategoryIds.toString(), '')\n .split(',')\n .filter(item => item !== '');\n return isFiltered\n ? newQuery\n : [...queryArray, ...filter.tellusCategoryIds];\n }\n return isFiltered\n ? queryArray.filter(id => id !== filter.id)\n : [...queryArray, filter.id];\n };\n\n if (group.dropdown === true) {\n return (\n <React.Fragment key={`${group.filterType}_${index}`}>\n <InlineDropdown\n label={filterTitle}\n open={open}\n onChange={onToggle}\n toggleable={group.toggleable}\n className={classnames(styles.root, styles.dropdown, className)}\n >\n <ul className={styles.list}>\n {allFilters.map(filter => {\n const isFiltered = getIsFiltered(filter);\n const newQueryArray = getNewQueryArray(filter, isFiltered);\n return (\n <li className={styles.item} key={filter.id}>\n <FilterItem\n key={`${group.filterType}_${filter.id}`}\n filter={filter}\n type={group.filterType}\n active={isFiltered}\n filterQuery={newQueryArray}\n compact={compact}\n url={url}\n filtersActive={filtersActive}\n handleSetFilter={handleSetFilter}\n />\n </li>\n );\n })}\n </ul>\n </InlineDropdown>\n </React.Fragment>\n );\n }\n\n return (\n <section\n key={`${group.filterType}_${index}`}\n className={classnames(styles.root, className)}\n >\n <H1 size={Heading.sizes.heading4} className={styles.heading}>\n {filterTitle}\n </H1>\n {!group.toggleable ? (\n <ul className={styles.list}>\n {allFilters.map(filter => {\n const isFiltered = getIsFiltered(filter);\n const newQueryArray = getNewQueryArray(filter, isFiltered);\n\n return (\n <li className={styles.item} key={filter.id}>\n <FilterItem\n key={`${group.filterType}_${filter.id}`}\n filter={filter}\n type={group.filterType}\n active={isFiltered}\n filterQuery={newQueryArray}\n compact={compact}\n url={url}\n filtersActive={filtersActive}\n handleSetFilter={handleSetFilter}\n />\n </li>\n );\n })}\n </ul>\n ) : (\n <ul className={styles.list}>\n {allFilters.map((filter, i) => {\n if (i < hideIndex) {\n const isFiltered = getIsFiltered(filter);\n const newQueryArray = getNewQueryArray(filter, isFiltered);\n return (\n <li className={styles.item} key={filter.id}>\n <FilterItem\n key={`${group.filterType}_${filter.id}`}\n filter={filter}\n type={group.filterType}\n active={isFiltered}\n filterQuery={newQueryArray}\n compact={compact}\n url={url}\n filtersActive={filtersActive}\n handleSetFilter={handleSetFilter}\n />\n </li>\n );\n }\n return null;\n })}\n\n <Toggle\n on={false}\n render={({ on, toggle }) => (\n <React.Fragment>\n {on &&\n Object.values(group.filters).map((filter, i) => {\n if (i >= hideIndex) {\n const isFiltered = getIsFiltered(filter);\n\n const newQueryArray = getNewQueryArray(\n filter,\n isFiltered,\n );\n\n return (\n <li className={styles.item} key={filter.id}>\n <FilterItem\n key={`${group.filterType}_${filter.id}`}\n filter={filter}\n type={group.filterType}\n active={isFiltered}\n filterQuery={newQueryArray}\n compact={compact}\n url={url}\n filtersActive={filtersActive}\n handleSetFilter={handleSetFilter}\n />\n </li>\n );\n }\n return null;\n })}\n\n <li>\n <Button\n transparent\n onClick={toggle}\n className={styles.toggle}\n noPadding\n >\n <Icon icon={on ? minus : plus} />\n {on\n ? translate('/pages/productListPage/showLess')\n : translate('/pages/productListPage/showMore')}\n </Button>\n </li>\n </React.Fragment>\n )}\n />\n </ul>\n )}\n </section>\n );\n};\n\nFilterGroup.propTypes = {\n onToggle: PropTypes.func,\n filterPage: PropTypes.string,\n filterGroupChar: PropTypes.string,\n url: PropTypes.object,\n open: PropTypes.bool,\n compact: PropTypes.bool,\n className: PropTypes.string,\n index: PropTypes.number,\n handleSetFilter: PropTypes.func,\n filtersActive: PropTypes.object,\n group: PropTypes.shape({\n filterType: PropTypes.string,\n filters: PropTypes.any,\n toggleable: PropTypes.bool,\n dropdown: PropTypes.bool,\n }),\n};\n\nexport default FilterGroup;\n","import React, { useState, useMemo, useEffect } from 'react';\nimport PropTypes from 'prop-types';\nimport classnames from 'classnames';\n\nimport Link from 'components/atoms/Link';\nimport InlineDropdown from 'components/molecules/InlineDropdown';\nimport { appendQueryParams } from 'utils/bundle-helper';\nimport { translate } from 'utils/translate';\n\nimport Toggle from 'components/utilities/Toggle';\nimport Heading, { H1 } from 'components/atoms/Heading';\nimport { minus, plus } from 'components/atoms/Icon/icons';\nimport Button from 'components/atoms/Button';\nimport Icon from 'components/atoms/Icon';\nimport FilterGroup from './FilterGroup';\n\nimport * as styles from './ProductFilter.scss';\n// add more if needed\nconst TRANSLATED_NAMES = {\n AreaIds: '/pages/eventListPage/area',\n AwardIds: '/product/ecoCertyficate',\n CategoryIds: '/pages/productListPage/category',\n EventCategoryIds: '/pages/eventListPage/category',\n};\n\nconst ProductFilter = ({\n name,\n filters,\n filterType,\n toggleable,\n open,\n url,\n onToggle,\n className,\n dropdown = true,\n filterGroupChar,\n filterPage,\n filterGroup,\n color,\n compact = false,\n onSetFiltersBtnClick,\n}) => {\n // if filterType === \"regionFilter\", find name from translations\n if (\n (!filterGroup && (!filters || filters === undefined)) ||\n (filterGroup && filterGroup === undefined)\n ) {\n return null;\n }\n\n const eventListView = filterPage === 'Event';\n\n let hideIndex = 5;\n\n const style = {};\n if (color) {\n style['--wrapperColor'] = `${color}66`;\n }\n\n const label = TRANSLATED_NAMES[filterType]\n ? translate(TRANSLATED_NAMES[filterType])\n : name;\n\n const [filtersActive, setFiltersActive] = useState({ ...url.query });\n const [filtersChanged, setFiltersChanged] = useState(false);\n\n useEffect(() => {\n setFiltersChanged(\n JSON.stringify(url.query) !== JSON.stringify(filtersActive),\n );\n }, [url.query, filtersActive]);\n\n if (filterGroup) {\n const filtered = Object.keys(url.query).some(key =>\n Object.keys(filterGroup).includes(key),\n );\n const useSelectedFiltersQuery = useMemo(\n () =>\n Object.keys(url.query).reduce(\n (result, key) => {\n const res = { ...result };\n res[key] =\n Object.hasOwn(filtersActive, key) && filtersActive[key].length > 0\n ? filtersActive[key]\n : '';\n return result;\n },\n { ...url.query, ...filtersActive },\n ),\n [filtersActive],\n );\n\n return (\n <div className={styles.eventFilter}>\n <div className={styles.filters} style={style}>\n {Object.values(filterGroup).map((group, index) => (\n <FilterGroup\n key={group.filterType}\n group={group}\n open={open}\n onToggle={onToggle}\n filterPage={filterPage}\n filterGroupChar={filterGroupChar}\n compact={compact}\n url={url}\n index={index}\n handleSetFilter={setFiltersActive}\n filtersActive={filtersActive}\n />\n ))}\n </div>\n\n {compact ? (\n <div className={styles.buttonWrapper}>\n <Button\n className={classnames(styles.useFiltersButton, {\n [styles.active]: filtersChanged,\n })}\n palette=\"secondary\"\n href={appendQueryParams(url, useSelectedFiltersQuery, true).href}\n onClick={onSetFiltersBtnClick}\n disabled={!filtersChanged}\n >\n {translate('/pages/eventListPage/useSelectedFilters')}\n </Button>\n\n <Button\n className={classnames(styles.resetFiltersButton, {\n [styles.active]: filtered,\n })}\n palette=\"secondary\"\n href={\n appendQueryParams(\n url,\n Object.keys(filterGroup).reduce((f, key) => {\n f[key] = '';\n return f;\n }, {}),\n true,\n ).href\n }\n onClick={onSetFiltersBtnClick}\n disabled={!filtered}\n >\n {translate('/pages/eventListPage/resetFilters')}\n </Button>\n </div>\n ) : (\n <Button\n className={classnames(styles.resetFiltersButton, {\n [styles.active]: filtered,\n })}\n palette=\"secondary\"\n href={\n appendQueryParams(\n url,\n Object.keys(filterGroup).reduce((f, key) => {\n f[key] = '';\n return f;\n }, {}),\n true,\n ).href\n }\n disabled={!filtered}\n >\n {translate('/pages/eventListPage/resetFilters')}\n </Button>\n )}\n </div>\n );\n }\n\n const getIsFiltered = (filter, queryArray) => {\n let isFiltered = false;\n if (Object.prototype.hasOwnProperty.call(filter, 'tellusCategoryIds')) {\n // Some filters contains the same tellusCategoryIds, and were therefore falsely set as isFiltered.\n // Set specifically to the eventListView to prevent possibly breaking something elsewhere.\n if (eventListView) {\n if (filter.tellusCategoryIds.every(id => queryArray.includes(id)))\n isFiltered = true;\n } else {\n queryArray.forEach(q => {\n if (filter.tellusCategoryIds.includes(q)) isFiltered = true;\n });\n }\n } else {\n isFiltered = queryArray.includes(filter.id);\n }\n return isFiltered;\n };\n\n const getNewQueryArray = (filter, isFiltered) => {\n if (Object.prototype.hasOwnProperty.call(filter, 'tellusCategoryIds')) {\n return isFiltered\n ? queryArray.filter(id => !filter.tellusCategoryIds.includes(id))\n : [...queryArray, ...filter.tellusCategoryIds];\n }\n return isFiltered\n ? queryArray.filter(id => id !== filter.id)\n : [...queryArray, filter.id];\n };\n\n // eslint-disable-next-line react/prop-types\n const isOrFilter = filterType.startsWith('Or');\n const allFilters = isOrFilter\n ? filters.map(f => ({ ...f, id: filterGroupChar + f.id }))\n : filters.map(f => ({ ...f, id: f.id.toString() }));\n const queryArray = (url.query[filterType] || '')\n .split(',')\n // split returns empty nodes for an empty string\n .filter(item => item !== '');\n if (dropdown) {\n return (\n <InlineDropdown\n label={label}\n open={open}\n onChange={onToggle}\n toggleable={toggleable}\n className={classnames(styles.root, styles.dropdown, className)}\n >\n <ul className={styles.list}>\n {allFilters.map(filter => {\n const isFiltered = getIsFiltered(filter, queryArray);\n const newQueryArray = getNewQueryArray(filter, isFiltered);\n return (\n <li className={styles.item} key={filter.id}>\n <Link\n className={classnames(styles.link, {\n [styles.selected]: isFiltered,\n })}\n href={\n appendQueryParams(\n url,\n {\n [filterType]: newQueryArray.join(','),\n },\n true,\n ).href\n }\n data-no-scrolltop\n >\n {filter.name}\n </Link>\n </li>\n );\n })}\n </ul>\n </InlineDropdown>\n );\n }\n\n if (!toggleable)\n return (\n <section className={classnames(styles.root, className)}>\n <H1 size={Heading.sizes.heading4} className={styles.heading}>\n {label}\n </H1>\n <ul className={styles.list}>\n {allFilters.map(filter => {\n const isFiltered = getIsFiltered(filter, queryArray);\n const newQueryArray = getNewQueryArray(filter, isFiltered);\n return (\n <li className={styles.item} key={filter.id}>\n <Link\n className={classnames(styles.link, {\n [styles.selected]: isFiltered,\n })}\n href={\n appendQueryParams(\n url,\n {\n [filterType]: newQueryArray.join(','),\n },\n true,\n ).href\n }\n data-no-scrolltop\n >\n {filter.name}\n </Link>\n </li>\n );\n })}\n </ul>\n </section>\n );\n\n hideIndex = 5;\n\n return (\n <section className={classnames(styles.root, className)}>\n <H1 size={Heading.sizes.heading4} className={styles.heading}>\n {label}\n </H1>\n <ul className={styles.list}>\n <Toggle\n on={false}\n render={({ on, toggle }) => (\n <React.Fragment>\n {allFilters.map((filter, index) => {\n const isFiltered = getIsFiltered(filter, queryArray);\n const newQueryArray = getNewQueryArray(filter, isFiltered);\n return (\n index < hideIndex && (\n <li className={styles.item} key={filter.id}>\n <Link\n className={classnames(styles.link, {\n [styles.selected]: isFiltered,\n })}\n href={\n appendQueryParams(\n url,\n {\n [filterType]: newQueryArray.join(','),\n },\n true,\n ).href\n }\n data-no-scrolltop\n >\n {filter.name}\n </Link>\n </li>\n )\n );\n })}\n {on &&\n allFilters.map((filter, index) => {\n const isFiltered = getIsFiltered(filter, queryArray);\n const newQueryArray = getNewQueryArray(filter, isFiltered);\n return (\n index >= hideIndex && (\n <li className={styles.item} key={filter.id}>\n <Link\n className={classnames(styles.link, {\n [styles.selected]: isFiltered,\n })}\n href={\n appendQueryParams(\n url,\n {\n [filterType]: newQueryArray.join(','),\n },\n true,\n ).href\n }\n data-no-scrolltop\n >\n {filter.name}\n </Link>\n </li>\n )\n );\n })}\n\n <li>\n <Button\n transparent\n onClick={toggle}\n className={styles.toggle}\n noPadding\n >\n <Icon icon={on ? minus : plus} />\n {on\n ? translate('/pages/productListPage/showLess')\n : translate('/pages/productListPage/showMore')}\n </Button>\n </li>\n </React.Fragment>\n )}\n />\n </ul>\n </section>\n );\n};\nProductFilter.displayName = 'ProductFilter';\nProductFilter.propTypes = {\n filterGroup: PropTypes.objectOf(\n PropTypes.shape({\n filterType: PropTypes.string.isRequired,\n filters: PropTypes.any.isRequired,\n toggleable: PropTypes.bool,\n dropdown: PropTypes.bool,\n }),\n ),\n};\nProductFilter.defaultProps = {};\n\nexport default ProductFilter;\n","import ProductFilter from './ProductFilter';\nexport * from './ProductFilter';\nexport default ProductFilter","// extracted by mini-css-extract-plugin\nmodule.exports = {\"intro\":\"V1iXm2\",\"presentationSlider\":\"_3ptDUF\",\"map\":\"_34Bq9\",\"title\":\"_2NR-iK\",\"mainImage\":\"_1hwnOB\",\"shareAndFavoriteWrapper\":\"h7qfus\",\"facilityList\":\"_2PMn0n\",\"facilities\":\"_124HmR\",\"grid\":\"_19qbNu\",\"main\":\"_1oMCZs\",\"aside\":\"_3rLNd1\",\"section\":\"I96qyA\",\"sectionTitle\":\"NkEUtX\",\"sectionSubTitle\":\"_20YeMv\",\"contactInfo\":\"_1SPXxi\",\"tripAdvisorRatingWidget\":\"_1lYoob\",\"tripAdvisorSummaryWidget\":\"_ckqGv\",\"tripAdvisorDetailWidget\":\"_1C0Q6_\",\"published\":\"_2u7A3p\",\"productEventList\":\"_1WQwMh\",\"gridColumn\":\"_28syuK\",\"favouriteButton\":\"yzLZnU\",\"bookingButton\":\"_2cFrG2\",\"readmoreButton\":\"_1HJfIf\",\"actions\":\"_37653Y\",\"openingHours\":\"_3lmDK3\",\"rooms\":\"_1tSazV\",\"prices\":\"_2fE0_o\",\"seeMoreImages\":\"_20-fpe\",\"description\":\"_3nNPKs\",\"descriptionSection\":\"_2A697U\",\"descriptionSectionSpacey\":\"_29b0tL\",\"m-bt-40\":\"_2ijnjm\",\"sustainabilityHeader\":\"_1MbPS5\",\"facilityNotes\":\"_2YB3Mc\",\"disclaimer\":\"_28cGMQ\",\"sustainabilitySubText\":\"_390L1J\",\"sustainabilityInfoTextContainer\":\"_1FmByI\",\"sustainabilityInfoText\":\"_17KUpJ\",\"sustainabilityIcon\":\"_7EN7QI\",\"sustainabilityLinkText\":\"_1OYNxE\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"list\":\"_3x8G7m\",\"link\":\"_3oacFA\",\"compact\":\"rOmcGW\",\"selected\":\"_2hLVrI\",\"heading\":\"_2k-KRM\",\"toggle\":\"_3mzdK3\",\"dropdown\":\"_2t8LVV\",\"eventFilter\":\"_1WEE_3\",\"filters\":\"IF8tcV\",\"buttonWrapper\":\"_2b42Ws\",\"useFiltersButton\":\"_9rAtUM\",\"resetFiltersButton\":\"_35U16e\",\"active\":\"_3P2sb4\"};"],"sourceRoot":""}