{"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","console","log","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$Product2","ListGroupItem","PartId","active","ListGroupItemHeading","mfrCode","Sku","ListGroupItemText","Description","Product","Price","Qty","href","defaultValue","type","disabled","min","max","Table","th","_part$Product","classnames","colSpan","element","document","getElementById","scrollTo","getBoundingClientRect","scrollDownClickHandler","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","_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","error","assemblyId","modelId","getAriAssemblyDetailsAsync","loadProductMappings","_this$state$assemblyD","partIds","Parts","p","Array","isArray","_this$state$assemblyD2","chunkSize","chunks","i","push","slice","promises","async","getProducts","chunk","promiseResult","Promise","all","_flatten","partproducts","forEach","code","responseProduct","find","ItemId","_objectSpread","stateAssemblyCopy","productSearchCriteria","ItemIds","pid","Context","CatalogId","ChannelId","channel","RecordId","searchByCriteriaAsync","renderHotspotImage","renderPartsList","refIdColHeading","partNoColHeading","descriptionColHeading","availabilityColHeading","priceColHeading","qtyColHeading","orderColHeading","user","cultureFormatter","formatCurrency","config","onlyShowPriceWhenAuthenticated","_this$_transformRef","current","zoomToElement","behavior","waitForScroll","elementList","querySelectorAll","el","classToAdd","classList","add","remove","partId","cart","partQty","partEl","querySelector","textContent","errorRetrievingCart","display","product","AdjustedPrice","ProductTypeValue","BasePrice","ExtensionProperties","addProductToCart","count","then","status","addToCartSuccess","errorAddingtoCart","catch","elementIdName","clearPartSelection","elementId","selectedElements","destinationElement","clonedElement","cloneNode","appendChild","innerHTML","lastChangedFrame","lastX","scrollX","lastY","scrollY","resolve","tick","frames","requestAnimationFrame","render","viewProps","renderView","__decorate","observable","computed","observer"],"mappings":"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","file":"static/js/20.32895c44db8bbbbdbfce.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\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\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 \r\n \r\n \r\n \r\n {isAuthenticated || requiresAuthentication ? (\r\n \r\n \r\n \r\n\r\n {part.Product && (part.Qty === '' ? 0 : parseInt(part.Qty!, 10)) >= 1 ? (\r\n \r\n ) : (\r\n ''\r\n )}\r\n\r\n {part.Product ? (\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 \r\n {props.mfrCode}\r\n {part.Sku}\r\n {part.Description}{part.Qty === '' ? 0 : parseInt(part.Qty!, 10)}{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 \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 { ProductSearchCriteria, ProductSearchResult, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\r\nimport { searchByCriteriaAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/ProductsDataActions.g';\r\nimport * as _ from 'lodash';\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?: ProductSearchResult;\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}\r\n\r\nexport interface RowFeedback {\r\n message: string;\r\n success: boolean;\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 };\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 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 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 //todo\r\n const mfrCode = this.state.manufacturerCode;\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 promiseResult = await Promise.all(promises);\r\n\r\n let response = _.flatten(promiseResult); //promiseResult.reduce((arr, prom) => arr.concat(prom), []);\r\n response = (response[0] as unknown) as ProductSearchResult[];\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 parts?.forEach(part => {\r\n const code = mfrCode + (part.Sku || '');\r\n const responseProduct = response.find(p => p.ItemId === code);\r\n partproducts.push({ ...part, Product: responseProduct });\r\n });\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 });\r\n }\r\n }\r\n }\r\n\r\n private async getProducts(partIds: string[]): Promise {\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 priceColHeading,\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 priceColHeading,\r\n qtyColHeading,\r\n orderColHeading\r\n ];\r\n return (\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 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 })\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 }\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":""}