{"version":3,"file":"static/js/25.f7c87b8d2e7836c2fdc0.chunk.js","mappings":"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","sources":["webpack://Msdyn365.Commerce.Online/./src/modules/model-viewer/components/AriPartsListTable.component.tsx?cb62","webpack://Msdyn365.Commerce.Online/./src/modules/model-viewer/components/assemblyDropdown.component.tsx?9cc7","webpack://Msdyn365.Commerce.Online/./src/modules/model-viewer/components/AriHotspotImage.component.tsx?7aff","webpack://Msdyn365.Commerce.Online/./src/modules/model-viewer/model-viewer.tsx?52ad","webpack://Msdyn365.Commerce.Online/./src/modules/model-viewer/model-viewer.view.tsx?9691","webpack://Msdyn365.Commerce.Online/./node_modules/@msdyn365-commerce/bootloader/node_modules/core-js/modules/es.array.flat-map.js?a1b3","webpack://Msdyn365.Commerce.Online/./node_modules/@msdyn365-commerce/bootloader/node_modules/core-js/modules/es.array.unscopables.flat-map.js?8a78"],"sourcesContent":["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<IAriPArtsListTableProps> = 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            <div className={`${baseClassName}__list`}>\r\n                {!isMobile ? (\r\n                    <Table className={'list-view__table'}>\r\n                        <thead>\r\n                            <tr>\r\n                                {tableHeadings.map(th => (\r\n                                    <th key={th}>{th}</th>\r\n                                ))}\r\n                            </tr>\r\n                        </thead>\r\n                        <tbody>\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                                        <tr\r\n                                            key={part.PartId}\r\n                                            data-part={JSON.stringify(part)}\r\n                                            id={`${partIdPrefix}${part.Tag!}`}\r\n                                            className={classnames(\r\n                                                (selectedRow && selectedRow === part.Tag && `${baseClassName}__selected-row`) || '',\r\n                                                `${baseClassName}__parts-row`\r\n                                            )}\r\n                                        >\r\n                                            <td>\r\n                                                <button className={`${baseClassName}__ref-btn`} onClick={() => goToId(part.Tag!)}>\r\n                                                    {part.Tag}\r\n                                                </button>\r\n                                            </td>\r\n                                            <td>{partId || 'N/A'}</td>\r\n                                            <td>{description}</td>\r\n                                            {isAuthenticated || !requiresAuthentication ? (\r\n                                                <React.Fragment>\r\n                                                    <td>{currentInventory}</td>\r\n                                                    <td>{priceFormatter(part.Product?.BasePrice || 0)}</td>\r\n                                                    <td>{priceFormatter(part.Product?.Price || 0)}</td>\r\n                                                    {canAddToCart ? (\r\n                                                        <>\r\n                                                            <td>\r\n                                                                <input\r\n                                                                    className='quantity-input'\r\n                                                                    defaultValue='1'\r\n                                                                    type='number'\r\n                                                                    disabled={!part.Product}\r\n                                                                    min={1}\r\n                                                                    id={part.PartId}\r\n                                                                />\r\n                                                            </td>\r\n                                                            <td>\r\n                                                                {' '}\r\n                                                                <button\r\n                                                                    className={`${baseClassName}__ref-btn add-to-cart-btn`}\r\n                                                                    onClick={() => addPartToCart(part.Product!, part.PartId!)}\r\n                                                                >\r\n                                                                    {addToCartText}\r\n                                                                </button>\r\n                                                                <p className={`hide-status hide-status-${part.PartId}`}></p>\r\n                                                            </td>\r\n                                                        </>\r\n                                                    ) : (\r\n                                                        <td colSpan={2}>\r\n                                                            <button className={`${baseClassName}__ref-btn disabled`} disabled={true}>\r\n                                                                {unavailableText}\r\n                                                            </button>{' '}\r\n                                                        </td>\r\n                                                    )}\r\n                                                </React.Fragment>\r\n                                            ) : (\r\n                                                <React.Fragment>\r\n                                                    <td>{currentInventory}</td>\r\n                                                    <td>{priceFormatter(part.Product?.BasePrice || 0)}</td>\r\n                                                    <td colSpan={3}>\r\n                                                        <a href={signInUrl}>{loginToViewPricingText}</a>\r\n                                                    </td>\r\n                                                </React.Fragment>\r\n                                            )}\r\n                                        </tr>\r\n                                    );\r\n                                })}\r\n                        </tbody>\r\n                    </Table>\r\n                ) : (\r\n                    <ListGroup className='ari-model-viewer__parts-list'>\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                                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                                    <ListGroupItem key={part.PartId} active>\r\n                                        <ListGroupItemHeading className='ari-model-viewer__parts-list-heading'>\r\n                                            <span className='ari-model-viewer__parts-list-heading--part-id'>\r\n                                                {`${tableHeadings[0]}: `}\r\n                                                {part.Tag}\r\n                                            </span>\r\n                                            <span className='ari-model-viewer__parts-list-heading--part-number'>\r\n                                                {`${tableHeadings[1]}: `}\r\n                                                {`${partId}`}\r\n                                            </span>\r\n                                        </ListGroupItemHeading>\r\n                                        <ListGroupItemText>\r\n                                            <span className='ari-model-viewer__parts-list-part-desc'>\r\n                                                {`${tableHeadings[2]}: ${description}`}\r\n                                            </span>\r\n                                        </ListGroupItemText>\r\n                                        <ListGroupItemText>\r\n                                            {isAuthenticated || !requiresAuthentication ? (\r\n                                                <div className='ari-model-viewer__parts-list-item-details'>\r\n                                                    <span className='ari-model-viewer__parts-list-item-details--part-price'>{`${\r\n                                                        tableHeadings[4]\r\n                                                    }: ${priceFormatter(part.Product?.Price || 0)}`}</span>\r\n                                                    <span className='ari-model-viewer__parts-list-item-details--part-qty'>{`${tableHeadings[3]}: ${currentInventory}`}</span>\r\n                                                </div>\r\n                                            ) : (\r\n                                                <a href={signInUrl}>{loginToViewPricingText}</a>\r\n                                            )}\r\n                                        </ListGroupItemText>\r\n                                        <ListGroupItemText>\r\n                                            {isAuthenticated || !requiresAuthentication ? (\r\n                                                <div className='quantity-btns'>\r\n                                                    {canAddToCart ? (\r\n                                                        <div>\r\n                                                            <input\r\n                                                                className='quantity-input'\r\n                                                                defaultValue='1'\r\n                                                                type='number'\r\n                                                                disabled={!part.Product}\r\n                                                                min={1}\r\n                                                                id={part.PartId}\r\n                                                            />\r\n\r\n                                                            <button\r\n                                                                className={`${baseClassName}__ref-btn addtocart`}\r\n                                                                onClick={() => addPartToCart(part.Product!, part.PartId!)}\r\n                                                            >\r\n                                                                {addToCartText}\r\n                                                            </button>\r\n                                                            <p className={`hide-status-${part.PartId}`}></p>\r\n                                                        </div>\r\n                                                    ) : (\r\n                                                        <button className={`${baseClassName}__ref-btn addtocart disabled`} disabled={true}>\r\n                                                            {unavailableText}\r\n                                                        </button>\r\n                                                    )}\r\n                                                </div>\r\n                                            ) : (\r\n                                                ''\r\n                                            )}\r\n                                        </ListGroupItemText>\r\n                                    </ListGroupItem>\r\n                                );\r\n                            })}\r\n                    </ListGroup>\r\n                )}\r\n                {yPosition <= 0 && (\r\n                    <div className='scroll-down-chevron' onClick={e => scrollDownClickHandler(`${baseClassName}__list`)}>\r\n                        scroll down\r\n                    </div>\r\n                )}\r\n            </div>\r\n            <div\r\n                id={`${selectedPartIdName}`}\r\n                className={`${selectedPartIdName} ${isDrawerOpen ? `${selectedPartIdName}--opened` : `${selectedPartIdName}--closed`}`}\r\n            >\r\n                <div className={`${selectedPartIdName}-table-wrapper`}>\r\n                    <Table className={`${selectedPartIdName}-table`}>\r\n                        <thead>\r\n                            <tr>\r\n                                {tableHeadings.map(th => (\r\n                                    <th key={th}>{th}</th>\r\n                                ))}\r\n                            </tr>\r\n                        </thead>\r\n                        <tbody id={`${selectedPartIdName}-table--body`}></tbody>\r\n                    </Table>\r\n                    <div className={`${selectedPartIdName}-close-drawer`} onClick={closePartDrawer}>\r\n                        X\r\n                    </div>\r\n                </div>\r\n            </div>\r\n        </>\r\n    );\r\n};\r\n","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<IAssemblyDropdownComponent> = ({\r\n    baseClassName,\r\n    assemblyData,\r\n    onAssemblySelect,\r\n    defaultOptionString\r\n}) => {\r\n    const handleAssemblySelect = (e: React.ChangeEvent<HTMLSelectElement>) => {\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        <div className={`${baseClassName}__dropdown`}>\r\n            <select className={`${baseClassName}__dropdown-select`} onChange={handleAssemblySelect}>\r\n                <option value={'0'}>{defaultOptionString}</option>\r\n                {assemblyData.map(assembly => (\r\n                    <option key={assembly.Id} value={assembly.Id}>\r\n                        {assembly.Name}\r\n                    </option>\r\n                ))}\r\n            </select>\r\n        </div>\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<ReactZoomPanPinchRef>;\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<IAriHotspotImageProps> = 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<boolean>(false);\r\n    const [shouldRender, setShouldRender] = React.useState<boolean>(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            <div className={`${baseClassName}__tools ${isMobileToolsClassName}`}>\r\n                <button className={`${baseClassName}__tools-button ${baseClassName}__tool-button--zoom-in`} onClick={() => zoomIn()}>\r\n                    {zoomInButtonText}\r\n                </button>\r\n                <button className={`${baseClassName}__tools-button ${baseClassName}__tool-button--zoom-out`} onClick={() => zoomOut()}>\r\n                    {zoomOutButtonText}\r\n                </button>\r\n                <button className={`${baseClassName}__tools-button ${baseClassName}__tool-button--reset`} onClick={() => resetTransform()}>\r\n                    {resetButtonText}\r\n                </button>\r\n                <button className={`${baseClassName}__tools-button ${baseClassName}__tool-button--center`} onClick={() => centerView()}>\r\n                    {centerButtonText}\r\n                </button>\r\n            </div>\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        <TransformWrapper\r\n            initialPositionX={initialPositionX}\r\n            initialScale={initialScale}\r\n            limitToBounds={true}\r\n            ref={transformRef}\r\n            minScale={0}\r\n            wheel={{ wheelDisabled: true }}\r\n        >\r\n            {({ zoomIn, zoomOut, resetTransform, centerView, ...rest }) => (\r\n                <React.Fragment>\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                            <TransformComponent wrapperClass={`${baseClassName}__transform-wrapper ${isMobileTransformWrapperClassName}`}>\r\n                                <div className={`${baseClassName}__zoom-wrapper`}>\r\n                                    {!mapUsed ? (\r\n                                        <div className={`${baseClassName}__help-text-wrapper`} onClick={handleHelperWrapperClick}>\r\n                                            <span className={`${baseClassName}__help-text`}>{hotspotUsageHelpText}</span>\r\n                                        </div>\r\n                                    ) : null}\r\n                                    <img src={assemblyDetailState.ImageUrl} alt={assemblyDetailState.Name} />\r\n                                    <div className={`${baseClassName}__zoom-wrapper--hotspots`}>\r\n                                        {!isMobile &&\r\n                                            assemblyDetailState.HotSpots &&\r\n                                            assemblyDetailState.HotSpots.map(hs => (\r\n                                                <span\r\n                                                    key={`${assemblyDetailState?.AssemblyId}-${hs.Tag}`}\r\n                                                    style={generateHotspotStyle(hs)}\r\n                                                    className={`${baseClassName}__hotspot`}\r\n                                                    onClick={() => goToPart(hs.Tag!, selectedPartIdName)}\r\n                                                    id={`${tagIdPrefix}${hs.Tag}`}\r\n                                                />\r\n                                            ))}\r\n                                    </div>\r\n                                </div>\r\n                            </TransformComponent>\r\n                        </>\r\n                    ) : (\r\n                        <>\r\n                            {renderHeader(null)}\r\n                            <TransformComponent wrapperClass={`${baseClassName}__image-placeholder`}>\r\n                                <div />\r\n                            </TransformComponent>\r\n                            <div className={`${baseClassName}__image-placeholder`}>\r\n                                <span>{assemblyOptionsPlaceholderText}</span>\r\n                            </div>\r\n                        </>\r\n                    )}\r\n                </React.Fragment>\r\n            )}\r\n        </TransformWrapper>\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\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\r\n/**\r\n * Props for the view component\r\n */\r\nexport interface IModelViewerViewProps extends IModelViewerProps<IModelViewerData> {\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<IModelViewerProps<IModelViewerData>>}\r\n */\r\n@observer\r\nclass ModelViewer extends React.PureComponent<IModelViewerProps<IModelViewerData>, 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<ReactZoomPanPinchRef>();\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<IModelViewerData>) {\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 <div />;\r\n        } else {\r\n            return (\r\n                <div className={`${this._baseClassName}__header ${isMobileClassName}`}>\r\n                    {assemblyDetail ? (\r\n                        <div className={`${this._baseClassName}__header--title`}>\r\n                            <h3>\r\n                                {selectedOptionPrefix} {assemblyDetail?.Name}\r\n                            </h3>\r\n                        </div>\r\n                    ) : null}\r\n                    <div className={`${this._baseClassName}__header--details`}>\r\n                        <AssemblyDropdownComponent\r\n                            baseClassName={this._baseClassName}\r\n                            assemblyData={result.ariAssemblyData}\r\n                            onAssemblySelect={this.getAssemblyDetails}\r\n                            defaultOptionString={defaultAssemblyOption}\r\n                        />\r\n                        {renderToolButtonRow}\r\n                    </div>\r\n                </div>\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                <div className={`${this._baseClassName}-title-wrapper`}>\r\n                    <h1 className={`${this._baseClassName}-title-wrapper__title`}>{`${\r\n                        this.state.ariBrandName ? `${this.state.ariBrandName} - ` : ''\r\n                    }${firstAssembly.ParentName}`}</h1>\r\n                </div>\r\n            );\r\n        }\r\n        return null;\r\n    }\r\n\r\n    private async _getManufacturerCodeName(brandCode: string): Promise<void> {\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        const mfrCode = this.state.manufacturerCode;\r\n        const baseParts = this.state.assemblyDetail?.Parts;\r\n\r\n        if (!baseParts) {\r\n            return;\r\n        }\r\n\r\n        const mfrCodes: string[] = [];\r\n\r\n        if (mfrCode === 'HRT' || mfrCode === 'TTI' || mfrCode === 'HOM') {\r\n            mfrCodes.push(...['HOM', 'HRT', 'TTI'].filter(c => c !== mfrCode));\r\n        }\r\n        mfrCodes.unshift(mfrCode);\r\n        const partIds: string[] = baseParts.flatMap(p => {\r\n            return mfrCodes.map(m => {\r\n                return `${m}${p.Sku}`;\r\n            });\r\n        });\r\n\r\n        if (partIds && Array.isArray(partIds)) {\r\n            const promises = await this.getProducts(partIds);\r\n            const response = _.flatten(promises);\r\n            const partproducts: IAriServiceAssemblyPartProductCombinations[] = [];\r\n            const parts = baseParts?.slice() as IAriServiceAssemblyPartProductCombinations[];\r\n\r\n            parts?.forEach(part => {\r\n                const codes = mfrCodes.map(m => `${m}${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                    const foundCode = codes.find(c => p.ItemId === c || (supersededId && supersededId === c));\r\n                    return foundCode ? p : null;\r\n                    // return p.ItemId === code || (supersededId && supersededId === code);\r\n                });\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                    gotProductData: true\r\n                });\r\n            }\r\n        }\r\n    }\r\n\r\n    private async getProducts(partIds: string[]): Promise<IProductSearchResultWithState[]> {\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                    if (partresponse.productResults[j].ItemId?.substring(3) === this.state.assemblyDetail?.Parts[i].Sku) {\r\n                        found = true;\r\n                        break;\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        return partresponse.productResults.concat(missingProducts);\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            <AriHotspotImage\r\n                renderHeader={this.renderAssemblyHeader}\r\n                assemblyDetailState={this.state.assemblyDetail}\r\n                resources={resources}\r\n                baseClassName={this._baseClassName}\r\n                // ImageUrl={ImageUrl}\r\n                // HotSpots={HotSpots}\r\n                // Name={Name}\r\n                transformRef={this._transformRef}\r\n                goToPart={this.goToPart}\r\n                tagIdPrefix={this._tagIdPrefix}\r\n                isMobile={this.isMobile}\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\r\n        return this.state.gotProductData ? (\r\n            <AriPartsListTableComponent\r\n                parts={Parts || []}\r\n                tableHeadings={tableHeadings}\r\n                baseClassName={_baseClassName}\r\n                goToId={goToId}\r\n                addPartToCart={addPartToCart}\r\n                partIdPrefix={_partIdPrefix}\r\n                selectedRow={selectedRow}\r\n                requiresAuthentication={this.props.config.onlyShowPriceWhenAuthenticated || false}\r\n                isAuthenticated={isAuthenticated}\r\n                loginToViewPricingText={loginToViewPricingText}\r\n                signInUrl={signInUrl || ''}\r\n                isMobile={this.isMobile}\r\n                isDrawerOpen={isDrawerOpen}\r\n                closePartDrawer={closePartDrawer}\r\n                addToCartText={addToCartText}\r\n                unavailableText={unavailableText}\r\n                priceFormatter={formatCurrency}\r\n                mfrCode={this.state.manufacturerCode}\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<HTMLSpanElement>(`#${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, 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<HTMLTableRowElement>(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<void> {\r\n        let lastChangedFrame = 0;\r\n        let lastX = window.scrollX;\r\n        let lastY = window.scrollY;\r\n        return new Promise<void>(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","/*!\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        <div className='row'>\r\n            {props.heading}\r\n            <div className={`${props.baseClassName}__image-wrapper ${isMobileClassName}`}>{props.hotspotImage}</div>\r\n            {props.partsList}\r\n        </div>\r\n    );\r\n};\r\n","'use strict';\nvar $ = require('../internals/export');\nvar flattenIntoArray = require('../internals/flatten-into-array');\nvar aCallable = require('../internals/a-callable');\nvar toObject = require('../internals/to-object');\nvar lengthOfArrayLike = require('../internals/length-of-array-like');\nvar arraySpeciesCreate = require('../internals/array-species-create');\n\n// `Array.prototype.flatMap` method\n// https://tc39.es/ecma262/#sec-array.prototype.flatmap\n$({ target: 'Array', proto: true }, {\n  flatMap: function flatMap(callbackfn /* , thisArg */) {\n    var O = toObject(this);\n    var sourceLen = lengthOfArrayLike(O);\n    var A;\n    aCallable(callbackfn);\n    A = arraySpeciesCreate(O, 0);\n    A.length = flattenIntoArray(A, O, O, sourceLen, 0, 1, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n    return A;\n  }\n});\n","'use strict';\n// this method was added to unscopables after implementation\n// in popular engines, so it's moved to a separate module\nvar addToUnscopables = require('../internals/add-to-unscopables');\n\n// https://tc39.es/ecma262/#sec-array.prototype-@@unscopables\naddToUnscopables('flatMap');\n"],"names":["AriPartsListTableComponent","props","tableHeadings","parts","baseClassName","goToId","addPartToCart","partIdPrefix","selectedRow","isAuthenticated","requiresAuthentication","loginToViewPricingText","signInUrl","isMobile","isDrawerOpen","unavailableText","addToCartText","closePartDrawer","priceFormatter","yPosition","setYPosition","React","window","removeEventListener","pageYOffset","addEventListener","passive","selectedPartIdName","className","ListGroup","map","part","_part$Product6","_part$Product7","_part$Product8","product","Product","partId","ItemId","description","Name","Description","currentInvString","getExtensionPropertyValueByKey","ExtensionProperties","CommercePropertyValueEnum","string","currentInventory","parseInt","isNaN","oosUpperBound","oosUpperBoundLimit","canAddToCart","isEligible","ListGroupItem","key","PartId","active","ListGroupItemHeading","Tag","ListGroupItemText","Price","href","defaultValue","type","disabled","min","id","onClick","Table","th","_part$Product","_part$Product2","_part$Product3","_part$Product4","_part$Product5","JSON","stringify","classnames","BasePrice","colSpan","e","element","document","getElementById","scrollTo","getBoundingClientRect","top","scrollDownClickHandler","AssemblyDropdownComponent","_ref","assemblyData","onAssemblySelect","defaultOptionString","onChange","target","value","assembly","Id","AriHotspotImage","transformRef","resources","centerButtonText","zoomInButtonText","zoomOutButtonText","resetButtonText","hotspotUsageHelpText","assemblyOptionsPlaceholderText","goToPart","tagIdPrefix","renderHeader","assemblyDetailState","mapUsed","setMapUsed","shouldRender","setShouldRender","setTimeout","generateHotspotStyle","hs","_hs$TopLeft","_hs$BottomRight","cssProperties","TopLeft","X","Y","left","BottomRight","height","width","handleHelperWrapperClick","initialScale","initialPositionX","isMobileToolsClassName","isMobileTransformWrapperClassName","TransformWrapper","limitToBounds","ref","minScale","wheel","wheelDisabled","zoomIn","zoomOut","resetTransform","centerView","_objectWithoutProperties","_excluded","renderToolButtonRow","TransformComponent","wrapperClass","src","ImageUrl","alt","HotSpots","AssemblyId","style","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","isMobileClassName","ariAssemblyData","renderTitle","_result$ariAssemblyDa","length","firstAssembly","ParentName","async","manufacturerCodes","response","getManufacturerBrandNameAsync","callerContext","actionContext","setState","ManufacturerCode","err","console","error","assemblyId","modelId","getAriAssemblyDetailsAsync","loadProductMappings","_this$state$assemblyD","mfrCode","baseParts","Parts","mfrCodes","push","filter","c","unshift","partIds","flatMap","p","m","Sku","Array","isArray","promises","getProducts","_flatten","partproducts","slice","forEach","codes","responseProduct","find","supersededIdRes","SupersededId","supersededId","_objectSpread","stateAssemblyCopy","_cart$cart$ShippingAd","_this$state$assemblyD2","cart","cartId","addressId","ShippingAddress","RecordId","input","GetPartStateInput","channel","partresponse","getPartStateAction","missingProducts","i","_this$state$assemblyD3","found","j","productResults","_partresponse$product","_this$state$assemblyD4","substring","_this$state$assemblyD5","_this$state$assemblyD6","_this$state$assemblyD7","_this$state$assemblyD8","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","hotspotImage","partsList","heading","renderView","__decorate","observable","computed","observer","$","flattenIntoArray","aCallable","toObject","lengthOfArrayLike","arraySpeciesCreate","proto","callbackfn","A","O","sourceLen","arguments","addToUnscopables"],"sourceRoot":""}