{"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 \r\n \r\n \r\n \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 \r\n {icon}\r\n \r\n )\r\n};","import React from 'react';\r\n\r\nexport const Facebook = () => (\r\n \r\n \r\n \r\n \r\n);\r\n\r\n\r\n","import React from 'react';\r\n\r\nexport const Twitter = () => (\r\n \r\n \r\n \r\n);","import React from 'react';\r\n\r\nexport const ExternalLink = () => (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n);\r\n","import React from 'react';\r\n\r\nexport const Arrow = ({ stroke = '#10387F', rotate = 0 }) => {\r\n return (\r\n \r\n \r\n \r\n );\r\n};\r\n","import React from 'react';\r\n\r\nexport const Cross = () => (\r\n \r\n \r\n \r\n \r\n);\r\n","import React from 'react';\r\n\r\nexport const Delete = () => (\r\n \r\n \r\n \r\n \r\n \r\n \r\n);\r\n","import React from 'react';\r\n\r\nexport const EmailSvg = () => (\r\n \r\n \r\n \r\n \r\n);\r\n","import React from 'react';\r\n\r\nexport const PhoneSvg = () => (\r\n \r\n \r\n \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
{children}
;\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(!!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
\r\n 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
\r\n {hasIcon && (\r\n \r\n )}\r\n

\r\n {url !== null ? (\r\n \r\n event.stopPropagation()}>{tab.name}\r\n \r\n ) : (\r\n tab.name\r\n )}\r\n

\r\n {(!!className || isMobile) && (\r\n \r\n )}\r\n
\r\n
\r\n \r\n {children}\r\n \r\n \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 {\r\n text: string;\r\n className?: string;\r\n type?: 'button' | 'submit' | 'reset';\r\n onClick?: (e: MouseEvent) => 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 ;\r\n case 'radio':\r\n return ;\r\n default:\r\n return null;\r\n }\r\n };\r\n\r\n return (\r\n onSelect && onSelect(itemName)}\r\n >\r\n
\r\n {itemName}\r\n
\r\n\r\n
\r\n
{itemName}
\r\n {itemDescription &&

{itemDescription}

}\r\n
\r\n
onButtonClick(itemName)}>\r\n {renderButtonComponent()}\r\n
\r\n \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) => void;\r\n checked?: boolean;\r\n value?: string;\r\n}\r\n\r\nexport const RadioButton = forwardRef(\r\n ({ title, id, name, onChange, checked = false, value, ...props }, ref) => {\r\n return (\r\n
\r\n \r\n
\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 }, 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,\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;\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;\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({ 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 onTagClickHandler(tag)}\r\n className={`c-filter-block-tag ${isActive}`}\r\n >\r\n {tag.name}\r\n \r\n );\r\n };\r\n\r\n return tags.length > 0 ? (\r\n
\r\n
\r\n {renderTag({ id: 0, name: i18n.All })}\r\n {tags.map(renderTag)}\r\n
\r\n
\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 {\r\n onClick(item);\r\n }}\r\n className={`c-related-card ${className}`}\r\n >\r\n \r\n
\r\n \r\n \r\n
\r\n {item.USPList && bulletsVisible && (\r\n
\r\n {className === 'is-style-1' &&

{item.Title}

}\r\n
\r\n
    \r\n {item.USPList.map((item, index) => (\r\n
  • {item}
  • \r\n ))}\r\n
\r\n
\r\n
\r\n )}\r\n \r\n
\r\n

{item.Title}

\r\n {item.Summary &&

{item.Summary}

}\r\n
\r\n
\r\n {className === 'is-style-1' && item?.USPList?.length > 0 && (\r\n
\r\n \r\n
\r\n )}\r\n \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;\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
\r\n
\r\n
\r\n {filteredList\r\n .filter((_item, index) => index < maxItemsVisible)\r\n .map((item, index) => {\r\n return (\r\n \r\n \r\n
\r\n );\r\n })}\r\n
\r\n
\r\n {maxItemsVisible < filteredList.length && (\r\n
\r\n \r\n
\r\n )}\r\n \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;\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({ 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
\r\n {blockContent && (\r\n
\r\n )}\r\n\r\n \r\n\r\n \r\n
\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;\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({ 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 handleTagClick(tag)}\r\n className='c-document-section-list-item swiper-slide'\r\n >\r\n {tag.name}\r\n \r\n );\r\n };\r\n\r\n return tags.length > 0 ? (\r\n
\r\n
\r\n
    \r\n {renderTag({ id: 0, name: i18n.All })}\r\n {tags.map(renderTag)}\r\n
\r\n
\r\n
\r\n
\r\n
\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
\r\n \r\n
\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) =>
{renderItem(item)}
);\r\n } else {\r\n let lastValue = 0;\r\n const defaultList = filteredList.slice(0, defaultOffset);\r\n itemsToRender = defaultList.map((item) =>
{renderItem(item)}
);\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 \r\n {renderItem(item)}\r\n
\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
\r\n \r\n
\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 \r\n
\r\n \r\n
\r\n \r\n
\r\n
\r\n {item.FileName}\r\n \r\n {item.Description} {item.FileSize}\r\n \r\n
\r\n
\r\n \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;\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) => ,\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
\r\n )}\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;\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({\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
\r\n \r\n\r\n \r\n
\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;\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({ id: 0, name: 'All' });\r\n const [filterTagStandard, setFilterTagStandard] = useState({\r\n id: 0,\r\n name: 'All',\r\n });\r\n const [filters, setFilters] = useState([]);\r\n const [filtersStandard, setFiltersStandard] = useState([]);\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
\r\n {blockContent && (\r\n
\r\n )}\r\n {!hideServiceList && (\r\n <>\r\n \r\n \r\n \r\n )}\r\n\r\n \r\n \r\n
\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
\r\n
\r\n
\r\n
{header}
\r\n
\r\n \r\n
\r\n
\r\n {subHeader &&
{subHeader}
}\r\n
{children}
\r\n
\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 \r\n {children}\r\n \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(null);\r\n const topicsContainerRef = useRef(null);\r\n const [visibleScrollBtns, setVisibleScrollBtns] = useState>(['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) => {\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 0,\r\n })}\r\n >\r\n {visibleScrollBtns.includes('left') && (\r\n {\r\n onClickScrollBtn('left');\r\n }}\r\n >\r\n \r\n \r\n )}\r\n {visibleScrollBtns.includes('right') && (\r\n {\r\n onClickScrollBtn('right');\r\n }}\r\n >\r\n \r\n \r\n )}\r\n
\r\n {children}\r\n
\r\n
\r\n );\r\n};\r\n","export const extractTitle = (content: string) => {\r\n const titleRegex = /

(.*?)<\\/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;\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 \r\n
\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 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 \r\n );\r\n })}\r\n
\r\n
\r\n );\r\n};\r\n","import { RefObject, useEffect, useState } from 'react';\r\n\r\nexport const useSelectedTopic = (topics: string[], contentRef: RefObject) => {\r\n const [selectedTopicId, setSelectedTopicId] = useState(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(\r\n ({ children, className }, ref) => {\r\n return (\r\n
\r\n {children}\r\n
\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 \r\n

{title}

\r\n {text &&

{text}

}\r\n

\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 onSelectProduct(product)}\r\n />\r\n ))\r\n );\r\n\r\n if (!products || products.length < 2) {\r\n return (\r\n
\r\n

{selectedProduct}

\r\n
\r\n );\r\n }\r\n\r\n return (\r\n \r\n
\r\n

{selectedProduct}

\r\n \r\n
\r\n
\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(null);\r\n const dropdownRef = React.useRef(null);\r\n const [isOpen, setIsOpen] = useState(false);\r\n\r\n const handleClick = (e: MouseEvent) => {\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 \r\n {children}\r\n {isOpen && {content}}\r\n
\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;\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(null);\r\n const [selectedItem, setSelectedItem] = useState(defaultSelectedItem);\r\n const [quoteModalOpen, setQuoteModalOpen] = useState(false);\r\n const [selectedQuoteItem, setSelectedQuoteItem] = useState(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 \r\n \r\n \r\n
\r\n }\r\n subHeader={}\r\n onClose={handleClose}\r\n className='technical-details-modal'\r\n isOuterModal={true}\r\n >\r\n
\r\n {filteredTopics.map((topic: ProductModelTopic, index: number) => (\r\n \r\n ))}\r\n
\r\n \r\n\r\n {quoteModalOpen && (\r\n \r\n

{i18n.RequestAQuoteTitle}

\r\n \r\n }\r\n onClose={closeQuoteModal}\r\n className='quote-modal'\r\n >\r\n
\r\n {productLine && (\r\n \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 \r\n onSelectQuoteItem({\r\n ...product,\r\n ProductDescription: contentRef.current?.querySelector('p')?.textContent,\r\n })\r\n }\r\n />\r\n ))}\r\n
\r\n
\r\n \r\n
\r\n \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;\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(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 {\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 \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({\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 \r\n );\r\n } else if (tab.id === RelatedTabsTypes.RelatedServices) {\r\n const key = {\r\n ' 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 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 \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 \r\n \r\n
\r\n
\r\n \r\n \r\n {renderContainer(tab)}\r\n \r\n \r\n
\r\n
\r\n
\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({\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({\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":""}