{"version":3,"file":"static/js/17.6037a7f585f08452e380.chunk.js","mappings":"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","sources":["webpack://Citta2.0/./src/modules/search-result-container/search-result-container.tsx?7500","webpack://Citta2.0/./src/modules/search-result-container/search-result-container.view.tsx?b779","webpack://Citta2.0/./src/common/components/address-billing-checkbox.tsx?4008","webpack://Citta2.0/./src/common/components/address-billing-heading.tsx?7bbd","webpack://Citta2.0/./src/modules/checkout-billing-address/checkout-billing-address.tsx?2aa0","webpack://Citta2.0/./src/modules/checkout-shipping-address/components/checkout-shipping-cartlines-images.tsx?c635","webpack://Citta2.0/./src/modules/checkout-shipping-address/checkout-shipping-address.tsx?de3a","webpack://Citta2.0/./src/modules/wishlist-items/components/wishlist-items-dimensions.tsx?15c5","webpack://Citta2.0/./src/modules/wishlist-items/components/wishlist-item.tsx?d2da","webpack://Citta2.0/./src/modules/wishlist-items/components/wishlist-items-status-message.tsx?cdb3","webpack://Citta2.0/./src/modules/wishlist-items/wishlist-items.tsx?df8b","webpack://Citta2.0/./src/modules/citta-search-result-container/citta-search-result-container.props.autogenerated.ts?7a73","webpack://Citta2.0/./src/modules/citta-search-result-container/components/link.tsx?c700","webpack://Citta2.0/./src/modules/citta-search-result-container/components/product-search-result-items.tsx?8c10","webpack://Citta2.0/./src/modules/citta-search-result-container/components/feature-search-result-item.tsx?568d","webpack://Citta2.0/./src/modules/citta-search-result-container/components/title.tsx?b899","webpack://Citta2.0/./src/modules/citta-search-result-container/components/separator.tsx?b8dd","webpack://Citta2.0/./src/modules/citta-search-result-container/components/utilities.ts?bb91","webpack://Citta2.0/./src/modules/citta-search-result-container/components/range-refine-item.tsx?e0d5","webpack://Citta2.0/./src/modules/citta-search-result-container/components/refine-item.tsx?a159","webpack://Citta2.0/./src/modules/citta-search-result-container/components/choice-summary.tsx?db37","webpack://Citta2.0/./src/modules/citta-search-result-container/components/modal.tsx?ec98","webpack://Citta2.0/./src/modules/citta-search-result-container/components/refine-submenu.tsx?a4fd","webpack://Citta2.0/./src/modules/citta-search-result-container/components/error-message.tsx?2d94","webpack://Citta2.0/./src/modules/citta-search-result-container/citta-search-result-container.tsx?b687","webpack://Citta2.0/./src/components/citta-search-result/utilities.ts?1d16","webpack://Citta2.0/./src/components/citta-search-result/range-refine-item.tsx?f68a","webpack://Citta2.0/./src/components/citta-search-result/refine-item.tsx?5a16","webpack://Citta2.0/./src/components/citta-search-result/refine-submenu.tsx?ad28","webpack://Citta2.0/./src/components/citta-search-result/url-utils.ts?88cb","webpack://Citta2.0/./src/components/citta-search-result/citta-refiners.tsx?b326","webpack://Citta2.0/./src/components/citta-picture.tsx?de55","webpack://Citta2.0/./src/modules/citta-search-result-container/components/product-component.tsx?8073","webpack://Citta2.0/./src/modules/citta-search-result-container/citta-search-result-container.view.tsx?15fd","webpack://Citta2.0/./src/modules/checkout-billing-address/checkout-billing-address.view.tsx?b194","webpack://Citta2.0/./src/modules/checkout-shipping-address/checkout-shipping-address.view.tsx?3386","webpack://Citta2.0/./src/modules/wishlist-items/wishlist-items.view.tsx?4d80","webpack://Citta2.0/./src/checkout-errors/checkout-errors.ts?a9e0","webpack://Citta2.0/./src/common/address-format.data.ts?6cbf","webpack://Citta2.0/./src/common/error.tsx?096f","webpack://Citta2.0/./src/common/components/address-button.tsx?7f7b","webpack://Citta2.0/./src/common/components/address-error-message.tsx?89ad","webpack://Citta2.0/./src/common/components/address-error-title.tsx?3926","webpack://Citta2.0/./src/common/components/address-input.tsx?8073","webpack://Citta2.0/./src/common/address-common.ts?cf4b","webpack://Citta2.0/./src/common/address-format.ts?4f04","webpack://Citta2.0/./src/common/address-meta-data.ts?c6e6","webpack://Citta2.0/./src/common/address-module.data.ts?697a","webpack://Citta2.0/./src/common/components/address-checkbox.tsx?eb1a","webpack://Citta2.0/./src/common/components/address-add.tsx?e6a6","webpack://Citta2.0/./src/common/components/address-show.tsx?3f60","webpack://Citta2.0/./src/common/components/address-alert.tsx?10d1","webpack://Citta2.0/./src/common/components/address-dropdown.tsx?f24b","webpack://Citta2.0/./src/common/components/address-label.tsx?6864","webpack://Citta2.0/./src/components/price-component.tsx?ed26","webpack://Citta2.0/./src/common/components/address-detail-item.tsx?5209","webpack://Citta2.0/./src/modules/search-result-container/components/utilities.ts?8569","webpack://Citta2.0/./src/common/components/address-list.tsx?a628","webpack://Citta2.0/./src/common/components/address-error-alert.tsx?bcde","webpack://Citta2.0/./src/modules/search-result-container/components/error-message.tsx?6302","webpack://Citta2.0/./src/modules/search-result-container/components/feature-search-result-item.tsx?71fa","webpack://Citta2.0/./src/modules/search-result-container/components/link.tsx?52c2","webpack://Citta2.0/./src/modules/search-result-container/components/modal.tsx?d78e","webpack://Citta2.0/./src/modules/search-result-container/components/product-search-result-items.tsx?5174","webpack://Citta2.0/./src/modules/search-result-container/components/separator.tsx?4ea6","webpack://Citta2.0/./src/modules/search-result-container/components/title.tsx?c269","webpack://Citta2.0/./src/common/address-autosuggest.ts?f5a2","webpack://Citta2.0/./src/common/components/address-select.tsx?c1df","webpack://Citta2.0/./src/common/components/address-ship-multiple.tsx?136d","webpack://Citta2.0/./src/common/components/address-ship-multiple-heading.tsx?5d65","webpack://Citta2.0/./src/common/components/address-ship-multiple-lines.tsx?ce68","webpack://Citta2.0/./src/modules/search-result-container/components/choice-summary.tsx?3f71","webpack://Citta2.0/./src/modules/search-result-container/components/range-refine-item.tsx?6288","webpack://Citta2.0/./src/modules/search-result-container/components/refine-item.tsx?a594","webpack://Citta2.0/./src/modules/search-result-container/components/refine-submenu.tsx?1292","webpack://Citta2.0/./src/modules/search-result-container/components/range-refine-item-input.tsx?09aa"],"sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport {\n CategoryHierarchy as CategoryHierarchyData,\n IProductRefinerHierarchy,\n IProductsDimensionsAvailabilities\n} from '@msdyn365-commerce/commerce-entities';\nimport MsDyn365, { getCatalogId, ICoreContext } from '@msdyn365-commerce/core';\nimport {\n ChannelInventoryConfiguration,\n format,\n ProductPrice,\n ProductRefinerValue,\n SortColumn,\n StoreOperationsDataActions,\n TextValueTranslation\n} from '@msdyn365-commerce/retail-proxy';\nimport {\n ArrayExtensions,\n DimensionAvailabilitiesForProductSearchResultInput,\n DimensionTypes,\n DimensionSwatchDisplayTypes,\n getDimensionAvailabilitiesForProductSearchResultAction,\n getPriceForProductSearchResult,\n IDimensionsApp,\n PriceForProductSearchResultInput,\n ObjectExtensions\n} from '@msdyn365-commerce-modules/retail-actions';\nimport {\n getTelemetryObject,\n ILabeledDropdownOnChangeNotification,\n ILabeledDropdownOption,\n IModuleProps,\n INodeProps,\n isMobile,\n ITelemetryContent,\n LabeledDropdown,\n UncontrolledPagination,\n VariantType\n} from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport { action, computed, observable, reaction, transaction } from 'mobx';\nimport { observer } from 'mobx-react';\nimport * as React from 'react';\n\nimport {\n buildListPageUrl,\n getCollectionProducts,\n getCollectionRefinersAction,\n getCurrentUrl,\n GetFullProductsByCollectionInput,\n IFullProductsSearchResultsWithCount,\n parseQueryParam,\n ProductListInventoryFilteringOptions,\n RefinersByCollectionInput,\n sortOptions\n} from './actions';\nimport { hydrateRefinersFromUrl } from './actions/url-utils';\nimport {\n ErrorMessage,\n FeatureSearchResultItem,\n getUpdatedRefinementCriteria,\n IChoiceSummaryClickNotification,\n IRefineItemCommonProps,\n IRefineItemToggleNotification,\n ISearchResultModalViewProps,\n isMatchingRefinementCriterion,\n Link,\n ModalToggle,\n ProductSearchResultItems,\n SearchResultModal,\n Separator,\n Title\n} from './components';\nimport ChoiceSummary from './components/choice-summary';\nimport RefineSubmenu from './components/refine-submenu';\nimport { ListPageState } from './list-page-state';\nimport { ISearchResultContainerData } from './search-result-container.data';\nimport { expandRefinersCount, ISearchResultContainerProps } from './search-result-container.props.autogenerated';\n\nexport interface ISearchResultContainerViewProps extends ISearchResultContainerProps {\n products?: React.ReactNode;\n className?: string;\n SearchResultContainer: IModuleProps;\n TitleViewProps: ITitleViewProps;\n categoryHierarchy: ICategoryHierarchyViewProps;\n pagination?: React.ReactNode;\n ProductsContainer: INodeProps;\n ProductSectionContainer: INodeProps;\n refineMenu: IRefineMenuViewProps;\n sortByOptions: ISortByViewProps;\n choiceSummary?: React.ReactNode;\n modalToggle: React.ReactNode;\n searchResultModal: ISearchResultModalViewProps;\n isMobile: boolean;\n CategoryNavContainer: INodeProps;\n RefineAndProductSectionContainer: INodeProps;\n errorMessage: React.ReactNode;\n FeatureSearchContainer: INodeProps;\n similarLookProduct?: React.ReactNode;\n productPrices?: ProductPrice[];\n productsDimensionAvailabilities?: IProductsDimensionsAvailabilities[][];\n}\n\nexport interface ITitleViewProps {\n TitleContainer: INodeProps;\n title: ISearchResultTitle;\n}\n\nexport interface IRefineMenuViewProps {\n RefineMenuContainer: INodeProps;\n RefinerSectionContainer: INodeProps;\n refiners?: React.ReactNode[];\n}\n\nexport interface ICategoryHierarchyViewProps {\n categoryHierarchyList?: React.ReactNode[];\n categoryHierarchySeparator?: React.ReactNode;\n CategoryHierarchyContainer: INodeProps;\n}\n\nexport interface ISortByViewProps {\n SortingContainer: INodeProps;\n sortByDropDown?: React.ReactNode;\n}\n\nexport type GridSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl';\n\n/**\n * Title component for search result container.\n */\nexport interface ISearchResultTitle {\n titlePrefix?: React.ReactNode;\n titleText?: React.ReactNode;\n titleCount?: React.ReactNode;\n}\n\nexport interface ISearchResultContainerState {\n sortingState: ISortByCollectionState;\n modalIsOpen: boolean;\n refiners: IProductRefinerHierarchy[];\n productsDimensionAvailabilities?: IProductsDimensionsAvailabilities[][];\n channelInventoryConfiguration?: ChannelInventoryConfiguration;\n}\n\ninterface ISortByCollectionState {\n selectedSortByOption: ILabeledDropdownOption;\n pending: boolean;\n}\n\n/**\n *\n * SearchResultContainer component.\n * @extends {React.PureComponent>}\n */\n@observer\nexport default class SearchResultContainer extends React.PureComponent<\n ISearchResultContainerProps,\n ISearchResultContainerState\n> {\n @computed get isMobile(): boolean {\n return this._viewport === 'xs' || this._viewport === 'sm';\n }\n\n private readonly sortByDropdownOptions: ILabeledDropdownOption[] = [\n { key: sortOptions.sortByOptionRelevanceDesc, value: this.props.resources.sortByOptionRelevanceDesc },\n { key: sortOptions.sortByOptionNameAsc, value: this.props.resources.sortByOptionNameAsc },\n { key: sortOptions.sortByOptionNameDesc, value: this.props.resources.sortByOptionNameDesc },\n { key: sortOptions.sortByOptionPriceAsc, value: this.props.resources.sortByOptionPriceAsc },\n { key: sortOptions.sortByOptionPriceDesc, value: this.props.resources.sortByOptionPriceDesc },\n { key: sortOptions.sortByOptionRatingDesc, value: this.props.resources.sortByOptionRatingDesc },\n { key: sortOptions.sortByOptionBestSelling, value: this.props.resources.sortByOptionBestSelling },\n { key: sortOptions.sortByOptionNewScore, value: this.props.resources.sortByOptionNewScore },\n { key: sortOptions.sortByOptionTrendingScore, value: this.props.resources.sortByOptionTrendingScore }\n ];\n\n private readonly _refineItemCommonProps: IRefineItemCommonProps;\n\n private readonly _pageType: string | undefined = this.props.context.request.urlTokens.pageType;\n\n @observable\n private _viewport: GridSize = 'lg';\n\n private readonly _modalToggleRef: React.RefObject;\n\n private readonly _sortAndFilterContainerRef: React.RefObject;\n\n private expandrefinerCount: number | undefined = 0;\n\n private readonly telemetryContent: ITelemetryContent;\n\n private readonly productPrices: ProductPrice[];\n\n private readonly defaultPageNumber = 0;\n\n private readonly catalogId = getCatalogId(this.props.context.request);\n\n private isListPageStateUpdated: boolean = false;\n\n private _isMounted: boolean = false;\n\n public static getFriendlyName(locale: string, nameTranslations?: TextValueTranslation[]): string | undefined {\n let nameTranslation: TextValueTranslation | undefined;\n if (locale && nameTranslations && ArrayExtensions.hasElements(nameTranslations)) {\n nameTranslation = nameTranslations.find(item => item.Language!.toLowerCase() === locale.toLowerCase());\n }\n\n return nameTranslation?.Text;\n }\n\n public constructor(props: ISearchResultContainerProps, state: ISearchResultContainerState) {\n super(props);\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- Check required.\n this._viewport = props.context.request?.device?.Type === 'Mobile' ? 'xs' : 'lg';\n this._modalToggleRef = React.createRef();\n this._sortAndFilterContainerRef = React.createRef();\n this._toggleModal = this._toggleModal.bind(this);\n this._updateViewport = this._updateViewport.bind(this);\n this.productPrices = [];\n this.state = {\n sortingState: {\n pending: false,\n selectedSortByOption: this.sortByDropdownOptions[0]\n },\n modalIsOpen: false,\n refiners: [],\n channelInventoryConfiguration: undefined\n };\n const { placeholderTextMax, minLabel, maxLabel, rangeNameFormat } = this.props.resources;\n\n const locale = this.props.context.request.locale;\n const telemetry = this.props.telemetry;\n const validationErrorNaN = this.props.resources.validationErrorNotNumber;\n const validationErrorRange = this.props.resources.validationErrorNotRange;\n this._refineItemCommonProps = {\n telemetry,\n locale,\n placeholderTextMax,\n minLabel,\n maxLabel,\n rangeNameFormat,\n validationErrorNaN,\n validationErrorRange\n };\n this.telemetryContent = getTelemetryObject(\n this.props.context.request.telemetryPageName!,\n this.props.friendlyName,\n this.props.telemetry\n );\n this._updateViewport();\n }\n public async componentDidMount(): Promise {\n this._isMounted = true;\n if (MsDyn365.isBrowser && window.addEventListener) {\n window.addEventListener('resize', this._updateViewport);\n this._updateViewport();\n }\n\n const listPageState = await this.props.data.listPageState;\n const products = await this.props.data.products;\n const channelInventoryConfiguration = await StoreOperationsDataActions.getInventoryConfigurationAsync({\n callerContext: this.props.context.actionContext\n });\n if (this._isMounted) {\n this.setState({ channelInventoryConfiguration });\n }\n\n this._updateListPageState(listPageState, products);\n\n // Initialize reaction based on listPageState properties\n reaction(\n () => {\n return [\n listPageState.activeFilters?.length,\n listPageState.currentPageNumber,\n ArrayExtensions.hasElements(listPageState.sortingCritera?.Columns)\n ];\n },\n async () => {\n const newListPageState = await this.props.data.listPageState;\n const input = new GetFullProductsByCollectionInput(\n newListPageState.pageType,\n this.props.context.request.apiSettings,\n {\n Paging: {\n Top: this.props.config.itemsPerPage,\n Skip: Math.max(newListPageState.pageSize * (newListPageState.currentPageNumber ?? 0), 0)\n },\n count: true,\n Sorting: newListPageState.sortingCritera ?? {}\n },\n newListPageState.activeFilters ?? [],\n // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing -- RecordId is string. Check required.\n +(this.props.context.request.urlTokens.recordId || 0),\n\n // eslint-disable-next-line max-len -- existing code\n this.props.context.request.query?.q\n ? this.props.context.request.query.q\n : JSON.stringify({\n ProductId: this.props.context.request.query?.productId,\n Recommendation: this.props.context.request.query?.recommendation\n }),\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- Required check.\n !!this.props?.config?.includeAttributes,\n this.props.config.updateRefinerPanel,\n this.props.context.request.locale,\n this.catalogId,\n channelInventoryConfiguration\n );\n\n const productResults = await getCollectionProducts(input, this.props.context.actionContext);\n newListPageState.totalProductCount = productResults.count;\n newListPageState.activeProducts = productResults.products;\n\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- check is required.\n if (\n this.props.config.enableAffiliationBasedPricing &&\n this.props.context.actionContext.requestContext?.user?.isAuthenticated\n ) {\n // eslint-disable-next-line @typescript-eslint/no-floating-promises -- Call api to retrieve the availabilities data without blocking the UI.\n this._getActivePrice();\n }\n\n await this._updateVariantAvailability();\n\n if (this.props.config.updateRefinerPanel) {\n const refinerInput = new RefinersByCollectionInput(\n newListPageState.pageType,\n this.props.context.request.apiSettings,\n {\n Paging: {\n Top: this.props.config.itemsPerPage,\n Skip: Math.max(\n newListPageState.pageSize * (newListPageState.currentPageNumber ?? this.defaultPageNumber),\n this.defaultPageNumber\n )\n },\n count: true,\n Sorting: newListPageState.sortingCritera ?? {}\n },\n newListPageState.activeFilters ?? [],\n // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing -- RecordId is string. Check required.\n +(this.props.context.request.urlTokens.recordId || 0),\n this.props.context.request.query?.q\n ? this.props.context.request.query.q\n : this.props.context.request.query?.productId,\n false,\n this.props.config.updateRefinerPanel,\n undefined,\n this.catalogId,\n channelInventoryConfiguration\n );\n\n const refiners = await getCollectionRefinersAction(refinerInput, this.props.context.actionContext);\n this.setState({ refiners });\n }\n }\n );\n\n if (\n this.props.config.enableAffiliationBasedPricing &&\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- Condition required.\n this.props.context.actionContext.requestContext?.user?.isAuthenticated\n ) {\n // eslint-disable-next-line @typescript-eslint/no-floating-promises -- Call api to retrieve the availabilities data without blocking the UI.\n this._getActivePrice();\n }\n await this._updateVariantAvailability();\n }\n\n public componentWillUnmount(): void {\n this._isMounted = false;\n if (MsDyn365.isBrowser && window.removeEventListener) {\n window.removeEventListener('resize', this._updateViewport);\n }\n }\n\n public render(): JSX.Element {\n const {\n config: { imageSettings, className },\n resources,\n data: { listPageState, products: productCollection, featureProduct }\n } = this.props;\n\n if (!this.isListPageStateUpdated && listPageState.result && productCollection.result) {\n this._updateListPageState(listPageState.result, productCollection.result);\n this.isListPageStateUpdated = true;\n }\n\n const products = (this.props.data.listPageState.result && this.props.data.listPageState.result.activeProducts) || [];\n const searchProduct = listPageState.result?.featureProduct ?? featureProduct.result ?? null;\n let errorText = '';\n if (!ArrayExtensions.hasElements(products)) {\n errorText = this._pageType === 'Category' ? resources.resultCategoryNotFoundText : resources.resultSearchNotFoundText;\n }\n const productsComponent = this._getProducts();\n const featureComponent = (\n \n );\n\n const searchResultContainerViewProps = {\n ...this.props,\n products: productsComponent,\n TitleViewProps: this._getCollectionTitle(),\n categoryHierarchy: !this.props.config.disableHierarchy && this._getCategoryHierarchy(),\n refineMenu: this._getRefineMenu(),\n className: classnames('ms-search-result-container', className),\n SearchResultContainer: {\n moduleProps: this.props,\n className: classnames('ms-search-result-container', className)\n },\n sortByOptions: this.props.data.listPageState.result?.totalProductCount !== 0 ? this._getSortingDropDown() : null,\n pagination: this._getPagination(),\n ProductsContainer: { className: 'ms-search-result-container__Products' },\n ProductSectionContainer: { className: 'ms-search-result-container__product-section' },\n CategoryNavContainer: { className: 'ms-search-result-container__category-nav-section' },\n RefineAndProductSectionContainer: { className: 'ms-search-result-container__refine-product-section' },\n choiceSummary: this._getChoiceSummary(),\n modalToggle:\n this.props.data.listPageState.result?.totalProductCount !== 0 ? (\n \n ) : null,\n searchResultModal: this._getSearchResultModal(),\n isMobile: this.isMobile,\n errorMessage: errorText && ,\n FeatureSearchContainer: { className: 'ms-feature-search-result' },\n similarLookProduct: searchProduct ? featureComponent : null,\n productPrices: this.productPrices,\n productsDimensionAvailabilities: this.state.productsDimensionAvailabilities\n };\n return this.props.renderView(searchResultContainerViewProps) as React.ReactElement;\n }\n\n /**\n * Get products variants dimension availabilities.\n * @returns Void.\n */\n private readonly _updateVariantAvailability = async (): Promise => {\n const context = this.props.context as ICoreContext;\n const dimensionsToDisplayOnProductCard = context.app.config.dimensionsInProductCard;\n const dimensionsToDisplayAsSwatch = context.app.config.dimensionsAsSwatchType;\n if (\n ArrayExtensions.hasElements(dimensionsToDisplayOnProductCard) &&\n !dimensionsToDisplayOnProductCard.includes(DimensionTypes.none) &&\n ArrayExtensions.hasElements(dimensionsToDisplayAsSwatch) &&\n !dimensionsToDisplayAsSwatch.includes(DimensionTypes.none) &&\n this.props.config.includeAttributes\n ) {\n await this._getProductsDimensionsAvailabilities();\n }\n };\n\n /**\n * Update the list page state with initial data.\n * @param listPageState -- List page State.\n * @param products -- Products.\n */\n @action\n private readonly _updateListPageState = (listPageState: ListPageState, products: IFullProductsSearchResultsWithCount): void => {\n let querySorting: SortColumn[] = [];\n const defaultPageNumber: number = 10;\n\n if (this._pageType === 'Category') {\n listPageState.pageType = 'Category';\n } else {\n listPageState.pageType = 'Search';\n }\n\n if (this.props.context.request.query?.sorting) {\n querySorting = JSON.parse(decodeURIComponent(this.props.context.request.query.sorting)) as SortColumn[];\n }\n\n listPageState.currentPageNumber =\n (this.props.context.request.query?.skip &&\n +this.props.context.request.query.skip / (this.props.config.itemsPerPage ?? defaultPageNumber)) ||\n 0;\n listPageState.sortingCritera = { Columns: querySorting };\n listPageState.pageSize = this.props.config.itemsPerPage ?? defaultPageNumber;\n listPageState.activeProducts = products.products;\n listPageState.totalProductCount = products.count;\n listPageState.activeFilters = hydrateRefinersFromUrl(this.props.context.request) || [];\n if (this.props.context.request.query?.productId) {\n const featureProduct = this.props.data.featureProduct.result;\n if (featureProduct) {\n listPageState.featureProduct = featureProduct;\n }\n }\n };\n\n /**\n * Get products dimension availabilities.\n * @returns Void.\n */\n private readonly _getProductsDimensionsAvailabilities = async (): Promise => {\n const productsList = this.props.data.listPageState.result?.activeProducts ?? [];\n\n const productsDimensionAvailabilities = await getDimensionAvailabilitiesForProductSearchResultAction(\n new DimensionAvailabilitiesForProductSearchResultInput(\n productsList,\n this.props.context as ICoreContext,\n DimensionSwatchDisplayTypes.productCard\n ),\n this.props.context.actionContext\n );\n\n if (ArrayExtensions.hasElements(productsDimensionAvailabilities)) {\n this.setState({ productsDimensionAvailabilities });\n }\n };\n\n /**\n * Get the active price for the products.\n */\n private readonly _getActivePrice = async (): Promise => {\n const productsList = this.props.data.listPageState.result?.activeProducts ?? [];\n const products = await getPriceForProductSearchResult(\n new PriceForProductSearchResultInput(productsList),\n this.props.context.actionContext\n );\n\n const listPageState = await this.props.data.listPageState;\n listPageState.activeProducts = products;\n };\n\n private readonly _getSearchResultModal = (): ISearchResultModalViewProps => {\n const { resources } = this.props;\n return SearchResultModal({\n resources: {\n modalCloseButtonText: resources.modalCloseButtonText,\n modalTitle: resources.modalTitle\n },\n isOpen: this.state.modalIsOpen,\n returnRef: this._modalToggleRef,\n onModalToggle: this._toggleModal\n });\n };\n\n private readonly _getCollectionTitle = (): ITitleViewProps => {\n const { data, context, resources } = this.props;\n\n let collectionTitle: string | undefined = '';\n if (context && context.request && context.request.query && context.request.query.q) {\n collectionTitle = `\"${context.request.query.q}\"`;\n } else {\n collectionTitle =\n (data.category.result &&\n SearchResultContainer.getFriendlyName(context.request.locale, data.category.result.NameTranslations)) ||\n (data.category.result && data.category.result.Name) ||\n this.props.context.request.query?.title ||\n '';\n }\n let productCountText = '';\n let productCountNumber: number | undefined;\n if (data.listPageState && data.listPageState.result && data.listPageState.result.totalProductCount !== undefined) {\n productCountNumber = data.listPageState.result.totalProductCount;\n } else if (data.products && data.products.result) {\n productCountNumber = data.products.result.count;\n }\n\n if (productCountNumber && productCountNumber !== 0) {\n productCountText =\n productCountNumber !== 1\n ? format(this.props.resources.numberOfProducts, productCountNumber)\n : this.props.resources.oneProduct;\n } else {\n productCountText = format(this.props.resources.numberOfProducts, 0);\n }\n const pageName = context.request.telemetryPageName ? `result-count-${context.request.telemetryPageName.toLowerCase()}` : '';\n const titlePrefix = ;\n const titleText = collectionTitle && <Title className='ms-search-result__collection-title-text' text={collectionTitle} />;\n const titleCount = <Title className='ms-search-result__collection-title-count' text={productCountText} />;\n\n return {\n TitleContainer: { className: `ms-search-result-container__title ${pageName}` },\n title: {\n titlePrefix,\n titleText,\n titleCount\n }\n };\n };\n\n private readonly _getCategoryHierarchy = (): ICategoryHierarchyViewProps => {\n const { data } = this.props;\n const categoryHierarchy = data.categoryHierarchy.result;\n const categoryLinks =\n categoryHierarchy &&\n categoryHierarchy.map((value: CategoryHierarchyData, index: number) => {\n return (\n <Link\n key={index}\n text={value.Name}\n ariaLabel={`${this.props.resources.categoryLinkAriaLabel} ${value.Name}`}\n href={value.Url}\n />\n );\n });\n const categoryLinkSeparator = <Separator separator='/' />;\n\n return {\n CategoryHierarchyContainer: { tag: 'nav', className: 'ms-search-result-container__category-hierarchy' },\n categoryHierarchyList: categoryLinks,\n categoryHierarchySeparator: categoryLinkSeparator\n };\n };\n\n private readonly _getSortingDropDown = (): ISortByViewProps => {\n const { resources } = this.props;\n const activeDropdown = this._getCurrentlySelectedOption() || this.state.sortingState.selectedSortByOption;\n let dropdownOptions = this._getAllSortByOptions();\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- App config settings are of \"any\" value.\n if (this.props.context.app.config.hideRating) {\n dropdownOptions = dropdownOptions.filter(dropdownOption => dropdownOption.key !== sortOptions.sortByOptionRatingDesc);\n }\n\n const dropdown = (\n <LabeledDropdown\n labelClassname='reviews-list-sort-by'\n labelText={resources.sortByDropdownLabel}\n dropdownId='categorySortByDropdown'\n dropdownClassname='reviews-list-dropdown'\n toggleColor='link'\n dropdownOptions={dropdownOptions}\n selectedOption={activeDropdown}\n onSelectOption={this._updateSortByDropdown}\n ref={this._sortAndFilterContainerRef}\n />\n );\n return {\n SortingContainer: { className: 'ms-search-result-container__Sort-by-category' },\n sortByDropDown: dropdown\n };\n };\n\n private readonly _getPagination = (): React.ReactNode => {\n const { config, context, data, resources } = this.props;\n const listPageState = data.listPageState.result;\n const fullUrl = getCurrentUrl(context.request);\n const itemsPerPage = config.itemsPerPage || 10;\n // eslint-disable-next-line max-len -- existing code\n const skipCount = !ObjectExtensions.isNullOrUndefined(listPageState?.currentPageNumber)\n ? listPageState!.currentPageNumber * (this.props.config.itemsPerPage || 10)\n : (this.props.context.request.query && +this.props.context.request.query.skip) || 0;\n const totalItems = listPageState?.totalProductCount || 0;\n const previousText = resources.flipperPrevious;\n const nextText = resources.flipperNext;\n\n if (totalItems <= itemsPerPage) {\n return null;\n }\n return (\n <UncontrolledPagination\n className='ms-search-result-container__pagination'\n role='navigation'\n aria-label={resources.paginationAriaLabel}\n url={fullUrl.href}\n qsp='skip'\n items={totalItems}\n itemsPerPage={itemsPerPage}\n startingItem={skipCount}\n previousText={this._renderPrev(previousText)}\n nextText={this._renderNext(nextText)}\n previousAriaLabel={previousText}\n nextAriaLabel={nextText}\n telemetryContent={this.telemetryContent}\n />\n );\n };\n\n private readonly _getRefineMenu = (): IRefineMenuViewProps => {\n const { data, context, config } = this.props;\n const tempRangeTypeTODO = context.request.query && context.request.query.inputRange ? 'input' : 'slider';\n const validRefiners =\n this.props.config.updateRefinerPanel && ArrayExtensions.hasElements(this.state.refiners)\n ? this.state.refiners.filter(refiner => {\n return ArrayExtensions.hasElements(refiner.Values) && !this._shouldHideFromRefiners(refiner);\n })\n : data.refiners.result &&\n data.refiners.result.filter(refiner => {\n return ArrayExtensions.hasElements(refiner.Values) && !this._shouldHideFromRefiners(refiner);\n });\n\n const activeRefiners = (data.listPageState.result && data.listPageState.result.activeFilters) || [];\n\n this._getexpandRefinerCount(validRefiners && validRefiners.length, config.expandRefinersCount);\n const expandedRefiners = this.expandrefinerCount;\n const subMenus =\n validRefiners &&\n validRefiners.map((productRefinerHierarchy: IProductRefinerHierarchy, index: number) => {\n return (\n <RefineSubmenu\n productRefinerHierarchy={productRefinerHierarchy}\n selectedRefinerValues={activeRefiners}\n refineItemCommonProps={this._refineItemCommonProps}\n minValueSliderThumbAriaLabel={this.props.resources.minValueSliderThumbAriaLabel}\n maxValueSliderThumbAriaLabel={this.props.resources.maxValueSliderThumbAriaLabel}\n key={index}\n onUpdateRefiners={this._onUpdateRefiners}\n urlBuilder={this._buildRefinerUrl}\n isDisabled={false}\n isExpandedOnInitialLoad={!!(expandedRefiners && expandedRefiners > index)}\n tempRangeTypeTODO={tempRangeTypeTODO}\n context={context}\n moduleId={this.props.id}\n moduleTypeName={this.props.typeName}\n telemetryContent={this.telemetryContent}\n productCountAriaLabel={this.props.resources.productCountAriaLabel}\n refineItemAriaLabel={this.props.resources.refineItemAriaLabel}\n refineItemsAriaLabel={this.props.resources.refineItemsAriaLabel}\n singleProductCountAriaLabel={this.props.resources.singleProductCountAriaLabel}\n isMobile={this.isMobile}\n />\n );\n });\n\n return {\n RefineMenuContainer: { className: 'ms-search-result-container__refine-menu' },\n RefinerSectionContainer: { className: 'ms-search-result-container__refiner-section' },\n refiners: subMenus\n };\n };\n\n /**\n * Should hide from refiners.\n * @param refiner - The refiner.\n * @returns ShouldHideFromRefiners.\n */\n private readonly _shouldHideFromRefiners = (refiner: IProductRefinerHierarchy): boolean => {\n const { channelInventoryConfiguration } = this.state;\n const isInventorySortableAttribute =\n (this.props.data.products.result?.inventoryAwareSortableAttributeId !== 0 &&\n refiner.RecordId === this.props.data.products.result?.inventoryAwareSortableAttributeId) ||\n (channelInventoryConfiguration?.ProductAvailabilitySortableAttributeRecordId !== 0 &&\n refiner.RecordId === channelInventoryConfiguration?.ProductAvailabilitySortableAttributeRecordId);\n\n const isInventoryProductAttribute =\n (this.props.data.products.result?.channelInventoryConfigurationId !== 0 &&\n refiner.RecordId === this.props.data.products.result?.channelInventoryConfigurationId) ||\n (channelInventoryConfiguration?.InventoryProductAttributeRecordId !== 0 &&\n refiner.RecordId === channelInventoryConfiguration?.InventoryProductAttributeRecordId);\n\n // Always hide sortable attribute since it's just for sorting products in Azure search, not for customers\n return (\n isInventorySortableAttribute ||\n (this.props.context.app.config.productListInventoryDisplay === ProductListInventoryFilteringOptions.HideOOS &&\n isInventoryProductAttribute)\n );\n };\n\n private readonly _getChoiceSummary = (): React.ReactNode => {\n const { resources, data, telemetry } = this.props;\n const { channelInventoryConfiguration } = this.state;\n const selectedRefiners = (data.listPageState.result && data.listPageState.result.activeFilters) || [];\n const refinerValueName = this.props.data.refiners.result?.find(rating => rating.KeyName === 'Rating');\n return (\n <ChoiceSummary\n classNames='ms-choice-summary-by-category'\n clearAllText={resources.clearAllText}\n label={resources.choiceSummaryLabel}\n closeAriaLabel={resources.closeAriaLabel}\n selectedChoices={selectedRefiners}\n // @ts-expect-error: NOTE Type-unsafe line below, null refinersByCategoryHierarchy case not handled\n refinerHierarchy={data.refiners.result}\n choiceFormat={resources.choiceFormat}\n choiceRangeValueFormat={resources.choiceRangeValueFormat}\n telemetry={telemetry}\n onChoiceClicked={this._onChoiceClicked}\n urlBuilder={this._buildRefinerUrlForChoiceSummary}\n choiceAriaLabel={resources.choiceAriaLabel}\n telemetryContent={this.telemetryContent}\n context={this.props.context}\n channelInventoryConfigurationId={channelInventoryConfiguration?.InventoryProductAttributeRecordId}\n refinerValues={refinerValueName}\n />\n );\n };\n\n /**\n * Get Active products.\n * @returns - JSX Elements.\n */\n private readonly _getProducts = (): JSX.Element => {\n const {\n config: { imageSettings, allowBackNavigation: shouldAllowBackNavigation }\n } = this.props;\n const { resources } = this.props;\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access -- Reading config value.\n const breadCrumbType: string = this.props.context.app.config.breadcrumbType;\n const shouldAllowBack = shouldAllowBackNavigation && (breadCrumbType === 'back' || breadCrumbType === 'categoryAndBack');\n\n const products = (this.props.data.listPageState.result && this.props.data.listPageState.result.activeProducts) || [];\n const quickviewSlot = this.props.slots?.quickview?.[0];\n const productComparisonButton = ArrayExtensions.hasElements(this.props.slots.productComparisonButton)\n ? this.props.slots.productComparisonButton[0]\n : null;\n\n const isPriceMinMaxFeatureState = this.props.data.featureState.result?.find(\n featureState => featureState.Name === 'Dynamics.AX.Application.RetailSearchPriceRangeFeature'\n );\n return (\n <ProductSearchResultItems\n products={products}\n context={this.props.context}\n imageSettings={imageSettings}\n resources={resources}\n moduleType={this.props.typeName}\n moduleId={this.props.id}\n allowBackNavigation={shouldAllowBack}\n telemetryContent={this.telemetryContent}\n quickviewSlot={quickviewSlot}\n productComparisonButton={productComparisonButton}\n channelInventoryConfigurationId={this.props.data.products.result?.channelInventoryConfigurationId}\n isPriceMinMaxEnabled={isPriceMinMaxFeatureState?.IsEnabled}\n productsDimensionAvailabilities={this.state.productsDimensionAvailabilities}\n />\n );\n };\n\n private readonly _updateSortByDropdown = (notification: ILabeledDropdownOnChangeNotification): void => {\n const {\n context: { request: requestContext, actionContext }\n } = this.props;\n\n if (!requestContext || !actionContext || !this.props.data.listPageState.result) {\n // eslint-disable-next-line max-len -- existing code\n const error = `[sort-by-category] cannot sort without context: ${!requestContext ? 'requestContext ' : ''} ${\n !actionContext ? 'actionContext ' : ''\n } could not be found`;\n this.props.telemetry.warning(error);\n return;\n }\n\n window.history.pushState(\n {},\n '',\n buildListPageUrl(\n getCurrentUrl(this.props.context.request),\n undefined,\n [this._getSortColumnFromSelectedOption(notification.selectedOption)],\n undefined\n )\n );\n transaction(() => {\n this.props.data.listPageState.result!.currentPageNumber = 0;\n this.props.data.listPageState.result!.sortingCritera = {\n Columns: [this._getSortColumnFromSelectedOption(notification.selectedOption)]\n };\n });\n };\n\n private readonly _getSortColumnFromSelectedOption = (option: ILabeledDropdownOption): SortColumn => {\n const { data } = this.props;\n\n if (!data.searchConfiguration.result) {\n return {};\n }\n\n const mappedConfiguration = data.searchConfiguration.result.find(searchConfiguration => {\n return searchConfiguration.key === option.key;\n });\n\n if (mappedConfiguration) {\n return mappedConfiguration.sortColumn;\n }\n\n return {};\n };\n\n /**\n * Retrieves current sort criteria.\n * @returns Sort criteria column which is currently active or undefined if it's not specified.\n */\n private readonly _getSortCriteriaColumn = (): SortColumn | undefined => {\n const sortCriteria = this.props.data.listPageState.result?.sortingCritera;\n if (ArrayExtensions.hasElements(sortCriteria?.Columns)) {\n return sortCriteria!.Columns[0];\n }\n\n const queryColumns = parseQueryParam<SortColumn[]>('sorting', this.props.context.request);\n if (ArrayExtensions.hasElements(queryColumns)) {\n return queryColumns[0];\n }\n\n return undefined;\n };\n\n /**\n * Retrieves dropdown options.\n * @returns All dropdown options.\n */\n private readonly _getAllSortByOptions = (): ILabeledDropdownOption[] => {\n const searchConfiguration = this.props.data.searchConfiguration.result;\n\n if (!searchConfiguration) {\n return [];\n }\n\n const mappedSearchConfiguration = this.sortByDropdownOptions.filter(mappedSearchConfig =>\n searchConfiguration.find(item => mappedSearchConfig.key === item.key)\n );\n\n return ArrayExtensions.validValues(mappedSearchConfiguration);\n };\n\n /**\n * Retrieves current selected dropdown option based on the sort criteria.\n * @returns Current dropdown option.\n */\n private readonly _getCurrentlySelectedOption = (): ILabeledDropdownOption | undefined => {\n const activeSortColumn = this._getSortCriteriaColumn();\n\n const searchConfiguration = this.props.data.searchConfiguration.result;\n\n if (!activeSortColumn || !searchConfiguration) {\n return undefined;\n }\n\n const activeMappedConfig = searchConfiguration.find(\n mappedSearchConfig =>\n mappedSearchConfig.sortColumn.ColumnName === activeSortColumn.ColumnName &&\n mappedSearchConfig.sortColumn.IsDescending === activeSortColumn.IsDescending\n );\n if (!activeMappedConfig) {\n return undefined;\n }\n\n return this.sortByDropdownOptions.find(dropdownOption => dropdownOption.key === activeMappedConfig.key);\n };\n\n private readonly _onUpdateRefiners = (itemToggleNotification: IRefineItemToggleNotification): void => {\n const {\n context: { request: requestContext, actionContext }\n } = this.props;\n\n if (!requestContext || !actionContext || !this.props.data.listPageState.result) {\n const error = `Refine menu cannot refine search criteria: \n ${!requestContext ? 'requestContext ' : ''} ${!actionContext ? 'actionContext ' : ''} could not be found`;\n this.props.telemetry.warning(error);\n return;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- Server side the list PageState will not be called.\n const updatedRefinementCriteria = getUpdatedRefinementCriteria(\n itemToggleNotification,\n this.props.data.listPageState.result?.activeFilters || []\n );\n\n window.history.pushState({}, '', buildListPageUrl(getCurrentUrl(this.props.context.request), updatedRefinementCriteria));\n transaction(() => {\n this.props.data.listPageState.result!.currentPageNumber = 0;\n this.props.data.listPageState.result!.activeFilters = updatedRefinementCriteria;\n });\n };\n\n private readonly _buildRefinerUrl = (itemToggleNotification: IRefineItemToggleNotification): string => {\n if (this.props.data.listPageState.result) {\n const newRefinementCriteria = getUpdatedRefinementCriteria(\n itemToggleNotification,\n this.props.data.listPageState.result.activeFilters || []\n );\n\n return buildListPageUrl(getCurrentUrl(this.props.context.request), newRefinementCriteria);\n }\n this.props.telemetry.warning('[buildRefinerQueryString]List Page State Not available, unable to build refiner URL');\n return '';\n };\n\n private readonly _onChoiceClicked = (notification: IChoiceSummaryClickNotification): void => {\n const { data, telemetry } = this.props;\n\n if (!data.listPageState.result) {\n telemetry.warning('[choice-summary-by-category._onChoiceClicked]ListPageState unavailable, unable to update refiners.');\n return;\n }\n\n let currentRefinementCriteria = (data.listPageState.result && data.listPageState.result.activeFilters) || [];\n\n if (!notification.clearAll) {\n const selectedChoice = notification.choiceClicked;\n if (!selectedChoice) {\n telemetry.warning('[choice-summary-by-category._onChoiceClicked] Choice could not be determined');\n return;\n }\n currentRefinementCriteria = currentRefinementCriteria.filter(\n (selectedCriterion: ProductRefinerValue) => !isMatchingRefinementCriterion(selectedChoice, selectedCriterion)\n );\n } else {\n currentRefinementCriteria = [];\n\n // Set focus to sort and filter\n const dropdownElementId = this._sortAndFilterContainerRef.current && this._sortAndFilterContainerRef.current.props.dropdownId;\n const dropdownElement = dropdownElementId && document.getElementById(dropdownElementId);\n setTimeout(() => {\n dropdownElement && dropdownElement.focus();\n }, 50);\n }\n\n const fullUrl = getCurrentUrl(this.props.context.request);\n window.history.pushState({}, '', buildListPageUrl(fullUrl, currentRefinementCriteria));\n data.listPageState.result.currentPageNumber = 0;\n data.listPageState.result.activeFilters = currentRefinementCriteria;\n };\n\n private readonly _buildRefinerUrlForChoiceSummary = (selectedRefiner: ProductRefinerValue, isClearAll: boolean): string => {\n const { data, telemetry } = this.props;\n const fullUrl = getCurrentUrl(this.props.context.request);\n\n if (!data.listPageState.result) {\n telemetry.warning('[choice-summary-by-category._buildRefinerUrl]ListPageState unavailable, unable to create refiner URL.');\n return fullUrl.href;\n }\n\n let currentRefinementCriteria = (data.listPageState.result && data.listPageState.result.activeFilters) || [];\n\n if (!isClearAll) {\n if (!selectedRefiner) {\n telemetry.warning('[choice-summary-by-category._buildRefinerUrl] URL for Choice could not be determined');\n return fullUrl.href;\n }\n currentRefinementCriteria = currentRefinementCriteria.filter(\n (selectedCriterion: ProductRefinerValue) => !isMatchingRefinementCriterion(selectedRefiner, selectedCriterion)\n );\n } else {\n currentRefinementCriteria = [];\n }\n\n return buildListPageUrl(fullUrl, currentRefinementCriteria);\n };\n\n private _getViewport(): GridSize {\n if (MsDyn365.isBrowser) {\n return isMobile({ variant: VariantType.Browser, context: this.props.context.request });\n }\n return isMobile({ variant: VariantType.Viewport, context: this.props.context.request });\n }\n\n private _toggleModal(): void {\n this.setState({\n modalIsOpen: !this.state.modalIsOpen\n });\n }\n\n private _updateViewport(): void {\n this._viewport = this._getViewport();\n\n if (this.state.modalIsOpen && !this.isMobile) {\n this._toggleModal();\n }\n }\n\n private readonly _getexpandRefinerCount = (validRefiners?: number, refinerCount?: expandRefinersCount): void => {\n switch (refinerCount) {\n case expandRefinersCount.all:\n this.expandrefinerCount = validRefiners;\n break;\n case expandRefinersCount.one:\n this.expandrefinerCount = 1;\n break;\n case expandRefinersCount.two:\n this.expandrefinerCount = 2;\n break;\n case expandRefinersCount.three:\n this.expandrefinerCount = 3;\n break;\n case expandRefinersCount.four:\n this.expandrefinerCount = 4;\n break;\n default:\n this.expandrefinerCount = 0;\n }\n };\n\n /**\n * Renders a Pagination previous text.\n * @param paginationPreviousText - Pagination previous text from resources.\n * @returns Previous text and flipper icon.\n */\n private readonly _renderPrev = (paginationPreviousText: string) => {\n return (\n <div className='msc-pagination__prev'>\n <span className='ms-search-result__pagination-left' aria-hidden='true' />\n <span className='prev-text'>{paginationPreviousText}</span>\n </div>\n );\n };\n\n /**\n * Renders a Pagination next text.\n * @param paginationNextText - Pagination next text from resources.\n * @returns Next text and flipper icon.\n */\n private readonly _renderNext = (paginationNextText: string) => {\n return (\n <div className='msc-pagination__next'>\n <span className='next-text'>{paginationNextText}</span>\n <span className='ms-search-result__pagination-right' aria-hidden='true' />\n </div>\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 { Module, Node } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { ISearchResultModalViewProps } from './components';\nimport {\n ICategoryHierarchyViewProps,\n IRefineMenuViewProps,\n ISearchResultContainerViewProps,\n ISortByViewProps,\n ITitleViewProps\n} from './search-result-container';\n\nconst SearchResultContainerView: React.FC<ISearchResultContainerViewProps> = props => {\n const {\n SearchResultContainer,\n products,\n pagination,\n ProductsContainer,\n ProductSectionContainer,\n choiceSummary,\n isMobile,\n modalToggle,\n searchResultModal,\n TitleViewProps,\n refineMenu,\n categoryHierarchy,\n sortByOptions,\n CategoryNavContainer,\n RefineAndProductSectionContainer,\n errorMessage,\n FeatureSearchContainer,\n similarLookProduct\n } = props;\n const isRecoSearchPage = props.context.actionContext.requestContext.query?.recommendation;\n if (isMobile) {\n return (\n <Module {...SearchResultContainer}>\n {renderCategoryHierarchy(categoryHierarchy)}\n {renderTitle(TitleViewProps)}\n {choiceSummary}\n {modalToggle}\n {createSearchResultModal(searchResultModal, refineMenu, sortByOptions, isRecoSearchPage)}\n <Node {...FeatureSearchContainer}>{similarLookProduct}</Node>\n <Node {...ProductsContainer}>\n {errorMessage}\n {products}\n </Node>\n {pagination}\n </Module>\n );\n }\n return (\n <Module {...SearchResultContainer}>\n <Node {...CategoryNavContainer}>\n {categoryHierarchy && renderCategoryHierarchy(categoryHierarchy)}\n {TitleViewProps && renderTitleCount(TitleViewProps)}\n </Node>\n <Node {...RefineAndProductSectionContainer}>\n {refineMenu && renderRefiner(refineMenu)}\n <Node {...ProductSectionContainer}>\n {TitleViewProps && renderTitle(TitleViewProps)}\n {choiceSummary}\n {sortByOptions && !isRecoSearchPage && renderSort(sortByOptions)}\n <Node {...FeatureSearchContainer}>{similarLookProduct}</Node>\n <Node {...ProductsContainer}>\n {errorMessage}\n {products}\n </Node>\n {pagination}\n </Node>\n </Node>\n </Module>\n );\n};\n\nconst createSearchResultModal = (\n modalProps: ISearchResultModalViewProps,\n refineMenu: IRefineMenuViewProps,\n sortByDropDown: ISortByViewProps,\n isRecoSearchPage?: string\n): JSX.Element => {\n return React.cloneElement(\n modalProps.modal,\n {},\n modalProps.modalHeader,\n createModalBody(modalProps, refineMenu, sortByDropDown, isRecoSearchPage),\n modalProps.modalFooter\n );\n};\n\nconst createModalBody = (\n props: ISearchResultModalViewProps,\n refineMenu: IRefineMenuViewProps,\n sortByDropDown: ISortByViewProps,\n isRecoSearchPage?: string\n): JSX.Element | null => {\n if (sortByDropDown) {\n return React.cloneElement(props.modalBody, {}, renderSort(sortByDropDown, isRecoSearchPage), renderRefiner(refineMenu));\n }\n return null;\n};\n\nconst renderRefiner = (props: IRefineMenuViewProps): JSX.Element | null => {\n const { refiners, RefineMenuContainer, RefinerSectionContainer } = props;\n if (refiners) {\n return (\n <Node {...RefinerSectionContainer}>\n <Node {...RefineMenuContainer}>\n {refiners.map((submenu, index) => (\n <React.Fragment key={index}>{submenu}</React.Fragment>\n ))}\n </Node>\n </Node>\n );\n }\n return null;\n};\n\nconst renderSort = (props: ISortByViewProps, isRecoSearchPage?: string): JSX.Element | null => {\n const { SortingContainer, sortByDropDown } = props;\n if (sortByDropDown && !isRecoSearchPage) {\n return <Node {...SortingContainer}>{sortByDropDown}</Node>;\n }\n return null;\n};\n\nconst renderCategoryHierarchy = (props: ICategoryHierarchyViewProps): JSX.Element | null => {\n const { CategoryHierarchyContainer, categoryHierarchyList, categoryHierarchySeparator } = props;\n if (categoryHierarchyList) {\n return (\n <Node {...CategoryHierarchyContainer}>\n {categoryHierarchyList.map((category, index) => (\n <React.Fragment key={index}>\n {category}\n {categoryHierarchyList && categoryHierarchyList[index + 1] && categoryHierarchySeparator}\n </React.Fragment>\n ))}\n </Node>\n );\n }\n\n return null;\n};\n\nconst renderTitle = (props: ITitleViewProps): JSX.Element | null => {\n const { title, TitleContainer } = props;\n if (title) {\n return (\n <Node {...TitleContainer}>\n <h2>\n {title.titlePrefix}\n {title.titleText}\n </h2>\n </Node>\n );\n }\n return null;\n};\n\nconst renderTitleCount = (props: ITitleViewProps): JSX.Element | null => {\n const { title, TitleContainer } = props;\n if (title) {\n return (\n <Node {...TitleContainer}>\n <h5>{title.titleCount}</h5>\n </Node>\n );\n }\n return null;\n};\n\nexport default SearchResultContainerView;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport AddressInputComponent from './address-input';\n\nexport interface IAddressBillingCheckbox {\n isChecked: boolean;\n value: string;\n ariaLabel: string;\n text: string;\n telemetryContent?: ITelemetryContent;\n onChange(event: React.ChangeEvent<HTMLInputElement>): void;\n}\n\nexport const AddressBillingCheckbox: React.FC<IAddressBillingCheckbox> = ({\n isChecked,\n value,\n ariaLabel,\n text,\n telemetryContent,\n onChange\n}) => {\n const additionalAttributes = {\n checked: isChecked,\n 'aria-checked': isChecked\n };\n\n return (\n <label className='ms-checkout-billing-address__shipping-address-label'>\n <AddressInputComponent\n {...{\n type: 'checkbox',\n className: 'ms-checkout-billing-address',\n value,\n onChange,\n additionalAddributes: additionalAttributes,\n telemetryContent\n }}\n />\n <span className='ms-checkout-billing-address__shipping-address-checkbox-text'>{text}</span>\n </label>\n );\n};\nexport default AddressBillingCheckbox;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport * as React from 'react';\n\nexport interface IAddressBillingHeading {\n text: string;\n}\n\nexport const AddressBillingHeading: React.FC<IAddressBillingHeading> = ({ text }) => (\n <h2 className='ms-checkout-billing-address__heading'>{text}</h2>\n);\n\nexport default IAddressBillingHeading;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\n/// <reference types=\"bingmaps\" />\n\nimport * as Msdyn365 from '@msdyn365-commerce/core';\nimport { CheckoutModule, ErrorLocation, IGiftCardExtend } from '@msdyn365-commerce/global-state';\nimport { Address, AddressPurpose, CountryRegionInfo, StateProvinceInfo } from '@msdyn365-commerce/retail-proxy';\nimport { IModuleStateProps, withModuleState, EnabledPaymentsForOBO } from '@msdyn365-commerce-modules/checkout-utilities';\nimport { getTelemetryObject, IModuleProps, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport { action, computed, observable, reaction, set } from 'mobx';\nimport { observer } from 'mobx-react';\nimport * as React from 'react';\n\nimport { AutoSuggest } from '../../common/address-autosuggest';\nimport { IAutoSuggestOptions } from '../../common/address-autosuggest.data';\nimport { AddressCommon } from '../../common/address-common';\nimport { AddressFormat } from '../../common/address-format';\nimport { AddressItemType } from '../../common/address-format.data';\nimport { AddressMetaData } from '../../common/address-meta-data';\nimport { AddressOperation, AddressType, IAddressResource, IAddressResponse } from '../../common/address-module.data';\nimport { AddressAddUpdate, IAddressAddUpdateProps } from '../../common/components/address-add';\nimport { AddressBillingCheckbox } from '../../common/components/address-billing-checkbox';\nimport { AddressBillingHeading } from '../../common/components/address-billing-heading';\nimport { AddressShow, IAddressShowProps } from '../../common/components/address-show';\nimport { ICheckoutBillingAddressData } from './checkout-billing-address.data';\nimport { ICheckoutBillingAddressProps } from './checkout-billing-address.props.autogenerated';\nimport { ErrorComponent } from '../../common';\nimport { focusOnCheckoutError } from '../../checkout-errors/checkout-errors';\n\n/**\n * Props interface.\n */\nexport interface IProps extends ICheckoutBillingAddressProps<ICheckoutBillingAddressData>, IModuleStateProps {}\n\n/**\n * Checkout billing address view state interface.\n */\nexport interface ICheckoutBillingAddressViewState {\n isShowAddress: boolean;\n isShowAddOrUpdateAddress: boolean;\n isShowSameAsShippingCheckbox: boolean;\n errorMessage?: string;\n}\n\n/**\n * Checkout billing address view props interface.\n */\nexport interface ICheckoutBillingAddressViewProps extends IProps {\n className: string;\n currentOperation: AddressOperation;\n selectedAddress?: Address;\n addUpdateAddress: Address;\n countryRegionId: string;\n stateProvinceInfo?: StateProvinceInfo[];\n validationError: object;\n addressActionResponse?: IAddressResponse;\n viewState: ICheckoutBillingAddressViewState;\n CheckoutBillingAddress: IModuleProps;\n sameAsShippingCheckbox: React.ReactNode;\n heading: React.ReactNode;\n showAddress: IAddressShowProps;\n showAddOrUpdateAddress: IAddressAddUpdateProps;\n alert?: React.ReactNode;\n checkoutErrorRef?: React.RefObject<HTMLElement>;\n}\n\n/**\n *\n * CheckoutBillingAddress component.\n * @extends {React.PureComponent<ICheckoutBillingAddressProps<ICheckoutBillingAddressData>>}\n */\n// @ts-expect-error\n@withModuleState\n@observer\nclass CheckoutBillingAddress extends React.Component<IProps, ICheckoutBillingAddressViewState> {\n @observable private currentOperation: AddressOperation;\n\n @observable private isBillingAddressSameAsShipping: boolean;\n\n @observable private selectedAddress?: Address;\n\n @observable private addUpdateAddress: Address;\n\n @observable private countryRegionId: string = 'USA';\n\n @observable private stateProvinceInfo?: StateProvinceInfo[];\n\n @observable private validationError: object;\n\n @observable private readonly addressActionResponse?: IAddressResponse;\n\n private readonly addressCommon: AddressCommon;\n\n private addressFormat: AddressFormat;\n\n private countryRegions: CountryRegionInfo[] = [];\n\n private addressPurposes: AddressPurpose[] = [];\n\n private readonly resources: IAddressResource;\n\n private readonly defaultAddressType: number = 6; // Default to Home\n\n // private addRenderRef: React.RefObject<AddressAdd>;\n private readonly telemetryContent?: ITelemetryContent;\n\n private autoSuggest?: AutoSuggest;\n\n private readonly checkoutErrorRef: React.RefObject<HTMLElement> = React.createRef();\n\n public constructor(props: IProps) {\n super(props);\n const { context, data, resources, telemetry } = this.props;\n\n this.addUpdateAddress = {};\n this.validationError = {};\n this.isBillingAddressSameAsShipping = false;\n this.resources = resources;\n this.currentOperation = AddressOperation.List;\n this.addressPurposes = data.addressPurposes.result || [];\n this.countryRegions = data.countryRegions.result || [];\n this.stateProvinceInfo = data.countryStates.result || [];\n this.addressCommon = new AddressCommon(context, resources, telemetry);\n this.addressFormat = new AddressFormat(\n this.countryRegions,\n new AddressMetaData({ ...resources }, this._getAddressFormatExcludeList()),\n this.addressPurposes\n );\n this.telemetryContent = getTelemetryObject(\n this.props.context.request.telemetryPageName!,\n this.props.friendlyName,\n this.props.telemetry\n );\n\n this.state = {\n isShowAddress: false,\n isShowAddOrUpdateAddress: false,\n isShowSameAsShippingCheckbox: false,\n errorMessage: ''\n };\n\n // This.addRenderRef = React.createRef();\n }\n\n public async componentDidMount(): Promise<void> {\n const {\n context: {\n telemetry,\n actionContext: {\n requestContext: { channel }\n }\n },\n config: { autoSuggestionEnabled, autoSuggestOptions }\n } = this.props;\n\n // Initializing data props\n this._dataInitialize(this.props);\n\n this.props.data.checkout.then(() => {\n this._setDefaultCountryRegionId();\n this._initModuleState();\n });\n\n reaction(\n () => this.countryRegionId,\n () => {\n this._getStateProvinces();\n }\n );\n\n reaction(\n () => this.currentOperation,\n () => {\n this._getStateProvinces();\n }\n );\n\n reaction(\n () => this.props.data.checkout.result && this.props.data.checkout.result.shippingAddress,\n shippingAddress => {\n if (this.props.moduleState.isUpdating) {\n if (shippingAddress && this.isBillingAddressSameAsShipping) {\n this.isBillingAddressSameAsShipping = true;\n this._updateCurrentOperation(AddressOperation.Show, shippingAddress);\n } else if (shippingAddress && this.isBillingAddressSameAsShipping) {\n this._updateCurrentOperation(AddressOperation.Show, shippingAddress);\n }\n }\n }\n );\n\n reaction(\n () => this.isBillingAddressRequried,\n isBillingAddressRequried => {\n if (isBillingAddressRequried) {\n if (this.props.moduleState.isDisabled) {\n this.onEdit();\n }\n } else {\n this.props.data.checkout.result?.removeBillingAddress({});\n this.props.moduleState.onDisable();\n }\n }\n );\n\n if (autoSuggestionEnabled) {\n if (channel && !channel.BingMapsApiKey) {\n telemetry.error('BingMapsApiKey is missing.');\n return;\n }\n\n if (channel && !channel.BingMapsEnabled) {\n telemetry.error('Map is disabled from HQ.');\n return;\n }\n\n const options: IAutoSuggestOptions = { ...autoSuggestOptions };\n this.autoSuggest = new AutoSuggest(\n telemetry,\n options,\n channel?.BingMapsApiKey,\n channel?.ChannelCountryRegionISOCode,\n channel?.DefaultLanguageId\n );\n\n // Customer doesn't have any address. Then add view will be loaded directly. Code for the same to handle that\n if (\n this.props.data.storeSelectorStateManager.result &&\n (this.currentOperation === AddressOperation.Add || this.currentOperation === AddressOperation.Update)\n ) {\n await this.autoSuggest._loadMapAPI(await this.props.data.storeSelectorStateManager);\n }\n\n reaction(\n () =>\n this.props.data.storeSelectorStateManager.result?.loadMapApi &&\n (this.currentOperation === AddressOperation.Add || this.currentOperation === AddressOperation.Update),\n async () => {\n await this.autoSuggest?._loadMapAPI(await this.props.data.storeSelectorStateManager);\n }\n );\n\n reaction(\n () => this.props.data.storeSelectorStateManager.result?.isMapApiLoaded,\n async () => {\n await this._attachMapAutoSuggest();\n }\n );\n }\n\n if (this.props.data.checkout.result?.shouldEnableCheckoutErrorDisplayMessaging) {\n reaction(\n () => this.props.data.checkout.result?.checkoutError,\n checkoutError => {\n if (\n checkoutError &&\n checkoutError.errorLocation === ErrorLocation.CheckoutBillingAddress &&\n checkoutError.errorMessage\n ) {\n this._setErrorMessage(checkoutError.errorMessage);\n }\n }\n );\n\n reaction(\n () => this.props.data.checkout.result?.checkoutErrorFocus,\n checkoutErrorFocus => {\n if (checkoutErrorFocus === CheckoutModule.CheckoutBillingAddress) {\n focusOnCheckoutError(this.checkoutErrorRef, this.props.context.actionContext);\n }\n }\n );\n }\n }\n\n public async componentDidUpdate(): Promise<void> {\n if (this.currentOperation === AddressOperation.Add || this.currentOperation === AddressOperation.Update) {\n if (this.props.data.storeSelectorStateManager.result?.isMapApiLoaded) {\n await this._attachMapAutoSuggest();\n }\n } else {\n this.autoSuggest?.disposeAutoSuggest();\n }\n }\n\n public shouldComponentUpdate(\n nextProps: ICheckoutBillingAddressProps<ICheckoutBillingAddressData>,\n nextState: ICheckoutBillingAddressViewState\n ): boolean {\n if (this.state === nextState && this.props.data === nextProps.data) {\n return false;\n }\n return true;\n }\n\n public render(): JSX.Element | null {\n if (!this.isBillingAddressRequried || this._shouldHideBillingAddressForOBO) {\n return null;\n }\n\n const {\n resources,\n moduleState: { hasError }\n } = this.props;\n\n const { renderView, config } = this.props;\n\n const errorMessage = this.state.errorMessage;\n\n const viewProps = {\n ...this.props,\n currentOperation: this.currentOperation,\n selectedAddress: this.selectedAddress,\n addUpdateAddress: this.addUpdateAddress,\n countryRegionId: this.countryRegionId,\n stateProvinceInfo: this.stateProvinceInfo,\n validationError: this.validationError,\n addressActionResponse: this.addressActionResponse,\n className: config.className,\n viewState: {\n isShowAddress: this.selectedAddress && this.currentOperation === AddressOperation.Show,\n isShowAddOrUpdateAddress: this.currentOperation !== AddressOperation.Show,\n isShowSameAsShippingCheckbox: this.isCartContainsItemsForShipping && this.props.moduleState.isUpdating\n },\n CheckoutBillingAddress: {\n moduleProps: this.props,\n className: classnames('ms-checkout-billing-address', config.className)\n },\n heading: <AddressBillingHeading {...{ text: resources.addressBillingAddressHeading }} />,\n alert: hasError && errorMessage && <ErrorComponent {...{ title: resources.errorMessageTitle, message: errorMessage }} />,\n checkoutErrorRef: this.checkoutErrorRef,\n\n sameAsShippingCheckbox: (\n <AddressBillingCheckbox\n {...{\n isChecked: this.isBillingAddressSameAsShipping,\n type: 'checkbox',\n value: 'true',\n ariaLabel: resources.addressSameAsShippingAddressAriaLabel,\n text: resources.addressSameAsShippingAddressText,\n telemetryContent: this.telemetryContent,\n onChange: this._onBillingAddressSameAsShippingChange\n }}\n />\n ),\n showAddress: this._renderShowAddress(),\n showAddOrUpdateAddress: this._renderAddOrUpdateAddress()\n };\n\n return renderView(viewProps) as React.ReactElement;\n }\n\n /**\n * On suggestion selected.\n * @param result - The suggestion result.\n */\n @action\n private readonly _onSuggestionSelected = async (result: Microsoft.Maps.ISuggestionResult): Promise<void> => {\n this._clearAddressFields();\n const address = this.addressFormat.getTranformedAddress(result, this.stateProvinceInfo);\n set(this.addUpdateAddress, { Street: '' });\n set(this.addUpdateAddress, { ZipCode: address.ZipCode });\n set(this.addUpdateAddress, { CountyName: address.CountyName });\n set(this.addUpdateAddress, { City: address.City });\n set(this.addUpdateAddress, { State: address.State });\n set(this.addUpdateAddress, { DistrictName: address.DistrictName });\n set(this.addUpdateAddress, { FullAddress: address.FullAddress });\n\n // Bing autosuggest put the complete address in the Street input box. Updating the street input box to show only street address.\n setTimeout(() => {\n set(this.addUpdateAddress, { Street: address.Street });\n }, 0);\n };\n\n /**\n * Clear address fields.\n */\n @action\n private readonly _clearAddressFields = (): void => {\n const addressFormatItem = this.addressFormat.getAddressFormat(\n this.addUpdateAddress.ThreeLetterISORegionName || this.countryRegionId\n );\n addressFormatItem.forEach(format => {\n if (this.addUpdateAddress[format.name] !== undefined && !this.autoSuggest?.excludedAddressFields.includes(format.name)) {\n this.addressFormat[format.name] = '';\n }\n });\n this._clearValidation();\n };\n\n /**\n * Clear validation.\n */\n @action\n private readonly _clearValidation = (): void => {\n this.validationError = {};\n };\n\n /**\n * On address update.\n * @param name - Name.\n * @param value - Value.\n */\n private readonly onAddressAddUpdate = (name: string, value: string) => {\n set(this.addUpdateAddress, { [name]: value });\n this.addressFormat.validateAddressFormat(this.addUpdateAddress, this.validationError, this.countryRegionId, name);\n };\n\n /**\n * Method data initialization.\n * @param props -The checkout address properties.\n */\n private readonly _dataInitialize = (props: IProps): void => {\n const { data } = props;\n\n reaction(\n () => data.countryRegions.result,\n () => {\n this.countryRegions = data.countryRegions.result ?? [];\n }\n );\n\n reaction(\n () => data.addressPurposes.result,\n () => {\n this.addressPurposes = data.addressPurposes.result ?? [];\n }\n );\n\n reaction(\n () => data.countryStates.result,\n () => {\n this.stateProvinceInfo = data.countryStates.result ?? [];\n }\n );\n };\n\n /**\n * Render add or update address function.\n * @returns - Address add update props.\n */\n private readonly _renderAddOrUpdateAddress = (): IAddressAddUpdateProps => {\n return AddressAddUpdate({\n resources: this.resources,\n addressType: AddressType.Billing,\n addressFormat: this.addressFormat.getAddressFormat(this.addUpdateAddress.ThreeLetterISORegionName ?? this.countryRegionId),\n defaultCountryRegionId: this.countryRegionId,\n defaultAddressType: this.defaultAddressType,\n selectedAddress: this.addUpdateAddress,\n validationError: this.validationError,\n addressActionResponse: this.addressActionResponse,\n dropdownDisplayData: this.addressFormat.getPrefilledAddressDropdownData(\n this.resources.addressStateDefaultSelectionText,\n this.stateProvinceInfo\n ),\n telemetryContent: this.telemetryContent,\n onInputChange: this._onAddressAddUpdateInputChange,\n onDropdownChange: this._onAddressAddUpdateDropdownChange,\n hasExternalSubmitGroup: this.props.moduleState.hasExternalSubmitGroup,\n onSave: this._onSubmitAddress,\n onCancel: this._resetView\n });\n };\n\n private _renderShowAddress(): IAddressShowProps | null {\n if (this.selectedAddress) {\n return AddressShow({\n address: this.selectedAddress,\n addressFormat: this.addressFormat.getAddressFormat(this.selectedAddress.ThreeLetterISORegionName ?? ''),\n addressPurposes: this.addressPurposes\n });\n }\n\n return null;\n }\n\n /**\n * On country region change function.\n * @param countryRegionId - Country region Id.\n */\n private readonly _onCountryChange = (countryRegionId: string) => {\n this.countryRegionId = countryRegionId;\n const twoLetterIsoRegionName = this.addressFormat.getTwoLetterISORegionName(countryRegionId);\n set(this.addUpdateAddress, { ThreeLetterISORegionName: countryRegionId });\n set(this.addUpdateAddress, { TwoLetterISORegionName: twoLetterIsoRegionName });\n this.autoSuggest?.changeAutoSuggestionCountryCode(twoLetterIsoRegionName);\n this._clearAddressFields();\n };\n\n /**\n * Gets address format for exclude list.\n * @returns - Address item type.\n */\n private readonly _getAddressFormatExcludeList = (): AddressItemType[] => {\n const { config } = this.props;\n const addressFormatExcludeList: AddressItemType[] = [];\n\n if (!config.showAddressType) {\n addressFormatExcludeList.push(AddressItemType.AddressTypeValue);\n }\n\n addressFormatExcludeList.push(AddressItemType.IsPrimary);\n\n return addressFormatExcludeList;\n };\n\n /**\n * Attach map auto suggest.\n */\n private readonly _attachMapAutoSuggest = async (): Promise<void> => {\n const {\n data: {\n storeSelectorStateManager: { result: storeSelectorStateManager }\n }\n } = this.props;\n\n if (storeSelectorStateManager?.isMapApiLoaded) {\n this.autoSuggest?.attachAutoSuggest('#billing_addressstreet', '#billing_addressstreet_container', this._onSuggestionSelected);\n }\n };\n\n /**\n * On address add update input change.\n * @param event - The event.\n */\n private readonly _onAddressAddUpdateInputChange = (event: React.ChangeEvent<HTMLInputElement>): void => {\n const value = (event.target.value || '').replace(new RegExp('[<>]', 'gi'), '');\n this.onAddressAddUpdate(event.target.name, value);\n };\n\n /**\n * On address add update dropdown change.\n * @param event - The event.\n */\n private readonly _onAddressAddUpdateDropdownChange = (event: React.ChangeEvent<HTMLSelectElement>): void => {\n this.onAddressAddUpdate(event.target.name, event.target.value);\n\n if (event.target.name === AddressItemType[AddressItemType.ThreeLetterISORegionName]) {\n this._onCountryChange(event.target.value);\n }\n };\n\n /**\n * Gets state provinces.\n */\n private readonly _getStateProvinces = (): void => {\n if (\n !this.countryRegionId ||\n !(this.currentOperation === AddressOperation.Add || this.currentOperation === AddressOperation.Update)\n ) {\n return;\n }\n\n this.addressCommon.getStateProvinces(this.countryRegionId).then((result: StateProvinceInfo[]) => {\n const stateInfo = result.some(state => state.StateId === this.addUpdateAddress.State);\n\n // Reset state if selected state not found in the list.\n if (!stateInfo) {\n set(this.addUpdateAddress, { State: '' });\n }\n this.stateProvinceInfo = result;\n });\n };\n\n /**\n * Initialize module state.\n */\n private readonly _initModuleState = (): void => {\n this.props.moduleState.init({\n status: this.isBillingAddressRequried ? 'updating' : 'disabled',\n onEdit: this.onEdit,\n onCancel: this.onCancel,\n onSubmit: this.onSubmit\n });\n\n const { billingAddress, isBillingAddressSameAsShippingAddress } = this.props.data.checkout.result ?? {};\n\n if (this.isBillingAddressRequried) {\n if (billingAddress) {\n this.isBillingAddressSameAsShipping = isBillingAddressSameAsShippingAddress ?? false;\n this._updateCurrentOperation(AddressOperation.Show, billingAddress);\n this._updateModuleState();\n } else if (this.isCartContainsItemsForShipping) {\n this.isBillingAddressSameAsShipping = true;\n this._updateCurrentOperation(AddressOperation.Show, this.shippingAddress);\n } else {\n this.isBillingAddressSameAsShipping = false;\n this._updateCurrentOperation(AddressOperation.Add);\n }\n }\n };\n\n /**\n * Sets default country region Id.\n */\n private _setDefaultCountryRegionId(): void {\n const { request } = this.props.context;\n const market = request.channel?.ChannelCountryRegionISOCode;\n\n this.countryRegionId = this.addressCommon.getDefaultCountryRegionId(this.countryRegionId, this.countryRegions, market);\n }\n\n /**\n * On change - Billing address same as shipping.\n * @param event - The event.\n */\n private readonly _onBillingAddressSameAsShippingChange = (event: React.ChangeEvent<HTMLInputElement>) => {\n this.isBillingAddressSameAsShipping = event.currentTarget.checked;\n\n if (this.isBillingAddressSameAsShipping && this.shippingAddress) {\n this._updateCurrentOperation(AddressOperation.Show, this.shippingAddress);\n } else {\n this._updateCurrentOperation(AddressOperation.Add, this.billingAddress);\n }\n };\n\n @computed private get isCartContainsItemsForShipping(): boolean {\n const { request } = this.props.context;\n const multiplePickupStoreSwitchName = 'Dynamics.AX.Application.RetailMultiplePickupDeliveryModeFeature';\n const { channelDeliveryOptionConfig, featureState } = this.props.data;\n const retailMultiplePickUpOptionEnabled = featureState.result?.find(feature => feature.Name === multiplePickupStoreSwitchName)\n ?.IsEnabled;\n\n const pickupDeliveryModeCode = request.channel?.PickupDeliveryModeCode;\n const emailDeliveryModeCode = request.channel?.EmailDeliveryModeCode;\n\n // If hasInvoiceLine is true, there are only invoices no items in cart and return false here\n return this.props.data.checkout.result?.checkoutCart.hasInvoiceLine\n ? false\n : retailMultiplePickUpOptionEnabled\n ? ((this.props.data.checkout.result && this.props.data.checkout.result.checkoutCart.cart.CartLines) || []).some(cartLine =>\n cartLine.DeliveryMode && cartLine.DeliveryMode !== ''\n ? cartLine.DeliveryMode !==\n channelDeliveryOptionConfig.result?.PickupDeliveryModeCodes?.find(\n deliveryMode => deliveryMode === cartLine.DeliveryMode\n ) && cartLine.DeliveryMode !== emailDeliveryModeCode\n : cartLine\n )\n : ((this.props.data.checkout.result && this.props.data.checkout.result.checkoutCart.cart.CartLines) || []).some(cartLine =>\n cartLine.DeliveryMode && cartLine.DeliveryMode !== ''\n ? cartLine.DeliveryMode !== pickupDeliveryModeCode && cartLine.DeliveryMode !== emailDeliveryModeCode\n : cartLine\n );\n }\n\n @computed private get billingAddress(): Address | undefined {\n return this.props.data.checkout.result?.billingAddress;\n }\n\n @computed private get shippingAddress(): Address | undefined {\n return this.props.data.checkout.result?.shippingAddress;\n }\n\n @computed private get getLoyaltyAmount(): number {\n const checkoutState = this.props.data.checkout.result;\n return checkoutState?.loyaltyAmount ? checkoutState.loyaltyAmount : 0;\n }\n\n @computed private get getGiftCardTotalAmount(): number {\n const checkoutState = this.props.data.checkout.result;\n if (!checkoutState || !checkoutState.giftCardExtends) {\n return 0;\n }\n return checkoutState.giftCardExtends.reduce((count: number, giftCard: IGiftCardExtend) => {\n return count + (giftCard.Balance || 0);\n }, 0);\n }\n\n @computed private get getCustomerAccountAmount(): number {\n const checkoutState = this.props.data.checkout.result;\n const defaultAmount = 0;\n\n return checkoutState?.customerAccountAmount ?? defaultAmount;\n }\n\n @computed private get shouldPaidByCard(): boolean {\n const {\n data: { checkout },\n config\n } = this.props;\n if (!checkout.result) {\n return false;\n }\n\n const checkoutResult = checkout.result;\n const cart = checkoutResult.checkoutCart.cart;\n if (!cart || !cart.CartLines || cart.CartLines.length === 0) {\n return false;\n }\n\n const { paymentTenderType, tokenizedPaymentCard } = checkoutResult;\n const isPaidByOtherPaymentSource = config.paymenTenderType !== paymentTenderType && tokenizedPaymentCard;\n\n // Use payment card when it is not free or gift card balance + Loyalty amount can not cover the total amount\n const amountDue = (cart.TotalAmount || 0) - this.getGiftCardTotalAmount - this.getLoyaltyAmount - this.getCustomerAccountAmount;\n\n return amountDue > 0 && !isPaidByOtherPaymentSource;\n }\n\n @computed private get isBillingAddressRequried(): boolean {\n return (\n this.shouldPaidByCard &&\n (!this.props.data.checkout?.result?.isPaymentVerificationRedirection ||\n !!this.props.data.checkout?.result?.isCheckoutCallFailed)\n );\n }\n\n @computed private get _shouldHideBillingAddressForOBO(): boolean {\n return Msdyn365.isOboRequest(this.props.context.request) && EnabledPaymentsForOBO.PaymentInstrument === 0;\n }\n\n /**\n * On submit address.\n */\n private readonly _onSubmitAddress = (): void => {\n if (!this.addressFormat.validateAddressFormat(this.addUpdateAddress, this.validationError, this.countryRegionId)) {\n this.props.moduleState.setHasError(true);\n\n if (\n this.props.data.checkout.result?.shouldEnableSinglePaymentAuthorizationCheckout &&\n this.props.data.checkout.result?.isPaymentSectionContainerHasError\n ) {\n this.props.data.checkout.result.updateIsBillingAddressHasError({ newIsBillingAddressHasError: true });\n }\n\n return;\n }\n\n this._setBillingAddress(this.addUpdateAddress);\n this._updateCurrentOperation(AddressOperation.Show, this.addUpdateAddress);\n this._updateModuleState();\n };\n\n /**\n * On submit.\n */\n private readonly onSubmit = (): void => {\n switch (this.currentOperation) {\n case AddressOperation.Add:\n case AddressOperation.Update:\n this.props.telemetry.information('Billing address submit for Add or Update operation.');\n this._onSubmitAddress();\n break;\n case AddressOperation.Show:\n this.props.telemetry.information('Billing address submit for Show operation.');\n if (this.selectedAddress) {\n this._setBillingAddress(this.selectedAddress);\n this._updateCurrentOperation(AddressOperation.Show, this.selectedAddress);\n this._updateModuleState();\n }\n break;\n default:\n this.props.telemetry.error('Invalid operation');\n }\n };\n\n /**\n * On cancel.\n */\n private readonly onCancel = (): void => {\n switch (this.currentOperation) {\n case AddressOperation.Add:\n case AddressOperation.Update:\n this.props.telemetry.information('Billing address cancel for Add or Update operation.');\n this._resetView();\n this._clearAddressFields();\n break;\n case AddressOperation.Show:\n this.props.telemetry.information('Billing address cancel for Show operation.');\n this._resetView();\n break;\n default:\n this.props.telemetry.error('Invalid operation');\n }\n };\n\n /**\n * On edit.\n */\n private readonly onEdit = (): void => {\n this.props.telemetry.information('Billing address onEdit is called.');\n\n if (this.isBillingAddressSameAsShipping && this.shippingAddress && this.isCartContainsItemsForShipping) {\n this._updateCurrentOperation(AddressOperation.Show, this.shippingAddress);\n } else {\n this._updateCurrentOperation(AddressOperation.Add, this.billingAddress);\n }\n this.props.moduleState.onUpdating();\n };\n\n /**\n * Sets billing address.\n * @param address - The address.\n */\n private readonly _setBillingAddress = (address: Address): void => {\n if (this.props.data.checkout.result) {\n const newBillingAddress = { ...address };\n\n if (address.ThreeLetterISORegionName && !newBillingAddress.TwoLetterISORegionName) {\n newBillingAddress.TwoLetterISORegionName = this.addressFormat.getTwoLetterISORegionName(address.ThreeLetterISORegionName);\n }\n\n this.props.data.checkout.result.updateBillingAddress({\n newBillingAddress,\n additionalProperties: {\n isBillingAddressSameAsShippingAddress: this.isBillingAddressSameAsShipping\n }\n });\n }\n };\n\n /**\n * Reset view.\n */\n private readonly _resetView = () => {\n this._updateCurrentOperation(AddressOperation.Show, this.billingAddress);\n this._updateModuleState();\n };\n\n /**\n * Update current operation.\n * @param operation - Address operation\n * @param selectedAddress - The selected address.\n */\n private readonly _updateCurrentOperation = (operation: AddressOperation, selectedAddress?: Address) => {\n this.currentOperation = operation;\n this.selectedAddress = selectedAddress;\n\n if (this.currentOperation === AddressOperation.Add || this.currentOperation === AddressOperation.Update) {\n this.addUpdateAddress = { ...this.selectedAddress } || {};\n set(this.addUpdateAddress, {\n ThreeLetterISORegionName: this.addUpdateAddress.ThreeLetterISORegionName || this.countryRegionId\n });\n set(this.addUpdateAddress, { AddressTypeValue: this.addUpdateAddress.AddressTypeValue || this.defaultAddressType });\n }\n };\n\n /**\n * Updates the module state.\n */\n private readonly _updateModuleState = () => {\n if (this.currentOperation === AddressOperation.Show) {\n this.props.moduleState.onReady();\n } else {\n this.props.moduleState.onUpdating();\n }\n };\n\n @action\n private readonly _setErrorMessage = (errorMessage: string): void => {\n this.props.telemetry.error(errorMessage);\n this.props.moduleState.setHasError(true);\n this.props.moduleState.onUpdating();\n this.setState({\n errorMessage\n });\n };\n}\n\nexport default CheckoutBillingAddress;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IImageProps, IImageSettings, Image, IRequestContext } from '@msdyn365-commerce/core';\nimport { CartLine, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\nimport { ArrayExtensions } from '@msdyn365-commerce-modules/retail-actions';\nimport { format, isMobile, VariantType } from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport * as React from 'react';\n\nimport { ICheckoutShippingAddressResources } from '../checkout-shipping-address.props.autogenerated';\n\n/**\n * The cartline product interface.\n */\nexport interface ICartLineWithProduct {\n cartLine: CartLine;\n product?: SimpleProduct;\n}\n\n/**\n * The checkout shipping cartline interface.\n */\nexport interface ICheckoutShippingCartLineInfo {\n lineId: string;\n imageProps: IImageProps;\n quantity: number;\n shippingAddressId?: number;\n}\n\n/**\n * The checkout shipping cartline props.\n */\nexport interface ICheckoutShippingCartLinesProps {\n moduleClassName: string;\n cartLines: ICheckoutShippingCartLineInfo[];\n title: string;\n itemTitle: string;\n resources: ICheckoutShippingAddressResources;\n isMultipleAddressShippingEnabled?: boolean;\n}\n\n// eslint-disable-next-line @typescript-eslint/naming-convention -- Following as per module\nexport const CheckoutPickupCartLines: React.FC<ICheckoutShippingCartLinesProps> = ({\n moduleClassName,\n cartLines,\n title,\n itemTitle,\n resources,\n isMultipleAddressShippingEnabled = false\n}) => {\n const context = ({\n gridSettings: {\n xs: { w: 767 },\n sm: { w: 991 },\n md: { w: 1199 },\n lg: { w: 1599 },\n xl: { w: 1600 }\n }\n } as unknown) as IRequestContext;\n const isMobileCheck = isMobile({ variant: VariantType.Browser, context });\n const isMobileView = isMobileCheck === 'xs' || isMobileCheck === 'sm';\n\n if (!ArrayExtensions.hasElements(cartLines)) {\n return null;\n }\n\n const renderShipMultiAddressView = isMultipleAddressShippingEnabled;\n const quantity = 1;\n return renderShipMultiAddressView ? (\n <div className={`${moduleClassName}__group-multi-address`}>{resources.headingAfterMultiSelectAddressSelect}</div>\n ) : (\n <div className={`${moduleClassName}__group-images`}>\n <div className={`${moduleClassName}__group-images-header`}>\n <div className={`${moduleClassName}__group-images-header-main`}>{title}</div>\n <div className={`${moduleClassName}__group-images-header-item`}>{itemTitle}</div>\n </div>\n <div className={`${moduleClassName}__group-images-lines`}>\n {cartLines.map((cartLine: ICheckoutShippingCartLineInfo) => {\n const isShowQty = cartLine.quantity > quantity;\n let className = `${moduleClassName}__group-images-lines-product`;\n const role = 'text';\n if (isShowQty) {\n className = classnames(className, ' product-image-wide');\n }\n return (\n <div className={className} key={cartLine.lineId}>\n <Image {...cartLine.imageProps} />\n {isMobileView\n ? isShowQty && (\n <div\n role={role}\n aria-label={format(resources.productQuantityInfo, cartLine.quantity, cartLine.imageProps.altText)}\n className={`${moduleClassName}__group-images-lines-line-quantity`}\n >\n {cartLine.quantity}\n </div>\n )\n : isShowQty && (\n <div\n aria-labelledby={cartLine.lineId}\n aria-hidden='true'\n className={`${moduleClassName}__group-images-lines-line-quantity`}\n >\n {cartLine.quantity}\n </div>\n )}\n {!isMobileView && isShowQty && (\n <span id={cartLine.lineId} className='msc-line__quantity sr-only'>\n {format(resources.productQuantityInfo, cartLine.quantity, cartLine.imageProps.altText)}\n </span>\n )}\n </div>\n );\n })}\n </div>\n </div>\n );\n};\n\n/**\n * The checkout shipping cartline image settings.\n */\nexport const defaultImageSettings: IImageSettings = {\n viewports: {\n xs: { q: 'w=108&h=108&q=80&m=6&f=jpg', w: 108, h: 108 },\n lg: { q: 'w=108&h=108&q=80&m=6&f=jpg', w: 108, h: 108 },\n xl: { q: 'w=108&h=108&q=80&m=6&f=jpg', w: 108, h: 108 }\n },\n lazyload: true,\n quality: 80\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\n/// <reference types=\"bingmaps\" />\n\nimport {\n Address,\n AddressPurpose,\n CartLine,\n CountryRegionInfo,\n SimpleProduct,\n StateProvinceInfo,\n TenderLine,\n TokenizedPaymentCard\n} from '@msdyn365-commerce/retail-proxy';\nimport MsDyn365 from '@msdyn365-commerce/core';\nimport { IModuleStateProps, withModuleState } from '@msdyn365-commerce-modules/checkout-utilities';\nimport {\n ArrayExtensions,\n getFallbackImageUrl,\n getSimpleProducts,\n ObjectExtensions,\n ProductInput\n} from '@msdyn365-commerce-modules/retail-actions';\nimport { format, getTelemetryObject, IModuleProps, INodeProps, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport { action, computed, observable, reaction, set } from 'mobx';\nimport { observer } from 'mobx-react';\nimport get from 'lodash/get';\nimport * as React from 'react';\n\nimport { CheckoutModule, ErrorLocation } from '@msdyn365-commerce/global-state';\nimport { AutoSuggest } from '../../common/address-autosuggest';\nimport { IAutoSuggestOptions } from '../../common/address-autosuggest.data';\nimport { AddressCommon } from '../../common/address-common';\nimport { AddressFormat } from '../../common/address-format';\nimport { AddressItemType } from '../../common/address-format.data';\nimport { AddressMetaData } from '../../common/address-meta-data';\nimport { AddressOperation, AddressType, IAddressResource, IAddressResponse } from '../../common/address-module.data';\nimport { AddressAddUpdate, IAddressAddUpdateProps } from '../../common/components/address-add';\nimport { AddressSelect, IAddressSelectProps } from '../../common/components/address-select';\nimport { AddressShow, IAddressShowProps } from '../../common/components/address-show';\nimport { ICheckoutShippingAddressData } from './checkout-shipping-address.data';\nimport { ICheckoutShippingAddressProps } from './checkout-shipping-address.props.autogenerated';\nimport {\n CheckoutPickupCartLines,\n defaultImageSettings,\n ICartLineWithProduct,\n ICheckoutShippingCartLineInfo,\n ICheckoutShippingCartLinesProps\n} from './components/checkout-shipping-cartlines-images';\nimport { ErrorComponent } from '../../common/components/address-error-alert';\nimport { focusOnCheckoutError } from '../../checkout-errors/checkout-errors';\nimport { AddressShipMultiple, IShipMultipleAddressesViewProps } from '../../common/components/address-ship-multiple';\nimport { IShipMultipleAddressesLineViewProps } from '../../common/components/address-ship-multiple-lines';\n\n/**\n * The checkout address props interface.\n */\nexport interface ICheckoutAddressProps extends ICheckoutShippingAddressProps<ICheckoutShippingAddressData>, IModuleStateProps {}\n\n/**\n * The checkout shipping address view state.\n */\nexport interface ICheckoutShippingAddressViewState {\n isShowAddress: boolean;\n isShowAddresList: boolean;\n isShowAddOrUpdateAddress: boolean;\n isShowShipMultipleAddress?: boolean;\n}\n\n/**\n * The checkout shipping address state.\n */\nexport interface ICheckoutAddresState {\n shippingGroups: ICartLineWithProduct[];\n shippingGroupsBuffer: ICartLineWithProduct[];\n selectedShippingLines: IShipMultipleAddressesLineViewModel[];\n errorMessage?: string;\n}\n\n/**\n * The checkout shipping address view props.\n */\nexport interface ICheckoutShippingAddressViewProps extends ICheckoutAddressProps {\n className: string;\n currentOperation: AddressOperation;\n selectedAddress?: Address;\n addUpdateAddress: Address;\n addressListSelectedAddress: Address;\n countryRegionId: string;\n stateProvinceInfo?: StateProvinceInfo[];\n customerAddresses: Address[];\n validationError: object;\n addressActionResponse?: IAddressResponse;\n viewState: ICheckoutShippingAddressViewState;\n CheckoutShippingAddress: IModuleProps;\n isUpdating: boolean;\n hasError: boolean;\n showAddress: IAddressShowProps;\n showAddOrUpdateAddress: IAddressAddUpdateProps;\n cartLineImages?: React.ReactNode;\n showAddressSelect: IAddressSelectProps;\n alert?: React.ReactNode;\n checkoutErrorRef?: React.RefObject<HTMLElement>;\n showShipMultipleAddresses?: IShipMultipleAddressesViewProps;\n ProductsTable?: INodeProps;\n ProductsTableRow?: INodeProps;\n ProductsTableHeading?: React.ReactNode;\n orderLines?: IShipMultipleAddressesLineViewProps[];\n showAddOrUpdateAddressHandler?(onSaveHandler?: () => void, onCancelHandler?: () => void): IAddressAddUpdateProps;\n showAddressSelectHandler?(\n onShipMultipleAddressesHandler?: () => void,\n onAddAddressHandler?: () => void,\n onSaveHandler?: () => void,\n onCancelHandler?: () => void\n ): IAddressSelectProps;\n}\n\nexport interface IShipMultipleAddressesLineViewModel {\n isChecked: boolean;\n cartLine: CartLine;\n}\n\n/**\n * IExpressPaymentDetail interface.\n */\ninterface IExpressPaymentDetails {\n email?: string;\n tenderLine?: TenderLine;\n tokenizedPaymentCard?: TokenizedPaymentCard;\n paymentTenderType?: string;\n address?: Address;\n isExpressCheckoutAppliedInCartPage: boolean;\n isExpressAddressAppliedInCartPage?: boolean;\n}\n\ntype GridSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl';\n\n/**\n *\n * Address component.\n * @extends {React.Component<ICheckoutShippingAddressProps<ICheckoutShippingAddressData>>}\n */\n// @ts-expect-error\n@withModuleState\n@observer\nclass CheckoutShippingAddress extends React.Component<ICheckoutAddressProps, ICheckoutAddresState> {\n @observable private currentOperation: AddressOperation;\n\n @observable private selectedAddress?: Address;\n\n @observable private addUpdateAddress: Address;\n\n @observable private countryRegionId: string = 'USA';\n\n @observable private stateProvinceInfo?: StateProvinceInfo[];\n\n @observable private customerAddresses: Address[] = [];\n\n @observable private validationError: object;\n\n @observable private addressActionResponse?: IAddressResponse;\n\n @observable private isUpdating?: boolean;\n\n @observable private hasError?: boolean;\n\n @observable private addressListSelectedAddress: Address = {};\n\n @observable\n private _viewport: GridSize;\n\n @computed get isMobile(): boolean {\n return this._viewport === 'xs' || this._viewport === 'sm';\n }\n\n private readonly addressCommon: AddressCommon;\n\n private addressFormat!: AddressFormat;\n\n private countryRegions: CountryRegionInfo[] = [];\n\n private addressPurposes: AddressPurpose[] = [];\n\n private readonly resources: IAddressResource;\n\n private readonly defaultAddressType: number = 6; // Default to Home\n\n private readonly telemetryContent?: ITelemetryContent;\n\n private autoSuggest?: AutoSuggest;\n\n private readonly multiplePickupStoreSwitchName: string = 'Dynamics.AX.Application.RetailMultiplePickupDeliveryModeFeature';\n\n private retailMultiplePickUpOptionEnabled?: boolean = false;\n\n private readonly checkoutErrorRef: React.RefObject<HTMLElement> = React.createRef();\n\n public constructor(props: ICheckoutAddressProps) {\n super(props);\n this._viewport =\n props.context.request && props.context.request.device && props.context.request.device.Type === 'Mobile' ? 'xs' : 'lg';\n this._updateViewport = this._updateViewport.bind(this);\n this.state = { shippingGroups: [], shippingGroupsBuffer: [], selectedShippingLines: [] };\n const { context, data, resources, telemetry } = this.props;\n\n this.addUpdateAddress = {};\n this.resources = resources;\n this.currentOperation = AddressOperation.List;\n this.countryRegions = data.countryRegions.result || [];\n this.addressPurposes = data.addressPurposes.result || [];\n this.customerAddresses = data.address.result || [];\n this.stateProvinceInfo = data.countryStates.result || [];\n this.addressCommon = new AddressCommon(context, resources, telemetry);\n this.addressFormat = new AddressFormat(\n this.countryRegions,\n new AddressMetaData({ ...resources }, this._getAddressFormatExcludeList()),\n this.addressPurposes\n );\n this.validationError = {};\n this.retailMultiplePickUpOptionEnabled = data.featureState.result?.find(\n feature => feature.Name === this.multiplePickupStoreSwitchName\n )?.IsEnabled;\n this.telemetryContent = getTelemetryObject(\n this.props.context.request.telemetryPageName!,\n this.props.friendlyName,\n this.props.telemetry\n );\n this._updateViewport();\n }\n\n public async componentDidMount(): Promise<void> {\n const {\n context: {\n telemetry,\n actionContext: {\n requestContext: { channel }\n }\n },\n config: { autoSuggestionEnabled, autoSuggestOptions },\n resources\n } = this.props;\n\n // Initializing data props\n this._dataInitialize(this.props);\n\n this.addressFormat = new AddressFormat(\n this.countryRegions,\n new AddressMetaData({ ...resources }, this._getAddressFormatExcludeList()),\n this.addressPurposes\n );\n\n this.props.data.checkout.then(() => {\n this._setDefaultCountryRegionId();\n this._initModuleState();\n });\n\n reaction(\n () => this.countryRegionId,\n () => {\n this._getStateProvinces();\n }\n );\n\n reaction(\n () => this.currentOperation,\n () => {\n this._getStateProvinces();\n }\n );\n\n reaction(\n () => this.props.data.checkout.result?.shippingAddressFromExpressCheckout,\n () => {\n if (!this.expressPaymentDetailsFromCartPage && this._canShip()) {\n let address = this.props.data.checkout.result?.shippingAddressFromExpressCheckout;\n\n if (address?.TwoLetterISORegionName) {\n const threeLetterIsoRegionName = this.getThreeLetterIsoRegionName(address.TwoLetterISORegionName);\n\n address = { ...address, ThreeLetterISORegionName: threeLetterIsoRegionName };\n\n if (threeLetterIsoRegionName && threeLetterIsoRegionName !== this.countryRegionId) {\n this._onCountryChange(threeLetterIsoRegionName);\n }\n }\n\n this._updateCurrentOperation(AddressOperation.Add, address);\n this._onAddressAddUpdateSubmit();\n }\n }\n );\n\n if (autoSuggestionEnabled) {\n if (channel && !channel.BingMapsApiKey) {\n telemetry.error('BingMapsApiKey is missing.');\n return;\n }\n\n if (channel && !channel.BingMapsEnabled) {\n telemetry.error('Map is disabled from HQ.');\n return;\n }\n\n const options: IAutoSuggestOptions = { ...autoSuggestOptions };\n this.autoSuggest = new AutoSuggest(\n telemetry,\n options,\n channel?.BingMapsApiKey,\n channel?.ChannelCountryRegionISOCode,\n channel?.DefaultLanguageId\n );\n\n // Customer doesn't have any address. Then add view will be loaded directly. Code for the same to handle that\n if (\n this.props.data.storeSelectorStateManager.result &&\n (this.currentOperation === AddressOperation.Add || this.currentOperation === AddressOperation.Update)\n ) {\n await this.autoSuggest._loadMapAPI(await this.props.data.storeSelectorStateManager);\n }\n\n reaction(\n () =>\n this.props.data.storeSelectorStateManager.result?.loadMapApi &&\n (this.currentOperation === AddressOperation.Add || this.currentOperation === AddressOperation.Update),\n async () => {\n await this.autoSuggest?._loadMapAPI(await this.props.data.storeSelectorStateManager);\n }\n );\n\n reaction(\n () => this.props.data.storeSelectorStateManager.result?.isMapApiLoaded,\n async () => {\n await this._attachMapAutoSuggest();\n }\n );\n }\n\n if (this.props.data.checkout.result?.shouldEnableCheckoutErrorDisplayMessaging) {\n reaction(\n () => this.props.data.checkout.result?.checkoutError,\n checkoutError => {\n if (\n checkoutError &&\n checkoutError.errorLocation === ErrorLocation.CheckoutShippingAddress &&\n checkoutError.errorMessage\n ) {\n this._setErrorMessage(checkoutError.errorMessage);\n }\n }\n );\n\n reaction(\n () => this.props.data.checkout.result?.checkoutErrorFocus,\n checkoutErrorFocus => {\n if (checkoutErrorFocus === CheckoutModule.CheckoutShippingAddress) {\n focusOnCheckoutError(this.checkoutErrorRef, this.props.context.actionContext);\n }\n }\n );\n }\n\n if (MsDyn365.isBrowser) {\n window.addEventListener('resize', this._updateViewport);\n this._updateViewport();\n }\n\n await this._initPickupGroup();\n }\n\n public async componentDidUpdate(): Promise<void> {\n if (this.currentOperation === AddressOperation.Add || this.currentOperation === AddressOperation.Update) {\n if (this.props.data.storeSelectorStateManager.result?.isMapApiLoaded) {\n await this._attachMapAutoSuggest();\n }\n } else {\n this.autoSuggest?.disposeAutoSuggest();\n }\n }\n\n public componentWillUnmount(): void {\n if (MsDyn365.isBrowser) {\n window.removeEventListener('resize', this._updateViewport);\n }\n }\n\n public shouldComponentUpdate(nextProps: ICheckoutAddressProps, nextState: ICheckoutAddresState): boolean {\n if (this.state === nextState && this.props.data === nextProps.data) {\n return false;\n }\n return true;\n }\n\n public render(): JSX.Element | null {\n if (!this._canShip()) {\n return null;\n }\n\n const {\n config,\n context,\n renderView,\n resources,\n moduleState: { hasError }\n } = this.props;\n const { headingImages, itemsText, singleItemText, errorMessageTitle } = resources;\n const { imageSettings } = config;\n\n // Line images\n const cartLines: ICheckoutShippingCartLineInfo[] = this.state.shippingGroups\n .filter(x => !ObjectExtensions.isNullOrUndefined(x.product))\n .map(line => ({\n lineId: line.cartLine.LineId ?? '',\n imageProps: {\n requestContext: context.actionContext.requestContext,\n className: 'ms-checkout-shipping-address__group-images-lines-line-image',\n altText: line.product?.Name,\n src: line.product?.PrimaryImageUrl ?? '',\n fallBackSrc: getFallbackImageUrl(\n line.product?.ItemId,\n context.actionContext.requestContext.apiSettings,\n context.request.app?.config?.OmniChannelMedia\n ),\n gridSettings: context.request.gridSettings!,\n imageSettings: imageSettings ?? defaultImageSettings,\n loadFailureBehavior: 'empty'\n },\n quantity: line.cartLine.Quantity ?? 0,\n shippingAddressId: line.cartLine.ShippingAddress?.RecordId ?? 0\n }));\n\n const numberOfCartLines = this._countItems(cartLines);\n const itemText = numberOfCartLines > 1 ? itemsText : singleItemText;\n const itemTitle = `(${format(itemText, numberOfCartLines)})`;\n\n const lineImageProps: ICheckoutShippingCartLinesProps = {\n moduleClassName: 'ms-checkout-shipping-address',\n cartLines: cartLines.filter(x => !ObjectExtensions.isNullOrUndefined(x)),\n itemTitle: itemTitle,\n title: headingImages,\n resources: this.props.resources,\n isMultipleAddressShippingEnabled: config.multipleAddressShippingEnabled\n };\n\n const cartLineImages: React.ReactNode = <CheckoutPickupCartLines {...lineImageProps} />;\n const multiplePickupStoreSwitchName = 'Dynamics.AX.Application.RetailMultiplePickupDeliveryModeFeature';\n const { featureState } = this.props.data;\n const isRetailMultiplePickUpOptionEnabled = featureState.result?.find(feature => feature.Name === multiplePickupStoreSwitchName)\n ?.IsEnabled;\n\n const errorMessage = this.state.errorMessage;\n\n const viewProps = {\n ...this.props,\n currentOperation: this.currentOperation,\n selectedAddress: this.selectedAddress,\n addUpdateAddress: this.addUpdateAddress,\n addressListSelectedAddress: this.addressListSelectedAddress,\n countryRegionId: this.countryRegionId,\n stateProvinceInfo: this.stateProvinceInfo,\n customerAddresses: this.customerAddresses,\n validationError: this.validationError,\n addressActionResponse: this.addressActionResponse,\n isUpdating: this.isUpdating,\n hasError: this.hasError,\n className: config.className,\n viewState: {\n isShowAddress: this.currentOperation === AddressOperation.Show && this.selectedAddress,\n isShowAddresList: this.currentOperation === AddressOperation.List && this.customerAddresses.length > 0,\n isShowAddOrUpdateAddress:\n this.currentOperation === AddressOperation.Add || this.currentOperation === AddressOperation.Update,\n isShowShipMultipleAddress: this.currentOperation === AddressOperation.Multiple\n },\n CheckoutShippingAddress: {\n moduleProps: this.props,\n className: classnames('ms-checkout-shipping-address', config.className)\n },\n showAddress: this._renderShowAddress(),\n alert: hasError && errorMessage && <ErrorComponent {...{ title: errorMessageTitle, message: errorMessage }} />,\n checkoutErrorRef: this.checkoutErrorRef,\n\n /**\n * Show address select.\n * @param onShipMultipleAddressesHandler - On ship to multiple addresses click function.\n * @param onAddAddressHandler - On add address click function.\n * @param onSaveHandler - On save click function.\n * @param onCancelHandler - On cancel click function.\n * @returns - Renders select address.\n */\n showAddressSelectHandler: (\n onShipMultipleAddressesHandler?: () => void,\n onAddAddressHandler?: () => void,\n onSaveHandler?: () => void,\n onCancelHandler?: () => void\n ) => this._renderSelectAddress(onShipMultipleAddressesHandler, onAddAddressHandler, onSaveHandler, onCancelHandler),\n\n /**\n * Show ship multiple addresses.\n * @param onSaveHandler - On save click function.\n * @param onCancelHandler - On cancel click function.\n * @returns - Renders ship multiple addresses.\n */\n showShipMultipleAddressesHandler: (onSaveHandler?: () => void, onCancelHandler?: () => void) =>\n this._renderShipMultipleAddresses(onSaveHandler, onCancelHandler),\n showShipMultipleAddresses: this._renderShipMultipleAddresses(),\n\n /**\n * Show add/update address.\n * @param onSaveHandler - On save click function.\n * @param onCancelHandler - On cancel click function.\n * @returns - Renders add/update address.\n */\n showAddOrUpdateAddressHandler: (onSaveHandler?: () => void, onCancelHandler?: () => void) =>\n this._renderAddOrUpdateAddress(onSaveHandler, onCancelHandler),\n showAddOrUpdateAddress: this._renderAddOrUpdateAddress(),\n cartLineImages: isRetailMultiplePickUpOptionEnabled ? cartLineImages : undefined,\n showAddressSelect: this._renderSelectAddress()\n };\n\n return renderView(viewProps) as React.ReactElement;\n }\n\n public onSelect = (line: IShipMultipleAddressesLineViewModel, isChecked: boolean): void => {\n line.isChecked = isChecked;\n\n if (this.state.selectedShippingLines) {\n const updated =\n this.state.selectedShippingLines.map(shippingLine => {\n // @ts-ignore\n if (shippingLine.cartLine?.cartLine?.LineId === line.cartLine.LineId) {\n shippingLine.isChecked = isChecked;\n }\n return shippingLine;\n }) || [];\n\n this.setState({\n selectedShippingLines: updated\n });\n } else {\n console.error(`Shipping lines are invalid.`);\n }\n };\n\n public onSelectAll(isChecked: boolean): void {\n if (this.state.selectedShippingLines) {\n const updated =\n this.state.selectedShippingLines.map(shippingLine => {\n shippingLine.isChecked = isChecked;\n return shippingLine;\n }) || [];\n\n this.setState({\n selectedShippingLines: updated\n });\n } else {\n console.error(`Shipping lines are undefined.`);\n }\n }\n\n public onShippingAddressChange = (shippingLine: CartLine, event: React.ChangeEvent<HTMLSelectElement>): void => {\n const addressRecordId = event.currentTarget.value;\n const selectedAddress = this.customerAddresses.find(address => (address.RecordId || '').toString() === addressRecordId);\n if (this.state.shippingGroups) {\n const updated = this.state.shippingGroups.map(line => {\n if (line.cartLine.LineId === shippingLine.LineId) {\n const updatedCartLine = {\n ...line.cartLine,\n ShippingAddress: selectedAddress\n };\n return {\n ...line,\n cartLine: updatedCartLine\n };\n }\n return line;\n });\n\n this.setState({\n shippingGroups: updated\n });\n }\n };\n\n public updateIndividualAddresses = (shippingLine: CartLine, event: React.ChangeEvent<HTMLSelectElement>): void => {\n const addressRecordId = event.currentTarget.value;\n const selectedAddress = this.customerAddresses.find(address => (address.RecordId || '').toString() === addressRecordId);\n if (this.state.shippingGroups) {\n this.setState(prevState => {\n const updated = prevState.shippingGroups.map(line => {\n if (line.cartLine.LineId === shippingLine.LineId) {\n const updatedCartLine = {\n ...line.cartLine,\n ShippingAddress: selectedAddress\n };\n return {\n ...line,\n cartLine: updatedCartLine\n };\n }\n return line;\n });\n\n return {\n shippingGroups: updated\n };\n });\n }\n };\n\n public onBulkShippingAddressChange = (event: React.ChangeEvent<HTMLSelectElement>): void => {\n if (this.state.selectedShippingLines && this.state.shippingGroups) {\n this.state.selectedShippingLines.forEach((shippingLine, index) => {\n if (shippingLine.isChecked) {\n const cartline = this.state.shippingGroups.find(\n // @ts-ignore\n line => line.cartLine.LineId === shippingLine.cartLine?.cartLine?.LineId\n );\n\n if (cartline) {\n this.updateIndividualAddresses(cartline.cartLine, event);\n }\n }\n });\n } else {\n console.error(`Shipping lines are undefined.`);\n }\n };\n\n /**\n * Initialize pickup group.\n */\n @action\n private readonly _initPickupGroup = async (): Promise<void> => {\n const pickupCartLines: CartLine[] = this._getCartLinesforDelivery();\n const cartLines: ICartLineWithProduct[] = [];\n\n try {\n const products = await this._getProductsByCartLines(\n this.props.data.checkout.result?.checkoutCart.cart.ChannelId || 0,\n pickupCartLines\n );\n for (const line of pickupCartLines) {\n const product: SimpleProduct | undefined = products.find(x => x.RecordId === line.ProductId);\n cartLines.push({ cartLine: line, product });\n }\n this.setState({ shippingGroups: cartLines });\n this.setState({ shippingGroupsBuffer: cartLines });\n\n const initialShippingLineSelection = cartLines.map(cartLine => ({\n isChecked: false,\n cartLine: cartLine as CartLine\n }));\n this.setState({ selectedShippingLines: initialShippingLineSelection });\n } catch (error) {\n // @ts-ignore\n this.props.telemetry.error(error);\n this.setState({ shippingGroups: [] });\n this.setState({ shippingGroupsBuffer: [] });\n this.setState({ selectedShippingLines: [] });\n }\n };\n\n /**\n * On suggestion selected.\n * @param result - Suggestion result interface.\n */\n @action\n private readonly _onSuggestionSelected = async (result: Microsoft.Maps.ISuggestionResult): Promise<void> => {\n this._clearAddressFields();\n const address = this.addressFormat.getTranformedAddress(result, this.stateProvinceInfo);\n const timeout = 0;\n set(this.addUpdateAddress, { Street: '' });\n set(this.addUpdateAddress, { ZipCode: address.ZipCode });\n set(this.addUpdateAddress, { CountyName: address.CountyName });\n set(this.addUpdateAddress, { City: address.City });\n set(this.addUpdateAddress, { State: address.State });\n set(this.addUpdateAddress, { DistrictName: address.DistrictName });\n set(this.addUpdateAddress, { FullAddress: address.FullAddress });\n\n // Bing autosuggest put the complete address in the Street input box. Updating the street input box to show only street address.\n setTimeout(() => {\n set(this.addUpdateAddress, { Street: address.Street });\n }, timeout);\n };\n\n /**\n * Method to clear address fields.\n */\n @action\n private readonly _clearAddressFields = (): void => {\n const addressFormatItem = this.addressFormat.getAddressFormat(\n this.addUpdateAddress.ThreeLetterISORegionName || this.countryRegionId\n );\n for (const formatAddress of addressFormatItem) {\n if (\n this.addUpdateAddress[formatAddress.name] !== undefined &&\n !this.autoSuggest?.excludedAddressFields.includes(formatAddress.name)\n ) {\n this.addressFormat[formatAddress.name] = '';\n }\n }\n this._clearValidation();\n };\n\n /**\n * Method to clear validation.\n */\n @action\n private readonly _clearValidation = (): void => {\n this.validationError = {};\n };\n\n public get expressPaymentDetailsFromCartPage(): IExpressPaymentDetails | null {\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- Explicitly check for null/undefined.\n const properties =\n this.props.data.cart?.result?.cart?.ExtensionProperties?.find(property => property.Key === 'expressPaymentDetails')?.Value\n ?.StringValue ?? '';\n\n return properties ? (JSON.parse(properties) as IExpressPaymentDetails) : null;\n }\n\n /**\n * Method data initialization.\n * @param props -The checkout address properties.\n */\n private readonly _dataInitialize = (props: ICheckoutAddressProps): void => {\n const { data } = props;\n\n reaction(\n () => data.countryRegions.result,\n () => {\n this.countryRegions = data.countryRegions.result ?? [];\n }\n );\n\n reaction(\n () => data.addressPurposes.result,\n () => {\n this.addressPurposes = data.addressPurposes.result ?? [];\n }\n );\n\n reaction(\n () => data.address.result,\n () => {\n this.customerAddresses = data.address.result ?? [];\n }\n );\n\n reaction(\n () => data.countryStates.result,\n () => {\n this.stateProvinceInfo = data.countryStates.result ?? [];\n }\n );\n\n reaction(\n () => data.featureState.result,\n () => {\n this.retailMultiplePickUpOptionEnabled = data.featureState.result?.find(\n feature => feature.Name === this.multiplePickupStoreSwitchName\n )?.IsEnabled;\n }\n );\n };\n\n /**\n * Method to get cart lines for delivery.\n * @returns The cart line collection.\n */\n private readonly _getCartLinesforDelivery = (): CartLine[] => {\n return this.props.data.checkout.result?.checkoutCart.cart.CartLines?.filter(line => this._isDelivery(line)) ?? [];\n };\n\n /**\n * Method to check cart line for delivery.\n * @param line -The cart line.\n * @returns True/false as per cart line delivery mode.\n */\n private readonly _isDelivery = (line: CartLine): boolean => {\n return this._isNotPickupMode(line.DeliveryMode) && (line.FulfillmentStoreId === undefined || line.FulfillmentStoreId === '');\n };\n\n /**\n * Method to check cart line for delivery.\n * @param deliveryMode -The delivery mode.\n * @returns True/false as per cart line delivery mode.\n */\n private readonly _isNotPickupMode = (deliveryMode: string | undefined): boolean => {\n const pickupDeliveryModeCode = this.props.context.request.channel?.PickupDeliveryModeCode;\n const multiplePickupStoreSwitchName = 'Dynamics.AX.Application.RetailMultiplePickupDeliveryModeFeature';\n const { channelDeliveryOptionConfig, featureState } = this.props.data;\n const retailMultiplePickUpOptionEnabled = featureState.result?.find(feature => feature.Name === multiplePickupStoreSwitchName)\n ?.IsEnabled;\n if (retailMultiplePickUpOptionEnabled && deliveryMode !== undefined) {\n const pickupDeliveryMode = channelDeliveryOptionConfig.result?.PickupDeliveryModeCodes?.some(\n pickupMode => pickupMode !== deliveryMode\n );\n return pickupDeliveryMode !== undefined ? pickupDeliveryMode : false;\n }\n return deliveryMode !== undefined && pickupDeliveryModeCode !== undefined && deliveryMode !== pickupDeliveryModeCode;\n };\n\n /**\n * Method to check cart line for delivery.\n * @param channelId - The channelId.\n * @param cartLines - Cart line collections.\n * @returns Collection of SimpleProduct.\n */\n private readonly _getProductsByCartLines = async (channelId: number, cartLines: CartLine[]): Promise<SimpleProduct[]> => {\n const actionContext = this.props.context.actionContext;\n const productInputs = cartLines\n .filter(line => !ObjectExtensions.isNullOrUndefined(line.ProductId))\n .map(\n line =>\n new ProductInput(\n line.ProductId || 0,\n actionContext.requestContext.apiSettings,\n channelId,\n undefined,\n actionContext.requestContext,\n line.CatalogId || 0\n )\n );\n return getSimpleProducts(productInputs, actionContext);\n };\n\n /**\n * Method to render ship multiple addresses.\n * @param onSaveHandler -- Handles onsave functionality.\n * @param onCancelHandler -- Handles oncancel functionality.\n */\n private readonly _renderShipMultipleAddresses = (onSaveHandler?: () => void, onCancelHandler?: () => void) => {\n const { config, context } = this.props;\n const { imageSettings } = config;\n\n // Line images\n const cartlineImages: ICheckoutShippingCartLineInfo[] = this.state.shippingGroups\n .filter(x => !ObjectExtensions.isNullOrUndefined(x.product))\n .map(line => ({\n lineId: line.cartLine.LineId ?? '',\n imageProps: {\n requestContext: context.actionContext.requestContext,\n className: 'ms-checkout-shipping-address__group-images-lines-line-image',\n altText: line.product?.Name,\n src: line.product?.PrimaryImageUrl ?? '',\n fallBackSrc: getFallbackImageUrl(\n line.product?.ItemId,\n context.actionContext.requestContext.apiSettings,\n context.request.app?.config?.OmniChannelMedia\n ),\n gridSettings: context.request.gridSettings!,\n imageSettings: imageSettings ?? defaultImageSettings,\n loadFailureBehavior: 'empty'\n },\n quantity: line.cartLine.Quantity ?? 0\n }));\n\n /**\n * On Cancel Button Function.\n */\n const onCancelButtonHandler = () => {\n this._resetView();\n onCancelHandler?.();\n };\n\n return AddressShipMultiple({\n /**\n * On Save Function.\n */\n onSave: () => {\n this.onSubmit();\n onSaveHandler?.();\n },\n\n onCancel: !this.selectedAddress && !this.addressCommon.isAuthenticatedFlow() ? () => {} : onCancelButtonHandler,\n\n onSelect: this.onSelect.bind(this),\n\n onSelectAll: this.onSelectAll.bind(this),\n\n onClear: () => {\n this.onSelectAll(false);\n },\n\n onShippingAddressChange: this.onShippingAddressChange.bind(this),\n\n onBulkShippingAddressChange: this.onBulkShippingAddressChange.bind(this),\n\n /**\n * On Ship to Single Address Function.\n */\n onShipSingleAddress: () => {\n const resetSelectedShippingLines = this.state.selectedShippingLines\n ? this.state.selectedShippingLines.map(shippingLine => ({\n isChecked: false,\n cartLine: shippingLine.cartLine\n }))\n : [];\n this.setState({\n selectedShippingLines: resetSelectedShippingLines,\n shippingGroups: this.state.shippingGroupsBuffer\n });\n this._updateCurrentOperation(AddressOperation.Show, this.addressListSelectedAddress);\n this._updateModuleState();\n },\n\n hasExternalSubmitGroup: this.props.moduleState.hasExternalSubmitGroup,\n\n shippingLines: this.state.shippingGroups,\n\n shippingLineImages: cartlineImages,\n\n selectedShippingLines: this.state.selectedShippingLines ? this.state.selectedShippingLines : [],\n\n customerAddresses: this.customerAddresses,\n\n context: this.props.context,\n\n currencyCode: this.currencyCode,\n\n moduleId: this.props.id,\n\n moduleTypeName: this.props.typeName,\n\n resources: this.resources,\n\n telemetryContent: this.telemetryContent,\n\n isMobile: this.isMobile\n });\n };\n\n /**\n * Method to render add/update address.\n * @param onSaveHandler -- Handles onsave functionality.\n * @param onCancelHandler -- Handles oncancel functionality.\n * @returns Address app/update props.\n */\n private readonly _renderAddOrUpdateAddress = (onSaveHandler?: () => void, onCancelHandler?: () => void): IAddressAddUpdateProps => {\n const addressFormat =\n this.currentOperation === AddressOperation.Add && this.addressCommon.isAuthenticatedFlow()\n ? this.addressFormat\n : this.addressFormat;\n\n /**\n * On Cancel Button Function.\n */\n const onCancelButtonHandler = () => {\n this._resetView();\n onCancelHandler?.();\n };\n return AddressAddUpdate({\n isUpdating: this.isUpdating,\n resources: this.resources,\n addressType: AddressType.Shipping,\n addressFormat: addressFormat.getAddressFormat(this.addUpdateAddress.ThreeLetterISORegionName || this.countryRegionId),\n defaultCountryRegionId: this.countryRegionId,\n defaultAddressType: this.defaultAddressType,\n selectedAddress: this.addUpdateAddress,\n validationError: this.validationError,\n hasError: this.hasError,\n addressActionResponse: this.addressActionResponse,\n telemetryContent: this.telemetryContent,\n dropdownDisplayData: addressFormat.getPrefilledAddressDropdownData(\n this.resources.addressStateDefaultSelectionText,\n this.stateProvinceInfo\n ),\n onInputChange: this._onAddressAddUpdateInputChange,\n onDropdownChange: this._onAddressAddUpdateDropdownChange,\n hasExternalSubmitGroup: this.props.moduleState.hasExternalSubmitGroup,\n\n /**\n * On Save Function.\n */\n onSave: () => {\n this.onSubmit();\n onSaveHandler?.();\n },\n\n onCancel: !this.selectedAddress && !this.addressCommon.isAuthenticatedFlow() ? () => {} : onCancelButtonHandler\n });\n };\n\n /**\n * Method to render select address.\n * @param onShipMultipleAddressesHandler - To handle ship to multiple addresses button click.\n * @param onAddAddressHandler - To handle add address button click.\n * @param onSaveHandler - To handle save button click.\n * @param onCancelHandler - To handle cancel button click.\n * @returns Select address props.\n */\n private readonly _renderSelectAddress = (\n onShipMultipleAddressesHandler?: () => void,\n onAddAddressHandler?: () => void,\n onSaveHandler?: () => void,\n onCancelHandler?: () => void\n ): IAddressSelectProps => {\n /**\n * On Cancel Button Function.\n */\n const onCancelButtonHandler = () => {\n this._resetView();\n onCancelHandler?.();\n };\n return AddressSelect({\n addressFormat: this.addressFormat,\n addresses: this.customerAddresses,\n resources: this.resources,\n addressPurposes: this.addressPurposes,\n selectedAddress: this.addressListSelectedAddress,\n onAddressOptionChange: this._onAddressOptionChange,\n hasExternalSubmitGroup: this.props.moduleState.hasExternalSubmitGroup,\n telemetryContent: this.telemetryContent,\n\n /**\n * On Ship to Multiple Addresses Function.\n */\n onShipMultipleAddresses: () => {\n this._goToShipMultipleAddresses();\n onShipMultipleAddressesHandler?.();\n },\n\n /**\n * On Add Address Function.\n */\n onAddAddress: () => {\n this._goToAddAddress();\n onAddAddressHandler?.();\n },\n\n /**\n * On Save Function.\n */\n onSave: () => {\n this._onSelectAddress();\n onSaveHandler?.();\n },\n\n onCancel: !this.selectedAddress ? () => {} : onCancelButtonHandler,\n\n multipleAddressShippingEnabled: this.props.config.multipleAddressShippingEnabled\n });\n };\n\n /**\n * Method to render show address.\n * @returns Show address props.\n */\n private _renderShowAddress(): IAddressShowProps | null {\n if (this.selectedAddress) {\n return AddressShow({\n address: this.selectedAddress,\n addressFormat: this.addressFormat.getAddressFormat(this.selectedAddress.ThreeLetterISORegionName || ''),\n addressPurposes: this.addressPurposes\n });\n }\n\n return null;\n }\n\n /**\n * Method to render map auto suggest.\n */\n private readonly _attachMapAutoSuggest = async (): Promise<void> => {\n const {\n data: {\n storeSelectorStateManager: { result: storeSelectorStateManager }\n }\n } = this.props;\n\n if (storeSelectorStateManager?.isMapApiLoaded) {\n this.autoSuggest?.attachAutoSuggest('#shipping_addressstreet', '#shipping_addressstreet_container', this._onSuggestionSelected);\n }\n };\n\n /**\n * Method gets called on address option change.\n * @param event - To get current option.\n */\n private readonly _onAddressOptionChange = (event: React.ChangeEvent<HTMLInputElement>) => {\n const addressRecordId = event.currentTarget.value;\n const selectedAddress = this.customerAddresses.find(address => (address.RecordId || '').toString() === addressRecordId);\n if (selectedAddress) {\n this.addressListSelectedAddress = selectedAddress;\n }\n };\n\n /**\n * Method to render map auto suggest.\n * @param name - Address name field.\n * @param value - Address name value field.\n */\n private readonly onAddressAddUpdate = (name: string, value: string | boolean) => {\n set(this.addUpdateAddress, { [name]: value });\n this.addressFormat.validateAddressFormat(this.addUpdateAddress, this.validationError, this.countryRegionId, name);\n };\n\n /**\n * Method to get called on address update change.\n * @param event - Input element.\n */\n private readonly _onAddressAddUpdateInputChange = (event: React.ChangeEvent<HTMLInputElement>): void => {\n if (event.target.type === 'checkbox') {\n this.onAddressAddUpdate(event.target.name, event.target.checked);\n } else {\n const value = (event.target.value || '').replace(new RegExp('[<>]', 'gi'), '');\n this.onAddressAddUpdate(event.target.name, value);\n }\n };\n\n /**\n * Method to get called on address update dropdown change.\n * @param event - Select element.\n */\n private readonly _onAddressAddUpdateDropdownChange = (event: React.ChangeEvent<HTMLSelectElement>): void => {\n this.onAddressAddUpdate(event.target.name, event.target.value);\n\n if (event.target.name === AddressItemType[AddressItemType.ThreeLetterISORegionName]) {\n this._onCountryChange(event.target.value);\n }\n };\n\n /**\n * Method to get called on address update submit.\n */\n private readonly _onAddressAddUpdateSubmit = (): void => {\n if (!this.addressFormat.validateAddressFormat(this.addUpdateAddress, this.validationError, this.countryRegionId)) {\n return;\n }\n\n let response: Promise<IAddressResponse>;\n if (this.addressCommon.isAuthenticatedFlow() && this._isNewAddress(this.addUpdateAddress)) {\n response =\n this.currentOperation === AddressOperation.Update\n ? this.addressCommon.updateCustomerAddress(this.addUpdateAddress)\n : this.addressCommon.addCustomerAddress(this.addUpdateAddress);\n } else {\n response = Promise.resolve({ address: this.addUpdateAddress });\n }\n\n this.isUpdating = true;\n this._updateModuleState();\n\n response.then(\n (result: IAddressResponse) => {\n this.isUpdating = false;\n\n if (result.address) {\n this.hasError = false;\n this._clearError();\n if (result.customerAddresses) {\n this._onAddOrUpdateSuccess({ customerAddresses: result.customerAddresses, address: result.address });\n } else {\n this._onAddOrUpdateSuccess({ address: result.address });\n }\n } else {\n this.hasError = true;\n this.addressActionResponse = result;\n this._updateModuleState();\n }\n },\n () => {\n this.hasError = true;\n this.isUpdating = false;\n this._updateModuleState();\n }\n );\n };\n\n /**\n * Method to get called on country change.\n * @param countryRegionId - Country region id.\n */\n private readonly _onCountryChange = (countryRegionId: string) => {\n this.countryRegionId = countryRegionId;\n const twoLetterIsoRegionName = this.addressFormat.getTwoLetterISORegionName(countryRegionId);\n set(this.addUpdateAddress, { ThreeLetterISORegionName: countryRegionId });\n set(this.addUpdateAddress, { TwoLetterISORegionName: twoLetterIsoRegionName });\n this.autoSuggest?.changeAutoSuggestionCountryCode(twoLetterIsoRegionName);\n this._clearAddressFields();\n };\n\n /**\n * Method to get all address format exclude list.\n * @returns Collection of address items.\n */\n private readonly _getAddressFormatExcludeList = (): AddressItemType[] => {\n const { config } = this.props;\n const addressFormatExcludeList: AddressItemType[] = [];\n\n if (!config.showAddressType) {\n addressFormatExcludeList.push(AddressItemType.AddressTypeValue);\n }\n\n addressFormatExcludeList.push(AddressItemType.IsPrimary);\n\n return addressFormatExcludeList;\n };\n\n /**\n * Method to get all state/provinces.\n */\n private readonly _getStateProvinces = (): void => {\n if (\n !this.countryRegionId ||\n !(this.currentOperation === AddressOperation.Add || this.currentOperation === AddressOperation.Update)\n ) {\n return;\n }\n\n this.addressCommon.getStateProvinces(this.countryRegionId).then((result: StateProvinceInfo[]) => {\n const stateInfo = result.some(state => state.StateId === this.addUpdateAddress.State);\n\n // Reset state if selected state not found in the list.\n if (!stateInfo) {\n set(this.addUpdateAddress, { State: '' });\n }\n\n this.stateProvinceInfo = result;\n });\n };\n\n /**\n * Method to set default country region id.\n */\n private _setDefaultCountryRegionId(): void {\n const { request } = this.props.context;\n const market = request.channel?.ChannelCountryRegionISOCode;\n this.countryRegionId = this.addressCommon.getDefaultCountryRegionId(this.countryRegionId, this.countryRegions, market);\n }\n\n /**\n * Method to get default address region id.\n * @returns - Address object from existing addresses.\n */\n private readonly _getDefaultAddress = (): Address | undefined => {\n if (this.customerAddresses) {\n const primaryAddress = this.customerAddresses.find((address: Address) => address.IsPrimary);\n return primaryAddress || (this.customerAddresses.length > 0 ? this.customerAddresses[0] : undefined);\n }\n return undefined;\n };\n\n /**\n * Method to get address from express payment details from cart page.\n * @returns - Address.\n */\n private readonly _getAddressFromCartExpressPaymentDetails = (): Address | undefined => {\n if (this.expressPaymentDetailsFromCartPage) {\n const { tokenizedPaymentCard, address, isExpressAddressAppliedInCartPage } = this.expressPaymentDetailsFromCartPage;\n\n let addressFromCartExpress: Address | undefined;\n\n if (isExpressAddressAppliedInCartPage) {\n addressFromCartExpress = address ? this.getExpressAddress(address) : undefined;\n } else {\n addressFromCartExpress = tokenizedPaymentCard ? this.getAddressFromTokenizedPaymentCard(tokenizedPaymentCard) : undefined;\n }\n\n return addressFromCartExpress;\n }\n return undefined;\n };\n\n /**\n * Get address from tokenizedPaymentCard.\n * @param tokenizedPaymentCard -- The tokenizedPaymentCard from the payment.\n * @returns The address.\n */\n private readonly getAddressFromTokenizedPaymentCard = (tokenizedPaymentCard: TokenizedPaymentCard): Address => {\n const twoLetterIsoRegionName = tokenizedPaymentCard.Country;\n\n const threeLetterIsoRegionName = twoLetterIsoRegionName ? this.getThreeLetterIsoRegionName(twoLetterIsoRegionName) : undefined;\n\n if (threeLetterIsoRegionName && threeLetterIsoRegionName !== this.countryRegionId) {\n this._onCountryChange(threeLetterIsoRegionName);\n }\n\n const address: Address = {\n TwoLetterISORegionName: twoLetterIsoRegionName,\n Name: tokenizedPaymentCard.NameOnCard,\n Street: tokenizedPaymentCard.Address1,\n StreetNumber: tokenizedPaymentCard.Address2,\n City: tokenizedPaymentCard.City,\n State: tokenizedPaymentCard.State,\n ZipCode: tokenizedPaymentCard.Zip,\n Phone: tokenizedPaymentCard.Phone,\n ThreeLetterISORegionName: threeLetterIsoRegionName,\n AddressTypeValue: this.defaultAddressType\n };\n\n return address;\n };\n\n /**\n * Get address from expressAddress.\n * @param expressAddress -- The expressAddress.\n * @returns The address.\n */\n private readonly getExpressAddress = (expressAddress: Address): Address => {\n const twoLetterIsoRegionName = expressAddress.TwoLetterISORegionName;\n\n const threeLetterIsoRegionName = twoLetterIsoRegionName ? this.getThreeLetterIsoRegionName(twoLetterIsoRegionName) : undefined;\n\n if (threeLetterIsoRegionName && threeLetterIsoRegionName !== this.countryRegionId) {\n this._onCountryChange(threeLetterIsoRegionName);\n }\n\n const address: Address = {\n ...expressAddress,\n ThreeLetterISORegionName: threeLetterIsoRegionName,\n AddressTypeValue: this.defaultAddressType\n };\n\n return address;\n };\n\n /**\n * Get three letter ISO region name from two letter ISO region name.\n * @param twoLetterIsoRegionName -- The three letter ISO region name.\n * @returns The three letter ISO region name.\n */\n private readonly getThreeLetterIsoRegionName = (twoLetterIsoRegionName: string): string | undefined => {\n const countryRegion = this.countryRegions.find(country => {\n return country.ISOCode?.toLowerCase() === twoLetterIsoRegionName.toLowerCase();\n });\n\n return countryRegion?.CountryRegionId;\n };\n\n /**\n * Method to initialize all module state.\n */\n private readonly _initModuleState = (): void => {\n this.props.moduleState.init({\n status: this._canShip() ? 'updating' : 'disabled',\n onEdit: this.onEdit,\n onCancel: this.onCancel,\n onSubmit: this.onSubmit\n });\n\n const checkoutState = this.props.data.checkout.result;\n\n if (this._canShip()) {\n let defaultAddress;\n const shippingCartLines: CartLine[] = this._getCartLinesforDelivery();\n\n if (checkoutState?.checkoutCart.cart.ShippingAddress) {\n defaultAddress = checkoutState.checkoutCart.cart.ShippingAddress;\n } else if (\n ArrayExtensions.hasElements(shippingCartLines) &&\n shippingCartLines[0].ShippingAddress !== undefined &&\n shippingCartLines[0].ShippingAddress.FullAddress !== ''\n ) {\n defaultAddress = shippingCartLines[0].ShippingAddress;\n } else if (this._getAddressFromCartExpressPaymentDetails()) {\n defaultAddress = this._getAddressFromCartExpressPaymentDetails();\n } else if (this._getDefaultAddress()) {\n defaultAddress = this._getDefaultAddress();\n } else {\n defaultAddress = checkoutState?.isExpressCheckoutApplied ? checkoutState.shippingAddressFromExpressCheckout : undefined;\n }\n\n if (defaultAddress && !this.addressCommon.isEmpty(defaultAddress)) {\n this._updateCurrentOperation(AddressOperation.Show, defaultAddress);\n this._setShippingAddress(defaultAddress);\n this._updateModuleState();\n checkoutState?.updateHasShippingAddress({ newHasShippingAddress: true });\n } else {\n this._updateCurrentOperation(AddressOperation.Add);\n checkoutState?.updateHasShippingAddress({ newHasShippingAddress: false });\n }\n }\n };\n\n /**\n * Method get called on submit address.\n */\n private readonly onSubmit = (): void => {\n switch (this.currentOperation) {\n case AddressOperation.Add:\n case AddressOperation.Update:\n this.props.telemetry.information('Shipping address submit for Add or Update operation.');\n this._onAddressAddUpdateSubmit();\n break;\n case AddressOperation.List:\n this.props.telemetry.information('Shipping address submit for List operation.');\n this._onSelectAddress();\n break;\n case AddressOperation.Multiple:\n this.setState({ shippingGroupsBuffer: this.state.shippingGroups });\n this._onSelectMultiAddress();\n const resetSelectedShippingLines = this.state.selectedShippingLines\n ? this.state.selectedShippingLines.map(shippingLine => ({\n isChecked: false,\n cartLine: shippingLine.cartLine\n }))\n : [];\n this.setState({ selectedShippingLines: resetSelectedShippingLines });\n break;\n default:\n this.props.telemetry.error('Invalid operation');\n }\n };\n\n /**\n * Method get called on cancel.\n */\n private readonly onCancel = (): void => {\n switch (this.currentOperation) {\n case AddressOperation.Add:\n case AddressOperation.Update:\n this.props.telemetry.information('Shipping address cancel for Add or Update operation.');\n this._clearAddressFields();\n if (!(!this.selectedAddress && !this.addressCommon.isAuthenticatedFlow())) {\n this._resetView();\n }\n\n break;\n case AddressOperation.List:\n this.props.telemetry.information('Shipping address cancel for List operation.');\n if (this.selectedAddress) {\n this._resetView();\n }\n break;\n case AddressOperation.Multiple:\n this.props.telemetry.information('Shipping address cancel for Multiple operation.');\n const resetSelectedShippingLines = this.state.selectedShippingLines\n ? this.state.selectedShippingLines.map(shippingLine => ({\n isChecked: false,\n cartLine: shippingLine.cartLine\n }))\n : [];\n this.setState({\n selectedShippingLines: resetSelectedShippingLines,\n shippingGroups: this.state.shippingGroupsBuffer\n });\n this._updateCurrentOperation(AddressOperation.Show, this.addressListSelectedAddress);\n this._updateModuleState();\n break;\n default:\n this.props.telemetry.error('Invalid operation');\n }\n };\n\n /**\n * Method get called on edit address.\n */\n private readonly onEdit = (): void => {\n this.props.telemetry.information('Shipping address onEdit is called.');\n\n if (this.addressCommon.isAuthenticatedFlow() && this.shippingAddress) {\n this._updateCurrentOperation(AddressOperation.List, this.shippingAddress);\n } else if (this.shippingAddress) {\n this._updateCurrentOperation(AddressOperation.Update, this.shippingAddress);\n }\n\n this._updateModuleState();\n };\n\n /**\n * Method to check if checkout cartlines are available fro shipping.\n * @returns - True/false as per the delivery mode.\n */\n private readonly _canShip = (): boolean => {\n const { checkout, channelDeliveryOptionConfig } = this.props.data;\n const { request } = this.props.context;\n const pickupDeliveryModeCode = request && request.channel && request.channel.PickupDeliveryModeCode;\n if (!checkout.result || !request.channel || checkout.result.checkoutCart.isEmpty || checkout.result.checkoutCart.hasInvoiceLine) {\n return false;\n }\n\n // @ts-expect-error: Type-checker not realizing above request.channel check\n return this.retailMultiplePickUpOptionEnabled\n ? checkout.result.checkoutCart.cart.CartLines?.some(cartLine =>\n cartLine.DeliveryMode && cartLine.DeliveryMode !== ''\n ? cartLine.DeliveryMode !==\n channelDeliveryOptionConfig.result?.PickupDeliveryModeCodes?.find(\n deliveryMode => deliveryMode === cartLine.DeliveryMode\n )\n : cartLine\n )\n : checkout.result.checkoutCart.cart.CartLines?.some(cartLine =>\n cartLine.DeliveryMode && cartLine.DeliveryMode !== '' ? cartLine.DeliveryMode !== pickupDeliveryModeCode : cartLine\n );\n };\n\n /**\n * Method get called on select address.\n */\n private readonly _onSelectAddress = () => {\n this._updateCurrentOperation(AddressOperation.Show, this.addressListSelectedAddress);\n this._setShippingAddress(this.addressListSelectedAddress);\n this._updateModuleState();\n };\n\n /**\n * Method get called on select address.\n */\n private readonly _onSelectMultiAddress = () => {\n this._updateCurrentOperation(AddressOperation.Show, this.addressListSelectedAddress);\n if (this.props.config.multipleAddressShippingEnabled) {\n this._setCartLinesShippingAddress(this.addressListSelectedAddress);\n } else {\n this._setShippingAddress(this.addressListSelectedAddress);\n }\n\n this._updateModuleState();\n };\n\n /**\n * Method get called on ship to multiple addresses.\n */\n private readonly _goToShipMultipleAddresses = () => {\n this._setDefaultCountryRegionId();\n this.setState({ shippingGroupsBuffer: this.state.shippingGroups });\n this._updateCurrentOperation(AddressOperation.Multiple);\n };\n\n /**\n * Method get called on goto add address.\n */\n private readonly _goToAddAddress = () => {\n this._setDefaultCountryRegionId();\n this._updateCurrentOperation(AddressOperation.Add);\n };\n\n /**\n * Method get called on add/update success.\n * @param response - Retail api response.\n */\n private readonly _onAddOrUpdateSuccess = (response: IAddressResponse) => {\n if (response.customerAddresses) {\n this.customerAddresses = response.customerAddresses;\n }\n\n if (response.address) {\n this._updateCurrentOperation(AddressOperation.Show, response.address);\n this._setShippingAddress(response.address);\n this._updateModuleState();\n }\n };\n\n /**\n * Method get called on set Shipping Address.\n * @param address - Retail Api address result.\n */\n private readonly _setShippingAddress = (address: Address): void => {\n if (this.props.data.checkout.result) {\n const newShippingAddress = { ...address };\n\n if (address.ThreeLetterISORegionName && !newShippingAddress.TwoLetterISORegionName) {\n newShippingAddress.TwoLetterISORegionName = this.addressFormat.getTwoLetterISORegionName(address.ThreeLetterISORegionName);\n }\n\n this.props.data.checkout.result.updateShippingAddress({ newShippingAddress });\n this.props.data.checkout.result.checkoutCart.updateShippingAddress({ newShippingAddress }).catch(error => {\n this.props.telemetry.error(error);\n });\n }\n };\n\n /**\n * Method get called on set Shipping Address.\n * @param address - Retail Api address result.\n */\n private readonly _setCartLinesShippingAddress = (address: Address): void => {\n if (this.props.data.checkout.result) {\n const newCartLinesWithShippingAddress = this.state.shippingGroups.map(shippingGroup => shippingGroup.cartLine);\n this.props.data.checkout.result.updateCartLinesShippingAddress({ newCartLinesWithShippingAddress });\n this.props.data.checkout.result.checkoutCart\n .updateCartLineShippingAddress({ updatedCartLinesObject: newCartLinesWithShippingAddress })\n .catch(error => {\n this.props.telemetry.error(error);\n });\n }\n };\n\n @computed private get shippingAddress(): Address | undefined {\n return this.props.data.checkout.result?.shippingAddress;\n }\n\n @computed get currencyCode(): string | undefined {\n return get(this.props, 'context.request.channel.Currency');\n }\n\n private _updateViewport(): void {\n this._viewport = this._getViewport();\n }\n\n private readonly _getViewport = (): GridSize => {\n const { context } = this.props;\n\n // Always render in mobile viewport on a mobile device\n if (context.request && context.request.device && context.request.device.Type === 'Mobile') {\n return 'xs';\n }\n\n if (MsDyn365.isBrowser && window.innerWidth) {\n const gridSettings = context.request.gridSettings;\n if (gridSettings) {\n if (gridSettings.xs && window.innerWidth <= gridSettings.xs.w) {\n return 'xs';\n } else if (gridSettings.sm && window.innerWidth <= gridSettings.sm.w) {\n return 'sm';\n } else if (gridSettings.md && window.innerWidth <= gridSettings.md.w) {\n return 'md';\n } else if (gridSettings.lg && window.innerWidth <= gridSettings.lg.w) {\n return 'lg';\n }\n return 'xl';\n }\n }\n\n return 'xs';\n };\n\n /**\n * Method get called on reset view.\n */\n private readonly _resetView = (): void => {\n switch (this.currentOperation) {\n case AddressOperation.Add:\n case AddressOperation.Update:\n this._updateCurrentOperation(\n this.addressCommon.isAuthenticatedFlow() ? AddressOperation.List : AddressOperation.Show,\n this.shippingAddress\n );\n break;\n case AddressOperation.Multiple:\n const resetSelectedShippingLines = this.state.selectedShippingLines\n ? this.state.selectedShippingLines.map(shippingLine => ({\n isChecked: false,\n cartLine: shippingLine.cartLine\n }))\n : [];\n this.setState({\n selectedShippingLines: resetSelectedShippingLines,\n shippingGroups: this.state.shippingGroupsBuffer\n });\n this._updateCurrentOperation(AddressOperation.Show, this.shippingAddress);\n break;\n default:\n this._updateCurrentOperation(AddressOperation.Show, this.shippingAddress);\n }\n this._updateModuleState();\n };\n\n /**\n * Update current operation.\n * @param operation - The address operation.\n * @param selectedAddress - The selected address.\n */\n private readonly _updateCurrentOperation = (operation: AddressOperation, selectedAddress?: Address) => {\n this.currentOperation = operation;\n this.selectedAddress = selectedAddress;\n\n if (this.currentOperation === AddressOperation.Add || this.currentOperation === AddressOperation.Update) {\n this.addUpdateAddress = { ...this.selectedAddress } || {};\n set(this.addUpdateAddress, {\n ThreeLetterISORegionName: this.addUpdateAddress.ThreeLetterISORegionName || this.countryRegionId\n });\n set(this.addUpdateAddress, {\n AddressTypeValue: this.addUpdateAddress.AddressTypeValue || this.defaultAddressType\n });\n } else if (this.currentOperation === AddressOperation.List) {\n this.addressListSelectedAddress = { ...this.selectedAddress } || {};\n }\n };\n\n /**\n * Update module state.\n */\n private readonly _updateModuleState = () => {\n if (this.currentOperation === AddressOperation.Show) {\n this.props.moduleState.onReady();\n } else if (this.isUpdating) {\n this.props.moduleState.onPending();\n } else {\n this.props.moduleState.onUpdating();\n }\n };\n\n /**\n * Method to check if the customer already has the address.\n * @param address - The address.\n */\n private readonly _isNewAddress = (address: Address): boolean => {\n for (const existingAddress of this.customerAddresses) {\n if (\n (address.Name ?? '') === existingAddress.Name &&\n (address.Street ?? '') === existingAddress.Street &&\n (address.StreetNumber ?? '') === existingAddress.StreetNumber &&\n (address.City ?? '') === existingAddress.City &&\n (address.State ?? '') === existingAddress.State &&\n (address.ZipCode ?? '') === existingAddress.ZipCode &&\n (address.Phone ?? '') === existingAddress.Phone &&\n (address.ThreeLetterISORegionName ?? '') === existingAddress.ThreeLetterISORegionName &&\n (address.AddressTypeValue ?? '') === existingAddress.AddressTypeValue\n ) {\n return false;\n }\n }\n\n return true;\n };\n\n @action\n private readonly _setErrorMessage = (errorMessage: string): void => {\n this.props.telemetry.error(errorMessage);\n this.props.moduleState.setHasError(true);\n this.props.moduleState.onUpdating();\n this.setState({\n errorMessage\n });\n };\n\n private readonly _clearError = (): void => {\n this.props.moduleState.setHasError(false);\n this.setState({\n errorMessage: ''\n });\n };\n\n /**\n * Returns count of products.\n * @param cartLine - The checkout shipping cart line info props.\n * @returns Number of products.\n */\n private readonly _countItems = (cartlines: ICheckoutShippingCartLineInfo[]): number => {\n return cartlines.reduce((count, line) => {\n return count + (line.quantity || 0);\n }, 0);\n };\n}\n\nexport default CheckoutShippingAddress;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport * as React from 'react';\n\nexport interface IWishlistItemDimension {\n key: string;\n className?: string;\n dimensionType: string;\n dimensionValue: string;\n}\n\nexport const WishlistItemDimension: React.FC<IWishlistItemDimension> = ({ key, className, dimensionType, dimensionValue }) => (\n <div key={key} className={className}>\n <span className='msc-wishlist-dimension__label'>{dimensionType}:</span>\n <span className='msc-wishlist-dimension__value'>{dimensionValue}</span>\n </div>\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 { IAny, ICoreContext, IGeneric, IImageSettings, Image, ITelemetry, msdyn365Commerce } from '@msdyn365-commerce/core';\nimport {\n CommerceListLine,\n ProductPrice,\n ReleasedProductType,\n SimpleProduct\n} from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\nimport {\n convertProductDimensionTypeToDimensionTypes,\n getFallbackImageUrl,\n StringExtensions\n} from '@msdyn365-commerce-modules/retail-actions';\nimport { Alert, Button, getPayloadObject, getTelemetryAttributes, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { IWishlistItemActionMessageState } from '../wishlist-items';\nimport { WishlistItemDimension } from './wishlist-items-dimensions';\n\nexport interface IWishlistItemProps extends CommerceListLine {\n product: SimpleProduct;\n wishlistState: IWishlistItemActionMessageState;\n price?: ProductPrice;\n context: ICoreContext<IGeneric<IAny>>;\n productUrl: string;\n imageSettings?: IImageSettings;\n removeFromWishlistText: string;\n isInStock: boolean;\n addToCartText: string;\n outOfStockText: string;\n index: number;\n itemKey: string;\n telemetry: ITelemetry;\n moduleId: string;\n moduleTypeName: string;\n enableImageProductLink?: boolean;\n inventoryInformationLabel?: string;\n inventoryLabelClassName?: string;\n telemetryContent?: ITelemetryContent;\n handlers: {\n onAddToCart(product: SimpleProduct, itemKey: string): void;\n onRemoveItem(productId: number): void | undefined;\n onDismiss(): void;\n };\n resources: {\n productDimensionTypeColor: string;\n productDimensionTypeSize: string;\n productDimensionTypeStyle: string;\n originalPriceText: string;\n currentPriceText: string;\n freePriceText: string;\n };\n}\n\nexport interface IWishlistItemViewProps {\n key: string;\n productImage: React.ReactNode;\n productLink: React.ReactNode;\n productDimensions?: React.ReactNode[];\n productPrice?: React.ReactNode;\n addToCartButton?: React.ReactNode;\n removeButton?: React.ReactNode;\n productStatusMessage?: React.ReactNode;\n productName?: React.ReactNode;\n productAriaLabel?: string;\n entireProductLink?: string;\n inventoryInformation?: React.ReactNode;\n productUnitOfMeasure?: React.ReactNode;\n}\n\nconst _addItemToCart = (props: IWishlistItemProps): void => {\n const { product, itemKey, handlers } = props;\n const { onAddToCart } = handlers;\n\n onAddToCart && product && itemKey && onAddToCart(product, itemKey);\n};\n\nconst _removeItemFromWishlist = (props: IWishlistItemProps): void => {\n const { onRemoveItem } = props.handlers;\n const { RecordId } = props.product;\n\n onRemoveItem && RecordId && onRemoveItem(RecordId);\n};\n\nconst WishListItemActions = {\n addToCart: _addItemToCart,\n removeItem: _removeItemFromWishlist\n};\n\nconst _getFullProductLink = (props: IWishlistItemProps): string => {\n if (!msdyn365Commerce.isBrowser) {\n return '';\n }\n\n const fullUrl = new URL(props.productUrl, window.location.href);\n for (const dimension of props.product.Dimensions ?? []) {\n const dimensionValue = dimension.DimensionValue?.Value;\n if (!StringExtensions.isNullOrWhitespace(dimensionValue)) {\n const dimensionName = convertProductDimensionTypeToDimensionTypes(dimension.DimensionTypeValue);\n fullUrl.searchParams.set(dimensionName, dimensionValue!);\n }\n }\n return fullUrl.href;\n // return updateProductUrl(productUrl, context, swatch);\n};\n\nconst _renderAriaLabel = (props: IWishlistItemProps): string => {\n const { product, price, context, resources } = props;\n\n const { Name, Dimensions } = product;\n const { productDimensionTypeColor, productDimensionTypeSize, productDimensionTypeStyle } = resources;\n\n let formattedPrice = 'Free';\n let dimensions = null;\n\n if (price) {\n formattedPrice =\n price.BasePrice === 0 ? resources.freePriceText : context.cultureFormatter.formatCurrency(price.BasePrice!, price.CurrencyCode);\n }\n\n if (Dimensions) {\n dimensions = Dimensions.map(productDimension => {\n switch (productDimension.DimensionTypeValue) {\n case 1:\n return `${productDimensionTypeColor}${productDimension.DimensionValue && productDimension.DimensionValue.Value}`;\n case 3:\n return `${productDimensionTypeSize}${productDimension.DimensionValue && productDimension.DimensionValue.Value}`;\n case 4:\n return `${productDimensionTypeStyle}${productDimension.DimensionValue && productDimension.DimensionValue.Value}`;\n default:\n return '';\n }\n });\n }\n\n return `${Name} ${formattedPrice} ${(dimensions && dimensions.join('')) || ''}`;\n};\n\n/**\n * Renders a link to a product based on the given props.\n * @param input - Wishlist item props with the info about the product.\n * @param productUrl - The url to the product.\n * @returns React component with a link to a product.\n */\nconst renderProductLink = (input: IWishlistItemProps, productUrl: string) => {\n const { telemetryContent } = input;\n const { RecordId: recordId, Name: productName } = input.product;\n const payLoad = getPayloadObject('click', telemetryContent!, '', recordId.toString());\n const productAttributes = getTelemetryAttributes(telemetryContent!, payLoad);\n const productPageUrlWithSwatch = productUrl;\n return (\n !StringExtensions.isNullOrWhitespace(productPageUrlWithSwatch) && (\n <a\n href={productPageUrlWithSwatch}\n className='ms-wishlist-items__product-link'\n {...productAttributes}\n aria-label={_renderAriaLabel(input)}\n >\n {productName}\n </a>\n )\n );\n};\n\n/**\n * Renders a product name box.\n * @param productName - The text to display.\n * @returns React component with a name of a product.\n */\nconst renderProductName = (productName: string) => {\n return <div className='ms-wishlist-items__product-title'>{productName}</div>;\n};\n\n/**\n * Renders inventory information.\n * @param inventoryInformationLabel - The text to display.\n * @param inventoryLabelClassName - The component class name.\n * @returns React component.\n */\nconst renderInventoryInformationLabel = (inventoryInformationLabel: string | undefined, inventoryLabelClassName: string | undefined) => {\n const inventoryCssName = inventoryLabelClassName\n ? `ms-wishlist-items__inventory-label ${inventoryLabelClassName}`\n : 'ms-wishlist-items__inventory-label';\n return (\n !StringExtensions.isNullOrWhitespace(inventoryInformationLabel) && (\n <span className={inventoryCssName}>{inventoryInformationLabel}</span>\n )\n );\n};\n\n/**\n * Renders add to cart button.\n * @param input - Wishlist item props with the configuration.\n * @returns React component.\n */\nconst WishlistItemAddToCartButtonComponent = (input: IWishlistItemProps) => {\n const { isInStock, addToCartText, outOfStockText } = input;\n\n // Check if the product is service or not by product type.\n const isServiceItem = input.product.ItemTypeValue === ReleasedProductType.Service;\n\n const addItemAction = React.useCallback(() => {\n WishListItemActions.addToCart(input);\n }, [input]);\n\n return (\n <Button\n className='ms-wishlist-items__product-add-button'\n title={((isServiceItem || isInStock) && addToCartText) || outOfStockText}\n onClick={addItemAction}\n disabled={!(isServiceItem || isInStock)}\n >\n {((isServiceItem || isInStock) && addToCartText) || outOfStockText}\n </Button>\n );\n};\n\n/**\n * Renders remove from wishlist button.\n * @param input - Wishlist item props with the configuration.\n * @returns React component.\n */\nconst WishlistItemRemoveFromWishlistButtonComponent = (input: IWishlistItemProps) => {\n const { removeFromWishlistText } = input;\n\n const removeItemAction = React.useCallback(() => {\n WishListItemActions.removeItem(input);\n }, [input]);\n\n return <button className='ms-wishlist-items__product-remove-button' aria-label={removeFromWishlistText} onClick={removeItemAction} />;\n};\n\n/**\n * Gets the react node for product unit of measure display.\n * @param context - Module context.\n * @param unitOfMeasure - Product unit of measure.\n * @returns The node representing markup for unit of measure component.\n */\nconst renderUnitOfMeasure = (context: ICoreContext<IGeneric<IAny>>, unitOfMeasure?: string) => {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- Do not need type check for appsettings\n if (context.app.config && (!context.app.config.unitOfMeasureDisplayType || context.app.config.unitOfMeasureDisplayType === 'none')) {\n return undefined;\n }\n\n if (!unitOfMeasure) {\n return undefined;\n }\n\n return (\n <div className='msc-wishlistitems__product-unit-of-measure'>\n <span>{unitOfMeasure}</span>\n </div>\n );\n};\n\nexport const WishlistItem = (input: IWishlistItemProps): IWishlistItemViewProps | null => {\n const {\n product,\n price,\n context,\n imageSettings,\n wishlistState,\n itemKey,\n handlers,\n inventoryInformationLabel,\n enableImageProductLink,\n inventoryLabelClassName\n } = input;\n\n if (!product) {\n return null;\n }\n\n const { RecordId, Name, PrimaryImageUrl, Dimensions } = product;\n if (product.RecordId) {\n const fallbackImage = getFallbackImageUrl(\n product.ItemId,\n context.actionContext.requestContext.apiSettings,\n context.request.app?.config?.OmniChannelMedia\n );\n const productUrl = _getFullProductLink(input);\n const productImage =\n Name &&\n _renderProductImage(\n context,\n product.Name!,\n PrimaryImageUrl === undefined ? fallbackImage : PrimaryImageUrl,\n fallbackImage,\n imageSettings\n );\n return {\n key: `${RecordId}-item`,\n productImage,\n productLink: renderProductLink(input, productUrl),\n productDimensions: Dimensions && _renderProductDimensions(input),\n productPrice: price && _renderPrice(input),\n productUnitOfMeasure: product.DefaultUnitOfMeasure && renderUnitOfMeasure(context, product.DefaultUnitOfMeasure),\n entireProductLink: enableImageProductLink ? productUrl : undefined,\n productAriaLabel: enableImageProductLink ? _renderAriaLabel(input) : undefined,\n productName: enableImageProductLink && Name && renderProductName(Name),\n\n addToCartButton: <WishlistItemAddToCartButtonComponent {...input} />,\n inventoryInformation: renderInventoryInformationLabel(inventoryInformationLabel, inventoryLabelClassName),\n removeButton: <WishlistItemRemoveFromWishlistButtonComponent {...input} />,\n productStatusMessage: wishlistState &&\n wishlistState.isOpen &&\n wishlistState.productId === RecordId &&\n wishlistState.itemKey === itemKey && (\n <div className='ms-wishlist-items__product-status'>\n <Alert color={wishlistState.statusCssString} isOpen={wishlistState.isOpen} toggle={handlers.onDismiss}>\n <span>{wishlistState.userMessage}</span>\n </Alert>\n </div>\n )\n };\n }\n return null;\n};\n\nconst _renderProductImage = (\n context: ICoreContext,\n heading: string,\n image?: string,\n fallbackImage?: string,\n imageSettings?: IImageSettings\n): JSX.Element | null => {\n const defaultImageSettings: IImageSettings = {\n viewports: {\n xs: { q: 'w=315&h=315&m=6', w: 0, h: 0 },\n lg: { q: 'w=315&h=315&m=6', w: 0, h: 0 },\n xl: { q: 'w=315&h=315&m=6', w: 0, h: 0 }\n },\n lazyload: true,\n cropFocalRegion: true\n };\n\n if (imageSettings) {\n imageSettings.cropFocalRegion = true;\n }\n\n if (image) {\n return (\n <Image\n requestContext={context.actionContext.requestContext}\n className='ms-wishlist-items__product-image'\n altText={heading}\n title={heading}\n src={image}\n fallBackSrc={fallbackImage}\n gridSettings={context.request.gridSettings!}\n imageSettings={imageSettings || defaultImageSettings}\n loadFailureBehavior='empty'\n />\n );\n }\n return null;\n};\n\nconst _renderPrice = (props: IWishlistItemProps): JSX.Element | null => {\n const { price, context, moduleId, moduleTypeName, resources } = props;\n\n if (price) {\n return (\n <PriceComponent\n id={moduleId}\n typeName={moduleTypeName}\n data={{ price }}\n className='ms-wishlist-items__product-price'\n freePriceText={resources.freePriceText}\n originalPriceText={resources.originalPriceText}\n currentPriceText={resources.currentPriceText}\n context={context}\n />\n );\n }\n return null;\n};\n\nconst _renderProductDimensions = (props: IWishlistItemProps): (React.ReactNode | undefined)[] => {\n const { product, resources } = props;\n\n if (!product || !product.Dimensions) {\n return [];\n }\n\n return product.Dimensions.map((dimension, index) => {\n if (!dimension.DimensionValue || !dimension.DimensionValue.Value) {\n return undefined;\n }\n\n let type = '';\n\n switch (dimension.DimensionTypeValue) {\n case 1: {\n type = resources.productDimensionTypeColor;\n break;\n }\n case 3: {\n type = resources.productDimensionTypeSize;\n break;\n }\n case 4: {\n type = resources.productDimensionTypeStyle;\n break;\n }\n default:\n return undefined;\n }\n\n return (\n <WishlistItemDimension\n key={`${product.RecordId}-dimensions-${index}`}\n className='msc-price ms-wishlist-items__product-dimension'\n dimensionType={type}\n dimensionValue={dimension.DimensionValue.Value}\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 classnames from 'classnames';\nimport * as React from 'react';\n\nimport { wishlistStatus } from '../wishlist-items';\n\nexport interface IWishlistItemsStatusMessageProps {\n className?: string;\n errorType: wishlistStatus;\n text?: string;\n}\n\nexport const WishlistItemsStatusMessage: React.FC<IWishlistItemsStatusMessageProps> = ({ className, errorType, text }) => {\n switch (errorType) {\n case 'EMPTY':\n return <p className={classnames('ms-wishlist-items__message-empty', className)}>{text}</p>;\n case 'FAILED':\n return <p className={classnames('ms-wishlist-items__message-failed', className)}>{text}</p>;\n case 'LOADING':\n default:\n return <p className={className ? 'ms-wishlist-items__message-exists-product' : 'ms-wishlist-items__message-waiting'}>{text}</p>;\n }\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { FullProduct } from '@msdyn365-commerce/commerce-entities';\nimport * as MsDyn365 from '@msdyn365-commerce/core';\nimport { AsyncResult, CommerceList, CommerceListLine, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\nimport { createGetByCustomerInput, removeLinesAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/CommerceListsDataActions.g';\nimport { getDeliveryOptionsAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/ProductsDataActions.g';\nimport {\n ArrayExtensions,\n getProductUrlSync,\n IProductInventoryInformation,\n QueryResultSettingsProxy\n} from '@msdyn365-commerce-modules/retail-actions';\nimport {\n getTelemetryObject,\n IModuleProps,\n INodeProps,\n ITelemetryContent,\n updateMaxQuantityForCartLineItem\n} from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport { observer } from 'mobx-react';\nimport * as React from 'react';\n\nimport getItemsInWishlists, { ActiveWishlistInput } from './actions/get-items-in-wishlists';\nimport { IWishlistItemViewProps, WishlistItem, WishlistItemsStatusMessage } from './components';\nimport { IWishlistItemsData } from './wishlist-items.data';\nimport { IHeadingData, IWishlistItemsProps } from './wishlist-items.props.autogenerated';\n\nexport interface IWishlistItemActionMessageState {\n productId: number;\n itemKey: string;\n userMessage: string;\n statusCssString: string;\n messageGlyph: string;\n isOpen: boolean;\n isError: boolean;\n}\n\nexport type wishlistStatus = 'LOADING' | 'SUCCESS' | 'FAILED' | 'EMPTY';\n\nexport interface IWishlistItemsViewProps extends IWishlistItemsProps<IWishlistItemsData> {\n WishlistItems: IModuleProps;\n status?: wishlistStatus;\n statusMessage?: React.ReactNode;\n heading?: React.ReactNode;\n Products?: INodeProps;\n Product?: INodeProps;\n ProductDetails?: INodeProps;\n ProductDimensions?: INodeProps;\n products?: IWishlistItemViewProps[];\n telemetryContent?: ITelemetryContent;\n statusNotExistsMessage?: React.ReactNode;\n}\n\n/**\n *\n * WishlistItems component.\n * @extends {React.PureComponent<IWishlistItemsProps<IWishlistItemsData>, IWishlistItemActionMessageState>}\n */\n@observer\nclass WishlistItems extends React.Component<IWishlistItemsProps<IWishlistItemsData>, IWishlistItemActionMessageState> {\n private readonly telemetryContent: ITelemetryContent;\n constructor(props: IWishlistItemsProps<IWishlistItemsData>) {\n super(props);\n this.telemetryContent = getTelemetryObject(\n this.props.context.request.telemetryPageName!,\n this.props.friendlyName,\n this.props.telemetry\n );\n }\n\n public async componentDidMount(): Promise<void> {\n this.setState({ isError: false });\n }\n\n public shouldComponentUpdate(nextProps: IWishlistItemsProps<IWishlistItemsData>, nextState: IWishlistItemActionMessageState): boolean {\n if (this.state === nextState && this.props.data === nextProps.data) {\n return false;\n }\n return true;\n }\n\n public render(): JSX.Element | null {\n const { heading, className } = this.props.config;\n const { emptyWishlistText, wishlistErrorGettingWishlist, noLongerExitsWishlistItemText } = this.props.resources;\n const { cart, productAvailability, wishlists, products } = this.props.data;\n\n if (cart.status === 'LOADING' || productAvailability.status === 'LOADING' || wishlists.status === 'LOADING') {\n const errorProps: IWishlistItemsViewProps = {\n ...(this.props as IWishlistItemsProps<IWishlistItemsData>),\n WishlistItems: {\n moduleProps: this.props,\n className: classnames('ms-wishlist-items', className)\n },\n status: 'LOADING',\n\n statusMessage: <WishlistItemsStatusMessage errorType='LOADING' text='Loading...' />,\n heading: this._renderHeading(heading)\n };\n return this.props.renderView(errorProps);\n }\n\n if (cart.status === 'FAILED' || productAvailability.status === 'FAILED' || wishlists.status === 'FAILED') {\n const errorProps: IWishlistItemsViewProps = {\n ...(this.props as IWishlistItemsProps<IWishlistItemsData>),\n WishlistItems: {\n moduleProps: this.props,\n className: classnames('ms-wishlist-items', className)\n },\n status: 'FAILED',\n statusMessage: <WishlistItemsStatusMessage errorType='FAILED' text={wishlistErrorGettingWishlist} />,\n heading: this._renderHeading(heading)\n };\n\n return this.props.renderView(errorProps);\n }\n\n const productsList = products && (products as AsyncResult<FullProduct[]>).result;\n\n if (productsList && productsList.length === 0) {\n const emptyViewProps: IWishlistItemsViewProps = {\n ...(this.props as IWishlistItemsProps<IWishlistItemsData>),\n WishlistItems: {\n moduleProps: this.props,\n className: classnames('ms-wishlist-items', className)\n },\n status: 'EMPTY',\n statusMessage: <WishlistItemsStatusMessage errorType='EMPTY' text={emptyWishlistText} />,\n heading: this._renderHeading(heading)\n };\n\n return this.props.renderView(emptyViewProps);\n }\n\n const viewProps: IWishlistItemsViewProps = {\n ...(this.props as IWishlistItemsProps<IWishlistItemsData>),\n WishlistItems: {\n moduleProps: this.props,\n className: classnames('ms-wishlist-items', className)\n },\n status: 'SUCCESS',\n heading: this._renderHeading(heading),\n Products: {\n className: 'ms-wishlist-items__products',\n tag: 'ul'\n },\n Product: {\n className: 'ms-wishlist-items__product',\n tag: 'li'\n },\n ProductDetails: {\n className: 'ms-wishlist-items__product-link',\n tag: 'a'\n },\n telemetryContent: this.telemetryContent,\n ProductDimensions: {\n className: 'ms-wishlist-items__product-dimensions'\n },\n products: productsList && this._renderProductList(productsList),\n statusNotExistsMessage:\n productsList && this._getProductNotExists(productsList, emptyWishlistText, noLongerExitsWishlistItemText)\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 private _getProductNotExists(products: FullProduct[], emptytext: string, noLongerExisttext: string): JSX.Element | null {\n if (this.state && this.state.isError) {\n if (products.length === 0) {\n return <WishlistItemsStatusMessage errorType='SUCCESS' text={emptytext} />;\n }\n return (\n <WishlistItemsStatusMessage\n className={'ms-wishlist-items__message-exists-product'}\n errorType='SUCCESS'\n text={noLongerExisttext}\n />\n );\n }\n return null;\n }\n private _renderProductList(products: FullProduct[]): IWishlistItemViewProps[] {\n const {\n priceFree,\n originalPriceText,\n currentPriceText,\n addToCartButtonText,\n outOfStockText,\n removeButtonText,\n productDimensionTypeColor,\n productDimensionTypeSize,\n productDimensionTypeStyle,\n productDimensionTypeAmount\n } = this.props.resources;\n const { context, telemetry } = this.props;\n const { imageSettings, enableImageProductLink } = this.props.config;\n\n return products.map((product: FullProduct, index) => {\n const currentProductProps = {\n product: product.ProductDetails,\n price: product.ProductPrice,\n context,\n wishlistState: this.state,\n productUrl: getProductUrlSync(product.ProductDetails, context.actionContext, undefined),\n imageSettings,\n removeFromWishlistText: removeButtonText,\n isInStock: this._isProductInStock(product),\n addToCartText: addToCartButtonText,\n outOfStockText,\n index,\n itemKey: `${product.ProductDetails.RecordId}-${product.ProductDetails.ItemId}-${index}`,\n telemetry,\n moduleId: this.props.id,\n moduleTypeName: this.props.typeName,\n enableImageProductLink,\n inventoryInformationLabel: this._inventoryLabel(product),\n inventoryLabelClassName: this._inventoryClassName(product),\n telemetryContent: this.telemetryContent,\n handlers: {\n onAddToCart: this._addItemToCart,\n onRemoveItem: this._removeItemFromWishlist,\n onDismiss: this._onDismiss\n },\n resources: {\n productDimensionTypeColor,\n productDimensionTypeSize,\n productDimensionTypeStyle: product.ProductDetails.IsGiftCard ? productDimensionTypeAmount : productDimensionTypeStyle,\n freePriceText: priceFree,\n originalPriceText,\n currentPriceText\n }\n };\n return WishlistItem(currentProductProps)!;\n });\n }\n\n // Dismiss alert when addingToCart/removeItem\n private readonly _onDismiss = () => {\n this.setState({\n isOpen: false\n });\n };\n\n private readonly _renderHeading = (heading?: IHeadingData): JSX.Element | undefined => {\n if (!heading) {\n return undefined;\n }\n return (\n <MsDyn365.Text\n className='ms-wishlist-items__heading'\n tag={heading.tag || 'h2'}\n text={heading.text}\n editProps={{ onEdit: this.handleHeadingChange, requestContext: this.props.context.request }}\n />\n );\n };\n\n private readonly _addItemToCart = async (product: SimpleProduct, itemKey: string): Promise<void> => {\n const { context, data, resources, telemetry } = this.props;\n const { cart, productAvailability } = data;\n const { addedToCartSuccessMessage, addedToCartFailureMessage, invoiceInCartErrorMessage } = resources;\n\n const productInventoryInformation = this._getProductInventory({ ProductDetails: product }, productAvailability.result);\n\n if (context) {\n if (cart.result) {\n // Check if the product delivery mode is electronic\n const emailDeliveryModeCode = this.props.context.actionContext.requestContext.channel?.EmailDeliveryModeCode;\n\n const deliveryOptions = await getDeliveryOptionsAsync(\n {\n callerContext: this.props.context.actionContext,\n queryResultSettings: QueryResultSettingsProxy.getPagingFromInputDataOrDefaultValue(this.props.context.actionContext)\n },\n [product.RecordId]\n );\n const validateQuantity = this.isQuantityValidationRequired();\n const quantity = this.respectQuantityLimits() ? product?.Behavior?.MinimumQuantity ?? 1 : 1;\n\n const addProductToCartInput = {\n product,\n count: quantity,\n enableStockCheck: context.app.config.enableStockCheck,\n availableQuantity: productInventoryInformation\n ? productInventoryInformation.ProductAvailableQuantity.AvailableQuantity\n : 0,\n additionalProperties: { validateQuantity: validateQuantity },\n isAddEmailDeliveryItemToCart:\n ArrayExtensions.hasElements(deliveryOptions) &&\n ArrayExtensions.hasElements(deliveryOptions[0].DeliveryOptions) &&\n deliveryOptions[0].DeliveryOptions[0].Code === emailDeliveryModeCode\n };\n\n cart.result\n .addProductToCart(addProductToCartInput)\n .then(async result => {\n if (result.status === 'SUCCESS') {\n this.setState({\n productId: product.RecordId,\n itemKey,\n userMessage: addedToCartSuccessMessage,\n statusCssString: 'success',\n messageGlyph: 'fas fa-check',\n isOpen: true\n });\n } else if (result.substatus === 'MAXQUANTITY') {\n const curQuantity =\n (await cart).cart?.CartLines?.find(item => item.ProductId === product.RecordId)?.Quantity || 0;\n const maxQtyLimitReachedMessage = this._getInventoryValueMessage(productInventoryInformation, curQuantity);\n\n this.setState({\n productId: product.RecordId,\n itemKey,\n userMessage: maxQtyLimitReachedMessage,\n statusCssString: 'danger',\n messageGlyph: 'fas fa-exclamation-triangle',\n isOpen: true\n });\n } else if (result.substatus === 'QUANTITYLIMITS' && validateQuantity) {\n const maxQtyLimitReachedMessage = result.errorDetails?.LocalizedMessage!;\n\n this.setState({\n productId: product.RecordId,\n itemKey,\n userMessage: maxQtyLimitReachedMessage || addedToCartFailureMessage,\n statusCssString: 'danger',\n messageGlyph: 'fas fa-exclamation-triangle',\n isOpen: true\n });\n } else if (result.substatus === 'INVOICEINCART') {\n this.setState({\n productId: product.RecordId,\n itemKey,\n userMessage: result.errorDetails?.LocalizedMessage || invoiceInCartErrorMessage,\n statusCssString: 'danger',\n messageGlyph: 'fas fa-exclamation-triangle',\n isOpen: true\n });\n } else {\n this.props.telemetry.debug('[wishlist-items] Unable to Update Cart Line from the wishlist');\n this.setState({\n productId: product.RecordId,\n itemKey,\n userMessage: addedToCartFailureMessage,\n statusCssString: 'danger',\n messageGlyph: 'fas fa-exclamation-triangle',\n isOpen: true\n });\n }\n })\n .catch(error => {\n telemetry.warning(error);\n telemetry.debug('[wishlist-items] Error trying to Update Cart Line from the wishlist');\n this.setState({\n productId: product.RecordId,\n itemKey,\n userMessage: addedToCartFailureMessage,\n statusCssString: 'danger',\n messageGlyph: 'fas fa-exclamation-triangle',\n isOpen: true\n });\n });\n }\n }\n };\n\n private isQuantityValidationRequired = (): boolean => {\n const isChannelQuantityLimitsFeatureEnabledInHq =\n this.props.data.featureState.result?.find(\n featureState => featureState.Name === 'Dynamics.AX.Application.EcommerceQuantityLimitConfigurationsFeature'\n )?.IsEnabled || false;\n\n const isOrderQuantityLimitsFeatureEnabled = this.isOrderQuantityLimitsFeatureEnabled();\n return isOrderQuantityLimitsFeatureEnabled || isChannelQuantityLimitsFeatureEnabledInHq;\n };\n\n private respectQuantityLimits = (): boolean => {\n const isOrderQuantityLimitsFeatureEnabled = this.isOrderQuantityLimitsFeatureEnabled();\n const validateLimitsPerLine = this.props.data.cartConfiguration?.result?.ValidateDefaultOrderSettingsPerLine ?? false;\n return isOrderQuantityLimitsFeatureEnabled && validateLimitsPerLine;\n };\n\n private isOrderQuantityLimitsFeatureEnabled = (): boolean => {\n const isOrderQuantityLimitsFeatureEnabledInHq =\n this.props.data.featureState.result?.find(\n featureState => featureState.Name === 'Dynamics.AX.Application.RetailDefaultOrderQuantityLimitsFeature'\n )?.IsEnabled || false;\n\n if (!isOrderQuantityLimitsFeatureEnabledInHq) {\n return false;\n }\n\n const useSiteBuilderSettings = this.props.data.featureState.result?.find(\n featureState => featureState.Name === 'RevertToSiteBuilderOrderQuantityLimitsSettings'\n )?.IsEnabled;\n\n if (useSiteBuilderSettings) {\n const defaultOrderQuantityLimitsFeatureConfig = this.props.context?.request?.app?.platform?.enableDefaultOrderQuantityLimits;\n\n const customerInfo = this.props.data.customerInformation.result;\n\n const isOrderQuantityLimitsFeatureEnabledInSiteSettings =\n defaultOrderQuantityLimitsFeatureConfig === 'all' ||\n ((customerInfo &&\n ((defaultOrderQuantityLimitsFeatureConfig === 'b2b' && customerInfo.IsB2b) ||\n (defaultOrderQuantityLimitsFeatureConfig === 'b2c' && !customerInfo.IsB2b))) ??\n false);\n\n return isOrderQuantityLimitsFeatureEnabledInSiteSettings;\n } else {\n const cartConfiguration = this.props.data.cartConfiguration?.result;\n return !(cartConfiguration?.IgnoreOrderSettings ?? false);\n }\n };\n\n private readonly _removeItemFromWishlist = (productId: number): void => {\n const { context, data, telemetry } = this.props;\n const { wishlists } = data;\n let noLongerLineExist: CommerceListLine[] | undefined = [];\n if (context && context.actionContext) {\n const userToken = context.request.user.isAuthenticated && context.request.user.token;\n const wishlistLineId = this._getWishlistLineIdFromProductId(productId);\n if (userToken && wishlists.result && wishlists.result[0] && wishlistLineId) {\n removeLinesAsync({ callerContext: context.actionContext }, wishlists.result[0].Id, [{ LineId: wishlistLineId }])\n .then(commerceList => {\n const castCommerceList: CommerceList | null = commerceList as CommerceList | null;\n\n if (castCommerceList && castCommerceList.Id && context.request.user.isAuthenticated) {\n noLongerLineExist = this._getProductsNoLongerExists(castCommerceList);\n if (noLongerLineExist && noLongerLineExist.length > 0) {\n this._removeNoLongerExistsLines(noLongerLineExist);\n } else {\n context.actionContext.update(createGetByCustomerInput({}, null), [castCommerceList]);\n getItemsInWishlists(new ActiveWishlistInput(), context.actionContext)\n .then(products => {\n const castSimpleProducts: FullProduct[] | null = products as FullProduct[] | null;\n if (castSimpleProducts && castSimpleProducts.length > 0) {\n this.setState({ isError: false });\n context.actionContext.update(new ActiveWishlistInput(), castSimpleProducts);\n }\n })\n .catch(error => {\n telemetry.warning('[wishlist-items] Unable to hyderate the wishlist with product information');\n telemetry.error(error);\n });\n }\n }\n })\n .catch(error => {\n telemetry.warning('[wishlist-items] Unable remove items from the wishlist');\n telemetry.error(error);\n });\n } else {\n telemetry.warning(\"[wishlist-items] Unable remove items from the wishlist user token or lineItemID wasn't found\");\n }\n }\n };\n\n private _getInventoryValueMessage(product: IProductInventoryInformation | undefined, curQuantity: number): string {\n const { context, resources } = this.props;\n const { maxQuantityLimitText } = resources;\n\n const maxQuantityForLineItem = updateMaxQuantityForCartLineItem(context.app.config.maxQuantityForCartLineItem);\n\n if (!product || !product.ProductAvailableQuantity.AvailableQuantity || !context.app.config.enableStockCheck) {\n return maxQuantityLimitText\n .replace('{maxQuantity}', maxQuantityForLineItem.toString())\n .replace('{curQuantity}', curQuantity.toString());\n }\n\n const minInventory = Math.min(maxQuantityForLineItem, product.ProductAvailableQuantity.AvailableQuantity);\n\n return maxQuantityLimitText.replace('{maxQuantity}', minInventory.toString()).replace('{curQuantity}', curQuantity.toString());\n }\n\n private _getProductInventory(\n product: FullProduct,\n productInventoryCollection: IProductInventoryInformation[] | undefined\n ): IProductInventoryInformation | undefined {\n if (productInventoryCollection && productInventoryCollection.length > 0) {\n for (const productResult of productInventoryCollection) {\n if (product.ProductDetails.RecordId === productResult.ProductAvailableQuantity.ProductId) {\n return productResult;\n }\n }\n }\n return undefined;\n }\n\n private readonly _inventoryLabel = (product: FullProduct): string | undefined => {\n const { productAvailability } = this.props.data;\n if (productAvailability && productAvailability.result) {\n const productInventoryInformation = this._getProductInventory(product, productAvailability.result);\n if (productInventoryInformation) {\n return productInventoryInformation.StockLevelLabel;\n }\n }\n\n return undefined;\n };\n\n private readonly _inventoryClassName = (product: FullProduct): string | undefined => {\n const { productAvailability } = this.props.data;\n if (productAvailability && productAvailability.result) {\n const productInventoryInformation = this._getProductInventory(product, productAvailability.result);\n if (productInventoryInformation && productInventoryInformation.StockLevelCode) {\n return `ms-wishlist-items__${productInventoryInformation.StockLevelCode.toLowerCase()}`;\n }\n }\n\n return undefined;\n };\n\n private readonly _isProductInStock = (product: FullProduct): boolean => {\n const { data, context } = this.props;\n const { productAvailability } = data;\n\n if (!context.app.config.enableStockCheck) {\n return true;\n }\n\n if (!productAvailability.result || !product.ProductDetails) {\n return false;\n }\n\n for (const productResult of productAvailability.result) {\n if (\n productResult.ProductAvailableQuantity &&\n productResult.ProductAvailableQuantity.ProductId &&\n productResult.ProductAvailableQuantity.ProductId === product.ProductDetails.RecordId\n ) {\n return productResult.IsProductAvailable;\n }\n }\n\n return false;\n };\n\n private readonly _getWishlistLineIdFromProductId = (productId: number): number | null => {\n const { wishlists } = this.props.data;\n\n if (\n !wishlists.result ||\n wishlists.result.length === 0 ||\n !wishlists.result[0].CommerceListLines ||\n wishlists.result[0].CommerceListLines.length === 0\n ) {\n this.props.telemetry.error('Wishlist content is empty, module wont render.');\n return null;\n }\n\n const foundWishlistItem = wishlists.result[0].CommerceListLines.filter(commerceListLine => {\n return commerceListLine.ProductId === productId;\n });\n\n if (foundWishlistItem && foundWishlistItem[0].LineId) {\n return foundWishlistItem[0].LineId;\n }\n return null;\n };\n\n private readonly _getProductsNoLongerExists = (castCommerceList: CommerceList): CommerceListLine[] | undefined => {\n const noLongerExist: CommerceListLine[] | undefined = [];\n castCommerceList.CommerceListLines?.map(line => {\n const { products } = this.props.data;\n const productsList = products && (products as AsyncResult<FullProduct[]>).result!;\n\n const skipRemove = productsList.filter(product => product.ProductDetails.RecordId === line.ProductId);\n if (skipRemove.length === 0) {\n noLongerExist?.push({ LineId: line.LineId });\n }\n });\n return noLongerExist;\n };\n\n private readonly _removeNoLongerExistsLines = (noLongerLineExist: CommerceListLine[]) => {\n const { context, data, telemetry } = this.props;\n const { wishlists } = data;\n if (context && context.actionContext) {\n const userToken = context.request.user.isAuthenticated && context.request.user.token;\n if (userToken && wishlists.result && wishlists.result[0]) {\n removeLinesAsync({ callerContext: context.actionContext }, wishlists.result[0].Id, noLongerLineExist)\n .then(commerceList => {\n const castCommerceList: CommerceList | null = commerceList as CommerceList | null;\n if (castCommerceList && castCommerceList.Id && context.request.user.isAuthenticated) {\n context.actionContext.update(createGetByCustomerInput({}, null), [castCommerceList]);\n getItemsInWishlists(new ActiveWishlistInput(), context.actionContext)\n .then(products => {\n const castSimpleProducts: FullProduct[] | null = products as FullProduct[] | null;\n if (castSimpleProducts && castSimpleProducts.length > 0) {\n this.setState({ isError: true });\n context.actionContext.update(new ActiveWishlistInput(), castSimpleProducts);\n }\n })\n .catch(error => {\n telemetry.warning('[wishlist-items] Unable to hyderate the wishlist with product information');\n telemetry.error(error);\n });\n }\n })\n .catch(error => {\n telemetry.warning('[wishlist-items] Unable remove items from the wishlist');\n telemetry.error(error);\n });\n } else {\n telemetry.warning(\"[wishlist-items] Unable remove items from the wishlist user token or lineItemID wasn't found\");\n }\n }\n };\n}\n\nexport default WishlistItems;\n","/**\r\n * Copyright (c) Microsoft Corporation\r\n * All rights reserved. See License.txt in the project root for license information.\r\n * ICittaSearchResultContainer 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 const enum expandRefinersCount {\r\n all = 'all',\r\n one = 'one',\r\n two = 'two',\r\n three = 'three',\r\n four = 'four'\r\n}\r\n\r\nexport const enum expandedMenusOnLoad {\r\n none = 'none',\r\n first = 'first',\r\n all = 'all'\r\n}\r\n\r\nexport interface ICittaSearchResultContainerConfig extends Msdyn365.IModuleConfig {\r\n itemsPerPage?: number;\r\n allowBackNavigation?: boolean;\r\n imageSettings?: Msdyn365.IImageSettings;\r\n className?: string;\r\n expandRefinersCount?: expandRefinersCount;\r\n disableHierarchy?: boolean;\r\n includeAttributes?: boolean;\r\n enableAffiliationBasedPricing?: boolean;\r\n expandedMenusOnLoad?: expandedMenusOnLoad;\r\n refinersToBeHidden?: string;\r\n refinersToBeUpdated?: string;\r\n tagsToIgnore?: string;\r\n salesLineTagKey?: string;\r\n}\r\n\r\nexport interface ICittaSearchResultContainerResources {\r\n noResultsForRefinersText: string;\r\n resultCategoryNotFoundText: string;\r\n resultSearchNotFoundText: string;\r\n paginationAriaLabel: string;\r\n priceFree: string;\r\n originalPriceText: string;\r\n currentPriceText: string;\r\n ratingAriaLabel: string;\r\n flipperNext: string;\r\n flipperPrevious: string;\r\n searchTextPrefix: string;\r\n numberOfProducts: string;\r\n oneProduct: string;\r\n categoryLinkAriaLabel: string;\r\n sortByDropdownLabel: string;\r\n sortByOptionNameAsc: string;\r\n sortByOptionNameDesc: string;\r\n sortByOptionPriceAsc: string;\r\n sortByOptionPriceDesc: string;\r\n sortByOptionRatingDesc: string;\r\n sortByOptionRelevanceDesc: string;\r\n placeholderTextMax: string;\r\n minLabel: string;\r\n maxLabel: string;\r\n rangeNameFormat: string;\r\n validationErrorNotNumber: string;\r\n validationErrorNotRange: string;\r\n clearAllText: string;\r\n choiceSummaryLabel: string;\r\n choiceFormat: string;\r\n choiceRangeValueFormat: string;\r\n choiceAriaLabel: string;\r\n modalTitle: string;\r\n modalCloseButtonText: string;\r\n minValueSliderThumbAriaLabel: string;\r\n maxValueSliderThumbAriaLabel: string;\r\n featureSimilarLooksTitle: string;\r\n}\r\n\r\nexport interface ICittaSearchResultContainerProps<T> extends Msdyn365.IModule<T> {\r\n resources: ICittaSearchResultContainerResources;\r\n config: ICittaSearchResultContainerConfig;\r\n}\r\n","import * as React from 'react';\r\ninterface ILink {\r\n className?: string;\r\n text?: string;\r\n href?: string;\r\n ariaLabel?: string;\r\n}\r\n\r\nexport const Link: React.FC<ILink> = ({ text, className, href, ariaLabel }) => (<a className = {className} href={href} aria-label={ariaLabel}> {text} </a>);","/*---------------------------------------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License. See License.txt in the project root for license information.\r\n *--------------------------------------------------------------------------------------------*/\r\nimport { ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\r\nimport { ProductComponent } from '@msdyn365-commerce/components';\r\nimport { ICoreContext, IImageSettings } from '@msdyn365-commerce/core';\r\nimport { ProductSearchResult } from '@msdyn365-commerce/retail-proxy';\r\nimport * as React from 'react';\r\nimport { ICittaSearchResultContainerResources } from '../citta-search-result-container.props.autogenerated';\r\n\r\ninterface IProductSearchResultItems {\r\n products: ProductSearchResult[];\r\n context: ICoreContext;\r\n resources: ICittaSearchResultContainerResources;\r\n imageSettings?: IImageSettings;\r\n moduleType: string;\r\n moduleId: string;\r\n allowBackNavigation?: boolean;\r\n telemetryContent: ITelemetryContent;\r\n}\r\n\r\nexport const ProductSearchResultItems: React.FC<IProductSearchResultItems> = ({\r\n products,\r\n context,\r\n imageSettings,\r\n resources,\r\n moduleType,\r\n moduleId,\r\n allowBackNavigation,\r\n telemetryContent\r\n}) => {\r\n\r\n return (\r\n\r\n <ul className='list-unstyled'>\r\n {products.map((product: ProductSearchResult, index: number) => (\r\n <li className='ms-product-search-result__item' key={index}>\r\n <ProductComponent\r\n context={context}\r\n telemetryContent={telemetryContent}\r\n imageSettings={imageSettings}\r\n freePriceText={resources.priceFree}\r\n originalPriceText={resources.originalPriceText}\r\n currentPriceText={resources.currentPriceText}\r\n ratingAriaLabel={resources.ratingAriaLabel}\r\n allowBack={allowBackNavigation}\r\n id={moduleId}\r\n typeName={moduleType}\r\n data={{product: product}}\r\n />\r\n </li>\r\n ))}\r\n </ul>\r\n );\r\n\r\n};","/*---------------------------------------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License. See License.txt in the project root for license information.\r\n *--------------------------------------------------------------------------------------------*/\r\nimport { getFallbackImageUrl, getProductPageUrlSync } from '@msdyn365-commerce-modules/retail-actions';\r\nimport { getPayloadObject, getTelemetryAttributes, ITelemetryContent ,onTelemetryClick } from '@msdyn365-commerce-modules/utilities';\r\nimport { ICoreContext, IGridSettings, IImageData, IImageSettings, Image} from '@msdyn365-commerce/core';\r\nimport { SimpleProduct } from '@msdyn365-commerce/retail-proxy';\r\nimport * as React from 'react';\r\nimport { ICittaSearchResultContainerResources } from '../citta-search-result-container.props.autogenerated';\r\n// import { IComponent, IComponentProps, ICoreContext, IGridSettings, IImageData, IImageSettings, Image, msdyn365Commerce } from '@msdyn365-commerce/core';\r\n\r\ninterface IFeatureSearchResultItem {\r\n product: SimpleProduct | null;\r\n context: ICoreContext;\r\n resources: ICittaSearchResultContainerResources;\r\n imageSettings?: IImageSettings;\r\n moduleType: string;\r\n moduleId: string;\r\n telemetryContent?: ITelemetryContent;\r\n}\r\n\r\nexport const FeatureSearchResultItem: React.FC<IFeatureSearchResultItem> = ({\r\n product,\r\n context,\r\n imageSettings,\r\n resources,\r\n telemetryContent\r\n}) => {\r\n if(product === null) {\r\n return null;\r\n }\r\n\r\n const productName = product.Name;\r\n const productRecordId = product && product.RecordId ? product.RecordId: 0;\r\n const productUrl = getProductPageUrlSync(product.Name || '', productRecordId, context && context.actionContext, undefined);\r\n const fallbackImage = getFallbackImageUrl(product.ItemId, context.actionContext.requestContext.apiSettings);\r\n\r\n // Construct telemetry attribute to render\r\n const payLoad = getPayloadObject('click', telemetryContent!, productName!, productRecordId.toString());\r\n\r\n const attribute = getTelemetryAttributes(telemetryContent!, payLoad);\r\n return (\r\n <div className='ms-feature-search-result__item'>\r\n <a href={productUrl} onClick={onTelemetryClick(telemetryContent!, payLoad, product.Name!)}{...attribute} aria-label={product.Name}>\r\n <div className='msc-feature-search-result__item__image'>\r\n {renderProductPlacementImage(imageSettings, context.request.gridSettings, product.PrimaryImageUrl, product.Name, fallbackImage)}\r\n </div>\r\n </a>\r\n <div className='msc-feature-search-result__item__detail'>\r\n <p className='msc-feature-search-result__item__heading'>{resources.featureSimilarLooksTitle}</p>\r\n {renderProductTitle(product?.Name)}\r\n </div>\r\n </div>\r\n );\r\n\r\n};\r\n\r\nfunction renderProductPlacementImage(imageSettings?: IImageSettings, gridSettings?: IGridSettings, imageUrl?: string, altText?: string, fallbackImage?: string,): JSX.Element | null {\r\n if (!imageUrl || !gridSettings || !imageSettings) {\r\n return null;\r\n }\r\n const img: IImageData = {\r\n src: imageUrl,\r\n altText: altText ? altText : ''\r\n };\r\n const imageProps = {\r\n gridSettings: gridSettings,\r\n imageSettings: imageSettings,\r\n fallBackSrc: fallbackImage\r\n };\r\n return (\r\n <Image {...img} {...imageProps} loadFailureBehavior='empty' />\r\n );\r\n}\r\n\r\nfunction renderProductTitle(title?: string): JSX.Element | null {\r\nreturn <h1 className='msc-feature-search-result__item__product-title'>{title}</h1>;\r\n}","import * as React from 'react';\r\ninterface ITitle {\r\n className: string;\r\n text: string;\r\n}\r\n\r\nexport const Title: React.FC<ITitle> = ({ text, className }) => (<span className = {className}> {text} </span>);\r\n","import * as React from 'react';\r\ninterface ISeparator {\r\n separator: string;\r\n}\r\n\r\nexport const Separator: React.FC<ISeparator> = ({ separator }) => (<span> {separator} </span>);","import { ITelemetry } from '@msdyn365-commerce/core';\r\nimport { AttributeDataType, ProductRefinerValue, RefinerType } from '@msdyn365-commerce/retail-proxy';\r\nimport { IRefineItemToggleNotification } from './refine-item-toggle-notification';\r\n\r\n/**\r\n * Types of product refiner values\r\n * @deprecated This will be removed soon. Please, use `AttributeDataType` from `@msdyn365-commerce/retail-proxy` instead.\r\n * @example\r\n * ```\r\n * import { AttributeDataType } from `@msdyn365-commerce/retail-proxy`;\r\n * ```\r\n */\r\nexport const enum ProductRefinerValueDataTypeValue {\r\n /**\r\n * Range slider is used for selections like price\r\n * @deprecated This will be removed soon. Please, use `AttributeDataType` from `@msdyn365-commerce/retail-proxy` instead.\r\n * @example\r\n * ```\r\n * import { AttributeDataType } from `@msdyn365-commerce/retail-proxy`;\r\n * ```\r\n */\r\n Range = 1,\r\n\r\n /**\r\n * Range input is a different way to specify ranges and can be expressed with input boxes\r\n * as well as a set of discrete single-select type values\r\n * @deprecated This will be removed soon. Please, use `AttributeDataType` from `@msdyn365-commerce/retail-proxy` instead.\r\n * @example\r\n * ```\r\n * import { AttributeDataType } from `@msdyn365-commerce/retail-proxy`;\r\n * ```\r\n */\r\n RangeInput = 4,\r\n\r\n /**\r\n * This is a discrete list item, either multi-select or single-select\r\n * @deprecated This will be removed soon. Please, use `AttributeDataType` from `@msdyn365-commerce/retail-proxy` instead.\r\n * @example\r\n * ```\r\n * import { AttributeDataType } from `@msdyn365-commerce/retail-proxy`;\r\n * ```\r\n */\r\n List = 5,\r\n\r\n /**\r\n * Boolean types allows only single-select\r\n * @deprecated This will be removed soon. Please, use `AttributeDataType` from `@msdyn365-commerce/retail-proxy` instead.\r\n * @example\r\n * ```\r\n * import { AttributeDataType } from `@msdyn365-commerce/retail-proxy`;\r\n * ```\r\n */\r\n Boolean = 6\r\n}\r\n\r\n/**\r\n * Types of product refiners\r\n * @deprecated This will be removed soon. Please, use `RefinerType` from `@msdyn365-commerce/retail-proxy` instead.\r\n * @example\r\n * ```\r\n * import { RefinerType } from `@msdyn365-commerce/retail-proxy`;\r\n * ```\r\n */\r\nexport const enum ProductRefinerTypeValue {\r\n /**\r\n * Refiner values are single-select\r\n * @deprecated This will be removed soon. Please, use `RefinerType` from `@msdyn365-commerce/retail-proxy` instead.\r\n * @example\r\n * ```\r\n * import { RefinerType } from `@msdyn365-commerce/retail-proxy`;\r\n * ```\r\n */\r\n Single = 0,\r\n\r\n /**\r\n * Refiner values are multi-select\r\n * @deprecated This will be removed soon. Please, use `RefinerType` from `@msdyn365-commerce/retail-proxy` instead.\r\n * @example\r\n * ```\r\n * import { RefinerType } from `@msdyn365-commerce/retail-proxy`;\r\n * ```\r\n */\r\n Multi = 1\r\n}\r\n\r\n/**\r\n * ProductRefinerSource enum type.\r\n * @deprecated This will be removed soon. Please, use `ProductRefinerSource` from `@msdyn365-commerce/retail-proxy` instead.\r\n * @example\r\n * ```\r\n * import { ProductRefinerSource } from `@msdyn365-commerce/retail-proxy`;\r\n * ```\r\n */\r\nexport const enum ProductRefinerSource {\r\n /**\r\n * The None member.\r\n * @deprecated This will be removed soon. Please, use `ProductRefinerSource` from `@msdyn365-commerce/retail-proxy` instead.\r\n * @example\r\n * ```\r\n * import { ProductRefinerSource } from `@msdyn365-commerce/retail-proxy`;\r\n * ```\r\n */\r\n None = 0,\r\n /**\r\n * The Attribute member.\r\n * @deprecated This will be removed soon. Please, use `ProductRefinerSource` from `@msdyn365-commerce/retail-proxy` instead.\r\n * @example\r\n * ```\r\n * import { ProductRefinerSource } from `@msdyn365-commerce/retail-proxy`;\r\n * ```\r\n */\r\n Attribute = 1,\r\n /**\r\n * The Category member.\r\n * @deprecated This will be removed soon. Please, use `ProductRefinerSource` from `@msdyn365-commerce/retail-proxy` instead.\r\n * @example\r\n * ```\r\n * import { ProductRefinerSource } from `@msdyn365-commerce/retail-proxy`;\r\n * ```\r\n */\r\n Category = 2,\r\n /**\r\n * The Price member.\r\n * @deprecated This will be removed soon. Please, use `ProductRefinerSource` from `@msdyn365-commerce/retail-proxy` instead.\r\n * @example\r\n * ```\r\n * import { ProductRefinerSource } from `@msdyn365-commerce/retail-proxy`;\r\n * ```\r\n */\r\n Price = 3,\r\n /**\r\n * The Rating member.\r\n * @deprecated This will be removed soon. Please, use `ProductRefinerSource` from `@msdyn365-commerce/retail-proxy` instead.\r\n * @example\r\n * ```\r\n * import { ProductRefinerSource } from `@msdyn365-commerce/retail-proxy`;\r\n * ```\r\n */\r\n Rating = 4\r\n}\r\n\r\n/**\r\n * Checks if the data type value corresponds to a slider.\r\n */\r\nexport function isRangeType(dataTypeValue: number | undefined): boolean {\r\n return dataTypeValue === AttributeDataType.Currency ||\r\n dataTypeValue === AttributeDataType.Decimal ||\r\n dataTypeValue === AttributeDataType.Integer;\r\n}\r\n\r\n/**\r\n * Find the refinement criterion associated with this product refiner value\r\n * @param productRefinerValue product refiner value to match\r\n * @param refinementCriteria selected refinement criteria\r\n */\r\nexport function findMatchingRefinementCriterion(\r\n productRefinerValue: ProductRefinerValue,\r\n refinementCriteria: ProductRefinerValue[]\r\n): ProductRefinerValue | undefined {\r\n // if the value is a range, then match only on data type value; otherwise match on item string\r\n return refinementCriteria.find(\r\n (refinementCriterion: ProductRefinerValue) => isMatchingRefinementCriterion(productRefinerValue, refinementCriterion)\r\n );\r\n}\r\n\r\n/**\r\n * Find the refinement criterion associated with this product refiner value\r\n * @param productRefinerValue product refiner value to match\r\n * @param refinementCriteria selected refinement criteria\r\n */\r\nexport function isMatchingRefinementCriterion(\r\n productRefinerValue: ProductRefinerValue,\r\n refinementCriterion: ProductRefinerValue\r\n): boolean {\r\n // if the value is a range, then match only on data type value; otherwise match on item string\r\n return refinementCriterion.RefinerRecordId === productRefinerValue.RefinerRecordId &&\r\n refinementCriterion.RefinerSourceValue === productRefinerValue.RefinerSourceValue &&\r\n refinementCriterion.DataTypeValue === productRefinerValue.DataTypeValue &&\r\n (isRangeType(refinementCriterion.DataTypeValue) || refinementCriterion.LeftValueBoundString === productRefinerValue.LeftValueBoundString);\r\n}\r\n\r\nexport function getUpdatedRefinementCriteria(\r\n itemToggleNotification: IRefineItemToggleNotification,\r\n currentRefinementCriteria: ProductRefinerValue[]): ProductRefinerValue[] {\r\n const updatedRefinementCriteria: ProductRefinerValue[] = [];\r\n let toggledItemFound = false;\r\n currentRefinementCriteria.forEach((selectedCriterion: ProductRefinerValue) => {\r\n if (isMatchingRefinementCriterion(itemToggleNotification.productRefinerValue, selectedCriterion)) {\r\n toggledItemFound = true;\r\n if (itemToggleNotification.isSelecting) {\r\n const next = {\r\n ...selectedCriterion,\r\n LeftValueBoundString: itemToggleNotification.rangeStart !== undefined && `${itemToggleNotification.rangeStart}` || selectedCriterion.LeftValueBoundString,\r\n RightValueBoundString: itemToggleNotification.rangeEnd !== undefined && `${itemToggleNotification.rangeEnd}` || selectedCriterion.RightValueBoundString,\r\n };\r\n updatedRefinementCriteria.push(next);\r\n\r\n } // else the item is being de-selected, so omit it from the refinement criteria\r\n } else {\r\n // keep existing criterion because it is not in the item toggle notification\r\n updatedRefinementCriteria.push(selectedCriterion);\r\n }\r\n });\r\n\r\n if (!toggledItemFound) {\r\n const next = {\r\n ...itemToggleNotification.productRefinerValue,\r\n LeftValueBoundString: itemToggleNotification.rangeStart !== undefined && `${itemToggleNotification.rangeStart}` || itemToggleNotification.productRefinerValue.LeftValueBoundString,\r\n RightValueBoundString: itemToggleNotification.rangeEnd !== undefined && `${itemToggleNotification.rangeEnd}` || itemToggleNotification.productRefinerValue.RightValueBoundString,\r\n };\r\n updatedRefinementCriteria.push(next);\r\n\r\n // If single select, then deselect any others in the parent refiner group\r\n if ((itemToggleNotification.productRefinerValue.DataTypeValue === AttributeDataType.Text || itemToggleNotification.productRefinerValue.DataTypeValue === AttributeDataType.TrueFalse) &&\r\n itemToggleNotification.parentProductRefinerHierarchy.RefinerTypeValue === RefinerType.SingleSelect) {\r\n itemToggleNotification.parentProductRefinerHierarchy.Values.forEach((child: ProductRefinerValue) => {\r\n if (child.RefinerRecordId === next.RefinerRecordId && child.LeftValueBoundString === next.LeftValueBoundString) {\r\n // do nothing\r\n } else {\r\n const matchingIndex = updatedRefinementCriteria.findIndex((criterion: ProductRefinerValue) => isMatchingRefinementCriterion(child, criterion));\r\n if (matchingIndex > -1) {\r\n updatedRefinementCriteria.splice(matchingIndex, 1);\r\n }\r\n }\r\n });\r\n }\r\n }\r\n\r\n return updatedRefinementCriteria;\r\n}\r\n\r\nexport function formatPrice(\r\n amount: string | undefined,\r\n currency: string | undefined,\r\n locale: string | undefined,\r\n telemetry: ITelemetry): string {\r\n if (!amount || !currency) {\r\n telemetry.trace(`[refine-menu.utilities.formatPrice] could not format price for ${amount} ${currency}`);\r\n return amount || '';\r\n }\r\n const priceAmount = (amount && Number(amount)) || 0;\r\n let result: string;\r\n\r\n try {\r\n result = new Intl.NumberFormat(locale, {\r\n style: 'currency',\r\n currencyDisplay: 'symbol',\r\n currency: currency,\r\n minimumFractionDigits: 0\r\n }).format(priceAmount);\r\n } catch (e) {\r\n result = `${priceAmount} ${currency}`;\r\n telemetry.warning(`[refine-menu.utilities.formatPrice] Failed to format price for ${result}: ${e}`);\r\n }\r\n\r\n return result;\r\n}","import { Slider } from '@msdyn365-commerce-modules/utilities';\r\nimport debounce from 'lodash/debounce';\r\nimport { computed } from 'mobx';\r\nimport { observer } from 'mobx-react';\r\nimport * as React from 'react';\r\nimport { formatPrice } from './utilities';\r\n\r\ntype InputType = 'Min' | 'Max';\r\n\r\nimport { IRefineItemProps, IRefineItemState } from './refine-item';\r\n\r\nexport type RangeRefineItemType = 'slider' | 'input';\r\n\r\n/**\r\n * Range refine item properties\r\n */\r\nexport interface IRangeRefineItemProps extends IRefineItemProps {\r\n rangeType: RangeRefineItemType;\r\n minValueSliderThumbAriaLabel?: string;\r\n maxValueSliderThumbAriaLabel?: string;\r\n}\r\n\r\n/**\r\n * Range refine item state\r\n */\r\nexport interface IRangeRefineItemState extends IRefineItemState {\r\n validationErrorMin: string | undefined;\r\n validationErrorMax: string | undefined;\r\n selectedMin: string | undefined;\r\n selectedMax: string | undefined;\r\n touchedMin: boolean;\r\n touchedMax: boolean;\r\n}\r\n\r\n/**\r\n * RangeRefineItem component (controlled by RefineSubmenu)\r\n */\r\n@observer\r\nexport default class RangeRefineItem extends React.Component<IRangeRefineItemProps, IRangeRefineItemState> {\r\n private _formattedPriceReverseLookup: Map<string, string> = new Map();\r\n\r\n private minInput: React.RefObject<HTMLInputElement>;\r\n private maxInput: React.RefObject<HTMLInputElement>;\r\n\r\n @computed get currencyCode(): string {\r\n return this.props.productRefinerValue.UnitText || '';\r\n }\r\n\r\n constructor(props: IRangeRefineItemProps) {\r\n super(props);\r\n this._onRangeUpdate = this._onRangeUpdate.bind(this);\r\n this._onRangeUpdateEnd = this._onRangeUpdateEnd.bind(this);\r\n this._handleRangeTooltipText = this._handleRangeTooltipText.bind(this);\r\n this._changeMin = this._changeMin.bind(this);\r\n this._changeMax = this._changeMax.bind(this);\r\n this._finishChangeMin = this._finishChangeMin.bind(this);\r\n this._finishChangeMax = this._finishChangeMax.bind(this);\r\n\r\n this.minInput = React.createRef<HTMLInputElement>();\r\n this.maxInput = React.createRef<HTMLInputElement>();\r\n\r\n const { selectedRefinementCriterion } = this.props;\r\n const initialMin = selectedRefinementCriterion && selectedRefinementCriterion.LeftValueBoundString || '0';\r\n const initialMax = selectedRefinementCriterion && selectedRefinementCriterion.RightValueBoundString || undefined;\r\n this.state = {\r\n isChecked: false,\r\n validationErrorMin: undefined,\r\n validationErrorMax: undefined,\r\n selectedMin: initialMin,\r\n selectedMax: initialMax,\r\n touchedMin: false,\r\n touchedMax: false\r\n };\r\n }\r\n\r\n public render(): JSX.Element | undefined {\r\n const { productRefinerValue, parentProductRefinerHierarchy, refineItemCommonProps } = this.props;\r\n\r\n if (!productRefinerValue || !parentProductRefinerHierarchy) {\r\n refineItemCommonProps.telemetry.error('Cannot render refine value range without productRefinerValue and parentProductRefinerHierarchy');\r\n return undefined;\r\n }\r\n\r\n if (this.props.rangeType === 'input') {\r\n return this._renderInputFields();\r\n }\r\n\r\n return this._renderSlider();\r\n }\r\n\r\n private _renderInputFields(): JSX.Element | undefined {\r\n const { isDisabled, parentProductRefinerHierarchy, refineItemCommonProps } = this.props;\r\n const { selectedMin, selectedMax, touchedMin, touchedMax, validationErrorMin, validationErrorMax } = this.state;\r\n\r\n const rangeAriaLabel = (refineItemCommonProps.rangeNameFormat || '{0}').replace('{0}', (parentProductRefinerHierarchy.KeyName || ''));\r\n const formAttrs = {\r\n 'aria-label': rangeAriaLabel,\r\n 'aria-disabled': isDisabled\r\n };\r\n\r\n // To enable price formatting of selected fields, this is the approach:\r\n // initial value: min=0 formatted as price, max=undefined\r\n // onFocus/onChange: convert to number (unformat) and mark as touched to indicate value is being edited\r\n // onBlur: validate and format entered value as price\r\n const minInputClassName = `ms-refine-submenu__input-range refine-submenu__input-range-min ${validationErrorMin ? 'refine-submenu__input-range--error' : ''}`;\r\n const maxInputClassName = `ms-refine-submenu__input-range refine-submenu__input-range-max ${validationErrorMax ? 'refine-submenu__input-range--error' : ''}`;\r\n const minLabelClassName = 'ms-refine-submenu__input-range-label refine-submenu__input-range-label-min';\r\n const maxLabelClassName = 'ms-refine-submenu__input-range-label refine-submenu__input-range-label-max';\r\n const formattedSelectedMin = this._getFormattedSelectedValue(selectedMin, touchedMin, validationErrorMin);\r\n const formattedSelectedMax = this._getFormattedSelectedValue(selectedMax, touchedMax, validationErrorMax);\r\n return (\r\n <form className='ms-refine-submenu__input-range-refiner' {...formAttrs}>\r\n <label className={minLabelClassName}>\r\n {refineItemCommonProps.minLabel}\r\n <input\r\n className={minInputClassName}\r\n onChange={this._changeMin}\r\n onFocus={this._changeMin}\r\n onBlur={this._finishChangeMin}\r\n value={formattedSelectedMin}\r\n ref={this.minInput}\r\n />\r\n </label>\r\n <label className={maxLabelClassName}>\r\n {refineItemCommonProps.maxLabel}\r\n <input\r\n className={maxInputClassName}\r\n placeholder={formattedSelectedMax ? undefined : refineItemCommonProps.placeholderTextMax}\r\n onChange={this._changeMax}\r\n onFocus={this._changeMax}\r\n onBlur={this._finishChangeMax}\r\n value={formattedSelectedMax}\r\n ref={this.maxInput}\r\n />\r\n </label>\r\n {validationErrorMin &&\r\n <span className='ms-refine-submenu__input-range-error-text refine-submenu__input-range-min-error-text'>{validationErrorMin}</span>\r\n }\r\n {validationErrorMax && validationErrorMin !== validationErrorMax &&\r\n <span className='ms-refine-submenu__input-range-error-text refine-submenu__input-range-max-error-text'>{validationErrorMax}</span>\r\n }\r\n </form>\r\n );\r\n }\r\n\r\n private _renderSlider(): JSX.Element | undefined {\r\n const { isDisabled, productRefinerValue, parentProductRefinerHierarchy, selectedRefinementCriterion } = this.props;\r\n const min = productRefinerValue.LeftValueBoundString;\r\n const max = productRefinerValue.RightValueBoundString;\r\n const selectedMin = selectedRefinementCriterion && selectedRefinementCriterion.LeftValueBoundString || productRefinerValue.LeftValueBoundString || '0';\r\n const selectedMax = selectedRefinementCriterion && selectedRefinementCriterion.RightValueBoundString || productRefinerValue.RightValueBoundString || max;\r\n const sliderId = `slider_${parentProductRefinerHierarchy.RecordId}_${productRefinerValue.RefinerRecordId}`;\r\n const ariaAttributes = {\r\n 'aria-disabled': isDisabled\r\n };\r\n\r\n const minPrice = this._formatPrice(min);\r\n const maxPrice = this._formatPrice(max);\r\n const selectedMinPrice =this._formatPrice(selectedMin);\r\n const selectedMaxPrice =this._formatPrice(selectedMax);\r\n\r\n return (\r\n <Slider\r\n className={'ms-refine-submenu__range-refiner'}\r\n key={sliderId}\r\n id={sliderId}\r\n inForm={false}\r\n min={min && Number(min) || undefined}\r\n max={max && Number(max) || undefined}\r\n step={1}\r\n orientation={'horizontal'}\r\n labels={[\r\n {\r\n labelId: `${sliderId}_start`,\r\n labelString: `${minPrice}`,\r\n labelPositioning: 'start'\r\n },\r\n {\r\n labelId: `${sliderId}_end`,\r\n labelString: `${maxPrice}`,\r\n labelPositioning: 'end'\r\n }\r\n ]}\r\n showLabels={true}\r\n showTooltip={true}\r\n sliderThumbs={[\r\n {\r\n id: `${sliderId}_slider_thumb_start`,\r\n value: selectedMin && Number(selectedMin) || 0,\r\n ariaLabel: `${this.props.minValueSliderThumbAriaLabel} ${this.currencyCode}`,\r\n ariaValueText: `${selectedMinPrice}`\r\n },\r\n {\r\n id: `${sliderId}_slider_thumb_end`,\r\n value: Number(selectedMax) || Number(maxPrice),\r\n ariaLabel: `${this.props.maxValueSliderThumbAriaLabel} ${this.currencyCode}`,\r\n ariaValueText: `${selectedMaxPrice}`\r\n }\r\n ]}\r\n onChangeEnd={this._onRangeUpdateEnd}\r\n onChange={debounce(this._onRangeUpdate, 500)}\r\n handleTooltipText={this._handleRangeTooltipText}\r\n {...ariaAttributes}\r\n />\r\n );\r\n }\r\n\r\n private _changeMin(event: React.FocusEvent<HTMLInputElement>): void {\r\n this._changeValue(event, 'Min');\r\n }\r\n\r\n private _changeMax(event: React.FocusEvent<HTMLInputElement>): void {\r\n this._changeValue(event, 'Max');\r\n }\r\n\r\n private _changeValue(event: React.FocusEvent<HTMLInputElement>, inputType: InputType): void {\r\n const selectedKey = `selected${inputType}`;\r\n const touchedKey = `touched${inputType}`;\r\n this.setState({\r\n [selectedKey]: this._getInputWithoutFormatting(event.currentTarget.value),\r\n [touchedKey]: true\r\n });\r\n }\r\n\r\n private _finishChangeMin(event: React.FocusEvent<HTMLInputElement>): boolean {\r\n const selectedMinValue = this._getInputWithoutFormatting(event.currentTarget.value);\r\n this.setState({\r\n selectedMin: selectedMinValue,\r\n minTouched: false\r\n });\r\n const minInput = Number(selectedMinValue);\r\n const { onToggle, parentProductRefinerHierarchy, productRefinerValue, refineItemCommonProps, selectedRefinementCriterion } = this.props;\r\n const max = selectedRefinementCriterion && selectedRefinementCriterion.RightValueBoundString || undefined;\r\n\r\n const maxNum = max ? Number(max) : undefined;\r\n\r\n if (isNaN(minInput)) {\r\n this.setState({validationErrorMin: refineItemCommonProps.validationErrorNaN});\r\n this._focus('Min');\r\n return false;\r\n }\r\n\r\n if (this._validateRange(minInput, maxNum)) {\r\n onToggle({\r\n parentProductRefinerHierarchy: parentProductRefinerHierarchy,\r\n productRefinerValue: productRefinerValue,\r\n isSelecting: true,\r\n rangeStart: minInput,\r\n rangeEnd: maxNum\r\n });\r\n return true;\r\n } else {\r\n this._focus('Min');\r\n }\r\n\r\n return false;\r\n }\r\n\r\n private _finishChangeMax(event: React.FocusEvent<HTMLInputElement>): boolean {\r\n const selectedMaxValue = this._getInputWithoutFormatting(event.currentTarget.value);\r\n this.setState({\r\n selectedMax: selectedMaxValue,\r\n maxTouched: false\r\n });\r\n const maxInput = Number(selectedMaxValue);\r\n const { onToggle, parentProductRefinerHierarchy, productRefinerValue, refineItemCommonProps, selectedRefinementCriterion } = this.props;\r\n const min = selectedRefinementCriterion && selectedRefinementCriterion.LeftValueBoundString || '0';\r\n\r\n const minNum = Number(min);\r\n\r\n if (isNaN(maxInput)) {\r\n this.setState({validationErrorMax: refineItemCommonProps.validationErrorNaN});\r\n this._focus('Max');\r\n return false;\r\n }\r\n\r\n if (this._validateRange(minNum, maxInput)) {\r\n if (productRefinerValue) {\r\n onToggle({\r\n parentProductRefinerHierarchy: parentProductRefinerHierarchy,\r\n productRefinerValue: productRefinerValue,\r\n isSelecting: true,\r\n rangeStart: minNum,\r\n rangeEnd: maxInput\r\n });\r\n } else {\r\n this._focus('Max');\r\n }\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n private _focus(inputType: InputType): void {\r\n const ref = inputType === 'Max' ? this.maxInput : this.minInput;\r\n\r\n setTimeout(() => {\r\n if (ref && ref.current) {\r\n ref.current.focus();\r\n }\r\n }, 50);\r\n }\r\n\r\n private _getFormattedSelectedValue(selected: string | undefined, touched: boolean, validationError: string | undefined): string | undefined {\r\n if (touched || validationError || selected === undefined) {\r\n return selected;\r\n }\r\n return this._formatPrice(selected);\r\n }\r\n\r\n private _validateRange(min: number, max: number | undefined): boolean {\r\n const { refineItemCommonProps } = this.props;\r\n if (max === undefined) {\r\n return true;\r\n }\r\n\r\n if (min > max) {\r\n this.setState({\r\n validationErrorMin: refineItemCommonProps.validationErrorRange,\r\n validationErrorMax: refineItemCommonProps.validationErrorRange\r\n });\r\n return false;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n private _formatPrice(amount: string | undefined): string {\r\n const locale = this.props.refineItemCommonProps.locale;\r\n const result = formatPrice(amount, this.currencyCode, locale, this.props.refineItemCommonProps.telemetry);\r\n\r\n if (amount !== undefined && !this._formattedPriceReverseLookup.has(result)) {\r\n this._formattedPriceReverseLookup.set(result, amount);\r\n }\r\n\r\n return result;\r\n }\r\n\r\n private _getInputWithoutFormatting(input: string): string {\r\n // First try to cast raw input to a number\r\n const inputAsNum = Number(input);\r\n if (!isNaN(inputAsNum)) {\r\n return input;\r\n }\r\n\r\n // Otherwise try a reverse lookup and fall back to the raw input if all else fails\r\n const reverseLookupResult = this._formattedPriceReverseLookup.get(input);\r\n return reverseLookupResult || input;\r\n }\r\n\r\n // NOTE: Fix types once Shared Components build pipeline bug fixed\r\n // tslint:disable-next-line:no-any\r\n private _onRangeUpdate(sliderChangeNotification: any): void {\r\n // Need to filter out mousemove events as these cause errors after the menu updates and slider re-renders\r\n if (sliderChangeNotification.eventType !== 'mousemove') {\r\n const { onToggle, parentProductRefinerHierarchy, productRefinerValue } = this.props;\r\n if (productRefinerValue && sliderChangeNotification) {\r\n onToggle({\r\n parentProductRefinerHierarchy: parentProductRefinerHierarchy,\r\n productRefinerValue: productRefinerValue,\r\n isSelecting: true,\r\n rangeStart: sliderChangeNotification.firstThumbValue,\r\n rangeEnd: sliderChangeNotification.secondThumbValue\r\n });\r\n\r\n this._focusOnSliderThumb(sliderChangeNotification);\r\n }\r\n }\r\n }\r\n\r\n // tslint:disable-next-line\r\n private _onRangeUpdateEnd(sliderChangeNotification: any): void {\r\n const { onToggle, parentProductRefinerHierarchy, productRefinerValue } = this.props;\r\n if (productRefinerValue && sliderChangeNotification) {\r\n onToggle({\r\n parentProductRefinerHierarchy: parentProductRefinerHierarchy,\r\n productRefinerValue: productRefinerValue,\r\n isSelecting: true,\r\n rangeStart: sliderChangeNotification.firstThumbValue,\r\n rangeEnd: sliderChangeNotification.secondThumbValue\r\n });\r\n\r\n this._focusOnSliderThumb(sliderChangeNotification);\r\n }\r\n }\r\n\r\n // tslint:disable-next-line\r\n private _focusOnSliderThumb(sliderChangeNotification: any): void {\r\n if (sliderChangeNotification.id) {\r\n const element = document.getElementById(`${sliderChangeNotification.id}range`);\r\n if (!!element) {\r\n setTimeout(\r\n () => {\r\n element.focus();\r\n }, 0);\r\n }\r\n }\r\n }\r\n\r\n private _handleRangeTooltipText(tooltip: number): string {\r\n return this._formatPrice(`${tooltip}`);\r\n }\r\n}","import { getPayloadObject, getTelemetryAttributes, IPayLoad, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\r\nimport { IProductRefinerHierarchy } from '@msdyn365-commerce/commerce-entities';\r\nimport { RatingComponent } from '@msdyn365-commerce/components';\r\nimport { ICoreContext } from '@msdyn365-commerce/core';\r\nimport { ProductRefinerSource, ProductRefinerValue, RefinerType } from '@msdyn365-commerce/retail-proxy';\r\nimport * as React from 'react';\r\nimport { IRefineItemToggleNotification } from './refine-item-toggle-notification';\r\nimport { IRefineItemCommonProps } from './refine-item.props.common';\r\n\r\n/**\r\n * RefineItem properties\r\n */\r\nexport interface IRefineItemProps {\r\n\r\n parentProductRefinerHierarchy: IProductRefinerHierarchy;\r\n productRefinerValue: ProductRefinerValue;\r\n selectedRefinementCriterion: ProductRefinerValue | undefined;\r\n selectedRefinerValues?: ProductRefinerValue[];\r\n refineItemCommonProps: IRefineItemCommonProps;\r\n isDisabled: boolean;\r\n context: ICoreContext;\r\n moduleId: string;\r\n moduleTypeName: string;\r\n index?: number;\r\n /** The telemetry content */\r\n telemetryContent?: ITelemetryContent;\r\n onToggle(notfication: Readonly<IRefineItemToggleNotification>): void;\r\n urlBuilder(refiner: IRefineItemToggleNotification): string;\r\n}\r\n\r\n/**\r\n * Refine item state\r\n */\r\nexport interface IRefineItemState extends React.ComponentState {\r\n isChecked: boolean;\r\n renderingError?: object;\r\n}\r\n\r\n/**\r\n * Single-select and multi-select refine item component (controlled by RefineSubmenu)\r\n */\r\nexport default class RefineItem extends React.Component<IRefineItemProps, IRefineItemState> {\r\n private anchorType: React.RefObject<HTMLAnchorElement>;\r\n private payLoad: IPayLoad;\r\n\r\n constructor(props: IRefineItemProps) {\r\n super(props);\r\n this._onClick = this._onClick.bind(this);\r\n this.state = {\r\n isChecked: !!this.props.selectedRefinementCriterion\r\n };\r\n this.anchorType = React.createRef();\r\n this.payLoad = getPayloadObject('click', this.props.telemetryContent!, '');\r\n }\r\n\r\n // tslint:disable-next-line:max-func-body-length\r\n public render(): JSX.Element | undefined {\r\n const {\r\n isDisabled,\r\n refineItemCommonProps,\r\n parentProductRefinerHierarchy,\r\n productRefinerValue,\r\n selectedRefinementCriterion,\r\n index,\r\n // @ts-ignore\r\n children,\r\n onToggle,\r\n context,\r\n telemetryContent,\r\n ...attrs\r\n } = this.props;\r\n if (!productRefinerValue) {\r\n refineItemCommonProps.telemetry.error('[refine-item] Cannot render refineItem without productRefinerValue');\r\n return undefined;\r\n }\r\n if (!productRefinerValue.LeftValueBoundString) {\r\n refineItemCommonProps.telemetry.warning(`[refine-item] RefineItem without LeftValueBoundString: ${JSON.stringify(productRefinerValue)}`);\r\n }\r\n const isSingleSelect = parentProductRefinerHierarchy.RefinerTypeValue === RefinerType.SingleSelect;\r\n let itemTypeClassName = isSingleSelect ? 'single-select' : 'multi-select';\r\n itemTypeClassName = `ms-refine-submenu-item ${itemTypeClassName}`;\r\n const inputType = isSingleSelect ? 'radio' : 'checkbox';\r\n const isChecked = !!selectedRefinementCriterion;\r\n itemTypeClassName = isChecked ? `${itemTypeClassName}-checked` : itemTypeClassName;\r\n if (parentProductRefinerHierarchy.SourceValue === ProductRefinerSource.Rating) {\r\n if (productRefinerValue.LeftValueBoundString) {\r\n this.payLoad.contentAction.etext = productRefinerValue.LeftValueBoundLocalizedString;\r\n const attribute = getTelemetryAttributes(telemetryContent!, this.payLoad);\r\n const refinerRating = parseInt(productRefinerValue.LeftValueBoundString, 10);\r\n const ratingRefiner = this.props.selectedRefinerValues?.find(value => value.DataTypeValue === productRefinerValue.DataTypeValue);\r\n const selectedRating = parseInt(ratingRefiner?.LeftValueBoundString || '0', 10);\r\n let ratingComponentClass: string = 'ms-rating-component';\r\n if (refinerRating > selectedRating) {\r\n ratingComponentClass = `${ratingComponentClass}__up`;\r\n } else if (refinerRating < selectedRating) {\r\n ratingComponentClass = `${ratingComponentClass}__down`;\r\n } else {\r\n ratingComponentClass = `${ratingComponentClass}__current`;\r\n }\r\n return (\r\n <li\r\n className='ms-refine-submenu-item'\r\n role='radio'\r\n aria-checked={isChecked}\r\n id={`${parentProductRefinerHierarchy.KeyName! }_${index}`}\r\n aria-label={`${parentProductRefinerHierarchy.KeyName!}_${index}`}\r\n >\r\n <a\r\n href={this._getRefinerUrl()}\r\n aria-label={`${parentProductRefinerHierarchy.KeyName!}_${productRefinerValue.LeftValueBoundLocalizedString}`}\r\n onClick={this._onClick}\r\n {...attribute}\r\n >\r\n <RatingComponent\r\n className={ratingComponentClass}\r\n avgRating={refinerRating}\r\n ratingCount={productRefinerValue.LeftValueBoundLocalizedString ?? productRefinerValue.LeftValueBoundString}\r\n hideCount={false}\r\n readOnly={true}\r\n ariaLabel=''\r\n context={context}\r\n id={this.props.moduleId}\r\n typeName={this.props.moduleTypeName}\r\n data={{}}\r\n />\r\n <span className='refine-submenu-item__rating'>{productRefinerValue.Count !== undefined && `(${productRefinerValue.Count})`}</span>\r\n </a>\r\n </li>\r\n );\r\n } else {\r\n return undefined;\r\n }\r\n } else {\r\n this.payLoad.contentAction.etext = productRefinerValue.LeftValueBoundLocalizedString || productRefinerValue.LeftValueBoundString;\r\n const attribute = getTelemetryAttributes(telemetryContent!, this.payLoad);\r\n return (\r\n <li className='ms-refine-submenu-item' id={`${parentProductRefinerHierarchy.KeyName!}_${index}`}>\r\n <a\r\n key={!!selectedRefinementCriterion ? 'true' : 'false'}\r\n ref={this.anchorType}\r\n href={this._getRefinerUrl()}\r\n tabIndex={0}\r\n onClick={this._onClick}\r\n className={itemTypeClassName}\r\n role={inputType}\r\n aria-checked={!!selectedRefinementCriterion}\r\n {...attribute}\r\n {...attrs}\r\n >\r\n <span className='ms-refine-submenu-item__label'>\r\n {productRefinerValue.LeftValueBoundLocalizedString || productRefinerValue.LeftValueBoundString}\r\n {productRefinerValue.Count !== undefined && ` (${productRefinerValue.Count})`}\r\n </span>\r\n </a>\r\n </li>\r\n );\r\n }\r\n }\r\n\r\n private _getRefinerUrl(): string {\r\n const { urlBuilder, parentProductRefinerHierarchy, productRefinerValue, selectedRefinementCriterion } = this.props;\r\n\r\n if (productRefinerValue) {\r\n return urlBuilder({\r\n parentProductRefinerHierarchy: parentProductRefinerHierarchy,\r\n productRefinerValue: productRefinerValue,\r\n isSelecting: !selectedRefinementCriterion\r\n });\r\n }\r\n\r\n return '';\r\n }\r\n\r\n private _onClick = (e: React.MouseEvent<HTMLAnchorElement | HTMLInputElement>): void => {\r\n e.preventDefault();\r\n\r\n const { parentProductRefinerHierarchy, productRefinerValue, selectedRefinementCriterion } = this.props;\r\n if (productRefinerValue) {\r\n this.props.onToggle({\r\n parentProductRefinerHierarchy: parentProductRefinerHierarchy,\r\n productRefinerValue: productRefinerValue,\r\n isSelecting: !selectedRefinementCriterion\r\n });\r\n\r\n setTimeout(\r\n () => {\r\n this.anchorType.current && this.anchorType.current.focus();\r\n },\r\n 0\r\n );\r\n }\r\n }\r\n}","import { getPayloadObject, getTelemetryAttributes, IPayLoad } from '@msdyn365-commerce-modules/utilities';\r\nimport { IProductRefinerHierarchy } from '@msdyn365-commerce/commerce-entities';\r\nimport { ProductRefinerValue } from '@msdyn365-commerce/retail-proxy';\r\nimport classnames from 'classnames';\r\nimport { get } from 'lodash';\r\nimport { computed } from 'mobx';\r\nimport { observer } from 'mobx-react';\r\nimport * as React from 'react';\r\nimport { IChoiceSummaryProps } from './choice-summary.props';\r\nimport { isMatchingRefinementCriterion, isRangeType } from './utilities';\r\n\r\ninterface IRefinerMap {\r\n key: string;\r\n value: ProductRefinerValue;\r\n}\r\n\r\n /**\r\n * ChoiceSummary component\r\n */\r\n@observer\r\nexport default class ChoiceSummary extends React.Component<IChoiceSummaryProps> {\r\n private closeButtonGlyph: string = 'msi-close-btn';\r\n private payLoad: IPayLoad;\r\n\r\n @computed get selectedRefinersMap(): IRefinerMap[] {\r\n const { selectedChoices } = this.props;\r\n return selectedChoices.map((selectedRefiner: ProductRefinerValue) => {\r\n return {\r\n key: this._getKeyForRefinerValue(selectedRefiner),\r\n value: selectedRefiner\r\n } as IRefinerMap;\r\n });\r\n }\r\n\r\n constructor(props: Readonly<IChoiceSummaryProps>) {\r\n super(props);\r\n this.payLoad = getPayloadObject('click', this.props.telemetryContent!, '');\r\n }\r\n\r\n public render(): JSX.Element {\r\n const { clearAllText, label, classNames, choiceAriaLabel } = this.props;\r\n const items = this.selectedRefinersMap;\r\n this.payLoad.contentAction.etext = clearAllText;\r\n const clearAllAttributes = getTelemetryAttributes(this.props.telemetryContent!, this.payLoad);\r\n return (\r\n <div className='msc-choice-summary'>\r\n {items.length > 0 && label && <span className='msc-choice-summary__label'>{label}</span>}\r\n <ul className={classnames(classNames, 'msc-choice-summary__list', 'list-unstyled')}>\r\n {items.map((item: IRefinerMap, index: number) => {\r\n const listItemProps = {\r\n 'aria-posinset': index,\r\n 'aria-setsize': items.length\r\n };\r\n\r\n this.payLoad.contentAction.etext = item.key;\r\n const attribute = getTelemetryAttributes(this.props.telemetryContent!, this.payLoad);\r\n\r\n return (\r\n <li className='msc-choice-summary__list-item' key={item.key} {...listItemProps}>\r\n <a\r\n className='msc-choice-summary__item'\r\n href={this.props.urlBuilder(item.value, false)}\r\n aria-label={`${item.key} ${choiceAriaLabel}`}\r\n onClick={this._onClick}\r\n {...attribute}\r\n >\r\n {item.key}\r\n <span className={`${this.closeButtonGlyph} msc-choice-summary__glyph`} />\r\n </a>\r\n </li>\r\n );\r\n })}\r\n </ul>\r\n {items.length > 0 && clearAllText && <a href={this.props.urlBuilder({}, true)} className={'msc-choice-summary__clear-all'} {...clearAllAttributes} onClick={this._onClick}>{clearAllText}</a>}\r\n </div>\r\n );\r\n }\r\n\r\n private _getKeyForRefinerValue(productRefinerValue: ProductRefinerValue): string {\r\n const { choiceFormat, choiceRangeValueFormat, refinerHierarchy, telemetry } = this.props;\r\n const overallFormat = choiceFormat || '{1}';\r\n const rangeFormat = choiceRangeValueFormat;\r\n let refinerName = '';\r\n if (refinerHierarchy && refinerHierarchy.find) {\r\n const parent = refinerHierarchy.find(\r\n (hierarchy: IProductRefinerHierarchy) =>\r\n !!hierarchy.Values.find((value: ProductRefinerValue) => isMatchingRefinementCriterion(value, productRefinerValue))\r\n );\r\n\r\n if (!parent) {\r\n telemetry.warning('[choice-summary] could not find parent of selected refiner value');\r\n } else {\r\n refinerName = parent.KeyName || '';\r\n }\r\n }\r\n\r\n let refinerValueName: string;\r\n if (isRangeType(productRefinerValue.DataTypeValue)) {\r\n refinerValueName = rangeFormat\r\n .replace('{0}', this._formatPrice(productRefinerValue.LeftValueBoundString, productRefinerValue.UnitText))\r\n .replace('{1}', this._formatPrice(productRefinerValue.RightValueBoundString, productRefinerValue.UnitText));\r\n } else {\r\n refinerValueName = productRefinerValue.LeftValueBoundLocalizedString || productRefinerValue.LeftValueBoundString || '';\r\n }\r\n\r\n return overallFormat.replace('{0}', refinerName).replace('{1}', refinerValueName);\r\n }\r\n\r\n private _formatPrice(amount: string | undefined, currency: string | undefined): string {\r\n if (!amount || !currency) {\r\n this.props.telemetry.trace('[choice-summary] could not format price');\r\n return amount || '';\r\n }\r\n const priceAmount = (amount && Number(amount)) || 0;\r\n const locale = get(this.props, 'context.request.locale', 'en-US');\r\n let result: string;\r\n\r\n try {\r\n result = new Intl.NumberFormat(locale, {\r\n style: 'currency',\r\n currencyDisplay: 'symbol',\r\n currency: currency,\r\n minimumFractionDigits: 0\r\n }).format(priceAmount);\r\n } catch (e) {\r\n result = `${priceAmount} ${currency}`;\r\n this.props.telemetry.warning(`Failed to format price for ${result}: ${e}`);\r\n }\r\n\r\n return result;\r\n }\r\n\r\n private _onClick = (e: React.MouseEvent<HTMLAnchorElement>): void => {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n\r\n const target = e.currentTarget as HTMLElement;\r\n const clearAll = target.getAttribute('class')!.indexOf('choice-summary__clear-all') > -1;\r\n const selectedRefiner = clearAll ? undefined : this._getSelectedRefinerChoice(target);\r\n\r\n if (this.props.onChoiceClicked) {\r\n this.props.onChoiceClicked({\r\n clearAll: clearAll,\r\n itemClicked: target,\r\n choiceClicked: selectedRefiner,\r\n nextItemToFocus: target.nextSibling as HTMLElement\r\n });\r\n }\r\n }\r\n\r\n private _getSelectedRefinerChoice(itemClicked: HTMLElement): ProductRefinerValue | undefined {\r\n const result = this.selectedRefinersMap.find(selected => (itemClicked.innerText && itemClicked.innerText.trim()) === selected.key);\r\n return (result && result.value) || undefined;\r\n }\r\n}\r\n","import {\r\n Button,\r\n Modal,\r\n ModalBody,\r\n ModalFooter,\r\n ModalHeader\r\n} from '@msdyn365-commerce-modules/utilities';\r\nimport React from 'react';\r\n\r\nexport interface ISearchResultModalViewProps {\r\n modal: React.ReactElement;\r\n modalHeader: React.ReactElement;\r\n modalFooter: React.ReactElement;\r\n modalBody: React.ReactElement;\r\n}\r\n\r\ninterface IModalToggleProps {\r\n innerRef: React.RefObject<HTMLButtonElement> | undefined;\r\n id: string;\r\n text: string;\r\n ariaLabel: string;\r\n onClick(): void;\r\n}\r\n\r\nexport interface ISearchResultModalResources {\r\n modalTitle: string;\r\n modalCloseButtonText: string;\r\n}\r\n\r\nexport interface ISearchResultModalProps {\r\n resources: ISearchResultModalResources;\r\n isOpen: boolean;\r\n returnRef: React.RefObject<HTMLButtonElement> | undefined;\r\n onModalToggle():void;\r\n className: string\r\n}\r\n\r\nexport const ModalToggle: React.FC<IModalToggleProps> = (props: IModalToggleProps) => {\r\n const {text, onClick, ariaLabel, innerRef, id} = props;\r\n return <button id={id} className='msc-button' aria-label={ariaLabel} onClick={onClick} ref={innerRef}>{text}</button>;\r\n};\r\n\r\nexport const SearchResultModal = (props: ISearchResultModalProps):ISearchResultModalViewProps => {\r\n return {\r\n modal: modalNode(props),\r\n modalHeader: modalHeaderNode(props),\r\n modalFooter: modalFooterNode(props),\r\n modalBody: <ModalBody className='msc-review-modal-body'/>\r\n };\r\n};\r\n\r\nconst modalNode = (props: ISearchResultModalProps) => {\r\n return (\r\n <Modal\r\n autoFocus={true}\r\n applicationNode={'renderPage'}\r\n returnFocusRef={props.returnRef}\r\n isOpen={props.isOpen}\r\n toggle={props.onModalToggle}\r\n className={'msc-search-result-modal imaamodal'}\r\n zIndex={1050}\r\n />\r\n );\r\n};\r\n\r\nconst modalHeaderNode = (props: ISearchResultModalProps) => {\r\n return (\r\n <ModalHeader toggle={props.onModalToggle}>\r\n {props.resources.modalTitle}\r\n </ModalHeader>\r\n );\r\n};\r\n\r\nconst modalFooterNode = (props: ISearchResultModalProps) => {\r\n return (\r\n <ModalFooter>\r\n <Button onClick={props.onModalToggle} className='ms-sort-and-filter-modal-close'>\r\n {props.resources.modalCloseButtonText}\r\n </Button>\r\n </ModalFooter>\r\n );\r\n};","/*---------------------------------------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License. See License.txt in the project root for license information.\r\n *--------------------------------------------------------------------------------------------*/\r\nimport * as React from 'react';\r\n\r\nimport { Button, Collapse, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\r\nimport { IProductRefinerHierarchy } from '@msdyn365-commerce/commerce-entities';\r\nimport {IAny, ICoreContext, IGeneric} from '@msdyn365-commerce/core';\r\nimport { DisplayTemplate, ProductRefinerSource, ProductRefinerValue, RefinerType } from '@msdyn365-commerce/retail-proxy';\r\nimport RangeRefineItem, { RangeRefineItemType } from './range-refine-item';\r\nimport RefineItem from './refine-item';\r\nimport { IRefineItemToggleNotification } from './refine-item-toggle-notification';\r\nimport { IRefineItemCommonProps } from './refine-item.props.common';\r\nimport { findMatchingRefinementCriterion, isRangeType } from './utilities';\r\n\r\n/**\r\n * Properties associated with the RefineSubmenu component\r\n */\r\nexport interface IRefineSubmenuProps {\r\n tempRangeTypeTODO: RangeRefineItemType;\r\n minValueSliderThumbAriaLabel?: string;\r\n maxValueSliderThumbAriaLabel?: string;\r\n productRefinerHierarchy: IProductRefinerHierarchy;\r\n selectedRefinerValues: ProductRefinerValue[];\r\n refineItemCommonProps: IRefineItemCommonProps;\r\n isDisabled: boolean;\r\n isExpandedOnInitialLoad: boolean;\r\n context: ICoreContext<IGeneric<IAny>>;\r\n moduleId: string;\r\n moduleTypeName: string;\r\n /** The telemetry content */\r\n telemetryContent?: ITelemetryContent;\r\n onUpdateRefiners(notfication: Readonly<IRefineItemToggleNotification>): void;\r\n urlBuilder(refiner: IRefineItemToggleNotification): string;\r\n}\r\n\r\n/**\r\n * Refine submenu state\r\n */\r\nexport interface IRefineSubmenuState extends React.ComponentState {\r\n expanded: boolean;\r\n}\r\n\r\n/**\r\n *\r\n * The RefineSubmenu component renders the submenu category and child items.\r\n * This computed observes the stateful category hierarchy object.\r\n * @extends {React.PureComponent<IRefineSubmenuProps>}\r\n */\r\nclass RefineSubmenu extends React.Component<IRefineSubmenuProps, IRefineSubmenuState> {\r\n constructor(props: IRefineSubmenuProps) {\r\n super(props);\r\n\r\n this._onToggleItem = this._onToggleItem.bind(this);\r\n this._onToggleSubmenu = this._onToggleSubmenu.bind(this);\r\n\r\n const isExpanded = this.props.isExpandedOnInitialLoad;\r\n // if (this.props.productRefinerHierarchy.DataTypeValue === ProductRefinerValueDataTypeValue.Range) {\r\n // isExpanded = true;\r\n // }\r\n\r\n this.state = {\r\n expanded: isExpanded\r\n };\r\n }\r\n\r\n public render(): JSX.Element | null {\r\n const { productRefinerHierarchy, refineItemCommonProps } = this.props;\r\n\r\n if (!productRefinerHierarchy) {\r\n refineItemCommonProps.telemetry.error('Cannot render submenu without refiner hierarchy data');\r\n }\r\n\r\n if((productRefinerHierarchy.SourceValue === ProductRefinerSource.Rating) && (this.props.context.app.config.hideRating)) {\r\n return null;\r\n }\r\n return (\r\n <div className={`ms-refine-submenu list-group ${productRefinerHierarchy.KeyName}`}>\r\n <Button\r\n className={this.state.expanded? 'ms-refine-submenu__toggle_expanded' : 'ms-refine-submenu__toggle_collapsed'}\r\n aria-label= {productRefinerHierarchy.KeyName || 'refiner.Name'}\r\n onClick={this._onToggleSubmenu}\r\n aria-expanded={this.state.expanded}\r\n >\r\n {productRefinerHierarchy.KeyName}\r\n </Button>\r\n <Collapse isOpen={this.state.expanded} timeout={350}>\r\n {this._renderChildItems(productRefinerHierarchy)}\r\n </Collapse>\r\n </div>\r\n );\r\n }\r\n\r\n private _renderChildItems(productRefinerHierarchy: IProductRefinerHierarchy): JSX.Element | null {\r\n if (isRangeType(productRefinerHierarchy.DataTypeValue)) {\r\n return this._renderRange(productRefinerHierarchy);\r\n }\r\n return this._renderSingleMultiSelect(productRefinerHierarchy);\r\n }\r\n\r\n private _renderSingleMultiSelect(productRefinerHierarchy: IProductRefinerHierarchy): JSX.Element | null {\r\n const { isDisabled, refineItemCommonProps, selectedRefinerValues, context } = this.props;\r\n const isSingleSelect = (productRefinerHierarchy.RefinerTypeValue === RefinerType.SingleSelect) && (productRefinerHierarchy.SourceValue === ProductRefinerSource.Rating);\r\n const role = isSingleSelect ? { role: 'radiogroup' } : undefined;\r\n const refinerValuesList = (productRefinerHierarchy.Values || []);\r\n const listItems = refinerValuesList.map((child: ProductRefinerValue, index: number) => {\r\n if (!child) {\r\n refineItemCommonProps.telemetry.error(\r\n `[refine-submenu] Could not render refine item for refiner ${productRefinerHierarchy.RecordId} (${productRefinerHierarchy.KeyName})`\r\n );\r\n return null;\r\n }\r\n\r\n const selectedRefinementCriterion = findMatchingRefinementCriterion(child, selectedRefinerValues);\r\n\r\n return (\r\n <RefineItem\r\n parentProductRefinerHierarchy={productRefinerHierarchy}\r\n productRefinerValue={child}\r\n selectedRefinementCriterion={selectedRefinementCriterion}\r\n selectedRefinerValues={selectedRefinerValues.filter(selectedValue => refinerValuesList.find(value => value.RefinerRecordId === selectedValue.RefinerRecordId))}\r\n refineItemCommonProps={refineItemCommonProps}\r\n onToggle={this._onToggleItem}\r\n urlBuilder={this.props.urlBuilder}\r\n isDisabled={isDisabled}\r\n key={index}\r\n index= {index}\r\n context = {context}\r\n moduleId={this.props.moduleId}\r\n moduleTypeName={this.props.moduleTypeName}\r\n telemetryContent={this.props.telemetryContent}\r\n />\r\n );\r\n });\r\n return (\r\n <ul className= {`ms-refine-submenu__list ${productRefinerHierarchy.KeyName}`} {...role} aria-label={productRefinerHierarchy.KeyName}>\r\n {listItems}\r\n </ul>\r\n );\r\n }\r\n\r\n private _getRangeType(productRefinerHierarchy: IProductRefinerHierarchy): 'input' | 'slider' {\r\n if (productRefinerHierarchy.DisplayTemplateValue === DisplayTemplate.Range ||\r\n productRefinerHierarchy.DisplayTemplateValue === DisplayTemplate.Slider ||\r\n productRefinerHierarchy.DisplayTemplateValue === DisplayTemplate.SliderWithBars) {\r\n return 'slider';\r\n }\r\n return 'input';\r\n }\r\n\r\n private _renderRange(productRefinerHierarchy: IProductRefinerHierarchy): JSX.Element | null {\r\n const { isDisabled, refineItemCommonProps, selectedRefinerValues, context, minValueSliderThumbAriaLabel, maxValueSliderThumbAriaLabel } = this.props;\r\n const submenuClassNamePrefix = 'ms-refine-submenu__item list-group-item refine-submenu__item';\r\n const refinerValuesList = (productRefinerHierarchy.Values || []);\r\n const listItems = refinerValuesList.map((child: ProductRefinerValue, index: number) => {\r\n if (!child) {\r\n refineItemCommonProps.telemetry.error(\r\n `Could not render refine item for refiner ${productRefinerHierarchy.RecordId} (${productRefinerHierarchy.KeyName})`\r\n );\r\n return null;\r\n }\r\n\r\n const selectedRefinementCriterion = findMatchingRefinementCriterion(child, selectedRefinerValues);\r\n\r\n const rangeType = this._getRangeType(productRefinerHierarchy);\r\n const key = selectedRefinementCriterion ? `${selectedRefinementCriterion.LeftValueBoundString}-${selectedRefinementCriterion.RightValueBoundString}` : `not-selected-${index}`;\r\n return (\r\n <li className={`${submenuClassNamePrefix}--range`} key={index}>\r\n <RangeRefineItem\r\n parentProductRefinerHierarchy={productRefinerHierarchy}\r\n productRefinerValue={child}\r\n selectedRefinementCriterion={selectedRefinementCriterion}\r\n refineItemCommonProps={refineItemCommonProps}\r\n onToggle={this._onToggleItem}\r\n urlBuilder={this.props.urlBuilder}\r\n isDisabled={isDisabled}\r\n rangeType={rangeType}\r\n key={key}\r\n context={context}\r\n minValueSliderThumbAriaLabel={minValueSliderThumbAriaLabel}\r\n maxValueSliderThumbAriaLabel={maxValueSliderThumbAriaLabel}\r\n moduleId={this.props.moduleId}\r\n moduleTypeName={this.props.moduleTypeName}\r\n />\r\n </li>\r\n );\r\n });\r\n return <ul className={`ms-refine-submenu__list list-unstyled ${productRefinerHierarchy.KeyName}`}>{listItems}</ul>;\r\n }\r\n\r\n private _onToggleItem(itemToggleNotification: IRefineItemToggleNotification): void {\r\n this.props.onUpdateRefiners(itemToggleNotification);\r\n }\r\n\r\n private _onToggleSubmenu(): void {\r\n this.setState(prevState => ({\r\n expanded: !prevState.expanded\r\n }));\r\n }\r\n}\r\n\r\nexport default RefineSubmenu;","import * as React from 'react';\r\ninterface IErrorMessage {\r\n text?: string;\r\n}\r\n\r\nexport const ErrorMessage: React.FC<IErrorMessage> = ({ text }) => {\r\n return (\r\n <span className='ms-search-result-container__no-results-message'>\r\n <h5 className='error-text'> {text} </h5>\r\n </span>\r\n );\r\n};"," /*---------------------------------------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License. See License.txt in the project root for license information.\r\n *--------------------------------------------------------------------------------------------*/\r\nimport {ArrayExtensions, getCustomer, GetCustomerInput } from '@msdyn365-commerce-modules/retail-actions';\r\nimport { getTelemetryObject, ILabeledDropdownOnChangeNotification, ILabeledDropdownOption, IModuleProps, INodeProps, ITelemetryContent, LabeledDropdown, UncontrolledPagination } from '@msdyn365-commerce-modules/utilities';\r\nimport { CategoryHierarchy as CategoryHierarchyData, IProductRefinerHierarchy } from '@msdyn365-commerce/commerce-entities';\r\nimport MsDyn365 from '@msdyn365-commerce/core';\r\nimport { format, ProductPrice,ProductRefinerValue, ProjectionDomain, SortColumn, TextValueTranslation } from '@msdyn365-commerce/retail-proxy';\r\nimport {\r\n getActivePricesAsync\r\n} from '@msdyn365-commerce/retail-proxy/dist/DataActions/ProductsDataActions.g';\r\nimport { AffiliationLoyaltyTier, CustomerAffiliation } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\r\nimport classnames from 'classnames';\r\nimport { computed, observable, reaction, transaction } from 'mobx';\r\nimport { observer } from 'mobx-react';\r\nimport * as React from 'react';\r\nimport { buildListPageUrl, getCollectionProducts, getCurrentUrl, GetFullProductsByCollectionInput, parseQueryParam, sortOptions } from './actions';\r\nimport { ICittaSearchResultContainerData } from './citta-search-result-container.data';\r\nimport { expandRefinersCount, ICittaSearchResultContainerProps } from './citta-search-result-container.props.autogenerated';\r\nimport {\r\n ErrorMessage, FeatureSearchResultItem, getUpdatedRefinementCriteria, IChoiceSummaryClickNotification,\r\n IRefineItemCommonProps, IRefineItemToggleNotification, ISearchResultModalViewProps, isMatchingRefinementCriterion,Link, ModalToggle, ProductSearchResultItems, SearchResultModal, Separator, Title\r\n} from './components';\r\nimport ChoiceSummary from './components/choice-summary';\r\nimport RefineSubmenu from './components/refine-submenu';\r\n\r\nexport interface ISearchResultContainerViewProps extends ICittaSearchResultContainerProps<ICittaSearchResultContainerData> {\r\n products?: React.ReactNode;\r\n className?: string;\r\n SearchResultContainer: IModuleProps;\r\n TitleViewProps: ITitleViewProps;\r\n categoryHierarchy: ICategoryHierarchyViewProps;\r\n pagination?: React.ReactNode;\r\n ProductsContainer: INodeProps;\r\n ProductSectionContainer: INodeProps;\r\n refineMenu: IRefineMenuViewProps;\r\n sortByOptions: ISortByViewProps;\r\n choiceSummary?: React.ReactNode;\r\n modalToggle: React.ReactNode;\r\n isMobile: boolean;\r\n CategoryNavContainer: INodeProps;\r\n RefineAndProductSectionContainer: INodeProps;\r\n errorMessage: React.ReactNode;\r\n FeatureSearchContainer: INodeProps;\r\n similarLookProduct?: React.ReactNode;\r\n productPrices?: ProductPrice[];\r\n toggleModal: Function;\r\n}\r\n\r\nexport interface ITitleViewProps {\r\n TitleContainer: INodeProps;\r\n title:ISearchResultTitle;\r\n}\r\n\r\nexport interface IRefineMenuViewProps {\r\n RefineMenuContainer: INodeProps;\r\n RefinerSectionContainer: INodeProps;\r\n refiners?: React.ReactNode[];\r\n}\r\n\r\nexport interface ICategoryHierarchyViewProps {\r\n categoryHierarchyList?: React.ReactNode[];\r\n categoryHierarchySeparator?: React.ReactNode;\r\n CategoryHierarchyContainer: INodeProps;\r\n}\r\n\r\nexport interface ISortByViewProps {\r\n SortingContainer: INodeProps;\r\n sortByDropDown?:React.ReactNode;\r\n}\r\n\r\nexport type GridSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl';\r\n\r\n/**\r\n * Title component for search result container\r\n */\r\nexport interface ISearchResultTitle {\r\n titlePrefix?: React.ReactNode;\r\n titleText?: React.ReactNode;\r\n titleCount?: React.ReactNode;\r\n}\r\n\r\nexport interface ISearchResultContainerState {\r\n sortingState: ISortByCollectionState;\r\n modalIsOpen: boolean;\r\n}\r\n\r\ninterface ISortByCollectionState {\r\n selectedSortByOption: ILabeledDropdownOption;\r\n pending: boolean;\r\n}\r\n\r\n/**\r\n *\r\n * SearchResultContainer component\r\n * @extends {React.PureComponent<ICittaSearchResultContainerProps<ICittaSearchResultContainerData>>}\r\n */\r\n@observer\r\nexport default class SearchResultContainer extends React.PureComponent<ICittaSearchResultContainerProps<ICittaSearchResultContainerData>, ISearchResultContainerState> {\r\n\r\n @computed get isMobile(): boolean {\r\n return (this._viewport === 'xs' || this._viewport === 'sm');\r\n }\r\n\r\n private sortByDropdownOptions: ILabeledDropdownOption[] = [\r\n { key: sortOptions.sortByOptionRelevanceDesc, value: this.props.resources.sortByOptionRelevanceDesc },\r\n { key: sortOptions.sortByOptionNameAsc, value: this.props.resources.sortByOptionNameAsc },\r\n { key: sortOptions.sortByOptionNameDesc, value: this.props.resources.sortByOptionNameDesc },\r\n { key: sortOptions.sortByOptionPriceAsc, value: this.props.resources.sortByOptionPriceAsc },\r\n { key: sortOptions.sortByOptionPriceDesc, value: this.props.resources.sortByOptionPriceDesc },\r\n { key: sortOptions.sortByOptionRatingDesc, value: this.props.resources.sortByOptionRatingDesc },\r\n ];\r\n private _refineItemCommonProps: IRefineItemCommonProps;\r\n private _pageType: string | undefined = this.props.context.request.urlTokens.pageType;\r\n @observable\r\n private _viewport: GridSize;\r\n\r\n private _modalToggleRef: React.RefObject<HTMLButtonElement>;\r\n private _sortAndFilterContainerRef: React.RefObject<LabeledDropdown>;\r\n private expandrefinerCount: number | undefined = 0;\r\n private telemetryContent: ITelemetryContent;\r\n private productPrices: ProductPrice[];\r\n\r\n public static getFriendlyName(locale: string, nameTranslations?: TextValueTranslation[]): string | undefined {\r\n let nameTranslation: TextValueTranslation | undefined;\r\n if (locale && nameTranslations && nameTranslations.length > 0) {\r\n nameTranslation = nameTranslations.find(item => item.Language!.toLowerCase() === locale.toLowerCase());\r\n }\r\n\r\n return nameTranslation && nameTranslation.Text;\r\n }\r\n\r\n constructor(props: ICittaSearchResultContainerProps<ICittaSearchResultContainerData>, state: ISearchResultContainerState) {\r\n super(props);\r\n this._viewport = props.context.request && props.context.request.device && props.context.request.device.Type === 'Mobile' ? 'xs' : 'lg';\r\n this._modalToggleRef = React.createRef<HTMLButtonElement>();\r\n this._sortAndFilterContainerRef = React.createRef<LabeledDropdown>();\r\n this._toggleModal = this._toggleModal.bind(this);\r\n this._updateViewport = this._updateViewport.bind(this);\r\n this.productPrices=[];\r\n this.state = {\r\n sortingState: {\r\n pending: false,\r\n selectedSortByOption: this.sortByDropdownOptions[0]\r\n },\r\n modalIsOpen: false,\r\n };\r\n const {\r\n placeholderTextMax,\r\n minLabel,\r\n maxLabel,\r\n rangeNameFormat\r\n } = this.props.resources;\r\n\r\n const locale = this.props.context.request.locale;\r\n const telemetry = this.props.telemetry;\r\n const validationErrorNaN = this.props.resources.validationErrorNotNumber;\r\n const validationErrorRange = this.props.resources.validationErrorNotRange;\r\n this._refineItemCommonProps = {\r\n telemetry,\r\n locale,\r\n placeholderTextMax,\r\n minLabel,\r\n maxLabel,\r\n rangeNameFormat,\r\n validationErrorNaN,\r\n validationErrorRange\r\n };\r\n this.telemetryContent = getTelemetryObject(this.props.context.request.telemetryPageName!,\r\n this.props.friendlyName,\r\n this.props.telemetry);\r\n\r\n // Initalization of list page\r\n this.props.data.products.then((products) => {\r\n this.props.data.listPageState.then((listPageState) => {\r\n if (this._pageType === 'Category') {\r\n listPageState.pageType = 'Category';\r\n } else {\r\n listPageState.pageType = 'Search';\r\n }\r\n\r\n let querySorting: SortColumn[] = [];\r\n\r\n if (this.props.context.request.query && this.props.context.request.query.sorting) {\r\n querySorting = JSON.parse(decodeURIComponent(this.props.context.request.query.sorting)) as SortColumn[];\r\n }\r\n\r\n listPageState.currentPageNumber = this.props.context.request.query && (+this.props.context.request.query.skip / (this.props.config.itemsPerPage || 10)) || 0;\r\n listPageState.sortingCritera = { Columns: querySorting };\r\n listPageState.pageSize = this.props.config.itemsPerPage || 10;\r\n listPageState.activeProducts = products.products;\r\n listPageState.totalProductCount = products.count;\r\n // Initialize reaction based on listPageState properties\r\n reaction(\r\n () => {\r\n return [listPageState.activeFilters && listPageState.activeFilters.length, listPageState.currentPageNumber, listPageState.sortingCritera && listPageState.sortingCritera.Columns && listPageState.sortingCritera.Columns.length];\r\n },\r\n () => {\r\n const input = new GetFullProductsByCollectionInput(\r\n listPageState.pageType,\r\n this.props.context.request.apiSettings,\r\n { Paging: { Top: this.props.config.itemsPerPage, Skip: Math.max((listPageState.pageSize * (listPageState.currentPageNumber || 0)), 0) }, count: true, Sorting: listPageState.sortingCritera || {} },\r\n listPageState.activeFilters || [],\r\n +(this.props.context.request.urlTokens.itemId || 0),\r\n this.props.context.request.query && this.props.context.request.query.q ? this.props.context.request.query.q : this.props.context.request.query?.productId,\r\n this.props && this.props.config && this.props.config.includeAttributes !== undefined && this.props.config.includeAttributes === true ? true : false,\r\n this.props.context.request.locale\r\n );\r\n getCollectionProducts(input, this.props.context.actionContext).then(productResults => {\r\n listPageState.activeProducts = productResults.products;\r\n listPageState.totalProductCount = productResults.count;\r\n this._getActivePrice().catch(ex=> {throw ex;});\r\n });\r\n }\r\n );\r\n\r\n });\r\n });\r\n\r\n if (this.props.context.request.query?.productId) {\r\n this.props.data.featureProduct.then((products) => {\r\n this.props.data.listPageState.then((listPageStateFeature) => {\r\n listPageStateFeature.featureProduct = products;\r\n\r\n });\r\n });\r\n }\r\n this._updateViewport();\r\n }\r\n\r\n public componentDidMount(): void {\r\n if (MsDyn365.isBrowser && window.addEventListener) {\r\n window.addEventListener('resize', this._updateViewport);\r\n this._updateViewport();\r\n }\r\n if (this.props.config.enableAffiliationBasedPricing &&\r\n this.props.context.actionContext.requestContext?.user?.isAuthenticated) {\r\n // tslint:disable-next-line:no-floating-promises\r\n this._getActivePrice();\r\n }\r\n }\r\n public componentWillUnmount(): void {\r\n if (MsDyn365.isBrowser && window.removeEventListener) {\r\n window.removeEventListener('resize', this._updateViewport);\r\n }\r\n }\r\n\r\n public render(): JSX.Element {\r\n const { imageSettings, className, allowBackNavigation } = this.props.config;\r\n const { resources } = this.props;\r\n const products = (this.props.data.listPageState.result && this.props.data.listPageState.result.activeProducts) || [];\r\n const searchProduct = (this.props.data.listPageState.result && this.props.data.listPageState.result.featureProduct) || null;\r\n let errorText = '';\r\n const breaCrumbType = this.props.context.app.config.breadcrumbType;\r\n const allowBack = allowBackNavigation && (breaCrumbType === 'back' || breaCrumbType === 'categoryAndBack');\r\n if(!products || products.length === 0) {\r\n errorText = this._pageType === 'Category'? resources.resultCategoryNotFoundText : resources.resultSearchNotFoundText;\r\n\r\n }\r\n const productsComponent = (\r\n <ProductSearchResultItems\r\n products={products}\r\n context={this.props.context}\r\n imageSettings={imageSettings}\r\n resources={resources}\r\n moduleType={this.props.typeName}\r\n moduleId={this.props.id}\r\n allowBackNavigation = {allowBack}\r\n telemetryContent={this.telemetryContent}\r\n />\r\n );\r\n\r\n const featureComponent = (\r\n <FeatureSearchResultItem\r\n product={searchProduct}\r\n context={this.props.context}\r\n imageSettings={imageSettings}\r\n resources={resources}\r\n moduleType={this.props.typeName}\r\n moduleId={this.props.id}\r\n telemetryContent={this.telemetryContent}\r\n />\r\n );\r\n\r\n const searchResultContainerViewProps = {\r\n ...this.props,\r\n products: productsComponent,\r\n TitleViewProps: this._getCollectionTitle(),\r\n categoryHierarchy: !this.props.config.disableHierarchy && this._getCategoryHierarchy(),\r\n refineMenu: this._getRefineMenu(),\r\n className: classnames('ms-search-result-container', className),\r\n SearchResultContainer: {\r\n moduleProps: this.props,\r\n className: classnames('ms-search-result-container', className)\r\n },\r\n sortByOptions: this.props.data.listPageState.result && this.props.data.listPageState.result.totalProductCount !== 0 ? this._getSortingDropDown(): null,\r\n pagination: this._getPagination(),\r\n ProductsContainer: { className: 'ms-search-result-container__Products' },\r\n ProductSectionContainer: {className: 'ms-search-result-container__product-section'},\r\n CategoryNavContainer: {className: 'ms-search-result-container__category-nav-section'},\r\n RefineAndProductSectionContainer: {className: 'ms-search-result-container__refine-product-section'},\r\n choiceSummary: this._getChoiceSummary(),\r\n modalToggle: this.props.data.listPageState.result && this.props.data.listPageState.result.totalProductCount !== 0 ?\r\n (\r\n <ModalToggle\r\n text={resources.modalTitle}\r\n ariaLabel={resources.modalTitle}\r\n innerRef={this._modalToggleRef}\r\n onClick={this._toggleModal}\r\n id='search-result-modal'\r\n />\r\n ) : null,\r\n searchResultModal: this._getSearchResultModal(),\r\n isMobile: this.isMobile,\r\n errorMessage: errorText && (\r\n <ErrorMessage text={errorText} />\r\n ),\r\n FeatureSearchContainer: { className: 'ms-feature-search-result' },\r\n similarLookProduct: this.props.data.listPageState.result && (this.props.data.listPageState.result.featureProduct !== null && this.props.data.listPageState.result.featureProduct !== undefined) ? featureComponent : null,\r\n productPrices: this.productPrices,\r\n toggleModal: this._toggleModal\r\n };\r\n return this.props.renderView(searchResultContainerViewProps) as React.ReactElement;\r\n }\r\n\r\n private _getActivePrice = async (): Promise<void> => {\r\n let products = (this.props.data.listPageState.result && this.props.data.listPageState.result.activeProducts) || [];\r\n const productRecIds = ArrayExtensions.hasElements(products) ? products.map(prod => prod.RecordId) : [];\r\n const projectDomain: ProjectionDomain = { ChannelId: this.props.context.request.apiSettings.channelId, CatalogId: this.props.context.request.apiSettings.catalogId };\r\n const affliations: AffiliationLoyaltyTier[] = [];\r\n const customerInput = new GetCustomerInput(this.props.context.actionContext.requestContext.apiSettings);\r\n const customer = await getCustomer(customerInput, this.props.context.actionContext);\r\n\r\n if (customer && customer.CustomerAffiliations) {\r\n customer.CustomerAffiliations.forEach((affliation: CustomerAffiliation) => {\r\n const aff: AffiliationLoyaltyTier = { AffiliationId: affliation.RetailAffiliationId, CustomerId: customer.AccountNumber };\r\n affliations.push(aff);\r\n });\r\n }\r\n \r\n await getActivePricesAsync(\r\n { callerContext: this.props.context.actionContext, queryResultSettings: {} },\r\n projectDomain,\r\n productRecIds,\r\n new Date(),\r\n null,\r\n affliations,\r\n true\r\n ).then((activePricesResponse:ProductPrice[]) => {\r\n this.productPrices = activePricesResponse;\r\n products = products.map(prod => {\r\n const activePrice = activePricesResponse.find(price => price.ProductId === prod.RecordId);\r\n if (activePrice) {\r\n prod.Price = activePrice.CustomerContextualPrice ?? prod.Price;\r\n prod.BasePrice = Math.max(activePrice.BasePrice || 0, activePrice.TradeAgreementPrice || 0, activePrice.AdjustedPrice || 0);\r\n }\r\n return prod;\r\n });\r\n this.props.data.listPageState.then((listPageState) => {\r\n listPageState.activeProducts = products;\r\n });\r\n }).catch((error: Error) => {\r\n this.props.context.actionContext.trace(error.message);\r\n this.props.context.actionContext.telemetry.exception(error);\r\n this.props.context.actionContext.telemetry.debug(`[get Affiliation based price on search result container ]Error executing action`);\r\n throw new Error('[get Affiliation based price on search result container]Error executing action');\r\n });\r\n }\r\n private _getSearchResultModal = (): ISearchResultModalViewProps => {\r\n const {resources} = this.props;\r\n return SearchResultModal(\r\n {\r\n resources:{\r\n modalCloseButtonText: resources.modalCloseButtonText,\r\n modalTitle: resources.modalTitle\r\n },\r\n className: \"tetete\",\r\n isOpen:this.state.modalIsOpen,\r\n returnRef: this._modalToggleRef,\r\n onModalToggle: this._toggleModal\r\n });\r\n }\r\n\r\n private _getCollectionTitle = (): ITitleViewProps => {\r\n const { data, context, resources } = this.props;\r\n\r\n let collectionTitle: string | undefined = '';\r\n if (context && context.request && context.request.query && context.request.query.q) {\r\n collectionTitle = `\"${context.request.query.q}\"`;\r\n } else {\r\n collectionTitle = (data.category.result && SearchResultContainer.getFriendlyName(context.request.locale, data.category.result.NameTranslations)) ||\r\n (data.category.result && data.category.result.Name);\r\n }\r\n let productCountText = '';\r\n let productCountNumber: number | undefined;\r\n if (data.listPageState && data.listPageState.result && data.listPageState.result.totalProductCount !== undefined) {\r\n productCountNumber = data.listPageState.result.totalProductCount;\r\n } else if (data.products && data.products.result) {\r\n productCountNumber = data.products.result.count;\r\n }\r\n\r\n if (productCountNumber && productCountNumber !== 0) {\r\n productCountText = productCountNumber !== 1 ? format(this.props.resources.numberOfProducts, productCountNumber) : this.props.resources.oneProduct;\r\n } else {\r\n productCountText = format(this.props.resources.numberOfProducts, 0);\r\n }\r\n const titlePrefix = <Title className='ms-search-result__collection-title-prefix' text={resources.searchTextPrefix} />;\r\n const titleText = collectionTitle && <Title className='ms-search-result__collection-title-text' text={collectionTitle} />;\r\n const titleCount = <Title className='ms-search-result__collection-title-count' text={productCountText} />;\r\n\r\n return {\r\n TitleContainer: { className: 'ms-search-result-container__title' },\r\n title:{\r\n titlePrefix: titlePrefix,\r\n titleText: titleText,\r\n titleCount: titleCount\r\n }\r\n };\r\n\r\n }\r\n private _getCategoryHierarchy = (): ICategoryHierarchyViewProps => {\r\n const { data } = this.props;\r\n const categoryHierarchy = data.categoryHierarchy.result;\r\n const categoryLinks =\r\n categoryHierarchy && categoryHierarchy.map((value: CategoryHierarchyData, index: number) => {\r\n\r\n return (\r\n <Link\r\n key={index}\r\n text={value.Name}\r\n ariaLabel={`${this.props.resources.categoryLinkAriaLabel} ${value.Name}`}\r\n href={value.Url}\r\n />\r\n );\r\n });\r\n const categoryLinkSeparator = <Separator separator='/' />;\r\n\r\n return {\r\n CategoryHierarchyContainer: { tag: 'nav', className: 'ms-search-result-container__category-hierarchy' },\r\n categoryHierarchyList: categoryLinks,\r\n categoryHierarchySeparator: categoryLinkSeparator\r\n };\r\n\r\n }\r\n\r\n private _getSortingDropDown = (): ISortByViewProps => {\r\n const { resources } = this.props;\r\n const activeDropdown = this._getCurrentlySelectedOption() || this.state.sortingState.selectedSortByOption;\r\n const dropdown = (\r\n <LabeledDropdown\r\n labelClassname='reviews-list-sort-by'\r\n labelText={resources.sortByDropdownLabel}\r\n dropdownId='categorySortByDropdown'\r\n dropdownClassname='reviews-list-dropdown'\r\n toggleColor='link'\r\n dropdownOptions={this.sortByDropdownOptions}\r\n selectedOption={activeDropdown}\r\n onSelectOption={this._updateSortByDropdown}\r\n ref={this._sortAndFilterContainerRef}\r\n />);\r\n return {\r\n SortingContainer: { className: 'ms-search-result-container__Sort-by-category' },\r\n sortByDropDown:dropdown\r\n };\r\n }\r\n\r\n private _getPagination = (): React.ReactNode => {\r\n const { config, context, data, resources } = this.props;\r\n const listPageState = data && data.listPageState && data.listPageState.result;\r\n const fullUrl = getCurrentUrl(context.request);\r\n const itemsPerPage = config.itemsPerPage || 10;\r\n const skipCount = listPageState && listPageState.currentPageNumber !== null ?\r\n (listPageState.currentPageNumber * (this.props.config.itemsPerPage || 10)) :\r\n ((this.props.context.request.query && +this.props.context.request.query.skip) || 0);\r\n const totalItems = listPageState && listPageState.totalProductCount || 0;\r\n const previousText = resources.flipperPrevious;\r\n const nextText = resources.flipperNext;\r\n if (totalItems <= itemsPerPage) {\r\n return null;\r\n }\r\n return (\r\n <UncontrolledPagination\r\n className='ms-search-result-container__pagination'\r\n role='navigation'\r\n aria-label={resources.paginationAriaLabel}\r\n url={fullUrl.href}\r\n qsp={'skip'}\r\n items={totalItems}\r\n itemsPerPage={itemsPerPage}\r\n startingItem={skipCount}\r\n previousText={<div className='msc-pagination__prev'><span className='ms-search-result__pagination-left' aria-hidden='true'/><span className='prev-text'>{previousText}</span></div>}\r\n nextText={<div className='msc-pagination__next'><span className='next-text'>{nextText}</span><span className='ms-search-result__pagination-right' aria-hidden='true'/></div>}\r\n previousAriaLabel={previousText}\r\n nextAriaLabel={nextText}\r\n telemetryContent={this.telemetryContent}\r\n />);\r\n }\r\n\r\n private _getRefineMenu = (): IRefineMenuViewProps => {\r\n const { data, context, config } = this.props;\r\n const tempRangeTypeTODO = context.request.query && context.request.query.inputRange ? 'input' : 'slider';\r\n const validRefiners = data.refiners.result && data.refiners.result.filter(refiner => {\r\n return refiner.Values.length > 0;\r\n });\r\n\r\n const activeRefiners = (data.listPageState.result && data.listPageState.result.activeFilters) || [];\r\n\r\n this._getexpandRefinerCount(validRefiners && validRefiners.length, config.expandRefinersCount);\r\n const expandedRefiners = this.expandrefinerCount;\r\n const subMenus = validRefiners && validRefiners.map((productRefinerHierarchy: IProductRefinerHierarchy, index: number) => {\r\n return (\r\n <RefineSubmenu\r\n productRefinerHierarchy={productRefinerHierarchy}\r\n selectedRefinerValues={activeRefiners}\r\n refineItemCommonProps={this._refineItemCommonProps}\r\n minValueSliderThumbAriaLabel={this.props.resources.minValueSliderThumbAriaLabel}\r\n maxValueSliderThumbAriaLabel={this.props.resources.maxValueSliderThumbAriaLabel}\r\n key={index}\r\n onUpdateRefiners={this._onUpdateRefiners}\r\n urlBuilder={this._buildRefinerUrl}\r\n isDisabled={false}\r\n isExpandedOnInitialLoad={expandedRefiners && expandedRefiners > index ? true : false}\r\n tempRangeTypeTODO={tempRangeTypeTODO}\r\n context = {context}\r\n moduleId={this.props.id}\r\n moduleTypeName={this.props.typeName}\r\n telemetryContent={this.telemetryContent}\r\n />\r\n );\r\n });\r\n \r\n return {\r\n RefineMenuContainer:{className: 'ms-search-result-container__refine-menu' },\r\n RefinerSectionContainer:{className: 'ms-search-result-container__refiner-section'},\r\n refiners: subMenus\r\n };\r\n\r\n }\r\n\r\n private _getChoiceSummary = (): React.ReactNode => {\r\n const { resources, data, telemetry } = this.props;\r\n const selectedRefiners = (data.listPageState.result && data.listPageState.result.activeFilters) || [];\r\n return (\r\n <ChoiceSummary\r\n classNames='ms-choice-summary-by-category'\r\n clearAllText={resources.clearAllText}\r\n label={resources.choiceSummaryLabel}\r\n selectedChoices={selectedRefiners}\r\n // @ts-ignore: NOTE Type-unsafe line below, null refinersByCategoryHierarchy case not handled\r\n refinerHierarchy={data.refiners.result}\r\n choiceFormat={resources.choiceFormat}\r\n choiceRangeValueFormat={resources.choiceRangeValueFormat}\r\n telemetry={telemetry}\r\n onChoiceClicked={this._onChoiceClicked}\r\n urlBuilder={this._buildRefinerUrlForChoiceSummary}\r\n choiceAriaLabel={resources.choiceAriaLabel}\r\n telemetryContent={this.telemetryContent}\r\n />\r\n );\r\n\r\n }\r\n\r\n private _updateSortByDropdown = (notification: ILabeledDropdownOnChangeNotification): void => {\r\n const { context } = this.props;\r\n const requestContext = context && context.request;\r\n const actionContext = context && context.actionContext;\r\n\r\n if (!requestContext || !actionContext || !this.props.data.listPageState.result) {\r\n const error = `[sort-by-category] cannot sort without context: ${!requestContext ? 'requestContext ' : ''} ${!actionContext ? 'actionContext ' : ''} could not be found`;\r\n this.props.telemetry.warning(error);\r\n }\r\n\r\n window.history.pushState({}, '', buildListPageUrl(getCurrentUrl(this.props.context.request), undefined, [this._getSortColumnFromSelectedOption(notification.selectedOption)], undefined));\r\n transaction(() => {\r\n this.props.data.listPageState.result!.currentPageNumber = 0;\r\n this.props.data.listPageState.result!.sortingCritera = { Columns: [this._getSortColumnFromSelectedOption(notification.selectedOption)] };\r\n });\r\n }\r\n\r\n private _getSortColumnFromSelectedOption = (option: ILabeledDropdownOption): SortColumn => {\r\n const { data } = this.props;\r\n\r\n if (!data.searchConfiguration.result) {\r\n return {};\r\n }\r\n\r\n const mappedConfiguration = data.searchConfiguration.result.find((searchConfiguration) => { return searchConfiguration.key === option.key; });\r\n\r\n if (mappedConfiguration) {\r\n return mappedConfiguration.sortColumn;\r\n }\r\n\r\n return {};\r\n }\r\n\r\n private _getCurrentlySelectedOption = (): ILabeledDropdownOption | undefined => {\r\n const { data } = this.props;\r\n const sortCriteria = data.listPageState.result && data.listPageState.result.sortingCritera;\r\n\r\n const activeSortColumn =\r\n (sortCriteria && sortCriteria.Columns && sortCriteria.Columns[0]) ||\r\n (parseQueryParam<SortColumn[]>('sorting', this.props.context.request) || [])[0];\r\n\r\n if (activeSortColumn && data.searchConfiguration.result) {\r\n const activeMappedConfig = data.searchConfiguration.result.find((mappedSearchConfig) => {\r\n return (mappedSearchConfig.sortColumn.ColumnName === activeSortColumn.ColumnName) &&\r\n (mappedSearchConfig.sortColumn.IsDescending === activeSortColumn.IsDescending);\r\n });\r\n if (activeMappedConfig) {\r\n return this.sortByDropdownOptions.find((dropdownOption) => dropdownOption.key === activeMappedConfig.key);\r\n }\r\n }\r\n\r\n return;\r\n }\r\n\r\n private _onUpdateRefiners = (itemToggleNotification: IRefineItemToggleNotification): void => {\r\n const { context } = this.props;\r\n const requestContext = context && context.request;\r\n const actionContext = context && context.actionContext;\r\n\r\n if (!requestContext || !actionContext || !this.props.data.listPageState.result) {\r\n const error = `Refine menu cannot refine search criteria: ${!requestContext ? 'requestContext ' : ''} ${!actionContext ? 'actionContext ' : ''} could not be found`;\r\n this.props.telemetry.warning(error);\r\n }\r\n\r\n const updatedRefinementCriteria = getUpdatedRefinementCriteria(itemToggleNotification, this.props.data.listPageState.result && this.props.data.listPageState.result.activeFilters || []);\r\n\r\n window.history.pushState({}, '', buildListPageUrl(getCurrentUrl(this.props.context.request), updatedRefinementCriteria));\r\n transaction(() => {\r\n this.props.data.listPageState.result!.currentPageNumber = 0;\r\n this.props.data.listPageState.result!.activeFilters = updatedRefinementCriteria;\r\n });\r\n }\r\n\r\n private _buildRefinerUrl = (itemToggleNotification: IRefineItemToggleNotification): string => {\r\n if (this.props.data.listPageState.result) {\r\n const newRefinementCriteria = getUpdatedRefinementCriteria(itemToggleNotification, this.props.data.listPageState.result.activeFilters || []);\r\n\r\n return buildListPageUrl(getCurrentUrl(this.props.context.request), newRefinementCriteria);\r\n } else {\r\n this.props.telemetry.warning(`[buildRefinerQueryString]List Page State Not available, unable to build refiner URL`);\r\n return '';\r\n }\r\n }\r\n\r\n private _onChoiceClicked = (notification: IChoiceSummaryClickNotification): void => {\r\n const { data, telemetry } = this.props;\r\n\r\n if (!data.listPageState.result) {\r\n telemetry.warning('[choice-summary-by-category._onChoiceClicked]ListPageState unavailable, unable to update refiners.');\r\n return;\r\n }\r\n\r\n let currentRefinementCriteria = (data.listPageState.result && data.listPageState.result.activeFilters) || [];\r\n\r\n if (!notification.clearAll) {\r\n const selectedChoice = notification.choiceClicked;\r\n if (!selectedChoice) {\r\n telemetry.warning('[choice-summary-by-category._onChoiceClicked] Choice could not be determined');\r\n return;\r\n }\r\n currentRefinementCriteria = currentRefinementCriteria.filter(\r\n (selectedCriterion: ProductRefinerValue) => !isMatchingRefinementCriterion(selectedChoice, selectedCriterion)\r\n );\r\n } else {\r\n currentRefinementCriteria = [];\r\n\r\n // set focus to sort and filter\r\n const dropdownElementId = this._sortAndFilterContainerRef.current && this._sortAndFilterContainerRef.current.props.dropdownId;\r\n const dropdownElement = dropdownElementId && document.getElementById(dropdownElementId);\r\n setTimeout(() => {\r\n dropdownElement && dropdownElement.focus();\r\n },\r\n 50);\r\n }\r\n\r\n const fullUrl = getCurrentUrl(this.props.context.request);\r\n window.history.pushState({}, '', buildListPageUrl(fullUrl, currentRefinementCriteria));\r\n data.listPageState.result.currentPageNumber = 0;\r\n data.listPageState.result.activeFilters = currentRefinementCriteria;\r\n }\r\n\r\n private _buildRefinerUrlForChoiceSummary = (selectedRefiner: ProductRefinerValue, isClearAll: boolean): string => {\r\n const { data, telemetry } = this.props;\r\n const fullUrl = getCurrentUrl(this.props.context.request);\r\n\r\n if (!data.listPageState.result) {\r\n telemetry.warning('[choice-summary-by-category._buildRefinerUrl]ListPageState unavailable, unable to create refiner URL.');\r\n return fullUrl.href;\r\n }\r\n\r\n let currentRefinementCriteria = (data.listPageState.result && data.listPageState.result.activeFilters) || [];\r\n\r\n if (!isClearAll) {\r\n if (!selectedRefiner) {\r\n telemetry.warning('[choice-summary-by-category._buildRefinerUrl] URL for Choice could not be determined');\r\n return fullUrl.href;\r\n }\r\n currentRefinementCriteria = currentRefinementCriteria.filter(\r\n (selectedCriterion: ProductRefinerValue) => !isMatchingRefinementCriterion(selectedRefiner, selectedCriterion)\r\n );\r\n } else {\r\n currentRefinementCriteria = [];\r\n }\r\n\r\n return buildListPageUrl(fullUrl, currentRefinementCriteria);\r\n }\r\n\r\n private _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 } else {\r\n return 'xl';\r\n }\r\n }\r\n }\r\n\r\n return 'lg';\r\n }\r\n\r\n private _toggleModal(): void {\r\n this.setState({\r\n modalIsOpen: !this.state.modalIsOpen\r\n });\r\n }\r\n\r\n private _updateViewport(): void {\r\n this._viewport = this._getViewport();\r\n\r\n if (this.state.modalIsOpen && !this.isMobile) {\r\n this._toggleModal();\r\n }\r\n }\r\n\r\n private _getexpandRefinerCount = (validRefiners?: number, refinerCount?: expandRefinersCount): void => {\r\n switch(refinerCount) {\r\n case expandRefinersCount.all:\r\n this.expandrefinerCount = validRefiners;\r\n break;\r\n case expandRefinersCount.one:\r\n this.expandrefinerCount = 1;\r\n break;\r\n case expandRefinersCount.two:\r\n this.expandrefinerCount = 2;\r\n break;\r\n case expandRefinersCount.three:\r\n this.expandrefinerCount = 3;\r\n break;\r\n case expandRefinersCount.four:\r\n this.expandrefinerCount = 4;\r\n break;\r\n default:\r\n this.expandrefinerCount = 0;\r\n }\r\n }\r\n\r\n}\r\n","import { IRefineItemToggleNotification } from '@msdyn365-commerce-modules/search-result-container';\r\nimport { ITelemetry } from '@msdyn365-commerce/core';\r\nimport { ProductRefinerValue } from '@msdyn365-commerce/retail-proxy';\r\n\r\n/**\r\n * Types of product refiner values\r\n */\r\nexport const enum ProductRefinerValueDataTypeValue {\r\n /**\r\n * Range slider is used for selections like price\r\n */\r\n Range = 1,\r\n\r\n /**\r\n * Range input is a different way to specify ranges and can be expressed with input boxes\r\n * as well as a set of discrete single-select type values\r\n */\r\n RangeInput = 4,\r\n\r\n /**\r\n * This is a discrete list item, either multi-select or single-select\r\n */\r\n List = 5,\r\n\r\n /**\r\n * Boolean types allows only single-select\r\n */\r\n Boolean = 6\r\n}\r\n\r\n/**\r\n * Types of product refiners\r\n */\r\nexport const enum ProductRefinerTypeValue {\r\n /**\r\n * Refiner values are single-select\r\n */\r\n Single = 0,\r\n\r\n /**\r\n * Refiner values are multi-select\r\n */\r\n Multi = 1\r\n}\r\n\r\n/**\r\n * ProductRefinerSource enum type.\r\n */\r\nexport const enum ProductRefinerSource {\r\n /**\r\n * The None member.\r\n */\r\n None = 0,\r\n /**\r\n * The Attribute member.\r\n */\r\n Attribute = 1,\r\n /**\r\n * The Category member.\r\n */\r\n Category = 2,\r\n /**\r\n * The Price member.\r\n */\r\n Price = 3,\r\n /**\r\n * The Rating member.\r\n */\r\n Rating = 4\r\n}\r\n\r\n/**\r\n * Find the refinement criterion associated with this product refiner value\r\n * @param productRefinerValue product refiner value to match\r\n * @param refinementCriteria selected refinement criteria\r\n */\r\nexport function findMatchingRefinementCriterion(\r\n productRefinerValue: ProductRefinerValue,\r\n refinementCriteria: ProductRefinerValue[]\r\n): ProductRefinerValue | undefined {\r\n // if the value is a range, then match only on data type value; otherwise match on item string\r\n return refinementCriteria.find(\r\n (refinementCriterion: ProductRefinerValue) => isMatchingRefinementCriterion(productRefinerValue, refinementCriterion)\r\n );\r\n}\r\n\r\n/**\r\n * Find the refinement criterion associated with this product refiner value\r\n * @param productRefinerValue product refiner value to match\r\n * @param refinementCriteria selected refinement criteria\r\n */\r\nexport function isMatchingRefinementCriterion(\r\n productRefinerValue: ProductRefinerValue,\r\n refinementCriterion: ProductRefinerValue\r\n): boolean {\r\n // if the value is a range, then match only on data type value; otherwise match on item string\r\n return (\r\n refinementCriterion.RefinerRecordId === productRefinerValue.RefinerRecordId &&\r\n refinementCriterion.RefinerSourceValue === productRefinerValue.RefinerSourceValue &&\r\n refinementCriterion.DataTypeValue === productRefinerValue.DataTypeValue &&\r\n (refinementCriterion.DataTypeValue === ProductRefinerValueDataTypeValue.Range ||\r\n refinementCriterion.LeftValueBoundString === productRefinerValue.LeftValueBoundString)\r\n );\r\n}\r\n\r\nexport function getUpdatedRefinementCriteria(\r\n itemToggleNotification: IRefineItemToggleNotification,\r\n currentRefinementCriteria: ProductRefinerValue[]): ProductRefinerValue[] {\r\n const updatedRefinementCriteria: ProductRefinerValue[] = [];\r\n let toggledItemFound = false;\r\n currentRefinementCriteria.forEach((selectedCriterion: ProductRefinerValue) => {\r\n if (isMatchingRefinementCriterion(itemToggleNotification.productRefinerValue, selectedCriterion)) {\r\n toggledItemFound = true;\r\n if (itemToggleNotification.isSelecting) {\r\n const next = {\r\n ...selectedCriterion,\r\n LeftValueBoundString: itemToggleNotification.rangeStart !== undefined && `${itemToggleNotification.rangeStart}` || selectedCriterion.LeftValueBoundString,\r\n RightValueBoundString: itemToggleNotification.rangeEnd !== undefined && `${itemToggleNotification.rangeEnd}` || selectedCriterion.RightValueBoundString,\r\n };\r\n updatedRefinementCriteria.push(next);\r\n\r\n } // else the item is being de-selected, so omit it from the refinement criteria\r\n } else {\r\n // keep existing criterion because it is not in the item toggle notification\r\n updatedRefinementCriteria.push(selectedCriterion);\r\n }\r\n });\r\n\r\n if (!toggledItemFound) {\r\n const next = {\r\n ...itemToggleNotification.productRefinerValue,\r\n LeftValueBoundString: itemToggleNotification.rangeStart !== undefined && `${itemToggleNotification.rangeStart}` || itemToggleNotification.productRefinerValue.LeftValueBoundString,\r\n RightValueBoundString: itemToggleNotification.rangeEnd !== undefined && `${itemToggleNotification.rangeEnd}` || itemToggleNotification.productRefinerValue.RightValueBoundString,\r\n };\r\n updatedRefinementCriteria.push(next);\r\n\r\n // If single select, then deselect any others in the parent refiner group\r\n if ((itemToggleNotification.productRefinerValue.DataTypeValue === ProductRefinerValueDataTypeValue.List || itemToggleNotification.productRefinerValue.DataTypeValue === ProductRefinerValueDataTypeValue.Boolean) &&\r\n itemToggleNotification.parentProductRefinerHierarchy.RefinerTypeValue === ProductRefinerTypeValue.Single) {\r\n itemToggleNotification.parentProductRefinerHierarchy.Values.forEach((child: ProductRefinerValue) => {\r\n if (child.RefinerRecordId === next.RefinerRecordId && child.LeftValueBoundString === next.LeftValueBoundString) {\r\n // do nothing\r\n } else {\r\n const matchingIndex = updatedRefinementCriteria.findIndex((criterion: ProductRefinerValue) => isMatchingRefinementCriterion(child, criterion));\r\n if (matchingIndex > -1) {\r\n updatedRefinementCriteria.splice(matchingIndex, 1);\r\n }\r\n }\r\n });\r\n }\r\n }\r\n\r\n return updatedRefinementCriteria;\r\n}\r\n\r\nexport function formatPrice(\r\n amount: string | undefined,\r\n currency: string | undefined,\r\n locale: string | undefined,\r\n telemetry: ITelemetry): string {\r\n if (!amount || !currency) {\r\n telemetry.trace(`[refine-menu.utilities.formatPrice] could not format price for ${amount} ${currency}`);\r\n return amount || '';\r\n }\r\n const priceAmount = (amount && Number(amount)) || 0;\r\n let result: string;\r\n\r\n try {\r\n result = new Intl.NumberFormat(locale, {\r\n style: 'currency',\r\n currencyDisplay: 'symbol',\r\n currency: currency\r\n }).format(priceAmount);\r\n } catch (e) {\r\n result = `${priceAmount} ${currency}`;\r\n telemetry.warning(`[refine-menu.utilities.formatPrice] Failed to format price for ${result}: ${e}`);\r\n }\r\n\r\n return result;\r\n}","import { Slider } from '@msdyn365-commerce-modules/utilities';\r\nimport debounce from 'lodash/debounce';\r\nimport { computed } from 'mobx';\r\nimport { observer } from 'mobx-react';\r\nimport * as React from 'react';\r\nimport { formatPrice } from './utilities';\r\n\r\ntype InputType = 'Min' | 'Max';\r\n\r\nimport { IRefineItemProps, IRefineItemState } from './refine-item';\r\n\r\nexport type RangeRefineItemType = 'slider' | 'input';\r\n\r\n/**\r\n * Range refine item properties\r\n */\r\nexport interface IRangeRefineItemProps extends IRefineItemProps {\r\n rangeType: RangeRefineItemType;\r\n minValueSliderThumbAriaLabel?: string;\r\n maxValueSliderThumbAriaLabel?: string;\r\n}\r\n\r\n/**\r\n * Range refine item state\r\n */\r\nexport interface IRangeRefineItemState extends IRefineItemState {\r\n validationErrorMin: string | undefined;\r\n validationErrorMax: string | undefined;\r\n selectedMin: string | undefined;\r\n selectedMax: string | undefined;\r\n touchedMin: boolean;\r\n touchedMax: boolean;\r\n}\r\n\r\n/**\r\n * RangeRefineItem component (controlled by RefineSubmenu)\r\n */\r\n@observer\r\nexport default class RangeRefineItem extends React.Component<IRangeRefineItemProps, IRangeRefineItemState> {\r\n private _formattedPriceReverseLookup: Map<string, string> = new Map();\r\n\r\n private minInput: React.RefObject<HTMLInputElement>;\r\n private maxInput: React.RefObject<HTMLInputElement>;\r\n\r\n @computed get currencyCode(): string {\r\n return this.props.productRefinerValue.UnitText || '';\r\n }\r\n\r\n constructor(props: IRangeRefineItemProps) {\r\n super(props);\r\n this._onRangeUpdate = this._onRangeUpdate.bind(this);\r\n this._onRangeUpdateEnd = this._onRangeUpdateEnd.bind(this);\r\n this._handleRangeTooltipText = this._handleRangeTooltipText.bind(this);\r\n this._changeMin = this._changeMin.bind(this);\r\n this._changeMax = this._changeMax.bind(this);\r\n this._finishChangeMin = this._finishChangeMin.bind(this);\r\n this._finishChangeMax = this._finishChangeMax.bind(this);\r\n\r\n this.minInput = React.createRef<HTMLInputElement>();\r\n this.maxInput = React.createRef<HTMLInputElement>();\r\n\r\n const { selectedRefinementCriterion } = this.props;\r\n const initialMin = selectedRefinementCriterion && selectedRefinementCriterion.LeftValueBoundString || '0';\r\n const initialMax = selectedRefinementCriterion && selectedRefinementCriterion.RightValueBoundString || undefined;\r\n this.state = {\r\n isChecked: false,\r\n validationErrorMin: undefined,\r\n validationErrorMax: undefined,\r\n selectedMin: initialMin,\r\n selectedMax: initialMax,\r\n touchedMin: false,\r\n touchedMax: false\r\n };\r\n }\r\n\r\n public render(): JSX.Element | undefined {\r\n const { productRefinerValue, parentProductRefinerHierarchy, refineItemCommonProps } = this.props;\r\n\r\n if (!productRefinerValue || !parentProductRefinerHierarchy) {\r\n refineItemCommonProps.telemetry.error('Cannot render refine value range without productRefinerValue and parentProductRefinerHierarchy');\r\n return undefined;\r\n }\r\n\r\n if (this.props.rangeType === 'input') {\r\n return this._renderInputFields();\r\n }\r\n\r\n return this._renderSlider();\r\n }\r\n\r\n private _renderInputFields(): JSX.Element | undefined {\r\n const { isDisabled, parentProductRefinerHierarchy, refineItemCommonProps } = this.props;\r\n const { selectedMin, selectedMax, touchedMin, touchedMax, validationErrorMin, validationErrorMax } = this.state;\r\n\r\n const rangeAriaLabel = (refineItemCommonProps.rangeNameFormat || '{0}').replace('{0}', (parentProductRefinerHierarchy.KeyName || ''));\r\n const formAttrs = {\r\n 'aria-label': rangeAriaLabel,\r\n 'aria-disabled': isDisabled\r\n };\r\n\r\n // To enable price formatting of selected fields, this is the approach:\r\n // initial value: min=0 formatted as price, max=undefined\r\n // onFocus/onChange: convert to number (unformat) and mark as touched to indicate value is being edited\r\n // onBlur: validate and format entered value as price\r\n const minInputClassName = `ms-refine-submenu__input-range refine-submenu__input-range-min ${validationErrorMin ? 'refine-submenu__input-range--error' : ''}`;\r\n const maxInputClassName = `ms-refine-submenu__input-range refine-submenu__input-range-max ${validationErrorMax ? 'refine-submenu__input-range--error' : ''}`;\r\n const minLabelClassName = 'ms-refine-submenu__input-range-label refine-submenu__input-range-label-min';\r\n const maxLabelClassName = 'ms-refine-submenu__input-range-label refine-submenu__input-range-label-max';\r\n const formattedSelectedMin = this._getFormattedSelectedValue(selectedMin, touchedMin, validationErrorMin);\r\n const formattedSelectedMax = this._getFormattedSelectedValue(selectedMax, touchedMax, validationErrorMax);\r\n return (\r\n <form className='ms-refine-submenu__input-range-refiner' {...formAttrs}>\r\n <label className={minLabelClassName}>\r\n {refineItemCommonProps.minLabel}\r\n <input\r\n className={minInputClassName}\r\n onChange={this._changeMin}\r\n onFocus={this._changeMin}\r\n onBlur={this._finishChangeMin}\r\n value={formattedSelectedMin}\r\n ref={this.minInput}\r\n />\r\n </label>\r\n <label className={maxLabelClassName}>\r\n {refineItemCommonProps.maxLabel}\r\n <input\r\n className={maxInputClassName}\r\n placeholder={formattedSelectedMax ? undefined : refineItemCommonProps.placeholderTextMax}\r\n onChange={this._changeMax}\r\n onFocus={this._changeMax}\r\n onBlur={this._finishChangeMax}\r\n value={formattedSelectedMax}\r\n ref={this.maxInput}\r\n />\r\n </label>\r\n {validationErrorMin &&\r\n <span className='ms-refine-submenu__input-range-error-text refine-submenu__input-range-min-error-text'>{validationErrorMin}</span>\r\n }\r\n {validationErrorMax && validationErrorMin !== validationErrorMax &&\r\n <span className='ms-refine-submenu__input-range-error-text refine-submenu__input-range-max-error-text'>{validationErrorMax}</span>\r\n }\r\n </form>\r\n );\r\n }\r\n\r\n private _renderSlider(): JSX.Element | undefined {\r\n const { isDisabled, productRefinerValue, parentProductRefinerHierarchy, selectedRefinementCriterion } = this.props;\r\n const min = productRefinerValue.LeftValueBoundString;\r\n const max = productRefinerValue.RightValueBoundString;\r\n const selectedMin = selectedRefinementCriterion && selectedRefinementCriterion.LeftValueBoundString || productRefinerValue.LeftValueBoundString || '0';\r\n const selectedMax = selectedRefinementCriterion && selectedRefinementCriterion.RightValueBoundString || productRefinerValue.RightValueBoundString || max;\r\n const sliderId = `slider_${parentProductRefinerHierarchy.RecordId}_${productRefinerValue.RefinerRecordId}`;\r\n const ariaAttributes = {\r\n 'aria-disabled': isDisabled\r\n };\r\n\r\n const minPrice = this._formatPrice(min);\r\n const maxPrice = this._formatPrice(max);\r\n const selectedMinPrice = this._formatPrice(selectedMin);\r\n const selectedMaxPrice = this._formatPrice(selectedMax);\r\n\r\n return (\r\n <Slider\r\n className={'ms-refine-submenu__range-refiner'}\r\n key={sliderId}\r\n id={sliderId}\r\n inForm={false}\r\n min={min && Number(min) || undefined}\r\n max={max && Number(max) || undefined}\r\n step={1}\r\n orientation={'horizontal'}\r\n labels={[\r\n {\r\n labelId: `${sliderId}_start`,\r\n labelString: `${minPrice}`,\r\n labelPositioning: 'start'\r\n },\r\n {\r\n labelId: `${sliderId}_end`,\r\n labelString: `${maxPrice}`,\r\n labelPositioning: 'end'\r\n }\r\n ]}\r\n showLabels={true}\r\n showTooltip={true}\r\n sliderThumbs={[\r\n {\r\n id: `${sliderId}_slider_thumb_start`,\r\n value: selectedMin && Number(selectedMin) || 0,\r\n ariaLabel: `${this.props.minValueSliderThumbAriaLabel} ${this.currencyCode}`,\r\n ariaValueText: `${selectedMinPrice}`\r\n },\r\n {\r\n id: `${sliderId}_slider_thumb_end`,\r\n value: Number(selectedMax) || Number(maxPrice),\r\n ariaLabel: `${this.props.maxValueSliderThumbAriaLabel} ${this.currencyCode}`,\r\n ariaValueText: `${selectedMaxPrice}`\r\n }\r\n ]}\r\n onChangeEnd={this._onRangeUpdateEnd}\r\n onChange={debounce(this._onRangeUpdate, 500)}\r\n handleTooltipText={this._handleRangeTooltipText}\r\n {...ariaAttributes}\r\n />\r\n );\r\n }\r\n\r\n private _changeMin(event: React.FocusEvent<HTMLInputElement>): void {\r\n this._changeValue(event, 'Min');\r\n }\r\n\r\n private _changeMax(event: React.FocusEvent<HTMLInputElement>): void {\r\n this._changeValue(event, 'Max');\r\n }\r\n\r\n private _changeValue(event: React.FocusEvent<HTMLInputElement>, inputType: InputType): void {\r\n const selectedKey = `selected${inputType}`;\r\n const touchedKey = `touched${inputType}`;\r\n this.setState({\r\n [selectedKey]: this._getInputWithoutFormatting(event.currentTarget.value),\r\n [touchedKey]: true\r\n });\r\n }\r\n\r\n private _finishChangeMin(event: React.FocusEvent<HTMLInputElement>): boolean {\r\n const selectedMinValue = this._getInputWithoutFormatting(event.currentTarget.value);\r\n this.setState({\r\n selectedMin: selectedMinValue,\r\n minTouched: false\r\n });\r\n const minInput = Number(selectedMinValue);\r\n const { onToggle, parentProductRefinerHierarchy, productRefinerValue, refineItemCommonProps, selectedRefinementCriterion } = this.props;\r\n const max = selectedRefinementCriterion && selectedRefinementCriterion.RightValueBoundString || undefined;\r\n\r\n const maxNum = max ? Number(max) : undefined;\r\n\r\n if (isNaN(minInput)) {\r\n this.setState({ validationErrorMin: refineItemCommonProps.validationErrorNaN });\r\n this._focus('Min');\r\n return false;\r\n }\r\n\r\n if (this._validateRange(minInput, maxNum)) {\r\n onToggle({\r\n parentProductRefinerHierarchy: parentProductRefinerHierarchy,\r\n productRefinerValue: productRefinerValue,\r\n isSelecting: true,\r\n rangeStart: minInput,\r\n rangeEnd: maxNum\r\n });\r\n return true;\r\n } else {\r\n this._focus('Min');\r\n }\r\n\r\n return false;\r\n }\r\n\r\n private _finishChangeMax(event: React.FocusEvent<HTMLInputElement>): boolean {\r\n const selectedMaxValue = this._getInputWithoutFormatting(event.currentTarget.value);\r\n this.setState({\r\n selectedMax: selectedMaxValue,\r\n maxTouched: false\r\n });\r\n const maxInput = Number(selectedMaxValue);\r\n const { onToggle, parentProductRefinerHierarchy, productRefinerValue, refineItemCommonProps, selectedRefinementCriterion } = this.props;\r\n const min = selectedRefinementCriterion && selectedRefinementCriterion.LeftValueBoundString || '0';\r\n\r\n const minNum = Number(min);\r\n\r\n if (isNaN(maxInput)) {\r\n this.setState({ validationErrorMax: refineItemCommonProps.validationErrorNaN });\r\n this._focus('Max');\r\n return false;\r\n }\r\n\r\n if (this._validateRange(minNum, maxInput)) {\r\n if (productRefinerValue) {\r\n onToggle({\r\n parentProductRefinerHierarchy: parentProductRefinerHierarchy,\r\n productRefinerValue: productRefinerValue,\r\n isSelecting: true,\r\n rangeStart: minNum,\r\n rangeEnd: maxInput\r\n });\r\n } else {\r\n this._focus('Max');\r\n }\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n private _focus(inputType: InputType): void {\r\n const ref = inputType === 'Max' ? this.maxInput : this.minInput;\r\n\r\n setTimeout(() => {\r\n if (ref && ref.current) {\r\n ref.current.focus();\r\n }\r\n }, 50);\r\n }\r\n\r\n private _getFormattedSelectedValue(selected: string | undefined, touched: boolean, validationError: string | undefined): string | undefined {\r\n if (touched || validationError || selected === undefined) {\r\n return selected;\r\n }\r\n return this._formatPrice(selected);\r\n }\r\n\r\n private _validateRange(min: number, max: number | undefined): boolean {\r\n const { refineItemCommonProps } = this.props;\r\n if (max === undefined) {\r\n return true;\r\n }\r\n\r\n if (min > max) {\r\n this.setState({\r\n validationErrorMin: refineItemCommonProps.validationErrorRange,\r\n validationErrorMax: refineItemCommonProps.validationErrorRange\r\n });\r\n return false;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n private _formatPrice(amount: string | undefined): string {\r\n const locale = this.props.refineItemCommonProps.locale;\r\n const result = formatPrice(amount, this.currencyCode, locale, this.props.refineItemCommonProps.telemetry);\r\n if (this.props.productRefinerValue!.LeftValueBoundString === '0' && this.props.productRefinerValue!.RightValueBoundString === '0') {\r\n return result.slice(2);\r\n }\r\n if (amount !== undefined && !this._formattedPriceReverseLookup.has(result)) {\r\n this._formattedPriceReverseLookup.set(result, amount);\r\n }\r\n\r\n return result;\r\n }\r\n\r\n private _getInputWithoutFormatting(input: string): string {\r\n // First try to cast raw input to a number\r\n const inputAsNum = Number(input);\r\n if (!isNaN(inputAsNum)) {\r\n return input;\r\n }\r\n\r\n // Otherwise try a reverse lookup and fall back to the raw input if all else fails\r\n const reverseLookupResult = this._formattedPriceReverseLookup.get(input);\r\n return reverseLookupResult || input;\r\n }\r\n\r\n // NOTE: Fix types once Shared Components build pipeline bug fixed\r\n // tslint:disable-next-line:no-any\r\n private _onRangeUpdate(sliderChangeNotification: any): void {\r\n // Need to filter out mousemove events as these cause errors after the menu updates and slider re-renders\r\n if (sliderChangeNotification.eventType !== 'mousemove') {\r\n const { onToggle, parentProductRefinerHierarchy, productRefinerValue } = this.props;\r\n if (productRefinerValue && sliderChangeNotification) {\r\n onToggle({\r\n parentProductRefinerHierarchy: parentProductRefinerHierarchy,\r\n productRefinerValue: productRefinerValue,\r\n isSelecting: true,\r\n rangeStart: sliderChangeNotification.firstThumbValue,\r\n rangeEnd: sliderChangeNotification.secondThumbValue\r\n });\r\n\r\n this._focusOnSliderThumb(sliderChangeNotification);\r\n }\r\n }\r\n }\r\n\r\n // tslint:disable-next-line\r\n private _onRangeUpdateEnd(sliderChangeNotification: any): void {\r\n const { onToggle, parentProductRefinerHierarchy, productRefinerValue } = this.props;\r\n if (productRefinerValue && sliderChangeNotification) {\r\n onToggle({\r\n parentProductRefinerHierarchy: parentProductRefinerHierarchy,\r\n productRefinerValue: productRefinerValue,\r\n isSelecting: true,\r\n rangeStart: sliderChangeNotification.firstThumbValue,\r\n rangeEnd: sliderChangeNotification.secondThumbValue\r\n });\r\n\r\n this._focusOnSliderThumb(sliderChangeNotification);\r\n }\r\n }\r\n\r\n // tslint:disable-next-line\r\n private _focusOnSliderThumb(sliderChangeNotification: any): void {\r\n if (sliderChangeNotification.id) {\r\n const element = document.getElementById(sliderChangeNotification.id);\r\n if (!!element) {\r\n setTimeout(\r\n () => {\r\n element.focus();\r\n },\r\n 0);\r\n }\r\n }\r\n }\r\n\r\n private _handleRangeTooltipText(tooltip: number): string {\r\n return this._formatPrice(`${tooltip}`);\r\n }\r\n}","import { IRefineItemCommonProps, IRefineItemToggleNotification } from '@msdyn365-commerce-modules/search-result-container';\r\nimport { IProductRefinerHierarchy } from '@msdyn365-commerce/commerce-entities';\r\nimport { RatingComponent } from '@msdyn365-commerce/components';\r\nimport { ICoreContext } from '@msdyn365-commerce/core';\r\nimport { ProductRefinerValue } from '@msdyn365-commerce/retail-proxy';\r\nimport * as React from 'react';\r\nimport { ProductRefinerSource, ProductRefinerTypeValue } from './utilities';\r\n\r\n/**\r\n * RefineItem properties\r\n */\r\nexport interface IRefineItemProps {\r\n\r\n parentProductRefinerHierarchy: IProductRefinerHierarchy;\r\n productRefinerValue: ProductRefinerValue;\r\n selectedRefinementCriterion: ProductRefinerValue | undefined;\r\n refineItemCommonProps: IRefineItemCommonProps;\r\n isDisabled: boolean;\r\n keyId: number;\r\n context: ICoreContext;\r\n moduleId: string;\r\n moduleTypeName: string;\r\n onToggle(notfication: Readonly<IRefineItemToggleNotification>): void;\r\n urlBuilder(refiner: IRefineItemToggleNotification): string;\r\n}\r\n\r\n/**\r\n * Refine item state\r\n */\r\nexport interface IRefineItemState extends React.ComponentState {\r\n isChecked: boolean;\r\n renderingError?: object;\r\n}\r\n\r\n/**\r\n * Single-select and multi-select refine item component (controlled by RefineSubmenu)\r\n */\r\nexport default class RefineItem extends React.Component<IRefineItemProps, IRefineItemState> {\r\n private anchorType: React.RefObject<HTMLAnchorElement>;\r\n\r\n constructor(props: IRefineItemProps) {\r\n super(props);\r\n this._onClick = this._onClick.bind(this);\r\n this.state = {\r\n isChecked: !!this.props.selectedRefinementCriterion\r\n };\r\n this.anchorType = React.createRef();\r\n }\r\n\r\n public render(): JSX.Element | undefined {\r\n const {\r\n isDisabled,\r\n refineItemCommonProps,\r\n parentProductRefinerHierarchy,\r\n productRefinerValue,\r\n selectedRefinementCriterion,\r\n // @ts-ignore\r\n children,\r\n onToggle,\r\n context,\r\n keyId,\r\n ...attrs\r\n } = this.props;\r\n if (!productRefinerValue) {\r\n refineItemCommonProps.telemetry.error('[refine-item] Cannot render refineItem without productRefinerValue');\r\n return undefined;\r\n }\r\n if (!productRefinerValue.LeftValueBoundString) {\r\n refineItemCommonProps.telemetry.warning(`[refine-item] RefineItem without LeftValueBoundString: ${JSON.stringify(productRefinerValue)}`);\r\n }\r\n const isSingleSelect = parentProductRefinerHierarchy.RefinerTypeValue === ProductRefinerTypeValue.Single;\r\n let itemTypeClassName = isSingleSelect ? 'single-select' : 'multi-select';\r\n itemTypeClassName = `ms-refine-submenu-item ${itemTypeClassName}`;\r\n const inputType = isSingleSelect ? 'radio' : 'checkbox';\r\n const role = isSingleSelect ? 'radio' : undefined;\r\n itemTypeClassName = !!selectedRefinementCriterion ? `${itemTypeClassName}-checked` : itemTypeClassName;\r\n if (parentProductRefinerHierarchy.SourceValue === ProductRefinerSource.Rating) {\r\n if (productRefinerValue.LeftValueBoundString) {\r\n return (\r\n <li\r\n className='ms-refine-submenu-item'\r\n role='radio'\r\n aria-checked='false'\r\n id={`${parentProductRefinerHierarchy.KeyName!}_${productRefinerValue.LeftValueBoundLocalizedString}`}\r\n aria-label={`${parentProductRefinerHierarchy.KeyName!}_${productRefinerValue.LeftValueBoundLocalizedString}`}\r\n >\r\n <a\r\n href={this._getRefinerUrl()}\r\n aria-label={`${parentProductRefinerHierarchy.KeyName!}_${productRefinerValue.LeftValueBoundLocalizedString}`}\r\n onClick={this._onClick}\r\n >\r\n <RatingComponent\r\n avgRating={parseInt(productRefinerValue.LeftValueBoundString, 10)}\r\n ratingCount={productRefinerValue.LeftValueBoundLocalizedString ? productRefinerValue.LeftValueBoundLocalizedString : productRefinerValue.LeftValueBoundString}\r\n hideCount={false}\r\n readOnly={true}\r\n ariaLabel=''\r\n context={context}\r\n id={this.props.moduleId}\r\n typeName={this.props.moduleTypeName}\r\n data={{}}\r\n />\r\n <span className='refine-submenu-item__rating'>{productRefinerValue.Count !== undefined && `(${productRefinerValue.Count})`}</span>\r\n </a>\r\n </li>\r\n );\r\n } else {\r\n return undefined;\r\n }\r\n } else {\r\n return (\r\n <li className='ms-refine-submenu-item' role={role} id={`${parentProductRefinerHierarchy.KeyName!}_${productRefinerValue.LeftValueBoundString}_${keyId}`}>\r\n <a\r\n key={!!selectedRefinementCriterion ? 'true' : 'false'}\r\n ref={this.anchorType}\r\n href={this._getRefinerUrl()}\r\n tabIndex={0}\r\n onClick={this._onClick}\r\n className={itemTypeClassName}\r\n role={inputType}\r\n aria-checked={!!selectedRefinementCriterion}\r\n {...attrs}\r\n >\r\n <span className='checkmark'/>\r\n <span className='ms-refine-submenu-item__label'>\r\n {productRefinerValue.LeftValueBoundLocalizedString || productRefinerValue.LeftValueBoundString}\r\n </span>\r\n </a>\r\n </li>\r\n );\r\n }\r\n }\r\n\r\n private _getRefinerUrl(): string {\r\n const { urlBuilder, parentProductRefinerHierarchy, productRefinerValue, selectedRefinementCriterion } = this.props;\r\n\r\n if (productRefinerValue) {\r\n return urlBuilder({\r\n parentProductRefinerHierarchy: parentProductRefinerHierarchy,\r\n productRefinerValue: productRefinerValue,\r\n isSelecting: !selectedRefinementCriterion\r\n });\r\n }\r\n\r\n return '';\r\n }\r\n\r\n private _onClick = (e: React.MouseEvent<HTMLAnchorElement | HTMLInputElement>): void => {\r\n e.preventDefault();\r\n\r\n const { parentProductRefinerHierarchy, productRefinerValue, selectedRefinementCriterion } = this.props;\r\n if (productRefinerValue) {\r\n this.props.onToggle({\r\n parentProductRefinerHierarchy: parentProductRefinerHierarchy,\r\n productRefinerValue: productRefinerValue,\r\n isSelecting: !selectedRefinementCriterion\r\n });\r\n\r\n setTimeout(\r\n () => {\r\n this.anchorType.current && this.anchorType.current.focus();\r\n },\r\n 0\r\n );\r\n }\r\n }\r\n}","/*---------------------------------------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License. See License.txt in the project root for license information.\r\n *--------------------------------------------------------------------------------------------*/\r\nimport { findMatchingRefinementCriterion, IRefineItemCommonProps, IRefineItemToggleNotification, RangeRefineItemType } from '@msdyn365-commerce-modules/search-result-container';\r\nimport { Button, Collapse } from '@msdyn365-commerce-modules/utilities';\r\nimport { IProductRefinerHierarchy } from '@msdyn365-commerce/commerce-entities';\r\nimport { ICoreContext } from '@msdyn365-commerce/core';\r\nimport { ProductRefinerValue } from '@msdyn365-commerce/retail-proxy';\r\nimport * as React from 'react';\r\nimport RangeRefineItem from './range-refine-item';\r\nimport RefineItem from './refine-item';\r\nimport { ProductRefinerTypeValue, ProductRefinerValueDataTypeValue } from './utilities';\r\n\r\n/**\r\n * Properties associated with the RefineSubmenu component\r\n */\r\nexport interface IRefineSubmenuProps {\r\n tempRangeTypeTODO: RangeRefineItemType;\r\n minValueSliderThumbAriaLabel?: string;\r\n maxValueSliderThumbAriaLabel?: string;\r\n productRefinerHierarchy: IProductRefinerHierarchy;\r\n selectedRefinerValues: ProductRefinerValue[];\r\n sortingCriteraValues?: string[];\r\n refineItemCommonProps: IRefineItemCommonProps;\r\n isDisabled: boolean;\r\n isExpandedOnInitialLoad: boolean;\r\n context: ICoreContext;\r\n moduleId: string;\r\n moduleTypeName: string;\r\n refinersToBeUpdated: string;\r\n onUpdateRefiners(notfication: Readonly<IRefineItemToggleNotification>): void;\r\n urlBuilder(refiner: IRefineItemToggleNotification): string;\r\n}\r\n\r\n/**\r\n * Refine submenu state\r\n */\r\nexport interface IRefineSubmenuState extends React.ComponentState {\r\n expanded: boolean;\r\n}\r\n\r\n/**\r\n *\r\n * The RefineSubmenu component renders the submenu category and child items.\r\n * This computed observes the stateful category hierarchy object.\r\n * @extends {React.PureComponent<IRefineSubmenuProps>}\r\n */\r\nclass RefineSubmenu extends React.Component<IRefineSubmenuProps, IRefineSubmenuState> {\r\n constructor(props: IRefineSubmenuProps) {\r\n super(props);\r\n\r\n this._onToggleItem = this._onToggleItem.bind(this);\r\n this._onToggleSubmenu = this._onToggleSubmenu.bind(this);\r\n\r\n let isExpanded = this.props.isExpandedOnInitialLoad;\r\n if (this.props.productRefinerHierarchy.DataTypeValue === ProductRefinerValueDataTypeValue.Range) {\r\n isExpanded = true;\r\n }\r\n\r\n this.state = {\r\n expanded: isExpanded\r\n };\r\n }\r\n\r\n public render(): JSX.Element | null {\r\n const { productRefinerHierarchy, refineItemCommonProps, refinersToBeUpdated } = this.props;\r\n\r\n if (!productRefinerHierarchy) {\r\n refineItemCommonProps.telemetry.error('Cannot render submenu without refiner hierarchy data');\r\n }\r\n const refinersLists = refinersToBeUpdated && refinersToBeUpdated.split(',');\r\n let refinerName = productRefinerHierarchy.KeyName || '';\r\n refinersLists && refinersLists.map((refiners: string) => {\r\n if (refiners.split('|').length > 1 && refiners.split('|')[0].toLowerCase() === refinerName?.toLowerCase()) {\r\n refinerName = refiners.split('|')[1] && refiners.split('|')[1] || refinerName;\r\n }\r\n });\r\n\r\n return (\r\n <div className='ms-refine-submenu list-group'>\r\n <Button\r\n className={this.state.expanded ? 'ms-refine-submenu__toggle_expanded' : 'ms-refine-submenu__toggle_collapsed'}\r\n aria-label={refinerName || 'refiner.Name'}\r\n onClick={this._onToggleSubmenu}\r\n aria-expanded={this.state.expanded}\r\n >\r\n {refinerName}\r\n </Button>\r\n <Collapse isOpen={this.state.expanded} timeout={350}>\r\n {this._renderChildItems(productRefinerHierarchy)}\r\n </Collapse>\r\n </div>\r\n );\r\n }\r\n\r\n private _renderChildItems(productRefinerHierarchy: IProductRefinerHierarchy): JSX.Element | null {\r\n switch (productRefinerHierarchy.DataTypeValue) {\r\n case ProductRefinerValueDataTypeValue.Range:\r\n case ProductRefinerValueDataTypeValue.RangeInput:\r\n return this._renderRange(productRefinerHierarchy);\r\n default:\r\n return this._renderSingleMultiSelect(productRefinerHierarchy);\r\n }\r\n }\r\n\r\n private _renderSingleMultiSelect(productRefinerHierarchy: IProductRefinerHierarchy): JSX.Element | null {\r\n const { isDisabled, refineItemCommonProps, selectedRefinerValues, sortingCriteraValues, context } = this.props;\r\n const isSingleSelect = productRefinerHierarchy.RefinerTypeValue === ProductRefinerTypeValue.Single;\r\n const role = isSingleSelect ? { role: 'radiogroup' } : undefined;\r\n // const refinerValuesList = (productRefinerHierarchy.Values || []);\r\n const refinerValuesList = (productRefinerHierarchy.Values || []).sort(function (a:ProductRefinerValue,b:ProductRefinerValue){\r\n if(a.LeftValueBoundString && b.LeftValueBoundString){ return a.LeftValueBoundString.localeCompare(b.LeftValueBoundString)}\r\n return 0;\r\n });\r\n const listItems = refinerValuesList.map((child: ProductRefinerValue, index: number) => {\r\n if (!child) {\r\n refineItemCommonProps.telemetry.error(\r\n `[refine-submenu] Could not render refine item for refiner ${productRefinerHierarchy.RecordId} (${productRefinerHierarchy.KeyName})`\r\n );\r\n return null;\r\n }\r\n\r\n let selectedRefinementCriterion = findMatchingRefinementCriterion(child, selectedRefinerValues);\r\n\r\n if (child.RightValueBoundString && sortingCriteraValues && sortingCriteraValues?.indexOf(child.RightValueBoundString) !== -1) {\r\n selectedRefinementCriterion = child;\r\n }\r\n return (\r\n <RefineItem\r\n parentProductRefinerHierarchy={productRefinerHierarchy}\r\n productRefinerValue={child}\r\n selectedRefinementCriterion={selectedRefinementCriterion}\r\n refineItemCommonProps={refineItemCommonProps}\r\n onToggle={this._onToggleItem}\r\n urlBuilder={this.props.urlBuilder}\r\n isDisabled={isDisabled}\r\n key={index}\r\n context={context}\r\n moduleId={this.props.moduleId}\r\n moduleTypeName={this.props.moduleTypeName}\r\n keyId = {index}\r\n />\r\n );\r\n });\r\n return (\r\n <ul className='ms-refine-submenu__list' {...role} aria-label={productRefinerHierarchy.KeyName}>\r\n {listItems}\r\n </ul>\r\n );\r\n }\r\n\r\n private _renderRange(productRefinerHierarchy: IProductRefinerHierarchy): JSX.Element | null {\r\n const { isDisabled, refineItemCommonProps, selectedRefinerValues, context, minValueSliderThumbAriaLabel, maxValueSliderThumbAriaLabel } = this.props;\r\n const submenuClassNamePrefix = 'ms-refine-submenu__item list-group-item refine-submenu__item';\r\n const refinerValuesList = (productRefinerHierarchy.Values || []);\r\n const listItems = refinerValuesList.map((child: ProductRefinerValue, index: number) => {\r\n if (!child) {\r\n refineItemCommonProps.telemetry.error(\r\n `Could not render refine item for refiner ${productRefinerHierarchy.RecordId} (${productRefinerHierarchy.KeyName})`\r\n );\r\n return null;\r\n }\r\n\r\n const selectedRefinementCriterion = findMatchingRefinementCriterion(child, selectedRefinerValues);\r\n\r\n // TODO BUGBUG 22424559 determine only from the DataTypeValue once live example is working (can test with the tempRangeTypeTODO derived from QSP until then)\r\n const rangeType = (productRefinerHierarchy.DataTypeValue === ProductRefinerValueDataTypeValue.RangeInput || this.props.tempRangeTypeTODO === 'input') ?\r\n 'input' :\r\n 'slider';\r\n const key = selectedRefinementCriterion ? `${selectedRefinementCriterion.LeftValueBoundString}-${selectedRefinementCriterion.RightValueBoundString}` : `not-selected-${index}`;\r\n return (\r\n <li className={`${submenuClassNamePrefix}--range`} key={index}>\r\n <RangeRefineItem\r\n parentProductRefinerHierarchy={productRefinerHierarchy}\r\n productRefinerValue={child}\r\n selectedRefinementCriterion={selectedRefinementCriterion}\r\n refineItemCommonProps={refineItemCommonProps}\r\n onToggle={this._onToggleItem}\r\n urlBuilder={this.props.urlBuilder}\r\n isDisabled={isDisabled}\r\n rangeType={rangeType}\r\n key={key}\r\n context={context}\r\n minValueSliderThumbAriaLabel={minValueSliderThumbAriaLabel}\r\n maxValueSliderThumbAriaLabel={maxValueSliderThumbAriaLabel}\r\n moduleId={this.props.moduleId}\r\n moduleTypeName={this.props.moduleTypeName}\r\n keyId = {index}\r\n />\r\n </li>\r\n );\r\n });\r\n return <ul className='ms-refine-submenu__list list-unstyled'>{listItems}</ul>;\r\n }\r\n\r\n private _onToggleItem(itemToggleNotification: IRefineItemToggleNotification): void {\r\n this.props.onUpdateRefiners(itemToggleNotification);\r\n }\r\n\r\n private _onToggleSubmenu(): void {\r\n this.setState(prevState => ({\r\n expanded: !prevState.expanded\r\n }));\r\n }\r\n}\r\n\r\nexport default RefineSubmenu;","/*---------------------------------------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License. See License.txt in the project root for license information.\r\n *--------------------------------------------------------------------------------------------*/\r\nimport MsDyn365, { IRequestContext } from '@msdyn365-commerce/core';\r\nimport { ProductRefinerValue, SortColumn } from '@msdyn365-commerce/retail-proxy';\r\n\r\n/**\r\n * Refiner Compression:\r\n * Refiners contains a non-trivial amount of data that is required to successfully make\r\n * a refiner-based API call. To allow for deep-linking of refiners in the URL, refiner data\r\n * must be compressed so that URL max length is not exceeded. Refiners will be compressed into\r\n * the following array style index-based format:\r\n * [DataTypeValue, LeftValueBoundString, RefinerRecordId, RefinerSourceValue, RightValueBoundString, UnitText]\r\n */\r\nconst compressedRefinerKeys = ['DataTypeValue', 'LeftValueBoundString', 'RefinerRecordId', 'RefinerSourceValue', 'RightValueBoundString', 'UnitText'];\r\n\r\n/**\r\n * Hydrates compressed refiner data from URL\r\n * @param fullUrl The full URL of the page\r\n */\r\nexport const hydrateRefinersFromUrl = (requestContext: IRequestContext): ProductRefinerValue[] => {\r\n const compressedRefinerArray = parseQueryParam<(string | number)[][]>('refiners', requestContext);\r\n if (!compressedRefinerArray || !compressedRefinerArray.length) {\r\n return [];\r\n }\r\n\r\n return <ProductRefinerValue[]>compressedRefinerArray.map((compressedRefiner) => {\r\n try {\r\n const parsedRefiner: ProductRefinerValue = {};\r\n compressedRefinerKeys.forEach((refinerKey, index) => {\r\n // @ts-ignore: This line is intentionally not typesafe\r\n parsedRefiner[refinerKey] = compressedRefiner[index];\r\n });\r\n return parsedRefiner;\r\n } catch (e) {\r\n return undefined;\r\n }\r\n }).filter(Boolean);\r\n};\r\n\r\n/**\r\n * Compressed a list of refiners for use in URLs\r\n * @param refiners The uncompressed refiners\r\n */\r\nexport const compressRefiners = (refiners: ProductRefinerValue[]) => {\r\n const compressedRefiners: (string | number)[][] = [];\r\n\r\n refiners.forEach((refiner) => {\r\n const compressedRefiner: (string | number)[] = [];\r\n compressedRefinerKeys.forEach((refinerKey) => {\r\n // @ts-ignore: This line is intentionally not typesafe\r\n compressedRefiner.push(refiner[refinerKey]);\r\n });\r\n compressedRefiners.push(compressedRefiner);\r\n });\r\n\r\n return compressedRefiners;\r\n};\r\n\r\n/**\r\n * Method which creates a URL contiaining serialized active refiners\r\n * @param fullUrl The Current URL of the page\r\n * @param refiners The refiners which should be added to the URL\r\n */\r\nexport const buildListPageUrl = (fullUrl: URL, refiners?: ProductRefinerValue[], sortingColumns?: SortColumn[], skipCount?: number) => {\r\n // Refiner Change flow\r\n if (refiners !== undefined) {\r\n if (!refiners.length) {\r\n fullUrl.searchParams.delete('refiners');\r\n } else {\r\n fullUrl.searchParams.set('refiners', JSON.stringify(compressRefiners(refiners)));\r\n }\r\n\r\n // Adding or removing a refiner means we want to always load page 1\r\n fullUrl.searchParams.delete('skip');\r\n return fullUrl.href;\r\n }\r\n\r\n if (sortingColumns !== undefined) {\r\n if (!sortingColumns.length) {\r\n fullUrl.searchParams.delete('sorting');\r\n } else {\r\n fullUrl.searchParams.set('sorting', JSON.stringify(sortingColumns));\r\n }\r\n\r\n // Changing the sort means always load page 1\r\n fullUrl.searchParams.delete('skip');\r\n return fullUrl.href;\r\n }\r\n\r\n if (skipCount) {\r\n fullUrl.searchParams.set('skip', skipCount.toString());\r\n }\r\n\r\n return fullUrl.href;\r\n};\r\n\r\n/**\r\n * Parses a query param from the query object of the request context\r\n * @param key The query parameter key\r\n * @param requestContext The request context\r\n */\r\nexport const parseQueryParam = <T>(key: string, requestContext: IRequestContext): T | null => {\r\n if (requestContext.query && requestContext.query[key]) {\r\n return <T>JSON.parse(decodeURIComponent(requestContext.query[key]));\r\n }\r\n return null;\r\n};\r\n\r\n/**\r\n * Gets the current URL of the page from the request context\r\n * @param requestContext The request context\r\n */\r\nexport const getCurrentUrl = (requestContext: IRequestContext): URL => {\r\n if (MsDyn365.isBrowser) {\r\n return new URL(window.location.href);\r\n } else {\r\n // NOTE: Typing on requestURL is incorrect\r\n if (requestContext.url.requestUrl.href) {\r\n return new URL(requestContext.url.requestUrl.href);\r\n } else {\r\n return new URL(<string><unknown>(requestContext.url.requestUrl));\r\n }\r\n }\r\n};\r\n","import { getUpdatedRefinementCriteria, IRefineItemCommonProps, IRefineItemToggleNotification, ISearchResultContainerViewProps } from '@msdyn365-commerce-modules/search-result-container';\r\nimport { Button,ILabeledDropdownOption, INodeProps, Node } from '@msdyn365-commerce-modules/utilities';\r\nimport { IProductRefinerHierarchy } from '@msdyn365-commerce/commerce-entities';\r\nimport { SortColumn } from '@msdyn365-commerce/retail-proxy';\r\nimport { transaction } from 'mobx';\r\nimport * as React from 'react';\r\nimport { ICittaSearchResultContainerProps } from '../../modules/citta-search-result-container/citta-search-result-container.props.autogenerated';\r\nimport RefineSubmenu from './refine-submenu';\r\nimport { buildListPageUrl, getCurrentUrl } from './url-utils';\r\nexport interface ISortByViewProps {\r\n SortingContainer: INodeProps;\r\n sortByDropDown?: React.ReactNode;\r\n}\r\n\r\nexport interface ISortByProps {\r\n props: ISearchResultContainerViewProps & ICittaSearchResultContainerProps<{}>;\r\n}\r\n\r\nexport interface ISortByOptionsState {\r\n sortingState: ISortByCollectionState;\r\n}\r\n\r\ninterface ISortByCollectionState {\r\n selectedSortByOption: ILabeledDropdownOption;\r\n dropdownOpen: boolean;\r\n pending: boolean;\r\n}\r\nexport interface IRefineMenuViewProps {\r\n RefineMenuContainer: INodeProps;\r\n RefinerSectionContainer: INodeProps;\r\n refinersHeader: React.ReactNode;\r\n refiners?: React.ReactNode[];\r\n}\r\n\r\nconst sortOptions = {\r\n sortByOptionRelevanceDesc: 'Ranking-Desc',\r\n sortByOptionRatingAsc: 'AverageRating-Asc',\r\n sortByOptionRatingDesc: 'AverageRating-Desc',\r\n sortByOptionNameAsc: 'Name-Asc',\r\n sortByOptionNameDesc: 'Name-Desc',\r\n sortByOptionPriceAsc: 'Price-Asc',\r\n sortByOptionPriceDesc: 'Price-Desc'\r\n};\r\n\r\nexport interface IRefinerProps {\r\n props: ISearchResultContainerViewProps & ICittaSearchResultContainerProps<{}>;\r\n toggleModal: Function;\r\n}\r\n/** This component will be used to render Refiners on Citta category and search results page */\r\nexport default class CittaRefiners extends React.PureComponent<IRefinerProps> {\r\n private _refineItemCommonProps: IRefineItemCommonProps;\r\n \r\n private sortByDropdownOptions: ILabeledDropdownOption[] = [\r\n { key: sortOptions.sortByOptionRelevanceDesc, value: this.props.props.resources.sortByOptionRelevanceDesc },\r\n { key: sortOptions.sortByOptionNameAsc, value: this.props.props.resources.sortByOptionNameAsc },\r\n { key: sortOptions.sortByOptionNameDesc, value: this.props.props.resources.sortByOptionNameDesc },\r\n { key: sortOptions.sortByOptionPriceAsc, value: this.props.props.resources.sortByOptionPriceAsc },\r\n { key: sortOptions.sortByOptionPriceDesc, value: this.props.props.resources.sortByOptionPriceDesc },\r\n ];\r\n\r\n\r\n constructor(props: IRefinerProps) {\r\n super(props);\r\n const {\r\n placeholderTextMax,\r\n minLabel,\r\n maxLabel,\r\n rangeNameFormat\r\n } = props.props.resources;\r\n\r\n const locale = props.props.context.request.locale;\r\n const telemetry = props.props.telemetry;\r\n const validationErrorNaN = props.props.resources.validationErrorNotNumber;\r\n const validationErrorRange = props.props.resources.validationErrorNotRange;\r\n this._refineItemCommonProps = {\r\n telemetry,\r\n locale,\r\n placeholderTextMax,\r\n minLabel,\r\n maxLabel,\r\n rangeNameFormat,\r\n validationErrorNaN,\r\n validationErrorRange\r\n };\r\n\r\n this.state = {\r\n sortingState: {\r\n pending: false,\r\n dropdownOpen: false,\r\n selectedSortByOption: this.sortByDropdownOptions[0]\r\n }\r\n };\r\n\r\n this._renderRefiners = this._renderRefiners.bind(this);\r\n this._onClearRefiners = this._onClearRefiners.bind(this);\r\n this._getSortColumnFromSelectedOption = this._getSortColumnFromSelectedOption.bind(this);\r\n this._getSortingRefiner = this._getSortingRefiner.bind(this);\r\n\r\n }\r\n public render(): JSX.Element | null {\r\n const refineMenu: IRefineMenuViewProps = this._renderRefiners();\r\n const sortRefiner = this._getSortingRefiner();\r\n\r\n if (refineMenu.refiners) {\r\n return (\r\n \r\n <Node {...refineMenu.RefinerSectionContainer}>\r\n <Node {...refineMenu.RefineMenuContainer}>\r\n {refineMenu.refinersHeader}\r\n {sortRefiner.sortByDropDown}\r\n {refineMenu.refiners.map((submenu, index) => (\r\n <React.Fragment key={index}>\r\n {submenu}\r\n </React.Fragment>\r\n ))}\r\n </Node>\r\n </Node>\r\n );\r\n }\r\n return null;\r\n }\r\n\r\n private _onClearRefiners = (): void => {\r\n const { context } = this.props.props;\r\n const requestContext = context && context.request;\r\n const actionContext = context && context.actionContext;\r\n\r\n if (!requestContext || !actionContext || !this.props.props.data.listPageState.result) {\r\n const error = `Refine menu cannot refine search criteria: ${!requestContext ? 'requestContext ' : ''} ${!actionContext ? 'actionContext ' : ''} could not be found`;\r\n this.props.props.telemetry.warning(error);\r\n }\r\n\r\n window.history.pushState({}, '', buildListPageUrl(getCurrentUrl(requestContext), []));\r\n transaction(() => {\r\n this.props.props.data.listPageState.result!.currentPageNumber = 0;\r\n this.props.props.data.listPageState.result!.activeFilters = [];\r\n });\r\n }\r\n\r\n private _getSortingRefiner = (): ISortByViewProps => {\r\n const { data, context, config } = this.props.props;\r\n\r\n const tempRangeTypeTODO = context.request.query && context.request.query.inputRange ? 'input' : 'slider';\r\n const sortingCritera = (data.listPageState.result && data.listPageState.result.sortingCritera) || undefined;\r\n \r\n let sortByValues:string[] = [];\r\n const activeRefiners = (data.listPageState.result && data.listPageState.result.activeFilters) || [];\r\n\r\n if (data.searchConfiguration.result) {\r\n if (sortingCritera && sortingCritera.Columns?.length) {\r\n data.searchConfiguration!.result!.forEach((searchConfiguration) => { \r\n sortingCritera.Columns!.forEach (sortingC => {\r\n if (searchConfiguration.sortColumn.ColumnName === sortingC.ColumnName && searchConfiguration.sortColumn.IsDescending === sortingC.IsDescending) {\r\n sortByValues.push(searchConfiguration.key);\r\n }\r\n })\r\n });\r\n }\r\n }\r\n\r\n let sortByDropdownOptions = [\r\n {\r\n RefinerSourceValue: 1,\r\n DataValueType: 5,\r\n Count: 8,\r\n RowNumber: 0,\r\n RefinerRecordId: 0,\r\n UnitText: 'Sort By',\r\n RightValueBoundString: sortOptions.sortByOptionRelevanceDesc,\r\n LeftValueBoundString: this.props.props.resources.sortByOptionRelevanceDesc\r\n },\r\n {\r\n RefinerSourceValue: 1,\r\n DataValueType: 5,\r\n Count: 8,\r\n RowNumber: 0,\r\n RefinerRecordId: 0,\r\n UnitText: 'Sort By',\r\n RightValueBoundString: sortOptions.sortByOptionNameAsc,\r\n LeftValueBoundString: this.props.props.resources.sortByOptionNameAsc\r\n },\r\n {\r\n RefinerSourceValue: 1,\r\n DataValueType: 5,\r\n Count: 8,\r\n RowNumber: 0,\r\n RefinerRecordId: 0,\r\n UnitText: 'Sort By',\r\n RightValueBoundString: sortOptions.sortByOptionNameDesc,\r\n LeftValueBoundString: this.props.props.resources.sortByOptionNameDesc\r\n },\r\n {\r\n RefinerSourceValue: 1,\r\n DataValueType: 5,\r\n Count: 8,\r\n RowNumber: 0,\r\n RefinerRecordId: 0,\r\n UnitText: 'Sort By',\r\n RightValueBoundString: sortOptions.sortByOptionPriceAsc,\r\n LeftValueBoundString: this.props.props.resources.sortByOptionPriceAsc\r\n },\r\n {\r\n RefinerSourceValue: 1,\r\n DataValueType: 5,\r\n Count: 8,\r\n RowNumber: 0,\r\n RefinerRecordId: 0,\r\n UnitText: 'Sort By',\r\n RightValueBoundString: sortOptions.sortByOptionPriceDesc,\r\n LeftValueBoundString: this.props.props.resources.sortByOptionPriceDesc\r\n }\r\n ];\r\n\r\n let sortBy: IProductRefinerHierarchy = {\r\n KeyName: 'SortBy',\r\n Values: sortByDropdownOptions\r\n } ;\r\n const dropdown = (\r\n <RefineSubmenu\r\n productRefinerHierarchy={sortBy}\r\n sortingCriteraValues={sortByValues}\r\n selectedRefinerValues={activeRefiners}\r\n refineItemCommonProps={this._refineItemCommonProps}\r\n minValueSliderThumbAriaLabel={this.props.props.resources.minValueSliderThumbAriaLabel}\r\n maxValueSliderThumbAriaLabel={this.props.props.resources.maxValueSliderThumbAriaLabel}\r\n key={'sort-by-1'}\r\n onUpdateRefiners={this._updateDropDown}\r\n urlBuilder={this._buildRefinerUrl}\r\n isDisabled={false}\r\n isExpandedOnInitialLoad={false}\r\n tempRangeTypeTODO={tempRangeTypeTODO}\r\n context={context}\r\n moduleId={this.props.props.id}\r\n moduleTypeName={this.props.props.typeName}\r\n refinersToBeUpdated={config.refinersToBeUpdated || ''}\r\n />\r\n );\r\n return {\r\n SortingContainer: { className: 'ms-search-result-container__Sort-by-category' },\r\n sortByDropDown: dropdown\r\n };\r\n }\r\n\r\n private _updateDropDown = (notification: IRefineItemToggleNotification): void => {\r\n let sortColumn = this._getSortColumnFromSelectedOption(notification.productRefinerValue.RightValueBoundString || '')\r\n\r\n window.history.pushState({}, '', buildListPageUrl(getCurrentUrl(this.props.props.context.request), undefined, [sortColumn], undefined));\r\n transaction(() => {\r\n this.props.props.data.listPageState.result!.currentPageNumber = 0;\r\n this.props.props.data.listPageState.result!.sortingCritera = { Columns: [sortColumn] };\r\n });\r\n\r\n this.setState({\r\n sortingState: {\r\n dropdownOpen: false,\r\n pending: false,\r\n selectedSortByOption: this.sortByDropdownOptions[0]\r\n }\r\n });\r\n }\r\n\r\n private _getSortColumnFromSelectedOption = (type: string): SortColumn => {\r\n const { data } = this.props.props;\r\n\r\n if (!data.searchConfiguration.result) {\r\n return {};\r\n }\r\n\r\n const mappedConfiguration = data.searchConfiguration.result.find((searchConfiguration) => { return searchConfiguration.key === type; });\r\n\r\n if (mappedConfiguration) {\r\n return mappedConfiguration.sortColumn;\r\n }\r\n\r\n return {};\r\n }\r\n\r\n private _renderRefiners = (): IRefineMenuViewProps => {\r\n const { data, context, config } = this.props.props;\r\n\r\n const tempRangeTypeTODO = context.request.query && context.request.query.inputRange ? 'input' : 'slider';\r\n const validRefiners = data.refiners.result && data.refiners.result.filter(refiner => {\r\n return refiner.Values.length > 0;\r\n });\r\n const expandedMenusOnLoad = config.expandedMenusOnLoad || 'all';\r\n const activeRefiners = (data.listPageState.result && data.listPageState.result.activeFilters) || [];\r\n const refinersHeader =\r\n (\r\n <div className='refine-menu-header'>\r\n <div className='refine-menu-close'>\r\n <Button\r\n className={'refine-menu-close-button'}\r\n // @ts-ignore\r\n onClick={this.props.toggleModal}\r\n >{'x'}\r\n </Button>\r\n </div>\r\n\r\n <div className='refine-menu-header-text'>Refine</div>\r\n <div className='refine-menu-header-action'>\r\n <Button\r\n className={'refine-menu-header-action-link'}\r\n aria-label={'Clear'}\r\n // tslint:disable-next-line: react-this-binding-issue\r\n onClick={this._onClearRefiners}\r\n >{'Clear'}\r\n </Button>\r\n </div>\r\n </div>\r\n );\r\n\r\n \r\n let orderedRefiners: IProductRefinerHierarchy[] = [];\r\n\r\n if (validRefiners && validRefiners.length){\r\n let refinerCat = validRefiners.find(refiner => refiner.KeyName === 'Refiner Category');\r\n refinerCat && orderedRefiners.push(refinerCat)\r\n \r\n validRefiners.forEach(refiner => {\r\n \r\n if (refiner.KeyName !== 'Refiner Category') {\r\n orderedRefiners.push(refiner)\r\n }\r\n })\r\n }\r\n const subMenus = orderedRefiners && orderedRefiners.map((productRefinerHierarchy: IProductRefinerHierarchy, index: number) => {\r\n const hiddenRefinersList = config.refinersToBeHidden && config.refinersToBeHidden.toLowerCase().split(',');\r\n if (productRefinerHierarchy.KeyName !== 'Category' && (hiddenRefinersList ? (hiddenRefinersList.indexOf(productRefinerHierarchy.KeyName!.toLowerCase()) === -1 && productRefinerHierarchy.KeyName!.toLowerCase() !== 'rating') : true)) {\r\n let isExpanded: boolean;\r\n switch (expandedMenusOnLoad) {\r\n case 'none':\r\n isExpanded = false;\r\n break;\r\n case 'first':\r\n isExpanded = index === 0;\r\n break;\r\n case 'all':\r\n default:\r\n isExpanded = true;\r\n }\r\n if (context.request && context.request.device && context.request.device.Type === 'Mobile') {\r\n if (productRefinerHierarchy.KeyName === \"Refiner Category\") {\r\n isExpanded = true;\r\n }\r\n }\r\n\r\n return (\r\n <RefineSubmenu\r\n productRefinerHierarchy={productRefinerHierarchy}\r\n selectedRefinerValues={activeRefiners}\r\n refineItemCommonProps={this._refineItemCommonProps}\r\n minValueSliderThumbAriaLabel={this.props.props.resources.minValueSliderThumbAriaLabel}\r\n maxValueSliderThumbAriaLabel={this.props.props.resources.maxValueSliderThumbAriaLabel}\r\n key={index}\r\n onUpdateRefiners={this._onUpdateRefiners}\r\n urlBuilder={this._buildRefinerUrl}\r\n isDisabled={false}\r\n isExpandedOnInitialLoad={isExpanded}\r\n tempRangeTypeTODO={tempRangeTypeTODO}\r\n context={context}\r\n moduleId={this.props.props.id}\r\n moduleTypeName={this.props.props.typeName}\r\n refinersToBeUpdated={config.refinersToBeUpdated || ''}\r\n />\r\n );\r\n } else {\r\n return undefined;\r\n }\r\n });\r\n return {\r\n RefineMenuContainer: { className: 'ms-search-result-container__refine-menu' },\r\n RefinerSectionContainer: { className: 'ms-search-result-container__refiner-section' },\r\n refinersHeader: refinersHeader,\r\n refiners: subMenus\r\n };\r\n }\r\n\r\n private _buildRefinerUrl = (itemToggleNotification: IRefineItemToggleNotification): string => {\r\n if (this.props.props.data.listPageState.result) {\r\n const newRefinementCriteria = getUpdatedRefinementCriteria(itemToggleNotification, this.props.props.data.listPageState.result.activeFilters || []);\r\n\r\n return buildListPageUrl(getCurrentUrl(this.props.props.context.request), newRefinementCriteria);\r\n } else {\r\n this.props.props.telemetry.warning(`[buildRefinerQueryString]List Page State Not available, unable to build refiner URL`);\r\n return '';\r\n }\r\n }\r\n\r\n private _onUpdateRefiners = (itemToggleNotification: IRefineItemToggleNotification): void => {\r\n const { context } = this.props.props;\r\n const requestContext = context && context.request;\r\n const actionContext = context && context.actionContext;\r\n\r\n if (!requestContext || !actionContext || !this.props.props.data.listPageState.result) {\r\n const error = `Refine menu cannot refine search criteria: ${!requestContext ? 'requestContext ' : ''} ${!actionContext ? 'actionContext ' : ''} could not be found`;\r\n this.props.props.telemetry.warning(error);\r\n }\r\n\r\n const updatedRefinementCriteria = getUpdatedRefinementCriteria(itemToggleNotification, this.props.props.data.listPageState.result && this.props.props.data.listPageState.result.activeFilters || []);\r\n\r\n window.history.pushState({}, '', buildListPageUrl(getCurrentUrl(this.props.props.context.request), updatedRefinementCriteria));\r\n transaction(() => {\r\n this.props.props.data.listPageState.result!.currentPageNumber = 0;\r\n this.props.props.data.listPageState.result!.activeFilters = updatedRefinementCriteria;\r\n });\r\n }\r\n}\r\n","import { IGridSettings, IImageData, IImageSettings, Image } from '@msdyn365-commerce/core';\r\nimport classnames from 'classnames';\r\nimport * as React from 'react';\r\nexport type PictureLoadFailureBehavior = 'default' | 'hide' | 'empty';\r\n\r\nexport interface IPictureState extends React.ComponentState {\r\n showHoverImg: boolean;\r\n}\r\nexport interface IPictureProps {\r\n loadFailureBehavior?: PictureLoadFailureBehavior;\r\n image1?: string;\r\n image2?: string;\r\n emptyImageUrl?: string;\r\n altText?: string;\r\n gridSettings: IGridSettings;\r\n imageSettings?: IImageSettings;\r\n className?: string;\r\n}\r\n/** The Picture component will return picture tag for an image based on ImageResize properties and settings needed to resize the image */\r\nexport default class CittaPicture extends React.PureComponent<IPictureProps, IPictureState> {\r\n\r\n public render(): JSX.Element | null {\r\n const { image1 = '', image2 = '', altText, gridSettings, imageSettings } = this.props;\r\n const img1: IImageData = {\r\n src: image1,\r\n altText: altText ? altText : ''\r\n };\r\n const img2: IImageData = {\r\n src: image2,\r\n altText: altText ? altText : ''\r\n };\r\n const imageProps = {\r\n gridSettings: gridSettings,\r\n imageSettings: imageSettings\r\n };\r\n return (\r\n <div className='images-container'>\r\n <Image\r\n {...img1}\r\n {...imageProps}\r\n loadFailureBehavior='empty'\r\n className={classnames('image1', this.props.className)}\r\n onMouseOver={this.handleMoveHover}\r\n />\r\n <Image\r\n {...img2}\r\n {...imageProps}\r\n loadFailureBehavior='hide'\r\n className={classnames((this.state?.showHoverImg ? 'image2 hoverImg ' : 'image2 hoverImg hideImg '), this.props.className)}\r\n onMouseOut={this.handleMoveOut}\r\n />\r\n </div>\r\n );\r\n }\r\n\r\n private handleMoveHover = () => {\r\n this.setState({ showHoverImg: true });\r\n }\r\n\r\n private handleMoveOut = () => {\r\n this.setState({ showHoverImg: false });\r\n }\r\n}\r\n","import { generateImageUrl, getProductPageUrlSync } from '@msdyn365-commerce-modules/retail-actions';\r\nimport { format } from '@msdyn365-commerce-modules/utilities';\r\nimport { RatingComponent } from '@msdyn365-commerce/components';\r\nimport { IComponentProps, ICoreContext, IGridSettings, IImageSettings } from '@msdyn365-commerce/core';\r\nimport { ProductPrice, ProductSearchResult } from '@msdyn365-commerce/retail-proxy';\r\nimport * as React from 'react';\r\nimport CittaPicture from '../../../components/citta-picture';\r\n\r\nimport PriceComponent from '../../../components/price-component';\r\n\r\nexport interface IProductComponentProps extends IComponentProps<{ product?: ProductSearchResult }> {\r\n className?: string;\r\n imageSettings?: IImageSettings;\r\n savingsText?: string;\r\n freePriceText?: string;\r\n originalPriceText?: string;\r\n currentPriceText?: string;\r\n ratingAriaLabel?: string;\r\n salesLineTagKey?: string;\r\n tagsToIgnore?: string;\r\n}\r\n\r\n/**\r\n *\r\n * The ProductComponent renders the products.\r\n * @extends {React.PureComponent<IProductComponentProps>}\r\n */\r\nclass ProductComponent extends React.Component<IProductComponentProps> {\r\n\r\n constructor(props: IProductComponentProps) {\r\n super(props);\r\n }\r\n\r\n public render(): JSX.Element | null {\r\n const product = this.props.data.product;\r\n if (!product) {\r\n return null;\r\n }\r\n let imageOrientation: string = '';\r\n let onlineTags: string = '';\r\n let salesLineTag: string = '';\r\n let productImage1: string = '';\r\n let productImage2: string = '';\r\n let stockAvailabilityPropertyText: string = '';\r\n let stockAvailabilities: any[] = [];\r\n\r\n if (product.ExtensionProperties!.length > 0) {\r\n product.ExtensionProperties!.map(property => {\r\n if (property.Key === 'ProductImage1') {\r\n productImage1 = property.Value!.StringValue!;\r\n } else if (property.Key === 'ProductImage2') {\r\n productImage2 = property.Value!.StringValue!;\r\n }\r\n else if (property.Key === 'ProductAvailability') {\r\n stockAvailabilities.push({name: property.Value?.StringValue, value: property.Value?.IntegerValue});\r\n }\r\n });\r\n }\r\n if (product.AttributeValues!.length > 0) {\r\n product.AttributeValues!.map(property => {\r\n if (property.Name === 'Image Orientation') {\r\n imageOrientation = property.TextValue!;\r\n } else if (property.Name === 'Online Tags' || property.Name === \"Online Tags B2BN\" || property.Name === \"Online Tags B2BA\" || property.Name === \"Online Tags B2BI\") {\r\n onlineTags = property.TextValue!;\r\n if (this.props.tagsToIgnore && onlineTags) {\r\n let tags = this.props.tagsToIgnore.split('|');\r\n if (tags.includes(onlineTags)) {\r\n onlineTags = '';\r\n }\r\n }\r\n } else if (property.Name === this.props.salesLineTagKey) {\r\n salesLineTag = property.TextValue!;\r\n }\r\n });\r\n }\r\n\r\n const image1 = generateImageUrl(productImage1, this.props.context.request.apiSettings);\r\n const image2 = generateImageUrl(productImage2, this.props.context.request.apiSettings);\r\n\r\n const productUrl = getProductPageUrlSync(product.Name || '', product.RecordId, this.props.context && this.props.context.actionContext, undefined);\r\n\r\n // Construct telemetry attribute to render\r\n const attribute = this.props.context\r\n && this.props.context.telemetry\r\n && this.props.context.telemetry.setTelemetryAttribute\r\n && this.props.context.telemetry.setTelemetryAttribute(product.RecordId.toString(), {\r\n pid: product.RecordId,\r\n pname: product.Name,\r\n mname: this.props.id\r\n }\r\n );\r\n const productImageSettings = imageOrientation === 'Landscape' ? this._getLandscapeImageSettings(this.props.imageSettings) : this.props.imageSettings;\r\n return (\r\n <a href={productUrl} aria-label={this._renderLabel(product.Name, this.props.context.cultureFormatter.formatCurrency(product.Price), product.AverageRating, this.props.ratingAriaLabel)} className='msc-product' {...attribute}>\r\n <div className={(onlineTags && onlineTags !== '') ? 'product-placement__item-imagetag' : 'product-placement__item-imagetagnone'} style={onlineTags.toLocaleLowerCase().includes('essentials') ? {backgroundColor: '#96999b'}: {}}>{onlineTags}</div>\r\n <div className='msc-product__image'>\r\n {this._renderProductPlacementImage(productImageSettings, this.props.context.request.gridSettings, product.PrimaryImageUrl, image1, image2, product.Name)}\r\n </div>\r\n <div className='msc-product__details'>\r\n <h4 className='msc-product__title'>{product.Name}</h4>\r\n {this._renderPrice(this.props.context, this.props.typeName, this.props.id, product.BasePrice, product.Price, this.props.savingsText, this.props.freePriceText, this.props.originalPriceText, this.props.currentPriceText)}\r\n {this._renderSalesLineTag(salesLineTag)}\r\n {this._renderDescription(product.Description)}\r\n {!this.props.context.app.config.hideRating && this._renderRating(this.props.context, this.props.typeName, this.props.id, product.AverageRating, product.TotalRatings, this.props.ratingAriaLabel)}\r\n {stockAvailabilityPropertyText}\r\n <div className=\"msc-product__availabilities\">\r\n {this._renderAvailabilities(stockAvailabilities)}\r\n </div>\r\n </div>\r\n </a>\r\n );\r\n }\r\n\r\n private _renderAvailabilities(stockAvailabilities: any[]) {\r\n return stockAvailabilities && stockAvailabilities.map(sA => <div className=\"msc-product__availabilities_product\">\r\n <span className={sA.value > 0 ? 'in-stock' : 'out-of-stock'}>{sA.name.match(/\\b(\\w)/g).join('')}</span>\r\n </div>\r\n )\r\n }\r\n\r\n private _renderLabel(name?: string, price?: string, rating?: number, ratingAriaLabel?: string): string {\r\n let ratingLabel = '';\r\n\r\n name = name || '';\r\n price = price || '';\r\n\r\n if (rating) {\r\n const roundedRating = rating.toFixed(2);\r\n ratingLabel = format(ratingAriaLabel || '', roundedRating, '5');\r\n }\r\n\r\n return (`${name} ${price} ${ratingLabel}`);\r\n }\r\n\r\n private _renderSalesLineTag(salesLineTag?: string): JSX.Element | null {\r\n if (salesLineTag! && salesLineTag !== '') {\r\n return (\r\n <div className='product-placement__item-saleslinetag'>{salesLineTag}</div>\r\n );\r\n }\r\n return null;\r\n }\r\n\r\n private _renderDescription(description?: string): JSX.Element | null {\r\n return <p className='msc-product__text'>{description}</p>;\r\n }\r\n\r\n private _renderRating(context: ICoreContext, typeName: string, id: string, avgRating?: number, totalRatings?: number, ariaLabel?: string): JSX.Element | null {\r\n if (!avgRating) {\r\n return null;\r\n }\r\n\r\n const numRatings = totalRatings && totalRatings.toString() || undefined;\r\n\r\n return (\r\n <RatingComponent\r\n context={context}\r\n id={id}\r\n typeName={typeName}\r\n avgRating={avgRating}\r\n ratingCount={numRatings}\r\n readOnly={true}\r\n ariaLabel={ariaLabel || ''}\r\n data={{}}\r\n />\r\n );\r\n }\r\n\r\n private _renderPrice(context: ICoreContext, typeName: string, id: string, basePrice?: number, adjustedPrice?: number, savingsText?: string, freePriceText?: string, originalPriceText?: string, currentPriceText?: string): JSX.Element | null {\r\n const price: ProductPrice = {\r\n BasePrice: basePrice,\r\n AdjustedPrice: adjustedPrice,\r\n CustomerContextualPrice: adjustedPrice\r\n };\r\n\r\n return (\r\n <PriceComponent\r\n context={context}\r\n id={id}\r\n typeName={typeName}\r\n data={{ price: price }}\r\n // @ts-ignore\r\n savingsText={savingsText}\r\n freePriceText={freePriceText}\r\n originalPriceText={originalPriceText}\r\n />\r\n );\r\n }\r\n\r\n private _renderProductPlacementImage(imageSettings?: IImageSettings, gridSettings?: IGridSettings, imageUrl?: string, image1?: string, image2?: string, altText?: string): JSX.Element | null {\r\n if (!imageUrl || !gridSettings || !imageSettings) {\r\n return null;\r\n }\r\n return (\r\n <CittaPicture\r\n className='product-placement__item-image'\r\n image1={image1 ? image1 : imageUrl}\r\n image2={image2 ? image2 : ''}\r\n altText={altText}\r\n gridSettings={gridSettings}\r\n imageSettings={imageSettings}\r\n loadFailureBehavior='empty'\r\n />\r\n );\r\n }\r\n\r\n private _getLandscapeImageSettings(cmsImageSettings?: IImageSettings): IImageSettings {\r\n // tslint:disable-next-line: no-unnecessary-local-variable\r\n const landscapeImageSettings: IImageSettings = {\r\n viewports: {\r\n xs: { q: 'w=735&h=481&q=80&m=6&f=jpg', w: 735, h: 481 },\r\n sm: { q: 'w=467&h=303&q=80&m=6&f=jpg', w: 467, h: 303 },\r\n md: { q: 'w=563&h=366&q=80&m=6&f=jpg', w: 563, h: 366 },\r\n lg: { q: 'w=636&h=451&q=80&m=6&f=jpg', w: 636, h: 451 },\r\n xl: { q: 'w=974&h=693&q=80&m=6&f=jpg', w: 974, h: 693 }\r\n },\r\n disableLazyLoad: cmsImageSettings && cmsImageSettings.disableLazyLoad,\r\n lazyload: cmsImageSettings && cmsImageSettings.lazyload\r\n };\r\n\r\n return landscapeImageSettings;\r\n }\r\n}\r\n\r\nexport default ProductComponent;\r\n","import { ICategoryHierarchyViewProps, ISearchResultContainerViewProps, ITitleViewProps, ISearchResultModalViewProps } from '@msdyn365-commerce-modules/search-result-container';\r\nimport { Module, Node } from '@msdyn365-commerce-modules/utilities';\r\nimport { ProductSearchResult } from '@msdyn365-commerce/retail-proxy';\r\nimport * as React from 'react';\r\nimport CittaRefiners from '../../components/citta-search-result/citta-refiners';\r\n// import CittaSortByOptions from '../../components/citta-search-result/citta-sortbyoptions';\r\nimport { ICittaSearchResultContainerProps } from './citta-search-result-container.props.autogenerated';\r\nimport ProductComponent from './components/product-component';\r\n\r\nconst SearchResultContainerView: React.FC<ISearchResultContainerViewProps & ICittaSearchResultContainerProps<{}>> = props => {\r\n const {\r\n SearchResultContainer,\r\n pagination,\r\n ProductsContainer,\r\n modalToggle,\r\n searchResultModal,\r\n TitleViewProps,\r\n categoryHierarchy,\r\n errorMessage,\r\n // @ts-ignore\r\n toggleModal\r\n } = props;\r\n\r\n return (\r\n <Module {...SearchResultContainer}>\r\n {renderCategoryHierarchy(categoryHierarchy)}\r\n <div className=\"filter-button-container\">\r\n {modalToggle}\r\n </div>\r\n {createSearchResultModal(searchResultModal, props, toggleModal)}\r\n {renderTitle(TitleViewProps)}\r\n <Node {...ProductsContainer}>\r\n {errorMessage}\r\n {renderProducts(props)}\r\n </Node>\r\n {pagination}\r\n </Module>\r\n );\r\n};\r\n\r\nfunction renderProducts(props: ISearchResultContainerViewProps & ICittaSearchResultContainerProps<{}>): JSX.Element | null {\r\n const { config, context, resources } = props;\r\n const liClass = 'ms-product-search-result__item';\r\n const isB2B = props.context?.request?.app?.platform?.enableDefaultOrderQuantityLimits === 'b2b';\r\n const products = (isB2B ? props.data.listPageState.result && props.data.listPageState.result.activeProducts && props.data.listPageState.result.activeProducts.filter((item) => item.ItemId !==\"GiftCard\") : props.data.listPageState.result && props.data.listPageState.result.activeProducts) || [];\r\n if (!products || products.length === 0) {\r\n return null;\r\n }\r\n return (\r\n <ul className='list-unstyled'>\r\n {products.map((product: ProductSearchResult, index: number) => (\r\n <li className={`${liClass} ${getImageOrientation(product) === 'Landscape' ? 'product-placement__item-limage' : 'product-placement__item-pimage'}`} key={index} >\r\n <ProductComponent\r\n context={context}\r\n imageSettings={config.imageSettings}\r\n freePriceText={resources.priceFree}\r\n originalPriceText={resources.originalPriceText}\r\n currentPriceText={resources.currentPriceText}\r\n ratingAriaLabel={resources.ratingAriaLabel}\r\n id={props.id}\r\n salesLineTagKey={config.salesLineTagKey}\r\n typeName={props.typeName}\r\n data={{ product: product }}\r\n tagsToIgnore={config.tagsToIgnore}\r\n />\r\n </li>\r\n ))}\r\n </ul>\r\n );\r\n}\r\n\r\nfunction getImageOrientation(product: ProductSearchResult): string {\r\n let imageOrientation: string = '';\r\n if (product.AttributeValues!.length > 0) {\r\n product.AttributeValues!.map(property => {\r\n if (property.Name === 'Image Orientation') {\r\n imageOrientation = property.TextValue!;\r\n }\r\n });\r\n }\r\n return imageOrientation;\r\n}\r\n\r\nconst createSearchResultModal = (modalProps: ISearchResultModalViewProps, props: ISearchResultContainerViewProps & ICittaSearchResultContainerProps<{}>, toggleModal: Function): JSX.Element => {\r\n return React.cloneElement(modalProps.modal, {className: \"category-refiner\"}, null, createModalBody(modalProps, props, toggleModal))\r\n};\r\n\r\nconst createModalBody = (modalProps: ISearchResultModalViewProps, props: ISearchResultContainerViewProps & ICittaSearchResultContainerProps<{}>, toggleModal: Function): JSX.Element | null => {\r\n return React.cloneElement(modalProps.modalBody, {}, null, renderRefineMenu(props, toggleModal));\r\n};\r\n\r\nfunction renderRefineMenu(props: ISearchResultContainerViewProps & ICittaSearchResultContainerProps<{}>, toggleModal: Function): JSX.Element {\r\n return (\r\n <CittaRefiners\r\n props={props}\r\n toggleModal={toggleModal}\r\n />\r\n );\r\n}\r\n\r\n// function renderSort(props: ISearchResultContainerViewProps & ICittaSearchResultContainerProps<{}>): JSX.Element {\r\n// return (\r\n// <CittaSortByOptions\r\n// props={props}\r\n// />\r\n// );\r\n// }\r\n\r\nconst renderCategoryHierarchy = (props: ICategoryHierarchyViewProps): JSX.Element | null => {\r\n const { CategoryHierarchyContainer, categoryHierarchyList, categoryHierarchySeparator } = props;\r\n if (categoryHierarchyList) {\r\n return (\r\n <Node {...CategoryHierarchyContainer}>\r\n {categoryHierarchyList.map((category, index) => (\r\n <React.Fragment key={index}>\r\n {category}\r\n {categoryHierarchyList && categoryHierarchyList[index + 1] && categoryHierarchySeparator}\r\n </React.Fragment>\r\n ))}\r\n </Node>\r\n );\r\n }\r\n\r\n return null;\r\n};\r\n\r\nconst renderTitle = (props: ITitleViewProps): JSX.Element | null => {\r\n const { title, TitleContainer } = props;\r\n if (title) {\r\n return (\r\n <Node {...TitleContainer}>\r\n <label style={{display: 'none'}} className=\"hide emarsys-collection-name\">{title.titleText}</label>\r\n <h2>\r\n {title.titleCount}\r\n </h2>\r\n </Node>\r\n );\r\n }\r\n return null;\r\n};\r\n\r\n// const renderTitleCount = (props: ITitleViewProps): JSX.Element | null => {\r\n// const { title, TitleContainer } = props;\r\n// if (title) {\r\n// return (\r\n// <Node {...TitleContainer}>\r\n// <label className=\"hide emarsys-collection-name\">{title.titleText}</label>\r\n// <h5>\r\n// {title.titleCount}\r\n// </h5>\r\n// </Node>\r\n// );\r\n// }\r\n// return null;\r\n// };\r\n\r\nexport default SearchResultContainerView;","/*!\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 { IAddressAddItem, IAddressAddUpdateProps } from '../../common/components/address-add';\nimport { IAddressShowItem, IAddressShowProps } from '../../common/components/address-show';\nimport { ICheckoutBillingAddressViewProps } from './checkout-billing-address';\n\n/**\n * Address show component.\n * @param param0 - Root param.\n * @param param0.AddressDetail - Address detail.\n * @param param0.items - IAddressShowItem[].\n * @returns - Address Node.\n */\nconst AddressShow: React.FC<IAddressShowProps> = ({ AddressDetail, items }) => {\n return (\n <Node {...AddressDetail}>\n {items.map((item: IAddressShowItem) => {\n return <>{item.description}</>;\n })}\n </Node>\n );\n};\n\n/**\n * Address Add Update Component.\n * @param param0 - Root param.\n * @param param0.AddressForm - Address form.\n * @param param0.heading - Address Heading.\n * @param param0.items - IAddressAddItem[].\n * @param param0.hasError - Boolean.\n * @param param0.error - IAddressError.\n * @param param0.isShowSaveButton - Boolean.\n * @param param0.saveButton - Save button.\n * @param param0.isShowCancelButton - Boolean.\n * @param param0.cancelButton - Cancel button.\n * @returns - AddressForm Node.\n */\nconst AddressAddUpdate: React.FC<IAddressAddUpdateProps> = ({\n AddressForm,\n heading,\n items,\n hasError,\n error,\n isShowSaveButton,\n saveButton,\n isShowCancelButton,\n cancelButton\n}) => {\n return (\n <Node {...AddressForm}>\n {heading}\n {items.map((item: IAddressAddItem) => {\n const { AddressItem, key, label, alert, input } = item;\n return (\n <Node {...AddressItem} key={key}>\n {label}\n {alert}\n {input}\n </Node>\n );\n })}\n {hasError && (\n <Node {...error.AddressError}>\n {error.title}\n {error.message}\n </Node>\n )}\n {isShowSaveButton && saveButton}\n {isShowCancelButton && cancelButton}\n </Node>\n );\n};\n\n/**\n * Checkout Billing Address View Component.\n * @param props - Props.\n * @returns - CheckoutBillingAddress Module.\n */\nconst CheckoutBillingAddressView: React.FC<ICheckoutBillingAddressViewProps> = props => {\n const {\n CheckoutBillingAddress,\n checkoutErrorRef,\n alert,\n viewState,\n heading,\n sameAsShippingCheckbox,\n showAddress,\n showAddOrUpdateAddress\n } = props;\n\n return (\n <Module {...CheckoutBillingAddress} ref={checkoutErrorRef}>\n {heading}\n {alert}\n {viewState.isShowSameAsShippingCheckbox && sameAsShippingCheckbox}\n {viewState.isShowAddress && <AddressShow {...showAddress} />}\n {viewState.isShowAddOrUpdateAddress && <AddressAddUpdate {...showAddOrUpdateAddress} />}\n </Module>\n );\n};\n\nexport default CheckoutBillingAddressView;\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 React from 'react';\n\nimport { IAddressAddItem, IAddressAddUpdateProps } from '../../common/components/address-add';\nimport { IAddressSelectItem, IAddressSelectProps } from '../../common/components/address-select';\nimport { IAddressShowItem, IAddressShowProps } from '../../common/components/address-show';\nimport { ICheckoutShippingAddressViewProps } from './checkout-shipping-address';\nimport { IShipMultipleAddressesViewProps } from '../../common/components/address-ship-multiple';\nimport { IShipMultipleAddressesLineViewProps } from '../../common/components/address-ship-multiple-lines';\n\n/**\n * Address show component.\n * @param param0 - Root param.\n * @param param0.AddressDetail - Address detail.\n * @param param0.items - IAddressShowItem[].\n * @returns - Address Node.\n */\nconst AddressShow: React.FC<IAddressShowProps> = ({ AddressDetail, items }) => {\n return (\n <Node {...AddressDetail}>\n {items.map((item: IAddressShowItem) => {\n return <>{item.description}</>;\n })}\n </Node>\n );\n};\n\n/**\n * Address Select Component.\n * @param param0 - Root param.\n * @param param0.SelectAddress - Select address.\n * @param param0.shipMultipleAddressesButton - Ship to multiple addresses button.\n * @param param0.addButton - Add button.\n * @param param0.items - IAddressSelectItem[].\n * @param param0.isShowSaveButton - Boolean.\n * @param param0.saveButton - Save button.\n * @param param0.isShowCancelButton - Boolean.\n * @param param0.cancelButton - Cancel button.\n * @returns - SelectAddress Node.\n */\nconst AddressSelect: React.FC<IAddressSelectProps> = ({\n SelectAddress,\n shipMultipleAddressesButton,\n addButton,\n items,\n isShowSaveButton,\n saveButton,\n isShowCancelButton,\n cancelButton\n}) => {\n return (\n <Node {...SelectAddress}>\n <Node className='msc-address-select__address-button-container'>\n {addButton}\n {shipMultipleAddressesButton}\n </Node>\n {items.map((item: IAddressSelectItem) => {\n const SelectItem = item.SelectItem;\n return (\n <Node {...SelectItem} key={item.key}>\n {item.input}\n <AddressShow {...item.showItems} />\n </Node>\n );\n })}\n {isShowSaveButton && saveButton}\n {isShowCancelButton && cancelButton}\n </Node>\n );\n};\n\n/**\n * Address Ship Multiple Component.\n * @param param0 - Root param.\n * @param param0.ShipMultipleAddress - Ship multiple address form.\n * @param param0.shipSingleAddressButton - Ship single address button.\n * @param param0.clearSelectionButton - Clear selection button.\n * @param param0.addressDropdown - Address dropdown button.\n * @param param0.ProductsTable - Products table component.\n * @param param0.ProductsTableHeading - Products table heading component.\n * @param param0.ProductsTableRow - Products table row component.\n * @param param0.shipMultipleAddressLines - Ship multiple address lines.\n * @param param0.hasError - Boolean.\n * @param param0.error - Error message.\n * @returns Address ship multiple component node.\n */\nconst AddressShipMultiple: React.FC<IShipMultipleAddressesViewProps> = ({\n ShipMultipleAddress,\n shipSingleAddressButton,\n clearSelectionButton,\n addressDropdown,\n ProductsTable,\n ProductsTableHeading,\n ProductsTableRow,\n shipMultipleAddressLines,\n isShowSaveButton,\n saveButton,\n isShowCancelButton,\n cancelButton,\n isMobile\n}) => {\n if (ShipMultipleAddress && isMobile !== undefined) {\n if (!isMobile) {\n return (\n <Node {...ShipMultipleAddress}>\n <Node className='msc-address-select__ship-single-button-container'>{shipSingleAddressButton}</Node>\n <Node className='msc-address-select__heading-button-container'>\n <Node className='msc-address-select__clear-button-wrapper'>{clearSelectionButton}</Node>\n\n <Node className='msc-address-select__dropdown-button-wrapper'>{addressDropdown}</Node>\n </Node>\n {ProductsTable && shipMultipleAddressLines && shipMultipleAddressLines.length > 0 && (\n <Node {...ProductsTable}>\n {ProductsTableHeading}\n <tbody>\n {shipMultipleAddressLines &&\n shipMultipleAddressLines.map((line: IShipMultipleAddressesLineViewProps) => {\n return _renderShipMultipleAddressLine(line, isMobile, ProductsTableRow);\n })}\n </tbody>\n </Node>\n )}\n {isShowSaveButton && saveButton}\n {isShowCancelButton && cancelButton}\n </Node>\n );\n } else {\n return (\n <Node {...ShipMultipleAddress}>\n <Node className='msc-address-select__ship-single-button-container'>{shipSingleAddressButton}</Node>\n <Node className='msc-address-select__dropdown-button-wrapper'>{addressDropdown}</Node>\n {ProductsTable && shipMultipleAddressLines && shipMultipleAddressLines.length > 0 && (\n <Node {...ProductsTable}>\n {ProductsTableHeading}\n <tbody>\n {shipMultipleAddressLines &&\n shipMultipleAddressLines.map((line: IShipMultipleAddressesLineViewProps) => {\n return _renderShipMultipleAddressLine(line, isMobile, ProductsTableRow);\n })}\n </tbody>\n </Node>\n )}\n {isShowSaveButton && saveButton}\n {isShowCancelButton && cancelButton}\n </Node>\n );\n }\n } else {\n return null;\n }\n};\n\n/**\n * Address Add Update Component.\n * @param param0 - Root param.\n * @param param0.AddressForm - Address form.\n * @param param0.heading - Address heading.\n * @param param0.items - IAddressAddItem[].\n * @param param0.hasError - Boolean.\n * @param param0.error - Error message.\n * @param param0.isShowSaveButton - Boolean.\n * @param param0.saveButton - Save button.\n * @param param0.isShowCancelButton - Boolean.\n * @param param0.cancelButton - Cancel button.\n * @returns Address add update component node.\n */\nconst AddressAddUpdate: React.FC<IAddressAddUpdateProps> = ({\n AddressForm,\n heading,\n items,\n hasError,\n error,\n isShowSaveButton,\n saveButton,\n isShowCancelButton,\n cancelButton\n}) => {\n return (\n <Node {...AddressForm}>\n {heading}\n {items.map((item: IAddressAddItem) => {\n const { AddressItem, key, label, alert, input } = item;\n return (\n <Node {...AddressItem} key={key}>\n {label}\n {alert}\n {input}\n </Node>\n );\n })}\n {hasError && (\n <Node {...error.AddressError}>\n {error.title}\n {error.message}\n </Node>\n )}\n {isShowSaveButton && saveButton}\n {isShowCancelButton && cancelButton}\n </Node>\n );\n};\n\nconst _renderShipMultipleAddressLine = (\n shipMultipleAddressesLine: IShipMultipleAddressesLineViewProps,\n isMobile: boolean,\n ProductsTableRow?: INodeProps\n): JSX.Element | null => {\n if (!shipMultipleAddressesLine) {\n return null;\n }\n\n const {\n selectLine,\n productImage,\n productNumber,\n productInfo,\n productPrice,\n productQuantity,\n productAddress\n } = shipMultipleAddressesLine;\n\n if (!isMobile) {\n return (\n <Node className={`${ProductsTableRow!.className}`} {...ProductsTableRow}>\n <td style={{ width: '10%' }}>{selectLine}</td>\n <td style={{ width: '25%' }}>\n <div style={{ display: 'inline-block' }}>{productImage}</div>\n <div style={{ display: 'inline-block', verticalAlign: 'top', marginTop: '25px' }}>{productNumber}</div>\n </td>\n <td style={{ width: '15%' }}>{productInfo}</td>\n <td style={{ width: '12%', textAlign: 'right' }}>{productPrice}</td>\n <td style={{ width: '15%', textAlign: 'center' }}>{productQuantity}</td>\n <td style={{ width: '100%' }}>{productAddress}</td>\n </Node>\n );\n } else {\n return (\n <Node className={`${ProductsTableRow!.className}`} {...ProductsTableRow}>\n <tr>\n <td style={{ position: 'relative', top: '10px', verticalAlign: 'top' }}>{selectLine}</td>\n <td style={{ position: 'relative', top: '10px' }}>\n {productImage}\n {productInfo}\n {`QTY: ${productQuantity}`}\n </td>\n <td className='msc-address-select__product-price'>{productPrice}</td>\n </tr>\n <tr>\n <td colSpan={3}>{productAddress}</td>\n </tr>\n </Node>\n );\n }\n};\n\n/**\n * Checkout Shipping Address View Component.\n * @param props - Props.\n * @returns - CheckoutShippingAddress Module.\n */\nconst CheckoutShippingAddressView: React.FC<ICheckoutShippingAddressViewProps> = props => {\n const {\n CheckoutShippingAddress,\n checkoutErrorRef,\n alert,\n viewState,\n showAddress,\n showAddressSelect,\n showAddOrUpdateAddress,\n showShipMultipleAddresses,\n cartLineImages\n } = props;\n\n return (\n <Module {...CheckoutShippingAddress} ref={checkoutErrorRef}>\n {alert}\n {!viewState.isShowShipMultipleAddress && cartLineImages}\n {viewState.isShowAddress && <AddressShow {...showAddress} />}\n {viewState.isShowAddresList && <AddressSelect {...showAddressSelect} />}\n {viewState.isShowAddOrUpdateAddress && <AddressAddUpdate {...showAddOrUpdateAddress} />}\n {viewState.isShowShipMultipleAddress && (\n <AddressShipMultiple {...(showShipMultipleAddresses as IShipMultipleAddressesViewProps)} />\n )}\n </Module>\n );\n};\n\nexport default CheckoutShippingAddressView;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport {\n getPayloadObject,\n getTelemetryAttributes,\n INodeProps,\n ITelemetryContent,\n Module,\n Node\n} from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport * as React from 'react';\n\nimport { IWishlistItemViewProps } from '../..';\nimport { IWishlistItemsViewProps } from './wishlist-items';\n\nconst WishlistItemsView: React.FC<IWishlistItemsViewProps> = props => {\n const {\n WishlistItems,\n status,\n statusMessage,\n heading,\n Products,\n products,\n Product,\n ProductDetails,\n ProductDimensions,\n telemetryContent,\n statusNotExistsMessage\n } = props;\n\n return (\n <Module {...WishlistItems}>\n {heading}\n {statusNotExistsMessage}\n {status !== 'SUCCESS' && statusMessage}\n {Products && products && products.length > 0 && (\n <Node {...Products}>\n {products &&\n products.map(product => {\n return product && _renderItem(product, Product, ProductDimensions, ProductDetails, telemetryContent);\n })}\n </Node>\n )}\n </Module>\n );\n};\n\nconst _renderItem = (\n product: IWishlistItemViewProps,\n Product?: INodeProps,\n ProductDimensions?: INodeProps,\n ProductDetails?: INodeProps,\n telemetryContent?: ITelemetryContent\n): JSX.Element | null => {\n const {\n key,\n productImage,\n productLink,\n productPrice,\n productDimensions,\n addToCartButton,\n removeButton,\n productStatusMessage,\n entireProductLink,\n productName,\n productAriaLabel,\n inventoryInformation,\n productUnitOfMeasure\n } = product;\n const payLoad = getPayloadObject('click', telemetryContent!, '', key);\n const productAttributes = getTelemetryAttributes(telemetryContent!, payLoad);\n if (entireProductLink) {\n return (\n <Node key={key} className={Product!.className} {...Product}>\n <Node\n href={entireProductLink}\n className={classnames('entire-product-link ', ProductDetails!.className)}\n {...productAttributes}\n aria-label={productAriaLabel}\n tag={ProductDetails!.tag}\n >\n {productImage}\n {productName}\n {productDimensions && ProductDimensions && (\n <Node {...ProductDimensions}>\n {productDimensions.map(dimension => {\n return dimension;\n })}\n </Node>\n )}\n {productPrice}\n {productUnitOfMeasure}\n </Node>\n {inventoryInformation}\n {addToCartButton}\n {removeButton}\n {productStatusMessage}\n </Node>\n );\n }\n return (\n <Node key={key} className={Product!.className} {...Product}>\n {productImage}\n {productLink}\n {productDimensions && ProductDimensions && (\n <Node {...ProductDimensions}>\n {productDimensions.map(dimension => {\n return dimension;\n })}\n </Node>\n )}\n {productPrice}\n {addToCartButton}\n {removeButton}\n {productStatusMessage}\n </Node>\n );\n};\n\nexport default WishlistItemsView;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IActionContext } from '@msdyn365-commerce/core';\nimport {\n CheckoutModule,\n ErrorCode,\n ErrorLocation,\n ErrorMessageResource,\n getCheckoutState,\n ICheckoutError,\n ICheckoutState\n} from '@msdyn365-commerce/global-state/';\n\n// eslint-disable-next-line @typescript-eslint/no-extraneous-class -- create global class\nexport class CheckoutErrors {\n public static readonly ActionError: ICheckoutError = {\n errorCode: ErrorCode.ActionError,\n errorMessageResource: ErrorMessageResource.checkoutTimeoutErrorMessage,\n errorLocation: ErrorLocation.Checkout\n };\n\n public static readonly Microsoft_Dynamics_Commerce_Runtime_BlockedLoyaltyCard: ICheckoutError = {\n errorCode: ErrorCode.Microsoft_Dynamics_Commerce_Runtime_BlockedLoyaltyCard,\n errorMessageResource: ErrorMessageResource.blockedLoyaltyCardErrorMessage,\n errorLocation: ErrorLocation.CheckoutLoyalty\n };\n\n public static readonly Microsoft_Dynamics_Commerce_Runtime_CustomerAccountLimitSignDifferentFromAmountDue: ICheckoutError = {\n errorCode: ErrorCode.Microsoft_Dynamics_Commerce_Runtime_CustomerAccountLimitSignDifferentFromAmountDue,\n errorMessageResource: ErrorMessageResource.customerAccountLimitSignDifferentFromAmountDueErrorMessage,\n errorLocation: ErrorLocation.CheckoutCustomerAccountPayment\n };\n\n public static readonly Microsoft_Dynamics_Commerce_Runtime_CustomerAccountPaymentExceedsAvailableCreditLimit: ICheckoutError = {\n errorCode: ErrorCode.Microsoft_Dynamics_Commerce_Runtime_CustomerAccountPaymentExceedsAvailableCreditLimit,\n errorMessageResource: ErrorMessageResource.customerAccountPaymentExceedsAvailableCreditLimitErrorMessage,\n errorLocation: ErrorLocation.Checkout\n };\n\n public static readonly Microsoft_Dynamics_Commerce_Runtime_CustomerAccountPaymentExceedsCustomerAccountFloorLimit: ICheckoutError = {\n errorCode: ErrorCode.Microsoft_Dynamics_Commerce_Runtime_CustomerAccountPaymentExceedsCustomerAccountFloorLimit,\n errorMessageResource: ErrorMessageResource.customerAccountPaymentExceedsCustomerAccountFloorLimitErrorMessage,\n errorLocation: ErrorLocation.CheckoutCustomerAccountPayment\n };\n\n public static readonly Microsoft_Dynamics_Commerce_Runtime_CustomerAccountPaymentExceedsTotalAmountForCarryOutAndReturnItems: ICheckoutError = {\n errorCode: ErrorCode.Microsoft_Dynamics_Commerce_Runtime_CustomerAccountPaymentExceedsTotalAmountForCarryOutAndReturnItems,\n errorMessageResource: ErrorMessageResource.customerAccountPaymentExceedsTotalAmountForCarryOutAndReturnItemsErrorMessage,\n errorLocation: ErrorLocation.CheckoutCustomerAccountPayment\n };\n\n public static readonly Microsoft_Dynamics_Commerce_Runtime_CustomerAccountPaymentForCustomerWithoutAllowOnAccount: ICheckoutError = {\n errorCode: ErrorCode.Microsoft_Dynamics_Commerce_Runtime_CustomerAccountPaymentForCustomerWithoutAllowOnAccount,\n errorMessageResource: ErrorMessageResource.customerAccountPaymentForCustomerWithoutAllowOnAccountErrorMessage,\n errorLocation: ErrorLocation.CheckoutCustomerAccountPayment\n };\n\n public static readonly Microsoft_Dynamics_Commerce_Runtime_CustomerAccountPaymentNotAllowedForOpenInvoices: ICheckoutError = {\n errorCode: ErrorCode.Microsoft_Dynamics_Commerce_Runtime_CustomerAccountPaymentNotAllowedForOpenInvoices,\n errorMessageResource: ErrorMessageResource.customerAccountPaymentNotAllowedForOpenInvoicesErrorMessage,\n errorLocation: ErrorLocation.CheckoutCustomerAccountPayment\n };\n\n public static readonly Microsoft_Dynamics_Commerce_Runtime_FraudRisk: ICheckoutError = {\n errorCode: ErrorCode.Microsoft_Dynamics_Commerce_Runtime_FraudRisk,\n errorMessageResource: ErrorMessageResource.fraudRiskErrorMessage,\n errorLocation: ErrorLocation.CheckoutPaymentInstrument\n };\n\n public static readonly Microsoft_Dynamics_Commerce_Runtime_GiftCardBalanceInquiryFailed: ICheckoutError = {\n errorCode: ErrorCode.Microsoft_Dynamics_Commerce_Runtime_GiftCardBalanceInquiryFailed,\n errorMessageResource: ErrorMessageResource.giftCardBalanceInquiryFailedErrorMessage,\n errorLocation: ErrorLocation.CheckoutGiftCard\n };\n\n public static readonly Microsoft_Dynamics_Commerce_Runtime_GiftCardCurrencyMismatch: ICheckoutError = {\n errorCode: ErrorCode.Microsoft_Dynamics_Commerce_Runtime_GiftCardCurrencyMismatch,\n errorMessageResource: ErrorMessageResource.giftCardCurrencyMismatchErrorMessage,\n errorLocation: ErrorLocation.CheckoutGiftCard\n };\n\n public static readonly Microsoft_Dynamics_Commerce_Runtime_InvalidCartVersion: ICheckoutError = {\n errorCode: ErrorCode.Microsoft_Dynamics_Commerce_Runtime_InvalidCartVersion,\n errorMessageResource: ErrorMessageResource.invalidCartVersionErrorMessage,\n errorLocation: ErrorLocation.Checkout\n };\n\n public static readonly Microsoft_Dynamics_Commerce_Runtime_InvalidLoyaltyCardNumber: ICheckoutError = {\n errorCode: ErrorCode.Microsoft_Dynamics_Commerce_Runtime_InvalidLoyaltyCardNumber,\n errorMessageResource: ErrorMessageResource.invalidLoyaltyCardNumberErrorMessage,\n errorLocation: ErrorLocation.CheckoutLoyalty\n };\n\n public static readonly Microsoft_Dynamics_Commerce_Runtime_InvalidPaymentRequest: ICheckoutError = {\n errorCode: ErrorCode.Microsoft_Dynamics_Commerce_Runtime_InvalidPaymentRequest,\n errorMessageResource: ErrorMessageResource.invalidPaymentRequestErrorMessage,\n errorLocation: ErrorLocation.CheckoutPaymentInstrument\n };\n\n public static readonly Microsoft_Dynamics_Commerce_Runtime_InvalidPaymentRequest_Console: ICheckoutError = {\n errorCode: ErrorCode.Microsoft_Dynamics_Commerce_Runtime_InvalidPaymentRequest,\n errorMessageResource: ErrorMessageResource.invalidPaymentRequestConsoleErrorMessage,\n errorLocation: ErrorLocation.Console\n };\n\n public static readonly Microsoft_Dynamics_Commerce_Runtime_MissingRequiredCartTenderLines: ICheckoutError = {\n errorCode: ErrorCode.Microsoft_Dynamics_Commerce_Runtime_MissingRequiredCartTenderLines,\n errorMessageResource: ErrorMessageResource.missingRequiredCartTenderLinesErrorMessage,\n errorLocation: ErrorLocation.CheckoutPaymentInstrument\n };\n\n public static readonly Microsoft_Dynamics_Commerce_Runtime_MultipleCustomerAccountPaymentsNotAllowed: ICheckoutError = {\n errorCode: ErrorCode.Microsoft_Dynamics_Commerce_Runtime_MultipleCustomerAccountPaymentsNotAllowed,\n errorMessageResource: ErrorMessageResource.multipleCustomerAccountPaymentsNotAllowedErrorMessage,\n errorLocation: ErrorLocation.CheckoutCustomerAccountPayment\n };\n\n public static readonly Microsoft_Dynamics_Commerce_Runtime_NoMoreThanOneLoyaltyTender: ICheckoutError = {\n errorCode: ErrorCode.Microsoft_Dynamics_Commerce_Runtime_NoMoreThanOneLoyaltyTender,\n errorMessageResource: ErrorMessageResource.noMoreThanOneLoyaltyTenderErrorMessage,\n errorLocation: ErrorLocation.CheckoutLoyalty\n };\n\n public static readonly Microsoft_Dynamics_Commerce_Runtime_NoResponseFromGatewayForGiftCardBalanceInquiry: ICheckoutError = {\n errorCode: ErrorCode.Microsoft_Dynamics_Commerce_Runtime_NoResponseFromGatewayForGiftCardBalanceInquiry,\n errorMessageResource: ErrorMessageResource.noResponseFromGatewayForGiftCardBalanceInquiryErrorMessage,\n errorLocation: ErrorLocation.CheckoutGiftCard\n };\n\n public static readonly Microsoft_Dynamics_Commerce_Runtime_NoTenderLoyaltyCard: ICheckoutError = {\n errorCode: ErrorCode.Microsoft_Dynamics_Commerce_Runtime_NoTenderLoyaltyCard,\n errorMessageResource: ErrorMessageResource.noTenderLoyaltyCardErrorMessage,\n errorLocation: ErrorLocation.CheckoutLoyalty\n };\n\n public static readonly Microsoft_Dynamics_Commerce_Runtime_NotEnoughRewardPoints: ICheckoutError = {\n errorCode: ErrorCode.Microsoft_Dynamics_Commerce_Runtime_NotEnoughRewardPoints,\n errorMessageResource: ErrorMessageResource.notEnoughRewardPointsErrorMessage,\n errorLocation: ErrorLocation.CheckoutLoyalty\n };\n\n public static readonly Microsoft_Dynamics_Commerce_Runtime_PaymentAlreadyVoided: ICheckoutError = {\n errorCode: ErrorCode.Microsoft_Dynamics_Commerce_Runtime_PaymentAlreadyVoided,\n errorMessageResource: ErrorMessageResource.paymentAlreadyVoidedErrorMessage,\n errorLocation: ErrorLocation.CheckoutPaymentInstrument\n };\n\n public static readonly Microsoft_Dynamics_Commerce_Runtime_PaymentAmountExceedsGiftBalance: ICheckoutError = {\n errorCode: ErrorCode.Microsoft_Dynamics_Commerce_Runtime_PaymentAmountExceedsGiftBalance,\n errorMessageResource: ErrorMessageResource.paymentAmountExceedsGiftBalanceErrorMessage,\n errorLocation: ErrorLocation.CheckoutGiftCard\n };\n\n public static readonly Microsoft_Dynamics_Commerce_Runtime_PaymentRequiresMerchantProperties: ICheckoutError = {\n errorCode: ErrorCode.Microsoft_Dynamics_Commerce_Runtime_PaymentRequiresMerchantProperties,\n errorMessageResource: ErrorMessageResource.paymentRequiresMerchantPropertiesErrorMessage,\n errorLocation: ErrorLocation.CheckoutPaymentInstrument\n };\n\n public static readonly Microsoft_Dynamics_Commerce_Runtime_PaymentRequiresMerchantProperties_Console: ICheckoutError = {\n errorCode: ErrorCode.Microsoft_Dynamics_Commerce_Runtime_PaymentRequiresMerchantProperties,\n errorMessageResource: ErrorMessageResource.paymentRequiresMerchantPropertiesConsoleErrorMessage,\n errorLocation: ErrorLocation.Console\n };\n\n public static readonly Microsoft_Dynamics_Commerce_Runtime_PaymentUsingUnauthorizedAccount: ICheckoutError = {\n errorCode: ErrorCode.Microsoft_Dynamics_Commerce_Runtime_PaymentUsingUnauthorizedAccount,\n errorMessageResource: ErrorMessageResource.paymentUsingUnauthorizedAccountErrorMessage,\n errorLocation: ErrorLocation.CheckoutCustomerAccountPayment\n };\n\n public static readonly Microsoft_Dynamics_Commerce_Runtime_RefundAmountMoreThanAllowed: ICheckoutError = {\n errorCode: ErrorCode.Microsoft_Dynamics_Commerce_Runtime_RefundAmountMoreThanAllowed,\n errorMessageResource: ErrorMessageResource.refundAmountMoreThanAllowedErrorMessage,\n errorLocation: ErrorLocation.CheckoutLoyalty\n };\n\n public static readonly Microsoft_Dynamics_Commerce_Runtime_UnableToAuthorizePayment: ICheckoutError = {\n errorCode: ErrorCode.Microsoft_Dynamics_Commerce_Runtime_UnableToAuthorizePayment,\n errorMessageResource: ErrorMessageResource.unableToAuthorizePaymentErrorMessage,\n errorLocation: ErrorLocation.CheckoutPaymentInstrument\n };\n\n public static readonly Microsoft_Dynamics_Commerce_Runtime_UnableToAuthorizePaymentCardAdditionalContextRequired: ICheckoutError = {\n errorCode: ErrorCode.Microsoft_Dynamics_Commerce_Runtime_UnableToAuthorizePaymentCardAdditionalContextRequired,\n errorMessageResource: ErrorMessageResource.unableToAuthorizePaymentCardAdditionalContextRequiredErrorMessage,\n errorLocation: ErrorLocation.CheckoutPaymentInstrument\n };\n\n public static readonly Microsoft_Dynamics_Commerce_Runtime_UnableToAuthorizePaymentCardTypeMissingOrNotSupported: ICheckoutError = {\n errorCode: ErrorCode.Microsoft_Dynamics_Commerce_Runtime_UnableToAuthorizePaymentCardTypeMissingOrNotSupported,\n errorMessageResource: ErrorMessageResource.unableToAuthorizePaymentCardTypeMissingOrNotSupportedErrorMessage,\n errorLocation: ErrorLocation.CheckoutPaymentInstrument\n };\n\n public static readonly Microsoft_Dynamics_Commerce_Runtime_UnableToCancelPayment: ICheckoutError = {\n errorCode: ErrorCode.Microsoft_Dynamics_Commerce_Runtime_UnableToCancelPayment,\n errorMessageResource: ErrorMessageResource.unableToCancelPaymentErrorMessage,\n errorLocation: ErrorLocation.CheckoutPaymentInstrument\n };\n\n public static readonly Microsoft_Dynamics_Commerce_Runtime_UnableToReadCardTokenInfo: ICheckoutError = {\n errorCode: ErrorCode.Microsoft_Dynamics_Commerce_Runtime_UnableToReadCardTokenInfo,\n errorMessageResource: ErrorMessageResource.unableToReadCardTokenInfoErrorMessage,\n errorLocation: ErrorLocation.CheckoutPaymentInstrument\n };\n\n public static readonly Microsoft_Dynamics_Commerce_Runtime_UnableToRetrieveCardPaymentAcceptResult: ICheckoutError = {\n errorCode: ErrorCode.Microsoft_Dynamics_Commerce_Runtime_UnableToRetrieveCardPaymentAcceptResult,\n errorMessageResource: ErrorMessageResource.unableToRetrieveCardPaymentAcceptResultErrorMessage,\n errorLocation: ErrorLocation.CheckoutPaymentInstrument\n };\n\n public static readonly checkoutErrorsList: ICheckoutError[] = [\n CheckoutErrors.ActionError,\n CheckoutErrors.Microsoft_Dynamics_Commerce_Runtime_BlockedLoyaltyCard,\n CheckoutErrors.Microsoft_Dynamics_Commerce_Runtime_CustomerAccountLimitSignDifferentFromAmountDue,\n CheckoutErrors.Microsoft_Dynamics_Commerce_Runtime_CustomerAccountPaymentExceedsAvailableCreditLimit,\n CheckoutErrors.Microsoft_Dynamics_Commerce_Runtime_CustomerAccountPaymentExceedsCustomerAccountFloorLimit,\n CheckoutErrors.Microsoft_Dynamics_Commerce_Runtime_CustomerAccountPaymentExceedsTotalAmountForCarryOutAndReturnItems,\n CheckoutErrors.Microsoft_Dynamics_Commerce_Runtime_CustomerAccountPaymentForCustomerWithoutAllowOnAccount,\n CheckoutErrors.Microsoft_Dynamics_Commerce_Runtime_CustomerAccountPaymentNotAllowedForOpenInvoices,\n CheckoutErrors.Microsoft_Dynamics_Commerce_Runtime_FraudRisk,\n CheckoutErrors.Microsoft_Dynamics_Commerce_Runtime_GiftCardBalanceInquiryFailed,\n CheckoutErrors.Microsoft_Dynamics_Commerce_Runtime_GiftCardCurrencyMismatch,\n CheckoutErrors.Microsoft_Dynamics_Commerce_Runtime_InvalidCartVersion,\n CheckoutErrors.Microsoft_Dynamics_Commerce_Runtime_InvalidLoyaltyCardNumber,\n CheckoutErrors.Microsoft_Dynamics_Commerce_Runtime_InvalidPaymentRequest,\n CheckoutErrors.Microsoft_Dynamics_Commerce_Runtime_InvalidPaymentRequest_Console,\n CheckoutErrors.Microsoft_Dynamics_Commerce_Runtime_MissingRequiredCartTenderLines,\n CheckoutErrors.Microsoft_Dynamics_Commerce_Runtime_MultipleCustomerAccountPaymentsNotAllowed,\n CheckoutErrors.Microsoft_Dynamics_Commerce_Runtime_NoMoreThanOneLoyaltyTender,\n CheckoutErrors.Microsoft_Dynamics_Commerce_Runtime_NoResponseFromGatewayForGiftCardBalanceInquiry,\n CheckoutErrors.Microsoft_Dynamics_Commerce_Runtime_NoTenderLoyaltyCard,\n CheckoutErrors.Microsoft_Dynamics_Commerce_Runtime_NotEnoughRewardPoints,\n CheckoutErrors.Microsoft_Dynamics_Commerce_Runtime_PaymentAlreadyVoided,\n CheckoutErrors.Microsoft_Dynamics_Commerce_Runtime_PaymentAmountExceedsGiftBalance,\n CheckoutErrors.Microsoft_Dynamics_Commerce_Runtime_PaymentRequiresMerchantProperties,\n CheckoutErrors.Microsoft_Dynamics_Commerce_Runtime_PaymentRequiresMerchantProperties_Console,\n CheckoutErrors.Microsoft_Dynamics_Commerce_Runtime_PaymentUsingUnauthorizedAccount,\n CheckoutErrors.Microsoft_Dynamics_Commerce_Runtime_RefundAmountMoreThanAllowed,\n CheckoutErrors.Microsoft_Dynamics_Commerce_Runtime_UnableToAuthorizePayment,\n CheckoutErrors.Microsoft_Dynamics_Commerce_Runtime_UnableToAuthorizePaymentCardAdditionalContextRequired,\n CheckoutErrors.Microsoft_Dynamics_Commerce_Runtime_UnableToAuthorizePaymentCardTypeMissingOrNotSupported,\n CheckoutErrors.Microsoft_Dynamics_Commerce_Runtime_UnableToCancelPayment,\n CheckoutErrors.Microsoft_Dynamics_Commerce_Runtime_UnableToReadCardTokenInfo,\n CheckoutErrors.Microsoft_Dynamics_Commerce_Runtime_UnableToRetrieveCardPaymentAcceptResult\n ];\n}\n\nexport async function setCheckoutErrors(\n errorCode: string,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n resources: any,\n isExpressCheckoutApplied: boolean,\n ctx: IActionContext,\n apiError?: string | undefined\n): Promise<void> {\n let clientCheckoutError: ICheckoutError | undefined;\n const consoleCheckoutErrors: ICheckoutError[] = [];\n\n const checkoutState: ICheckoutState = await getCheckoutState(ctx).catch((error: Error) => {\n ctx.telemetry.exception(error);\n throw error;\n });\n\n // find the checkout errors\n for (const checkoutError of CheckoutErrors.checkoutErrorsList) {\n if (errorCode === checkoutError.errorCode) {\n if (checkoutError.errorLocation === ErrorLocation.Console) {\n const consoleCheckoutError: ICheckoutError = {\n errorCode: checkoutError.errorCode,\n errorMessageResource: checkoutError.errorMessageResource,\n errorLocation: checkoutError.errorLocation\n };\n consoleCheckoutErrors.push(consoleCheckoutError);\n } else {\n if (clientCheckoutError) {\n ctx.telemetry.exception(new Error('Invalid number of client checkout errors.'));\n throw new Error('Invalid number of client checkout errors.');\n } else {\n clientCheckoutError = {\n errorCode: checkoutError.errorCode,\n errorMessageResource: checkoutError.errorMessageResource,\n errorLocation: checkoutError.errorLocation\n };\n }\n }\n }\n }\n\n // log the console checkout errors\n for (const consoleCheckoutError of consoleCheckoutErrors) {\n consoleCheckoutError.errorMessage = getCheckoutErrorMessage(resources, consoleCheckoutError.errorMessageResource!, apiError!);\n console.log(consoleCheckoutError.errorMessage);\n }\n\n // handle the client checkout error\n if (clientCheckoutError) {\n clientCheckoutError.errorMessage = getCheckoutErrorMessage(resources, clientCheckoutError.errorMessageResource!, apiError!);\n\n if (isExpressCheckoutApplied && clientCheckoutError.errorLocation === ErrorLocation.CheckoutPaymentInstrument) {\n clientCheckoutError.errorLocation = ErrorLocation.Checkout;\n }\n\n await checkoutState.updateCheckoutError({ newCheckoutError: clientCheckoutError });\n await checkoutState.updateShouldFocusOnCheckoutError({ newShouldFocusOnCheckoutError: true });\n } else {\n // if could not map to any checkout error(s), show the API error message over generic error\n if (consoleCheckoutErrors.length === 0) {\n const genericError = {\n errorLocation: ErrorLocation.Checkout\n };\n if (apiError) {\n genericError['errorMessage'] = apiError;\n } else {\n genericError['errorMessage'] = resources.genericErrorMessage;\n }\n\n await checkoutState.updateCheckoutError({ newCheckoutError: genericError });\n await checkoutState.updateShouldFocusOnCheckoutError({ newShouldFocusOnCheckoutError: true });\n }\n }\n}\n\nexport async function focusOnCheckoutError(checkoutErrorRef: React.RefObject<HTMLElement>, ctx: IActionContext): Promise<void> {\n const checkoutState: ICheckoutState = await getCheckoutState(ctx).catch((error: Error) => {\n ctx.telemetry.exception(error);\n throw error;\n });\n\n checkoutErrorRef.current && checkoutErrorRef.current.scrollIntoView();\n\n await checkoutState.updateCheckoutErrorFocus({ newCheckoutErrorFocus: CheckoutModule.None });\n await checkoutState.updateShouldFocusOnCheckoutError({ newShouldFocusOnCheckoutError: false });\n}\n\nexport async function setCheckoutErrorFocus(checkoutModuleId: string, ctx: IActionContext): Promise<void> {\n const checkoutState: ICheckoutState = await getCheckoutState(ctx).catch((error: Error) => {\n ctx.telemetry.exception(error);\n throw error;\n });\n\n for (const checkoutModule of Object.keys(CheckoutModule)) {\n if (checkoutModuleId.includes(CheckoutModule[checkoutModule])) {\n await checkoutState.updateCheckoutErrorFocus({ newCheckoutErrorFocus: CheckoutModule[checkoutModule] });\n return;\n }\n }\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction getCheckoutErrorMessage(resources: any, errorMessageResource: ErrorMessageResource, errorMessageFromAPI: string): string {\n const errorResource = Object.keys(resources).find(resource => resource === errorMessageResource);\n // return API error when error resource string is not found in checkout definition file\n return errorResource !== undefined ? resources[errorResource] : errorMessageFromAPI;\n}\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nexport enum AddressItemDisplayType {\n Input = 'Input',\n Dropdown = 'Dropdown',\n Checkbox = 'Checkbox'\n}\n\nexport enum AddressValidationRuleType {\n Required = 'Required',\n Format = 'Format',\n MaxLength = 'MaxLength'\n}\n\nexport enum AddressItemType {\n Name = 1001,\n Phone = 1002,\n IsPrimary = 1003,\n AddressTypeValue = 1004,\n ZipCode = 1,\n City = 2,\n County = 3,\n State = 4,\n ThreeLetterISORegionName = 5,\n Street = 6,\n DistrictName = 7,\n StreetNumber = 8,\n BuildingCompliment = 9,\n Postbox = 10,\n House_RU = 21,\n Flat_RU = 22,\n CountryOKSMCode_RU = 23\n}\n\nexport interface IAddressItem {\n name: string;\n type: AddressItemType;\n label: string;\n maxLength: number;\n displayType: AddressItemDisplayType;\n validationRules?: IAddressValidationRule[];\n isNewLine: boolean;\n}\n\nexport interface IAddressValidationRule {\n type: AddressValidationRuleType;\n regEx: string;\n message: string;\n}\n\nexport interface IAddressDropdownsData {\n [index: string]: { key?: string | number; value?: string }[];\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport * as React from 'react';\n\n/**\n * The payment error.\n */\nexport interface IPaymentError {\n title: string;\n message: string;\n className?: string;\n}\n\n/**\n * The payment error.\n * @param param0 - First param.\n * @param param0.title - Title.\n * @param param0.message - Message.\n * @param param0.className - ClassName.\n * @returns React node.\n */\nexport const ErrorComponent: React.FC<IPaymentError> = ({ title, message, className = 'ms-checkout-payment-instrument' }) => (\n <div className={`${className}__error`} role='alert' aria-live='assertive'>\n <p className={`${className}__error-title`}>{title}</p>\n <p className={`${className}__error-message`}>{message}</p>\n </div>\n);\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 } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nexport interface IAddressButton {\n className: string;\n text: string;\n ariaLabel: string;\n disabled?: boolean;\n telemetryContent?: ITelemetryContent;\n role?: string;\n onClick(event: React.MouseEvent<HTMLElement>): void;\n}\n\n/**\n * Address button.\n * @param props - Configuration of the functional component.\n * @returns React functional component.\n */\nexport const AddressButtonFunctionComponent: React.FC<IAddressButton> = (props: IAddressButton) => {\n const { className, text, ariaLabel, disabled: isDisabled, telemetryContent, onClick, role } = props;\n const payLoad = getPayloadObject('click', telemetryContent!, text);\n const attributes = getTelemetryAttributes(telemetryContent!, payLoad);\n return (\n <button className={className} aria-label={ariaLabel} disabled={isDisabled} role={role} onClick={onClick} {...attributes}>\n {text}\n </button>\n );\n};\n\nexport default AddressButtonFunctionComponent;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport * as React from 'react';\n\nexport interface IAdressErrorMessage {\n message: string;\n}\n\n/**\n * Address error message.\n * @param props - Configuration of the functional component.\n * @returns React functional component.\n */\nexport const AddressErrorMessageFunctionComponent: React.FC<IAdressErrorMessage> = (props: IAdressErrorMessage) => {\n const { message } = props;\n\n return <p className='msc-address-form__error-message'>{message}</p>;\n};\n\nexport default AddressErrorMessageFunctionComponent;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport * as React from 'react';\n\nexport interface IAdressErrorTitle {\n title: string;\n}\n\n/**\n * Address error title.\n * @param props - Configuration of the functional component.\n * @returns React functional component.\n */\nexport const AddressErrorTitleFunctionComponent: React.FC<IAdressErrorTitle> = (props: IAdressErrorTitle) => {\n const { title } = props;\n\n return <p className='msc-address-form__error-title'>{title}</p>;\n};\n\nexport default AddressErrorTitleFunctionComponent;\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 } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nexport interface IAdressInput {\n id?: string;\n name?: string;\n className: string;\n type: string;\n value: string;\n maxLength?: number;\n autoFocus?: boolean;\n additionalAddributes?: object;\n telemetryContent?: ITelemetryContent;\n onChange(event: React.ChangeEvent<HTMLInputElement>): void;\n}\n\n/**\n * Address input.\n * @param props - Configuration of the functional component.\n * @returns React functional component.\n */\nexport const AddressInputFunctionComponent: React.FC<IAdressInput> = (props: IAdressInput) => {\n const {\n id: itemId,\n name,\n className,\n type,\n value,\n maxLength,\n additionalAddributes,\n autoFocus: shouldUseAutoFocus,\n telemetryContent,\n onChange\n } = props;\n\n const payLoad = getPayloadObject('click', telemetryContent!, name!);\n const attributes = getTelemetryAttributes(telemetryContent!, payLoad);\n return (\n <input\n name={name}\n id={itemId}\n className={`${className}__input ${className}__input-${type}`}\n type={type}\n autoFocus={shouldUseAutoFocus}\n value={value}\n maxLength={maxLength}\n {...(additionalAddributes || {})}\n {...attributes}\n onChange={onChange}\n />\n );\n};\n\nexport default AddressInputFunctionComponent;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IActionInput, ICoreContext, IObservableAction, ITelemetry } from '@msdyn365-commerce/core';\nimport {\n Address,\n AddressPurpose,\n CountryRegionInfo,\n StateProvinceInfo\n} from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\nimport {\n addAddress,\n AddressManagementInput,\n ArrayExtensions,\n updateAddress,\n updatePrimaryAddress\n} from '@msdyn365-commerce-modules/retail-actions';\n\nimport { getAddressPurposesAction, GetAddressPurposesInput } from '../actions/get-address-purposes';\nimport { getStateProvinceAction, GetStateProvincesInput } from '../actions/get-state-provinces';\nimport { IAddressResource, IAddressResponse } from './address-module.data';\n\n/**\n *\n * Address common.\n */\nexport class AddressCommon {\n private readonly context: ICoreContext;\n\n private readonly resources: IAddressResource;\n\n private readonly telemetry: ITelemetry;\n\n constructor(context: ICoreContext, resources: IAddressResource, telemetry: ITelemetry) {\n this.context = context;\n this.resources = resources;\n this.telemetry = telemetry;\n }\n\n public getDefaultCountryRegionId = (countryRegionId: string, countryRegions: CountryRegionInfo[], market?: string): string => {\n const marketISOCode = market || 'US';\n const currentCountryRegion = countryRegions.find(countryRegion => (countryRegion.ISOCode || '') === marketISOCode);\n return (currentCountryRegion && currentCountryRegion.CountryRegionId) || countryRegionId;\n };\n\n public parseRetailException = (resources: IAddressResource): IAddressResponse => {\n return {\n errorTitle: resources.addressErrorMessageTitle,\n errorMessage: resources.addressGenericErrorMessage\n };\n };\n\n public isAuthenticatedFlow = (): boolean => {\n return this.context.request.user.isAuthenticated;\n };\n\n public getStateProvinces = async (countryRegionId: string): Promise<StateProvinceInfo[]> => {\n let response: StateProvinceInfo[] = [];\n if (this.context && this.context.actionContext) {\n try {\n const input = new GetStateProvincesInput(countryRegionId, this.context.request.apiSettings);\n response = await getStateProvinceAction(input, this.context.actionContext);\n } catch (error) {\n if (this.telemetry) {\n this.telemetry.error(`Error encountered ${error}`);\n this.telemetry.debug('Unable to get state provinces');\n }\n }\n }\n return Promise.resolve(response);\n };\n\n // For any address, check for common requried field else treat it as invalid\\empty address.\n public isEmpty = (address: Address): boolean => {\n if (address && address.ThreeLetterISORegionName && (address.State || address.City)) {\n return false;\n }\n\n return true;\n };\n\n public addCustomerAddress = async (address: Address): Promise<IAddressResponse> => {\n await this.updateLogisticsLocationRoleRecordId(address);\n return this.submitCustomerAddress(addAddress, address);\n };\n\n public updateCustomerAddress = async (address: Address): Promise<IAddressResponse> => {\n await this.updateLogisticsLocationRoleRecordId(address);\n return this.submitCustomerAddress(updateAddress, address);\n };\n\n public updateCustomerPrimaryAddress = async (address: Address): Promise<IAddressResponse> => {\n return this.submitCustomerAddress(updatePrimaryAddress, address);\n };\n\n private readonly submitCustomerAddress = async (\n addressAction: IObservableAction<Address[]>,\n address: Address\n ): Promise<IAddressResponse> => {\n address.AddressTypeValue = address.AddressTypeValue || 7; // 7 sets it to HOME by default\n\n const input = new AddressManagementInput(address);\n return this.execAddressAction(addressAction, input, address);\n };\n\n private readonly execAddressAction = async (\n addressAction: IObservableAction<Address[]>,\n input: IActionInput | IActionInput[],\n address: Address\n ): Promise<IAddressResponse> => {\n let response: IAddressResponse = {};\n\n if (this.context && this.context.actionContext) {\n try {\n const addresses = await addressAction(input, this.context.actionContext);\n if (addresses.length > 0) {\n response.address = address.RecordId ? address : addresses[addresses.length - 1];\n } else {\n response.address = address;\n }\n response.customerAddresses = addresses;\n } catch (error) {\n if (this.telemetry) {\n this.telemetry.error(`Error encountered ${error}`);\n this.telemetry.debug('Unable to exec address action');\n }\n response = this.parseRetailException(this.resources);\n }\n }\n return Promise.resolve(response);\n };\n\n /**\n * Function to get the address purposes and update the LogisticsLocationRoleRecordId to update the address type.\n * @param address - Address object.\n * @returns Returns void.\n */\n private readonly updateLogisticsLocationRoleRecordId = async (address: Address): Promise<void> => {\n let addressPurposes: AddressPurpose[] = [];\n try {\n const input: GetAddressPurposesInput = new GetAddressPurposesInput(this.context.request.apiSettings);\n addressPurposes = await getAddressPurposesAction(input, this.context.actionContext);\n } catch (error) {\n // eslint-disable-next-line @typescript-eslint/restrict-template-expressions -- Supparsing the any type for error.\n this.telemetry.error(`Error encountered ${error}`);\n this.telemetry.debug('Unable to get address purposes');\n }\n if (ArrayExtensions.hasElements(addressPurposes)) {\n const addressPurpose: AddressPurpose | undefined = addressPurposes.find(\n purpose => purpose.AddressType === address.AddressTypeValue\n );\n if (addressPurpose) {\n address.LogisticsLocationRoleRecordId = addressPurpose.RecordId;\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 {\n Address,\n AddressPurpose,\n CountryRegionInfo,\n StateProvinceInfo\n} from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\nimport { get, set } from 'mobx';\n\nimport { AddressItemType, IAddressDropdownsData, IAddressItem, IAddressValidationRule } from './address-format.data';\nimport { AddressMetaData } from './address-meta-data';\n\n/**\n *\n * Retail Service Address format parser.\n */\nexport class AddressFormat {\n private readonly countryRegionsInfo?: CountryRegionInfo[];\n\n private readonly addressPurposes?: AddressPurpose[];\n\n private readonly addressMetaData: AddressMetaData;\n\n constructor(countryRegionsInfo: CountryRegionInfo[], addressMetaData: AddressMetaData, addressPurposes: AddressPurpose[]) {\n this.countryRegionsInfo = countryRegionsInfo;\n this.addressMetaData = addressMetaData;\n this.addressPurposes = addressPurposes;\n }\n\n public getAddressFormat(countryRegionId: string): IAddressItem[] {\n const countryRegionInfo = this._getCountryRegionInfo(countryRegionId);\n if (countryRegionInfo) {\n return this._getAddressDisplayFormat(countryRegionInfo);\n }\n return [];\n }\n\n public getCountryFormat(): { key?: string; value?: string }[] {\n return (this.countryRegionsInfo || []).map(countryRegion => {\n return {\n key: countryRegion.CountryRegionId,\n value: countryRegion.ShortName\n };\n });\n }\n\n public getStateFormat(stateProvinceInfo?: StateProvinceInfo[]): { key?: string; value?: string }[] {\n return (stateProvinceInfo || []).map(state => {\n return {\n key: state.StateId,\n value: state.StateName\n };\n });\n }\n\n public getAddressTypeFormat(): { key?: number; value?: string }[] {\n return (this.addressPurposes || []).map(addressPurpose => {\n return {\n key: addressPurpose.AddressType,\n value: addressPurpose.Description\n };\n });\n }\n\n public getPrefilledAddressDropdownData = (\n stateDefaultSelectionText: string,\n stateProvinceInfo?: StateProvinceInfo[]\n ): IAddressDropdownsData => {\n const defaultStateText = {\n key: '',\n value: stateDefaultSelectionText\n };\n const dropdownData: IAddressDropdownsData = {};\n\n dropdownData[AddressItemType[AddressItemType.ThreeLetterISORegionName]] = this.getCountryFormat();\n dropdownData[AddressItemType[AddressItemType.State]] = this.getStateFormat(stateProvinceInfo);\n dropdownData[AddressItemType[AddressItemType.State]].unshift(defaultStateText);\n dropdownData[AddressItemType[AddressItemType.AddressTypeValue]] = this.getAddressTypeFormat();\n\n return dropdownData;\n };\n\n public getTwoLetterISORegionName = (countryRegionId: string): string | undefined => {\n const countryRegionInfo = this._getCountryRegionInfo(countryRegionId);\n\n return countryRegionInfo!.ISOCode;\n };\n\n public validateAddressFormat = (\n address: Address,\n validationError: Address,\n countryRegionId: string,\n propertyName?: string\n ): boolean => {\n let isValid: boolean = true;\n let validationtor;\n const addressFormat = this.getAddressFormat(address.ThreeLetterISORegionName || countryRegionId);\n\n addressFormat.forEach(addressFormatItem => {\n if (!propertyName || (propertyName && addressFormatItem.name === propertyName)) {\n validationtor = this._inputValidation(addressFormatItem, validationError, address);\n if (validationtor !== undefined) {\n isValid = validationtor;\n }\n }\n });\n\n return isValid;\n };\n\n public getTranformedAddress = (result: Microsoft.Maps.ISuggestionResult, stateProvinceInfo?: StateProvinceInfo[]): Address => {\n const address: Address = {};\n\n // Zip Code\n if (result.address.postalCode !== undefined) {\n address.ZipCode = result.address.postalCode;\n } else {\n address.ZipCode = '';\n }\n\n // State\n if (stateProvinceInfo) {\n const selectedState = stateProvinceInfo.find(state => state.StateName === result.address.adminDistrict);\n if (!selectedState) {\n address.State = '';\n address.StateName = result.address.adminDistrict;\n } else {\n address.State = selectedState.StateId;\n address.StateName = selectedState.StateName;\n }\n }\n\n // Street\n if (result.address.addressLine !== undefined) {\n address.Street = result.address.addressLine;\n } else {\n address.Street = ' ';\n }\n\n // City\n if (result.address.locality !== undefined) {\n address.City = result.address.locality;\n } else {\n address.City = '';\n }\n\n // District\n if (result.address.district !== undefined) {\n address.DistrictName = result.address.district;\n address.CountyName = result.address.district;\n } else {\n address.DistrictName = '';\n }\n\n // Formatted Address\n address.FullAddress = result.address.formattedAddress;\n\n return address;\n };\n\n private _inputValidation(addressFormatItem: IAddressItem, validationError: Address, address: Address): boolean | undefined {\n set(validationError, { [addressFormatItem.name]: null });\n for (const validationRule of addressFormatItem.validationRules || []) {\n if (!this._validateRegEx(address, addressFormatItem.name, validationRule)) {\n set(validationError, { [addressFormatItem.name]: validationRule.message });\n return false;\n }\n }\n return undefined;\n }\n\n private readonly _validateRegEx = (address: Address, propertyName: string, validationRule: IAddressValidationRule): boolean => {\n if (validationRule.regEx && validationRule.regEx.length > 0) {\n const regex = new RegExp(validationRule.regEx);\n return regex.test((get(address, propertyName) as string) || '');\n }\n return true;\n };\n\n private _getCountryRegionInfo(countryRegionId: string): CountryRegionInfo | undefined {\n return (this.countryRegionsInfo || []).find(countryRegion => {\n return (countryRegion.CountryRegionId || '').toLowerCase() === countryRegionId.toLowerCase();\n });\n }\n\n private _getAddressDisplayFormat(countryRegionInfo: CountryRegionInfo): IAddressItem[] {\n const addressDisplayItem: IAddressItem[] = [];\n\n if (countryRegionInfo && countryRegionInfo.AddressFormatLines) {\n const AddressTypeItem = this._extendAddressDisplayFormat(AddressItemType.AddressTypeValue, true);\n if (AddressTypeItem) {\n addressDisplayItem.push(AddressTypeItem);\n }\n\n const nameDisplayItem = this._extendAddressDisplayFormat(AddressItemType.Name, true);\n if (nameDisplayItem) {\n addressDisplayItem.push(nameDisplayItem);\n }\n\n countryRegionInfo.AddressFormatLines.forEach(formatLine => {\n if (formatLine.AddressComponentNameValue) {\n const addressItem = this.addressMetaData.getItemFormat(formatLine.AddressComponentNameValue);\n if (addressItem) {\n addressItem.isNewLine = formatLine.NewLine || false;\n addressDisplayItem.push(addressItem);\n }\n }\n });\n\n const phoneDisplayItem = this._extendAddressDisplayFormat(AddressItemType.Phone, false);\n if (phoneDisplayItem) {\n addressDisplayItem.push(phoneDisplayItem);\n }\n\n const isPrimaryDisplayItem = this._extendAddressDisplayFormat(AddressItemType.IsPrimary, false);\n if (isPrimaryDisplayItem) {\n addressDisplayItem.push(isPrimaryDisplayItem);\n }\n }\n\n return addressDisplayItem;\n }\n\n private _extendAddressDisplayFormat(type: AddressItemType, isNewLine: boolean): IAddressItem | undefined {\n const addressItem = this.addressMetaData.getItemFormat(type);\n if (addressItem) {\n addressItem.isNewLine = isNewLine;\n }\n return addressItem;\n }\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { PhoneRegex } from '@msdyn365-commerce-modules/retail-actions';\n\nimport {\n AddressItemDisplayType,\n AddressItemType,\n AddressValidationRuleType,\n IAddressItem,\n IAddressValidationRule\n} from './address-format.data';\nimport { IAddressResource } from './address-module.data';\n\n/**\n * Address meta data.\n */\nexport class AddressMetaData {\n private readonly metaData: IAddressItem[] = [];\n\n private readonly resources: IAddressResource;\n\n private readonly requiredFieldRegEx: string = '\\\\S';\n\n private readonly maxLengthRegEx: string = '^.{0,20}$';\n\n private readonly resourcesPrefix: string = 'address';\n\n private readonly maxLength: number = 64;\n\n private readonly requiredFields: AddressItemType[];\n\n private readonly excludedTypes: AddressItemType[];\n\n constructor(resources: IAddressResource, excluded?: AddressItemType[], required?: AddressItemType[]) {\n this.resources = resources || {};\n this.excludedTypes = excluded || [];\n this.requiredFields =\n required !== undefined\n ? required\n : [\n AddressItemType.AddressTypeValue,\n AddressItemType.Name,\n AddressItemType.ZipCode,\n AddressItemType.City,\n AddressItemType.State,\n AddressItemType.ThreeLetterISORegionName,\n AddressItemType.Street\n ];\n this._init();\n }\n\n public getItemFormat(id: number): IAddressItem | undefined {\n return this.metaData.find(item => {\n return item.type === id;\n });\n }\n\n private _init(): void {\n this._addItem(AddressItemType.Name, AddressItemDisplayType.Input);\n this._addItem(AddressItemType.Phone, AddressItemDisplayType.Input, PhoneRegex.defaultRegex);\n this._addItem(AddressItemType.ZipCode, AddressItemDisplayType.Input);\n this._addItem(AddressItemType.City, AddressItemDisplayType.Input);\n this._addItem(AddressItemType.County, AddressItemDisplayType.Input);\n this._addItem(AddressItemType.State, AddressItemDisplayType.Dropdown);\n this._addItem(AddressItemType.ThreeLetterISORegionName, AddressItemDisplayType.Dropdown);\n this._addItem(AddressItemType.Street, AddressItemDisplayType.Input);\n this._addItem(AddressItemType.DistrictName, AddressItemDisplayType.Input);\n this._addItem(AddressItemType.StreetNumber, AddressItemDisplayType.Input);\n this._addItem(AddressItemType.BuildingCompliment, AddressItemDisplayType.Input);\n this._addItem(AddressItemType.Postbox, AddressItemDisplayType.Input);\n this._addItem(AddressItemType.House_RU, AddressItemDisplayType.Input);\n this._addItem(AddressItemType.Flat_RU, AddressItemDisplayType.Input);\n this._addItem(AddressItemType.CountryOKSMCode_RU, AddressItemDisplayType.Input);\n this._addItem(AddressItemType.AddressTypeValue, AddressItemDisplayType.Dropdown);\n this._addItem(AddressItemType.IsPrimary, AddressItemDisplayType.Checkbox);\n }\n\n private _addItem(type: AddressItemType, displayType: AddressItemDisplayType, format?: string): void {\n if (this.excludedTypes.includes(type)) {\n return;\n }\n\n const nameKey = AddressItemType[type].replace('_', '');\n\n // Find out if currentItem is required field\n const validationRules = this._validationRules(type, nameKey, format);\n const isRequired = validationRules.some(rule => rule.type === AddressValidationRuleType.Required);\n\n // If no optional string is provided in resource file, use the original label text\n const optionalString =\n this.resources[`${this.resourcesPrefix}${nameKey}LabelOptional`] || this.resources[`${this.resourcesPrefix}${nameKey}Label`];\n const item: IAddressItem = {\n type,\n displayType,\n name: AddressItemType[type],\n label: isRequired ? this.resources[`${this.resourcesPrefix}${nameKey}Label`] : optionalString,\n maxLength: this.maxLength,\n validationRules,\n isNewLine: true\n };\n\n this.metaData.push(item);\n }\n\n private _validationRules(type: AddressItemType, name: string, format?: string): IAddressValidationRule[] {\n const validationRules: IAddressValidationRule[] = [];\n\n for (const ruleType of Object.keys(AddressValidationRuleType)) {\n const key = `${this.resourcesPrefix}${name}${ruleType}`;\n const message: string = this.resources[`${key}ErrorMessage`];\n switch (ruleType) {\n case AddressValidationRuleType.Required: {\n if (this.requiredFields.find((itemType: AddressItemType) => itemType === type)) {\n validationRules.push(this._validationRule(ruleType, this.requiredFieldRegEx, message));\n }\n break;\n }\n case AddressValidationRuleType.Format: {\n validationRules.push(this._validationRule(ruleType, format!, message));\n break;\n }\n case AddressValidationRuleType.MaxLength: {\n if (type === AddressItemType.Phone) {\n validationRules.push(this._validationRule(ruleType, this.maxLengthRegEx, message));\n }\n\n break;\n }\n default:\n }\n }\n return validationRules;\n }\n\n private _validationRule(type: AddressValidationRuleType, regEx: string, message: string): IAddressValidationRule {\n return {\n type,\n regEx,\n message\n };\n }\n}\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { Address } from '@msdyn365-commerce/retail-proxy';\nimport { Heading } from '@msdyn365-commerce-modules/data-types';\n\nexport enum AddressOperation {\n Add = 'Add',\n Show = 'Show',\n Update = 'Update',\n List = 'List',\n Multiple = 'Multiple'\n}\n\nexport enum AddressType {\n Shipping = 'Shipping',\n Billing = 'Billing',\n Invoice = 'Invoice',\n Company = 'Company'\n}\n\nexport interface IDropdownDisplayData {\n [index: string]: { key?: string; value?: string }[];\n}\n\nexport interface IAddressResponse {\n errorTitle?: string;\n errorMessage?: string;\n customerAddresses?: Address[];\n address?: Address;\n}\n\nexport interface IAddressConfig {\n heading?: Heading;\n primaryAddressSectionHeading?: Heading;\n otherAddressSectionHeading?: Heading;\n addAddressHeading?: Heading;\n editAddressHeading?: Heading;\n}\n\nexport interface IAddressResource {\n addressChangeCheckboxAriaLabel: string;\n addressAddButtonText: string;\n addressAddButtonAriaLabel: string;\n addressAddNewButtonText?: string;\n addressAddNewButtonAriaLabel?: string;\n addressPrimaryButtonText: string;\n addressPrimaryButtonAriaLabel: string;\n addressEditButtonText: string;\n addressEditButtonAriaLabel: string;\n addressRemoveButtonText: string;\n addressRemoveButtonAriaLabel: string;\n addressSaveButtonText: string;\n addressSaveButtonAriaLabel: string;\n addressCancelButtonText: string;\n addressCancelButtonAriaLabel: string;\n addressStateDefaultSelectionText: string;\n addressNameLabel: string;\n addressNameLabelOptional?: string;\n addressNameRequiredErrorMessage: string;\n addressPhoneLabel: string;\n addressPhoneLabelOptional?: string;\n addressPhoneRequiredErrorMessage: string;\n addressPhoneMaxLengthErrorMessage?:string;\n addressZipCodeLabel: string;\n addressZipCodeLabelOptional?: string;\n addressZipCodeRequiredErrorMessage: string;\n addressCityLabel: string;\n addressCityLabelOptional?: string;\n addressCityRequiredErrorMessage: string;\n addressCountyLabel: string;\n addressCountyLabelOptional?: string;\n addressCountyRequiredErrorMessage: string;\n addressStateLabel: string;\n addressStateLabelOptional?: string;\n addressStateRequiredErrorMessage: string;\n addressThreeLetterISORegionNameLabel: string;\n addressThreeLetterISORegionNameLabelOptional?: string;\n addressThreeLetterISORegionNameRequiredErrorMessage: string;\n addressStreetRequiredErrorMessage: string;\n addressDistrictLabel: string;\n addressDistrictLabelOptional?: string;\n addressDistrictNameLabel: string;\n addressDistrictNameLabelOptional?: string;\n addressDistrictRequiredErrorMessage: string;\n addressStreetNumberLabel: string;\n addressStreetNumberLabelOptional?: string;\n addressStreetNumberRequiredErrorMessage: string;\n addressBuildingComplimentLabel: string;\n addressBuildingComplimentLabelOptional?: string;\n addressBuildingComplimentRequiredErrorMessage: string;\n addressPostboxLabel: string;\n addressPostboxLabelOptional?: string;\n addressPostboxRequiredErrorMessage: string;\n addressHouseRULabel: string;\n addressHouseRULabelOptional?: string;\n addressHouseRURequiredErrorMessage: string;\n addressFlatRULabel: string;\n addressFlatRULabelOptional?: string;\n addressFlatRURequiredErrorMessage: string;\n addressCountryOKSMCodeRULabel: string;\n addressCountryOKSMCodeRURequiredErrorMessage: string;\n addressErrorMessageTitle: string;\n addressGenericErrorMessage: string;\n addressEmptyListAddressMessage: string;\n removeAddressNotification?: string;\n addressProductImage?: string;\n addressProductNumberText?: string;\n addressProductText?: string;\n addressProductUnitPriceText?: string;\n addressProductUOMText?: string;\n addressProductQuantityText?: string;\n addressProductActionsText?: string;\n addressSelectAllRowsText?: string;\n addressProductAddressText?: string;\n addressShipMultipleText?: string;\n addressShipMultipleAriaLabel?: string;\n saveAndContinueBtnLabel?: string;\n addressShipSingleText?: string;\n addressShipSingleAriaLabel?: string;\n clearSelectionButtonText?: string;\n clearSelectionButtonAriaLabel?: string;\n chooseAddressForSelectedItemsText?: string;\n chooseAddressForSelectedItemsAriaLabel?: string;\n noAddressSelectedAriaLabel?: string;\n unavailableProductErrorMessage?: string;\n outOfStockProductErrorMessage?: string;\n}\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 } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nexport interface IAdressCheckbox {\n id?: string;\n name?: string;\n className: string;\n type: string;\n isChecked: boolean;\n autoFocus?: boolean;\n additionalAddributes?: object;\n telemetryContent?: ITelemetryContent;\n onChange(event: React.ChangeEvent<HTMLInputElement>): void;\n}\n\n/**\n * Address checkbox.\n * @param props - Configuration of the functional component.\n * @returns React functional component.\n */\nexport const AddressCheckboxFunctionComponent: React.FC<IAdressCheckbox> = (props: IAdressCheckbox) => {\n const {\n id: itemId,\n name,\n className,\n type,\n isChecked,\n additionalAddributes,\n telemetryContent,\n autoFocus: shouldBeAutoFocused,\n onChange\n } = props;\n\n const payLoad = getPayloadObject('click', telemetryContent!, name!);\n const attributes = getTelemetryAttributes(telemetryContent!, payLoad);\n return (\n <input\n name={name}\n id={itemId}\n className={`${className}__input ${className}__input-${type}`}\n type='checkbox'\n autoFocus={shouldBeAutoFocused}\n aria-checked={isChecked}\n onChange={onChange}\n checked={isChecked}\n {...(additionalAddributes || {})}\n {...attributes}\n />\n );\n};\n\nexport default AddressCheckboxFunctionComponent;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { Address } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\nimport { Heading as HeadingData } from '@msdyn365-commerce-modules/data-types';\nimport { Heading, INodeProps, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\nimport classname from 'classnames';\nimport { get } from 'mobx';\nimport * as React from 'react';\n\nimport {\n AddressItemDisplayType,\n AddressItemType,\n AddressValidationRuleType,\n IAddressDropdownsData,\n IAddressItem,\n IAddressValidationRule\n} from '../address-format.data';\nimport { AddressType, IAddressResource, IAddressResponse } from '../address-module.data';\nimport AddressAlertComponent from './address-alert';\nimport AddressButtonComponent from './address-button';\nimport AdressCheckboxComponent from './address-checkbox';\nimport AdressDropdownComponent from './address-dropdown';\nimport AddressErrorMessageComponent from './address-error-message';\nimport AddressErrorTitleComponent from './address-error-title';\nimport AddressInputComponent from './address-input';\nimport AddressLabelComponent from './address-label';\n\nexport interface IAddressAddInputProps {\n isUpdating?: boolean;\n hasError?: boolean;\n hasExternalSubmitGroup?: boolean;\n addressType: AddressType;\n addressFormat: IAddressItem[];\n defaultCountryRegionId: string;\n defaultAddressType: number;\n selectedAddress?: Address;\n dropdownDisplayData: IAddressDropdownsData;\n resources: IAddressResource;\n addressActionResponse?: IAddressResponse;\n addAddressHeading?: HeadingData;\n editAddressHeading?: HeadingData;\n validationError?: object;\n telemetryContent?: ITelemetryContent;\n shouldAutoFocus?: boolean;\n onInputChange(event: React.ChangeEvent<HTMLInputElement>): void;\n onDropdownChange(event: React.ChangeEvent<HTMLSelectElement>): void;\n onSave?(): void;\n onCancel?(): void;\n}\n\nexport interface IAddressError {\n AddressError: INodeProps;\n title: React.ReactNode;\n message: React.ReactNode;\n}\n\nexport interface IAddressAddItem {\n key: string;\n AddressItem: INodeProps;\n label: React.ReactNode;\n alert: React.ReactNode;\n input: React.ReactNode;\n}\n\nexport interface IAddressAddUpdateProps {\n AddressForm: INodeProps;\n heading: React.ReactNode;\n items: IAddressAddItem[];\n hasError: boolean;\n error: IAddressError;\n isShowSaveButton: boolean;\n saveButton: React.ReactNode;\n isShowCancelButton: boolean;\n cancelButton: React.ReactNode;\n}\n\nconst getRequriedAttribute = (validationRules?: IAddressValidationRule[]): object => {\n const requriedRule = (validationRules || []).find(validationRule => {\n return validationRule.type === AddressValidationRuleType.Required;\n });\n\n return requriedRule ? { 'aria-required': true } : {};\n};\n\nconst getAddessItems = (selectedAddress: Address, props: IAddressAddInputProps): IAddressAddItem[] => {\n const {\n addressFormat,\n addressType,\n dropdownDisplayData,\n defaultCountryRegionId,\n defaultAddressType,\n validationError = {},\n onInputChange,\n onDropdownChange,\n shouldAutoFocus\n } = props;\n\n return addressFormat.map((addressFormatItem, index) => {\n const elementId = `${addressType.toLowerCase()}_address${addressFormatItem.name.toLowerCase()}`;\n const errorMessage = get(validationError, addressFormatItem.name);\n const className = classname('msc-address-form__item', `msc-address-form__item-${addressFormatItem.name.toLowerCase()}`, {\n 'msc-address-form__item-newline': addressFormatItem.isNewLine,\n 'address-form__item-invalid': errorMessage\n });\n let input;\n\n if (addressFormatItem.displayType === AddressItemDisplayType.Input) {\n input = (\n <AddressInputComponent\n {...{\n id: elementId,\n name: addressFormatItem.name,\n className: 'msc-address-form',\n type: 'text',\n autoFocus: shouldAutoFocus ?? index === 0,\n value: selectedAddress[addressFormatItem.name],\n maxLength: addressFormatItem.maxLength,\n onChange: onInputChange,\n additionalAddributes: getRequriedAttribute(addressFormatItem.validationRules)\n }}\n />\n );\n } else if (addressFormatItem.displayType === AddressItemDisplayType.Checkbox) {\n input = (\n <AdressCheckboxComponent\n {...{\n id: elementId,\n name: addressFormatItem.name,\n className: 'msc-address-form',\n type: 'checkbox',\n autoFocus: index === 0,\n isChecked: selectedAddress[addressFormatItem.name],\n onChange: onInputChange,\n additionalAddributes: getRequriedAttribute(addressFormatItem.validationRules)\n }}\n />\n );\n } else {\n const displayData = dropdownDisplayData[addressFormatItem.name];\n let selectedValue = selectedAddress[addressFormatItem.name];\n\n if (addressFormatItem.type === AddressItemType.ThreeLetterISORegionName) {\n selectedValue = selectedValue || defaultCountryRegionId;\n }\n\n if (addressFormatItem.type === AddressItemType.AddressTypeValue) {\n selectedValue = selectedValue || defaultAddressType;\n }\n\n input = (\n <AdressDropdownComponent\n {...{\n id: elementId,\n name: addressFormatItem.name,\n className: 'msc-address-form',\n value: selectedValue,\n displayData,\n onChange: onDropdownChange,\n additionalAddributes: getRequriedAttribute(addressFormatItem.validationRules)\n }}\n />\n );\n }\n\n return {\n key: addressFormatItem.name,\n AddressItem: { className, id: `${elementId}_container` },\n label: <AddressLabelComponent {...{ id: elementId, text: addressFormatItem.label }} />,\n alert: <AddressAlertComponent {...{ message: errorMessage }} />,\n input\n };\n });\n};\n\nexport const AddressAddUpdate = (props: IAddressAddInputProps): IAddressAddUpdateProps => {\n const {\n editAddressHeading,\n addAddressHeading,\n selectedAddress = {},\n resources,\n hasError,\n onCancel,\n onSave,\n hasExternalSubmitGroup,\n isUpdating,\n addressActionResponse,\n telemetryContent\n } = props;\n const heading = selectedAddress.RecordId ? editAddressHeading : addAddressHeading;\n\n return {\n AddressForm: { className: 'msc-address-form' },\n heading: heading && <Heading className='msc-address-form__heading' {...heading} />,\n items: getAddessItems(selectedAddress, props),\n isShowSaveButton: !hasExternalSubmitGroup,\n saveButton: onSave && (\n <AddressButtonComponent\n {...{\n className: classname('msc-address-form__button-save msc-btn', { 'msc-address-form__button-updating': isUpdating }),\n text: resources.addressSaveButtonText,\n ariaLabel: resources.addressSaveButtonAriaLabel,\n disabled: isUpdating,\n onClick: onSave,\n telemetryContent\n }}\n />\n ),\n isShowCancelButton: !hasExternalSubmitGroup,\n cancelButton: onCancel && (\n <AddressButtonComponent\n {...{\n className: 'msc-address-form__button-cancel msc-btn',\n text: resources.addressCancelButtonText,\n ariaLabel: resources.addressCancelButtonAriaLabel,\n onClick: onCancel,\n telemetryContent\n }}\n />\n ),\n hasError: hasError || false,\n error: {\n AddressError: { className: 'msc-address-form__error' },\n title: addressActionResponse && addressActionResponse.errorTitle && (\n <AddressErrorTitleComponent {...{ title: addressActionResponse.errorTitle || '' }} />\n ),\n message: addressActionResponse && addressActionResponse.errorMessage && (\n <AddressErrorMessageComponent {...{ message: addressActionResponse.errorMessage || '' }} />\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 { Address, AddressPurpose } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\nimport { INodeProps } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { AddressItemType, IAddressItem } from '../address-format.data';\nimport AddressDetailItemComponent from './address-detail-item';\n\nexport interface IAddressShowItem {\n key: string;\n description: React.ReactNode;\n}\n\nexport interface IAddressShowProps {\n AddressDetail: INodeProps;\n items: IAddressShowItem[];\n}\n\nexport interface IAddressShowInputProps {\n addressFormat: IAddressItem[];\n address: Address;\n addressPurposes: AddressPurpose[];\n}\n\nexport const AddressShow = (props: IAddressShowInputProps): IAddressShowProps => {\n const { addressFormat, addressPurposes, address } = props;\n\n return {\n AddressDetail: { className: 'msc-address-detail' },\n items: addressFormat.map(item => {\n if (item.name === AddressItemType[AddressItemType.AddressTypeValue]) {\n const addressType = addressPurposes.find(\n addressTypeValue => addressTypeValue.AddressType.toString() === (address[item.name] || '').toString()\n );\n if (addressType) {\n const addressTypeDescription = addressType.Description || '';\n return {\n key: item.name,\n description: (\n <AddressDetailItemComponent\n {...{\n isNewLine: item.isNewLine,\n isShowLabel: item.type === AddressItemType.Phone,\n labelText: item.label,\n name: item.name,\n value: addressTypeDescription\n }}\n />\n )\n };\n }\n }\n return {\n key: item.name,\n description: (\n <AddressDetailItemComponent\n {...{\n isNewLine: item.isNewLine,\n isShowLabel: item.type === AddressItemType.Phone,\n labelText: item.label,\n name: item.name,\n value: (address[item.name] || '').toString()\n }}\n />\n )\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 * as React from 'react';\n\nexport interface IAdressAlert {\n message?: string;\n}\n\n/**\n * Address alert.\n * @param props - Configuration of the functional component.\n * @returns React functional component.\n */\nexport const AddressAlertFunctionComponent: React.FC<IAdressAlert> = (props: IAdressAlert) => {\n const message = props.message;\n return (\n <span className='msc-address-form__alert' role='alert' aria-live='assertive'>\n {message && <>{message}</>}\n </span>\n );\n};\n\nexport default AddressAlertFunctionComponent;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport * as React from 'react';\n\nexport interface IAdressDropdown {\n id: string;\n name: string;\n className: string;\n value: string | number;\n additionalAddributes?: object;\n recordId?: string;\n displayData: { key?: string | number; value?: string }[];\n onChange(event: React.ChangeEvent<HTMLSelectElement>): void;\n}\n\nconst getDropdownItem = (key?: string | number, value?: string, selectedValue?: string | number): React.ReactNode => {\n let isSelected: boolean;\n if (typeof key === 'number') {\n isSelected = key === selectedValue;\n } else {\n isSelected = typeof selectedValue === 'string' && (key || '').toLowerCase() === (selectedValue || '').toLowerCase();\n }\n\n return (\n <option key={key} value={key} aria-selected={isSelected}>\n {value}\n </option>\n );\n};\n\n/**\n * Address dropdown.\n * @param props - Configuration of the functional component.\n * @returns React functional component.\n */\nexport const AddressDropdownFunctionComponent: React.FC<IAdressDropdown> = (props: IAdressDropdown) => {\n const { id: itemId, name, className, value, additionalAddributes, displayData, onChange, recordId } = props;\n\n return (\n <select\n id={itemId}\n className={`${className}__dropdown`}\n name={name}\n value={recordId || value}\n onChange={onChange}\n {...(additionalAddributes || {})}\n >\n {displayData && displayData.map(item => getDropdownItem(item.key, item.value, value))}\n </select>\n );\n};\n\nexport default AddressDropdownFunctionComponent;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport * as React from 'react';\n\nexport interface IAdressLabel {\n id: string;\n text: string;\n}\n\n/**\n * Address label.\n * @param props - Configuration of the functional component.\n * @returns React functional component.\n */\nexport const AddressLabelFunctionComponent: React.FC<IAdressLabel> = (props: IAdressLabel) => {\n const { id: itemId, text } = props;\n\n return (\n <label className='msc-address-form__label' htmlFor={itemId}>\n {text}\n </label>\n );\n};\n\nexport default AddressLabelFunctionComponent;\n","import { __assign } from \"tslib\";\r\nimport { msdyn365Commerce } from '@msdyn365-commerce/core';\r\nimport classnames from 'classnames';\r\nimport * as React from 'react';\r\n\r\nvar PriceComponentActions = {};\r\nvar Price = function (props: any) {\r\n if (props.data.price.CustomerContextualPrice === undefined) {\r\n return null;\r\n }\r\n return (React.createElement(\"span\", { className: classnames('msc-price', props.className) }, showStrikethroughPricing(props) ? renderCurrentPriceWithOriginalPrice(props) : renderCurrentPrice(props)));\r\n};\r\nvar showStrikethroughPricing = function (props: any) {\r\n var originalPrice = getOriginalPrice(props);\r\n if (originalPrice && props.data.price.CustomerContextualPrice) {\r\n return originalPrice > props.data.price.CustomerContextualPrice;\r\n }\r\n return false;\r\n};\r\nvar getOriginalPrice = function (props: any) {\r\n return Math.max(props.data.price.BasePrice || 0, props.data.price.TradeAgreementPrice || 0, props.data.price.AdjustedPrice || 0);\r\n};\r\nvar renderCurrentPrice = function (props: any) {\r\n var initialPrice = formatCurrency(props, props.data.price.CustomerContextualPrice);\r\n return (React.createElement(\"span\", { className: 'msc-price__actual', itemProp: 'price' }, initialPrice));\r\n};\r\nvar formatCurrency = function (props: any, price: any) {\r\n if (price === undefined) {\r\n return undefined;\r\n }\r\n if (price === 0 && props.freePriceText) {\r\n return props.freePriceText;\r\n }\r\n let returnPrice = `$${price}`;\r\n try {\r\n var formatter = new Intl.NumberFormat(props.context.cultureFormatter.locale, {\r\n style: 'currency',\r\n currency: props.context.cultureFormatter.currencyCode,\r\n currencyDisplay: 'narrowSymbol'\r\n });\r\n returnPrice = formatter.format(price)\r\n\r\n } catch {}\r\n return returnPrice;\r\n};\r\nvar renderCurrentPriceWithOriginalPrice = function (props: any) {\r\n var originalPrice = getOriginalPrice(props);\r\n var initialPrice = formatCurrency(props, originalPrice);\r\n return (React.createElement(React.Fragment, null,\r\n React.createElement(\"span\", { className: 'sr-only' },\r\n ' ',\r\n props.originalPriceText,\r\n ' ',\r\n initialPrice,\r\n ' ',\r\n props.currentPriceText,\r\n ' ',\r\n renderCurrentPrice(props)),\r\n React.createElement(\"span\", { className: 'msc-price__strikethrough', \"aria-hidden\": 'true' }, initialPrice),\r\n React.createElement(\"span\", { \"aria-hidden\": 'true' }, renderCurrentPrice(props)),\r\n props.savingsText && React.createElement(\"span\", { className: 'msc-price__savings' }, props.savingsText)));\r\n};\r\n\r\nconst PriceComponent: React.FunctionComponent<any> = msdyn365Commerce.createComponent<any>(\r\n 'Product',\r\n { component: msdyn365Commerce.createComponent('Price', __assign({ component: Price }, PriceComponentActions)) }\r\n);\r\n\r\nexport default PriceComponent","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport classname from 'classnames';\nimport * as React from 'react';\n\nexport interface IAddressDetailItem {\n isNewLine: boolean;\n isShowLabel: boolean;\n labelText: string;\n name: string;\n value: string;\n}\n\n/**\n * Address details item.\n * @param props - Configuration of the functional component.\n * @returns React functional component.\n */\nexport const AddressDetailItemFunctionComponent: React.FC<IAddressDetailItem> = (props: IAddressDetailItem) => {\n const { isNewLine, isShowLabel, labelText, name, value } = props;\n\n const className = `msc-address-detail__item msc-address-detail__item-${name.toLowerCase()}`;\n const isEmpty = !(value && value.length > 0);\n const mainClass = isShowLabel\n ? `msc-address-detail__item msc-address-detail__item-address-detail_${labelText}`\n : classname(className, { 'msc-address-detail__item-empty': isEmpty, 'msc-address-detail__item-newline': isNewLine });\n return (\n <span className={classname(mainClass, { 'msc-address-detail__main-item-empty': isEmpty })}>\n {isShowLabel && (\n <>\n <span className={`${className}-label`}>{labelText}</span>\n <span\n className={classname(className, {\n 'msc-address-detail__item-empty': isEmpty,\n 'msc-address-detail__item-newline': isNewLine\n })}\n aria-hidden\n />\n </>\n )}\n {value}\n </span>\n );\n};\n\nexport default AddressDetailItemFunctionComponent;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { ITelemetry } from '@msdyn365-commerce/core';\nimport { AttributeDataType, DisplayTemplate, ProductRefinerValue, RefinerType } from '@msdyn365-commerce/retail-proxy';\n\nimport { IProductRefinerHierarchy } from '@msdyn365-commerce/commerce-entities';\nimport { DimensionTypes } from '@msdyn365-commerce-modules/retail-actions';\nimport { IRefineItemToggleNotification } from './refine-item-toggle-notification';\n\n/**\n * Types of product refiner values.\n * @deprecated This will be removed soon. Please, use `AttributeDataType` from `@msdyn365-commerce/retail-proxy` instead.\n * @example\n * ```\n * import { AttributeDataType } from `@msdyn365-commerce/retail-proxy`;\n * ```\n */\nexport enum ProductRefinerValueDataTypeValue {\n /**\n * Range slider is used for selections like price.\n * @deprecated This will be removed soon. Please, use `AttributeDataType` from `@msdyn365-commerce/retail-proxy` instead.\n * @example\n * ```\n * import { AttributeDataType } from `@msdyn365-commerce/retail-proxy`;\n * ```\n */\n Range = 1,\n\n /**\n * Range input is a different way to specify ranges and can be expressed with input boxes\n * as well as a set of discrete single-select type values.\n * @deprecated This will be removed soon. Please, use `AttributeDataType` from `@msdyn365-commerce/retail-proxy` instead.\n * @example\n * ```\n * import { AttributeDataType } from `@msdyn365-commerce/retail-proxy`;\n * ```\n */\n RangeInput = 4,\n\n /**\n * This is a discrete list item, either multi-select or single-select.\n * @deprecated This will be removed soon. Please, use `AttributeDataType` from `@msdyn365-commerce/retail-proxy` instead.\n * @example\n * ```\n * import { AttributeDataType } from `@msdyn365-commerce/retail-proxy`;\n * ```\n */\n List = 5,\n\n /**\n * Boolean types allows only single-select.\n * @deprecated This will be removed soon. Please, use `AttributeDataType` from `@msdyn365-commerce/retail-proxy` instead.\n * @example\n * ```\n * import { AttributeDataType } from `@msdyn365-commerce/retail-proxy`;\n * ```\n */\n Boolean = 6\n}\n\n/**\n * Types of product refiners.\n * @deprecated This will be removed soon. Please, use `RefinerType` from `@msdyn365-commerce/retail-proxy` instead.\n * @example\n * ```\n * import { RefinerType } from `@msdyn365-commerce/retail-proxy`;\n * ```\n */\nexport enum ProductRefinerTypeValue {\n /**\n * Refiner values are single-select.\n * @deprecated This will be removed soon. Please, use `RefinerType` from `@msdyn365-commerce/retail-proxy` instead.\n * @example\n * ```\n * import { RefinerType } from `@msdyn365-commerce/retail-proxy`;\n * ```\n */\n Single = 0,\n\n /**\n * Refiner values are multi-select.\n * @deprecated This will be removed soon. Please, use `RefinerType` from `@msdyn365-commerce/retail-proxy` instead.\n * @example\n * ```\n * import { RefinerType } from `@msdyn365-commerce/retail-proxy`;\n * ```\n */\n Multi = 1\n}\n\n/**\n * ProductRefinerSource enum type.\n * @deprecated This will be removed soon. Please, use `ProductRefinerSource` from `@msdyn365-commerce/retail-proxy` instead.\n * @example\n * ```\n * import { ProductRefinerSource } from `@msdyn365-commerce/retail-proxy`;\n * ```\n */\nexport enum ProductRefinerSource {\n /**\n * The None member.\n * @deprecated This will be removed soon. Please, use `ProductRefinerSource` from `@msdyn365-commerce/retail-proxy` instead.\n * @example\n * ```\n * import { ProductRefinerSource } from `@msdyn365-commerce/retail-proxy`;\n * ```\n */\n None = 0,\n\n /**\n * The Attribute member.\n * @deprecated This will be removed soon. Please, use `ProductRefinerSource` from `@msdyn365-commerce/retail-proxy` instead.\n * @example\n * ```\n * import { ProductRefinerSource } from `@msdyn365-commerce/retail-proxy`;\n * ```\n */\n Attribute = 1,\n\n /**\n * The Category member.\n * @deprecated This will be removed soon. Please, use `ProductRefinerSource` from `@msdyn365-commerce/retail-proxy` instead.\n * @example\n * ```\n * import { ProductRefinerSource } from `@msdyn365-commerce/retail-proxy`;\n * ```\n */\n Category = 2,\n\n /**\n * The Price member.\n * @deprecated This will be removed soon. Please, use `ProductRefinerSource` from `@msdyn365-commerce/retail-proxy` instead.\n * @example\n * ```\n * import { ProductRefinerSource } from `@msdyn365-commerce/retail-proxy`;\n * ```\n */\n Price = 3,\n\n /**\n * The Rating member.\n * @deprecated This will be removed soon. Please, use `ProductRefinerSource` from `@msdyn365-commerce/retail-proxy` instead.\n * @example\n * ```\n * import { ProductRefinerSource } from `@msdyn365-commerce/retail-proxy`;\n * ```\n */\n Rating = 4\n}\n\nexport interface IRefineItemData {\n sourceValue?: number;\n swatchImageUrl?: string;\n swatchColorHexCode?: string;\n refinerItemId: number;\n dataTypeValue?: number;\n name: string;\n label: string;\n count?: number;\n isChecked: boolean;\n refineItemUrl?: string;\n minValue?: string;\n maxValue?: string;\n dimensionType?: DimensionTypes;\n rowNumber?: number;\n unitText?: string;\n updatedSliderMaxValue?: string;\n updatedSliderMinValue?: string;\n}\n/**\n * Checks if the data type value corresponds to a slider.\n * @param dataTypeValue\n */\nexport function isRangeType(dataTypeValue: number | undefined): boolean {\n return dataTypeValue === AttributeDataType.Currency || dataTypeValue === AttributeDataType.Decimal;\n}\n\n/**\n * Checks if the data type value corresponds to a range type integer.\n * @param dataTypeValue\n */\nexport function isRangeTypeForInteger(dataTypeValue: number | undefined): boolean {\n return (\n dataTypeValue === AttributeDataType.Currency ||\n dataTypeValue === AttributeDataType.Decimal ||\n dataTypeValue === AttributeDataType.Integer\n );\n}\n\n/**\n * Checks if the data type value corresponds to a custom input box Range.\n * @param dataTypeValue\n */\nexport function isCustomRangeTypeIntegerSelected(\n selectedRefinementCriterion: ProductRefinerValue,\n parentProductRefinerHierarchy: IProductRefinerHierarchy\n): boolean {\n return (\n selectedRefinementCriterion?.RowNumber !== undefined &&\n selectedRefinementCriterion?.RowNumber !== null &&\n selectedRefinementCriterion?.DataTypeValue === AttributeDataType.Integer &&\n parentProductRefinerHierarchy.DisplayTemplateValue === DisplayTemplate.Range\n );\n}\n\n/**\n * Checks if the selectedRefinementCriterion is siingle type with API va;ues or custom type.\n * If custom type then RowNumber is null\n * @param dataTypeValue\n */\nexport function isSingleSelectRangeTypeIntegerSelected(\n selectedRefinementCriterion: ProductRefinerValue,\n productRefinerValue: ProductRefinerValue\n): boolean {\n return (\n productRefinerValue.LeftValueBoundString === selectedRefinementCriterion?.LeftValueBoundString &&\n productRefinerValue.RightValueBoundString === selectedRefinementCriterion?.RightValueBoundString &&\n selectedRefinementCriterion?.RowNumber !== undefined &&\n selectedRefinementCriterion?.RowNumber !== null &&\n selectedRefinementCriterion !== undefined\n );\n}\n\n/**\n * Find the refinement criterion associated with this product refiner value.\n * @param productRefinerValue Product refiner value to match.\n * @param refinementCriteria Selected refinement criteria.\n */\nexport function findMatchingRefinementCriterion(\n productRefinerValue: ProductRefinerValue,\n refinementCriteria: ProductRefinerValue[]\n): ProductRefinerValue | undefined {\n // If the value is a range, then match only on data type value; otherwise match on item string\n return refinementCriteria.find((refinementCriterion: ProductRefinerValue) =>\n isMatchingRefinementCriterion(productRefinerValue, refinementCriterion)\n );\n}\n\n/**\n * Find the refinement criterion associated with this product refiner value.\n * @param productRefinerValue Product refiner value to match.\n * @param refinementCriteria Selected refinement criteria.\n * @param refinementCriterion\n */\nexport function isMatchingRefinementCriterion(\n productRefinerValue: ProductRefinerValue,\n refinementCriterion: ProductRefinerValue,\n parent?: IProductRefinerHierarchy\n): boolean {\n // If the value is a range, then match only on data type value; otherwise match on item string\n // Distinguish by displaytype also\n return (\n refinementCriterion.RefinerRecordId === productRefinerValue.RefinerRecordId &&\n refinementCriterion.RefinerSourceValue === productRefinerValue.RefinerSourceValue &&\n refinementCriterion.DataTypeValue === productRefinerValue.DataTypeValue &&\n ((parent?.DisplayTemplateValue === DisplayTemplate.Range\n ? isRangeType(refinementCriterion.DataTypeValue)\n : isRangeTypeForInteger(refinementCriterion.DataTypeValue)) ||\n refinementCriterion.LeftValueBoundString === productRefinerValue.LeftValueBoundString)\n );\n}\n\nexport function getIntegerRangeName(productRefinerValue: ProductRefinerValue): string {\n let rangeValue = '';\n\n if (productRefinerValue.LeftValueBoundString === '' && productRefinerValue.RightValueBoundString !== '') {\n rangeValue = `< ${productRefinerValue.RightValueBoundLocalizedString || productRefinerValue.RightValueBoundString}`;\n } else if (productRefinerValue.RightValueBoundString === '' && productRefinerValue.LeftValueBoundString !== '') {\n rangeValue = `> ${productRefinerValue.LeftValueBoundLocalizedString || productRefinerValue.LeftValueBoundString}`;\n } else if (productRefinerValue.RightValueBoundString !== '' && productRefinerValue.LeftValueBoundString !== '') {\n rangeValue = `${productRefinerValue.LeftValueBoundLocalizedString ||\n productRefinerValue.LeftValueBoundString} - ${productRefinerValue.RightValueBoundString ||\n productRefinerValue.RightValueBoundString}`;\n }\n return rangeValue;\n}\n\n/**\n * Get input without formatting.\n * @param input - Input string.\n * @returns - Returns number.\n */\nexport function getInputWithoutFormatting(input: string): string {\n // First try to cast raw input to a number\n const inputAsNumber = Number(input);\n if (!Number.isNaN(inputAsNumber)) {\n return input;\n }\n\n // Otherwise try a reverse lookup and fall back to the raw input if all else fails\n // const reverseLookupResult = formattedPriceReverseLookup.get(input);\n // return reverseLookupResult || input;\n return input;\n}\n\nexport function getUpdatedRefinementCriteria(\n itemToggleNotification: IRefineItemToggleNotification,\n currentRefinementCriteria: ProductRefinerValue[]\n): ProductRefinerValue[] {\n const updatedRefinementCriteria: ProductRefinerValue[] = [];\n let toggledItemFound = false;\n\n // Keeping only itemToggled value for integer-range type in currentRefinementCriteria\n if (\n itemToggleNotification.parentProductRefinerHierarchy.DataTypeValue === AttributeDataType.Integer &&\n itemToggleNotification.parentProductRefinerHierarchy.DisplayTemplateValue === DisplayTemplate.Range\n ) {\n currentRefinementCriteria = currentRefinementCriteria.filter(r => {\n return r.RefinerRecordId !== itemToggleNotification.productRefinerValue.RefinerRecordId;\n });\n }\n\n currentRefinementCriteria.forEach((selectedCriterion: ProductRefinerValue) => {\n if (\n isMatchingRefinementCriterion(\n itemToggleNotification.productRefinerValue,\n selectedCriterion,\n itemToggleNotification.parentProductRefinerHierarchy\n )\n ) {\n toggledItemFound = true;\n if (itemToggleNotification.isSelecting) {\n const next = {\n ...selectedCriterion,\n LeftValueBoundString:\n (itemToggleNotification.rangeStart !== undefined && `${itemToggleNotification.rangeStart}`) ||\n selectedCriterion.LeftValueBoundString,\n RightValueBoundString:\n (itemToggleNotification.rangeEnd !== undefined && `${itemToggleNotification.rangeEnd}`) ||\n selectedCriterion.RightValueBoundString\n };\n updatedRefinementCriteria.push(next);\n } // Else the item is being de-selected, so omit it from the refinement criteria\n } else {\n // Keep existing criterion because it is not in the item toggle notification\n updatedRefinementCriteria.push(selectedCriterion);\n }\n });\n\n if (!toggledItemFound) {\n const next = {\n ...itemToggleNotification.productRefinerValue,\n LeftValueBoundString:\n (itemToggleNotification.rangeStart !== undefined && `${itemToggleNotification.rangeStart}`) ||\n itemToggleNotification.productRefinerValue.LeftValueBoundString,\n RightValueBoundString:\n (itemToggleNotification.rangeEnd !== undefined && `${itemToggleNotification.rangeEnd}`) ||\n itemToggleNotification.productRefinerValue.RightValueBoundString\n };\n updatedRefinementCriteria.push(next);\n\n // If single select, then deselect any others in the parent refiner group\n if (\n (itemToggleNotification.productRefinerValue.DataTypeValue === AttributeDataType.Text ||\n itemToggleNotification.productRefinerValue.DataTypeValue === AttributeDataType.TrueFalse) &&\n itemToggleNotification.parentProductRefinerHierarchy.RefinerTypeValue === RefinerType.SingleSelect\n ) {\n itemToggleNotification.parentProductRefinerHierarchy.Values.forEach((child: ProductRefinerValue) => {\n if (child.RefinerRecordId === next.RefinerRecordId && child.LeftValueBoundString === next.LeftValueBoundString) {\n // Do nothing\n } else {\n const matchingIndex = updatedRefinementCriteria.findIndex((criterion: ProductRefinerValue) =>\n isMatchingRefinementCriterion(child, criterion, itemToggleNotification.parentProductRefinerHierarchy)\n );\n if (matchingIndex > -1) {\n updatedRefinementCriteria.splice(matchingIndex, 1);\n }\n }\n });\n }\n }\n\n return updatedRefinementCriteria;\n}\n\nexport function formatPrice(\n amount: string | undefined,\n currency: string | undefined,\n locale: string | undefined,\n telemetry: ITelemetry\n): string {\n if (!amount || !currency) {\n telemetry.trace(`[refine-menu.utilities.formatPrice] could not format price for ${amount} ${currency}`);\n return amount || '';\n }\n const priceAmount = (amount && Number(amount)) || 0;\n let result: string;\n\n try {\n result = new Intl.NumberFormat(locale, {\n style: 'currency',\n currencyDisplay: 'symbol',\n currency,\n minimumFractionDigits: 0\n }).format(priceAmount);\n } catch (error) {\n result = `${priceAmount} ${currency}`;\n telemetry.warning(`[refine-menu.utilities.formatPrice] Failed to format price for ${result}: ${error}`);\n }\n\n return result;\n}\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 { Address, AddressPurpose } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\nimport { Heading as HeadingData } from '@msdyn365-commerce-modules/data-types';\nimport { Heading, INodeProps, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport * as React from 'react';\n\nimport { AddressFormat } from '../address-format';\nimport { IAddressResource, IAddressResponse } from '../address-module.data';\nimport AddressButtonComponent from './address-button';\nimport AddressErrorMessageComponent from './address-error-message';\nimport AddressErrorTitleComponent from './address-error-title';\nimport { AddressShow, IAddressShowProps } from './address-show';\n\nexport interface IAddressListError {\n Error: INodeProps;\n isShowError: boolean;\n title: React.ReactNode;\n message: React.ReactNode;\n}\n\nexport interface IAddressListItem {\n Item: INodeProps;\n key: number;\n error: IAddressListError;\n showItems: IAddressShowProps;\n isShowPrimaryButton: boolean;\n primaryButton: React.ReactNode;\n editButton: React.ReactNode;\n removeButton: React.ReactNode;\n}\n\nexport interface IAddressList {\n List: INodeProps;\n isShowList: boolean;\n heading: React.ReactNode;\n items: IAddressListItem[];\n}\n\nexport interface IAddressListProps {\n ListAddress: INodeProps;\n heading: React.ReactNode;\n isShowEmptyListMessage: boolean;\n emptyListMessage: React.ReactNode;\n addButton: React.ReactNode;\n primaryAddressList: IAddressList;\n otherAddressList: IAddressList;\n}\n\nexport interface IAddressListInputProps {\n isUpdating?: boolean;\n selectedAddress?: Address;\n addressFormat: AddressFormat;\n addresses: Address[];\n addressPurposes: AddressPurpose[];\n heading?: HeadingData;\n primaryAddressSectionHeading?: HeadingData;\n otherAddressSectionHeading?: HeadingData;\n addressActionResponse?: IAddressResponse;\n resources: IAddressResource;\n contextRequest: Msdyn365.IRequestContext;\n telemetryContent?: ITelemetryContent;\n handleLineItemHeadingChange?(event: Msdyn365.ContentEditableEvent): void;\n onAddAddress(): void;\n onEditAddress(address?: Address): void;\n onRemoveAddress(address?: Address): void;\n onUpdatePrimaryAddress(address: Address): void;\n canRenderAsyncCustomerDataAsUnmodifiable?: boolean;\n isAsyncCustomer?: boolean;\n isAsyncCustomerAddressCreationFeatureEnabled?: boolean;\n isEditAsyncCustomerFeatureEnabled?: boolean;\n}\n\nconst getButtonAriaLabel = (ariaLabel: string, addressName?: string): string => {\n return ariaLabel.replace('{addressName}', addressName || '');\n};\n\nconst getAddressList = (\n className: string,\n addresses: Address[],\n showPrimaryButton: boolean,\n props: IAddressListInputProps,\n heading?: HeadingData\n): IAddressList => {\n const {\n resources,\n isUpdating,\n addressActionResponse,\n selectedAddress,\n addressFormat,\n onEditAddress,\n onRemoveAddress,\n onUpdatePrimaryAddress,\n addressPurposes,\n telemetryContent\n } = props;\n const { errorTitle = null, errorMessage = null } = addressActionResponse || {};\n\n return {\n List: { className },\n isShowList: addresses.length > 0,\n heading: heading && <Heading className={`${className}-heading`} {...heading} />,\n items: addresses.map(\n (address: Address): IAddressListItem => {\n const isSelectedAddress = selectedAddress && selectedAddress.RecordId === address.RecordId;\n const isShowError = isSelectedAddress && errorTitle && errorMessage;\n\n // Disable 'primary', 'edit', and 'remove' buttons if the customer IS EITHER async OR async address creation feature is enabled and edit async customer feature is disabled.\n // Conversely, these buttons can only be enabled when the customer is NOT async AND the address creation feature is disabled.\n const isInvalidAsyncState: boolean =\n props.isEditAsyncCustomerFeatureEnabled || false\n ? false\n : (props.canRenderAsyncCustomerDataAsUnmodifiable || false) &&\n (props.isAsyncCustomer || false || props.isAsyncCustomerAddressCreationFeatureEnabled || false);\n\n return {\n Item: { className: `${className}-list` },\n key: address.RecordId || 0,\n showItems: AddressShow({\n addressFormat: addressFormat.getAddressFormat(address.ThreeLetterISORegionName || ''),\n address,\n addressPurposes\n }),\n error: {\n Error: { className: `${className}-error` },\n isShowError: !!isShowError,\n title: <AddressErrorTitleComponent {...{ title: errorTitle || '' }} />,\n message: <AddressErrorMessageComponent {...{ message: errorMessage || '' }} />\n },\n isShowPrimaryButton: showPrimaryButton,\n\n primaryButton: (\n <AddressButtonComponent\n {...{\n className: classnames(\n 'msc-address-list__button-primary msc-btn',\n { 'msc-address-list__button-updating': isUpdating && isSelectedAddress },\n { 'msc-address-list__button-disabled': isInvalidAsyncState }\n ),\n disabled: isUpdating || isInvalidAsyncState,\n text: resources.addressPrimaryButtonText,\n ariaLabel: getButtonAriaLabel(resources.addressPrimaryButtonAriaLabel, address.Name),\n telemetryContent,\n onClick: () => {\n onUpdatePrimaryAddress(address);\n }\n }}\n />\n ),\n editButton: (\n <AddressButtonComponent\n {...{\n // className: classnames('msc-address-list__button-edit', { 'msc-address-list__button-disabled': true }),\n className: classnames('msc-address-list__button-edit', {\n 'msc-address-list__button-disabled': isInvalidAsyncState\n }),\n disabled: isUpdating || isInvalidAsyncState,\n text: resources.addressEditButtonText,\n ariaLabel: getButtonAriaLabel(resources.addressEditButtonAriaLabel, address.Name),\n telemetryContent,\n onClick: () => {\n onEditAddress(address);\n },\n role: 'link'\n }}\n />\n ),\n removeButton: (\n <AddressButtonComponent\n {...{\n // className: classnames('msc-address-list__button-remove', { 'msc-address-list__button-disabled': true }),\n className: classnames('msc-address-list__button-remove', {\n 'msc-address-list__button-disabled': isInvalidAsyncState\n }),\n disabled: isUpdating || isInvalidAsyncState,\n text: resources.addressRemoveButtonText,\n ariaLabel: getButtonAriaLabel(resources.addressRemoveButtonAriaLabel, address.Name),\n telemetryContent,\n onClick: () => {\n onRemoveAddress(address);\n },\n role: 'link'\n }}\n />\n )\n };\n }\n )\n };\n};\n\nconst getPrimaryAddressList = (props: IAddressListInputProps): IAddressList => {\n const { addresses, primaryAddressSectionHeading } = props;\n const primaryAddresses = addresses.filter((address: Address) => address.IsPrimary);\n return getAddressList('msc-address-list__primary', primaryAddresses, false, props, primaryAddressSectionHeading);\n};\n\nconst getOtherAddressList = (props: IAddressListInputProps): IAddressList => {\n const { addresses, otherAddressSectionHeading } = props;\n const otherAddresses = addresses.filter((address: Address) => !address.IsPrimary);\n return getAddressList('msc-address-list__primary', otherAddresses, true, props, otherAddressSectionHeading);\n};\n\nexport const AddressList = (props: IAddressListInputProps): IAddressListProps => {\n const { addresses, heading, resources, onAddAddress, telemetryContent, handleLineItemHeadingChange } = props;\n const headingComponent = heading?.text && (\n <Msdyn365.Text\n className='msc-address-list__heading'\n tag={heading.headingTag ?? 'h2'}\n text={heading.text}\n editProps={{\n onEdit: handleLineItemHeadingChange\n ? handleLineItemHeadingChange\n : () => {\n // Required\n },\n requestContext: props.contextRequest\n }}\n />\n );\n\n // IF the 'Edit async customer' feature is enabled. we won't be disabling the button in this scenario.\n // ELSE disable the 'Add' button only when the customer is async AND the 'Async Address Creation' feature is disabled.\n const disableAddButton: boolean =\n props.isEditAsyncCustomerFeatureEnabled || false\n ? false\n : (props.canRenderAsyncCustomerDataAsUnmodifiable || false) &&\n (props.isAsyncCustomer || false) &&\n !(props.isAsyncCustomerAddressCreationFeatureEnabled || false);\n\n return {\n ListAddress: { className: 'ms-address-list' },\n heading: headingComponent,\n isShowEmptyListMessage: addresses.length === 0,\n emptyListMessage: <p className='msc-address-list__add-empty'>{resources.addressEmptyListAddressMessage}</p>,\n addButton: (\n <AddressButtonComponent\n {...{\n className: 'msc-address-list__button-add msc-btn',\n text: resources.addressAddButtonText,\n ariaLabel: resources.addressAddButtonAriaLabel,\n telemetryContent,\n onClick: onAddAddress,\n disabled: disableAddButton\n }}\n />\n ),\n primaryAddressList: getPrimaryAddressList(props),\n otherAddressList: getOtherAddressList(props)\n };\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport * as React from 'react';\n\n/**\n * The payment error.\n */\nexport interface IPaymentError {\n title: string;\n message: string;\n className?: string;\n}\n\n/**\n * The payment error.\n * @param param0 - First param.\n * @param param0.title - Title.\n * @param param0.message - Message.\n * @param param0.className - ClassName.\n * @returns React node.\n */\nexport const ErrorComponent: React.FC<IPaymentError> = ({ title, message, className = 'ms-checkout-payment-instrument' }) => (\n <div className={`${className}__error`} role='alert' aria-live='assertive'>\n <p className={`${className}__error-title`}>{title}</p>\n <p className={`${className}__error-message`}>{message}</p>\n </div>\n);\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport * as React from 'react';\n\ninterface IErrorMessage {\n text?: string;\n}\n\nexport const ErrorMessage: React.FC<IErrorMessage> = ({ text }) => {\n return (\n <span className='ms-search-result-container__no-results-message'>\n <h5 className='error-text'>\n {` `}\n {text}\n {` `}\n </h5>\n </span>\n );\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { ICoreContext, IGridSettings, IImageData, IImageSettings, Image, IRequestContext } from '@msdyn365-commerce/core';\nimport { SimpleProduct } from '@msdyn365-commerce/retail-proxy';\nimport { getFallbackImageUrl, getProductPageUrlSync } from '@msdyn365-commerce-modules/retail-actions';\nimport { getPayloadObject, getTelemetryAttributes, ITelemetryContent, onTelemetryClick } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { ISearchResultContainerResources } from '../search-result-container.props.autogenerated';\n\n// Import { IComponent, IComponentProps, ICoreContext, IGridSettings, IImageData, IImageSettings, Image, msdyn365Commerce } from '@msdyn365-commerce/core';\n\ninterface IFeatureSearchResultItem {\n product: SimpleProduct | null;\n context: ICoreContext;\n resources: ISearchResultContainerResources;\n imageSettings?: IImageSettings;\n moduleType: string;\n moduleId: string;\n telemetryContent?: ITelemetryContent;\n recommendation?: string;\n}\n\nexport const FeatureSearchResultItem: React.FC<IFeatureSearchResultItem> = ({\n product,\n context,\n imageSettings,\n resources,\n telemetryContent,\n recommendation\n}) => {\n if (product === null) {\n return null;\n }\n\n const productName = product.Name;\n const productRecordId = product && product.RecordId ? product.RecordId : 0;\n const productUrl = getProductPageUrlSync(product.Name || '', productRecordId, context && context.actionContext, undefined);\n const fallbackImage = getFallbackImageUrl(\n product.ItemId,\n context.actionContext.requestContext.apiSettings,\n context.request.app?.config?.OmniChannelMedia\n );\n const heading =\n recommendation && recommendation === 'descriptions' ? resources.featureSimilarDescriptionTitle : resources.featureSimilarLooksTitle;\n\n // Construct telemetry attribute to render\n const payLoad = getPayloadObject('click', telemetryContent!, productName!, productRecordId.toString());\n\n const attribute = getTelemetryAttributes(telemetryContent!, payLoad);\n return (\n <div className='ms-feature-search-result__item'>\n <a\n href={productUrl}\n onClick={onTelemetryClick(telemetryContent!, payLoad, product.Name!)}\n {...attribute}\n aria-label={product.Name}\n >\n <div className='msc-feature-search-result__item__image'>\n {renderProductPlacementImage(\n imageSettings,\n context.request.gridSettings,\n product.PrimaryImageUrl,\n product.Name,\n fallbackImage,\n context.actionContext.requestContext\n )}\n </div>\n </a>\n <div className='msc-feature-search-result__item__detail'>\n <p className='msc-feature-search-result__item__heading'>{heading}</p>\n {renderProductTitle(product?.Name)}\n </div>\n </div>\n );\n};\n\nfunction renderProductPlacementImage(\n imageSettings?: IImageSettings,\n gridSettings?: IGridSettings,\n imageUrl?: string,\n altText?: string,\n fallbackImage?: string,\n context?: IRequestContext\n): JSX.Element | null {\n if (!imageUrl || !gridSettings || !imageSettings) {\n return null;\n }\n const img: IImageData = {\n src: imageUrl,\n altText: altText ? altText : ''\n };\n const imageProps = {\n gridSettings,\n imageSettings,\n fallBackSrc: fallbackImage\n };\n return <Image {...img} {...imageProps} loadFailureBehavior='empty' requestContext={context} />;\n}\n\nfunction renderProductTitle(title?: string): JSX.Element | null {\n return <h1 className='msc-feature-search-result__item__product-title'>{title}</h1>;\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport * as React from 'react';\n\ninterface ILink {\n className?: string;\n text?: string;\n href?: string;\n ariaLabel?: string;\n}\n\nexport const Link: React.FC<ILink> = ({ text, className, href, ariaLabel }) => (\n <a className={className} href={href} aria-label={ariaLabel}>\n {' '}\n {text}{' '}\n </a>\n);\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { Button, Modal, ModalBody, ModalFooter, ModalHeader } from '@msdyn365-commerce-modules/utilities';\nimport React from 'react';\n\nexport interface ISearchResultModalViewProps {\n modal: React.ReactElement;\n modalHeader: React.ReactElement;\n modalFooter: React.ReactElement;\n modalBody: React.ReactElement;\n}\n\ninterface IModalToggleProps {\n innerRef: React.RefObject<HTMLButtonElement> | undefined;\n id: string;\n text: string;\n ariaLabel: string;\n onClick(): void;\n}\n\nexport interface ISearchResultModalResources {\n modalTitle: string;\n modalCloseButtonText: string;\n}\n\nexport interface ISearchResultModalProps {\n resources: ISearchResultModalResources;\n isOpen: boolean;\n returnRef: React.RefObject<HTMLButtonElement> | undefined;\n onModalToggle(): void;\n}\n\nexport const ModalToggle: React.FC<IModalToggleProps> = (props: IModalToggleProps) => {\n const { text, onClick, ariaLabel, innerRef, id } = props;\n return (\n <button id={id} className='msc-button' aria-label={ariaLabel} onClick={onClick} ref={innerRef}>\n {text}\n </button>\n );\n};\n\nexport const SearchResultModal = (props: ISearchResultModalProps): ISearchResultModalViewProps => {\n return {\n modal: modalNode(props),\n modalHeader: modalHeaderNode(props),\n modalFooter: modalFooterNode(props),\n modalBody: <ModalBody className='msc-review-modal-body' />\n };\n};\n\nconst modalNode = (props: ISearchResultModalProps) => {\n return (\n <Modal\n autoFocus\n applicationNode='renderPage'\n returnFocusRef={props.returnRef}\n isOpen={props.isOpen}\n toggle={props.onModalToggle}\n className='msc-search-result-modal'\n zIndex={1050}\n />\n );\n};\n\nconst modalHeaderNode = (props: ISearchResultModalProps) => {\n return <ModalHeader toggle={props.onModalToggle}>{props.resources.modalTitle}</ModalHeader>;\n};\n\nconst modalFooterNode = (props: ISearchResultModalProps) => {\n return (\n <ModalFooter>\n <Button onClick={props.onModalToggle} className='ms-sort-and-filter-modal-close'>\n {props.resources.modalCloseButtonText}\n </Button>\n </ModalFooter>\n );\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IProductsDimensionsAvailabilities } from '@msdyn365-commerce/commerce-entities';\nimport { IPriceComponentResources, ProductComponent } from '@msdyn365-commerce/components';\nimport { ICoreContext, IImageSettings } from '@msdyn365-commerce/core';\nimport { ProductSearchResult } from '@msdyn365-commerce/retail-proxy';\nimport { ArrayExtensions } from '@msdyn365-commerce-modules/retail-actions';\nimport { ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { ISearchResultContainerResources } from '../search-result-container.props.autogenerated';\n\ninterface IProductSearchResultItems {\n products: ProductSearchResult[];\n context: ICoreContext;\n resources: ISearchResultContainerResources;\n imageSettings?: IImageSettings;\n moduleType: string;\n moduleId: string;\n allowBackNavigation?: boolean;\n telemetryContent: ITelemetryContent;\n quickviewSlot?: {} | null | undefined;\n productComparisonButton?: {} | null | undefined;\n channelInventoryConfigurationId?: number;\n isPriceMinMaxEnabled?: boolean;\n productsDimensionAvailabilities?: IProductsDimensionsAvailabilities[][];\n}\n\n/**\n * Returns the product inventory label.\n * @param channelInventoryConfigurationId - The channel configuration Id.\n * @param product - The product.\n * @returns The inventory label.\n */\nexport function getInventoryLabel(channelInventoryConfigurationId: number | undefined, product: ProductSearchResult): string | undefined {\n if (!channelInventoryConfigurationId || !ArrayExtensions.hasElements(product.AttributeValues)) {\n return undefined;\n }\n const inventoryAttribute = product.AttributeValues.find(attribute => attribute.RecordId === channelInventoryConfigurationId);\n if (inventoryAttribute) {\n return inventoryAttribute.TextValue;\n }\n return undefined;\n}\n\nexport const ProductSearchResultItems: React.FC<IProductSearchResultItems> = ({\n products,\n context,\n imageSettings,\n resources,\n moduleType,\n moduleId,\n allowBackNavigation,\n telemetryContent,\n quickviewSlot,\n productComparisonButton,\n channelInventoryConfigurationId,\n isPriceMinMaxEnabled,\n productsDimensionAvailabilities\n}) => {\n const priceResources: IPriceComponentResources = {\n priceRangeSeparator: resources.priceRangeSeparator\n };\n return (\n <ul className='list-unstyled'>\n {products.map((product: ProductSearchResult, index: number) => (\n <li className='ms-product-search-result__item' key={index}>\n <ProductComponent\n context={context}\n telemetryContent={telemetryContent}\n imageSettings={imageSettings}\n freePriceText={resources.priceFree}\n originalPriceText={resources.originalPriceText}\n currentPriceText={resources.currentPriceText}\n ratingAriaLabel={resources.ratingAriaLabel}\n allowBack={allowBackNavigation}\n id={moduleId}\n key={product.RecordId}\n typeName={moduleType}\n data={{ product }}\n quickViewButton={quickviewSlot}\n productComparisonButton={productComparisonButton}\n inventoryLabel={getInventoryLabel(channelInventoryConfigurationId, product)}\n isPriceMinMaxEnabled={isPriceMinMaxEnabled}\n priceResources={priceResources}\n swatchItemAriaLabel={resources.swatchItemAriaLabel}\n dimensionAvailabilities={productsDimensionAvailabilities?.find(\n dimensionAvailability =>\n ArrayExtensions.hasElements(dimensionAvailability) &&\n dimensionAvailability[0].masterProductId === product.MasterProductId\n )}\n />\n </li>\n ))}\n </ul>\n );\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport * as React from 'react';\n\ninterface ISeparator {\n separator: string;\n}\n\nexport const Separator: React.FC<ISeparator> = ({ separator }) => (\n <span>\n {` `}\n {separator}\n {` `}\n </span>\n);\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport * as React from 'react';\n\ninterface ITitle {\n className: string;\n text: string;\n}\n\nexport const Title: React.FC<ITitle> = ({ text, className }) => (\n <span className={className}>\n {` `}\n {text}\n {` `}\n </span>\n);\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { ITelemetry } from '@msdyn365-commerce/core';\nimport { IStoreSelectorStateManager } from '@msdyn365-commerce-modules/bopis-utilities';\n\nimport { IAutoSuggestOptions } from './address-autosuggest.data';\n\n/**\n *\n * Auto Suggest.\n */\nexport class AutoSuggest {\n public readonly excludedAddressFields: string[] = ['ThreeLetterISORegionName', 'Name', 'AddressTypeValue', 'Phone'];\n\n private readonly telemetry: ITelemetry;\n\n private readonly countryCode?: string;\n\n private readonly bingMapsApiKey?: string;\n\n private readonly defaultLanguageId?: string;\n\n private autoSuggestManager: Microsoft.Maps.AutosuggestManager | undefined;\n\n private autoSuggestOptions: IAutoSuggestOptions;\n\n constructor(\n telemetry: ITelemetry,\n autoSuggestOptions: IAutoSuggestOptions,\n BingMapsApiKey?: string,\n countryCode?: string,\n defaultLanguageId?: string\n ) {\n this.telemetry = telemetry;\n this.autoSuggestOptions = autoSuggestOptions;\n this.bingMapsApiKey = BingMapsApiKey;\n this.countryCode = countryCode;\n this.defaultLanguageId = defaultLanguageId;\n }\n\n public attachAutoSuggest = (\n inputId: string,\n containerId: string,\n selectedSuggestionCallback: (result: Microsoft.Maps.ISuggestionResult) => void\n ): void => {\n if (!this.autoSuggestManager) {\n Microsoft.Maps.loadModule('Microsoft.Maps.AutoSuggest', {\n callback: () => {\n const options = { ...this.autoSuggestOptions, countryCode: this.countryCode };\n this.autoSuggestManager = new Microsoft.Maps.AutosuggestManager(options);\n this.autoSuggestManager.attachAutosuggest(inputId, containerId, selectedSuggestionCallback);\n document.querySelector(inputId)?.setAttribute('role', 'combobox');\n setTimeout(() => {\n document.querySelector(inputId)?.setAttribute('type', 'text');\n }, 0);\n },\n errorCallback: () => {\n if (this.telemetry) {\n this.telemetry.debug('Unable to attach map auto suggest.');\n }\n },\n credentials: this.bingMapsApiKey\n });\n }\n };\n\n public changeAutoSuggestionCountryCode = (countryCode?: string): void => {\n if (this.autoSuggestManager) {\n this.autoSuggestOptions.countryCode = countryCode;\n this.autoSuggestManager.setOptions(this.autoSuggestOptions);\n }\n };\n\n public disposeAutoSuggest = (): void => {\n this.autoSuggestManager?.detachAutosuggest();\n this.autoSuggestManager?.dispose();\n this.autoSuggestManager = undefined;\n };\n\n // eslint-disable-next-line @typescript-eslint/naming-convention\n public _loadMapAPI = async (storeSelectorStateManager: IStoreSelectorStateManager): Promise<void> => {\n await storeSelectorStateManager.loadMapApi({\n key: this.bingMapsApiKey,\n lang: this.defaultLanguageId,\n market: this.countryCode\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 { Address, AddressPurpose } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\nimport { format, INodeProps, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { AddressFormat } from '../address-format';\nimport { IAddressResource } from '../address-module.data';\nimport AddressButtonComponent from './address-button';\nimport AddressInputComponent from './address-input';\nimport { AddressShow, IAddressShowProps } from './address-show';\n\nexport interface IAddressSelectInputProps {\n hasExternalSubmitGroup?: boolean;\n addressFormat: AddressFormat;\n addresses: Address[];\n addressPurposes: AddressPurpose[];\n resources: IAddressResource;\n selectedAddress: Address;\n telemetryContent?: ITelemetryContent;\n onAddressOptionChange(event: React.ChangeEvent<HTMLInputElement>): void;\n onShipMultipleAddresses?(): void;\n onAddAddress(): void;\n onSave(): void;\n onCancel(): void;\n multipleAddressShippingEnabled?: boolean;\n}\n\nexport interface IAddressSelectItem {\n key: number;\n SelectItem: INodeProps;\n input: React.ReactNode;\n showItems: IAddressShowProps;\n}\n\nexport interface IAddressSelectProps {\n SelectAddress: INodeProps;\n shipMultipleAddressesButton?: React.ReactNode;\n addButton: React.ReactNode;\n items: IAddressSelectItem[];\n isShowSaveButton: boolean;\n saveButton: React.ReactNode;\n isShowCancelButton: boolean;\n cancelButton: React.ReactNode;\n}\n\nconst getInput = (index: number, address: Address, props: IAddressSelectInputProps): React.ReactNode => {\n const { addresses, onAddressOptionChange, selectedAddress, resources, addressPurposes } = props;\n const addressTypeDescription = address.AddressTypeValue\n ? addressPurposes.find(purpose => purpose.AddressType === address.AddressTypeValue)?.Description || ''\n : '';\n const ichecked = address.RecordId === selectedAddress.RecordId;\n const additionalAttributes = {\n checked: ichecked,\n 'aria-checked': ichecked,\n 'aria-setsize': addresses.length,\n 'aria-posinset': index + 1,\n 'aria-label': format(resources.addressChangeCheckboxAriaLabel, addressTypeDescription)\n };\n\n return (\n <AddressInputComponent\n {...{\n className: 'msc-address-select',\n name: 'selectAddressOptions',\n type: 'radio',\n value: (address.RecordId || '').toString(),\n onChange: onAddressOptionChange,\n additionalAddributes: additionalAttributes,\n telemetryContent: props.telemetryContent\n }}\n />\n );\n};\n\nconst getAddressSelectItems = (props: IAddressSelectInputProps): IAddressSelectItem[] => {\n const { addresses, addressFormat, addressPurposes } = props;\n\n return addresses.map((address, index) => {\n return {\n key: address.RecordId || 0,\n SelectItem: { className: 'msc-address-select__item' },\n input: getInput(index, address, props),\n showItems: AddressShow({\n addressFormat: addressFormat.getAddressFormat(address.ThreeLetterISORegionName || ''),\n address,\n addressPurposes\n })\n };\n });\n};\n\nexport const AddressSelect = (props: IAddressSelectInputProps): IAddressSelectProps => {\n const {\n resources,\n onCancel,\n onSave,\n onAddAddress,\n onShipMultipleAddresses,\n hasExternalSubmitGroup,\n multipleAddressShippingEnabled\n } = props;\n\n return {\n SelectAddress: { className: 'msc-address-select' },\n addButton: (\n <div className={multipleAddressShippingEnabled ? 'msc-address-select__button-container' : ''}>\n <AddressButtonComponent\n {...{\n className: `msc-address-select__button-${multipleAddressShippingEnabled ? 'add-new' : 'add'}`,\n text: multipleAddressShippingEnabled ? resources.addressAddNewButtonText! : resources.addressAddButtonText,\n ariaLabel: multipleAddressShippingEnabled\n ? resources.addressAddNewButtonAriaLabel!\n : resources.addressAddButtonAriaLabel,\n onClick: onAddAddress,\n telemetryContent: props.telemetryContent\n }}\n />\n </div>\n ),\n shipMultipleAddressesButton: multipleAddressShippingEnabled && onShipMultipleAddresses && (\n <AddressButtonComponent\n {...{\n className: 'msc-address-select__button-ship-multiple-addresses',\n text: resources.addressShipMultipleText!,\n ariaLabel: resources.addressShipMultipleAriaLabel!,\n onClick: onShipMultipleAddresses,\n telemetryContent: props.telemetryContent\n }}\n />\n ),\n isShowSaveButton: !hasExternalSubmitGroup,\n saveButton: (\n <AddressButtonComponent\n {...{\n className: 'msc-address-select__button-save',\n text: resources.addressSaveButtonText,\n ariaLabel: resources.addressSaveButtonAriaLabel,\n onClick: onSave,\n telemetryContent: props.telemetryContent\n }}\n />\n ),\n isShowCancelButton: !hasExternalSubmitGroup,\n cancelButton: (\n <AddressButtonComponent\n {...{\n className: 'msc-address-select__button-cancel',\n text: resources.addressCancelButtonText,\n ariaLabel: resources.addressCancelButtonAriaLabel,\n onClick: onCancel,\n telemetryContent: props.telemetryContent\n }}\n />\n ),\n items: getAddressSelectItems(props)\n };\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport * as React from 'react';\nimport { INodeProps, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\nimport { ICoreContext } from '@msdyn365-commerce/core';\nimport { Address, CartLine } from '@msdyn365-commerce/retail-proxy';\nimport AddressButtonComponent from './address-button';\nimport { IShipMultipleAddressesTableHeadingProps, ShipMultipleAddressesTableHeading } from './address-ship-multiple-heading';\nimport { IAddressResource } from '../address-module.data';\nimport {\n IShipMultipleAddressesLineProps,\n IShipMultipleAddressesLineViewProps,\n ShipMultipleAddressesLineView\n} from './address-ship-multiple-lines';\nimport { IShipMultipleAddressesLineViewModel } from '../../modules/checkout-shipping-address';\nimport { ICartLineWithProduct, ICheckoutShippingCartLineInfo } from '../../modules/checkout-shipping-address/components';\n\nexport interface IAddressShipMultipleInputProps {\n context: ICoreContext;\n hasExternalSubmitGroup?: boolean;\n moduleId: string;\n moduleTypeName: string;\n currencyCode: string | undefined;\n resources: IAddressResource;\n shippingLines: ICartLineWithProduct[];\n shippingLineImages: ICheckoutShippingCartLineInfo[];\n selectedShippingLines: IShipMultipleAddressesLineViewModel[];\n customerAddresses: Address[];\n onSelect(line: IShipMultipleAddressesLineViewModel, isChecked: boolean): void;\n onSelectAll(isChecked: boolean): void;\n onClear(): void;\n onShippingAddressChange(shippingLine: CartLine, event: React.ChangeEvent<HTMLSelectElement>): void;\n onBulkShippingAddressChange(event: React.ChangeEvent<HTMLSelectElement>): void;\n onShipSingleAddress(): void;\n onSave(): void;\n onCancel(): void;\n isMobile: boolean;\n telemetryContent?: ITelemetryContent;\n}\n\nexport interface IShipMultipleAddressesViewProps {\n ShipMultipleAddress?: INodeProps;\n shipSingleAddressButton?: React.ReactNode;\n clearSelectionButton?: React.ReactNode;\n addressDropdown?: React.ReactNode;\n ProductsTable?: INodeProps;\n ProductsTableHeading?: React.ReactNode;\n ProductsTableRow?: INodeProps;\n shipMultipleAddressLines?: IShipMultipleAddressesLineViewProps[];\n isShowSaveButton?: boolean;\n saveButton?: React.ReactNode;\n isShowCancelButton?: boolean;\n cancelButton?: React.ReactNode;\n isMobile?: boolean;\n}\n\nexport const AddressShipMultiple = (props: IAddressShipMultipleInputProps): IShipMultipleAddressesViewProps => {\n const {\n context,\n currencyCode,\n hasExternalSubmitGroup,\n moduleId,\n moduleTypeName,\n shippingLines,\n shippingLineImages,\n selectedShippingLines,\n customerAddresses,\n isMobile,\n onSelect,\n onSelectAll,\n onClear,\n onShippingAddressChange,\n onBulkShippingAddressChange,\n onShipSingleAddress,\n onSave,\n onCancel,\n resources\n } = props;\n\n const { unavailableProductErrorMessage, outOfStockProductErrorMessage } = props.resources;\n\n const shipMultipleAddressLines: IShipMultipleAddressesLineViewModel[] = [];\n\n for (const line of shippingLines) {\n shipMultipleAddressLines.push({\n isChecked: false,\n cartLine: line.cartLine\n });\n }\n\n function _renderProductListHeader(): React.ReactNode {\n const headers: IShipMultipleAddressesTableHeadingProps = {\n selectAllRowsText: resources.addressSelectAllRowsText,\n productNumber: resources.addressProductNumberText!,\n productName: resources.addressProductText!,\n productUnitPrice: resources.addressProductUnitPriceText!,\n productQuantity: resources.addressProductQuantityText!,\n productAddress: resources.addressProductAddressText,\n clickHandler: (isChecked: boolean) => {\n onSelectAll(isChecked);\n },\n isAllSelected: selectedShippingLines && selectedShippingLines.every(line => line.isChecked),\n isMobile: isMobile,\n clearSelectionButton: (\n <AddressButtonComponent\n {...{\n className: 'msc-address-select__clear-selection-button',\n text: resources.clearSelectionButtonText!,\n ariaLabel: resources.clearSelectionButtonAriaLabel!,\n onClick: onClear,\n telemetryContent: props.telemetryContent,\n disabled: selectedShippingLines.every(line => !line.isChecked)\n }}\n />\n )\n };\n\n return <ShipMultipleAddressesTableHeading {...headers} />;\n }\n\n function _renderShipMultipleAddressLines(): IShipMultipleAddressesLineViewProps[] {\n return shippingLines.map((line, index) => {\n const currentLineProps: IShipMultipleAddressesLineProps = {\n shipMultipleAddressesLine: {\n isChecked: (selectedShippingLines && selectedShippingLines[index] && selectedShippingLines[index].isChecked) || false,\n cartLine: line.cartLine\n },\n shippingLineImage: shippingLineImages[index],\n product: line.product ? line.product : undefined,\n price: line.product?.Price,\n context,\n quantity: line.cartLine?.Quantity!,\n moduleId: moduleId,\n moduleTypeName: moduleTypeName,\n currencyCode: currencyCode,\n customerAddresses: customerAddresses,\n isMobile: isMobile,\n onSelect: onSelect,\n onShippingAddressChange: onShippingAddressChange,\n resources: {\n unavailableProductErrorMessage,\n outOfStockProductErrorMessage\n }\n };\n\n return ShipMultipleAddressesLineView({ ...currentLineProps })!;\n });\n }\n\n return {\n ShipMultipleAddress: { className: 'msc-address-select' },\n shipSingleAddressButton: (\n <AddressButtonComponent\n {...{\n className: 'msc-address-select__button-ship-single-address',\n text: resources.addressShipSingleText!,\n ariaLabel: resources.addressShipSingleAriaLabel!,\n onClick: onShipSingleAddress,\n telemetryContent: props.telemetryContent\n }}\n />\n ),\n clearSelectionButton: (\n <AddressButtonComponent\n {...{\n className: 'msc-address-select__clear-selection-button',\n text: resources.clearSelectionButtonText!,\n ariaLabel: resources.clearSelectionButtonAriaLabel!,\n onClick: onClear,\n telemetryContent: props.telemetryContent,\n disabled: selectedShippingLines.every(line => !line.isChecked)\n }}\n />\n ),\n addressDropdown: (\n <select\n className={'msc-address-select__address-dropdown'}\n title={resources.chooseAddressForSelectedItemsText}\n aria-label={resources.chooseAddressForSelectedItemsAriaLabel}\n onChange={e => onBulkShippingAddressChange(e)}\n defaultValue={''}\n disabled={selectedShippingLines.every(line => !line.isChecked)}\n >\n <option value='' aria-label={resources.noAddressSelectedAriaLabel} disabled hidden>\n {resources.chooseAddressForSelectedItemsText}\n </option>\n {customerAddresses?.map((address: Address, index: number) => (\n <option key={index} value={address.RecordId} aria-label={address.FullAddress}>\n {address.FullAddress}\n </option>\n ))}\n </select>\n ),\n ProductsTable: {\n className: `ms-address-select__table`,\n tag: 'table',\n role: 'grid'\n },\n ProductsTableRow: {\n className: `ms-address-select-table-line`,\n tag: 'tr'\n },\n ProductsTableHeading: _renderProductListHeader(),\n shipMultipleAddressLines: _renderShipMultipleAddressLines(),\n isShowSaveButton: !hasExternalSubmitGroup,\n saveButton: (\n <AddressButtonComponent\n {...{\n className: 'msc-address-select__save-continue-button',\n text: resources.saveAndContinueBtnLabel!,\n ariaLabel: resources.addressSaveButtonAriaLabel,\n onClick: onSave,\n telemetryContent: props.telemetryContent\n }}\n />\n ),\n isShowCancelButton: !hasExternalSubmitGroup,\n cancelButton: (\n <AddressButtonComponent\n {...{\n className: 'msc-address-select__cancel-button',\n text: resources.addressCancelButtonText,\n ariaLabel: resources.addressCancelButtonAriaLabel,\n onClick: onCancel,\n telemetryContent: props.telemetryContent\n }}\n />\n ),\n isMobile: isMobile\n };\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport * as React from 'react';\n\nexport interface IShipMultipleAddressesTableHeadingProps {\n selectAllRowsText?: string;\n productNumber: string;\n productName: string;\n productUnitPrice: string;\n productQuantity: string;\n clickHandler(isChecked: boolean): void;\n productImage?: string;\n productAddress?: string;\n isAllSelected: boolean;\n isMobile: boolean;\n clearSelectionButton: React.ReactNode;\n}\n\nexport interface IShipMultipleAddressesTableHeadingState {\n isChecked: boolean;\n}\n\nexport interface IShipMultipleAddressesTableShortHeading {\n productNumber: string;\n productActions: string;\n}\n\n/**\n * Ship multiple addresses table heading.\n */\nexport class ShipMultipleAddressesTableHeading extends React.PureComponent<IShipMultipleAddressesTableHeadingProps> {\n public state: IShipMultipleAddressesTableHeadingState = {\n isChecked: false\n };\n\n private readonly componentClassName: string = 'ms-table';\n\n public getOnChange = () => (event: React.ChangeEvent<HTMLInputElement>) => {\n this.setState(\n {\n isChecked: !this.state.isChecked\n },\n () => {\n this.props.clickHandler(this.state.isChecked);\n }\n );\n };\n\n public render(): JSX.Element {\n if (!this.props.isMobile) {\n return (\n <thead>\n <tr className={`${this.componentClassName}__heading-row`}>\n <th scope='col' aria-label={this.props.selectAllRowsText}>\n <label className='checkbox-container'>\n <input\n aria-label={this.props.selectAllRowsText}\n className='checkbox-input'\n type='checkbox'\n aria-checked={this.props.isAllSelected}\n checked={this.props.isAllSelected}\n onChange={this.getOnChange()}\n />\n <span className='checkmark' />\n </label>\n </th>\n <th scope='col'>{this.props.productNumber}</th>\n {<th scope='col'>{this.props.productName}</th>}\n {\n <th scope='col' style={{ textAlign: 'right' }}>\n {this.props.productUnitPrice}\n </th>\n }\n {\n <th scope='col' style={{ textAlign: 'center' }}>\n {this.props.productQuantity}\n </th>\n }\n {<th scope='col'>{this.props.productAddress}</th>}\n </tr>\n </thead>\n );\n } else {\n return (\n <thead>\n <tr className={`${this.componentClassName}__heading-row`}>\n <th scope='col' style={{ maxWidth: '100px', position: 'relative' }} aria-label={this.props.selectAllRowsText}>\n <label className='checkbox-container' style={{ paddingLeft: '25px' }}>\n <input\n aria-label={this.props.selectAllRowsText}\n className='checkbox-input'\n type='checkbox'\n aria-checked={this.props.isAllSelected}\n checked={this.props.isAllSelected}\n onChange={this.getOnChange()}\n />\n <span className='checkmark' style={{ border: '1.5px solid #2266e3' }} />\n Select all\n </label>\n\n {/* Clear Selection Button */}\n <div style={{ position: 'absolute', top: '50%', left: '65%', transform: 'translate(-50%, -50%)' }}>\n {this.props.clearSelectionButton}\n </div>\n </th>\n </tr>\n </thead>\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 React from 'react';\nimport { PriceComponent } from '@msdyn365-commerce/components';\nimport { Address, CartLine, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\nimport { ICoreContext, IImageSettings, Image } from '@msdyn365-commerce/core';\nimport { IShipMultipleAddressesLineViewModel } from '../../modules/checkout-shipping-address';\nimport { ICheckoutShippingCartLineInfo } from '../../modules/checkout-shipping-address/components';\n\nexport interface IShipMultipleAddressesLineProps extends CartLine {\n shipMultipleAddressesLine: IShipMultipleAddressesLineViewModel;\n shippingLineImage: ICheckoutShippingCartLineInfo;\n price?: number;\n context: ICoreContext;\n product?: SimpleProduct;\n imageSettings?: IImageSettings;\n quantity: number;\n moduleId: string;\n moduleTypeName: string;\n currencyCode: string | undefined;\n customerAddresses: Address[];\n error?: string;\n isMobile: boolean;\n onSelect(line: IShipMultipleAddressesLineViewModel, isChecked: boolean): void;\n onShippingAddressChange(shippingLine: CartLine, event: React.ChangeEvent<HTMLSelectElement>): void;\n resources: {\n unavailableProductErrorMessage?: string;\n outOfStockProductErrorMessage?: string;\n };\n}\n\nexport interface IShipMultipleAddressesLineViewProps {\n key?: string;\n productImage?: React.ReactNode;\n productPrice?: React.ReactNode;\n productCurrencyCode?: React.ReactNode;\n productName?: string;\n productNumber?: React.ReactNode;\n productInfo?: React.ReactNode;\n productLabel?: React.ReactNode;\n productUnitOfMeasure?: React.ReactNode;\n productQuantity?: number;\n productListId?: string;\n productAddress?: React.ReactNode;\n selectLine?: React.ReactNode;\n popUp?: JSX.Element;\n productAddressPopup?: JSX.Element | null | undefined;\n isMobile?: boolean;\n}\n\n/**\n * On Select line function.\n * @param shipMultipleAddressesLine - Ship multiple addresses line.\n * @param input - Ship multiple addresses line props.\n * @returns Set on select shipping line.\n */\nconst onSelectLineHandler = (shipMultipleAddressesLine: IShipMultipleAddressesLineViewModel, input: IShipMultipleAddressesLineProps) => (\n event: React.ChangeEvent<HTMLInputElement>\n) => {\n shipMultipleAddressesLine.isChecked = !shipMultipleAddressesLine.isChecked;\n\n input.onSelect(shipMultipleAddressesLine, event.target.checked);\n};\n\nexport const ShipMultipleAddressesLineView = (input: IShipMultipleAddressesLineProps): IShipMultipleAddressesLineViewProps | null => {\n const { customerAddresses, shipMultipleAddressesLine, shippingLineImage, product, context, onShippingAddressChange } = input;\n\n console.log('ShipMultipleAddressesLineView rendering');\n\n if (!product) {\n return null;\n }\n\n const { ItemId } = product;\n const { Quantity, ShippingAddress } = shipMultipleAddressesLine.cartLine;\n\n return {\n selectLine: (\n <label className='checkbox-container'>\n <input\n className='checkbox-input'\n type='checkbox'\n checked={shipMultipleAddressesLine.isChecked}\n aria-checked={shipMultipleAddressesLine.isChecked}\n onChange={onSelectLineHandler(shipMultipleAddressesLine, input)}\n />\n <span className='checkmark' />\n </label>\n ),\n productImage: renderProductImage(\n '',\n context,\n product.Name!,\n shippingLineImage.imageProps.fallBackSrc,\n shippingLineImage.imageProps.src\n ),\n productInfo: renderProductInfo(input),\n productPrice: renderProductPrice(input),\n productNumber: product && (\n <>\n <div>{ItemId}</div>\n {input.error !== 'NONE' ? <div>{renderProductError(input)}</div> : undefined}\n </>\n ),\n productQuantity: Quantity,\n productAddress: (\n <select\n className={'msc-address-select__current-address-dropdown'}\n onChange={e => onShippingAddressChange(shipMultipleAddressesLine.cartLine, e)}\n value={ShippingAddress?.RecordId}\n >\n {customerAddresses?.map((address: Address, index: number) => (\n <option\n key={index}\n value={address.RecordId}\n aria-label={address.FullAddress}\n className={'msc-address-select__current-address-text'}\n >\n {address.FullAddress}\n </option>\n ))}\n </select>\n )\n };\n};\n\nconst renderProductImage = (\n className: string,\n context: ICoreContext,\n heading: string,\n image?: string,\n fallbackImage?: string\n): JSX.Element | null => {\n const defaultImageSettings: IImageSettings = {\n viewports: {\n xs: { q: 'w=64&h=64&m=6', w: 0, h: 0 },\n lg: { q: 'w=64&h=64&m=6', w: 0, h: 0 },\n xl: { q: 'w=64&h=64&m=6', w: 0, h: 0 }\n },\n lazyload: true\n };\n\n return (\n <Image\n requestContext={context?.actionContext?.requestContext}\n className={className}\n altText={heading}\n title={heading}\n src={image}\n fallBackSrc={fallbackImage}\n gridSettings={context?.request?.gridSettings!}\n imageSettings={defaultImageSettings}\n loadFailureBehavior='empty'\n tabIndex={0}\n />\n );\n};\n\nconst renderProductDimensions = (props: IShipMultipleAddressesLineProps): (string | undefined)[] => {\n const { product } = props;\n if (!product || !product.Dimensions) {\n return [];\n }\n return product.Dimensions.map(dimension => {\n if (!dimension.DimensionValue || !dimension.DimensionValue.Value) {\n return undefined;\n }\n return dimension.DimensionValue.Value;\n });\n};\n\nconst renderProductInfo = (props: IShipMultipleAddressesLineProps): React.ReactNode | undefined => {\n const { product } = props;\n const name = product?.Name;\n const dimensions = renderProductDimensions(props);\n if (!product) {\n return [];\n }\n const productName = <div>{name}</div>;\n const dimensionsLine: string = dimensions.join(', ');\n return (\n <div>\n <div>{productName}</div>\n <div>{dimensionsLine}</div>\n </div>\n );\n};\n\nconst renderProductPrice = (props: IShipMultipleAddressesLineProps): React.ReactNode | undefined => {\n const { product } = props;\n\n if (!product?.Price) {\n return null;\n }\n\n return (\n <span>\n <PriceComponent\n data={{\n price: {\n CustomerContextualPrice: product.Price\n }\n }}\n context={props.context}\n id={props.moduleId}\n typeName={props.moduleTypeName}\n currencyCode={props.currencyCode}\n />\n </span>\n );\n};\n\nconst renderProductError = (props: IShipMultipleAddressesLineProps) => {\n const { error, resources } = props;\n\n if (!error) {\n return '';\n }\n\n const errorMessages = {\n OOS: resources.outOfStockProductErrorMessage,\n UNASSORTED: resources.unavailableProductErrorMessage,\n NONE: ''\n };\n\n return errorMessages[error];\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IProductRefinerHierarchy } from '@msdyn365-commerce/commerce-entities';\nimport { AttributeDataType, DisplayTemplate, ProductRefinerValue } from '@msdyn365-commerce/retail-proxy';\nimport { getPayloadObject, getTelemetryAttributes, IPayLoad } from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport { computed } from 'mobx';\nimport { observer } from 'mobx-react';\nimport * as React from 'react';\n\nimport { ProductListInventoryFilteringOptions } from '../actions';\nimport { IChoiceSummaryProps } from './choice-summary.props';\nimport { getIntegerRangeName, isMatchingRefinementCriterion, isRangeType } from './utilities';\n\ninterface IRefinerMap {\n key: string;\n value: ProductRefinerValue;\n rangeDisplayType?: number | undefined;\n}\n\n/**\n * ChoiceSummary component.\n */\n@observer\nexport default class ChoiceSummary extends React.PureComponent<IChoiceSummaryProps> {\n private readonly closeButtonGlyph: string = 'msi-close-btn';\n\n private readonly payLoad: IPayLoad;\n\n @computed get selectedRefinersMap(): IRefinerMap[] {\n let { selectedChoices } = this.props;\n const { channelInventoryConfigurationId, refinerHierarchy } = this.props;\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- app configs are of generic type\n if (this.props.context?.app.config.productListInventoryDisplay === ProductListInventoryFilteringOptions.HideOOS) {\n selectedChoices = selectedChoices.filter(choice => {\n const parent = refinerHierarchy.find(\n (hierarchy: IProductRefinerHierarchy) =>\n !!hierarchy.Values.find((value: ProductRefinerValue) => isMatchingRefinementCriterion(value, choice))\n );\n return parent && parent.RecordId !== channelInventoryConfigurationId;\n });\n }\n return selectedChoices.map((selectedRefiner: ProductRefinerValue, index) => {\n const rangeParentDisplay = refinerHierarchy.filter(p => p.RecordId === selectedRefiner.RefinerRecordId);\n return {\n key: this._getKeyForRefinerValue(selectedRefiner, index.toString()),\n value: selectedRefiner,\n // parameter to store Display Template type\n rangeDisplayType: rangeParentDisplay[0]?.DisplayTemplateValue || undefined\n } as IRefinerMap;\n });\n }\n\n constructor(props: Readonly<IChoiceSummaryProps>) {\n super(props);\n this.payLoad = getPayloadObject('click', this.props.telemetryContent!, '');\n }\n\n public render(): JSX.Element {\n const { clearAllText, label, classNames, choiceAriaLabel, closeAriaLabel } = this.props;\n const items = this.selectedRefinersMap;\n this.payLoad.contentAction.etext = clearAllText;\n const clearAllAttributes = getTelemetryAttributes(this.props.telemetryContent!, this.payLoad);\n return (\n <div className='msc-choice-summary'>\n {items.length > 0 && label && <span className='msc-choice-summary__label'>{label}</span>}\n <ul className={classnames(classNames, 'msc-choice-summary__list', 'list-unstyled')}>\n {items.map((item: IRefinerMap) => {\n this.payLoad.contentAction.etext = item.key;\n const attribute = getTelemetryAttributes(this.props.telemetryContent!, this.payLoad);\n // Get range value for Range display and integer type only (not for Integer with TextBox(4) display)\n const rangeInteger =\n item.value.DataTypeValue === AttributeDataType.Integer &&\n item.rangeDisplayType &&\n item.rangeDisplayType === DisplayTemplate.Range &&\n item.value.RefinerRecordId !== 0;\n const newIntRange = rangeInteger\n ? item.key\n : item.value.LeftValueBoundString && item.value.LeftValueBoundLocalizedString === ''\n ? item.value.LeftValueBoundString\n : (item.value.LeftValueBoundLocalizedString || item.value.LeftValueBoundLocalizedString === undefined) &&\n item.value.RefinerRecordId === 0\n ? item.key\n : item.value.LeftValueBoundString;\n return (\n <li className='msc-choice-summary__list-item' key={item.key}>\n <a\n className='msc-choice-summary__item'\n href={this.props.urlBuilder(item.value, false)}\n aria-label={`${item.value.LeftValueBoundString} ${choiceAriaLabel}`}\n onClick={this._onClick}\n role='button'\n id={item.key}\n {...attribute}\n >\n {newIntRange}\n <span\n className={`${this.closeButtonGlyph} msc-choice-summary__glyph`}\n role='button'\n aria-label={closeAriaLabel}\n />\n </a>\n </li>\n );\n })}\n </ul>\n {items.length > 0 && clearAllText && (\n <a\n href={this.props.urlBuilder({}, true)}\n className='msc-choice-summary__clear-all'\n {...clearAllAttributes}\n onClick={this._onClick}\n >\n {clearAllText}\n </a>\n )}\n </div>\n );\n }\n\n private _getKeyForRefinerValue(productRefinerValue: ProductRefinerValue, index: string): string {\n const { choiceFormat, choiceRangeValueFormat, refinerHierarchy, telemetry, refinerValues } = this.props;\n const overallFormat = choiceFormat || '{1}';\n const rangeFormat = choiceRangeValueFormat;\n let refinerName = '';\n let parent: IProductRefinerHierarchy | undefined;\n if (refinerHierarchy && refinerHierarchy.find) {\n parent = refinerHierarchy.find(\n (hierarchy: IProductRefinerHierarchy) =>\n !!hierarchy.Values.find((value: ProductRefinerValue) => isMatchingRefinementCriterion(value, productRefinerValue))\n );\n\n if (!parent) {\n telemetry.warning('[choice-summary] could not find parent of selected refiner value');\n } else {\n refinerName = parent.KeyName || '';\n }\n }\n\n let refinerValueName: string;\n if (isRangeType(productRefinerValue.DataTypeValue)) {\n refinerValueName = rangeFormat\n .replace('{0}', this._formatPrice(productRefinerValue.LeftValueBoundString, productRefinerValue.UnitText))\n .replace('{1}', this._formatPrice(productRefinerValue.RightValueBoundString, productRefinerValue.UnitText));\n } else if (productRefinerValue.RefinerRecordId === 0) {\n const filterValue = refinerValues?.Values.find(\n refiner => refiner.LeftValueBoundString === productRefinerValue.LeftValueBoundString\n );\n refinerValueName = (filterValue ? filterValue.LeftValueBoundLocalizedString : productRefinerValue.LeftValueBoundString) || '';\n } else {\n refinerValueName = productRefinerValue.LeftValueBoundLocalizedString || productRefinerValue.LeftValueBoundString || '';\n }\n\n if (refinerName === 'Rating' || refinerName === 'Price') {\n return overallFormat.replace('{0}', refinerName).replace('{1}', `${refinerValueName}`);\n }\n // Adding integer range format\n if (\n productRefinerValue.DataTypeValue === AttributeDataType.Integer &&\n parent?.DisplayTemplateValue === DisplayTemplate.Range &&\n productRefinerValue.RefinerRecordId !== 0\n ) {\n refinerValueName = getIntegerRangeName(productRefinerValue);\n return refinerValueName;\n }\n return overallFormat.replace('{0}', refinerName).replace('{1}', `${refinerValueName}_${refinerName}_${index}`);\n }\n\n private _formatPrice(amount: string | undefined, currency: string | undefined): string {\n if (!amount || !currency) {\n this.props.telemetry.trace('[choice-summary] could not format price');\n return amount || '';\n }\n let result = amount;\n\n try {\n result = this.props.context!.cultureFormatter.formatCurrency(Number(amount), currency);\n } catch (error) {\n this.props.telemetry.warning(`Failed to format price for ${result}: ${error}`);\n }\n\n return result;\n }\n\n private readonly _onClick = (e: React.MouseEvent<HTMLAnchorElement>): void => {\n e.preventDefault();\n e.stopPropagation();\n\n const target = e.currentTarget as HTMLElement;\n const clearAll = target.getAttribute('class')!.includes('choice-summary__clear-all');\n const selectedRefiner = clearAll ? undefined : this._getSelectedRefinerChoice(target);\n\n if (this.props.onChoiceClicked) {\n this.props.onChoiceClicked({\n clearAll,\n itemClicked: target,\n choiceClicked: selectedRefiner,\n nextItemToFocus: target.nextSibling as HTMLElement\n });\n }\n };\n\n private _getSelectedRefinerChoice(itemClicked: HTMLElement): ProductRefinerValue | undefined {\n const result = this.selectedRefinersMap.find(selected => itemClicked.id === selected.key);\n return (result && result.value) || undefined;\n }\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { ISliderLabel, ISliderThumbProps, Slider } from '@msdyn365-commerce-modules/utilities';\nimport debounce from 'lodash/debounce';\nimport { computed } from 'mobx';\nimport { observer } from 'mobx-react';\nimport * as React from 'react';\n\nimport { IRefineItemProps, IRefineItemState } from './refine-item';\n\ntype InputType = 'Min' | 'Max';\n\nexport type RangeRefineItemType = 'slider' | 'input';\n\n/**\n * Range refine item properties.\n */\nexport interface IRangeRefineItemProps extends IRefineItemProps {\n rangeType: RangeRefineItemType;\n minValueSliderThumbAriaLabel?: string;\n maxValueSliderThumbAriaLabel?: string;\n sliderKey?: string;\n}\n\n/**\n * Range refine item state.\n */\nexport interface IRangeRefineItemState extends IRefineItemState {\n validationErrorMin: string | undefined;\n validationErrorMax: string | undefined;\n selectedMin: string | undefined;\n selectedMax: string | undefined;\n touchedMin: boolean;\n touchedMax: boolean;\n sliderId: string;\n minValue: string | undefined;\n maxValue: string | undefined;\n labels: ISliderLabel[];\n sliderThumbs: ISliderThumbProps[];\n}\n\n/**\n * RangeRefineItem component (controlled by RefineSubmenu).\n */\n@observer\nexport default class RangeRefineItem extends React.Component<IRangeRefineItemProps, IRangeRefineItemState> {\n private readonly _formattedPriceReverseLookup: Map<string, string> = new Map();\n\n private readonly minInput: React.RefObject<HTMLInputElement>;\n\n private readonly maxInput: React.RefObject<HTMLInputElement>;\n\n @computed get currencyCode(): string {\n return this.props.productRefinerValue.UnitText || '';\n }\n\n public constructor(props: IRangeRefineItemProps) {\n super(props);\n this._onRangeUpdate = this._onRangeUpdate.bind(this);\n this._onRangeUpdateEnd = this._onRangeUpdateEnd.bind(this);\n this._handleRangeTooltipText = this._handleRangeTooltipText.bind(this);\n this._changeMin = this._changeMin.bind(this);\n this._changeMax = this._changeMax.bind(this);\n this._finishChangeMin = this._finishChangeMin.bind(this);\n this._finishChangeMax = this._finishChangeMax.bind(this);\n\n this.minInput = React.createRef<HTMLInputElement>();\n this.maxInput = React.createRef<HTMLInputElement>();\n\n const { selectedRefinementCriterion } = this.props;\n const initialMin = selectedRefinementCriterion?.LeftValueBoundString ?? '0';\n const initialMax = selectedRefinementCriterion?.RightValueBoundString;\n const sliderId = `slider_${String(this.props.parentProductRefinerHierarchy.RecordId)}_${String(\n this.props.productRefinerValue.RefinerRecordId\n )}`;\n const minValue = this.props.productRefinerValue.LeftValueBoundString;\n const maxValue = this.props.productRefinerValue.RightValueBoundString;\n const minPrice = this._formatPrice(minValue);\n const maxPrice = this._formatPrice(maxValue);\n const labels: ISliderLabel[] = this.getLabels(sliderId, minPrice, maxPrice);\n const selectedMin =\n this.props.selectedRefinementCriterion?.LeftValueBoundString ?? this.props.productRefinerValue.LeftValueBoundString ?? '0';\n const selectedMax =\n this.props.selectedRefinementCriterion?.RightValueBoundString ??\n this.props.productRefinerValue.RightValueBoundString ??\n maxValue;\n const selectedMinPrice = this._formatPrice(selectedMin);\n const selectedMaxPrice = this._formatPrice(selectedMax);\n const sliderKeyString = this.props.sliderKey ? `_${String(this.props.sliderKey)}` : '';\n const sliderThumbs: ISliderThumbProps[] = this.getSliderThumbs(\n sliderId,\n sliderKeyString,\n selectedMin,\n selectedMinPrice,\n selectedMax,\n selectedMaxPrice,\n maxPrice\n );\n this.state = {\n isChecked: false,\n validationErrorMin: undefined,\n validationErrorMax: undefined,\n selectedMin: initialMin,\n selectedMax: initialMax,\n touchedMin: false,\n touchedMax: false,\n sliderId,\n minValue,\n maxValue,\n labels,\n sliderThumbs\n };\n }\n\n public shouldComponentUpdate(nextProps: IRangeRefineItemProps, nextState: IRangeRefineItemState): boolean {\n if (this.state === nextState && this.props === nextProps) {\n return false;\n }\n return true;\n }\n\n public componentDidUpdate(previousProps: IRangeRefineItemProps): void {\n if (previousProps !== this.props) {\n this.updateSliderProps();\n }\n }\n\n public render(): JSX.Element | undefined {\n const { productRefinerValue, parentProductRefinerHierarchy, refineItemCommonProps } = this.props;\n\n if (!productRefinerValue || !parentProductRefinerHierarchy) {\n refineItemCommonProps.telemetry.error(\n 'Cannot render refine value range without productRefinerValue and parentProductRefinerHierarchy'\n );\n return undefined;\n }\n\n if (this.props.rangeType === 'input') {\n return this._renderInputFields();\n }\n\n return this._renderSlider();\n }\n\n /**\n * Function to update slider props.\n */\n private updateSliderProps(): void {\n const sliderId = `slider_${String(this.props.parentProductRefinerHierarchy.RecordId)}_${String(\n this.props.productRefinerValue.RefinerRecordId\n )}`;\n const minValue = this.props.productRefinerValue.LeftValueBoundString;\n const maxValue = this.props.productRefinerValue.RightValueBoundString;\n const minPrice = this._formatPrice(minValue);\n const maxPrice = this._formatPrice(maxValue);\n const labels: ISliderLabel[] = this.getLabels(sliderId, minPrice, maxPrice);\n const selectedMin =\n this.props.selectedRefinementCriterion?.LeftValueBoundString ?? this.props.productRefinerValue.LeftValueBoundString ?? '0';\n const selectedMax =\n this.props.selectedRefinementCriterion?.RightValueBoundString ??\n this.props.productRefinerValue.RightValueBoundString ??\n maxValue;\n const selectedMinPrice = this._formatPrice(selectedMin);\n const selectedMaxPrice = this._formatPrice(selectedMax);\n const sliderKeyString = this.props.sliderKey ? `_${String(this.props.sliderKey)}` : '';\n const sliderThumbs: ISliderThumbProps[] = this.getSliderThumbs(\n sliderId,\n sliderKeyString,\n selectedMin,\n selectedMinPrice,\n selectedMax,\n selectedMaxPrice,\n maxPrice\n );\n this.setState({ sliderId, minValue, maxValue, labels, sliderThumbs });\n }\n\n /**\n * Function to create the labels for slider.\n * @param sliderId - Slider element id for the DOM.\n * @param minPrice - Slider min value.\n * @param maxPrice - Slider max value.\n * @returns Array labels.\n */\n private readonly getLabels = (sliderId: string, minPrice: string, maxPrice: string): ISliderLabel[] => {\n return [\n {\n labelId: `${sliderId}_start`,\n labelString: `${minPrice}`,\n labelPositioning: 'start'\n },\n {\n labelId: `${sliderId}_end`,\n labelString: `${maxPrice}`,\n labelPositioning: 'end'\n }\n ];\n };\n\n /**\n * Function to create the slider thumbs for slider.\n * @param sliderId - Slider element id for the DOM.\n * @param sliderKey - Unique key for slider.\n * @param selectedMin - Slider selected min value.\n * @param selectedMinPrice - Slider selected min price.\n * @param selectedMax - Slider selected max value.\n * @param selectedMaxPrice - Slider selected max price..\n * @param maxPrice - Slider max price..\n * @returns Slider Thumb Props.\n */\n private readonly getSliderThumbs = (\n sliderId: string,\n sliderKey: string,\n selectedMin: string,\n selectedMinPrice: string,\n selectedMax: string | undefined,\n selectedMaxPrice: string,\n maxPrice: string\n ): ISliderThumbProps[] => {\n const sliderThumbDefaultValue = 0;\n return [\n {\n id: `${sliderId}${sliderKey}_slider_thumb_start`,\n value: (selectedMin && Number(selectedMin)) || sliderThumbDefaultValue,\n ariaLabel: `${this.props.minValueSliderThumbAriaLabel ?? ''} ${this.currencyCode}`,\n ariaValueText: `${selectedMinPrice}`\n },\n {\n id: `${sliderId}${sliderKey}_slider_thumb_end`,\n value: Number(selectedMax) || Number(maxPrice),\n ariaLabel: `${this.props.maxValueSliderThumbAriaLabel ?? ''} ${this.currencyCode}`,\n ariaValueText: `${selectedMaxPrice}`\n }\n ];\n };\n\n private _renderInputFields(): JSX.Element | undefined {\n const { isDisabled, parentProductRefinerHierarchy, refineItemCommonProps } = this.props;\n const { selectedMin, selectedMax, touchedMin, touchedMax, validationErrorMin, validationErrorMax } = this.state;\n\n const rangeAriaLabel = (refineItemCommonProps.rangeNameFormat || '{0}').replace('{0}', parentProductRefinerHierarchy.KeyName || '');\n const formAttrs = {\n 'aria-label': rangeAriaLabel,\n 'aria-disabled': isDisabled\n };\n\n // To enable price formatting of selected fields, this is the approach:\n // initial value: min=0 formatted as price, max=undefined\n // onFocus/onChange: convert to number (unformat) and mark as touched to indicate value is being edited\n // onBlur: validate and format entered value as price\n const minInputClassName = `ms-refine-submenu__input-range refine-submenu__input-range-min ${\n validationErrorMin ? 'refine-submenu__input-range--error' : ''\n }`;\n const maxInputClassName = `ms-refine-submenu__input-range refine-submenu__input-range-max ${\n validationErrorMax ? 'refine-submenu__input-range--error' : ''\n }`;\n const minLabelClassName = 'ms-refine-submenu__input-range-label refine-submenu__input-range-label-min';\n const maxLabelClassName = 'ms-refine-submenu__input-range-label refine-submenu__input-range-label-max';\n const formattedSelectedMin = this._getFormattedSelectedValue(selectedMin, touchedMin, validationErrorMin);\n const formattedSelectedMax = this._getFormattedSelectedValue(selectedMax, touchedMax, validationErrorMax);\n return (\n <form className='ms-refine-submenu__input-range-refiner' {...formAttrs}>\n <label className={minLabelClassName}>\n {refineItemCommonProps.minLabel}\n <input\n className={minInputClassName}\n onChange={this._changeMin}\n onFocus={this._changeMin}\n onBlur={this._finishChangeMin}\n value={formattedSelectedMin}\n ref={this.minInput}\n />\n </label>\n <label className={maxLabelClassName}>\n {refineItemCommonProps.maxLabel}\n <input\n className={maxInputClassName}\n placeholder={formattedSelectedMax ? undefined : refineItemCommonProps.placeholderTextMax}\n onChange={this._changeMax}\n onFocus={this._changeMax}\n onBlur={this._finishChangeMax}\n value={formattedSelectedMax}\n ref={this.maxInput}\n />\n </label>\n {validationErrorMin && (\n <span className='ms-refine-submenu__input-range-error-text refine-submenu__input-range-min-error-text'>\n {validationErrorMin}\n </span>\n )}\n {validationErrorMax && validationErrorMin !== validationErrorMax && (\n <span className='ms-refine-submenu__input-range-error-text refine-submenu__input-range-max-error-text'>\n {validationErrorMax}\n </span>\n )}\n </form>\n );\n }\n\n private _renderSlider(): JSX.Element | undefined {\n const { isDisabled, sliderKey } = this.props;\n const ariaAttributes = {\n 'aria-disabled': isDisabled\n };\n\n return (\n <Slider\n className='ms-refine-submenu__range-refiner'\n key={this.state.sliderId}\n sliderKey={sliderKey}\n id={this.state.sliderId}\n inForm={false}\n min={(this.state.minValue && Number(this.state.minValue)) || undefined}\n max={(this.state.maxValue && Number(this.state.maxValue)) || undefined}\n step={1}\n orientation='horizontal'\n labels={this.state.labels}\n showLabels\n showTooltip\n sliderThumbs={this.state.sliderThumbs}\n onChangeEnd={this._onRangeUpdateEnd}\n onChange={debounce(this._onRangeUpdate, 500)}\n handleTooltipText={this._handleRangeTooltipText}\n {...ariaAttributes}\n />\n );\n }\n\n private _changeMin(event: React.FocusEvent<HTMLInputElement>): void {\n this._changeValue(event, 'Min');\n }\n\n private _changeMax(event: React.FocusEvent<HTMLInputElement>): void {\n this._changeValue(event, 'Max');\n }\n\n private _changeValue(event: React.FocusEvent<HTMLInputElement>, inputType: InputType): void {\n const selectedKey = `selected${inputType}`;\n const touchedKey = `touched${inputType}`;\n this.setState({\n [selectedKey]: this._getInputWithoutFormatting(event.currentTarget.value),\n [touchedKey]: true\n });\n }\n\n private _finishChangeMin(event: React.FocusEvent<HTMLInputElement>): boolean {\n const selectedMinValue = this._getInputWithoutFormatting(event.currentTarget.value);\n this.setState({\n selectedMin: selectedMinValue,\n minTouched: false\n });\n const minInput = Number(selectedMinValue);\n const {\n onToggle,\n parentProductRefinerHierarchy,\n productRefinerValue,\n refineItemCommonProps,\n selectedRefinementCriterion\n } = this.props;\n const max = (selectedRefinementCriterion && selectedRefinementCriterion.RightValueBoundString) || undefined;\n\n const maxNum = max ? Number(max) : undefined;\n\n if (isNaN(minInput)) {\n this.setState({ validationErrorMin: refineItemCommonProps.validationErrorNaN });\n this._focus('Min');\n return false;\n }\n\n if (this._validateRange(minInput, maxNum)) {\n onToggle({\n parentProductRefinerHierarchy,\n productRefinerValue,\n isSelecting: true,\n rangeStart: minInput,\n rangeEnd: maxNum\n });\n return true;\n }\n this._focus('Min');\n\n return false;\n }\n\n private _finishChangeMax(event: React.FocusEvent<HTMLInputElement>): boolean {\n const selectedMaxValue = this._getInputWithoutFormatting(event.currentTarget.value);\n this.setState({\n selectedMax: selectedMaxValue,\n maxTouched: false\n });\n const maxInput = Number(selectedMaxValue);\n const {\n onToggle,\n parentProductRefinerHierarchy,\n productRefinerValue,\n refineItemCommonProps,\n selectedRefinementCriterion\n } = this.props;\n const min = (selectedRefinementCriterion && selectedRefinementCriterion.LeftValueBoundString) || '0';\n\n const minNum = Number(min);\n\n if (isNaN(maxInput)) {\n this.setState({ validationErrorMax: refineItemCommonProps.validationErrorNaN });\n this._focus('Max');\n return false;\n }\n\n if (this._validateRange(minNum, maxInput)) {\n if (productRefinerValue) {\n onToggle({\n parentProductRefinerHierarchy,\n productRefinerValue,\n isSelecting: true,\n rangeStart: minNum,\n rangeEnd: maxInput\n });\n } else {\n this._focus('Max');\n }\n return true;\n }\n\n return false;\n }\n\n private _focus(inputType: InputType): void {\n const ref = inputType === 'Max' ? this.maxInput : this.minInput;\n\n setTimeout(() => {\n if (ref && ref.current) {\n ref.current.focus();\n }\n }, 50);\n }\n\n private _getFormattedSelectedValue(\n selected: string | undefined,\n touched: boolean,\n validationError: string | undefined\n ): string | undefined {\n if (touched || validationError || selected === undefined) {\n return selected;\n }\n return this._formatPrice(selected);\n }\n\n private _validateRange(min: number, max: number | undefined): boolean {\n const { refineItemCommonProps } = this.props;\n if (max === undefined) {\n return true;\n }\n\n if (min > max) {\n this.setState({\n validationErrorMin: refineItemCommonProps.validationErrorRange,\n validationErrorMax: refineItemCommonProps.validationErrorRange\n });\n return false;\n }\n\n return true;\n }\n\n private _formatPrice(amount: string | undefined): string {\n if (this.props.productRefinerValue.RefinerRecordId === 0) {\n const result = this.props.context.cultureFormatter.formatCurrency(Number(amount), this.currencyCode);\n return result;\n }\n return amount || '';\n }\n\n private _getInputWithoutFormatting(input: string): string {\n // First try to cast raw input to a number\n const inputAsNum = Number(input);\n if (!isNaN(inputAsNum)) {\n return input;\n }\n\n // Otherwise try a reverse lookup and fall back to the raw input if all else fails\n const reverseLookupResult = this._formattedPriceReverseLookup.get(input);\n return reverseLookupResult || input;\n }\n\n // NOTE: Fix types once Shared Components build pipeline bug fixed\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private _onRangeUpdate(sliderChangeNotification: any): void {\n // Need to filter out mousemove events as these cause errors after the menu updates and slider re-renders\n if (sliderChangeNotification.eventType !== 'mousemove') {\n const { onToggle, parentProductRefinerHierarchy, productRefinerValue } = this.props;\n if (productRefinerValue && sliderChangeNotification) {\n onToggle({\n parentProductRefinerHierarchy,\n productRefinerValue,\n isSelecting: true,\n rangeStart: sliderChangeNotification.firstThumbValue,\n rangeEnd: sliderChangeNotification.secondThumbValue\n });\n\n this._focusOnSliderThumb(sliderChangeNotification);\n }\n }\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private _onRangeUpdateEnd(sliderChangeNotification: any): void {\n const { onToggle, parentProductRefinerHierarchy, productRefinerValue } = this.props;\n if (productRefinerValue && sliderChangeNotification) {\n onToggle({\n parentProductRefinerHierarchy,\n productRefinerValue,\n isSelecting: true,\n rangeStart: sliderChangeNotification.firstThumbValue,\n rangeEnd: sliderChangeNotification.secondThumbValue\n });\n\n this._focusOnSliderThumb(sliderChangeNotification);\n }\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private _focusOnSliderThumb(sliderChangeNotification: any): void {\n if (sliderChangeNotification.id) {\n const element = document.getElementById(`${sliderChangeNotification.id}range`);\n if (element) {\n setTimeout(() => {\n element.focus();\n }, 0);\n }\n }\n }\n\n private _handleRangeTooltipText(tooltip: number): string {\n return this._formatPrice(`${tooltip}`);\n }\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IProductRefinerHierarchy } from '@msdyn365-commerce/commerce-entities';\nimport { RatingComponent, SwatchComponent } from '@msdyn365-commerce/components';\nimport { IAny, ICoreContext, IGeneric } from '@msdyn365-commerce/core';\nimport {\n AttributeDataType,\n DisplayTemplate,\n ProductRefinerSource,\n ProductRefinerValue,\n RefinerType\n} from '@msdyn365-commerce/retail-proxy';\nimport { checkIfShouldDisplayAsSwatch, DimensionTypes, IDimensionsApp, StringExtensions } from '@msdyn365-commerce-modules/retail-actions';\nimport { format, getPayloadObject, getTelemetryAttributes, IPayLoad, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport * as React from 'react';\n\nimport { IRefineItemCommonProps } from './refine-item.props.common';\nimport { IRefineItemToggleNotification } from './refine-item-toggle-notification';\nimport { getIntegerRangeName, isSingleSelectRangeTypeIntegerSelected } from './utilities';\n\n/**\n * RefineItem properties.\n */\nexport interface IRefineItemProps {\n parentProductRefinerHierarchy: IProductRefinerHierarchy;\n productRefinerValue: ProductRefinerValue;\n selectedRefinementCriterion: ProductRefinerValue | undefined;\n selectedRefinerValues?: ProductRefinerValue[];\n refineItemCommonProps: IRefineItemCommonProps;\n isDisabled: boolean;\n context: ICoreContext<IGeneric<IAny>>;\n moduleId: string;\n moduleTypeName: string;\n index?: number;\n productCountAriaLabel?: string;\n singleProductCountAriaLabel?: string;\n refineItemAriaLabel?: string;\n refineItemsAriaLabel?: string;\n isMobileView?: boolean;\n\n /**\n * The telemetry content\n */\n telemetryContent?: ITelemetryContent;\n onToggle(notfication: Readonly<IRefineItemToggleNotification>): void;\n urlBuilder(refiner: IRefineItemToggleNotification): string;\n}\n\n/**\n * Refine item state.\n */\nexport interface IRefineItemState extends React.ComponentState {\n isChecked: boolean;\n renderingError?: object;\n}\n\n/**\n * Single-select and multi-select refine item component (controlled by RefineSubmenu).\n */\nexport default class RefineItem extends React.Component<IRefineItemProps, IRefineItemState> {\n private readonly anchorType: React.RefObject<HTMLAnchorElement>;\n\n private readonly payLoad: IPayLoad;\n\n public constructor(props: IRefineItemProps) {\n super(props);\n this._onClick = this._onClick.bind(this);\n this.state = {\n isChecked: !!this.props.selectedRefinementCriterion\n };\n this.anchorType = React.createRef();\n this.payLoad = getPayloadObject('click', this.props.telemetryContent!, '');\n }\n\n public shouldComponentUpdate(nextProps: IRefineItemProps, nextState: IRefineItemState): boolean {\n if (this.state === nextState && this.props === nextProps) {\n return false;\n }\n return true;\n }\n\n public render(): JSX.Element | undefined {\n const {\n isDisabled,\n refineItemCommonProps,\n parentProductRefinerHierarchy,\n productRefinerValue,\n selectedRefinementCriterion,\n productCountAriaLabel,\n singleProductCountAriaLabel,\n index,\n children,\n onToggle,\n context,\n telemetryContent,\n refineItemAriaLabel,\n refineItemsAriaLabel,\n ...attrs\n } = this.props;\n if (!productRefinerValue) {\n refineItemCommonProps.telemetry.error('[refine-item] Cannot render refineItem without productRefinerValue');\n return undefined;\n }\n if (!productRefinerValue.LeftValueBoundString) {\n refineItemCommonProps.telemetry.warning(\n `[refine-item] RefineItem without LeftValueBoundString: ${JSON.stringify(productRefinerValue)}`\n );\n }\n const isSingleSelect = parentProductRefinerHierarchy.RefinerTypeValue === RefinerType.SingleSelect;\n let itemTypeClassName = isSingleSelect ? 'single-select' : 'multi-select';\n itemTypeClassName = `ms-refine-submenu-item ${itemTypeClassName}`;\n const inputType = isSingleSelect ? 'radio' : 'checkbox';\n const isChecked = !!selectedRefinementCriterion;\n itemTypeClassName = isChecked ? `${itemTypeClassName}-checked` : itemTypeClassName;\n if (parentProductRefinerHierarchy.SourceValue === ProductRefinerSource.Rating) {\n return this._renderRating(\n productRefinerValue,\n parentProductRefinerHierarchy,\n isChecked,\n context,\n index,\n telemetryContent,\n productCountAriaLabel,\n singleProductCountAriaLabel\n );\n }\n this.payLoad.contentAction.etext = productRefinerValue.LeftValueBoundLocalizedString ?? productRefinerValue.LeftValueBoundString;\n const attribute = getTelemetryAttributes(telemetryContent!, this.payLoad);\n // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing -- Replace with actual value for empty string.\n const productText = productRefinerValue.LeftValueBoundLocalizedString || productRefinerValue.LeftValueBoundString || '';\n // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing -- Replace with actual value for empty string.\n const productCount = productRefinerValue.Count || 0;\n let refineMenuItemAriaLabel;\n if (productCount === 1) {\n refineMenuItemAriaLabel = refineItemAriaLabel\n ? format(refineItemAriaLabel, parentProductRefinerHierarchy.KeyName, productText)\n : '';\n } else {\n refineMenuItemAriaLabel = refineItemsAriaLabel\n ? format(refineItemsAriaLabel, parentProductRefinerHierarchy.KeyName, productText, productCount)\n : '';\n }\n\n const dimensionType = (this.props.parentProductRefinerHierarchy.KeyName?.toLocaleLowerCase() ?? '') as DimensionTypes;\n const shouldDisplayAsSwatch = this._getShouldDisplayAsSwatch(dimensionType);\n\n let className = 'ms-refine-submenu-item';\n if (shouldDisplayAsSwatch) {\n className = classnames(className, `ms-refine-submenu-item__dimension__${dimensionType}`);\n }\n\n // If the swatch has no color or image specified, it should be displayed as text.\n // We don't use swatch logic to display the number of the results found together with the text.\n const hasColor = !StringExtensions.isNullOrWhitespace(productRefinerValue.SwatchColorHexCode);\n const hasImage = !StringExtensions.isNullOrWhitespace(productRefinerValue.SwatchImageUrl);\n const hasContentSwatch = hasColor || hasImage;\n if (\n parentProductRefinerHierarchy.DataTypeValue === AttributeDataType.Integer &&\n parentProductRefinerHierarchy.DisplayTemplateValue === DisplayTemplate.Range\n ) {\n const rangeValue = getIntegerRangeName(productRefinerValue);\n return (\n <li className={className} id={`${parentProductRefinerHierarchy.KeyName!}_${index}`}>\n <a\n key={selectedRefinementCriterion ? 'true' : 'false'}\n ref={this.anchorType}\n href={this._getRefinerUrl()}\n tabIndex={hasColor ? -1 : 0}\n onClick={this._onClick}\n className={\n isSingleSelectRangeTypeIntegerSelected(selectedRefinementCriterion!, productRefinerValue)\n ? `ms-refine-submenu-item ${itemTypeClassName}-selected`\n : `ms-refine-submenu-item ${itemTypeClassName}-range`\n }\n role='radio'\n aria-label={refineMenuItemAriaLabel}\n aria-checked={!!selectedRefinementCriterion}\n {...attribute}\n {...attrs}\n >\n <span className='ms-refine-submenu-item__label' aria-hidden='true'>\n {rangeValue}\n {productRefinerValue.Count !== undefined && ` (${productRefinerValue.Count})`}\n </span>\n </a>\n </li>\n );\n } else {\n return (\n <li className={className} id={`${parentProductRefinerHierarchy.KeyName!}_${index}`}>\n <a\n key={selectedRefinementCriterion ? 'true' : 'false'}\n ref={this.anchorType}\n href={this._getRefinerUrl()}\n tabIndex={hasColor ? -1 : 0}\n onClick={this._onClick}\n className={itemTypeClassName}\n role={inputType}\n aria-label={refineMenuItemAriaLabel}\n aria-checked={!!selectedRefinementCriterion}\n {...attribute}\n {...attrs}\n >\n {hasContentSwatch && shouldDisplayAsSwatch && this._renderSwatch(dimensionType)}\n <span className='ms-refine-submenu-item__label' aria-hidden='true'>\n {/* eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing -- Replace with actual value for empty string. */}\n {productRefinerValue.LeftValueBoundLocalizedString || productRefinerValue.LeftValueBoundString}\n {productRefinerValue.Count !== undefined && ` (${productRefinerValue.Count})`}\n </span>\n </a>\n </li>\n );\n }\n }\n\n private _getShouldDisplayAsSwatch(dimensionType: DimensionTypes) {\n const shouldDisplayAsSwatch = checkIfShouldDisplayAsSwatch(dimensionType, this.props.context as ICoreContext<IDimensionsApp>);\n return shouldDisplayAsSwatch;\n }\n\n private _renderSwatch(dimensionType: DimensionTypes): JSX.Element | null {\n const productRefinerValue = this.props.productRefinerValue;\n\n // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing -- Replace with actual value for empty string.\n const text = productRefinerValue.LeftValueBoundLocalizedString || productRefinerValue.LeftValueBoundString || '';\n const swatchItems = [\n {\n itemId: `${productRefinerValue.RefinerRecordId ?? ''}-${dimensionType}-${text}`,\n value: text,\n dimensionType,\n colorHexCode: productRefinerValue.SwatchColorHexCode,\n imageUrl: productRefinerValue.SwatchImageUrl\n }\n ];\n\n return (\n <SwatchComponent\n className='ms-refine-submenu-item__swatch'\n apiSettings={this.props.context.request.apiSettings}\n list={swatchItems}\n isSelectionEnabled={false}\n isRefineItem\n />\n );\n }\n\n private _getRefinerUrl(): string {\n const { urlBuilder, parentProductRefinerHierarchy, productRefinerValue, selectedRefinementCriterion } = this.props;\n\n if (productRefinerValue) {\n return urlBuilder({\n parentProductRefinerHierarchy,\n productRefinerValue,\n isSelecting: !selectedRefinementCriterion\n });\n }\n\n return '';\n }\n\n private readonly _onClick = (e: React.MouseEvent<HTMLAnchorElement | HTMLInputElement>): void => {\n e.preventDefault();\n\n const { parentProductRefinerHierarchy, productRefinerValue, selectedRefinementCriterion } = this.props;\n if (productRefinerValue) {\n this.props.onToggle({\n parentProductRefinerHierarchy,\n productRefinerValue,\n isSelecting: !selectedRefinementCriterion\n });\n\n setTimeout(() => {\n this.anchorType.current && this.anchorType.current.focus();\n }, 0);\n }\n };\n\n private _renderRating(\n productRefinerValue: ProductRefinerValue,\n parentProductRefinerHierarchy: IProductRefinerHierarchy,\n isChecked: boolean,\n context: ICoreContext,\n index?: number,\n telemetryContent?: ITelemetryContent,\n ratingUserCountAriaLabel?: string,\n ratingSingleUserCountAriaLabel?: string\n ): JSX.Element | undefined {\n if (productRefinerValue.LeftValueBoundString) {\n this.payLoad.contentAction.etext = productRefinerValue.LeftValueBoundLocalizedString;\n const attribute = getTelemetryAttributes(telemetryContent!, this.payLoad);\n const refinerRating = Number.parseInt(productRefinerValue.LeftValueBoundString, 10);\n const ratingRefiner = this.props.selectedRefinerValues?.find(\n value => value.DataTypeValue === productRefinerValue.DataTypeValue\n );\n // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing -- Replace with actual value for empty string.\n const selectedRating = Number.parseInt(ratingRefiner?.LeftValueBoundString || '0', 10);\n const defaultChkProductCount = 1;\n let ratingComponentClass: string = 'ms-rating-component';\n if (refinerRating > selectedRating) {\n ratingComponentClass = `${ratingComponentClass}__up`;\n } else if (refinerRating < selectedRating) {\n ratingComponentClass = `${ratingComponentClass}__down`;\n } else {\n ratingComponentClass = `${ratingComponentClass}__current`;\n }\n const productCountAriaLabelValue =\n productRefinerValue.Count !== undefined && productRefinerValue.Count === defaultChkProductCount\n ? ratingSingleUserCountAriaLabel && format(ratingSingleUserCountAriaLabel, productRefinerValue.Count)\n : ratingUserCountAriaLabel && format(ratingUserCountAriaLabel, productRefinerValue.Count);\n return (\n <li\n className='ms-refine-submenu-item ms-refine-submenu-item__rating'\n role={!this.props.isMobileView ? 'presentation' : undefined}\n id={`${parentProductRefinerHierarchy.KeyName!}_${index!}`}\n >\n <a\n href={this._getRefinerUrl()}\n role='option'\n aria-selected={isChecked}\n aria-label={`${parentProductRefinerHierarchy.KeyName!}_${productRefinerValue.LeftValueBoundLocalizedString!}\n ${productCountAriaLabelValue!}`}\n onClick={this._onClick}\n {...attribute}\n >\n <RatingComponent\n className={ratingComponentClass}\n avgRating={refinerRating}\n ratingCount={productRefinerValue.LeftValueBoundLocalizedString ?? productRefinerValue.LeftValueBoundString}\n hideCount={false}\n readOnly\n ariaLabel=''\n context={context}\n id={this.props.moduleId}\n typeName={this.props.moduleTypeName}\n data={{}}\n />\n <span className='refine-submenu-item__rating' aria-hidden={this.props.isMobileView ? 'true' : undefined}>\n {productRefinerValue.Count !== undefined && `(${productRefinerValue.Count})`}\n </span>\n </a>\n </li>\n );\n }\n return undefined;\n }\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IProductRefinerHierarchy } from '@msdyn365-commerce/commerce-entities';\nimport { IAny, ICoreContext, IGeneric } from '@msdyn365-commerce/core';\nimport {\n AttributeDataType,\n DisplayTemplate,\n ProductRefinerSource,\n ProductRefinerValue,\n RefinerType\n} from '@msdyn365-commerce/retail-proxy';\nimport { Button, Collapse, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport * as React from 'react';\n\nimport RangeRefineItem, { RangeRefineItemType } from './range-refine-item';\nimport RefineItem from './refine-item';\nimport { IRefineItemCommonProps } from './refine-item.props.common';\nimport { IRefineItemToggleNotification } from './refine-item-toggle-notification';\nimport { findMatchingRefinementCriterion, isRangeTypeForInteger } from './utilities';\nimport RangeRefineItemInput from './range-refine-item-input';\n\n/**\n * Properties associated with the RefineSubmenu component.\n */\nexport interface IRefineSubmenuProps {\n tempRangeTypeTODO: RangeRefineItemType;\n minValueSliderThumbAriaLabel?: string;\n maxValueSliderThumbAriaLabel?: string;\n productRefinerHierarchy: IProductRefinerHierarchy;\n selectedRefinerValues: ProductRefinerValue[];\n refineItemCommonProps: IRefineItemCommonProps;\n isDisabled: boolean;\n isExpandedOnInitialLoad: boolean;\n context: ICoreContext<IGeneric<IAny>>;\n moduleId: string;\n moduleTypeName: string;\n productCountAriaLabel?: string;\n singleProductCountAriaLabel?: string;\n refineItemAriaLabel?: string;\n refineItemsAriaLabel?: string;\n isMobile?: boolean;\n\n /**\n * The telemetry content\n */\n telemetryContent?: ITelemetryContent;\n onUpdateRefiners(notfication: Readonly<IRefineItemToggleNotification>): void;\n urlBuilder(refiner: IRefineItemToggleNotification): string;\n}\n\n/**\n * Refine submenu state.\n */\nexport interface IRefineSubmenuState extends React.ComponentState {\n expanded: boolean;\n}\n\n/**\n *\n * The RefineSubmenu component renders the submenu category and child items.\n * This computed observes the stateful category hierarchy object.\n * @extends {React.PureComponent<IRefineSubmenuProps>}\n */\nclass RefineSubmenu extends React.Component<IRefineSubmenuProps, IRefineSubmenuState> {\n constructor(props: IRefineSubmenuProps) {\n super(props);\n\n this._onToggleItem = this._onToggleItem.bind(this);\n this._onToggleSubmenu = this._onToggleSubmenu.bind(this);\n\n const isExpanded = this.props.isExpandedOnInitialLoad;\n\n this.state = {\n expanded: isExpanded\n };\n }\n\n public shouldComponentUpdate(nextProps: IRefineSubmenuProps, nextState: IRefineSubmenuState): boolean {\n if (this.state === nextState && this.props === nextProps) {\n return false;\n }\n return true;\n }\n\n public render(): JSX.Element | null {\n const { productRefinerHierarchy, refineItemCommonProps } = this.props;\n\n if (!productRefinerHierarchy) {\n refineItemCommonProps.telemetry.error('Cannot render submenu without refiner hierarchy data');\n }\n\n if (productRefinerHierarchy.SourceValue === ProductRefinerSource.Rating && this.props.context.app.config.hideRating) {\n return null;\n }\n\n const className = classnames(\n 'ms-refine-submenu',\n 'list-group',\n productRefinerHierarchy.KeyName // Deprecated because of the localization issues. Leaving for backward compatibility reasons.\n );\n\n return (\n <div className={className}>\n <Button\n className={this.state.expanded ? 'ms-refine-submenu__toggle_expanded' : 'ms-refine-submenu__toggle_collapsed'}\n aria-label={productRefinerHierarchy.KeyName}\n onClick={this._onToggleSubmenu}\n aria-expanded={this.state.expanded}\n >\n {productRefinerHierarchy.KeyName}\n </Button>\n <Collapse isOpen={this.state.expanded} timeout={350}>\n {this._renderChildItems(productRefinerHierarchy)}\n </Collapse>\n </div>\n );\n }\n\n private _renderChildItems(productRefinerHierarchy: IProductRefinerHierarchy): JSX.Element | null {\n if (\n productRefinerHierarchy.DataTypeValue === AttributeDataType.Integer &&\n productRefinerHierarchy.DisplayTemplateValue === DisplayTemplate.Range\n ) {\n return this._renderSingleMultiSelect(productRefinerHierarchy);\n }\n // Check if is of integer range type\n if (isRangeTypeForInteger(productRefinerHierarchy.DataTypeValue)) {\n return this._renderRange(productRefinerHierarchy);\n }\n return this._renderSingleMultiSelect(productRefinerHierarchy);\n }\n\n private _renderSingleMultiSelect(productRefinerHierarchy: IProductRefinerHierarchy): JSX.Element | null {\n const {\n isDisabled,\n refineItemCommonProps,\n selectedRefinerValues,\n context,\n productCountAriaLabel,\n singleProductCountAriaLabel,\n refineItemAriaLabel,\n refineItemsAriaLabel,\n isMobile\n } = this.props;\n const isSingleSelect =\n productRefinerHierarchy.RefinerTypeValue === RefinerType.SingleSelect &&\n productRefinerHierarchy.SourceValue === ProductRefinerSource.Rating;\n const role = isSingleSelect ? { role: 'listbox' } : undefined;\n let selectedRefinementCriterion: ProductRefinerValue | undefined = {};\n const refinerValuesList = productRefinerHierarchy.Values || [];\n const listItems = refinerValuesList.map((child: ProductRefinerValue, index: number) => {\n if (!child) {\n refineItemCommonProps.telemetry.error(\n `[refine-submenu] Could not render refine item for refiner ${productRefinerHierarchy.RecordId} (${productRefinerHierarchy.KeyName})`\n );\n return null;\n }\n\n selectedRefinementCriterion = findMatchingRefinementCriterion(child, selectedRefinerValues);\n return (\n <RefineItem\n parentProductRefinerHierarchy={productRefinerHierarchy}\n productRefinerValue={child}\n selectedRefinementCriterion={selectedRefinementCriterion}\n selectedRefinerValues={selectedRefinerValues.filter(selectedValue =>\n refinerValuesList.find(value => value.RefinerRecordId === selectedValue.RefinerRecordId)\n )}\n refineItemCommonProps={refineItemCommonProps}\n onToggle={this._onToggleItem}\n urlBuilder={this.props.urlBuilder}\n isDisabled={isDisabled}\n key={index}\n index={index}\n context={context}\n moduleId={this.props.moduleId}\n moduleTypeName={this.props.moduleTypeName}\n telemetryContent={this.props.telemetryContent}\n productCountAriaLabel={productCountAriaLabel}\n refineItemAriaLabel={refineItemAriaLabel}\n refineItemsAriaLabel={refineItemsAriaLabel}\n singleProductCountAriaLabel={singleProductCountAriaLabel}\n isMobileView={isMobile}\n />\n );\n });\n return (\n <ul\n className={`ms-refine-submenu__list ${productRefinerHierarchy.KeyName}`}\n {...role}\n aria-label={productRefinerHierarchy.KeyName}\n >\n {listItems}\n {productRefinerHierarchy.DataTypeValue === AttributeDataType.Integer &&\n productRefinerHierarchy.DisplayTemplateValue === DisplayTemplate.Range && (\n <RangeRefineItemInput\n parentProductRefinerHierarchy={productRefinerHierarchy}\n selectedRefinementCriterion={selectedRefinementCriterion}\n refineItemCommonProps={refineItemCommonProps}\n onToggle={this._onToggleItem}\n isDisabled={isDisabled}\n rangeType={'input'}\n key={productRefinerHierarchy.KeyName}\n />\n )}\n </ul>\n );\n }\n\n private _getRangeType(productRefinerHierarchy: IProductRefinerHierarchy): 'input' | 'slider' {\n if (\n productRefinerHierarchy.DisplayTemplateValue === DisplayTemplate.Range ||\n productRefinerHierarchy.DisplayTemplateValue === DisplayTemplate.Slider ||\n productRefinerHierarchy.DisplayTemplateValue === DisplayTemplate.SliderWithBars\n ) {\n return 'slider';\n }\n return 'input';\n }\n\n private _renderRange(productRefinerHierarchy: IProductRefinerHierarchy): JSX.Element | null {\n const {\n isDisabled,\n refineItemCommonProps,\n selectedRefinerValues,\n context,\n minValueSliderThumbAriaLabel,\n maxValueSliderThumbAriaLabel\n } = this.props;\n const submenuClassNamePrefix = 'ms-refine-submenu__item list-group-item refine-submenu__item';\n const refinerValuesList = productRefinerHierarchy.Values || [];\n const listItems = refinerValuesList.map((child: ProductRefinerValue, index: number) => {\n if (!child) {\n refineItemCommonProps.telemetry.error(\n `Could not render refine item for refiner ${productRefinerHierarchy.RecordId} (${productRefinerHierarchy.KeyName})`\n );\n return null;\n }\n\n const selectedRefinementCriterion = findMatchingRefinementCriterion(child, selectedRefinerValues);\n\n const rangeType = this._getRangeType(productRefinerHierarchy);\n const key = selectedRefinementCriterion\n ? `${selectedRefinementCriterion.LeftValueBoundString}-${selectedRefinementCriterion.RightValueBoundString}`\n : `not-selected-${index}`;\n return (\n <li className={`${submenuClassNamePrefix}--range`} key={index}>\n <RangeRefineItem\n parentProductRefinerHierarchy={productRefinerHierarchy}\n productRefinerValue={child}\n selectedRefinementCriterion={selectedRefinementCriterion}\n refineItemCommonProps={refineItemCommonProps}\n onToggle={this._onToggleItem}\n urlBuilder={this.props.urlBuilder}\n isDisabled={isDisabled}\n rangeType={rangeType}\n key={key}\n sliderKey={key}\n context={context}\n minValueSliderThumbAriaLabel={minValueSliderThumbAriaLabel}\n maxValueSliderThumbAriaLabel={maxValueSliderThumbAriaLabel}\n moduleId={this.props.moduleId}\n moduleTypeName={this.props.moduleTypeName}\n />\n </li>\n );\n });\n return <ul className={`ms-refine-submenu__list list-unstyled ${productRefinerHierarchy.KeyName}`}>{listItems}</ul>;\n }\n\n private _onToggleItem(itemToggleNotification: IRefineItemToggleNotification): void {\n this.props.onUpdateRefiners(itemToggleNotification);\n }\n\n private _onToggleSubmenu(): void {\n this.setState(prevState => ({\n expanded: !prevState.expanded\n }));\n }\n}\n\nexport default RefineSubmenu;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { observer } from 'mobx-react';\nimport * as React from 'react';\n\nimport { isUndefined } from 'lodash';\nimport { ProductRefinerValue } from '@msdyn365-commerce/retail-proxy';\nimport { Button } from '@msdyn365-commerce-modules/utilities';\nimport { IRefineItemState } from './refine-item';\nimport { isCustomRangeTypeIntegerSelected } from './utilities';\nimport { IProductRefinerHierarchy } from '@msdyn365-commerce/commerce-entities';\nimport { IRefineItemCommonProps } from './refine-item.props.common';\nimport { IRefineItemToggleNotification } from './refine-item-toggle-notification';\n\nexport type RangeRefineItemInputType = 'slider' | 'input';\n\n/**\n * Range refine item properties.\n */\nexport interface IRangeRefineItemInputProps {\n parentProductRefinerHierarchy: IProductRefinerHierarchy;\n selectedRefinementCriterion: ProductRefinerValue | undefined;\n refineItemCommonProps: IRefineItemCommonProps;\n isDisabled: boolean;\n rangeType: RangeRefineItemInputType;\n\n /**\n * The telemetry content\n */\n onToggle(notfication: Readonly<IRefineItemToggleNotification>): void;\n}\n\n/**\n * Range refine item state.\n */\nexport interface IRangeRefineItemInputState extends IRefineItemState {\n validationErrorMin: string | undefined;\n validationErrorMax: string | undefined;\n selectedMin: string | undefined;\n selectedMax: string | undefined;\n invalidData: boolean | undefined;\n}\n\n/**\n * RangeRefineItem component (controlled by RefineSubmenu).\n */\n@observer\nexport default class RangeRefineItemInput extends React.Component<IRangeRefineItemInputProps, IRangeRefineItemInputState> {\n private readonly _formattedPriceReverseLookup: Map<string, string> = new Map();\n\n private readonly minInput: React.RefObject<HTMLInputElement>;\n\n private readonly maxInput: React.RefObject<HTMLInputElement>;\n\n public constructor(props: IRangeRefineItemInputProps) {\n super(props);\n this._changeMinInputRange = this._changeMinInputRange.bind(this);\n this._changeMaxInputRange = this._changeMaxInputRange.bind(this);\n this._applyCustom = this._applyCustom.bind(this);\n\n this.minInput = React.createRef<HTMLInputElement>();\n this.maxInput = React.createRef<HTMLInputElement>();\n let initialMin = '';\n let initialMax = '';\n const { selectedRefinementCriterion, parentProductRefinerHierarchy } = this.props;\n if (selectedRefinementCriterion) {\n initialMin = isCustomRangeTypeIntegerSelected(selectedRefinementCriterion, parentProductRefinerHierarchy)\n ? ''\n : selectedRefinementCriterion?.LeftValueBoundString || '';\n initialMax = isCustomRangeTypeIntegerSelected(selectedRefinementCriterion, parentProductRefinerHierarchy)\n ? ''\n : selectedRefinementCriterion?.RightValueBoundString || '';\n }\n\n this.state = {\n validationErrorMin: undefined,\n validationErrorMax: undefined,\n selectedMin: initialMin,\n selectedMax: initialMax,\n invalidData: !(initialMin && initialMax),\n isChecked: false\n };\n }\n\n public shouldComponentUpdate(nextProps: IRangeRefineItemInputProps, nextState: IRangeRefineItemInputState): boolean {\n if (this.state === nextState && this.props === nextProps) {\n return false;\n }\n nextState.invalidData = !(nextState.selectedMin && nextState.selectedMax);\n return true;\n }\n\n public componentDidUpdate(previousProps: IRangeRefineItemInputProps): void {\n if (previousProps !== this.props) {\n this.updateInputRangerProps();\n }\n }\n\n public render(): JSX.Element | undefined {\n if (this.props.rangeType === 'input') {\n return this._renderInputFields();\n }\n return undefined;\n }\n\n // /**\n // * Function to update slider props.\n // */\n private updateInputRangerProps(): void {\n const selectedMin = !isUndefined(this.props.selectedRefinementCriterion?.RowNumber)\n ? ''\n : this.props.selectedRefinementCriterion?.LeftValueBoundString;\n const selectedMax = !isUndefined(this.props.selectedRefinementCriterion?.RowNumber)\n ? ''\n : this.props.selectedRefinementCriterion?.RightValueBoundString;\n this.setState({ selectedMin, selectedMax });\n }\n\n private _renderInputFields(): JSX.Element | undefined {\n const { isDisabled, parentProductRefinerHierarchy, refineItemCommonProps } = this.props;\n const { validationErrorMin, validationErrorMax } = this.state;\n\n const rangeAriaLabel = (refineItemCommonProps.rangeNameFormat || '{0}').replace('{0}', parentProductRefinerHierarchy.KeyName || '');\n const formAttrs = {\n 'aria-label': rangeAriaLabel,\n 'aria-disabled': isDisabled\n };\n\n const minInputClassName = `ms-refine-submenu__input-range refine-submenu__input-range-min ${\n validationErrorMin ? 'refine-submenu__input-range--error' : ''\n }`;\n const maxInputClassName = `ms-refine-submenu__input-range refine-submenu__input-range-max ${\n validationErrorMax ? 'refine-submenu__input-range--error' : ''\n }`;\n return (\n <li className='ms-refine-submenu-item list-group-item refine-submenu__item--range--custom'>\n <form className={`ms-refine-submenu__input-range-refiner`} {...formAttrs}>\n <div>\n <input\n className={minInputClassName}\n placeholder={'Min'}\n onChange={this._changeMinInputRange}\n value={this.state.selectedMin}\n ref={this.minInput}\n />\n <span>{' - '}</span>\n <input\n className={maxInputClassName}\n placeholder={'Max'}\n onChange={this._changeMaxInputRange}\n value={this.state.selectedMax}\n ref={this.maxInput}\n />\n {validationErrorMin && (\n <span className='ms-refine-submenu__input-range-error-text refine-submenu__input-range-min-error-text'>\n {validationErrorMin}\n </span>\n )}\n {validationErrorMax && validationErrorMin !== validationErrorMax && (\n <span className='ms-refine-submenu__input-range-error-text refine-submenu__input-range-max-error-text'>\n {validationErrorMax}\n </span>\n )}\n </div>\n <div>\n <Button title={'Apply'} className='applyBtn' onClick={this._applyCustom} disabled={this.state.invalidData}>\n {'Apply'}\n </Button>\n </div>\n </form>\n </li>\n );\n }\n\n private _applyCustom(event: React.MouseEvent<HTMLElement>): void {\n const selectedMinValue = this._getInputWithoutFormatting(this.state.selectedMin || '');\n this.setState({\n selectedMin: selectedMinValue,\n minTouched: false\n });\n const minInput = Number(selectedMinValue);\n const { onToggle, parentProductRefinerHierarchy } = this.props;\n const max = this.state.selectedMax;\n\n const maxNum = max ? Number(max) : undefined;\n const productRefinerValue: ProductRefinerValue = {\n RefinerRecordId: parentProductRefinerHierarchy.Values[0].RefinerRecordId,\n LeftValueBoundString: this.state.selectedMin,\n RightValueBoundString: this.state.selectedMax,\n DataTypeValue: parentProductRefinerHierarchy.DataTypeValue,\n RefinerSourceValue: parentProductRefinerHierarchy.Values[0].RefinerSourceValue\n };\n\n if (this._validateRange(minInput, maxNum)) {\n onToggle({\n parentProductRefinerHierarchy,\n productRefinerValue,\n isSelecting: true\n });\n }\n }\n\n private _changeMinInputRange(event: React.ChangeEvent<HTMLInputElement>): void {\n this.setState({\n selectedMin: event.target.value.trim()\n });\n }\n\n private _changeMaxInputRange(event: React.ChangeEvent<HTMLInputElement>): void {\n this.setState({\n selectedMax: event.target.value.trim()\n });\n }\n\n private _validateRange(min: number, max: number | undefined): boolean {\n const { refineItemCommonProps } = this.props;\n if (max === undefined) {\n return true;\n }\n\n if (min > max) {\n this.setState({\n validationErrorMin: refineItemCommonProps.validationErrorRange,\n validationErrorMax: refineItemCommonProps.validationErrorRange\n });\n return false;\n }\n\n return true;\n }\n\n private _getInputWithoutFormatting(input: string): string {\n // First try to cast raw input to a number\n const inputAsNum = Number(input);\n if (!isNaN(inputAsNum)) {\n return input;\n }\n\n // Otherwise try a reverse lookup and fall back to the raw input if all else fails\n const reverseLookupResult = this._formattedPriceReverseLookup.get(input);\n return reverseLookupResult || input;\n }\n}\n"],"names":["SearchResultContainer","SearchResultContainer_1","React","constructor","props","state","_props$context$reques","super","sortByDropdownOptions","key","sortOptions","sortByOptionRelevanceDesc","value","this","resources","sortByOptionNameAsc","sortByOptionNameDesc","sortByOptionPriceAsc","sortByOptionPriceDesc","sortByOptionRatingDesc","sortByOptionBestSelling","sortByOptionNewScore","sortByOptionTrendingScore","_pageType","context","request","urlTokens","pageType","_viewport","expandrefinerCount","defaultPageNumber","catalogId","getCatalogId","isListPageStateUpdated","_isMounted","_updateVariantAvailability","async","dimensionsToDisplayOnProductCard","app","config","dimensionsInProductCard","dimensionsToDisplayAsSwatch","dimensionsAsSwatchType","ArrayExtensions","hasElements","includes","DimensionTypes","none","includeAttributes","_getProductsDimensionsAvailabilities","_updateListPageState","listPageState","products","_this$props$context$r","_this$props$context$r2","_this$props$config$it","_this$props$config$it2","_this$props$context$r3","querySorting","query","sorting","JSON","parse","decodeURIComponent","currentPageNumber","skip","itemsPerPage","sortingCritera","Columns","pageSize","activeProducts","totalProductCount","count","activeFilters","hydrateRefinersFromUrl","productId","featureProduct","data","result","_this$props$data$list","_this$props$data$list2","productsList","productsDimensionAvailabilities","getDimensionAvailabilitiesForProductSearchResultAction","DimensionAvailabilitiesForProductSearchResultInput","DimensionSwatchDisplayTypes","productCard","actionContext","setState","_getActivePrice","_this$props$data$list3","_this$props$data$list4","getPriceForProductSearchResult","PriceForProductSearchResultInput","_getSearchResultModal","SearchResultModal","modalCloseButtonText","modalTitle","isOpen","modalIsOpen","returnRef","_modalToggleRef","onModalToggle","_toggleModal","_getCollectionTitle","collectionTitle","_this$props$context$r4","q","category","getFriendlyName","locale","NameTranslations","Name","title","productCountNumber","productCountText","undefined","format","numberOfProducts","oneProduct","TitleContainer","className","telemetryPageName","toLowerCase","titlePrefix","Title","text","searchTextPrefix","titleText","titleCount","_getCategoryHierarchy","categoryHierarchy","CategoryHierarchyContainer","tag","categoryHierarchyList","map","index","Link","ariaLabel","categoryLinkAriaLabel","href","Url","categoryHierarchySeparator","Separator","separator","_getSortingDropDown","activeDropdown","_getCurrentlySelectedOption","sortingState","selectedSortByOption","dropdownOptions","_getAllSortByOptions","hideRating","filter","dropdownOption","SortingContainer","sortByDropDown","LabeledDropdown","labelClassname","labelText","sortByDropdownLabel","dropdownId","dropdownClassname","toggleColor","selectedOption","onSelectOption","_updateSortByDropdown","ref","_sortAndFilterContainerRef","_getPagination","fullUrl","getCurrentUrl","skipCount","ObjectExtensions","isNullOrUndefined","totalItems","previousText","flipperPrevious","nextText","flipperNext","UncontrolledPagination","role","paginationAriaLabel","url","qsp","items","startingItem","_renderPrev","_renderNext","previousAriaLabel","nextAriaLabel","telemetryContent","_getRefineMenu","tempRangeTypeTODO","inputRange","validRefiners","updateRefinerPanel","refiners","refiner","Values","_shouldHideFromRefiners","activeRefiners","_getexpandRefinerCount","length","expandRefinersCount","expandedRefiners","RefineMenuContainer","RefinerSectionContainer","productRefinerHierarchy","RefineSubmenu","selectedRefinerValues","refineItemCommonProps","_refineItemCommonProps","minValueSliderThumbAriaLabel","maxValueSliderThumbAriaLabel","onUpdateRefiners","_onUpdateRefiners","urlBuilder","_buildRefinerUrl","isDisabled","isExpandedOnInitialLoad","moduleId","id","moduleTypeName","typeName","productCountAriaLabel","refineItemAriaLabel","refineItemsAriaLabel","singleProductCountAriaLabel","isMobile","_this$props$data$prod","_this$props$data$prod2","_this$props$data$prod3","_this$props$data$prod4","channelInventoryConfiguration","isInventorySortableAttribute","inventoryAwareSortableAttributeId","RecordId","ProductAvailabilitySortableAttributeRecordId","isInventoryProductAttribute","channelInventoryConfigurationId","InventoryProductAttributeRecordId","productListInventoryDisplay","ProductListInventoryFilteringOptions","HideOOS","_getChoiceSummary","_this$props$data$refi","telemetry","selectedRefiners","refinerValueName","find","rating","KeyName","ChoiceSummary","classNames","clearAllText","label","choiceSummaryLabel","closeAriaLabel","selectedChoices","refinerHierarchy","choiceFormat","choiceRangeValueFormat","onChoiceClicked","_onChoiceClicked","_buildRefinerUrlForChoiceSummary","choiceAriaLabel","refinerValues","_getProducts","_this$props$slots","_this$props$data$feat","_this$props$data$prod5","imageSettings","allowBackNavigation","shouldAllowBackNavigation","breadCrumbType","breadcrumbType","shouldAllowBack","quickviewSlot","slots","quickview","productComparisonButton","isPriceMinMaxFeatureState","featureState","ProductSearchResultItems","moduleType","isPriceMinMaxEnabled","IsEnabled","notification","requestContext","window","history","pushState","buildListPageUrl","_getSortColumnFromSelectedOption","transaction","error","warning","option","searchConfiguration","mappedConfiguration","sortColumn","_getSortCriteriaColumn","_this$props$data$list5","sortCriteria","queryColumns","parseQueryParam","mappedSearchConfiguration","mappedSearchConfig","item","validValues","activeSortColumn","activeMappedConfig","ColumnName","IsDescending","itemToggleNotification","_this$props$data$list6","updatedRefinementCriteria","getUpdatedRefinementCriteria","newRefinementCriteria","currentRefinementCriteria","clearAll","dropdownElementId","current","dropdownElement","document","getElementById","setTimeout","focus","selectedChoice","choiceClicked","selectedCriterion","isMatchingRefinementCriterion","selectedRefiner","isClearAll","refinerCount","paginationPreviousText","paginationNextText","device","Type","bind","_updateViewport","productPrices","pending","placeholderTextMax","minLabel","maxLabel","rangeNameFormat","validationErrorNaN","validationErrorNotNumber","validationErrorRange","validationErrorNotRange","getTelemetryObject","friendlyName","static","nameTranslations","_nameTranslation","nameTranslation","Language","Text","_this$props$context$a2","MsDyn365","isBrowser","addEventListener","StoreOperationsDataActions","callerContext","reaction","_listPageState$active","_listPageState$sortin","_newListPageState$cur","_newListPageState$sor","_newListPageState$act","_this$props$context$r5","_this$props$context$r6","_this$props$context$r7","_this$props","_this$props$context$a","newListPageState","input","GetFullProductsByCollectionInput","apiSettings","Paging","Top","Skip","Math","max","Sorting","recordId","stringify","ProductId","Recommendation","recommendation","productResults","getCollectionProducts","enableAffiliationBasedPricing","user","isAuthenticated","_newListPageState$cur2","_newListPageState$sor2","_newListPageState$act2","_this$props$context$r8","_this$props$context$r9","refinerInput","RefinersByCollectionInput","getCollectionRefinersAction","componentWillUnmount","removeEventListener","render","_ref","_listPageState$result","_listPageState$result2","_this$props$context$r10","_this$props$data$list7","_this$props$data$list8","productCollection","searchProduct","errorText","resultCategoryNotFoundText","resultSearchNotFoundText","productsComponent","featureComponent","FeatureSearchResultItem","product","searchResultContainerViewProps","_objectSpread","TitleViewProps","disableHierarchy","refineMenu","classnames","moduleProps","sortByOptions","pagination","ProductsContainer","ProductSectionContainer","CategoryNavContainer","RefineAndProductSectionContainer","choiceSummary","modalToggle","ModalToggle","innerRef","onClick","searchResultModal","errorMessage","ErrorMessage","FeatureSearchContainer","similarLookProduct","renderView","_getViewport","variant","VariantType","Browser","Viewport","__decorate","computed","observable","action","observer","createSearchResultModal","modalProps","isRecoSearchPage","modal","modalHeader","createModalBody","modalFooter","modalBody","renderSort","renderRefiner","Node","Object","assign","submenu","renderCategoryHierarchy","renderTitle","renderTitleCount","_props$context$action","Module","AddressBillingCheckbox","isChecked","onChange","additionalAttributes","checked","AddressInputComponent","type","additionalAddributes","AddressBillingHeading","CheckoutBillingAddress","countryRegionId","countryRegions","addressPurposes","defaultAddressType","checkoutErrorRef","_onSuggestionSelected","_clearAddressFields","address","addressFormat","getTranformedAddress","stateProvinceInfo","set","addUpdateAddress","Street","ZipCode","CountyName","City","State","DistrictName","FullAddress","getAddressFormat","ThreeLetterISORegionName","forEach","_this$autoSuggest","name","autoSuggest","excludedAddressFields","_clearValidation","validationError","onAddressAddUpdate","validateAddressFormat","_dataInitialize","_data$countryRegions$","_data$addressPurposes","countryStates","_data$countryStates$r","_renderAddOrUpdateAddress","_this$addUpdateAddres","AddressAddUpdate","addressType","AddressType","Billing","defaultCountryRegionId","selectedAddress","addressActionResponse","dropdownDisplayData","getPrefilledAddressDropdownData","addressStateDefaultSelectionText","onInputChange","_onAddressAddUpdateInputChange","onDropdownChange","_onAddressAddUpdateDropdownChange","hasExternalSubmitGroup","moduleState","onSave","_onSubmitAddress","onCancel","_resetView","_onCountryChange","_this$autoSuggest2","twoLetterIsoRegionName","getTwoLetterISORegionName","TwoLetterISORegionName","changeAutoSuggestionCountryCode","_getAddressFormatExcludeList","addressFormatExcludeList","showAddressType","push","AddressItemType","AddressTypeValue","IsPrimary","_attachMapAutoSuggest","storeSelectorStateManager","_this$autoSuggest3","isMapApiLoaded","attachAutoSuggest","event","target","replace","RegExp","_getStateProvinces","currentOperation","AddressOperation","Add","Update","addressCommon","getStateProvinces","then","some","StateId","_initModuleState","_this$props$data$chec","init","status","isBillingAddressRequried","onEdit","onSubmit","billingAddress","isBillingAddressSameAsShippingAddress","checkout","isBillingAddressSameAsShipping","_updateCurrentOperation","Show","_updateModuleState","isCartContainsItemsForShipping","shippingAddress","_onBillingAddressSameAsShippingChange","currentTarget","_this$props$data$chec2","_this$props$data$chec3","setHasError","shouldEnableSinglePaymentAuthorizationCheckout","isPaymentSectionContainerHasError","updateIsBillingAddressHasError","newIsBillingAddressHasError","_setBillingAddress","information","onUpdating","newBillingAddress","updateBillingAddress","additionalProperties","operation","onReady","_setErrorMessage","List","AddressCommon","AddressFormat","AddressMetaData","isShowAddress","isShowAddOrUpdateAddress","isShowSameAsShippingCheckbox","_this$props$data$chec5","channel","autoSuggestionEnabled","autoSuggestOptions","_setDefaultCountryRegionId","isUpdating","_this$props$data$chec4","removeBillingAddress","onDisable","BingMapsApiKey","BingMapsEnabled","options","AutoSuggest","ChannelCountryRegionISOCode","DefaultLanguageId","_loadMapAPI","_this$props$data$stor","loadMapApi","_this$autoSuggest4","_this$props$data$stor2","shouldEnableCheckoutErrorDisplayMessaging","_this$props$data$chec6","checkoutError","errorLocation","ErrorLocation","_this$props$data$chec7","checkoutErrorFocus","CheckoutModule","focusOnCheckoutError","_this$props$data$stor3","_this$autoSuggest5","disposeAutoSuggest","shouldComponentUpdate","nextProps","nextState","_shouldHideBillingAddressForOBO","hasError","viewState","heading","addressBillingAddressHeading","alert","ErrorComponent","errorMessageTitle","message","sameAsShippingCheckbox","addressSameAsShippingAddressAriaLabel","addressSameAsShippingAddressText","showAddress","_renderShowAddress","showAddOrUpdateAddress","_this$selectedAddress","AddressShow","_request$channel","market","getDefaultCountryRegionId","_featureState$result","_request$channel2","_request$channel3","_this$props$data$chec8","channelDeliveryOptionConfig","retailMultiplePickUpOptionEnabled","feature","pickupDeliveryModeCode","PickupDeliveryModeCode","emailDeliveryModeCode","EmailDeliveryModeCode","checkoutCart","hasInvoiceLine","cart","CartLines","cartLine","_channelDeliveryOptio","DeliveryMode","PickupDeliveryModeCodes","deliveryMode","_this$props$data$chec9","_this$props$data$chec10","getLoyaltyAmount","checkoutState","loyaltyAmount","getGiftCardTotalAmount","giftCardExtends","reduce","giftCard","Balance","getCustomerAccountAmount","_checkoutState$custom","customerAccountAmount","shouldPaidByCard","checkoutResult","paymentTenderType","tokenizedPaymentCard","isPaidByOtherPaymentSource","paymenTenderType","TotalAmount","_this$props$data$chec11","_this$props$data$chec12","isPaymentVerificationRedirection","isCheckoutCallFailed","Msdyn365","EnabledPaymentsForOBO","PaymentInstrument","withModuleState","CheckoutPickupCartLines","moduleClassName","cartLines","itemTitle","isMultipleAddressShippingEnabled","isMobileCheck","gridSettings","xs","w","sm","md","lg","xl","isMobileView","headingAfterMultiSelectAddressSelect","isShowQty","quantity","lineId","Image","imageProps","productQuantityInfo","altText","defaultImageSettings","viewports","h","lazyload","quality","CheckoutShippingAddress","_data$featureState$re2","customerAddresses","addressListSelectedAddress","multiplePickupStoreSwitchName","onSelect","line","selectedShippingLines","updated","shippingLine","_shippingLine$cartLin","LineId","console","onShippingAddressChange","addressRecordId","toString","shippingGroups","updatedCartLine","ShippingAddress","updateIndividualAddresses","prevState","onBulkShippingAddressChange","cartline","_shippingLine$cartLin2","_initPickupGroup","pickupCartLines","_getCartLinesforDelivery","_getProductsByCartLines","ChannelId","x","shippingGroupsBuffer","initialShippingLineSelection","addressFormatItem","formatAddress","_data$address$result","_data$featureState$re","_isDelivery","_isNotPickupMode","FulfillmentStoreId","pickupDeliveryMode","pickupMode","channelId","productInputs","ProductInput","CatalogId","getSimpleProducts","_renderShipMultipleAddresses","onSaveHandler","onCancelHandler","cartlineImages","_line$cartLine$LineId","_line$product","_line$product$Primary","_line$product2","_line$product3","_context$request$app","_line$cartLine$Quanti","src","PrimaryImageUrl","fallBackSrc","getFallbackImageUrl","ItemId","OmniChannelMedia","loadFailureBehavior","Quantity","AddressShipMultiple","isAuthenticatedFlow","onCancelButtonHandler","onSelectAll","onClear","onShipSingleAddress","resetSelectedShippingLines","shippingLines","shippingLineImages","currencyCode","Shipping","_renderSelectAddress","onShipMultipleAddressesHandler","onAddAddressHandler","AddressSelect","addresses","onAddressOptionChange","_onAddressOptionChange","onShipMultipleAddresses","_goToShipMultipleAddresses","onAddAddress","_goToAddAddress","_onSelectAddress","multipleAddressShippingEnabled","_onAddressAddUpdateSubmit","response","_isNewAddress","updateCustomerAddress","addCustomerAddress","Promise","resolve","_clearError","_onAddOrUpdateSuccess","_getDefaultAddress","_getAddressFromCartExpressPaymentDetails","expressPaymentDetailsFromCartPage","isExpressAddressAppliedInCartPage","addressFromCartExpress","getExpressAddress","getAddressFromTokenizedPaymentCard","Country","threeLetterIsoRegionName","getThreeLetterIsoRegionName","NameOnCard","Address1","StreetNumber","Address2","Zip","Phone","expressAddress","countryRegion","country","_country$ISOCode","ISOCode","CountryRegionId","_canShip","defaultAddress","shippingCartLines","isExpressCheckoutApplied","shippingAddressFromExpressCheckout","isEmpty","_setShippingAddress","updateHasShippingAddress","newHasShippingAddress","Multiple","_onSelectMultiAddress","_checkout$result$chec","_checkout$result$chec2","_channelDeliveryOptio2","_setCartLinesShippingAddress","newShippingAddress","updateShippingAddress","catch","newCartLinesWithShippingAddress","shippingGroup","updateCartLinesShippingAddress","updateCartLineShippingAddress","updatedCartLinesObject","innerWidth","onPending","existingAddress","_address$Name","_address$Street","_address$StreetNumber","_address$City","_address$State","_address$ZipCode","_address$Phone","_address$ThreeLetterI","_address$AddressTypeV","_countItems","cartlines","_address","_featureState$result2","headingImages","itemsText","singleItemText","_line$cartLine$LineId2","_line$product4","_line$product$Primary2","_line$product5","_line$product6","_context$request$app2","_line$cartLine$Quanti2","_line$cartLine$Shippi","_line$cartLine$Shippi2","shippingAddressId","numberOfCartLines","itemText","lineImageProps","cartLineImages","isRetailMultiplePickUpOptionEnabled","isShowAddresList","isShowShipMultipleAddress","showAddressSelectHandler","showShipMultipleAddressesHandler","showShipMultipleAddresses","showAddOrUpdateAddressHandler","showAddressSelect","_this$props$data$cart","_this$props$data$cart2","properties","ExtensionProperties","property","Key","Value","StringValue","get","WishlistItemDimension","dimensionType","dimensionValue","WishListItemActions","itemKey","handlers","onAddToCart","onRemoveItem","_renderAriaLabel","price","Dimensions","productDimensionTypeColor","productDimensionTypeSize","productDimensionTypeStyle","formattedPrice","dimensions","BasePrice","freePriceText","cultureFormatter","formatCurrency","CurrencyCode","productDimension","DimensionTypeValue","DimensionValue","join","renderProductLink","productUrl","productName","payLoad","getPayloadObject","productAttributes","getTelemetryAttributes","productPageUrlWithSwatch","StringExtensions","isNullOrWhitespace","renderInventoryInformationLabel","inventoryInformationLabel","inventoryLabelClassName","inventoryCssName","WishlistItemAddToCartButtonComponent","isInStock","addToCartText","outOfStockText","isServiceItem","ItemTypeValue","ReleasedProductType","Service","addItemAction","Button","disabled","WishlistItemRemoveFromWishlistButtonComponent","removeFromWishlistText","removeItemAction","renderUnitOfMeasure","unitOfMeasure","unitOfMeasureDisplayType","WishlistItem","wishlistState","enableImageProductLink","fallbackImage","msdyn365Commerce","URL","location","dimension","_props$product$Dimens","_dimension$DimensionV","dimensionName","convertProductDimensionTypeToDimensionTypes","searchParams","_getFullProductLink","productImage","_renderProductImage","productLink","productDimensions","_renderProductDimensions","productPrice","_renderPrice","productUnitOfMeasure","DefaultUnitOfMeasure","entireProductLink","productAriaLabel","addToCartButton","inventoryInformation","removeButton","productStatusMessage","Alert","color","statusCssString","toggle","onDismiss","userMessage","image","cropFocalRegion","PriceComponent","originalPriceText","currentPriceText","WishlistItemsStatusMessage","errorType","WishlistItems","handleHeadingChange","_onDismiss","_renderHeading","editProps","_addItemToCart","productAvailability","addedToCartSuccessMessage","addedToCartFailureMessage","invoiceInCartErrorMessage","productInventoryInformation","_getProductInventory","ProductDetails","_product$Behavior$Min","_product$Behavior","deliveryOptions","getDeliveryOptionsAsync","queryResultSettings","QueryResultSettingsProxy","getPagingFromInputDataOrDefaultValue","validateQuantity","isQuantityValidationRequired","respectQuantityLimits","Behavior","MinimumQuantity","addProductToCartInput","enableStockCheck","availableQuantity","ProductAvailableQuantity","AvailableQuantity","isAddEmailDeliveryItemToCart","DeliveryOptions","Code","addProductToCart","messageGlyph","substatus","_await$cart$cart","curQuantity","maxQtyLimitReachedMessage","_getInventoryValueMessage","_result$errorDetails","errorDetails","LocalizedMessage","_result$errorDetails2","debug","isChannelQuantityLimitsFeatureEnabledInHq","isOrderQuantityLimitsFeatureEnabled","validateLimitsPerLine","cartConfiguration","ValidateDefaultOrderSettingsPerLine","_this$props$data$feat2","_this$props$data$feat3","_this$props$context","defaultOrderQuantityLimitsFeatureConfig","platform","enableDefaultOrderQuantityLimits","customerInfo","customerInformation","IsB2b","_this$props$data$cart3","_cartConfiguration$Ig","IgnoreOrderSettings","_removeItemFromWishlist","wishlists","noLongerLineExist","userToken","token","wishlistLineId","_getWishlistLineIdFromProductId","removeLinesAsync","Id","commerceList","castCommerceList","_getProductsNoLongerExists","_removeNoLongerExistsLines","update","createGetByCustomerInput","getItemsInWishlists","ActiveWishlistInput","castSimpleProducts","isError","_inventoryLabel","StockLevelLabel","_inventoryClassName","StockLevelCode","_isProductInStock","productResult","IsProductAvailable","CommerceListLines","foundWishlistItem","commerceListLine","_castCommerceList$Com","noLongerExist","emptyWishlistText","wishlistErrorGettingWishlist","noLongerExitsWishlistItemText","errorProps","statusMessage","emptyViewProps","viewProps","Products","Product","ProductDimensions","_renderProductList","statusNotExistsMessage","_getProductNotExists","emptytext","noLongerExisttext","priceFree","addToCartButtonText","removeButtonText","productDimensionTypeAmount","currentProductProps","ProductPrice","getProductUrlSync","IsGiftCard","maxQuantityLimitText","maxQuantityForLineItem","updateMaxQuantityForCartLineItem","maxQuantityForCartLineItem","minInventory","min","productInventoryCollection","expandedMenusOnLoad","ProductComponent","ratingAriaLabel","allowBack","productRecordId","getProductPageUrlSync","attribute","onTelemetryClick","imageUrl","img","renderProductPlacementImage","featureSimilarLooksTitle","ProductRefinerValueDataTypeValue","ProductRefinerTypeValue","ProductRefinerSource","isRangeType","dataTypeValue","AttributeDataType","Currency","Decimal","Integer","findMatchingRefinementCriterion","productRefinerValue","refinementCriteria","refinementCriterion","RefinerRecordId","RefinerSourceValue","DataTypeValue","LeftValueBoundString","toggledItemFound","isSelecting","next","rangeStart","RightValueBoundString","rangeEnd","TrueFalse","parentProductRefinerHierarchy","RefinerTypeValue","RefinerType","SingleSelect","child","matchingIndex","findIndex","criterion","splice","RangeRefineItem","_formattedPriceReverseLookup","Map","_onRangeUpdate","_onRangeUpdateEnd","_handleRangeTooltipText","_changeMin","_changeMax","_finishChangeMin","_finishChangeMax","minInput","maxInput","selectedRefinementCriterion","initialMin","initialMax","validationErrorMin","validationErrorMax","selectedMin","selectedMax","touchedMin","touchedMax","UnitText","rangeType","_renderInputFields","_renderSlider","formAttrs","minInputClassName","maxInputClassName","formattedSelectedMin","_getFormattedSelectedValue","formattedSelectedMax","onFocus","onBlur","placeholder","sliderId","ariaAttributes","minPrice","_formatPrice","maxPrice","selectedMinPrice","selectedMaxPrice","Slider","inForm","Number","step","orientation","labels","labelId","labelString","labelPositioning","showLabels","showTooltip","sliderThumbs","ariaValueText","onChangeEnd","debounce","handleTooltipText","_changeValue","inputType","selectedKey","touchedKey","_getInputWithoutFormatting","selectedMinValue","minTouched","onToggle","maxNum","isNaN","_focus","_validateRange","selectedMaxValue","maxTouched","minNum","selected","touched","amount","currency","trace","priceAmount","Intl","NumberFormat","style","currencyDisplay","minimumFractionDigits","e","formatPrice","has","inputAsNum","sliderChangeNotification","eventType","firstThumbValue","secondThumbValue","_focusOnSliderThumb","element","tooltip","RefineItem","_onClick","preventDefault","anchorType","children","attrs","_objectWithoutProperties","_excluded","isSingleSelect","itemTypeClassName","SourceValue","Rating","contentAction","etext","LeftValueBoundLocalizedString","_getRefinerUrl","tabIndex","Count","_this$props$selectedR","_productRefinerValue$","refinerRating","parseInt","ratingRefiner","selectedRating","ratingComponentClass","RatingComponent","avgRating","ratingCount","hideCount","readOnly","closeButtonGlyph","stopPropagation","getAttribute","indexOf","_getSelectedRefinerChoice","itemClicked","nextItemToFocus","nextSibling","selectedRefinersMap","_getKeyForRefinerValue","clearAllAttributes","listItemProps","overallFormat","rangeFormat","refinerName","parent","hierarchy","_get","innerText","trim","modalNode","Modal","autoFocus","applicationNode","returnFocusRef","zIndex","modalHeaderNode","ModalHeader","modalFooterNode","ModalFooter","_onToggleItem","_onToggleSubmenu","isExpanded","expanded","Collapse","timeout","_renderChildItems","_renderRange","_renderSingleMultiSelect","refinerValuesList","listItems","selectedValue","_getRangeType","DisplayTemplateValue","DisplayTemplate","Range","SliderWithBars","productRecIds","prod","projectDomain","affliations","customerInput","GetCustomerInput","customer","getCustomer","CustomerAffiliations","affliation","aff","AffiliationId","RetailAffiliationId","CustomerId","AccountNumber","getActivePricesAsync","Date","activePricesResponse","activePrice","_activePrice$Customer","Price","CustomerContextualPrice","TradeAgreementPrice","AdjustedPrice","exception","Error","ModalBody","all","one","two","three","four","itemId","ex","listPageStateFeature","componentDidMount","breaCrumbType","toggleModal","slice","keyId","Single","refinersToBeUpdated","refinersLists","split","_refinerName","RangeInput","sortingCriteraValues","sort","a","b","localeCompare","compressedRefinerKeys","sortingColumns","compressedRefiners","compressedRefiner","refinerKey","compressRefiners","delete","requestUrl","CittaRefiners","_onClearRefiners","_getSortingRefiner","sortByValues","_sortingCritera$Colum","sortingC","sortBy","DataValueType","RowNumber","_updateDropDown","dropdownOpen","_renderRefiners","refinersHeader","orderedRefiners","refinerCat","hiddenRefinersList","refinersToBeHidden","sortRefiner","CittaPicture","handleMoveHover","showHoverImg","handleMoveOut","_this$state","image1","image2","img1","img2","onMouseOver","onMouseOut","imageOrientation","onlineTags","salesLineTag","productImage1","productImage2","stockAvailabilities","_property$Value","_property$Value2","IntegerValue","AttributeValues","TextValue","tagsToIgnore","salesLineTagKey","generateImageUrl","setTelemetryAttribute","pid","pname","mname","productImageSettings","_getLandscapeImageSettings","_renderLabel","AverageRating","toLocaleLowerCase","backgroundColor","_renderProductPlacementImage","savingsText","_renderSalesLineTag","_renderDescription","Description","_renderRating","TotalRatings","_renderAvailabilities","sA","match","ratingLabel","roundedRating","toFixed","description","totalRatings","numRatings","basePrice","adjustedPrice","cmsImageSettings","disableLazyLoad","getImageOrientation","renderRefineMenu","display","_props$context","liClass","renderProducts","AddressDetail","_ref2","AddressForm","isShowSaveButton","saveButton","isShowCancelButton","cancelButton","AddressItem","AddressError","SelectAddress","shipMultipleAddressesButton","addButton","SelectItem","showItems","_ref3","ShipMultipleAddress","shipSingleAddressButton","clearSelectionButton","addressDropdown","ProductsTable","ProductsTableHeading","ProductsTableRow","shipMultipleAddressLines","_renderShipMultipleAddressLine","_ref4","shipMultipleAddressesLine","selectLine","productNumber","productInfo","productQuantity","productAddress","position","top","verticalAlign","colSpan","width","marginTop","textAlign","_renderItem","CheckoutErrors","setCheckoutErrors","errorCode","ctx","apiError","clientCheckoutError","consoleCheckoutErrors","getCheckoutState","checkoutErrorsList","Console","consoleCheckoutError","errorMessageResource","getCheckoutErrorMessage","log","CheckoutPaymentInstrument","Checkout","updateCheckoutError","newCheckoutError","updateShouldFocusOnCheckoutError","newShouldFocusOnCheckoutError","genericError","genericErrorMessage","scrollIntoView","updateCheckoutErrorFocus","newCheckoutErrorFocus","None","setCheckoutErrorFocus","checkoutModuleId","checkoutModule","keys","errorMessageFromAPI","errorResource","resource","ActionError","ErrorCode","ErrorMessageResource","checkoutTimeoutErrorMessage","Microsoft_Dynamics_Commerce_Runtime_BlockedLoyaltyCard","blockedLoyaltyCardErrorMessage","CheckoutLoyalty","Microsoft_Dynamics_Commerce_Runtime_CustomerAccountLimitSignDifferentFromAmountDue","customerAccountLimitSignDifferentFromAmountDueErrorMessage","CheckoutCustomerAccountPayment","Microsoft_Dynamics_Commerce_Runtime_CustomerAccountPaymentExceedsAvailableCreditLimit","customerAccountPaymentExceedsAvailableCreditLimitErrorMessage","Microsoft_Dynamics_Commerce_Runtime_CustomerAccountPaymentExceedsCustomerAccountFloorLimit","customerAccountPaymentExceedsCustomerAccountFloorLimitErrorMessage","Microsoft_Dynamics_Commerce_Runtime_CustomerAccountPaymentExceedsTotalAmountForCarryOutAndReturnItems","customerAccountPaymentExceedsTotalAmountForCarryOutAndReturnItemsErrorMessage","Microsoft_Dynamics_Commerce_Runtime_CustomerAccountPaymentForCustomerWithoutAllowOnAccount","customerAccountPaymentForCustomerWithoutAllowOnAccountErrorMessage","Microsoft_Dynamics_Commerce_Runtime_CustomerAccountPaymentNotAllowedForOpenInvoices","customerAccountPaymentNotAllowedForOpenInvoicesErrorMessage","Microsoft_Dynamics_Commerce_Runtime_FraudRisk","fraudRiskErrorMessage","Microsoft_Dynamics_Commerce_Runtime_GiftCardBalanceInquiryFailed","giftCardBalanceInquiryFailedErrorMessage","CheckoutGiftCard","Microsoft_Dynamics_Commerce_Runtime_GiftCardCurrencyMismatch","giftCardCurrencyMismatchErrorMessage","Microsoft_Dynamics_Commerce_Runtime_InvalidCartVersion","invalidCartVersionErrorMessage","Microsoft_Dynamics_Commerce_Runtime_InvalidLoyaltyCardNumber","invalidLoyaltyCardNumberErrorMessage","Microsoft_Dynamics_Commerce_Runtime_InvalidPaymentRequest","invalidPaymentRequestErrorMessage","Microsoft_Dynamics_Commerce_Runtime_InvalidPaymentRequest_Console","invalidPaymentRequestConsoleErrorMessage","Microsoft_Dynamics_Commerce_Runtime_MissingRequiredCartTenderLines","missingRequiredCartTenderLinesErrorMessage","Microsoft_Dynamics_Commerce_Runtime_MultipleCustomerAccountPaymentsNotAllowed","multipleCustomerAccountPaymentsNotAllowedErrorMessage","Microsoft_Dynamics_Commerce_Runtime_NoMoreThanOneLoyaltyTender","noMoreThanOneLoyaltyTenderErrorMessage","Microsoft_Dynamics_Commerce_Runtime_NoResponseFromGatewayForGiftCardBalanceInquiry","noResponseFromGatewayForGiftCardBalanceInquiryErrorMessage","Microsoft_Dynamics_Commerce_Runtime_NoTenderLoyaltyCard","noTenderLoyaltyCardErrorMessage","Microsoft_Dynamics_Commerce_Runtime_NotEnoughRewardPoints","notEnoughRewardPointsErrorMessage","Microsoft_Dynamics_Commerce_Runtime_PaymentAlreadyVoided","paymentAlreadyVoidedErrorMessage","Microsoft_Dynamics_Commerce_Runtime_PaymentAmountExceedsGiftBalance","paymentAmountExceedsGiftBalanceErrorMessage","Microsoft_Dynamics_Commerce_Runtime_PaymentRequiresMerchantProperties","paymentRequiresMerchantPropertiesErrorMessage","Microsoft_Dynamics_Commerce_Runtime_PaymentRequiresMerchantProperties_Console","paymentRequiresMerchantPropertiesConsoleErrorMessage","Microsoft_Dynamics_Commerce_Runtime_PaymentUsingUnauthorizedAccount","paymentUsingUnauthorizedAccountErrorMessage","Microsoft_Dynamics_Commerce_Runtime_RefundAmountMoreThanAllowed","refundAmountMoreThanAllowedErrorMessage","Microsoft_Dynamics_Commerce_Runtime_UnableToAuthorizePayment","unableToAuthorizePaymentErrorMessage","Microsoft_Dynamics_Commerce_Runtime_UnableToAuthorizePaymentCardAdditionalContextRequired","unableToAuthorizePaymentCardAdditionalContextRequiredErrorMessage","Microsoft_Dynamics_Commerce_Runtime_UnableToAuthorizePaymentCardTypeMissingOrNotSupported","unableToAuthorizePaymentCardTypeMissingOrNotSupportedErrorMessage","Microsoft_Dynamics_Commerce_Runtime_UnableToCancelPayment","unableToCancelPaymentErrorMessage","Microsoft_Dynamics_Commerce_Runtime_UnableToReadCardTokenInfo","unableToReadCardTokenInfoErrorMessage","Microsoft_Dynamics_Commerce_Runtime_UnableToRetrieveCardPaymentAcceptResult","unableToRetrieveCardPaymentAcceptResultErrorMessage","AddressItemDisplayType","AddressValidationRuleType","attributes","maxLength","shouldUseAutoFocus","marketISOCode","currentCountryRegion","parseRetailException","errorTitle","addressErrorMessageTitle","addressGenericErrorMessage","GetStateProvincesInput","getStateProvinceAction","updateLogisticsLocationRoleRecordId","submitCustomerAddress","addAddress","updateAddress","updateCustomerPrimaryAddress","updatePrimaryAddress","addressAction","AddressManagementInput","execAddressAction","GetAddressPurposesInput","getAddressPurposesAction","addressPurpose","purpose","LogisticsLocationRoleRecordId","countryRegionsInfo","addressMetaData","stateDefaultSelectionText","defaultStateText","dropdownData","getCountryFormat","getStateFormat","unshift","getAddressTypeFormat","_getCountryRegionInfo","propertyName","validationtor","isValid","_inputValidation","postalCode","selectedState","StateName","adminDistrict","addressLine","locality","district","formattedAddress","_validateRegEx","validationRule","regEx","test","countryRegionInfo","_getAddressDisplayFormat","ShortName","validationRules","addressDisplayItem","AddressFormatLines","AddressTypeItem","_extendAddressDisplayFormat","nameDisplayItem","formatLine","AddressComponentNameValue","addressItem","getItemFormat","isNewLine","NewLine","phoneDisplayItem","isPrimaryDisplayItem","excluded","required","metaData","requiredFieldRegEx","maxLengthRegEx","resourcesPrefix","excludedTypes","requiredFields","_init","_addItem","Input","PhoneRegex","defaultRegex","County","Dropdown","BuildingCompliment","Postbox","House_RU","Flat_RU","CountryOKSMCode_RU","Checkbox","displayType","nameKey","_validationRules","isRequired","rule","Required","optionalString","ruleType","itemType","_validationRule","Format","MaxLength","shouldBeAutoFocused","getRequriedAttribute","getAddessItems","shouldAutoFocus","elementId","classname","AdressCheckboxComponent","displayData","AdressDropdownComponent","AddressLabelComponent","AddressAlertComponent","editAddressHeading","addAddressHeading","Heading","AddressButtonComponent","addressSaveButtonText","addressSaveButtonAriaLabel","addressCancelButtonText","addressCancelButtonAriaLabel","AddressErrorTitleComponent","AddressErrorMessageComponent","addressTypeValue","addressTypeDescription","AddressDetailItemComponent","isShowLabel","getDropdownItem","isSelected","htmlFor","showStrikethroughPricing","originalPrice","getOriginalPrice","renderCurrentPrice","initialPrice","itemProp","returnPrice","_unused","renderCurrentPriceWithOriginalPrice","createComponent","component","__assign","mainClass","isRangeTypeForInteger","isCustomRangeTypeIntegerSelected","isSingleSelectRangeTypeIntegerSelected","getIntegerRangeName","rangeValue","RightValueBoundLocalizedString","r","getButtonAriaLabel","addressName","getAddressList","showPrimaryButton","onEditAddress","onRemoveAddress","onUpdatePrimaryAddress","isShowList","isSelectedAddress","isShowError","isInvalidAsyncState","isEditAsyncCustomerFeatureEnabled","canRenderAsyncCustomerDataAsUnmodifiable","isAsyncCustomer","isAsyncCustomerAddressCreationFeatureEnabled","Item","isShowPrimaryButton","primaryButton","addressPrimaryButtonText","addressPrimaryButtonAriaLabel","editButton","addressEditButtonText","addressEditButtonAriaLabel","addressRemoveButtonText","addressRemoveButtonAriaLabel","getPrimaryAddressList","primaryAddressSectionHeading","primaryAddresses","getOtherAddressList","otherAddressSectionHeading","otherAddresses","AddressList","_heading$headingTag","handleLineItemHeadingChange","headingComponent","headingTag","contextRequest","disableAddButton","ListAddress","isShowEmptyListMessage","emptyListMessage","addressEmptyListAddressMessage","addressAddButtonText","addressAddButtonAriaLabel","primaryAddressList","otherAddressList","featureSimilarDescriptionTitle","getInventoryLabel","inventoryAttribute","priceResources","priceRangeSeparator","quickViewButton","inventoryLabel","swatchItemAriaLabel","dimensionAvailabilities","dimensionAvailability","masterProductId","MasterProductId","countryCode","defaultLanguageId","inputId","containerId","selectedSuggestionCallback","autoSuggestManager","Microsoft","Maps","loadModule","callback","_document$querySelect","AutosuggestManager","attachAutosuggest","querySelector","setAttribute","_document$querySelect2","errorCallback","credentials","bingMapsApiKey","setOptions","_this$autoSuggestMana","_this$autoSuggestMana2","detachAutosuggest","dispose","lang","getInput","_addressPurposes$find","ichecked","addressChangeCheckboxAriaLabel","getAddressSelectItems","addressAddNewButtonText","addressAddNewButtonAriaLabel","addressShipMultipleText","addressShipMultipleAriaLabel","unavailableProductErrorMessage","outOfStockProductErrorMessage","addressShipSingleText","addressShipSingleAriaLabel","clearSelectionButtonText","clearSelectionButtonAriaLabel","every","chooseAddressForSelectedItemsText","chooseAddressForSelectedItemsAriaLabel","defaultValue","noAddressSelectedAriaLabel","hidden","headers","selectAllRowsText","addressSelectAllRowsText","addressProductNumberText","addressProductText","productUnitPrice","addressProductUnitPriceText","addressProductQuantityText","addressProductAddressText","clickHandler","isAllSelected","ShipMultipleAddressesTableHeading","_renderProductListHeader","_line$cartLine","currentLineProps","shippingLineImage","ShipMultipleAddressesLineView","saveAndContinueBtnLabel","componentClassName","getOnChange","scope","maxWidth","paddingLeft","border","left","transform","onSelectLineHandler","renderProductImage","renderProductInfo","renderProductPrice","renderProductError","_context$actionContex","_context$request","renderProductDimensions","dimensionsLine","OOS","UNASSORTED","NONE","choice","_rangeParentDisplay$","rangeParentDisplay","p","rangeDisplayType","newIntRange","_parent","filterValue","_selectedRefinementCr","_this$props$selectedR2","_this$props$selectedR3","_this$props$selectedR4","getLabels","getSliderThumbs","sliderKey","_this$props$minValueS","_this$props$maxValueS","String","minValue","maxValue","sliderKeyString","componentDidUpdate","previousProps","updateSliderProps","_this$props$selectedR5","_this$props$selectedR6","_this$props$selectedR7","_this$props$selectedR8","_this$props$parentPro","_this$props$parentPro2","productText","productCount","refineMenuItemAriaLabel","shouldDisplayAsSwatch","_getShouldDisplayAsSwatch","hasColor","SwatchColorHexCode","hasImage","SwatchImageUrl","hasContentSwatch","_renderSwatch","checkIfShouldDisplayAsSwatch","_productRefinerValue$2","swatchItems","colorHexCode","SwatchComponent","list","isSelectionEnabled","isRefineItem","ratingUserCountAriaLabel","ratingSingleUserCountAriaLabel","_productRefinerValue$3","defaultChkProductCount","productCountAriaLabelValue","RangeRefineItemInput","_changeMinInputRange","_changeMaxInputRange","_applyCustom","invalidData","updateInputRangerProps","_isUndefined"],"sourceRoot":""}