{"version":3,"file":"static/js/12.59b44276596c753de128.chunk.js","mappings":"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","sources":["webpack://Msdyn365.Commerce.Online/./src/modules/quotation-list/components/quotation-list.tsx?af62","webpack://Msdyn365.Commerce.Online/./src/modules/quotation-list/components/orderTemplateList-status-message.tsx?1e05","webpack://Msdyn365.Commerce.Online/./src/modules/quotation-list/components/create-order-template.tsx?665c","webpack://Msdyn365.Commerce.Online/./src/modules/quotation-list/quotation-list.props.autogenerated.ts?8de7","webpack://Msdyn365.Commerce.Online/./src/modules/quotation-list/quotation-list.tsx?a75e","webpack://Msdyn365.Commerce.Online/./src/modules/quotation-list/quotation-list.view.tsx?cc45","webpack://Msdyn365.Commerce.Online/./src/modules/quotation/components/add-order-template-to-cart.component.tsx?9a91","webpack://Msdyn365.Commerce.Online/./src/modules/quotation/components/bulk-actions.tsx?fd67","webpack://Msdyn365.Commerce.Online/./src/modules/quotation/components/common/item-added-to-cart-dialog.component.tsx?d169","webpack://Msdyn365.Commerce.Online/./src/modules/quotation/components/add-line/spinner.tsx?9c11","webpack://Msdyn365.Commerce.Online/./src/modules/quotation/components/add-line/add-line.tsx?e326","webpack://Msdyn365.Commerce.Online/./src/modules/quotation/components/add-line/dropdown.tsx?5620","webpack://Msdyn365.Commerce.Online/./src/modules/quotation/components/add-line/not-found.tsx?cbbf","webpack://Msdyn365.Commerce.Online/./src/modules/quotation/components/common/quotation-quantity.tsx?8980","webpack://Msdyn365.Commerce.Online/./src/modules/quotation/components/add-line/product-configuration.tsx?7a76","webpack://Msdyn365.Commerce.Online/./src/modules/quotation/components/add-line/product-list.tsx?ce9a","webpack://Msdyn365.Commerce.Online/./src/modules/quotation/components/quotation-actions.tsx?956b","webpack://Msdyn365.Commerce.Online/./src/modules/quotation/components/quotation-lines.tsx?e9f8","webpack://Msdyn365.Commerce.Online/./src/modules/quotation/components/quotation-lines-status-message.tsx?ac7f","webpack://Msdyn365.Commerce.Online/./src/modules/quotation/components/quotation-table-heading.tsx?9da4","webpack://Msdyn365.Commerce.Online/./src/modules/quotation/quotation.tsx?1bd1","webpack://Msdyn365.Commerce.Online/./src/modules/quotation/quotation.view.tsx?2130","webpack://Msdyn365.Commerce.Online/./src/modules/active-image-utilities/active-product.tsx?69b2","webpack://Msdyn365.Commerce.Online/./src/modules/active-image-utilities/additional-content.tsx?6946","webpack://Msdyn365.Commerce.Online/./src/modules/active-image-utilities/image-mapper.tsx?dd86","webpack://Msdyn365.Commerce.Online/./src/modules/active-image/active-image.tsx?00d3","webpack://Msdyn365.Commerce.Online/./src/modules/active-image/active-image.view.tsx?a935","webpack://Msdyn365.Commerce.Online/./src/actions/submit-user-review.ts?ac78","webpack://Msdyn365.Commerce.Online/./src/actions/inputs/submit-user-review-input.ts?3afb","webpack://Msdyn365.Commerce.Online/./src/common/review-modal.tsx?54a9","webpack://Msdyn365.Commerce.Online/./src/common/rnrInterface.ts?f761","webpack://Msdyn365.Commerce.Online/./src/modules/ratings-histogram/component/components.tsx?f324","webpack://Msdyn365.Commerce.Online/./src/modules/ratings-histogram/ratings-histogram.tsx?f6bc","webpack://Msdyn365.Commerce.Online/./src/modules/ratings-histogram/ratings-histogram.view.tsx?5bff","webpack://Msdyn365.Commerce.Online/./src/actions/report-review-concern.ts?bf43","webpack://Msdyn365.Commerce.Online/./src/actions/submit-helpfulness-vote.ts?a8ab","webpack://Msdyn365.Commerce.Online/./src/actions/inputs/report-review-concern-input.ts?b071","webpack://Msdyn365.Commerce.Online/./src/modules/reviews-list/components/components.tsx?033b","webpack://Msdyn365.Commerce.Online/./src/modules/reviews-list/components/report-review-modal.tsx?53d3","webpack://Msdyn365.Commerce.Online/./src/modules/reviews-list/components/review-card.tsx?6bbd","webpack://Msdyn365.Commerce.Online/./src/actions/inputs/submit-helpfulness-vote-input.ts?07aa","webpack://Msdyn365.Commerce.Online/./src/modules/reviews-list/reviews-list.tsx?37e8","webpack://Msdyn365.Commerce.Online/./src/modules/reviews-list/reviews-list.view.tsx?0e4a","webpack://Msdyn365.Commerce.Online/./src/modules/write-review/components/components.tsx?3575","webpack://Msdyn365.Commerce.Online/./src/modules/write-review/write-review.tsx?9afc","webpack://Msdyn365.Commerce.Online/./src/modules/write-review/write-review.view.tsx?b867","webpack://Msdyn365.Commerce.Online/./src/search-state.ts?dd10","webpack://Msdyn365.Commerce.Online/./src/modules/search/actions/get-auto-suggest-suggestions.ts?4735","webpack://Msdyn365.Commerce.Online/./src/modules/search/components/search.categorysuggest.tsx?c65d","webpack://Msdyn365.Commerce.Online/./src/modules/search/components/search.form.tsx?25a5","webpack://Msdyn365.Commerce.Online/./src/modules/search/components/search.keywordsuggest.tsx?297c","webpack://Msdyn365.Commerce.Online/./src/modules/search/components/search.label.tsx?0c17","webpack://Msdyn365.Commerce.Online/./src/modules/search/components/search.productsuggest.tsx?2af9","webpack://Msdyn365.Commerce.Online/./src/modules/search/search.tsx?72fb","webpack://Msdyn365.Commerce.Online/./src/modules/search/search.view.tsx?1505","webpack://Msdyn365.Commerce.Online/./src/modules/social-share-item/social-share-item.tsx?bbcb","webpack://Msdyn365.Commerce.Online/./src/modules/social-share-item/social-share-item.view.tsx?2d3e","webpack://Msdyn365.Commerce.Online/./src/modules/video-player/components/additional-content.tsx?b368","webpack://Msdyn365.Commerce.Online/./src/modules/video-player/video-player.tsx?53e5","webpack://Msdyn365.Commerce.Online/./src/modules/video-player/video-player.view.tsx?fedb"],"sourcesContent":["/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\n/* eslint-disable no-duplicate-imports */\r\nimport { ILinesAddedToCartDialogResources } from '@msdyn365-commerce/components';\r\nimport { AddOrderTemplateToCartComponent } from '../../quotation/components';\r\nimport { getUrlSync, ICoreContext, IImageSettings, ITelemetry } from '@msdyn365-commerce/core'; //Image\r\nimport { ProductList } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\r\nimport { OrderTemplate, OrderTemplateLine } from '@msdyn365-commerce-modules/retail-actions'; //getFallbackImageUrl, getProductUrlSync,\r\nimport { Alert, Button, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\r\nimport * as React from 'react';\r\n\r\nimport { IOrderTemplateActionMessageState } from '../quotation-list';\r\n\r\nexport interface ISingleOrderTemplateProps extends ProductList {\r\n orderTemplateState: IOrderTemplateActionMessageState;\r\n name?: string;\r\n orderTemplate: OrderTemplate;\r\n context: ICoreContext;\r\n imageSettings?: IImageSettings;\r\n enableImageProductLink?: boolean;\r\n removeFromOrderTemplateListText: string;\r\n addToBagText: string;\r\n index: number;\r\n itemKey: string;\r\n telemetry: ITelemetry;\r\n moduleId: string;\r\n moduleTypeName: string;\r\n handlers: {\r\n onRemoveOrderTemplate(id: string): void | undefined;\r\n onDismiss(): void;\r\n };\r\n resources: {\r\n closeWindowButtonText: string;\r\n addToCartFailureMessage: string;\r\n addToCartSuccessMessage: string;\r\n addToCartProcessMessage: string;\r\n linesAddedToCartDialogResources: ILinesAddedToCartDialogResources;\r\n };\r\n telemetryContent?: ITelemetryContent;\r\n}\r\n\r\nexport interface ISingleOrderTemplateViewProps {\r\n key: string;\r\n orderTemplateImage: React.ReactNode;\r\n addToCartButton?: React.ReactNode;\r\n removeButton?: React.ReactNode;\r\n orderTemplateStatusMessage?: React.ReactNode;\r\n orderTemplateName?: React.ReactNode;\r\n orderTemplateAriaLabel?: string;\r\n orderTemplateHeaderDivider?: React.ReactNode;\r\n}\r\n\r\nconst _removeItemFromOrderTemplateList = (props: ISingleOrderTemplateProps): void => {\r\n const { onRemoveOrderTemplate } = props.handlers;\r\n const { itemKey } = props;\r\n\r\n onRemoveOrderTemplate && itemKey && onRemoveOrderTemplate(itemKey);\r\n};\r\n\r\nconst OrderTemplateActions = {\r\n removeOrderTemplate: _removeItemFromOrderTemplateList\r\n};\r\n\r\n/**\r\n * Remove order template action.\r\n * @param input -Single order template props.\r\n * @returns Set remove order template.\r\n */\r\nconst removeOrderTemplateActionHandler = (input: ISingleOrderTemplateProps) => () => {\r\n OrderTemplateActions.removeOrderTemplate(input);\r\n};\r\n\r\nexport const OrderTemplateRender = (input: ISingleOrderTemplateProps): ISingleOrderTemplateViewProps | null => {\r\n const {\r\n Id,\r\n orderTemplate,\r\n removeFromOrderTemplateListText,\r\n orderTemplateState,\r\n handlers,\r\n name,\r\n imageSettings,\r\n context,\r\n telemetryContent,\r\n enableImageProductLink\r\n } = input;\r\n\r\n if (!Id) {\r\n return null;\r\n }\r\n\r\n const _getOrderTemplatePageUrl = (): string => {\r\n const url = getUrlSync('ordertemplate', context.actionContext) ?? '';\r\n const separator = url.includes('?') ? '&' : '?';\r\n if (Id) {\r\n return `${url}${separator}id=${Id}`;\r\n }\r\n return '';\r\n };\r\n\r\n const { onDismiss } = handlers;\r\n\r\n return {\r\n key: `${Id}-template`,\r\n orderTemplateImage: _renderOrderTemplateImages(context, orderTemplate.orderTemplateLines, imageSettings, enableImageProductLink),\r\n orderTemplateAriaLabel: _renderAriaLabel(input),\r\n orderTemplateName: (\r\n
\r\n
\r\n \r\n {name}\r\n \r\n
\r\n
{orderTemplate.totalLines} line items
\r\n
\r\n
\r\n ),\r\n addToCartButton: (\r\n
\r\n \r\n
\r\n ),\r\n removeButton: (\r\n \r\n ),\r\n orderTemplateStatusMessage: orderTemplateState && orderTemplateState.isOpen && orderTemplateState.userMessage && (\r\n
\r\n \r\n {orderTemplateState.userMessage}\r\n \r\n
\r\n )\r\n };\r\n};\r\n\r\n/**\r\n * On image click handler.\r\n * @param productUrl -Product url value.\r\n * @returns Assign window location.\r\n */\r\n// const onClickHandler = (productUrl: string) => () => {\r\n// window.location.assign(productUrl);\r\n// };\r\n\r\nconst _renderOrderTemplateImages = (\r\n context: ICoreContext,\r\n orderTemplateLines?: OrderTemplateLine[],\r\n imageSettings?: IImageSettings,\r\n enableImageProductLink?: boolean\r\n): JSX.Element | null => {\r\n // const defaultImageSettings: IImageSettings = {\r\n // viewports: {\r\n // xs: { q: 'w=140&h=140&m=6', w: 0, h: 0 },\r\n // lg: { q: 'w=140&h=140&m=6', w: 0, h: 0 },\r\n // xl: { q: 'w=140&h=140&m=6', w: 0, h: 0 }\r\n // },\r\n // lazyload: true\r\n // };\r\n\r\n if (orderTemplateLines) {\r\n const count = orderTemplateLines.length < 4 ? orderTemplateLines.length : 4;\r\n\r\n return (\r\n
\r\n {orderTemplateLines?.slice(0, count).map(line => {\r\n // const productUrl = line.fullProduct\r\n // ? getProductUrlSync(line.fullProduct.ProductDetails, context.actionContext, undefined)\r\n // : '';\r\n\r\n return (\r\n <>\r\n // \r\n );\r\n })}\r\n
\r\n );\r\n }\r\n return
;\r\n};\r\n\r\nconst _renderAriaLabel = (props: ISingleOrderTemplateProps): string => {\r\n const { name } = props;\r\n return `${name}`;\r\n};\r\n","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\n/* eslint-disable no-duplicate-imports */\r\nimport classnames from 'classnames';\r\nimport * as React from 'react';\r\n\r\nimport { orderTemplateListStatus } from '../quotation-list';\r\n\r\nexport interface IOrderTemplateListStatusMessageProps {\r\n className?: string;\r\n errorType: orderTemplateListStatus;\r\n text?: string;\r\n}\r\n\r\nexport const OrderTemplateListStatusMessage: React.FC = ({ className, errorType, text }) => {\r\n switch (errorType) {\r\n case 'EMPTY':\r\n return

{text}

;\r\n case 'FAILED':\r\n return

{text}

;\r\n case 'LOADING':\r\n default:\r\n return

{text}

;\r\n }\r\n};\r\n","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\n/* eslint-disable no-duplicate-imports */\r\nimport { IOrderTemplateNameDialogResources, OrderTemplateNameDialog } from '@msdyn365-commerce/components';\r\nimport { IComponentProps } from '@msdyn365-commerce/core';\r\nimport React, { useState } from 'react';\r\n\r\nconst modalCloseButtonReference: React.RefObject = React.createRef();\r\n\r\n/**\r\n * The Create Order Template Button Props.\r\n */\r\nexport interface ICreateOrderTemplateButtonProps extends IComponentProps {\r\n /**\r\n * The label for create order template.\r\n */\r\n createOrderTemplateText: string;\r\n\r\n /**\r\n * The create order template dialog resources.\r\n */\r\n createOrderTemplateDialogResources: IOrderTemplateNameDialogResources;\r\n\r\n /**\r\n * The delegate to fire when dialog captured any user entry.\r\n */\r\n onOrderTemplateCreated(): Promise;\r\n}\r\n\r\nconst CreateOrderTemplateButton: React.FC = props => {\r\n const onCancelHandler = React.useCallback(() => {\r\n return;\r\n }, []);\r\n const [isCreateOrderTemplateDialogOpen, setOrderTemplateNameDialogOpen] = useState(false);\r\n const onCreateButtonClick = React.useCallback(() => {\r\n setOrderTemplateNameDialogOpen(true);\r\n }, []);\r\n\r\n return (\r\n <>\r\n \r\n {props.createOrderTemplateText}\r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport default CreateOrderTemplateButton;\r\n","/**\r\n * Copyright (c) Microsoft Corporation\r\n * All rights reserved. See License.txt in the project root for license information.\r\n * IQuotationList contentModule Interface Properties\r\n * THIS FILE IS AUTO-GENERATED - MANUAL MODIFICATIONS WILL BE LOST\r\n */\r\n\r\nimport * as Msdyn365 from '@msdyn365-commerce/core';\r\n\r\nexport interface IQuotationListConfig extends Msdyn365.IModuleConfig {\r\n heading?: IHeadingData;\r\n imageSettings?: Msdyn365.IImageSettings;\r\n enableImageProductLink?: boolean;\r\n className?: string;\r\n clientRender?: boolean;\r\n}\r\n\r\nexport interface IQuotationListResources {\r\n emptyOrderTemplateText: string;\r\n unableToGetOrderTemplateList: string;\r\n removeButtonText: string;\r\n addToBagButtonText: string;\r\n createNewTemplateButtonText: string;\r\n orderTemplateCreatedSuccessText: string;\r\n orderTemplateListTitle: string;\r\n orderTemplateCreationFailedText: string;\r\n deleteOrderTemplateFailedText: string;\r\n closeWindowButtonText: string;\r\n addToCartFailureMessage: string;\r\n addToCartSuccessMessage: string;\r\n addToCartProcessMessage: string;\r\n viewCartButtonText: string;\r\n orderTemplateCloseButtonText: string;\r\n linesAddedToCartHeaderItemsOneText: string;\r\n linesAddedToCartHeaderLinesOneText: string;\r\n linesAddedToCartHeaderLinesFormatText: string;\r\n linesAddedToCartHeaderMessageText: string;\r\n createOrderTemplateHeader: string;\r\n orderTemplateTitle: string;\r\n orderTemplateNameAriaLabel: string;\r\n createOrderTemplateDescription: string;\r\n createOrderTemplateButtonText: string;\r\n cancelNewOrderTemplateCreationButtonText: string;\r\n defaultOrderTemplateName: string;\r\n addToOrderTemplateDialogWarningV2: string;\r\n}\r\n\r\nexport const enum HeadingTag {\r\n h1 = 'h1',\r\n h2 = 'h2',\r\n h3 = 'h3',\r\n h4 = 'h4',\r\n h5 = 'h5',\r\n h6 = 'h6'\r\n}\r\n\r\nexport interface IHeadingData {\r\n text: string;\r\n tag?: HeadingTag;\r\n}\r\n\r\nexport interface IQuotationListProps extends Msdyn365.IModule {\r\n resources: IQuotationListResources;\r\n config: IQuotationListConfig;\r\n}\r\n","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\n/* eslint-disable no-duplicate-imports */\r\nimport { IOrderTemplateNameDialogResources } from '@msdyn365-commerce/components';\r\nimport { deleteAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/ProductListsDataActions.g';\r\nimport { OrderTemplate } from '@msdyn365-commerce-modules/retail-actions';\r\nimport { Alert, Heading, IModuleProps, INodeProps } from '@msdyn365-commerce-modules/utilities';\r\nimport classnames from 'classnames';\r\nimport { observer } from 'mobx-react';\r\nimport * as React from 'react';\r\n\r\nimport {\r\n ISingleOrderTemplateProps,\r\n ISingleOrderTemplateViewProps,\r\n OrderTemplateListStatusMessage,\r\n OrderTemplateRender\r\n} from './components';\r\nimport CreateNewTemplateButtonComponent from './components/create-order-template';\r\nimport { IQuotationListData } from './quotation-list.data';\r\nimport { HeadingTag, IQuotationListProps, IQuotationListResources } from './quotation-list.props.autogenerated';\r\n\r\nexport interface IOrderTemplateActionMessageState {\r\n itemKey: string;\r\n userMessage: string;\r\n statusCssString: string;\r\n messageGlyph: string;\r\n isOpen: boolean;\r\n headerStatusMessage: string;\r\n}\r\n\r\nexport type orderTemplateListStatus = 'LOADING' | 'SUCCESS' | 'FAILED' | 'EMPTY';\r\n\r\nexport interface IOrderTemplateListViewProps extends IQuotationListProps {\r\n OrderTemplateList: IModuleProps;\r\n status?: orderTemplateListStatus;\r\n statusMessage?: React.ReactNode;\r\n heading?: React.ReactNode;\r\n OrderTemplates?: INodeProps;\r\n OrderTemplate?: INodeProps;\r\n orderTemplates?: ISingleOrderTemplateViewProps[];\r\n createOrderTemplateButton?: React.ReactNode;\r\n templateHeaderStatusMessage?: React.ReactNode;\r\n}\r\n\r\n/**\r\n *\r\n * OrderTemplateList component.\r\n * @extends {React.PureComponent, IOrderTemplateListActionMessageState>}\r\n */\r\n@observer\r\nclass OrderTemplateList extends React.Component, IOrderTemplateActionMessageState> {\r\n constructor(props: IQuotationListProps) {\r\n super(props);\r\n this.state = {\r\n itemKey: '',\r\n userMessage: '',\r\n headerStatusMessage: '',\r\n statusCssString: 'success',\r\n messageGlyph: 'fas fa-check',\r\n isOpen: false\r\n };\r\n }\r\n\r\n public async componentDidMount(): Promise {\r\n this.setState({});\r\n }\r\n\r\n public shouldComponentUpdate(nextProps: IQuotationListProps, nextState: IOrderTemplateActionMessageState): boolean {\r\n if (this.state === nextState && this.props.data === nextProps.data) {\r\n return false;\r\n }\r\n return true;\r\n }\r\n\r\n public render(): JSX.Element | null {\r\n const { className, heading } = this.props.config;\r\n const { emptyOrderTemplateText, createNewTemplateButtonText } = this.props.resources;\r\n const { orderTemplates } = this.props.data;\r\n const orderTemplatesData = orderTemplates && orderTemplates.result;\r\n const orderTemplateListHeading = heading?.text ?? this.props.resources.orderTemplateListTitle;\r\n\r\n if (orderTemplates.status === 'LOADING') {\r\n const errorProps: IOrderTemplateListViewProps = {\r\n ...(this.props as IQuotationListProps),\r\n OrderTemplateList: {\r\n moduleProps: this.props,\r\n className: classnames('ms-order-template', className)\r\n },\r\n status: 'LOADING',\r\n statusMessage: ,\r\n heading: (\r\n \r\n )\r\n };\r\n return this.props.renderView(errorProps);\r\n }\r\n\r\n if (orderTemplatesData && orderTemplatesData.length === 0) {\r\n // When no order templates are found for customer\r\n const emptyViewProps: IOrderTemplateListViewProps = {\r\n ...(this.props as IQuotationListProps),\r\n OrderTemplateList: {\r\n moduleProps: this.props,\r\n className: classnames('ms-order-template', className)\r\n },\r\n status: 'EMPTY',\r\n statusMessage: ,\r\n heading: (\r\n \r\n )\r\n };\r\n\r\n return this.props.renderView(emptyViewProps);\r\n }\r\n\r\n const viewProps: IOrderTemplateListViewProps = {\r\n ...(this.props as IQuotationListProps),\r\n OrderTemplateList: {\r\n moduleProps: this.props,\r\n className: classnames('ms-order-template', className)\r\n },\r\n status: 'SUCCESS',\r\n heading: ,\r\n createOrderTemplateButton: (\r\n \r\n ),\r\n templateHeaderStatusMessage: this.state.isOpen && this.state.headerStatusMessage && (\r\n
\r\n \r\n {this.state.headerStatusMessage}\r\n \r\n
\r\n ),\r\n OrderTemplates: {\r\n className: 'ms-order-template__list-item',\r\n tag: 'ul'\r\n },\r\n OrderTemplate: {\r\n className: 'ms-order-template__tile',\r\n tag: 'li'\r\n },\r\n orderTemplates: orderTemplatesData && this._renderOrderTemplateList(orderTemplatesData)\r\n };\r\n\r\n return this.props.renderView(viewProps) as React.ReactElement;\r\n }\r\n\r\n private _generateOrderTemplateNameDialogResources(resources: IQuotationListResources): IOrderTemplateNameDialogResources {\r\n return {\r\n orderTemplateHeaderLabel: resources.createOrderTemplateHeader,\r\n orderTemplateTitleLabel: resources.orderTemplateTitle,\r\n orderTemplateNameAriaLabel: resources.orderTemplateNameAriaLabel,\r\n orderTemplateDescription: resources.createOrderTemplateDescription,\r\n\r\n defaultOrderTemplateName: resources.defaultOrderTemplateName,\r\n\r\n orderTemplateButtonLabel: resources.createOrderTemplateButtonText,\r\n orderTemplateCancelButtonLabel: resources.cancelNewOrderTemplateCreationButtonText\r\n };\r\n }\r\n\r\n private _renderOrderTemplateList(orderTemplates: OrderTemplate[]): ISingleOrderTemplateViewProps[] {\r\n const { context, telemetry } = this.props;\r\n const { imageSettings, enableImageProductLink } = this.props.config;\r\n return orderTemplates.map((orderTemplate: OrderTemplate, index) => {\r\n const currentTemplateProps: ISingleOrderTemplateProps = {\r\n orderTemplateState: this.state,\r\n Id: orderTemplate.productList.Id,\r\n name: orderTemplate.productList.Name,\r\n orderTemplate,\r\n context,\r\n imageSettings,\r\n enableImageProductLink,\r\n removeFromOrderTemplateListText: 'remove',\r\n addToBagText: this.props.resources.addToBagButtonText,\r\n index,\r\n itemKey: orderTemplate.productList.Id,\r\n telemetry,\r\n moduleId: this.props.id,\r\n moduleTypeName: this.props.typeName,\r\n handlers: {\r\n onRemoveOrderTemplate: this._onRemoveFromOrderTemplateList,\r\n onDismiss: this._onDismiss\r\n },\r\n resources: {\r\n closeWindowButtonText: this.props.resources.closeWindowButtonText,\r\n addToCartFailureMessage: this.props.resources.addToCartFailureMessage,\r\n addToCartSuccessMessage: this.props.resources.addToCartSuccessMessage,\r\n addToCartProcessMessage: this.props.resources.addToCartProcessMessage,\r\n linesAddedToCartDialogResources: {\r\n viewCartButtonText: this.props.resources.viewCartButtonText,\r\n orderTemplateCloseButtonText: this.props.resources.orderTemplateCloseButtonText,\r\n linesAddedToCartHeaderItemsOneText: this.props.resources.linesAddedToCartHeaderItemsOneText,\r\n linesAddedToCartHeaderLinesOneText: this.props.resources.linesAddedToCartHeaderLinesOneText,\r\n linesAddedToCartHeaderLinesFormatText: this.props.resources.linesAddedToCartHeaderLinesFormatText,\r\n linesAddedToCartHeaderMessageText: this.props.resources.linesAddedToCartHeaderMessageText\r\n }\r\n }\r\n };\r\n\r\n return OrderTemplateRender(currentTemplateProps)!;\r\n });\r\n }\r\n\r\n private readonly _onDismiss = () => {\r\n this.setState({\r\n isOpen: false\r\n });\r\n };\r\n\r\n private readonly _reloadPage = async () => {\r\n window.location.reload();\r\n };\r\n\r\n private readonly _onRemoveFromOrderTemplateList = (productListId: string): void | undefined => {\r\n const { context, data, telemetry, resources } = this.props;\r\n const { orderTemplates } = data;\r\n\r\n if (context && context.actionContext) {\r\n const userToken = context.request.user.isAuthenticated && context.request.user.token;\r\n if (userToken && orderTemplates.result && orderTemplates.result[0] && productListId) {\r\n const orderTemplate = orderTemplates.result.find(p => p.productList.Id === productListId);\r\n if (orderTemplate) {\r\n deleteAsync({ callerContext: context.actionContext }, orderTemplate.productList)\r\n .then()\r\n .catch((error: string) => {\r\n telemetry.warning('[order-template-list] Unable to delete order template.');\r\n telemetry.error(error);\r\n this.setState({\r\n itemKey: productListId,\r\n headerStatusMessage: resources.deleteOrderTemplateFailedText,\r\n statusCssString: 'danger',\r\n messageGlyph: 'fas fa-exclamation-triangle',\r\n isOpen: true\r\n });\r\n })\r\n .then(this._reloadPage);\r\n } else {\r\n telemetry.warning('[order-template-list] Failed to delete order template. Order template was not found');\r\n }\r\n } else {\r\n telemetry.warning('[order-template-list] Failed to delete order template.');\r\n }\r\n }\r\n };\r\n}\r\n\r\nexport default OrderTemplateList;\r\n","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\n/* eslint-disable no-duplicate-imports */\r\nimport { INodeProps, Module, Node } from '@msdyn365-commerce-modules/utilities';\r\nimport * as React from 'react';\r\n\r\nimport { ISingleOrderTemplateViewProps } from './components';\r\nimport { IOrderTemplateListViewProps } from './quotation-list';\r\n\r\nexport const OrderTemplateListView: React.FC = props => {\r\n const {\r\n OrderTemplateList,\r\n status,\r\n statusMessage,\r\n heading,\r\n OrderTemplates,\r\n orderTemplates,\r\n OrderTemplate,\r\n createOrderTemplateButton,\r\n templateHeaderStatusMessage\r\n } = props;\r\n\r\n return (\r\n \r\n {heading}\r\n {status !== 'SUCCESS' && statusMessage}\r\n \r\n {createOrderTemplateButton}\r\n {templateHeaderStatusMessage}\r\n \r\n {OrderTemplates && orderTemplates && orderTemplates.length > 0 && (\r\n \r\n {orderTemplates &&\r\n orderTemplates.map(orderTemplate => {\r\n return _renderOrderTemplate(orderTemplate, OrderTemplate);\r\n })}\r\n \r\n )}\r\n \r\n );\r\n};\r\n\r\nconst _renderOrderTemplate = (orderTemplate: ISingleOrderTemplateViewProps, OrderTemplate?: INodeProps): JSX.Element | null => {\r\n const { key, addToCartButton, orderTemplateImage, orderTemplateStatusMessage, removeButton, orderTemplateName } = orderTemplate;\r\n return (\r\n \r\n {orderTemplateName}\r\n {orderTemplateImage}\r\n {addToCartButton}\r\n {removeButton}\r\n {orderTemplateStatusMessage}\r\n \r\n );\r\n};\r\n\r\nexport default OrderTemplateListView;\r\n","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\nimport { FullProduct } from '@msdyn365-commerce/commerce-entities';\r\nimport { IComponent, IComponentProps, msdyn365Commerce } from '@msdyn365-commerce/core';\r\nimport { addOrderTemplateToCartAction, AddOrderTemplateToCartInput, OrderTemplate } from '@msdyn365-commerce-modules/retail-actions';\r\nimport {\r\n Button,\r\n getPayloadObject,\r\n getTelemetryAttributes,\r\n IPopupProductsProps,\r\n ITelemetryContent,\r\n PopupProducts,\r\n TelemetryConstant,\r\n Modal,\r\n ModalBody,\r\n ModalFooter,\r\n ModalHeader\r\n} from '@msdyn365-commerce-modules/utilities';\r\nimport classnames from 'classnames';\r\nimport React, { useState } from 'react';\r\n\r\nimport { ILinesAddedToCartDialogResources, LinesAddedToCartDialog } from '@msdyn365-commerce/components'; //' ../lines-added-to-cart-dialog/lines-added-to-cart-dialog.component';\r\nimport { AttributeValue, SimpleProduct } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\r\n\r\nexport interface IAddOrderTemplateToCartComponentData {\r\n orderTemplate: OrderTemplate;\r\n}\r\n\r\nexport interface IAddOrderTemplateToCartComponentProps extends IComponentProps {\r\n className?: string;\r\n parentElementRef?: React.RefObject{' '}\r\n \r\n \r\n \r\n );\r\n }\r\n}\r\n\r\nexport interface IModalWarningPropsFromLineAction {\r\n buttonLabel: string;\r\n className: string;\r\n applicationNode: string;\r\n isOpen: boolean;\r\n onWarningSubmit(product: SimpleProduct, quantity: number, itemKey: string, productSpecification: AttributeValue[]): void;\r\n warningClose(): void;\r\n productFromLineAction: SimpleProduct;\r\n quantityFromLineAction: number;\r\n itemKeyFromLineAction: string;\r\n productSpecificationFromLineAction: AttributeValue[];\r\n modalWarningResources?: IModalWarningResources;\r\n}\r\n\r\nexport class ModalWarningFromLineAction extends React.PureComponent {\r\n public modalWarningBtn: React.RefObject;\r\n\r\n constructor(props: IModalWarningPropsFromLineAction) {\r\n super(props);\r\n this.state = {\r\n warningAccepted: false\r\n };\r\n\r\n this.toggle = this.toggle.bind(this);\r\n this.accept = this.accept.bind(this);\r\n this.onWarningChecked = this.onWarningChecked.bind(this);\r\n this.modalWarningBtn = React.createRef();\r\n }\r\n\r\n public toggle(): void {\r\n this.setState({\r\n warningAccepted: false\r\n });\r\n this.props.warningClose();\r\n }\r\n\r\n public accept(): void {\r\n this.setState({\r\n warningAccepted: false\r\n });\r\n this.props.warningClose();\r\n this.props.onWarningSubmit(\r\n this.props.productFromLineAction,\r\n this.props.quantityFromLineAction,\r\n this.props.itemKeyFromLineAction,\r\n this.props.productSpecificationFromLineAction\r\n );\r\n }\r\n\r\n public onWarningChecked(): void {\r\n this.setState({\r\n warningAccepted: !this.state.warningAccepted\r\n });\r\n }\r\n\r\n public render(): JSX.Element {\r\n return (\r\n \r\n \r\n

{this.props.modalWarningResources?.modalWarningHeader ?? 'Quotation process warning'}

\r\n
\r\n \r\n
\r\n {this.props.modalWarningResources?.modalWarningMessage ??\r\n 'To ensure that your quote contains only selected items, please empty your basket before converting list to bag.'}\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\nconst AddOrderTemplate: React.FC = (props: IAddOrderTemplateToCartComponentProps) => {\r\n const [uploadStatus, setUploadStatus] = useState('WAITING');\r\n const [modalOpen, setModalOpen] = useState(false);\r\n const [addedLinesCount, setAddedLinesCount] = useState(0);\r\n const [linesAddedToCartDialogOpen, setLinesAddedToCartDialogOpen] = useState(false);\r\n const [modalWarningOpen, setModalWarningOpen] = useState(false);\r\n\r\n const onClickHandler = async (event: React.MouseEvent) => {\r\n buttonEventReference = event.target as HTMLButtonElement;\r\n await AddToCartComponentActions.onClick(\r\n event,\r\n props,\r\n setUploadStatus,\r\n setModalOpen,\r\n setLinesAddedToCartDialogOpen,\r\n setAddedLinesCount\r\n );\r\n };\r\n\r\n const warningHandler = () => {\r\n //debugger;\r\n setModalWarningOpen(true);\r\n };\r\n\r\n const warningClose = () => {\r\n setModalWarningOpen(false);\r\n };\r\n\r\n const closeLinesAddedToCartDialog = () => {\r\n setLinesAddedToCartDialogOpen(false);\r\n buttonEventReference?.focus();\r\n };\r\n\r\n const modalText = _getModalText(uploadStatus, props);\r\n const processStatusClass = uploadStatus.toLowerCase();\r\n const dialogStrings = { closeWindowButtonText: props.dialogStrings.closeWindowButtonText };\r\n const payLoad = getPayloadObject('click', props.telemetryContent!, TelemetryConstant.AddOrderTemplateToCart);\r\n const addOrderTemplateAttribute = getTelemetryAttributes(props.telemetryContent!, payLoad);\r\n\r\n const popupProps: IPopupProductsProps = {\r\n dialogStrings,\r\n className: 'msc-add-order-template-to-cart',\r\n processStatusClass,\r\n text: modalText,\r\n modalOpen,\r\n setModalOpen\r\n };\r\n\r\n const renderModalPopup = ;\r\n\r\n const products = props.data.orderTemplate.orderTemplateLines\r\n .map(line => line.fullProduct)\r\n .filter(fullProduct => fullProduct) as FullProduct[];\r\n\r\n return (\r\n <>\r\n {renderModalPopup}\r\n \r\n {props.addToCartText}\r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport const AddOrderTemplateToCartComponent: React.FunctionComponent =\r\n // @ts-expect-error -- As per design, custom component\r\n msdyn365Commerce.createComponent('AddOrderTemplate', {\r\n component: AddOrderTemplate,\r\n ...AddToCartComponentActions\r\n });\r\n","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\n/* eslint-disable no-duplicate-imports */\r\n//import { Button } from '@msdyn365-commerce-modules/utilities';\r\nimport * as React from 'react';\r\n\r\nimport { IOrderTemplateLineViewModel } from '../quotation';\r\nimport { IQuotationData } from '../quotation.data';\r\nimport { IQuotationProps } from '../quotation.props.autogenerated';\r\nimport { AddLineToTemplate } from '.';\r\n\r\ninterface IOrderTemplateBulkActionsProps extends IQuotationProps {\r\n orderTemplateId: string;\r\n selectedLines: IOrderTemplateLineViewModel[];\r\n isMinifiedView: boolean;\r\n onAddSelectionToBag(): void;\r\n onRemoveSelection(): void;\r\n}\r\n\r\ninterface IOrderTemplateBulkActionsState {\r\n isAddDisabled: boolean;\r\n isRemoveDisabled: boolean;\r\n}\r\n\r\n/**\r\n * Bulk Order Template line actions.\r\n */\r\nexport class OrderTemplateBulkActions extends React.PureComponent {\r\n public state: IOrderTemplateBulkActionsState = {\r\n isAddDisabled: true,\r\n isRemoveDisabled: true\r\n };\r\n\r\n public static getDerivedStateFromProps(\r\n props: IOrderTemplateBulkActionsProps,\r\n state: IOrderTemplateBulkActionsState\r\n ): IOrderTemplateBulkActionsState {\r\n const selectedLines = props.selectedLines.length;\r\n let nextState = { ...state };\r\n nextState = {\r\n isAddDisabled: selectedLines === 0,\r\n isRemoveDisabled: selectedLines === 0\r\n };\r\n return nextState;\r\n }\r\n\r\n public render(): JSX.Element {\r\n const {\r\n addLineModalLinkText,\r\n searchButtonAriaLabel,\r\n searchInputAriaLabel,\r\n searchModalPlaceholderText,\r\n selectProductButtonText,\r\n addItemToTemplateText,\r\n addLineProductUnitPricePrefix,\r\n backButtonText,\r\n decrementButtonAriaLabel,\r\n incrementButtonAriaLabel,\r\n quantitySelectLabel,\r\n addLineProductUnitOfMeasurePrefix,\r\n notFoundSearchErrorNotice,\r\n notFoundSearchErrorRedediation,\r\n searchErrorMessage,\r\n productDimensionTypeColor,\r\n productDimensionTypeConfiguration,\r\n productDimensionTypeSize,\r\n productDimensionTypeStyle,\r\n //addSelectedToBagButtonText,\r\n //removeSelectedToBagButtonText,\r\n searchResultsCountVerbage,\r\n searchResultsCountSubject,\r\n addToTemplateConfirmation,\r\n totalPriceLabel,\r\n progressNotificationText,\r\n addToTemplateDuplicateError,\r\n addToTemplateGenericError,\r\n dimensionMissingError\r\n } = this.props.resources;\r\n const addLineProps = {\r\n context: this.props.context,\r\n resources: {\r\n addLineModalLinkText,\r\n searchButtonAriaLabel,\r\n searchInputAriaLabel,\r\n searchModalPlaceholderText,\r\n selectProductButtonText,\r\n addItemToTemplateText,\r\n addLineProductUnitPricePrefix,\r\n backButtonText,\r\n decrementButtonAriaLabel,\r\n incrementButtonAriaLabel,\r\n quantitySelectLabel,\r\n addLineProductUnitOfMeasurePrefix,\r\n notFoundSearchErrorNotice,\r\n notFoundSearchErrorRedediation,\r\n searchErrorMessage,\r\n productDimensionTypeColor,\r\n productDimensionTypeConfiguration,\r\n productDimensionTypeSize,\r\n productDimensionTypeStyle,\r\n searchResultsCountVerbage,\r\n searchResultsCountSubject,\r\n addToTemplateConfirmation,\r\n totalPriceLabel,\r\n progressNotificationText,\r\n addToTemplateDuplicateError,\r\n addToTemplateGenericError,\r\n dimensionMissingError\r\n },\r\n imageSettings: this.props.config.imageSettings,\r\n orderTemplateId: this.props.orderTemplateId\r\n };\r\n\r\n return (\r\n <>\r\n \r\n {/* \r\n \r\n {!this.props.isMinifiedView && addSelectedToBagButtonText}\r\n \r\n \r\n \r\n {!this.props.isMinifiedView && removeSelectedToBagButtonText}\r\n */}\r\n \r\n );\r\n }\r\n\r\n // private readonly addHandler = (event: React.MouseEvent) => {\r\n // this.setState({\r\n // isAddDisabled: true\r\n // });\r\n\r\n // this.props.onAddSelectionToBag();\r\n\r\n // this.setState({\r\n // isAddDisabled: false\r\n // });\r\n // };\r\n\r\n // private readonly removeHandler = (event: React.MouseEvent) => {\r\n // this.setState({\r\n // isRemoveDisabled: true\r\n // });\r\n\r\n // this.props.onRemoveSelection();\r\n // };\r\n}\r\n","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\nimport { getUrlSync, IComponentProps, ICoreContext, IImageSettings } from '@msdyn365-commerce/core'; //Image\r\nimport { AttributeValue, SimpleProduct } from '@msdyn365-commerce/retail-proxy'; //ProductPrice\r\nimport { ArrayExtensions } from '@msdyn365-commerce-modules/retail-actions'; //getFallbackImageUrl\r\nimport { Button, Modal, ModalBody, ModalFooter, ModalHeader } from '@msdyn365-commerce-modules/utilities';\r\nimport React from 'react';\r\n\r\nimport { PriceComponent } from '@msdyn365-commerce/components'; //'../../price/price.components';\r\nimport { IItemWithAttributeAddedToCartDialogData } from '../../quotation';\r\n\r\nexport interface IItemAddedToCartDialogResources {\r\n viewCartButtonText: string;\r\n orderTemplateCloseButtonText: string;\r\n itemAddedToCartHeaderItemOneText: string;\r\n itemAddedToCartHeaderItemFormatText: string;\r\n itemAddedToCartHeaderMessageText: string;\r\n\r\n freePriceText: string;\r\n originalPriceText: string;\r\n currentPriceText: string;\r\n}\r\n\r\n// export interface IItemAddedToCartDialogData {\r\n// product: SimpleProduct;\r\n// productPrice: ProductPrice;\r\n// quantity: number;\r\n// }\r\n\r\nexport interface IItemAddedToCartDialogProps extends IComponentProps {\r\n className: string;\r\n\r\n dialogStrings: IItemAddedToCartDialogResources;\r\n\r\n modalOpen: boolean | undefined;\r\n onClose(): void;\r\n}\r\n\r\nconst renderImage = (context: ICoreContext, className: string, product: SimpleProduct, imageSettings?: IImageSettings) => {\r\n // const fallbackImageUrl = getFallbackImageUrl(product.ItemId, context.actionContext.requestContext.apiSettings);\r\n // const defaultImageSettings: IImageSettings = {\r\n // viewports: {\r\n // xs: { q: 'w=140&h=140&m=6', w: 0, h: 0 },\r\n // lg: { q: 'w=140&h=140&m=6', w: 0, h: 0 },\r\n // xl: { q: 'w=140&h=140&m=6', w: 0, h: 0 }\r\n // },\r\n // lazyload: true\r\n // };\r\n return (\r\n <>\r\n // \r\n );\r\n};\r\n\r\nconst _getErpSizeDescription = (attributeValues: AttributeValue[]): string => {\r\n if (!attributeValues || !ArrayExtensions.hasElements(attributeValues)) {\r\n return '';\r\n }\r\n const externalItemIdAttribute = attributeValues.find(\r\n attribute =>\r\n //attribute.Name === 'ERP_Sizes' || attribute.KeyName === 'ERPSizes'\r\n attribute.Name === 'Description'\r\n );\r\n if (externalItemIdAttribute) {\r\n return externalItemIdAttribute.TextValue ?? '';\r\n }\r\n return '';\r\n};\r\n\r\nexport const ItemWithAttributeAddedToCartDialog = (dialogProps: IItemAddedToCartDialogProps) => {\r\n const {\r\n dialogStrings,\r\n className,\r\n context,\r\n modalOpen,\r\n data: { product, productPrice, quantity, producSpecification }\r\n } = dialogProps;\r\n\r\n const getCartPageUrl = (): string => {\r\n return getUrlSync('cart', context.actionContext) || '';\r\n };\r\n\r\n const close: () => void = () => {\r\n dialogProps.onClose();\r\n };\r\n\r\n const itemsString =\r\n quantity === 1\r\n ? dialogStrings.itemAddedToCartHeaderItemOneText\r\n : dialogStrings.itemAddedToCartHeaderItemFormatText.replace('{0}', quantity.toString());\r\n\r\n return (\r\n \r\n \r\n {itemsString}\r\n {dialogStrings.itemAddedToCartHeaderMessageText}\r\n \r\n \r\n
\r\n {renderImage(context, `${className}__dialog`, product)}\r\n
\r\n
{product.Name}
\r\n
\r\n {productPrice && (\r\n \r\n )}\r\n
\r\n {// product.Dimensions &&\r\n //
\r\n // {product.Dimensions.map(dimension => dimension.DimensionValue?.Value).filter(value => value).join(', ')}\r\n //
\r\n _getErpSizeDescription(producSpecification)}\r\n
\r\n
\r\n
\r\n \r\n \r\n {dialogStrings.viewCartButtonText}\r\n \r\n \r\n {dialogStrings.orderTemplateCloseButtonText}\r\n \r\n \r\n
\r\n );\r\n};\r\n","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\n/* eslint-disable no-duplicate-imports */\r\nimport * as React from 'react';\r\n\r\nexport default (props: { className: string; msg?: string }) => (\r\n <>\r\n
\r\n {props?.msg &&
{props?.msg}
}\r\n \r\n);\r\n","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\n/* eslint-disable no-duplicate-imports */\r\nimport { ProductDimensionFull } from '@msdyn365-commerce/commerce-entities';\r\nimport { getCatalogId, ICoreContext, IImageSettings } from '@msdyn365-commerce/core';\r\nimport { ProductListLine, ProductSearchCriteria, ProductSearchResult } from '@msdyn365-commerce/retail-proxy';\r\nimport { searchByCriteriaAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/ProductsDataActions.g';\r\nimport { SimpleProduct } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\r\nimport {\r\n addItemToOrderTemplate,\r\n AddItemToOrderTemplateInput,\r\n getDimensionsForSelectedVariant,\r\n GetDimensionsForSelectedVariantInput,\r\n getSelectedVariant,\r\n SelectedVariantInput\r\n} from '@msdyn365-commerce-modules/retail-actions';\r\nimport { Modal, ModalBody, ModalHeader } from '@msdyn365-commerce-modules/utilities';\r\nimport { get } from 'lodash';\r\nimport { computed } from 'mobx';\r\nimport React from 'react';\r\n\r\nimport { IProductConfigurationState, NotFoundComponent, ProductConfiguration, ProductList } from '.';\r\nimport Spinner from './spinner';\r\n\r\nexport interface IAddLineToTemplateProps {\r\n context: ICoreContext;\r\n resources: IAddLineToTemplateResources;\r\n orderTemplateId: string;\r\n imageSettings?: IImageSettings;\r\n}\r\n\r\nexport interface IAddLineToTemplateResources {\r\n addLineModalLinkText: string;\r\n searchButtonAriaLabel: string;\r\n searchInputAriaLabel: string;\r\n searchModalPlaceholderText: string;\r\n selectProductButtonText: string;\r\n addItemToTemplateText: string;\r\n addLineProductUnitPricePrefix: string;\r\n backButtonText: string;\r\n decrementButtonAriaLabel: string;\r\n incrementButtonAriaLabel: string;\r\n quantitySelectLabel: string;\r\n addLineProductUnitOfMeasurePrefix: string;\r\n notFoundSearchErrorNotice: string;\r\n notFoundSearchErrorRedediation: string;\r\n searchErrorMessage: string;\r\n productDimensionTypeColor: string;\r\n productDimensionTypeConfiguration: string;\r\n productDimensionTypeSize: string;\r\n productDimensionTypeStyle: string;\r\n searchResultsCountVerbage: string;\r\n searchResultsCountSubject: string;\r\n addToTemplateConfirmation: string;\r\n totalPriceLabel: string;\r\n progressNotificationText: string;\r\n addToTemplateDuplicateError: string;\r\n addToTemplateGenericError: string;\r\n dimensionMissingError: string;\r\n backToResultsText?: string;\r\n}\r\n\r\nenum CONTENT {\r\n Search,\r\n ProductList,\r\n ProductConfiguration,\r\n NotFound,\r\n Error,\r\n Loading\r\n}\r\n\r\ninterface IAddLineToTemplateState {\r\n isOpen: boolean;\r\n query: string;\r\n products: ProductSearchResult[];\r\n content: number;\r\n selectedProduct: SimpleProduct | null;\r\n selectedProductDimensions?: ProductDimensionFull[];\r\n selectedQuantity?: number;\r\n reloadPage?: boolean;\r\n}\r\n\r\n/**\r\n * Add Lines to order template.\r\n */\r\nexport class AddLineToTemplate extends React.Component {\r\n public state: IAddLineToTemplateState = {\r\n isOpen: false,\r\n query: '',\r\n products: [],\r\n content: CONTENT.Search,\r\n selectedProduct: null\r\n };\r\n\r\n public defaultImageSettings: IImageSettings = {\r\n viewports: {\r\n xs: { q: 'w=64&h=64&m=6', w: 0, h: 0 },\r\n lg: { q: 'w=64&h=64&m=6', w: 0, h: 0 },\r\n xl: { q: 'w=64&h=64&m=6', w: 0, h: 0 }\r\n },\r\n lazyload: true\r\n };\r\n\r\n public searchTextInput: React.RefObject = React.createRef(); // @TODO public/private\r\n\r\n private readonly addLineButtonRef: React.RefObject = React.createRef();\r\n\r\n constructor(props: IAddLineToTemplateProps) {\r\n super(props);\r\n }\r\n\r\n public onComponentDidMount(): void {\r\n this.searchTextInput.current?.focus();\r\n }\r\n\r\n public onComponentDidUpdate(): void {\r\n this.searchTextInput.current?.focus();\r\n }\r\n\r\n @computed get showBackArrow(): boolean {\r\n return this.state.content === CONTENT.ProductConfiguration;\r\n }\r\n\r\n public shouldComponentUpdate(nextProps: IAddLineToTemplateProps, nextState: IAddLineToTemplateState): boolean {\r\n if (this.state === nextState && this.props === nextProps) {\r\n return false;\r\n }\r\n return true;\r\n }\r\n\r\n public render(): JSX.Element {\r\n const {\r\n resources: { addLineModalLinkText, backToResultsText }\r\n } = this.props;\r\n\r\n const modalProps = {\r\n ...this.props,\r\n className: 'msc-add-line-to-template',\r\n toggle: this._toggleModalHandler,\r\n isOpen: this.state.isOpen,\r\n ariaLabel: addLineModalLinkText\r\n };\r\n\r\n return (\r\n <>\r\n \r\n \r\n {this.showBackArrow && (\r\n \r\n )}\r\n {addLineModalLinkText}\r\n \r\n {this._renderContent()}\r\n \r\n \r\n \r\n {addLineModalLinkText}\r\n \r\n \r\n );\r\n }\r\n\r\n private readonly _renderSearchForm = () => {\r\n const {\r\n resources: { searchButtonAriaLabel, searchModalPlaceholderText }\r\n } = this.props;\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 }\r\n\r\n private _onIncrementalChange(amount: number): void {\r\n const updatedQuantity = this.state.currentInput + amount;\r\n\r\n if (updatedQuantity >= 1 && updatedQuantity <= this.props.max) {\r\n this.props.onChange && this.props.onChange(updatedQuantity);\r\n }\r\n }\r\n\r\n private _handleChange(e: React.ChangeEvent): void {\r\n const currentValue = Number.parseInt(e.target.value, 10);\r\n const minValue = this.props.min === undefined ? 1 : this.props.min;\r\n const inputElement =\r\n this.inputRef && this.inputRef.current && this.inputRef.current instanceof HTMLInputElement && this.inputRef.current;\r\n\r\n if (currentValue > this.props.max) {\r\n this.setState({ currentInput: this.props.max });\r\n } else {\r\n this.setState({ currentInput: currentValue }, () => {\r\n debounce(() => {\r\n if (!isNaN(this.state.currentInput) && !(this.state.currentInput < minValue) && inputElement) {\r\n inputElement.setAttribute('aria-valuenow', currentValue.toString());\r\n inputElement.setAttribute('value', currentValue.toString());\r\n }\r\n }, 200)();\r\n });\r\n }\r\n }\r\n\r\n private readonly _validateMin = (): void => {\r\n const minValue = this.props.min === undefined ? 1 : this.props.min;\r\n\r\n if (isNaN(this.state.currentInput) || this.state.currentInput < minValue) {\r\n this.props.onChange && this.props.onChange(minValue);\r\n } else {\r\n this.props.onChange && this.props.onChange(this.state.currentInput);\r\n }\r\n };\r\n}\r\n","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\n/* eslint-disable no-duplicate-imports */\r\nimport { ProductDimensionFull } from '@msdyn365-commerce/commerce-entities';\r\nimport { IImageSettings } from '@msdyn365-commerce/core'; //Image\r\nimport { ProductDimensionValue, ProductListLine } from '@msdyn365-commerce/retail-proxy';\r\nimport { SimpleProduct } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\r\nimport {\r\n getDimensionsForSelectedVariant,\r\n GetDimensionsForSelectedVariantInput,\r\n //getFallbackImageUrl,\r\n getPriceForSelectedVariant,\r\n getProductAvailabilitiesForSelectedVariant,\r\n getSelectedVariant,\r\n IProductInventoryInformation,\r\n PriceForSelectedVariantInput,\r\n ProductAvailabilitiesForSelectedVariantInput,\r\n SelectedVariantInput\r\n} from '@msdyn365-commerce-modules/retail-actions';\r\nimport { Alert, Button, ITelemetryContent, ModalBody, ModalFooter } from '@msdyn365-commerce-modules/utilities';\r\nimport classnames from 'classnames';\r\nimport React from 'react';\r\n\r\nimport OrderTemplateQuantity from '../common/quotation-quantity';\r\nimport { Dropdown, IAddLineToTemplateProps, IAddLineToTemplateResources, IDropdownItemProps, IDropdownOnSelection } from '.';\r\n\r\nexport interface IProductCnnfigurationProps extends IAddLineToTemplateProps {\r\n product: SimpleProduct;\r\n dimensions: ProductDimensionFull[];\r\n imageSettings: IImageSettings;\r\n telemetryContent?: ITelemetryContent;\r\n searchForm: React.ReactNode;\r\n addToTemplateHandler(params: IProductConfigurationState): Promise;\r\n highlightSearchTerm(name: string): React.ReactNode;\r\n}\r\n\r\nexport interface IProductConfigurationState {\r\n quantity: number;\r\n unitPrice: number;\r\n totalPrice: number;\r\n product: SimpleProduct;\r\n dimensions: ProductDimensionFull[];\r\n selectedDimensions: {};\r\n productAvailableQuantity?: IProductInventoryInformation;\r\n buttonDisabled: boolean;\r\n showAddConfirmation: boolean;\r\n errorMessage?: string;\r\n isBusy: boolean;\r\n errors: { dimension?: string[]; add?: string };\r\n}\r\n\r\n/**\r\n * Configure selected product for addition to order template.\r\n */\r\nexport class ProductConfiguration extends React.Component {\r\n private selectedDimensions: {} = {};\r\n\r\n constructor(props: IProductCnnfigurationProps) {\r\n super(props);\r\n\r\n this.state = {\r\n quantity: 1,\r\n unitPrice: props.product.Price,\r\n totalPrice: props.product.Price,\r\n product: props.product,\r\n dimensions: props.dimensions.sort((a, b) => a.DimensionTypeValue - b.DimensionTypeValue),\r\n selectedDimensions: {},\r\n buttonDisabled: false,\r\n showAddConfirmation: false\r\n } as IProductConfigurationState;\r\n }\r\n\r\n public shouldComponentUpdate(nextProps: IProductCnnfigurationProps, nextState: IProductConfigurationState): boolean {\r\n if (this.state === nextState && this.props === nextProps) {\r\n return false;\r\n }\r\n return true;\r\n }\r\n\r\n public render(): JSX.Element {\r\n const {\r\n // context: {\r\n // actionContext: {\r\n // requestContext: { apiSettings }\r\n // },\r\n // request: { gridSettings }\r\n // },\r\n resources: {\r\n addItemToTemplateText,\r\n addLineProductUnitPricePrefix,\r\n decrementButtonAriaLabel,\r\n incrementButtonAriaLabel,\r\n quantitySelectLabel,\r\n addLineProductUnitOfMeasurePrefix,\r\n totalPriceLabel\r\n },\r\n //imageSettings,\r\n highlightSearchTerm\r\n } = this.props;\r\n const { buttonDisabled, product, quantity, unitPrice, totalPrice, showAddConfirmation, errors } = this.state;\r\n\r\n return (\r\n <>\r\n \r\n {this.props.searchForm}\r\n
\r\n
\r\n
\r\n {/* */}\r\n
\r\n
{product?.ItemId}
\r\n {highlightSearchTerm(product?.Name ?? '')}\r\n
\r\n {addLineProductUnitPricePrefix} {this._formatPrice(unitPrice)}\r\n
\r\n
\r\n {addLineProductUnitOfMeasurePrefix} {product?.DefaultUnitOfMeasure}\r\n
\r\n
\r\n
\r\n
{this._getDimensionsNodes()}
\r\n
\r\n
\r\n
{quantitySelectLabel}
\r\n \r\n
\r\n
\r\n
\r\n {totalPriceLabel} {this._formatPrice(totalPrice)}\r\n
\r\n
\r\n \r\n {showAddConfirmation && (\r\n \r\n
\r\n )}\r\n {errors?.add && (\r\n
\r\n
\r\n )}\r\n \r\n {addItemToTemplateText}\r\n \r\n \r\n \r\n );\r\n }\r\n\r\n private _getConfirmationMessage(): string {\r\n const selectedDimensionNames = this.state.dimensions\r\n .map(dimension => {\r\n let variant = dimension.DimensionValues?.find(\r\n value => value.RecordId === this.selectedDimensions[dimension.DimensionTypeValue]\r\n )?.Value;\r\n if (dimension.DimensionTypeValue === 3) {\r\n variant = `size ${variant}`;\r\n }\r\n return variant;\r\n })\r\n .filter(value => value);\r\n\r\n return this.props.resources.addToTemplateConfirmation\r\n .replace('{count}', this.state.quantity.toString())\r\n .replace('{productAndDimensions}', `${this.state.product.Name}, ${Object.values(selectedDimensionNames).join(', ')}`);\r\n }\r\n\r\n private _getDimensionsNodes(): React.ReactElement[] {\r\n const { dimensions } = this.state;\r\n const { resources } = this.props;\r\n\r\n return dimensions?.map((dimension: ProductDimensionFull) => {\r\n const { DimensionValues, DimensionTypeValue } = dimension;\r\n const mapDimensions = (value: ProductDimensionValue): IDropdownItemProps => ({\r\n id: value.RecordId,\r\n value: value.Value || ''\r\n });\r\n const dimensionName = this._getDropdownName(DimensionTypeValue, resources);\r\n const dropdownList: IDropdownItemProps[] = DimensionValues ? DimensionValues.map(mapDimensions) : [];\r\n dropdownList.unshift({ id: 0, value: `Choose a ${dimensionName}` });\r\n\r\n return (\r\n
\r\n
{dimensionName}
\r\n {this.state.errors?.dimension?.includes(DimensionTypeValue.toString()) && (\r\n \r\n \r\n \r\n )}\r\n \r\n
\r\n );\r\n });\r\n }\r\n\r\n private readonly _getDimensionsError = (dimensionName: string) =>\r\n this.props.resources.dimensionMissingError.replace(/{dimensionName}/g, dimensionName);\r\n\r\n private readonly _addToTemplateHandler = async (event: React.MouseEvent) => {\r\n // Hide confirmation of previous addition when adding multiple items\r\n this.setState({\r\n isBusy: true,\r\n showAddConfirmation: false,\r\n errors: { ...this.state.errors, add: undefined }\r\n });\r\n\r\n const missingDimensions = this.state.dimensions\r\n .map(dimension => dimension.DimensionTypeValue.toString())\r\n .filter(type => !this.selectedDimensions[type]);\r\n\r\n this.setState({\r\n errors: { dimension: missingDimensions }\r\n });\r\n if (missingDimensions.length > 0) {\r\n this.setState({\r\n isBusy: false\r\n });\r\n return;\r\n }\r\n\r\n this.props\r\n .addToTemplateHandler({ ...this.state })\r\n .then(status => {\r\n // Validate against the existance of a ProductListId\r\n if (status.ProductListId) {\r\n this.setState({\r\n isBusy: false,\r\n showAddConfirmation: true\r\n });\r\n }\r\n })\r\n .catch(error => {\r\n const { addToTemplateDuplicateError, addToTemplateGenericError } = this.props.resources;\r\n let errorMessage;\r\n\r\n if (error.error.name === 'Microsoft_Dynamics_Commerce_Runtime_DuplicateObject') {\r\n errorMessage = addToTemplateDuplicateError;\r\n } else {\r\n errorMessage = addToTemplateGenericError;\r\n }\r\n\r\n this.setState({\r\n isBusy: false,\r\n errors: { ...this.state.errors, add: errorMessage }\r\n });\r\n this.props.context.telemetry.error('Error adding item to order template');\r\n });\r\n };\r\n\r\n private readonly _onQuantityChange = (newValue: number) => {\r\n this.setState({\r\n quantity: newValue,\r\n totalPrice: newValue * this.props.product.Price\r\n });\r\n };\r\n\r\n private readonly _updateDimensionValue = (\r\n productDimensionFull: ProductDimensionFull,\r\n newValueId: string | undefined\r\n ): ProductDimensionValue | undefined => {\r\n if (newValueId && productDimensionFull.DimensionValues) {\r\n return productDimensionFull.DimensionValues.find(dimension => dimension.RecordId === +newValueId);\r\n }\r\n\r\n return undefined;\r\n };\r\n\r\n // Rehydrate the selected variants price, available dimensions & sizes\r\n private readonly _onDimensionChanged = async (selection: IDropdownOnSelection): Promise => {\r\n const { product, dimensions, context } = this.props;\r\n const {\r\n actionContext,\r\n request: {\r\n apiSettings: { channelId }\r\n }\r\n } = context;\r\n\r\n // Remaining error notifications for missing dimensions\r\n const remainingDimensionsErrors = this.state.errors?.dimension?.filter(id => id !== selection.dropdownId.toString());\r\n\r\n this.setState({\r\n isBusy: false,\r\n showAddConfirmation: false,\r\n buttonDisabled: true,\r\n errors: { add: undefined, dimension: remainingDimensionsErrors }\r\n });\r\n\r\n // Update currently selected dimensions\r\n this.selectedDimensions[selection.dropdownId] = +selection.selectId;\r\n\r\n const mappedDimensions = dimensions\r\n ?.map(dimension => {\r\n return {\r\n DimensionTypeValue: dimension.DimensionTypeValue,\r\n DimensionValue:\r\n this._updateDimensionValue(dimension, this.selectedDimensions[dimension.DimensionTypeValue]) ||\r\n dimension.DimensionValue,\r\n ExtensionProperties: dimension.ExtensionProperties\r\n };\r\n })\r\n .filter(dimension => {\r\n return dimension && dimension.DimensionValue;\r\n });\r\n\r\n const variantProduct = await getSelectedVariant(\r\n new SelectedVariantInput(\r\n product.MasterProductId ? product.MasterProductId : product.RecordId,\r\n channelId,\r\n mappedDimensions,\r\n undefined,\r\n this.props.context.request\r\n ),\r\n actionContext\r\n );\r\n\r\n if (!variantProduct) {\r\n this.props.context.telemetry.error(\r\n `Error retrieving variant product for product ${product.MasterProductId ? product.MasterProductId : product.RecordId}`\r\n );\r\n return;\r\n }\r\n\r\n const dimensionInput = new GetDimensionsForSelectedVariantInput(\r\n variantProduct.RecordId,\r\n channelId,\r\n mappedDimensions,\r\n this.props.context.request\r\n );\r\n const variantDimensions = await getDimensionsForSelectedVariant(dimensionInput, actionContext);\r\n\r\n if (!variantDimensions) {\r\n this.props.context.telemetry.error('Error retrieving dimensions for reconfigured product variant');\r\n this.setState({\r\n buttonDisabled: false\r\n });\r\n return;\r\n }\r\n\r\n const availabilityInput = new ProductAvailabilitiesForSelectedVariantInput(\r\n product.MasterProductId ? product.MasterProductId : product.RecordId,\r\n channelId\r\n );\r\n\r\n // @TODO sync UX quantity w/ actual availability\r\n const newAvailableQuantity = await getProductAvailabilitiesForSelectedVariant(availabilityInput, actionContext);\r\n const priceInput = new PriceForSelectedVariantInput(product.RecordId, channelId);\r\n const productPrice = await getPriceForSelectedVariant(priceInput, actionContext);\r\n\r\n if (!productPrice) {\r\n this.props.context.telemetry.error('Error retrieving price for reconfigured product variant');\r\n this.setState({\r\n buttonDisabled: false\r\n });\r\n return;\r\n }\r\n\r\n this.setState({\r\n buttonDisabled: false,\r\n productAvailableQuantity: (newAvailableQuantity && newAvailableQuantity[0]) || undefined,\r\n unitPrice: +(productPrice.BasePrice || product.Price),\r\n dimensions: variantDimensions.sort((a, b) => a.DimensionTypeValue - b.DimensionTypeValue),\r\n product: variantProduct\r\n });\r\n };\r\n\r\n private readonly _getDropdownName = (dimensionType: number, resources: IAddLineToTemplateResources): string => {\r\n switch (dimensionType) {\r\n case 1: // Color\r\n return resources.productDimensionTypeColor;\r\n case 2: // Configuration\r\n return resources.productDimensionTypeConfiguration;\r\n case 3: // Size\r\n return resources.productDimensionTypeSize;\r\n case 4: // Style\r\n return resources.productDimensionTypeStyle;\r\n default:\r\n return '';\r\n }\r\n };\r\n\r\n private _formatPrice(price: number): string {\r\n const {\r\n context: {\r\n cultureFormatter: {\r\n formatCurrency,\r\n\r\n // @ts-expect-error\r\n currencyCode\r\n }\r\n }\r\n } = this.props;\r\n\r\n return formatCurrency(price.toFixed(2), currencyCode);\r\n }\r\n}\r\n","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\n/* eslint-disable no-duplicate-imports */\r\nimport { ProductDimensionFull } from '@msdyn365-commerce/commerce-entities';\r\nimport { IImageSettings } from '@msdyn365-commerce/core'; //Image\r\nimport { ProductSearchResult } from '@msdyn365-commerce/retail-proxy';\r\n//import { getFallbackImageUrl } from '@msdyn365-commerce-modules/retail-actions';\r\nimport { Button } from '@msdyn365-commerce-modules/utilities';\r\nimport classnames from 'classnames';\r\nimport React, { useState } from 'react';\r\n\r\nimport { IAddLineToTemplateProps } from '.';\r\n\r\nexport interface IProductListProps extends IAddLineToTemplateProps {\r\n products: ProductSearchResult[];\r\n imageSettings: IImageSettings;\r\n searchForm: React.ReactNode;\r\n clickHandler(product: ProductSearchResult): Promise;\r\n highlightSearchTerm(name: string): React.ReactNode;\r\n renderResultCountText(): string;\r\n}\r\n\r\nexport const ProductList = (props: IProductListProps) => {\r\n const {\r\n products,\r\n context: {\r\n // actionContext: {\r\n // requestContext: { apiSettings }\r\n // },\r\n //request: { gridSettings },\r\n cultureFormatter: {\r\n formatCurrency,\r\n\r\n // @ts-expect-error\r\n currencyCode\r\n }\r\n },\r\n clickHandler,\r\n highlightSearchTerm,\r\n renderResultCountText,\r\n resources: { selectProductButtonText }\r\n //imageSettings\r\n } = props;\r\n\r\n return (\r\n <>\r\n

\r\n {renderResultCountText()}\r\n

\r\n {props.searchForm}\r\n
\r\n {products.map((product: ProductSearchResult, index: number) => {\r\n const { Price, ItemId, Name } = product; //PrimaryImageUrl\r\n const price = formatCurrency(Price.toFixed(2), currencyCode);\r\n //const fallBackImg = getFallbackImageUrl(ItemId, apiSettings) ?? '';\r\n\r\n return (\r\n
\r\n
\r\n {/* */}\r\n
\r\n
{ItemId}
\r\n {highlightSearchTerm(Name ?? '')}\r\n
\r\n
\r\n
\r\n {price}\r\n \r\n
\r\n
\r\n );\r\n })}\r\n
\r\n \r\n );\r\n};\r\n\r\ninterface IProductSelectButton {\r\n product: ProductSearchResult;\r\n buttonText: string;\r\n clickHandler(product: ProductSearchResult): Promise;\r\n}\r\n\r\nconst ProductSelectButton = (props: IProductSelectButton) => {\r\n const [isBusy, setBusy] = useState(false);\r\n const { product, buttonText, clickHandler } = props;\r\n const getClickHandler = React.useCallback(async () => {\r\n setBusy(!isBusy);\r\n await clickHandler(product);\r\n setBusy(!isBusy);\r\n }, [clickHandler, isBusy, product]);\r\n\r\n return (\r\n \r\n {buttonText}\r\n \r\n );\r\n};\r\n","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\n/* eslint-disable no-duplicate-imports */\r\nimport {\r\n ILinesAddedToCartDialogResources,\r\n IOrderTemplateNameDialogResources,\r\n RenameOrderTemplateComponent\r\n} from '@msdyn365-commerce/components';\r\nimport { AddOrderTemplateToCartComponent } from './';\r\nimport { IComponentProps, ICoreContext } from '@msdyn365-commerce/core';\r\nimport { ProductList } from '@msdyn365-commerce/retail-proxy';\r\nimport { OrderTemplate } from '@msdyn365-commerce-modules/retail-actions';\r\nimport { Button, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\r\nimport * as React from 'react';\r\n\r\nexport interface IOrderTemplateActionsData {\r\n orderTemplate: OrderTemplate;\r\n}\r\n\r\nexport interface IOrderTemplateActionsProps extends IComponentProps {\r\n context: ICoreContext;\r\n telemetryContent?: ITelemetryContent;\r\n handlers: {\r\n onRemoveTemplate(orderTemplateId: string): void;\r\n onRenameTemplate(orderTemplate: ProductList): Promise;\r\n };\r\n renameOrderTemplateDialogStrings: IOrderTemplateNameDialogResources;\r\n resources: {\r\n addTemplateToBagButtonText: string;\r\n renameTemplateButtonText: string;\r\n deleteTemplateButtonText: string;\r\n closeWindowButtonText: string;\r\n addToCartFailureMessage: string;\r\n addToCartSuccessMessage: string;\r\n addToCartProcessMessage: string;\r\n linesAddedToCartDialogResources: ILinesAddedToCartDialogResources;\r\n };\r\n}\r\n\r\nexport interface IOrderTemplateActionsViewProps {\r\n addTemplateToBag: React.ReactNode;\r\n renameTemplate?: React.ReactNode;\r\n removeTemplate?: React.ReactNode;\r\n}\r\n\r\n/**\r\n * Remove Order Action.\r\n * @param props -Order template action props.\r\n * @returns Remove order template.\r\n */\r\nconst removeOrderActionHandler = (props: IOrderTemplateActionsProps) => () => {\r\n _removeOrderTemplate(props);\r\n};\r\n\r\nexport const OrderTemplateActionsView = (props: IOrderTemplateActionsProps): IOrderTemplateActionsViewProps => {\r\n const { resources } = props;\r\n const { deleteTemplateButtonText } = resources;\r\n\r\n return {\r\n addTemplateToBag: _getOrderTemplateAddToCartDialog(props),\r\n renameTemplate: _getOrderTemplateRenameControl(props),\r\n removeTemplate: (\r\n \r\n )\r\n };\r\n};\r\n\r\nconst _removeOrderTemplate = (props: IOrderTemplateActionsProps): void => {\r\n const {\r\n data: { orderTemplate },\r\n handlers\r\n } = props;\r\n const { onRemoveTemplate } = handlers;\r\n\r\n if (onRemoveTemplate) {\r\n onRemoveTemplate(orderTemplate.productList.Id);\r\n }\r\n};\r\n\r\nconst _getOrderTemplateAddToCartDialog = (props: IOrderTemplateActionsProps): React.ReactNode => {\r\n const {\r\n data: { orderTemplate },\r\n typeName,\r\n id,\r\n context,\r\n telemetryContent,\r\n resources\r\n } = props;\r\n const {\r\n addTemplateToBagButtonText,\r\n closeWindowButtonText,\r\n addToCartFailureMessage,\r\n addToCartSuccessMessage,\r\n addToCartProcessMessage,\r\n linesAddedToCartDialogResources\r\n } = resources;\r\n\r\n const dialogStrings = {\r\n closeWindowButtonText,\r\n addToCartFailureMessage,\r\n addToCartSuccessMessage,\r\n addToCartProcessMessage,\r\n linesAddedToCartDialogResources\r\n };\r\n\r\n return (\r\n \r\n );\r\n};\r\n\r\nconst _getOrderTemplateRenameControl = (props: IOrderTemplateActionsProps): React.ReactNode => {\r\n const { renameOrderTemplateDialogStrings, resources, context, handlers } = props;\r\n return (\r\n \r\n );\r\n};\r\n","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\n/* eslint-disable no-duplicate-imports */\r\nimport { PriceComponent } from '@msdyn365-commerce/components';\r\nimport { ICoreContext, IImageSettings, ITelemetry } from '@msdyn365-commerce/core'; //Image\r\nimport { ProductListLine } from '@msdyn365-commerce/retail-proxy';\r\nimport { AttributeValue, ProductPrice, SimpleProduct } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\r\nimport { getFallbackImageUrl, ArrayExtensions } from '@msdyn365-commerce-modules/retail-actions';\r\nimport { Button, INodeProps } from '@msdyn365-commerce-modules/utilities';\r\nimport React, { useState } from 'react';\r\n\r\nimport { IOrderTemplateLineViewModel } from '../quotation';\r\nimport OrderTemplateQuantity from './common/quotation-quantity';\r\n\r\nexport interface IOrderTemplateLineProps extends ProductListLine {\r\n orderTemplateLine: IOrderTemplateLineViewModel;\r\n productListLine: ProductListLine;\r\n price?: ProductPrice;\r\n context: ICoreContext;\r\n productUrl: string;\r\n imageSettings?: IImageSettings;\r\n telemetry: ITelemetry;\r\n moduleId: string;\r\n moduleTypeName: string;\r\n quantity: number;\r\n isQuantityDisabledForUpdate?: boolean;\r\n handlers: {\r\n onAddToBag(product: SimpleProduct, quantity: number, itemKey: string, producSpecification: AttributeValue[]): void;\r\n onRemoveItem(line: IOrderTemplateLineViewModel): void | undefined;\r\n onChangeQuantity(orderTemplateLineId: string, quantity: number, props?: IOrderTemplateLineProps): void;\r\n onSelect(line: IOrderTemplateLineViewModel, isChecked: boolean): void;\r\n };\r\n resources: {\r\n selectOneRowText?: string;\r\n moreButtonText?: string;\r\n viewProductDetailsText?: string;\r\n productDimensionTypeColor: string;\r\n productDimensionTypeSize: string;\r\n productDimensionTypeStyle: string;\r\n originalPriceText: string;\r\n currentPriceText: string;\r\n freePriceText: string;\r\n inputQuantityAriaLabel: string;\r\n removeFromOrderTemplateLinesText: string;\r\n addToBagButtonText: string;\r\n deleteButtonText: string;\r\n incrementButtonAriaLabel?: string;\r\n decrementButtonAriaLabel?: string;\r\n editOrderTemplateLineQuantityError?: string;\r\n };\r\n index: number;\r\n isMobile: boolean;\r\n productQuantityView?: React.ReactNode;\r\n addToBagButton?: React.ReactNode;\r\n removeButton?: React.ReactNode;\r\n toggleDetailsDisplayed(props: IOrderTemplateLineProps): void;\r\n}\r\n\r\nexport interface IOrderTemplateLineViewProps {\r\n key?: string;\r\n productImage: React.ReactNode;\r\n productPrice?: React.ReactNode;\r\n addToBagButton?: React.ReactNode;\r\n removeButton?: React.ReactNode;\r\n productName?: string;\r\n productNumber?: React.ReactNode;\r\n productInfo?: React.ReactNode;\r\n productLabel?: React.ReactNode;\r\n productUnitOfMeasure?: React.ReactNode;\r\n productQuantity?: number;\r\n productQuantityView?: React.ReactNode;\r\n productListId?: string;\r\n selectLine?: React.ReactNode;\r\n popUp?: JSX.Element;\r\n isMobile?: boolean;\r\n externalItemId: string;\r\n}\r\n\r\ninterface IEventHandlerFactory {\r\n getAddToBag(): (event: React.MouseEvent) => void;\r\n getRemoveItem(): (event: React.MouseEvent) => void;\r\n}\r\n\r\nconst OrderTemplateLineActions = (props: IOrderTemplateLineProps): IEventHandlerFactory => {\r\n const { orderTemplateLine, productListLine, quantity, handlers } = props;\r\n const { LineId } = productListLine;\r\n const { onAddToBag, onRemoveItem } = handlers;\r\n\r\n return {\r\n getAddToBag: () => (event: React.MouseEvent) => {\r\n LineId &&\r\n orderTemplateLine.fullProduct &&\r\n onAddToBag(orderTemplateLine.fullProduct.ProductDetails, quantity, LineId, orderTemplateLine.productSpecificationData);\r\n },\r\n getRemoveItem: () => (event: React.MouseEvent) => LineId && onRemoveItem(props.orderTemplateLine)\r\n };\r\n};\r\n\r\ninterface IPopupProps extends IOrderTemplateLineProps {\r\n addButtonClassName: string;\r\n removeButtonClassName: string;\r\n}\r\n\r\nconst PopUp = (props: IPopupProps): JSX.Element | null => {\r\n const { addToBagButtonText, removeFromOrderTemplateLinesText, moreButtonText, viewProductDetailsText } = props.resources;\r\n const [showMobile, setShowMobile] = useState(false);\r\n const componentClassName = 'ms-table';\r\n\r\n const getViewHandler = () => (event: React.MouseEvent) => {\r\n props.toggleDetailsDisplayed(props);\r\n };\r\n\r\n const toggle = React.useCallback(() => {\r\n setShowMobile(!showMobile);\r\n }, [showMobile]);\r\n\r\n return (\r\n
\r\n \r\n {showMobile && (\r\n
\r\n \r\n View\r\n \r\n {getActionButton(\r\n props.isMobile,\r\n props.removeButtonClassName,\r\n removeFromOrderTemplateLinesText,\r\n OrderTemplateLineActions(props).getRemoveItem()\r\n )}\r\n {getActionButton(\r\n props.isMobile,\r\n props.addButtonClassName,\r\n addToBagButtonText,\r\n OrderTemplateLineActions(props).getAddToBag()\r\n )}\r\n
\r\n )}\r\n
\r\n );\r\n};\r\n\r\nconst getActionButton = (\r\n isMobile: boolean,\r\n className: string,\r\n buttonText: string,\r\n clickHandler: (event: React.MouseEvent) => void\r\n): React.ReactNode => (\r\n \r\n);\r\n\r\n/**\r\n * On Select line function.\r\n * @param orderTemplateLine -Order template line.\r\n * @param input -Order template line props.\r\n * @returns Set on select order template.\r\n */\r\nconst onSelectLineHandler = (orderTemplateLine: IOrderTemplateLineViewModel, input: IOrderTemplateLineProps) => (\r\n event: React.ChangeEvent\r\n) => {\r\n orderTemplateLine.isChecked = !orderTemplateLine.isChecked;\r\n\r\n input.handlers.onSelect(orderTemplateLine, event.target.checked);\r\n};\r\n\r\nexport const OrderTemplateLineView = (input: IOrderTemplateLineProps): IOrderTemplateLineViewProps | null => {\r\n const { orderTemplateLine, productListLine, price, context, imageSettings, quantity, resources, isMobile } = input;\r\n const product = orderTemplateLine.fullProduct;\r\n const { LineId, UnitOfMeasure } = productListLine;\r\n const { removeFromOrderTemplateLinesText, addToBagButtonText, selectOneRowText } = resources;\r\n if (!product) {\r\n return null;\r\n }\r\n\r\n const { ItemId, Name, PrimaryImageUrl } = product.ProductDetails;\r\n const fallbackImage = getFallbackImageUrl(ItemId, context.actionContext.requestContext.apiSettings);\r\n const addButtonClassName = input.isMobile ? 'ms-table__row-links-add' : 'ms-order-template-table-line__product-add-button';\r\n const removeButtonClassName = input.isMobile ? 'ms-table__row-links-delete' : 'ms-order-template-table-line__product-remove-button';\r\n\r\n return {\r\n isMobile,\r\n selectLine: (\r\n \r\n ),\r\n key: LineId!,\r\n productImage:\r\n PrimaryImageUrl &&\r\n Name &&\r\n _renderProductImage(\r\n 'ms-order-template-table-line__product-image',\r\n context,\r\n product.ProductDetails.Name!,\r\n PrimaryImageUrl,\r\n fallbackImage,\r\n imageSettings\r\n ),\r\n productInfo: renderProductInfo(input),\r\n productPrice: price && _renderPrice(input),\r\n productNumber: product &&
{ItemId}
,\r\n productUnitOfMeasure: price ? (\r\n
{UnitOfMeasure || price.UnitOfMeasure}
\r\n ) : (\r\n undefined\r\n ),\r\n productListId: LineId!,\r\n removeButton: getActionButton(\r\n input.isMobile,\r\n removeButtonClassName,\r\n removeFromOrderTemplateLinesText,\r\n OrderTemplateLineActions(input).getRemoveItem()\r\n ),\r\n productQuantityView:
{_generateQuantity(input, LineId!)}
,\r\n productQuantity: quantity,\r\n addToBagButton: getActionButton(\r\n input.isMobile,\r\n addButtonClassName,\r\n addToBagButtonText,\r\n OrderTemplateLineActions(input).getAddToBag()\r\n ),\r\n popUp: ,\r\n externalItemId: _getExternalItemId(orderTemplateLine)\r\n };\r\n};\r\n\r\nexport const OrderTemplateMobileLineView = (input: IOrderTemplateLineProps): IOrderTemplateLineViewProps | undefined => {\r\n const { orderTemplateLine, productListLine, price, context, imageSettings } = input;\r\n const product = orderTemplateLine.fullProduct;\r\n const { LineId, UnitOfMeasure } = productListLine;\r\n if (!product) {\r\n return;\r\n }\r\n const { ItemId, Name, PrimaryImageUrl } = product.ProductDetails;\r\n const fallbackImage = getFallbackImageUrl(ItemId, context.actionContext.requestContext.apiSettings);\r\n\r\n return {\r\n productImage:\r\n PrimaryImageUrl &&\r\n Name &&\r\n _renderProductImage('thumbnail', context, product.ProductDetails.Name!, PrimaryImageUrl, fallbackImage, imageSettings),\r\n productInfo: renderProductInfo(input),\r\n productPrice: price && _renderPrice(input),\r\n productNumber: ItemId,\r\n productUnitOfMeasure: UnitOfMeasure || price?.UnitOfMeasure,\r\n productQuantityView: _generateQuantity(input, LineId!),\r\n externalItemId: _getExternalItemId(orderTemplateLine)\r\n };\r\n};\r\n\r\nexport interface IOrderTemplateProductQuantityViewProps {\r\n ContainerProps: INodeProps;\r\n input: React.ReactNode;\r\n}\r\n\r\nconst _getExternalItemId = (orderTemplateLine: IOrderTemplateLineViewModel): string => {\r\n const attributeValues = orderTemplateLine.productSpecificationData;\r\n\r\n if (!attributeValues || !ArrayExtensions.hasElements(attributeValues)) {\r\n return '';\r\n }\r\n const externalItemIdAttribute = attributeValues.find(\r\n attribute =>\r\n //attribute.Name === 'External Item Id' || attribute.Name === 'ERP_ExternalItemID' || attribute.KeyName === 'ERPExternalItemID'\r\n attribute.Name === 'Catalog Number'\r\n );\r\n if (externalItemIdAttribute) {\r\n return externalItemIdAttribute.TextValue ?? '';\r\n }\r\n return '';\r\n};\r\n\r\nconst _getErpSizeDescription = (orderTemplateLine: IOrderTemplateLineViewModel): string => {\r\n const attributeValues = orderTemplateLine.productSpecificationData;\r\n\r\n if (!attributeValues || !ArrayExtensions.hasElements(attributeValues)) {\r\n return '';\r\n }\r\n const externalItemIdAttribute = attributeValues.find(\r\n attribute =>\r\n //attribute.Name === 'ERP_Sizes' || attribute.KeyName === 'ERPSizes'\r\n attribute.Name === 'Description'\r\n );\r\n if (externalItemIdAttribute) {\r\n return externalItemIdAttribute.TextValue ?? '';\r\n }\r\n return '';\r\n};\r\n\r\n/**\r\n * On Change function.\r\n * @param onChangeQuantity -On change quantity function.\r\n * @param itemKey -String.\r\n * @param props -Order template line props.\r\n * @returns Set change quantity.\r\n */\r\nconst onChangeHandler = (\r\n onChangeQuantity: (orderTemplateLineId: string, quantity: number, props?: IOrderTemplateLineProps | undefined) => void,\r\n itemKey: string,\r\n props: IOrderTemplateLineProps\r\n) => (newValue: number) => {\r\n if (onChangeQuantity) {\r\n onChangeQuantity(itemKey, newValue, props);\r\n }\r\n};\r\n\r\nconst _generateQuantity = (props: IOrderTemplateLineProps, itemKey: string): React.ReactNode => {\r\n const { handlers, resources, quantity } = props;\r\n const { onChangeQuantity } = handlers;\r\n return (\r\n \r\n );\r\n};\r\n\r\nexport const _renderProductImage = (\r\n className: string,\r\n context: ICoreContext,\r\n heading: string,\r\n image?: string,\r\n fallbackImage?: string,\r\n imageSettings?: IImageSettings\r\n): JSX.Element | null => {\r\n // const defaultImageSettings: IImageSettings = {\r\n // viewports: {\r\n // xs: { q: 'w=64&h=64&m=6', w: 0, h: 0 },\r\n // lg: { q: 'w=64&h=64&m=6', w: 0, h: 0 },\r\n // xl: { q: 'w=64&h=64&m=6', w: 0, h: 0 }\r\n // },\r\n // lazyload: true\r\n // };\r\n\r\n if (image) {\r\n return (\r\n <>\r\n // \r\n );\r\n }\r\n return null;\r\n};\r\n\r\nconst _renderPrice = (props: IOrderTemplateLineProps): JSX.Element | null => {\r\n const { price, context, moduleId, moduleTypeName, resources } = props;\r\n\r\n if (price) {\r\n return (\r\n \r\n );\r\n }\r\n return null;\r\n};\r\n\r\n// const _renderProductDimensions = (props: IOrderTemplateLineProps): (string | undefined)[] => {\r\n// const { orderTemplateLine } = props;\r\n\r\n// if (!orderTemplateLine.fullProduct || !orderTemplateLine.fullProduct.ProductDetails.Dimensions) {\r\n// return [];\r\n// }\r\n\r\n// return orderTemplateLine.fullProduct.ProductDetails.Dimensions.map(dimension => {\r\n// if (!dimension.DimensionValue || !dimension.DimensionValue.Value) {\r\n// return undefined;\r\n// }\r\n\r\n// return dimension.DimensionValue.Value;\r\n// });\r\n// };\r\n\r\nexport const renderProductInfo = (props: IOrderTemplateLineProps): React.ReactNode | undefined => {\r\n const { orderTemplateLine, productUrl } = props;\r\n const name = orderTemplateLine.fullProduct?.ProductDetails.Name;\r\n\r\n //const dimensions = _renderProductDimensions(props);\r\n if (!orderTemplateLine.fullProduct) {\r\n return [];\r\n }\r\n\r\n const productName = productUrl ? (\r\n \r\n {name}\r\n \r\n ) : (\r\n
{name}
\r\n );\r\n\r\n const dimensionsLine: string = _getErpSizeDescription(props.orderTemplateLine); //dimensions.join(', ');\r\n\r\n return (\r\n
\r\n
{productName}
\r\n
{dimensionsLine}
\r\n
\r\n );\r\n};\r\n","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\n/* eslint-disable no-duplicate-imports */\r\nimport classnames from 'classnames';\r\nimport * as React from 'react';\r\n\r\nimport { orderTemplateLinesStatus } from '../quotation';\r\n\r\nexport interface IOrderTemplateLinesStatusMessageProps {\r\n className?: string;\r\n errorType: orderTemplateLinesStatus;\r\n text?: string;\r\n}\r\n\r\nexport const OrderTemplateLinesStatusMessage: React.FC = ({ className, errorType, text }) => {\r\n switch (errorType) {\r\n case 'EMPTY':\r\n return

{text}

;\r\n case 'FAILED':\r\n return

{text}

;\r\n case 'LOADING':\r\n default:\r\n return

{text}

;\r\n }\r\n};\r\n","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\n/* eslint-disable no-duplicate-imports */\r\nimport * as React from 'react';\r\n\r\nimport { IOrderTemplateLineViewModel } from '../quotation';\r\n\r\nexport interface IOrderTemplateTableHeadingProps {\r\n selectAllRowsText?: string;\r\n productNumber: string;\r\n productName: string;\r\n productUnitPrice: string;\r\n productUOM: string;\r\n productQuantity: string;\r\n productActions: string;\r\n lines: IOrderTemplateLineViewModel[];\r\n isMobile: boolean;\r\n clickHandler(isChecked: boolean): void;\r\n}\r\n\r\n/**\r\n * Order Template's table state.\r\n */\r\nexport interface IOrderTemplateTableHeadingState {\r\n isChecked: boolean;\r\n}\r\n\r\nexport interface IOrderTemplateTableShortHeading {\r\n productNumber: string;\r\n productActions: string;\r\n}\r\n\r\n/**\r\n * Order Template's table heading.\r\n */\r\nexport class OrderTemplateTableHeading extends React.PureComponent {\r\n public state: IOrderTemplateTableHeadingState = {\r\n isChecked: false\r\n };\r\n\r\n private readonly componentClassName: string = 'ms-table';\r\n\r\n public static getDerivedStateFromProps(\r\n props: IOrderTemplateTableHeadingProps,\r\n state: IOrderTemplateTableHeadingState\r\n ): IOrderTemplateTableHeadingState {\r\n const checkedLines = props.lines.filter(line => !line.isChecked).length;\r\n let nextState = { ...state };\r\n nextState = { isChecked: checkedLines === 0 };\r\n return nextState;\r\n }\r\n\r\n public getOnChange = () => (event: React.ChangeEvent) => {\r\n this.setState(\r\n {\r\n isChecked: this.state.isChecked\r\n },\r\n () => {\r\n this.props.clickHandler(!this.state.isChecked);\r\n }\r\n );\r\n };\r\n\r\n public render(): JSX.Element {\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n  \r\n {this.props.productNumber}\r\n {!this.props.isMobile ? {this.props.productName} : null}\r\n {!this.props.isMobile ? {this.props.productUnitPrice} : null}\r\n {!this.props.isMobile ? {this.props.productUOM} : null}\r\n {!this.props.isMobile ? {this.props.productQuantity} : null}\r\n {!this.props.isMobile ? {this.props.productActions} : }\r\n \r\n \r\n );\r\n }\r\n}\r\n","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\n/* eslint-disable no-duplicate-imports */\r\nimport {\r\n //IItemAddedToCartDialogData,\r\n IItemAddedToCartDialogResources,\r\n ILinesAddedToCartDialogResources,\r\n IOrderTemplateNameDialogResources //,\r\n //ItemAddedToCartDialog\r\n} from '@msdyn365-commerce/components';\r\nimport { ItemWithAttributeAddedToCartDialog } from './components/common/item-added-to-cart-dialog.component';\r\nimport MsDyn365, { AsyncResult, getUrlSync, IRequestContext } from '@msdyn365-commerce/core';\r\nimport { ICartActionResult } from '@msdyn365-commerce/global-state';\r\nimport { ProductList, ProductListLine, ProductPrice, AttributeValue } from '@msdyn365-commerce/retail-proxy';\r\nimport {\r\n deleteAsync,\r\n removeProductListLinesAsync,\r\n updateProductListLinesAsync\r\n} from '@msdyn365-commerce/retail-proxy/dist/DataActions/ProductListsDataActions.g';\r\nimport { SimpleProduct } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\r\nimport {\r\n getPriceForSelectedVariant,\r\n getProductUrlSync,\r\n ObjectExtensions,\r\n OrderTemplate,\r\n OrderTemplateLine,\r\n PriceForSelectedVariantInput,\r\n getSelectedVariant,\r\n SelectedVariantInput\r\n} from '@msdyn365-commerce-modules/retail-actions';\r\nimport {\r\n Alert,\r\n getTelemetryObject,\r\n Heading,\r\n IModuleProps,\r\n INodeProps,\r\n ITelemetryContent,\r\n UncontrolledPagination\r\n} from '@msdyn365-commerce-modules/utilities';\r\nimport classnames from 'classnames';\r\nimport debounce from 'lodash/debounce';\r\nimport { action, computed, observable } from 'mobx';\r\nimport { observer } from 'mobx-react';\r\nimport * as React from 'react';\r\n\r\nimport {\r\n IOrderTemplateActionsProps,\r\n IOrderTemplateActionsViewProps,\r\n IOrderTemplateLineProps,\r\n IOrderTemplateLineViewProps,\r\n IOrderTemplateTableHeadingProps,\r\n OrderTemplateActionsView,\r\n OrderTemplateLinesStatusMessage,\r\n OrderTemplateLineView,\r\n OrderTemplateMobileLineView,\r\n OrderTemplateTableHeading,\r\n ModalWarning,\r\n ModalWarningFromLineAction,\r\n IModalWarningResources\r\n} from './components'; //'@msdyn365-commerce-modules/order-template';\r\nimport { ActiveOrderTemplateLinesInput } from './actions/get-quotation';\r\nimport { OrderTemplateBulkActions } from './components/bulk-actions';\r\nimport { IQuotationData } from './quotation.data';\r\nimport { IQuotationProps, IQuotationResources } from './quotation.props.autogenerated';\r\n\r\nimport { AttributesForSelectedVariantInput, getAttributesForSelectedVariant } from '@msdyn365-commerce-modules/product-specification';\r\n\r\nexport interface IItemWithAttributeAddedToCartDialogData {\r\n product: SimpleProduct;\r\n productPrice: ProductPrice;\r\n quantity: number;\r\n producSpecification: AttributeValue[];\r\n}\r\n\r\nexport interface IOrderTemplateLineActionMessageState {\r\n itemKey: string;\r\n userMessage: string;\r\n statusCssString: string;\r\n messageGlyph: string;\r\n isOpen: boolean;\r\n isItemAddedToOrderTemplateOpen: boolean;\r\n isConfirmAddSelectionToBagModalOpen: boolean;\r\n itemAddedToCartDialogData?: IItemWithAttributeAddedToCartDialogData;\r\n productSelection: IOrderTemplateLineViewModel[];\r\n isDetailsDisplayed: boolean;\r\n detailedProductView?: IOrderTemplateLineViewProps;\r\n isQuantityDisabledForUpdate?: boolean;\r\n modalWarningOpen: boolean;\r\n modalWarningFromLineActionOpen: boolean;\r\n productFromLineAction: SimpleProduct;\r\n quantityFromLineAction: number;\r\n itemKeyFromLineAction: string;\r\n productSpecificationFromLineAction: AttributeValue[];\r\n}\r\n\r\nexport type orderTemplateLinesStatus = 'LOADING' | 'SUCCESS' | 'FAILED' | 'EMPTY';\r\ntype GridSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl';\r\n\r\nexport interface IOrderTemplateViewProps extends IQuotationProps {\r\n OrderTemplateLines: IModuleProps;\r\n callbacks?: IOrderTemplateLinesCallbacks;\r\n status?: orderTemplateLinesStatus;\r\n statusMessage?: React.ReactNode;\r\n heading?: React.ReactNode;\r\n OrderTemplateActions?: INodeProps;\r\n ProductsTable?: INodeProps;\r\n ProductsTableRow?: INodeProps;\r\n ProductsTableHeading?: React.ReactNode;\r\n ProductDetails?: INodeProps;\r\n orderLines?: IOrderTemplateLineViewProps[];\r\n productListLines?: ProductListLine[];\r\n productsStatusMessage?: React.ReactNode;\r\n orderActions?: IOrderTemplateActionsViewProps | null;\r\n resources: IQuotationResources;\r\n pagination?: React.ReactNode;\r\n itemAddedToCartDialog?: React.ReactNode;\r\n bulkOrderLineActions?: React.ReactNode;\r\n isDetailsDisplayed?: boolean;\r\n detailedProduct?: IOrderTemplateLineProps;\r\n detailedProductView?: IOrderTemplateLineViewProps;\r\n productQuantityView?: React.ReactNode;\r\n addButton?: React.ReactNode;\r\n isMobile?: boolean;\r\n toggleDetailsDisplayed?(props: IOrderTemplateLineProps | undefined): void;\r\n modalWarning?: React.ReactNode;\r\n modalWarningFromLineAction?: React.ReactNode;\r\n}\r\n\r\nexport interface IOrderTemplateLinesCallbacks {\r\n updateQuantity(itemKey: string, quantity: number): void;\r\n}\r\n\r\nexport interface IOrderTemplateLineViewModel extends OrderTemplateLine {\r\n isChecked: boolean;\r\n productQuantityView: React.ReactNode;\r\n productSpecificationData: AttributeValue[];\r\n}\r\n\r\n/**\r\n *\r\n * OrderTemplateLines component.\r\n * @extends {React.PureComponent, IOrderTemplateLineActionMessageState>}\r\n */\r\n@observer\r\nclass OrderTemplateLines extends React.Component, IOrderTemplateLineActionMessageState> {\r\n private readonly className: string;\r\n\r\n private readonly telemetryContent?: ITelemetryContent;\r\n\r\n @observable\r\n private _viewport: GridSize;\r\n\r\n @computed get isMobile(): boolean {\r\n return this._viewport === 'xs' || this._viewport === 'sm';\r\n }\r\n\r\n public async _getProductSpecifications(orderTemplate: OrderTemplate | undefined): Promise {\r\n let orderTemplateWithAttributes: IOrderTemplateLineViewModel[] = [];\r\n\r\n const orderLength = orderTemplate?.orderTemplateLines.length ?? 0;\r\n for (let i = 0; i < orderLength; i++) {\r\n let line = orderTemplate?.orderTemplateLines[i];\r\n\r\n const productInput = new SelectedVariantInput(\r\n line?.fullProduct?.ProductDetails.RecordId ?? 0, //MasterProductId\r\n +this.props.context.actionContext.requestContext.apiSettings.channelId\r\n );\r\n const simpleProduct = await getSelectedVariant(productInput, this.props.context.actionContext);\r\n\r\n const attributeInput = new AttributesForSelectedVariantInput(\r\n line?.fullProduct?.ProductDetails.RecordId ?? 0, //MasterProductId\r\n +this.props.context.actionContext.requestContext.apiSettings.channelId,\r\n simpleProduct ?? undefined //this.props.data.product.result\r\n );\r\n const productSpecification = await getAttributesForSelectedVariant(attributeInput, this.props.context.actionContext);\r\n\r\n orderTemplateWithAttributes.push({\r\n ...(orderTemplate?.orderTemplateLines[i] as IOrderTemplateLineViewModel),\r\n productSpecificationData: productSpecification\r\n });\r\n }\r\n\r\n return orderTemplateWithAttributes;\r\n }\r\n\r\n constructor(props: IQuotationProps, state: IOrderTemplateLineActionMessageState) {\r\n super(props);\r\n //debugger;\r\n this.className = 'ms-order-template';\r\n this._viewport =\r\n props.context.request && props.context.request.device && props.context.request.device.Type === 'Mobile' ? 'xs' : 'lg';\r\n this._updateViewport = this._updateViewport.bind(this);\r\n\r\n this.state = {\r\n itemKey: '',\r\n userMessage: '',\r\n statusCssString: 'success',\r\n messageGlyph: 'fas fa-check',\r\n isOpen: false,\r\n isItemAddedToOrderTemplateOpen: false,\r\n isConfirmAddSelectionToBagModalOpen: false,\r\n productSelection: [],\r\n isDetailsDisplayed: false,\r\n isQuantityDisabledForUpdate: false,\r\n modalWarningOpen: false,\r\n modalWarningFromLineActionOpen: false,\r\n productFromLineAction: Object(),\r\n quantityFromLineAction: 0,\r\n itemKeyFromLineAction: '',\r\n productSpecificationFromLineAction: []\r\n };\r\n this.telemetryContent = getTelemetryObject(\r\n this.props.context.request.telemetryPageName!,\r\n this.props.friendlyName,\r\n this.props.telemetry\r\n );\r\n this._updateViewport();\r\n\r\n if (MsDyn365.isBrowser && !this.props.context.request.user.isAuthenticated) {\r\n window.location.assign(this.props.context.request.user.signInUrl || '/');\r\n }\r\n }\r\n\r\n @action\r\n public async componentDidMount(): Promise {\r\n //debugger;\r\n this.setState({});\r\n const orderTemplate = await this.props.data.orderTemplate;\r\n this.props.config.heading!.text = orderTemplate?.productList.Name || '';\r\n\r\n const orderTemplateLinesWithAttributes = await this._getProductSpecifications(orderTemplate);\r\n\r\n this.setState({\r\n //productSelection: orderTemplate?.orderTemplateLines as IOrderTemplateLineViewModel[]\r\n productSelection: orderTemplateLinesWithAttributes as IOrderTemplateLineViewModel[]\r\n });\r\n\r\n if (MsDyn365.isBrowser) {\r\n window.addEventListener('resize', this._updateViewport);\r\n this._updateViewport();\r\n }\r\n }\r\n\r\n public warningOpen = () => {\r\n this.setState({\r\n modalWarningOpen: true\r\n });\r\n };\r\n\r\n public warningClose = () => {\r\n this.setState({\r\n modalWarningOpen: false\r\n });\r\n };\r\n\r\n public warningFromLineActionOpen = (\r\n product: SimpleProduct,\r\n quantity: number,\r\n itemKey: string,\r\n productSpecification: AttributeValue[]\r\n ) => {\r\n this.setState({\r\n modalWarningFromLineActionOpen: true,\r\n productFromLineAction: product,\r\n quantityFromLineAction: quantity,\r\n itemKeyFromLineAction: itemKey,\r\n productSpecificationFromLineAction: productSpecification\r\n });\r\n };\r\n\r\n public warningFromLineActionClose = () => {\r\n this.setState({\r\n modalWarningFromLineActionOpen: false\r\n });\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 public shouldComponentUpdate(nextProps: IQuotationProps, nextState: IOrderTemplateLineActionMessageState): boolean {\r\n if (this.state === nextState && this.props === nextProps) {\r\n return false;\r\n }\r\n return true;\r\n }\r\n\r\n public render(): JSX.Element | null {\r\n const { heading, className } = this.props.config;\r\n const { emptyOrderTemplateLinesText, errorGettingOrderTemplateLines } = this.props.resources;\r\n const { orderTemplate, cart } = this.props.data;\r\n\r\n if (cart.status === 'LOADING' || ObjectExtensions.isNullOrUndefined(orderTemplate) || orderTemplate.status === 'LOADING') {\r\n const errorProps: IOrderTemplateViewProps = {\r\n ...(this.props as IQuotationProps),\r\n OrderTemplateLines: {\r\n moduleProps: this.props,\r\n className: classnames(this.className, className)\r\n },\r\n status: 'LOADING',\r\n statusMessage: ,\r\n heading: heading && ,\r\n resources: this.props.resources\r\n };\r\n return this.props.renderView(errorProps);\r\n }\r\n\r\n if (cart.status === 'FAILED' || orderTemplate.status === 'FAILED') {\r\n const errorProps: IOrderTemplateViewProps = {\r\n ...(this.props as IQuotationProps),\r\n OrderTemplateLines: {\r\n moduleProps: this.props,\r\n className: classnames(`${this.className}`, className)\r\n },\r\n status: 'FAILED',\r\n statusMessage: ,\r\n heading: heading && ,\r\n resources: this.props.resources\r\n };\r\n\r\n return this.props.renderView(errorProps);\r\n }\r\n\r\n const orderTemplateResult = orderTemplate && orderTemplate.result;\r\n const orderTemplateLines = orderTemplateResult && orderTemplateResult.orderTemplateLines;\r\n\r\n if (!orderTemplateResult || !orderTemplateLines || orderTemplateLines.length === 0) {\r\n if (orderTemplateResult && !this._isFirstPage() && MsDyn365.isBrowser) {\r\n window.location.href = this._getOrderTemplatePageUrl();\r\n return null;\r\n }\r\n\r\n const emptyViewProps: IOrderTemplateViewProps = {\r\n ...(this.props as IQuotationProps),\r\n OrderTemplateLines: {\r\n moduleProps: this.props,\r\n className: classnames(`${this.className}`, className)\r\n },\r\n status: 'EMPTY',\r\n statusMessage: ,\r\n heading: heading && ,\r\n resources: this.props.resources\r\n };\r\n\r\n return this.props.renderView(emptyViewProps);\r\n }\r\n\r\n const viewProps: IOrderTemplateViewProps = {\r\n ...(this.props as IQuotationProps),\r\n OrderTemplateLines: {\r\n moduleProps: this.props,\r\n className: classnames(`${this.className}`, className)\r\n },\r\n status: 'SUCCESS',\r\n productsStatusMessage: this.state.isOpen && (\r\n
\r\n \r\n {this.state.userMessage}\r\n \r\n
\r\n ),\r\n heading: heading && ,\r\n OrderTemplateActions: {\r\n className: `${this.className}-action-bar`,\r\n tag: 'div'\r\n },\r\n ProductsTable: {\r\n className: `${this.className}__table`,\r\n tag: 'table',\r\n role: 'grid'\r\n },\r\n ProductsTableRow: {\r\n className: `${this.className}-table-line`,\r\n tag: 'tr'\r\n },\r\n ProductsTableHeading: this._renderProductListHeader(this.props.resources),\r\n ProductDetails: {\r\n className: `${this.className}-table-line__link`,\r\n tag: 'a'\r\n },\r\n orderLines: this._renderProductList(),\r\n callbacks: { updateQuantity: debounce(this._changeQuantity, 2000) },\r\n orderActions: this._renderOrderTemplateActions(orderTemplateResult),\r\n pagination: this._renderPagination(),\r\n itemAddedToCartDialog: this._renderItemAddedToCartDialog(),\r\n bulkOrderLineActions: this._getOrderTemplateLineActions(orderTemplateResult.productList.Id),\r\n isDetailsDisplayed: this.state.isDetailsDisplayed,\r\n toggleDetailsDisplayed: this._toggleDetailsDisplayed,\r\n detailedProductView: this.state.detailedProductView,\r\n isMobile: this.isMobile,\r\n modalWarning: this._renderModalWarning(),\r\n modalWarningFromLineAction: this._renderModalWarningFromLineAction()\r\n };\r\n\r\n return this.props.renderView(viewProps) as React.ReactElement;\r\n }\r\n\r\n public onSelect(line: IOrderTemplateLineViewModel, isChecked: boolean): void {\r\n line.isChecked = isChecked;\r\n\r\n const updated =\r\n this.state.productSelection.map(product => {\r\n if (product.fullProduct?.ProductDetails.ItemId === line.fullProduct?.ProductDetails.ItemId) {\r\n line.isChecked = isChecked;\r\n }\r\n return product;\r\n }) || [];\r\n\r\n this.setState({\r\n productSelection: updated\r\n });\r\n }\r\n\r\n public onSelectAll(isChecked: boolean): void {\r\n const updated =\r\n this.state.productSelection.map(line => {\r\n line.isChecked = isChecked;\r\n return line;\r\n }) || [];\r\n\r\n this.setState({\r\n productSelection: updated\r\n });\r\n }\r\n\r\n private _renderProductListHeader(resources: IQuotationResources): React.ReactNode {\r\n const {\r\n productNumberText,\r\n productText,\r\n productUnitPriceText,\r\n productUOMText,\r\n productQuantityText,\r\n productActionsText,\r\n selectAllRowsText\r\n } = resources;\r\n const headers: IOrderTemplateTableHeadingProps = {\r\n productNumber: productNumberText,\r\n productName: productText,\r\n productUnitPrice: productUnitPriceText,\r\n productUOM: productUOMText,\r\n productQuantity: productQuantityText,\r\n productActions: productActionsText,\r\n selectAllRowsText,\r\n lines: this.state.productSelection,\r\n isMobile: this.isMobile,\r\n clickHandler: (isChecked: boolean) => {\r\n this.onSelectAll(isChecked);\r\n }\r\n };\r\n\r\n return ;\r\n }\r\n\r\n private _getOrderTemplateLineActions(orderTemplateId: string): React.ReactNode {\r\n return (\r\n line.isChecked)}\r\n onAddSelectionToBag={this.warningOpen} //{this._onAddSelectionToBag}\r\n onRemoveSelection={this._onRemoveSelection}\r\n isMinifiedView={this.isMobile}\r\n />\r\n );\r\n }\r\n\r\n private _generateLinesAddedToCartDialogResources(): ILinesAddedToCartDialogResources {\r\n return {\r\n viewCartButtonText: this.props.resources.viewCartButtonText,\r\n orderTemplateCloseButtonText: this.props.resources.orderTemplateCloseButtonText,\r\n linesAddedToCartHeaderItemsOneText: this.props.resources.linesAddedToCartHeaderItemsOneText,\r\n linesAddedToCartHeaderLinesOneText: this.props.resources.linesAddedToCartHeaderLinesOneText,\r\n linesAddedToCartHeaderLinesFormatText: this.props.resources.linesAddedToCartHeaderLinesFormatText,\r\n linesAddedToCartHeaderMessageText: this.props.resources.linesAddedToCartHeaderMessageText\r\n };\r\n }\r\n\r\n private _generateItemAddedToCartDialogResources(): IItemAddedToCartDialogResources {\r\n return {\r\n viewCartButtonText: this.props.resources.viewCartButtonText,\r\n orderTemplateCloseButtonText: this.props.resources.orderTemplateCloseButtonText,\r\n itemAddedToCartHeaderItemOneText: this.props.resources.itemAddedToCartHeaderItemOneText,\r\n itemAddedToCartHeaderItemFormatText: this.props.resources.itemAddedToCartHeaderItemFormatText,\r\n itemAddedToCartHeaderMessageText: this.props.resources.itemAddedToCartHeaderMessageText,\r\n freePriceText: this.props.resources.freePriceText,\r\n originalPriceText: this.props.resources.originalPriceText,\r\n currentPriceText: this.props.resources.currentPriceText\r\n };\r\n }\r\n\r\n private readonly _onRemoveSelection = (): void => {\r\n const { context, resources } = this.props;\r\n const { telemetry } = context;\r\n const { removeSelectedFailureMessage, removeSelectedSuccessMessage } = resources;\r\n const lines = this.state.productSelection;\r\n const productListLines = lines && lines.length && lines.filter(line => line.isChecked).map(line => line.productListLine);\r\n\r\n if (productListLines && productListLines.length > 0) {\r\n const productListId = productListLines[0].ProductListId;\r\n\r\n const maxWaitTimeInMilliSeconds: number = 1000;\r\n removeProductListLinesAsync({ callerContext: context.actionContext }, productListId!, productListLines)\r\n .then(async () => {\r\n this.setState({\r\n userMessage: removeSelectedSuccessMessage,\r\n statusCssString: 'success',\r\n messageGlyph: 'fas fa-check',\r\n isOpen: true\r\n });\r\n // eslint-disable-next-line no-promise-executor-return -- fix\r\n await new Promise(resolve => setTimeout(resolve, maxWaitTimeInMilliSeconds));\r\n window.location.reload();\r\n })\r\n .catch(error => {\r\n telemetry.warning('[order-template-lines] Unable remove items from the order template lines');\r\n telemetry.error(error);\r\n this.setState({\r\n userMessage: removeSelectedFailureMessage,\r\n statusCssString: 'success',\r\n messageGlyph: 'fas fa-check',\r\n isOpen: true\r\n });\r\n });\r\n }\r\n };\r\n\r\n private readonly _getOrderTemplatePageUrl = (): string => {\r\n let url = getUrlSync('ordertemplate', this.props.context.actionContext) || '';\r\n url = url.includes('?') ? url.substr(0, url.indexOf('?')) : url;\r\n if (this.props.data.orderTemplate?.result?.productList.Id) {\r\n return `${url}?id=${this.props.data.orderTemplate.result.productList.Id}`;\r\n }\r\n return '';\r\n };\r\n\r\n private readonly _onAddSelectionToBag = async (): Promise => {\r\n const lines = this.state.productSelection;\r\n const selectedLines = lines.filter(line => line.isChecked);\r\n if (selectedLines.length > 0) {\r\n for (const productLine of selectedLines) {\r\n const itemKey = productLine.fullProduct?.ProductDetails.ItemId ?? '';\r\n const product = productLine.fullProduct?.ProductDetails ?? {\r\n RecordId: 0,\r\n ProductTypeValue: 0,\r\n BasePrice: 0,\r\n Price: 0,\r\n AdjustedPrice: 0\r\n };\r\n const productSpecification = productLine.productSpecificationData;\r\n const quantity = productLine.productListLine.Quantity ?? 0;\r\n this._addItemToBag(product, quantity, itemKey, productSpecification);\r\n }\r\n }\r\n return Promise.resolve(void 0);\r\n };\r\n\r\n private _renderOrderTemplateActions(orderTemplate: OrderTemplate): IOrderTemplateActionsViewProps {\r\n const { id, typeName, context, resources } = this.props;\r\n const {\r\n addTemplateToBagButtonText,\r\n renameTemplateButtonText,\r\n deleteTemplateButtonText,\r\n closeWindowButtonText,\r\n addToCartFailureMessage,\r\n addToCartSuccessMessage,\r\n addToCartProcessMessage\r\n } = resources;\r\n\r\n const orderTemplateActions: IOrderTemplateActionsProps = {\r\n data: { orderTemplate },\r\n id,\r\n typeName,\r\n context,\r\n telemetryContent: this.telemetryContent,\r\n handlers: {\r\n onRenameTemplate: this._renameTemplate,\r\n onRemoveTemplate: this._removeTemplate\r\n },\r\n renameOrderTemplateDialogStrings: this._generateOrderTemplateNameDialogResources(resources),\r\n resources: {\r\n addTemplateToBagButtonText,\r\n renameTemplateButtonText,\r\n deleteTemplateButtonText,\r\n addToCartFailureMessage,\r\n addToCartSuccessMessage,\r\n addToCartProcessMessage,\r\n closeWindowButtonText,\r\n linesAddedToCartDialogResources: this._generateLinesAddedToCartDialogResources()\r\n }\r\n };\r\n\r\n return OrderTemplateActionsView(orderTemplateActions);\r\n }\r\n\r\n private _generateOrderTemplateNameDialogResources(resources: IQuotationResources): IOrderTemplateNameDialogResources {\r\n return {\r\n orderTemplateHeaderLabel: resources.renameOrderTemplateTitleText,\r\n orderTemplateTitleLabel: resources.orderTemplateTitle,\r\n orderTemplateNameAriaLabel: resources.orderTemplateTitle,\r\n orderTemplateDescription: '',\r\n defaultOrderTemplateName: resources.defaultOrderTemplateName,\r\n orderTemplateButtonLabel: resources.renameOrderTemplateButtonText,\r\n orderTemplateCancelButtonLabel: resources.cancelBtnLabel\r\n };\r\n }\r\n\r\n private readonly _getCurrentUrl = (reqContext: IRequestContext): URL => {\r\n if (MsDyn365.isBrowser) {\r\n return new URL(window.location.href);\r\n }\r\n return new URL(reqContext.url.requestUrl.href);\r\n };\r\n\r\n /**\r\n * On close handler.\r\n */\r\n private readonly onCloseHandler = () => {\r\n this.setState({\r\n itemKey: this.state.itemKey,\r\n userMessage: this.state.userMessage,\r\n statusCssString: this.state.statusCssString,\r\n messageGlyph: this.state.messageGlyph,\r\n isOpen: this.state.isOpen,\r\n isItemAddedToOrderTemplateOpen: false\r\n });\r\n };\r\n\r\n private readonly _renderItemAddedToCartDialog = (): React.ReactNode | null => {\r\n if (!this.state.itemAddedToCartDialogData) {\r\n return null;\r\n }\r\n\r\n return (\r\n \r\n );\r\n };\r\n\r\n private _isFirstPage(): boolean {\r\n return this._getCurrentPageNumber() === 0;\r\n }\r\n\r\n private _getCurrentPageNumber(): number {\r\n const itemsPerPage = this.props.config.itemsPerPage || 50;\r\n return (this.props.context.request.query && +this.props.context.request.query.skip / itemsPerPage) || 0;\r\n }\r\n\r\n private readonly _renderPagination = (): React.ReactNode | null => {\r\n const { config, context, data, resources } = this.props;\r\n const orderTemplate = data && data.orderTemplate && data.orderTemplate.result;\r\n if (!orderTemplate) {\r\n return null;\r\n }\r\n\r\n const fullUrl = this._getCurrentUrl(context.request);\r\n const itemsPerPage = config.itemsPerPage || 50;\r\n const currentPageNumber = this._getCurrentPageNumber();\r\n const skipCount = currentPageNumber * itemsPerPage;\r\n const totalItems = orderTemplate && orderTemplate.totalLines;\r\n const previousText = resources.flipperPrevious;\r\n const nextText = resources.flipperNext;\r\n\r\n if (totalItems <= itemsPerPage) {\r\n return null;\r\n }\r\n\r\n return (\r\n \r\n );\r\n };\r\n\r\n private _renderProductList(): IOrderTemplateLineViewProps[] {\r\n const {\r\n selectOneRowText,\r\n moreButtonText,\r\n viewProductDetailsText,\r\n priceFree,\r\n originalPriceText,\r\n currentPriceText,\r\n addOrderTemplateItemToBagButtonText,\r\n removeItemFromOrderTemplateButtonText,\r\n productDimensionTypeColor,\r\n productDimensionTypeSize,\r\n productDimensionTypeStyle,\r\n inputQuantityAriaLabel,\r\n deleteButtonText,\r\n incrementButtonAriaLabel,\r\n decrementButtonAriaLabel\r\n } = this.props.resources;\r\n\r\n const { context, telemetry } = this.props;\r\n const { imageSettings } = this.props.config;\r\n\r\n return this.state.productSelection.map((line, index) => {\r\n const currentProductProps: IOrderTemplateLineProps = {\r\n orderTemplateLine: line,\r\n productListLine: line.productListLine,\r\n price: line.fullProduct?.ProductPrice,\r\n context,\r\n isQuantityDisabledForUpdate: this.state.isQuantityDisabledForUpdate,\r\n productUrl: line.fullProduct ? getProductUrlSync(line.fullProduct.ProductDetails, context.actionContext, undefined) : '',\r\n imageSettings,\r\n telemetry,\r\n moduleId: this.props.id,\r\n moduleTypeName: this.props.typeName,\r\n quantity: line.productListLine.Quantity!,\r\n handlers: {\r\n onAddToBag: this.warningFromLineActionOpen,\r\n onRemoveItem: this._removeItemFromOrderTemplateLines,\r\n onChangeQuantity: this._changeQuantity,\r\n onSelect: this.onSelect.bind(this)\r\n },\r\n resources: {\r\n selectOneRowText,\r\n moreButtonText,\r\n viewProductDetailsText,\r\n productDimensionTypeColor,\r\n productDimensionTypeSize,\r\n productDimensionTypeStyle,\r\n freePriceText: priceFree,\r\n originalPriceText,\r\n currentPriceText,\r\n inputQuantityAriaLabel,\r\n removeFromOrderTemplateLinesText: removeItemFromOrderTemplateButtonText,\r\n addToBagButtonText: addOrderTemplateItemToBagButtonText,\r\n deleteButtonText,\r\n incrementButtonAriaLabel,\r\n decrementButtonAriaLabel\r\n },\r\n index,\r\n isMobile: this.isMobile,\r\n toggleDetailsDisplayed: this._toggleDetailsDisplayed\r\n };\r\n\r\n return OrderTemplateLineView(currentProductProps)!;\r\n });\r\n }\r\n\r\n private readonly _toggleDetailsDisplayed = (props: IOrderTemplateLineProps): void => {\r\n let state = {\r\n isDetailsDisplayed: !this.state.isDetailsDisplayed\r\n };\r\n if (props) {\r\n state = {\r\n ...state,\r\n ...{\r\n detailedProductView: OrderTemplateMobileLineView(props)\r\n }\r\n };\r\n }\r\n this.setState(state);\r\n };\r\n\r\n // Dismiss alert when addingToCart/removeItem\r\n private readonly _onDismiss = () => {\r\n this.setState({\r\n isOpen: false\r\n });\r\n };\r\n\r\n private readonly _changeQuantity = (itemKey: string, quantity: number, props?: IOrderTemplateLineProps) => {\r\n const { context, data, telemetry, config, resources } = this.props;\r\n const { orderTemplate } = data;\r\n\r\n if (context) {\r\n if (orderTemplate?.result) {\r\n const orderTemplateLinesData = orderTemplate.result.orderTemplateLines;\r\n if (orderTemplateLinesData) {\r\n const orderLineIndex = orderTemplateLinesData.findIndex(\r\n (lines: OrderTemplateLine) => lines.productListLine.LineId === itemKey\r\n );\r\n const newProductListLine = { ...orderTemplateLinesData[orderLineIndex] };\r\n if (orderTemplateLinesData[orderLineIndex].productListLine.Quantity === quantity) {\r\n return;\r\n }\r\n const prevQuantity = newProductListLine.productListLine.Quantity;\r\n newProductListLine.productListLine.Quantity = quantity;\r\n const { fullProduct, ...line } = newProductListLine;\r\n\r\n // Update mobile modal\r\n if (props) {\r\n props.quantity = quantity;\r\n this.setState({\r\n detailedProductView: OrderTemplateMobileLineView(props)\r\n });\r\n }\r\n\r\n this.setState({\r\n isQuantityDisabledForUpdate: true\r\n });\r\n\r\n updateProductListLinesAsync({ callerContext: context.actionContext }, orderTemplate.result.productList.Id, [\r\n line.productListLine\r\n ])\r\n .then(list => {\r\n this.setState({\r\n itemKey,\r\n userMessage: '',\r\n statusCssString: 'success',\r\n messageGlyph: 'fas fa-check',\r\n isQuantityDisabledForUpdate: false,\r\n isOpen: false\r\n });\r\n if (list) {\r\n const newLine = list.find(lines => lines.LineId === itemKey);\r\n orderTemplateLinesData[orderLineIndex].productListLine = newLine!;\r\n const updatedLines = [...orderTemplateLinesData];\r\n updatedLines[orderLineIndex] = { fullProduct, productListLine: newLine! };\r\n const updatedOrderTemplate = { ...orderTemplate.result, ProductListLines: updatedLines };\r\n context.actionContext.update(\r\n new ActiveOrderTemplateLinesInput(context.actionContext.requestContext, config),\r\n updatedOrderTemplate\r\n );\r\n }\r\n })\r\n .catch(error => {\r\n telemetry.warning('[order-template-lines] Unable to update product quantity.');\r\n telemetry.error(error);\r\n const userMessage = resources.editOrderTemplateLineQuantityError;\r\n if (props) {\r\n props && (props.productListLine.Quantity = prevQuantity);\r\n this.setState({\r\n itemKey,\r\n userMessage,\r\n statusCssString: 'danger',\r\n messageGlyph: 'fas fa-exclamation-triangle',\r\n isQuantityDisabledForUpdate: false,\r\n isOpen: true,\r\n detailedProductView: OrderTemplateMobileLineView(props)\r\n });\r\n } else {\r\n newProductListLine.productListLine.Quantity = prevQuantity;\r\n this.setState({\r\n itemKey,\r\n userMessage,\r\n statusCssString: 'danger',\r\n messageGlyph: 'fas fa-exclamation-triangle',\r\n isQuantityDisabledForUpdate: false,\r\n isOpen: true\r\n });\r\n }\r\n });\r\n }\r\n }\r\n }\r\n };\r\n\r\n private readonly _addItemToBag = (\r\n product: SimpleProduct,\r\n quantity: number,\r\n itemKey: string,\r\n producSpecification: AttributeValue[]\r\n ): void => {\r\n const { context, data, resources, telemetry } = this.props;\r\n const { cart } = data;\r\n const { maxQuantityLimitText, addedToCartFailureMessage } = resources;\r\n\r\n if (context) {\r\n if (cart.result) {\r\n const addProductToCartInput = {\r\n product,\r\n count: quantity\r\n };\r\n\r\n cart.result\r\n .addProductToCart(addProductToCartInput)\r\n .then((result: ICartActionResult) => {\r\n if (result.status === 'SUCCESS') {\r\n return getPriceForSelectedVariant(\r\n new PriceForSelectedVariantInput(\r\n product.RecordId,\r\n this.props.context.actionContext.requestContext.apiSettings.channelId,\r\n product\r\n ),\r\n this.props.context.actionContext\r\n ).then(priceResult => {\r\n if (!priceResult) {\r\n return AsyncResult.reject('Failed to retrieve product price');\r\n }\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- read config file.\r\n const isMiniCart = context.app.config.addToCartBehavior === 'showMiniCart';\r\n this.setState({\r\n itemKey,\r\n userMessage: '',\r\n statusCssString: 'success',\r\n messageGlyph: 'fas fa-check',\r\n isOpen: false,\r\n isItemAddedToOrderTemplateOpen: !isMiniCart,\r\n itemAddedToCartDialogData: {\r\n product,\r\n productPrice: priceResult,\r\n quantity,\r\n producSpecification\r\n },\r\n isDetailsDisplayed: false\r\n });\r\n return AsyncResult.resolve();\r\n });\r\n } else if (result.substatus === 'MAXQUANTITY') {\r\n this.setState({\r\n itemKey,\r\n userMessage:\r\n maxQuantityLimitText\r\n .replace('{curQuantity}', quantity.toString())\r\n .replace('{maxQuantity}', context.app.config.maxQuantityForProductListLineItem.toString()) ||\r\n `You can only add ${context.app.config.maxQuantityForProductListLineItem} of this item to your shopping bag`,\r\n statusCssString: 'danger',\r\n messageGlyph: 'fas fa-exclamation-triangle',\r\n isOpen: true\r\n });\r\n return AsyncResult.resolve();\r\n }\r\n telemetry.debug('[order-template-lines] Unable to Update Cart Line from the order template lines');\r\n this.setState({\r\n itemKey,\r\n userMessage: addedToCartFailureMessage,\r\n statusCssString: 'danger',\r\n messageGlyph: 'fas fa-exclamation-triangle',\r\n isOpen: true\r\n });\r\n return AsyncResult.resolve();\r\n })\r\n .catch((error: Error) => {\r\n telemetry.warning(error.message);\r\n telemetry.debug('[order-template-lines] Error trying to Update Cart Line from the order template lines');\r\n this.setState({\r\n itemKey,\r\n userMessage: addedToCartFailureMessage,\r\n statusCssString: 'danger',\r\n messageGlyph: 'fas fa-exclamation-triangle',\r\n isOpen: true\r\n });\r\n });\r\n }\r\n }\r\n };\r\n\r\n private readonly _removeItemFromOrderTemplateLines = (line: IOrderTemplateLineViewModel): void | undefined => {\r\n const { context, data, telemetry } = this.props;\r\n const { orderTemplate } = data;\r\n\r\n if (context && context.actionContext) {\r\n const maxWaitTimeInMilliSeconds: number = 1000;\r\n const userToken = context.request.user.isAuthenticated && context.request.user.token;\r\n if (userToken && orderTemplate?.result && line) {\r\n removeProductListLinesAsync({ callerContext: context.actionContext }, line.productListLine.ProductListId!, [\r\n line.productListLine\r\n ])\r\n .then(async () => {\r\n // eslint-disable-next-line no-promise-executor-return -- fix\r\n await new Promise(resolve => setTimeout(resolve, maxWaitTimeInMilliSeconds));\r\n window.location.reload();\r\n })\r\n .catch(error => {\r\n telemetry.warning('[order-template-lines] Unable remove items from the order template lines');\r\n telemetry.error(error);\r\n });\r\n } else {\r\n telemetry.warning(\r\n '[order-template-lines] Unable remove items from the order template lines user token or lineItemID was not found'\r\n );\r\n }\r\n }\r\n };\r\n\r\n private readonly _renameTemplate = async (_template: ProductList): Promise => {\r\n window.location.reload();\r\n return Promise.resolve();\r\n };\r\n\r\n private readonly _removeTemplate = () => {\r\n const { context, data, telemetry, resources } = this.props;\r\n const { orderTemplate } = data;\r\n\r\n if (context && context.actionContext) {\r\n const userToken = context.request.user.isAuthenticated && context.request.user.token;\r\n if (userToken && orderTemplate && orderTemplate.result) {\r\n deleteAsync({ callerContext: context.actionContext }, orderTemplate.result.productList)\r\n .then()\r\n .catch((error: string) => {\r\n telemetry.warning('[order-template] Unable to delete order template.');\r\n telemetry.error(error);\r\n this.setState({\r\n itemKey: orderTemplate.result?.productList.Id || '',\r\n userMessage: resources.deleteOrderTemplateFailedText,\r\n statusCssString: 'danger',\r\n messageGlyph: 'fas fa-exclamation-triangle',\r\n isOpen: true\r\n });\r\n });\r\n const newLink = getUrlSync('ordertemplatelist', this.props.context.actionContext);\r\n if (newLink) {\r\n window.location.assign(newLink);\r\n }\r\n } else {\r\n telemetry.warning('[order-template] Failed to delete order template. Order template was not found');\r\n }\r\n } else {\r\n telemetry.warning('[order-template] Failed to delete order template.');\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 // Always render in mobile viewport on a mobile device\r\n if (context.request && context.request.device && context.request.device.Type === 'Mobile') {\r\n return 'xs';\r\n }\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 /**\r\n * Renders a Pagination previous text.\r\n * @param paginationPreviousText - Pagination previous text from resources.\r\n * @returns Previous text and flipper icon.\r\n */\r\n private readonly _renderPrev = (paginationPreviousText: string) => {\r\n return (\r\n
\r\n
\r\n );\r\n };\r\n\r\n /**\r\n * Renders a Pagination next text.\r\n * @param paginationNextText - Pagination next text from resources.\r\n * @returns Next text and flipper icon.\r\n */\r\n private readonly _renderNext = (paginationNextText: string) => {\r\n return (\r\n
\r\n {paginationNextText}\r\n
\r\n );\r\n };\r\n\r\n private _renderModalWarning = () => {\r\n const modalWarningResources: IModalWarningResources = {\r\n modalWarningMessage: this.props.resources.addToOrderTemplateDialogWarningV2\r\n };\r\n\r\n return (\r\n \r\n );\r\n };\r\n\r\n private _renderModalWarningFromLineAction = () => {\r\n return (\r\n \r\n );\r\n };\r\n}\r\n\r\nexport default OrderTemplateLines;\r\n","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\n/* eslint-disable no-duplicate-imports */\r\nimport { Button, INodeProps, Modal, ModalBody, ModalFooter, ModalHeader, Module, Node } from '@msdyn365-commerce-modules/utilities';\r\nimport * as React from 'react';\r\n\r\nimport { IOrderTemplateLineViewProps } from './components';\r\nimport { IOrderTemplateViewProps } from './quotation';\r\n\r\nconst OrderTemplateLinesView: React.FC = (props: IOrderTemplateViewProps) => {\r\n const {\r\n OrderTemplateLines,\r\n status,\r\n statusMessage,\r\n heading,\r\n ProductsTable,\r\n ProductsTableHeading,\r\n orderLines,\r\n ProductsTableRow,\r\n productsStatusMessage,\r\n OrderTemplateActions,\r\n orderActions,\r\n pagination,\r\n itemAddedToCartDialog,\r\n bulkOrderLineActions,\r\n isDetailsDisplayed,\r\n detailedProductView,\r\n toggleDetailsDisplayed,\r\n modalWarning,\r\n modalWarningFromLineAction,\r\n resources: { cancelBtnLabel, productNumberText, productText, productUnitPriceText, productUOMText, productQuantityText }\r\n } = props;\r\n\r\n const toggleDetails = React.useCallback(() => {\r\n toggleDetailsDisplayed && toggleDetailsDisplayed(undefined);\r\n }, [toggleDetailsDisplayed]);\r\n\r\n return (\r\n \r\n {heading}\r\n {OrderTemplateActions && (\r\n \r\n {orderActions?.addTemplateToBag}\r\n {orderActions?.renameTemplate}\r\n {orderActions?.removeTemplate}\r\n {!isDetailsDisplayed && productsStatusMessage}\r\n \r\n )}\r\n {bulkOrderLineActions}\r\n {status !== 'SUCCESS' && statusMessage}\r\n {ProductsTable && orderLines && orderLines.length > 0 && (\r\n \r\n \r\n {ProductsTableHeading}\r\n \r\n {orderLines &&\r\n orderLines.map(product => {\r\n return _renderItem(product, productQuantityText, ProductsTableRow);\r\n })}\r\n \r\n \r\n {pagination}\r\n \r\n )}\r\n {itemAddedToCartDialog}\r\n \r\n Product Details\r\n \r\n
    \r\n
  • {detailedProductView?.productImage}
  • \r\n
  • \r\n {productText}:\r\n {detailedProductView?.productInfo}\r\n
  • \r\n
  • \r\n {productNumberText}:\r\n {detailedProductView?.productNumber}\r\n
  • \r\n
  • \r\n {productUnitPriceText}: {detailedProductView?.productPrice}\r\n
  • \r\n
  • \r\n {productUOMText}: {detailedProductView?.productUnitOfMeasure}\r\n
  • \r\n
  • \r\n {productQuantityText}:\r\n {detailedProductView?.productQuantityView}\r\n
  • \r\n {productsStatusMessage &&
  • {productsStatusMessage}
  • }\r\n
\r\n
\r\n \r\n \r\n \r\n \r\n {modalWarning}\r\n {modalWarningFromLineAction}\r\n
\r\n );\r\n};\r\n\r\nconst _renderItem = (product: IOrderTemplateLineViewProps, quantityLabel: string, ProductsTableRow?: INodeProps): JSX.Element | null => {\r\n if (!product) {\r\n return null;\r\n }\r\n\r\n const {\r\n key,\r\n selectLine,\r\n productImage,\r\n productPrice,\r\n //productNumber,\r\n addToBagButton,\r\n removeButton,\r\n productInfo,\r\n productUnitOfMeasure,\r\n productQuantityView,\r\n productQuantity,\r\n popUp,\r\n isMobile,\r\n externalItemId\r\n } = product;\r\n\r\n return (\r\n \r\n {selectLine}\r\n {productImage}\r\n {isMobile ? (\r\n \r\n
{externalItemId}
\r\n
\r\n {quantityLabel}: {productQuantity}\r\n
\r\n \r\n ) : (\r\n {externalItemId}\r\n )}\r\n {!isMobile && {productInfo}}\r\n {!isMobile && {productPrice}}\r\n {!isMobile && {productUnitOfMeasure}}\r\n {!isMobile && {productQuantityView}}\r\n {isMobile && {popUp}}\r\n {!isMobile && (\r\n \r\n {addToBagButton}\r\n {removeButton}\r\n \r\n )}\r\n
\r\n );\r\n};\r\n\r\nexport default OrderTemplateLinesView;\r\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { PriceComponent, RatingComponent } from '@msdyn365-commerce/components';\nimport {\n IComponent,\n IComponentProps,\n ICoreContext,\n IGridSettings,\n IImageData,\n IImageSettings,\n Image,\n IRequestContext\n} from '@msdyn365-commerce/core';\nimport { ProductPrice, ProductSearchResult } from '@msdyn365-commerce/retail-proxy';\nimport { format } from '@msdyn365-commerce-modules/utilities';\nimport React from 'react';\n\n/**\n * IActiveProductProps interface.\n */\nexport interface IActiveProductProps extends IComponentProps<{ product?: ProductSearchResult }> {\n className?: string;\n imageSettings?: IImageSettings;\n savingsText?: string;\n freePriceText?: string;\n originalPriceText?: string;\n currentPriceText?: string;\n ratingAriaLabel?: string;\n}\n\n/**\n * IActiveProduct interface.\n */\nexport interface IActiveProduct extends IComponent {}\n\n/**\n * RenderDescription function.\n * @param description - Product description string.\n * @returns - Returns JSX.Element | null.\n */\nfunction renderDescription(description?: string): JSX.Element | null {\n return

{description}

;\n}\n\n/**\n * GetRatingAriaLabel function.\n * @param rating - Product rating number.\n * @param ratingAriaLabel - Product rating aria label.\n * @returns - Returns string.\n */\nfunction getRatingAriaLabel(rating?: number, ratingAriaLabel?: string): string {\n const numberTwo: number = 2;\n if (rating && ratingAriaLabel) {\n const roundedRating = rating.toFixed(numberTwo);\n return format(ratingAriaLabel || '', roundedRating, '5');\n }\n return '';\n}\n\n/**\n * RenderRating function.\n * @param context - The core context.\n * @param typeName - The type name of the module.\n * @param ratingId - The rating id.\n * @param avgRating - The average rating.\n * @param totalRatings - The total ratings.\n * @param ariaLabel - The rating aria label.\n * @returns - Returns JSX.Element | null.\n */\nfunction renderRating(\n context: ICoreContext,\n typeName: string,\n ratingId: string,\n avgRating?: number,\n totalRatings?: number,\n ariaLabel?: string\n): JSX.Element | null {\n if (!avgRating) {\n return null;\n }\n\n const numberRatings = totalRatings?.toString() ?? undefined;\n const ratingAriaLabel = getRatingAriaLabel(avgRating, ariaLabel);\n\n return (\n \n );\n}\n\n/**\n * RenderPrice function.\n * @param context - The core context.\n * @param typeName - The type name of the module.\n * @param productId - The product id.\n * @param basePrice - The base price of the product.\n * @param adjustedPrice - The adjusted price of the product.\n * @param savingsText - The savings text of the product.\n * @param freePriceText - The free price text.\n * @param originalPriceText - The original price text.\n * @returns - Returns JSX.Element | null.\n */\nfunction renderPrice(\n context: ICoreContext,\n typeName: string,\n productId: string,\n basePrice?: number,\n adjustedPrice?: number,\n savingsText?: string,\n freePriceText?: string,\n originalPriceText?: string\n): JSX.Element | null {\n const price: ProductPrice = {\n BasePrice: basePrice,\n AdjustedPrice: adjustedPrice,\n CustomerContextualPrice: adjustedPrice\n };\n\n return (\n \n );\n}\n\n/**\n * RenderProductPlacementImage function.\n * @param requestContext - RequestContext.\n * @param imageSettings - The product image settings.\n * @param gridSettings - The viewport gird settings.\n * @param imageUrl - The product image url.\n * @param altText - The product image alt text.\n * @returns - Returns JSX.Element | null.\n */\nfunction renderProductPlacementImage(\n requestContext: IRequestContext,\n imageSettings?: IImageSettings,\n gridSettings?: IGridSettings,\n imageUrl?: string,\n altText?: string\n): JSX.Element | null {\n if (!imageUrl || !gridSettings || !imageSettings) {\n return null;\n }\n const imgData: IImageData = {\n src: imageUrl,\n altText: altText ? altText : ''\n };\n const imageProps = {\n gridSettings,\n imageSettings\n };\n imageProps.imageSettings.cropFocalRegion = true;\n return ;\n}\n\n/**\n * ActiveProduct constant.\n * @param props - The active product props.\n * @param props.data - The product search result data.\n * @param props.context - The core context.\n * @param props.imageSettings - The prodcut image settings.\n * @param props.savingsText - The product savings text.\n * @param props.freePriceText - The free price text.\n * @param props.originalPriceText - The original price text.\n * @param props.ratingAriaLabel - The product rating aria label.\n * @param props.typeName - The type name of the module.\n * @param props.id - The id of the product.\n * @returns - Returns JSX.Element | null.\n */\nexport const ActiveProductComponent: React.FC = ({\n data,\n context,\n imageSettings,\n savingsText,\n freePriceText,\n originalPriceText,\n ratingAriaLabel,\n typeName,\n // eslint-disable-next-line @typescript-eslint/naming-convention -- Do not need naming convention check for library prameters\n id\n}) => {\n const product = data.product;\n if (!product) {\n return null;\n }\n\n return (\n <>\n
\n
\n {renderProductPlacementImage(\n context.actionContext.requestContext,\n imageSettings,\n context.request.gridSettings,\n product.PrimaryImageUrl,\n product.Name\n )}\n
\n
\n

{product.Name}

\n {renderPrice(context, typeName, id, product.BasePrice, product.Price, savingsText, freePriceText, originalPriceText)}\n {renderDescription(product.Description)}\n {!context.app.config.hideRating &&\n renderRating(context, typeName, id, product.AverageRating, product.TotalRatings, ratingAriaLabel)}\n
\n
\n \n );\n};\n\nexport default ActiveProductComponent;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport * as Msdyn365 from '@msdyn365-commerce/core';\nimport { INodeProps } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\n/**\n * ILinksData: Interface for\n * Additional content.\n */\ninterface ILinksData {\n linkText?: string;\n linkUrl: Msdyn365.ILinkData;\n ariaLabel?: string;\n isOpenInNewTab?: boolean;\n}\n\n/**\n * IAdditionalContentData: Interface for\n * Active content.\n */\ninterface IAdditionalContentData {\n heading?: string;\n subtext?: string;\n links?: ILinksData[];\n}\n\n/**\n * IActiveImageAdditionalContentProps: Interface for\n * Active Image Additional Content Component props.\n */\nexport interface IActiveImageAdditionalContentProps {\n requestContext: Msdyn365.IRequestContext;\n additionalContent: IAdditionalContentData | undefined;\n handleAdditionalTextChange(event: Msdyn365.ContentEditableEvent): void;\n handleAdditionalParagraphChange(event: Msdyn365.ContentEditableEvent): void;\n handleAdditionalLinkTextChange(linkIndex: number, event: Msdyn365.ContentEditableEvent): void;\n}\n\n/**\n * IActiveImageAdditionalContentViewProps: Interface for\n * Active Image Additional Content view props.\n */\nexport interface IActiveImageAdditionalContentViewProps {\n additionalContentNode: INodeProps;\n heading: React.ReactNode;\n text: React.ReactNode;\n links: React.ReactNode;\n additionalContentContainer: INodeProps;\n additionalContentItemLinks: INodeProps;\n}\n\n/**\n * Renders additional content heading.\n * @param additionalContentHeading - Additional content heading.\n * @param props - Active Image Additional content component props.\n * @returns Heading Node.\n */\nconst renderHeading = (additionalContentHeading: string, props: IActiveImageAdditionalContentProps) => {\n const requestContext = props.requestContext;\n return (\n {\n props.handleAdditionalTextChange(event);\n },\n requestContext\n }}\n />\n );\n};\n\n/**\n * Renders additional content heading.\n * @param additionalContentParagraphText - Additional content paragraph text.\n * @param props - Active Image Additional content component props.\n * @returns Paragraph Node.\n */\nconst renderParagraph = (additionalContentParagraphText: string, props: IActiveImageAdditionalContentProps) => {\n const requestContext = props.requestContext;\n return (\n {\n props.handleAdditionalTextChange(event);\n },\n requestContext\n }}\n />\n );\n};\n\n/**\n * Renders additional content heading.\n * @param ctaLink - Additional content link.\n * @param props - Active Image Additional content component props.\n * @param linkIndex - Additional content link index.\n * @returns Link Node.\n */\nconst renderLinks = (ctaLink: ILinksData, props: IActiveImageAdditionalContentProps, linkIndex: number) => {\n const editableLink: Msdyn365.ILinksData = {\n ariaLabel: ctaLink.ariaLabel,\n className: 'msc-active-image__details__additional-content__cta__links',\n linkText: ctaLink.linkText,\n linkUrl: ctaLink.linkUrl.destinationUrl,\n openInNewTab: ctaLink.isOpenInNewTab,\n role: 'button'\n };\n const requestContext = props.requestContext;\n return (\n {\n props.handleAdditionalLinkTextChange(linkIndex, event);\n },\n requestContext\n }}\n />\n );\n};\n\n/**\n * Create node for each additonal content item.\n * @param item - Active Image additonal content item props.\n * @param props - Active Image Additional content component props.\n * @returns IActiveImageAdditionalContentItemViewProps.\n */\nconst assembleNode = (item: IAdditionalContentData, props: IActiveImageAdditionalContentProps): IActiveImageAdditionalContentViewProps => {\n const headingNode = item.heading && renderHeading(item.heading, props);\n const paragraphNode = item.subtext && renderParagraph(item.subtext, props);\n const linksNode = item.links?.map((ctaLink: ILinksData, index: number) => {\n return renderLinks(ctaLink, props, index);\n });\n\n return {\n additionalContentNode: { className: 'msc-active-image__details__additional-content' },\n heading: headingNode,\n text: paragraphNode,\n links: linksNode,\n additionalContentContainer: { className: 'msc-active-image__details__additional-content__container' },\n additionalContentItemLinks: { className: 'msc-active-image__details__additional__content__cta' }\n };\n};\n\n/**\n * ActiveImageAdditionalContent component.\n * @param props - Active Image Additional content component props.\n * @returns Active Image Additional content view props.\n */\nexport const activeImageAdditionalContent = (\n props: IActiveImageAdditionalContentProps\n): IActiveImageAdditionalContentViewProps | undefined => {\n const { additionalContent } = props;\n if (!additionalContent) {\n return undefined;\n }\n\n return assembleNode(additionalContent, props);\n};\n\nexport default activeImageAdditionalContent;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport MsDyn365, { IImageData, Image, IRequestContext } from '@msdyn365-commerce/core';\nimport { ProductSearchResult } from '@msdyn365-commerce/retail-proxy';\nimport React from 'react';\n\n/**\n * @type AreaEvent for active points\n */\ntype AreaEvent = Event | React.MouseEvent | React.FocusEvent;\n\n/**\n * @interface IRgbColor\n * @description - The IRgbColor interface contract.\n */\nexport interface IRgbColor {\n rValue: number;\n gValue: number;\n bValue: number;\n}\n\n/**\n * @interface IArea\n * @description - The IArea interface contract.\n */\nexport interface IArea {\n areaId: string;\n coords: number[];\n href?: string;\n center?: number[];\n primaryImageUrl?: string;\n productUrl: string;\n productSearchResult?: ProductSearchResult;\n}\n\n/**\n * @interface IArea\n * @description - The IArea interface contract.\n */\nexport interface IAreaMap {\n name: string;\n areas: IArea[];\n}\n\n/**\n * @enum CanvasCalculations\n * @description - The canvas calculations enum.\n */\nexport enum CanvasCalculations {\n defaultWidth = 0,\n defaultHeight = 0,\n defaultPositionX = 0,\n defaultPositionY = 0,\n defaultScale = 1,\n halfDivisor = 2,\n doubleMultiplier = 2,\n buttonHeight = 30,\n buttonPadding = 30,\n paddingAdjustment = 3,\n expandAnimationStartWidth = 10,\n expandAnimationEndWidth = 40,\n collapseAnimationStartWidth = 40,\n collapseAnimationEndWidth = 8,\n expandRadius = 12,\n collapseRadius = 8,\n rotation = 1.57,\n startAngle = 0,\n endAngle = 7,\n clearMargin = 50,\n clearHeight = 100,\n clearWidth = 100,\n textFadeInStartValue = 0,\n textFadeOutStartValue = 0.5,\n textFadeInterval = 0.01\n}\n\n/**\n * @enum CanvasStyles\n * @description - The canvas styles enum.\n */\nexport enum CanvasStyles {\n color = '#FFFFFF',\n buttonTextClor = '#000000'\n}\n\n/**\n * @enum\n * @description - The canvas styles enum.\n */\nexport interface IImageMapperResources {\n buttonText?: string;\n altText?: string;\n}\n\n/**\n * @interface IImageMapperProps\n * @description - The IImageMapperProps interface contract.\n */\nexport interface IImageMapperProps {\n imageData: IImageData;\n areaMap: IAreaMap;\n viewPort: string;\n requestContext: IRequestContext;\n color?: string;\n buttonTextClor?: string;\n width?: number;\n imgWidth?: number;\n activeImageRefs: React.RefObject;\n imageMapperResources?: IImageMapperResources;\n onLoad?(): void;\n onClick?(area: IArea, index: number, event: AreaEvent): void;\n onFocus?(area: IArea, index: number, event: AreaEvent): void;\n onMouseEnter?(area: IArea, index: number, event: AreaEvent): void;\n onMouseLeave?(area: IArea, index: number, event: AreaEvent): void;\n}\n\n/**\n * ImageMapper.\n */\nexport class ImageMapper extends React.Component {\n private readonly _backgroundImage: React.RefObject;\n\n private readonly _container: React.RefObject;\n\n private readonly _canvas: React.RefObject;\n\n private _isDesktopViewPort: boolean = false;\n\n private _context: CanvasRenderingContext2D | null | undefined = null;\n\n public constructor(props: IImageMapperProps) {\n super(props);\n this._backgroundImage = React.createRef();\n this._container = React.createRef();\n this._canvas = React.createRef();\n }\n\n /**\n * ComponentDidMount method.\n */\n public componentDidMount(): void {\n const { viewPort } = this.props;\n this.initCanvas();\n this._isDesktopViewPort = viewPort === 'lg' || viewPort === 'xl';\n this.renderAreas();\n this._context = null;\n }\n\n /**\n * ComponentDidUpdate method.\n */\n public componentDidUpdate(): void {\n const { viewPort } = this.props;\n this.initCanvas();\n this._isDesktopViewPort = viewPort === 'lg' || viewPort === 'xl';\n }\n\n /**\n * ShouldComponentUpdate method.\n * @param nextProps - Next props.\n * @returns Returns boolean.\n */\n public shouldComponentUpdate(nextProps: IImageMapperProps): boolean {\n let shouldRender = false;\n if (nextProps !== this.props) {\n shouldRender = true;\n }\n return shouldRender;\n }\n\n /**\n * GetActiveImageWidth method - Gets the active image width.\n * @returns Returns number | undefined.\n */\n public getActiveImageWidth = (): number | undefined => {\n if (MsDyn365.isBrowser) {\n const activeImageReferenceValue = this.props.activeImageRefs;\n if (activeImageReferenceValue.current !== null) {\n return activeImageReferenceValue.current.clientWidth;\n }\n }\n return undefined;\n };\n\n /**\n * GetActiveImageHeight method - Gets the active image height.\n * @returns Returns number | undefined.\n */\n public getActiveImageHeight = (): number | undefined => {\n if (MsDyn365.isBrowser) {\n const activeImageReferenceValue = this.props.activeImageRefs;\n if (activeImageReferenceValue.current !== null) {\n return activeImageReferenceValue.current.clientHeight;\n }\n }\n return undefined;\n };\n\n /**\n * ConvertHexToRgb method - This method takes color in HEX format and returns IRgbColor color object.\n * @param hexColor -The color hex value.\n * @returns -Returns IRgbColor object.\n */\n public convertHexToRgb = (hexColor: string): IRgbColor => {\n // RegEx used to execute the conversion of the hex color to rgb value.\n const regEx = new RegExp('^#?([a-f\\\\d]{2})([a-f\\\\d]{2})([a-f\\\\d]{2})$', 'u');\n\n // RegEx.exec method executes a search for a match in a specified string. Returns a result array, or null.\n const result = regEx.exec(hexColor);\n const defaultValue = 0;\n return result\n ? {\n rValue: Number.parseInt(result[1], 16),\n gValue: Number.parseInt(result[2], 16),\n bValue: Number.parseInt(result[3], 16)\n }\n : {\n rValue: defaultValue,\n gValue: defaultValue,\n bValue: defaultValue\n };\n };\n\n /**\n * ApplyFadingTransition method - Applys fading transition to button text.\n * @param text -The button text.\n * @param coords -The coordinates.\n * @param rgbColor -The RGB color object.\n * @param alpha -The alpha value of the button text.\n */\n public applyFadingTransition = (text: string, coords: number[], rgbColor: IRgbColor, alpha: number): void => {\n const halfDivisor: number = CanvasCalculations.halfDivisor;\n const context = this._canvas.current?.getContext('2d') ?? this._context;\n if (context && this._isDesktopViewPort) {\n const buttonPadding = CanvasCalculations.buttonPadding;\n const paddingAdjustment = CanvasCalculations.paddingAdjustment;\n const buttonWidth = context.measureText(text).width + buttonPadding;\n context.fillStyle = `rgba(${rgbColor.rValue}, ${rgbColor.gValue}, ${rgbColor.bValue}, ${alpha} )`;\n if (MsDyn365.isBrowser && document.body.parentElement && document.body.parentElement.getAttribute('dir') === 'rtl') {\n context.fillText(text, coords[0] + buttonWidth / halfDivisor - buttonPadding / halfDivisor, coords[1] + paddingAdjustment);\n } else {\n context.fillText(text, coords[0] - buttonWidth / halfDivisor + buttonPadding / halfDivisor, coords[1] + paddingAdjustment);\n }\n }\n };\n\n /**\n * Draw button method - Draws button and contains fixed hight, padding values.\n * @param text -The button text.\n * @param coords -The coordinates.\n */\n public drawButton = (text: string, coords: number[]): void => {\n const { color = CanvasStyles.color, buttonTextClor = CanvasStyles.buttonTextClor } = this.props;\n const halfDivisor: number = CanvasCalculations.halfDivisor;\n const context = this._canvas.current?.getContext('2d') ?? this._context;\n if (context && this._isDesktopViewPort) {\n const buttonHeight = CanvasCalculations.buttonHeight;\n const buttonPadding = CanvasCalculations.buttonPadding;\n const paddingAdjustment = CanvasCalculations.paddingAdjustment;\n const buttonWidth = context.measureText(text).width + buttonPadding;\n const buttonPositionX = coords[0] - buttonWidth / halfDivisor;\n const buttonPositionY = coords[1] - buttonHeight / halfDivisor;\n const arcsize = buttonHeight / halfDivisor;\n\n context.beginPath();\n context.moveTo(buttonPositionX + arcsize, buttonPositionY);\n context.lineTo(buttonPositionX + buttonWidth - arcsize, buttonPositionY);\n context.arcTo(\n buttonPositionX + buttonWidth,\n buttonPositionY,\n buttonPositionX + buttonWidth,\n buttonPositionY + arcsize,\n arcsize\n );\n context.lineTo(buttonPositionX + buttonWidth, buttonPositionY + buttonHeight - arcsize);\n context.arcTo(\n buttonPositionX + buttonWidth,\n buttonPositionY + buttonHeight,\n buttonPositionX + buttonWidth - arcsize,\n buttonPositionY + buttonHeight,\n arcsize\n );\n context.lineTo(buttonPositionX + arcsize, buttonPositionY + buttonHeight);\n context.arcTo(buttonPositionX, buttonPositionY + buttonHeight, buttonPositionX, buttonPositionY - arcsize, arcsize);\n context.lineTo(buttonPositionX, buttonPositionY + arcsize);\n context.arcTo(buttonPositionX, buttonPositionY, buttonPositionX + arcsize, buttonPositionY, arcsize);\n context.lineTo(buttonPositionX + arcsize, buttonPositionY);\n context.stroke();\n context.closePath();\n context.fillStyle = color;\n context.fill();\n context.fillStyle = buttonTextClor;\n if (MsDyn365.isBrowser && document.body.parentElement && document.body.parentElement.getAttribute('dir') === 'rtl') {\n context.fillText(text, coords[0] + buttonWidth / halfDivisor - buttonPadding / halfDivisor, coords[1] + paddingAdjustment);\n } else {\n context.fillText(text, coords[0] - buttonWidth / halfDivisor + buttonPadding / halfDivisor, coords[1] + paddingAdjustment);\n }\n }\n };\n\n /**\n * ExpandAnimation method - Shows expand animation and contains fixed values to draw the circle and ellipse shapes.\n * @param coords -Coordinates.\n */\n public expandAnimation = (coords: number[]): void => {\n const { color = CanvasStyles.color, buttonTextClor = CanvasStyles.buttonTextClor } = this.props;\n const buttonText = this.props.imageMapperResources?.buttonText;\n let animationStartWidth = CanvasCalculations.expandAnimationStartWidth;\n const pointPositionX = coords[0];\n const pointPositionY = coords[1];\n const animationEndWidth = CanvasCalculations.expandAnimationEndWidth;\n const radius = CanvasCalculations.expandRadius;\n const rotation = CanvasCalculations.rotation;\n const startAngle = CanvasCalculations.startAngle;\n const endAngle = CanvasCalculations.endAngle;\n let textFadeInValue = CanvasCalculations.textFadeInStartValue;\n const buttonTextClorInRgb = this.convertHexToRgb(buttonTextClor.toLocaleLowerCase());\n\n /**\n * Animate method - Reders expand animation.\n */\n const animate = () => {\n const context = this._canvas.current?.getContext('2d') ?? this._context;\n if (!context) {\n return;\n }\n context.beginPath();\n context.ellipse(pointPositionX, pointPositionY, radius, animationStartWidth, rotation, startAngle, endAngle);\n context.fillStyle = color;\n context.fill();\n context.fillStyle = color;\n if (buttonText) {\n if (animationStartWidth < animationEndWidth) {\n requestAnimationFrame(animate);\n this.applyFadingTransition(buttonText, coords, buttonTextClorInRgb, textFadeInValue);\n textFadeInValue += CanvasCalculations.textFadeInterval;\n animationStartWidth++;\n } else {\n this.drawButton(buttonText, [pointPositionX, pointPositionY]);\n }\n }\n };\n\n if (this._isDesktopViewPort) {\n animate();\n }\n };\n\n /**\n * CollapseAnimation method - Shows collapse animation and contains fixed values to draw the circle and ellipse shapes.\n * @param coords -Coordinates.\n */\n public collapseAnimation = (coords: number[]): void => {\n const { color = CanvasStyles.color, buttonTextClor = CanvasStyles.buttonTextClor } = this.props;\n const buttonText = this.props.imageMapperResources?.buttonText;\n let animationStartWidth = CanvasCalculations.collapseAnimationStartWidth;\n const pointPositionX = coords[0];\n const pointPositionY = coords[1];\n const animationEndWidth = CanvasCalculations.collapseAnimationEndWidth;\n const rotation = CanvasCalculations.rotation;\n const clearMargin = CanvasCalculations.clearMargin;\n const clearHeight = CanvasCalculations.clearHeight;\n const clearWidth = CanvasCalculations.clearWidth;\n const radius = CanvasCalculations.collapseRadius;\n const startAngle = CanvasCalculations.startAngle;\n const endAngle = CanvasCalculations.endAngle;\n let textFadeOutValue = CanvasCalculations.textFadeOutStartValue;\n const buttonTextClorInRgb = this.convertHexToRgb(buttonTextClor.toLocaleLowerCase());\n\n /**\n * Animate method - Renders collapse animation.\n */\n const animate = () => {\n const context = this._canvas.current?.getContext('2d') ?? this._context;\n if (!context) {\n return;\n }\n context.beginPath();\n context.clearRect(pointPositionX - clearMargin, pointPositionY - clearMargin, clearWidth, clearHeight);\n context.ellipse(pointPositionX, pointPositionY, radius, animationStartWidth, rotation, startAngle, endAngle);\n context.fillStyle = color;\n context.fill();\n if (animationEndWidth < animationStartWidth && buttonText) {\n requestAnimationFrame(animate);\n this.applyFadingTransition(buttonText, coords, buttonTextClorInRgb, textFadeOutValue);\n textFadeOutValue -= CanvasCalculations.textFadeInterval;\n animationStartWidth--;\n }\n };\n\n if (this._isDesktopViewPort) {\n animate();\n }\n };\n\n /**\n * DrawCircle method - Renders active points.\n * @param coords -Coordinates.\n */\n public drawCircle = (coords: number[]): void => {\n const { color = CanvasStyles.color, viewPort } = this.props;\n const doubleMultiplier: number = CanvasCalculations.doubleMultiplier;\n const startAngle: number = CanvasCalculations.startAngle;\n const context = this._canvas.current?.getContext('2d') ?? this._context;\n const radius = viewPort === 'xs' || viewPort === 'sm' ? coords[2] * doubleMultiplier : coords[2];\n if (!context) {\n return;\n }\n context.fillStyle = color;\n context.beginPath();\n context.strokeStyle = color;\n context.arc(coords[0], coords[1], radius, startAngle, Math.PI * doubleMultiplier);\n context.closePath();\n context.stroke();\n context.fill();\n };\n\n /**\n * ScaleCoords method - To scale the active point coordinates based on the window size.\n * @param coords -Coordinates.\n * @returns -Returns number[].\n */\n public scaleCoords = (coords: number[]): number[] => {\n const { imgWidth } = this.props;\n const defaultWidth: number = CanvasCalculations.defaultWidth;\n const defaultScale: number = CanvasCalculations.defaultScale;\n\n // Calculate scale based on current 'width' and the original 'imgWidth'\n const width = this.getActiveImageWidth();\n const scale = width && imgWidth && imgWidth > defaultWidth ? width / imgWidth : defaultScale;\n return coords.map(coord => coord * scale);\n };\n\n /**\n * RenderPrefilledAreas method - To render active points in case of events.\n */\n public renderPrefilledAreas = (): void => {\n const { areaMap } = this.props;\n areaMap.areas.map(area => {\n this.drawCircle(this.scaleCoords(area.coords));\n return null;\n });\n };\n\n /**\n * ComputeCenter method - To re-calculate the center of active point based on window size.\n * @param area -IArea.\n * @returns -Returns number[].\n */\n public computeCenter = (area: IArea): number[] => {\n const scaledCoords = this.scaleCoords(area.coords);\n return [scaledCoords[0], scaledCoords[1]];\n };\n\n /**\n * HandleHoverOn method - To handle mouse hover on event.\n * @param area -IArea.\n */\n public handleHoverOn = (area: IArea): void => {\n if (area.center && this._canvas.current) {\n this.drawCircle(this.scaleCoords(area.coords));\n this.expandAnimation(area.center);\n }\n };\n\n /**\n * HandleHoverOff method - To handle mouse hover off event.\n * @param area -IArea.\n */\n public handleHoverOff = (area: IArea): void => {\n if (this._canvas.current) {\n const context = this._canvas.current.getContext('2d') ?? this._context;\n const canvasPositionX: number = CanvasCalculations.defaultPositionX;\n const canvasPositionY: number = CanvasCalculations.defaultPositionY;\n\n if (!context) {\n return;\n }\n context.clearRect(canvasPositionX, canvasPositionY, this._canvas.current.width, this._canvas.current.height);\n this.renderPrefilledAreas();\n if (area.center) {\n this.collapseAnimation(area.center);\n }\n }\n };\n\n /**\n * Click method - Mouse click event.\n * @param area -IArea.\n * @param index - Number.\n * @returns - Void.\n */\n public click = (area: IArea, index: number) => (event: AreaEvent): void => {\n const { onClick } = this.props;\n if (onClick) {\n event.preventDefault();\n onClick(area, index, event);\n }\n };\n\n /**\n * HoverOn method - Mouse hover on event.\n * @param area -IArea.\n * @param index - Number.\n * @returns - Void.\n */\n public hoverOn = (area: IArea, index: number) => (event: AreaEvent): void => {\n const { onMouseEnter } = this.props;\n this.handleHoverOn(area);\n if (onMouseEnter) {\n onMouseEnter(area, index, event);\n }\n };\n\n /**\n * HoverOff method - Mouse hover off event.\n * @param area - IArea.\n * @param index - Number.\n * @returns - Void.\n */\n public hoverOff = (area: IArea, index: number) => (event: AreaEvent): void => {\n const { onMouseLeave } = this.props;\n\n this.handleHoverOff(area);\n\n if (onMouseLeave) {\n onMouseLeave(area, index, event);\n }\n };\n\n /**\n * RenderAreas method - Renders active points at given coordinates.\n * @returns -Returns JSX.Element[].\n */\n public renderAreas = (): JSX.Element[] => {\n const { areaMap, viewPort } = this.props;\n const buttonText = this.props.imageMapperResources?.buttonText ? this.props.imageMapperResources.buttonText : '';\n const altText = this.props.imageMapperResources?.altText ? this.props.imageMapperResources.altText : '';\n const doubleMultiplier: number = CanvasCalculations.doubleMultiplier;\n\n return areaMap.areas.map((area, index) => {\n const scaledCoords = this.scaleCoords(area.coords);\n const xsRadius = area.coords[2] * doubleMultiplier;\n if (viewPort === 'xs') {\n scaledCoords[2] = xsRadius;\n }\n const center = this.computeCenter(area);\n const extendedArea = { ...area, scaledCoords, center };\n const areaKey = `area-${index}`;\n const altTextWithProductName = altText\n .replace('{buttonText}', buttonText ? buttonText : '')\n .replace('{productName}', area.productSearchResult?.Name ? area.productSearchResult.Name : '');\n return (\n \n );\n });\n };\n\n /**\n * InitCanvas method - To render the canvas.\n */\n public initCanvas = (): void => {\n if (!this._canvas.current || !this._backgroundImage.current || !this._container.current) {\n return;\n }\n\n const { color, onLoad } = this.props;\n const defaultWidth: number = CanvasCalculations.defaultWidth;\n const defaultHeight: number = CanvasCalculations.defaultHeight;\n\n const canvasWidth = this.getActiveImageWidth() ?? defaultWidth;\n const canvasHeight = this.getActiveImageHeight() ?? defaultHeight;\n\n this._canvas.current.width = canvasWidth;\n this._canvas.current.height = canvasHeight;\n this._container.current.style.width = `${canvasWidth}px`;\n\n const context = this._canvas.current.getContext('2d') ?? this._context;\n if (!context) {\n return;\n }\n context.fillStyle = color ?? '';\n\n if (onLoad) {\n onLoad();\n }\n\n this.renderPrefilledAreas();\n };\n\n /**\n * Render method - To render the image mapper component with active image, canvas and active points.\n * @returns -Returns JSX.Element | null.\n */\n public render(): JSX.Element | null {\n const { imageData, areaMap, requestContext } = this.props;\n\n return (\n
\n \n \n \n {this.renderAreas()}\n \n
\n );\n }\n}\n\nexport default ImageMapper;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport * as MsDyn365 from '@msdyn365-commerce/core';\nimport { ProductSearchResult } from '@msdyn365-commerce/retail-proxy';\nimport { ArrayExtensions, getProductPageUrlSync } from '@msdyn365-commerce-modules/retail-actions';\nimport {\n getPayloadObject,\n getTelemetryAttributes,\n getTelemetryObject,\n IModuleProps,\n INodeProps,\n isMobile,\n ITelemetryContent,\n VariantType\n} from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport * as React from 'react';\n\nimport {\n activeImageAdditionalContent,\n ActiveProductComponent,\n IActiveImageAdditionalContentViewProps,\n IArea,\n IAreaMap,\n IImageMapperProps,\n ImageMapper\n} from '../active-image-utilities';\nimport { IActiveImageData } from './active-image.data';\nimport { IActiveImageProps } from './active-image.props.autogenerated';\n\n/**\n * @type AreaEvent for active points\n */\ntype AreaEvent = Event | React.MouseEvent | React.FocusEvent;\n\n/**\n * @interface IActiveImageViewProps\n * @classdesc - The IActiveImageViewProps interface contract.\n */\nexport interface IActiveImageViewProps extends IActiveImageProps<{}>, IImageMapperProps {\n activePointContainer: IModuleProps;\n activePointDetailsContainer: INodeProps;\n imageMapper: React.ReactNode;\n overlay: React.ReactNode;\n productCard: React.ReactNode;\n title?: React.ReactNode;\n text?: React.ReactNode;\n links?: React.ReactNode;\n detailsContainer?: INodeProps;\n detailsContainerCta?: INodeProps;\n additionalContent?: IActiveImageAdditionalContentViewProps;\n productCardleftPosition: number;\n productCardtopPosition: number;\n handleAdditionalText?(event: MsDyn365.ContentEditableEvent): void;\n handleAdditionalParagraph?(event: MsDyn365.ContentEditableEvent): void;\n handleAdditionalLinkText?(event: MsDyn365.ContentEditableEvent): void;\n}\n\n/**\n * @interface IActiveImageLinksData\n * @classdesc - The IActiveImageLinksData interface contract.\n */\nexport interface IActiveImageLinksData {\n linkText?: string;\n linkUrl: MsDyn365.ILinkData;\n ariaLabel?: string;\n willOpenInNewTab?: boolean;\n}\n\n/**\n * @interface IActiveImageState\n * @classdesc - The IActiveImageState interface contract.\n */\ninterface IActiveImageState {\n clientWidth: number;\n area: IArea | null;\n viewport: string;\n overlayClass: string;\n}\n\n/**\n * @enum ActiveImageConstants\n * @description - The active image constants enum.\n */\nexport enum ActiveImageConstants {\n timeoutInterval = 200,\n enterKey = 'Enter',\n escKey = 'Escape'\n}\n\n/**\n *\n * ActiveImage class.\n * @extends {React.PureComponent & IImageMapperProps, IActiveImageState>}\n */\nexport class ActiveImage extends React.PureComponent & IImageMapperProps, IActiveImageState> {\n private readonly _telemetryContent: ITelemetryContent;\n\n private _isDesktopViewPort: boolean;\n\n private readonly _defaultProductCardWidth: number = 315;\n\n private readonly _defaultProdutCardHight: number = 490;\n\n private readonly _activePoints: IArea[] = [];\n\n private readonly _activeImageRefs: React.RefObject;\n\n private readonly _activeImageClass: string;\n\n private readonly _productCardDivRef: React.RefObject;\n\n public constructor(props: IActiveImageProps & IImageMapperProps) {\n super(props);\n this._telemetryContent = getTelemetryObject(\n this.props.context.request.telemetryPageName!,\n this.props.friendlyName,\n this.props.telemetry\n );\n const viewport = isMobile({ variant: VariantType.Browser, context: this.props.context.request });\n this._activeImageClass = `msc-active-image-${this.getActiveImageId()}`;\n this.state = {\n clientWidth: 0,\n area: null,\n viewport,\n overlayClass: ''\n };\n this._isDesktopViewPort = viewport === 'lg' || viewport === 'xl';\n this._activeImageRefs = React.createRef();\n this._productCardDivRef = React.createRef();\n }\n\n public componentDidMount(): void {\n if (MsDyn365.msdyn365Commerce.isBrowser) {\n window.addEventListener('resize', this.updateClientWidth);\n document.addEventListener('keydown', this.keyDown, false);\n document.addEventListener('mousedown', this._handleOutsideClick);\n }\n setTimeout(() => {\n this.updateClientWidth();\n }, ActiveImageConstants.timeoutInterval);\n\n if (MsDyn365.msdyn365Commerce.isBrowser && this._activeImageRefs.current) {\n const images: HTMLCollectionOf = this._activeImageRefs.current.getElementsByClassName(\n 'msc-thumbnail_image msc-active-image-img'\n );\n if (ArrayExtensions.hasElements(Array.from(images))) {\n images[0].removeAttribute('usemap');\n }\n }\n }\n\n /**\n * AddActivePoints method - To handle add Active Points.\n * @param area - IArea.\n * @param product - ProductSearchResult.\n * @param coords - Coords.\n * @param productUrl - String.\n */\n public addActivePoints = (area: IArea | undefined, product: ProductSearchResult, coords: number[], productUrl: string): void => {\n if (!area) {\n this._activePoints.push({\n areaId: product.RecordId.toString(),\n coords,\n primaryImageUrl: product.PrimaryImageUrl ?? '',\n productUrl,\n productSearchResult: product\n });\n }\n };\n\n /**\n * ComponentWillUnmount method.\n */\n public componentWillUnmount(): void {\n if (MsDyn365.msdyn365Commerce.isBrowser) {\n window.removeEventListener('resize', this.updateClientWidth);\n document.removeEventListener('keydown', (this.keyDown as unknown) as EventListener, false);\n document.removeEventListener('mousedown', this._handleOutsideClick, false);\n }\n }\n\n /**\n * UpdateClientWidth method to update client width in state.\n */\n public updateClientWidth = (): void => {\n const viewport = isMobile({ variant: VariantType.Browser, context: this.props.context.request });\n this.setState({ clientWidth: this.getActiveImageWidth(), viewport });\n this._isDesktopViewPort = viewport === 'lg' || viewport === 'xl';\n };\n\n /**\n * Render method.\n * @returns - Returns JSX.Element | null.\n */\n public render(): JSX.Element | null {\n const viewProps: IActiveImageViewProps = {\n ...(this.props as IImageMapperProps & IActiveImageProps<{}>),\n activePointContainer: {\n moduleProps: this.props,\n className: classnames('msc-active-image', this._activeImageClass, this.props.config.className)\n },\n activePointDetailsContainer: {\n tag: 'div',\n className: classnames('msc-active-image-wrapper', this._activeImageClass, this.props.config.className),\n ref: this._activeImageRefs\n },\n imgWidth: this.props.config.canvasWidth,\n imageMapper: this.renderImageMapper(),\n overlay: this.renderOverlay(),\n productCard: this.renderProductCard(),\n productCardleftPosition: this.getProductCardPositionX(),\n productCardtopPosition: this.getProductCardPositionY(),\n title: this.renderActiveImageDetailsHeading(),\n text: this.renderActiveImageDetailsParagraph(),\n links: this.renderActiveImageDetailsLinks(),\n detailsContainer: { className: 'msc-active-image__details' },\n detailsContainerCta: { className: 'msc-active-image__details__cta' },\n additionalContent: activeImageAdditionalContent({\n requestContext: this.props.context.request,\n additionalContent: this.props.config.additionalContent,\n handleAdditionalTextChange: this.handleAdditionalTextChange,\n handleAdditionalParagraphChange: this.handleAdditionalParagraphChange,\n handleAdditionalLinkTextChange: this.handleAdditionalLinkTextChange\n }),\n handleAdditionalText: this.handleAdditionalTextChange,\n handleAdditionalParagraph: this.handleAdditionalParagraphChange,\n handleAdditionalLinkText: this.handleAdditionalTextChange\n };\n\n return this.props.renderView(viewProps);\n }\n\n /**\n * RenderImageMapper method - To render image mapper.\n * @returns - Returns React.ReactNode | null.\n */\n public renderImageMapper = (): React.ReactNode | null => {\n const { config, context } = this.props;\n const defaultPosition: number = 0;\n const defaultLength: number = 0;\n const productResults = this.props.data.products.result;\n if (config.activePoints && productResults) {\n for (const product of productResults) {\n for (const configProduct of config.activePoints) {\n if (product.ItemId === configProduct.itemId) {\n const productUrl = getProductPageUrlSync(product.Name ?? '', product.RecordId, context.actionContext, undefined);\n const coords = [\n configProduct.xPosition ?? defaultPosition,\n configProduct.yPosition ?? defaultPosition,\n configProduct.radius ?? defaultPosition\n ];\n const area = this._activePoints.find(activePoint => JSON.stringify(activePoint.coords) === JSON.stringify(coords));\n this.addActivePoints(area, product, coords, productUrl);\n }\n }\n }\n }\n const mappedArea: IAreaMap = {\n name: `map-${this._activeImageClass}`,\n areas: this._activePoints.length > defaultLength ? this._activePoints : []\n };\n\n // If image is null, we want to render the placeholder SVG - by passing image data with empty src\n return (\n \n );\n };\n\n /**\n * EnterArea method - To handle mouse enter event.\n * @param area - Active point area.\n * @param index - Active point index.\n * @param event - Active point AreaEvent.\n */\n public enterArea = (area: IArea, index: number, event: AreaEvent): void => {\n this.setState({ area, overlayClass: 'msc-active-image-overlay' });\n if (this.props.onMouseEnter) {\n this.props.onMouseEnter(area, index, event);\n }\n if (event.type.toLocaleLowerCase() === 'click' && this._isDesktopViewPort) {\n window.open(area.productUrl, '_self');\n }\n };\n\n /**\n * LeaveArea method - To handle mouse leave event.\n */\n public leaveArea = (): void => {\n if (this._isDesktopViewPort) {\n this.resetState();\n }\n };\n\n /**\n * ResetState method - To reset the state for area and overlayclass.\n */\n public resetState = (): void => {\n this.setState({ area: null, overlayClass: '' });\n };\n\n /**\n * RenderProductComponent method - To render the product card with product information.\n * @returns - Returns React.ReactNode.\n */\n public renderProductComponent = (): React.ReactNode => {\n if (this.state.area?.productSearchResult) {\n const baseImageUrl: string = this.props.context.request.apiSettings.baseImageUrl;\n const imageUrl: string = this.state.area.primaryImageUrl ?? '';\n const primaryImageUrl: string = `${baseImageUrl}${imageUrl}`;\n const product: ProductSearchResult = this.state.area.productSearchResult;\n product.PrimaryImageUrl = primaryImageUrl;\n\n return (\n \n );\n }\n return React.Fragment;\n };\n\n /**\n * RenderProductCard method - To render product cards.\n * @returns - Returns React.ReactNode.\n */\n public renderProductCard = (): React.ReactNode => {\n const { area } = this.state;\n\n return (\n <>\n {area?.center && (\n
\n
\n {!this._isDesktopViewPort &&
\n
\n )}\n \n );\n };\n\n /**\n * RenderOverlay method - To render overlay for non desktop viewports.\n * @returns - Returns React.ReactNode.\n */\n public renderOverlay = (): React.ReactNode => {\n return <>{!this._isDesktopViewPort &&
};\n };\n\n /**\n * GetProductCardPositionX method - Provides product card x position to the left or right of active point based on available space.\n * For xs, sm and md viewports it provides x position for the center alignment.\n * @returns - Returns number.\n */\n public getProductCardPositionX = (): number => {\n const defaultImageSettings = this.getDefaultImageSettings();\n const productImageSettingsWidth = this.props.config.productImageSettings?.viewports\n ? this.props.config.productImageSettings.viewports.lg?.w\n : defaultImageSettings.viewports.lg?.w;\n const defaultPositionX: number = 0;\n const halfDivisor: number = 2;\n const productCardWidth: number = productImageSettingsWidth ? productImageSettingsWidth : this._defaultProductCardWidth;\n const { area, clientWidth, viewport } = this.state;\n const pointPositionX = area?.center?.[0] ?? clientWidth / halfDivisor;\n const leftAllignPosition = pointPositionX - productCardWidth - productCardWidth / halfDivisor;\n const rightAllignPosition = pointPositionX + productCardWidth / halfDivisor;\n let position: number = (clientWidth - productCardWidth) / halfDivisor;\n if (viewport !== 'xs' && viewport !== 'sm' && viewport !== 'md') {\n if (leftAllignPosition < defaultPositionX) {\n position = rightAllignPosition;\n } else {\n position = leftAllignPosition;\n }\n }\n return position;\n };\n\n /**\n * GetProductCardPositionY method - Provides product card y position in center with respect to active point.\n * For xs, sm and md viewports it provides y position for the center alignment.\n * @returns - Returns number.\n */\n public getProductCardPositionY = (): number => {\n const defaultImageSettings = this.getDefaultImageSettings();\n const productImageSettingsHeight = this.props.config.productImageSettings?.viewports\n ? this.props.config.productImageSettings.viewports.lg?.h\n : defaultImageSettings.viewports.lg?.h;\n const halfDivisor: number = 2;\n const { area, viewport } = this.state;\n const produtCardHight: number = productImageSettingsHeight ? productImageSettingsHeight : this._defaultProdutCardHight;\n const pointPositionY = (this.getActiveImageHeight() - produtCardHight) / halfDivisor;\n let position: number = pointPositionY;\n if (viewport !== 'xs' && viewport !== 'sm' && viewport !== 'md') {\n position = (area?.center?.[1] ?? this.getActiveImageHeight() / halfDivisor) - produtCardHight / halfDivisor;\n }\n return position;\n };\n\n /**\n * GetDefaultImageSettings method.\n * @returns MsDyn365.IImageSettings.\n */\n public getDefaultImageSettings = (): MsDyn365.IImageSettings => {\n const defaultImageSettings: MsDyn365.IImageSettings = {\n viewports: {\n xs: { q: 'w=275&h=275&m=6', w: 275, h: 275 },\n lg: { q: 'w=275&h=275&m=6', w: 275, h: 275 },\n xl: { q: 'w=275&h=275&m=6', w: 275, h: 275 }\n },\n lazyload: true\n };\n\n return defaultImageSettings;\n };\n\n /**\n * KeyDown method - To handle keydown event.\n * @param event - KeyboardEvent.\n */\n public keyDown = (event: KeyboardEvent): void => {\n if (event.key === ActiveImageConstants.enterKey) {\n const target: HTMLElement = event.target as HTMLElement;\n if (target.nodeName === 'AREA') {\n const area: HTMLAreaElement = target as HTMLAreaElement;\n if (area.href) {\n window.open(area.href, '_self');\n }\n }\n }\n if (event.key === ActiveImageConstants.escKey) {\n this.resetState();\n }\n };\n\n /**\n * GetActiveImageWidth method - To get active image width.\n * @returns Returns number.\n */\n public getActiveImageWidth = (): number => {\n const defaultWidth: number = 0;\n if (MsDyn365.msdyn365Commerce.isBrowser) {\n const activeImageReferenceValue = this._activeImageRefs;\n if (activeImageReferenceValue.current !== null) {\n return activeImageReferenceValue.current.clientWidth;\n }\n }\n return defaultWidth;\n };\n\n /**\n * GetActiveImageHeight method - To get active image height.\n * @returns Returns number.\n */\n public getActiveImageHeight = (): number => {\n const defaultHeight: number = 0;\n if (MsDyn365.msdyn365Commerce.isBrowser) {\n const activeImageReferenceValue = this._activeImageRefs;\n if (activeImageReferenceValue.current !== null) {\n return activeImageReferenceValue.current.clientHeight;\n }\n }\n return defaultHeight;\n };\n\n /**\n * HandleLinkTextChange method - To handle link text change event.\n * @param linkIndex - The link index.\n * @param event - The dialog that is allowed to remain open.\n */\n public handleLinkTextChange(linkIndex: number, event: MsDyn365.ContentEditableEvent): void {\n if (this.props.config.links && this.props.config.links[Number(linkIndex)]) {\n this.props.config.links[Number(linkIndex)].linkText = event.target.value;\n }\n }\n\n /**\n * HandleTextChange method - To handle text change event.\n * @param event - The dialog that is allowed to remain open.\n */\n public handleTextChange = (event: MsDyn365.ContentEditableEvent): void => {\n this.props.config.heading!.text = event.target.value;\n };\n\n /**\n * HandleParagraphChange method - To handle paragraph change event.\n * @param event - The dialog that is allowed to remain open.\n */\n public handleParagraphChange = (event: MsDyn365.ContentEditableEvent): void => {\n this.props.config.paragraph = event.target.value;\n };\n\n /**\n * HandleAdditionalTextChange method - To handle additional text change event.\n * @param event - The dialog that is allowed to remain open.\n */\n public handleAdditionalTextChange(event: MsDyn365.ContentEditableEvent): void {\n if (this.props.config.additionalContent) {\n this.props.config.additionalContent.heading = event.target.value;\n }\n }\n\n /**\n * HandleAdditionalLinkTextChange method - To handle additional link text change event.\n * @param linkIndex - The link index.\n * @param event - The dialog that is allowed to remain open.\n */\n public handleAdditionalLinkTextChange(linkIndex: number, event: MsDyn365.ContentEditableEvent): void {\n const additionalContent = this.props.config.additionalContent ?? {};\n if (additionalContent.links) {\n additionalContent.links[Number(linkIndex)].linkText = event.target.value;\n }\n }\n\n /**\n * HandleAdditionalParagraphChange method - To handle additional paragraph change event.\n * @param event - The dialog that is allowed to remain open.\n */\n public handleAdditionalParagraphChange(event: MsDyn365.ContentEditableEvent): void {\n if (this.props.config.additionalContent) {\n this.props.config.additionalContent.subtext = event.target.value;\n }\n }\n\n /**\n * RenderActiveImageDetailsLinks method - To render active image details links.\n * @returns - React node.\n */\n public renderActiveImageDetailsLinks = (): React.ReactNode[] | undefined => {\n const { links } = this.props.config;\n const payLoad = getPayloadObject('click', this._telemetryContent, '');\n\n return links?.map((linkData: IActiveImageLinksData, index: number) => {\n payLoad.contentAction.etext = linkData.linkText;\n const attributes = getTelemetryAttributes(this._telemetryContent, payLoad);\n const linkId = index;\n const editableLink: MsDyn365.ILinksData = {\n ariaLabel: linkData.ariaLabel,\n className: 'msc-active-image__details__cta__link',\n linkText: linkData.linkText,\n linkUrl: linkData.linkUrl.destinationUrl,\n openInNewTab: linkData.willOpenInNewTab,\n role: 'button',\n additionalProperties: attributes\n };\n\n return (\n {\n this.handleLinkTextChange(index, event);\n },\n requestContext: this.props.context.request\n }}\n />\n );\n });\n };\n\n /**\n * RenderActiveImageDetailsHeading method - To render active image details heading.\n * @returns - React.ReactNode | undefined.\n */\n public renderActiveImageDetailsHeading = (): React.ReactNode | undefined => {\n const { heading } = this.props.config;\n\n return (\n heading && (\n \n )\n );\n };\n\n /**\n * RenderActiveImageDetailsParagraph method - To render active image details paragraph.\n * @returns - React.ReactNode | undefined.\n */\n public renderActiveImageDetailsParagraph = (): React.ReactNode | undefined => {\n const { paragraph } = this.props.config;\n\n return (\n paragraph && (\n \n )\n );\n };\n\n /**\n * GetActiveImageId - To get active image id from src.\n * @returns - String.\n */\n public getActiveImageId = (): string => {\n const { activeImage } = this.props.config;\n let activeImageId: string = '';\n if (activeImage?.src) {\n const activeImageSource = activeImage.src.split('/');\n const decrementOne: number = 1;\n const activeImageIdPart = activeImageSource[activeImageSource.length - decrementOne].split('?');\n activeImageId = activeImageIdPart[0] ?? '';\n }\n return activeImageId;\n };\n\n /**\n * Handle outside click method - To handle outside click of the active image product.\n * @param event - Mouse event.\n */\n private readonly _handleOutsideClick = (event: MouseEvent) => {\n if (this._productCardDivRef.current?.contains(event.target as Node)) {\n return;\n }\n this.resetState();\n };\n}\nexport default ActiveImage;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { Module, Node } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { IActiveImageAdditionalContentViewProps } from '../active-image-utilities';\nimport { IActiveImageViewProps } from './active-image';\n\n/**\n * Render Additional Content.\n * @param additionalContent - Additional content view props.\n * @returns JSX Element.\n */\nconst renderAdditionalContent = (additionalContent: IActiveImageAdditionalContentViewProps) => {\n return (\n \n {additionalContent.heading}\n \n {additionalContent.text}\n {additionalContent.links}\n \n \n );\n};\n\n/**\n * Render View.\n * @param props - The view props.\n * @returns -The JSX Element.\n */\nexport const activeImageView: React.FC = props => {\n return (\n \n \n {props.imageMapper}\n \n {props.title}\n {props.text}\n {props.additionalContent && renderAdditionalContent(props.additionalContent)}\n \n {props.links}\n \n \n \n \n {props.overlay}\n {props.productCard}\n \n \n );\n};\n\nexport default activeImageView;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { createObservableDataAction, IAction, IActionContext, sendRequest } from '@msdyn365-commerce/core';\n\nimport { SubmitUserReviewInput } from './inputs/submit-user-review-input';\n\n/**\n * This data action allows submitting review to the reviews service.\n * @param input This user review submission text.\n * @param ctx The data action context.\n */\nasync function submitReview(input: SubmitUserReviewInput, ctx: IActionContext): Promise {\n if (!inputIsValid(input)) {\n ctx.trace(`[SubmitUserReview] Failed to submit reviews for product due to bad input ${input}`);\n return '';\n }\n\n const requestUrl =\n `${input.serviceEndpoint}/v2.0/reviews/product/${input.productId}/user?` +\n `tenantId=${input.tenantId}&` +\n `channelId=${input.channelId}&` +\n `locale=${input.locale}`;\n\n return sendRequest(requestUrl, 'post', input.userReviewData, { headers: { Authorization: `id_token ${input.authorization}` } })\n .then(response => {\n if (response.status !== 200 && response.status !== 201) {\n ctx.trace('[SubmitUserReview] Failed to submit reviews for product');\n ctx.trace(response.data);\n return '';\n }\n return response.data;\n })\n .catch(error => {\n ctx.trace('[SubmitUserReview] Failed to submit reviews for product');\n ctx.telemetry.exception(error);\n ctx.telemetry.debug('[SubmitUserReview] Failed to submit reviews for product');\n ctx.trace(error);\n return '';\n });\n}\n\nfunction inputIsValid(input: SubmitUserReviewInput): boolean {\n return input && !!input.productId && !!input.tenantId;\n}\n\nexport const submitReviewDataAction = createObservableDataAction({\n id: '@msdyn365-commerce-modules/ratings-reviews/submit-user-review',\n action: >submitReview\n});\n\nexport default submitReviewDataAction;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { CacheType, IActionInput } from '@msdyn365-commerce/core';\n\nimport { IUserReviewData } from './submit-user-review-input-data';\n\n/**\n * SubmitUserReview Input Action.\n */\nexport class SubmitUserReviewInput implements IActionInput {\n /**\n * The Id representing the product to get the ratings for.\n */\n public productId?: string;\n\n /**\n * The ID representing the tenant.\n */\n public tenantId: string;\n\n /**\n * The calling organization's channel id.\n */\n public channelId: string;\n\n /**\n * The locale for which to get the ratings from.\n */\n public locale: string;\n\n /**\n * The user's review data.\n */\n public userReviewData: IUserReviewData;\n\n /**\n * The user's authorization token.\n */\n public authorization: string;\n\n /**\n * The ratings and reviews service endpoint.\n */\n public serviceEndpoint: string;\n\n constructor(\n productId: string | undefined,\n tenantId: string,\n channelId: string,\n locale: string,\n userReviewData: IUserReviewData,\n authorization: string,\n serviceEndpoint: string\n ) {\n this.productId = productId;\n this.tenantId = tenantId;\n this.channelId = channelId;\n this.locale = locale;\n this.userReviewData = userReviewData;\n this.authorization = authorization;\n this.serviceEndpoint = serviceEndpoint;\n }\n\n public getCacheKey = () => 'SubmitUserReview';\n\n public getCacheObjectType = () => 'SubmitUserReview';\n\n public dataCacheType = (): CacheType => 'none';\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { Review } from '@msdyn365-commerce/commerce-entities';\nimport { RatingComponent } from '@msdyn365-commerce/components';\nimport { getUrlSync, IAny, ICoreContext, IGeneric } from '@msdyn365-commerce/core';\nimport { SimpleProduct } from '@msdyn365-commerce/retail-proxy';\nimport { getRnrAuthEndpointId, getRnrPartnerId } from '@msdyn365-commerce-modules/retail-actions';\nimport {\n Alert,\n Button,\n getPayloadObject,\n getTelemetryAttributes,\n INodeProps,\n ITelemetryContent,\n Modal,\n ModalBody,\n ModalFooter,\n ModalHeader,\n TelemetryConstant\n} from '@msdyn365-commerce-modules/utilities';\nimport React from 'react';\n\nimport classNames from 'classnames';\nimport { GetUserReviewInput } from '../actions/inputs/get-user-review-input';\nimport { SubmitUserReviewInput } from '../actions/inputs/submit-user-review-input';\nimport submitUserReview from '../actions/submit-user-review';\n\nexport interface IReviewModalProps {\n userReview?: Review;\n product?: SimpleProduct;\n renderContextId: string;\n resources: IReviewModalResources;\n context: ICoreContext>;\n parentId: string;\n parentType: string;\n isOpen: boolean;\n rating: number;\n reviewTitle: string;\n reviewText: string;\n returnRef: React.RefObject | undefined;\n hasError: boolean;\n telemetryContent?: ITelemetryContent;\n onModalToggle(): void;\n onTitleChange(event: React.ChangeEvent): void;\n onTextChange(event: React.ChangeEvent): void;\n onRatingChange(value: number): void;\n onReviewComplete?(isSuccess: boolean): void;\n modalCSS?: string;\n}\n\nexport interface IReviewModalResources {\n selectRatingAriaLabel: string;\n selectRatingLabel: string;\n reviewTitleLabel: string;\n reviewTextLabel: string;\n privacyPolicyTitle: string;\n privacyPolicyTextFormat: string;\n writeReviewModalTitle: string;\n editReviewModalTitle: string;\n submitReviewButtonText: string;\n discardReviewButtonText: string;\n errorMessageText: string;\n reviewTitleAriaLabel?: string;\n reviewAriaLabel?: string;\n}\n\nexport interface IReviewModalViewProps {\n modal: INodeProps;\n modalHeader: React.ReactElement;\n modalFooter: INodeProps;\n modalBody: INodeProps;\n cancelButton: React.ReactElement;\n submitButton: React.ReactElement;\n rating: React.ReactElement;\n ratingLabel: React.ReactElement;\n titleInput: React.ReactElement;\n titleLabel: React.ReactElement;\n textInput: React.ReactElement;\n textLabel: React.ReactElement;\n privacyPolicyUrl: React.ReactElement;\n form: INodeProps;\n inputRow: INodeProps;\n error: React.ReactElement;\n}\n\n/**\n * On Click Submit.\n * @param props -Review Modal props.\n * @returns On submit.\n */\nconst onClickSubmit = (props: IReviewModalProps) => () => {\n onSubmit(props);\n};\n\n/**\n * CartLineItems component.\n */\n\nexport const ReviewModal = (props: IReviewModalProps): IReviewModalViewProps => {\n const payLoad = getPayloadObject('click', props.telemetryContent!, TelemetryConstant.SubmitReview);\n const submitButtonAttribute = getTelemetryAttributes(props.telemetryContent!, payLoad);\n payLoad.contentAction.etext = TelemetryConstant.Cancel;\n const cancelButtonAttribute = getTelemetryAttributes(props.telemetryContent!, payLoad);\n return {\n modal: {\n tag: Modal,\n className: props.modalCSS ? classNames(props.modalCSS, 'msc-modal-input-required') : 'ms-review-modal msc-modal-input-required',\n toggle: props.onModalToggle,\n applicationNode: 'renderPage',\n isOpen: props.isOpen,\n returnFocusRef: props.returnRef\n },\n modalHeader: modalHeaderNode(props),\n modalFooter: { tag: ModalFooter, className: 'ms-review-modal-footer' },\n modalBody: { tag: ModalBody, className: 'ms-review-modal-body' },\n cancelButton: (\n \n ),\n submitButton: (\n \n {props.resources.submitReviewButtonText}\n \n ),\n rating: ratingsInput(props),\n ratingLabel: ratingsLabel(props),\n titleInput: titleInput(props),\n titleLabel: titleLabel(props),\n textInput: textInput(props),\n textLabel: textLabel(props),\n privacyPolicyUrl: privacyPolicyLink(props),\n form: { tag: 'form', className: 'ms-review-modal-form', autoComplete: 'off' },\n inputRow: { tag: 'div', className: 'ms-review-modal-row', autoComplete: 'off' },\n error: (\n \n {props.resources.errorMessageText}\n \n )\n };\n};\n\nconst modalHeaderNode = (props: IReviewModalProps) => {\n return (\n \n {props.userReview && props.userReview.reviewId ? props.resources.editReviewModalTitle : props.resources.writeReviewModalTitle}\n \n );\n};\n\nconst submitDisabled = (props: IReviewModalProps) => {\n return !props.rating || !stripWhiteSpacesFromString(props.reviewText) || !stripWhiteSpacesFromString(props.reviewTitle);\n};\n\nconst ratingsInput = (props: IReviewModalProps) => {\n return (\n \n );\n};\n\nconst ratingsLabel = (props: IReviewModalProps) => {\n return (\n \n );\n};\n\nconst titleInput = (props: IReviewModalProps) => {\n const maxLength = props.context.app.config.reviewTitleMaxLength;\n\n return (\n \n );\n};\n\nconst titleLabel = (props: IReviewModalProps) => {\n return (\n \n );\n};\n\nconst reviewTextWidth: number = 50;\n\nconst textInput = (props: IReviewModalProps) => {\n const maxLength = props.context.app.config.reviewTextMaxLength;\n return (\n \n );\n};\n\nconst textLabel = (props: IReviewModalProps) => {\n return (\n \n );\n};\n\nconst privacyPolicyLink = (props: IReviewModalProps) => {\n const policyTextBlocks = props.resources.privacyPolicyTextFormat.split('{0}');\n const isSeparatorAtStart = props.resources.privacyPolicyTextFormat.startsWith('{0}');\n const isSeparatorAtEnd = props.resources.privacyPolicyTextFormat.endsWith('{0}');\n const privacyPolicyUrl = getUrlSync('rnrPrivacyPolicy', props.context.actionContext);\n const payLoad = getPayloadObject('click', props.telemetryContent!, TelemetryConstant.PrivacyPolicy);\n const privacyPolicyAttribute = getTelemetryAttributes(props.telemetryContent!, payLoad);\n\n return (\n

\n {isSeparatorAtStart ? '' : policyTextBlocks[0]}\n \n {props.resources.privacyPolicyTitle}\n \n {isSeparatorAtEnd ? '' : isSeparatorAtStart ? policyTextBlocks[0] : policyTextBlocks[1]}\n

\n );\n};\n\nconst onSubmit = (props: IReviewModalProps): void => {\n if (props.product) {\n submitReview(\n props.product,\n props.reviewTitle,\n props.reviewText,\n props.rating,\n props.context,\n props.userReview,\n props.onReviewComplete\n );\n }\n};\n\n/**\n * This method strips content of extra white spaces.\n * @param text The text to be stripped of extra white spaces.\n */\nconst stripWhiteSpacesFromString = (text: string): string => {\n return text\n .replace(new RegExp('\\\\r?\\\\n|\\\\r+', 'g'), ' ')\n .replace(new RegExp('\\\\s+', 'g'), ' ')\n .trim();\n};\n\nexport const submitReview = (\n product: SimpleProduct,\n title: string,\n text: string,\n rating: number,\n context: ICoreContext,\n userReview?: Review,\n onReviewSubmission?: (isSuccessful: boolean) => void\n) => {\n const { request } = context;\n const { user } = request;\n if (user && request) {\n const input = new SubmitUserReviewInput(\n product.RecordId.toString(),\n getRnrPartnerId(context.actionContext),\n request.apiSettings.channelId.toString(),\n request.locale,\n {\n productName: product && product.Name,\n rating,\n reviewText: stripWhiteSpacesFromString(text),\n title: stripWhiteSpacesFromString(title),\n userEmail: user.emailAddress,\n userName: user.name\n },\n request.user.token,\n getRnrAuthEndpointId(context.actionContext)\n );\n\n submitUserReview(input, context.actionContext)\n .then(reviewId => {\n const review = reviewId\n ? {\n rating,\n title: stripWhiteSpacesFromString(title),\n reviewText: stripWhiteSpacesFromString(text),\n submittedDateTime: new Date(),\n helpfulPositive: userReview ? userReview.helpfulPositive : 0,\n helpfulNegative: userReview ? userReview.helpfulNegative : 0,\n reviewId,\n userName: request.user.firstName || request.user.name\n }\n : userReview;\n\n const getReviewInput = new GetUserReviewInput(input.productId!, input.tenantId, input.authorization, input.serviceEndpoint);\n context.actionContext.update(getReviewInput, review);\n\n if (onReviewSubmission) {\n onReviewSubmission(!!reviewId);\n }\n })\n .catch(() => {\n const productId = product.RecordId;\n context.telemetry.error(`Failed to submit review for product with recordId: ${productId}`);\n context.telemetry.debug(`Failed to submit review for product with recordId: ${productId}`);\n if (onReviewSubmission) {\n onReviewSubmission(false);\n }\n });\n }\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { OrderBy } from '../actions/inputs/get-product-reviews-input';\n\nexport interface IRnrKeyValuePair {\n key: string;\n value: string;\n}\n\nexport interface IRnrOrderByKeyValuePair {\n key: OrderBy;\n value: string;\n}\n\nexport function setFocusOnElement(id: string): void {\n const element = document.getElementById(id);\n if (element) {\n element.focus();\n }\n}\n\nexport const TOGGLE_REVIEW_MODAL_BUTTON_ID: string = 'reviewproductid';\nexport const TOGGLE_EDIT_MODAL_BUTTON_ID: string = 'ms-write-review__edit';\nexport const TOGGLE_EDIT_MODAL_BUTTON_CARD_ID: string = 'ms-reviews-list__edit';\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { RatingsSummary } from '@msdyn365-commerce/commerce-entities';\nimport { format, INodeProps, Progress } from '@msdyn365-commerce-modules/utilities';\nimport React from 'react';\n\nexport interface IHistogramItemsProps {\n ratingsSummary: RatingsSummary;\n resources: IHistogramItemsResources;\n locale: string;\n onClick(stars: number): void;\n}\n\nexport interface IHistogramItemsResources {\n barItemAriaLabel: string;\n}\n\nexport interface IHistogramItemViewProps {\n starLabel: React.ReactElement;\n bar: React.ReactElement;\n percentage: React.ReactElement;\n buttonProps: INodeProps;\n}\n\n/**\n * CartLineItems component.\n */\n\nexport const HistogramItems = (props: IHistogramItemsProps): IHistogramItemViewProps[] => {\n const { ratingsSummary } = props;\n const totalRatingsCount: number = ratingsSummary.totalRatingsCount || 0;\n if (totalRatingsCount === 0) {\n return [];\n }\n return [\n renderItem(props, 5, ratingsSummary.star5Count, totalRatingsCount),\n renderItem(props, 4, ratingsSummary.star4Count, totalRatingsCount),\n renderItem(props, 3, ratingsSummary.star3Count, totalRatingsCount),\n renderItem(props, 2, ratingsSummary.star2Count, totalRatingsCount),\n renderItem(props, 1, ratingsSummary.star1Count, totalRatingsCount)\n ];\n};\n\nconst renderItem = (props: IHistogramItemsProps, stars: number, count?: number, totalCount?: number): IHistogramItemViewProps => {\n count = count || 0;\n totalCount = totalCount || 0;\n const percentage = totalCount === 0 ? 0 : count / totalCount;\n const formattedPercent = new Intl.NumberFormat(props.locale, { style: 'percent' }).format(percentage);\n const ariaLabel = format(props.resources.barItemAriaLabel, stars, formattedPercent);\n\n return {\n starLabel: (\n \n ),\n percentage: (\n \n ),\n bar: ,\n buttonProps: {\n tag: 'button',\n className: 'ms-ratings-histogram__item',\n onClick: () => {\n props.onClick(stars);\n }\n }\n };\n};\n\nexport const AverageRatingNumber: React.FC<{ summary: RatingsSummary }> = (props: { summary: RatingsSummary }) => {\n return (\n

\n {props.summary.averageRating}\n {` `}/ 5\n

\n );\n};\n\nexport const TotalReviews: React.FC<{ summary: RatingsSummary }> = (props: { summary: RatingsSummary }) => {\n return

{props.summary.totalRatingsCount}

;\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { RatingComponent } from '@msdyn365-commerce/components';\nimport * as Msdyn365 from '@msdyn365-commerce/core';\nimport { format, IModuleProps, INodeProps } from '@msdyn365-commerce-modules/utilities';\nimport classname from 'classnames';\nimport { observer } from 'mobx-react';\nimport * as React from 'react';\n\nimport { createRatingsReviewsStateInput } from '../../actions/ratings-reviews-state-data-action';\nimport { AverageRatingNumber, HistogramItems, IHistogramItemViewProps, TotalReviews } from './component/components';\nimport { IRatingsHistogramData } from './ratings-histogram.data';\nimport { IRatingsHistogramProps } from './ratings-histogram.props.autogenerated';\n\nexport interface IRatingsHistogramViewProps extends IRatingsHistogramProps {\n className: string;\n histogramItems: IHistogramItemViewProps[];\n moduleProps: IModuleProps;\n heading: React.ReactNode;\n averageRating: React.ReactNode;\n averageNumber: React.ReactNode;\n totalReviews: React.ReactNode;\n histogramProps: INodeProps;\n ratingsSummaryProps: INodeProps;\n callbacks: IRatingsHistogramCallbacks;\n}\n\nexport interface IRatingsHistogramCallbacks {\n selectFilterBy(stars: number): void;\n}\n\n/**\n * RatingsHistogram component.\n * @extends {React.Component>}\n */\n@observer\nclass RatingsHistogram extends React.PureComponent> {\n constructor(props: IRatingsHistogramProps) {\n super(props);\n this.selectFilterBy = this.selectFilterBy.bind(this);\n }\n\n public render(): JSX.Element | null {\n const { resources } = this.props;\n const { className, heading } = this.props.config;\n const {\n ratingsSummary: { result: ratingsSummary }\n } = this.props.data;\n const ratingCount = ratingsSummary && ratingsSummary.totalRatingsCount ? `${ratingsSummary.totalRatingsCount}` : '0';\n\n const completeClass = classname('ms-ratings-histogram', className);\n const viewProps: IRatingsHistogramViewProps = {\n ...this.props,\n className: completeClass,\n callbacks: {\n selectFilterBy: this.selectFilterBy\n },\n moduleProps: {\n moduleProps: this.props,\n className: completeClass\n },\n histogramItems: ratingsSummary\n ? HistogramItems({\n ratingsSummary,\n resources: { ...resources },\n locale: this.props.context.request.locale,\n onClick: this.selectFilterBy\n })\n : [],\n averageRating: ratingsSummary && (\n \n ),\n averageNumber: ratingsSummary && ,\n totalReviews: ratingsSummary && ,\n ratingsSummaryProps: { className: 'ms-ratings-histogram__summary' },\n heading: heading && (\n \n ),\n histogramProps: { className: 'ms-ratings-histogram__histogram' }\n };\n\n return this.props.renderView(viewProps) as React.ReactElement;\n }\n\n public handleHeadingChange = (event: Msdyn365.ContentEditableEvent) => (this.props.config.heading!.text = event.target.value);\n\n public selectFilterBy(stars: number): void {\n const filterKey = `${stars}`;\n this.props.context.actionContext.update(createRatingsReviewsStateInput({ filterKey }), { filterKey });\n }\n}\n\nexport default RatingsHistogram;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { Module, Node } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { IHistogramItemViewProps } from './component/components';\nimport { IRatingsHistogramViewProps } from './ratings-histogram';\n\nconst RatingsHistogramView: React.FC = props => {\n const { heading, histogramItems, histogramProps, moduleProps } = props;\n\n return (\n \n {heading}\n \n {histogramItems.map(item => {\n return histogramItem(item);\n })}\n \n \n );\n};\n\nconst histogramItem = (props: IHistogramItemViewProps) => {\n return (\n \n {props.starLabel}\n {props.bar}\n {props.percentage}\n \n );\n};\n\nexport default RatingsHistogramView;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { createObservableDataAction, IAction, IActionContext, sendRequest } from '@msdyn365-commerce/core';\n\nimport { ReportReviewConcernInput } from './inputs/report-review-concern-input';\n\nasync function reportReviewConcern(input: ReportReviewConcernInput, ctx: IActionContext): Promise {\n if (!inputIsValid(input)) {\n throw new Error(\n `[SubmitHelpfulnessVote] Invalid input. ReviewId=${input.reviewId},tenantId=${input.tenantId},locale= ${input.locale},`\n );\n }\n\n const requestUrl =\n `${input.serviceEndpoint}/v2.0/concerns/review/${input.reviewId}` + `?tenantId=${input.tenantId}` + `&locale=${input.locale}`;\n\n const requestBody = {\n concernCategory: input.concernCategory\n };\n\n const requestHeader = {\n headers: {\n Authorization: `id_token ${input.authToken}`\n }\n };\n\n return sendRequest(requestUrl, 'post', requestBody, requestHeader)\n .then(response => {\n return response.status === 200 || response.status === 201;\n })\n .catch(error => {\n ctx.trace('[ReportReviewConcernInput] Failed to report a concern');\n ctx.telemetry.exception(error);\n ctx.telemetry.debug('[ReportReviewConcernInput] Failed to report a concern');\n return false;\n });\n}\n\nfunction inputIsValid(input: ReportReviewConcernInput): boolean {\n return input && input.reviewId.length > 0 && input.tenantId.length > 0 && input.locale.length > 0 && input.authToken.length > 0;\n}\n\nexport const reportReviewConcernDataAction = createObservableDataAction({\n id: '@msdyn365-commerce-modules/ratings-reviews/report-review-concern',\n action: >reportReviewConcern\n});\n\nexport default reportReviewConcernDataAction;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { createObservableDataAction, IAction, IActionContext, sendRequest } from '@msdyn365-commerce/core';\n\nimport { SubmitHelpfulnessVoteInput } from './inputs/submit-helpfulness-vote-input';\n\nasync function submitHelpfulnessVote(input: SubmitHelpfulnessVoteInput, ctx: IActionContext): Promise {\n if (!inputIsValid(input)) {\n throw new Error(\n `[SubmitHelpfulnessVote] Invalid input. ReviewId=${input.reviewId},tenantId=${input.tenantId}, locale= ${input.locale},`\n );\n }\n\n const requestUrl =\n `${input.serviceEndpoint}/v2.0/votes/review/${input.reviewId}` + `?tenantId=${input.tenantId}` + `&locale=${input.locale}`;\n\n const requestBody = {\n isHelpful: !!input.isHelpful\n };\n\n const requestHeader = {\n headers: {\n Authorization: `id_token ${input.authToken}`\n }\n };\n\n return sendRequest(requestUrl, 'post', requestBody, requestHeader)\n .then(response => {\n return response.status === 200 || response.status === 201;\n })\n .catch(error => {\n ctx.trace('[SubmitHelpfulnessVote] Failed to vote on a review');\n ctx.telemetry.exception(error);\n ctx.telemetry.debug('[SubmitHelpfulnessVote] Failed to vote on a review');\n return false;\n });\n}\n\nfunction inputIsValid(input: SubmitHelpfulnessVoteInput): boolean {\n return input && input.reviewId.length > 0 && input.tenantId.length > 0 && input.locale.length > 0 && input.authToken.length > 0;\n}\n\nexport const submitHelpfulnessVoteDataAction = createObservableDataAction({\n id: '@msdyn365-commerce-modules/ratings-reviews/submit-helpfulness-vote',\n action: >submitHelpfulnessVote\n});\n\nexport default submitHelpfulnessVoteDataAction;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { CacheType, IActionInput } from '@msdyn365-commerce/core';\n\nexport enum ReviewConcernCategory {\n OffensiveContent = '1',\n ReviewResponse = '7',\n SpamAdvertising = '8',\n Profanity = '9'\n}\n\n/**\n * ReportReviewConcern Input Action.\n */\nexport class ReportReviewConcernInput implements IActionInput {\n public reviewId: string;\n\n public tenantId: string;\n\n public locale: string;\n\n public serviceEndpoint: string;\n\n public concernCategory: string;\n\n public authToken: string;\n\n constructor(reviewId: string, tenantId: string, locale: string, concernCategory: string, authToken: string, serviceEndpoint: string) {\n this.reviewId = reviewId;\n this.tenantId = tenantId;\n this.locale = locale;\n this.concernCategory = concernCategory;\n this.authToken = authToken;\n this.serviceEndpoint = serviceEndpoint;\n }\n\n public getCacheKey = () => 'ReportReviewConcern';\n\n public getCacheObjectType = () => 'ReportReviewConcern';\n\n public dataCacheType = (): CacheType => 'none';\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport {\n format,\n getPayloadObject,\n getTelemetryAttributes,\n ILabeledDropdownOption,\n ITelemetryContent,\n TelemetryConstant\n} from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nexport interface IReviewCountResources {\n pageReviewCountText: string;\n}\n\nexport interface IReviewCountProps {\n resources: IReviewCountResources;\n currentPage: number;\n reviewsCount: number;\n reviewsShownOnEachPage: number;\n}\n\nexport const ReviewCount: React.FC = (props: IReviewCountProps) => {\n const { currentPage, resources, reviewsCount, reviewsShownOnEachPage } = props;\n\n return (\n \n {format(\n resources.pageReviewCountText,\n _getReviewStartNumber(currentPage, reviewsShownOnEachPage),\n _getReviewEndNumber(currentPage, reviewsCount, reviewsShownOnEachPage),\n reviewsCount\n )}\n \n );\n};\n\nexport interface IPageControlResources {\n previousButtonText: string;\n nextButtonText: string;\n pageReviewAriaLabel: string;\n}\n\nexport interface IPageControlsProps {\n resources: IPageControlResources;\n currentPage: number;\n reviewsCount: number;\n reviewsShownOnEachPage: number;\n selectedSortByOption: ILabeledDropdownOption;\n selectedFilterByOption: ILabeledDropdownOption;\n telemetryContent?: ITelemetryContent;\n updateReviews(\n skipItems: number,\n selectedSortByOption: ILabeledDropdownOption,\n selectedFilterByOption: ILabeledDropdownOption,\n currentPage: number,\n isFilterApplied: boolean\n ): Promise;\n}\n\nexport const PageControls: React.FC = (props: IPageControlsProps) => {\n const { currentPage, resources, reviewsCount, reviewsShownOnEachPage } = props;\n const previousPageClick = React.useCallback(() => {\n return _getPreviousPageData(props);\n }, [props]);\n const nextPageClick = React.useCallback(() => {\n return _getNextPageData(props);\n }, [props]);\n const payLoad = getPayloadObject('click', props.telemetryContent!, TelemetryConstant.Next);\n const nextAttribute = getTelemetryAttributes(props.telemetryContent!, payLoad);\n payLoad.contentAction.etext = TelemetryConstant.Previous;\n const previousAttribute = getTelemetryAttributes(props.telemetryContent!, payLoad);\n\n return (\n
\n {_hasPreviousPage(currentPage) && (\n \n {resources.previousButtonText}\n \n )}\n {_hasNextPage(currentPage, reviewsCount, reviewsShownOnEachPage) && (\n \n {resources.nextButtonText}\n \n )}\n
\n );\n};\n\nconst _hasPreviousPage = (currentPage: number): boolean => {\n return currentPage > 1;\n};\n\nconst _hasNextPage = (currentPage: number, reviewsCount: number, reviewsShownOnEachPage: number): boolean => {\n return _getPagesCount(reviewsCount, reviewsShownOnEachPage) > currentPage;\n};\n\nconst _getReviewsShown = (reviewsShownOnEachPage: number) => {\n return Math.min(25, reviewsShownOnEachPage);\n};\n\nconst _getPagesCount = (reviewsCount: number, reviewsShownOnEachPage: number): number => {\n return Math.ceil(reviewsCount / _getReviewsShown(reviewsShownOnEachPage));\n};\n\nconst _paginationAriaLabel = (\n pageReviewAriaLabel: string,\n currentPage: number,\n reviewsCount: number,\n reviewsShownOnEachPage: number,\n isNextPage: boolean,\n page?: number\n): string => {\n const pageModifier = isNextPage ? 1 : -1;\n return format(\n pageReviewAriaLabel,\n _getReviewStartNumber(currentPage, reviewsShownOnEachPage, currentPage + pageModifier),\n _getReviewEndNumber(currentPage, reviewsCount, reviewsShownOnEachPage, currentPage + pageModifier),\n reviewsCount\n );\n};\n\nconst _getReviewStartNumber = (currentPage: number, reviewsShownOnEachPage: number, page?: number): number => {\n return ((page || currentPage) - 1) * _getReviewsShown(reviewsShownOnEachPage) + 1;\n};\n\nconst _getReviewEndNumber = (currentPage: number, reviewsCount: number, reviewsShownOnEachPage: number, page?: number): number => {\n const pageUsed = page || currentPage;\n const pageReviewCount = pageUsed * _getReviewsShown(reviewsShownOnEachPage);\n return pageReviewCount < reviewsCount ? pageReviewCount : reviewsCount;\n};\n\nconst _getPreviousPageData = async (props: IPageControlsProps) => {\n await props.updateReviews(\n _getReviewStartNumber(props.currentPage, props.reviewsShownOnEachPage) - 1 - _getReviewsShown(props.reviewsShownOnEachPage),\n props.selectedSortByOption,\n props.selectedFilterByOption,\n props.currentPage - 1,\n false\n );\n};\n\nconst _getNextPageData = async (props: IPageControlsProps) => {\n await props.updateReviews(\n _getReviewEndNumber(props.currentPage, props.reviewsCount, props.reviewsShownOnEachPage),\n props.selectedSortByOption,\n props.selectedFilterByOption,\n props.currentPage + 1,\n false\n );\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IAny, ICoreContext, IGeneric } from '@msdyn365-commerce/core';\nimport {\n Alert,\n getPayloadObject,\n getTelemetryAttributes,\n INodeProps,\n ITelemetryContent,\n Modal,\n ModalBody,\n ModalFooter,\n ModalHeader,\n TelemetryConstant\n} from '@msdyn365-commerce-modules/utilities';\nimport React from 'react';\n\nimport { ReviewConcernCategory } from '../../../actions/inputs/report-review-concern-input';\nimport { IRnrKeyValuePair } from '../../../common/rnrInterface';\n\nexport interface IReportReviewModalProps {\n resources: IReportReviewModalResources;\n context: ICoreContext>;\n isOpen: boolean;\n returnRef: React.RefObject | undefined;\n reportedKey: string;\n hasError: boolean;\n telemetryContent?: ITelemetryContent;\n onModalToggle(): void;\n onRadioChange(event: React.ChangeEvent): void;\n reportReview(): void;\n}\n\nexport interface IReportReviewModalResources {\n reportConcernText: string;\n feedbackThankYouText: string;\n reportModalMessage: string;\n reportSubmittedMessage: string;\n reportSpamText: string;\n offensiveContentText: string;\n profanityContentText: string;\n okReportReviewText: string;\n cancelReportReviewText: string;\n reportReviewButtonText: string;\n errorMessageText: string;\n}\n\nexport interface IReportReviewModalViewProps {\n modal: INodeProps;\n modalHeader: INodeProps;\n modalFooter: INodeProps;\n modalBody: INodeProps;\n header: React.ReactElement;\n headerSubmitted: React.ReactElement;\n cancelButton: React.ReactElement;\n submitButton: React.ReactElement;\n succesfulButton: React.ReactElement;\n reportMessage: React.ReactElement;\n reportSubmittedMessage: React.ReactElement;\n radioButtons: React.ReactElement;\n error: React.ReactElement;\n}\n\nlet reportConcernDropdownOptions: IRnrKeyValuePair[];\n\n/**\n * CartLineItems component.\n */\n\nexport const ReportReviewModal = (props: IReportReviewModalProps): IReportReviewModalViewProps => {\n const payLoad = getPayloadObject('click', props.telemetryContent!, TelemetryConstant.SubmitReview);\n const submitReviewAttribute = getTelemetryAttributes(props.telemetryContent!, payLoad);\n payLoad.contentAction.etext = TelemetryConstant.SuccessButton;\n const successAttribute = getTelemetryAttributes(props.telemetryContent!, payLoad);\n payLoad.contentAction.etext = TelemetryConstant.Cancel;\n const cancelAttribute = getTelemetryAttributes(props.telemetryContent!, payLoad);\n\n reportConcernDropdownOptions = [\n { key: ReviewConcernCategory.SpamAdvertising, value: props.resources.reportSpamText },\n { key: ReviewConcernCategory.OffensiveContent, value: props.resources.offensiveContentText },\n { key: ReviewConcernCategory.Profanity, value: props.resources.profanityContentText }\n ];\n\n return {\n modal: {\n tag: Modal,\n className: 'ms-report-review-modal msc-modal-input-required',\n toggle: props.onModalToggle,\n applicationNode: 'renderPage',\n isOpen: props.isOpen,\n returnFocusRef: props.returnRef\n },\n modalHeader: { tag: ModalHeader, toggle: props.onModalToggle, className: 'ms-report-review-modal-header' },\n modalFooter: { tag: ModalFooter, className: 'ms-report-review-modal-footer' },\n modalBody: { tag: ModalBody, className: 'ms-report-review-modal-body' },\n header:

{props.resources.reportConcernText}

,\n headerSubmitted:

{props.resources.feedbackThankYouText}

,\n cancelButton: (\n \n ),\n submitButton: (\n \n ),\n succesfulButton: (\n \n ),\n reportMessage:

{props.resources.reportModalMessage}

,\n reportSubmittedMessage:

{props.resources.reportSubmittedMessage}

,\n radioButtons: radioPairs(props),\n error: (\n \n {props.resources.errorMessageText}\n \n )\n };\n};\n\nconst radioPairs = (props: IReportReviewModalProps) => {\n const pairs = [];\n for (const option of reportConcernDropdownOptions) {\n const inputId = `report-review-${option.key}`;\n const checked = option.key === props.reportedKey;\n pairs.push(\n
\n \n \n
\n );\n }\n\n return
{pairs}
;\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { Review } from '@msdyn365-commerce/commerce-entities';\nimport { RatingComponent } from '@msdyn365-commerce/components';\nimport { IAny, ICoreContext, IGeneric, isOboRequest } from '@msdyn365-commerce/core';\nimport { Button, format, INodeProps } from '@msdyn365-commerce-modules/utilities';\nimport React from 'react';\n\nimport { TOGGLE_EDIT_MODAL_BUTTON_CARD_ID } from '../../../common/rnrInterface';\n\nexport interface IReviewCardResources {\n wasReviewHelpfulText: string;\n yesButtonText: string;\n noButtonText: string;\n editReviewCardText: string;\n reportedText: string;\n reportConcernText: string;\n reviewRatingNarratorText: string;\n}\n\nexport interface IReviewCardProps {\n review: Review;\n resources: IReviewCardResources;\n context: ICoreContext>;\n isUserReview?: boolean;\n parentId: string;\n parentType: string;\n reportedReviews: string[];\n returnRef: React.RefObject | undefined;\n reportedReviewId: string;\n votedReviews: { reviewId: string; approved: boolean }[];\n toggleWriteReviewModal?(): void;\n toggleReportReviewModal(reviewId: string): void;\n updateReviewHelpfulness(reviewId: string, isHelpful: boolean): void;\n}\n\nexport interface IReviewCardViewProps {\n cardProps: INodeProps;\n name: React.ReactElement;\n rating: React.ReactElement;\n date: React.ReactElement;\n reviewTitle: React.ReactElement;\n reviewText: React.ReactElement;\n ratingHelpfulLabel?: React.ReactElement;\n like?: React.ReactElement;\n dislike?: React.ReactElement;\n edit: React.ReactNode;\n report: React.ReactNode;\n responseName: React.ReactNode;\n responseDate: React.ReactNode;\n responseText: React.ReactNode;\n cardBodyProps: INodeProps;\n responseProps: INodeProps;\n reviewProps: INodeProps;\n controlsProps: INodeProps;\n headerProps: INodeProps;\n}\n\n/**\n * Review card component.\n */\n\nexport const ReviewCard = (props: IReviewCardProps): IReviewCardViewProps => {\n const className = props.isUserReview ? 'ms-reviews-list__card ms-reviews-list__user-review' : 'ms-reviews-list__card';\n return {\n cardProps: { className, key: props.review.reviewId },\n name:

{props.review.userName}

,\n rating: rating(props),\n date:

{renderDate(props, props.review.submittedDateTime)}

,\n reviewTitle:

{props.review.title}

,\n reviewText:

{props.review.reviewText}

,\n ratingHelpfulLabel: props.isUserReview ? (\n undefined\n ) : (\n

{props.resources.wasReviewHelpfulText}

\n ),\n like: props.isUserReview ? undefined : voteHelpfulButton(props, true),\n dislike: props.isUserReview ? undefined : voteHelpfulButton(props, false),\n edit: editButton(props),\n report: reportToggle(props),\n responseName: props.review.userResponse ? (\n

{props.review.userResponse.responderName}

\n ) : (\n undefined\n ),\n responseText: props.review.userResponse ? (\n

{props.review.userResponse.responseText}

\n ) : (\n undefined\n ),\n responseDate: props.review.userResponse ? (\n

{renderDate(props, props.review.userResponse.submittedDateTime)}

\n ) : (\n undefined\n ),\n cardBodyProps: { className: 'ms-reviews-list__card-body' },\n responseProps: { className: 'ms-reviews-list__response' },\n reviewProps: { className: 'ms-reviews-list__review' },\n controlsProps: { className: 'ms-reviews-list__card-controls' },\n headerProps: { className: 'ms-reviews-list__card-header' }\n };\n};\n\nconst rating = (props: IReviewCardProps) => {\n return (\n \n );\n};\n\nconst isVotedFor = (props: IReviewCardProps, isHelpful: boolean): boolean => {\n for (let i = 0; i < props.votedReviews.length; i++) {\n if (props.votedReviews[i].reviewId === props.review.reviewId) {\n return props.votedReviews[i].approved === isHelpful;\n }\n }\n\n return false;\n};\n\nconst voteHelpfulButton = (props: IReviewCardProps, isHelpful: boolean) => {\n const isVoted = isVotedFor(props, isHelpful);\n const isDisabled = props.isUserReview || isVoted || isOboRequest(props.context.request) ? 'disabled' : '';\n let className = isHelpful ? 'ms-reviews-list__like' : 'ms-reviews-list__dislike';\n className = `${className} ${isDisabled}`;\n const label = isHelpful ? props.resources.yesButtonText : props.resources.noButtonText;\n let voteCount = (isHelpful ? props.review.helpfulPositive : props.review.helpfulNegative) || 0;\n voteCount = isVoted ? voteCount + 1 : voteCount;\n const title = `(${voteCount})`;\n const user = props.context.request.user;\n const onClickMethod = () => {\n props.updateReviewHelpfulness(props.review.reviewId!, isHelpful);\n };\n const onClick = isDisabled ? undefined : onClickMethod;\n\n if (user.isAuthenticated) {\n return (\n \n );\n }\n return (\n \n );\n};\n\nconst editButton = (props: IReviewCardProps) => {\n if (props.isUserReview && !isOboRequest(props.context.request)) {\n return (\n \n );\n }\n\n return undefined;\n};\n\nconst renderDate = (props: IReviewCardProps, date?: Date): string | Date => {\n if (!date) {\n return '';\n }\n\n try {\n return new Intl.DateTimeFormat(props.context.request.locale, { month: 'long', day: 'numeric', year: 'numeric' }).format(\n new Date(date)\n );\n } catch {\n return date;\n }\n};\n\n/**\n * On Click Handler.\n * @param props -Review card props.\n * @returns Report review modal.\n */\nconst onClick = (props: IReviewCardProps) => () => {\n props.toggleReportReviewModal(props.review.reviewId!);\n};\n\nconst reportToggle = (props: IReviewCardProps) => {\n const user = props.context.request.user;\n if (props.isUserReview || isOboRequest(props.context.request)) {\n return undefined;\n } else if (!user.isAuthenticated) {\n return (\n \n );\n }\n\n if (props.reportedReviews.includes(props.review.reviewId!)) {\n return

{props.resources.reportedText}

;\n }\n\n const ref = props.review.reviewId === props.reportedReviewId ? props.returnRef : undefined;\n\n return (\n \n );\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { CacheType, IActionInput } from '@msdyn365-commerce/core';\n\n/**\n * SubmitHelpfulnessVote Input Action.\n */\nexport class SubmitHelpfulnessVoteInput implements IActionInput {\n public reviewId: string;\n\n public tenantId: string;\n\n public locale: string;\n\n public serviceEndpoint: string;\n\n public isHelpful: boolean;\n\n public authToken: string;\n\n constructor(reviewId: string, tenantId: string, locale: string, isHelpful: boolean, authToken: string, serviceEndpoint: string) {\n this.reviewId = reviewId;\n this.tenantId = tenantId;\n this.locale = locale;\n this.isHelpful = isHelpful;\n this.authToken = authToken;\n this.serviceEndpoint = serviceEndpoint;\n }\n\n public getCacheKey = () => 'SubmitHelpfulnessVote';\n\n public getCacheObjectType = () => 'SubmitHelpfulnessVote';\n\n public dataCacheType = (): CacheType => 'none';\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { Review } from '@msdyn365-commerce/commerce-entities';\nimport { RatingComponent } from '@msdyn365-commerce/components';\nimport * as Msdyn365 from '@msdyn365-commerce/core';\nimport { SimpleProduct } from '@msdyn365-commerce/retail-proxy';\nimport {\n getRnrAuthEndpointId,\n getRnrEndpointId,\n getRnrPartnerId,\n getSelectedProductIdFromActionInput\n} from '@msdyn365-commerce-modules/retail-actions';\nimport {\n format,\n getTelemetryObject,\n ILabeledDropdownOnChangeNotification,\n ILabeledDropdownOption,\n IModuleProps,\n INodeProps,\n ITelemetryContent,\n LabeledDropdown\n} from '@msdyn365-commerce-modules/utilities';\nimport classname from 'classnames';\nimport { reaction } from 'mobx';\nimport { observer } from 'mobx-react';\nimport * as React from 'react';\n\nimport { reportReviewConcern, submitHelpfulnessVote } from '../..';\nimport { getReviewsForGivenProduct } from '../../actions/get-product-reviews';\nimport { GetProductReviewsInput } from '../../actions/inputs/get-product-reviews-input';\nimport { ReportReviewConcernInput, ReviewConcernCategory } from '../../actions/inputs/report-review-concern-input';\nimport { SubmitHelpfulnessVoteInput } from '../../actions/inputs/submit-helpfulness-vote-input';\nimport { IReviewModalViewProps, ReviewModal, submitReview } from '../../common/review-modal';\nimport { IRnrKeyValuePair, IRnrOrderByKeyValuePair } from '../../common/rnrInterface';\nimport { PageControls, ReviewCount } from './components/components';\nimport { IReportReviewModalViewProps, ReportReviewModal } from './components/report-review-modal';\nimport { IReviewCardViewProps, ReviewCard } from './components/review-card';\nimport { IReviewsListData } from './reviews-list.data';\nimport { IReviewsListProps } from './reviews-list.props.autogenerated';\n\nexport interface IReviewsListState {\n skipItems: number;\n listOfReviews: Review[];\n currentPage: number;\n reviewsCount: number;\n showSpinner: boolean;\n isFilterApplied: boolean;\n selectedSortByOption: ILabeledDropdownOption;\n selectedFilterByOption: ILabeledDropdownOption;\n userReviewRating: number;\n userReviewTitle: string;\n userReviewText: string;\n isReviewModalOpen: boolean;\n hasReviewError: boolean;\n isReportModalOpen: boolean;\n hasReportError: boolean;\n reportingReviewId: string;\n reportedKey: string;\n reported: boolean;\n reportedReviews: string[];\n votedReviews: { reviewId: string; approved: boolean }[];\n}\n\nexport interface IReviewsListCallbacks {\n toggleModal(): void;\n updateReviewTitle(title: string): void;\n updateReviewText(text: string): void;\n updateRating(rating: number): void;\n onReviewSubmitted(isSuccessful: boolean): void;\n submitReview(\n product: SimpleProduct,\n title: string,\n text: string,\n rating: number,\n context: Msdyn365.ICoreContext,\n userReview?: Review,\n onReviewSubmission?: (isSuccessful: boolean) => void\n ): void;\n updateReviewHelpfulnessVote(reviewId: string, isHelpful: boolean): void;\n toggleReportModal(reviewId: string): void;\n reportReview(reviewId: string, reportedKey: string): void;\n updateSortByDropdown(notification: ILabeledDropdownOnChangeNotification): void;\n updateFilterByDropdown(notification: ILabeledDropdownOnChangeNotification): void;\n updateReviews(\n skipItems: number,\n selectedSortByOption: ILabeledDropdownOption,\n selectedFilterByOption: ILabeledDropdownOption,\n currentPage: number,\n isFilterApplied: boolean\n ): void;\n}\n\nexport interface IReviewsListViewProps extends IReviewsListProps {\n state: IReviewsListState;\n className: string;\n callbacks: IReviewsListCallbacks;\n moduleProps: IModuleProps;\n reviewModal: IReviewModalViewProps;\n reportReviewModal: IReportReviewModalViewProps;\n sortByDropdown: React.ReactNode;\n filterByDropdown: React.ReactNode;\n averageRating: React.ReactNode;\n reviewCount: React.ReactElement;\n refineReviewsProps: INodeProps;\n reviewsListProps: INodeProps;\n reviewCards: IReviewCardViewProps[];\n userReview?: IReviewCardViewProps;\n pageControls: React.ReactNode;\n noReviewsMessage: React.ReactElement;\n noReviewsWithFilterMessage: React.ReactElement;\n heading: React.ReactNode;\n sortByOptions: IRnrOrderByKeyValuePair[];\n filterByOptions: IRnrOrderByKeyValuePair[];\n}\n\n/**\n *\n * ReviewsList component.\n * @extends {React.Component, IReviewsListState>}\n */\n@observer\nclass ReviewsList extends React.Component, IReviewsListState> {\n public sortByDropdownOptions: IRnrOrderByKeyValuePair[] = [\n { key: 'MostHelpful', value: this.props.resources.mostHelpfulSortOptionText },\n { key: 'MostRecent', value: this.props.resources.mostRecentSortOptionText },\n { key: 'HighestRating', value: this.props.resources.highestRatedSortOptionText },\n { key: 'LowestRating', value: this.props.resources.lowestRatedSortOptionText }\n ];\n\n public filterByDropdownOptions: IRnrKeyValuePair[] = [\n { key: '1;2;3;4;5', value: this.props.resources.allRatinsFilterByOptionText },\n { key: '5', value: this.props.resources.fiveStarFilterByOptionText },\n { key: '4', value: this.props.resources.fourStarFilterByOptionText },\n { key: '3', value: this.props.resources.threeStarFilterByOptionText },\n { key: '2', value: this.props.resources.twoStarFilterByOptionText },\n { key: '1', value: this.props.resources.oneStarFilterByOptionText }\n ];\n\n private readonly _userReviewModalToggle: React.RefObject;\n\n private readonly _userReportModalToggle: React.RefObject;\n\n private readonly telemetryContent?: ITelemetryContent;\n private readonly reviewsListCallbacks: IReviewsListCallbacks = {\n updateReviewTitle: (title: string): void => {\n this.setState({ userReviewTitle: title });\n },\n updateReviewText: (text: string): void => {\n this.setState({ userReviewText: text });\n },\n updateRating: (rating: number): void => {\n this.setState({ userReviewRating: rating });\n },\n onReviewSubmitted: (isSuccessful: boolean): void => {\n if (isSuccessful) {\n this.setState({ isReviewModalOpen: false, hasReviewError: false });\n } else {\n this.setState({ hasReviewError: true });\n }\n },\n submitReview,\n // @ts-expect-error\n toggleModal: this._toggleReviewModal,\n // @ts-expect-error\n updateReviewHelpfulnessVote: this.updateReviewHelpfulnessVote,\n toggleReportModal: (reviewId: string): void => {\n this.state.isReportModalOpen ? this._onReportModalOpen(reviewId) : this._onReportModalClose();\n },\n // @ts-expect-error\n reportReview: this._reportReviewCallback,\n // @ts-expect-error\n updateFilterByDropdown: this.updateFilterByDropdown,\n // @ts-expect-error\n updateSortByDropdown: this.updateSortByDropdown,\n // @ts-expect-error\n updateReviews: this.updateReviews\n };\n constructor(props: IReviewsListProps) {\n super(props);\n const {\n userReview: { result: userReview }\n } = this.props.data;\n\n this.state = {\n skipItems: 0,\n reviewsCount: 0,\n listOfReviews: [],\n currentPage: 1,\n showSpinner: false,\n isFilterApplied: false,\n selectedSortByOption: this.sortByDropdownOptions[0],\n selectedFilterByOption: this.filterByDropdownOptions[0],\n userReviewRating: userReview ? userReview.rating : 0,\n userReviewText: userReview ? userReview.reviewText : '',\n userReviewTitle: userReview ? userReview.title : '',\n isReviewModalOpen: false,\n hasReviewError: false,\n isReportModalOpen: false,\n hasReportError: false,\n reported: false,\n reportedKey: ReviewConcernCategory.SpamAdvertising,\n reportingReviewId: '',\n reportedReviews: [],\n votedReviews: []\n };\n\n this._userReviewModalToggle = React.createRef();\n this._userReportModalToggle = React.createRef();\n this.telemetryContent = getTelemetryObject(\n this.props.context.request.telemetryPageName!,\n this.props.friendlyName,\n this.props.telemetry\n );\n }\n\n public shouldComponentUpdate(nextProps: IReviewsListProps, nextState: IReviewsListState): boolean {\n if (this.state === nextState && this.props.data === nextProps.data) {\n return false;\n }\n return true;\n }\n public componentDidMount = async () => {\n this.props.data.reviewsList.then(reviewsList => {\n if (\n reviewsList &&\n reviewsList.pagingInfo &&\n reviewsList.pagingInfo.totalItems &&\n reviewsList.items &&\n reviewsList.items.length > 0\n ) {\n this.setState({\n listOfReviews: reviewsList.items,\n reviewsCount: reviewsList.pagingInfo.totalItems\n });\n }\n });\n await this.updateReviews(0, this.state.selectedSortByOption, this.state.selectedFilterByOption, 1, this.state.isFilterApplied);\n\n reaction(\n () => this.props.data.ratingsReviewsState.result && this.props.data.ratingsReviewsState.result.filterKey,\n async (filterKey: string | undefined) => {\n const filterKeyValue = Number(filterKey);\n const dropdownItemsCount = this.filterByDropdownOptions.length;\n if (filterKey && !isNaN(filterKeyValue) && filterKeyValue < dropdownItemsCount) {\n const filterByOption = this.filterByDropdownOptions.find((option: IRnrKeyValuePair) => option.key === filterKey);\n if (!filterByOption) {\n this.props.telemetry.warning(`[reviews-list] cannot find filter with key ${filterKey}`);\n } else {\n await this.updateReviews(0, this.state.selectedSortByOption, filterByOption, 1, true);\n const selectedIndex = dropdownItemsCount - filterKeyValue;\n this.setState({\n selectedFilterByOption: this.filterByDropdownOptions[selectedIndex]\n });\n }\n }\n }\n );\n };\n public render(): JSX.Element | null {\n const { className, heading, reviewsShownOnEachPage } = this.props.config;\n const { currentPage, reviewsCount, selectedFilterByOption, selectedSortByOption } = this.state;\n const {\n ratingsSummary: { result: ratingsSummary }\n } = this.props.data;\n const resources = this.props.resources;\n const completeClass = classname('ms-reviews-list', className);\n const viewProps: IReviewsListViewProps = {\n ...this.props,\n state: this.state,\n className: completeClass,\n moduleProps: {\n moduleProps: this.props,\n className: completeClass\n },\n callbacks: this.reviewsListCallbacks,\n reviewModal: this._userReviewModal(),\n reportReviewModal: this._reportReviewModal(),\n filterByDropdown: (\n \n ),\n sortByDropdown: (\n \n ),\n averageRating: ratingsSummary && (\n \n ),\n reviewCount: (\n \n ),\n refineReviewsProps: { className: 'ms-reviews-list__refiners' },\n reviewsListProps: { className: 'ms-reviews-list__reviews' },\n reviewCards: this._reviewCards(this.state.listOfReviews),\n userReview: this._userReview(),\n pageControls: (\n \n ),\n noReviewsMessage: (\n \n {resources.noReviewsMessage}\n \n ),\n noReviewsWithFilterMessage: (\n \n {resources.noReviewsWithSelectedFilterMessage}\n \n ),\n heading: heading && heading.text && (\n \n ),\n sortByOptions: this.sortByDropdownOptions,\n filterByOptions: this.filterByDropdownOptions\n } as IReviewsListViewProps;\n\n return this.props.renderView(viewProps) as React.ReactElement;\n }\n public handleHeadingChange = (event: Msdyn365.ContentEditableEvent) => (this.props.config.heading!.text = event.target.value);\n private readonly _userReview = () => {\n const userReview = this.props.data.userReview.result;\n\n return userReview && this._reviewCard(userReview, true);\n };\n\n private readonly _reviewCards = (reviewList: Review[]) => {\n const userReview = this.props.data.userReview.result;\n const reviewElements: IReviewCardViewProps[] = [];\n\n for (const review of reviewList) {\n if (!review.isTakenDown && review.isPublished && userReview ? review.reviewId !== userReview.reviewId : true) {\n reviewElements.push(this._reviewCard(review, false));\n }\n }\n return reviewElements;\n };\n\n private readonly _reviewCard = (review: Review, userReview: boolean): IReviewCardViewProps => {\n return ReviewCard({\n review,\n resources: { ...this.props.resources },\n context: this.props.context,\n isUserReview: userReview,\n parentId: this.props.id,\n parentType: this.props.typeName,\n reportedReviews: this.state.reportedReviews,\n returnRef: this._userReportModalToggle,\n reportedReviewId: this.state.reportingReviewId,\n toggleWriteReviewModal: this._toggleReviewModal,\n toggleReportReviewModal: this._onReportModalOpen,\n updateReviewHelpfulness: this.updateReviewHelpfulnessVote,\n votedReviews: this.state.votedReviews\n });\n };\n\n private readonly _userReviewModal = (): IReviewModalViewProps => {\n return ReviewModal({\n userReview: this.props.data.userReview.result,\n product: this.props.data.product.result,\n resources: { ...this.props.resources },\n context: this.props.context,\n parentId: this.props.id,\n parentType: this.props.typeName,\n isOpen: this.state.isReviewModalOpen,\n rating: this.state.userReviewRating,\n reviewTitle: this.state.userReviewTitle,\n reviewText: this.state.userReviewText,\n onModalToggle: this._toggleReviewModal,\n onTitleChange: this._onTitleChange,\n onTextChange: this._onTextChange,\n onRatingChange: this._onRatingChange,\n onReviewComplete: this._onReviewComplete,\n renderContextId: 'writeReview-list',\n returnRef: this._userReviewModalToggle,\n hasError: this.state.hasReviewError,\n modalCSS: 'ms-reviews-list'\n });\n };\n\n private readonly _onTitleChange = (event: React.ChangeEvent): void => {\n this.reviewsListCallbacks.updateReviewTitle(event.target.value);\n };\n\n private readonly _onTextChange = (event: React.ChangeEvent): void => {\n this.reviewsListCallbacks.updateReviewText(event.target.value);\n };\n\n private readonly _onRatingChange = (value: number): void => {\n this.reviewsListCallbacks.updateRating(value);\n };\n\n private readonly _toggleReviewModal = (): void => {\n const userReview = this.props.data.userReview.result;\n if (this.state.isReviewModalOpen) {\n this.setState({ isReviewModalOpen: false, hasReviewError: false });\n } else {\n this.setState({\n isReviewModalOpen: true,\n userReviewText: userReview!.reviewText,\n userReviewTitle: userReview!.title,\n userReviewRating: userReview!.rating\n });\n }\n };\n\n private readonly _onReviewComplete = (isSuccess: boolean): void => {\n if (isSuccess) {\n this.setState({ isReviewModalOpen: false, hasReviewError: false });\n } else {\n this.setState({ hasReviewError: true });\n }\n };\n\n private readonly _reportReviewModal = () => {\n return ReportReviewModal({\n resources: { ...this.props.resources },\n context: this.props.context,\n isOpen: this.state.isReportModalOpen,\n returnRef: this._userReportModalToggle,\n reportedKey: this.state.reportedKey,\n onModalToggle: this._onReportModalClose,\n onRadioChange: this._onRadioChange,\n reportReview: this._reportReview,\n hasError: this.state.hasReportError,\n telemetryContent: this.telemetryContent\n });\n };\n\n private readonly _onReportModalOpen = (reviewId: string) => {\n this.setState({\n isReportModalOpen: true,\n reportingReviewId: reviewId,\n reported: false,\n reportedKey: ReviewConcernCategory.SpamAdvertising\n });\n };\n\n private readonly _onReportModalClose = () => {\n this.setState({ isReportModalOpen: false, hasReportError: false });\n };\n\n private readonly _onRadioChange = (event: React.ChangeEvent) => {\n this.setState({ reportedKey: event.currentTarget.getAttribute('data-key') || '' });\n };\n\n private readonly _reportReviewCallback = (reviewId: string, reportedKey: string) => {\n reportReviewConcern(\n new ReportReviewConcernInput(\n reviewId,\n getRnrPartnerId(this.props.context.actionContext),\n this.props.context.request.locale,\n reportedKey,\n this.getUserToken(this.props.context.request),\n getRnrAuthEndpointId(this.props.context.actionContext)\n ),\n this.props.context.actionContext\n )\n .then((_value: boolean) => {\n const reportedReview = this.state.reportedReviews;\n reportedReview.push(reviewId);\n this.setState({ reported: true, reportedReviews: reportedReview, hasReportError: false });\n })\n .catch((error: boolean) => {\n this.setState({ hasReportError: true });\n });\n };\n\n private readonly _reportReview = () => {\n this._reportReviewCallback(this.state.reportingReviewId, this.state.reportedKey);\n };\n\n private readonly updateSortByDropdown = async (notification: ILabeledDropdownOnChangeNotification) => {\n await this.updateReviews(0, notification.selectedOption, this.state.selectedFilterByOption, 1, this.state.isFilterApplied);\n };\n\n private readonly updateFilterByDropdown = async (notification: ILabeledDropdownOnChangeNotification) => {\n await this.updateReviews(0, this.state.selectedSortByOption, notification.selectedOption, 1, true);\n };\n\n private readonly updateReviews = async (\n skipItems: number | 0,\n selectedSortByOption: ILabeledDropdownOption,\n selectedFilterByOption: ILabeledDropdownOption,\n currentPage: number,\n isFilterApplied: boolean\n ) => {\n const productId = getSelectedProductIdFromActionInput(this.props.context.actionContext);\n if (productId === undefined) {\n return;\n }\n const result = await getReviewsForGivenProduct(\n // Task #211227597 Remove this hardcoded values.\n new GetProductReviewsInput(\n productId,\n getRnrPartnerId(this.props.context.actionContext),\n this.props.context.request.locale,\n getRnrEndpointId(this.props.context.actionContext),\n selectedSortByOption.key,\n selectedFilterByOption.key,\n skipItems < 0 ? 0 : skipItems,\n this.props.config.reviewsShownOnEachPage\n ),\n this.props.context.actionContext\n );\n if (result && result.items && result.pagingInfo && result.pagingInfo.totalItems !== undefined) {\n this.setState({\n currentPage,\n listOfReviews: result.items,\n selectedSortByOption,\n selectedFilterByOption,\n reviewsCount: result.pagingInfo.totalItems,\n isFilterApplied\n });\n }\n };\n\n private readonly _updateVoteUi = (reviewId: string, isHelpful: boolean): void => {\n let alreadyExists = false;\n let list = this.state.votedReviews.map(review => {\n if (review.reviewId === reviewId) {\n review.approved = isHelpful;\n alreadyExists = true;\n }\n return review;\n });\n\n if (!alreadyExists) {\n list = list.concat({ reviewId, approved: isHelpful });\n }\n\n this.setState({ votedReviews: list });\n };\n\n private readonly updateReviewHelpfulnessVote = (reviewId: string, isHelpful: boolean): void => {\n submitHelpfulnessVote(\n new SubmitHelpfulnessVoteInput(\n reviewId,\n getRnrPartnerId(this.props.context.actionContext),\n this.props.context.request.locale,\n isHelpful,\n this.getUserToken(this.props.context.request),\n getRnrAuthEndpointId(this.props.context.actionContext)\n ),\n this.props.context.actionContext\n )\n .then(() => {\n this._updateVoteUi(reviewId, isHelpful);\n })\n .catch((error: Error) => {\n throw new Error('[submitHelpfulnessVote]Error executing action');\n });\n };\n\n private readonly getUserToken = (context: Msdyn365.IRequestContext): string => {\n return context && context.user && context.user.token;\n };\n}\n\nexport default ReviewsList;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IModuleProps, Module, Node } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { IReviewModalViewProps } from '../../common/review-modal';\nimport { IReportReviewModalViewProps } from './components/report-review-modal';\nimport { IReviewCardViewProps } from './components/review-card';\nimport { IReviewsListState, IReviewsListViewProps } from './reviews-list';\n\nconst ReviewsListview: React.FC = props => {\n const {\n averageRating,\n filterByDropdown,\n heading,\n moduleProps,\n noReviewsMessage,\n noReviewsWithFilterMessage,\n pageControls,\n refineReviewsProps,\n reportReviewModal,\n reviewsListProps,\n reviewCards,\n reviewCount,\n reviewModal,\n sortByDropdown,\n state,\n userReview\n } = props;\n\n if (!userReview && reviewCards.length === 0 && !state.isFilterApplied) {\n return {noReviewsMessage};\n }\n\n return (\n \n {heading}\n {averageRating}\n {reviewCount}\n \n {sortByDropdown}\n {filterByDropdown}\n \n \n {userReview && buildReviewCard(userReview)}\n {reviewCards.map(review => {\n return buildReviewCard(review);\n })}\n \n {reviewCards.length === 0 && state.isFilterApplied && noReviewsWithFilterMessage}\n {pageControls}\n {createReviewModal(reviewModal, moduleProps)}\n {createReportModal(reportReviewModal, state)}\n \n );\n};\n\nconst buildReviewCard = (props: IReviewCardViewProps) => {\n return (\n \n \n {props.rating}\n {props.name}\n \n \n \n {props.reviewTitle}\n {props.date}\n {props.reviewText}\n \n \n {props.responseName}\n {props.responseDate}\n {props.responseText}\n \n \n {props.ratingHelpfulLabel}\n {props.like}\n {props.dislike}\n {props.edit}\n {props.report}\n \n \n \n );\n};\n\nconst createReviewModal = (props: IReviewModalViewProps, moduleProps: IModuleProps): JSX.Element => {\n return (\n \n {props.modalHeader}\n \n \n \n {props.rating}\n {props.ratingLabel}\n \n \n {props.titleLabel}\n {props.titleInput}\n \n \n {props.textLabel}\n {props.textInput}\n \n {props.privacyPolicyUrl}\n {props.error}\n \n \n \n {props.submitButton}\n {props.cancelButton}\n \n \n );\n};\n\nconst createReportModal = (props: IReportReviewModalViewProps, state: IReviewsListState): JSX.Element => {\n return (\n \n {state.reported ? props.headerSubmitted : props.header}\n \n {state.reported ? props.reportSubmittedMessage : [props.reportMessage, props.radioButtons, props.error]}\n \n {state.reported ? props.succesfulButton : [props.submitButton, props.cancelButton]}\n \n );\n};\n\nexport default ReviewsListview;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { getPayloadObject, getTelemetryAttributes, ITelemetryContent, TelemetryConstant } from '@msdyn365-commerce-modules/utilities';\nimport React from 'react';\n\nexport const SignInMessage: React.FC<{ text: string }> = (props: { text: string }) => {\n return

{props.text}

;\n};\n\nexport const SignInButton: React.FC<{ text: string; href: string; ariaLabel: string; telemetryContent?: ITelemetryContent }> = (props: {\n text: string;\n href: string;\n ariaLabel: string;\n telemetryContent?: ITelemetryContent;\n}) => {\n const { text, href, ariaLabel, telemetryContent } = props;\n const payLoad = getPayloadObject('click', telemetryContent!, TelemetryConstant.SignIn);\n const attributes = getTelemetryAttributes(telemetryContent!, payLoad);\n return (\n \n {text}\n \n );\n};\n\ninterface IModalToggleProps {\n innerRef: React.RefObject | undefined;\n id: string;\n text: string;\n ariaLabel: string;\n telemetryContent?: ITelemetryContent;\n onClick(): void;\n}\n\nexport const ModalToggle: React.FC = (props: IModalToggleProps) => {\n const { text, onClick, ariaLabel, innerRef, telemetryContent, id } = props;\n const payLoad = getPayloadObject('click', telemetryContent!, TelemetryConstant.WriteReview);\n const attributes = getTelemetryAttributes(telemetryContent!, payLoad);\n return (\n \n );\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { Review } from '@msdyn365-commerce/commerce-entities';\nimport * as Msdyn365 from '@msdyn365-commerce/core';\nimport { SimpleProduct } from '@msdyn365-commerce/retail-proxy';\nimport { getTelemetryObject, IModuleProps, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport React from 'react';\n\nimport { IReviewModalViewProps, ReviewModal, submitReview } from '../../common/review-modal';\nimport { TOGGLE_REVIEW_MODAL_BUTTON_ID } from '../../common/rnrInterface';\nimport { ModalToggle, SignInButton, SignInMessage } from './components/components';\nimport { IWriteReviewData } from './write-review.data';\nimport { IWriteReviewProps } from './write-review.props.autogenerated';\n\nexport interface IWriteReviewCallbacks {\n toggleModal(): void;\n updateReviewTitle(title: string): void;\n updateReviewText(text: string): void;\n updateRating(rating: number): void;\n onReviewSubmitted(isSuccessful: boolean): void;\n submitReview(\n product: SimpleProduct,\n title: string,\n text: string,\n rating: number,\n context: Msdyn365.ICoreContext,\n userReview?: Review,\n onReviewSubmission?: (isSuccessful: boolean) => void\n ): void;\n}\n\nexport interface IWriteReviewState {\n rating: number;\n reviewTitle: string;\n reviewText: string;\n isReviewModalOpen: boolean;\n hasReviewError: boolean;\n}\n\nexport interface IWriteReviewViewProps extends IWriteReviewProps {\n state: IWriteReviewState;\n className: string;\n callbacks: IWriteReviewCallbacks;\n signInMessage: React.ReactNode;\n signInButton: React.ReactNode;\n modalToggle: React.ReactNode;\n reviewModal: IReviewModalViewProps;\n moduleProps: IModuleProps;\n heading: React.ReactNode;\n}\n\n/**\n * This module is enables user's to leave ratings and reviews on a specific product\n * WriteReview module.\n * @extends {React.PureComponent>}\n */\nclass WriteReview extends React.PureComponent, IWriteReviewState> {\n private readonly _modalToggleRef: React.RefObject | undefined;\n\n private readonly telemetryContent: ITelemetryContent;\n private readonly writeReviewCallbacks: IWriteReviewCallbacks = {\n // @ts-expect-error\n toggleModal: this._toggleReviewModal,\n updateReviewTitle: (title: string): void => {\n this.setState({ reviewTitle: title });\n },\n updateReviewText: (text: string): void => {\n this.setState({ reviewText: text });\n },\n updateRating: (rating: number): void => {\n this.setState({ rating });\n },\n onReviewSubmitted: (isSuccessful: boolean): void => {\n if (isSuccessful) {\n this.setState({ isReviewModalOpen: false, hasReviewError: false });\n } else {\n this.setState({ hasReviewError: true });\n }\n },\n submitReview\n };\n public constructor(props: IWriteReviewProps) {\n super(props);\n const {\n userReview: { result: userReview }\n } = this.props.data;\n this._toggleReviewModal = this._toggleReviewModal.bind(this);\n this._modalToggleRef = React.createRef();\n const rating = userReview ? userReview.rating : 0;\n const reviewTitle = userReview ? userReview.title : '';\n const reviewText = userReview ? userReview.reviewText : '';\n\n this.state = {\n isReviewModalOpen: false,\n rating,\n reviewTitle,\n reviewText,\n hasReviewError: false\n };\n this.telemetryContent = getTelemetryObject(\n this.props.context.request.telemetryPageName!,\n this.props.friendlyName,\n this.props.telemetry\n );\n }\n\n public render(): JSX.Element {\n const { resources } = this.props;\n const { className, heading } = this.props.config;\n const {\n product: { result: product },\n userReview: { result: userReview }\n } = this.props.data;\n\n const userInfo = this.props.context && this.props.context.request && this.props.context.request.user;\n const completeClass = classnames('ms-write-review', 'msc-modal-input-required', className);\n const viewProps = {\n ...this.props,\n state: this.state,\n className: completeClass,\n moduleProps: {\n moduleProps: this.props,\n className: completeClass,\n id: null\n },\n callbacks: this.writeReviewCallbacks,\n signInMessage: ,\n signInButton: (\n \n ),\n modalToggle: !Msdyn365.isOboRequest(this.props.context.request) && product && (\n \n ),\n reviewModal: this._buildUserReviewModal(),\n heading: heading && heading.text && (\n \n )\n } as IWriteReviewViewProps;\n\n return this.props.renderView(viewProps) as React.ReactElement;\n }\n\n public handleHeadingChange = (event: Msdyn365.ContentEditableEvent) => (this.props.config.heading!.text = event.target.value);\n private readonly _onTitleChange = (event: React.ChangeEvent): void => {\n this.writeReviewCallbacks.updateReviewTitle(event.target.value);\n };\n\n private readonly _onTextChange = (event: React.ChangeEvent): void => {\n this.writeReviewCallbacks.updateReviewText(event.target.value);\n };\n\n private readonly _onRatingChange = (value: number): void => {\n this.writeReviewCallbacks.updateRating(value);\n };\n\n private readonly _toggleReviewModal = (): void => {\n const userReview = this.props.data.userReview.result;\n if (this.state.isReviewModalOpen) {\n this.setState({ isReviewModalOpen: false, hasReviewError: false });\n } else if (userReview) {\n this.setState({\n isReviewModalOpen: true,\n reviewText: userReview.reviewText,\n reviewTitle: userReview.title,\n rating: userReview.rating\n });\n } else {\n this.setState({\n isReviewModalOpen: true,\n reviewText: '',\n reviewTitle: '',\n rating: 0\n });\n }\n };\n\n /**\n * This method builds the user review modal.\n * @param config The module config.\n */\n private _buildUserReviewModal(): IReviewModalViewProps {\n return ReviewModal({\n userReview: this.props.data.userReview.result,\n product: this.props.data.product.result,\n resources: { ...this.props.resources },\n context: this.props.context,\n parentId: this.props.id,\n parentType: this.props.typeName,\n isOpen: this.state.isReviewModalOpen,\n rating: this.state.rating,\n reviewTitle: this.state.reviewTitle,\n reviewText: this.state.reviewText,\n onModalToggle: this._toggleReviewModal,\n onTitleChange: this._onTitleChange,\n onTextChange: this._onTextChange,\n onRatingChange: this._onRatingChange,\n onReviewComplete: this.writeReviewCallbacks.onReviewSubmitted,\n renderContextId: 'writeReview',\n returnRef: this._modalToggleRef,\n hasError: this.state.hasReviewError,\n telemetryContent: this.telemetryContent\n });\n }\n}\n\nexport default WriteReview;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IModuleProps, Module, Node } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { IReviewModalViewProps } from '../../common/review-modal';\nimport { IWriteReviewViewProps } from './write-review';\n\nconst WriteReviewView: React.FC = props => {\n const { heading, signInMessage, signInButton, modalToggle, reviewModal, moduleProps } = props;\n const isAuthenticated = props.context.request.user.isAuthenticated;\n return (\n \n {heading}\n {!isAuthenticated ? (\n <>\n {signInMessage}\n {signInButton}\n \n ) : (\n <>\n {modalToggle}\n {createReviewModal(reviewModal, moduleProps)}\n \n )}\n \n );\n};\n\nconst createReviewModal = (props: IReviewModalViewProps, moduleProps: IModuleProps): JSX.Element => {\n return (\n \n {props.modalHeader}\n \n \n \n {props.rating}\n {props.ratingLabel}\n \n \n {props.titleLabel}\n {props.titleInput}\n \n \n {props.textLabel}\n {props.textInput}\n \n {props.privacyPolicyUrl}\n {props.error}\n \n \n \n {props.submitButton}\n {props.cancelButton}\n \n \n );\n};\n\nexport default WriteReviewView;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { observable } from 'mobx';\n\n/**\n * State information related to what is needed to succesfully perform a autosuggest.\n */\nexport class SearchState {\n @observable public searchText?: string;\n\n @observable public defaultBasicSearchUrl?: string;\n\n @observable public searchQueryStringParameter?: string;\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { Autosuggestions } from '@msdyn365-commerce/commerce-entities';\nimport {\n CacheType,\n createObservableDataAction,\n getCatalogId,\n IAction,\n IActionContext,\n IActionInput,\n ICreateActionContext\n} from '@msdyn365-commerce/core';\nimport {\n AttributeDataType,\n ChannelInventoryConfiguration,\n ProductRefinerSource,\n ProductRefinerValue,\n ProductSearchCriteria,\n SearchSuggestion,\n SearchSuggestionCriteria\n} from '@msdyn365-commerce/retail-proxy';\nimport {\n getInventoryConfigurationAsync,\n getSearchSuggestionsAsync\n} from '@msdyn365-commerce/retail-proxy/dist/DataActions/StoreOperationsDataActions.g';\nimport { generateImageUrl } from '@msdyn365-commerce-modules/retail-actions';\n\nexport enum SuggestionType {\n Category = 'ScopedCategory',\n Keyword = 'Keyword',\n Product = 'Product',\n None = 'None'\n}\n\n/**\n * This setting defines inventory filtering options.\n */\nexport enum ProductListInventoryFilteringOptions {\n /**\n * Filter out all products out of stock.\n */\n HideOOS = 'hideOOS',\n\n /**\n * Sort products by availability, OOS goes last.\n */\n SortOOS = 'sortOOS',\n\n /**\n * No filtering selected.\n */\n Default = 'default'\n}\n\n/**\n * Input class for auto suggest search input.\n */\nexport class AutoSuggestInput implements IActionInput {\n public searchQuery?: string;\n\n public topResultsCount?: number;\n\n public suggestionType?: string;\n\n public hitPrefix?: string;\n\n public hitSuffix?: string;\n\n public constructor(searchText?: string, top?: number, suggestionType?: string, hitPrefix?: string, hitSuffix?: string) {\n this.searchQuery = searchText;\n this.topResultsCount = top;\n this.suggestionType = suggestionType;\n this.hitPrefix = hitPrefix;\n this.hitSuffix = hitSuffix;\n }\n\n public getCacheKey = () => 'AutoSuggestSearchSuggestions';\n\n public getCacheObjectType = () => 'AutoSuggestSearchSuggestions';\n\n public dataCacheType = (): CacheType => 'none';\n}\n\nconst createInput = (inputData: ICreateActionContext) => {\n return new AutoSuggestInput();\n};\n\n/**\n * Calls the Retail API and returns a auto-suggest suggestions.\n * @param input\n * @param ctx\n */\nexport async function getSearchSuggestionsAction(input: AutoSuggestInput, ctx: IActionContext): Promise {\n // If no input is provided fail out\n if (!input || !input.searchQuery) {\n throw new Error('[getSearchSuggestionsAction]No valid Input was provided, failing');\n }\n\n const autosuggest: Autosuggestions = {};\n\n const autoSuggestPromises = [_getAutoSuggest(input, autosuggest, ctx)];\n return Promise.all(autoSuggestPromises).then(() => {\n return autosuggest;\n });\n}\n\n/**\n * Returns inventory in stock sortable refiner value.\n * @param channelInventoryConfiguration - The channelInventoryConfiguration.\n * @param isInStock - The flag indicating whether is getting in-stock refiner or out-of-stock refiner.\n * @returns Refiners.\n */\nconst getInventorySortableRefinerValue = (\n channelInventoryConfiguration: ChannelInventoryConfiguration,\n isInStock: boolean\n): ProductRefinerValue | undefined => {\n if (channelInventoryConfiguration && channelInventoryConfiguration.ProductAvailabilitySortableAttributeRecordId) {\n return {\n RefinerRecordId: channelInventoryConfiguration.ProductAvailabilitySortableAttributeRecordId,\n DataTypeValue: AttributeDataType.TrueFalse,\n LeftValueBoundString: isInStock ? 'true' : 'false',\n RightValueBoundString: isInStock ? 'true' : 'false',\n UnitText: '',\n RowNumber: 0,\n Count: 0,\n ExtensionProperties: [],\n RefinerSourceValue: ProductRefinerSource.Attribute\n };\n }\n return undefined;\n};\n\nasync function _getAutoSuggest(input: AutoSuggestInput, autosuggest: Autosuggestions, ctx: IActionContext): Promise {\n const catalogId = getCatalogId(ctx.requestContext);\n let productSearchCriteria: ProductSearchCriteria = {\n SearchCondition: input.searchQuery && input.searchQuery.length > 0 ? input.searchQuery : '',\n Context: {\n ChannelId: +ctx.requestContext.apiSettings.channelId,\n CatalogId: catalogId\n }\n };\n\n if (ctx.requestContext.app.config?.productListInventoryDisplay === ProductListInventoryFilteringOptions.HideOOS) {\n const channelInventoryConfiguration = await getInventoryConfigurationAsync({ callerContext: ctx });\n const isInStockRefiner = true;\n const inventoryRefinerValue = getInventorySortableRefinerValue(channelInventoryConfiguration, isInStockRefiner);\n\n if (inventoryRefinerValue) {\n productSearchCriteria = {\n ...productSearchCriteria,\n Refinement: [inventoryRefinerValue]\n };\n }\n }\n\n const searchCriteria: SearchSuggestionCriteria = {\n ProductSearchCriteria: productSearchCriteria,\n HitPrefix: input.hitPrefix,\n HitSuffix: input.hitSuffix,\n SuggestionType: input.suggestionType\n };\n\n const searchSuggestions = await getSearchSuggestionsAsync(\n { callerContext: ctx, queryResultSettings: { Paging: { Top: input.topResultsCount } } },\n searchCriteria\n );\n\n if (searchSuggestions && searchSuggestions.length > 0) {\n // Generate image url\n searchSuggestions.map(\n (item: SearchSuggestion) =>\n (item.ImageUrl = item.ImageUrl ? generateImageUrl(item.ImageUrl, ctx.requestContext.apiSettings) : '')\n );\n\n autosuggest.AllSearchResults = searchSuggestions;\n } else {\n ctx.telemetry.error(\n `[getSearchSuggestionsAction] unable to get availabilites for search with suggestion type ${searchCriteria.SuggestionType}`\n );\n }\n}\n\nexport const getSearchSuggestionsActionDataAction = createObservableDataAction({\n id: '@msdyn365-commerce-modules/search/get-auto-suggest-suggestions',\n action: >getSearchSuggestionsAction,\n input: createInput\n});\n\nexport default getSearchSuggestionsActionDataAction;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport MsDyn365, { getRichTextHtml } from '@msdyn365-commerce/core';\nimport { ProductRefiner, ProductRefinerSource, ProductRefinerValue, SearchSuggestion } from '@msdyn365-commerce/retail-proxy';\nimport { format, getPayloadObject, getTelemetryAttributes, IPayLoad, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { ISearchData } from '../search.data';\nimport { ISearchProps } from '../search.props.autogenerated';\n\nexport interface ISearchCategorySuggestProps {\n searchCategorySuggestClass: string;\n searchPageURL: string;\n searchQsp: string | undefined;\n hitPrefix: string;\n hitSuffix: string;\n autoSuggestProps: ISearchProps;\n searchText: string;\n searchRefiners: ProductRefiner[] | undefined;\n suggestions: SearchSuggestion[] | undefined;\n telemetryContent?: ITelemetryContent;\n shouldShowFullPath?: boolean;\n}\n\nexport interface ISearchCategoryViewProps {\n title: React.ReactNode;\n text: React.ReactNode[];\n}\n\nlet payLoad: IPayLoad;\n\n/**\n * CategorySuggestionsComponent.\n * @param props\n */\nexport const CategorySuggestionsComponent = (props: ISearchCategorySuggestProps): ISearchCategoryViewProps | undefined => {\n const {\n suggestions,\n searchText,\n autoSuggestProps: {\n resources: { categorySuggestionHeading }\n }\n } = props;\n\n const reactNodes: React.ReactNode[] = [];\n payLoad = getPayloadObject('click', props.telemetryContent!, '');\n\n suggestions?.map(item => {\n reactNodes.push(_assembleNode(item, props));\n });\n\n const titleNode = _renderTitle(categorySuggestionHeading, searchText);\n\n return { title: titleNode, text: reactNodes };\n};\n\nconst _renderTitle = (categorySuggestionHeading: string, searchText: string) => {\n const categoryAutoSuggestionHeading = categorySuggestionHeading\n ? format(categorySuggestionHeading, searchText)\n : `Search \"${searchText}\" in categories`;\n\n return
  • {categoryAutoSuggestionHeading}
  • ;\n};\n\nconst _assembleNode = (item: SearchSuggestion, props: ISearchCategorySuggestProps) => {\n const { searchText, hitPrefix, hitSuffix, shouldShowFullPath } = props;\n\n const splitValue = shouldShowFullPath ? item.Value : item.Value && item.Value.split('|').pop();\n const ariaLabel = splitValue\n ? splitValue.replace(new RegExp(`[${hitPrefix}]`, 'gi'), '').replace(new RegExp(`[${hitSuffix}]`, 'gi'), '')\n : item.Value && item.Value.replace(new RegExp(`[${hitPrefix}]`, 'gi'), '').replace(new RegExp(`[${hitSuffix}]`, 'gi'), '');\n payLoad.contentAction.etext = item.Value;\n const attribute = getTelemetryAttributes(props.telemetryContent!, payLoad);\n return (\n
  • \n \n {_generateLink(item, searchText, props) && _getHighlightedText(splitValue ? splitValue : '', hitPrefix, hitSuffix)}\n \n
  • \n );\n};\n\nconst _generateLink = (suggestion: SearchSuggestion, searchText: string, props: ISearchCategorySuggestProps): string => {\n return suggestion && suggestion.Id ? _getCategoryLink(suggestion.Id, searchText, props) : '';\n};\n\nconst _getCategoryLink = (id: string, searchText: string, props: ISearchCategorySuggestProps): string => {\n const { searchPageURL, searchQsp, searchRefiners } = props;\n\n if (!MsDyn365.isBrowser) {\n return '';\n }\n\n const queryUrl = new URL(searchPageURL, window.location.href);\n\n if (searchQsp && searchText) {\n queryUrl.searchParams.set(searchQsp, searchText);\n }\n\n const categoryRefiners = searchRefiners?.find(refiners => {\n return refiners.SourceValue === ProductRefinerSource.Category;\n });\n const refiner = categoryRefiners?.Values?.find(item => {\n return item.RefinerRecordId === Number.parseInt(id, 10);\n });\n\n const encodedRefiner = refiner && JSON.stringify(compressRefiners([refiner]));\n if (encodedRefiner) {\n queryUrl.searchParams.set('refiners', encodedRefiner);\n }\n\n return queryUrl.href;\n};\n\nconst _getHighlightedText = (suggestion: string, hitPrefix: string, hitSuffix: string): JSX.Element => {\n const formattedText = suggestion\n .replace(new RegExp(`[${hitPrefix}]`, 'gi'), '')\n .replace(new RegExp(`[${hitSuffix}]`, 'gi'), '');\n\n // eslint-disable-next-line react/no-danger\n return ;\n};\n\n// TODO: This code is currently duplicated in categoryautosuggest need to either remove one of these files\n// or move this code to a common place\nconst compressedRefinerKeys = [\n 'DataTypeValue',\n 'LeftValueBoundString',\n 'RefinerRecordId',\n 'RefinerSourceValue',\n 'RightValueBoundString',\n 'UnitText'\n];\n\n/**\n * Compressed a list of refiners for use in URLs.\n * @param refiners The uncompressed refiners.\n */\nconst compressRefiners = (refiners: ProductRefinerValue[]) => {\n const compressedRefiners: (string | number)[][] = [];\n\n refiners.forEach(refiner => {\n const compressedRefiner: (string | number)[] = [];\n compressedRefinerKeys.forEach(refinerKey => {\n compressedRefiner.push(refiner[refinerKey]);\n });\n compressedRefiners.push(compressedRefiner);\n });\n\n return compressedRefiners;\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { Button } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nexport interface ISearchFormProps {\n hideSearchLabel: boolean | undefined;\n isSearchFormExpanded?: boolean | undefined;\n disableSubmitSearch: boolean | undefined;\n searchTextInput: React.RefObject;\n maxChars: number;\n searchQsp: string;\n searchPlaceholder: string;\n query: string;\n ariaLabelCancel: string;\n ariaLabelSearch: string;\n ariaLabelSubmit: string;\n handleCancelSearchChange(): void;\n handleInputChange(query: string): void;\n}\n\nexport interface ISearchFormViewProps {\n input: React.ReactNode;\n submitBtn: React.ReactNode;\n cancelBtn: React.ReactNode;\n}\n\n/**\n * On Input Change functionality.\n * @param handleInputChange -Input change function.\n * @returns Set updated input value.\n */\nconst onInputChangeFunction = (handleInputChange: (query: string) => void) => (event: React.ChangeEvent) => {\n handleInputChange(event.target.value || '');\n};\nexport const FormComponent = (props: ISearchFormProps): ISearchFormViewProps => {\n const {\n searchQsp,\n searchPlaceholder,\n hideSearchLabel,\n searchTextInput,\n handleInputChange,\n maxChars,\n disableSubmitSearch,\n handleCancelSearchChange,\n query,\n ariaLabelCancel,\n ariaLabelSearch,\n ariaLabelSubmit\n } = props;\n\n const onInputChange = onInputChangeFunction(handleInputChange);\n\n const inputNode = !hideSearchLabel ? (\n \n ) : (\n \n );\n\n const submitBtnNode = !disableSubmitSearch && \n
    \n );\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { PriceComponent } from '@msdyn365-commerce/components';\nimport { getRichTextHtml, IActionContext, IImageSettings, Image, ITelemetry } from '@msdyn365-commerce/core';\nimport { SearchSuggestion } from '@msdyn365-commerce/retail-proxy';\nimport { getProductPageUrlSync, ObjectExtensions } from '@msdyn365-commerce-modules/retail-actions';\nimport {\n getPayloadObject,\n getTelemetryAttributes,\n INodeProps,\n IPayLoad,\n ITelemetryContent,\n NodeTag\n} from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { ISearchData } from '../search.data';\nimport { ISearchProps } from '../search.props.autogenerated';\n\n/**\n * Search product suggest resources.\n */\nexport interface ISearchProductSuggestResources {\n freePriceText: string;\n}\n\nexport interface ISearchProductSuggestProps {\n searchProductSuggestClass: string;\n searchPageURL: string;\n searchQsp: string | undefined;\n hitPrefix: string;\n hitSuffix: string;\n autoSuggestProps: ISearchProps;\n searchText: string;\n suggestions: SearchSuggestion[] | undefined;\n telemetry: ITelemetry;\n moduleType: string;\n moduleId: string;\n telemetryContent?: ITelemetryContent;\n resources?: ISearchProductSuggestResources;\n}\n\nexport interface ISearchProductViewProps {\n title: React.ReactNode;\n items: ISearchProductItemViewProps[];\n}\n\nexport interface ISearchProductItemViewProps {\n text: React.ReactNode;\n thumbnail: React.ReactNode;\n price: React.ReactNode;\n LiProduct: INodeProps;\n AProduct: INodeProps;\n id: string | undefined;\n}\n\nlet payLoad: IPayLoad;\nlet telemetryContent: ITelemetryContent | undefined;\n\n/**\n * ProductSuggestionsComponent.\n * @param props\n */\nexport const ProductSuggestionsComponent = (props: ISearchProductSuggestProps): ISearchProductViewProps | undefined => {\n const {\n suggestions,\n hitSuffix,\n hitPrefix,\n autoSuggestProps: {\n context: { actionContext },\n resources: { productSuggestionHeading }\n },\n moduleType,\n moduleId\n } = props;\n const reactNodes: ISearchProductItemViewProps[] = [];\n telemetryContent = props.telemetryContent;\n payLoad = getPayloadObject('click', props.telemetryContent!, '');\n\n suggestions?.map(item => {\n reactNodes.push(_assembleNode(item, hitPrefix, hitSuffix, actionContext, props, moduleType, moduleId));\n });\n\n const titleNode = _renderTitle(productSuggestionHeading);\n\n return { title: titleNode, items: reactNodes };\n};\n\nconst _renderTitle = (productSuggestionHeading: string) => {\n const productAutoSuggestionHeading = productSuggestionHeading ? productSuggestionHeading : 'Go to products';\n\n return
  • {productAutoSuggestionHeading}
  • ;\n};\n\nconst _assembleNode = (\n item: SearchSuggestion,\n hitPrefix: string,\n hitSuffix: string,\n actionContext: IActionContext,\n props: ISearchProductSuggestProps,\n moduleType: string,\n moduleId: string\n): ISearchProductItemViewProps => {\n const altText =\n item.Value && item.Value.replace(new RegExp(`[${hitPrefix}]`, 'gi'), '').replace(new RegExp(`[${hitSuffix}]`, 'gi'), '');\n\n const price = item.Value3?.Value?.DecimalValue;\n return {\n text: _getHighlightedText(item.Value ? item.Value : '', hitPrefix, hitSuffix),\n thumbnail: _renderThumbnail(item, altText ? altText : '', props),\n price: !ObjectExtensions.isNullOrUndefined(price) && _renderPrice(price, price, moduleId, moduleType, props),\n LiProduct: _getLiWrapper(),\n AProduct: _getAWrapper(item, hitPrefix, hitSuffix, actionContext, props),\n id: item.Id\n };\n};\n\nconst _getLiWrapper = () => {\n return {\n className: 'msc-autoSuggest__productResults-item',\n tag: 'li' as NodeTag\n };\n};\n\nconst _getAWrapper = (\n item: SearchSuggestion,\n hitPrefix: string,\n hitSuffix: string,\n actionContext: IActionContext,\n props: ISearchProductSuggestProps\n) => {\n const {\n autoSuggestProps: { context }\n } = props;\n const ariaLabel =\n item.Value && item.Value.replace(new RegExp(`[${hitPrefix}]`, 'gi'), '').replace(new RegExp(`[${hitSuffix}]`, 'gi'), '');\n\n payLoad.contentAction.recid = item.Id;\n const attribute = getTelemetryAttributes(telemetryContent!, payLoad);\n const productPrice = context.cultureFormatter.formatCurrency(item.Value3!.Value!.DecimalValue!);\n\n return {\n className: 'msc-autoSuggest__productResults-item',\n tag: 'a' as NodeTag,\n 'aria-label': `${ariaLabel!} ${productPrice}`,\n href: _generateLink(item, hitPrefix, hitSuffix, actionContext),\n ...attribute\n };\n};\n\nconst _generateLink = (suggestion: SearchSuggestion, hitPrefix: string, hitSuffix: string, actionContext: IActionContext) => {\n const formattedLink = (suggestion.Value as string)\n .replace(new RegExp(`[${hitPrefix}]`, 'gi'), '')\n .replace(new RegExp(`[${hitSuffix}]`, 'gi'), '');\n return suggestion.Value && suggestion.Id\n ? getProductPageUrlSync(formattedLink, (suggestion.Id as unknown) as number, actionContext, undefined)\n : '';\n};\n\nconst _getHighlightedText = (suggestion: string, hitPrefix: string, hitSuffix: string): JSX.Element => {\n const formattedText = suggestion\n .replace(new RegExp(`[${hitPrefix}]`, 'gi'), '')\n .replace(new RegExp(`[${hitSuffix}]`, 'gi'), '');\n\n return (\n // eslint-disable-next-line react/no-danger\n \n );\n};\n\nconst _renderPrice = (\n adjustedPrice: number,\n basePrice: number,\n moduleId: string,\n moduleType: string,\n props: ISearchProductSuggestProps\n): JSX.Element | null => {\n const {\n autoSuggestProps: { context }\n } = props;\n\n return (\n \n );\n};\n\nconst _renderThumbnail = (suggestion: SearchSuggestion, altText: string, props: ISearchProductSuggestProps): JSX.Element | null => {\n const {\n autoSuggestProps: {\n context: {\n request: { gridSettings }\n },\n config: { imageSettings }\n }\n } = props;\n if (imageSettings) {\n imageSettings.cropFocalRegion = true;\n }\n\n if (!suggestion || !suggestion.ImageUrl) {\n props.telemetry.error('Search suggestion content is empty, module wont render.');\n return null;\n }\n\n const defaultImageSettings: IImageSettings = {\n viewports: {\n xs: { q: 'w=40&h=40&m=6', w: 0, h: 0 },\n lg: { q: 'w=40&h=40&m=6', w: 0, h: 0 },\n xl: { q: 'w=40&h=40&m=6', w: 0, h: 0 }\n },\n lazyload: true,\n cropFocalRegion: true\n };\n\n return (\n \n );\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { Autosuggestions } from '@msdyn365-commerce/commerce-entities';\nimport MsDyn365, { getCatalogId, getUrlSync } from '@msdyn365-commerce/core';\nimport { ProductRefiner, ProductRefinerSource, ProductsDataActions } from '@msdyn365-commerce/retail-proxy';\nimport { ArrayExtensions, ObjectExtensions, Random, validateCatalogId } from '@msdyn365-commerce-modules/retail-actions';\nimport { createSearchStateInput } from '@msdyn365-commerce-modules/search-utilities';\nimport { getTelemetryObject, IModuleProps, INodeProps, ITelemetryContent, KeyCodes } from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport { debounce } from 'lodash';\nimport { Spinner, SpinnerSize } from 'office-ui-fabric-react';\nimport * as React from 'react';\n\nimport getSearchSuggestionsAction, { AutoSuggestInput, SuggestionType } from './actions/get-auto-suggest-suggestions';\nimport {\n CategorySuggestionsComponent,\n FormComponent,\n ISearchCategoryViewProps,\n ISearchKeywordViewProps,\n ISearchProductViewProps,\n KeywordSuggestionsComponent,\n LabelComponent,\n ProductSuggestionsComponent\n} from './components';\nimport { ISearchData } from './search.data';\nimport { ISearchProps, ISuggestionTypeCriterionData, SuggestionTypeCriterionSuggestionType } from './search.props.autogenerated';\n\nexport interface ISearchState {\n isSearchFormExpanded: boolean;\n searchText: string;\n searchKeywordSuggestClass: string;\n searchProductSuggestClass: string;\n searchCategorySuggestClass: string;\n suggestions: Autosuggestions | undefined;\n searchRefiners?: ProductRefiner[] | undefined;\n autoSuggestAriaLabel: string;\n isInitialState: boolean;\n isLoadingAutoSuggest?: boolean;\n}\n\nexport interface ISearchViewProps extends ISearchProps {\n Search: IModuleProps;\n AutoSuggestAriaLabel: INodeProps;\n AutoSuggestAriaLabelText: string;\n searchText: string;\n AutoSuggest: INodeProps;\n KeywordSuggest: INodeProps;\n ProductSuggest: INodeProps;\n CategorySuggest: INodeProps;\n SearchForm: INodeProps;\n FormWrapper: INodeProps;\n UlKeyword: INodeProps;\n UlProduct: INodeProps;\n UlCategory: INodeProps;\n label: React.ReactNode;\n form: React.ReactNode;\n autosuggestKeyword?: ISearchKeywordViewProps;\n autosuggestProduct?: ISearchProductViewProps;\n autosuggestCategory?: ISearchCategoryViewProps;\n callbacks: {\n handleCancelSearchChange(): void;\n handleCancelSearchFocused?(): void;\n };\n isSearchFormExpanded: boolean;\n isLoadingAutoSuggest?: boolean;\n isLoadingNode?: React.ReactNode;\n}\n\n/**\n *\n * Search module.\n * @extends {React.Component, ISearchState>}\n */\nclass Search extends React.Component, ISearchState> {\n private readonly searchTextInput: React.RefObject;\n\n private readonly searchCollapsedLabel: React.RefObject;\n\n private readonly formReference: React.RefObject;\n\n private readonly maxChars: number;\n\n private readonly topResultsCount?: number;\n\n private readonly hitPrefix: string = '{';\n\n private readonly hitSuffix: string = '}';\n\n private readonly waitTime: number = 500;\n\n private readonly autoSuggestResultScreenReaderDiv: React.RefObject;\n\n private readonly autoSuggestResultDiv: React.RefObject;\n\n private readonly searchFormClass: string;\n\n private readonly searchLabelClass: string;\n\n private readonly telemetryContent: ITelemetryContent;\n\n private loadSuggestionsRequestId?: string;\n\n private inputSuggestionType: ISuggestionTypeCriterionData[];\n\n // @ts-expect-error\n private cancellabelDebounce: debounce;\n\n public constructor(props: ISearchProps) {\n super(props);\n this.searchTextInput = React.createRef();\n this.searchCollapsedLabel = React.createRef();\n this.autoSuggestResultScreenReaderDiv = React.createRef();\n this.autoSuggestResultDiv = React.createRef();\n this.formReference = React.createRef();\n this.state = {\n isSearchFormExpanded: false,\n searchText: '',\n searchKeywordSuggestClass: 'ms-search__autoSuggest__keyword',\n searchProductSuggestClass: 'ms-search__autoSuggest__product',\n searchCategorySuggestClass: 'ms-search__autoSuggest__category',\n suggestions: undefined,\n searchRefiners: undefined,\n autoSuggestAriaLabel: '',\n isInitialState: true,\n isLoadingAutoSuggest: false\n };\n this.maxChars =\n (this.props.context &&\n this.props.context.app &&\n this.props.context.app.config &&\n this.props.context.app.config.searchInputMaxLength) ||\n 50;\n\n this.inputSuggestionType = [];\n this.topResultsCount = this.props.config && this.props.config.topResultsCount ? this.props.config.topResultsCount : 5;\n this.searchFormClass = 'ms-search__form';\n this.searchLabelClass = 'ms-search__label';\n this.telemetryContent = getTelemetryObject(\n this.props.context.request.telemetryPageName!,\n this.props.friendlyName,\n this.props.telemetry\n );\n\n this._initSuggestionTypes();\n }\n\n public async componentDidMount(): Promise {\n document.body && document.body.addEventListener('mousedown', this._focusOutTarget);\n window && window.addEventListener('keyup', this._keyup);\n }\n\n public componentWillUnmount(): void {\n document.body && document.body.removeEventListener('mousedown', this._focusOutTarget, false);\n window && window.removeEventListener('keyup', this._keyup, false);\n }\n\n public componentDidUpdate(): void {\n const {\n config: { hideSearchLabel }\n } = this.props;\n const { isSearchFormExpanded, isInitialState } = this.state;\n\n if (!this.props.context.request.params.isEditor) {\n if (!hideSearchLabel && isSearchFormExpanded) {\n this.searchTextInput && this.searchTextInput.current && this.searchTextInput.current.focus();\n } else if (!isInitialState) {\n this.searchCollapsedLabel && this.searchCollapsedLabel.current && this.searchCollapsedLabel.current.focus();\n }\n }\n }\n\n public shouldComponentUpdate(nextProps: ISearchProps, nextState: ISearchState): boolean {\n if (this.state === nextState && this.props === nextProps) {\n return false;\n }\n return true;\n }\n\n // eslint-disable-next-line complexity -- ignore complexity.\n public render(): JSX.Element {\n const {\n context,\n resources: { searchtext, searchLabelArialLabel, cancelBtnAriaLabel, searchBtnAriaLabel, submitBtnAriaLabel },\n config: { hideSearchLabel, disableSubmitSearch, searchplaceholderText, shouldShowFullCategoryPath, className = '' }\n } = this.props;\n\n const {\n isSearchFormExpanded,\n searchText,\n searchKeywordSuggestClass,\n searchProductSuggestClass,\n searchCategorySuggestClass,\n suggestions,\n searchRefiners,\n isLoadingAutoSuggest\n } = this.state;\n\n const searchQsp = (context && context.app && context.app.config && context.app.config.searchQueryStringParameter) || 'q';\n const searchPageURL = getUrlSync('search', context && context.actionContext) || '';\n const searchURL = this._appendQueryParams(searchPageURL, searchText, searchQsp);\n const searchPlaceholder = searchplaceholderText && searchplaceholderText.length > 0 ? searchplaceholderText : 'Search in Fabrikam';\n\n const keywordSuggestions = suggestions?.AllSearchResults?.filter(\n suggestion => suggestion.SuggestionType === SuggestionType.Keyword || suggestion.SuggestionType === SuggestionType.None\n );\n const productSuggestions = suggestions?.AllSearchResults?.filter(\n suggestion => suggestion.SuggestionType === SuggestionType.Product\n );\n const categoryRefiners = searchRefiners?.find(refiner => {\n return refiner.SourceValue === ProductRefinerSource.Category;\n });\n const categorySuggestions = suggestions?.AllSearchResults?.filter(suggestion => {\n if (suggestion.SuggestionType !== SuggestionType.Category) {\n return false;\n }\n const refiner = categoryRefiners?.Values?.find(item => {\n return `${item.RefinerRecordId ?? 0}` === suggestion.Id;\n });\n\n return !ObjectExtensions.isNullOrUndefined(refiner);\n });\n\n const viewProps: ISearchViewProps = {\n ...(this.props as ISearchProps),\n\n Search: {\n moduleProps: this.props,\n className: `${classnames('ms-search', className)} ${disableSubmitSearch ? 'no-submit' : 'with-submit'}`\n },\n AutoSuggestAriaLabel: {\n tag: 'div',\n className: 'msc-autoSuggest__screen-reader',\n 'aria-live': 'assertive',\n ref: this.autoSuggestResultScreenReaderDiv\n },\n AutoSuggestAriaLabelText: this.state.autoSuggestAriaLabel,\n searchText: this.state.searchText,\n AutoSuggest: {\n ref: this.autoSuggestResultDiv,\n className: 'ms-search__autoSuggest'\n },\n KeywordSuggest: {\n className: searchKeywordSuggestClass\n },\n ProductSuggest: {\n className: searchProductSuggestClass\n },\n CategorySuggest: {\n className: searchCategorySuggestClass\n },\n SearchForm: {\n className: `${this.searchFormClass} ${isSearchFormExpanded ? 'bx-show' : 'bx-hide'}`\n },\n FormWrapper: {\n tag: 'form',\n ref: this.formReference,\n className: 'ms-search__searchForm',\n 'aria-label': 'Search',\n name: 'searchForm',\n role: 'search',\n action: searchURL,\n autoComplete: 'off',\n onSubmit: this._handleSubmit\n },\n UlKeyword: {\n tag: 'ul',\n className: classnames('msc-autoSuggest__keywordResults-items', className)\n },\n UlProduct: {\n tag: 'ul',\n className: classnames('msc-autoSuggest__productResults-items', className)\n },\n UlCategory: {\n tag: 'ul',\n className: classnames('msc-autoSuggest__categoryResults-items', className)\n },\n label: LabelComponent({\n isSearchFormExpanded,\n searchLabelClass: `${this.searchLabelClass} ${isSearchFormExpanded ? 'bx-hide' : 'bx-show'}`,\n searchtext,\n searchLabelArialLabel,\n searchCollapsedLabel: this.searchCollapsedLabel,\n hideSearchLabel,\n handleCancelSearchChange: this._handleCancelSearchChange,\n telemetryContent: this.telemetryContent\n }),\n form: FormComponent({\n ariaLabelCancel: cancelBtnAriaLabel,\n ariaLabelSearch: searchBtnAriaLabel,\n ariaLabelSubmit: submitBtnAriaLabel,\n hideSearchLabel,\n searchTextInput: this.searchTextInput,\n disableSubmitSearch,\n handleInputChange: this._handleInputChange,\n handleCancelSearchChange: this._handleCancelSearchChange,\n maxChars: this.maxChars,\n searchQsp,\n searchPlaceholder,\n query: searchText\n }),\n autosuggestKeyword:\n searchText &&\n searchText.length > 0 &&\n (isLoadingAutoSuggest || (keywordSuggestions && ArrayExtensions.hasElements(keywordSuggestions)))\n ? KeywordSuggestionsComponent({\n searchKeywordSuggestClass,\n searchPageURL,\n searchQsp,\n hitPrefix: this.hitPrefix,\n hitSuffix: this.hitSuffix,\n autoSuggestProps: this.props,\n searchText,\n suggestions: keywordSuggestions,\n telemetryContent: this.telemetryContent\n })\n : undefined,\n autosuggestProduct:\n searchText &&\n searchText.length > 0 &&\n (isLoadingAutoSuggest || (productSuggestions && ArrayExtensions.hasElements(productSuggestions)))\n ? ProductSuggestionsComponent({\n searchProductSuggestClass,\n searchPageURL,\n searchQsp,\n hitPrefix: this.hitPrefix,\n hitSuffix: this.hitSuffix,\n autoSuggestProps: this.props,\n searchText,\n suggestions: productSuggestions,\n telemetry: this.props.telemetry,\n moduleType: this.props.typeName,\n moduleId: this.props.id,\n telemetryContent: this.telemetryContent,\n resources: this.props.resources\n })\n : undefined,\n autosuggestCategory:\n searchText &&\n searchText.length > 0 &&\n (isLoadingAutoSuggest || (categorySuggestions && ArrayExtensions.hasElements(categorySuggestions)))\n ? CategorySuggestionsComponent({\n searchCategorySuggestClass,\n searchPageURL,\n searchQsp,\n hitPrefix: this.hitPrefix,\n hitSuffix: this.hitSuffix,\n autoSuggestProps: this.props,\n searchText,\n suggestions: categorySuggestions,\n searchRefiners,\n telemetryContent: this.telemetryContent,\n shouldShowFullPath: shouldShowFullCategoryPath\n })\n : undefined,\n callbacks: {\n handleCancelSearchChange: this._handleCancelSearchChange,\n handleCancelSearchFocused: this._handleCancelSearchFocused\n },\n isSearchFormExpanded: this.state.isSearchFormExpanded,\n isLoadingAutoSuggest,\n isLoadingNode: this._isLoadingNode()\n };\n\n return this.props.renderView(viewProps) as React.ReactElement;\n }\n\n private _initSuggestionTypes() {\n const suggestionTypes = this.props.config.suggestionTypeCriterion;\n\n const suggestions = ArrayExtensions.unique(ArrayExtensions.validValues(suggestionTypes));\n if (!ArrayExtensions.hasElements(suggestions)) {\n this.inputSuggestionType = [\n { SuggestionType: SuggestionTypeCriterionSuggestionType.keyword },\n { SuggestionType: SuggestionTypeCriterionSuggestionType.product },\n { SuggestionType: SuggestionTypeCriterionSuggestionType.scopedCategory }\n ];\n return;\n }\n\n const validSuggestions = suggestions.filter(suggestion => suggestion.SuggestionType);\n if (ArrayExtensions.hasElements(validSuggestions)) {\n this.inputSuggestionType = validSuggestions;\n return;\n }\n\n this.inputSuggestionType = [];\n }\n\n /**\n * Function to create the ReactNode for loading Autosuggest result.\n * @returns ReachNode for loading Autosuggest result.\n */\n private readonly _isLoadingNode = (): React.ReactNode => {\n const loadingText = this.props.resources.autoSuggestResultLoadingMessage;\n return ;\n };\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private readonly _focusOutTarget = (e: any): void => {\n const { suggestions } = this.state;\n\n if (suggestions && suggestions.AllSearchResults && e.target.closest('.ms-search') === null) {\n this._clearAutoSuggestState();\n }\n };\n\n private readonly _keyup = (e: KeyboardEvent): void => {\n const { suggestions } = this.state;\n\n if (suggestions && suggestions.AllSearchResults && e.keyCode === KeyCodes.Escape) {\n this._clearAutoSuggestState();\n } else if (this.state.isSearchFormExpanded && e.keyCode === KeyCodes.Escape) {\n if (this.state.isSearchFormExpanded) {\n this.setState({ isSearchFormExpanded: false });\n }\n }\n\n if (\n !(\n (this.formReference.current && this.formReference.current.contains((e.target as unknown) as Node)) ||\n (this.autoSuggestResultDiv.current && this.autoSuggestResultDiv.current.contains((e.target as unknown) as Node))\n )\n ) {\n if (suggestions && suggestions.AllSearchResults) {\n this._clearAutoSuggestState();\n }\n\n if (this.state.isSearchFormExpanded) {\n this.setState({ isSearchFormExpanded: false });\n }\n }\n };\n\n private readonly _clearAutoSuggestState = (): void => {\n const {\n context: { actionContext },\n data: { searchState }\n } = this.props;\n\n if (this.searchTextInput.current && this.searchTextInput.current.value.length > 0) {\n searchState.searchText = '';\n searchState.defaultBasicSearchUrl = '';\n searchState.searchQueryStringParameter = '';\n actionContext ? actionContext.update(createSearchStateInput(searchState), searchState) : null;\n this.searchTextInput.current.value = '';\n }\n\n this.setState({ searchText: '', suggestions: undefined, searchRefiners: undefined });\n };\n\n private async _getSearchSuggestions(loadSuggestionsRequestId: string, query: string) {\n try {\n const searchSuggestions = await getSearchSuggestionsAction(\n new AutoSuggestInput(query, this.topResultsCount, this._getSuggestionType(), this.hitPrefix, this.hitSuffix),\n this.props.context.actionContext\n );\n if (loadSuggestionsRequestId !== this.loadSuggestionsRequestId) {\n return undefined;\n }\n return searchSuggestions;\n } catch (error) {\n if (loadSuggestionsRequestId !== this.loadSuggestionsRequestId) {\n return undefined;\n }\n this.setState({ suggestions: undefined, searchRefiners: undefined, autoSuggestAriaLabel: this._setAutoSuggestResultCount() });\n this.props.telemetry.exception(error);\n this.props.telemetry.debug('Unable to get auto suggest results');\n return undefined;\n }\n }\n\n private async _updateSearchRefiners(loadSuggestionsRequestId: string, query: string, suggestions: Autosuggestions | undefined) {\n try {\n const refiners = await this._getSearchRefiners(query);\n if (loadSuggestionsRequestId !== this.loadSuggestionsRequestId) {\n return;\n }\n this.setState({\n suggestions,\n searchRefiners: refiners,\n autoSuggestAriaLabel: this._setAutoSuggestResultCount(suggestions),\n isLoadingAutoSuggest: false\n });\n } catch (error) {\n if (loadSuggestionsRequestId !== this.loadSuggestionsRequestId) {\n return;\n }\n this.setState({ suggestions, searchRefiners: undefined, autoSuggestAriaLabel: this._setAutoSuggestResultCount(suggestions) });\n this.props.telemetry.exception(error);\n this.props.telemetry.debug('Unable to get refiners results');\n }\n }\n\n private _loadSuggestions(query: string) {\n this.cancellabelDebounce = debounce(async () => {\n this.setState({ isLoadingAutoSuggest: true });\n const loadSuggestionsRequestId = Random.Guid.generateGuid();\n this.loadSuggestionsRequestId = loadSuggestionsRequestId;\n const searchSuggestions = await this._getSearchSuggestions(loadSuggestionsRequestId, query);\n await this._updateSearchRefiners(loadSuggestionsRequestId, query, searchSuggestions);\n }, this.waitTime);\n\n setTimeout(() => {\n this.cancellabelDebounce();\n }, 0);\n }\n\n private readonly _handleInputChange = (query: string): void => {\n if (!query || query.length <= this.maxChars) {\n this.setState({ searchText: query });\n }\n\n if (this.cancellabelDebounce) {\n this.cancellabelDebounce.cancel();\n }\n\n const {\n context,\n data: { searchState }\n } = this.props;\n\n if (context) {\n if (query && query.length > 0) {\n if (query.length > this.maxChars) {\n return;\n }\n\n if (ArrayExtensions.hasElements(this.inputSuggestionType)) {\n this._loadSuggestions(query);\n }\n\n searchState.searchText = query;\n } else {\n this.setState({ suggestions: undefined, searchRefiners: undefined });\n searchState.searchText = '';\n }\n context.actionContext.update(createSearchStateInput(searchState), searchState);\n }\n };\n\n private _getSuggestionType(): string {\n const distinctSuggestionTypes: string[] = this.inputSuggestionType.map(\n suggestionTypeItem => suggestionTypeItem.SuggestionType!.charAt(0).toUpperCase() + suggestionTypeItem.SuggestionType!.slice(1)\n );\n return distinctSuggestionTypes.join(',');\n }\n\n private async _getSearchRefiners(searchText: string): Promise {\n const { actionContext: ctx } = this.props.context;\n const catalogId = getCatalogId(ctx.requestContext);\n validateCatalogId(catalogId);\n return ProductsDataActions.getProductSearchRefinersAsync(\n { callerContext: ctx },\n {\n SearchCondition: searchText,\n Context: {\n ChannelId: +ctx.requestContext.apiSettings.channelId,\n CatalogId: catalogId\n }\n }\n );\n }\n\n private readonly _handleSubmit = (\n e: React.MouseEvent | React.KeyboardEvent | React.FormEvent\n ): void => {\n const {\n config: { disableSubmitSearch },\n context: {\n actionContext,\n app: {\n config: { searchQueryStringParameter }\n }\n }\n } = this.props;\n\n const query = this.searchTextInput.current && this.searchTextInput.current.value;\n e.preventDefault();\n\n if (!query || (query && query.length === 0) || disableSubmitSearch) {\n this.searchTextInput && this.searchTextInput.current && this.searchTextInput.current.focus();\n } else {\n const searchQsp = searchQueryStringParameter || 'q';\n const searchURL = this._appendQueryParams(getUrlSync('search', actionContext) || '', query, searchQsp);\n document.location.href = searchURL;\n }\n };\n\n private readonly _handleCancelSearchChange = (): void => {\n const { isSearchFormExpanded, suggestions } = this.state;\n\n if (!isSearchFormExpanded) {\n this.setState({\n isSearchFormExpanded: true,\n searchText: '',\n isInitialState: false\n });\n } else {\n if (suggestions && suggestions.AllSearchResults) {\n this._clearAutoSuggestState();\n }\n this.setState({ isSearchFormExpanded: false });\n }\n };\n\n private readonly _handleCancelSearchFocused = (): void => {\n const { suggestions } = this.state;\n if (!(suggestions && suggestions.AllSearchResults)) {\n this._clearAutoSuggestState();\n this.setState({ isSearchFormExpanded: false });\n }\n };\n\n private readonly _appendQueryParams = (route: string, query: string, qsp: string): string => {\n if (!MsDyn365.isBrowser) {\n return '';\n }\n\n const queryUrl = new URL(route, window.location.href);\n if (qsp && query) {\n queryUrl.searchParams.set(qsp, query);\n }\n\n return queryUrl.href;\n };\n\n private readonly _setAutoSuggestResultCount = (result?: Autosuggestions) => {\n if (this.autoSuggestResultScreenReaderDiv.current !== null) {\n const ariaLiveRegion = this.autoSuggestResultScreenReaderDiv.current;\n const suggestResultString = this.props.resources.autoSuggestFoundMessage;\n const emptyResultString = this.props.resources.noAutoSuggestionMessage;\n ariaLiveRegion.innerText =\n result && result.AllSearchResults && result.AllSearchResults.length > 0 ? suggestResultString : emptyResultString;\n ariaLiveRegion.setAttribute('aria-live', 'assertive');\n return ariaLiveRegion.innerText;\n }\n return '';\n };\n}\n\nexport default Search;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { INodeProps, Module, Node } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { ISearchCategoryViewProps, ISearchFormViewProps, ISearchKeywordViewProps, ISearchProductViewProps } from './components';\nimport { ISearchViewProps } from './search';\n\nconst SearchView: React.FC = props => {\n const {\n Search,\n AutoSuggestAriaLabel,\n AutoSuggestAriaLabelText,\n searchText,\n AutoSuggest,\n KeywordSuggest,\n ProductSuggest,\n CategorySuggest,\n UlKeyword,\n UlProduct,\n UlCategory,\n form,\n autosuggestCategory,\n autosuggestKeyword,\n autosuggestProduct,\n SearchForm,\n FormWrapper,\n label,\n isLoadingAutoSuggest,\n isLoadingNode\n } = props;\n\n return (\n \n {label}\n {_renderForm(form as ISearchFormViewProps, SearchForm, FormWrapper)}\n \n {searchText && searchText.length > 0 ? {AutoSuggestAriaLabelText} : ''}\n {_renderKeywordSuggestions(KeywordSuggest, UlKeyword, autosuggestKeyword, isLoadingAutoSuggest, isLoadingNode)}\n {_renderProductSuggestions(ProductSuggest, UlProduct, autosuggestProduct, isLoadingAutoSuggest, isLoadingNode)}\n {_renderCategorySuggestions(CategorySuggest, UlCategory, autosuggestCategory, isLoadingAutoSuggest, isLoadingNode)}\n \n \n );\n};\n\nconst _renderForm = (form: ISearchFormViewProps, SearchForm: INodeProps, FormWrapper: INodeProps) => {\n return (\n \n \n {form.input}\n {form.cancelBtn}\n {form.submitBtn}\n \n \n );\n};\n\nconst _renderKeywordSuggestions = (\n KeywordSuggest: INodeProps,\n UlKeyword: INodeProps,\n keywordSuggestions?: ISearchKeywordViewProps,\n isLoadingAutoSuggest?: boolean,\n isLoadingNode?: React.ReactNode\n) => {\n return (\n keywordSuggestions && (\n \n \n {isLoadingAutoSuggest && isLoadingNode}\n {!isLoadingAutoSuggest &&\n keywordSuggestions.text.map(text => {\n return text;\n })}\n \n \n )\n );\n};\n\nconst _renderProductSuggestions = (\n ProductSuggest: INodeProps,\n UlProduct: INodeProps,\n productSuggestions?: ISearchProductViewProps,\n isLoadingAutoSuggest?: boolean,\n isLoadingNode?: React.ReactNode\n) => {\n return (\n productSuggestions && (\n \n \n {productSuggestions.title}\n {isLoadingAutoSuggest && isLoadingNode}\n {!isLoadingAutoSuggest &&\n productSuggestions.items.map((item, index) => {\n return (\n \n \n {item.thumbnail}\n {item.text}\n {item.price}\n \n \n );\n })}\n \n \n )\n );\n};\n\nconst _renderCategorySuggestions = (\n CategorySuggest: INodeProps,\n UlCategory: INodeProps,\n categorySuggestions?: ISearchCategoryViewProps,\n isLoadingAutoSuggest?: boolean,\n isLoadingNode?: React.ReactNode\n) => {\n return (\n categorySuggestions && (\n \n \n {categorySuggestions.title}\n {isLoadingAutoSuggest && isLoadingNode}\n {!isLoadingAutoSuggest &&\n categorySuggestions.text.map(text => {\n return text;\n })}\n \n \n )\n );\n};\n\nexport default SearchView;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { SocialMedia, SocialMediaComponent } from '@msdyn365-commerce/components';\nimport MsDyn365 from '@msdyn365-commerce/core';\nimport { IModuleProps } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { ISocialShareItemConfig, ISocialShareItemProps, socialMedia } from './social-share-item.props.autogenerated';\n\nexport interface ISocialShareItemViewProps extends ISocialShareItemProps {\n SocialShareItemElement: React.ReactNode | null;\n SocialShareItem: IModuleProps;\n}\n\n/**\n *\n * SocialShareItem component.\n * @extends {React.PureComponent>}\n */\nclass SocialShareItem extends React.PureComponent> {\n constructor(props: ISocialShareItemProps) {\n super(props);\n\n this._getSocialShareItem = this._getSocialShareItem.bind(this);\n }\n\n public render(): JSX.Element | null {\n const viewprops = {\n ...this.props,\n SocialShareItem: {\n moduleProps: this.props,\n className: 'ms-social-share-item'\n },\n SocialShareItemElement: this._getSocialShareItem()\n };\n\n return this.props.renderView(viewprops) as React.ReactElement;\n }\n\n private _getSocialShareItem(): React.ReactNode | null {\n const src = this.props.config.icon;\n if (MsDyn365.isBrowser) {\n switch (this.props.config.socialMedia) {\n case socialMedia.facebook:\n return (\n \n );\n case socialMedia.twitter:\n return (\n \n );\n case socialMedia.pinterest:\n return (\n \n );\n case socialMedia.linkedin:\n return (\n \n );\n case socialMedia.mail:\n return (\n \n );\n default:\n return null;\n }\n }\n return null;\n }\n}\n\nexport default SocialShareItem;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { Module } from '@msdyn365-commerce-modules/utilities';\nimport React from 'react';\n\nimport { ISocialShareItemViewProps } from './social-share-item';\n\nexport const SocialShareItemView: React.FC = props => {\n const { SocialShareItem, SocialShareItemElement } = props;\n\n if (!SocialShareItemElement) {\n props.context.telemetry.error('Social media is not valid, module wont render');\n return null;\n }\n return {SocialShareItemElement};\n};\n\nexport default SocialShareItemView;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport * as Msdyn365 from '@msdyn365-commerce/core';\nimport { INodeProps } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { IAdditionalContentData, ILinksData } from '../video-player.props.autogenerated';\n\n/**\n * IVideoPlayerAdditionalContentProps: Interface for\n * Video Player Additional Content Component props.\n */\nexport interface IVideoPlayerAdditionalContentProps {\n requestContext: Msdyn365.IRequestContext;\n additionalContent: IAdditionalContentData | undefined;\n handleAdditionalTextChange(event: Msdyn365.ContentEditableEvent): void;\n handleAdditionalParagraphChange(event: Msdyn365.ContentEditableEvent): void;\n handleAdditionalLinkTextChange(linkIndex: number, event: Msdyn365.ContentEditableEvent): void;\n}\n\n/**\n * IVideoPlayerAdditionalContentProps: Interface for\n * Video Player Additional Content view props.\n */\nexport interface IVideoPlayerAdditionalContentViewProps {\n additionalContentNode: INodeProps;\n additionalContentItems?: IVideoPlayerAdditionalContentItemViewProps;\n}\n\n/**\n * IVideoPlayerAdditionalContentProps: Interface for\n * Video Player Additional Content Item view props.\n */\nexport interface IVideoPlayerAdditionalContentItemViewProps {\n heading: React.ReactNode;\n text: React.ReactNode;\n links: React.ReactNode;\n additionalContentItemContainer: INodeProps;\n additionalContentItemLinks: INodeProps;\n}\n\n/**\n * Renders additional content heading.\n * @param additionalContentHeading - Additional content heading.\n * @param props - Video Player Additional content component props.\n * @returns Heading Node.\n */\nconst renderHeading = (additionalContentHeading: string, props: IVideoPlayerAdditionalContentProps) => {\n const requestContext = props.requestContext;\n return (\n {\n props.handleAdditionalTextChange(event);\n },\n requestContext\n }}\n />\n );\n};\n\n/**\n * Renders additional content heading.\n * @param additionalContentParagraphText - Additional content paragraph text.\n * @param props - Video Player Additional content component props.\n * @returns Paragraph Node.\n */\nconst renderParagraph = (additionalContentParagraphText: string, props: IVideoPlayerAdditionalContentProps) => {\n const requestContext = props.requestContext;\n return (\n {\n props.handleAdditionalParagraphChange(event);\n },\n requestContext\n }}\n />\n );\n};\n\n/**\n * Renders additional content heading.\n * @param ctaLink - Additional content link.\n * @param props - Video Player Additional content component props.\n * @param linkIndex - Additional content link index.\n * @returns Link Node.\n */\nconst renderLinks = (ctaLink: ILinksData, props: IVideoPlayerAdditionalContentProps, linkIndex: number) => {\n const editableLink: Msdyn365.ILinksData = {\n ariaLabel: ctaLink.ariaLabel,\n className: 'ms-video-player__details__additional-content__cta__links',\n linkText: ctaLink.linkText,\n linkUrl: ctaLink.linkUrl.destinationUrl,\n openInNewTab: ctaLink.openInNewTab,\n role: 'link'\n };\n const requestContext = props.requestContext;\n return (\n {\n props.handleAdditionalLinkTextChange(linkIndex, event);\n },\n requestContext\n }}\n />\n );\n};\n\n/**\n * Create node for each additonal content item.\n * @param item - Video Player additonal content item props.\n * @param props - Video Player Additional content component props.\n * @returns IVideoPlayerAdditionalContentItemViewProps.\n */\nconst getAdditionalContentItems = (\n item: IAdditionalContentData,\n props: IVideoPlayerAdditionalContentProps\n): IVideoPlayerAdditionalContentItemViewProps => {\n const headingNode = item.heading && renderHeading(item.heading, props);\n const paragraphNode = item.subtext && renderParagraph(item.subtext, props);\n const linksNode = item.links?.map((ctaLink: ILinksData, index: number) => {\n return renderLinks(ctaLink, props, index);\n });\n\n return {\n heading: headingNode,\n text: paragraphNode,\n links: linksNode,\n additionalContentItemContainer: { className: 'ms-video-player__details__additional-content__container' },\n additionalContentItemLinks: { className: 'ms-video-player__details__additional-content__cta' }\n };\n};\n\n/**\n * VideoPlayerAdditionalContent component.\n * @param props - Video Player Additional content component props.\n * @returns Video Player Additional content view props.\n */\nexport const videoPlayerAdditionalContent = (\n props: IVideoPlayerAdditionalContentProps\n): IVideoPlayerAdditionalContentViewProps | undefined => {\n const { additionalContent } = props;\n if (!additionalContent) {\n return undefined;\n }\n\n const reactNodes: IVideoPlayerAdditionalContentItemViewProps = getAdditionalContentItems(additionalContent, props);\n return {\n additionalContentNode: { className: 'ms-video-player__details__additional-content' },\n additionalContentItems: reactNodes\n };\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IPlayerData, IPlayerOptions, IPlayerResources, IVideoMetadata, Player } from '@msdyn365-commerce/components';\nimport * as MsDyn365 from '@msdyn365-commerce/core';\nimport {\n getPayloadObject,\n getTelemetryAttributes,\n getTelemetryObject,\n INodeProps,\n isMobile,\n ITelemetryContent,\n VariantType\n} from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { IVideoPlayerAdditionalContentViewProps, videoPlayerAdditionalContent } from './components/additional-content';\nimport { ILinksData, IVideoPlayerConfig, IVideoPlayerProps } from './video-player.props.autogenerated';\n\nexport interface IVideoPlayerViewProps extends IVideoPlayerProps<{}> {\n player: React.ReactNode;\n title?: React.ReactNode;\n text?: React.ReactNode;\n links?: React.ReactNode;\n detailsContainer?: INodeProps;\n detailsContainerCta?: INodeProps;\n additionalContent?: IVideoPlayerAdditionalContentViewProps;\n handleText?(): void;\n handleParagraph?(): void;\n handleAdditionalText?(): void;\n handleAdditionalParagraph?(): void;\n handleLink?(): void;\n handleAdditionalLink?(): void;\n}\n\n/**\n *\n * VideoPlayer component.\n * @extends {React.PureComponent>}\n */\nclass VideoPlayer extends React.PureComponent> {\n private readonly telemetryContent: ITelemetryContent;\n\n private readonly isMobileDevice: boolean;\n\n public constructor(props: IVideoPlayerProps) {\n super(props);\n this.isMobileDevice = isMobile({ variant: VariantType.Viewport, context: this.props.context.request }) === 'xs';\n this.telemetryContent = getTelemetryObject(\n this.props.context.request.telemetryPageName!,\n this.props.friendlyName,\n this.props.telemetry\n );\n }\n\n public render(): JSX.Element {\n const options = {\n ...this.props.config,\n isMobileDevice: this.isMobileDevice\n };\n const video: MsDyn365.IVideoData = this.props.config.video;\n const playerResources: IPlayerResources = {\n playAriaLabel: this.props.resources.playLabel,\n pauseAriaLabel: this.props.resources.pauseLabel,\n playingAriaLabel: this.props.resources.playingLabel,\n pausedAriaLabel: this.props.resources.pausedLabel,\n muteAriaLabel: this.props.resources.muteLabel,\n unMuteAriaLabel: this.props.resources.unMuteLabel,\n fullScreenAriaLabel: this.props.resources.fullScreenLabel,\n exitFullScreenAriaLabel: this.props.resources.exitFullScreenLabel,\n seekBarLabel: this.props.resources.seekBarLabel,\n videoTimeDurationLabel: this.props.resources.videoTimeDurationLabel,\n closedCaptionLabel: this.props.resources.closedCaptionLabel\n };\n const videoMetaData: IVideoMetadata = {};\n\n if (video) {\n videoMetaData.videoId = video.id;\n videoMetaData.title = video.title;\n videoMetaData.duration = video.playTime;\n\n if (video.thumbnail) {\n videoMetaData.posterframeUrl = video.thumbnail.src;\n }\n\n if (video._links?.binaryReferences) {\n videoMetaData.videoBinaryReferences = video._links.binaryReferences;\n }\n }\n const videoPlayerData: IPlayerData = { options: options as IPlayerOptions, metaData: videoMetaData };\n const viewProps = {\n // Context for telemetry and raw data for C1 to do customization\n // Including computed data, state data and methods\n ...this.props,\n\n player: (\n \n \n \n ),\n title: this._getVideoDetailsHeading(),\n text: this._getVideoDetailsParagraph(),\n links: this._getVideoDetailsLinks(),\n detailsContainer: { className: 'ms-video-player__details' },\n detailsContainerCTA: { className: 'ms-video-player__details__cta' },\n additionalContent: videoPlayerAdditionalContent({\n requestContext: this.props.context.request,\n additionalContent: this.props.config.additionalContent,\n handleAdditionalTextChange: this.handleAdditionalTextChange,\n handleAdditionalParagraphChange: this.handleAdditionalParagraphChange,\n handleAdditionalLinkTextChange: this.handleAdditionalLinkTextChange\n }),\n handleText: this.handleTextChange,\n handleParagraph: this.handleParagraphChange,\n handleAdditionalText: this.handleAdditionalTextChange,\n handleAdditionalParagraph: this.handleAdditionalParagraphChange,\n handleLink: this.handleLinkTextChange,\n handleAdditionalLink: this.handleAdditionalTextChange\n };\n return this.props.renderView(viewProps) as React.ReactElement;\n }\n\n /**\n * Handle link text change.\n * @param linkIndex - The link index.\n * @param event - The dialog that is allowed to remain open.\n */\n public handleLinkTextChange(linkIndex: number, event: MsDyn365.ContentEditableEvent): void {\n if (this.props.config.links && this.props.config.links[Number(linkIndex)]) {\n this.props.config.links[Number(linkIndex)].linkText = event.target.value;\n }\n }\n\n /**\n * Handle text change.\n * @param event - The dialog that is allowed to remain open.\n */\n public handleTextChange = (event: MsDyn365.ContentEditableEvent): void => {\n this.props.config.heading!.text = event.target.value;\n };\n\n /**\n * Handle paragraph change.\n * @param event - The dialog that is allowed to remain open.\n */\n public handleParagraphChange = (event: MsDyn365.ContentEditableEvent): void => {\n this.props.config.paragraph = event.target.value;\n };\n\n /**\n * Handle additional text change.\n * @param event - The dialog that is allowed to remain open.\n */\n public handleAdditionalTextChange(event: MsDyn365.ContentEditableEvent): void {\n if (this.props.config.additionalContent) {\n this.props.config.additionalContent.heading = event.target.value;\n }\n }\n\n /**\n * Handle additional link text change.\n * @param linkIndex - The link index.\n * @param event - The dialog that is allowed to remain open.\n */\n public handleAdditionalLinkTextChange(linkIndex: number, event: MsDyn365.ContentEditableEvent): void {\n const additionalContent = this.props.config.additionalContent ?? {};\n if (additionalContent.links) {\n additionalContent.links[Number(linkIndex)].linkText = event.target.value;\n }\n }\n\n /**\n * Handle additional paragraph change.\n * @param event - The dialog that is allowed to remain open.\n */\n public handleAdditionalParagraphChange(event: MsDyn365.ContentEditableEvent): void {\n if (this.props.config.additionalContent) {\n this.props.config.additionalContent.subtext = event.target.value;\n }\n }\n\n /**\n * Get video details links.\n * @returns - React node.\n */\n private _getVideoDetailsLinks(): React.ReactNode[] | undefined {\n const { links } = this.props.config;\n const payLoad = getPayloadObject('click', this.telemetryContent, '');\n\n return links?.map((linkData: ILinksData, index: number) => {\n payLoad.contentAction.etext = linkData.linkText;\n const attributes = getTelemetryAttributes(this.telemetryContent, payLoad);\n const linkId = index;\n const editableLink: MsDyn365.ILinksData = {\n ariaLabel: linkData.ariaLabel,\n className: 'ms-video-player__details__cta__link',\n linkText: linkData.linkText,\n linkUrl: linkData.linkUrl.destinationUrl,\n openInNewTab: linkData.openInNewTab,\n role: 'button',\n additionalProperties: attributes\n };\n\n return (\n {\n this.handleLinkTextChange(index, event);\n },\n requestContext: this.props.context.request\n }}\n />\n );\n });\n }\n\n private _getVideoDetailsHeading(): React.ReactNode | undefined {\n const { heading } = this.props.config;\n\n return (\n heading && (\n \n )\n );\n }\n\n private _getVideoDetailsParagraph(): React.ReactNode | undefined {\n const { paragraph } = this.props.config;\n\n return (\n paragraph && (\n \n )\n );\n }\n}\n\nexport default VideoPlayer;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { Node } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { IVideoPlayerAdditionalContentViewProps, IVideoPlayerViewProps } from './index';\n\n/**\n * Render Additional Content.\n * @param additionalContent - Additional content view props.\n * @returns JSX Element.\n */\nconst renderAdditionalContent = (additionalContent: IVideoPlayerAdditionalContentViewProps) => {\n if (additionalContent.additionalContentItems) {\n return (\n \n <>\n {additionalContent.additionalContentItems.heading}\n \n {additionalContent.additionalContentItems.text}\n \n {additionalContent.additionalContentItems.links}\n \n \n \n \n );\n }\n\n return null;\n};\n\nconst VideoPlayerView: React.FC = props => {\n return (\n
    \n {props.player}\n \n {props.title}\n {props.text}\n {props.additionalContent && renderAdditionalContent(props.additionalContent)}\n \n {props.links}\n \n \n
    \n );\n};\n\nexport default VideoPlayerView;\n"],"names":["OrderTemplateActions","props","onRemoveOrderTemplate","handlers","itemKey","removeOrderTemplateActionHandler","input","_renderOrderTemplateImages","context","orderTemplateLines","imageSettings","enableImageProductLink","count","length","React","className","slice","map","line","_renderAriaLabel","name","OrderTemplateListStatusMessage","errorType","text","classnames","modalCloseButtonReference","onCancelHandler","isCreateOrderTemplateDialogOpen","setOrderTemplateNameDialogOpen","useState","onCreateButtonClick","color","onClick","ref","createOrderTemplateText","OrderTemplateNameDialog","modalOpen","isUpdateDialog","setModalOpen","id","data","typeName","dialogStrings","createOrderTemplateDialogResources","onCancel","onSuccess","onOrderTemplateCreated","parentElementRef","HeadingTag","OrderTemplateList","constructor","super","_onDismiss","this","setState","isOpen","_reloadPage","async","window","location","reload","_onRemoveFromOrderTemplateList","productListId","telemetry","resources","orderTemplates","actionContext","request","user","isAuthenticated","token","result","orderTemplate","find","p","productList","Id","deleteAsync","callerContext","then","catch","error","warning","headerStatusMessage","deleteOrderTemplateFailedText","statusCssString","messageGlyph","state","userMessage","shouldComponentUpdate","nextProps","nextState","render","heading","config","emptyOrderTemplateText","createNewTemplateButtonText","orderTemplatesData","orderTemplateListHeading","orderTemplateListTitle","status","errorProps","moduleProps","statusMessage","Heading","tag","h2","renderView","emptyViewProps","viewProps","createOrderTemplateButton","CreateNewTemplateButtonComponent","_generateOrderTemplateNameDialogResources","templateHeaderStatusMessage","Alert","toggle","OrderTemplates","OrderTemplate","_renderOrderTemplateList","orderTemplateHeaderLabel","createOrderTemplateHeader","orderTemplateTitleLabel","orderTemplateTitle","orderTemplateNameAriaLabel","orderTemplateDescription","createOrderTemplateDescription","defaultOrderTemplateName","orderTemplateButtonLabel","createOrderTemplateButtonText","orderTemplateCancelButtonLabel","cancelNewOrderTemplateCreationButtonText","index","removeFromOrderTemplateListText","orderTemplateState","telemetryContent","onDismiss","key","orderTemplateImage","orderTemplateAriaLabel","orderTemplateName","href","url","getUrlSync","separator","includes","_getOrderTemplatePageUrl","totalLines","addToCartButton","AddOrderTemplateToCartComponent","moduleTypeName","addToCartText","addToBagText","removeButton","Button","orderTemplateStatusMessage","OrderTemplateRender","Name","addToBagButtonText","moduleId","closeWindowButtonText","addToCartFailureMessage","addToCartSuccessMessage","addToCartProcessMessage","linesAddedToCartDialogResources","viewCartButtonText","orderTemplateCloseButtonText","linesAddedToCartHeaderItemsOneText","linesAddedToCartHeaderLinesOneText","linesAddedToCartHeaderLinesFormatText","linesAddedToCartHeaderMessageText","observer","OrderTemplateListView","Module","Object","Node","_renderOrderTemplate","AddToCartComponentActions","_event","setUploadStatus","openModal","setLinesAddedToCartDialogOpen","setAddedLinesCount","addOrderTemplateToCartInput","AddOrderTemplateToCartInput","addOrderTemplateToCartAction","setTimeout","buttonEventReference","ModalWarning","warningAccepted","bind","accept","onWarningChecked","modalWarningBtn","warningClose","event","onWarningSubmit","Modal","autoFocus","fade","applicationNode","returnFocusRef","horizontalPosition","verticalPosition","ModalHeader","modalWarningResources","modalWarningHeader","ModalBody","modalWarningMessage","type","checked","modalWarningCancel","ModalFooter","disabled","modalWarningOK","ModalWarningFromLineAction","productFromLineAction","quantityFromLineAction","itemKeyFromLineAction","productSpecificationFromLineAction","msdyn365Commerce","component","uploadStatus","addedLinesCount","linesAddedToCartDialogOpen","modalWarningOpen","setModalWarningOpen","modalText","_getModalText","processStatusClass","toLowerCase","payLoad","getPayloadObject","TelemetryConstant","addOrderTemplateAttribute","getTelemetryAttributes","popupProps","renderModalPopup","PopupProducts","products","fullProduct","filter","LinesAddedToCartDialog","linesCount","onClose","focus","buttonLabel","target","OrderTemplateBulkActions","isAddDisabled","isRemoveDisabled","selectedLines","addLineModalLinkText","searchButtonAriaLabel","searchInputAriaLabel","searchModalPlaceholderText","selectProductButtonText","addItemToTemplateText","addLineProductUnitPricePrefix","backButtonText","decrementButtonAriaLabel","incrementButtonAriaLabel","quantitySelectLabel","addLineProductUnitOfMeasurePrefix","notFoundSearchErrorNotice","notFoundSearchErrorRedediation","searchErrorMessage","productDimensionTypeColor","productDimensionTypeConfiguration","productDimensionTypeSize","productDimensionTypeStyle","searchResultsCountVerbage","searchResultsCountSubject","addToTemplateConfirmation","totalPriceLabel","progressNotificationText","addToTemplateDuplicateError","addToTemplateGenericError","dimensionMissingError","addLineProps","orderTemplateId","AddLineToTemplate","ItemWithAttributeAddedToCartDialog","dialogProps","product","productPrice","quantity","producSpecification","close","itemsString","itemAddedToCartHeaderItemOneText","itemAddedToCartHeaderItemFormatText","replace","toString","itemAddedToCartHeaderMessageText","PriceComponent","price","freePriceText","originalPriceText","currentPriceText","attributeValues","ArrayExtensions","externalItemIdAttribute","attribute","TextValue","_getErpSizeDescription","title","msg","CONTENT","query","content","Search","selectedProduct","defaultImageSettings","viewports","xs","q","w","h","lg","xl","lazyload","searchTextInput","addLineButtonRef","_renderSearchForm","role","autoComplete","onSubmit","_onSearchSubmit","placeholder","value","onChange","_onInputChange","maxLength","preventDefault","Loading","_getSearchResults","NotFound","ProductList","Error","_onQuantityChangeHandler","selectedQuantity","_onSelectItem","apiSettings","channelId","varianteInput","SelectedVariantInput","RecordId","undefined","productVariant","getSelectedVariant","Promise","resolve","dimensions","_getProductDimensions","selectedProductDimensions","ProductConfiguration","_onBackButtonClickHandler","_highlightSearchTerm","parsedName","unescape","RegExp","dangerouslySetInnerHTML","__html","_resultCountText","_addItemToTemplateHandler","AddItemToOrderTemplateInput","DefaultUnitOfMeasure","addItemToOrderTemplate","reloadPage","_toggleModalHandler","current","onComponentDidMount","onComponentDidUpdate","backToResultsText","modalProps","ariaLabel","showBackArrow","_renderContent","addToTemplateHandler","onQuantityChangeHandler","highlightSearchTerm","searchForm","productProps","clickHandler","renderResultCountText","Spinner","NotFoundComponent","searchText","searchCriteriaInput","Context","ChannelId","CatalogId","getCatalogId","IncludeAttributes","SearchCondition","searchByCriteriaAsync","MasterProductId","getDimensionsForSelectedVariant","GetDimensionsForSelectedVariantInput","__decorate","computed","Dropdown","selectMenu","_onChanged","selectedIndex","dropdownId","selectId","selectedValue","innerText","componentDidMount","dropdownList","dropdownName","item","selected","OrderTemplateQuantity","inputRef","_validateMin","minValue","min","isNaN","currentInput","currentCount","_handleChange","reaction","glyphMinusClassName","decrementGlyphClass","glyphPlusClassName","incrementGlyphClass","incDisabled","max","currentValue","extraClass","getChangeHandler","amount","_onIncrementalChange","tabIndex","pattern","onBlur","inputQuantityAriaLabel","updatedQuantity","e","Number","parseInt","inputElement","HTMLInputElement","setAttribute","selectedDimensions","_getDimensionsError","dimensionName","_addToTemplateHandler","isBusy","showAddConfirmation","errors","add","missingDimensions","dimension","DimensionTypeValue","ProductListId","errorMessage","_onQuantityChange","newValue","totalPrice","Price","_updateDimensionValue","productDimensionFull","newValueId","DimensionValues","_onDimensionChanged","remainingDimensionsErrors","selection","buttonDisabled","mappedDimensions","DimensionValue","ExtensionProperties","variantProduct","dimensionInput","variantDimensions","availabilityInput","ProductAvailabilitiesForSelectedVariantInput","newAvailableQuantity","getProductAvailabilitiesForSelectedVariant","priceInput","PriceForSelectedVariantInput","getPriceForSelectedVariant","productAvailableQuantity","unitPrice","BasePrice","sort","a","b","_getDropdownName","dimensionType","ItemId","_formatPrice","_getDimensionsNodes","_getConfirmationMessage","selectedDimensionNames","variant","Value","values","join","unshift","assertive","cultureFormatter","formatCurrency","currencyCode","toFixed","ProductSelectButton","buttonText","setBusy","getClickHandler","removeOrderActionHandler","_removeOrderTemplate","OrderTemplateActionsView","deleteTemplateButtonText","addTemplateToBag","_getOrderTemplateAddToCartDialog","renameTemplate","_getOrderTemplateRenameControl","removeTemplate","onRemoveTemplate","addTemplateToBagButtonText","renameOrderTemplateDialogStrings","RenameOrderTemplateComponent","onRenameTemplate","renameOrderTemplateButtonText","renameTemplateButtonText","OrderTemplateLineActions","orderTemplateLine","productListLine","LineId","onAddToBag","onRemoveItem","getAddToBag","ProductDetails","productSpecificationData","getRemoveItem","PopUp","removeFromOrderTemplateLinesText","moreButtonText","viewProductDetailsText","showMobile","setShowMobile","toggleDetailsDisplayed","getActionButton","isMobile","removeButtonClassName","addButtonClassName","onSelectLineHandler","isChecked","onSelect","OrderTemplateLineView","UnitOfMeasure","selectOneRowText","PrimaryImageUrl","fallbackImage","getFallbackImageUrl","requestContext","selectLine","productImage","_renderProductImage","productInfo","renderProductInfo","_renderPrice","productNumber","productUnitOfMeasure","productQuantityView","_generateQuantity","productQuantity","addToBagButton","popUp","externalItemId","_getExternalItemId","OrderTemplateMobileLineView","onChangeHandler","onChangeQuantity","isQuantityDisabledForUpdate","image","productUrl","productName","dimensionsLine","OrderTemplateLinesStatusMessage","OrderTemplateTableHeading","componentClassName","getOnChange","checkedLines","lines","scope","selectAllRowsText","productUnitPrice","productUOM","productActions","OrderTemplateLines","warningOpen","warningFromLineActionOpen","productSpecification","modalWarningFromLineActionOpen","warningFromLineActionClose","_onRemoveSelection","removeSelectedFailureMessage","removeSelectedSuccessMessage","productSelection","productListLines","maxWaitTimeInMilliSeconds","removeProductListLinesAsync","substr","indexOf","_onAddSelectionToBag","productLine","ProductTypeValue","AdjustedPrice","Quantity","_addItemToBag","_getCurrentUrl","reqContext","MsDyn365","URL","requestUrl","onCloseHandler","isItemAddedToOrderTemplateOpen","_renderItemAddedToCartDialog","itemAddedToCartDialogData","_generateItemAddedToCartDialogResources","_renderPagination","fullUrl","itemsPerPage","skipCount","_getCurrentPageNumber","totalItems","previousText","flipperPrevious","nextText","flipperNext","UncontrolledPagination","paginationAriaLabel","qsp","items","startingItem","_renderPrev","_renderNext","previousAriaLabel","nextAriaLabel","_toggleDetailsDisplayed","isDetailsDisplayed","detailedProductView","_changeQuantity","orderTemplateLinesData","orderLineIndex","findIndex","newProductListLine","prevQuantity","updateProductListLinesAsync","list","newLine","updatedLines","updatedOrderTemplate","ProductListLines","update","ActiveOrderTemplateLinesInput","editOrderTemplateLineQuantityError","cart","maxQuantityLimitText","addedToCartFailureMessage","addProductToCartInput","addProductToCart","priceResult","AsyncResult","isMiniCart","app","addToCartBehavior","substatus","maxQuantityForProductListLineItem","debug","message","_removeItemFromOrderTemplateLines","userToken","_renameTemplate","_removeTemplate","newLink","assign","_getViewport","device","Type","innerWidth","gridSettings","sm","md","paginationPreviousText","paginationNextText","_renderModalWarning","addToOrderTemplateDialogWarningV2","_renderModalWarningFromLineAction","_viewport","_updateViewport","isConfirmAddSelectionToBagModalOpen","getTelemetryObject","telemetryPageName","friendlyName","signInUrl","orderTemplateWithAttributes","orderLength","i","productInput","simpleProduct","attributeInput","AttributesForSelectedVariantInput","getAttributesForSelectedVariant","push","orderTemplateLinesWithAttributes","_getProductSpecifications","addEventListener","componentWillUnmount","removeEventListener","emptyOrderTemplateLinesText","errorGettingOrderTemplateLines","ObjectExtensions","orderTemplateResult","_isFirstPage","productsStatusMessage","ProductsTable","ProductsTableRow","ProductsTableHeading","_renderProductListHeader","orderLines","_renderProductList","callbacks","updateQuantity","debounce","orderActions","_renderOrderTemplateActions","pagination","itemAddedToCartDialog","bulkOrderLineActions","_getOrderTemplateLineActions","modalWarning","modalWarningFromLineAction","updated","onSelectAll","productNumberText","productText","productUnitPriceText","productUOMText","productQuantityText","productActionsText","headers","onAddSelectionToBag","onRemoveSelection","isMinifiedView","_generateLinesAddedToCartDialogResources","orderTemplateActions","renameOrderTemplateTitleText","cancelBtnLabel","skip","priceFree","addOrderTemplateItemToBagButtonText","removeItemFromOrderTemplateButtonText","deleteButtonText","currentProductProps","ProductPrice","getProductUrlSync","observable","action","_renderItem","quantityLabel","toggleDetails","wrapClassName","renderRating","ratingId","avgRating","totalRatings","numberRatings","ratingAriaLabel","rating","roundedRating","format","getRatingAriaLabel","RatingComponent","ratingCount","readOnly","ActiveProductComponent","savingsText","imageUrl","altText","imgData","src","imageProps","cropFocalRegion","Image","loadFailureBehavior","renderProductPlacementImage","productId","basePrice","adjustedPrice","CustomerContextualPrice","renderPrice","description","Description","hideRating","AverageRating","TotalRatings","assembleNode","additionalContentNode","additionalContentHeading","Msdyn365","editProps","onEdit","handleAdditionalTextChange","renderHeading","subtext","additionalContentParagraphText","renderParagraph","links","ctaLink","linkIndex","editableLink","linkText","linkUrl","destinationUrl","openInNewTab","isOpenInNewTab","link","onTextChange","handleAdditionalLinkTextChange","renderLinks","additionalContentContainer","additionalContentItemLinks","activeImageAdditionalContent","additionalContent","CanvasCalculations","CanvasStyles","ImageMapper","_isDesktopViewPort","_context","getActiveImageWidth","activeImageReferenceValue","activeImageRefs","clientWidth","getActiveImageHeight","clientHeight","convertHexToRgb","hexColor","exec","rValue","gValue","bValue","applyFadingTransition","coords","rgbColor","alpha","halfDivisor","_canvas","getContext","buttonPadding","paddingAdjustment","buttonWidth","measureText","width","fillStyle","document","body","parentElement","getAttribute","fillText","drawButton","buttonTextClor","buttonHeight","buttonPositionX","buttonPositionY","arcsize","beginPath","moveTo","lineTo","arcTo","stroke","closePath","fill","expandAnimation","imageMapperResources","animationStartWidth","expandAnimationStartWidth","pointPositionX","pointPositionY","animationEndWidth","expandAnimationEndWidth","radius","expandRadius","rotation","startAngle","endAngle","textFadeInValue","textFadeInStartValue","buttonTextClorInRgb","toLocaleLowerCase","animate","ellipse","requestAnimationFrame","textFadeInterval","collapseAnimation","collapseAnimationStartWidth","collapseAnimationEndWidth","clearMargin","clearHeight","clearWidth","collapseRadius","textFadeOutValue","textFadeOutStartValue","clearRect","drawCircle","viewPort","doubleMultiplier","strokeStyle","arc","Math","PI","scaleCoords","imgWidth","defaultWidth","defaultScale","scale","coord","renderPrefilledAreas","areaMap","areas","area","computeCenter","scaledCoords","handleHoverOn","center","handleHoverOff","canvasPositionX","defaultPositionX","canvasPositionY","defaultPositionY","height","click","hoverOn","onMouseEnter","hoverOff","onMouseLeave","renderAreas","xsRadius","extendedArea","areaKey","altTextWithProductName","productSearchResult","shape","onFocus","alt","initCanvas","_backgroundImage","_container","onLoad","defaultHeight","canvasWidth","canvasHeight","style","componentDidUpdate","shouldRender","imageData","useMap","ActiveImageConstants","ActiveImage","_defaultProductCardWidth","_defaultProdutCardHight","_activePoints","addActivePoints","areaId","primaryImageUrl","updateClientWidth","viewport","VariantType","renderImageMapper","productResults","activePoints","configProduct","itemId","getProductPageUrlSync","xPosition","yPosition","activePoint","JSON","stringify","mappedArea","_activeImageClass","enterArea","leaveArea","activeImage","_activeImageRefs","altTextForSeeMoreButtonWithProductName","seeMoreButtonText","overlayClass","open","resetState","renderProductComponent","baseImageUrl","productImageSettings","renderProductCard","_productCardDivRef","renderOverlay","getProductCardPositionX","getDefaultImageSettings","productImageSettingsWidth","productCardWidth","leftAllignPosition","position","getProductCardPositionY","productImageSettingsHeight","produtCardHight","keyDown","enterKey","nodeName","escKey","handleTextChange","handleParagraphChange","paragraph","renderActiveImageDetailsLinks","_telemetryContent","linkData","contentAction","etext","attributes","linkId","willOpenInNewTab","additionalProperties","handleLinkTextChange","renderActiveImageDetailsHeading","renderActiveImageDetailsParagraph","getActiveImageId","activeImageId","activeImageSource","split","decrementOne","_handleOutsideClick","contains","timeoutInterval","images","getElementsByClassName","Array","from","removeAttribute","activePointContainer","activePointDetailsContainer","imageMapper","overlay","productCard","productCardleftPosition","productCardtopPosition","detailsContainer","detailsContainerCta","handleAdditionalParagraphChange","handleAdditionalText","handleAdditionalParagraph","handleAdditionalLinkText","activeImageView","top","left","createObservableDataAction","ctx","tenantId","inputIsValid","trace","serviceEndpoint","locale","sendRequest","userReviewData","Authorization","authorization","response","exception","SubmitUserReviewInput","getCacheKey","getCacheObjectType","dataCacheType","onClickSubmit","ReviewModal","submitButtonAttribute","cancelButtonAttribute","modal","modalCSS","classNames","onModalToggle","returnRef","modalHeader","modalHeaderNode","modalFooter","modalBody","cancelButton","discardReviewButtonText","submitButton","submitDisabled","submitReviewButtonText","ratingsInput","ratingLabel","ratingsLabel","titleInput","titleLabel","textInput","textLabel","privacyPolicyUrl","privacyPolicyLink","form","inputRow","hasError","errorMessageText","userReview","reviewId","editReviewModalTitle","writeReviewModalTitle","stripWhiteSpacesFromString","reviewText","reviewTitle","selectRatingAriaLabel","initialRating","parentId","parentType","onRatingChange","selectRatingLabel","reviewTitleMaxLength","renderContextId","onTitleChange","reviewTitleAriaLabel","htmlFor","reviewTitleLabel","reviewTextMaxLength","rows","reviewAriaLabel","reviewTextLabel","policyTextBlocks","privacyPolicyTextFormat","isSeparatorAtStart","startsWith","isSeparatorAtEnd","endsWith","privacyPolicyAttribute","rel","privacyPolicyTitle","submitReview","onReviewComplete","trim","onReviewSubmission","getRnrPartnerId","userEmail","emailAddress","userName","getRnrAuthEndpointId","submitUserReview","review","submittedDateTime","Date","helpfulPositive","helpfulNegative","firstName","getReviewInput","GetUserReviewInput","TOGGLE_REVIEW_MODAL_BUTTON_ID","TOGGLE_EDIT_MODAL_BUTTON_CARD_ID","HistogramItems","ratingsSummary","totalRatingsCount","renderItem","star5Count","star4Count","star3Count","star2Count","star1Count","stars","totalCount","percentage","formattedPercent","Intl","NumberFormat","barItemAriaLabel","starLabel","bar","Progress","buttonProps","AverageRatingNumber","summary","averageRating","TotalReviews","RatingsHistogram","handleHeadingChange","selectFilterBy","completeClass","classname","histogramItems","averageRatingAriaLabel","hideCount","averageNumber","totalReviews","ratingsSummaryProps","histogramProps","filterKey","createRatingsReviewsStateInput","histogramItem","authToken","requestBody","concernCategory","requestHeader","isHelpful","ReviewConcernCategory","ReportReviewConcernInput","ReviewCount","currentPage","reviewsCount","reviewsShownOnEachPage","pageReviewCountText","_getReviewStartNumber","_getReviewEndNumber","PageControls","previousPageClick","_getPreviousPageData","nextPageClick","_getNextPageData","nextAttribute","previousAttribute","_hasPreviousPage","_paginationAriaLabel","pageReviewAriaLabel","previousButtonText","_hasNextPage","nextButtonText","_getPagesCount","_getReviewsShown","ceil","isNextPage","page","pageModifier","pageReviewCount","updateReviews","selectedSortByOption","selectedFilterByOption","reportConcernDropdownOptions","radioPairs","pairs","option","inputId","reportedKey","onRadioChange","reviewRatingNarratorText","voteHelpfulButton","isVoted","votedReviews","approved","isVotedFor","isDisabled","isUserReview","isOboRequest","label","yesButtonText","noButtonText","voteCount","updateReviewHelpfulness","editButton","toggleWriteReviewModal","editReviewCardText","renderDate","date","DateTimeFormat","month","day","year","toggleReportReviewModal","reportToggle","reportConcernText","reportedReviews","reportedText","reportedReviewId","innerRef","SubmitHelpfulnessVoteInput","ReviewsList","sortByDropdownOptions","mostHelpfulSortOptionText","mostRecentSortOptionText","highestRatedSortOptionText","lowestRatedSortOptionText","filterByDropdownOptions","allRatinsFilterByOptionText","fiveStarFilterByOptionText","fourStarFilterByOptionText","threeStarFilterByOptionText","twoStarFilterByOptionText","oneStarFilterByOptionText","reviewsListCallbacks","updateReviewTitle","userReviewTitle","updateReviewText","userReviewText","updateRating","userReviewRating","onReviewSubmitted","isSuccessful","isReviewModalOpen","hasReviewError","toggleModal","_toggleReviewModal","updateReviewHelpfulnessVote","toggleReportModal","isReportModalOpen","_onReportModalOpen","_onReportModalClose","reportReview","_reportReviewCallback","updateFilterByDropdown","updateSortByDropdown","reviewsList","pagingInfo","listOfReviews","isFilterApplied","ratingsReviewsState","filterKeyValue","dropdownItemsCount","filterByOption","_userReview","_reviewCard","_reviewCards","reviewList","reviewElements","isTakenDown","isPublished","cardProps","ratingHelpfulLabel","wasReviewHelpfulText","like","dislike","edit","report","responseName","userResponse","responderName","responseText","responseDate","cardBodyProps","responseProps","reviewProps","controlsProps","headerProps","ReviewCard","_userReportModalToggle","reportingReviewId","_userReviewModal","_onTitleChange","_onTextChange","_onRatingChange","_onReviewComplete","_userReviewModalToggle","isSuccess","_reportReviewModal","submitReviewAttribute","successAttribute","cancelAttribute","SpamAdvertising","reportSpamText","OffensiveContent","offensiveContentText","Profanity","profanityContentText","header","headerSubmitted","feedbackThankYouText","cancelReportReviewText","reportReviewButtonText","succesfulButton","okReportReviewText","reportMessage","reportModalMessage","reportSubmittedMessage","radioButtons","ReportReviewModal","_onRadioChange","_reportReview","hasReportError","reported","currentTarget","reportReviewConcern","getUserToken","_value","reportedReview","notification","selectedOption","skipItems","getSelectedProductIdFromActionInput","getReviewsForGivenProduct","GetProductReviewsInput","getRnrEndpointId","_updateVoteUi","alreadyExists","concat","submitHelpfulnessVote","showSpinner","reviewModal","reportReviewModal","filterByDropdown","LabeledDropdown","labelText","filterByDropdownText","dropdownOptions","onSelectOption","controlledByParent","sortByDropdown","sortByDropdownText","reviewCount","refineReviewsProps","reviewsListProps","reviewCards","pageControls","noReviewsMessage","noReviewsWithFilterMessage","noReviewsWithSelectedFilterMessage","sortByOptions","filterByOptions","buildReviewCard","createReviewModal","createReportModal","SignInMessage","SignInButton","ModalToggle","WriteReview","writeReviewCallbacks","_modalToggleRef","userInfo","signInMessage","signInButton","signInLabel","signInAriaLabel","modalToggle","editReviewButtonText","reviewButtonLabel","_buildUserReviewModal","SearchState","SuggestionType","ProductListInventoryFilteringOptions","AutoSuggestInput","suggestionType","hitPrefix","hitSuffix","searchQuery","topResultsCount","_getAutoSuggest","autosuggest","catalogId","productSearchCriteria","productListInventoryDisplay","HideOOS","inventoryRefinerValue","channelInventoryConfiguration","isInStock","ProductAvailabilitySortableAttributeRecordId","RefinerRecordId","DataTypeValue","AttributeDataType","LeftValueBoundString","RightValueBoundString","UnitText","RowNumber","Count","RefinerSourceValue","ProductRefinerSource","getInventorySortableRefinerValue","getInventoryConfigurationAsync","Refinement","searchCriteria","ProductSearchCriteria","HitPrefix","HitSuffix","searchSuggestions","getSearchSuggestionsAsync","queryResultSettings","Paging","Top","ImageUrl","generateImageUrl","AllSearchResults","autoSuggestPromises","all","inputData","CategorySuggestionsComponent","suggestions","autoSuggestProps","categorySuggestionHeading","reactNodes","_assembleNode","_renderTitle","categoryAutoSuggestionHeading","shouldShowFullPath","splitValue","pop","_generateLink","_getHighlightedText","suggestion","_getCategoryLink","searchPageURL","searchQsp","searchRefiners","queryUrl","searchParams","set","categoryRefiners","refiners","SourceValue","refiner","Values","encodedRefiner","compressRefiners","formattedText","getRichTextHtml","compressedRefinerKeys","compressedRefiners","forEach","compressedRefiner","refinerKey","FormComponent","searchPlaceholder","hideSearchLabel","handleInputChange","maxChars","disableSubmitSearch","handleCancelSearchChange","ariaLabelCancel","ariaLabelSearch","ariaLabelSubmit","onInputChange","onInputChangeFunction","inputNode","submitBtnNode","cancelBtn","submitBtn","KeywordSuggestionsComponent","formattedLink","LabelComponent","searchLabelClass","searchLabelArialLabel","isSearchFormExpanded","searchtext","searchCollapsedLabel","ProductSuggestionsComponent","productSuggestionHeading","moduleType","productAutoSuggestionHeading","Value3","DecimalValue","thumbnail","_renderThumbnail","LiProduct","_getLiWrapper","AProduct","_getAWrapper","recid","waitTime","_isLoadingNode","loadingText","autoSuggestResultLoadingMessage","size","SpinnerSize","labelPosition","_focusOutTarget","closest","_clearAutoSuggestState","_keyup","keyCode","KeyCodes","formReference","autoSuggestResultDiv","searchState","defaultBasicSearchUrl","searchQueryStringParameter","createSearchStateInput","_handleInputChange","cancellabelDebounce","cancel","inputSuggestionType","_loadSuggestions","_handleSubmit","searchURL","_appendQueryParams","_handleCancelSearchChange","isInitialState","_handleCancelSearchFocused","route","_setAutoSuggestResultCount","autoSuggestResultScreenReaderDiv","ariaLiveRegion","suggestResultString","autoSuggestFoundMessage","emptyResultString","noAutoSuggestionMessage","searchKeywordSuggestClass","searchProductSuggestClass","searchCategorySuggestClass","autoSuggestAriaLabel","isLoadingAutoSuggest","searchInputMaxLength","searchFormClass","_initSuggestionTypes","params","isEditor","cancelBtnAriaLabel","searchBtnAriaLabel","submitBtnAriaLabel","searchplaceholderText","shouldShowFullCategoryPath","keywordSuggestions","Keyword","None","productSuggestions","Product","categorySuggestions","Category","AutoSuggestAriaLabel","AutoSuggestAriaLabelText","AutoSuggest","KeywordSuggest","ProductSuggest","CategorySuggest","SearchForm","FormWrapper","UlKeyword","UlProduct","UlCategory","autosuggestKeyword","autosuggestProduct","autosuggestCategory","handleCancelSearchFocused","isLoadingNode","suggestionTypes","suggestionTypeCriterion","validSuggestions","loadSuggestionsRequestId","getSearchSuggestionsAction","_getSuggestionType","_getSearchRefiners","Random","_getSearchSuggestions","_updateSearchRefiners","suggestionTypeItem","charAt","toUpperCase","validateCatalogId","ProductsDataActions","_renderForm","_renderKeywordSuggestions","_renderProductSuggestions","_renderCategorySuggestions","SocialShareItem","_getSocialShareItem","viewprops","SocialShareItemElement","icon","socialMedia","SocialMediaComponent","SocialMedia","postUrl","SocialShareItemView","getAdditionalContentItems","additionalContentItemContainer","videoPlayerAdditionalContent","additionalContentItems","VideoPlayer","isMobileDevice","options","video","playerResources","playAriaLabel","playLabel","pauseAriaLabel","pauseLabel","playingAriaLabel","playingLabel","pausedAriaLabel","pausedLabel","muteAriaLabel","muteLabel","unMuteAriaLabel","unMuteLabel","fullScreenAriaLabel","fullScreenLabel","exitFullScreenAriaLabel","exitFullScreenLabel","seekBarLabel","videoTimeDurationLabel","closedCaptionLabel","videoMetaData","videoId","duration","playTime","posterframeUrl","_links","binaryReferences","videoBinaryReferences","videoPlayerData","metaData","player","Player","playerData","_getVideoDetailsHeading","_getVideoDetailsParagraph","_getVideoDetailsLinks","detailsContainerCTA","handleText","handleParagraph","handleLink","handleAdditionalLink","renderModuleAttributes"],"sourceRoot":""}