{"version":3,"file":"related.0762b8fcdb5d6ea68677.chunk.js","mappings":"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","sources":["webpack://AlfaLaval/./node_modules/classnames/index.js","webpack://AlfaLaval/./assets/icons/common/Profile.tsx","webpack://AlfaLaval/./assets/icons/common/IconContainer.tsx","webpack://AlfaLaval/./assets/icons/common/Facebook.tsx","webpack://AlfaLaval/./assets/icons/common/Twitter.tsx","webpack://AlfaLaval/./assets/icons/common/ExternalLink.tsx","webpack://AlfaLaval/./assets/icons/common/Arrow.tsx","webpack://AlfaLaval/./assets/icons/common/Cross.tsx","webpack://AlfaLaval/./assets/icons/common/Delete.tsx","webpack://AlfaLaval/./assets/icons/common/Email.tsx","webpack://AlfaLaval/./assets/icons/common/Phone.tsx","webpack://AlfaLaval/./components/Accordion/Accordion.tsx","webpack://AlfaLaval/./components/Accordion/index.ts","webpack://AlfaLaval/./components/Button/Button.tsx","webpack://AlfaLaval/./components/QuoteItem/QuoteItem.tsx","webpack://AlfaLaval/./components/RadioButton/RadioButton.tsx","webpack://AlfaLaval/./helpers/noScroll.ts","webpack://AlfaLaval/./helpers/quoteClickHelper.ts","webpack://AlfaLaval/./hooks/useOutsideClick.tsx","webpack://AlfaLaval/./layouts/Related/Related.types.ts","webpack://AlfaLaval/./layouts/Related/components/common/RelatedFilter.tsx","webpack://AlfaLaval/./layouts/Related/components/common/RelatedItem.tsx","webpack://AlfaLaval/./layouts/Related/components/common/RelatedList.tsx","webpack://AlfaLaval/./helpers/numHelpers.ts","webpack://AlfaLaval/./layouts/Related/components/RelatedContainer/RelatedContainer.tsx","webpack://AlfaLaval/./layouts/Related/components/RelatedDocContainer/components/RelatedDocFilter/RelatedDocFilter.tsx","webpack://AlfaLaval/./layouts/Related/components/RelatedDocContainer/components/RelatedDocList/DocListShowMoreBtn.tsx","webpack://AlfaLaval/./layouts/Related/components/RelatedDocContainer/components/RelatedDocList/RelatedDocList.hooks.tsx","webpack://AlfaLaval/./layouts/Related/components/RelatedDocContainer/components/RelatedDocItem/Thumbnail.tsx","webpack://AlfaLaval/./layouts/Related/components/RelatedDocContainer/components/RelatedDocItem/RelatedDocItem.tsx","webpack://AlfaLaval/./layouts/Related/components/RelatedDocContainer/components/RelatedDocList/RelatedDocList.tsx","webpack://AlfaLaval/./layouts/Related/components/RelatedDocContainer/RelatedDocContainer.tsx","webpack://AlfaLaval/./layouts/Related/components/RelatedDocContainer/RelatedDocContainer.hooks.ts","webpack://AlfaLaval/./layouts/Related/components/RelatedServiceContainer/RelatedServiceContainer.tsx","webpack://AlfaLaval/./components/Modal/Modal.tsx","webpack://AlfaLaval/./components/IconButton/IconButton.tsx","webpack://AlfaLaval/./components/ScrollableContainer/ScrollableContainer.tsx","webpack://AlfaLaval/./layouts/Related/components/RelatedProductModelContainer/TechnicalDetailsContainer/TechnicalDetailsContainer.utils.ts","webpack://AlfaLaval/./layouts/Related/components/RelatedProductModelContainer/TechnicalDetailsContainer/components/TechnicalDetailsTopics/TechnicalDetailsTopics.tsx","webpack://AlfaLaval/./layouts/Related/components/RelatedProductModelContainer/TechnicalDetailsContainer/components/TechnicalDetailsTopics/TechnicalDetailsTopics.hooks.tsx","webpack://AlfaLaval/./components/Dropdown/Dropdown.tsx","webpack://AlfaLaval/./components/ListItem/ListItem.tsx","webpack://AlfaLaval/./layouts/Related/components/RelatedProductModelContainer/TechnicalDetailsContainer/components/ProductSelector/ProductSelector.tsx","webpack://AlfaLaval/./hooks/useDropdown.tsx","webpack://AlfaLaval/./layouts/Related/components/RelatedProductModelContainer/TechnicalDetailsContainer/TechnicalDetailsContainer.tsx","webpack://AlfaLaval/./layouts/Related/components/RelatedProductModelContainer/RelatedProductModelContainer.tsx","webpack://AlfaLaval/./layouts/Related/Related.service.ts","webpack://AlfaLaval/./layouts/Related/Related.tsx","webpack://AlfaLaval/./layouts/Related/index.ts","webpack://AlfaLaval/./pages/ContactUs/ContactUs.service.ts","webpack://AlfaLaval/./services/endpoints.ts"],"sourcesContent":["/*!\n\tCopyright (c) 2018 Jed Watson.\n\tLicensed under the MIT License (MIT), see\n\thttp://jedwatson.github.io/classnames\n*/\n/* global define */\n\n(function () {\n\t'use strict';\n\n\tvar hasOwn = {}.hasOwnProperty;\n\tvar nativeCodeString = '[native code]';\n\n\tfunction classNames() {\n\t\tvar classes = [];\n\n\t\tfor (var i = 0; i < arguments.length; i++) {\n\t\t\tvar arg = arguments[i];\n\t\t\tif (!arg) continue;\n\n\t\t\tvar argType = typeof arg;\n\n\t\t\tif (argType === 'string' || argType === 'number') {\n\t\t\t\tclasses.push(arg);\n\t\t\t} else if (Array.isArray(arg)) {\n\t\t\t\tif (arg.length) {\n\t\t\t\t\tvar inner = classNames.apply(null, arg);\n\t\t\t\t\tif (inner) {\n\t\t\t\t\t\tclasses.push(inner);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else if (argType === 'object') {\n\t\t\t\tif (arg.toString !== Object.prototype.toString && !arg.toString.toString().includes('[native code]')) {\n\t\t\t\t\tclasses.push(arg.toString());\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tfor (var key in arg) {\n\t\t\t\t\tif (hasOwn.call(arg, key) && arg[key]) {\n\t\t\t\t\t\tclasses.push(key);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn classes.join(' ');\n\t}\n\n\tif (typeof module !== 'undefined' && module.exports) {\n\t\tclassNames.default = classNames;\n\t\tmodule.exports = classNames;\n\t} else if (typeof define === 'function' && typeof define.amd === 'object' && define.amd) {\n\t\t// register as 'classnames', consistent with npm package name\n\t\tdefine('classnames', [], function () {\n\t\t\treturn classNames;\n\t\t});\n\t} else {\n\t\twindow.classNames = classNames;\n\t}\n}());\n","import React from 'react';\r\n\r\nexport const Profile = () => (\r\n <svg\r\n xmlns='http://www.w3.org/2000/svg'\r\n width='21'\r\n height='21'\r\n viewBox='0 0 21 21'\r\n fill='none'\r\n stroke='#11387f'\r\n strokeWidth='2'\r\n strokeLinecap='round'\r\n strokeLinejoin='round'\r\n >\r\n <circle cx='12' cy='7' r='4' />\r\n <path d='M12 14s-8-1.5-8 4h16c0-5.5-8-4-8-4z' />\r\n </svg>\r\n);\r\n","import React, { ReactNode } from 'react';\r\n\r\ninterface IconContainerProps {\r\n icon: ReactNode;\r\n className?: string;\r\n}\r\n\r\nexport const IconContainer = ({ icon, className }: IconContainerProps) => {\r\n return (\r\n <i className={className} aria-hidden=\"true\">\r\n {icon}\r\n </i>\r\n )\r\n};","import React from 'react';\r\n\r\nexport const Facebook = () => (\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" enable-background=\"new 0 0 24 24\" height=\"20\" viewBox=\"0 0 24 24\" width=\"20\">\r\n <rect fill=\"none\" height=\"20\" width=\"20\" />\r\n <path d=\"M22,12c0-5.52-4.48-10-10-10S2,6.48,2,12c0,4.84,3.44,8.87,8,9.8V15H8v-3h2V9.5C10,7.57,11.57,6,13.5,6H16v3h-2 c-0.55,0-1,0.45-1,1v2h3v3h-3v6.95C18.05,21.45,22,17.19,22,12z\" />\r\n </svg>\r\n);\r\n\r\n\r\n","import React from 'react';\r\n\r\nexport const Twitter = () => (\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" x=\"0px\" y=\"0px\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\">\r\n <path d=\"M 2.3671875 3 L 9.4628906 13.140625 L 2.7402344 21 L 5.3808594 21 L 10.644531 14.830078 L 14.960938 21 L 21.871094 21 L 14.449219 10.375 L 20.740234 3 L 18.140625 3 L 13.271484 8.6875 L 9.2988281 3 L 2.3671875 3 z M 6.2070312 5 L 8.2558594 5 L 18.033203 19 L 16.001953 19 L 6.2070312 5 z\"></path>\r\n </svg>\r\n);","import React from 'react';\r\n\r\nexport const ExternalLink = () => (\r\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <g id=\"external-link\">\r\n <path id=\"Vector\" d=\"M18 13V17C18 18.0609 17.5786 19.0783 16.8284 19.8284C16.0783 20.5786 15.0609 21 14 21H3V6H11\" stroke=\"white\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\r\n <path id=\"Vector_2\" d=\"M15 3H21V9\" stroke=\"white\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\r\n <path id=\"Vector_3\" d=\"M10 14L21 3\" stroke=\"white\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\r\n </g>\r\n </svg>\r\n);\r\n","import React from 'react';\r\n\r\nexport const Arrow = ({ stroke = '#10387F', rotate = 0 }) => {\r\n return (\r\n <svg\r\n xmlns='http://www.w3.org/2000/svg'\r\n width='24'\r\n height='24'\r\n viewBox='0 0 24 24'\r\n fill='none'\r\n style={{\r\n transformBox: 'fill-box',\r\n transformOrigin: 'center',\r\n transform: `rotate(${rotate}deg)`,\r\n }}\r\n >\r\n <path d='M9 18.5L15 12.5L9 6.5' stroke={stroke} strokeWidth='2' />\r\n </svg>\r\n );\r\n};\r\n","import React from 'react';\r\n\r\nexport const Cross = () => (\r\n <svg width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'>\r\n <path\r\n d='M18 6L6 18'\r\n stroke='currentColor'\r\n strokeWidth='2'\r\n strokeLinecap='round'\r\n strokeLinejoin='round'\r\n />\r\n <path\r\n d='M6 6L18 18'\r\n stroke='currentColor'\r\n strokeWidth='2'\r\n strokeLinecap='round'\r\n strokeLinejoin='round'\r\n />\r\n </svg>\r\n);\r\n","import React from 'react';\r\n\r\nexport const Delete = () => (\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\">\r\n <path d=\"M3 6H5H21\" stroke=\"#3D3935\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\r\n <path d=\"M8 6V4C8 3.46957 8.21071 2.96086 8.58579 2.58579C8.96086 2.21071 9.46957 2 10 2H14C14.5304 2 15.0391 2.21071 15.4142 2.58579C15.7893 2.96086 16 3.46957 16 4V6M19 6V18C19 19.0609 18.5786 20.0783 17.8284 20.8284C17.0783 21.5786 16.0609 22 15 22H5V6H19Z\" stroke=\"#3D3935\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\r\n <path d=\"M10 11V17\" stroke=\"#3D3935\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\r\n <path d=\"M14 11V17\" stroke=\"#3D3935\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\r\n </svg>\r\n);\r\n","import React from 'react';\r\n\r\nexport const EmailSvg = () => (\r\n <svg width='20' height='15' viewBox='0 0 20 15' fill='none' xmlns='http://www.w3.org/2000/svg'>\r\n <path\r\n d='M0.833496 2.74939C0.833496 1.64482 1.72893 0.74939 2.8335 0.74939H17.1668C18.2714 0.74939 19.1668 1.64482 19.1668 2.74939V3.50801L11.7086 8.675C10.6809 9.38697 9.31942 9.38697 8.29173 8.675L0.833496 3.50801V2.74939Z'\r\n fill='#3D3935'\r\n />\r\n <path\r\n d='M0.833496 4.42755L8.29173 9.59454C9.31942 10.3065 10.6809 10.3065 11.7086 9.59454L19.1668 4.42755V12.0827C19.1668 13.1873 18.2714 14.0827 17.1668 14.0827H2.8335C1.72893 14.0827 0.833496 13.1873 0.833496 12.0827V4.42755Z'\r\n fill='#3D3935'\r\n />\r\n </svg>\r\n);\r\n","import React from 'react';\r\n\r\nexport const PhoneSvg = () => (\r\n <svg width='18' height='17' viewBox='0 0 18 17' fill='none' xmlns='http://www.w3.org/2000/svg'>\r\n <path\r\n fillRule='evenodd'\r\n clipRule='evenodd'\r\n d='M17.3327 12.5608V15.0698C17.3336 15.3028 17.2857 15.5333 17.1923 15.7468C17.0988 15.9602 16.9617 16.1517 16.7896 16.3092C16.6177 16.4667 16.4146 16.5865 16.1936 16.6611C15.9725 16.7358 15.7382 16.7635 15.5058 16.7425C12.9272 16.4629 10.4502 15.5835 8.27395 14.175C6.24917 12.8909 4.53255 11.1777 3.24595 9.15694C1.82971 6.97511 0.948369 4.49104 0.673306 1.90593C0.652365 1.67465 0.679901 1.44157 0.754173 1.22149C0.828436 1.00143 0.947808 0.799203 1.10467 0.627696C1.26154 0.456188 1.45247 0.319163 1.66532 0.225335C1.87815 0.131506 2.10824 0.0829403 2.34091 0.0827228H4.8549C5.26157 0.0787251 5.65584 0.222458 5.9642 0.487116C6.27256 0.751775 6.47396 1.11931 6.53088 1.52122C6.63701 2.32415 6.83377 3.11253 7.11751 3.87132C7.23022 4.17066 7.25461 4.49599 7.18782 4.80875C7.12095 5.12151 6.96567 5.4086 6.74042 5.63599L5.67613 6.69811C6.86905 8.79196 8.60613 10.5256 10.7041 11.7161L11.7684 10.654C11.9961 10.4292 12.2838 10.2742 12.5972 10.2075C12.9106 10.1408 13.2365 10.1651 13.5365 10.2776C14.2968 10.5608 15.0868 10.7572 15.8913 10.8631C16.2983 10.9204 16.6701 11.125 16.9359 11.438C17.2016 11.7511 17.3428 12.1507 17.3327 12.5608Z'\r\n fill='#3D3935'\r\n />\r\n </svg>\r\n);\r\n","import { useWinSize } from '@contexts/WinSizeContext';\r\nimport classNames from 'classnames';\r\nimport React, { useState, useEffect } from 'react';\r\nimport './Accordion.scss';\r\n\r\ninterface ContainerProps {\r\n className?: string;\r\n children: React.ReactNode;\r\n}\r\n\r\nconst Container = ({ className, children }: ContainerProps) => {\r\n return <div className={`c-accordion-tabs ${className}`}>{children}</div>;\r\n};\r\n\r\ninterface Tab {\r\n id: string | number;\r\n name: string | React.ReactNode;\r\n}\r\n\r\ninterface SectionProps {\r\n isOpen?: boolean;\r\n index?: number;\r\n // used to open first accordion of a specific block on mobile\r\n accordionBlockSelector?: string;\r\n onClick?: (tab: Tab) => void;\r\n children: React.ReactNode;\r\n tab: Tab;\r\n className?: string;\r\n url?: string | null;\r\n iconUrl?: string;\r\n hasIcon?: boolean;\r\n isLight?: boolean;\r\n}\r\n\r\nconst Section = ({\r\n isOpen,\r\n index,\r\n onClick,\r\n accordionBlockSelector = '#RelatedTabs',\r\n children,\r\n tab,\r\n className,\r\n url,\r\n iconUrl,\r\n isLight,\r\n hasIcon,\r\n}: SectionProps) => {\r\n const tabHead = '.c-accordion-tabs-head';\r\n const tabBody = '.c-accordion-tabs-body';\r\n const firstAccordionStyle = 'c-accordion-tabs-is-open';\r\n\r\n const [isOpened, setIsOpened] = useState<boolean>(!!isOpen);\r\n const { isDesktop } = useWinSize();\r\n const isMobile = !isDesktop;\r\n\r\n useEffect(() => {\r\n openFirstAccordion();\r\n\r\n if (isDesktop) {\r\n window.addEventListener('resize', openFirstAccordion);\r\n return () => {\r\n window.removeEventListener('resize', openFirstAccordion);\r\n };\r\n }\r\n }, []);\r\n\r\n const handleClick = (tab: Tab) => {\r\n const firstAccordionIsOpen =\r\n index == 0 &&\r\n document\r\n .querySelector(`${accordionBlockSelector} ${tabHead}`)\r\n .classList.contains(firstAccordionStyle);\r\n\r\n if (firstAccordionIsOpen) {\r\n closeFirstAccordion();\r\n } else {\r\n setIsOpened(!isOpened);\r\n }\r\n\r\n if (onClick) onClick(tab);\r\n };\r\n\r\n // To open 1st accordion(related tabs) by default for screens < 800 px\r\n const openFirstAccordion = () => {\r\n const accordionHead = document.querySelector(`${accordionBlockSelector} ${tabHead}`);\r\n const accordionBody = document.querySelector(`${accordionBlockSelector} ${tabBody}`);\r\n if (window.innerWidth < 800 && accordionHead && accordionBody) {\r\n accordionHead.classList.add(firstAccordionStyle);\r\n accordionBody.classList.add(firstAccordionStyle);\r\n }\r\n };\r\n\r\n // To close 1st accordion(related tabs) conditionally for screens < 800 px as state is common for all accordions\r\n const closeFirstAccordion = () => {\r\n const accordionHead = document.querySelector(`${accordionBlockSelector} ${tabHead}`);\r\n const accordionBody = document.querySelector(`${accordionBlockSelector} ${tabBody}`);\r\n if (window.innerWidth < 800 && accordionHead && accordionBody) {\r\n accordionHead.classList.remove(firstAccordionStyle);\r\n accordionBody.classList.remove(firstAccordionStyle);\r\n setIsOpened(false);\r\n }\r\n };\r\n\r\n const itemheading = !(className || isMobile) ? 'c-accordion-tabs-is-open' : '';\r\n\r\n return (\r\n <div className='c-accordion-tabs-wrapper'>\r\n <div\r\n onClick={() => handleClick(tab)}\r\n className={classNames(\r\n `c-accordion-tabs-head ${className}`,\r\n `c-tabs-${tab.id}`,\r\n itemheading || '',\r\n isOpened ? 'c-accordion-tabs-is-open' : '',\r\n isLight ? 'c-accordion-tabs-head-light' : ''\r\n )}\r\n >\r\n <div className='c-accordion-tabs-head-container is-bound'>\r\n {hasIcon && (\r\n <div\r\n className='c-accordion-tabs-head-title-icon'\r\n style={{ background: `url(${iconUrl}) no-repeat` }}\r\n />\r\n )}\r\n <h4 className='c-accordion-tabs-head-title'>\r\n {url !== null ? (\r\n <a href={url}>\r\n <span onClick={(event) => event.stopPropagation()}>{tab.name}</span>\r\n </a>\r\n ) : (\r\n tab.name\r\n )}\r\n </h4>\r\n {(!!className || isMobile) && (\r\n <i className='c-accordion-tabs-chevron-down c-accordion-tabs-head-icon' />\r\n )}\r\n </div>\r\n </div>\r\n <div\r\n className={`c-accordion-tabs-body ${itemheading} ${\r\n isOpened ? 'c-accordion-tabs-is-open' : ''\r\n }`}\r\n >\r\n {children}\r\n </div>\r\n </div>\r\n );\r\n};\r\n\r\nexport { Container, Section };\r\n","import {Section, Container} from \"./Accordion\";\r\n\r\nexport const Accordion = {Section, Container};\r\n","import { createElement, ReactNode, MouseEvent } from 'react';\r\nimport classNames from 'classnames';\r\n\r\nexport interface ButtonProps extends React.HTMLAttributes<HTMLButtonElement | HTMLAnchorElement> {\r\n text: string;\r\n className?: string;\r\n type?: 'button' | 'submit' | 'reset';\r\n onClick?: (e: MouseEvent<HTMLButtonElement>) => void;\r\n href?: string;\r\n size?: 'xs' | 'small' | 'medium' | 'large';\r\n disabled?: boolean;\r\n color?: 'grey' | 'default' | 'primary' | 'cta';\r\n border?: boolean;\r\n children?: ReactNode;\r\n}\r\n\r\nexport const Button = ({\r\n text,\r\n className = '',\r\n onClick = () => {},\r\n href,\r\n size = 'medium',\r\n disabled = false,\r\n color = 'default',\r\n border = false,\r\n children,\r\n type,\r\n ...props\r\n}: ButtonProps) => {\r\n const tag = href ? 'a' : 'button';\r\n\r\n return createElement(\r\n tag,\r\n {\r\n onClick,\r\n className:\r\n classNames('c-button', {\r\n 'is-xs': size === 'xs',\r\n 'is-small': size === 'small',\r\n 'is-medium': size === 'medium',\r\n 'is-large': size === 'large',\r\n 'is-disabled': !!disabled,\r\n 'is-grey': color === 'grey',\r\n 'is-default': color === 'default',\r\n 'is-primary': color === 'primary',\r\n 'is-cta': color === 'cta',\r\n 'is-border': !!border,\r\n }) +\r\n ' ' +\r\n className,\r\n href,\r\n ...(tag === 'a' && { target: '_blank' }),\r\n type,\r\n ...props,\r\n },\r\n [text, children]\r\n );\r\n};\r\n","import React from 'react';\r\nimport { Delete } from '@icons/common';\r\nimport { RadioButton } from '@components/RadioButton';\r\nimport classNames from 'classnames';\r\nimport './QuoteItem.scss';\r\n\r\ninterface QuoteItemProps {\r\n itemImage: string;\r\n itemName: string;\r\n itemDescription?: string;\r\n buttonType: string;\r\n className?: string;\r\n onSelect?: (itemName: string) => void;\r\n onButtonClick?: (itemName: string) => void;\r\n}\r\n\r\nexport const QuoteItem = ({\r\n itemImage,\r\n itemName,\r\n itemDescription,\r\n buttonType,\r\n className,\r\n onSelect,\r\n onButtonClick = () => {},\r\n}: QuoteItemProps) => {\r\n const renderButtonComponent = () => {\r\n switch (buttonType) {\r\n case 'delete':\r\n return <Delete />;\r\n case 'radio':\r\n return <RadioButton id='quote_radio' name='quote_item' />;\r\n default:\r\n return null;\r\n }\r\n };\r\n\r\n return (\r\n <label\r\n className={classNames(`quote-item ${className}`)}\r\n onClick={() => onSelect && onSelect(itemName)}\r\n >\r\n <div className='quote-image-container'>\r\n <img loading='lazy' src={itemImage} alt={itemName} />\r\n </div>\r\n\r\n <div className='quote-item-text'>\r\n <div className='title'>{itemName}</div>\r\n {itemDescription && <p className='description'>{itemDescription}</p>}\r\n </div>\r\n <div className='quote-item-button' onClick={() => onButtonClick(itemName)}>\r\n {renderButtonComponent()}\r\n </div>\r\n </label>\r\n );\r\n};\r\n","import React, { forwardRef } from 'react';\r\nimport classNames from 'classnames';\r\n\r\ninterface RadioButtonProps {\r\n title?: string;\r\n id: string;\r\n name: string;\r\n onChange?: (event: React.ChangeEvent<HTMLInputElement>) => void;\r\n checked?: boolean;\r\n value?: string;\r\n}\r\n\r\nexport const RadioButton = forwardRef<HTMLInputElement, RadioButtonProps>(\r\n ({ title, id, name, onChange, checked = false, value, ...props }, ref) => {\r\n return (\r\n <div className='c-radio-button'>\r\n <label className='c-radio-button-container'>\r\n <input\r\n ref={ref}\r\n type='radio'\r\n onChange={onChange}\r\n className='checkmark'\r\n name={name}\r\n value={value || title}\r\n id={id}\r\n defaultChecked={checked}\r\n {...props}\r\n />\r\n {title}\r\n </label>\r\n </div>\r\n );\r\n }\r\n);\r\n","export const disableScroll = () => {\r\n document.body.classList.add(\"no-scroll\");\r\n};\r\n\r\nexport const enableScroll = () => {\r\n document.body.classList.remove(\"no-scroll\");\r\n};\r\n","import dataLayer from '@helpers/dataLayer';\r\n\r\nexport const quoteClickHelper = (contactUsForm: { I18: Record<string, string> }, redirect?: () => void) => {\r\n localStorage.setItem('CategoryID', contactUsForm.I18.CategoryID);\r\n // quoteOriginPageID is used as parent page id in contact-us/enquiry type form\r\n localStorage.setItem('quoteOriginPageID', window.pageId);\r\n localStorage.setItem('quoteOriginPageUrl', window.location.href);\r\n\r\n dataLayer.push('contact_button', {\r\n contact_type: contactUsForm?.I18?.RequestForQuote || '',\r\n });\r\n\r\n if (redirect) {\r\n redirect();\r\n } else {\r\n window.location.href = contactUsForm?.I18?.EnquiryTypeLink;\r\n }\r\n};\r\n","import { useEffect } from \"react\";\r\n\r\nexport const useOutsideClick = (\r\n ref: React.RefObject<any>,\r\n handler: Function\r\n) => {\r\n return useEffect(() => {\r\n const handleClick = (e: any) => {\r\n if (ref.current && !ref.current.contains(e.target)) {\r\n handler(e);\r\n }\r\n };\r\n\r\n document.addEventListener(\"mousedown\", handleClick);\r\n document.addEventListener(\"touchstart\", handleClick);\r\n\r\n return () => {\r\n document.removeEventListener(\"mousedown\", handleClick);\r\n document.removeEventListener(\"touchstart\", handleClick);\r\n };\r\n }, [ref, handler]);\r\n};\r\n","export const PageTypes = {\r\n PageIndustry: 'PageIndustry',\r\n PageProductConstruction: 'PageProductConstruction',\r\n PageProductLine: 'PageProductLine',\r\n};\r\n\r\nexport enum RelatedTabsTypes {\r\n RelatedProducts = 'RelatedProducts',\r\n RelatedProductModel = 'RelatedProductModel',\r\n RelatedIndustries = 'RelatedIndustries',\r\n RelatedServices = 'RelatedServices',\r\n RelatedDocuments = 'Documents',\r\n}\r\n\r\nexport const types = {\r\n ALL: 'ALL',\r\n};\r\n\r\nexport type RelatedItemTag = {\r\n id: number | string;\r\n name: string;\r\n};\r\n\r\nexport type RelatedItem = {\r\n Title: string;\r\n Summary?: string;\r\n PageUrl?: string;\r\n ImageUrl: string;\r\n ImageAlt: string;\r\n USPList?: any[]; // Assuming USPList can be an array of any type\r\n Tags?: RelatedItemTag[];\r\n Meta?: any;\r\n};\r\n\r\nexport type RelatedDocumentItem = RelatedItem & {\r\n FileName: string;\r\n Description: string;\r\n FileSize: string;\r\n FileCategory: string;\r\n MimeType: string;\r\n Url: string;\r\n Tags: RelatedItemTag;\r\n};\r\n\r\nexport type RelatedContent = {\r\n id?: string;\r\n Items: RelatedItem[] | null;\r\n Name: string;\r\n RenderedServiceContentArea: string | null;\r\n HideRelatedTabs: boolean;\r\n StandardPages: RelatedItem[] | null;\r\n};\r\n\r\nexport type RelatedServices = RelatedContent & {\r\n HideServiceList?: boolean;\r\n};\r\n\r\nexport type RelatedDocuments = RelatedContent & {\r\n id: 'Documents';\r\n Items: RelatedDocumentItem[] | null;\r\n CustomDocumentTabText: string;\r\n CustomDocumentTabContentArea: string;\r\n};\r\n\r\nexport type ProductModelTopic = {\r\n Name: string;\r\n Content: string;\r\n Order: number;\r\n};\r\n\r\nexport type ProductModelImages = {\r\n ImageAltText: string;\r\n IsMain: boolean;\r\n Order: number;\r\n Thumbnail: string;\r\n WebpLarge: string;\r\n WebpMedium: string;\r\n};\r\n\r\nexport type ProductModelItem = {\r\n Images: ProductModelImages[];\r\n LanguageCode: string;\r\n ProductConstructionPageId: string;\r\n ProductLinePageId: string;\r\n ProductModelId: string;\r\n ProductName: string;\r\n ProductModelDisplayName: string;\r\n ProductDescription?: string;\r\n Topics: ProductModelTopic[];\r\n};\r\n\r\nexport type RelatedProductModelItem = RelatedItem & {\r\n ProductId: string;\r\n ProductDescription: string;\r\n ProductTitle: string;\r\n ProductImageUrl: string;\r\n ProductImageAlt: string;\r\n TechnicalDataViewModels?: ProductModelItem[];\r\n};\r\n\r\nexport interface RelatedProductModel extends RelatedContent {\r\n Items: RelatedProductModelItem[];\r\n}\r\n\r\nexport type RelatedTabs = {\r\n MyProperty: number;\r\n RelatedProducts: RelatedContent | null;\r\n RelatedProductModel: RelatedProductModel | null;\r\n RelatedIndustries: RelatedContent | null;\r\n RelatedServices: RelatedServices | null;\r\n Documents: RelatedContent | null;\r\n I18n: Record<string, string>;\r\n Tags: RelatedItemTag[] | null;\r\n OtherTabLocalizedName: string;\r\n};\r\n\r\nexport const isRelatedDocuments = (\r\n tab: RelatedContent | RelatedDocuments\r\n): tab is RelatedDocuments => {\r\n return tab.id === 'Documents';\r\n};\r\n","import React, { useState } from 'react';\r\nimport { manipulateNodes } from '@helpers/jqueryHelpers';\r\nimport { RelatedItemTag } from '@layouts/Related/Related.types';\r\n\r\ninterface RelatedFilterProps {\r\n onTagClick: (tag: RelatedItemTag) => void;\r\n contentType: string;\r\n tags: RelatedItemTag[];\r\n isBound: boolean;\r\n i18n: Record<string, string>;\r\n className: string;\r\n}\r\n\r\nexport const RelatedFilter = ({\r\n onTagClick = () => {},\r\n contentType,\r\n tags = [],\r\n isBound,\r\n i18n,\r\n className,\r\n}: RelatedFilterProps) => {\r\n const [selectedTag, setSelectedTag] = useState<RelatedItemTag>({ id: 0, name: 'All' });\r\n\r\n const onTagClickHandler = (tag: RelatedItemTag) => {\r\n manipulateNodes(`.related-block-${contentType}`, (node) => node.classList.add('hidden'));\r\n\r\n setSelectedTag(tag);\r\n onTagClick(tag);\r\n };\r\n\r\n const renderTag = (tag: RelatedItemTag) => {\r\n const isActive = tag.id === selectedTag.id ? 'c-filter-block-tag-is-active' : '';\r\n\r\n return (\r\n <span\r\n key={tag.id}\r\n onClick={() => onTagClickHandler(tag)}\r\n className={`c-filter-block-tag ${isActive}`}\r\n >\r\n {tag.name}\r\n </span>\r\n );\r\n };\r\n\r\n return tags.length > 0 ? (\r\n <div className={`c-filter-block ${className}`}>\r\n <div className={isBound ? 'is-bound' : ''}>\r\n {renderTag({ id: 0, name: i18n.All })}\r\n {tags.map(renderTag)}\r\n </div>\r\n </div>\r\n ) : null;\r\n};\r\n","import React, { useState } from 'react';\r\nimport { RelatedItem as RelatedItemType } from '../../Related.types';\r\n\r\ninterface RelatedItemProps {\r\n item: RelatedItemType;\r\n onClick?: (item: RelatedItemType) => void;\r\n className: string;\r\n}\r\n\r\nexport const RelatedItem = ({ item, onClick, className }: RelatedItemProps) => {\r\n const [bulletsVisible, setBulletsVisible] = useState(false);\r\n\r\n const toggleBullets = () => {\r\n setBulletsVisible(!bulletsVisible);\r\n };\r\n\r\n return (\r\n <>\r\n <div\r\n onClick={() => {\r\n onClick(item);\r\n }}\r\n className={`c-related-card ${className}`}\r\n >\r\n <a href={item.PageUrl}>\r\n <div className='c-related-card-container'>\r\n <div\r\n className='c-related-card-image'\r\n style={{\r\n backgroundSize: 'contain',\r\n backgroundRepeat: 'no-repeat',\r\n backgroundPosition: '50% 50%',\r\n }}\r\n >\r\n <img\r\n loading='lazy'\r\n src={item.ImageUrl}\r\n alt={item.ImageAlt}\r\n height='360'\r\n width='640'\r\n />\r\n </div>\r\n {item.USPList && bulletsVisible && (\r\n <div className='c-related-card-bullets-container'>\r\n {className === 'is-style-1' && <h4>{item.Title}</h4>}\r\n <div className='c-related-card-bullets-container-list'>\r\n <ul>\r\n {item.USPList.map((item, index) => (\r\n <li key={index}>{item}</li>\r\n ))}\r\n </ul>\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n <div className='c-related-card-text'>\r\n <h4>{item.Title}</h4>\r\n {item.Summary && <p>{item.Summary}</p>}\r\n </div>\r\n </a>\r\n {className === 'is-style-1' && item?.USPList?.length > 0 && (\r\n <div className='c-related-card-more-btn' onClick={toggleBullets}>\r\n <i className='icon-ellipsis-v' />\r\n </div>\r\n )}\r\n </div>\r\n </>\r\n );\r\n};\r\n","import { RelatedItemTag, RelatedItem as RelatedItemType } from '@layouts/Related/Related.types';\r\nimport React, { useState, useEffect, useMemo } from 'react';\r\nimport { RelatedItem } from './RelatedItem';\r\n\r\n// Id used for showing all items\r\nconst offset = 4;\r\nconst defaultOffset = 4;\r\nconst perRow = 4;\r\n\r\ninterface RelatedListProps {\r\n filterTag?: RelatedItemTag;\r\n items?: RelatedItemType[];\r\n onRelatedItemClick?: (item: RelatedItemType) => void;\r\n styleType: string;\r\n i18n: Record<string, string>;\r\n}\r\n\r\nexport const RelatedList = ({\r\n filterTag = { id: 0, name: 'All' },\r\n onRelatedItemClick,\r\n items = [],\r\n styleType,\r\n i18n,\r\n}: RelatedListProps) => {\r\n const [maxItemsVisible, setMaxItemsVisible] = useState(defaultOffset);\r\n\r\n const filteredList = useMemo(() => {\r\n if (filterTag.id === 0) {\r\n return items || [];\r\n }\r\n\r\n return items.filter((item) => {\r\n if (!item.Tags) return false;\r\n\r\n const itemTags = item.Tags.map(tag => tag?.id) || [];\r\n return itemTags?.includes(filterTag.id);\r\n });\r\n }, [filterTag.id]);\r\n \r\n useEffect(() => {\r\n setMaxItemsVisible(defaultOffset);\r\n }, [filterTag.id]);\r\n\r\n const showMore = () => {\r\n setMaxItemsVisible((value) => value + offset);\r\n };\r\n\r\n return filteredList.length > 0 ? (\r\n <div className='is-bound'>\r\n <div className='l-products-list-container'>\r\n <div className='l-products-list'>\r\n {filteredList\r\n .filter((_item, index) => index < maxItemsVisible)\r\n .map((item, index) => {\r\n return (\r\n <div\r\n key={index}\r\n className={`l-products-list-item ${perRow ? `is-${perRow}` : ''}`}\r\n >\r\n <RelatedItem onClick={onRelatedItemClick} className={styleType} item={item} />\r\n </div>\r\n );\r\n })}\r\n </div>\r\n </div>\r\n {maxItemsVisible < filteredList.length && (\r\n <div className='l-show-more-btn'>\r\n <button className='c-button is-primary is-medium is-upper-case' onClick={showMore}>\r\n {i18n.ShowMore || 'Show more'}\r\n </button>\r\n </div>\r\n )}\r\n </div>\r\n ) : null;\r\n};\r\n","export const mathCal = (n: number, multiply: number) => {\r\n const FloatVal: string = multiply.toFixed(1);\r\n\r\n if (n > 0) return Math.ceil(n / Number(FloatVal)) * multiply;\r\n else if (n < 0) return Math.floor(n / Number(FloatVal)) * multiply;\r\n else return multiply;\r\n};\r\n\r\nexport const clampNumber = (number: number, min: number, max: number) => {\r\n return Math.min(Math.max(number, min), max);\r\n};\r\n\r\nexport const sortAsc = (a, b) => {\r\n if (!a?.name || !b?.name) return 0;\r\n if (a?.name < b?.name) return -1;\r\n if (a?.name > b?.name) return 1;\r\n return 0;\r\n};\r\n","import React, { useState, useMemo } from 'react';\r\nimport { RelatedItem, RelatedList, RelatedFilter } from '../common';\r\nimport { sortAsc } from '@helpers/numHelpers';\r\nimport { RelatedItem as RelatedItemType, RelatedItemTag } from '@layouts/Related/Related.types';\r\n\r\ninterface RelatedContainerProps {\r\n styleType: string;\r\n content: RelatedItemType[];\r\n blockContent?: string;\r\n I18n: Record<string, string>;\r\n contentType: string;\r\n}\r\n\r\nexport const RelatedContainer = ({\r\n styleType,\r\n content,\r\n blockContent,\r\n I18n,\r\n contentType,\r\n}: RelatedContainerProps) => {\r\n const [filterTag, setFilterTag] = useState<RelatedItemTag>({ id: 0, name: 'All' });\r\n\r\n const updateFilterTag = (aFilterTag: RelatedItemTag) => {\r\n if (filterTag.id != aFilterTag.id) {\r\n setFilterTag(aFilterTag);\r\n }\r\n };\r\n\r\n const tags = useMemo(() => {\r\n let filters: RelatedItemTag[] = [];\r\n let tags: RelatedItemType[] = [];\r\n\r\n if (content) {\r\n tags = content.filter((item) => item.Tags);\r\n }\r\n \r\n /* Iterate all tags */\r\n tags.forEach(function (items) {\r\n items.Tags?.forEach(function (item) {\r\n item && filters.push(item);\r\n });\r\n });\r\n \r\n \r\n if (filters.length > 0) {\r\n const stringFilters = filters.map((item) => JSON.stringify(item));\r\n const uniqueStringFilters = new Set(stringFilters);\r\n filters = [];\r\n uniqueStringFilters.forEach((item) => filters.push(JSON.parse(item)));\r\n filters.sort(sortAsc);\r\n }\r\n return filters;\r\n }, [content]);\r\n\r\n return !(content || blockContent) ? null : (\r\n <div className='l-section l-section-100'>\r\n {blockContent && (\r\n <div className='l-page' dangerouslySetInnerHTML={{ __html: blockContent }} />\r\n )}\r\n\r\n <RelatedFilter\r\n tags={tags}\r\n i18n={I18n}\r\n isBound={true}\r\n className={'is-related'}\r\n onTagClick={updateFilterTag}\r\n contentType={contentType}\r\n />\r\n\r\n <RelatedList styleType={styleType} items={content} i18n={I18n} filterTag={filterTag} />\r\n </div>\r\n );\r\n};\r\n","import React, { useState, useEffect } from 'react';\r\nimport { DocumentSectionSlider } from '@layouts/utils/DocumentSectionSlider';\r\nimport { manipulateNodes } from '@helpers/jqueryHelpers';\r\nimport { RelatedItemTag } from '@layouts/Related/Related.types';\r\nimport './RelatedDocFilter.scss';\r\n\r\ninterface RelatedDocFilterProps {\r\n onTagClick: (tag: RelatedItemTag) => void;\r\n i18n: Record<string, string>;\r\n tags: RelatedItemTag[];\r\n isBound: boolean;\r\n}\r\n\r\nexport const RelatedDocFilter = ({\r\n onTagClick = () => {},\r\n i18n,\r\n tags = [],\r\n isBound,\r\n}: RelatedDocFilterProps) => {\r\n const [selectedTag, setSelectedTag] = useState<RelatedItemTag>({ id: 0, name: 'All' });\r\n\r\n useEffect(() => {\r\n DocumentSectionSlider.init();\r\n }, []);\r\n\r\n const handleTagClick = (tag: RelatedItemTag) => {\r\n manipulateNodes('.related-document-block', (node) => node.classList.add('hidden'));\r\n setSelectedTag(tag);\r\n onTagClick(tag);\r\n };\r\n\r\n const renderTag = (tag: RelatedItemTag) => {\r\n return (\r\n <li\r\n key={tag.id}\r\n onClick={() => handleTagClick(tag)}\r\n className='c-document-section-list-item swiper-slide'\r\n >\r\n <a className={tag.id == selectedTag.id ? 'selected' : ''}>{tag.name}</a>\r\n </li>\r\n );\r\n };\r\n\r\n return tags.length > 0 ? (\r\n <div className={`c-document-section ${isBound ? 'is-bound' : ''}`}>\r\n <div className='c-document-section-swiper swiper-container'>\r\n <ul className='c-document-section-list swiper-wrapper'>\r\n {renderTag({ id: 0, name: i18n.All })}\r\n {tags.map(renderTag)}\r\n </ul>\r\n </div>\r\n <div className='c-document-section-button is-next is-hidden' />\r\n <div className='c-document-section-button is-prev is-hidden' />\r\n </div>\r\n ) : null;\r\n};\r\n","import React, { useState, useEffect, useMemo } from 'react';\r\n\r\ninterface DocListShowMoreBtnProps {\r\n selectedTag: boolean;\r\n updateSelectedTag: (val: boolean) => void;\r\n text: string;\r\n listLength: number;\r\n}\r\n\r\nexport const DocListShowMoreBtn = ({\r\n selectedTag,\r\n updateSelectedTag,\r\n text,\r\n listLength,\r\n}: DocListShowMoreBtnProps) => {\r\n const [isVisible, setIsVisible] = useState(0);\r\n const [showMoreClick, setShowMoreClick] = useState(false);\r\n const offset = 8;\r\n const defaultOffset = 4;\r\n\r\n useEffect(() => {\r\n if (selectedTag) {\r\n setIsVisible(0);\r\n setShowMoreClick(false);\r\n }\r\n }, [selectedTag]);\r\n\r\n const handleShowMore = () => {\r\n const offsetNew = isVisible + offset;\r\n const blocks = document.querySelectorAll(\r\n '[data-related-block=\"documentlist' + offsetNew + '\"]'\r\n );\r\n blocks?.forEach((element) => {\r\n element.classList.remove('hidden');\r\n });\r\n setIsVisible((oldVal) => oldVal + offset);\r\n\r\n if (selectedTag) updateSelectedTag(false);\r\n setShowMoreClick(true);\r\n };\r\n\r\n const canShowMore = useMemo(() => {\r\n let show = false;\r\n if (defaultOffset < listLength) {\r\n if (showMoreClick) {\r\n if (offset < listLength && (isVisible == 0 || isVisible + defaultOffset < listLength))\r\n show = true;\r\n } else if (isVisible == 0 || isVisible + defaultOffset < listLength) {\r\n show = true;\r\n }\r\n }\r\n return show;\r\n }, [isVisible, listLength]);\r\n\r\n return canShowMore ? (\r\n <div className='l-show-more-btn'>\r\n <button className='c-button is-primary is-medium is-upper-case' onClick={handleShowMore}>\r\n {text}\r\n </button>\r\n </div>\r\n ) : null;\r\n};\r\n","import React, { useMemo, ReactNode } from 'react';\r\nimport { mathCal } from '@helpers/numHelpers';\r\nimport { RelatedDocumentItem } from '@layouts/Related/Related.types';\r\n\r\nexport const useItemsToRender = ({\r\n renderItem,\r\n filteredList,\r\n}: {\r\n renderItem: (item: RelatedDocumentItem) => ReactNode;\r\n filteredList: RelatedDocumentItem[];\r\n}) => {\r\n const offset = 8;\r\n const defaultOffset = 4;\r\n\r\n const items = useMemo(() => {\r\n let itemsToRender: ReactNode[] = [];\r\n\r\n if (!filteredList) return null;\r\n\r\n if (filteredList.length < defaultOffset) {\r\n itemsToRender = filteredList.map((item) => <div key={item.Url}>{renderItem(item)}</div>);\r\n } else {\r\n let lastValue = 0;\r\n const defaultList = filteredList.slice(0, defaultOffset);\r\n itemsToRender = defaultList.map((item) => <div key={item.Url}>{renderItem(item)}</div>);\r\n const total = filteredList.length;\r\n const nextList = filteredList.slice(defaultOffset, total);\r\n const roundedTotal = mathCal(nextList.length, offset);\r\n\r\n for (let i = 1; i <= roundedTotal; i++) {\r\n if (i % offset == 0) {\r\n const listIterationObj = nextList ? nextList.slice(lastValue, i) : null;\r\n if (listIterationObj) {\r\n listIterationObj.map((item, index) => {\r\n const Data = (\r\n <div\r\n key={`${index}_${i}`}\r\n className={`hidden related-document-block`}\r\n id={`${index}related-document-block${i}`}\r\n data-related-block={'documentlist' + i}\r\n >\r\n {renderItem(item)}\r\n </div>\r\n );\r\n itemsToRender.push(Data);\r\n return itemsToRender;\r\n });\r\n }\r\n\r\n lastValue = i;\r\n }\r\n }\r\n }\r\n return itemsToRender;\r\n }, [renderItem, filteredList]);\r\n return items;\r\n};\r\n","import { RelatedDocumentItem } from '@layouts/Related/Related.types';\r\nimport React from 'react';\r\n\r\ninterface ThumbnailProps {\r\n item: RelatedDocumentItem;\r\n}\r\n\r\nexport const Thumbnail = ({ item }: ThumbnailProps) => {\r\n let iconClass = 'icon-file-empty';\r\n if (item && item.FileCategory && item.FileCategory === 'bimobject') {\r\n iconClass = 'icon-link-ext';\r\n } else if (item && item.MimeType) {\r\n const mimeType = item.MimeType.toLowerCase();\r\n switch (true) {\r\n case mimeType === 'pdf':\r\n iconClass = 'icon-pdf';\r\n break;\r\n case mimeType === 'xlsx' || mimeType === 'xls':\r\n iconClass = 'icon-file-excel';\r\n break;\r\n case mimeType === 'docx' || mimeType === 'doc':\r\n iconClass = 'icon-file-word';\r\n break;\r\n case mimeType === 'pptx' || mimeType === 'ppt':\r\n iconClass = 'icon-file-ppt';\r\n break;\r\n case mimeType === 'zip' || mimeType === 'tar' || mimeType === '7z':\r\n iconClass = 'icon-file-archive';\r\n break;\r\n default:\r\n iconClass = 'icon-file-empty';\r\n }\r\n }\r\n\r\n return (\r\n <div className='c-document-list-item-thumbnail'>\r\n <i\r\n className={`c-document-list-item-thumbnail svg-icon pr-8 ${iconClass} icon-related-document`}\r\n />\r\n </div>\r\n );\r\n};\r\n","import React from 'react';\r\nimport dataLayer from '@helpers/dataLayer';\r\nimport { RelatedDocumentItem } from '@layouts/Related/Related.types';\r\nimport { Thumbnail } from './Thumbnail';\r\nimport { getURLFileData } from '@helpers/URLHelpers';\r\n\r\ninterface RelatedDocItemProps {\r\n item: RelatedDocumentItem;\r\n}\r\n\r\nexport const RelatedDocItem = ({ item }: RelatedDocItemProps) => {\r\n const onDownloadItem = () => {\r\n const { fileName } = getURLFileData(item.Url);\r\n dataLayer.push('file_download', {\r\n file_name: fileName,\r\n file_extension: item.MimeType,\r\n file_category: item.FileCategory,\r\n file_context: item.Tags.name,\r\n link_text: item.FileName,\r\n link_url: item.Url,\r\n });\r\n };\r\n\r\n return (\r\n <a\r\n download\r\n onClick={onDownloadItem}\r\n href={item.Url}\r\n className='c-document-list-item is-bound has-line-under'\r\n target='_blank'\r\n rel='noreferrer'\r\n >\r\n <div className='c-document-list-item-icon-container'>\r\n <i className='icon-download'></i>\r\n </div>\r\n <Thumbnail item={item} />\r\n <div className='c-document-list-item-tail'>\r\n <div className='c-document-list-item-tail-container'>\r\n <span className='c-document-list-item-main-text'>{item.FileName}</span>\r\n <span className='c-document-list-item-secondary-text'>\r\n {item.Description} {item.FileSize}\r\n </span>\r\n </div>\r\n </div>\r\n </a>\r\n );\r\n};\r\n","import React, { useEffect, useState } from 'react';\r\nimport { DocListShowMoreBtn } from './DocListShowMoreBtn';\r\nimport { useItemsToRender } from './RelatedDocList.hooks';\r\nimport { RelatedDocItem } from '../RelatedDocItem';\r\nimport { RelatedDocumentItem, RelatedItemTag } from '@layouts/Related/Related.types';\r\n\r\ninterface RelatedDocListProps {\r\n items: RelatedDocumentItem[];\r\n filterTag: RelatedItemTag;\r\n selectedTag: boolean;\r\n updateSelectedTag: (val: boolean) => void;\r\n i18n: Record<string, string>;\r\n renderCustomContent: string;\r\n}\r\n\r\n// Id used for showing all items\r\nconst SHOW_ALL_ID = 0;\r\n\r\nexport const RelatedDocList = ({\r\n items = [],\r\n filterTag,\r\n selectedTag,\r\n updateSelectedTag,\r\n i18n,\r\n renderCustomContent,\r\n}: RelatedDocListProps) => {\r\n const [filteredList, setFilteredList] = useState(items);\r\n const itemsToRender = useItemsToRender({\r\n renderItem: (item: RelatedDocumentItem) => <RelatedDocItem item={item} />,\r\n filteredList,\r\n });\r\n\r\n useEffect(() => {\r\n setFilteredList(getFilteredList(filterTag));\r\n }, [filterTag]);\r\n\r\n const getFilteredList = (filterTag: RelatedItemTag) => {\r\n if (filterTag === null || filterTag.id == SHOW_ALL_ID) {\r\n return items;\r\n }\r\n\r\n return items.filter((item) => {\r\n if (!item.Tags) return false;\r\n\r\n const tagItems = Array.isArray(item.Tags) ? item.Tags : [item.Tags];\r\n\r\n const itemTags = tagItems.map(({ id }) => id);\r\n if (filterTag.id == 'Other') {\r\n return itemTags?.includes(null);\r\n }\r\n return itemTags?.includes(filterTag.id);\r\n });\r\n };\r\n\r\n return (\r\n <>\r\n {itemsToRender}\r\n {filterTag.id == '001' && (\r\n <div dangerouslySetInnerHTML={{ __html: renderCustomContent }}></div>\r\n )}\r\n <DocListShowMoreBtn\r\n selectedTag={selectedTag}\r\n updateSelectedTag={updateSelectedTag}\r\n text={i18n.ShowMore || 'Show more'}\r\n listLength={filteredList.length}\r\n />\r\n </>\r\n );\r\n};\r\n","import React, { useState } from 'react';\r\nimport { RelatedDocFilter } from './components/RelatedDocFilter/RelatedDocFilter';\r\nimport { RelatedDocList } from './components/RelatedDocList';\r\nimport { useRelatedDocFilterItems } from './RelatedDocContainer.hooks';\r\nimport { RelatedItemTag, RelatedDocumentItem } from '@layouts/Related/Related.types';\r\n\r\ninterface RelatedDocContainerProps {\r\n styleType: string;\r\n content: RelatedDocumentItem[];\r\n othersLabel: string;\r\n customTabText: string;\r\n customTabContent: string;\r\n I18n: Record<string, string>;\r\n}\r\n\r\nexport const RelatedDocContainer = ({\r\n styleType,\r\n content,\r\n othersLabel,\r\n customTabText,\r\n customTabContent,\r\n I18n,\r\n}: RelatedDocContainerProps) => {\r\n const [selectedTag, setSelectedTag] = useState(false);\r\n const [filterTag, setFilterTag] = useState<RelatedItemTag>({\r\n id: 0,\r\n name: 'All',\r\n });\r\n const filters = useRelatedDocFilterItems({\r\n content,\r\n othersLabel,\r\n customTabText,\r\n });\r\n\r\n const updateSelectedTag = (val: boolean) => {\r\n setSelectedTag(val);\r\n };\r\n\r\n const updateFilterTag = (newFilterTag: RelatedItemTag) => {\r\n if (filterTag.id != newFilterTag.id) {\r\n setSelectedTag(true);\r\n setFilterTag(newFilterTag);\r\n }\r\n };\r\n\r\n return (\r\n <div className='l-section l-section-100'>\r\n <RelatedDocFilter tags={filters} i18n={I18n} isBound={true} onTagClick={updateFilterTag} />\r\n\r\n <RelatedDocList\r\n renderCustomContent={customTabContent}\r\n items={content}\r\n i18n={I18n}\r\n filterTag={filterTag}\r\n selectedTag={selectedTag}\r\n updateSelectedTag={updateSelectedTag}\r\n />\r\n </div>\r\n );\r\n};\r\n","import { useMemo } from 'react';\r\nimport { sortAsc } from '@helpers/numHelpers';\r\nimport { RelatedItem, RelatedItemTag } from '@layouts/Related/Related.types';\r\n\r\ninterface UseRelatedDocFilterItemsProps {\r\n content: RelatedItem[];\r\n othersLabel: string;\r\n customTabText: string;\r\n}\r\n\r\nexport const useRelatedDocFilterItems = ({\r\n content,\r\n othersLabel,\r\n customTabText,\r\n}: UseRelatedDocFilterItemsProps) => {\r\n const filterItems = useMemo(() => {\r\n let filters: RelatedItemTag[] = [];\r\n let tags: RelatedItem[] = [];\r\n\r\n if (content) {\r\n tags = content.filter((item) => item.Tags);\r\n }\r\n\r\n /* Iterate all tags */\r\n tags.forEach(function (tag) {\r\n if (!tag.Tags) return;\r\n\r\n const docTags = Array.isArray(tag.Tags) ? tag.Tags : [tag.Tags];\r\n docTags?.forEach((item) => {\r\n if (item.id == null || item.name == null) {\r\n filters.push({ id: 'Other', name: othersLabel });\r\n } else {\r\n filters.push(item);\r\n }\r\n });\r\n });\r\n\r\n if (filters.length > 0) {\r\n const stringFilters = filters.map((item) => JSON.stringify(item));\r\n const uniqueStringFilters = new Set(stringFilters);\r\n filters = [];\r\n uniqueStringFilters.forEach((item) => filters.push(JSON.parse(item)));\r\n filters.sort(sortAsc);\r\n const index = filters.findIndex((x) => x.id === 'Other');\r\n filters.push(filters.splice(index, 1)[0]);\r\n }\r\n\r\n if (customTabText != null) {\r\n filters.push({ id: '001', name: customTabText });\r\n }\r\n return filters;\r\n }, [content, customTabText, othersLabel]);\r\n\r\n return filterItems;\r\n};\r\n","import React, { useState, useEffect } from 'react';\r\nimport { RelatedItem, RelatedList, RelatedFilter } from '../common';\r\nimport { sortAsc } from '@helpers/numHelpers';\r\nimport { RelatedItemTag, RelatedItem as RelatedItemType } from '@layouts/Related/Related.types';\r\n\r\ninterface RelatedServiceContainerProps {\r\n content: RelatedItemType[];\r\n blockContent: string;\r\n contentStandard: RelatedItemType[];\r\n styleType: string;\r\n contentType: string;\r\n I18n: Record<string, string>;\r\n hideServiceList: boolean;\r\n}\r\n\r\nexport const RelatedServiceContainer = ({\r\n content,\r\n blockContent,\r\n contentStandard,\r\n styleType,\r\n contentType,\r\n I18n,\r\n hideServiceList,\r\n}: RelatedServiceContainerProps) => {\r\n const [filterTag, setFilterTag] = useState<RelatedItemTag>({ id: 0, name: 'All' });\r\n const [filterTagStandard, setFilterTagStandard] = useState<RelatedItemTag>({\r\n id: 0,\r\n name: 'All',\r\n });\r\n const [filters, setFilters] = useState<RelatedItemTag[]>([]);\r\n const [filtersStandard, setFiltersStandard] = useState<RelatedItemTag[]>([]);\r\n\r\n useEffect(() => {\r\n let initfilters: RelatedItemTag[] = [];\r\n let initfiltersStandard: RelatedItemTag[] = [];\r\n let inittags: RelatedItemType[] = [];\r\n let inittagsStandard: RelatedItemType[] = [];\r\n\r\n if (content) {\r\n inittags = content.filter((item) => item.Tags);\r\n }\r\n\r\n if (contentStandard) {\r\n inittagsStandard = contentStandard.filter((item) => item.Tags);\r\n }\r\n\r\n /* Iterate all tags */\r\n \r\n inittags.forEach(function (items) {\r\n items.Tags?.forEach(function (item) {\r\n initfilters.push(item);\r\n });\r\n });\r\n \r\n inittagsStandard.forEach(function (items) {\r\n items.Tags?.forEach(function (item) {\r\n initfiltersStandard.push(item);\r\n });\r\n });\r\n \r\n\r\n if (initfilters.length > 0) {\r\n const stringFilters = initfilters.map((item) => JSON.stringify(item));\r\n const uniqueStringFilters = new Set(stringFilters);\r\n initfilters = [];\r\n uniqueStringFilters.forEach((item) => initfilters.push(JSON.parse(item)));\r\n initfilters.sort(sortAsc);\r\n setFilters(initfilters);\r\n }\r\n\r\n if (initfiltersStandard.length > 0) {\r\n const stringFiltersStandard = initfiltersStandard.map((item) => JSON.stringify(item));\r\n const uniqueStringFiltersStandard = new Set(stringFiltersStandard);\r\n initfiltersStandard = [];\r\n uniqueStringFiltersStandard.forEach((item) => initfiltersStandard.push(JSON.parse(item)));\r\n initfiltersStandard.sort(sortAsc);\r\n setFiltersStandard(initfiltersStandard);\r\n }\r\n }, []);\r\n\r\n const updateFilterTag = (filterTag: RelatedItemTag) => {\r\n setFilterTag(filterTag);\r\n };\r\n\r\n const updateFilterTagStandard = (filterTagStandard: RelatedItemTag) => {\r\n setFilterTagStandard(filterTagStandard);\r\n };\r\n\r\n return (\r\n <>\r\n {!content && !blockContent ? null : !contentStandard && !blockContent ? null : (\r\n <div className='l-section l-section-100'>\r\n {blockContent && (\r\n <div className='l-page' dangerouslySetInnerHTML={{ __html: blockContent }} />\r\n )}\r\n {!hideServiceList && (\r\n <>\r\n <RelatedFilter\r\n tags={filters}\r\n i18n={I18n}\r\n isBound\r\n className='is-related'\r\n contentType={contentType}\r\n onTagClick={updateFilterTag}\r\n />\r\n <RelatedList\r\n styleType={styleType}\r\n items={content}\r\n i18n={I18n}\r\n filterTag={filterTag}\r\n />\r\n </>\r\n )}\r\n\r\n <RelatedFilter\r\n tags={filtersStandard}\r\n i18n={I18n}\r\n isBound\r\n className='is-related'\r\n contentType={contentType}\r\n onTagClick={updateFilterTagStandard}\r\n />\r\n <RelatedList\r\n styleType={styleType}\r\n items={contentStandard}\r\n i18n={I18n}\r\n filterTag={filterTagStandard}\r\n />\r\n </div>\r\n )}\r\n </>\r\n );\r\n};\r\n","import React, { useEffect } from 'react';\r\nimport classNames from 'classnames';\r\nimport { disableScroll, enableScroll } from '@helpers/noScroll';\r\nimport './Modal.scss';\r\n\r\ninterface ModalProps {\r\n header?: React.ReactNode;\r\n subHeader?: React.ReactNode;\r\n onClose: () => void;\r\n className?: string;\r\n children: React.ReactNode;\r\n isOuterModal?: boolean;\r\n}\r\n\r\nexport const Modal = ({ children, header, subHeader, onClose, className, isOuterModal }: ModalProps) => {\r\n useEffect(() => {\r\n disableScroll();\r\n return () => {\r\n isOuterModal && enableScroll();\r\n };\r\n }, []);\r\n\r\n return (\r\n <>\r\n <div className='modal-overlay' />\r\n <div className={classNames('modal', className)}>\r\n <div className='modal-header'>\r\n <div className='modal-header-main'>{header}</div>\r\n <div className='modal-header__close'>\r\n <i onClick={onClose} className='icon-symbol-close' />\r\n </div>\r\n </div>\r\n {subHeader && <div className='modal-sub-header'>{subHeader}</div>}\r\n <div className='modal-content'>{children}</div>\r\n </div>\r\n </>\r\n );\r\n};\r\n","import React from 'react';\r\nimport { Button } from '@components/Button';\r\nimport classNames from 'classnames';\r\nimport './IconButton.scss';\r\n\r\nexport const IconButton = ({ children, onClick, className }) => {\r\n return (\r\n <Button\r\n text=''\r\n color='default'\r\n size='small'\r\n className={classNames('c-icon-button', className)}\r\n onClick={onClick}\r\n >\r\n {children}\r\n </Button>\r\n );\r\n};\r\n","import React, { useRef, useState, UIEvent } from 'react';\r\nimport { Arrow } from '@icons/common';\r\nimport { IconButton } from '@components/IconButton';\r\nimport classNames from 'classnames';\r\nimport './ScrollableContainer.scss';\r\n\r\ninterface ScrollableContainerProps {\r\n className?: string;\r\n children: React.ReactNode;\r\n}\r\n\r\nexport const ScrollableContainer = ({ children, className }: ScrollableContainerProps) => {\r\n const topicsRef = useRef<HTMLDivElement>(null);\r\n const topicsContainerRef = useRef<HTMLDivElement>(null);\r\n const [visibleScrollBtns, setVisibleScrollBtns] = useState<Array<'left' | 'right'>>(['right']);\r\n\r\n const onClickScrollBtn = (direction: 'left' | 'right') => {\r\n topicsRef.current.scrollBy({\r\n left: direction === 'left' ? -300 : 300,\r\n behavior: 'smooth',\r\n });\r\n };\r\n\r\n const onScrollContent = (e: UIEvent<HTMLDivElement>) => {\r\n const target = e.target as HTMLDivElement;\r\n const { scrollLeft, scrollWidth, clientWidth } = target;\r\n const scrollRight = scrollWidth - scrollLeft - clientWidth;\r\n const newShowBtn = [];\r\n if (scrollRight > 5) {\r\n newShowBtn.push('right');\r\n }\r\n if (scrollLeft > 5) {\r\n newShowBtn.push('left');\r\n }\r\n setVisibleScrollBtns(newShowBtn);\r\n };\r\n\r\n return (\r\n <div\r\n ref={topicsContainerRef}\r\n className={classNames('scrollable-container', className, {\r\n [`scrollable-container--${visibleScrollBtns.sort().join('_')}`]:\r\n visibleScrollBtns.length > 0,\r\n })}\r\n >\r\n {visibleScrollBtns.includes('left') && (\r\n <IconButton\r\n className='scrollable-container__scroll-left'\r\n onClick={() => {\r\n onClickScrollBtn('left');\r\n }}\r\n >\r\n <Arrow rotate={180} />\r\n </IconButton>\r\n )}\r\n {visibleScrollBtns.includes('right') && (\r\n <IconButton\r\n className='scrollable-container__scroll-right'\r\n onClick={() => {\r\n onClickScrollBtn('right');\r\n }}\r\n >\r\n <Arrow rotate={0} />\r\n </IconButton>\r\n )}\r\n <div ref={topicsRef} className='scrollable-container-content' onScroll={onScrollContent}>\r\n {children}\r\n </div>\r\n </div>\r\n );\r\n};\r\n","export const extractTitle = (content: string) => {\r\n const titleRegex = /<h1>(.*?)<\\/h1>/;\r\n const match = content.replace('\\n', ' ').match(titleRegex);\r\n\r\n if (match) {\r\n const parser = new DOMParser();\r\n const title = parser.parseFromString(match[1], 'text/html');\r\n return title.body.textContent || '';\r\n }\r\n\r\n return '';\r\n};\r\n\r\nexport const getIdFromContent = (content: string, index: number) => {\r\n return (\r\n extractTitle(content)\r\n .replace(/[^a-zA-Z]/g, '')\r\n .toLowerCase() + `_${index}`\r\n );\r\n};\r\n","import React from 'react';\r\nimport classNames from 'classnames';\r\nimport { ProductModelTopic } from '@layouts/Related/Related.types';\r\nimport { useSelectedTopic } from './TechnicalDetailsTopics.hooks';\r\nimport { ScrollableContainer } from '@components/ScrollableContainer';\r\nimport { extractTitle, getIdFromContent } from '../../TechnicalDetailsContainer.utils';\r\nimport './TechnicalDetailsTopics.scss';\r\n\r\ninterface TechnicalDetailsTagsProps {\r\n topics: ProductModelTopic[];\r\n contentRef: React.RefObject<HTMLDivElement>;\r\n}\r\n\r\nexport const TechnicalDetailsTopics = ({ topics, contentRef }: TechnicalDetailsTagsProps) => {\r\n const topicIds = topics.map((topic, i) => getIdFromContent(topic.Content, i));\r\n const { selectedTopicId, onTopicClick } = useSelectedTopic(topicIds, contentRef);\r\n\r\n return (\r\n <ScrollableContainer className='technical-details-topics-container'>\r\n <div className='technical-details-topics'>\r\n {topics.map((topic, index) => {\r\n const topicId = getIdFromContent(topic.Content, index);\r\n const topicTitle = extractTitle(topic.Content);\r\n return (\r\n <span\r\n key={index}\r\n id={`topic-${topicId}`}\r\n onClick={() => onTopicClick(topicId)}\r\n className={classNames('technical-details-topics__tag', {\r\n 'technical-details-topics__tag--active': selectedTopicId === topicId,\r\n })}\r\n >\r\n {topicTitle}\r\n </span>\r\n );\r\n })}\r\n </div>\r\n </ScrollableContainer>\r\n );\r\n};\r\n","import { RefObject, useEffect, useState } from 'react';\r\n\r\nexport const useSelectedTopic = (topics: string[], contentRef: RefObject<HTMLDivElement>) => {\r\n const [selectedTopicId, setSelectedTopicId] = useState<string>(topics[0]);\r\n\r\n const onTopicClick = (id: string) => {\r\n const target = document.getElementById(id);\r\n target?.scrollIntoView({\r\n block: 'start',\r\n });\r\n setSelectedTopicId(id);\r\n };\r\n\r\n useEffect(() => {\r\n // scroll toolbar to selected topic\r\n document\r\n .getElementById(`topic-${selectedTopicId}`)\r\n ?.scrollIntoView({ block: 'start', inline: 'center' });\r\n }, [selectedTopicId]);\r\n\r\n useEffect(() => {\r\n if (!contentRef.current) return;\r\n\r\n const headerElements = document.querySelectorAll(topics.map((id) => `#${id} > h1`).join(', '));\r\n const technicalDetailsElements = Array.from(headerElements);\r\n\r\n const selectFirstTopic = (viewportTop: number, viewportHeight: number) => {\r\n const viewportBottom = viewportTop + viewportHeight;\r\n\r\n /* Filters out all the element that are not in viewport */\r\n const visibleElements = technicalDetailsElements.filter((el) => {\r\n const element = el as HTMLElement;\r\n const top = element.offsetTop;\r\n const titleHeight = element.offsetHeight;\r\n const bottom = top + titleHeight;\r\n\r\n /* More then half of the title is visible */\r\n const isVisibleTop = top >= viewportTop - titleHeight / 2;\r\n const isVisibleBottom = bottom <= viewportBottom + titleHeight / 2;\r\n\r\n return isVisibleTop && isVisibleBottom;\r\n });\r\n\r\n const topElementWrapperId = visibleElements[0]?.parentElement?.id;\r\n /* Picks the top element */\r\n if (visibleElements && visibleElements.length && topElementWrapperId) {\r\n setSelectedTopicId(topElementWrapperId);\r\n }\r\n };\r\n\r\n const onScroll = (e: Event) => {\r\n const target = e.target as HTMLDivElement;\r\n const viewportTop = target.scrollTop;\r\n const viewportHeight = target.clientHeight;\r\n\r\n selectFirstTopic(viewportTop, viewportHeight);\r\n };\r\n\r\n selectFirstTopic(contentRef.current.scrollTop, contentRef.current.clientHeight);\r\n\r\n contentRef.current?.addEventListener('scroll', onScroll);\r\n\r\n return () => {\r\n contentRef.current?.removeEventListener('scroll', onScroll);\r\n };\r\n }, [contentRef, topics]);\r\n\r\n return {\r\n selectedTopicId,\r\n onTopicClick,\r\n };\r\n};\r\n","import React, { forwardRef } from 'react';\r\nimport classNames from 'classnames';\r\nimport './Dropdown.scss';\r\n\r\ninterface DropdownProps {\r\n children: React.ReactNode;\r\n className?: string;\r\n}\r\n\r\nexport const Dropdown = forwardRef<HTMLDivElement, DropdownProps>(\r\n ({ children, className }, ref) => {\r\n return (\r\n <div ref={ref} className={classNames('c-dropdown', className)}>\r\n {children}\r\n </div>\r\n );\r\n }\r\n);\r\n","import React from 'react';\r\nimport classNames from 'classnames';\r\nimport './ListItem.scss';\r\n\r\ntype ListItemProps = {\r\n title?: string;\r\n text?: string;\r\n action?: () => void;\r\n active?: boolean;\r\n};\r\n\r\nexport const ListItem = ({ title, text, action, active }: ListItemProps) => {\r\n return (\r\n <div\r\n className={classNames('c-list-item-container', {\r\n 'c-list-item-container--active': active,\r\n })}\r\n onClick={action}\r\n >\r\n <p className='c-list-item-title'>{title}</p>\r\n {text && <p className='c-list-item-text'>{text}</p>}\r\n </div>\r\n );\r\n};\r\n","import React from 'react';\r\nimport { useDropdown } from '@hooks/useDropdown';\r\nimport { Arrow } from '@icons/common';\r\nimport { ListItem } from '@components/ListItem';\r\nimport { ProductModelItem } from '@layouts/Related/Related.types';\r\nimport './ProductSelector.scss';\r\n\r\ninterface ProductSelectorProps {\r\n selectedProduct: string;\r\n onSelectProduct: (product: ProductModelItem) => void;\r\n products: ProductModelItem[];\r\n}\r\n\r\nexport const ProductSelector = ({\r\n selectedProduct,\r\n products,\r\n onSelectProduct,\r\n}: ProductSelectorProps) => {\r\n const { isOpen, DropdownWrapper, onOpen } = useDropdown(\r\n products.map((product) => (\r\n <ListItem\r\n key={product.ProductModelId}\r\n title={product.ProductModelDisplayName}\r\n active={selectedProduct === product.ProductModelDisplayName}\r\n action={() => onSelectProduct(product)}\r\n />\r\n ))\r\n );\r\n\r\n if (!products || products.length < 2) {\r\n return (\r\n <div className='technical-details-title technical-details-title--no-selection'>\r\n <h2>{selectedProduct}</h2>\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <DropdownWrapper>\r\n <div className='technical-details-title' onClick={onOpen}>\r\n <h2>{selectedProduct}</h2>\r\n <Arrow rotate={isOpen ? 90 : 270} />\r\n </div>\r\n </DropdownWrapper>\r\n );\r\n};\r\n","import React, { useState, MouseEvent } from 'react';\r\nimport classNames from 'classnames';\r\nimport { useOutsideClick } from '@hooks/useOutsideClick';\r\nimport { Dropdown } from '@components/Dropdown';\r\n\r\nexport const useDropdown = (content: React.ReactNode) => {\r\n const dropdownContainerRef = React.useRef<HTMLDivElement>(null);\r\n const dropdownRef = React.useRef<HTMLDivElement>(null);\r\n const [isOpen, setIsOpen] = useState(false);\r\n\r\n const handleClick = (e: MouseEvent<HTMLDivElement>) => {\r\n setIsOpen(!isOpen);\r\n };\r\n\r\n useOutsideClick(dropdownContainerRef, () => {\r\n setIsOpen(false);\r\n });\r\n\r\n return {\r\n isOpen,\r\n onOpen: handleClick,\r\n DropdownWrapper: ({ children }: { children: React.ReactNode }) => (\r\n <div\r\n ref={dropdownContainerRef}\r\n className={classNames('c-dropdown-button-container')}\r\n style={{\r\n position: 'relative',\r\n }}\r\n >\r\n {children}\r\n {isOpen && <Dropdown ref={dropdownRef}>{content}</Dropdown>}\r\n </div>\r\n ),\r\n };\r\n};\r\n","import React, { useState } from 'react';\r\nimport {\r\n ProductModelItem,\r\n ProductModelTopic,\r\n RelatedProductModelItem,\r\n} from '../../../Related.types';\r\nimport { Button } from '@components/Button';\r\nimport { Modal } from '@components/Modal';\r\nimport { TechnicalDetailsTopics } from './components/TechnicalDetailsTopics';\r\nimport { ProductSelector } from './components/ProductSelector';\r\nimport { useFetchContactUsFormQuery } from '@pages/ContactUs/ContactUs.service';\r\nimport { QuoteItem } from '@components/QuoteItem';\r\nimport { quoteClickHelper } from '@helpers/quoteClickHelper';\r\nimport { getIdFromContent } from './TechnicalDetailsContainer.utils';\r\nimport './TechnicalDetailsContainer.scss';\r\n\r\ninterface TechnicalDetailsContainerProps {\r\n products: ProductModelItem[];\r\n productLine: RelatedProductModelItem;\r\n defaultSelectedItem: ProductModelItem;\r\n i18n: Record<string, string>;\r\n handleClose: () => void;\r\n}\r\n\r\nexport const TechnicalDetailsContainer = ({\r\n products,\r\n productLine,\r\n defaultSelectedItem,\r\n handleClose,\r\n i18n,\r\n}: TechnicalDetailsContainerProps) => {\r\n const contentRef = React.useRef<HTMLDivElement>(null);\r\n const [selectedItem, setSelectedItem] = useState<ProductModelItem>(defaultSelectedItem);\r\n const [quoteModalOpen, setQuoteModalOpen] = useState<boolean>(false);\r\n const [selectedQuoteItem, setSelectedQuoteItem] = useState<ProductModelItem>(null);\r\n\r\n const { data: contactUsForm } = useFetchContactUsFormQuery();\r\n const requestForQuoteText = contactUsForm?.I18?.RequestForQuote;\r\n\r\n // Logic to remove page breaks. In future we can have more.\r\n const filteredTopics = selectedItem.Topics.filter(\r\n (topic: ProductModelTopic) => topic.Name.toLowerCase() !== 'page break'\r\n );\r\n\r\n const onSelectProduct = (product: ProductModelItem) => {\r\n setSelectedItem(product);\r\n };\r\n\r\n const onSelectQuoteItem = (product: ProductModelItem) => {\r\n setSelectedQuoteItem(product);\r\n };\r\n\r\n const openQuoteModal = () => {\r\n setQuoteModalOpen(true);\r\n };\r\n\r\n const closeQuoteModal = () => {\r\n setQuoteModalOpen(false);\r\n setSelectedQuoteItem(null);\r\n };\r\n\r\n const onRequestAQuote = () => {\r\n quoteClickHelper(contactUsForm, () => {\r\n window.history.scrollRestoration = 'manual';\r\n const isProductLine = selectedQuoteItem.ProductModelId === window.pageId;\r\n const queryParameter = isProductLine ? '?productLine=' : '?productModel=';\r\n const productLinePageId = !isProductLine ? '&productLinePageId=' + window.pageId : '';\r\n\r\n window.history.pushState(\r\n {\r\n product: {\r\n isProductLine,\r\n name: selectedQuoteItem.ProductModelDisplayName,\r\n id: selectedQuoteItem.ProductModelId,\r\n imageSrc: selectedQuoteItem.Images[0]?.Thumbnail,\r\n description: selectedQuoteItem.ProductDescription,\r\n },\r\n },\r\n '',\r\n\r\n contactUsForm.I18.EnquiryTypeLink +\r\n queryParameter +\r\n selectedQuoteItem.ProductModelId +\r\n productLinePageId\r\n );\r\n\r\n window.history.go();\r\n });\r\n };\r\n\r\n return (\r\n <>\r\n <Modal\r\n header={\r\n <div className='modal-header-content'>\r\n <ProductSelector\r\n products={products}\r\n selectedProduct={selectedItem.ProductModelDisplayName}\r\n onSelectProduct={onSelectProduct}\r\n />\r\n <Button\r\n size='small'\r\n color='primary'\r\n text={requestForQuoteText}\r\n onClick={openQuoteModal}\r\n />\r\n </div>\r\n }\r\n subHeader={<TechnicalDetailsTopics topics={filteredTopics} contentRef={contentRef} />}\r\n onClose={handleClose}\r\n className='technical-details-modal'\r\n isOuterModal={true}\r\n >\r\n <div ref={contentRef} className='technical-details-content'>\r\n {filteredTopics.map((topic: ProductModelTopic, index: number) => (\r\n <div\r\n id={getIdFromContent(topic.Content, index)}\r\n key={index}\r\n className={`content-topic ${topic.Name}`}\r\n dangerouslySetInnerHTML={{ __html: topic.Content }}\r\n />\r\n ))}\r\n </div>\r\n </Modal>\r\n\r\n {quoteModalOpen && (\r\n <Modal\r\n header={\r\n <div className='modal-header-content'>\r\n <h3 className='m-0 font-light-xx-lg-lh-150'>{i18n.RequestAQuoteTitle}</h3>\r\n </div>\r\n }\r\n onClose={closeQuoteModal}\r\n className='quote-modal'\r\n >\r\n <div className='quote-items'>\r\n {productLine && (\r\n <QuoteItem\r\n key={productLine.ProductId}\r\n itemImage={productLine.ProductImageUrl}\r\n itemName={productLine.ProductTitle}\r\n buttonType='radio'\r\n className='modal-product'\r\n onSelect={() =>\r\n onSelectQuoteItem({\r\n ProductName: productLine.ProductTitle,\r\n ProductModelDisplayName: productLine.ProductTitle,\r\n ProductModelId: window.pageId,\r\n Images: [\r\n {\r\n ImageAltText: productLine.ProductTitle,\r\n Thumbnail: productLine.ProductImageUrl,\r\n IsMain: true,\r\n Order: 0,\r\n WebpLarge: productLine.ProductImageUrl,\r\n WebpMedium: productLine.ProductImageUrl,\r\n },\r\n ],\r\n Topics: [],\r\n ProductDescription: productLine.ProductDescription,\r\n ProductConstructionPageId: window.pageId,\r\n ProductLinePageId: window.pageId,\r\n LanguageCode: '',\r\n })\r\n }\r\n />\r\n )}\r\n {products.map((product: ProductModelItem) => (\r\n <QuoteItem\r\n key={product.ProductModelDisplayName}\r\n itemImage={product.Images[0]?.Thumbnail}\r\n itemName={product.ProductModelDisplayName}\r\n buttonType='radio'\r\n className='modal-product'\r\n onSelect={() =>\r\n onSelectQuoteItem({\r\n ...product,\r\n ProductDescription: contentRef.current?.querySelector('p')?.textContent,\r\n })\r\n }\r\n />\r\n ))}\r\n </div>\r\n <div className='modal-footer'>\r\n <Button\r\n size='medium'\r\n color='primary'\r\n text={i18n.Next}\r\n onClick={onRequestAQuote}\r\n disabled={!selectedQuoteItem}\r\n />\r\n </div>\r\n </Modal>\r\n )}\r\n </>\r\n );\r\n};\r\n","import React, { useEffect, useState } from 'react';\r\nimport { ProductModelItem, RelatedProductModelItem } from '../../Related.types';\r\nimport { TechnicalDetailsContainer } from './TechnicalDetailsContainer';\r\nimport { RelatedList } from '../common/RelatedList';\r\nimport dataLayer from '@helpers/dataLayer';\r\nimport './RelatedProductModelContainer.scss';\r\n\r\ninterface RelatedProductModelContainerProps {\r\n content: ProductModelItem[];\r\n productLine: RelatedProductModelItem;\r\n I18n: Record<string, string>;\r\n styleType: string;\r\n hideProductModels: boolean;\r\n}\r\n\r\nexport const RelatedProductModelContainer = ({\r\n content,\r\n I18n,\r\n styleType,\r\n productLine,\r\n hideProductModels,\r\n}: RelatedProductModelContainerProps) => {\r\n const [selectedItem, setSelectedItem] = useState<ProductModelItem>(null);\r\n const isTechnicalDetailsOpen = !!selectedItem;\r\n\r\n const closeTechnicalDetails = () => {\r\n setSelectedItem(null);\r\n };\r\n\r\n useEffect(() => {\r\n const searchParams = new URLSearchParams(window.location.search);\r\n const productModel = searchParams.get('model');\r\n\r\n if (productModel) {\r\n const product = content.find((item) => item.ProductModelId === productModel);\r\n setSelectedItem(product);\r\n }\r\n }, []);\r\n\r\n useEffect(() => {\r\n if (selectedItem) {\r\n dataLayer.push('view_item', {\r\n ecommerce: {\r\n items: [\r\n {\r\n item_name: selectedItem?.ProductModelDisplayName,\r\n product_line: productLine ? productLine.ProductTitle : undefined,\r\n },\r\n ],\r\n },\r\n });\r\n }\r\n }, [selectedItem]);\r\n\r\n // TODO: move to service\r\n const productModelMapper = (item: ProductModelItem) => {\r\n return {\r\n Title: item.ProductModelDisplayName,\r\n ImageUrl: item.Images[0]?.Thumbnail,\r\n ImageAlt: item.ProductModelDisplayName,\r\n Meta: item,\r\n };\r\n };\r\n return (\r\n <>\r\n {!hideProductModels && (\r\n <RelatedList\r\n styleType={styleType}\r\n onRelatedItemClick={(item) => {\r\n setSelectedItem(item.Meta);\r\n }}\r\n items={content.map(productModelMapper)}\r\n i18n={I18n}\r\n />\r\n )}\r\n {isTechnicalDetailsOpen && (\r\n <TechnicalDetailsContainer\r\n defaultSelectedItem={selectedItem}\r\n productLine={productLine}\r\n products={content}\r\n i18n={I18n}\r\n handleClose={closeTechnicalDetails}\r\n />\r\n )}\r\n </>\r\n );\r\n};\r\n","import { apiSlice } from '@services/apiSlice';\r\nimport { RelatedTabs as endpoints } from '@services/endpoints';\r\nimport { RelatedTabs } from './Related.types';\r\n\r\nconst requestedUrl = new URLSearchParams(window.location.search);\r\nconst hasQueryString = requestedUrl.get('model');\r\n\r\nconst relatedTabApi = apiSlice.injectEndpoints({\r\n endpoints: (build) => ({\r\n fetchRelatedTabs: build.query<RelatedTabs, void>({\r\n query: () => ({\r\n url: endpoints.fetchRelatedTabs,\r\n params: {\r\n language: window.lang,\r\n pageId: window.pageId,\r\n isProductModelRequested: !!hasQueryString,\r\n },\r\n }),\r\n }),\r\n }),\r\n overrideExisting: false,\r\n});\r\n\r\nexport const { useFetchRelatedTabsQuery } = relatedTabApi;\r\n","import React, { Fragment, useMemo, useState } from 'react';\r\nimport { Accordion } from '@components/Accordion';\r\nimport {\r\n RelatedTabsTypes,\r\n PageTypes,\r\n RelatedContent,\r\n RelatedDocuments,\r\n isRelatedDocuments,\r\n} from './Related.types';\r\nimport {\r\n RelatedContainer,\r\n RelatedDocContainer,\r\n RelatedServiceContainer,\r\n RelatedProductModelContainer,\r\n} from './components';\r\nimport { useFetchRelatedTabsQuery } from './Related.service';\r\nimport './Related.scss';\r\n\r\nconst Related = () => {\r\n const { data: relatedTabs } = useFetchRelatedTabsQuery();\r\n const getTabWithId = (id: string): RelatedContent => {\r\n return {\r\n id,\r\n ...relatedTabs[id],\r\n };\r\n };\r\n\r\n const filteredList = useMemo(() => {\r\n if (!relatedTabs) return [];\r\n\r\n const sortedList: RelatedContent[] = [];\r\n switch (window.pageType) {\r\n case PageTypes.PageIndustry:\r\n case PageTypes.PageProductConstruction: {\r\n if (!relatedTabs.RelatedProducts.HideRelatedTabs) {\r\n sortedList.push(getTabWithId(RelatedTabsTypes.RelatedProducts));\r\n }\r\n\r\n if (!relatedTabs.RelatedIndustries.HideRelatedTabs) {\r\n sortedList.push(getTabWithId(RelatedTabsTypes.RelatedIndustries));\r\n }\r\n\r\n if (!relatedTabs.RelatedServices.HideRelatedTabs) {\r\n sortedList.push(getTabWithId(RelatedTabsTypes.RelatedServices));\r\n }\r\n break;\r\n }\r\n\r\n case PageTypes.PageProductLine: {\r\n sortedList.push(getTabWithId(RelatedTabsTypes.RelatedDocuments));\r\n if (!relatedTabs.RelatedServices.HideRelatedTabs) {\r\n sortedList.push(getTabWithId(RelatedTabsTypes.RelatedServices));\r\n }\r\n\r\n sortedList.push({\r\n ...getTabWithId(RelatedTabsTypes.RelatedProductModel),\r\n /* Name is set to null to avoid accordion render */\r\n Name: relatedTabs.RelatedProductModel.HideRelatedTabs\r\n ? null\r\n : relatedTabs.RelatedProductModel.Name,\r\n });\r\n\r\n if (!relatedTabs.RelatedIndustries.HideRelatedTabs) {\r\n sortedList.push(getTabWithId(RelatedTabsTypes.RelatedIndustries));\r\n }\r\n break;\r\n }\r\n }\r\n return sortedList.filter(\r\n ({ Items, RenderedServiceContentArea }) =>\r\n (Items && Items.length > 0) || RenderedServiceContentArea\r\n );\r\n }, [relatedTabs]);\r\n\r\n const renderContainer = (tab: RelatedContent | RelatedDocuments) => {\r\n let styleType: string;\r\n\r\n switch (tab.id) {\r\n case RelatedTabsTypes.RelatedProducts:\r\n styleType = 'is-style-1';\r\n break;\r\n case RelatedTabsTypes.RelatedProductModel:\r\n styleType = 'is-style-1';\r\n break;\r\n case RelatedTabsTypes.RelatedIndustries:\r\n styleType = 'is-style-2';\r\n break;\r\n case RelatedTabsTypes.RelatedServices:\r\n styleType = 'is-style-3';\r\n break;\r\n default:\r\n styleType = 'is-style-3';\r\n }\r\n if (isRelatedDocuments(tab)) {\r\n return (\r\n <RelatedDocContainer\r\n styleType={styleType}\r\n content={tab.Items}\r\n customTabText={tab.CustomDocumentTabText}\r\n customTabContent={tab.CustomDocumentTabContentArea}\r\n I18n={relatedTabs.I18n}\r\n othersLabel={relatedTabs.OtherTabLocalizedName}\r\n />\r\n );\r\n } else if (tab.id === RelatedTabsTypes.RelatedServices) {\r\n const key = {\r\n '<iframe': '<iframe loading=\"lazy\"',\r\n '<img': '<img loading=\"lazy\"',\r\n };\r\n\r\n return (\r\n <RelatedServiceContainer\r\n styleType={styleType}\r\n content={tab.Items}\r\n contentStandard={tab.StandardPages}\r\n blockContent={tab.RenderedServiceContentArea?.replaceAll(\r\n /(<iframe|<img)/g,\r\n (char: string) => key[char] || ''\r\n )}\r\n I18n={relatedTabs.I18n}\r\n hideServiceList={relatedTabs.RelatedServices.HideServiceList}\r\n contentType={tab.id}\r\n />\r\n );\r\n } else if (tab.id === RelatedTabsTypes.RelatedProductModel) {\r\n return (\r\n <RelatedProductModelContainer\r\n content={relatedTabs.RelatedProductModel.Items.flatMap(\r\n (item) => item.TechnicalDataViewModels\r\n )}\r\n productLine={relatedTabs.RelatedProductModel.Items[0]}\r\n I18n={relatedTabs.I18n}\r\n styleType={styleType}\r\n hideProductModels={relatedTabs.RelatedProductModel.HideRelatedTabs}\r\n />\r\n );\r\n } else {\r\n return (\r\n <RelatedContainer\r\n styleType={styleType}\r\n content={tab.Items}\r\n blockContent={tab.RenderedServiceContentArea}\r\n I18n={relatedTabs.I18n}\r\n contentType={tab.id}\r\n />\r\n );\r\n }\r\n };\r\n\r\n return (\r\n <>\r\n {filteredList.map((tab, key) => {\r\n if (!tab.Name) return renderContainer(tab);\r\n\r\n return (\r\n <Fragment key={key}>\r\n <span id={`Nav-${tab.id}`} />\r\n <div id={tab.id}>\r\n <div className='c-new-related'>\r\n <Accordion.Container className='is-related'>\r\n <Accordion.Section index={key} tab={{ name: tab.Name, id: tab.id }} url={null}>\r\n {renderContainer(tab)}\r\n </Accordion.Section>\r\n </Accordion.Container>\r\n </div>\r\n </div>\r\n </Fragment>\r\n );\r\n })}\r\n </>\r\n );\r\n};\r\n\r\nexport default Related;\r\n","import Related from './Related';\r\nexport default Related;\r\n","import { apiSlice } from '@services/apiSlice';\r\nimport { ContactUs as endpoints } from '@services/endpoints';\r\nimport { FindContactData, ContactUsForm } from './ContactUs.types';\r\n\r\ninterface FindOfficeQueryParams {\r\n countryId?: number;\r\n officeTypeId?: number;\r\n}\r\n\r\ninterface ContactUsFormQueryParams {\r\n countryId?: number;\r\n type?: string;\r\n}\r\n\r\nconst contactUsApi = apiSlice.injectEndpoints({\r\n endpoints: (build) => ({\r\n fetchFindOfficeData: build.query<FindContactData, FindOfficeQueryParams>({\r\n query: ({ countryId, officeTypeId }) => ({\r\n url: endpoints.fetchFindOfficeData,\r\n params: {\r\n lang: window.lang,\r\n countryId: countryId || 2000,\r\n officeTypeId: officeTypeId || 0,\r\n },\r\n }),\r\n }),\r\n fetchContactUsForm: build.query<ContactUsForm, ContactUsFormQueryParams | void>({\r\n query: (params) => ({\r\n url: endpoints.fetchContactUsForm,\r\n params: {\r\n lang: window.lang,\r\n pageId: window.pageId,\r\n type: params ? params.type : 'RequestAQuote',\r\n countryId: params && params.countryId ? params.countryId : 0,\r\n },\r\n }),\r\n }),\r\n }),\r\n overrideExisting: false,\r\n});\r\n\r\nexport const { useFetchContactUsFormQuery, useLazyFetchFindOfficeDataQuery } = contactUsApi;\r\n","export const Breadcrumb = {\r\n fetchBreadcrumb: '/webapi/Breadcrumb/Get',\r\n};\r\n\r\nexport const Footer = {\r\n fetchFooter: '/api/footer',\r\n};\r\n\r\nexport const CountrySelector = {\r\n fetchCountrySelectList: '/webapi/CountrySelector/Get',\r\n};\r\n\r\nexport const RelatedTabs = {\r\n fetchRelatedTabs: '/webapi/RelatedTabs/Get',\r\n relatedTabs: '/webapi/RelatedTabs/GetTabs', // NOT IN USE\r\n};\r\n\r\nexport const Search = {\r\n doSearch: '/webapi/SearchApi/SearchFor',\r\n doSearchAutocomplete: '/webapi/SearchApi/GetAutocomplete',\r\n};\r\n\r\nexport const NewsAndStories = {\r\n fetchNewsAndStoriesData: '/webapi/NewsListingApi/GetNewsListItems',\r\n fetchNews: '/webapi/NewsListingApi/GetNewsList',\r\n fetchStories: '/webapi/StoriesList/Get',\r\n};\r\n\r\nexport const Webinars = {\r\n fetchWebinarBanner: '/webapi/WebinarLandingPage/Get',\r\n fetchWebinarList: '/webapi/WebinarPage/Get',\r\n};\r\n\r\nexport const Header = {\r\n fetchHeader: '/webapi/Header/Get', //NOT IN USE\r\n fetchSubNavigation: '/webapi/SubNavigation/Get',\r\n fetchMegaMenuNavigation: '/api/mainmenu',\r\n fetchGeolocation: '/api/Geolocation',\r\n fetchTopMenu: '/api/TopNavigation/',\r\n fetchMegaMenuColumn: '/webapi/menuitems/columns',\r\n};\r\n\r\nexport const Stories = {\r\n fetchStories: '/webapi/StoriesList/Get',\r\n};\r\n\r\nexport const News = {\r\n fetchNews: '/webapi/NewsListPage/Get',\r\n};\r\n\r\nexport const Vacancies = {\r\n fetchVacancies: '/webapi/Vacancy/Get', // NOT IN USE\r\n};\r\n\r\nexport const Webshop = {\r\n fetchWebshop: '/webapi/WebShop/Get', // NOT IN USE\r\n};\r\n\r\nexport const ContactUs = {\r\n fetchContactUsForm: '/webapi/ContactUsForm/GetForm',\r\n fetchFindOfficeData: '/webapi/CountriesCategories/Get',\r\n fetchEnquiryForm: '/webapi/contactus/getenquiryform',\r\n fetchEnquirySerialLinkData: '/webapi/contactus/GetModalPopUp',\r\n submitEnquiryForm: '/Quote/ProcessForm',\r\n fetchEnquiryApplicationList: '/webapi/contactus/GetIndustryApplication',\r\n};\r\n\r\nexport const InvestorRelations = {\r\n fetchPressReleaseFilterData: '/api/v1/ir/pressrelease',\r\n fetchInvestorRelationsNews: '/api/v1/ir/news',\r\n fetchInvestorRelationsPage: '/api/v1/ir/page2',\r\n fetchInvestorRelationsMenu: '/api/v1/ir/menu2',\r\n makeSubscription: '//publish.ne.cision.com/Subscription/SubscribeWithCaptcha',\r\n};\r\n\r\nexport const CoolCalc = {\r\n getCoolCalc: '/webapi/CoolCalc/Get', // NOT IN USE\r\n shareCoolCalc: '/webapi/CoolCalc/Save',\r\n};\r\n\r\nexport const Hexpert = {\r\n fetchHexpertPage: '/api/v1/hex/page',\r\n getAntiForgeryToken: '/api/v1/hex/GetAntiForgery',\r\n submitHexpertForm: '/EPiServer.Forms/DataSubmit/Submit',\r\n createHexpertPdf: '/api/v1/hex/CreatePdf',\r\n getIsMatchingProducts: '/api/v1/hex/IsMatchingProduct',\r\n getHexpertResult: '/api/v1/hex/GetResult',\r\n mailResult: '/api/v1/hex/SendMail',\r\n};\r\n\r\nexport const SafetyDatasheet = {\r\n fetchSafetyDatasheet: '/webapi/SafetyDataSheet/GetSafetyDataSheetResult',\r\n};\r\n"],"names":["hasOwn","hasOwnProperty","classNames","classes","i","arguments","length","arg","argType","push","Array","isArray","inner","apply","toString","Object","prototype","includes","key","call","join","module","exports","default","define","window","Profile","xmlns","width","height","viewBox","fill","stroke","strokeWidth","strokeLinecap","strokeLinejoin","cx","cy","r","d","IconContainer","icon","className","Facebook","Twitter","x","y","ExternalLink","id","Arrow","rotate","style","transformBox","transformOrigin","transform","Cross","Delete","EmailSvg","PhoneSvg","fillRule","clipRule","Accordion","Section","isOpen","index","onClick","accordionBlockSelector","children","tab","url","iconUrl","isLight","hasIcon","tabHead","tabBody","firstAccordionStyle","isOpened","setIsOpened","useState","isDesktop","isMobile","useEffect","openFirstAccordion","addEventListener","removeEventListener","accordionHead","document","querySelector","accordionBody","innerWidth","classList","add","closeFirstAccordion","remove","itemheading","contains","handleClick","background","href","event","stopPropagation","name","Container","Button","text","size","disabled","color","border","type","props","tag","createElement","target","QuoteItem","itemImage","itemName","itemDescription","buttonType","onSelect","onButtonClick","loading","src","alt","RadioButton","renderButtonComponent","forwardRef","title","onChange","checked","value","ref","defaultChecked","disableScroll","body","enableScroll","quoteClickHelper","contactUsForm","redirect","localStorage","setItem","I18","CategoryID","pageId","location","contact_type","RequestForQuote","EnquiryTypeLink","useOutsideClick","handler","e","current","PageTypes","RelatedTabsTypes","RelatedFilter","onTagClick","contentType","tags","isBound","i18n","selectedTag","setSelectedTag","renderTag","isActive","node","onTagClickHandler","All","map","RelatedItem","item","bulletsVisible","setBulletsVisible","PageUrl","backgroundSize","backgroundRepeat","backgroundPosition","ImageUrl","ImageAlt","USPList","Title","Summary","RelatedList","filterTag","onRelatedItemClick","items","styleType","maxItemsVisible","setMaxItemsVisible","filteredList","useMemo","filter","Tags","_item","ShowMore","sortAsc","a","b","RelatedContainer","content","blockContent","I18n","setFilterTag","filters","forEach","stringFilters","JSON","stringify","uniqueStringFilters","Set","parse","sort","dangerouslySetInnerHTML","__html","aFilterTag","RelatedDocFilter","DocumentSectionSlider","handleTagClick","DocListShowMoreBtn","updateSelectedTag","listLength","isVisible","setIsVisible","showMoreClick","setShowMoreClick","show","offsetNew","querySelectorAll","element","oldVal","useItemsToRender","renderItem","itemsToRender","Url","lastValue","defaultList","slice","total","nextList","roundedTotal","n","multiply","FloatVal","toFixed","Math","ceil","Number","floor","mathCal","listIterationObj","Data","Thumbnail","iconClass","FileCategory","MimeType","mimeType","toLowerCase","RelatedDocItem","download","fileName","dataLayer","file_name","file_extension","file_category","file_context","link_text","FileName","link_url","rel","Description","FileSize","RelatedDocList","renderCustomContent","setFilteredList","getFilteredList","itemTags","RelatedDocContainer","othersLabel","customTabText","customTabContent","findIndex","splice","useRelatedDocFilterItems","newFilterTag","val","RelatedServiceContainer","contentStandard","hideServiceList","filterTagStandard","setFilterTagStandard","setFilters","filtersStandard","setFiltersStandard","initfilters","initfiltersStandard","inittags","inittagsStandard","stringFiltersStandard","uniqueStringFiltersStandard","Modal","header","subHeader","onClose","isOuterModal","IconButton","ScrollableContainer","topicsRef","useRef","topicsContainerRef","visibleScrollBtns","setVisibleScrollBtns","onClickScrollBtn","direction","scrollBy","left","behavior","onScroll","scrollLeft","scrollWidth","clientWidth","newShowBtn","extractTitle","match","replace","DOMParser","parseFromString","textContent","getIdFromContent","TechnicalDetailsTopics","topics","contentRef","topicIds","topic","Content","selectedTopicId","onTopicClick","setSelectedTopicId","getElementById","scrollIntoView","block","inline","headerElements","technicalDetailsElements","from","selectFirstTopic","viewportTop","viewportHeight","viewportBottom","visibleElements","el","top","offsetTop","titleHeight","offsetHeight","topElementWrapperId","parentElement","scrollTop","clientHeight","useSelectedTopic","topicId","topicTitle","Dropdown","ListItem","action","active","ProductSelector","selectedProduct","products","onSelectProduct","DropdownWrapper","onOpen","dropdownContainerRef","dropdownRef","setIsOpen","position","useDropdown","product","ProductModelId","ProductModelDisplayName","TechnicalDetailsContainer","productLine","defaultSelectedItem","handleClose","selectedItem","setSelectedItem","quoteModalOpen","setQuoteModalOpen","selectedQuoteItem","setSelectedQuoteItem","data","requestForQuoteText","filteredTopics","Topics","Name","onSelectQuoteItem","RequestAQuoteTitle","ProductId","ProductImageUrl","ProductTitle","ProductName","Images","ImageAltText","IsMain","Order","WebpLarge","WebpMedium","ProductDescription","ProductConstructionPageId","ProductLinePageId","LanguageCode","Next","history","scrollRestoration","isProductLine","queryParameter","productLinePageId","pushState","imageSrc","description","go","RelatedProductModelContainer","hideProductModels","isTechnicalDetailsOpen","productModel","URLSearchParams","search","get","find","ecommerce","item_name","product_line","undefined","Meta","hasQueryString","relatedTabApi","apiSlice","endpoints","build","fetchRelatedTabs","query","params","language","lang","isProductModelRequested","overrideExisting","useFetchRelatedTabsQuery","relatedTabs","getTabWithId","sortedList","pageType","RelatedProducts","HideRelatedTabs","RelatedIndustries","RelatedServices","RelatedDocuments","RelatedProductModel","Items","RenderedServiceContentArea","renderContainer","isRelatedDocuments","CustomDocumentTabText","CustomDocumentTabContentArea","OtherTabLocalizedName","StandardPages","replaceAll","char","HideServiceList","flatMap","TechnicalDataViewModels","Fragment","contactUsApi","fetchFindOfficeData","countryId","officeTypeId","fetchContactUsForm","useFetchContactUsFormQuery","useLazyFetchFindOfficeDataQuery","Breadcrumb","fetchBreadcrumb","Footer","fetchFooter","CountrySelector","fetchCountrySelectList","RelatedTabs","Search","doSearch","doSearchAutocomplete","NewsAndStories","fetchNewsAndStoriesData","fetchNews","fetchStories","Webinars","fetchWebinarBanner","fetchWebinarList","Header","fetchHeader","fetchSubNavigation","fetchMegaMenuNavigation","fetchGeolocation","fetchTopMenu","fetchMegaMenuColumn","Stories","News","ContactUs","fetchEnquiryForm","fetchEnquirySerialLinkData","submitEnquiryForm","fetchEnquiryApplicationList","InvestorRelations","fetchPressReleaseFilterData","fetchInvestorRelationsNews","fetchInvestorRelationsPage","fetchInvestorRelationsMenu","makeSubscription","CoolCalc","getCoolCalc","shareCoolCalc","Hexpert","fetchHexpertPage","getAntiForgeryToken","submitHexpertForm","createHexpertPdf","getIsMatchingProducts","getHexpertResult","mailResult","SafetyDatasheet","fetchSafetyDatasheet"],"sourceRoot":""}