{"version":3,"sources":["webpack:///./src/modules/model-viewer/components/assemblyDropdown.component.tsx?c30b","webpack:///./src/modules/model-viewer/model-viewer.view.tsx?5d3d","webpack:///./src/modules/model-viewer/components/AriHotspotImage.component.tsx?12b7","webpack:///./src/modules/model-viewer/components/AriPartsListTable.component.tsx?4169","webpack:///./src/modules/model-viewer/model-viewer.tsx?1091"],"names":["AssemblyDropdownComponent","_ref","baseClassName","assemblyData","onAssemblySelect","defaultOptionString","React","createElement","className","onChange","e","id","target","value","parseInt","map","assembly","key","Id","Name","props","isMobileClassName","isMobile","heading","hotspotImage","partsList","AriHotspotImage","transformRef","resources","centerButtonText","zoomInButtonText","zoomOutButtonText","resetButtonText","hotspotUsageHelpText","assemblyOptionsPlaceholderText","goToPart","tagIdPrefix","renderHeader","assemblyDetailState","mapUsed","setMapUsed","useState","shouldRender","setShouldRender","useEffect","setTimeout","generateHotspotStyle","hs","_hs$TopLeft","_hs$BottomRight","cssProperties","TopLeft","X","Y","left","top","BottomRight","height","width","handleHelperWrapperClick","initialScale","initialPositionX","isMobileToolsClassName","isMobileTransformWrapperClassName","selectedPartIdName","TransformWrapper","limitToBounds","ref","minScale","wheel","wheelDisabled","zoomIn","zoomOut","resetTransform","centerView","_objectWithoutProperties","_excluded","Fragment","renderToolButtonRow","onClick","TransformComponent","wrapperClass","src","ImageUrl","alt","HotSpots","AssemblyId","Tag","style","AriPartsListTableComponent","tableHeadings","parts","goToId","addPartToCart","partIdPrefix","selectedRow","isAuthenticated","requiresAuthentication","loginToViewPricingText","signInUrl","isDrawerOpen","unavailableText","addToCartText","closePartDrawer","priceFormatter","yPosition","setYPosition","window","removeEventListener","pageYOffset","addEventListener","passive","ListGroup","part","_part$Product6","ListGroupItem","PartId","active","ListGroupItemHeading","mfrCode","Sku","ListGroupItemText","Description","Product","Price","Qty","href","defaultValue","type","disabled","min","Table","th","_part$Product","_part$Product2","_part$Product3","_part$Product4","_part$Product5","product","partId","ItemId","description","currentInvString","getExtensionPropertyValueByKey","ExtensionProperties","CommercePropertyValueEnum","string","currentInventory","isNaN","oosUpperBound","oosUpperBoundLimit","canAddToCart","isEligible","JSON","stringify","classnames","BasePrice","colSpan","element","document","getElementById","scrollTo","getBoundingClientRect","scrollDownClickHandler","SupersessionKey","ModelViewer","constructor","super","_baseClassName","_transformRef","_partIdPrefix","_tagIdPrefix","_getViewport","context","this","MsDyn365","isBrowser","innerWidth","gridSettings","request","xs","w","sm","md","lg","_viewport","device","Type","state","assemblyDetail","undefined","isPartResponseError","ariBrandName","manufacturerCode","gotProductData","_updateViewport","bind","getAssemblyDetails","renderAssemblyHeader","componentDidMount","query","_getManufacturerCodeName","brandCode","componentWillUnmount","data","assemblyList","result","defaultAssemblyOption","selectedOptionPrefix","ariAssemblyData","renderTitle","_result$ariAssemblyDa","length","firstAssembly","ParentName","manufacturerCodes","response","getManufacturerBrandNameAsync","callerContext","actionContext","setState","ManufacturerCode","err","console","error","assemblyId","modelId","getAriAssemblyDetailsAsync","loadProductMappings","_this$state$assemblyD","partIds","Parts","p","Array","isArray","_this$state$assemblyD2","promises","getProducts","_flatten","partproducts","slice","forEach","code","responseProduct","find","supersededIdRes","SupersededId","supersededId","push","_objectSpread","stateAssemblyCopy","_cart$cart$ShippingAd","_this$state$assemblyD3","cart","cartId","addressId","ShippingAddress","RecordId","input","GetPartStateInput","channel","partresponse","getPartStateAction","missingProducts","i","_this$state$assemblyD4","found","j","productResults","_this$state$assemblyD5","_this$state$assemblyD6","_this$state$assemblyD7","_this$state$assemblyD8","_this$state$assemblyD9","tempProduct","MSRP","concat","renderHotspotImage","renderPartsList","refIdColHeading","partNoColHeading","descriptionColHeading","availabilityColHeading","yourPriceColHeading","listPriceColHeading","qtyColHeading","orderColHeading","user","cultureFormatter","formatCurrency","config","onlyShowPriceWhenAuthenticated","_this$_transformRef","current","zoomToElement","behavior","waitForScroll","elementList","querySelectorAll","el","classToAdd","classList","add","remove","partQty","partEl","querySelector","textContent","errorRetrievingCart","display","AdjustedPrice","ProductTypeValue","addProductToCart","count","catalogId","then","status","addToCartSuccess","errorAddingtoCart","catch","elementIdName","clearPartSelection","elementId","selectedElements","destinationElement","clonedElement","cloneNode","appendChild","cartBtn","parse","dataset","innerHTML","lastChangedFrame","lastX","scrollX","lastY","scrollY","Promise","resolve","tick","frames","requestAnimationFrame","render","viewProps","renderView","__decorate","observable","computed","observer"],"mappings":"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","file":"static/js/23.4849f07817e36c9fa17c.chunk.js","sourcesContent":["import React from 'react';\r\nimport { IAriServiceModelAssemblySearch } from '../../../actions/DataServiceEntities.g';\r\n\r\ninterface IAssemblyDropdownComponent {\r\n baseClassName: string;\r\n assemblyData: IAriServiceModelAssemblySearch[];\r\n onAssemblySelect(id: number): void;\r\n defaultOptionString: string;\r\n}\r\n\r\nexport const AssemblyDropdownComponent: React.FC = ({\r\n baseClassName,\r\n assemblyData,\r\n onAssemblySelect,\r\n defaultOptionString\r\n}) => {\r\n const handleAssemblySelect = (e: React.ChangeEvent) => {\r\n const id = e.target.value;\r\n onAssemblySelect(parseInt(id, 10));\r\n };\r\n if (!assemblyData) {\r\n return null;\r\n }\r\n\r\n return (\r\n
\r\n \r\n
\r\n );\r\n};\r\n","/*!\r\n * Copyright (c) Microsoft Corporation.\r\n * All rights reserved. See LICENSE in the project root for license information.\r\n */\r\n\r\nimport * as React from 'react';\r\nimport { IModelViewerViewProps } from './model-viewer';\r\n\r\nexport default (props: IModelViewerViewProps) => {\r\n const isMobileClassName = props.isMobile ? `${props.baseClassName}__image-wrapper--mobile` : '';\r\n return (\r\n
\r\n {props.heading}\r\n
{props.hotspotImage}
\r\n {props.partsList}\r\n
\r\n );\r\n};\r\n","import React from 'react';\r\nimport { IAriServiceHotSpot, IAriServiceAssemblyInformation } from '../../../actions/DataServiceEntities.g';\r\nimport { ReactZoomPanPinchRef, TransformComponent, TransformWrapper } from 'react-zoom-pan-pinch';\r\n\r\n/**\r\n * Resource strings from definition file\r\n */\r\ninterface IAriHotspotImageResources {\r\n centerButtonText: string;\r\n resetButtonText: string;\r\n zoomInButtonText: string;\r\n zoomOutButtonText: string;\r\n hotspotUsageHelpText: string;\r\n assemblyOptionsPlaceholderText: string;\r\n}\r\n\r\n/**\r\n * Component props\r\n */\r\ninterface IAriHotspotImageProps {\r\n renderHeader(renderToolButtonRow: JSX.Element | null): JSX.Element;\r\n assemblyDetailState: IAriServiceAssemblyInformation | undefined;\r\n resources: IAriHotspotImageResources;\r\n baseClassName: string;\r\n ImageUrl?: string;\r\n HotSpots?: IAriServiceHotSpot[];\r\n Name?: string;\r\n transformRef: React.Ref;\r\n goToPart(id: string, selectedPartIdName: string): void;\r\n tagIdPrefix: string;\r\n isMobile: boolean;\r\n}\r\n\r\n/**\r\n * Component to render the image with hotspots\r\n * @param props component props\r\n */\r\nexport const AriHotspotImage: React.FC = props => {\r\n const {\r\n baseClassName,\r\n // ImageUrl,\r\n // HotSpots,\r\n // Name,\r\n transformRef,\r\n resources: {\r\n centerButtonText,\r\n zoomInButtonText,\r\n zoomOutButtonText,\r\n resetButtonText,\r\n hotspotUsageHelpText,\r\n assemblyOptionsPlaceholderText\r\n },\r\n goToPart,\r\n tagIdPrefix,\r\n isMobile,\r\n renderHeader,\r\n assemblyDetailState\r\n } = props;\r\n\r\n const [mapUsed, setMapUsed] = React.useState(false);\r\n const [shouldRender, setShouldRender] = React.useState(true);\r\n\r\n React.useEffect(() => {\r\n // console.log(`In timeout: ${shouldRender}`);\r\n setShouldRender(false);\r\n setTimeout(() => {\r\n setShouldRender(true);\r\n }, 50);\r\n }, [assemblyDetailState]);\r\n\r\n /**\r\n * Generates the style required for the hotspot\r\n * @param hs hotspot\r\n */\r\n const generateHotspotStyle = (hs: IAriServiceHotSpot): React.CSSProperties => {\r\n const cssProperties: React.CSSProperties = {};\r\n if (!hs.TopLeft?.X || !hs.TopLeft.Y) {\r\n return {};\r\n }\r\n cssProperties.left = `${hs.TopLeft.X}px`;\r\n cssProperties.top = `${hs.TopLeft.Y}px`;\r\n if (hs.BottomRight?.X && hs.BottomRight.Y) {\r\n cssProperties.height = `${parseInt(hs.BottomRight.X, 10) - parseInt(hs.TopLeft.X, 10) + 10}px`;\r\n cssProperties.width = `${parseInt(hs.BottomRight.Y, 10) - parseInt(hs.TopLeft.Y, 10) + 10}px`;\r\n }\r\n return cssProperties;\r\n };\r\n\r\n const renderToolButtonRow = (\r\n baseClassName: string,\r\n zoomIn: () => void,\r\n zoomOut: () => void,\r\n resetTransform: () => void,\r\n centerView: () => void,\r\n centerButtonText: string,\r\n zoomInButtonText: string,\r\n zoomOutButtonText: string,\r\n resetButtonText: string\r\n ) => {\r\n return (\r\n
\r\n \r\n \r\n \r\n \r\n
\r\n );\r\n };\r\n\r\n const handleHelperWrapperClick = () => setMapUsed(true);\r\n const initialScale = isMobile ? 0.4 : 0.6;\r\n const initialPositionX = isMobile ? 0 : 150;\r\n const isMobileToolsClassName = isMobile ? `${baseClassName}__tools--mobile` : '';\r\n const isMobileTransformWrapperClassName = isMobile ? `${baseClassName}__transform-wrapper--mobile` : '';\r\n const selectedPartIdName = `${baseClassName}__part-selection-popover`;\r\n return (\r\n \r\n {({ zoomIn, zoomOut, resetTransform, centerView, ...rest }) => (\r\n \r\n {assemblyDetailState && shouldRender ? (\r\n <>\r\n {renderHeader(\r\n renderToolButtonRow(\r\n baseClassName,\r\n zoomIn,\r\n zoomOut,\r\n resetTransform,\r\n centerView,\r\n centerButtonText,\r\n zoomInButtonText,\r\n zoomOutButtonText,\r\n resetButtonText\r\n )\r\n )}\r\n \r\n
\r\n {!mapUsed ? (\r\n
\r\n {hotspotUsageHelpText}\r\n
\r\n ) : null}\r\n {assemblyDetailState.Name}\r\n
\r\n {!isMobile &&\r\n assemblyDetailState.HotSpots &&\r\n assemblyDetailState.HotSpots.map(hs => (\r\n goToPart(hs.Tag!, selectedPartIdName)}\r\n id={`${tagIdPrefix}${hs.Tag}`}\r\n />\r\n ))}\r\n
\r\n
\r\n
\r\n \r\n ) : (\r\n <>\r\n {renderHeader(null)}\r\n \r\n
\r\n \r\n
\r\n {assemblyOptionsPlaceholderText}\r\n
\r\n \r\n )}\r\n \r\n )}\r\n \r\n );\r\n};\r\n","import React from 'react';\r\nimport Table from 'reactstrap/lib/Table';\r\nimport classnames from 'classnames';\r\nimport { ListGroup, ListGroupItem, ListGroupItemHeading, ListGroupItemText } from 'reactstrap';\r\nimport { IAriServiceAssemblyPartProductCombinations } from '../model-viewer';\r\nimport { ProductSearchResult } from '@msdyn365-commerce/retail-proxy';\r\nimport { CommercePropertyValueEnum } from '../../../modules/allowable-freight/utils/CommercePropertyValueEnum';\r\nimport getExtensionPropertyValueByKey from '../../../utils/getExtensionPropertyValueByKey';\r\n\r\ninterface IAriPArtsListTableProps {\r\n parts: IAriServiceAssemblyPartProductCombinations[];\r\n tableHeadings: string[];\r\n baseClassName: String;\r\n goToId(id: string): void;\r\n addPartToCart(part: ProductSearchResult, partId: string): void;\r\n partIdPrefix: string;\r\n selectedRow: string | undefined;\r\n isAuthenticated: boolean;\r\n requiresAuthentication: boolean;\r\n loginToViewPricingText: string;\r\n unavailableText: string;\r\n addToCartText: string;\r\n signInUrl: string;\r\n isMobile: boolean;\r\n isDrawerOpen: boolean;\r\n closePartDrawer(): void;\r\n priceFormatter: (price: string | number, currencyCode?: string | undefined) => string;\r\n mfrCode: string;\r\n}\r\n\r\n/**\r\n * Component to display a list of parts\r\n * @param props props\r\n */\r\nexport const AriPartsListTableComponent: React.FC = props => {\r\n const {\r\n tableHeadings,\r\n parts,\r\n baseClassName,\r\n goToId,\r\n addPartToCart,\r\n partIdPrefix,\r\n selectedRow,\r\n isAuthenticated,\r\n requiresAuthentication,\r\n loginToViewPricingText,\r\n signInUrl,\r\n isMobile,\r\n isDrawerOpen,\r\n unavailableText,\r\n addToCartText,\r\n closePartDrawer,\r\n priceFormatter\r\n } = props;\r\n\r\n const [yPosition, setYPosition] = React.useState(0);\r\n React.useEffect(() => {\r\n //Scroll event handling\r\n window.removeEventListener('scroll', () => setYPosition(window.pageYOffset));\r\n window.addEventListener('scroll', () => setYPosition(window.pageYOffset), { passive: true });\r\n window.removeEventListener('scroll', () => setYPosition(window.pageYOffset));\r\n return;\r\n });\r\n\r\n const scrollDownClickHandler = (id: string) => {\r\n const element = document.getElementById(id);\r\n return window.scrollTo(0, element ? element.getBoundingClientRect().top : 0);\r\n };\r\n const selectedPartIdName = `${baseClassName}__part-selection-popover`;\r\n return (\r\n <>\r\n
\r\n {!isMobile ? (\r\n \r\n \r\n \r\n {tableHeadings.map(th => (\r\n \r\n ))}\r\n \r\n \r\n \r\n {parts &&\r\n parts.map(part => {\r\n const product = part.Product;\r\n const partId = product && product.ItemId;\r\n if (product?.ItemId === 'HOM538938002') {\r\n debugger;\r\n }\r\n const description = (product && product.Name) || part.Description;\r\n // TODO: Don't use hardcoded key\r\n const currentInvString =\r\n product &&\r\n getExtensionPropertyValueByKey(\r\n product.ExtensionProperties,\r\n 'inventory',\r\n CommercePropertyValueEnum.string\r\n );\r\n let currentInventory = parseInt(currentInvString as string, 10);\r\n if (isNaN(currentInventory)) {\r\n currentInventory = 0;\r\n }\r\n const oosUpperBound = part.Product?.oosUpperBoundLimit || 0;\r\n const canAddToCart = part.Product && currentInventory > oosUpperBound && part.Product?.isEligible;\r\n return (\r\n \r\n \r\n \r\n \r\n {isAuthenticated || !requiresAuthentication ? (\r\n \r\n \r\n \r\n \r\n {canAddToCart ? (\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 \r\n )}\r\n \r\n );\r\n })}\r\n \r\n
{th}
\r\n \r\n {partId || 'N/A'}{description}{currentInventory}{priceFormatter(part.Product?.BasePrice || 0)}{priceFormatter(part.Product?.Price || 0)}\r\n \r\n \r\n {' '}\r\n addPartToCart(part.Product!, part.PartId!)}\r\n >\r\n {addToCartText}\r\n \r\n

\r\n
\r\n {' '}\r\n {currentInventory}{priceFormatter(part.Product?.BasePrice || 0)}\r\n {loginToViewPricingText}\r\n
\r\n ) : (\r\n \r\n {parts &&\r\n parts.map(part => (\r\n \r\n \r\n \r\n {`${tableHeadings[0]}: `}\r\n {part.Tag}\r\n \r\n \r\n {`${tableHeadings[1]}: `}\r\n {`${props.mfrCode}${part.Sku}`}\r\n \r\n \r\n \r\n \r\n {`${tableHeadings[2]}: ${part.Description}`}\r\n \r\n \r\n \r\n {isAuthenticated || requiresAuthentication ? (\r\n
\r\n {`${\r\n tableHeadings[4]\r\n }: ${priceFormatter(part.Product?.Price || 0)}`}\r\n {`${\r\n tableHeadings[3]\r\n }: ${part.Qty === '' ? 0 : parseInt(part.Qty!, 10)}`}\r\n
\r\n ) : (\r\n {loginToViewPricingText}\r\n )}\r\n
\r\n \r\n {isAuthenticated || requiresAuthentication ? (\r\n
\r\n {part.Product ? (\r\n
\r\n \r\n\r\n addPartToCart(part.Product!, part.PartId!)}\r\n >\r\n {addToCartText}\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
\r\n )}\r\n {yPosition <= 0 && (\r\n
scrollDownClickHandler(`${baseClassName}__list`)}>\r\n scroll down\r\n
\r\n )}\r\n
\r\n \r\n
\r\n \r\n \r\n \r\n {tableHeadings.map(th => (\r\n \r\n ))}\r\n \r\n \r\n \r\n
{th}
\r\n
\r\n X\r\n
\r\n
\r\n
\r\n \r\n );\r\n};\r\n","/*!\r\n * Copyright (c) Microsoft Corporation.\r\n * All rights reserved. See LICENSE in the project root for license information.\r\n */\r\n\r\nimport * as React from 'react';\r\nimport { computed, observable } from 'mobx';\r\nimport { observer } from 'mobx-react';\r\nimport MsDyn365 from '@msdyn365-commerce/core';\r\n\r\nimport { IModelViewerData } from './model-viewer.data';\r\nimport { IModelViewerProps } from './model-viewer.props.autogenerated';\r\nimport { getAriAssemblyDetailsAsync, getManufacturerBrandNameAsync } from '../../actions/DataActionExtension.g';\r\nimport { IAriServiceAssemblyInformation, IAriServiceAssemblyPart } from '../../actions/DataServiceEntities.g';\r\nimport { ReactZoomPanPinchRef } from 'react-zoom-pan-pinch';\r\nimport { AssemblyDropdownComponent } from './components/assemblyDropdown.component';\r\nimport { AriHotspotImage } from './components/AriHotspotImage.component';\r\nimport { AriPartsListTableComponent } from './components/AriPartsListTable.component';\r\nimport { ProductSearchResult, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\r\n// import { searchByCriteriaAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/ProductsDataActions.g';\r\nimport * as _ from 'lodash';\r\nimport getPartStateAction, { GetPartStateInput, IProductSearchResultWithState } from '../../actions/get-part-state.action';\r\nimport getExtensionPropertyValueByKey from '../../utils/getExtensionPropertyValueByKey';\r\nimport { CommercePropertyValueEnum } from '../../modules/allowable-freight/utils/CommercePropertyValueEnum';\r\n// import { SupersessionKey } from \"../../\";\r\n/**\r\n * Props for the view component\r\n */\r\nexport interface IModelViewerViewProps extends IModelViewerProps {\r\n assemblyList: React.ReactNode;\r\n hotspotImage: React.ReactNode | null;\r\n partsList: React.ReactNode | null;\r\n baseClassName: string;\r\n heading: React.ReactNode | null;\r\n isMobile: boolean;\r\n}\r\n\r\nexport interface IAriServiceAssemblyPartProductCombinations extends IAriServiceAssemblyPart {\r\n Product?: IProductSearchResultWithState;\r\n}\r\n\r\ntype GridSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl';\r\n\r\n/**\r\n * State for the component\r\n */\r\ninterface IModelViewerState {\r\n assemblyDetail: IAriServiceAssemblyInformation | undefined;\r\n isPartResponseError: boolean;\r\n selectedRow: string | undefined;\r\n isDrawerOpen: boolean;\r\n ariBrandName: string;\r\n manufacturerCode: string;\r\n gotProductData: boolean;\r\n}\r\n\r\nexport interface RowFeedback {\r\n message: string;\r\n success: boolean;\r\n}\r\n\r\nexport enum SupersessionKey {\r\n SupersededId = 'superseded-from-id',\r\n SupersededName = 'superseded-from-name',\r\n Inventory = 'inventory'\r\n}\r\n\r\n/**\r\n *\r\n * ModelViewer component\r\n * @extends {React.PureComponent>}\r\n */\r\n@observer\r\nclass ModelViewer extends React.PureComponent, IModelViewerState> {\r\n /**\r\n * Base class name for the elements on the page\r\n * @private\r\n */\r\n private _baseClassName = 'ari-model-viewer';\r\n /**\r\n * React Ref pointing to the transition component\r\n * @private\r\n */\r\n private _transformRef = React.createRef();\r\n /**\r\n * Id prefix for the part\r\n * @private\r\n */\r\n private _partIdPrefix = 'part__';\r\n /**\r\n * Id prefix for the tag\r\n * @private\r\n */\r\n private _tagIdPrefix = 'ref__';\r\n\r\n @observable\r\n private _viewport: GridSize;\r\n\r\n constructor(props: IModelViewerProps) {\r\n super(props);\r\n\r\n this._viewport =\r\n props.context.request && props.context.request.device && props.context.request.device.Type === 'Mobile' ? 'xs' : 'lg';\r\n\r\n this.state = {\r\n assemblyDetail: undefined,\r\n isPartResponseError: false,\r\n selectedRow: undefined,\r\n isDrawerOpen: false,\r\n ariBrandName: '',\r\n manufacturerCode: '',\r\n gotProductData: false\r\n };\r\n\r\n this._updateViewport = this._updateViewport.bind(this);\r\n this.getAssemblyDetails = this.getAssemblyDetails.bind(this);\r\n this.goToId = this.goToId.bind(this);\r\n this.goToPart = this.goToPart.bind(this);\r\n this.closePartDrawer = this.closePartDrawer.bind(this);\r\n this.renderAssemblyHeader = this.renderAssemblyHeader.bind(this);\r\n this.addPartToCart = this.addPartToCart.bind(this);\r\n }\r\n\r\n @computed get isMobile(): boolean {\r\n // return this._viewport === 'xs' || this._viewport === 'sm';\r\n return this._viewport === 'xs';\r\n }\r\n\r\n public componentDidMount(): void {\r\n const {\r\n context: {\r\n request: { query }\r\n }\r\n } = this.props;\r\n if (MsDyn365.isBrowser) {\r\n window.addEventListener('resize', this._updateViewport);\r\n this._updateViewport();\r\n }\r\n void this._getManufacturerCodeName(query!.brandCode);\r\n }\r\n\r\n public componentWillUnmount(): void {\r\n if (MsDyn365.isBrowser) {\r\n window.removeEventListener('resize', this._updateViewport);\r\n }\r\n }\r\n\r\n /**\r\n * Renders the assembly header\r\n * @private\r\n */\r\n private renderAssemblyHeader(renderToolButtonRow: JSX.Element | null) {\r\n const {\r\n data: {\r\n assemblyList: { result }\r\n },\r\n resources: { defaultAssemblyOption, selectedOptionPrefix }\r\n } = this.props;\r\n const { assemblyDetail } = this.state;\r\n const isMobileClassName = this.isMobile ? `${this._baseClassName}__header--mobile` : '';\r\n if (!result) {\r\n return
;\r\n } else {\r\n return (\r\n
\r\n {assemblyDetail ? (\r\n
\r\n

\r\n {selectedOptionPrefix} {assemblyDetail?.Name}\r\n

\r\n
\r\n ) : null}\r\n
\r\n \r\n {renderToolButtonRow}\r\n
\r\n
\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * Renders the page title\r\n * @private\r\n */\r\n private renderTitle() {\r\n const {\r\n data: {\r\n assemblyList: { result }\r\n }\r\n } = this.props;\r\n if (result && result.ariAssemblyData?.length) {\r\n const firstAssembly = result.ariAssemblyData[0];\r\n return (\r\n
\r\n

{`${\r\n this.state.ariBrandName ? `${this.state.ariBrandName} - ` : ''\r\n }${firstAssembly.ParentName}`}

\r\n
\r\n );\r\n }\r\n return null;\r\n }\r\n\r\n private async _getManufacturerCodeName(brandCode: string): Promise {\r\n const codesResults = this.props.data.manufacturerCodes.result ? this.props.data.manufacturerCodes.result : [];\r\n\r\n if (codesResults.length === 0) {\r\n return;\r\n }\r\n try {\r\n const response = await getManufacturerBrandNameAsync({ callerContext: this.props.context.actionContext }, brandCode);\r\n this.setState({ ariBrandName: response[0].Description || '', manufacturerCode: response[0].ManufacturerCode || '' });\r\n } catch (err) {\r\n console.error(err);\r\n }\r\n }\r\n\r\n /**\r\n * Gets assembly details from the data service\r\n * @param assemblyId Assembly Id to get details for\r\n * @private\r\n */\r\n private async getAssemblyDetails(assemblyId: number) {\r\n // console.log('getAssemblyDetails');\r\n if (assemblyId === 0) {\r\n return;\r\n }\r\n const {\r\n context: {\r\n request: {\r\n // @ts-ignore\r\n query: { brandCode, modelId }\r\n }\r\n }\r\n } = this.props;\r\n try {\r\n const response = await getAriAssemblyDetailsAsync(\r\n { callerContext: this.props.context.actionContext },\r\n brandCode,\r\n parseInt(modelId, 10),\r\n assemblyId\r\n );\r\n\r\n // console.log('assembly detail', response.Parts);\r\n\r\n this.setState(\r\n {\r\n assemblyDetail: response\r\n },\r\n () => this.loadProductMappings()\r\n );\r\n } catch (err) {\r\n this.setState({ isPartResponseError: true });\r\n }\r\n }\r\n\r\n private async loadProductMappings() {\r\n // console.log('loaded product mappings')\r\n //todo\r\n const mfrCode = this.state.manufacturerCode;\r\n // const partIds = this.state.assemblyDetail?.Parts?.map(p => `${p.Sku === 'N/A' ? '' : mfrCode}${p.Sku}`);\r\n const partIds = this.state.assemblyDetail?.Parts?.map(p => `${mfrCode}${p.Sku}`);\r\n if (partIds && Array.isArray(partIds)) {\r\n // const chunkSize = 15;\r\n // const chunks = [];\r\n // for (let i = 0; i < partIds.length; i += chunkSize) {\r\n // chunks.push(partIds.slice(i, i + chunkSize));\r\n // }\r\n\r\n // const promises = chunks.map(async chunk => {\r\n // return this.getProducts(chunk);\r\n // });\r\n\r\n const promises = await this.getProducts(partIds);\r\n // const promiseResult = await Promise.all(promises);\r\n // let response = _.flatten(promiseResult); //promiseResult.reduce((arr, prom) => arr.concat(prom), []);\r\n const response = _.flatten(promises); //promiseResult.reduce((arr, prom) => arr.concat(prom), []);\r\n // response = (response[0] as unknown) as IProductSearchResultWithState[];\r\n // const response = await getSupersessionAsync({ callerContext: this.props.context.actionContext }, partIds, []);\r\n const partproducts: IAriServiceAssemblyPartProductCombinations[] = [];\r\n const parts = this.state.assemblyDetail?.Parts?.slice() as IAriServiceAssemblyPartProductCombinations[];\r\n\r\n parts?.forEach(part => {\r\n const code = mfrCode + (part.Sku || '');\r\n const responseProduct = response.find(p => {\r\n const supersededIdRes = getExtensionPropertyValueByKey(\r\n p.ExtensionProperties,\r\n SupersessionKey.SupersededId,\r\n CommercePropertyValueEnum.string\r\n );\r\n const supersededId = typeof supersededIdRes === 'string' ? supersededIdRes : undefined;\r\n return p.ItemId === code || (supersededId && supersededId === code);\r\n });\r\n // console.log(responseProduct);\r\n partproducts.push({ ...part, Product: responseProduct });\r\n });\r\n // console.log(partproducts);\r\n\r\n const stateAssemblyCopy = this.state.assemblyDetail;\r\n\r\n if (stateAssemblyCopy) {\r\n stateAssemblyCopy.Parts = partproducts;\r\n\r\n this.setState({\r\n assemblyDetail: stateAssemblyCopy,\r\n gotProductData: true\r\n });\r\n }\r\n }\r\n }\r\n\r\n private async getProducts(partIds: string[]): Promise {\r\n const cart = await this.props.data.cart;\r\n const cartId = cart.cart.Id;\r\n const addressId = cart.cart.ShippingAddress?.RecordId || 0;\r\n const input = new GetPartStateInput(partIds, addressId, cartId, this.props.context.request.channel!.RecordId);\r\n const partresponse = await getPartStateAction(input, this.props.context.actionContext);\r\n\r\n // needed to get list of products excluded from criteriaResponse data action in getPartStateAction\r\n const missingProducts = [];\r\n if (this.state.assemblyDetail?.Parts) {\r\n for (let i = 0; i < this.state.assemblyDetail?.Parts?.length; i++) {\r\n let found = false;\r\n for (let j = 0; j < partresponse.productResults.length; j++) {\r\n if (partresponse.productResults[j].ItemId === this.state.assemblyDetail?.Parts[i].PartId) {\r\n found = true;\r\n }\r\n }\r\n\r\n if (!found) {\r\n const tempProduct: IProductSearchResultWithState = {\r\n ItemId: `${this.state.manufacturerCode}${this.state.assemblyDetail?.Parts[i].Sku}`,\r\n Name: this.state.assemblyDetail?.Parts[i].Description,\r\n Description: this.state.assemblyDetail?.Parts[i].Description,\r\n Price: this.state.assemblyDetail?.Parts[i].MSRP,\r\n RecordId: 0\r\n };\r\n missingProducts.push(tempProduct);\r\n }\r\n }\r\n // end get missing list of products\r\n }\r\n\r\n // console.log(partresponse.productResults);\r\n return partresponse.productResults.concat(missingProducts);\r\n // return partresponse.productResults;\r\n\r\n // const productSearchCriteria: ProductSearchCriteria = {\r\n // ItemIds: partIds.map(pid => {\r\n // return { ItemId: pid };\r\n // }),\r\n // Context: {\r\n // CatalogId: 0,\r\n // ChannelId: this.props.context.request.channel!.RecordId\r\n // }\r\n // };\r\n // return searchByCriteriaAsync({ callerContext: this.props.context.actionContext }, productSearchCriteria);\r\n }\r\n\r\n /**\r\n * Renders the hotspot image\r\n * @private\r\n */\r\n private renderHotspotImage() {\r\n const {\r\n resources: {\r\n assemblyOptionsPlaceholderText,\r\n centerButtonText,\r\n resetButtonText,\r\n zoomInButtonText,\r\n zoomOutButtonText,\r\n hotspotUsageHelpText\r\n }\r\n } = this.props;\r\n const resources = {\r\n centerButtonText,\r\n resetButtonText,\r\n zoomInButtonText,\r\n zoomOutButtonText,\r\n hotspotUsageHelpText,\r\n assemblyOptionsPlaceholderText\r\n };\r\n return (\r\n \r\n );\r\n }\r\n\r\n /**\r\n * Renders the parts list\r\n * @private\r\n */\r\n private renderPartsList() {\r\n if (this.state.assemblyDetail === undefined) {\r\n return null;\r\n }\r\n const {\r\n state: {\r\n assemblyDetail: { Parts },\r\n selectedRow,\r\n isDrawerOpen\r\n },\r\n _baseClassName,\r\n goToId,\r\n addPartToCart,\r\n closePartDrawer,\r\n _partIdPrefix\r\n } = this;\r\n\r\n const {\r\n resources: {\r\n refIdColHeading,\r\n partNoColHeading,\r\n descriptionColHeading,\r\n availabilityColHeading,\r\n yourPriceColHeading,\r\n listPriceColHeading,\r\n qtyColHeading,\r\n loginToViewPricingText,\r\n addToCartText,\r\n unavailableText,\r\n orderColHeading\r\n },\r\n context: {\r\n request: {\r\n user: { isAuthenticated, signInUrl }\r\n },\r\n cultureFormatter: { formatCurrency }\r\n }\r\n } = this.props;\r\n const tableHeadings = [\r\n refIdColHeading,\r\n partNoColHeading,\r\n descriptionColHeading,\r\n availabilityColHeading,\r\n listPriceColHeading,\r\n yourPriceColHeading,\r\n qtyColHeading,\r\n orderColHeading\r\n ];\r\n return this.state.gotProductData ? (\r\n \r\n ) : (\r\n <>\r\n );\r\n }\r\n\r\n /**\r\n * Scrolls the page to the hotspot on the image after clicking the ref in the part list, causes the hotspot to flash\r\n * @param id id of the hotspot to go to\r\n * @private\r\n */\r\n private async goToId(id: string) {\r\n if (this._transformRef?.current?.zoomToElement) {\r\n const target = `${this._tagIdPrefix}${id}`;\r\n window.scrollTo({ top: 0, left: 0, behavior: 'smooth' });\r\n await this.waitForScroll();\r\n const elementList = document.querySelectorAll(`#${target}`);\r\n this._transformRef.current.zoomToElement(target, elementList.length === 1 ? 2 : 1);\r\n if (elementList.length) {\r\n elementList.forEach(el => {\r\n const classToAdd = `${this._baseClassName}__part-flash`;\r\n el.classList.add(classToAdd);\r\n setTimeout(() => el.classList.remove(classToAdd), 4000);\r\n });\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Scrolls the page to the hotspot on the image after clicking the ref in the part list, causes the hotspot to flash\r\n * @param id id of the hotspot to go to\r\n * @private\r\n */\r\n private async addPartToCart(part: ProductSearchResult, partId: string) {\r\n let cart;\r\n let partQty;\r\n let partEl: HTMLElement | null;\r\n\r\n if (!part || !partId) {\r\n return; // {\"message\":\"Sorry,there was an error retrieving the part.\",\"success\": false};\r\n }\r\n\r\n // console.log(`partid: ${partId}`);\r\n partEl = document.querySelector(`p.hide-status-${partId}`);\r\n partQty = parseInt((document.getElementById(partId) as HTMLInputElement).value, 10);\r\n cart = await this.props.data.cart;\r\n\r\n if (!cart) {\r\n if (partEl) {\r\n partEl.textContent = this.props.resources.errorRetrievingCart;\r\n partEl.style.display = 'block';\r\n setTimeout(() => {\r\n partEl!.style.display = 'none';\r\n }, 7000);\r\n }\r\n }\r\n\r\n const product: SimpleProduct = {\r\n AdjustedPrice: part.Price,\r\n ProductTypeValue: 0,\r\n BasePrice: part.BasePrice || 0,\r\n Name: part.Name,\r\n Price: part.Price,\r\n ItemId: part.ItemId,\r\n RecordId: part.RecordId,\r\n ExtensionProperties: part.ExtensionProperties\r\n };\r\n\r\n await cart\r\n .addProductToCart({ product, count: partQty, catalogId: 0 })\r\n .then(response => {\r\n if (response.status === 'SUCCESS') {\r\n if (partEl) {\r\n partEl.textContent = this.props.resources.addToCartSuccess;\r\n partEl.style.display = 'block';\r\n\r\n setTimeout(() => {\r\n partEl!.style.display = 'none';\r\n }, 7000);\r\n }\r\n } else {\r\n if (partEl) {\r\n partEl.textContent = this.props.resources.errorAddingtoCart;\r\n partEl.style.display = 'block';\r\n\r\n setTimeout(() => {\r\n partEl!.style.display = 'none';\r\n }, 7000);\r\n }\r\n }\r\n })\r\n .catch(() => {\r\n if (partEl) {\r\n partEl.textContent = this.props.resources.errorAddingtoCart;\r\n partEl.style.display = 'block';\r\n\r\n setTimeout(() => {\r\n partEl!.style.display = 'none';\r\n }, 7000);\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * displays the part associated with the hotspot in a slide up box at the bottom of the screen\r\n * @param id part id\r\n * @private\r\n */\r\n private goToPart(id: string, selectedPartIdName: string) {\r\n this.setState({\r\n selectedRow: id,\r\n isDrawerOpen: true\r\n });\r\n const elementIdName = `${selectedPartIdName}-table--body`;\r\n this.clearPartSelection(elementIdName);\r\n const elementId = `#${this._partIdPrefix}${id}`;\r\n const selectedElements = document.querySelectorAll(elementId);\r\n const destinationElement = document.getElementById(`${elementIdName}`);\r\n\r\n selectedElements.forEach(element => {\r\n const clonedElement = element.cloneNode(true);\r\n if (destinationElement) {\r\n destinationElement.appendChild(clonedElement);\r\n const cartBtn = (clonedElement as HTMLTableRowElement).querySelector('.add-to-cart-btn') as HTMLButtonElement;\r\n const part = JSON.parse(element.dataset.part || '');\r\n cartBtn?.addEventListener('click', () => this.addPartToCart(part.Product, part.PartId));\r\n }\r\n });\r\n }\r\n\r\n private clearPartSelection(elementIdName: string) {\r\n const destinationElement = document.getElementById(elementIdName);\r\n if (destinationElement) {\r\n destinationElement.innerHTML = '';\r\n }\r\n }\r\n private closePartDrawer() {\r\n this.setState({\r\n isDrawerOpen: false\r\n });\r\n }\r\n\r\n /**\r\n * Waits for scrolling to finish and returns a promise when it does.\r\n */\r\n private waitForScroll(): Promise {\r\n let lastChangedFrame = 0;\r\n let lastX = window.scrollX;\r\n let lastY = window.scrollY;\r\n return new Promise(resolve => {\r\n function tick(frames: number) {\r\n if (frames >= 500 || frames - lastChangedFrame > 20) {\r\n resolve();\r\n } else {\r\n if (window.scrollX !== lastX || window.scrollY !== lastY) {\r\n lastChangedFrame = frames;\r\n lastX = window.scrollX;\r\n lastY = window.scrollY;\r\n }\r\n requestAnimationFrame(tick.bind(null, frames + 1));\r\n }\r\n }\r\n tick(0);\r\n });\r\n }\r\n\r\n private _updateViewport(): void {\r\n this._viewport = this._getViewport();\r\n }\r\n\r\n private readonly _getViewport = (): GridSize => {\r\n const { context } = this.props;\r\n\r\n if (MsDyn365.isBrowser && window.innerWidth) {\r\n const gridSettings = context.request.gridSettings;\r\n if (gridSettings) {\r\n if (gridSettings.xs && window.innerWidth <= gridSettings.xs.w) {\r\n return 'xs';\r\n } else if (gridSettings.sm && window.innerWidth <= gridSettings.sm.w) {\r\n return 'sm';\r\n } else if (gridSettings.md && window.innerWidth <= gridSettings.md.w) {\r\n return 'md';\r\n } else if (gridSettings.lg && window.innerWidth <= gridSettings.lg.w) {\r\n return 'lg';\r\n }\r\n return 'xl';\r\n }\r\n }\r\n\r\n return 'xs';\r\n };\r\n\r\n public render(): JSX.Element | null {\r\n const viewProps: IModelViewerViewProps = {\r\n ...this.props,\r\n assemblyList: this.renderAssemblyHeader(null),\r\n hotspotImage: this.renderHotspotImage(),\r\n partsList: this.renderPartsList(),\r\n heading: this.renderTitle(),\r\n baseClassName: this._baseClassName,\r\n isMobile: this.isMobile\r\n };\r\n return this.props.renderView(viewProps);\r\n }\r\n}\r\n\r\nexport default ModelViewer;\r\n"],"sourceRoot":""}