{"version":3,"sources":["webpack:///./src/modules/mands-search-result-container/mands-search-result-container.view.tsx?09e6","webpack:///./src/modules/mands-search-result-container/components/error-message.tsx?4d7e","webpack:///src/common/get-order-information.tsx?d70b","webpack:///./src/modules/mands-search-result-container/mands-search-result-container.tsx?5eb4","webpack:///./src/modules/mands-search-result-container/components/separator.tsx?64de","webpack:///./src/modules/mands-search-result-container/components/modal.tsx?eae6","webpack:///src/common/address.tsx?6c70","webpack:///./src/modules/mands-search-result-container/components/product-search-result-items.tsx?6a0e","webpack:///src/modules/search-result-container/components/title.tsx?365d","webpack:///./src/modules/mands-search-result-container/components/link.tsx?26e2","webpack:///./src/themes/mands/views/custom-components/range-refine-item.tsx?8e46","webpack:///./src/themes/mands/views/custom-components/refine-item.tsx?f500","webpack:///./src/themes/mands/views/custom-components/refine-submenu.tsx?6a53","webpack:///src/modules/order-confirmation/components/get-help.tsx?58bd","webpack:///src/modules/order-confirmation/order-confirmation.tsx?67f9","webpack:///src/modules/search-result-container/components/utilities.ts?41e3","webpack:///src/common/get-groups.tsx?8b6a","webpack:///./src/themes/mands/views/mands-search-result-container.view.tsx?1129","webpack:///src/modules/search-result-container/search-result-container.tsx?97e0","webpack:///src/modules/search-result-container/components/error-message.tsx?c0c2","webpack:///./src/modules/mands-search-result-container/components/refine-item.tsx?8912","webpack:///src/modules/checkout-order-confirmation/checkout-order-confirmation.tsx?1533","webpack:///src/modules/order-confirmation/components/get-payment-methods.tsx?0bc9","webpack:///src/modules/order-details/components/get-help.tsx?85e2","webpack:///src/modules/order-details/components/get-order-summary.tsx?eb46","webpack:///src/modules/order-details/components/get-payment-methods.tsx?aeee","webpack:///src/modules/order-details/components/table-view/components/order-details-table-header-component.tsx?4682","webpack:///src/modules/order-details/components/table-view/components/order-details-table-row-component.tsx?6c30","webpack:///src/modules/order-details/components/table-view/order-details-table.tsx?99be","webpack:///src/modules/order-details/order-details.tsx?673a","webpack:///src/modules/search-result-container/search-result-container.view.tsx?3d61","webpack:///src/common/expand-button-state.ts?acdd","webpack:///src/common/sales-line-state.ts?516c","webpack:///src/modules/search-result-container/components/refine-item.tsx?b232","webpack:///./src/modules/mands-search-result-container/components/range-refine-item.tsx?694c","webpack:///src/common/get-sales-lines.tsx?a840","webpack:///./src/modules/mands-search-result-container/components/title.tsx?e0bf","webpack:///src/modules/search-result-container/components/index.ts?cc7a","webpack:///src/modules/search-result-container/components/product-search-result-items.tsx?1766","webpack:///./src/themes/mands/views/custom-components/utilities.ts?7fd9","webpack:///./src/themes/mands/views/custom-components/choice-summary.tsx?8c8f","webpack:///src/modules/order-details/order-details.view.tsx?018c","webpack:///src/modules/search-result-container/components/choice-summary.tsx?f4a7","webpack:///src/common/get-sales-line.tsx?39dd","webpack:///src/modules/search-result-container/components/refine-submenu.tsx?1e62","webpack:///src/modules/search-result-container/components/separator.tsx?7b76","webpack:///src/common/label.tsx?223a","webpack:///./src/modules/mands-search-result-container/components/refine-submenu.tsx?61e7","webpack:///src/index.ts?c6ae","webpack:///./src/modules/mands-search-result-container/components/choice-summary.tsx?e0da","webpack:///src/modules/order-confirmation/components/get-order-summary.tsx?fa69","webpack:///src/modules/search-result-container/components/range-refine-item.tsx?6e24","webpack:///src/modules/search-result-container/components/link.tsx?d3ce","webpack:///src/modules/order-confirmation/order-confirmation.view.tsx?8166","webpack:///src/common/buy-selected-component.tsx?8155","webpack:///./src/themes/mands/views/search-result-container.view.tsx?7bfa","webpack:///src/modules/order-history/order-history.view.tsx?251d","webpack:///./src/modules/mands-search-result-container/components/index.ts?6406","webpack:///src/modules/search-result-container/components/modal.tsx?afdd","webpack:///src/modules/checkout-order-confirmation/checkout-order-confirmation.view.tsx?504a","webpack:///src/modules/search-result-container/components/feature-search-result-item.tsx?98c1","webpack:///src/common/utilities.ts?0d8b","webpack:///./src/modules/mands-search-result-container/components/utilities.ts?723a","webpack:///src/modules/order-history/components/order-history-filter.tsx?ac38","webpack:///src/modules/order-history/actions/get-order-shipment-history.ts?2cf8","webpack:///src/modules/order-history/components/get-sales-order.tsx?ac68","webpack:///src/modules/order-history/components/table-view/components/order-history-table-header-component.tsx?3fc3","webpack:///src/modules/order-history/components/table-view/components/order-history-table-row-component.tsx?5fcb","webpack:///src/modules/order-history/components/table-view/order-history-table.tsx?3070","webpack:///src/modules/order-history/order-history.tsx?33c9"],"names":["createSearchResultModal","modalProps","refineMenu","sortByDropDown","React","modal","modalHeader","createModalBody","modalFooter","props","modalBody","renderSort","renderRefiner","refiners","RefineMenuContainer","RefinerSectionContainer","Node","Object","assign","map","submenu","index","key","SortingContainer","renderCategoryHierarchy","CategoryHierarchyContainer","categoryHierarchyList","categoryHierarchySeparator","category","renderTitle","title","TitleContainer","titlePrefix","titleText","renderTitleCount","titleCount","SearchResultContainerView","SearchResultContainer","products","pagination","ProductsContainer","ProductSectionContainer","choiceSummary","isMobile","modalToggle","searchResultModal","TitleViewProps","categoryHierarchy","sortByOptions","CategoryNavContainer","RefineAndProductSectionContainer","errorMessage","Module","ErrorMessage","_ref","text","className","getChannelReference","channelReferenceId","moduleName","confirmationIdLabel","shouldShowQrCode","qrCodeSrText","confirmationIdNode","undefined","QRCode","value","size","id","getPlacedBy","originator","isYou","orderPlacedByFullText","orderPlacedByYouText","orderOnBehalfOfText","placedByNode","placedByName","StaffId","StaffName","CustomerId","CustomerName","onBehalfOfText","getOrderInformation","channelName","channelAddress","channelTypeValue","showChannelInfo","receiptEmail","createdDate","amount","priceContext","salesId","receiptId","count","resources","receiptEmailMessage","orderItemLabel","orderItemsLabel","orderIdLabel","receiptIdLabel","posChannelNameText","onlineStoreChannelNameText","orderPlacedOnLabel","callCenterChannelNameText","isSalesInvoice","priceCurrency","channelNameNode","getChannelName","posChannelName","onlineChannelName","orderInformationProps","placedBy","PriceComponent","data","price","CustomerContextualPrice","currencyCode","getOrderChannelName","order","channelIdentities","_orderChannel$Name","orderChannel","find","channel","RecordId","ChannelId","Name","getOrderChannelTypeValue","ChannelType","Value","isOnlineStoreChannel","getOrderChannelAddress","orgUnitLocations","_orderOrgUnitLocation","orderOrgUnitLocation","location","Address","getOrderInformationInput","customer","_order$TotalAmount","context","request","apiSettings","channelId","locale","get","SalesLines","ArrayExtensions","hasElements","countItems","isOboRequest","AccountNumber","isYouObo","CreatedDateTime","Date","toLocaleDateString","SalesId","CurrencyCode","isB2bAdmin","IsB2bAdmin","ReceiptId","ReceiptEmail","ChannelReferenceId","TotalAmount","isOnlineStore","SearchResultContainer_1","constructor","state","super","sortByDropdownOptions","sortOptions","sortByOptionRelevanceDesc","this","sortByOptionNameAsc","sortByOptionNameDesc","sortByOptionPriceAsc","sortByOptionPriceDesc","sortByOptionRatingDesc","_pageType","urlTokens","pageType","_isMounted","catalogId","getCatalogId","_getProductsDimensionsAvailabilities","async","_this$props$data$list","_this$props$data$list2","productsList","listPageState","result","activeProducts","productsDimensionAvailabilities","getDimensionAvailabilitiesForProductSearchResultAction","DimensionAvailabilitiesForProductSearchResultInput","DimensionSwatchDisplayTypes","productCard","actionContext","setState","_getSearchResultModal","SearchResultModal","modalCloseButtonText","modalTitle","isOpen","modalIsOpen","returnRef","_modalToggleRef","onModalToggle","_toggleModal","_getCollectionTitle","collectionTitle","_this$props$context$r","query","q","getFriendlyName","NameTranslations","productCountNumber","productCountText","totalProductCount","format","numberOfProducts","oneProduct","Title","searchTextPrefix","_getCategoryHierarchy","tag","Link","ariaLabel","categoryLinkAriaLabel","href","Url","Separator","separator","_getSortingDropDown","activeDropdown","_getCurrentlySelectedOption","sortingState","selectedSortByOption","LabeledDropdown","labelClassname","labelText","sortByDropdownLabel","dropdownId","dropdownClassname","toggleColor","dropdownOptions","selectedOption","onSelectOption","_updateSortByDropdown","ref","_sortAndFilterContainerRef","_getPagination","config","fullUrl","getCurrentUrl","itemsPerPage","skipCount","currentPageNumber","skip","totalItems","previousText","flipperPrevious","nextText","flipperNext","UncontrolledPagination","role","paginationAriaLabel","url","qsp","items","startingItem","previousAriaLabel","nextAriaLabel","_getRefineMenu","tempRangeTypeTODO","inputRange","validRefiners","filter","refiner","Values","length","activeRefiners","activeFilters","productRefinerHierarchy","RefineSubmenu","selectedRefinerValues","refineItemCommonProps","_refineItemCommonProps","minValueSliderThumbAriaLabel","maxValueSliderThumbAriaLabel","onUpdateRefiners","_onUpdateRefiners","urlBuilder","_buildRefinerUrl","isDisabled","isExpandedOnInitialLoad","moduleId","moduleTypeName","typeName","_getInventoryRefiner","channelInventoryConfiguration","app","productListInventoryDisplay","ProductListInventoryFilteringOptions","HideOOS","baseCollectionInput","BaseCollectionInput","inventoryInStockRefinerValueInput","InventoryInStockRefinerValueInput","InventoryProductAttributeRecordId","getInventoryRefinerAction","Promise","resolve","_getChoiceSummary","_this$props$data$refi","telemetry","selectedRefiners","refinerValueName","rating","KeyName","ChoiceSummary","classNames","clearAllText","label","choiceSummaryLabel","selectedChoices","refinerHierarchy","choiceFormat","choiceRangeValueFormat","onChoiceClicked","_onChoiceClicked","_buildRefinerUrlForChoiceSummary","choiceAriaLabel","refinerValues","notification","requestContext","error","warning","window","history","pushState","buildListPageUrl","_getSortColumnFromSelectedOption","transaction","sortingCritera","Columns","option","searchConfiguration","mappedConfiguration","sortColumn","sortCriteria","activeSortColumn","parseQueryParam","activeMappedConfig","mappedSearchConfig","ColumnName","IsDescending","dropdownOption","itemToggleNotification","updatedRefinementCriteria","getUpdatedRefinementCriteria","newRefinementCriteria","currentRefinementCriteria","clearAll","dropdownElementId","current","dropdownElement","document","getElementById","setTimeout","focus","selectedChoice","choiceClicked","selectedCriterion","isMatchingRefinementCriterion","selectedRefiner","isClearAll","_viewport","device","Type","bind","_updateViewport","pending","placeholderTextMax","minLabel","maxLabel","rangeNameFormat","validationErrorNaN","validationErrorNotNumber","validationErrorRange","validationErrorNotRange","then","querySorting","sorting","JSON","parse","decodeURIComponent","pageSize","reaction","_this$props$context$r2","_this$props$context$r3","_this$props$context$r4","_this$props","input","GetFullProductsByCollectionInput","Paging","Top","Skip","Math","max","Sorting","recordId","stringify","ProductId","productId","Recommendation","recommendation","includeAttributes","updateRefinerPanel","getCollectionProducts","productResults","nameTranslations","_nameTranslation","nameTranslation","item","Language","toLowerCase","Text","_this$props$context$r5","_this$props$context$r6","_this$props$context$r7","_this$props2","MsDyn365","isBrowser","addEventListener","dimensionsToDisplayOnProductCard","dimensionsInProductCard","dimensionsToDisplayAsSwatch","dimensionsAsSwatchType","includes","DimensionTypes","none","StoreOperationsDataActions","getInventoryConfigurationAsync","callerContext","inventoryRefiner","componentWillUnmount","removeEventListener","render","imageSettings","errorText","resultCategoryNotFoundText","resultSearchNotFoundText","productComparisonButton","slots","productsComponent","ProductSearchResultItems","moduleType","searchResultContainerViewProps","_objectSpread","classnames","moduleProps","ModalToggle","innerRef","onClick","renderView","_getViewport","innerWidth","gridSettings","xs","w","sm","md","lg","__decorate","computed","observable","observer","createElement","modalNode","modalHeaderNode","modalFooterNode","ModalBody","Modal","autoFocus","applicationNode","returnFocusRef","toggle","zIndex","ModalHeader","ModalFooter","Button","address","deliveryType","showCompleteAddress","resource","shipToLabel","storeLabel","phoneLabel","Street","City","State","County","ZipCode","ThreeLetterISORegionName","Phone","FullAddress","product","ProductComponent","freePriceText","priceFree","originalPriceText","currentPriceText","ratingAriaLabel","RangeRefineItem","min","productRefinerValue","LeftValueBoundString","RightValueBoundString","_formattedPriceReverseLookup","Map","_renderInputFields","parentProductRefinerHierarchy","validationErrorMin","validationErrorMax","formAttrs","replace","minInputClassName","maxInputClassName","formattedSelectedMax","formattedSelectedMin","onChange","_finishChangeMin","minInput","priceValue","selected","placeholder","_finishChangeMax","maxInput","_renderSlider","selectedRefinementCriterion","selectedMin","selectedMax","sliderId","RefinerRecordId","ariaAttributes","minPrice","_formatPrice","maxPrice","selectedMinPrice","selectedMaxPrice","Slider","inForm","Number","step","orientation","labels","labelId","labelString","labelPositioning","showLabels","showTooltip","sliderThumbs","ariaValueText","onChangeEnd","_onRangeUpdateEnd","debounce","_onRangeUpdate","handleTooltipText","_handleRangeTooltipText","event","selectedMinValue","_getInputWithoutFormatting","currentTarget","selectedMaxValue","priceObjectArray","getFormattedSelectedMinValue","selectedPriceObject","x","previousPriceObject","minTouched","onToggle","maxNum","isNaN","_focus","_validateRange","isSelecting","rangeStart","rangeEnd","getFormattedSelectedMaxValue","maxTouched","minNum","inputType","formatPrice","has","set","inputAsNum","sliderChangeNotification","eventType","firstThumbValue","secondThumbValue","_focusOnSliderThumb","element","tooltip","initialMin","initialMax","isChecked","touchedMin","touchedMax","UnitText","rangeType","RefineItem","_getRefinerUrl","_onClick","e","preventDefault","anchorType","children","attrs","_objectWithoutProperties","_excluded","isSingleSelect","RefinerTypeValue","ProductRefinerTypeValue","Single","itemTypeClassName","SourceValue","ProductRefinerSource","Rating","LeftValueBoundLocalizedString","Count","tabIndex","toggleAllRefiners","refinerId","_getFormattedSelectedValue","type","floor","ceil","minPr","maxPr","minPrices","maxPrices","i","push","toString","obj","disabled","flag","val","lastRange","_renderChildItems","DataTypeValue","ProductRefinerValueDataTypeValue","Range","RangeInput","_renderRange","_renderSingleMultiSelect","listItems","child","findMatchingRefinementCriterion","_onToggleItem","minPricesObject","maxPricesObject","_onToggleSubmenu","prevState","expanded","isExpanded","leftValueString","rightValueString","Collapse","timeout","getOrderConfirmationHelp","needHelpLabel","helpLineNumberLabel","contactNumber","helpLineContactAriaLabel","telemetryContent","payLoad","getPayloadObject","attribute","getTelemetryAttributes","helpProps","OrderConfirmation","handleOrderConfirmationHeadingChange","heading","target","getDeliveryMode","salesLine","_channelDeliveryOptio","featureSate","arguments","channelDeliveryOptionConfig","pickupDeliveryMode","PickupDeliveryModeCodes","deliveryMode","DeliveryMode","getTelemetryObject","telemetryPageName","friendlyName","TelemetryConstant","BackToShopping","backToShoppingAttributes","_this$props$data$acco","accountInformation","Msdyn365","FirstName","loyaltyCard","RewardPoints","pointPrograms","Set","point","RewardPointId","rewardLines","LoyaltyRewardPointLines","total","forEach","line","RewardPointAmountQuantity","_featureState$result","_this$order","featureState","retailMultiplePickUpOptionEnabled","IsEnabled","pickupDeliveryModeCode","PickupDeliveryModeCode","emailDeliveryModeCode","EmailDeliveryModeCode","orderDetailsLines","canShip","some","orderDetailsLine","isShowOrHideTaxEnabled","isEnableShowOrHideSalesTaxECommerceEnabled","orderSummaryHeading","orderSummaryItemsTotalLabel","orderSummaryShippingFeeLabel","orderSummaryTaxLabel","orderSummaryGrandTotalLabel","pointsEarnedLabel","earnedPoints","isTaxIncludedInPrice","IsTaxIncludedInPrice","isShowTaxBreakUp","tenderTypes","TenderLines","paymentMethodsTitle","creditCardEndingLabel","giftCardEndingLabel","amountCoveredLabel","cashUsedLabel","loyaltyCardUsedLabel","customerAccountUsedLabel","tenderLines","tenderIdOperationIdMap","getTenderIdOperationIdMap","_featureState$result2","noSalesOrderText","genericErrorMessage","loadingLabel","backToShopping","pickupItemsHeader","pickingItemsLabel","shippingAddressTitle","shippingItemToYouLabel","shippingItemToOBOCustomerLabel","emailItemsHeader","emailingItemsLabel","showTimeslot","classname","backToShoppingUrl","viewProps","editProps","onEdit","backToShoppingLink","footerProps","hasError","alert","Label","isDataReady","loading","TransactionTypeValue","TransactionType","SalesInvoice","salesLinesInput","getSalesLinesInput","deliveryOptions","salesLines","getSalesLines","orderInformationInput","orderInfomation","salesOrder","groups","getGroups","isConfirmationView","customerName","orderSummary","orderSummaryProps","getOrderConfirmationOrderSummary","payment","paymentMethodsProps","getOrderConfirmationPaymentMethods","help","isRangeType","dataTypeValue","AttributeDataType","Currency","Decimal","Integer","refinementCriteria","refinementCriterion","RefinerSourceValue","toggledItemFound","next","TrueFalse","RefinerType","SingleSelect","matchingIndex","findIndex","criterion","splice","showAddress","isCashAndCarryTransaction","isSelectionModeEnabled","groupSalesLines","group","salesStatus","_salesLines","itemLabel","pickingItemsLabelText","shippingItemsToText","emailingItemsLabelText","groupProps","salesLinesProps","getSalesLinesProps","trackingInfo","isProcessing","pickDateTimeslot","pickupDateTimeslot","shippedStatusCheck","delivery","deliveryProps","pickupProps","processing","shippingItemsToYou","groupsProps","componentDidMount","hideRatingFromSortDropdown","componentDidUpdate","sort","options","style","display","mobileView","setRating","renderSubmenu","subMenu","activeRefiner","refinersData","requestUrl","content","_props$context$reques","sortByOptionBestSelling","sortByOptionNewScore","sortByOptionTrendingScore","expandrefinerCount","defaultPageNumber","isListPageStateUpdated","_updateListPageState","_this$props$config$it","_this$props$config$it2","hydrateRefinersFromUrl","featureProduct","_getActivePrice","_this$props$data$list3","_this$props$data$list4","getPriceForProductSearchResult","PriceForProductSearchResultInput","_getAllSortByOptions","hideRating","_renderPrev","_renderNext","_shouldHideFromRefiners","_getexpandRefinerCount","expandRefinersCount","expandedRefiners","productCountAriaLabel","refineItemAriaLabel","refineItemsAriaLabel","singleProductCountAriaLabel","_this$props$data$prod","_this$props$data$prod2","_this$props$data$prod3","_this$props$data$prod4","isInventorySortableAttribute","inventoryAwareSortableAttributeId","ProductAvailabilitySortableAttributeRecordId","isInventoryProductAttribute","channelInventoryConfigurationId","closeAriaLabel","_getProducts","_this$props$slots","_this$props$data$feat","_this$props$data$prod5","allowBackNavigation","shouldAllowBackNavigation","breadCrumbType","breadcrumbType","shouldAllowBack","quickviewSlot","quickview","isPriceMinMaxFeatureState","isPriceMinMaxEnabled","_getSortCriteriaColumn","_this$props$data$list5","queryColumns","mappedSearchConfiguration","validValues","_this$props$data$list6","refinerCount","paginationPreviousText","paginationNextText","productPrices","_this$props$context$a2","_listPageState$active","_listPageState$sortin","_newListPageState$cur","_newListPageState$sor","_newListPageState$act","_this$props$context$a","newListPageState","enableAffiliationBasedPricing","user","isAuthenticated","_newListPageState$cur2","_newListPageState$sor2","_newListPageState$act2","_this$props$context$r8","refinerInput","RefinersByCollectionInput","getCollectionRefinersAction","_listPageState$result","_listPageState$result2","_this$props$context$r9","_this$props$data$list7","_this$props$data$list8","productCollection","searchProduct","featureComponent","FeatureSearchResultItem","disableHierarchy","FeatureSearchContainer","similarLookProduct","variant","VariantType","Browser","Viewport","RatingComponent","avgRating","parseInt","ratingCount","hideCount","readOnly","_this$props$parentPro","_this$props$parentPro2","dimensionType","toLocaleLowerCase","shouldDisplayAsSwatch","_getShouldDisplayAsSwatch","hasColor","StringExtensions","isNullOrWhitespace","SwatchColorHexCode","hasImage","SwatchImageUrl","hasContentSwatch","_renderSwatch","_productRefinerValue$","swatchItems","itemId","colorHexCode","imageUrl","SwatchComponent","list","isSelectionEnabled","isRefineItem","checkIfShouldDisplayAsSwatch","handleCheckoutOrderConfirmationHeadingChange","orderInfomationInput","getLastFourDigit","digits","substr","methods","reduce","lines","tenderLine","TenderTypeId","RetailOperation","PayCard","showAmount","cardLastFourDigit","MaskedCardNumber","isValidCardNumber","AuthorizedAmount","Amount","showAmountCovered","CardTypeId","getCard","PayGiftCertificate","GiftCardId","getGiftCertificate","PayLoyalty","LoyaltyCardId","getLoyalty","PayCash","getCash","PayCustomerAccount","_tenderLine$Amount","getCustomerAccountPayment","OrderSummaryLine","name","getOrderDetailsPaymentMethods","OPERATIONS","OrderDetailsHeaderCheckboxComponent","switchCheckedState","useCallback","onSelectAll","isSelectedAll","orderDetailsSelectAllRadioAriaLabelText","checked","OrderDetailsDesktopHeaderCellsComponent","columnWithNumberClassName","shouldDisplayUnitOfMeasure","unitOfMeasureDisplayType","Fragment","orderDetailsProductNumberText","orderDetailsProductText","orderDetailsUnitPriceText","orderDetailsModeOfDeliveryText","orderDetailsStatusText","orderDetailsQuantityText","orderDetailsUnitOfMeasureText","orderDetailsTotalText","orderDetailsActionsText","OrderDetailsMobileHeaderCellsComponent","OrderDetailsTableHeaderComponent","rowClassName","headerCells","formatAmount","cultureFormatter","formatCurrency","OrderDetailsRowCheckboxComponent","checkboxRowAriaLabel","orderDetailsSelectRadioAriaLabelText","onSelectLine","isSelected","isProductAvailable","OrderDetailsRowProductImageComponent","_product$simpleProduc","_product$simpleProduc2","_product$simpleProduc3","_product$simpleProduc4","_props$imageSettings","fallbackImageUrl","getFallbackImageUrl","simpleProduct","ItemId","OmniChannelMedia","containerClassName","productName","Description","Image","altText","src","PrimaryImageUrl","fallBackSrc","defaultImageSettings","loadFailureBehavior","OrderDetailsDesktopTableRowCellComponent","_props$context$reques2","_props$context$reques3","_product$simpleProduc5","_product$simpleProduc6","_product$simpleProduc7","pickupMode","getDeliveryDescriptionByProductId","getDeliveryType","isRetailMultiplePickUpOptionEnabled","deliveryTypeStringMap","pickUp","pickedUpSalesLines","ship","deliveredSalesLines","carryOut","carryOutSalesLines","email","emailSalesLines","deliveryTypeString","getDeliveryTypeString","salesStatusString","canceled","orderStatusCanceled","readyForPickup","orderStatusReadyForPickup","pickedUp","orderStatusPickedUp","orderStatusProcessing","shipped","orderStatusShipped","unknown","emailed","orderStatusEmailed","getSalesStatusCode","SalesStatusValue","productUrl","ObjectExtensions","isNullOrUndefined","getProductPageUrlSync","isChannelTypeB2B","_salesLine$CatalogId","URL","searchParams","CatalogId","currentProduct","OrderDetailsProduct","Dimensions","dimension","_dimension$DimensionV","DimensionValue","dimensionValue","join","orderDetailsProductDimensionsSeparator","orderDetailsUnavailableProductText","Price","Quantity","UnitOfMeasureSymbol","BuySelectedComponent","orderDetailsBuySelectedButtonText","orderDetailsBuyItAgainButtonText","orderDetailsBuySelectedButtonAriaLabel","orderDetailsBuyItAgainButtonAriaLabel","isReorderingEnabled","isIcon","setShowPreviousActions","OrderDetailsExtraActionsPopupComponent","_props$data$product$s","_props$data$product$s2","orderDetailsViewDetailsButtonAriaLabel","orderDetailsViewDetailsButtonText","shouldShowActions","setShowActions","useState","_salesLine$CatalogId2","onClickViewDetails","shouldShowActionsNewValue","actionsContainerClassName","OrderDetailsMobileTableRowCellComponent","_product$simpleProduc8","_product$simpleProduc9","orderDetailsQuantityMobileText","OrderDetailsTableRowComponent","isMobileView","onSelectAllHandler","OrderDetailsTableComponent","headerClassName","availableProducts","all","isChannelMultipleCatalogsFeatureEnabled","OrderDetailsViewMode","OrderDetails","multiplePickupStoreSwitchName","handleOrderDetailsHeadingChange","_setListViewMode","_viewMode","listView","_setDetailedViewMode","detailedView","_renderOrderGroups","shouldShowAddress","addressOptions","_isSelectionModeEnabled","_renderOrderSummary","_ref2","subTotal","SubtotalAmountWithoutTax","SubtotalAmount","taxOnShippingCharge","TaxOnShippingCharge","shippingChargeAmount","ShippingChargeAmount","shippingCharge","subtotal","shipping","tax","TaxAmount","totalAmount","getOrderDetailsOrderSummary","_renderOrderPayment","_renderOrderHelp","ContactNumber","attributes","getOrderDetailsHelp","_renderOrderDetailsTable","isMultiplePickUpOptionEnabled","isMultipleCatalogsFeatureEnabled","_orderDetailsProducts","_enableSelection","_orderDetailsAvailableProducts","_disableSelection","_renderTableViewActions","_renderBuySelected","_renderEnableSelectionButton","_renderDisableSelectionButton","_renderViewModes","isGridViewEnabled","viewModesClassName","orderDetailsDetailedViewModeAriaLabel","orderDetailsListViewModeAriaLabel","getOrderDetailsProps","_getUrlSync","_heading$tag","orderDetailsBuyItemsAgainHeaderText","getUrlSync","_products","_featureState$result3","_initProductsModel","selectedProducts","_this$props$data$chan","_this$props$data$orgU","_featureState$result4","_featureState$result5","_this$props$data$cata","noSalesOrderDetailsText","showFullAddress","channels","customerInformation","originators","orderOriginators","confirmationId","transactionId","orderInformation","isUserTypeB2B","signInUrl","isCatalogFetaure","catalogs","tableViewActions","viewModes","table","orderDetailsEnableSelectionButtonAriaLabel","orderDetailsEnableSelectionButtonText","orderDetailsDisableSelectionButtonAriaLabel","orderDetailsDisableSelectionButtonText","_selectedProducts","_this$props$data$orde","orderDetailProducts","orderHydration","_this$props$data$orde2","salesOrderProduct","isRecoSearchPage","_props$context$action","ExpandButtonState","extraProductsCount","SalesLineState","stateId","isHidden","shouldComponentUpdate","nextProps","nextState","_renderRating","contentAction","etext","productText","productCount","refineMenuItemAriaLabel","_productRefinerValue$2","ratingUserCountAriaLabel","ratingSingleUserCountAriaLabel","_this$props$selectedR","_productRefinerValue$3","refinerRating","ratingRefiner","selectedRating","defaultChkProductCount","ratingComponentClass","productCountAriaLabelValue","_changeMin","_changeMax","onFocus","onBlur","_changeValue","selectedKey","touchedKey","touched","validationError","moduleComponentProps","shipments","isCurrentChannel","imageOnly","productDeliveryOptions","orderDetailsProducts","salesLineStates","productStates","shipment","currentShipment","_currentShipment$Ship","ShipmentLines","shipmentLine","InventoryTransactionId","orderDetailsProduct","productState","_salesLine$LineId","LineId","getSalesLine","salesLineState","Shipments","getInventoryLabel","AttributeValues","inventoryAttribute","TextValue","priceResources","priceRangeSeparator","allowBack","quickViewButton","inventoryLabel","swatchItemAriaLabel","dimensionAvailabilities","dimensionAvailability","masterProductId","MasterProductId","currency","trace","priceAmount","Intl","NumberFormat","currencyDisplay","minimumFractionDigits","closeButtonGlyph","_getKeyForRefinerValue","overallFormat","rangeFormat","refinerName","parent","hierarchy","_get","stopPropagation","getAttribute","indexOf","_getSelectedRefinerChoice","itemClicked","nextItemToFocus","nextSibling","selectedRefinersMap","innerText","trim","dimensionLabel","listItemProps","OrderDetailsOrderInfomation","OrderDetailsSalesLine","salesLineProps","buyAgainButton","errors","OrderDetailsGroupDelivery","_ref3","OrderDetailsGroup","_ref4","OrderDetailsGroups","_ref5","OrderDetailsOrderSummary","_ref6","OrderDetailsPayment","_ref7","OrderDetailsHelp","_ref8","OrderDetailsView","_ref9","_this$props$context","choice","clearAllAttributes","filterValue","deliveryTypeEnum","SalesLineComponent","_props$product$Name","_props$product","_props$orderDetailsPr","_props$resources$ship","_props$product3","_props$product4","_props$moduleComponen2","_props$product2","_props$moduleComponen","getSalesLinePicture","Observer","_product$PrimaryImage","orderDetailCheckbox","getOrderDetailsSalesLineCheckbox","_props$salesLine$Cata","CartLineItemComponent","sizeString","productDimensionTypeSize","colorString","productDimensionTypeColor","styleString","productDimensionTypeStyle","amountString","productDimensionTypeAmount","quantityDisplayString","salesLineQuantityText","configString","discountStringText","inputQuantityAriaLabel","shippingChargesText","shippingCharges","primaryImageUrl","isSalesLine","cartLine","showShippingChargesForLineItems","_context$request$chan","_context$request$chan2","_product$Name","phoneAriaLabel","buyItAgainLabel","buyItAgainAriaLabel","trackingLabel","trackingAriaLabel","trackingComingSoonLabel","pickupDateTimeslotText","pickupTimeslotPlaceHolder","orderDetailsBuySelectedAddingToCartErrorNotificationTitle","orderDetailsBuySelectedAddingToCartErrorNotificationCloseAriaLabel","orderDetailsGoToCartText","orderDetailsDialogCloseText","orderDetailsSingleItemText","orderDetailsMultiLineItemFormatText","orderDetailsMultiLinesFormatText","orderDetailsHeaderMessageText","orderDetailsMultiItemsValidationErrorMessage","orderDetailsOneErrorText","orderDetailsMultiErrorText","addedQuantityText","salesStatusStringMap","getSalesStatusStringMap","getPickupModeDesc","deliveryTypeClass","getDeliveryTypeClassName","deliveryTypeComp","getDeliveryTypeComp","storePickUp","deliveryTypePickup","LabelComponent","deliveryTypeNoPickup","getStoreName","salesStatusComp","getTrackingInfo","TrackingUrl","TrackingNumber","orderDetailsBuyItAgainAriaLabel","pickupDateTimeslotInfo","getPickupDateTimeslotInfo","shouldShowTimeslot","isDeliveryPickupSame","canShowTimeslot","PickupTimeslotStartDateTime","PickupTimeslotEndDateTime","getDateTimeslot","buyItAgainLinkClassName","cropFocalRegion","salesLineClassName","salesLineFullClassName","ShippingAddress","orderDetailsBuyItAgainLabel","salesLineDeliveryMode","retailMultiplePickupOption","isPickupDeliveryMode","dM","productRecordId","_productDeliveryOptio","productDeliveryOption","currentDeliveryOption","deliveryDescription","DeliveryOptions","Code","_salesLine$ShippingAd","refinerValuesList","selectedValue","_getRangeType","DisplayTemplateValue","DisplayTemplate","SliderWithBars","sliderKey","_selectedRefinementCr","_this$props$selectedR2","_this$props$selectedR3","_this$props$selectedR4","getLabels","getSliderThumbs","_this$props$minValueS","_this$props$maxValueS","String","minValue","maxValue","sliderKeyString","previousProps","updateSliderProps","_this$props$selectedR5","_this$props$selectedR6","_this$props$selectedR7","_this$props$selectedR8","OrderConfirmationOrderInfomation","OrderConfirmationSalesLine","OrderConfirmationGroupDelivery","OrderConfirmationGroup","OrderConfirmationGroups","OrderConfirmationOrderSummary","OrderConfirmationPayment","OrderConfirmationHelp","OrderConfirmationView","_props$resources$orde10","_props$resources$orde11","buttonLabel","buttonAriaLabel","firstProduct","dialogStrings","_props$resources$orde","_props$resources$orde2","_props$resources$orde3","_props$resources$orde4","_props$resources$orde5","_props$resources$orde6","_props$resources$orde7","_props$resources$free","_props$resources$orig","_props$resources$curr","_props$resources$adde","_props$resources$orde8","_props$resources$orde9","goToCartText","continueShoppingText","closeNotificationLabel","headerItemOneText","headerItemFormatText","headerLinesFormatText","headerMessageText","buyAgainNotificationTitle","buyAgainNotificationCloseAriaLabel","validationErrorMessage","oneErrorText","multiErrorsText","getDialogStrings","AddToCartComponent","addToCartText","outOfStockText","addToCartArialLabel","quantity","navigationUrl","shouldSkipSiteSettings","isAddEmailDeliveryItemToCart","OrderHistoryOrderInfomation","OrderHistoryGroupDelivery","OrderHistoryGroup","OrderHistoryGroups","OrderHistoryHeader","headerProps","orderCountLabel","extraActions","OrderHistorySalesOder","salesOrderProps","orderDetailsLink","expandProductsButton","OrderHistoryList","listProps","salesOrders","OrderHistoryView","orderHistoryProps","header","emptyMessage","moreButton","_context$request$app","fallbackImage","featureSimilarDescriptionTitle","featureSimilarLooksTitle","onTelemetryClick","img","imageProps","renderProductPlacementImage","tenderType","OperationId","viewports","h","lazyload","statusValue","flatGroup","groupBy","entries","groupByDeliveryType","getGroupBySalesStatusCode","groupBySalesStatusCode","getGroupByAddressId","addressId","groupByAddressId","TrackingId","getGroupByTrackingId","trackingId","groupByTrackingId","placeHolder","startDate","endDate","date","DateTimeFormat","timeZone","timeslotformatter","hour","minute","hour12","List","Boolean","OrderHistoryFilterState","getOrderHistoryFilterStateResources","filterState","CurrentUser","orderHistoryFilterYourOrderHistory","OrganizationWide","orderHistoryFilterOrganizationWide","Error","onClickHandler","onStateClick","togglePopoverHandler","setPopoverState","isPopoverState","OrderHistoryFilterComponent","msdyn365Commerce","createComponent","component","popoverRef","createRef","popoverState","setFilterState","currentState","onFilterStateClick","clickedState","onFilterStateChanged","Popover","placement","EnumExtensions","getEnumValues","renderFilterStateItem","stateStringRepresentation","GetSalesOrderHistoryWithHydrationsInput","paging","nextPageLink","getCacheKey","buildCacheKey","getCacheObjectType","dataCacheType","nextPageToken","getSalesOrderHistoryWithHydrationsAction","orderHistoryResponse","nextPage","_orderHistoryResults$","orderHistoryResults","getOrderShipmentsHistoryAsync","ctx","bypassCache","queryResultSettings","top","NextPageToken","nextLinkUrl","metadata","others","nextLink","getOrganizationWideOrderShipmentHistory","_orgOrderHistoryResul","queryResultSetting","orgOrderHistoryResults","getOrganizationWideOrderHistory","GetOrganizationWideOrderHistoryInput","orgOrderHistoryResponse","getOrderShipmentHistory","_salesOrder$SalesLine2","saleline","IsVoided","productIdsByChannelId","splitProductsByChannelId","currentChannelId","productIdsByChannel","_salesOrder$SalesLine","orderProductId","orderChannelId","getProductsPromise","entryChannelId","entryProductIdsList","productIds","productInputs","ProductInput","getSimpleProducts","getProducts","getProductsCall","productList","memo","catch","exception","debug","createObservableDataAction","action","getSalesOrderHistoryWithHydrationsActionDataAction","getOrderDetailsPageUrl","orderDetailsUrl","TransactionId","onExpandProductsCallback","expandButtonState","OrderHistoryTableHeaderComponent","orderHistoryOrderNumberText","getMobileHeaderCells","shouldShowOrderPlacedBy","orderHistoryCreatedDateText","orderHistoryItemsText","orderHistoryTotalText","shouldShowChannelInfo","orderHistoryOriginText","getDesktopHeaderCells","formatDate","year","month","day","getShortEllipsisText","originalText","maxTextLength","_document$body$parent","isRtl","body","parentElement","substring","OrderHistoryDesktopTableRowCellComponent","linkToOrderHistoryDetails","itemsCount","orderNumberCellText","orderHistoryOrderNumberIsNotAvailable","isOnBehalfOfOrder","maxOrderTextLength","placedByText","orderHistoryViewDetailsButtonText","orderHistoryViewDetailsButtonAriaLabel","OrderHistoryMobileTableRowCellComponent","orderNumber","dateText","orderHistoryCreatedDateMobileDescriptionText","cellClassName","onKeyPress","OrderHistoryTableRowComponent","OrderHistoryTableComponent","orderHistory","_props$data$originato","o","OrderHistoryViewMode","OrderHistory","handleOrderHistoryHeadingChange","onMoreButtonClick","getOrderHistory","renderExtraActions","_renderOrderHistoryFilter","orderHistoryDetailedViewModeAriaLabel","orderHistoryListViewModeAriaLabel","initState","originatorList","viewState","isShowMoreButton","isLoading","errorCode","_updateOrderHistory","getOriginator","salesIds","_order$SalesId","transactionIds","_order$TransactionId","originatorsInput","GetOrderOriginatorsInput","getOriginatorsAction","response","_error$error","_error$error2","reject","_this$props$config$sh","_Msdyn365$isChannelTy","shouldShowCount","noOrderHistoryLable","moreButtonText","ordersCountLabel","_orderCountLabel","ViewMore","viewMoreAttributes","detailsAriaLabel","detailsLabel","getSalesLinesInputProps","salesLinesLimit","orderHistoryExpandProductsButtonText","orderDetailsAttributes","getSalesOrder"],"mappings":"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","file":"static/js/17.840894722daa774a097b.chunk.js","sourcesContent":["import { Module, Node } from '@msdyn365-commerce-modules/utilities';\r\nimport * as React from 'react';\r\nimport { ISearchResultModalViewProps } from './components';\r\nimport {\r\n ICategoryHierarchyViewProps,\r\n IRefineMenuViewProps,\r\n ISearchResultContainerViewProps,\r\n ISortByViewProps,\r\n ITitleViewProps\r\n} from './mands-search-result-container';\r\n\r\nconst SearchResultContainerView: React.FC = props => {\r\n const {\r\n SearchResultContainer,\r\n products,\r\n pagination,\r\n ProductsContainer,\r\n ProductSectionContainer,\r\n choiceSummary,\r\n isMobile,\r\n modalToggle,\r\n searchResultModal,\r\n TitleViewProps,\r\n refineMenu,\r\n categoryHierarchy,\r\n sortByOptions,\r\n CategoryNavContainer,\r\n RefineAndProductSectionContainer,\r\n errorMessage\r\n } = props;\r\n if (isMobile) {\r\n return (\r\n \r\n {renderCategoryHierarchy(categoryHierarchy)}\r\n {renderTitle(TitleViewProps)}\r\n {choiceSummary}\r\n {modalToggle}\r\n {createSearchResultModal(searchResultModal, refineMenu, sortByOptions)}\r\n \r\n {errorMessage}\r\n {products}\r\n \r\n {pagination}\r\n \r\n );\r\n }\r\n return (\r\n \r\n \r\n {categoryHierarchy && renderCategoryHierarchy(categoryHierarchy)}\r\n {TitleViewProps && renderTitleCount(TitleViewProps)}\r\n \r\n \r\n {refineMenu && renderRefiner(refineMenu)}\r\n \r\n {TitleViewProps && renderTitle(TitleViewProps)}\r\n {choiceSummary}\r\n {sortByOptions && renderSort(sortByOptions)}\r\n \r\n {errorMessage}\r\n {products}\r\n \r\n {pagination}\r\n \r\n \r\n \r\n );\r\n};\r\n\r\nconst createSearchResultModal = (\r\n modalProps: ISearchResultModalViewProps,\r\n refineMenu: IRefineMenuViewProps,\r\n sortByDropDown: ISortByViewProps\r\n): JSX.Element => {\r\n return React.cloneElement(\r\n modalProps.modal,\r\n {},\r\n modalProps.modalHeader,\r\n createModalBody(modalProps, refineMenu, sortByDropDown),\r\n modalProps.modalFooter\r\n );\r\n};\r\n\r\nconst createModalBody = (\r\n props: ISearchResultModalViewProps,\r\n refineMenu: IRefineMenuViewProps,\r\n sortByDropDown: ISortByViewProps\r\n): JSX.Element | null => {\r\n if (sortByDropDown) {\r\n return React.cloneElement(props.modalBody, {}, renderSort(sortByDropDown), renderRefiner(refineMenu));\r\n }\r\n return null;\r\n};\r\n\r\nconst renderRefiner = (props: IRefineMenuViewProps): JSX.Element | null => {\r\n const { refiners, RefineMenuContainer, RefinerSectionContainer } = props;\r\n if (refiners) {\r\n return (\r\n \r\n \r\n {refiners.map((submenu, index) => (\r\n {submenu}\r\n ))}\r\n \r\n \r\n );\r\n }\r\n return null;\r\n};\r\n\r\nconst renderSort = (props: ISortByViewProps): JSX.Element | null => {\r\n const { SortingContainer, sortByDropDown } = props;\r\n if (sortByDropDown) {\r\n return {sortByDropDown};\r\n }\r\n return null;\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 \r\n {categoryHierarchyList.map((category, index) => (\r\n \r\n {category}\r\n {categoryHierarchyList && categoryHierarchyList[index + 1] && categoryHierarchySeparator}\r\n \r\n ))}\r\n \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 \r\n

\r\n {title.titlePrefix}\r\n {title.titleText}\r\n

\r\n
\r\n );\r\n }\r\n return null;\r\n};\r\n\r\nconst renderTitleCount = (props: ITitleViewProps): JSX.Element | null => {\r\n const { title, TitleContainer } = props;\r\n if (title) {\r\n return (\r\n \r\n
{title.titleCount}
\r\n
\r\n );\r\n }\r\n return null;\r\n};\r\n\r\nexport default SearchResultContainerView;\r\n","import * as React from 'react';\r\ninterface IErrorMessage {\r\n text?: string;\r\n}\r\n\r\nexport const ErrorMessage: React.FC = ({ text }) => {\r\n return (\r\n \r\n
{text}
\r\n
\r\n );\r\n};\r\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 { ChannelIdentity, Customer, OrderOriginator, OrderShipments, OrgUnitLocation, SalesOrder } from '@msdyn365-commerce/retail-proxy';\nimport { ArrayExtensions } from '@msdyn365-commerce-modules/retail-actions';\nimport { INodeProps } from '@msdyn365-commerce-modules/utilities';\nimport get from 'lodash/get';\nimport QRCode from 'qrcode.react';\nimport * as React from 'react';\n\nimport { isOboRequest } from '@msdyn365-commerce/core';\nimport { countItems, IModuleComponentProps, IPriceContext } from './utilities';\n\n/**\n * Interface for order information input resources.\n */\nexport interface IOrderInformationInputResources {\n receiptEmailMessage?: string;\n orderItemLabel: string;\n orderItemsLabel: string;\n processingLabel: string;\n orderIdLabel: string;\n receiptIdLabel: string;\n confirmationIdLabel: string;\n trackingLabel: string;\n trackingAriaLabel: string;\n trackingComingSoonLabel: string;\n posChannelNameText?: string;\n onlineStoreChannelNameText?: string;\n orderPlacedOnLabel?: string;\n qrCodeSrText?: string;\n callCenterChannelNameText?: string;\n orderPlacedByFullText?: string;\n orderPlacedByYouText?: string;\n orderOnBehalfOfText?: string;\n}\n\n/**\n * Interface for order information input.\n */\nexport interface IOrderInformationInput {\n moduleName: string;\n channelReferenceId?: string;\n channelName?: string;\n channelAddress?: string;\n showChannelInfo?: boolean;\n receiptEmail?: string;\n createdDate?: string;\n amount?: number;\n priceContext: IPriceContext;\n salesId?: string;\n receiptId?: string;\n hasTrackingInfo?: boolean;\n count?: number;\n resources: IOrderInformationInputResources;\n isSalesInvoice?: boolean;\n shouldShowQrCode?: boolean;\n channelTypeValue?: number;\n originator?: OrderOriginator;\n isYou?: [boolean, boolean];\n isB2bAdmin?: boolean;\n isOnlineStore?: boolean;\n priceCurrency?: string;\n}\n\nconst callCenterChannelTypeValue = 4;\n\n/**\n * Interface for order information.\n */\nexport interface IOrderInformation {\n orderInformationProps: INodeProps;\n channelName: React.ReactNode;\n channelAddress: React.ReactNode;\n placedBy?: React.ReactNode;\n salesId: React.ReactNode;\n receiptId: React.ReactNode;\n receiptEmail: React.ReactNode;\n createdDate: React.ReactNode;\n count: React.ReactNode;\n amount: React.ReactNode;\n channelReferenceId: React.ReactNode;\n}\n\n/**\n * The order confirmation ID node.\n * @param channelReferenceId - The order confirmation id.\n * @param moduleName - The module name.\n * @param confirmationIdLabel - The confirmation label.\n * @param shouldShowQrCode - Should the view show the QR code.\n * @param qrCodeSrText - The screen reader text of the QR code.\n * @returns The react node for order confirmation ID.\n */\nconst getChannelReference = (\n channelReferenceId: string | undefined,\n moduleName: string,\n confirmationIdLabel: string,\n shouldShowQrCode: boolean | undefined,\n qrCodeSrText?: string\n): React.ReactNode | undefined => {\n const confirmationIdNode: React.ReactNode = (\n \n {`${confirmationIdLabel} `}\n {channelReferenceId}\n \n );\n return (\n channelReferenceId &&\n (shouldShowQrCode !== undefined && shouldShowQrCode ? (\n
\n {confirmationIdNode}\n
\n \n \n {qrCodeSrText}\n \n
\n
\n ) : (\n confirmationIdNode\n ))\n );\n};\n\n/**\n * Get Channel name to display on order history.\n * @param channelTypeValue - The channel type.\n * @param moduleName - The module name.\n * @param callCenterChannelNameText - The call center channel name.\n * @param channelAddress - Channel Address.\n * @param posChannelNameText - POS channel name.\n * @param channelName - Channel Name.\n * @param onlineStoreChannelNameText - Online store channel name.\n * @returns The react node for channel name label.\n */\nexport const getChannelName = (\n channelTypeValue: number | undefined,\n moduleName: string,\n callCenterChannelNameText: string | undefined,\n channelAddress: string | undefined,\n posChannelNameText: string | undefined,\n channelName: string | undefined,\n onlineStoreChannelNameText: string | undefined\n): React.ReactNode => {\n let channelNameNode: React.ReactNode;\n if (channelTypeValue === callCenterChannelTypeValue) {\n channelNameNode = {callCenterChannelNameText};\n } else if (channelAddress) {\n const posChannelName = `${posChannelNameText ?? ''} ${channelName ?? ''}`;\n channelNameNode = {posChannelName};\n } else {\n const onlineChannelName = `${onlineStoreChannelNameText ?? ''} ${channelName ?? ''}`;\n channelNameNode = {onlineChannelName};\n }\n return channelNameNode;\n};\n\nconst getPlacedBy = (\n moduleName: string,\n originator: OrderOriginator | undefined,\n isYou: [boolean, boolean] | undefined,\n orderPlacedByFullText: string | undefined,\n orderPlacedByYouText: string | undefined,\n orderOnBehalfOfText: string | undefined\n): React.ReactNode | undefined => {\n let placedByNode: React.ReactNode | undefined;\n\n if (originator) {\n const placedByName =\n originator.StaffId && originator.StaffName\n ? originator.StaffName\n : originator.CustomerId && originator.CustomerName\n ? originator.CustomerName\n : '-';\n const onBehalfOfText = originator.StaffId && originator.StaffName && originator.CustomerId && originator.CustomerName;\n placedByNode = (\n
\n {orderPlacedByFullText} {placedByName} {isYou && isYou[0] && ` ${orderPlacedByYouText}`}\n {onBehalfOfText && (\n
\n {orderOnBehalfOfText} {`${originator.CustomerName}`}\n {isYou && isYou[1] && ` ${orderPlacedByYouText}`}\n
\n )}\n
\n );\n }\n\n return placedByNode;\n};\n\n/**\n * Get order information.\n * @param {IOrderInformationInput} param0 The input for order information.\n * @returns {IOrderInformation} The order information.\n */\nexport const getOrderInformation = ({\n moduleName,\n channelReferenceId,\n channelName,\n channelAddress,\n channelTypeValue,\n showChannelInfo,\n receiptEmail,\n createdDate,\n amount,\n priceContext,\n originator,\n isYou,\n salesId,\n receiptId,\n count,\n resources: {\n receiptEmailMessage,\n orderItemLabel,\n orderItemsLabel,\n orderIdLabel,\n orderPlacedByFullText,\n orderPlacedByYouText,\n orderOnBehalfOfText,\n receiptIdLabel,\n confirmationIdLabel,\n posChannelNameText,\n onlineStoreChannelNameText,\n orderPlacedOnLabel,\n qrCodeSrText,\n callCenterChannelNameText\n },\n isSalesInvoice,\n shouldShowQrCode,\n priceCurrency\n}: IOrderInformationInput): IOrderInformation => {\n const channelNameNode: React.ReactNode = getChannelName(\n channelTypeValue,\n moduleName,\n callCenterChannelNameText,\n channelAddress,\n posChannelNameText,\n channelName,\n onlineStoreChannelNameText\n );\n\n const orderInformation = {\n orderInformationProps: { className: `${moduleName}__order-information` },\n channelName: showChannelInfo && channelName && channelNameNode,\n channelAddress: showChannelInfo && channelAddress && (\n {channelAddress}\n ),\n placedBy: getPlacedBy(moduleName, originator, isYou, orderPlacedByFullText, orderPlacedByYouText, orderOnBehalfOfText),\n salesId: salesId ? {`${orderIdLabel} ${salesId}`} : '',\n receiptId: receiptId ? (\n {`${receiptIdLabel} ${receiptId}`}\n ) : (\n ''\n ),\n receiptEmail: receiptEmail && (\n \n {receiptEmailMessage}\n {receiptEmail}\n \n ),\n createdDate: !isSalesInvoice && createdDate && (\n \n {orderPlacedOnLabel}\n {` `}\n {createdDate}\n \n ),\n count: !isSalesInvoice && count !== undefined && count > 0 && (\n \n {count === 1 ? `${count} ${orderItemLabel}` : `${count} ${orderItemsLabel}`}\n \n ),\n amount: !isSalesInvoice && (amount || amount === 0) && (\n \n ),\n channelReferenceId: getChannelReference(channelReferenceId, moduleName, confirmationIdLabel, shouldShowQrCode, qrCodeSrText)\n };\n\n return orderInformation;\n};\n\n/**\n * Interface for order information props.\n */\ninterface IProps extends IModuleComponentProps {\n resources: IOrderInformationInputResources;\n customer?: Customer;\n}\n\n/**\n * Retrieves order channel name.\n * @param order - Order info.\n * @param channelIdentities - Channels data.\n * @returns String with the name of the channel or an empty string.\n */\nexport const getOrderChannelName: (order: SalesOrder | OrderShipments, channelIdentities?: ChannelIdentity[]) => string = (\n order: SalesOrder | OrderShipments,\n channelIdentities?: ChannelIdentity[]\n) => {\n const orderChannel = channelIdentities?.find(channel => {\n return channel.RecordId === order.ChannelId;\n });\n\n const channelName = orderChannel?.Name ?? '';\n return channelName;\n};\n\n/**\n * Retrieves order channel type value.\n * @param order - Order info.\n * @param channelIdentities - Channels data.\n * @returns The channel type value of the order.\n */\nexport const getOrderChannelTypeValue: (order: SalesOrder | OrderShipments, channelIdentities?: ChannelIdentity[]) => number | undefined = (\n order: SalesOrder | OrderShipments,\n channelIdentities?: ChannelIdentity[]\n) => {\n const orderChannel = channelIdentities?.find(channel => {\n return channel.RecordId === order.ChannelId;\n });\n\n const channelType = orderChannel?.ChannelType.Value;\n return channelType;\n};\n\n/**\n * Retrieves channel is online store or not.\n * @param channelTypeValue - The channel type.\n * @param channelAddress - Channel Address.\n * @returns {Boolean} that indicates that the channel is in the online store.\n */\nexport const isOnlineStoreChannel = (channelTypeValue: number | undefined, channelAddress: string | undefined): boolean => {\n return channelTypeValue !== callCenterChannelTypeValue && !channelAddress;\n};\n\n/**\n * Retrieves order channel address.\n * @param order - Order info.\n * @param orgUnitLocations - OrgUnitLocation data.\n * @returns String with the address of the channel or an empty string.\n */\nexport const getOrderChannelAddress: (order: SalesOrder | OrderShipments, orgUnitLocations?: OrgUnitLocation[]) => string = (\n order: SalesOrder | OrderShipments,\n orgUnitLocations?: OrgUnitLocation[]\n) => {\n const orderOrgUnitLocation = orgUnitLocations?.find(location => {\n return location.ChannelId === order.ChannelId;\n });\n\n const channelAddress = orderOrgUnitLocation?.Address ?? '';\n return channelAddress;\n};\n\n/**\n * Get order information input.\n * @param {IProps} props The properties.\n * @param {string} moduleName The module name.\n * @param {SalesOrder | OrderShipments} order The sales order or order shipments.\n * @param {IPriceContext} priceContext The price context.\n * @param {ChannelIdentity[]} channelIdentities A list of channel identities.\n * @param {OrgUnitLocation[]} orgUnitLocations A list of organization unit locations.\n * @param {Customer} customer A current customer.\n * @param {OrderOriginator} originator The order originator.\n * @param {boolean} showChannelInfo Should the view show channel information.\n * @param {boolean} isSalesInvoice Is this a sales invoice.\n * @param {boolean} shouldShowQrCode Should the view show QR code.\n * @returns {IOrderInformationInput} The order information input.\n */\nexport const getOrderInformationInput = (\n props: IProps,\n moduleName: string,\n order: SalesOrder | OrderShipments,\n priceContext: IPriceContext,\n channelIdentities?: ChannelIdentity[],\n orgUnitLocations?: OrgUnitLocation[],\n customer?: Customer,\n originator?: OrderOriginator,\n showChannelInfo?: boolean,\n isSalesInvoice?: boolean,\n shouldShowQrCode?: boolean\n): IOrderInformationInput => {\n const {\n resources,\n context: {\n request: {\n apiSettings: { channelId }\n }\n }\n } = props;\n\n // @ts-expect-error OrderShipments doesn't has ChannelId\n const showTrackingInfo = !!order.ChannelId && order.ChannelId === channelId;\n\n const locale = get(props, 'context.request.locale') || 'en-US';\n const count = order.SalesLines && ArrayExtensions.hasElements(order.SalesLines) ? countItems(order.SalesLines) : 0;\n const channelTypeValue = getOrderChannelTypeValue(order, channelIdentities);\n const channelAddress = getOrderChannelAddress(order, orgUnitLocations);\n const isYou =\n !isOboRequest(props.context.request) &&\n originator?.CustomerId &&\n originator?.CustomerName &&\n !originator?.StaffId &&\n !originator?.StaffName &&\n customer?.AccountNumber === originator?.CustomerId\n ? true\n : false;\n const isYouObo = !isYou && !isOboRequest(props.context.request);\n\n return {\n moduleName,\n createdDate: (order.CreatedDateTime && new Date(order.CreatedDateTime).toLocaleDateString(locale)) || '',\n salesId: order.SalesId,\n priceCurrency: order.CurrencyCode,\n originator: originator,\n isYou: [isYou, isYouObo],\n isB2bAdmin: customer?.IsB2bAdmin,\n receiptId: order.ReceiptId,\n showChannelInfo,\n\n // @ts-expect-error OrderShipments doesn't has ReceiptEmail\n receiptEmail: order.ReceiptEmail,\n channelReferenceId: order.ChannelReferenceId,\n channelName: getOrderChannelName(order, channelIdentities),\n channelAddress: channelAddress,\n amount: order.TotalAmount ?? 0,\n priceContext,\n count,\n resources,\n isSalesInvoice,\n shouldShowQrCode,\n channelTypeValue: channelTypeValue,\n isOnlineStore: isOnlineStoreChannel(channelTypeValue, channelAddress)\n };\n};\n","/* eslint-disable @typescript-eslint/no-floating-promises */\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 {\r\n ILabeledDropdownOnChangeNotification,\r\n ILabeledDropdownOption,\r\n IModuleProps,\r\n INodeProps,\r\n LabeledDropdown,\r\n UncontrolledPagination\r\n} from '@msdyn365-commerce-modules/utilities';\r\nimport {\r\n CategoryHierarchy as CategoryHierarchyData,\r\n IProductRefinerHierarchy,\r\n IProductsDimensionsAvailabilities\r\n} from '@msdyn365-commerce/commerce-entities';\r\nimport {\r\n format,\r\n ProductRefinerValue,\r\n SortColumn,\r\n TextValueTranslation,\r\n ChannelInventoryConfiguration,\r\n StoreOperationsDataActions\r\n} from '@msdyn365-commerce/retail-proxy';\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 {\r\n BaseCollectionInput,\r\n getInventoryRefinerAction,\r\n buildListPageUrl,\r\n getCollectionProducts,\r\n getCurrentUrl,\r\n GetFullProductsByCollectionInput,\r\n parseQueryParam,\r\n sortOptions,\r\n ProductListInventoryFilteringOptions,\r\n InventoryInStockRefinerValueInput\r\n} from './actions';\r\nimport {\r\n ErrorMessage,\r\n getUpdatedRefinementCriteria,\r\n IChoiceSummaryClickNotification,\r\n IRefineItemCommonProps,\r\n IRefineItemToggleNotification,\r\n ISearchResultModalViewProps,\r\n isMatchingRefinementCriterion,\r\n Link,\r\n ModalToggle,\r\n ProductSearchResultItems,\r\n SearchResultModal,\r\n Separator,\r\n Title\r\n} from './components';\r\nimport ChoiceSummary from './components/choice-summary';\r\nimport RefineSubmenu from './components/refine-submenu';\r\nimport { IMandsSearchResultContainerData } from './mands-search-result-container.data';\r\nimport { IMandsSearchResultContainerProps } from './mands-search-result-container.props.autogenerated';\r\nimport MsDyn365, { ICoreContext, getCatalogId } from '@msdyn365-commerce/core';\r\nimport {\r\n ArrayExtensions,\r\n IDimensionsApp,\r\n DimensionTypes,\r\n DimensionAvailabilitiesForProductSearchResultInput,\r\n getDimensionAvailabilitiesForProductSearchResultAction,\r\n DimensionSwatchDisplayTypes\r\n} from '@msdyn365-commerce-modules/retail-actions';\r\nimport { ListPageState } from './list-page-state';\r\n\r\nexport interface ISearchResultContainerViewProps extends IMandsSearchResultContainerProps {\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 searchResultModal: ISearchResultModalViewProps;\r\n isMobile: boolean;\r\n CategoryNavContainer: INodeProps;\r\n RefineAndProductSectionContainer: INodeProps;\r\n errorMessage: React.ReactNode;\r\n productsDimensionAvailabilities?: IProductsDimensionsAvailabilities[][];\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 channelInventoryConfiguration?: ChannelInventoryConfiguration;\r\n productsDimensionAvailabilities?: IProductsDimensionsAvailabilities[][];\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>}\r\n */\r\n@observer\r\nexport default class SearchResultContainer extends React.PureComponent<\r\n IMandsSearchResultContainerProps,\r\n 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;\r\n private _sortAndFilterContainerRef: React.RefObject;\r\n\r\n private _isMounted: boolean = false;\r\n private readonly catalogId = getCatalogId(this.props.context.request);\r\n\r\n public static getFriendlyName(locale: string, nameTranslations?: TextValueTranslation[]): string | undefined {\r\n let nameTranslation: TextValueTranslation | undefined;\r\n if (locale && nameTranslations && ArrayExtensions.hasElements(nameTranslations)) {\r\n nameTranslation = nameTranslations.find(item => item.Language!.toLowerCase() === locale.toLowerCase());\r\n }\r\n return nameTranslation?.Text;\r\n }\r\n\r\n constructor(props: IMandsSearchResultContainerProps, state: ISearchResultContainerState) {\r\n super(props);\r\n this._viewport =\r\n props.context.request && props.context.request.device && props.context.request.device.Type === 'Mobile' ? 'xs' : 'lg';\r\n this._modalToggleRef = React.createRef();\r\n this._sortAndFilterContainerRef = React.createRef();\r\n this._toggleModal = this._toggleModal.bind(this);\r\n this._updateViewport = this._updateViewport.bind(this);\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 channelInventoryConfiguration: undefined\r\n };\r\n const { placeholderTextMax, minLabel, maxLabel, rangeNameFormat } = 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\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 =\r\n (this.props.context.request.query && +this.props.context.request.query.skip / (this.props.config.itemsPerPage || 10)) ||\r\n 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\r\n // Initialize reaction based on listPageState properties\r\n reaction(\r\n () => {\r\n return [\r\n listPageState.activeFilters && listPageState.activeFilters.length,\r\n listPageState.currentPageNumber,\r\n listPageState.sortingCritera &&\r\n listPageState.sortingCritera.Columns &&\r\n listPageState.sortingCritera.Columns.length\r\n ];\r\n },\r\n () => {\r\n const input = new GetFullProductsByCollectionInput(\r\n listPageState.pageType,\r\n this.props.context.request.apiSettings,\r\n {\r\n Paging: {\r\n Top: this.props.config.itemsPerPage,\r\n Skip: Math.max(listPageState.pageSize * (listPageState.currentPageNumber || 0), 0)\r\n },\r\n count: true,\r\n Sorting: listPageState.sortingCritera || {}\r\n },\r\n listPageState.activeFilters || [],\r\n +(this.props.context.request.urlTokens.recordId || 0),\r\n // this.props.context.request.query && this.props.context.request.query.q\r\n // eslint-disable-next-line max-len -- existing code\r\n this.props.context.request.query?.q\r\n ? this.props.context.request.query.q\r\n : JSON.stringify({\r\n ProductId: this.props.context.request.query?.productId,\r\n Recommendation: this.props.context.request.query?.recommendation\r\n }),\r\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- Required check.\r\n !!this.props?.config?.includeAttributes,\r\n this.props.config.updateRefinerPanel,\r\n this.props.context.request.locale,\r\n this.catalogId\r\n );\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 });\r\n }\r\n );\r\n });\r\n });\r\n this._updateViewport();\r\n }\r\n\r\n public async componentDidMount(): Promise {\r\n this._isMounted = true;\r\n if (MsDyn365.isBrowser && window.addEventListener) {\r\n // if (typeof window !== undefined && window.addEventListener) {\r\n window.addEventListener('resize', this._updateViewport);\r\n this._updateViewport();\r\n }\r\n\r\n const context = this.props.context as ICoreContext;\r\n const dimensionsToDisplayOnProductCard = context.app.config.dimensionsInProductCard;\r\n const dimensionsToDisplayAsSwatch = context.app.config.dimensionsAsSwatchType;\r\n if (\r\n ArrayExtensions.hasElements(dimensionsToDisplayOnProductCard) &&\r\n !dimensionsToDisplayOnProductCard.includes(DimensionTypes.none) &&\r\n ArrayExtensions.hasElements(dimensionsToDisplayAsSwatch) &&\r\n !dimensionsToDisplayAsSwatch.includes(DimensionTypes.none) &&\r\n this.props.config.includeAttributes\r\n ) {\r\n // eslint-disable-next-line @typescript-eslint/no-floating-promises -- Call api to retrieve the availabilities of dimensions data without blocking the UI.\r\n this._getProductsDimensionsAvailabilities();\r\n }\r\n const channelInventoryConfiguration = await StoreOperationsDataActions.getInventoryConfigurationAsync({\r\n callerContext: this.props.context.actionContext\r\n });\r\n if (this._isMounted) {\r\n this.setState({ channelInventoryConfiguration });\r\n }\r\n const listPageState = await this.props.data.listPageState;\r\n // Push inventory in stock refiner when productListInventoryDisplay is hide oos\r\n const inventoryRefiner = await this._getInventoryRefiner(listPageState, channelInventoryConfiguration);\r\n const input = new GetFullProductsByCollectionInput(\r\n listPageState.pageType,\r\n this.props.context.request.apiSettings,\r\n {\r\n Paging: {\r\n Top: this.props.config.itemsPerPage,\r\n Skip: Math.max(listPageState.pageSize * (listPageState.currentPageNumber || 0), 0)\r\n },\r\n count: true,\r\n Sorting: listPageState.sortingCritera || {}\r\n },\r\n listPageState.activeFilters || [],\r\n +(this.props.context.request.urlTokens.recordId || 0),\r\n // this.props.context.request.query && this.props.context.request.query.q\r\n // eslint-disable-next-line max-len -- existing code\r\n this.props.context.request.query?.q\r\n ? this.props.context.request.query.q\r\n : JSON.stringify({\r\n ProductId: this.props.context.request.query?.productId,\r\n Recommendation: this.props.context.request.query?.recommendation\r\n }),\r\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- Required check.\r\n !!this.props?.config?.includeAttributes,\r\n this.props.config.updateRefinerPanel,\r\n this.props.context.request.locale,\r\n this.catalogId,\r\n channelInventoryConfiguration,\r\n inventoryRefiner\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 });\r\n }\r\n\r\n public componentWillUnmount(): void {\r\n this._isMounted = false;\r\n if (MsDyn365.isBrowser && window.addEventListener) {\r\n // if (typeof window !== undefined && window.addEventListener) {\r\n window.removeEventListener('resize', this._updateViewport);\r\n }\r\n }\r\n\r\n public render(): JSX.Element {\r\n const { imageSettings, className } = this.props.config;\r\n const { resources, telemetry } = this.props;\r\n const products = (this.props.data.listPageState.result && this.props.data.listPageState.result.activeProducts) || [];\r\n let errorText = '';\r\n if (!products || products.length === 0) {\r\n errorText = this._pageType === 'Category' ? resources.resultCategoryNotFoundText : resources.resultSearchNotFoundText;\r\n }\r\n const productComparisonButton = ArrayExtensions.hasElements(this.props.slots.productComparisonButton)\r\n ? this.props.slots.productComparisonButton[0]\r\n : null;\r\n const productsComponent = (\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._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:\r\n this.props.data.listPageState.result && this.props.data.listPageState.result.totalProductCount !== 0\r\n ? this._getSortingDropDown()\r\n : 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:\r\n this.props.data.listPageState.result && this.props.data.listPageState.result.totalProductCount !== 0 ? (\r\n \r\n ) : null,\r\n searchResultModal: this._getSearchResultModal(),\r\n isMobile: this.isMobile,\r\n errorMessage: errorText && ,\r\n productsDimensionAvailabilities: this.state.productsDimensionAvailabilities\r\n };\r\n return this.props.renderView(searchResultContainerViewProps) as React.ReactElement;\r\n }\r\n\r\n /**\r\n * Get products dimension availabilities.\r\n * @returns Void.\r\n */\r\n private readonly _getProductsDimensionsAvailabilities = async (): Promise => {\r\n const productsList = this.props.data.listPageState.result?.activeProducts ?? [];\r\n\r\n const productsDimensionAvailabilities = await getDimensionAvailabilitiesForProductSearchResultAction(\r\n new DimensionAvailabilitiesForProductSearchResultInput(\r\n productsList,\r\n this.props.context as ICoreContext,\r\n DimensionSwatchDisplayTypes.productCard\r\n ),\r\n this.props.context.actionContext\r\n );\r\n\r\n if (ArrayExtensions.hasElements(productsDimensionAvailabilities)) {\r\n this.setState({ productsDimensionAvailabilities });\r\n }\r\n };\r\n\r\n private _getSearchResultModal = (): ISearchResultModalViewProps => {\r\n const { resources } = this.props;\r\n return SearchResultModal({\r\n resources: {\r\n modalCloseButtonText: resources.modalCloseButtonText,\r\n modalTitle: resources.modalTitle\r\n },\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 =\r\n (data.category.result &&\r\n SearchResultContainer.getFriendlyName(context.request.locale, data.category.result.NameTranslations)) ||\r\n (data.category.result && data.category.result.Name) ||\r\n this.props.context.request.query?.title ||\r\n '';\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 =\r\n productCountNumber !== 1\r\n ? format(this.props.resources.numberOfProducts, productCountNumber)\r\n : this.props.resources.oneProduct;\r\n } else {\r\n productCountText = format(this.props.resources.numberOfProducts, 0);\r\n }\r\n const titlePrefix = ;\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 private _getCategoryHierarchy = (): ICategoryHierarchyViewProps => {\r\n const { data } = this.props;\r\n const categoryHierarchy = data.categoryHierarchy.result;\r\n const categoryLinks =\r\n categoryHierarchy &&\r\n categoryHierarchy.map((value: CategoryHierarchyData, index: number) => {\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 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 );\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 =\r\n 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={\r\n <div className='msc-pagination__prev'>\r\n <span className='ms-search-result__pagination-left' aria-hidden='true' />\r\n <span className='prev-text'>{previousText}</span>\r\n </div>\r\n }\r\n nextText={\r\n <div className='msc-pagination__next'>\r\n <span className='next-text'>{nextText}</span>\r\n <span className='ms-search-result__pagination-right' aria-hidden='true' />\r\n </div>\r\n }\r\n previousAriaLabel={previousText}\r\n nextAriaLabel={nextText}\r\n />\r\n );\r\n };\r\n\r\n private _getRefineMenu = (): IRefineMenuViewProps => {\r\n const { data, context } = this.props;\r\n const tempRangeTypeTODO = context.request.query && context.request.query.inputRange ? 'input' : 'slider';\r\n const validRefiners =\r\n data.refiners.result &&\r\n 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 const subMenus =\r\n validRefiners &&\r\n validRefiners.map((productRefinerHierarchy: IProductRefinerHierarchy, index: number) => {\r\n return data.listPageState.result!.totalProductCount !== 0 ? (\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={true}\r\n tempRangeTypeTODO={tempRangeTypeTODO}\r\n context={context}\r\n moduleId={this.props.id}\r\n moduleTypeName={this.props.typeName}\r\n />\r\n ) : null;\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 * Get inventory refiners.\r\n * @param listPageState The listPageState\r\n * @returns inventory refiner.\r\n */\r\n private readonly _getInventoryRefiner = async (\r\n listPageState: ListPageState,\r\n channelInventoryConfiguration: ChannelInventoryConfiguration\r\n ): Promise<IProductRefinerHierarchy | undefined> => {\r\n if (this.props.context.app.config.productListInventoryDisplay === ProductListInventoryFilteringOptions.HideOOS) {\r\n const baseCollectionInput = new BaseCollectionInput(\r\n listPageState.pageType,\r\n this.props.context.request.apiSettings,\r\n {\r\n count: true\r\n },\r\n // Parameter - refiners\r\n [],\r\n // Parameter - category\r\n undefined,\r\n // Parameter - searchText\r\n '',\r\n // Parameter - includeAttributes\r\n false,\r\n // Parameter - isUpdateRefinerPanel\r\n false,\r\n // Parameter - locale\r\n undefined,\r\n this.catalogId,\r\n channelInventoryConfiguration\r\n );\r\n const inventoryInStockRefinerValueInput = new InventoryInStockRefinerValueInput(\r\n baseCollectionInput,\r\n channelInventoryConfiguration?.InventoryProductAttributeRecordId\r\n );\r\n return getInventoryRefinerAction(inventoryInStockRefinerValueInput, this.props.context.actionContext);\r\n }\r\n return Promise.resolve(undefined);\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 const refinerValueName = this.props.data.refiners.result?.find(rating => rating.KeyName === 'Rating');\r\n\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 refinerValues={refinerValueName}\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 ' : ''} ${\r\n !actionContext ? 'actionContext ' : ''\r\n } could not be found`;\r\n this.props.telemetry.warning(error);\r\n }\r\n\r\n window.history.pushState(\r\n {},\r\n '',\r\n buildListPageUrl(\r\n getCurrentUrl(this.props.context.request),\r\n undefined,\r\n [this._getSortColumnFromSelectedOption(notification.selectedOption)],\r\n undefined\r\n )\r\n );\r\n transaction(() => {\r\n this.props.data.listPageState.result!.currentPageNumber = 0;\r\n this.props.data.listPageState.result!.sortingCritera = {\r\n Columns: [this._getSortColumnFromSelectedOption(notification.selectedOption)]\r\n };\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 => {\r\n return searchConfiguration.key === option.key;\r\n });\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 (\r\n mappedSearchConfig.sortColumn.ColumnName === activeSortColumn.ColumnName &&\r\n mappedSearchConfig.sortColumn.IsDescending === activeSortColumn.IsDescending\r\n );\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 ' : ''} ${\r\n !actionContext ? 'actionContext ' : ''\r\n } could not be found`;\r\n this.props.telemetry.warning(error);\r\n }\r\n\r\n const updatedRefinementCriteria = getUpdatedRefinementCriteria(\r\n itemToggleNotification,\r\n (this.props.data.listPageState.result && this.props.data.listPageState.result.activeFilters) || []\r\n );\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(\r\n itemToggleNotification,\r\n this.props.data.listPageState.result.activeFilters || []\r\n );\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 }, 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 // if (typeof window !== undefined && 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 'xs';\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","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>;\r\n","import { Button, Modal, ModalBody, ModalFooter, ModalHeader } 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}\r\n\r\nexport const ModalToggle: React.FC<IModalToggleProps> = (props: IModalToggleProps) => {\r\n const { text, onClick, ariaLabel, innerRef, id } = props;\r\n return (\r\n <button id={id} className='msc-button' aria-label={ariaLabel} onClick={onClick} ref={innerRef}>\r\n {text}\r\n </button>\r\n );\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'}\r\n zIndex={1050}\r\n />\r\n );\r\n};\r\n\r\nconst modalHeaderNode = (props: ISearchResultModalProps) => {\r\n return <ModalHeader toggle={props.onModalToggle}>{props.resources.modalTitle}</ModalHeader>;\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","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { Address as AddressRetail } from '@msdyn365-commerce/retail-proxy';\nimport * as React from 'react';\n\nexport type addressType = 'store' | 'ship';\n\nexport interface IShippingAddressProps {\n moduleName: string;\n address: AddressRetail;\n deliveryType: string;\n showCompleteAddress?: boolean;\n resource: {\n shipToLabel: string;\n storeLabel: string;\n phoneLabel: string;\n phoneAriaLabel: string;\n };\n}\n\nconst Address: React.SFC<IShippingAddressProps> = ({\n moduleName,\n address,\n deliveryType,\n showCompleteAddress,\n resource: { shipToLabel, storeLabel, phoneLabel }\n}) => (\n <div className={`${moduleName}__address deliveryType-${deliveryType}`}>\n <div className={`${moduleName}__address-header`}>{deliveryType !== 'ship' ? storeLabel : shipToLabel}</div>\n {address.Name && <span className={`${moduleName}__address-name`}>{address.Name}</span>}\n {showCompleteAddress ? (\n <>\n {address.Street && (\n <span className={`${moduleName}__address-street`}>\n {address.Street}\n {` `}\n </span>\n )}\n {address.City && <span className={`${moduleName}__address-city`}>{address.City}</span>}\n {address.State && <span className={`${moduleName}__address-state`}>{`, ${address.State}`}</span>}\n {address.County && <span className={`${moduleName}__address-county`}>{`, ${address.County}`}</span>}\n {address.ZipCode && <span className={`${moduleName}__address-zipcode`}>{` ${address.ZipCode}`}</span>}\n {address.ThreeLetterISORegionName && (\n <span className={`${moduleName}__address-threeletterisoregionname`}>{` ${address.ThreeLetterISORegionName}`}</span>\n )}\n {address.Phone && (\n <span className={`${moduleName}__address-phone`}>\n <span className={`${moduleName}__address-phone-label`}>{phoneLabel}</span>\n <span className={`${moduleName}__address-phone-icon`} aria-hidden='true' />\n {address.Phone}\n </span>\n )}\n </>\n ) : (\n address.FullAddress && <span className={`${moduleName}__address-full-address`}>{address.FullAddress}</span>\n )}\n </div>\n);\n\nexport default React.memo(Address);\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 { ProductComponent } from '@msdyn365-commerce/components';\r\nimport { ICoreContext, IImageSettings, ITelemetry } from '@msdyn365-commerce/core';\r\nimport { ProductSearchResult } from '@msdyn365-commerce/retail-proxy';\r\nimport * as React from 'react';\r\nimport { IMandsSearchResultContainerResources } from '../mands-search-result-container.props.autogenerated';\r\n\r\ninterface IProductSearchResultItems {\r\n products: ProductSearchResult[];\r\n context: ICoreContext;\r\n resources: IMandsSearchResultContainerResources;\r\n telemetry: ITelemetry;\r\n imageSettings?: IImageSettings;\r\n moduleType: string;\r\n moduleId: string;\r\n productComparisonButton?: {} | null | undefined;\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 productComparisonButton\r\n}) => {\r\n return (\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 imageSettings={imageSettings}\r\n freePriceText={resources.priceFree}\r\n originalPriceText={resources.originalPriceText}\r\n currentPriceText={resources.currentPriceText}\r\n ratingAriaLabel={resources.ratingAriaLabel}\r\n id={moduleId}\r\n typeName={moduleType}\r\n data={{ product: product }}\r\n productComparisonButton={productComparisonButton}\r\n />\r\n </li>\r\n ))}\r\n </ul>\r\n );\r\n};\r\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","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 }) => (\r\n <a className={className} href={href} aria-label={ariaLabel}>\r\n {' '}\r\n {text}{' '}\r\n </a>\r\n);\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\nimport { ISliderChangeNotification } from '@msdyn365-commerce-modules/utilities/dist/types';\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 getFormattedSelectedMinValue: IPriceObject[] | undefined;\r\n getFormattedSelectedMaxValue: IPriceObject[] | undefined;\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 formattedSelectedMin: IPriceObject[] | undefined;\r\n formattedSelectedMax: IPriceObject[] | undefined;\r\n}\r\n\r\nexport interface IPriceObject {\r\n priceValue: string;\r\n selected: boolean;\r\n disabled: 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 @computed get currencyCode(): string {\r\n return this.props.productRefinerValue.UnitText || '';\r\n }\r\n\r\n public min = this.props.productRefinerValue.LeftValueBoundString || '0';\r\n public max = this.props.productRefinerValue.RightValueBoundString || this.props.productRefinerValue.RightValueBoundString;\r\n private _formattedPriceReverseLookup: Map<string, string> = new Map();\r\n\r\n private minInput: React.RefObject<HTMLSelectElement>;\r\n private maxInput: React.RefObject<HTMLSelectElement>;\r\n\r\n constructor(props: IRangeRefineItemProps) {\r\n super(props);\r\n\r\n this.minInput = React.createRef<HTMLSelectElement>();\r\n this.maxInput = React.createRef<HTMLSelectElement>();\r\n\r\n const { productRefinerValue } = this.props;\r\n const initialMin = (productRefinerValue && productRefinerValue.LeftValueBoundString) || '0';\r\n const initialMax = (productRefinerValue && productRefinerValue.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 formattedSelectedMin: props.getFormattedSelectedMinValue,\r\n formattedSelectedMax: props.getFormattedSelectedMaxValue\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(\r\n 'Cannot render refine value range without productRefinerValue and parentProductRefinerHierarchy'\r\n );\r\n return undefined;\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 { 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 const minInputClassName = `ms-refine-submenu__input-range refine-submenu__input-range-min ${\r\n validationErrorMin ? 'refine-submenu__input-range--error' : ''\r\n }`;\r\n const maxInputClassName = `ms-refine-submenu__input-range refine-submenu__input-range-max ${\r\n validationErrorMax ? 'refine-submenu__input-range--error' : ''\r\n }`;\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 { formattedSelectedMax, formattedSelectedMin } = this.state;\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 <select className={minInputClassName} onChange={this._finishChangeMin} ref={this.minInput}>\r\n {formattedSelectedMin &&\r\n formattedSelectedMin.map((value, key) => {\r\n return (\r\n <option key={value.priceValue} selected={value.selected} role='button' value={value.priceValue}>\r\n {value.priceValue}\r\n </option>\r\n );\r\n })}\r\n </select>\r\n </label>\r\n <label className={maxLabelClassName}>\r\n {refineItemCommonProps.maxLabel} ({'£'})\r\n <select\r\n className={maxInputClassName}\r\n placeholder={formattedSelectedMax ? undefined : refineItemCommonProps.placeholderTextMax}\r\n onChange={this._finishChangeMax}\r\n ref={this.maxInput}\r\n >\r\n {formattedSelectedMax &&\r\n formattedSelectedMax.map((value, key) => {\r\n return (\r\n <option key={value.priceValue} selected={value.selected} role='button' value={value.priceValue}>\r\n {value.priceValue}\r\n </option>\r\n );\r\n })}\r\n </select>\r\n </label>\r\n {validationErrorMin && (\r\n <span className='ms-refine-submenu__input-range-error-text refine-submenu__input-range-min-error-text'>\r\n {validationErrorMin}\r\n </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'>\r\n {validationErrorMax}\r\n </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 =\r\n (selectedRefinementCriterion && selectedRefinementCriterion.LeftValueBoundString) ||\r\n productRefinerValue.LeftValueBoundString ||\r\n '0';\r\n const selectedMax =\r\n (selectedRefinementCriterion && selectedRefinementCriterion.RightValueBoundString) ||\r\n productRefinerValue.RightValueBoundString ||\r\n 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 _finishChangeMin = (event: React.FocusEvent<HTMLSelectElement>): boolean => {\r\n const selectedMinValue = this._getInputWithoutFormatting(event.currentTarget.value);\r\n const selectedMaxValue = this.maxInput.current!.value;\r\n const priceObjectArray = [...this.props.getFormattedSelectedMinValue!];\r\n const selectedPriceObject = priceObjectArray.find(x => x.priceValue === selectedMinValue);\r\n const previousPriceObject = priceObjectArray.find(x => x.selected === true);\r\n priceObjectArray.map((value, index) => {\r\n if (selectedPriceObject && selectedPriceObject.priceValue === value.priceValue) {\r\n selectedPriceObject.selected = true;\r\n }\r\n if (previousPriceObject && previousPriceObject.priceValue === value.priceValue) {\r\n previousPriceObject.selected = false;\r\n }\r\n return value;\r\n });\r\n this.setState({\r\n selectedMin: selectedMinValue,\r\n minTouched: false\r\n });\r\n const minInput = Number(selectedMinValue);\r\n const maxInput = Number(selectedMaxValue);\r\n const { onToggle, parentProductRefinerHierarchy, productRefinerValue, refineItemCommonProps } = this.props;\r\n const max = (productRefinerValue && productRefinerValue.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: maxInput\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<HTMLSelectElement>): boolean => {\r\n const selectedMaxValue = this._getInputWithoutFormatting(event.currentTarget.value);\r\n const selectedMinValue = this.minInput.current!.value;\r\n\r\n const priceObjectArray = [...this.props.getFormattedSelectedMaxValue!];\r\n const selectedPriceObject = priceObjectArray.find(x => x.priceValue === selectedMaxValue);\r\n const previousPriceObject = priceObjectArray.find(x => x.selected === true);\r\n priceObjectArray.map((value, index) => {\r\n if (selectedPriceObject && selectedPriceObject.priceValue === value.priceValue) {\r\n selectedPriceObject.selected = true;\r\n }\r\n if (previousPriceObject && previousPriceObject.priceValue === value.priceValue) {\r\n previousPriceObject.selected = false;\r\n }\r\n return value;\r\n });\r\n\r\n this.setState({\r\n selectedMax: selectedMaxValue,\r\n maxTouched: false\r\n });\r\n const maxInput = Number(selectedMaxValue);\r\n const minInput = Number(selectedMinValue); // here is the value\r\n const { onToggle, parentProductRefinerHierarchy, productRefinerValue, refineItemCommonProps } = this.props;\r\n const min = (productRefinerValue && productRefinerValue.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: minInput,\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 _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 private _onRangeUpdate = (sliderChangeNotification: Readonly<ISliderChangeNotification>): 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 private _onRangeUpdateEnd = (sliderChangeNotification: Readonly<ISliderChangeNotification>): 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 private _focusOnSliderThumb = (sliderChangeNotification: Readonly<ISliderChangeNotification>): void => {\r\n if (sliderChangeNotification.id) {\r\n const element = document.getElementById(sliderChangeNotification.id);\r\n if (!!element) {\r\n setTimeout(() => {\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}\r\n","import { IProductRefinerHierarchy } from '@msdyn365-commerce/commerce-entities';\r\n// import { 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 { IRefineItemToggleNotification, IRefineItemCommonProps } from '@msdyn365-commerce-modules/search-result-container/dist/types';\r\nimport { ProductRefinerSource, ProductRefinerTypeValue } from './utilities';\r\n\r\n/**\r\n * RefineItem properties\r\n */\r\nexport interface IRefineItemProps {\r\n parentProductRefinerHierarchy: IProductRefinerHierarchy;\r\n productRefinerValue: ProductRefinerValue;\r\n selectedRefinementCriterion: ProductRefinerValue | undefined;\r\n refineItemCommonProps: IRefineItemCommonProps;\r\n isDisabled: boolean;\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\nclass 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 children,\r\n onToggle,\r\n context,\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(\r\n `[refine-item] RefineItem without LeftValueBoundString: ${JSON.stringify(productRefinerValue)}`\r\n );\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 <span className='refine-submenu-item__rating'>\r\n {productRefinerValue.Count !== undefined && `(${productRefinerValue.Count})`}\r\n </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\r\n className='ms-refine-submenu-item'\r\n role={role}\r\n id={`${parentProductRefinerHierarchy.KeyName!}_${productRefinerValue.LeftValueBoundString}`}\r\n >\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='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 this.anchorType.current && this.anchorType.current.focus();\r\n }, 0);\r\n }\r\n };\r\n}\r\nexport default RefineItem;\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 } 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 RangeRefineItem, { RangeRefineItemType, IPriceObject } from './range-refine-item';\r\nimport RefineItem from './refine-item';\r\nimport { IRefineItemToggleNotification, IRefineItemCommonProps } from '@msdyn365-commerce-modules/search-result-container/dist/types';\r\n// import { IRefineItemCommonProps } from '@msdyn365-commerce-modules/search-result-container/dist/types';\r\nimport { findMatchingRefinementCriterion, 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 refineItemCommonProps: IRefineItemCommonProps;\r\n isDisabled: boolean;\r\n isExpandedOnInitialLoad: boolean;\r\n context: ICoreContext;\r\n moduleId: string;\r\n moduleTypeName: string;\r\n className: string;\r\n isOpen: boolean;\r\n refinerId: number;\r\n onUpdateRefiners(notfication: Readonly<IRefineItemToggleNotification>): void;\r\n urlBuilder(refiner: IRefineItemToggleNotification): string;\r\n toggleAllRefiners(activeRefiner: number): void;\r\n // onGameItemClick(val1:string, val2:string): any;\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 isMobile: boolean;\r\n minPricesObject?: IPriceObject[] | undefined;\r\n maxPricesObject?: IPriceObject[] | undefined;\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 this._onToggleItem = this._onToggleItem.bind(this);\r\n this._onToggleSubmenu = this._onToggleSubmenu.bind(this);\r\n let isExpanded = this.props.isExpandedOnInitialLoad;\r\n if (this.props.productRefinerHierarchy.DataTypeValue === ProductRefinerValueDataTypeValue.Range) {\r\n isExpanded = false;\r\n }\r\n const leftValueString = props.productRefinerHierarchy.Values[0].LeftValueBoundString;\r\n const rightValueString = props.productRefinerHierarchy.Values[0].RightValueBoundString;\r\n\r\n this.state = {\r\n expanded: isExpanded,\r\n minPricesObject: this._getFormattedSelectedValue(leftValueString, rightValueString, 'min'),\r\n maxPricesObject: this._getFormattedSelectedValue(leftValueString, rightValueString, 'max'),\r\n isMobile: props.context.request && props.context.request.device && props.context.request.device.Type === 'Mobile' ? true : false\r\n };\r\n }\r\n\r\n public toggleAllRefiners = () => {\r\n this.props.toggleAllRefiners(this.props.refinerId);\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 return (\r\n <div className={`${this.props.className} ms-refine-submenu list-group`}>\r\n <Button\r\n className={this.props.isOpen ? 'ms-refine-submenu__toggle_expanded' : 'ms-refine-submenu__toggle_collapsed'}\r\n aria-label={productRefinerHierarchy.KeyName || 'refiner.Name'}\r\n onClick={this.toggleAllRefiners}\r\n aria-expanded={this.props.isOpen}\r\n >\r\n {productRefinerHierarchy.KeyName}\r\n </Button>\r\n <Collapse isOpen={this.props.isOpen} timeout={50}>\r\n <div className='collapse-close' role='button' onClick={this.toggleAllRefiners} />\r\n {this._renderChildItems(productRefinerHierarchy)}\r\n {!this.state.isMobile && <Button onClick={this.toggleAllRefiners}>Done</Button>}\r\n </Collapse>\r\n </div>\r\n );\r\n }\r\n\r\n private _getFormattedSelectedValue = (\r\n selectedMin: string | undefined,\r\n selectedMax: string | undefined,\r\n type: string | undefined\r\n ): IPriceObject[] | undefined => {\r\n const differenceValue = 2;\r\n const minPrice = selectedMin ? Math.floor(Number(selectedMin)) : 0;\r\n const maxPrice = selectedMax ? Math.ceil(Number(selectedMax)) : 0;\r\n const minPr: string[] = [];\r\n const maxPr: string[] = [];\r\n let minPrices: IPriceObject[] = [];\r\n let maxPrices: IPriceObject[] = [];\r\n if (type === 'min') {\r\n for (let i = minPrice; i <= maxPrice; i += differenceValue) {\r\n minPr.push(i.toString());\r\n }\r\n minPrices = minPr.map((value, index) => {\r\n let obj: IPriceObject;\r\n if (index === 0) {\r\n obj = { priceValue: value, selected: true, disabled: false };\r\n } else {\r\n obj = { priceValue: value, selected: false, disabled: false };\r\n }\r\n return obj;\r\n });\r\n return minPrices;\r\n } else {\r\n if (selectedMin && selectedMax && selectedMin === selectedMax) {\r\n maxPrices.push({ priceValue: selectedMax.toString(), selected: true, disabled: false });\r\n } else {\r\n for (let i = minPrice + differenceValue; i <= maxPrice; i += differenceValue) {\r\n maxPr.push(i.toString());\r\n }\r\n let flag: boolean = false;\r\n maxPrices = maxPr.map((value, index) => {\r\n let obj: IPriceObject;\r\n obj = { priceValue: value, selected: false, disabled: false };\r\n const val = Number(value);\r\n if (maxPrice - val < differenceValue) {\r\n flag = true;\r\n }\r\n return obj;\r\n });\r\n if (flag && maxPrices.length) {\r\n const lastRange = Number(maxPrices[maxPrices.length - 1].priceValue);\r\n maxPrices.push({ priceValue: (lastRange + differenceValue).toString(), selected: true, disabled: false });\r\n }\r\n }\r\n\r\n return maxPrices;\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, 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 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 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 />\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 {\r\n isDisabled,\r\n refineItemCommonProps,\r\n selectedRefinerValues,\r\n context,\r\n minValueSliderThumbAriaLabel,\r\n maxValueSliderThumbAriaLabel\r\n } = this.props;\r\n\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 =\r\n productRefinerHierarchy.DataTypeValue === ProductRefinerValueDataTypeValue.RangeInput ||\r\n this.props.tempRangeTypeTODO === 'input'\r\n ? 'input'\r\n : 'input';\r\n const key = selectedRefinementCriterion\r\n ? `${selectedRefinementCriterion.LeftValueBoundString}-${selectedRefinementCriterion.RightValueBoundString}`\r\n : `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 getFormattedSelectedMinValue={this.state.minPricesObject}\r\n getFormattedSelectedMaxValue={this.state.maxPricesObject}\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'>{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","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { getPayloadObject, getTelemetryAttributes } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { IGetHelpInput, IHelp } from '../../..';\n\nexport const getOrderConfirmationHelp = ({\n needHelpLabel,\n helpLineNumberLabel,\n contactNumber,\n helpLineContactAriaLabel,\n telemetryContent\n}: IGetHelpInput): IHelp => {\n const payLoad = getPayloadObject('click', telemetryContent!, '');\n const attribute = getTelemetryAttributes(telemetryContent!, payLoad);\n return {\n helpProps: { className: 'ms-order-confirmation__help' },\n needHelpLabel: <p className='ms-order-confirmation__help-title'>{needHelpLabel}</p>,\n helpLineNumberLabel: <span className='ms-order-confirmation__help-label'>{helpLineNumberLabel}</span>,\n contactNumber: (\n <a\n className='ms-order-confirmation__help-content-number'\n aria-label={`${helpLineContactAriaLabel} ${contactNumber}`}\n href={`tel:${contactNumber}`}\n {...attribute}\n >\n {contactNumber}\n </a>\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 Msdyn365 from '@msdyn365-commerce/core';\nimport {\n ChannelDeliveryOptionConfiguration,\n ProductDeliveryOptions,\n SalesLine,\n SalesOrder,\n SimpleProduct,\n TransactionType\n} from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\nimport {\n Button,\n getPayloadObject,\n getTelemetryAttributes,\n getTelemetryObject,\n IModuleProps,\n INodeProps,\n ITelemetryContent,\n TelemetryConstant\n} from '@msdyn365-commerce-modules/utilities';\nimport classname from 'classnames';\nimport get from 'lodash/get';\nimport { computed } from 'mobx';\nimport * as React from 'react';\n\nimport { IGetOrderSummaryInput, IHelp, IOrderSummary, IPaymentMethods, IPaymentMethodsInput } from '../../common';\nimport { getGroups, IGroups } from '../../common/get-groups';\nimport { getOrderInformation, getOrderInformationInput, IOrderInformation } from '../../common/get-order-information';\nimport { ISalesLine } from '../../common/get-sales-line';\nimport { getSalesLines, getSalesLinesInput } from '../../common/get-sales-lines';\nimport { Label } from '../../common/label';\nimport { getTenderIdOperationIdMap, IPriceContext } from '../../common/utilities';\nimport { getOrderConfirmationHelp } from './components/get-help';\nimport { getOrderConfirmationOrderSummary } from './components/get-order-summary';\nimport { getOrderConfirmationPaymentMethods } from './components/get-payment-methods';\nimport { IOrderConfirmationData } from './order-confirmation.data';\nimport { IOrderConfirmationProps } from './order-confirmation.props.autogenerated';\n\nexport interface IOrderConfirmationViewProps extends IOrderConfirmationProps<IOrderConfirmationData> {\n moduleProps: IModuleProps;\n salesOrder?: SalesOrder;\n footerProps?: INodeProps;\n alert?: React.ReactNode;\n loading?: React.ReactNode;\n heading: React.ReactNode;\n backToShoppingLink?: React.ReactNode;\n orderInfomation?: IOrderInformation;\n salesLines?: ISalesLine[];\n groups?: IGroups;\n orderSummary?: IOrderSummary;\n payment?: IPaymentMethods;\n help?: IHelp;\n}\n\n/**\n *\n * OrderConfirmation component.\n * @extends {React.PureComponent<IOrderConfirmationProps<IOrderConfirmationData>>}\n */\nclass OrderConfirmation extends React.PureComponent<IOrderConfirmationProps<IOrderConfirmationData>> {\n private readonly moduleName: string = 'ms-order-confirmation';\n\n private readonly telemetryContent?: ITelemetryContent;\n\n private readonly backToShoppingAttributes?: Msdyn365.IDictionary<string>;\n\n constructor(props: IOrderConfirmationProps<IOrderConfirmationData>) {\n super(props);\n this.telemetryContent = getTelemetryObject(\n this.props.context.request.telemetryPageName!,\n this.props.friendlyName,\n this.props.telemetry\n );\n const payLoad = getPayloadObject('click', this.telemetryContent, TelemetryConstant.BackToShopping);\n this.backToShoppingAttributes = getTelemetryAttributes(this.telemetryContent, payLoad);\n }\n\n @computed get isCurrentChannel(): boolean {\n if (!this.order) {\n return false;\n }\n return this.order.ChannelId === get(this.props, 'context.request.apiSettings.channelId');\n }\n\n @computed get isDataReady(): boolean {\n return get(this.props, 'data.orderHydration.status') === 'SUCCESS';\n }\n\n @computed get hasError(): boolean {\n return get(this.props, 'data.orderHydration.status') === 'FAILED';\n }\n\n @computed get order(): SalesOrder | undefined {\n return get(this.props, 'data.orderHydration.result.salesOrder');\n }\n\n @computed get products(): SimpleProduct[] {\n return get(this.props, 'data.orderHydration.result.products') || [];\n }\n\n @computed get deliveryOptions(): ProductDeliveryOptions[] {\n return get(this.props, 'data.orderHydration.result.deliveryOptions') || [];\n }\n\n @computed public get customerName(): Readonly<string | undefined> {\n const customer = this.props.data.accountInformation?.result;\n if (Msdyn365.isOboRequest(this.props.context.request)) {\n // For OBO scenario, display full customer name because multiple customers may have the same first name.\n return customer ? customer.Name : undefined;\n } else {\n return customer ? customer.FirstName || customer.Name : undefined;\n }\n }\n\n @computed get priceContext(): IPriceContext {\n const {\n id,\n typeName,\n context,\n telemetry,\n resources: { freePriceText }\n } = this.props;\n return {\n id,\n typeName,\n context,\n telemetry,\n freePriceText\n };\n }\n\n @computed get earnedPoints(): number {\n const loyaltyCard = this.props.data.loyaltyCard.result;\n if (loyaltyCard && loyaltyCard.RewardPoints && this.order) {\n const pointPrograms = new Set(loyaltyCard.RewardPoints.map(point => point.RewardPointId));\n const rewardLines = this.order.LoyaltyRewardPointLines || [];\n let total = 0;\n rewardLines.forEach(line => {\n if ((line.RewardPointAmountQuantity || 0) > 0 && pointPrograms.has(line.RewardPointId)) {\n total += line.RewardPointAmountQuantity!;\n }\n });\n return total;\n }\n return 0;\n }\n\n @computed get orderSummaryProps(): IGetOrderSummaryInput | undefined {\n if (!this.order) {\n return;\n }\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(item => item.Name === multiplePickupStoreSwitchName)\n ?.IsEnabled;\n const pickupDeliveryModeCode = request && request.channel && request.channel.PickupDeliveryModeCode;\n const emailDeliveryModeCode = request && request.channel && request.channel.EmailDeliveryModeCode;\n const orderDetailsLines = this.order?.SalesLines;\n const canShip = orderDetailsLines?.some(orderDetailsLine =>\n orderDetailsLine.DeliveryMode && orderDetailsLine.DeliveryMode !== ''\n ? orderDetailsLine.DeliveryMode !==\n this.getDeliveryMode(\n orderDetailsLine,\n retailMultiplePickUpOptionEnabled,\n channelDeliveryOptionConfig?.result,\n pickupDeliveryModeCode\n ) && orderDetailsLine.DeliveryMode !== emailDeliveryModeCode\n : orderDetailsLine\n );\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- app configs are of generic type\n const isShowOrHideTaxEnabled = request.app.config.isEnableShowOrHideSalesTaxECommerceEnabled === true;\n\n const {\n resources: {\n orderSummaryHeading,\n orderSummaryItemsTotalLabel,\n orderSummaryShippingFeeLabel,\n orderSummaryTaxLabel,\n orderSummaryGrandTotalLabel,\n pointsEarnedLabel\n }\n } = this.props;\n return {\n order: this.order,\n earnedPoints: this.earnedPoints,\n priceContext: this.priceContext,\n resource: {\n orderSummaryHeading,\n orderSummaryItemsTotalLabel,\n orderSummaryShippingFeeLabel,\n orderSummaryTaxLabel,\n pointsEarnedLabel,\n orderSummaryGrandTotalLabel\n },\n canShip,\n isTaxIncludedInPrice: this.order.IsTaxIncludedInPrice,\n isShowTaxBreakUp: isShowOrHideTaxEnabled\n };\n }\n\n @computed get paymentMethodsProps(): IPaymentMethodsInput | undefined {\n const tenderTypes = this.props.data.tenderTypes.result;\n if (!this.order || !this.order.TenderLines || !tenderTypes) {\n return;\n }\n\n const locale = get(this.props, 'context.request.locale') || 'en-US';\n\n const {\n resources: {\n paymentMethodsTitle,\n creditCardEndingLabel,\n giftCardEndingLabel,\n amountCoveredLabel,\n cashUsedLabel,\n loyaltyCardUsedLabel,\n customerAccountUsedLabel\n }\n } = this.props;\n\n return {\n priceContext: this.priceContext,\n tenderLines: this.order.TenderLines,\n tenderIdOperationIdMap: getTenderIdOperationIdMap(tenderTypes),\n locale,\n resource: {\n paymentMethodsTitle,\n creditCardEndingLabel,\n giftCardEndingLabel,\n amountCoveredLabel,\n cashUsedLabel,\n loyaltyCardUsedLabel,\n customerAccountUsedLabel\n }\n };\n }\n\n public render(): JSX.Element {\n const {\n resources: {\n noSalesOrderText,\n genericErrorMessage,\n needHelpLabel,\n helpLineNumberLabel,\n loadingLabel,\n backToShopping,\n orderItemLabel,\n orderItemsLabel,\n pickupItemsHeader,\n pickingItemsLabel,\n shippingAddressTitle,\n shippingItemToYouLabel,\n shippingItemToOBOCustomerLabel,\n helpLineContactAriaLabel,\n emailItemsHeader,\n emailingItemsLabel\n },\n config: { heading, contactNumber, shouldShowQrCode, showTimeslot }\n } = this.props;\n\n const moduleProps = { moduleProps: this.props, className: classname('ms-order-confirmation', this.props.config.className) };\n const backToShoppingUrl = Msdyn365.getUrlSync('home', this.props.context.actionContext) || '';\n const multiplePickupStoreSwitchName = 'Dynamics.AX.Application.RetailMultiplePickupDeliveryModeFeature';\n const { channelDeliveryOptionConfig, featureState } = this.props?.data;\n const retailMultiplePickUpOptionEnabled = featureState?.result?.find(item => item.Name === multiplePickupStoreSwitchName)\n ?.IsEnabled;\n\n let viewProps: IOrderConfirmationViewProps = {\n ...this.props,\n moduleProps,\n heading: heading && heading.text && (\n <Msdyn365.Text\n {...heading}\n className='ms-order-confirmation__heading'\n text={heading.text}\n tag={heading.tag || 'h2'}\n editProps={{ onEdit: this.handleOrderConfirmationHeadingChange, requestContext: this.props.context.request }}\n />\n ),\n backToShoppingLink: backToShoppingUrl && (\n <Button className='ms-order-confirmation__btn-keep-shopping' href={backToShoppingUrl} {...this.backToShoppingAttributes}>\n {backToShopping}\n </Button>\n ),\n footerProps: { className: 'ms-order-confirmation__footer' }\n };\n\n if (this.hasError) {\n viewProps = {\n ...viewProps,\n alert: <Label className='ms-order-confirmation__alert' label={genericErrorMessage} />\n };\n return this.props.renderView(viewProps) as React.ReactElement;\n }\n\n if (!this.isDataReady) {\n viewProps = {\n ...viewProps,\n loading: <Label className='ms-order-confirmation__loading' label={loadingLabel} />\n };\n return this.props.renderView(viewProps) as React.ReactElement;\n }\n\n if (!this.order) {\n viewProps = {\n ...viewProps,\n alert: <Label className='ms-order-confirmation__alert' label={noSalesOrderText} />\n };\n return this.props.renderView(viewProps) as React.ReactElement;\n }\n\n const isSalesInvoice = this.order.TransactionTypeValue === TransactionType.SalesInvoice;\n\n const salesLinesInput = getSalesLinesInput(\n this.props,\n this.moduleName,\n this.order,\n this.products,\n this.priceContext,\n true,\n showTimeslot,\n undefined,\n retailMultiplePickUpOptionEnabled,\n channelDeliveryOptionConfig?.result,\n this.deliveryOptions\n );\n const salesLines = salesLinesInput && getSalesLines(salesLinesInput);\n const orderInformationInput = getOrderInformationInput(\n this.props,\n this.moduleName,\n this.order,\n this.priceContext,\n undefined,\n undefined,\n undefined,\n undefined,\n undefined,\n isSalesInvoice,\n shouldShowQrCode ?? true\n );\n const orderInfomation = getOrderInformation(orderInformationInput);\n\n viewProps = {\n ...viewProps,\n salesOrder: this.order,\n orderInfomation,\n salesLines,\n groups:\n !isSalesInvoice && salesLines\n ? getGroups({\n moduleName: this.moduleName,\n salesLines,\n resources: {\n orderItemLabel,\n orderItemsLabel,\n pickupItemsHeader,\n pickingItemsLabel,\n shippingAddressTitle,\n shippingItemToYouLabel,\n shippingItemToOBOCustomerLabel,\n emailItemsHeader,\n emailingItemsLabel\n },\n showTimeslot,\n isConfirmationView: true,\n retailMultiplePickUpOptionEnabled,\n customerName: this.customerName,\n isOboRequest: Msdyn365.isOboRequest(this.props.context.request)\n })\n : undefined,\n orderSummary: !isSalesInvoice && this.orderSummaryProps ? getOrderConfirmationOrderSummary(this.orderSummaryProps) : undefined,\n payment: !isSalesInvoice && this.paymentMethodsProps ? getOrderConfirmationPaymentMethods(this.paymentMethodsProps) : undefined,\n help:\n !isSalesInvoice && contactNumber\n ? getOrderConfirmationHelp({\n needHelpLabel,\n helpLineNumberLabel,\n contactNumber,\n helpLineContactAriaLabel,\n telemetryContent: this.telemetryContent\n })\n : undefined\n };\n\n return this.props.renderView(viewProps) as React.ReactElement;\n }\n\n public handleOrderConfirmationHeadingChange = (event: Msdyn365.ContentEditableEvent) =>\n (this.props.config.heading!.text = event.target.value);\n\n private readonly getDeliveryMode = (\n salesLine: SalesLine,\n featureSate: boolean = false,\n channelDeliveryOptionConfig?: ChannelDeliveryOptionConfiguration,\n pickupDeliveryMode?: string\n ) => {\n if (!featureSate) {\n return pickupDeliveryMode;\n }\n return channelDeliveryOptionConfig?.PickupDeliveryModeCodes?.find(deliveryMode => deliveryMode === salesLine.DeliveryMode);\n };\n}\n\nexport default OrderConfirmation;\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, ProductRefinerValue, RefinerType } from '@msdyn365-commerce/retail-proxy';\n\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\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 (\n dataTypeValue === AttributeDataType.Currency ||\n dataTypeValue === AttributeDataType.Decimal ||\n dataTypeValue === AttributeDataType.Integer\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(productRefinerValue: ProductRefinerValue, refinementCriterion: ProductRefinerValue): boolean {\n // If the value is a range, then match only on data type value; otherwise match on item string\n return (\n refinementCriterion.RefinerRecordId === productRefinerValue.RefinerRecordId &&\n refinementCriterion.RefinerSourceValue === productRefinerValue.RefinerSourceValue &&\n refinementCriterion.DataTypeValue === productRefinerValue.DataTypeValue &&\n (isRangeType(refinementCriterion.DataTypeValue) ||\n refinementCriterion.LeftValueBoundString === productRefinerValue.LeftValueBoundString)\n );\n}\n\nexport function getUpdatedRefinementCriteria(\n itemToggleNotification: IRefineItemToggleNotification,\n currentRefinementCriteria: ProductRefinerValue[]\n): ProductRefinerValue[] {\n const updatedRefinementCriteria: ProductRefinerValue[] = [];\n let toggledItemFound = false;\n currentRefinementCriteria.forEach((selectedCriterion: ProductRefinerValue) => {\n if (isMatchingRefinementCriterion(itemToggleNotification.productRefinerValue, selectedCriterion)) {\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)\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 { format, INodeProps } from '@msdyn365-commerce-modules/utilities';\nimport classNames from 'classnames';\nimport * as React from 'react';\n\nimport { ISalesLine } from './get-sales-line';\nimport { groupSalesLines, IDeliveryType, ISalesStatusCode } from './utilities';\n\nexport interface IGroupDelivery {\n deliveryProps: INodeProps;\n pickupProps: INodeProps;\n showTimeslot: boolean;\n heading: React.ReactNode;\n count: React.ReactNode;\n processing: React.ReactNode;\n trackingInfo: React.ReactNode;\n address: React.ReactNode;\n shippingItemsToYou?: React.ReactNode;\n pickupDateTimeslot?: React.ReactNode;\n shippedStatusCheck?: React.ReactNode;\n}\n\nexport interface IGroup {\n groupProps: INodeProps;\n salesLinesProps: INodeProps;\n delivery: IGroupDelivery;\n salesLines: ISalesLine[];\n address: React.ReactNode;\n\n // Row data\n data: {\n count: number;\n deliveryType: IDeliveryType;\n salesStatus: ISalesStatusCode;\n };\n isCashAndCarryTransaction?: boolean;\n}\n\nexport interface IGroupsInput {\n moduleName: string;\n salesLines: ISalesLine[];\n resources: {\n orderItemLabel: string;\n orderItemsLabel: string;\n pickupItemsHeader?: string;\n pickingItemsLabel?: string;\n shippingAddressTitle?: string;\n shippingItemToYouLabel?: string;\n shippingItemToOBOCustomerLabel?: string;\n emailItemsHeader?: string;\n emailingItemsLabel?: string;\n };\n showAddress?: boolean;\n isConfirmationView?: boolean;\n showTimeslot?: boolean;\n retailMultiplePickUpOptionEnabled?: boolean;\n isCashAndCarryTransaction?: boolean;\n isSelectionModeEnabled?: boolean;\n isOboRequest?: boolean;\n customerName?: string;\n}\n\nexport interface IGroups {\n groupsProps: INodeProps;\n groups: IGroup[];\n}\n\n/**\n * Creates sales lines node props object.\n * @param moduleName - Module name to use as a class name prefix.\n * @param isSelectionModeEnabled - Specifies if the selection mode is enabled for the sales lines.\n * @returns Sales lines node props with the class name to use for the sales lines container.\n */\nconst getSalesLinesProps: (moduleName: string, isSelectionModeEnabled?: boolean) => INodeProps = (\n moduleName: string,\n isSelectionModeEnabled?: boolean\n): INodeProps => {\n const className = `${moduleName}__sales-lines`;\n const salesLinesProps: INodeProps = {\n className: classNames(\n className,\n isSelectionModeEnabled ? `${className}__selection-global-enabled` : `${className}__selection-global-disabled`\n )\n };\n return salesLinesProps;\n};\n\nexport const getGroups = ({\n moduleName,\n salesLines,\n showAddress,\n showTimeslot,\n isConfirmationView,\n retailMultiplePickUpOptionEnabled,\n isCashAndCarryTransaction,\n isSelectionModeEnabled,\n customerName,\n isOboRequest,\n resources: {\n orderItemLabel,\n orderItemsLabel,\n pickupItemsHeader,\n pickingItemsLabel,\n shippingAddressTitle,\n shippingItemToYouLabel,\n shippingItemToOBOCustomerLabel,\n emailItemsHeader,\n emailingItemsLabel\n }\n}: IGroupsInput): IGroups => {\n const groups = groupSalesLines(salesLines).map(group => {\n const { deliveryType, salesStatus, count, salesLines: _salesLines } = group;\n const itemLabel = count === 1 ? orderItemLabel : orderItemsLabel;\n const pickingItemsLabelText = pickingItemsLabel && format(pickingItemsLabel, count, itemLabel);\n const shippingItemsToText = isOboRequest\n ? shippingItemToOBOCustomerLabel && format(shippingItemToOBOCustomerLabel, count, itemLabel, customerName)\n : shippingItemToYouLabel && format(shippingItemToYouLabel, count, itemLabel);\n const emailingItemsLabelText = emailingItemsLabel && format(emailingItemsLabel, count, itemLabel);\n const multiplePickup = deliveryType === 'ship' ? 'ship' : deliveryType === 'email' ? 'email' : 'pickup';\n const groupProps = { className: `${moduleName}__group-deliveryType-${multiplePickup} salesStatus-${salesStatus}` };\n\n const salesLinesProps = getSalesLinesProps(moduleName, isSelectionModeEnabled);\n const address = _salesLines[0].address;\n const trackingInfo = _salesLines[0].trackingInfo;\n const isProcessing = _salesLines[0].data.salesStatus === 'processing';\n const pickDateTimeslot = _salesLines[0].pickupDateTimeslot;\n const shippedStatusCheck = _salesLines[0].data.salesStatus;\n const multiplePickUp = retailMultiplePickUpOptionEnabled ? 'multiple-pickUp' : '';\n const delivery: IGroupDelivery = {\n deliveryProps: { className: `${moduleName}__group-delivery ${multiplePickUp}` },\n pickupProps: { className: `${moduleName}__delivery-container` },\n heading: (\n <span className={`${moduleName}__group-delivery-heading`}>\n {isProcessing\n ? isConfirmationView\n ? deliveryType === 'pickUp'\n ? pickupItemsHeader\n : deliveryType === 'ship'\n ? shippingAddressTitle\n : deliveryType === 'email'\n ? emailItemsHeader\n : deliveryType\n : _salesLines[0].deliveryType\n : _salesLines[0].salesStatus}\n </span>\n ),\n processing: isProcessing ? (\n <span className={`${moduleName}__group-delivery-processing-label`}>{_salesLines[0].salesStatus}</span>\n ) : (\n undefined\n ),\n count: !isConfirmationView && <span className={`${moduleName}__group-delivery-total-items`}>{`(${count} ${itemLabel})`}</span>,\n shippingItemsToYou:\n isConfirmationView && deliveryType === 'ship' ? (\n <span className={`${moduleName}__sales-lines-shipping-items-label`}>{shippingItemsToText}</span>\n ) : deliveryType === 'pickUp' ? (\n <span className={`${moduleName}__sales-lines-picking-items-label`}>{pickingItemsLabelText}</span>\n ) : deliveryType === 'email' ? (\n <span className={`${moduleName}__sales-lines-emailing-items-label`}>{emailingItemsLabelText}</span>\n ) : (\n <span className={`${moduleName}__sales-lines-picking-items-label`}>{pickingItemsLabelText}</span>\n ),\n trackingInfo,\n address,\n pickupDateTimeslot: pickDateTimeslot,\n showTimeslot: showTimeslot || false,\n shippedStatusCheck\n };\n return {\n groupProps,\n salesLinesProps,\n delivery,\n salesLines: _salesLines,\n address: showAddress && address,\n data: {\n count,\n deliveryType,\n salesStatus\n },\n isCashAndCarryTransaction\n };\n });\n\n return {\n groupsProps: { className: `${moduleName}__groups` },\n groups\n };\n};\n","import {\r\n ICategoryHierarchyViewProps,\r\n IRefineMenuViewProps,\r\n ISearchResultContainerViewProps,\r\n ISearchResultModalViewProps,\r\n ISortByViewProps,\r\n ITitleViewProps,\r\n IChoiceSummaryClickNotification,\r\n isMatchingRefinementCriterion,\r\n ISearchResultContainerData\r\n} from '@msdyn365-commerce-modules/search-result-container';\r\nimport { IMandsSearchResultContainerProps } from '../definition-extensions/mands-search-result-container.ext.props.autogenerated';\r\nimport { Module, Node, LabeledDropdown } from '@msdyn365-commerce-modules/utilities';\r\nimport * as React from 'react';\r\nimport RefineSubmenu from './custom-components/refine-submenu';\r\nimport ChoiceSummary from './custom-components/choice-summary';\r\nimport { ProductRefinerValue } from '@msdyn365-commerce/retail-proxy';\r\ninterface IState {\r\n rating: boolean;\r\n activeRefiner: number;\r\n}\r\n\r\n/**\r\n *\r\n * SearchResultContainerView component\r\n * @extends {React.PureComponent<ISearchResultContainerViewProps>}\r\n */\r\n\r\nexport class SearchResultContainerView extends React.PureComponent<\r\n ISearchResultContainerViewProps & IMandsSearchResultContainerProps<ISearchResultContainerData>,\r\n IState\r\n> {\r\n public _sortAndFilterContainerRef: React.RefObject<LabeledDropdown>;\r\n constructor(props: ISearchResultContainerViewProps & IMandsSearchResultContainerProps<ISearchResultContainerData>) {\r\n super(props);\r\n this.state = {\r\n rating: false,\r\n activeRefiner: -1\r\n };\r\n this._sortAndFilterContainerRef = React.createRef<LabeledDropdown>();\r\n }\r\n public render(): JSX.Element {\r\n const { props } = this;\r\n const mobileView =\r\n props.context.request && props.context.request.device && props.context.request.device.Type === 'Mobile' ? true : false;\r\n const {\r\n SearchResultContainer,\r\n products,\r\n pagination,\r\n ProductsContainer,\r\n ProductSectionContainer,\r\n isMobile,\r\n modalToggle,\r\n searchResultModal,\r\n TitleViewProps,\r\n refineMenu,\r\n categoryHierarchy,\r\n sortByOptions,\r\n CategoryNavContainer,\r\n RefineAndProductSectionContainer,\r\n errorMessage\r\n } = this.props;\r\n let { choiceSummary } = this.props;\r\n choiceSummary = this._getChoiceSummary();\r\n if (isMobile) {\r\n return (\r\n <Module {...SearchResultContainer}>\r\n {this.renderCategoryHierarchy(categoryHierarchy)}\r\n {props.slots && props.slots.content && (\r\n <div>\r\n {props.slots.content.map((children: React.ReactNode, index: number) => {\r\n return (\r\n <div className='col-12' key={index}>\r\n {children}\r\n </div>\r\n );\r\n })}\r\n </div>\r\n )}\r\n {this.renderTitle(TitleViewProps)}\r\n {modalToggle}\r\n {TitleViewProps.title.titleCount}\r\n {this.createSearchResultModal(searchResultModal, refineMenu, sortByOptions, mobileView)}\r\n\r\n <Node {...ProductSectionContainer}>\r\n <div className='row search-result-row'>\r\n <div className='col-xs-6 col-lg-7 product-quantity'>\r\n <div className='filters-refine'>\r\n <i className='filter-icon' />\r\n {pagination}\r\n </div>\r\n <Node {...CategoryNavContainer}>{TitleViewProps && this.renderTitleCount(TitleViewProps)}</Node>\r\n </div>\r\n <div className='col-xs-6 col-md-6 col-lg-5'>{sortByOptions && this.renderSort(sortByOptions)}</div>\r\n </div>\r\n <Node {...ProductsContainer}>\r\n {errorMessage}\r\n {products}\r\n </Node>\r\n <div className='bottom-pagination-plp'>{pagination}</div>\r\n </Node>\r\n </Module>\r\n );\r\n }\r\n return (\r\n <Module {...SearchResultContainer}>\r\n <Node {...CategoryNavContainer}>{categoryHierarchy && this.renderCategoryHierarchy(categoryHierarchy)}</Node>\r\n {props.slots && props.slots.content && (\r\n <div>\r\n {props.slots.content.map((children: React.ReactNode, index: number) => {\r\n return (\r\n <div className='col-12' key={index}>\r\n {children}\r\n </div>\r\n );\r\n })}\r\n </div>\r\n )}\r\n <Node {...RefineAndProductSectionContainer}>\r\n {refineMenu && this.renderRefiner(refineMenu, mobileView)}\r\n {choiceSummary}\r\n <Node {...ProductSectionContainer}>\r\n <div className='ms-search-result-wrapper-title-choice-summary'>\r\n {TitleViewProps && this.renderTitle(TitleViewProps)}\r\n </div>\r\n {TitleViewProps.title.titleCount}\r\n <div className='ms-search-result-wrapper-sort-by-category'>{sortByOptions && this.renderSort(sortByOptions)}</div>\r\n <Node {...ProductsContainer}>\r\n {errorMessage}\r\n {products}\r\n </Node>\r\n {pagination}\r\n </Node>\r\n </Node>\r\n </Module>\r\n );\r\n }\r\n public componentDidMount = () => {\r\n this.hideRatingFromSortDropdown();\r\n };\r\n\r\n public componentDidUpdate = () => {\r\n this.hideRatingFromSortDropdown();\r\n };\r\n\r\n public hideRatingFromSortDropdown = () => {\r\n const sort = document.getElementById('categorySortByDropdown') as HTMLSelectElement;\r\n if (sort && sort.options) {\r\n for (let i = 0; i < sort.options.length; i++) {\r\n if (sort.options[i].value.includes('Rating')) {\r\n sort.options[i].style.display = 'none';\r\n }\r\n if (sort.options[i].value.includes('Price: Low to High')) {\r\n sort.options[i].style.display = 'none';\r\n }\r\n if (sort.options[i].value.includes('Price: High to Low')) {\r\n sort.options[i].style.display = 'none';\r\n }\r\n }\r\n }\r\n };\r\n\r\n public createSearchResultModal = (\r\n modalProps: ISearchResultModalViewProps,\r\n refineMenu: IRefineMenuViewProps,\r\n sortByDropDown: ISortByViewProps,\r\n mobileView: boolean\r\n ): JSX.Element => {\r\n return React.cloneElement(\r\n modalProps.modal,\r\n {},\r\n modalProps.modalHeader,\r\n this.createModalBody(modalProps, refineMenu, sortByDropDown, mobileView),\r\n modalProps.modalFooter\r\n );\r\n };\r\n\r\n private createModalBody = (\r\n props: ISearchResultModalViewProps,\r\n refineMenu: IRefineMenuViewProps,\r\n sortByDropDown: ISortByViewProps,\r\n mobileView: boolean\r\n ): JSX.Element | null => {\r\n if (sortByDropDown) {\r\n return React.cloneElement(props.modalBody, {}, this.renderSort(sortByDropDown), this.renderRefiner(refineMenu, mobileView));\r\n }\r\n return null;\r\n };\r\n\r\n private 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 <h5>{title.titleCount}</h5>\r\n </Node>\r\n );\r\n }\r\n return null;\r\n };\r\n\r\n private setRating = () => {\r\n return () => this.setState({ rating: !this.state.rating });\r\n };\r\n\r\n private renderRefiner = (props: IRefineMenuViewProps, isMobile: boolean): JSX.Element | null => {\r\n const { refiners, RefineMenuContainer, RefinerSectionContainer } = props;\r\n const { rating } = this.state;\r\n isMobile = this.props.isMobile;\r\n let { choiceSummary } = this.props;\r\n choiceSummary = this._getChoiceSummary();\r\n if (refiners) {\r\n return (\r\n <Node {...RefinerSectionContainer}>\r\n <Node {...RefineMenuContainer}>\r\n {!isMobile &&\r\n refiners.map((submenu, index) => submenu !== null && index < 6 && this.renderSubmenu(submenu, index, rating))}\r\n {!isMobile && refiners.length > 6 && !rating && (\r\n <div role='button' className='show-more' onClick={this.setRating}>\r\n {'Show all filters'}\r\n </div>\r\n )}\r\n </Node>\r\n <Node {...RefineMenuContainer}>\r\n {isMobile ? (\r\n <div className='ms-search-result__toggle'>\r\n <div className='ms-search-result__collection-count'>{this.props.TitleViewProps.title.titleCount}</div>\r\n <div className='ms-search-result__choice-summary'>{choiceSummary}</div>\r\n </div>\r\n ) : null}\r\n {!isMobile &&\r\n refiners.map(\r\n (submenu, index) => submenu !== null && index > 5 && rating && this.renderSubmenu(submenu, index, rating)\r\n )}\r\n {!isMobile && refiners.length > 6 && rating && (\r\n <div role='button' className='show-more' onClick={this.setRating}>\r\n {'Show less filters'}\r\n </div>\r\n )}\r\n {isMobile && refiners.map((submenu, index) => submenu !== null && this.renderSubmenu(submenu, index, rating))}\r\n </Node>\r\n </Node>\r\n );\r\n }\r\n return null;\r\n };\r\n\r\n private renderSort = (props: ISortByViewProps): JSX.Element | null => {\r\n const { SortingContainer, sortByDropDown } = props;\r\n if (sortByDropDown) {\r\n return <Node {...SortingContainer}>{sortByDropDown}</Node>;\r\n }\r\n return null;\r\n };\r\n\r\n // @ts-ignore\r\n private renderSubmenu = (submenu, index: number, rating: boolean) => {\r\n const subMenu = submenu && submenu.props;\r\n if (subMenu.productRefinerHierarchy.KeyName.toLowerCase() === 'color') {\r\n subMenu.productRefinerHierarchy.KeyName = 'Colour';\r\n }\r\n return subMenu.productRefinerHierarchy.KeyName.toLowerCase() !== 'rating' &&\r\n subMenu.productRefinerHierarchy.KeyName.toLowerCase() !== 'category' ? (\r\n <RefineSubmenu\r\n productRefinerHierarchy={subMenu.productRefinerHierarchy}\r\n selectedRefinerValues={subMenu.selectedRefinerValues}\r\n refineItemCommonProps={subMenu.refineItemCommonProps}\r\n minValueSliderThumbAriaLabel={subMenu.minValueSliderThumbAriaLabel}\r\n maxValueSliderThumbAriaLabel={subMenu.maxValueSliderThumbAriaLabel}\r\n key={index}\r\n onUpdateRefiners={subMenu.onUpdateRefiners}\r\n urlBuilder={subMenu.urlBuilder}\r\n isExpandedOnInitialLoad={false}\r\n tempRangeTypeTODO={subMenu.tempRangeTypeTODO}\r\n context={subMenu.context}\r\n moduleId={subMenu.moduleId}\r\n moduleTypeName={subMenu.moduleTypeName}\r\n className={index === 4 && !rating ? 'hidden' : ''}\r\n isDisabled={false}\r\n refinerId={index}\r\n toggleAllRefiners={this.toggleAllRefiners}\r\n isOpen={this.state.activeRefiner === index && this.state.activeRefiner !== -1 ? true : false}\r\n />\r\n ) : null;\r\n };\r\n\r\n private toggleAllRefiners = (activeRefiner: number) => {\r\n const currentRefinerState = this.state.activeRefiner;\r\n if (activeRefiner === currentRefinerState) {\r\n this.setState({ activeRefiner: -1 });\r\n } else {\r\n this.setState({ activeRefiner });\r\n }\r\n };\r\n private 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\n private 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 <h1>{title.titleText}</h1>\r\n </Node>\r\n );\r\n }\r\n return null;\r\n };\r\n private _getChoiceSummary = (): React.ReactNode | null => {\r\n const { resources, data, telemetry } = this.props;\r\n const selectedRefiners = (data.listPageState.result && data.listPageState.result.activeFilters) || [];\r\n const refinersData = data.refiners.result;\r\n if (!refinersData) {\r\n return null;\r\n }\r\n\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 refinerHierarchy={refinersData}\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 />\r\n );\r\n };\r\n private _onChoiceClicked = (notification: IChoiceSummaryClickNotification): void => {\r\n const { data, telemetry } = this.props;\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 }, 50);\r\n }\r\n\r\n data.listPageState.result.currentPageNumber = 0;\r\n data.listPageState.result.activeFilters = currentRefinementCriteria;\r\n };\r\n private _buildRefinerUrlForChoiceSummary = (selectedRefiner: ProductRefinerValue, isClearAll: boolean): string => {\r\n const { data, telemetry } = this.props;\r\n const fullUrl = this.props.context.request.url.requestUrl;\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 this.props.context.request.url.requestUrl.href;\r\n };\r\n}\r\n\r\nexport default SearchResultContainerView;\r\n","/*!\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} 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 { computed, observable, reaction, transaction } from 'mobx';\nimport { observer } from 'mobx-react';\nimport * as React from 'react';\n\nimport {\n BaseCollectionInput,\n buildListPageUrl,\n getCollectionProducts,\n getCollectionRefinersAction,\n getCurrentUrl,\n GetFullProductsByCollectionInput,\n getInventoryRefinerAction,\n IFullProductsSearchResultsWithCount,\n InventoryInStockRefinerValueInput,\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<ISearchResultContainerData> {\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<ISearchResultContainerProps<ISearchResultContainerData>>}\n */\n@observer\nexport default class SearchResultContainer extends React.PureComponent<\n ISearchResultContainerProps<ISearchResultContainerData>,\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<HTMLButtonElement>;\n\n private readonly _sortAndFilterContainerRef: React.RefObject<LabeledDropdown>;\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<ISearchResultContainerData>, 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<HTMLButtonElement>();\n this._sortAndFilterContainerRef = React.createRef<LabeledDropdown>();\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<void> {\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 // Push inventory in stock refiner when productListInventoryDisplay is hide oos\n const inventoryRefiner = await this._getInventoryRefiner(listPageState, channelInventoryConfiguration);\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 inventoryRefiner\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 const context = this.props.context as ICoreContext<IDimensionsApp>;\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 // eslint-disable-next-line @typescript-eslint/no-floating-promises -- Call api to retrieve the availabilities of dimensions data without blocking the UI.\n this._getProductsDimensionsAvailabilities();\n }\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 inventoryRefiner\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 }\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 <FeatureSearchResultItem\n product={searchProduct}\n context={this.props.context}\n imageSettings={imageSettings}\n resources={resources}\n moduleType={this.props.typeName}\n moduleId={this.props.id}\n telemetryContent={this.telemetryContent}\n recommendation={this.props.context.request.query?.recommendation}\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 <ModalToggle\n text={resources.modalTitle}\n ariaLabel={resources.modalTitle}\n innerRef={this._modalToggleRef}\n onClick={this._toggleModal}\n id='search-result-modal'\n />\n ) : null,\n searchResultModal: this._getSearchResultModal(),\n isMobile: this.isMobile,\n errorMessage: errorText && <ErrorMessage text={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 * Update the list page state with initial data.\n * @param listPageState -- List page State.\n * @param products -- Products.\n */\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 &&\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<void> => {\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<IDimensionsApp>,\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<void> => {\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 = <Title className='ms-search-result__collection-title-prefix' text={resources.searchTextPrefix} />;\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 = 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 /**\n * Get inventory refiners.\n * @param listPageState The listPageState\n * @returns inventory refiner.\n */\n private readonly _getInventoryRefiner = async (\n listPageState: ListPageState,\n channelInventoryConfiguration: ChannelInventoryConfiguration\n ): Promise<IProductRefinerHierarchy | undefined> => {\n if (this.props.context.app.config.productListInventoryDisplay === ProductListInventoryFilteringOptions.HideOOS) {\n const baseCollectionInput = new BaseCollectionInput(\n listPageState.pageType,\n this.props.context.request.apiSettings,\n {\n count: true\n },\n\n // Parameter - refiners\n [],\n\n // Parameter - category\n undefined,\n\n // Parameter - searchText\n '',\n\n // Parameter - includeAttributes\n false,\n\n // Parameter - isUpdateRefinerPanel\n false,\n\n // Parameter - locale\n undefined,\n this.catalogId,\n channelInventoryConfiguration\n );\n const inventoryInStockRefinerValueInput = new InventoryInStockRefinerValueInput(\n baseCollectionInput,\n channelInventoryConfiguration?.InventoryProductAttributeRecordId\n );\n return getInventoryRefinerAction(inventoryInStockRefinerValueInput, this.props.context.actionContext);\n }\n return Promise.resolve(undefined);\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 * 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","import { 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 { IRefineItemToggleNotification } from './refine-item-toggle-notification';\r\nimport { IRefineItemCommonProps } from './refine-item.props.common';\r\nimport { ProductRefinerSource, ProductRefinerTypeValue } from './utilities';\r\nimport classnames from 'classnames';\r\nimport { checkIfShouldDisplayAsSwatch, DimensionTypes, IDimensionsApp, StringExtensions } from '@msdyn365-commerce-modules/retail-actions';\r\nimport { RatingComponent, SwatchComponent } from '@msdyn365-commerce/components';\r\n\r\n/**\r\n * RefineItem properties\r\n */\r\nexport interface IRefineItemProps {\r\n parentProductRefinerHierarchy: IProductRefinerHierarchy;\r\n productRefinerValue: ProductRefinerValue;\r\n selectedRefinementCriterion: ProductRefinerValue | undefined;\r\n refineItemCommonProps: IRefineItemCommonProps;\r\n isDisabled: boolean;\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 children,\r\n onToggle,\r\n context,\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(\r\n `[refine-item] RefineItem without LeftValueBoundString: ${JSON.stringify(productRefinerValue)}`\r\n );\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={\r\n productRefinerValue.LeftValueBoundLocalizedString\r\n ? productRefinerValue.LeftValueBoundLocalizedString\r\n : productRefinerValue.LeftValueBoundString\r\n }\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'>\r\n {productRefinerValue.Count !== undefined && `(${productRefinerValue.Count})`}\r\n </span>\r\n </a>\r\n </li>\r\n );\r\n } else {\r\n return undefined;\r\n }\r\n } else {\r\n const dimensionType = (this.props.parentProductRefinerHierarchy.KeyName?.toLocaleLowerCase() ?? '') as DimensionTypes;\r\n const shouldDisplayAsSwatch = this._getShouldDisplayAsSwatch(dimensionType);\r\n let className = 'ms-refine-submenu-item';\r\n if (shouldDisplayAsSwatch) {\r\n className = classnames(className, `ms-refine-submenu-item__dimension__${dimensionType}`);\r\n }\r\n // If the swatch has no color or image specified, it should be displayed as text.\r\n // We don't use swatch logic to display the number of the results found together with the text.\r\n const hasColor = !StringExtensions.isNullOrWhitespace(productRefinerValue.SwatchColorHexCode);\r\n const hasImage = !StringExtensions.isNullOrWhitespace(productRefinerValue.SwatchImageUrl);\r\n const hasContentSwatch = hasColor || hasImage;\r\n return (\r\n <li\r\n className='ms-refine-submenu-item'\r\n role={role}\r\n id={`${parentProductRefinerHierarchy.KeyName!}_${productRefinerValue.LeftValueBoundString}`}\r\n >\r\n <a\r\n key={!!selectedRefinementCriterion ? 'true' : 'false'}\r\n ref={this.anchorType}\r\n href={this._getRefinerUrl()}\r\n tabIndex={hasColor ? -1 : 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 {hasContentSwatch && shouldDisplayAsSwatch && this._renderSwatch(dimensionType)}\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 _renderSwatch(dimensionType: DimensionTypes): JSX.Element | null {\r\n const productRefinerValue = this.props.productRefinerValue;\r\n\r\n // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing -- Replace with actual value for empty string.\r\n const text = productRefinerValue.LeftValueBoundLocalizedString || productRefinerValue.LeftValueBoundString || '';\r\n const swatchItems = [\r\n {\r\n itemId: `${productRefinerValue.RefinerRecordId ?? ''}-${dimensionType}-${text}`,\r\n value: text,\r\n dimensionType,\r\n colorHexCode: productRefinerValue.SwatchColorHexCode,\r\n imageUrl: productRefinerValue.SwatchImageUrl\r\n }\r\n ];\r\n\r\n return (\r\n <SwatchComponent\r\n className='ms-refine-submenu-item__swatch'\r\n apiSettings={this.props.context.request.apiSettings}\r\n list={swatchItems}\r\n isSelectionEnabled={false}\r\n isRefineItem\r\n />\r\n );\r\n }\r\n\r\n private _getShouldDisplayAsSwatch(dimensionType: DimensionTypes) {\r\n const shouldDisplayAsSwatch = checkIfShouldDisplayAsSwatch(dimensionType, this.props.context as ICoreContext<IDimensionsApp>);\r\n return shouldDisplayAsSwatch;\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 this.anchorType.current && this.anchorType.current.focus();\r\n }, 0);\r\n }\r\n };\r\n}\r\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 { SalesOrder, SimpleProduct } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\nimport {\n Button,\n getPayloadObject,\n getTelemetryAttributes,\n getTelemetryObject,\n IModuleProps,\n INodeProps,\n ITelemetryContent,\n TelemetryConstant\n} from '@msdyn365-commerce-modules/utilities';\nimport classname from 'classnames';\nimport get from 'lodash/get';\nimport { computed } from 'mobx';\nimport * as React from 'react';\n\nimport { IGetOrderSummaryInput, IHelp, IOrderSummary, IPaymentMethods, IPaymentMethodsInput } from '../../common';\nimport { getGroups, IGroups } from '../../common/get-groups';\nimport { getOrderInformation, getOrderInformationInput, IOrderInformation } from '../../common/get-order-information';\nimport { ISalesLine } from '../../common/get-sales-line';\nimport { getSalesLines, getSalesLinesInput } from '../../common/get-sales-lines';\nimport { Label } from '../../common/label';\nimport { getTenderIdOperationIdMap, IPriceContext } from '../../common/utilities';\nimport { getOrderConfirmationHelp } from '../order-confirmation/components/get-help';\nimport { getOrderConfirmationOrderSummary } from '../order-confirmation/components/get-order-summary';\nimport { getOrderConfirmationPaymentMethods } from '../order-confirmation/components/get-payment-methods';\nimport { ICheckoutOrderConfirmationData } from './checkout-order-confirmation.data';\nimport { ICheckoutOrderConfirmationProps } from './checkout-order-confirmation.props.autogenerated';\n\nexport interface ICheckoutOrderConfirmationViewProps extends ICheckoutOrderConfirmationProps<ICheckoutOrderConfirmationData> {\n moduleProps: IModuleProps;\n salesOrder?: SalesOrder;\n footerProps?: INodeProps;\n alert?: React.ReactNode;\n loading?: React.ReactNode;\n heading: React.ReactNode;\n backToShoppingLink?: React.ReactNode;\n orderInfomation?: IOrderInformation;\n salesLines?: ISalesLine[];\n groups?: IGroups;\n orderSummary?: IOrderSummary;\n payment?: IPaymentMethods;\n help?: IHelp;\n}\n\n/**\n *\n * OrderConfirmation component.\n * @extends {React.PureComponent<IOrderConfirmationProps<IOrderConfirmationData>>}\n */\nclass OrderConfirmation extends React.PureComponent<ICheckoutOrderConfirmationProps<ICheckoutOrderConfirmationData>> {\n private readonly moduleName: string = 'ms-order-confirmation';\n\n private readonly telemetryContent?: ITelemetryContent;\n\n private readonly backToShoppingAttributes?: Msdyn365.IDictionary<string>;\n\n constructor(props: ICheckoutOrderConfirmationProps<ICheckoutOrderConfirmationData>) {\n super(props);\n this.telemetryContent = getTelemetryObject(\n this.props.context.request.telemetryPageName!,\n this.props.friendlyName,\n this.props.telemetry\n );\n const payLoad = getPayloadObject('click', this.telemetryContent, TelemetryConstant.BackToShopping);\n this.backToShoppingAttributes = getTelemetryAttributes(this.telemetryContent, payLoad);\n }\n\n @computed get isCurrentChannel(): boolean {\n if (!this.order) {\n return false;\n }\n return this.order.ChannelId === get(this.props, 'context.request.apiSettings.channelId');\n }\n\n @computed get isDataReady(): boolean {\n return get(this.props, 'data.checkout.status') === 'SUCCESS';\n }\n\n @computed get hasError(): boolean {\n return get(this.props, 'data.checkout.status') === 'FAILED';\n }\n\n @computed get order(): SalesOrder | undefined {\n return get(this.props, 'data.checkout.result.salesOrder');\n }\n\n @computed get products(): SimpleProduct[] {\n return get(this.props, 'data.checkout.result.orderedProducts') || [];\n }\n\n @computed get priceContext(): IPriceContext {\n const {\n id,\n typeName,\n context,\n telemetry,\n resources: { freePriceText }\n } = this.props;\n return {\n id,\n typeName,\n context,\n telemetry,\n freePriceText\n };\n }\n\n @computed get earnedPoints(): number {\n const loyaltyCard = this.props.data.loyaltyCard.result;\n if (loyaltyCard && loyaltyCard.RewardPoints && this.order) {\n const pointPrograms = new Set(loyaltyCard.RewardPoints.map(point => point.RewardPointId));\n const rewardLines = this.order.LoyaltyRewardPointLines || [];\n let total = 0;\n rewardLines.forEach(line => {\n if ((line.RewardPointAmountQuantity || 0) > 0 && pointPrograms.has(line.RewardPointId)) {\n total += line.RewardPointAmountQuantity!;\n }\n });\n return total;\n }\n return 0;\n }\n\n @computed get orderSummaryProps(): IGetOrderSummaryInput | undefined {\n if (!this.order) {\n return;\n }\n\n const {\n resources: {\n orderSummaryHeading,\n orderSummaryItemsTotalLabel,\n orderSummaryShippingFeeLabel,\n orderSummaryTaxLabel,\n orderSummaryGrandTotalLabel,\n pointsEarnedLabel\n }\n } = this.props;\n return {\n order: this.order,\n earnedPoints: this.earnedPoints,\n priceContext: this.priceContext,\n resource: {\n orderSummaryHeading,\n orderSummaryItemsTotalLabel,\n orderSummaryShippingFeeLabel,\n orderSummaryTaxLabel,\n pointsEarnedLabel,\n orderSummaryGrandTotalLabel\n }\n };\n }\n\n @computed get paymentMethodsProps(): IPaymentMethodsInput | undefined {\n const tenderTypes = this.props.data.tenderTypes.result;\n if (!this.order || !this.order.TenderLines || !tenderTypes) {\n return;\n }\n\n const locale = get(this.props, 'context.request.locale') || 'en-US';\n\n const {\n resources: {\n paymentMethodsTitle,\n creditCardEndingLabel,\n giftCardEndingLabel,\n amountCoveredLabel,\n cashUsedLabel,\n loyaltyCardUsedLabel,\n customerAccountUsedLabel\n }\n } = this.props;\n\n return {\n priceContext: this.priceContext,\n tenderLines: this.order.TenderLines,\n tenderIdOperationIdMap: getTenderIdOperationIdMap(tenderTypes),\n locale,\n resource: {\n paymentMethodsTitle,\n creditCardEndingLabel,\n giftCardEndingLabel,\n amountCoveredLabel,\n cashUsedLabel,\n loyaltyCardUsedLabel,\n customerAccountUsedLabel\n }\n };\n }\n\n public render(): JSX.Element {\n const {\n resources: {\n noSalesOrderText,\n genericErrorMessage,\n needHelpLabel,\n helpLineNumberLabel,\n loadingLabel,\n backToShopping,\n orderItemLabel,\n orderItemsLabel,\n helpLineContactAriaLabel\n },\n config: { heading, contactNumber, showTimeslot }\n } = this.props;\n\n const moduleProps = { moduleProps: this.props, className: classname('ms-order-confirmation', this.props.config.className) };\n const backToShoppingUrl = Msdyn365.getUrlSync('home', this.props.context.actionContext) || '';\n const multiplePickupStoreSwitchName = 'Dynamics.AX.Application.RetailMultiplePickupDeliveryModeFeature';\n const { channelDeliveryOptionConfig, featureState } = this.props?.data;\n const retailMultiplePickUpOptionEnabled = featureState?.result?.find(item => item.Name === multiplePickupStoreSwitchName)\n ?.IsEnabled;\n\n let viewProps: ICheckoutOrderConfirmationViewProps = {\n ...this.props,\n moduleProps,\n heading: heading && heading.text && (\n <Msdyn365.Text\n {...heading}\n className='ms-order-confirmation__heading'\n text={heading.text}\n tag={heading.tag || 'h2'}\n editProps={{ onEdit: this.handleCheckoutOrderConfirmationHeadingChange, requestContext: this.props.context.request }}\n />\n ),\n backToShoppingLink: backToShoppingUrl && (\n <Button className='ms-order-confirmation__btn-keep-shopping' href={backToShoppingUrl} {...this.backToShoppingAttributes}>\n {backToShopping}\n </Button>\n ),\n footerProps: { className: 'ms-order-confirmation__footer' }\n };\n\n if (this.hasError) {\n viewProps = {\n ...viewProps,\n alert: <Label className='ms-order-confirmation__alert' label={genericErrorMessage} />\n };\n return this.props.renderView(viewProps) as React.ReactElement;\n }\n\n if (!this.isDataReady) {\n viewProps = {\n ...viewProps,\n loading: <Label className='ms-order-confirmation__loading' label={loadingLabel} />\n };\n return this.props.renderView(viewProps) as React.ReactElement;\n }\n\n if (!this.order) {\n viewProps = {\n ...viewProps,\n alert: <Label className='ms-order-confirmation__alert' label={noSalesOrderText} />\n };\n return this.props.renderView(viewProps) as React.ReactElement;\n }\n\n const salesLinesInput = getSalesLinesInput(\n this.props,\n this.moduleName,\n this.order,\n this.products,\n this.priceContext,\n false,\n showTimeslot,\n undefined,\n retailMultiplePickUpOptionEnabled,\n channelDeliveryOptionConfig?.result\n );\n const salesLines = salesLinesInput && getSalesLines(salesLinesInput);\n\n const orderInfomationInput = this.order && getOrderInformationInput(this.props, this.moduleName, this.order, this.priceContext);\n const orderInfomation = orderInfomationInput && getOrderInformation(orderInfomationInput);\n\n viewProps = {\n ...viewProps,\n salesOrder: this.order,\n orderInfomation,\n salesLines,\n groups: salesLines\n ? getGroups({\n moduleName: this.moduleName,\n salesLines,\n resources: { orderItemLabel, orderItemsLabel },\n showTimeslot,\n retailMultiplePickUpOptionEnabled\n })\n : undefined,\n orderSummary: this.orderSummaryProps ? getOrderConfirmationOrderSummary(this.orderSummaryProps) : undefined,\n payment: this.paymentMethodsProps ? getOrderConfirmationPaymentMethods(this.paymentMethodsProps) : undefined,\n help: contactNumber\n ? getOrderConfirmationHelp({\n needHelpLabel,\n helpLineNumberLabel,\n contactNumber,\n helpLineContactAriaLabel,\n telemetryContent: this.telemetryContent\n })\n : undefined\n };\n\n return this.props.renderView(viewProps) as React.ReactElement;\n }\n\n public handleCheckoutOrderConfirmationHeadingChange = (event: Msdyn365.ContentEditableEvent) =>\n (this.props.config.heading!.text = event.target.value);\n}\n\nexport default OrderConfirmation;\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 { RetailOperation, TenderLine } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\nimport * as React from 'react';\n\nimport { IPaymentMethods, IPaymentMethodsInput } from '../../../common';\n\nexport const getOrderConfirmationPaymentMethods = ({\n priceContext,\n tenderLines,\n tenderIdOperationIdMap,\n resource: {\n paymentMethodsTitle,\n creditCardEndingLabel,\n giftCardEndingLabel,\n amountCoveredLabel,\n loyaltyCardUsedLabel,\n cashUsedLabel,\n customerAccountUsedLabel\n }\n}: IPaymentMethodsInput): IPaymentMethods => {\n const getLastFourDigit = (digits = '') => digits.substr(-4);\n\n const getCard = (tenderLine: TenderLine, showAmount: boolean = false) => {\n const cardLastFourDigit = getLastFourDigit(tenderLine.MaskedCardNumber);\n\n // @ts-expect-error\n const isValidCardNumber = cardLastFourDigit && !isNaN(cardLastFourDigit);\n const amount = (tenderLine.AuthorizedAmount || 0) > 0 ? tenderLine.AuthorizedAmount : tenderLine.Amount;\n const showAmountCovered = !!(showAmount && amount && amount > 0);\n\n return (\n <div className='ms-order-confirmation__payment-methods-line' key={tenderLine.TenderTypeId}>\n <p className='ms-order-confirmation__payment-methods-card'>\n {`${tenderLine.CardTypeId} ${isValidCardNumber ? `${creditCardEndingLabel} ${cardLastFourDigit}` : ''}`}\n </p>\n {showAmountCovered && (\n <p className='ms-order-confirmation__payment-methods-card-amount-info'>\n {amountCoveredLabel}\n <PriceComponent\n {...priceContext}\n className='ms-order-confirmation__payment-methods-card-amount'\n data={{ price: { CustomerContextualPrice: amount || 0 } }}\n />\n </p>\n )}\n </div>\n );\n };\n\n const getGiftCertificate = (tenderLine: TenderLine) => (\n <div className='ms-order-confirmation__payment-methods-line' key={tenderLine.TenderTypeId}>\n <p className='ms-order-confirmation__payment-methods-gift-card-number'>\n {giftCardEndingLabel}\n {` `}\n {getLastFourDigit(tenderLine.GiftCardId)}\n </p>\n <p className='ms-order-confirmation__payment-methods-gift-card-amount-info'>\n {amountCoveredLabel}\n <PriceComponent\n {...priceContext}\n className='ms-order-confirmation__payment-methods-gift-card-amount'\n data={{ price: { CustomerContextualPrice: tenderLine.Amount || 0 } }}\n />\n </p>\n </div>\n );\n\n const getLoyalty = (tenderLine: TenderLine) => (\n <div className='ms-order-confirmation__payment-methods-line' key={tenderLine.TenderTypeId}>\n <p className='ms-order-confirmation__payment-methods-loyalty-number'>\n {loyaltyCardUsedLabel}\n {` `}\n {tenderLine.LoyaltyCardId}\n </p>\n <p className='ms-order-confirmation__payment-methods-loyalty-amount-info'>\n {amountCoveredLabel}\n <PriceComponent\n {...priceContext}\n className='ms-order-confirmation__payment-methods-loyalty-amount'\n data={{ price: { CustomerContextualPrice: tenderLine.Amount || 0 } }}\n />\n </p>\n </div>\n );\n\n const getCash = (tenderLine: TenderLine) => (\n <div className='ms-order-confirmation__payment-methods-line' key={tenderLine.TenderTypeId}>\n <p className='ms-order-confirmation__payment-methods-cash'>{cashUsedLabel}</p>\n <p className='ms-order-confirmation__payment-methods-cash-amount-info'>\n {amountCoveredLabel}\n <PriceComponent\n {...priceContext}\n className='ms-order-confirmation__payment-methods-cash-amount'\n data={{ price: { CustomerContextualPrice: tenderLine.Amount || 0 } }}\n />\n </p>\n </div>\n );\n\n /**\n * Get customer account payment information.\n * @param tenderLine - The customer account payment tender line.\n * @returns The customer account payment HTML.\n */\n const getCustomerAccountPayment = (tenderLine: TenderLine) => (\n <div className='ms-order-confirmation__payment-methods-line' key={tenderLine.TenderTypeId}>\n <p className='ms-order-confirmation__payment-methods-customer-account'>\n {customerAccountUsedLabel}\n {` `}\n {tenderLine.CustomerId}\n </p>\n <p className='ms-order-confirmation__payment-methods-customer-account-info'>\n {amountCoveredLabel}\n <PriceComponent\n {...priceContext}\n className='ms-order-confirmation__payment-methods-customer-account-amount'\n data={{ price: { CustomerContextualPrice: tenderLine.Amount ?? 0 } }}\n />\n </p>\n </div>\n );\n\n return {\n paymentMethodsProps: { className: 'ms-order-confirmation__payment-methods' },\n title: <div className='ms-order-confirmation__payment-methods-title'>{paymentMethodsTitle}</div>,\n methods: tenderLines.reduce((lines: React.ReactNode[], tenderLine) => {\n if (!tenderLine.TenderTypeId) {\n return lines;\n }\n switch (tenderIdOperationIdMap[tenderLine.TenderTypeId]) {\n case RetailOperation.PayCard:\n lines.push(getCard(tenderLine, tenderLines.length > 1));\n break;\n case RetailOperation.PayGiftCertificate:\n lines.push(getGiftCertificate(tenderLine));\n break;\n case RetailOperation.PayLoyalty:\n lines.push(getLoyalty(tenderLine));\n break;\n case RetailOperation.PayCash:\n lines.push(getCash(tenderLine));\n break;\n case RetailOperation.PayCustomerAccount:\n lines.push(getCustomerAccountPayment(tenderLine));\n break;\n default:\n\n // Do nothing\n }\n return lines;\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 { getPayloadObject, getTelemetryAttributes, IPayLoad, TelemetryConstant } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { IGetHelpInput, IHelp } from '../../../common';\n\nexport const getOrderDetailsHelp = ({\n needHelpLabel,\n helpLineNumberLabel,\n contactNumber,\n helpLineContactAriaLabel,\n telemetryContent\n}: IGetHelpInput): IHelp => {\n const payLoad: IPayLoad = getPayloadObject('click', telemetryContent!, TelemetryConstant.ContactNumber);\n const attributes = getTelemetryAttributes(telemetryContent!, payLoad);\n return {\n helpProps: { className: 'ms-order-details__help' },\n needHelpLabel: <p className='ms-order-details__help-title'>{needHelpLabel}</p>,\n helpLineNumberLabel: <span className='ms-order-details__help-label'>{helpLineNumberLabel}</span>,\n contactNumber: (\n <a\n className='ms-order-details__help-content-number'\n aria-label={`${helpLineContactAriaLabel} ${contactNumber}`}\n href={`tel:${contactNumber}`}\n {...attributes}\n >\n {contactNumber}\n </a>\n )\n };\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { PriceComponent } from '@msdyn365-commerce/components';\nimport * as React from 'react';\n\nimport { IGetOrderSummaryInput, IOrderSummary, IPriceContext } from '../../../common';\n\ninterface ISummaryLineProps {\n priceContext?: IPriceContext;\n name: string;\n label: string;\n value?: number;\n priceCurrency?: string;\n}\n\nconst OrderSummaryLine: React.SFC<ISummaryLineProps> = ({ name, label, value = 0, priceContext, priceCurrency }) => (\n <p className={`ms-order-details__order-summary-line-${name}`}>\n <span className='ms-order-details__order-summary-label'>{label}</span>\n {priceContext ? (\n <PriceComponent\n {...priceContext}\n className='ms-order-details__order-summary-price'\n data={{ price: { CustomerContextualPrice: value } }}\n currencyCode={priceCurrency}\n />\n ) : (\n <span className='ms-order-details__order-summary-price'>{value}</span>\n )}\n </p>\n);\n\nexport const getOrderDetailsOrderSummary = ({\n order,\n priceContext,\n earnedPoints,\n resource: {\n orderSummaryHeading,\n orderSummaryItemsTotalLabel,\n orderSummaryShippingFeeLabel,\n orderSummaryTaxLabel,\n orderSummaryGrandTotalLabel,\n pointsEarnedLabel\n },\n canShip,\n isTaxIncludedInPrice,\n isShowTaxBreakUp\n}: IGetOrderSummaryInput): IOrderSummary => {\n const subTotal = isTaxIncludedInPrice && isShowTaxBreakUp ? order.SubtotalAmountWithoutTax : order.SubtotalAmount;\n const taxOnShippingCharge = order.TaxOnShippingCharge !== undefined ? order.TaxOnShippingCharge : 0;\n const shippingChargeAmount = order.ShippingChargeAmount !== undefined ? order.ShippingChargeAmount : 0;\n\n // isTaxIncludedInPrice isShowTaxBreakup useProperties\n // False False/True shippingChargeAmount\n // True True shippingChargeAmount\n // True false shippingChargeAmount + taxOnShippingCharge\n const shippingCharge =\n isTaxIncludedInPrice && !isShowTaxBreakUp ? shippingChargeAmount + taxOnShippingCharge : order.ShippingChargeAmount;\n return {\n orderSummaryProps: { className: 'ms-order-details__order-summary' },\n heading: <p className='ms-order-details__order-summary-heading'>{orderSummaryHeading}</p>,\n subtotal: (\n <OrderSummaryLine\n name='subtotal'\n label={orderSummaryItemsTotalLabel}\n value={subTotal}\n priceContext={priceContext}\n priceCurrency={order.CurrencyCode}\n />\n ),\n shipping: canShip ? (\n <OrderSummaryLine\n name='shipping'\n label={orderSummaryShippingFeeLabel}\n value={shippingCharge}\n priceContext={priceContext}\n priceCurrency={order.CurrencyCode}\n />\n ) : (\n ''\n ),\n tax: isShowTaxBreakUp ? (\n <OrderSummaryLine\n name='tax-amount'\n label={orderSummaryTaxLabel}\n value={order.TaxAmount}\n priceContext={priceContext}\n priceCurrency={order.CurrencyCode}\n />\n ) : (\n ''\n ),\n totalAmount: (\n <OrderSummaryLine\n name='total-amount'\n label={orderSummaryGrandTotalLabel}\n value={order.TotalAmount}\n priceContext={priceContext}\n priceCurrency={order.CurrencyCode}\n />\n ),\n earnedPoints: earnedPoints ? <OrderSummaryLine name='earned-points' label={pointsEarnedLabel} value={earnedPoints} /> : 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 { PriceComponent } from '@msdyn365-commerce/components';\nimport { TenderLine } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\nimport * as React from 'react';\n\nimport { IPaymentMethods, IPaymentMethodsInput } from '../../../common';\n\nexport const getOrderDetailsPaymentMethods = ({\n priceContext,\n tenderLines,\n tenderIdOperationIdMap,\n resource: {\n paymentMethodsTitle,\n creditCardEndingLabel,\n giftCardEndingLabel,\n amountCoveredLabel,\n loyaltyCardUsedLabel,\n cashUsedLabel,\n customerAccountUsedLabel\n },\n priceCurrency\n}: IPaymentMethodsInput): IPaymentMethods => {\n const OPERATIONS = {\n PayCard: 201,\n PayGiftCertificate: 214,\n PayLoyalty: 207,\n PayCash: 200,\n PayCustomerAccount: 202\n };\n\n const getLastFourDigit = (digits = '') => (digits ? digits.substr(-4) : '');\n\n const getCard = (tenderLine: TenderLine, showAmount: boolean = false) => {\n const cardLastFourDigit = getLastFourDigit(tenderLine.MaskedCardNumber);\n\n // @ts-expect-error\n const isValidCardNumber = cardLastFourDigit && !isNaN(cardLastFourDigit);\n const amount = (tenderLine.AuthorizedAmount || 0) > 0 ? tenderLine.AuthorizedAmount : tenderLine.Amount;\n const showAmountCovered = !!(showAmount && amount && amount > 0);\n\n return (\n <div className='ms-order-details__payment-methods-line' key={tenderLine.TenderTypeId}>\n <p className='ms-order-details__payment-methods-card'>\n {`${tenderLine.CardTypeId} ${isValidCardNumber ? `${creditCardEndingLabel} ${cardLastFourDigit}` : ''}`}\n </p>\n {showAmountCovered && (\n <p className='ms-order-details__payment-methods-card-amount-info'>\n {amountCoveredLabel}\n <PriceComponent\n {...priceContext}\n className='ms-order-details__payment-methods-card-amount'\n data={{ price: { CustomerContextualPrice: amount || 0 } }}\n currencyCode={priceCurrency}\n />\n </p>\n )}\n </div>\n );\n };\n\n const getCustomerAccountPayment = (tenderLine: TenderLine) => (\n <div className='ms-order-details__payment-methods-line' key={tenderLine.TenderTypeId}>\n <p className='ms-order-details__payment-methods-customer-account'>\n {customerAccountUsedLabel}\n {` `}\n {tenderLine.CustomerId}\n </p>\n <p className='ms-order-details__payment-methods-customer-account-info'>\n {amountCoveredLabel}\n <PriceComponent\n {...priceContext}\n className='ms-order-details__payment-methods-customer-account-amount'\n data={{ price: { CustomerContextualPrice: tenderLine.Amount || 0 } }}\n currencyCode={priceCurrency}\n />\n </p>\n </div>\n );\n\n const getGiftCertificate = (tenderLine: TenderLine) => (\n <div className='ms-order-details__payment-methods-line' key={tenderLine.TenderTypeId}>\n <p className='ms-order-details__payment-methods-gift-card-number'>\n {giftCardEndingLabel}\n {` `}\n {getLastFourDigit(tenderLine.GiftCardId)}\n </p>\n <p className='ms-order-details__payment-methods-gift-card-amount-info'>\n {amountCoveredLabel}\n <PriceComponent\n {...priceContext}\n className='ms-order-details__payment-methods-gift-card-amount'\n data={{ price: { CustomerContextualPrice: tenderLine.Amount || 0 } }}\n currencyCode={priceCurrency}\n />\n </p>\n </div>\n );\n\n const getLoyalty = (tenderLine: TenderLine) => (\n <div className='ms-order-details__payment-methods-line' key={tenderLine.TenderTypeId}>\n <p className='ms-order-details__payment-methods-loyalty-number'>\n {loyaltyCardUsedLabel}\n {` `}\n {tenderLine.LoyaltyCardId}\n </p>\n <p className='ms-order-details__payment-methods-loyalty-amount-info'>\n {amountCoveredLabel}\n <PriceComponent\n {...priceContext}\n className='ms-order-details__payment-methods-loyalty-amount'\n data={{ price: { CustomerContextualPrice: tenderLine.Amount || 0 } }}\n currencyCode={priceCurrency}\n />\n </p>\n </div>\n );\n\n const getCash = (tenderLine: TenderLine) => (\n <div className='ms-order-details__payment-methods-line' key={tenderLine.TenderTypeId}>\n <p className='ms-order-details__payment-methods-cash'>{cashUsedLabel}</p>\n <p className='ms-order-details__payment-methods-cash-amount-info'>\n {amountCoveredLabel}\n <PriceComponent\n {...priceContext}\n className='ms-order-details__payment-methods-cash-amount'\n data={{ price: { CustomerContextualPrice: tenderLine.Amount || 0 } }}\n currencyCode={priceCurrency}\n />\n </p>\n </div>\n );\n\n return {\n paymentMethodsProps: { className: 'ms-order-details__payment-methods' },\n title: <div className='ms-order-details__payment-methods-title'>{paymentMethodsTitle}</div>,\n methods: tenderLines.reduce((lines: React.ReactNode[], tenderLine) => {\n if (!tenderLine.TenderTypeId) {\n return lines;\n }\n switch (tenderIdOperationIdMap[tenderLine.TenderTypeId]) {\n case OPERATIONS.PayCard:\n lines.push(getCard(tenderLine, tenderLines.length > 1));\n break;\n case OPERATIONS.PayGiftCertificate:\n lines.push(getGiftCertificate(tenderLine));\n break;\n case OPERATIONS.PayLoyalty:\n lines.push(getLoyalty(tenderLine));\n break;\n case OPERATIONS.PayCash:\n lines.push(getCash(tenderLine));\n break;\n case OPERATIONS.PayCustomerAccount:\n lines.push(getCustomerAccountPayment(tenderLine));\n break;\n default:\n\n // Do nothing\n }\n return lines;\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 { IAny, IComponentProps, ICoreContext, IGeneric } from '@msdyn365-commerce/core';\nimport { isMobile, VariantType } from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport React from 'react';\n\n/**\n * Resources which are used in order details header.\n */\nexport interface IOrderDetailsTableHeaderResources {\n orderDetailsProductNumberText: string;\n orderDetailsProductText: string;\n orderDetailsUnitPriceText: string;\n orderDetailsModeOfDeliveryText: string;\n orderDetailsStatusText: string;\n orderDetailsQuantityText: string;\n orderDetailsUnitOfMeasureText: string;\n orderDetailsTotalText: string;\n orderDetailsActionsText: string;\n orderDetailsSelectAllRadioAriaLabelText: string;\n}\n\n/**\n * Configuration of the component.\n */\nexport interface IOrderDetailsTableHeaderProps extends IComponentProps {\n context: ICoreContext<IGeneric<IAny>>;\n className: string;\n\n resources: IOrderDetailsTableHeaderResources;\n\n isCashAndCarryTransaction: boolean;\n isSelectedAll: boolean;\n isSelectionModeEnabled: boolean;\n isChannelMultipleCatalogsFeatureEnabled?: boolean;\n onSelectAll(isSelected: boolean): void;\n}\n\n/**\n * Renders checkbox for order details lines selection.\n * @param props - Order detail table header props.\n * @returns React element.\n */\nconst OrderDetailsHeaderCheckboxComponent: React.FC<IOrderDetailsTableHeaderProps> = (props: IOrderDetailsTableHeaderProps) => {\n const switchCheckedState = React.useCallback(() => {\n props.onSelectAll(!props.isSelectedAll);\n }, [props]);\n\n return (\n <label className={classnames(`${props.className}__checkbox-container`, 'checkbox-container')}>\n <input\n className={classnames(`${props.className}__checkbox-input`, 'checkbox-input')}\n type='checkbox'\n aria-label={props.resources.orderDetailsSelectAllRadioAriaLabelText}\n aria-checked={props.isSelectedAll}\n checked={props.isSelectedAll}\n onChange={switchCheckedState}\n />\n <span className={classnames(`${props.className}__checkmark`, 'checkmark')} />\n </label>\n );\n};\n\n/**\n * Renders desktop view cells.\n * @param props - Configuration of the module.\n * @returns List of cells for the header.\n */\nconst OrderDetailsDesktopHeaderCellsComponent: React.FC<IOrderDetailsTableHeaderProps> = (props: IOrderDetailsTableHeaderProps) => {\n const { resources } = props;\n\n const columnWithNumberClassName = `${props.className}__row__column-with-number`;\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- app configs are of generic type\n const shouldDisplayUnitOfMeasure =\n props.context.app.config.unitOfMeasureDisplayType && props.context.app.config.unitOfMeasureDisplayType !== 'none';\n\n return (\n <>\n {props.isSelectionModeEnabled ? (\n <th>\n <OrderDetailsHeaderCheckboxComponent {...props} />\n </th>\n ) : (\n undefined\n )}\n <th />\n <th>{resources.orderDetailsProductNumberText}</th>\n <th>{resources.orderDetailsProductText}</th>\n <th className={columnWithNumberClassName}>{resources.orderDetailsUnitPriceText}</th>\n <th>{resources.orderDetailsModeOfDeliveryText}</th>\n {props.isCashAndCarryTransaction ? undefined : <th>{resources.orderDetailsStatusText}</th>}\n <th className={columnWithNumberClassName}>{resources.orderDetailsQuantityText}</th>\n {shouldDisplayUnitOfMeasure && <th>{resources.orderDetailsUnitOfMeasureText}</th>}\n\n <th className={columnWithNumberClassName}>{resources.orderDetailsTotalText}</th>\n <th>{resources.orderDetailsActionsText}</th>\n </>\n );\n};\n\n/**\n * Renders mobile view cells.\n * @param props - Configuration of the module.\n * @returns List of cells for the header.\n */\nconst OrderDetailsMobileHeaderCellsComponent: React.FC<IOrderDetailsTableHeaderProps> = (props: IOrderDetailsTableHeaderProps) => {\n const { resources } = props;\n return (\n <>\n {props.isSelectionModeEnabled ? (\n <th>\n <OrderDetailsHeaderCheckboxComponent {...props} />\n </th>\n ) : (\n undefined\n )}\n <th />\n <th className={`${props.className}__row`}>{resources.orderDetailsProductText}</th>\n </>\n );\n};\n\n/**\n * Order details table header component.\n * @param props - Configuration of the component.\n * @returns React node with the header.\n */\nexport const OrderDetailsTableHeaderComponent: React.FC<IOrderDetailsTableHeaderProps> = (props: IOrderDetailsTableHeaderProps) => {\n const rowClassName = `${props.className}__row`;\n\n let headerCells: JSX.Element;\n const isMobileView = isMobile({ variant: VariantType.Viewport, context: props.context.request }) === 'xs';\n if (isMobileView) {\n headerCells = <OrderDetailsMobileHeaderCellsComponent {...props} />;\n } else {\n headerCells = <OrderDetailsDesktopHeaderCellsComponent {...props} />;\n }\n\n return (\n <thead className={props.className}>\n <tr className={rowClassName}>{headerCells}</tr>\n </thead>\n );\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { OrderDetailsProduct } from '@msdyn365-commerce/components';\nimport MsDyn365, { IAny, IComponentProps, ICoreContext, IGeneric, IImageSettings, Image, isChannelTypeB2B } from '@msdyn365-commerce/core';\nimport { ChannelDeliveryOptionConfiguration, format, ProductDeliveryOptions, SalesOrder } from '@msdyn365-commerce/retail-proxy';\nimport { getFallbackImageUrl, getProductPageUrlSync, ObjectExtensions, StringExtensions } from '@msdyn365-commerce-modules/retail-actions';\nimport { Button, isMobile, VariantType } from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport React, { useState } from 'react';\n\nimport { BuySelectedComponent } from '../../../../../common/buy-selected-component';\nimport {\n getDeliveryDescriptionByProductId,\n getDeliveryType,\n getDeliveryTypeString,\n IDeliveryTypeStringMap,\n ISalesStatusStringMap\n} from '../../../../../common/get-sales-line';\nimport { defaultImageSettings, getSalesStatusCode } from '../../../../../common/utilities';\n\n/**\n * Data required to render each order details row.\n */\nexport interface IOrderDetailsTableRowData {\n salesOrder: SalesOrder;\n product: OrderDetailsProduct;\n deliveryOptions: ProductDeliveryOptions[];\n channelDeliveryOptionConfig?: ChannelDeliveryOptionConfiguration;\n}\n\n/**\n * Resources for order details table rows.\n */\nexport interface IOrderDetailsTableRowResources {\n orderDetailsProductDimensionsSeparator: string;\n orderDetailsQuantityMobileText: string;\n orderDetailsViewDetailsButtonText: string;\n orderDetailsViewDetailsButtonAriaLabel: string;\n pickedUpSalesLines: string;\n deliveredSalesLines: string;\n carryOutSalesLines: string;\n emailSalesLines: string;\n orderStatusReadyForPickup: string;\n orderStatusProcessing: string;\n orderStatusShipped: string;\n orderStatusPickedUp: string;\n orderStatusCanceled: string;\n orderStatusEmailed: string;\n\n orderDetailsSelectRadioAriaLabelText: string;\n\n orderDetailsBuyItAgainButtonText: string;\n orderDetailsBuyItAgainButtonAriaLabel: string;\n orderDetailsBuySelectedAddingToCartErrorNotificationTitle: string;\n orderDetailsBuySelectedAddingToCartErrorNotificationCloseAriaLabel: string;\n orderDetailsUnavailableProductText?: string;\n}\n\n/**\n * Configuration for the order details rows.\n */\nexport interface IOrderDetailsTableRowProps extends IComponentProps<IOrderDetailsTableRowData> {\n context: ICoreContext<IGeneric<IAny>>;\n className: string;\n\n imageSettings?: IImageSettings;\n isCashAndCarryTransaction: boolean;\n isReorderingEnabled?: boolean;\n isRetailMultiplePickUpOptionEnabled?: boolean;\n isSelectionModeEnabled: boolean;\n\n resources: IOrderDetailsTableRowResources;\n isChannelMultipleCatalogsFeatureEnabled?: boolean;\n}\n\n/**\n * Formats amount.\n * @param context - Core context.\n * @param amount - Amount to display.\n * @param currencyCode - Currency for the amount.\n * @returns String value.\n */\nconst formatAmount = (context: ICoreContext, amount: number | undefined, currencyCode: string | undefined) => {\n if (amount === undefined) {\n return '';\n }\n return context.cultureFormatter.formatCurrency(amount, currencyCode);\n};\n\n/**\n * Renders checkbox for order details line selection.\n * @param props - Order detail table row props.\n * @returns React element.\n */\nconst OrderDetailsRowCheckboxComponent: React.FC<IOrderDetailsTableRowProps> = (props: IOrderDetailsTableRowProps) => {\n const product = props.data.product;\n\n const checkboxRowAriaLabel = format(props.resources.orderDetailsSelectRadioAriaLabelText, product.salesLine.ProductId);\n const onSelectLine = React.useCallback(() => {\n product.isSelected = !product.isSelected;\n }, [product]);\n\n return (\n <label className={classnames(`${props.className}__checkbox-container`, 'checkbox-container')}>\n <input\n className={classnames(`${props.className}__checkbox-input`, 'checkbox-input')}\n type='checkbox'\n checked={product.isProductAvailable && product.isSelected}\n aria-label={checkboxRowAriaLabel}\n aria-checked={product.isProductAvailable && product.isSelected}\n onChange={onSelectLine}\n disabled={!product.isProductAvailable}\n />\n <span className={classnames(`${props.className}__checkmark`, 'checkmark')} />\n </label>\n );\n};\n\n/**\n * Renders product image for order details line.\n * @param props - Order detail table row props.\n * @returns React element.\n */\nconst OrderDetailsRowProductImageComponent: React.FC<IOrderDetailsTableRowProps> = (props: IOrderDetailsTableRowProps) => {\n const product = props.data.product;\n const fallbackImageUrl = getFallbackImageUrl(\n product.simpleProduct?.ItemId,\n props.context.actionContext.requestContext.apiSettings,\n props.context.request.app?.config?.OmniChannelMedia\n );\n\n const containerClassName = `${props.className}__product-image-container`;\n\n const productName = product.simpleProduct?.Name ?? product.salesLine.Description;\n\n return (\n <div className={containerClassName}>\n <Image\n requestContext={props.context.actionContext.requestContext}\n className={`${containerClassName}__product-image`}\n altText={productName}\n // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing -- Need to set empty by default.\n src={product.simpleProduct?.PrimaryImageUrl || 'empty'}\n fallBackSrc={fallbackImageUrl}\n gridSettings={props.context.request.gridSettings!}\n imageSettings={props.imageSettings ?? defaultImageSettings}\n loadFailureBehavior='empty'\n />\n </div>\n );\n};\n\n/**\n * Renders rows for desktop view.\n * @param props - Configuration for the rows.\n * @returns A react node with a list of order details rows for desktop view.\n */\nexport const OrderDetailsDesktopTableRowCellComponent: React.FC<IOrderDetailsTableRowProps> = (props: IOrderDetailsTableRowProps) => {\n const {\n data: { product, salesOrder, deliveryOptions }\n } = props;\n const salesLine = product.salesLine;\n\n const pickupMode = getDeliveryDescriptionByProductId(salesLine.ProductId, salesLine.DeliveryMode, deliveryOptions);\n const pickupDeliveryModeCode = props.context.request.channel?.PickupDeliveryModeCode;\n const emailDeliveryModeCode = props.context.request.channel?.EmailDeliveryModeCode;\n const deliveryType = getDeliveryType(\n pickupMode,\n salesLine,\n salesLine.DeliveryMode,\n pickupDeliveryModeCode,\n props.isRetailMultiplePickUpOptionEnabled,\n props.data.channelDeliveryOptionConfig,\n emailDeliveryModeCode\n );\n const deliveryTypeStringMap: IDeliveryTypeStringMap = {\n pickUp: props.resources.pickedUpSalesLines,\n ship: props.resources.deliveredSalesLines,\n carryOut: props.resources.carryOutSalesLines,\n email: props.resources.emailSalesLines\n };\n const deliveryTypeString = getDeliveryTypeString(deliveryType, deliveryTypeStringMap, props.isRetailMultiplePickUpOptionEnabled);\n\n const salesStatusStringMap: ISalesStatusStringMap = {\n canceled: props.resources.orderStatusCanceled,\n readyForPickup: props.resources.orderStatusReadyForPickup,\n pickedUp: props.resources.orderStatusPickedUp,\n processing: props.resources.orderStatusProcessing,\n shipped: props.resources.orderStatusShipped,\n unknown: undefined,\n emailed: props.resources.orderStatusEmailed\n };\n\n const salesStatus = getSalesStatusCode(deliveryType, salesLine.SalesStatusValue, pickupMode);\n const salesStatusString = salesStatusStringMap[salesStatus];\n\n const columnWithNumberClassName = `${props.className}__column-with-number`;\n\n const productName = product.simpleProduct?.Name ?? salesLine.Description;\n\n let productUrl = '';\n if (!ObjectExtensions.isNullOrUndefined(productName) && !ObjectExtensions.isNullOrUndefined(salesLine.ProductId)) {\n productUrl = getProductPageUrlSync(productName, salesLine.ProductId, props.context.actionContext);\n\n if (MsDyn365.isBrowser && isChannelTypeB2B(props.context.actionContext.requestContext)) {\n const fullUrl = new URL(productUrl, window.location.href);\n fullUrl.searchParams.set('catalogid', `${salesLine.CatalogId ?? 0}`);\n productUrl = fullUrl.href;\n }\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- app configs are of generic type\n const shouldDisplayUnitOfMeasure =\n props.context.app.config.unitOfMeasureDisplayType && props.context.app.config.unitOfMeasureDisplayType !== 'none';\n\n const currentProduct = new OrderDetailsProduct(product.salesLine, product.simpleProduct, productUrl);\n\n return (\n <>\n {props.isSelectionModeEnabled ? (\n <td>\n <OrderDetailsRowCheckboxComponent {...props} />\n </td>\n ) : (\n undefined\n )}\n <td>\n <OrderDetailsRowProductImageComponent {...props} />\n </td>\n <td>{salesLine.ItemId}</td>\n <td>\n <div className={`${props.className}__product-info`}>\n <a className={`${props.className}__product-name`} href={productUrl}>\n {productName}\n </a>\n <span className={`${props.className}__product-dimensions`}>\n {product.simpleProduct?.Dimensions?.map(dimension => dimension.DimensionValue?.Value)\n .filter(dimensionValue => !StringExtensions.isNullOrWhitespace(dimensionValue))\n .join(props.resources.orderDetailsProductDimensionsSeparator)}\n </span>\n {!product.isProductAvailable && (\n <div className='msc-alert-danger'>{props.resources.orderDetailsUnavailableProductText}</div>\n )}\n </div>\n </td>\n <td className={columnWithNumberClassName}>{formatAmount(props.context, salesLine.Price, salesOrder.CurrencyCode)}</td>\n <td>{deliveryTypeString}</td>\n {props.isCashAndCarryTransaction ? undefined : <td>{salesStatusString}</td>}\n <td className={columnWithNumberClassName}>{salesLine.Quantity}</td>\n {shouldDisplayUnitOfMeasure && <td>{salesLine.UnitOfMeasureSymbol}</td>}\n\n <td className={columnWithNumberClassName}>{formatAmount(props.context, salesLine.TotalAmount, salesOrder.CurrencyCode)}</td>\n <td>\n <BuySelectedComponent\n {...props}\n className={`${props.className}__buy-again msc-btn`}\n data={{ products: [currentProduct] }}\n resources={{\n ...props.resources,\n orderDetailsBuySelectedButtonText: props.resources.orderDetailsBuyItAgainButtonText,\n orderDetailsBuySelectedButtonAriaLabel: format(\n props.resources.orderDetailsBuyItAgainButtonAriaLabel,\n productName ?? ''\n )\n }}\n isReorderingEnabled={props.isReorderingEnabled}\n isIcon\n />\n </td>\n </>\n );\n};\n\nlet setShowPreviousActions: React.Dispatch<React.SetStateAction<boolean>> | undefined;\n\n/**\n * Renders actions popup for the mobile view.\n * @param props - Configuration for popup.\n * @returns A react node with actions..\n */\nconst OrderDetailsExtraActionsPopupComponent: React.FC<IOrderDetailsTableRowProps> = (\n props: IOrderDetailsTableRowProps\n): JSX.Element | null => {\n const {\n resources: { orderDetailsViewDetailsButtonAriaLabel, orderDetailsViewDetailsButtonText }\n } = props;\n\n const [shouldShowActions, setShowActions] = useState(false);\n\n const salesLine = props.data.product.salesLine;\n\n const productName = props.data.product.simpleProduct?.Name ?? salesLine.Description;\n let productUrl = '';\n if (!ObjectExtensions.isNullOrUndefined(productName) && !ObjectExtensions.isNullOrUndefined(salesLine.ProductId)) {\n productUrl = getProductPageUrlSync(productName, salesLine.ProductId, props.context.actionContext);\n\n if (MsDyn365.isBrowser && isChannelTypeB2B(props.context.actionContext.requestContext)) {\n const fullUrl = new URL(productUrl, window.location.href);\n fullUrl.searchParams.set('catalogid', `${salesLine.CatalogId ?? 0}`);\n productUrl = fullUrl.href;\n }\n }\n const currentProduct = new OrderDetailsProduct(props.data.product.salesLine, props.data.product.simpleProduct, productUrl);\n\n const onClickViewDetails = React.useCallback(() => {\n if (MsDyn365.isBrowser) {\n window.location.href = productUrl;\n }\n }, [productUrl]);\n\n const toggle = React.useCallback(() => {\n const shouldShowActionsNewValue = !shouldShowActions;\n if (shouldShowActionsNewValue) {\n if (setShowPreviousActions) {\n setShowPreviousActions(false);\n }\n setShowActions(shouldShowActionsNewValue);\n setShowPreviousActions = setShowActions;\n } else {\n setShowPreviousActions = undefined;\n setShowActions(shouldShowActionsNewValue);\n }\n }, [shouldShowActions, setShowActions]);\n\n if (StringExtensions.isNullOrWhitespace(productUrl)) {\n return null;\n }\n\n const className = `${props.className}__extra-actions-cell`;\n const actionsContainerClassName = `${className}__actions-container`;\n\n return (\n <div className={className}>\n <Button className={`${className}__toggle`} onClick={toggle} />\n {shouldShowActions && (\n <div className={actionsContainerClassName}>\n <Button\n className={`${actionsContainerClassName}__view-details`}\n onClick={onClickViewDetails}\n aria-label={orderDetailsViewDetailsButtonAriaLabel}\n >\n {orderDetailsViewDetailsButtonText}\n </Button>\n <BuySelectedComponent\n {...props}\n className={`${actionsContainerClassName}__buy-again`}\n data={{ products: [currentProduct] }}\n resources={{\n ...props.resources,\n orderDetailsBuySelectedButtonText: props.resources.orderDetailsBuyItAgainButtonText,\n orderDetailsBuySelectedButtonAriaLabel: format(\n props.resources.orderDetailsBuyItAgainButtonAriaLabel,\n productName ?? ''\n )\n }}\n isReorderingEnabled={props.isReorderingEnabled}\n />\n </div>\n )}\n </div>\n );\n};\n\n/**\n * Renders rows for mobile view.\n * @param props - Configuration for the rows.\n * @returns A react node with a list of order details rows for mobile view.\n */\nexport const OrderDetailsMobileTableRowCellComponent: React.FC<IOrderDetailsTableRowProps> = (props: IOrderDetailsTableRowProps) => {\n const {\n data: { product }\n } = props;\n const salesLine = product.salesLine;\n const productName = product.simpleProduct?.Name ?? salesLine.Description;\n\n return (\n <>\n {props.isSelectionModeEnabled ? (\n <td>\n <OrderDetailsRowCheckboxComponent {...props} />\n </td>\n ) : (\n undefined\n )}\n <td>\n <OrderDetailsRowProductImageComponent {...props} />\n </td>\n <td>\n <div className={`${props.className}__product-info`}>\n <span className={`${props.className}__product-name`}>{productName}</span>\n <span className={`${props.className}__product-quantity`}>\n {format(props.resources.orderDetailsQuantityMobileText, salesLine.Quantity)}\n </span>\n </div>\n </td>\n <td>\n <OrderDetailsExtraActionsPopupComponent {...props} />\n </td>\n </>\n );\n};\n\n/**\n * Renders order details rows.\n * @param props - Configuration for the rows.\n * @returns A react node with a list of order details rows.\n */\nexport const OrderDetailsTableRowComponent: React.FC<IOrderDetailsTableRowProps> = (props: IOrderDetailsTableRowProps) => {\n const isMobileView = isMobile({ variant: VariantType.Viewport, context: props.context.request }) === 'xs';\n const className = classnames(\n props.className,\n props.data.product.isProductAvailable ? `${props.className}__available-product` : `${props.className}__unavailable-product`,\n props.className,\n props.data.product.isSelected ? `${props.className}__selected` : `${props.className}__unselected`\n );\n\n return (\n <tr className={className}>\n {isMobileView ? (\n <OrderDetailsMobileTableRowCellComponent {...props} />\n ) : (\n <OrderDetailsDesktopTableRowCellComponent {...props} />\n )}\n </tr>\n );\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { OrderDetailsProduct } from '@msdyn365-commerce/components';\nimport { IComponentProps, ICoreContext, IImageSettings } from '@msdyn365-commerce/core';\nimport { ChannelDeliveryOptionConfiguration, ProductDeliveryOptions, SalesOrder } from '@msdyn365-commerce/retail-proxy';\nimport { ArrayExtensions } from '@msdyn365-commerce-modules/retail-actions';\nimport React from 'react';\n\nimport { IOrderDetailsTableHeaderResources, OrderDetailsTableHeaderComponent } from './components/order-details-table-header-component';\nimport { IOrderDetailsTableRowResources, OrderDetailsTableRowComponent } from './components/order-details-table-row-component';\n\n/**\n * Interface with the data required for order details.\n */\nexport interface IOrderDetailsTableData {\n order: SalesOrder;\n products: OrderDetailsProduct[];\n deliveryOptions: ProductDeliveryOptions[];\n channelDeliveryOptionConfig?: ChannelDeliveryOptionConfiguration;\n}\n\n/**\n * Resources needed to render order details table.\n */\nexport interface IOrderDetailsTableResources extends IOrderDetailsTableHeaderResources, IOrderDetailsTableRowResources {}\n\n/**\n * Configuration of order details table.\n */\nexport interface IOrderDetailsTableProps extends IComponentProps<IOrderDetailsTableData> {\n context: ICoreContext;\n className: string;\n\n imageSettings?: IImageSettings;\n isCashAndCarryTransaction: boolean;\n isReorderingEnabled?: boolean;\n isRetailMultiplePickUpOptionEnabled?: boolean;\n isSelectionModeEnabled: boolean;\n\n resources: IOrderDetailsTableResources;\n isChannelMultipleCatalogsFeatureEnabled?: boolean;\n}\n\n/**\n * On select all function.\n * @param props - Invoice table props.\n * @returns On change.\n */\nconst onSelectAllHandler = (props: IOrderDetailsTableProps) => (isSelected: boolean) => {\n for (const product of props.data.products) {\n product.isSelected = isSelected;\n }\n};\n\n/**\n * Renders order details table.\n * @param props - Configuration for order details table.\n * @returns React node with the table.\n */\nexport const OrderDetailsTableComponent: React.FC<IOrderDetailsTableProps> = (props: IOrderDetailsTableProps) => {\n const rowClassName = `${props.className}__row`;\n const headerClassName = `${props.className}__header`;\n const products = props.data.products;\n const availableProducts = products.filter(product => product.isProductAvailable);\n\n return (\n <table className={props.className}>\n <OrderDetailsTableHeaderComponent\n context={props.context}\n typeName={props.typeName}\n id={headerClassName}\n className={headerClassName}\n resources={props.resources}\n data={{}}\n isCashAndCarryTransaction={props.isCashAndCarryTransaction}\n isSelectionModeEnabled={props.isSelectionModeEnabled}\n isSelectedAll={ArrayExtensions.all(availableProducts, (product: OrderDetailsProduct) => product.isSelected)}\n onSelectAll={onSelectAllHandler(props)}\n isChannelMultipleCatalogsFeatureEnabled={props.isChannelMultipleCatalogsFeatureEnabled}\n />\n {products.map((product, index) => {\n return (\n <OrderDetailsTableRowComponent\n context={props.context}\n typeName={props.typeName}\n id={`${rowClassName}-${index}`}\n key={product.salesLine.ItemId}\n className={rowClassName}\n resources={props.resources}\n imageSettings={props.imageSettings}\n isCashAndCarryTransaction={props.isCashAndCarryTransaction}\n isReorderingEnabled={props.isReorderingEnabled}\n isRetailMultiplePickUpOptionEnabled={props.isRetailMultiplePickUpOptionEnabled}\n isSelectionModeEnabled={props.isSelectionModeEnabled}\n data={{\n salesOrder: props.data.order,\n product,\n deliveryOptions: props.data.deliveryOptions,\n channelDeliveryOptionConfig: props.data.channelDeliveryOptionConfig\n }}\n isChannelMultipleCatalogsFeatureEnabled={props.isChannelMultipleCatalogsFeatureEnabled}\n />\n );\n })}\n </table>\n );\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { OrderDetailsProduct } from '@msdyn365-commerce/components';\nimport Msdyn365, { ContentEditableEvent, getUrlSync, isChannelTypeB2B, Text, isUserTypeB2B } from '@msdyn365-commerce/core';\nimport {\n ChannelDeliveryOptionConfiguration,\n FeatureState,\n LoyaltyRewardPoint,\n OrderOriginator,\n ProductCatalog,\n ProductDeliveryOptions,\n SalesLine,\n SalesOrder,\n SimpleProduct\n} from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\nimport { ArrayExtensions } from '@msdyn365-commerce-modules/retail-actions';\nimport { Button, getTelemetryObject, IModuleProps, INodeProps, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\nimport classname from 'classnames';\nimport get from 'lodash/get';\nimport { computed, observable } from 'mobx';\nimport { observer } from 'mobx-react';\nimport * as React from 'react';\n\nimport { BuySelectedComponent, IGetOrderSummaryInput, IHelp, IOrderSummary, IPaymentMethods, IPaymentMethodsInput } from '../../common';\nimport { getGroups, IGroups } from '../../common/get-groups';\nimport { getOrderInformation, getOrderInformationInput, IOrderInformation } from '../../common/get-order-information';\nimport { ISalesLine } from '../../common/get-sales-line';\nimport { getSalesLines, getSalesLinesInput } from '../../common/get-sales-lines';\nimport { Label } from '../../common/label';\nimport { getTenderIdOperationIdMap, IPriceContext } from '../../common/utilities';\nimport { getOrderDetailsHelp } from './components/get-help';\nimport { getOrderDetailsOrderSummary } from './components/get-order-summary';\nimport { getOrderDetailsPaymentMethods } from './components/get-payment-methods';\nimport { OrderDetailsTableComponent } from './components/table-view';\nimport { IOrderDetailsData } from './order-details.data';\nimport { addressOptions, IOrderDetailsProps } from './order-details.props.autogenerated';\n\n/**\n * Specifies different layouts for order details.\n */\nexport enum OrderDetailsViewMode {\n listView = 0,\n detailedView = 1\n}\n\nexport interface IOrderDetailsViewProps extends IOrderDetailsProps<IOrderDetailsData> {\n moduleProps: IModuleProps;\n tableViewActions?: React.ReactNode;\n viewModes?: React.ReactNode;\n table?: React.ReactNode;\n salesOrder?: SalesOrder;\n footerProps?: INodeProps;\n alert?: React.ReactNode;\n loading?: React.ReactNode;\n heading: React.ReactNode;\n placedBy?: React.ReactNode;\n backToShoppingLink?: React.ReactNode;\n orderInfomation?: IOrderInformation;\n salesLines?: ISalesLine[];\n groups?: IGroups;\n orderSummary?: IOrderSummary;\n payment?: IPaymentMethods;\n help?: IHelp;\n catalogs?: ProductCatalog[];\n}\n\n/**\n *\n * OrderDetails component.\n * @extends {React.PureComponent<IOrderDetailsProps<IOrderDetailsData>>}\n */\n@observer\nclass OrderDetails extends React.PureComponent<IOrderDetailsProps<IOrderDetailsData>> {\n @observable private _viewMode: OrderDetailsViewMode;\n\n @observable private _products: OrderDetailsProduct[];\n\n @observable private _isSelectionModeEnabled: boolean;\n\n private readonly moduleName: string = 'ms-order-details';\n\n private readonly multiplePickupStoreSwitchName: string = 'Dynamics.AX.Application.RetailMultiplePickupDeliveryModeFeature';\n\n private readonly telemetryContent: ITelemetryContent;\n\n @computed get isCurrentChannel(): boolean {\n if (!this.order) {\n return false;\n }\n return this.order.ChannelId === get(this.props, 'context.request.apiSettings.channelId');\n }\n\n @computed get isDataReady(): boolean {\n return get(this.props, 'data.orderHydration.status') === 'SUCCESS';\n }\n\n @computed get hasError(): boolean {\n return get(this.props, 'data.orderHydration.status') === 'FAILED';\n }\n\n @computed get order(): SalesOrder | undefined {\n return get(this.props, 'data.orderHydration.result.salesOrder');\n }\n\n @computed get products(): SimpleProduct[] {\n return get(this.props, 'data.orderHydration.result.products') || [];\n }\n\n @computed get deliveryOptions(): ProductDeliveryOptions[] {\n return get(this.props, 'data.orderHydration.result.deliveryOptions') || [];\n }\n\n @computed get priceContext(): IPriceContext {\n const {\n id,\n typeName,\n context,\n telemetry,\n resources: { freePriceText }\n } = this.props;\n return {\n id,\n typeName,\n context,\n telemetry,\n freePriceText\n };\n }\n\n @computed get earnedPoints(): number {\n const loyaltyCard = this.props.data.loyaltyCard.result;\n if (loyaltyCard && loyaltyCard.RewardPoints && this.order) {\n const pointPrograms = new Set(loyaltyCard.RewardPoints.map((point: LoyaltyRewardPoint) => point.RewardPointId));\n const rewardLines = this.order.LoyaltyRewardPointLines || [];\n let total = 0;\n rewardLines.forEach(line => {\n if ((line.RewardPointAmountQuantity || 0) > 0 && pointPrograms.has(line.RewardPointId)) {\n total += line.RewardPointAmountQuantity!;\n }\n });\n return total;\n }\n return 0;\n }\n\n @computed get orderSummaryProps(): IGetOrderSummaryInput | undefined {\n if (!this.order) {\n return;\n }\n const { request } = this.props.context;\n const { channelDeliveryOptionConfig, featureState } = this.props?.data;\n const isMultiplePickUpOptionEnabled = featureState?.result?.find(\n (item: FeatureState) => item.Name === this.multiplePickupStoreSwitchName\n )?.IsEnabled;\n const pickupDeliveryModeCode = request && request.channel && request.channel.PickupDeliveryModeCode;\n const emailDeliveryModeCode = request && request.channel && request.channel.EmailDeliveryModeCode;\n const orderDetailsLines = this.order?.SalesLines;\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- app configs are of generic type\n const isShowOrHideTaxEnabled = request.app.config.isEnableShowOrHideSalesTaxECommerceEnabled === true;\n\n const { salesId = '' } = request.query || {};\n const isCashAndCarryTransaction =\n (this.order.ChannelReferenceId === undefined || this.order.ChannelReferenceId === '') && salesId === '';\n\n const canShip =\n !isCashAndCarryTransaction &&\n orderDetailsLines?.some(orderDetailsLine =>\n orderDetailsLine.DeliveryMode && orderDetailsLine.DeliveryMode !== ''\n ? orderDetailsLine.DeliveryMode !==\n this.getDeliveryMode(\n orderDetailsLine,\n isMultiplePickUpOptionEnabled,\n channelDeliveryOptionConfig?.result,\n pickupDeliveryModeCode\n ) && orderDetailsLine.DeliveryMode !== emailDeliveryModeCode\n : orderDetailsLine\n );\n\n const {\n resources: {\n orderSummaryHeading,\n orderSummaryItemsTotalLabel,\n orderSummaryShippingFeeLabel,\n orderSummaryTaxLabel,\n orderSummaryGrandTotalLabel,\n pointsEarnedLabel\n }\n } = this.props;\n return {\n order: this.order,\n earnedPoints: this.earnedPoints,\n priceContext: this.priceContext,\n resource: {\n orderSummaryHeading,\n orderSummaryItemsTotalLabel,\n orderSummaryShippingFeeLabel,\n orderSummaryTaxLabel,\n pointsEarnedLabel,\n orderSummaryGrandTotalLabel\n },\n canShip,\n isTaxIncludedInPrice: this.order.IsTaxIncludedInPrice,\n isShowTaxBreakUp: isShowOrHideTaxEnabled\n };\n }\n\n @computed get paymentMethodsProps(): IPaymentMethodsInput | undefined {\n const tenderTypes = this.props.data.tenderTypes.result;\n if (!this.order || !this.order.TenderLines || !tenderTypes) {\n return;\n }\n\n const locale = get(this.props, 'context.request.locale') || 'en-US';\n\n const {\n resources: {\n paymentMethodsTitle,\n creditCardEndingLabel,\n giftCardEndingLabel,\n amountCoveredLabel,\n cashUsedLabel,\n loyaltyCardUsedLabel,\n customerAccountUsedLabel\n }\n } = this.props;\n\n return {\n priceContext: this.priceContext,\n tenderLines: this.order.TenderLines,\n tenderIdOperationIdMap: getTenderIdOperationIdMap(tenderTypes),\n locale,\n resource: {\n paymentMethodsTitle,\n creditCardEndingLabel,\n giftCardEndingLabel,\n amountCoveredLabel,\n cashUsedLabel,\n loyaltyCardUsedLabel,\n customerAccountUsedLabel\n },\n priceCurrency: this.order.CurrencyCode\n };\n }\n\n @computed\n private get _orderDetailsProducts(): OrderDetailsProduct[] {\n if (!ArrayExtensions.hasElements(this._products)) {\n this._initProductsModel();\n }\n\n return this._products;\n }\n\n @computed\n private get _orderDetailsAvailableProducts(): OrderDetailsProduct[] {\n if (!ArrayExtensions.hasElements(this._products)) {\n this._initProductsModel();\n }\n\n return this._products.filter(product => product.isProductAvailable);\n }\n\n @computed\n private get _selectedProducts(): OrderDetailsProduct[] {\n const products = this._orderDetailsAvailableProducts;\n const selectedProducts = products.filter(product => product.isSelected);\n if (!ArrayExtensions.hasElements(selectedProducts)) {\n return [];\n }\n\n return selectedProducts;\n }\n\n public constructor(props: IOrderDetailsProps<IOrderDetailsData>) {\n super(props);\n this._viewMode = OrderDetailsViewMode.detailedView;\n this._products = [];\n this.telemetryContent = getTelemetryObject(\n this.props.context.request.telemetryPageName!,\n this.props.friendlyName,\n this.props.telemetry\n );\n this._isSelectionModeEnabled = false;\n }\n\n public render(): JSX.Element {\n const {\n resources: { noSalesOrderDetailsText, loadingLabel },\n config: { shouldShowQrCode, showChannelInfo, showTimeslot, isReorderingEnabled }\n } = this.props;\n\n const showFullAddress =\n this.props.config.addressOptions !== undefined &&\n this.props.config.addressOptions === addressOptions.showAddressWithMultiplelines;\n const channelIdentities = this.props.data.channels.result?.channelIdentities;\n const orgUnitLocations = this.props.data.orgUnitLocations.result?.orgUnitLocations;\n const customer = this.props.data.customerInformation && this.props.data.customerInformation.result;\n const originators = this.props.data.orderOriginators && this.props.data.orderOriginators.result;\n const originator: OrderOriginator | undefined = originators && originators.length === 1 ? originators[0] : undefined;\n const channelMultipleCatalogsFeature = 'Dynamics.AX.Application.ChannelMultipleCatalogsFeature';\n const { channelDeliveryOptionConfig, featureState } = this.props.data;\n const isMultiplePickUpOptionEnabled = featureState.result?.find(\n (item: FeatureState) => item.Name === this.multiplePickupStoreSwitchName\n )?.IsEnabled;\n const isMultipleCatalogsFeatureEnabled = featureState.result?.find(\n (item: FeatureState) => item.Name === channelMultipleCatalogsFeature\n )?.IsEnabled;\n const { confirmationId = '', salesId = '', transactionId = '' } = this.props.context.actionContext.requestContext.query ?? {};\n\n const orderInformationInput =\n this.order &&\n getOrderInformationInput(\n this.props,\n this.moduleName,\n this.order,\n this.priceContext,\n channelIdentities,\n orgUnitLocations,\n customer,\n originator,\n showChannelInfo,\n false,\n shouldShowQrCode ?? true\n );\n\n const orderInformation =\n this._isSelectionModeEnabled || !orderInformationInput ? undefined : getOrderInformation(orderInformationInput);\n\n let viewProps: IOrderDetailsViewProps = this.getOrderDetailsProps();\n if (isUserTypeB2B(this.props.context.request) && orderInformationInput?.isOnlineStore && originator) {\n viewProps = {\n ...viewProps,\n placedBy: orderInformation?.placedBy\n };\n }\n\n if ((salesId || transactionId) && !this.props.context.actionContext.requestContext.user.isAuthenticated) {\n const signInUrl: string = this.props.context.actionContext.requestContext.user.signInUrl ?? '';\n if (Msdyn365.isBrowser) {\n window.location.assign(signInUrl);\n }\n\n return this.props.renderView(viewProps) as React.ReactElement;\n }\n\n if (this.hasError || !this.order) {\n if (((salesId || transactionId) && this.props.context.actionContext.requestContext.user.isAuthenticated) || confirmationId) {\n viewProps = {\n ...viewProps,\n alert: <Label className='ms-order-details__alert' label={noSalesOrderDetailsText} />\n };\n }\n\n return this.props.renderView(viewProps) as React.ReactElement;\n }\n\n if (!this.isDataReady) {\n viewProps = {\n ...viewProps,\n loading: <Label className='ms-order-details__loading' label={loadingLabel} />\n };\n return this.props.renderView(viewProps) as React.ReactElement;\n }\n\n const isCatalogFetaure = isMultipleCatalogsFeatureEnabled && isChannelTypeB2B(this.props.context.actionContext.requestContext);\n const salesLinesInput = getSalesLinesInput(\n this.props,\n this.moduleName,\n this.order,\n this.products,\n this.priceContext,\n showFullAddress,\n showTimeslot,\n this.telemetryContent,\n isMultiplePickUpOptionEnabled,\n channelDeliveryOptionConfig.result,\n this.deliveryOptions,\n this._isSelectionModeEnabled,\n this._orderDetailsProducts,\n isReorderingEnabled,\n isCatalogFetaure,\n this.props.data.catalogs?.result\n );\n const salesLines = salesLinesInput && getSalesLines(salesLinesInput);\n viewProps = {\n ...viewProps,\n salesOrder: this.order,\n orderInfomation: orderInformation,\n tableViewActions: this._renderTableViewActions(),\n viewModes: this._renderViewModes(),\n salesLines,\n table: this._renderOrderDetailsTable(),\n groups: this._renderOrderGroups(salesLines, isMultiplePickUpOptionEnabled),\n orderSummary: this._renderOrderSummary(),\n payment: this._renderOrderPayment(),\n help: this._renderOrderHelp()\n };\n\n return this.props.renderView(viewProps) as React.ReactElement;\n }\n\n public handleOrderDetailsHeadingChange = (event: ContentEditableEvent) => (this.props.config.heading!.text = event.target.value);\n\n /**\n * Updates view mode to be list view.\n */\n private readonly _setListViewMode = () => {\n this._viewMode = OrderDetailsViewMode.listView;\n };\n\n /**\n * Updates view mode to be detailed view.\n */\n private readonly _setDetailedViewMode = () => {\n this._viewMode = OrderDetailsViewMode.detailedView;\n };\n\n /**\n * Renders order groups for order details.\n * @param salesLines - Sale lines.\n * @param isRetailMultiplePickUpOptionEnabled - Flag which specifies pick up options.\n * @returns A react node or undefined.\n */\n private readonly _renderOrderGroups = (\n salesLines: ISalesLine[] | undefined,\n isRetailMultiplePickUpOptionEnabled: boolean | undefined\n ) => {\n if (!salesLines || this._viewMode !== OrderDetailsViewMode.detailedView) {\n return undefined;\n }\n\n const { salesId = '' } = this.props.context.request.query ?? {};\n const shouldShowAddress =\n (this.props.config.addressOptions !== undefined &&\n this.props.config.addressOptions === addressOptions.showAddressWithSingleLine) ||\n this.props.config.addressOptions === addressOptions.showAddressWithMultiplelines;\n const isCashAndCarryTransaction =\n (this.order!.ChannelReferenceId === undefined || this.order!.ChannelReferenceId === '') && salesId === '';\n return getGroups({\n moduleName: this.moduleName,\n salesLines,\n resources: {\n orderItemLabel: this.props.resources.orderItemLabel,\n orderItemsLabel: this.props.resources.orderItemsLabel\n },\n showAddress: shouldShowAddress,\n showTimeslot: this.props.config.showTimeslot,\n retailMultiplePickUpOptionEnabled: isRetailMultiplePickUpOptionEnabled,\n isCashAndCarryTransaction,\n isSelectionModeEnabled: this._isSelectionModeEnabled\n });\n };\n\n /**\n * Renders order summary for order details.\n * @returns A react node or undefined.\n */\n private readonly _renderOrderSummary = () => {\n if (this.orderSummaryProps && this._viewMode === OrderDetailsViewMode.detailedView) {\n return getOrderDetailsOrderSummary(this.orderSummaryProps);\n }\n return undefined;\n };\n\n /**\n * Renders order payment info for order details.\n * @returns A react node or undefined.\n */\n private readonly _renderOrderPayment = () => {\n if (this.paymentMethodsProps && this._viewMode === OrderDetailsViewMode.detailedView) {\n return getOrderDetailsPaymentMethods(this.paymentMethodsProps);\n }\n return undefined;\n };\n\n /**\n * Renders order help info for order details.\n * @returns A react node or undefined.\n */\n private readonly _renderOrderHelp = () => {\n const {\n resources: { needHelpLabel, helpLineNumberLabel, helpLineContactAriaLabel },\n config: { contactNumber }\n } = this.props;\n\n if (contactNumber && this._viewMode === OrderDetailsViewMode.detailedView) {\n return getOrderDetailsHelp({\n needHelpLabel,\n helpLineNumberLabel,\n contactNumber,\n helpLineContactAriaLabel,\n telemetryContent: this.telemetryContent\n });\n }\n\n return undefined;\n };\n\n /**\n * Renders order details table view.\n * @returns A react node or undefined.\n */\n private readonly _renderOrderDetailsTable = () => {\n if (this._viewMode !== OrderDetailsViewMode.listView) {\n return undefined;\n }\n\n const { featureState } = this.props.data;\n const channelMultipleCatalogsFeature = 'Dynamics.AX.Application.ChannelMultipleCatalogsFeature';\n const isMultiplePickUpOptionEnabled = featureState.result?.find(\n (item: FeatureState) => item.Name === this.multiplePickupStoreSwitchName\n )?.IsEnabled;\n const isMultipleCatalogsFeatureEnabled = featureState.result?.find(\n (item: FeatureState) => item.Name === channelMultipleCatalogsFeature\n )?.IsEnabled;\n const { salesId = '' } = this.props.context.request.query ?? {};\n const isCashAndCarryTransaction =\n (this.order!.ChannelReferenceId === undefined || this.order!.ChannelReferenceId === '') && salesId === '';\n\n return (\n this.order && (\n <OrderDetailsTableComponent\n id={this.props.id}\n typeName={this.props.typeName}\n context={this.props.context}\n className='ms-order-details__table-list'\n imageSettings={this.props.config.imageSettings}\n isReorderingEnabled={this.props.config.isReorderingEnabled}\n isRetailMultiplePickUpOptionEnabled={isMultiplePickUpOptionEnabled}\n isSelectionModeEnabled={this._isSelectionModeEnabled}\n isCashAndCarryTransaction={isCashAndCarryTransaction}\n data={{\n order: this.order,\n products: this._orderDetailsProducts,\n deliveryOptions: this.deliveryOptions,\n channelDeliveryOptionConfig: this.props.data.channelDeliveryOptionConfig.result\n }}\n resources={this.props.resources}\n isChannelMultipleCatalogsFeatureEnabled={\n isMultipleCatalogsFeatureEnabled && isChannelTypeB2B(this.props.context.actionContext.requestContext)\n }\n />\n )\n );\n };\n\n /**\n * Switches to selection mode.\n */\n private readonly _enableSelection = () => {\n for (const product of this._orderDetailsAvailableProducts) {\n product.isSelected = true;\n }\n this._isSelectionModeEnabled = true;\n };\n\n /**\n * Disables selection mode.\n */\n private readonly _disableSelection = () => {\n this._isSelectionModeEnabled = false;\n };\n\n private _renderEnableSelectionButton(className: string): JSX.Element | undefined {\n if (this._isSelectionModeEnabled || !ArrayExtensions.hasElements(this._orderDetailsAvailableProducts)) {\n return undefined;\n }\n\n return (\n <Button\n className={`${className}__enable-selection`}\n onClick={this._enableSelection}\n aria-label={this.props.resources.orderDetailsEnableSelectionButtonAriaLabel}\n title={this.props.resources.orderDetailsEnableSelectionButtonText}\n >\n {this.props.resources.orderDetailsEnableSelectionButtonText}\n </Button>\n );\n }\n\n private _renderDisableSelectionButton(className: string): JSX.Element | undefined {\n if (!this._isSelectionModeEnabled) {\n return undefined;\n }\n\n return (\n <Button\n className={`${className}__disable-selection`}\n onClick={this._disableSelection}\n aria-label={this.props.resources.orderDetailsDisableSelectionButtonAriaLabel}\n title={this.props.resources.orderDetailsDisableSelectionButtonText}\n >\n {this.props.resources.orderDetailsDisableSelectionButtonText}\n </Button>\n );\n }\n\n private _renderBuySelected(className: string): JSX.Element | undefined {\n if (!this._isSelectionModeEnabled) {\n return undefined;\n }\n\n return (\n <BuySelectedComponent\n className={`${className}__buy-selected msc-btn`}\n id={this.props.id}\n typeName={this.props.typeName}\n data={{ products: this._selectedProducts }}\n context={this.props.context}\n resources={this.props.resources}\n isReorderingEnabled={this.props.config.isReorderingEnabled}\n />\n );\n }\n\n /**\n * Renders actions for table view.\n * @returns A react node.\n */\n private readonly _renderTableViewActions = () => {\n if (!this.props.config.isReorderingEnabled) {\n return undefined;\n }\n\n const containerClassName = 'ms-order-details__table-view-actions';\n return (\n <div className={containerClassName}>\n {this._renderBuySelected(containerClassName)}\n {this._renderEnableSelectionButton(containerClassName)}\n {this._renderDisableSelectionButton(containerClassName)}\n </div>\n );\n };\n\n private _initProductsModel(): void {\n const orderDetailProducts = this.props.data.orderHydration.result?.salesOrder.SalesLines?.map(salesLine => {\n const salesOrderProduct = this.props.data.orderHydration.result?.products.find(\n product => product.RecordId === salesLine.ProductId\n );\n return new OrderDetailsProduct(salesLine, salesOrderProduct);\n });\n\n this._products = ArrayExtensions.validValues(orderDetailProducts);\n }\n\n /**\n * Renders view mode switches for order details.\n * @returns A react node.\n */\n private readonly _renderViewModes = () => {\n if (!this.props.config.isGridViewEnabled) {\n return null;\n }\n\n const viewModesClassName = 'ms-order-details__ms-order-details-view-modes';\n return (\n <div className={viewModesClassName}>\n <Button\n className={classname(\n `${viewModesClassName}__detailed-view`,\n this._viewMode === OrderDetailsViewMode.detailedView ? 'msc-view-modes__selected' : ''\n )}\n role='button'\n title={this.props.resources.orderDetailsDetailedViewModeAriaLabel}\n aria-label={this.props.resources.orderDetailsDetailedViewModeAriaLabel}\n onClick={this._setDetailedViewMode}\n />\n <Button\n className={classname(\n `${viewModesClassName}__list-view`,\n this._viewMode === OrderDetailsViewMode.listView ? 'msc-view-modes__selected' : ''\n )}\n role='button'\n title={this.props.resources.orderDetailsListViewModeAriaLabel}\n aria-label={this.props.resources.orderDetailsListViewModeAriaLabel}\n onClick={this._setListViewMode}\n />\n </div>\n );\n };\n\n /**\n * Get the order details view properties.\n * @returns The initial values of order details view properties.\n */\n private readonly getOrderDetailsProps = (): IOrderDetailsViewProps => {\n const {\n resources: { backToShopping, orderDetailsBuyItemsAgainHeaderText },\n config: { heading }\n } = this.props;\n const moduleProps = { moduleProps: this.props, className: classname('ms-order-details', this.props.config.className) };\n const backToShoppingUrl = getUrlSync('home', this.props.context.actionContext) ?? '';\n\n return {\n ...this.props,\n moduleProps,\n heading: heading && (\n <Text\n {...heading}\n className='ms-order-details__heading'\n text={this._isSelectionModeEnabled ? orderDetailsBuyItemsAgainHeaderText : heading.text}\n tag={heading.tag ?? 'h2'}\n editProps={{ onEdit: this.handleOrderDetailsHeadingChange, requestContext: this.props.context.request }}\n />\n ),\n backToShoppingLink: backToShoppingUrl && (\n <Button className='ms-order-details__btn-keep-shopping' href={backToShoppingUrl}>\n {backToShopping}\n </Button>\n ),\n footerProps: { className: 'ms-order-details__footer' }\n };\n };\n\n private readonly getDeliveryMode = (\n salesLine: SalesLine,\n featureSate: boolean = false,\n channelDeliveryOptionConfig?: ChannelDeliveryOptionConfiguration,\n pickupDeliveryMode?: string\n ) => {\n if (!featureSate) {\n return pickupDeliveryMode;\n }\n return channelDeliveryOptionConfig?.PickupDeliveryModeCodes?.find(deliveryMode => deliveryMode === salesLine.DeliveryMode);\n };\n}\n\nexport default OrderDetails;\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 { observable } from 'mobx';\n\n/**\n * Represents state of the expand button.\n */\nexport class ExpandButtonState {\n @observable public extraProductsCount: number;\n\n public constructor(extraProductsCount: number) {\n this.extraProductsCount = extraProductsCount;\n }\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { observable } from 'mobx';\n\n/**\n * Represents state of the sales line product.\n */\nexport class SalesLineState {\n @observable public isHidden?: boolean;\n\n public stateId: string;\n\n public constructor(stateId: string, isHidden?: boolean) {\n this.stateId = stateId;\n this.isHidden = isHidden;\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 { ProductRefinerSource, ProductRefinerValue, RefinerType } 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';\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\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 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","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(\r\n 'Cannot render refine value range without productRefinerValue and parentProductRefinerHierarchy'\r\n );\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 ${\r\n validationErrorMin ? 'refine-submenu__input-range--error' : ''\r\n }`;\r\n const maxInputClassName = `ms-refine-submenu__input-range refine-submenu__input-range-max ${\r\n validationErrorMax ? 'refine-submenu__input-range--error' : ''\r\n }`;\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'>\r\n {validationErrorMin}\r\n </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'>\r\n {validationErrorMax}\r\n </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 =\r\n (selectedRefinementCriterion && selectedRefinementCriterion.LeftValueBoundString) ||\r\n productRefinerValue.LeftValueBoundString ||\r\n '0';\r\n const selectedMax =\r\n (selectedRefinementCriterion && selectedRefinementCriterion.RightValueBoundString) ||\r\n productRefinerValue.RightValueBoundString ||\r\n 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 {\r\n onToggle,\r\n parentProductRefinerHierarchy,\r\n productRefinerValue,\r\n refineItemCommonProps,\r\n selectedRefinementCriterion\r\n } = 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 {\r\n onToggle,\r\n parentProductRefinerHierarchy,\r\n productRefinerValue,\r\n refineItemCommonProps,\r\n selectedRefinementCriterion\r\n } = 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(\r\n selected: string | undefined,\r\n touched: boolean,\r\n validationError: string | undefined\r\n ): 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 (this.props.productRefinerValue.RefinerRecordId === 0) {\r\n const result = formatPrice(amount, this.currencyCode, locale, this.props.refineItemCommonProps.telemetry);\r\n return result;\r\n }\r\n if (amount !== undefined && !this._formattedPriceReverseLookup.has(result)) {\r\n this._formattedPriceReverseLookup.set(result, amount);\r\n return amount;\r\n }\r\n return amount || '';\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 // eslint-disable-next-line @typescript-eslint/no-explicit-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 // eslint-disable-next-line @typescript-eslint/no-explicit-any\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 // eslint-disable-next-line @typescript-eslint/no-explicit-any\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 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}\r\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { OrderDetailsProduct } from '@msdyn365-commerce/components';\nimport { IActionContext, IGridSettings, IImageSettings } from '@msdyn365-commerce/core';\nimport {\n ChannelDeliveryOptionConfiguration,\n OrderShipments,\n ProductCatalog,\n ProductDeliveryOptions,\n SalesLine,\n SalesOrder,\n Shipment,\n SimpleProduct\n} from '@msdyn365-commerce/retail-proxy';\nimport { ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\n\nimport { getSalesLine, ISalesLine, ISalesLineResources } from './get-sales-line';\nimport { SalesLineState } from './sales-line-state';\nimport { IModuleComponentProps, IPriceContext } from './utilities';\n\nexport interface IGetSalesLinesInput {\n moduleName: string;\n moduleComponentProps: IModuleComponentProps;\n isCurrentChannel: boolean;\n\n salesLines: SalesLine[];\n products: SimpleProduct[];\n shipments?: Shipment[];\n priceContext: IPriceContext;\n resources: ISalesLineResources;\n actionContext: IActionContext;\n gridSettings: IGridSettings;\n imageSettings?: IImageSettings;\n imageOnly?: boolean;\n salesLineStates?: SalesLineState[];\n showCompleteAddress?: boolean;\n showTimeslot: boolean;\n telemetryContent?: ITelemetryContent;\n retailMultiplePickUpOptionEnabled?: boolean;\n channelDeliveryOptionConfig?: ChannelDeliveryOptionConfiguration;\n productDeliveryOptions?: ProductDeliveryOptions[];\n isSelectionModeEnabled?: boolean;\n orderDetailsProducts?: OrderDetailsProduct[];\n isReorderingEnabled?: boolean;\n isChannelMultipleCatalogsFeatureEnabled?: boolean;\n catalogs?: ProductCatalog[];\n priceCurrency?: string;\n}\n\nexport const getSalesLines = ({\n moduleName,\n moduleComponentProps,\n salesLines,\n products,\n shipments,\n resources,\n isCurrentChannel,\n imageOnly,\n showCompleteAddress,\n showTimeslot,\n telemetryContent,\n retailMultiplePickUpOptionEnabled,\n channelDeliveryOptionConfig,\n productDeliveryOptions,\n isSelectionModeEnabled,\n orderDetailsProducts,\n isReorderingEnabled,\n salesLineStates: productStates,\n isChannelMultipleCatalogsFeatureEnabled,\n catalogs,\n priceCurrency\n}: IGetSalesLinesInput): ISalesLine[] => {\n return salesLines.map((salesLine, index) => {\n const product = products.find(simpleProduct => simpleProduct.RecordId === salesLine.ProductId);\n const shipment =\n product &&\n shipments?.find(currentShipment =>\n currentShipment.ShipmentLines?.find(\n shipmentLine =>\n shipmentLine.ItemId === product.ItemId && shipmentLine.InventoryTransactionId === salesLine.InventoryTransactionId\n )\n );\n const orderDetailsProduct = isSelectionModeEnabled\n ? product && orderDetailsProducts?.find(currentProduct => currentProduct.salesLine.ProductId === product.RecordId)\n : undefined;\n const productState = productStates?.find(value => value.stateId === `${salesLine.LineId ?? ''}-${index}`);\n\n return getSalesLine({\n moduleName,\n moduleComponentProps,\n product,\n shipment,\n salesLine,\n isCurrentChannel,\n resources,\n imageOnly,\n showCompleteAddress,\n showTimeslot,\n telemetryContent,\n retailMultiplePickUpOptionEnabled,\n channelDeliveryOptionConfig,\n productDeliveryOptions,\n isSelectionModeEnabled,\n orderDetailsProduct,\n isReorderingEnabled,\n salesLineState: productState,\n isChannelMultipleCatalogsFeatureEnabled,\n catalogs,\n priceCurrency\n });\n });\n};\n\ninterface IProps extends IModuleComponentProps {\n resources: ISalesLineResources;\n}\n\nexport const getSalesLinesInput = (\n props: IProps,\n moduleName: string,\n order: SalesOrder | OrderShipments,\n products: SimpleProduct[],\n priceContext: IPriceContext,\n showCompleteAddress?: boolean,\n showTimeslot?: boolean,\n telemetryContent?: ITelemetryContent,\n retailMultiplePickUpOptionEnabled?: boolean,\n channelDeliveryOptionConfig?: ChannelDeliveryOptionConfiguration,\n productDeliveryOptions?: ProductDeliveryOptions[] | undefined,\n isSelectionModeEnabled?: boolean | undefined,\n orderDetailsProducts?: OrderDetailsProduct[] | undefined,\n isReorderingEnabled?: boolean,\n isChannelMultipleCatalogsFeatureEnabled?: boolean,\n catalogs?: ProductCatalog[]\n): IGetSalesLinesInput | undefined => {\n if (!order || !order.SalesLines || order.SalesLines.length === 0) {\n return;\n }\n\n const {\n resources,\n config: { imageSettings },\n context: {\n actionContext,\n request: {\n gridSettings,\n apiSettings: { channelId }\n }\n }\n } = props;\n\n const isCurrentChannel = !order.ChannelId || order.ChannelId === channelId;\n\n return {\n moduleName,\n moduleComponentProps: props,\n isCurrentChannel,\n salesLines: order.SalesLines,\n priceCurrency: order.CurrencyCode,\n products,\n shipments: order.Shipments,\n priceContext,\n resources,\n actionContext,\n gridSettings: gridSettings!,\n imageSettings,\n showCompleteAddress,\n showTimeslot: showTimeslot ?? false,\n telemetryContent,\n retailMultiplePickUpOptionEnabled,\n channelDeliveryOptionConfig,\n productDeliveryOptions,\n isSelectionModeEnabled: isSelectionModeEnabled ?? false,\n orderDetailsProducts,\n isReorderingEnabled,\n isChannelMultipleCatalogsFeatureEnabled,\n catalogs\n };\n};\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","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nexport * from './choice-summary';\nexport * from './choice-summary.props';\nexport * from './error-message';\nexport * from './feature-search-result-item';\nexport * from './link';\nexport * from './modal';\nexport * from './product-search-result-items';\nexport * from './range-refine-item';\nexport * from './refine-item';\nexport * from './refine-item.props.common';\nexport * from './refine-item-toggle-notification';\nexport * from './refine-submenu';\nexport * from './separator';\nexport * from './title';\nexport * from './utilities';\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","import { ITelemetry } from '@msdyn365-commerce/core';\r\nimport { ProductRefinerValue } from '@msdyn365-commerce/retail-proxy';\r\nimport { IRefineItemToggleNotification } from '@msdyn365-commerce-modules/search-result-container/dist/types';\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((refinementCriterion: ProductRefinerValue) =>\r\n 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(productRefinerValue: ProductRefinerValue, refinementCriterion: ProductRefinerValue): 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[]\r\n): 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:\r\n (itemToggleNotification.rangeStart !== undefined && `${itemToggleNotification.rangeStart}`) ||\r\n selectedCriterion.LeftValueBoundString,\r\n RightValueBoundString:\r\n (itemToggleNotification.rangeEnd !== undefined && `${itemToggleNotification.rangeEnd}`) ||\r\n selectedCriterion.RightValueBoundString\r\n };\r\n updatedRefinementCriteria.push(next);\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:\r\n (itemToggleNotification.rangeStart !== undefined && `${itemToggleNotification.rangeStart}`) ||\r\n itemToggleNotification.productRefinerValue.LeftValueBoundString,\r\n RightValueBoundString:\r\n (itemToggleNotification.rangeEnd !== undefined && `${itemToggleNotification.rangeEnd}`) ||\r\n 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 (\r\n (itemToggleNotification.productRefinerValue.DataTypeValue === ProductRefinerValueDataTypeValue.List ||\r\n itemToggleNotification.productRefinerValue.DataTypeValue === ProductRefinerValueDataTypeValue.Boolean) &&\r\n itemToggleNotification.parentProductRefinerHierarchy.RefinerTypeValue === ProductRefinerTypeValue.Single\r\n ) {\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) =>\r\n isMatchingRefinementCriterion(child, criterion)\r\n );\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\r\n): 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 result = `${priceAmount}`;\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}\r\n","import { 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 '@msdyn365-commerce-modules/search-result-container/dist/types';\r\nimport { isMatchingRefinementCriterion, ProductRefinerValueDataTypeValue } 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\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 }\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 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 // 11290923670 is RefinerRecordId for Size\r\n const dimensionLabel = this.props.selectedChoices[index].RefinerRecordId === 11290923670 ? 'Size: ' : null;\r\n const listItemProps = {\r\n 'aria-posinset': index,\r\n 'aria-setsize': items.length\r\n };\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 >\r\n {dimensionLabel}\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 && (\r\n <a href={this.props.urlBuilder({}, true)} className={'msc-choice-summary__clear-all'} onClick={this._onClick}>\r\n {clearAllText}\r\n </a>\r\n )}\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 switch (productRefinerValue.DataTypeValue) {\r\n case ProductRefinerValueDataTypeValue.Range:\r\n case ProductRefinerValueDataTypeValue.RangeInput:\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 break;\r\n default:\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","/*!\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 { IHelp, IOrderSummary, IPaymentMethods } from '../../common';\nimport { IGroup, IGroupDelivery, IGroups } from '../../common/get-groups';\nimport { IOrderInformation } from '../../common/get-order-information';\nimport { ISalesLine } from '../../common/get-sales-line';\nimport { IOrderDetailsViewProps } from './order-details';\n\nexport const OrderDetailsOrderInfomation: React.FC<IOrderInformation> = ({\n orderInformationProps,\n salesId,\n receiptId,\n createdDate,\n count,\n amount,\n channelReferenceId,\n channelName,\n channelAddress\n}) => (\n <Node {...orderInformationProps}>\n {channelName}\n {channelAddress}\n {channelReferenceId}\n {salesId}\n {receiptId}\n {createdDate}\n {count}\n {amount}\n </Node>\n);\n\nexport const OrderDetailsSalesLine: React.FC<ISalesLine> = ({ salesLineProps, salesLine, buyAgainButton, errors }) => (\n <Node {...salesLineProps}>\n {salesLine}\n {buyAgainButton}\n {errors}\n </Node>\n);\n\nexport const OrderDetailsGroupDelivery: React.FC<IGroupDelivery> = ({ deliveryProps, heading, count }) => (\n <Node {...deliveryProps}>\n {heading}\n {count}\n </Node>\n);\n\nexport const OrderDetailsGroup: React.FC<IGroup> = ({\n groupProps,\n delivery,\n address,\n salesLinesProps,\n salesLines,\n isCashAndCarryTransaction\n}) => (\n <Node {...groupProps}>\n {delivery && <OrderDetailsGroupDelivery {...delivery} />}\n {salesLines && (\n <Node {...salesLinesProps}>\n {salesLines.map(salesLine => (\n <React.Fragment key={salesLine.data.salesLine.LineId}>\n {salesLine.data.deliveryType === 'ship' && salesLine.data.shipment ? salesLine.trackingInfo : null}\n <OrderDetailsSalesLine {...salesLine} />\n {!isCashAndCarryTransaction && salesLine.salesStatus}\n </React.Fragment>\n ))}\n </Node>\n )}\n {!delivery.showTimeslot && address}\n {delivery.showTimeslot && (\n <Node {...delivery.pickupProps}>\n {address}\n {delivery.pickupDateTimeslot}\n </Node>\n )}\n </Node>\n);\n\nexport const OrderDetailsGroups: React.FC<IGroups> = ({ groupsProps, groups }) => (\n <Node {...groupsProps}>\n {groups.map((group: IGroup, index: number) => (\n <OrderDetailsGroup key={index} {...group} />\n ))}\n </Node>\n);\n\nexport const OrderDetailsOrderSummary: React.FC<IOrderSummary> = ({\n orderSummaryProps,\n heading,\n subtotal,\n shipping,\n tax,\n totalAmount,\n earnedPoints\n}) => (\n <Node {...orderSummaryProps}>\n {heading}\n {subtotal}\n {shipping}\n {tax}\n {totalAmount}\n {earnedPoints}\n </Node>\n);\n\nexport const OrderDetailsPayment: React.FC<IPaymentMethods> = ({ paymentMethodsProps, title, methods }) => (\n <Node {...paymentMethodsProps}>\n {title}\n {methods}\n </Node>\n);\n\nexport const OrderDetailsHelp: React.FC<IHelp> = ({ helpProps, needHelpLabel, helpLineNumberLabel, contactNumber }) => (\n <Node {...helpProps}>\n {needHelpLabel}\n {helpLineNumberLabel}\n {contactNumber}\n </Node>\n);\n\nconst OrderDetailsView: React.FC<IOrderDetailsViewProps> = ({\n moduleProps,\n tableViewActions,\n viewModes,\n table,\n placedBy,\n heading,\n alert,\n loading,\n orderInfomation,\n orderSummary,\n payment,\n help,\n groups\n}) => {\n return (\n <Module {...moduleProps}>\n {placedBy}\n {heading}\n {alert}\n {loading}\n {orderInfomation && <OrderDetailsOrderInfomation {...orderInfomation} />}\n {tableViewActions}\n {viewModes}\n {table}\n {groups && <OrderDetailsGroups {...groups} />}\n {orderSummary && <OrderDetailsOrderSummary {...orderSummary} />}\n {payment && <OrderDetailsPayment {...payment} />}\n {help && <OrderDetailsHelp {...help} />}\n </Module>\n );\n};\n\nexport default OrderDetailsView;\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 { 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 { isMatchingRefinementCriterion, isRangeType } from './utilities';\n\ninterface IRefinerMap {\n key: string;\n value: ProductRefinerValue;\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 return {\n key: this._getKeyForRefinerValue(selectedRefiner, index.toString()),\n value: selectedRefiner\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\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 {item.value.LeftValueBoundString && item.value.LeftValueBoundLocalizedString === ''\n ? item.value.LeftValueBoundString\n : (item.value.LeftValueBoundLocalizedString ||\n item.value.LeftValueBoundLocalizedString === undefined) &&\n item.value.RefinerRecordId === 0\n ? item.key\n : item.value.LeftValueBoundString}\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 if (refinerHierarchy && refinerHierarchy.find) {\n const 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 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 { CartLineItemComponent, OrderDetailsProduct } from '@msdyn365-commerce/components';\nimport MsDyn365, { IGridSettings, IImageSettings, Image, IRequestContext, isChannelTypeB2B } from '@msdyn365-commerce/core';\nimport {\n ChannelDeliveryOptionConfiguration,\n format,\n ProductCatalog,\n ProductDeliveryOptions,\n SalesLine,\n Shipment,\n SimpleProduct\n} from '@msdyn365-commerce/retail-proxy';\nimport { ArrayExtensions, getFallbackImageUrl, getProductPageUrlSync, ObjectExtensions } from '@msdyn365-commerce-modules/retail-actions';\nimport { INodeProps, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport { Observer } from 'mobx-react';\nimport * as React from 'react';\n\nimport Address from './address';\nimport { BuySelectedComponent } from './buy-selected-component';\nimport LabelComponent from './label';\nimport { SalesLineState } from './sales-line-state';\nimport {\n defaultImageSettings,\n getDateTimeslot,\n getSalesStatusCode,\n IDeliveryType,\n IModuleComponentProps,\n ISalesStatusCode\n} from './utilities';\n\nexport type ISalesStatusStringMap = {\n [x in ISalesStatusCode]: string | undefined;\n};\n\nexport type IDeliveryTypeStringMap = {\n [x in IDeliveryType]: string | undefined;\n};\n\nexport interface ISalesLineResources {\n productDimensionTypeSize: string;\n productDimensionTypeColor: string;\n productDimensionTypeStyle: string;\n productDimensionTypeAmount?: string;\n salesLineQuantityText: string;\n configString: string;\n shipToLabel: string;\n storeLabel: string;\n phoneLabel: string;\n phoneAriaLabel: string;\n buyItAgainAriaLabel: string;\n buyItAgainLabel: string;\n orderStatusReadyForPickup: string;\n orderStatusPickedUp: string;\n orderStatusShipped: string;\n orderStatusCanceled: string;\n orderStatusProcessing: string;\n pickedUpSalesLines: string;\n deliveredSalesLines: string;\n carryOutSalesLines: string;\n trackingLabel: string;\n trackingAriaLabel: string;\n trackingComingSoonLabel: string;\n discountStringText: string;\n orderStatusEmailed: string;\n emailSalesLines: string;\n pickupDateTimeslotText: string;\n pickupTimeslotPlaceHolder: string;\n shippingCharges?: string;\n orderDetailsUnavailableProductText?: string;\n orderDetailsBuySelectedButtonText?: string;\n orderDetailsBuySelectedButtonAriaLabel?: string;\n orderDetailsBuySelectedAddingToCartErrorNotificationTitle?: string;\n orderDetailsBuySelectedAddingToCartErrorNotificationCloseAriaLabel?: string;\n orderDetailsGoToCartText?: string;\n orderDetailsDialogCloseText?: string;\n orderDetailsSelectRadioAriaLabelText?: string;\n orderDetailsSingleItemText?: string;\n orderDetailsMultiLineItemFormatText?: string;\n orderDetailsMultiLinesFormatText?: string;\n orderDetailsHeaderMessageText?: string;\n orderDetailsMultiItemsValidationErrorMessage?: string;\n orderDetailsOneErrorText?: string;\n orderDetailsMultiErrorText?: string;\n addedQuantityText?: string;\n originalPriceText?: string;\n currentPriceText?: string;\n freePriceText?: string;\n}\n\nexport interface IGetSalesLineInput {\n moduleName: string;\n moduleComponentProps: IModuleComponentProps;\n product?: SimpleProduct;\n shipment?: Shipment;\n salesLine: SalesLine;\n isCurrentChannel: boolean;\n resources: ISalesLineResources;\n imageOnly?: boolean;\n salesLineState?: SalesLineState;\n showCompleteAddress?: boolean;\n showTimeslot: boolean;\n telemetryContent?: ITelemetryContent;\n retailMultiplePickUpOptionEnabled?: boolean;\n channelDeliveryOptionConfig?: ChannelDeliveryOptionConfiguration;\n productDeliveryOptions?: ProductDeliveryOptions[];\n isSelectionModeEnabled?: boolean;\n orderDetailsProduct?: OrderDetailsProduct;\n isReorderingEnabled?: boolean;\n isChannelMultipleCatalogsFeatureEnabled?: boolean;\n catalogs?: ProductCatalog[];\n priceCurrency?: string;\n}\n\nexport interface ISalesLine {\n salesLineProps: INodeProps;\n salesLine: React.ReactNode;\n address?: React.ReactNode;\n buyAgainButton?: React.ReactNode;\n salesStatus: React.ReactNode;\n deliveryType: React.ReactNode;\n trackingInfo: React.ReactNode;\n pickupDateTimeslot: React.ReactNode;\n errors?: React.ReactNode;\n\n // Row data\n data: {\n salesLine: SalesLine;\n product?: SimpleProduct;\n shipment?: Shipment;\n deliveryType: string;\n productUrl: string | undefined;\n salesStatus: ISalesStatusCode;\n isChecked?: boolean;\n };\n}\n\nenum deliveryTypeEnum {\n ship = 'ship',\n email = 'email',\n carryOut = 'carryOut',\n pickUp = 'pickUp'\n}\n\n/**\n * The on select line call back.\n * @param orderDetailsProduct -- The current order details product.\n * @returns The call back method.\n */\nconst onSelectLine = (orderDetailsProduct: OrderDetailsProduct) => () => {\n orderDetailsProduct.isSelected = !orderDetailsProduct.isSelected;\n};\n\n/**\n * Get the checkbox element.\n * @param orderDetailsProduct -- The order details product.\n * @param orderDetailsSelectRadioAriaLabelText -- The aria label text.\n * @param moduleName -- The module name.\n * @returns The checkbox element.\n */\nconst getOrderDetailsSalesLineCheckbox = (\n orderDetailsProduct: OrderDetailsProduct,\n orderDetailsSelectRadioAriaLabelText: string | undefined,\n moduleName: string\n): JSX.Element | null => {\n const checkboxRowAriaLabel = format(orderDetailsSelectRadioAriaLabelText ?? '{0}', orderDetailsProduct.salesLine.ProductId);\n\n return (\n <div className={`${moduleName}__sales-line-checkbox`}>\n <label className={classnames(`${moduleName}__checkbox-container`, 'checkbox-container')}>\n <input\n className={classnames(`${moduleName}__checkbox-input`, 'checkbox-input')}\n type='checkbox'\n checked={orderDetailsProduct.isSelected}\n aria-label={checkboxRowAriaLabel}\n aria-checked={orderDetailsProduct.isSelected}\n onChange={onSelectLine(orderDetailsProduct)}\n />\n <span className={classnames(`${moduleName}__checkmark`, 'checkmark')} />\n </label>\n </div>\n );\n};\n\n/**\n * Get tracking information.\n * @param deliveryType -- The delivery type.\n * @param moduleName -- Module name.\n * @param trackingLabel -- Tracking label.\n * @param trackingAriaLabel -- Tracking aria label.\n * @param trackingComingSoonLabel -- Tracking coming soon label.\n * @param shipment -- Shipment.\n * @returns The tracking information.\n */\nexport const getTrackingInfo = (\n deliveryType: string,\n moduleName: string,\n trackingLabel: string,\n trackingAriaLabel: string,\n trackingComingSoonLabel: string,\n shipment: Shipment | undefined\n): false | JSX.Element => {\n return (\n deliveryType === deliveryTypeEnum.ship && (\n <span className={`${moduleName}__tracking-info`}>\n {trackingLabel}\n {shipment ? (\n <a className={`${moduleName}__tracking-link`} href={shipment.TrackingUrl} aria-label={trackingAriaLabel}>\n {shipment.TrackingNumber}\n </a>\n ) : (\n <>{trackingComingSoonLabel}</>\n )}\n </span>\n )\n );\n};\n\n/**\n * Get pick update date time lot information.\n * @param shouldShowTimeslot -- Should show time slot.\n * @param isDeliveryPickupSame -- Is delivery and pickup the same.\n * @param salesLine -- The sales line.\n * @param pickupTimeslotPlaceHolder -- The pickup time slot place holder.\n * @param moduleName -- The module name.\n * @param locale -- The locale.\n * @param pickupDateTimeslotText -- The pickup date time slot text.\n * @returns The pickup date time slot information.\n */\nexport const getPickupDateTimeslotInfo = (\n shouldShowTimeslot: boolean,\n isDeliveryPickupSame: boolean,\n salesLine: SalesLine,\n pickupTimeslotPlaceHolder: string,\n moduleName: string,\n locale: string,\n pickupDateTimeslotText: string\n): false | JSX.Element => {\n const canShowTimeslot: boolean =\n shouldShowTimeslot &&\n isDeliveryPickupSame &&\n salesLine.PickupTimeslotStartDateTime !== undefined &&\n salesLine.PickupTimeslotEndDateTime !== undefined;\n\n const pickupDateTimeslot = canShowTimeslot\n ? getDateTimeslot(pickupTimeslotPlaceHolder, salesLine.PickupTimeslotStartDateTime, salesLine.PickupTimeslotEndDateTime, locale)\n : '';\n\n return (\n canShowTimeslot && (\n <div className={`${moduleName}__pickup-date-timeslot`}>\n <div className={`${moduleName}__pickup-date-timeslot-title`}>{pickupDateTimeslotText}</div>\n <div className={`${moduleName}__pickup-date-timeslot-content`}>{pickupDateTimeslot}</div>\n </div>\n )\n );\n};\n\n/**\n * Get sales status.\n * @param orderStatusCanceled -- Order status canceled.\n * @param orderStatusReadyForPickup -- Order status ready for pick up.\n * @param orderStatusPickedUp -- Order status pick up.\n * @param orderStatusProcessing -- Order status processing.\n * @param orderStatusShipped -- Order status shipped.\n * @param orderStatusEmailed -- Order status emailed.\n * @returns The sales status in string.\n */\nexport const getSalesStatusStringMap = (\n orderStatusCanceled: string | undefined,\n orderStatusReadyForPickup: string | undefined,\n orderStatusPickedUp: string | undefined,\n orderStatusProcessing: string | undefined,\n orderStatusShipped: string | undefined,\n orderStatusEmailed: string | undefined\n): ISalesStatusStringMap => {\n return {\n canceled: orderStatusCanceled,\n readyForPickup: orderStatusReadyForPickup,\n pickedUp: orderStatusPickedUp,\n processing: orderStatusProcessing,\n shipped: orderStatusShipped,\n unknown: undefined,\n emailed: orderStatusEmailed\n };\n};\n\n/**\n * Get delivery type.\n * @param deliveryTypeString -- Delivery type string.\n * @param moduleName -- Module name.\n * @param deliveryTypeClass -- Delivery type class.\n * @param storePickUp -- Store pick up.\n * @param isMultiplePickUpOptionEnabled -- Is multiple pick up enabled.\n * @returns The delivery type react node.\n */\nexport const getDeliveryTypeComp = (\n deliveryTypeString: string | undefined,\n moduleName: string,\n deliveryTypeClass: string | undefined,\n storePickUp: string | null | undefined,\n isMultiplePickUpOptionEnabled: boolean | undefined\n): React.ReactNode => {\n const deliveryTypePickup = deliveryTypeString && (\n <LabelComponent\n className={`${moduleName}__devliery-type ${deliveryTypeClass ?? ''}-icon`}\n label={`${deliveryTypeString} ${storePickUp ?? ''}`}\n />\n );\n const deliveryTypeNoPickup = deliveryTypeString && (\n <LabelComponent className={`${moduleName}__devliery-type`} label={deliveryTypeString} />\n );\n\n return isMultiplePickUpOptionEnabled ? deliveryTypePickup : deliveryTypeNoPickup;\n};\n\n/**\n * Renders sales line picture.\n * @param moduleName - Module name.\n * @param requestContext - Request context.\n * @param productName - Product name.\n * @param product - Product data.\n * @param fallbackImageUrl - Fallback image.\n * @param gridSettings - Grid settings.\n * @param imageSettings - Image settings.\n * @param salesLineState - Product state.\n * @returns React node.\n */\nconst getSalesLinePicture = (\n moduleName: string,\n requestContext: IRequestContext,\n productName: string | undefined,\n product: SimpleProduct | undefined,\n fallbackImageUrl: string | undefined,\n gridSettings: IGridSettings,\n imageSettings: IImageSettings | undefined,\n salesLineState?: SalesLineState\n) => {\n return (\n <Observer>\n {() =>\n !salesLineState?.isHidden && (\n <div className={`${moduleName}__sales-line-picture`}>\n <Image\n requestContext={requestContext}\n className={`${moduleName}__sales-line-image`}\n altText={productName}\n src={product?.PrimaryImageUrl ?? ''}\n fallBackSrc={fallbackImageUrl}\n gridSettings={gridSettings}\n imageSettings={imageSettings ?? defaultImageSettings}\n loadFailureBehavior='empty'\n />\n </div>\n )\n }\n </Observer>\n );\n};\n\n/**\n * Renders sales line.\n * @param props - Sales line props.\n * @returns React node.\n */\nconst SalesLineComponent: React.FC<IGetSalesLineInput> = (props: IGetSalesLineInput) => {\n const productName = props.product?.Name ?? props.salesLine.Description;\n const requestContext = props.moduleComponentProps.context.actionContext.requestContext;\n\n if (props.imageOnly) {\n const fallbackImageUrl = getFallbackImageUrl(\n props.product?.ItemId,\n requestContext.apiSettings,\n props.moduleComponentProps.context.request.app?.config?.OmniChannelMedia\n );\n return getSalesLinePicture(\n props.moduleName,\n requestContext,\n productName,\n props.product,\n fallbackImageUrl,\n requestContext.gridSettings!,\n props.moduleComponentProps.config.imageSettings,\n props.salesLineState\n );\n }\n\n const orderDetailsProducts = props.orderDetailsProduct ?? new OrderDetailsProduct(props.salesLine, props.product);\n\n const isSelectionModeEnabled = props.isSelectionModeEnabled && orderDetailsProducts.isProductAvailable;\n\n const orderDetailCheckbox =\n isSelectionModeEnabled &&\n getOrderDetailsSalesLineCheckbox(orderDetailsProducts, props.resources.orderDetailsSelectRadioAriaLabelText, props.moduleName);\n\n let productUrl: string | undefined;\n if (!ObjectExtensions.isNullOrUndefined(productName) && !ObjectExtensions.isNullOrUndefined(props.salesLine.ProductId)) {\n productUrl = getProductPageUrlSync(productName, props.salesLine.ProductId, props.moduleComponentProps.context.actionContext);\n\n if (MsDyn365.isBrowser && isChannelTypeB2B(requestContext)) {\n const fullUrl = new URL(productUrl, window.location.href);\n fullUrl.searchParams.set('catalogid', `${props.salesLine.CatalogId ?? 0}`);\n productUrl = fullUrl.href;\n }\n }\n\n const className = `${props.moduleName}__sales-line-checkbox-control`;\n\n return (\n <div\n className={classnames(\n className,\n isSelectionModeEnabled ? `${className}__selection-enabled` : `${className}__selection-disabled`,\n props.isSelectionModeEnabled ? `${className}__selection-global-enabled` : `${className}__selection-global-disabled`,\n orderDetailsProducts.isProductAvailable ? `${className}__available-product` : `${className}__unavailable-product`,\n orderDetailsProducts.isSelected ? `${className}__selected` : `${className}__unselected`\n )}\n >\n {orderDetailCheckbox}\n <CartLineItemComponent\n id={props.moduleComponentProps.id}\n typeName={props.moduleComponentProps.typeName}\n context={props.moduleComponentProps.context}\n resources={{\n sizeString: props.resources.productDimensionTypeSize,\n colorString: props.resources.productDimensionTypeColor,\n styleString: props.resources.productDimensionTypeStyle,\n amountString: props.resources.productDimensionTypeAmount,\n quantityDisplayString: props.resources.salesLineQuantityText,\n configString: props.resources.configString,\n discountStringText: props.resources.discountStringText,\n inputQuantityAriaLabel: '',\n originalPriceText: '',\n currentPriceText: '',\n shippingChargesText: props.resources.shippingCharges ?? ''\n }}\n primaryImageUrl={props.product?.PrimaryImageUrl}\n productUrl={!props.product?.Name ? undefined : productUrl}\n imageSettings={props.moduleComponentProps.config.imageSettings ?? defaultImageSettings}\n gridSettings={requestContext.gridSettings!}\n isSalesLine\n data={{ cartLine: props.salesLine, product: props.product, catalogs: props.catalogs }}\n showShippingChargesForLineItems={props.moduleComponentProps.config.showShippingChargesForLineItems}\n channelDeliveryOptionConfig={props.retailMultiplePickUpOptionEnabled ? props.channelDeliveryOptionConfig : undefined}\n priceCurrency={props.priceCurrency}\n />\n </div>\n );\n};\n\nexport const getSalesLine = (props: IGetSalesLineInput): ISalesLine => {\n const {\n moduleName,\n moduleComponentProps: {\n typeName,\n context,\n config: { imageSettings }\n },\n product,\n shipment,\n salesLine,\n resources: {\n shipToLabel,\n storeLabel,\n phoneLabel,\n phoneAriaLabel,\n buyItAgainLabel,\n buyItAgainAriaLabel,\n orderStatusReadyForPickup,\n orderStatusProcessing,\n orderStatusShipped,\n orderStatusPickedUp,\n orderStatusCanceled,\n orderStatusEmailed,\n pickedUpSalesLines,\n deliveredSalesLines,\n carryOutSalesLines,\n emailSalesLines,\n trackingLabel,\n trackingAriaLabel,\n trackingComingSoonLabel,\n pickupDateTimeslotText,\n pickupTimeslotPlaceHolder,\n orderDetailsUnavailableProductText,\n orderDetailsBuySelectedAddingToCartErrorNotificationTitle,\n orderDetailsBuySelectedAddingToCartErrorNotificationCloseAriaLabel,\n orderDetailsGoToCartText,\n orderDetailsDialogCloseText,\n orderDetailsSingleItemText,\n orderDetailsMultiLineItemFormatText,\n orderDetailsMultiLinesFormatText,\n orderDetailsHeaderMessageText,\n orderDetailsMultiItemsValidationErrorMessage,\n orderDetailsOneErrorText,\n orderDetailsMultiErrorText,\n addedQuantityText,\n originalPriceText,\n currentPriceText,\n freePriceText\n },\n channelDeliveryOptionConfig,\n productDeliveryOptions,\n isSelectionModeEnabled,\n orderDetailsProduct,\n isReorderingEnabled\n } = props;\n\n const salesStatusStringMap = getSalesStatusStringMap(\n orderStatusCanceled,\n orderStatusReadyForPickup,\n orderStatusPickedUp,\n orderStatusProcessing,\n orderStatusShipped,\n orderStatusEmailed\n );\n\n const deliveryTypeStringMap: IDeliveryTypeStringMap = {\n pickUp: pickedUpSalesLines,\n ship: deliveredSalesLines,\n carryOut: carryOutSalesLines,\n email: emailSalesLines\n };\n\n const pickupDeliveryModeCode = context.request.channel?.PickupDeliveryModeCode;\n const emailDeliveryModeCode = context.request.channel?.EmailDeliveryModeCode;\n const productName = product?.Name ?? salesLine.Description;\n let productUrl = '';\n if (!ObjectExtensions.isNullOrUndefined(productName) && !ObjectExtensions.isNullOrUndefined(salesLine.ProductId)) {\n productUrl = getProductPageUrlSync(productName, salesLine.ProductId, context.actionContext);\n\n if (MsDyn365.isBrowser) {\n const fullUrl = new URL(productUrl, window.location.href);\n fullUrl.searchParams.set('catalogid', `${salesLine.CatalogId ?? 0}`);\n productUrl = fullUrl.href;\n }\n }\n\n const pickupMode = getPickupModeDesc(product, salesLine.DeliveryMode, productDeliveryOptions, props.retailMultiplePickUpOptionEnabled);\n const deliveryType = getDeliveryType(\n pickupMode,\n salesLine,\n salesLine.DeliveryMode,\n pickupDeliveryModeCode,\n props.retailMultiplePickUpOptionEnabled,\n channelDeliveryOptionConfig,\n emailDeliveryModeCode\n );\n const salesStatus = getSalesStatusCode(deliveryType, salesLine.SalesStatusValue, pickupMode);\n const salesStatusString = salesStatusStringMap[salesStatus];\n\n const deliveryTypeString = getDeliveryTypeString(deliveryType, deliveryTypeStringMap, props.retailMultiplePickUpOptionEnabled);\n const deliveryTypeClass = getDeliveryTypeClassName(deliveryType, deliveryTypeStringMap);\n const storePickUp = getStoreName(props.retailMultiplePickUpOptionEnabled, salesLine, deliveryType);\n const deliveryTypeComp = getDeliveryTypeComp(\n deliveryTypeString,\n moduleName,\n deliveryTypeClass,\n storePickUp,\n props.retailMultiplePickUpOptionEnabled\n );\n const salesStatusComp = salesStatusString && (\n <LabelComponent\n className={`${moduleName}__sales-status ${moduleName}__devliery-type ${deliveryTypeClass ?? ''}-icon`}\n label={salesStatusString}\n />\n );\n\n const trackingInfo = getTrackingInfo(deliveryType, moduleName, trackingLabel, trackingAriaLabel, trackingComingSoonLabel, shipment);\n const orderDetailProducts = orderDetailsProduct ?? new OrderDetailsProduct(salesLine, product, productUrl);\n const orderDetailsBuyItAgainAriaLabel =\n productName && buyItAgainAriaLabel ? (buyItAgainAriaLabel || '').replace('{productName}', productName) : '';\n const pickupDateTimeslotInfo = getPickupDateTimeslotInfo(\n props.showTimeslot,\n deliveryType === pickupMode,\n salesLine,\n pickupTimeslotPlaceHolder,\n moduleName,\n context.request.locale,\n pickupDateTimeslotText\n );\n let buyItAgainLinkClassName = format('{0}__sales-line-btn-buy-it-again-link', moduleName);\n if (isSelectionModeEnabled) {\n buyItAgainLinkClassName = format('{0} {1}-padding', buyItAgainLinkClassName, buyItAgainLinkClassName);\n }\n\n if (imageSettings) {\n imageSettings.cropFocalRegion = true;\n }\n\n const salesLineClassName = `${moduleName}__sales-line`;\n const salesLineFullClassName = classnames(\n salesLineClassName,\n isSelectionModeEnabled ? `${salesLineClassName}__selection-enabled` : `${salesLineClassName}__selection-disabled`,\n props.isSelectionModeEnabled\n ? `${salesLineClassName}__selection-global-enabled`\n : `${salesLineClassName}__selection-global-disabled`,\n orderDetailProducts.isProductAvailable ? `${salesLineClassName}__available-product` : `${salesLineClassName}__unavailable-product`\n );\n\n return {\n data: {\n salesLine,\n productUrl,\n deliveryType,\n salesStatus,\n product,\n shipment,\n isChecked: orderDetailProducts.isSelected\n },\n salesLineProps: { className: salesLineFullClassName },\n salesLine: SalesLineComponent(props),\n address: salesLine.ShippingAddress && (\n <Address\n moduleName={moduleName}\n address={salesLine.ShippingAddress}\n resource={{ shipToLabel, storeLabel, phoneLabel, phoneAriaLabel }}\n deliveryType={deliveryType}\n showCompleteAddress={props.showCompleteAddress}\n />\n ),\n deliveryType: deliveryTypeComp,\n salesStatus: salesStatusComp,\n trackingInfo,\n buyAgainButton: (\n <BuySelectedComponent\n context={context}\n className={props.retailMultiplePickUpOptionEnabled ? buyItAgainLinkClassName : `${moduleName}__sales-line-btn-buy-it-again`}\n data={{ products: [orderDetailProducts] }}\n resources={{\n orderDetailsBuyItAgainLabel: buyItAgainLabel,\n orderDetailsUnavailableProductText,\n orderDetailsBuyItAgainAriaLabel,\n orderDetailsBuySelectedAddingToCartErrorNotificationTitle,\n orderDetailsBuySelectedAddingToCartErrorNotificationCloseAriaLabel,\n orderDetailsGoToCartText,\n orderDetailsDialogCloseText,\n orderDetailsSingleItemText,\n orderDetailsMultiLineItemFormatText,\n orderDetailsMultiLinesFormatText,\n orderDetailsHeaderMessageText,\n orderDetailsMultiItemsValidationErrorMessage,\n orderDetailsOneErrorText,\n orderDetailsMultiErrorText,\n addedQuantityText,\n originalPriceText,\n currentPriceText,\n freePriceText\n }}\n id={props.moduleComponentProps.id}\n typeName={typeName}\n isReorderingEnabled={isReorderingEnabled}\n />\n ),\n pickupDateTimeslot: pickupDateTimeslotInfo,\n errors: !orderDetailProducts.isProductAvailable && (\n <div className='msc-alert-danger'>{props.resources.orderDetailsUnavailableProductText}</div>\n )\n };\n};\n\nexport const getDeliveryType = (\n pickupMode: string,\n salesLine: SalesLine,\n salesLineDeliveryMode?: string,\n pickupDeliveryModeCode?: string,\n retailMultiplePickupOption?: boolean,\n channelDeliveryOptionConfig?: ChannelDeliveryOptionConfiguration,\n emailDeliveryModeCode?: string\n): string => {\n let isPickupDeliveryMode: boolean;\n\n if (retailMultiplePickupOption) {\n isPickupDeliveryMode =\n salesLineDeliveryMode === channelDeliveryOptionConfig?.PickupDeliveryModeCodes?.find(dM => dM === salesLineDeliveryMode);\n } else {\n isPickupDeliveryMode =\n !!pickupDeliveryModeCode && pickupDeliveryModeCode !== '' && pickupDeliveryModeCode === salesLineDeliveryMode;\n }\n\n return isPickupDeliveryMode\n ? pickupMode\n : emailDeliveryModeCode && emailDeliveryModeCode !== '' && emailDeliveryModeCode === salesLine.DeliveryMode\n ? deliveryTypeEnum.email\n : salesLine.DeliveryMode\n ? deliveryTypeEnum.ship\n : deliveryTypeEnum.carryOut;\n};\n\nexport const getDeliveryTypeString = (\n deliveryType: string,\n deliveryTypeStringMap: IDeliveryTypeStringMap,\n retailMultiplePickupOption?: boolean\n): string | undefined => {\n if (retailMultiplePickupOption) {\n switch (deliveryType) {\n case deliveryTypeEnum.ship:\n case deliveryTypeEnum.carryOut:\n case deliveryTypeEnum.email:\n return deliveryTypeStringMap[deliveryType];\n default:\n return deliveryType;\n }\n } else {\n return deliveryTypeStringMap[deliveryType];\n }\n};\n\nexport const getDeliveryTypeClassName = (\n deliveryType: string,\n deliveryTypeStringMap: IDeliveryTypeStringMap,\n retailMultiplePickupOption?: boolean\n): string | undefined => {\n switch (deliveryType) {\n case deliveryTypeEnum.ship:\n case deliveryTypeEnum.carryOut:\n case deliveryTypeEnum.email:\n return deliveryType;\n default:\n return deliveryTypeEnum.pickUp;\n }\n};\n\nconst defaultDeliveryOption: string = 'pickup';\n\n/**\n * Retrieves the delivery description by product id.\n * @param productRecordId - Product record id.\n * @param salesLineDeliveryMode - Delivery mode from the sales line.\n * @param productDeliveryOptions - Possible delivery options.\n * @returns Delivery option description.\n */\nexport const getDeliveryDescriptionByProductId = (\n productRecordId?: number,\n salesLineDeliveryMode?: string,\n productDeliveryOptions?: ProductDeliveryOptions[]\n): string => {\n if (ObjectExtensions.isNullOrUndefined(productRecordId) || !ArrayExtensions.hasElements(productDeliveryOptions)) {\n return defaultDeliveryOption;\n }\n\n const productDeliveryOption = productDeliveryOptions.find(currentDeliveryOption => {\n return currentDeliveryOption.ProductId === productRecordId;\n });\n\n const deliveryDescription = productDeliveryOption?.DeliveryOptions?.find(option => option.Code === salesLineDeliveryMode)?.Description;\n\n return deliveryDescription ?? defaultDeliveryOption;\n};\n\nexport const getPickupModeDesc = (\n product?: SimpleProduct,\n salesLineDeliveryMode?: string,\n productDeliveryOptions?: ProductDeliveryOptions[],\n retailMultiplePickupOption?: boolean\n): string => {\n return getDeliveryDescriptionByProductId(product?.RecordId, salesLineDeliveryMode, productDeliveryOptions);\n};\n\n/**\n * Get the store name.\n * @param isMultiplePickUpOptionEnabled -- Is mutiple pick up option enabled.\n * @param salesLine -- Sales line.\n * @param deliveryType -- Delivery type.\n * @returns The store name.\n */\nexport const getStoreName = (\n isMultiplePickUpOptionEnabled: boolean | undefined,\n salesLine: SalesLine,\n deliveryType?: string\n): string | undefined | null => {\n if (!isMultiplePickUpOptionEnabled) {\n return null;\n }\n\n switch (deliveryType) {\n case deliveryTypeEnum.ship:\n case deliveryTypeEnum.email:\n case deliveryTypeEnum.carryOut:\n return '';\n default:\n return `, ${salesLine.ShippingAddress?.Name}`;\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 { DisplayTemplate, ProductRefinerSource, ProductRefinerValue, RefinerType } 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, isRangeType } from './utilities';\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 // If (this.props.productRefinerHierarchy.DataTypeValue === ProductRefinerValueDataTypeValue.Range) {\n // isExpanded = true;\n // }\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 (isRangeType(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 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 const selectedRefinementCriterion = findMatchingRefinementCriterion(child, selectedRefinerValues);\n\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 </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 * 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 ILabelProps {\n className: string;\n label: string;\n}\n\nexport const Label: React.FC<ILabelProps> = ({ className, label }) => <span className={className}>{label}</span>;\n\nexport default Label;\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 } 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 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, ProductRefinerTypeValue, ProductRefinerValueDataTypeValue } from './utilities';\r\nimport classnames from 'classnames';\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;\r\n moduleId: string;\r\n moduleTypeName: 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 } = 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 className = classnames(\r\n 'ms-refine-submenu',\r\n 'list-group',\r\n productRefinerHierarchy.KeyName // Deprecated because of the localization issues. Leaving for backward compatibility reasons.\r\n );\r\n return (\r\n <div className={className}>\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}\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 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, 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 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 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 />\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 {\r\n isDisabled,\r\n refineItemCommonProps,\r\n selectedRefinerValues,\r\n context,\r\n minValueSliderThumbAriaLabel,\r\n maxValueSliderThumbAriaLabel\r\n } = 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 =\r\n productRefinerHierarchy.DataTypeValue === ProductRefinerValueDataTypeValue.RangeInput ||\r\n this.props.tempRangeTypeTODO === 'input'\r\n ? 'input'\r\n : 'slider';\r\n const key = selectedRefinementCriterion\r\n ? `${selectedRefinementCriterion.LeftValueBoundString}-${selectedRefinementCriterion.RightValueBoundString}`\r\n : `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'>{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","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport listPageStateAction, { ListPageState, ListPageStateInput } from './modules/search-result-container/list-page-state';\nimport SearchResultContainerModule from './modules/search-result-container/search-result-container';\nimport SearchResultContainerView from './modules/search-result-container/search-result-container.view';\n\nexport * from './modules/search-result-container/components';\nexport * from './modules/search-result-container/list-page-state';\nexport * from './modules/search-result-container/search-result-container';\nexport * from './modules/search-result-container/search-result-container.data';\nexport * from './modules/search-result-container/search-result-container.props.autogenerated';\nexport * from './modules/search-result-container/search-result-container.view';\n\nexport { ListPageState, listPageStateAction, ListPageStateInput, SearchResultContainerModule, SearchResultContainerView };\n","import { 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, ProductRefinerValueDataTypeValue } 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\r\n @computed get selectedRefinersMap(): IRefinerMap[] {\r\n const { selectedChoices } = this.props;\r\n return selectedChoices.map((selectedRefiner: ProductRefinerValue, index) => {\r\n return {\r\n key: this._getKeyForRefinerValue(selectedRefiner, index.toString()),\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 }\r\n\r\n public render(): JSX.Element {\r\n const { clearAllText, label, classNames, choiceAriaLabel, closeAriaLabel } = this.props;\r\n const items = this.selectedRefinersMap;\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 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.value.LeftValueBoundString} ${choiceAriaLabel}`}\r\n onClick={this._onClick}\r\n id={item.key}\r\n >\r\n {/* {item.key}\r\n <span className={`${this.closeButtonGlyph} msc-choice-summary__glyph`} /> */}\r\n {item.value.LeftValueBoundString && item.value.LeftValueBoundLocalizedString === ''\r\n ? item.value.LeftValueBoundString\r\n : (item.value.LeftValueBoundLocalizedString ||\r\n item.value.LeftValueBoundLocalizedString === undefined) &&\r\n item.value.RefinerRecordId === 0\r\n ? item.key\r\n : item.value.LeftValueBoundString}\r\n <span\r\n className={`${this.closeButtonGlyph} msc-choice-summary__glyph`}\r\n role='button'\r\n aria-label={closeAriaLabel}\r\n />\r\n </a>\r\n </li>\r\n );\r\n })}\r\n </ul>\r\n {items.length > 0 && clearAllText && (\r\n <a href={this.props.urlBuilder({}, true)} className={'msc-choice-summary__clear-all'} onClick={this._onClick}>\r\n {clearAllText}\r\n </a>\r\n )}\r\n </div>\r\n );\r\n }\r\n\r\n private _getKeyForRefinerValue(productRefinerValue: ProductRefinerValue, index: string): string {\r\n const { choiceFormat, choiceRangeValueFormat, refinerHierarchy, telemetry, refinerValues } = 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 switch (productRefinerValue.DataTypeValue) {\r\n case ProductRefinerValueDataTypeValue.Range:\r\n case ProductRefinerValueDataTypeValue.RangeInput:\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 break;\r\n default:\r\n refinerValueName = productRefinerValue.LeftValueBoundLocalizedString || productRefinerValue.LeftValueBoundString || '';\r\n }\r\n if (productRefinerValue.RefinerRecordId === 0) {\r\n const filterValue = refinerValues?.Values.find(\r\n refiner => refiner.LeftValueBoundString === productRefinerValue.LeftValueBoundString\r\n );\r\n refinerValueName = (filterValue ? filterValue.LeftValueBoundLocalizedString : productRefinerValue.LeftValueBoundString) || '';\r\n }\r\n\r\n if (refinerName === 'Rating' || refinerName === 'Price') {\r\n return overallFormat.replace('{0}', refinerName).replace('{1}', `${refinerValueName}`);\r\n }\r\n return overallFormat.replace('{0}', refinerName).replace('{1}', `${refinerValueName}_${refinerName}_${index}`);\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.id === selected.key);\r\n return (result && result.value) || undefined;\r\n }\r\n}\r\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 * as React from 'react';\n\nimport { IGetOrderSummaryInput, IOrderSummary, IPriceContext } from '../../../common';\n\ninterface ISummaryLineProps {\n priceContext?: IPriceContext;\n name: string;\n label: string;\n value?: number;\n}\n\nconst OrderSummaryLine: React.SFC<ISummaryLineProps> = ({ name, label, value = 0, priceContext }) => (\n <p className={`ms-order-confirmation__order-summary-line-${name}`}>\n <span className='ms-order-confirmation__order-summary-label'>{label}</span>\n {priceContext ? (\n <PriceComponent\n {...priceContext}\n className='ms-order-confirmation__order-summary-price'\n data={{ price: { CustomerContextualPrice: value } }}\n />\n ) : (\n <span className='ms-order-confirmation__order-summary-price'>{value}</span>\n )}\n </p>\n);\n\nexport const getOrderConfirmationOrderSummary = ({\n order,\n priceContext,\n earnedPoints,\n resource: {\n orderSummaryHeading,\n orderSummaryItemsTotalLabel,\n orderSummaryShippingFeeLabel,\n orderSummaryTaxLabel,\n orderSummaryGrandTotalLabel,\n pointsEarnedLabel\n },\n canShip,\n isTaxIncludedInPrice,\n isShowTaxBreakUp\n}: IGetOrderSummaryInput): IOrderSummary => {\n const subTotal = isTaxIncludedInPrice && isShowTaxBreakUp ? order.SubtotalAmountWithoutTax : order.SubtotalAmount;\n const taxOnShippingCharge = order.TaxOnShippingCharge !== undefined ? order.TaxOnShippingCharge : 0;\n const shippingChargeAmount = order.ShippingChargeAmount !== undefined ? order.ShippingChargeAmount : 0;\n\n // isTaxIncludedInPrice isShowTaxBreakup useProperties\n // False False/True otherChargeAmount\n // True True otherChargeAmount\n // True false otherChargeAmount+TaxOnNonShippingCharges\n const shippingCharge =\n isTaxIncludedInPrice && !isShowTaxBreakUp ? shippingChargeAmount + taxOnShippingCharge : order.ShippingChargeAmount;\n return {\n orderSummaryProps: { className: 'ms-order-confirmation__order-summary' },\n heading: <p className='ms-order-confirmation__order-summary-heading'>{orderSummaryHeading}</p>,\n subtotal: <OrderSummaryLine name='subtotal' label={orderSummaryItemsTotalLabel} value={subTotal} priceContext={priceContext} />,\n shipping: canShip ? (\n <OrderSummaryLine name='shipping' label={orderSummaryShippingFeeLabel} value={shippingCharge} priceContext={priceContext} />\n ) : (\n ''\n ),\n tax: isShowTaxBreakUp ? (\n <OrderSummaryLine name='tax-amount' label={orderSummaryTaxLabel} value={order.TaxAmount} priceContext={priceContext} />\n ) : (\n ''\n ),\n totalAmount: (\n <OrderSummaryLine\n name='total-amount'\n label={orderSummaryGrandTotalLabel}\n value={order.TotalAmount}\n priceContext={priceContext}\n />\n ),\n earnedPoints: earnedPoints ? <OrderSummaryLine name='earned-points' label={pointsEarnedLabel} value={earnedPoints} /> : 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 * 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 { Module, Node } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { IHelp, IOrderSummary, IPaymentMethods } from '../../common';\nimport { IGroup, IGroupDelivery, IGroups } from '../../common/get-groups';\nimport { IOrderInformation } from '../../common/get-order-information';\nimport { ISalesLine } from '../../common/get-sales-line';\nimport { IOrderConfirmationViewProps } from './order-confirmation';\n\nexport const OrderConfirmationOrderInfomation: React.FC<IOrderInformation> = ({\n orderInformationProps,\n receiptEmail,\n createdDate,\n channelReferenceId\n}) => (\n <Node {...orderInformationProps}>\n {createdDate}\n {channelReferenceId}\n {receiptEmail}\n </Node>\n);\n\nexport const OrderConfirmationSalesLine: React.FC<ISalesLine> = ({ salesLineProps, salesLine, buyAgainButton }) => (\n <Node {...salesLineProps}>{salesLine}</Node>\n);\n\nexport const OrderConfirmationGroupDelivery: React.FC<IGroupDelivery> = ({\n deliveryProps,\n heading,\n count,\n processing,\n address,\n trackingInfo,\n pickupDateTimeslot\n}) => (\n <Node {...deliveryProps}>\n {heading}\n {address}\n {pickupDateTimeslot}\n </Node>\n);\n\nexport const OrderConfirmationGroup: React.FC<IGroup> = ({ groupProps, delivery, salesLinesProps, salesLines }) => (\n <Node {...groupProps}>\n {delivery && <OrderConfirmationGroupDelivery {...delivery} />}\n {delivery && delivery.shippingItemsToYou}\n {salesLines && (\n <Node {...salesLinesProps}>\n {salesLines.map((salesLine: ISalesLine) => (\n <OrderConfirmationSalesLine key={salesLine.data.salesLine.LineId} {...salesLine} />\n ))}\n </Node>\n )}\n </Node>\n);\n\nexport const OrderConfirmationGroups: React.FC<IGroups> = ({ groupsProps, groups }) => (\n <Node {...groupsProps}>\n {groups.map((group: IGroup, index: number) => (\n <OrderConfirmationGroup key={index} {...group} />\n ))}\n </Node>\n);\n\nexport const OrderConfirmationOrderSummary: React.FC<IOrderSummary> = ({\n orderSummaryProps,\n heading,\n subtotal,\n shipping,\n tax,\n totalAmount,\n earnedPoints\n}) => (\n <Node {...orderSummaryProps}>\n {heading}\n {subtotal}\n {shipping}\n {tax}\n {totalAmount}\n {earnedPoints}\n </Node>\n);\n\nexport const OrderConfirmationPayment: React.FC<IPaymentMethods> = ({ paymentMethodsProps, title, methods }) => (\n <Node {...paymentMethodsProps}>\n {title}\n {methods}\n </Node>\n);\n\nexport const OrderConfirmationHelp: React.FC<IHelp> = ({ helpProps, needHelpLabel, helpLineNumberLabel, contactNumber }) => (\n <Node {...helpProps}>\n {needHelpLabel}\n {helpLineNumberLabel}\n {contactNumber}\n </Node>\n);\n\nconst OrderConfirmationView: React.FC<IOrderConfirmationViewProps> = ({\n moduleProps,\n heading,\n backToShoppingLink,\n alert,\n loading,\n orderInfomation,\n orderSummary,\n payment,\n help,\n groups\n}) => {\n return (\n <Module {...moduleProps}>\n {heading}\n {alert}\n {loading}\n {orderInfomation && <OrderConfirmationOrderInfomation {...orderInfomation} />}\n {backToShoppingLink}\n {groups && <OrderConfirmationGroups {...groups} />}\n {payment && <OrderConfirmationPayment {...payment} />}\n {orderSummary && <OrderConfirmationOrderSummary {...orderSummary} />}\n {help && <OrderConfirmationHelp {...help} />}\n </Module>\n );\n};\n\nexport default OrderConfirmationView;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { AddToCartComponent, IAddToCartResources, OrderDetailsProduct } from '@msdyn365-commerce/components';\nimport { getUrlSync, IComponentProps, ICoreContext } from '@msdyn365-commerce/core';\nimport { ArrayExtensions, ObjectExtensions } from '@msdyn365-commerce-modules/retail-actions';\nimport { Button } from '@msdyn365-commerce-modules/utilities';\nimport React from 'react';\n\n/**\n * The data which the component should operate.\n */\nexport interface IBuySelectedData {\n products: OrderDetailsProduct[];\n}\n\n/**\n * The resources needed to render a buy selected component.\n */\nexport interface IBuySelectedResources {\n orderDetailsUnavailableProductText?: string;\n orderDetailsBuySelectedButtonText?: string;\n orderDetailsBuySelectedButtonAriaLabel?: string;\n orderDetailsBuySelectedAddingToCartErrorNotificationTitle?: string;\n orderDetailsBuySelectedAddingToCartErrorNotificationCloseAriaLabel?: string;\n orderDetailsBuyItAgainLabel?: string;\n orderDetailsBuyItAgainAriaLabel?: string;\n orderDetailsGoToCartText?: string;\n orderDetailsDialogCloseText?: string;\n orderDetailsSingleItemText?: string;\n orderDetailsMultiLineItemFormatText?: string;\n orderDetailsMultiLinesFormatText?: string;\n orderDetailsHeaderMessageText?: string;\n orderDetailsMultiItemsValidationErrorMessage?: string;\n orderDetailsOneErrorText?: string;\n orderDetailsMultiErrorText?: string;\n addedQuantityText?: string;\n originalPriceText?: string;\n currentPriceText?: string;\n freePriceText?: string;\n}\n\n/**\n * Configuration of a buy selected component.\n */\nexport interface IBuySelectedProps extends IComponentProps<IBuySelectedData> {\n className: string;\n context: ICoreContext;\n\n resources: IBuySelectedResources;\n\n isIcon?: boolean;\n isReorderingEnabled?: boolean;\n}\n\n/**\n * Get the dialog strings.\n * @param props -- The buy selected props.\n * @returns The add to cart resources.\n */\nexport const getDialogStrings = (props: IBuySelectedProps): IAddToCartResources => {\n return {\n goToCartText: props.resources.orderDetailsGoToCartText ?? '',\n continueShoppingText: props.resources.orderDetailsDialogCloseText ?? '',\n closeNotificationLabel: props.resources.orderDetailsBuySelectedAddingToCartErrorNotificationCloseAriaLabel ?? '',\n headerItemOneText: props.resources.orderDetailsSingleItemText ?? '',\n headerItemFormatText: props.resources.orderDetailsMultiLineItemFormatText ?? '',\n headerLinesFormatText: props.resources.orderDetailsMultiLinesFormatText ?? '',\n headerMessageText: props.resources.orderDetailsHeaderMessageText ?? '',\n freePriceText: props.resources.freePriceText ?? '',\n originalPriceText: props.resources.originalPriceText ?? '',\n currentPriceText: props.resources.currentPriceText ?? '',\n addedQuantityText: props.resources.addedQuantityText ?? '',\n buyAgainNotificationTitle: props.resources.orderDetailsBuySelectedAddingToCartErrorNotificationTitle ?? '',\n buyAgainNotificationCloseAriaLabel: props.resources.orderDetailsBuySelectedAddingToCartErrorNotificationCloseAriaLabel ?? '',\n validationErrorMessage: props.resources.orderDetailsMultiItemsValidationErrorMessage,\n oneErrorText: props.resources.orderDetailsOneErrorText,\n multiErrorsText: props.resources.orderDetailsMultiErrorText\n };\n};\n\n/**\n * Renders a button which adds given products to the cart.\n * @param props - Configuration of the component.\n * @returns A react element or null if no products were given.\n */\nexport const BuySelectedComponent: React.FC<IBuySelectedProps> = (props: IBuySelectedProps): JSX.Element | null => {\n const products = props.data.products.filter(product => !ObjectExtensions.isNullOrUndefined(product.simpleProduct));\n const buttonLabel = props.isIcon\n ? ''\n : props.resources.orderDetailsBuySelectedButtonText ?? props.resources.orderDetailsBuyItAgainLabel;\n const buttonAriaLabel = props.resources.orderDetailsBuySelectedButtonAriaLabel ?? props.resources.orderDetailsBuyItAgainAriaLabel;\n\n const singleProductCount = 1;\n if (props.data.products.length === singleProductCount && !props.data.products[0].isProductAvailable) {\n // Return disabled button\n return (\n <button\n className={props.className}\n aria-label={props.resources.orderDetailsUnavailableProductText}\n title={props.resources.orderDetailsUnavailableProductText}\n disabled\n >\n {buttonLabel}\n </button>\n );\n }\n\n if (!ArrayExtensions.hasElements(products)) {\n // Return disabled button\n return (\n <button className={props.className} aria-label={buttonAriaLabel} title={buttonAriaLabel} disabled>\n {buttonLabel}\n </button>\n );\n }\n\n const firstProduct: OrderDetailsProduct = products[0];\n\n // Reorder is not enable, buy again button link to product details page.\n if (!props.isReorderingEnabled) {\n return (\n <Button className={props.className} aria-label={buttonAriaLabel} title={buttonAriaLabel} href={firstProduct.productUrl}>\n {buttonLabel}\n </Button>\n );\n }\n\n const shouldSkipSiteSettings: boolean = true;\n const dialogStrings: IAddToCartResources = getDialogStrings(props);\n const emailDeliveryModeCode = props.context.actionContext.requestContext.channel?.EmailDeliveryModeCode;\n return (\n <AddToCartComponent\n addToCartText={buttonLabel ?? ''}\n outOfStockText=''\n addToCartArialLabel={buttonAriaLabel}\n quantity={firstProduct.salesLine.Quantity}\n id={props.id}\n typeName={props.typeName}\n className={props.className}\n navigationUrl={getUrlSync('cart', props.context.actionContext)}\n data={{ product: firstProduct.simpleProduct! }}\n context={props.context}\n dialogStrings={dialogStrings}\n shouldSkipSiteSettings={shouldSkipSiteSettings}\n orderDetailsProducts={products}\n isAddEmailDeliveryItemToCart={firstProduct.salesLine.DeliveryMode === emailDeliveryModeCode ? true : false}\n />\n );\n};\n","import {\r\n ICategoryHierarchyViewProps,\r\n IRefineMenuViewProps,\r\n ISearchResultContainerViewProps,\r\n ISearchResultModalViewProps,\r\n ISortByViewProps,\r\n ITitleViewProps,\r\n IChoiceSummaryClickNotification,\r\n isMatchingRefinementCriterion,\r\n ISearchResultContainerData\r\n} from '@msdyn365-commerce-modules/search-result-container';\r\nimport { ISearchResultContainerProps } from '../definition-extensions/search-result-container.ext.props.autogenerated';\r\nimport { Module, Node, LabeledDropdown } from '@msdyn365-commerce-modules/utilities';\r\nimport * as React from 'react';\r\nimport RefineSubmenu from './custom-components/refine-submenu';\r\nimport ChoiceSummary from './custom-components/choice-summary';\r\nimport { ProductRefinerValue } from '@msdyn365-commerce/retail-proxy';\r\ninterface IState {\r\n rating: boolean;\r\n activeRefiner: number;\r\n}\r\n\r\n/**\r\n *\r\n * SearchResultContainerView component\r\n * @extends {React.PureComponent<ISearchResultContainerViewProps>}\r\n */\r\n\r\nexport class SearchResultContainerView extends React.PureComponent<\r\n ISearchResultContainerViewProps & ISearchResultContainerProps<ISearchResultContainerData>,\r\n IState\r\n> {\r\n public _sortAndFilterContainerRef: React.RefObject<LabeledDropdown>;\r\n constructor(props: ISearchResultContainerViewProps & ISearchResultContainerProps<ISearchResultContainerData>) {\r\n super(props);\r\n this.state = {\r\n rating: false,\r\n activeRefiner: -1\r\n };\r\n this._sortAndFilterContainerRef = React.createRef<LabeledDropdown>();\r\n }\r\n public render(): JSX.Element {\r\n const { props } = this;\r\n const mobileView =\r\n props.context.request && props.context.request.device && props.context.request.device.Type === 'Mobile' ? true : false;\r\n const {\r\n SearchResultContainer,\r\n products,\r\n pagination,\r\n ProductsContainer,\r\n ProductSectionContainer,\r\n isMobile,\r\n modalToggle,\r\n searchResultModal,\r\n TitleViewProps,\r\n refineMenu,\r\n categoryHierarchy,\r\n sortByOptions,\r\n CategoryNavContainer,\r\n RefineAndProductSectionContainer,\r\n errorMessage\r\n } = this.props;\r\n let { choiceSummary } = this.props;\r\n choiceSummary = this._getChoiceSummary();\r\n if (isMobile) {\r\n return (\r\n <Module {...SearchResultContainer}>\r\n {this.renderCategoryHierarchy(categoryHierarchy)}\r\n {props.slots && props.slots.content && (\r\n <div>\r\n {props.slots.content.map((children: React.ReactNode, index: number) => {\r\n return (\r\n <div className='col-12' key={index}>\r\n {children}\r\n </div>\r\n );\r\n })}\r\n </div>\r\n )}\r\n {this.renderTitle(TitleViewProps)}\r\n {modalToggle}\r\n {TitleViewProps.title.titleCount}\r\n {this.createSearchResultModal(searchResultModal, refineMenu, sortByOptions, mobileView)}\r\n\r\n <Node {...ProductSectionContainer}>\r\n <div className='row search-result-row'>\r\n <div className='col-xs-6 col-lg-7 product-quantity'>\r\n <div className='filters-refine'>\r\n <i className='filter-icon' />\r\n {pagination}\r\n </div>\r\n <Node {...CategoryNavContainer}>{TitleViewProps && this.renderTitleCount(TitleViewProps)}</Node>\r\n </div>\r\n <div className='col-xs-6 col-md-6 col-lg-5'>{sortByOptions && this.renderSort(sortByOptions)}</div>\r\n </div>\r\n <Node {...ProductsContainer}>\r\n {errorMessage}\r\n {products}\r\n </Node>\r\n <div className='bottom-pagination-plp'>{pagination}</div>\r\n </Node>\r\n </Module>\r\n );\r\n }\r\n return (\r\n <Module {...SearchResultContainer}>\r\n <Node {...CategoryNavContainer}>{categoryHierarchy && this.renderCategoryHierarchy(categoryHierarchy)}</Node>\r\n {props.slots && props.slots.content && (\r\n <div>\r\n {props.slots.content.map((children: React.ReactNode, index: number) => {\r\n return (\r\n <div className='col-12' key={index}>\r\n {children}\r\n </div>\r\n );\r\n })}\r\n </div>\r\n )}\r\n <Node {...RefineAndProductSectionContainer}>\r\n {refineMenu && this.renderRefiner(refineMenu, mobileView)}\r\n {choiceSummary}\r\n <Node {...ProductSectionContainer}>\r\n <div className='ms-search-result-wrapper-title-choice-summary'>\r\n {TitleViewProps && this.renderTitle(TitleViewProps)}\r\n </div>\r\n {TitleViewProps.title.titleCount}\r\n <div className='ms-search-result-wrapper-sort-by-category'>{sortByOptions && this.renderSort(sortByOptions)}</div>\r\n <Node {...ProductsContainer}>\r\n {errorMessage}\r\n {products}\r\n </Node>\r\n {pagination}\r\n </Node>\r\n </Node>\r\n </Module>\r\n );\r\n }\r\n public componentDidMount = () => {\r\n this.hideRatingFromSortDropdown();\r\n };\r\n\r\n public componentDidUpdate = () => {\r\n this.hideRatingFromSortDropdown();\r\n };\r\n\r\n public hideRatingFromSortDropdown = () => {\r\n const sort = document.getElementById('categorySortByDropdown') as HTMLSelectElement;\r\n if (sort && sort.options) {\r\n for (let i = 0; i < sort.options.length; i++) {\r\n if (sort.options[i].value.includes('Rating')) {\r\n sort.options[i].style.display = 'none';\r\n }\r\n if (sort.options[i].value.includes('Price: Low to High')) {\r\n sort.options[i].style.display = 'none';\r\n }\r\n if (sort.options[i].value.includes('Price: High to Low')) {\r\n sort.options[i].style.display = 'none';\r\n }\r\n }\r\n }\r\n };\r\n\r\n public createSearchResultModal = (\r\n modalProps: ISearchResultModalViewProps,\r\n refineMenu: IRefineMenuViewProps,\r\n sortByDropDown: ISortByViewProps,\r\n mobileView: boolean\r\n ): JSX.Element => {\r\n return React.cloneElement(\r\n modalProps.modal,\r\n {},\r\n modalProps.modalHeader,\r\n this.createModalBody(modalProps, refineMenu, sortByDropDown, mobileView),\r\n modalProps.modalFooter\r\n );\r\n };\r\n\r\n private createModalBody = (\r\n props: ISearchResultModalViewProps,\r\n refineMenu: IRefineMenuViewProps,\r\n sortByDropDown: ISortByViewProps,\r\n mobileView: boolean\r\n ): JSX.Element | null => {\r\n if (sortByDropDown) {\r\n return React.cloneElement(props.modalBody, {}, this.renderSort(sortByDropDown), this.renderRefiner(refineMenu, mobileView));\r\n }\r\n return null;\r\n };\r\n\r\n private 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 <h5>{title.titleCount}</h5>\r\n </Node>\r\n );\r\n }\r\n return null;\r\n };\r\n\r\n private setRating = () => {\r\n return () => this.setState({ rating: !this.state.rating });\r\n };\r\n\r\n private renderRefiner = (props: IRefineMenuViewProps, isMobile: boolean): JSX.Element | null => {\r\n const { refiners, RefineMenuContainer, RefinerSectionContainer } = props;\r\n const { rating } = this.state;\r\n isMobile = this.props.isMobile;\r\n let { choiceSummary } = this.props;\r\n choiceSummary = this._getChoiceSummary();\r\n if (refiners) {\r\n return (\r\n <Node {...RefinerSectionContainer}>\r\n <Node {...RefineMenuContainer}>\r\n {!isMobile &&\r\n refiners.map((submenu, index) => submenu !== null && index < 6 && this.renderSubmenu(submenu, index, rating))}\r\n {!isMobile && refiners.length > 6 && !rating && (\r\n <div role='button' className='show-more' onClick={this.setRating}>\r\n {'Show all filters'}\r\n </div>\r\n )}\r\n </Node>\r\n <Node {...RefineMenuContainer}>\r\n {isMobile ? (\r\n <div className='ms-search-result__toggle'>\r\n <div className='ms-search-result__collection-count'>{this.props.TitleViewProps.title.titleCount}</div>\r\n <div className='ms-search-result__choice-summary'>{choiceSummary}</div>\r\n </div>\r\n ) : null}\r\n {!isMobile &&\r\n refiners.map(\r\n (submenu, index) => submenu !== null && index > 5 && rating && this.renderSubmenu(submenu, index, rating)\r\n )}\r\n {!isMobile && refiners.length > 6 && rating && (\r\n <div role='button' className='show-more' onClick={this.setRating}>\r\n {'Show less filters'}\r\n </div>\r\n )}\r\n {isMobile && refiners.map((submenu, index) => submenu !== null && this.renderSubmenu(submenu, index, rating))}\r\n </Node>\r\n </Node>\r\n );\r\n }\r\n return null;\r\n };\r\n\r\n private renderSort = (props: ISortByViewProps): JSX.Element | null => {\r\n const { SortingContainer, sortByDropDown } = props;\r\n if (sortByDropDown) {\r\n return <Node {...SortingContainer}>{sortByDropDown}</Node>;\r\n }\r\n return null;\r\n };\r\n\r\n // @ts-ignore\r\n private renderSubmenu = (submenu, index: number, rating: boolean) => {\r\n const subMenu = submenu && submenu.props;\r\n if (subMenu.productRefinerHierarchy.KeyName.toLowerCase() === 'color') {\r\n subMenu.productRefinerHierarchy.KeyName = 'Colour';\r\n }\r\n return subMenu.productRefinerHierarchy.KeyName.toLowerCase() !== 'rating' &&\r\n subMenu.productRefinerHierarchy.KeyName.toLowerCase() !== 'category' ? (\r\n <RefineSubmenu\r\n productRefinerHierarchy={subMenu.productRefinerHierarchy}\r\n selectedRefinerValues={subMenu.selectedRefinerValues}\r\n refineItemCommonProps={subMenu.refineItemCommonProps}\r\n minValueSliderThumbAriaLabel={subMenu.minValueSliderThumbAriaLabel}\r\n maxValueSliderThumbAriaLabel={subMenu.maxValueSliderThumbAriaLabel}\r\n key={index}\r\n onUpdateRefiners={subMenu.onUpdateRefiners}\r\n urlBuilder={subMenu.urlBuilder}\r\n isExpandedOnInitialLoad={false}\r\n tempRangeTypeTODO={subMenu.tempRangeTypeTODO}\r\n context={subMenu.context}\r\n moduleId={subMenu.moduleId}\r\n moduleTypeName={subMenu.moduleTypeName}\r\n className={index === 4 && !rating ? 'hidden' : ''}\r\n isDisabled={false}\r\n refinerId={index}\r\n toggleAllRefiners={this.toggleAllRefiners}\r\n isOpen={this.state.activeRefiner === index && this.state.activeRefiner !== -1 ? true : false}\r\n />\r\n ) : null;\r\n };\r\n\r\n private toggleAllRefiners = (activeRefiner: number) => {\r\n const currentRefinerState = this.state.activeRefiner;\r\n if (activeRefiner === currentRefinerState) {\r\n this.setState({ activeRefiner: -1 });\r\n } else {\r\n this.setState({ activeRefiner });\r\n }\r\n };\r\n private 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\n private 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 <h1>{title.titleText}</h1>\r\n </Node>\r\n );\r\n }\r\n return null;\r\n };\r\n private _getChoiceSummary = (): React.ReactNode | null => {\r\n const { resources, data, telemetry } = this.props;\r\n const selectedRefiners = (data.listPageState.result && data.listPageState.result.activeFilters) || [];\r\n const refinersData = data.refiners.result;\r\n if (!refinersData) {\r\n return null;\r\n }\r\n\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 refinerHierarchy={refinersData}\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 />\r\n );\r\n };\r\n private _onChoiceClicked = (notification: IChoiceSummaryClickNotification): void => {\r\n const { data, telemetry } = this.props;\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 }, 50);\r\n }\r\n\r\n data.listPageState.result.currentPageNumber = 0;\r\n data.listPageState.result.activeFilters = currentRefinementCriteria;\r\n };\r\n private _buildRefinerUrlForChoiceSummary = (selectedRefiner: ProductRefinerValue, isClearAll: boolean): string => {\r\n const { data, telemetry } = this.props;\r\n const fullUrl = this.props.context.request.url.requestUrl;\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 this.props.context.request.url.requestUrl.href;\r\n };\r\n}\r\n\r\nexport default SearchResultContainerView;\r\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 { IGroup, IGroupDelivery, IGroups } from '../../common/get-groups';\nimport { IOrderInformation } from '../../common/get-order-information';\nimport { ISalesLine } from '../../common/get-sales-line';\nimport { ISalesOrder } from './components/get-sales-order';\nimport { IHeader, IList, IOrderHistoryViewProps } from './order-history';\n\nexport const OrderHistoryOrderInfomation: React.FC<IOrderInformation> = ({\n orderInformationProps,\n salesId,\n receiptId,\n channelName,\n createdDate,\n count,\n amount,\n channelReferenceId\n}) => (\n <Node {...orderInformationProps}>\n {channelName}\n {salesId}\n {receiptId}\n {createdDate}\n {count}\n {amount}\n {channelReferenceId}\n </Node>\n);\n\nexport const OrderHistoryGroupDelivery: React.FC<IGroupDelivery> = ({\n deliveryProps,\n heading,\n count,\n processing,\n address,\n trackingInfo\n}) => (\n <Node {...deliveryProps}>\n {heading}\n {count}\n {processing}\n {address}\n {trackingInfo}\n </Node>\n);\n\nexport const OrderHistoryGroup: React.FC<IGroup> = ({ groupProps, delivery, salesLinesProps, salesLines }) => (\n <Node {...groupProps}>\n {delivery && <OrderHistoryGroupDelivery {...delivery} />}\n {salesLines && (\n <Node {...salesLinesProps}>\n {salesLines.map((salesLine: ISalesLine) => (\n <React.Fragment key={salesLine.data.salesLine.LineId}>{salesLine.salesLine}</React.Fragment>\n ))}\n </Node>\n )}\n </Node>\n);\n\nexport const OrderHistoryGroups: React.FC<IGroups> = ({ groupsProps, groups }) => (\n <Node {...groupsProps}>\n {groups.map((group: IGroup, index: number) => (\n <OrderHistoryGroup key={index} {...group} />\n ))}\n </Node>\n);\n\nexport const OrderHistoryHeader: React.FC<IHeader> = ({ headerProps, heading, orderCountLabel, extraActions }) => (\n <Node {...headerProps}>\n {heading}\n {orderCountLabel}\n {extraActions}\n </Node>\n);\n\nexport const OrderHistorySalesOder: React.FC<ISalesOrder> = ({\n salesOrderProps,\n orderInfomation,\n groups,\n orderDetailsLink,\n expandProductsButton\n}) => (\n <Node {...salesOrderProps}>\n {orderInfomation && <OrderHistoryOrderInfomation {...orderInfomation} />}\n {groups && <OrderHistoryGroups {...groups} />}\n {expandProductsButton}\n {orderDetailsLink}\n </Node>\n);\n\nexport const OrderHistoryList: React.FC<IList> = ({ listProps, salesOrders }) => (\n <Node {...listProps}>\n {salesOrders && salesOrders.map((salesOrder: ISalesOrder, index: number) => <OrderHistorySalesOder key={index} {...salesOrder} />)}\n </Node>\n);\n\nconst OrderHistoryView: React.FC<IOrderHistoryViewProps> = ({\n orderHistoryProps,\n header,\n alert,\n loading,\n emptyMessage,\n backToShoppingLink,\n list,\n table,\n moreButton\n}) => (\n <Module {...orderHistoryProps}>\n {header && <OrderHistoryHeader {...header} />}\n {loading}\n {alert && (\n <>\n {alert}\n {backToShoppingLink}\n </>\n )}\n {emptyMessage && (\n <>\n {emptyMessage}\n {backToShoppingLink}\n </>\n )}\n {list && <OrderHistoryList {...list} />}\n {table}\n {moreButton && moreButton}\n </Module>\n);\n\nexport default OrderHistoryView;\n","export * from './link';\r\nexport * from './product-search-result-items';\r\nexport * from './title';\r\nexport * from './separator';\r\nexport * from './range-refine-item';\r\nexport * from './refine-item';\r\nexport * from './refine-item-toggle-notification';\r\nexport * from './refine-item.props.common';\r\nexport * from './utilities';\r\nexport * from './choice-summary';\r\nexport * from './choice-summary.props';\r\nexport * from './modal';\r\nexport * from './refine-submenu';\r\nexport * from './error-message';\r\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 { Module, Node } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { IHelp, IOrderSummary, IPaymentMethods } from '../../common';\nimport { IGroup, IGroupDelivery, IGroups } from '../../common/get-groups';\nimport { IOrderInformation } from '../../common/get-order-information';\nimport { ISalesLine } from '../../common/get-sales-line';\nimport { ICheckoutOrderConfirmationViewProps } from './checkout-order-confirmation';\n\nexport const OrderConfirmationOrderInfomation: React.FC<IOrderInformation> = ({\n orderInformationProps,\n receiptEmail,\n createdDate,\n channelReferenceId\n}) => (\n <Node {...orderInformationProps}>\n {channelReferenceId}\n {receiptEmail}\n </Node>\n);\n\nexport const OrderConfirmationSalesLine: React.FC<ISalesLine> = ({ salesLineProps, salesLine, buyAgainButton }) => (\n <Node {...salesLineProps}>{salesLine}</Node>\n);\n\nexport const OrderConfirmationGroupDelivery: React.FC<IGroupDelivery> = ({\n deliveryProps,\n heading,\n count,\n processing,\n address,\n pickupDateTimeslot,\n trackingInfo\n}) => (\n <Node {...deliveryProps}>\n {heading}\n {count}\n {address}\n {pickupDateTimeslot}\n </Node>\n);\n\nexport const OrderConfirmationGroup: React.FC<IGroup> = ({ groupProps, delivery, salesLinesProps, salesLines }) => (\n <Node {...groupProps}>\n {delivery && <OrderConfirmationGroupDelivery {...delivery} />}\n {salesLines && (\n <Node {...salesLinesProps}>\n {salesLines.map(salesLine => (\n <OrderConfirmationSalesLine key={salesLine.data.salesLine.LineId} {...salesLine} />\n ))}\n </Node>\n )}\n </Node>\n);\n\nexport const OrderConfirmationGroups: React.FC<IGroups> = ({ groupsProps, groups }) => (\n <Node {...groupsProps}>\n {groups.map((group, index) => (\n <OrderConfirmationGroup key={index} {...group} />\n ))}\n </Node>\n);\n\nexport const OrderConfirmationOrderSummary: React.FC<IOrderSummary> = ({\n orderSummaryProps,\n heading,\n subtotal,\n shipping,\n tax,\n totalAmount,\n earnedPoints\n}) => (\n <Node {...orderSummaryProps}>\n {heading}\n {subtotal}\n {shipping}\n {tax}\n {totalAmount}\n {earnedPoints}\n </Node>\n);\n\nexport const OrderConfirmationPayment: React.FC<IPaymentMethods> = ({ paymentMethodsProps, title, methods }) => (\n <Node {...paymentMethodsProps}>\n {title}\n {methods}\n </Node>\n);\n\nexport const OrderConfirmationHelp: React.FC<IHelp> = ({ helpProps, needHelpLabel, helpLineNumberLabel, contactNumber }) => (\n <Node {...helpProps}>\n {needHelpLabel}\n {helpLineNumberLabel}\n {contactNumber}\n </Node>\n);\n\nconst OrderConfirmationView: React.FC<ICheckoutOrderConfirmationViewProps> = ({\n moduleProps,\n heading,\n backToShoppingLink,\n alert,\n loading,\n orderInfomation,\n orderSummary,\n payment,\n help,\n groups\n}) => {\n return (\n <Module {...moduleProps}>\n {heading}\n {alert}\n {loading}\n {orderInfomation && <OrderConfirmationOrderInfomation {...orderInfomation} />}\n {backToShoppingLink}\n {groups && <OrderConfirmationGroups {...groups} />}\n {orderSummary && <OrderConfirmationOrderSummary {...orderSummary} />}\n {payment && <OrderConfirmationPayment {...payment} />}\n {help && <OrderConfirmationHelp {...help} />}\n </Module>\n );\n};\n\nexport default OrderConfirmationView;\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 { IAny, ICoreContext, IGeneric, IImageSettings, IModule, ITelemetry } from '@msdyn365-commerce/core';\nimport { SalesLine, TenderType } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\nimport { format } from '@msdyn365-commerce-modules/utilities';\nimport groupBy from 'lodash/groupBy';\n\nimport { ISalesLine } from './get-sales-line';\n\nexport interface IModuleComponentProps extends IModule {\n config: {\n imageSettings?: IImageSettings;\n showShippingChargesForLineItems?: boolean;\n };\n}\n\nexport interface IPriceContext {\n id: string;\n typeName: string;\n context: ICoreContext<IGeneric<IAny>>;\n telemetry: ITelemetry;\n freePriceText: string;\n}\n\nexport const getTenderIdOperationIdMap = (tenderTypes: TenderType[]): object => {\n return tenderTypes.reduce((map, tenderType) => {\n if (tenderType.TenderTypeId) {\n map[tenderType.TenderTypeId] = tenderType.OperationId;\n }\n return map;\n }, {});\n};\n\nexport const countItems = (salesLines: SalesLine[]) => {\n return salesLines.reduce((count, salesLine) => {\n return count + (salesLine.Quantity || 0);\n }, 0);\n};\n\nexport const getSalesLinesByDelivery = (salesLines?: SalesLine[], pickupDeliveryModeCode?: string): SalesLine[] => {\n if (!salesLines || salesLines.length === 0) {\n return [];\n }\n return salesLines.filter(salesLine =>\n // IsPickUp ? getPickUp : getOthers\n pickupDeliveryModeCode && pickupDeliveryModeCode !== ''\n ? salesLine.DeliveryMode === pickupDeliveryModeCode\n : salesLine.DeliveryMode !== pickupDeliveryModeCode\n );\n};\n\nexport const defaultImageSettings: IImageSettings = {\n viewports: {\n xs: { q: 'w=80&h=80&m=6', w: 0, h: 0 },\n lg: { q: 'w=147&h=147&m=6', w: 0, h: 0 }\n },\n lazyload: true,\n cropFocalRegion: true\n};\n\nexport type IDeliveryType = 'pickUp' | 'ship' | 'carryOut' | 'email';\n\nexport type ISalesStatusCode = 'canceled' | 'readyForPickup' | 'pickedUp' | 'processing' | 'shipped' | 'unknown' | 'emailed';\n\nexport const getSalesStatusCode = (deliveryType: string, statusValue?: number, pickupMode?: string): ISalesStatusCode => {\n if (statusValue === 7) {\n return 'canceled';\n }\n\n if (deliveryType === 'pickUp') {\n switch (statusValue) {\n case 3:\n return 'readyForPickup';\n case 4:\n return 'pickedUp';\n default:\n return 'processing';\n }\n } else if (deliveryType === 'ship') {\n switch (statusValue) {\n case 3:\n return 'processing';\n case 4:\n return 'shipped';\n default:\n return 'processing';\n }\n } else if (deliveryType === 'email') {\n switch (statusValue) {\n case 3:\n return 'processing';\n case 4:\n return 'emailed';\n default:\n return 'processing';\n }\n } else if (deliveryType === 'carryOut') {\n return 'processing';\n } else {\n if (pickupMode !== undefined) {\n switch (statusValue) {\n case 3:\n return 'readyForPickup';\n case 4:\n return 'pickedUp';\n default:\n return 'processing';\n }\n }\n\n return 'unknown';\n }\n};\n\nexport type ITrackingId = string | 'unknown';\nexport type IAddressId = string | 'unknown';\n\nexport interface IGroupData {\n deliveryType: IDeliveryType;\n salesStatus: ISalesStatusCode;\n addressId: IAddressId | 'unknown';\n trackingId: ITrackingId | 'unknown';\n count: number;\n salesLines: ISalesLine[];\n}\n\nexport const groupSalesLines = (salesLines: ISalesLine[]): IGroupData[] => {\n const getGroupByDeliveryType = (items: ISalesLine[]) => groupBy(items, item => item.data.deliveryType);\n const getGroupBySalesStatusCode = (items: ISalesLine[]) => groupBy(items, item => item.data.salesStatus);\n const getGroupByTrackingId = (items: ISalesLine[]) => groupBy(items, item => item.data.salesLine.TrackingId || 'unknown');\n const getGroupByAddressId = (items: ISalesLine[]) =>\n groupBy(items, item => (item.data.salesLine.ShippingAddress && item.data.salesLine.ShippingAddress.RecordId) || 'unknown');\n\n const flatGroup: IGroupData[] = [];\n\n // 1) Group by delivery type\n const group = getGroupByDeliveryType(salesLines);\n\n // 2) Group by sales status code\n Object.entries(group).forEach(([deliveryType, groupByDeliveryType]) => {\n // @ts-expect-error\n group[deliveryType] = getGroupBySalesStatusCode(groupByDeliveryType);\n\n Object.entries(group[deliveryType]).forEach(([salesStatus, groupBySalesStatusCode]) => {\n // @ts-expect-error 3) Group by address id\n groupBySalesStatusCode[salesStatus] = getGroupByAddressId(groupBySalesStatusCode);\n\n Object.entries(groupBySalesStatusCode[salesStatus]).forEach(([addressId, groupByAddressId]) => {\n // @ts-expect-error 4) Group by address id\n groupByAddressId[addressId] = getGroupByTrackingId(groupByAddressId);\n\n // @ts-expect-error\n Object.entries(groupByAddressId[addressId]).forEach(([trackingId, groupByTrackingId]) => {\n flatGroup.push({\n // @ts-expect-error\n deliveryType,\n\n // @ts-expect-error\n salesStatus,\n addressId,\n trackingId,\n\n // @ts-expect-error\n count: countItems(groupByTrackingId.map(item => item.data.salesLine)),\n\n // @ts-expect-error\n salesLines: groupByTrackingId\n });\n });\n });\n });\n });\n\n return flatGroup;\n};\n\nexport const getDateTimeslot = (placeHolder: string, startDate: Date | undefined, endDate: Date | undefined, locale: string): string => {\n if (!startDate || !endDate) {\n return '';\n }\n\n const dateOptions: Intl.DateTimeFormatOptions = {\n timeZone: 'UTC'\n };\n const dateformatter = new Intl.DateTimeFormat(locale, dateOptions);\n const date = dateformatter.format(new Date(startDate));\n\n const timeslotOptions: Intl.DateTimeFormatOptions = {\n hour: 'numeric',\n minute: 'numeric',\n hour12: true,\n timeZone: 'UTC'\n };\n const timeslotformatter = new Intl.DateTimeFormat(locale, timeslotOptions);\n const timeslot = format(placeHolder, timeslotformatter.format(new Date(startDate)), timeslotformatter.format(new Date(endDate)));\n return `${date} ${timeslot}`;\n};\n","import { ITelemetry } from '@msdyn365-commerce/core';\r\nimport { ProductRefinerValue } 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 */\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((refinementCriterion: ProductRefinerValue) =>\r\n 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(productRefinerValue: ProductRefinerValue, refinementCriterion: ProductRefinerValue): 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[]\r\n): 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:\r\n (itemToggleNotification.rangeStart !== undefined && `${itemToggleNotification.rangeStart}`) ||\r\n selectedCriterion.LeftValueBoundString,\r\n RightValueBoundString:\r\n (itemToggleNotification.rangeEnd !== undefined && `${itemToggleNotification.rangeEnd}`) ||\r\n selectedCriterion.RightValueBoundString\r\n };\r\n updatedRefinementCriteria.push(next);\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:\r\n (itemToggleNotification.rangeStart !== undefined && `${itemToggleNotification.rangeStart}`) ||\r\n itemToggleNotification.productRefinerValue.LeftValueBoundString,\r\n RightValueBoundString:\r\n (itemToggleNotification.rangeEnd !== undefined && `${itemToggleNotification.rangeEnd}`) ||\r\n 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 (\r\n (itemToggleNotification.productRefinerValue.DataTypeValue === ProductRefinerValueDataTypeValue.List ||\r\n itemToggleNotification.productRefinerValue.DataTypeValue === ProductRefinerValueDataTypeValue.Boolean) &&\r\n itemToggleNotification.parentProductRefinerHierarchy.RefinerTypeValue === ProductRefinerTypeValue.Single\r\n ) {\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) =>\r\n isMatchingRefinementCriterion(child, criterion)\r\n );\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\r\n): 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}\r\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IComponentProps, msdyn365Commerce } from '@msdyn365-commerce/core';\nimport { Customer } from '@msdyn365-commerce/retail-proxy';\nimport { EnumExtensions } from '@msdyn365-commerce-modules/retail-actions';\nimport { Button, Popover } from '@msdyn365-commerce-modules/utilities';\nimport React from 'react';\n\nexport interface IOrderHistoryFilterResources {\n orderHistoryFilterYourOrderHistory: string;\n orderHistoryFilterOrganizationWide: string;\n}\n\nexport interface IOrderHistoryFilterData {\n customerInformation: Customer;\n}\n\nexport interface IOrderHistoryFilterProps extends IComponentProps<IOrderHistoryFilterData> {\n className: string;\n\n resources: IOrderHistoryFilterResources;\n\n currentState: OrderHistoryFilterState;\n onFilterStateChanged(state: OrderHistoryFilterState): void;\n}\n\nexport enum OrderHistoryFilterState {\n CurrentUser,\n OrganizationWide\n}\n\nconst getOrderHistoryFilterStateResources = (filterState: OrderHistoryFilterState, resources: IOrderHistoryFilterResources): string => {\n switch (filterState) {\n case OrderHistoryFilterState.CurrentUser:\n return resources.orderHistoryFilterYourOrderHistory;\n case OrderHistoryFilterState.OrganizationWide:\n return resources.orderHistoryFilterOrganizationWide;\n default:\n throw new Error('Failed to retrieve resource description for unknown order history filter state.');\n }\n};\n\n/**\n * On Click functionality.\n * @param onStateClick -Filter state function.\n * @param filterState -Order history filter state.\n * @returns On state click functionality.\n */\nconst onClickHandler = (onStateClick: (filterState: OrderHistoryFilterState) => void, filterState: OrderHistoryFilterState) => () => {\n onStateClick(filterState);\n};\n\nconst renderFilterStateItem = (\n filterState: OrderHistoryFilterState,\n resources: IOrderHistoryFilterResources,\n className: string,\n onStateClick: (filterState: OrderHistoryFilterState) => void\n): React.ReactNode => {\n const stateStringRepresentation = OrderHistoryFilterState[filterState];\n\n return (\n <button className={`${className}__item__${stateStringRepresentation}`} onClick={onClickHandler(onStateClick, filterState)}>\n {getOrderHistoryFilterStateResources(filterState, resources)}\n </button>\n );\n};\n\n/**\n * On Toggle Popover functionality.\n * @param setPopoverState -Set popover state function.\n * @param isPopoverState -Boolean value.\n * @returns Set toggle popover state functionality.\n */\nconst togglePopoverHandler = (setPopoverState: React.Dispatch<React.SetStateAction<boolean>>, isPopoverState: boolean) => () => {\n setPopoverState(!isPopoverState);\n};\n\nconst OrderHistoryFilter: React.FC<IOrderHistoryFilterProps> = (props: IOrderHistoryFilterProps) => {\n // Current version of filter doesn't include functionality for non b2b users or non-admin b2b users.\n if (!props.data.customerInformation.IsB2bAdmin) {\n return <div className={props.className} />;\n }\n\n const popoverRef = React.createRef<HTMLButtonElement>();\n const [popoverState, setPopoverState] = React.useState(false);\n\n const [filterState, setFilterState] = React.useState(props.currentState);\n\n const onFilterStateClick = (clickedState: OrderHistoryFilterState) => {\n setFilterState(clickedState);\n setPopoverState(false);\n props.onFilterStateChanged(clickedState);\n };\n\n return (\n <div className={props.className}>\n <Button\n className={`${props.className}__expand-filter-button`}\n innerRef={popoverRef}\n aria-expanded={popoverState}\n aria-describedby={props.className}\n onClick={togglePopoverHandler(setPopoverState, popoverState)}\n >\n {getOrderHistoryFilterStateResources(filterState, props.resources)}\n </Button>\n <Popover\n id={props.className}\n placement='bottom-end'\n isOpen={popoverState}\n target={popoverRef}\n toggle={togglePopoverHandler(setPopoverState, popoverState)}\n >\n {EnumExtensions.getEnumValues<OrderHistoryFilterState>(OrderHistoryFilterState).map(state => {\n return renderFilterStateItem(state, props.resources, props.className, onFilterStateClick);\n })}\n </Popover>\n </div>\n );\n};\n\nexport const OrderHistoryFilterComponent: React.FunctionComponent<IOrderHistoryFilterProps> = msdyn365Commerce.createComponent<\n // @ts-expect-error\n IOrderHistoryFilterProps\n>('OrderHistoryFilterComponent', { component: OrderHistoryFilter });\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport {\n CacheType,\n createObservableDataAction,\n IAction,\n IActionContext,\n IActionInput,\n ICommerceApiSettings\n} from '@msdyn365-commerce/core';\nimport { IQueryResultSettings, SalesLine } from '@msdyn365-commerce/retail-proxy';\nimport { getOrderShipmentsHistoryAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/CustomersDataActions.g';\nimport { OrderShipments, SimpleProduct } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\nimport {\n buildCacheKey,\n getOrganizationWideOrderHistory,\n GetOrganizationWideOrderHistoryInput,\n getSimpleProducts,\n ProductInput\n} from '@msdyn365-commerce-modules/retail-actions';\n\nimport { OrderHistoryFilterState } from '../components/order-history-filter';\n\n/**\n * IPaging Interface.\n */\nexport interface IPaging {\n top: number;\n skip: number;\n}\n\n/**\n * IOrderHistory Interface.\n */\nexport interface IOrderHistory {\n salesOrders: OrderShipments[];\n products: SimpleProduct[];\n nextPageToken?: string;\n}\n\n/**\n * IOrderHistoryResult Interface.\n */\nexport interface IOrderHistoryResult {\n salesOrders: OrderShipments[];\n nextPageToken?: string;\n}\n\n/**\n * Calls the Retail API and returns the products.\n * @param paging - Paging interface.\n * @param nextPageToken - Next Page Link.\n * @returns Collection of OrderShipments.\n */\nconst getOrderShipmentHistory = (paging: IPaging, nextPageToken?: string) => async (ctx: IActionContext): Promise<IOrderHistoryResult> => {\n const orderHistoryResults = getOrderShipmentsHistoryAsync(\n {\n callerContext: ctx,\n bypassCache: 'get',\n queryResultSettings: {\n Paging: {\n Top: paging.top,\n NextPageToken: nextPageToken\n }\n }\n },\n '',\n nextPageToken\n );\n\n const orderHistoryResponse = await orderHistoryResults;\n const nextLinkUrl = orderHistoryResults.metadata?.others?.nextLink;\n const nextPageLink = nextLinkUrl !== undefined ? new URL(nextLinkUrl).searchParams.get('nextPageToken') : undefined;\n const nextPage = nextPageLink !== null ? nextPageLink : undefined;\n return {\n salesOrders: orderHistoryResponse,\n nextPageToken: nextPage\n };\n};\n\n/**\n * Calls the Retail API and returns the products.\n * @param paging - Paging props.\n * @param nextPageToken - Next Page Link.\n * @returns Collections of order shipments.\n */\nconst getOrganizationWideOrderShipmentHistory = (paging: IPaging, nextPageToken?: string) => async (\n context: IActionContext\n): Promise<IOrderHistoryResult> => {\n const queryResultSetting: IQueryResultSettings = {\n Paging: {\n Top: paging.top,\n Skip: paging.skip,\n NextPageToken: nextPageToken\n }\n };\n\n const orgOrderHistoryResults = getOrganizationWideOrderHistory(new GetOrganizationWideOrderHistoryInput(queryResultSetting), context);\n\n const orgOrderHistoryResponse = await orgOrderHistoryResults;\n const nextLinkUrl = orgOrderHistoryResults.metadata?.others?.nextLink;\n const nextPageLink = nextLinkUrl !== undefined ? new URL(nextLinkUrl).searchParams.get('nextPageToken') : undefined;\n const nextPage = nextPageLink !== null ? nextPageLink : undefined;\n return {\n salesOrders: orgOrderHistoryResponse,\n nextPageToken: nextPage\n };\n};\n\n/**\n * Calls the Retail API and returns the products.\n * @param productIds - Collection of products id.\n * @param channelId - ChannelId number.\n * @returns Collections of simple products.\n */\nconst getProducts = (productIds: number[] = [], channelId?: number) => (ctx: IActionContext): Promise<SimpleProduct[]> => {\n const productInputs = productIds.map(\n productId => new ProductInput(productId, ctx.requestContext.apiSettings, channelId, undefined, ctx.requestContext)\n );\n return getSimpleProducts(productInputs, ctx);\n};\n\n/**\n * Action input.\n */\nexport class GetSalesOrderHistoryWithHydrationsInput implements IActionInput {\n public paging: IPaging;\n\n public filterState: OrderHistoryFilterState;\n\n public nextPageToken?: string;\n\n private readonly apiSettings: ICommerceApiSettings;\n\n constructor(paging: IPaging, apiSettings: ICommerceApiSettings, filterState?: OrderHistoryFilterState, nextPageLink?: string) {\n this.apiSettings = apiSettings;\n this.paging = paging;\n this.filterState = filterState || OrderHistoryFilterState.CurrentUser;\n this.nextPageToken = nextPageLink;\n }\n\n public getCacheKey = () => buildCacheKey('OrderHistory', this.apiSettings);\n\n /**\n * GetCacheObjectType.\n * @returns String.\n */\n public getCacheObjectType = () => 'OrderHistory';\n\n public dataCacheType = (): CacheType => 'none';\n}\n\n/**\n * Splits product ids from the given orders into lists by their channel id.\n * @param {OrderShipments[]} salesOrders Orders with the products.\n * @param {number} currentChannelId Channel id to use by default if no channel id is provided for a product.\n * @returns {{ [x: number]: number[] }} A dictionary where the key is a channel id,\n * and the value is a list of product ids in which all items correspond to the key channel id.\n * @remark The list of product ids is always non-empty.\n */\nconst splitProductsByChannelId = (salesOrders: OrderShipments[], currentChannelId: number): { [x: number]: number[] } => {\n const productIdsByChannel: { [x: number]: number[] } = {};\n\n salesOrders.forEach(salesOrder =>\n salesOrder?.SalesLines?.forEach(line => {\n const orderProductId = line.ProductId || 0;\n const orderChannelId = salesOrder.ChannelId || currentChannelId;\n if (!productIdsByChannel[orderChannelId]) {\n productIdsByChannel[orderChannelId] = [];\n }\n productIdsByChannel[orderChannelId].push(orderProductId);\n })\n );\n\n return productIdsByChannel;\n};\n\n/**\n * Get sales order with hydrations action.\n * @param input - GetOrderHistory hydration input.\n * @param context - Channel context.\n * @returns - Order History props.\n */\nexport async function getSalesOrderHistoryWithHydrationsAction(\n input: GetSalesOrderHistoryWithHydrationsInput,\n context: IActionContext\n): Promise<IOrderHistory> {\n if (!context) {\n throw new Error('getSalesOrderWithHydrationsAction - Action context cannot be null/undefined');\n }\n const channelId = context.requestContext.apiSettings.channelId;\n let salesOrders: OrderShipments[] = [];\n let nextPage: string | undefined = '';\n let orderHistoryResponse: IOrderHistoryResult;\n\n switch (input.filterState) {\n case OrderHistoryFilterState.CurrentUser:\n orderHistoryResponse = await getOrderShipmentHistory(input.paging, input.nextPageToken)(context);\n salesOrders = orderHistoryResponse.salesOrders;\n nextPage = orderHistoryResponse.nextPageToken;\n break;\n case OrderHistoryFilterState.OrganizationWide:\n orderHistoryResponse = await getOrganizationWideOrderShipmentHistory(input.paging, input.nextPageToken)(context);\n salesOrders = orderHistoryResponse.salesOrders;\n nextPage = orderHistoryResponse.nextPageToken;\n break;\n default:\n throw new Error('getSalesOrderWithHydrationsAction - Invalid OrderHistoryFilterState passed');\n }\n\n salesOrders.map(salesOrder => {\n return (salesOrder.SalesLines = salesOrder.SalesLines?.filter((saleline: SalesLine) => !saleline.IsVoided));\n });\n\n if (!salesOrders || salesOrders.length === 0) {\n return {\n salesOrders: [],\n products: [],\n nextPageToken: nextPage\n };\n }\n\n // Splits the data by channel ids so that the products from different channels can be processed separately.\n const productIdsByChannelId = splitProductsByChannelId(salesOrders, channelId);\n\n // Promise that retrieves information about the products for each channel id.\n // Note, the list of product ids should not be empty\n // as it will generate an empty request which will force the promise to fail.\n const getProductsPromise = Object.entries(productIdsByChannelId).map(([entryChannelId, entryProductIdsList]) => {\n const getProductsCall = getProducts(entryProductIdsList, Number(entryChannelId));\n return getProductsCall(context);\n });\n\n return Promise.all(getProductsPromise)\n .then(\n (productList): IOrderHistory => {\n const products = productList.reduce((memo, list) => {\n return [...memo, ...list];\n }, []);\n return {\n salesOrders,\n products,\n nextPageToken: nextPage\n };\n }\n )\n .catch(error => {\n context.telemetry.exception(error);\n context.telemetry.debug('Failed to get products');\n throw error;\n });\n}\n\nexport const getSalesOrderHistoryWithHydrationsActionDataAction = createObservableDataAction({\n id: '@msdyn365-commerce-modules/order-management/order-history/get-order-shipment-history',\n action: <IAction<IOrderHistory>>getSalesOrderHistoryWithHydrationsAction\n});\n\nexport default getSalesOrderHistoryWithHydrationsActionDataAction;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { getUrlSync, IActionContext } from '@msdyn365-commerce/core';\nimport {\n ChannelDeliveryOptionConfiguration,\n ChannelIdentity,\n Customer,\n format,\n OrderOriginator,\n OrderShipments,\n OrgUnitLocation,\n SimpleProduct\n} from '@msdyn365-commerce/retail-proxy';\nimport { ObjectExtensions } from '@msdyn365-commerce-modules/retail-actions';\nimport {\n Button,\n getPayloadObject,\n getTelemetryAttributes,\n INodeProps,\n ITelemetryContent,\n TelemetryConstant\n} from '@msdyn365-commerce-modules/utilities';\nimport { Observer } from 'mobx-react';\nimport * as React from 'react';\n\nimport { ExpandButtonState, SalesLineState } from '../../../common';\nimport { getGroups, IGroups } from '../../../common/get-groups';\nimport { getOrderInformation, getOrderInformationInput, IOrderInformation } from '../../../common/get-order-information';\nimport { ISalesLine } from '../../../common/get-sales-line';\nimport { getSalesLines, getSalesLinesInput, IGetSalesLinesInput } from '../../../common/get-sales-lines';\nimport { IOrderHistoryData } from '../order-history.data';\nimport { IOrderHistoryProps } from '../order-history.props.autogenerated';\n\nexport interface ISalesOrderProps extends IOrderHistoryProps<IOrderHistoryData> {\n salesOrder: OrderShipments;\n products: SimpleProduct[];\n channelIdentities?: ChannelIdentity[];\n orgUnitLocations?: OrgUnitLocation[];\n customer?: Customer;\n originator?: OrderOriginator;\n showChannelInfo?: boolean;\n telemetryContent?: ITelemetryContent;\n retailMultiplePickUpOptionEnabled?: boolean;\n channelDeliveryOptionConfig?: ChannelDeliveryOptionConfiguration;\n salesLinesLimit?: number;\n}\n\nexport interface ISalesOrder {\n salesOrderProps: INodeProps;\n orderInfomation: IOrderInformation;\n groups?: IGroups;\n orderDetailsLink: React.ReactNode;\n expandProductsButton?: React.ReactNode;\n}\n\n/**\n * Retrieves the url for order details page.\n * @param actionContext - Core action context.\n * @param salesOrder - Order information.\n * @returns Url to order details.\n */\nexport const getOrderDetailsPageUrl = (actionContext: IActionContext, salesOrder: OrderShipments): string => {\n const orderDetailsUrl = getUrlSync('orderDetails', actionContext) || '';\n const separator = orderDetailsUrl.includes('?') ? '&' : '?';\n if (salesOrder.SalesId) {\n // Redirect with sales order sales id\n return `${orderDetailsUrl}${separator}salesId=${salesOrder.SalesId}`;\n }\n\n // Redirect with sales order transaction id\n return `${orderDetailsUrl}${separator}transactionId=${salesOrder.TransactionId!}`;\n};\n\n/**\n * Updates product states to show all products.\n * @param expandButtonState - Expand button state.\n * @param productStates - Product states.\n * @returns Callback method.\n */\nconst onExpandProductsCallback = (expandButtonState: ExpandButtonState, productStates: SalesLineState[]) => () => {\n for (const productState of productStates) {\n productState.isHidden = false;\n }\n expandButtonState.extraProductsCount = 0;\n};\n\nexport const getSalesOrder = (input: ISalesOrderProps): ISalesOrder => {\n const {\n id,\n typeName,\n context,\n telemetry,\n products,\n salesOrder,\n showChannelInfo,\n channelIdentities,\n orgUnitLocations,\n customer,\n originator,\n telemetryContent,\n resources: { freePriceText, detailsAriaLabel, detailsLabel, orderItemLabel, orderItemsLabel },\n context: { actionContext },\n retailMultiplePickUpOptionEnabled,\n channelDeliveryOptionConfig\n } = input;\n\n const moduleName = 'ms-order-history';\n\n const priceContext = {\n id,\n typeName,\n context,\n telemetry,\n freePriceText\n };\n\n const salesOrderProps = { className: 'ms-order-history__sales-order', key: salesOrder.SalesId || salesOrder.TransactionId };\n\n const orderInfomationInput = getOrderInformationInput(\n input,\n moduleName,\n salesOrder,\n priceContext,\n channelIdentities,\n orgUnitLocations,\n customer,\n originator,\n showChannelInfo\n );\n\n const orderInfomation = getOrderInformation(orderInfomationInput);\n\n const salesLinesInput =\n products &&\n getSalesLinesInput(\n input,\n moduleName,\n salesOrder,\n products,\n priceContext,\n undefined,\n undefined,\n undefined,\n retailMultiplePickUpOptionEnabled,\n channelDeliveryOptionConfig\n );\n\n let salesLines: ISalesLine[] | undefined;\n let expandProductsButton: React.ReactNode;\n if (salesLinesInput) {\n const getSalesLinesInputProps: IGetSalesLinesInput = { ...salesLinesInput, imageOnly: true };\n if (!ObjectExtensions.isNullOrUndefined(input.salesLinesLimit)) {\n const extraProductsCount = getSalesLinesInputProps.salesLines.length - input.salesLinesLimit;\n getSalesLinesInputProps.salesLineStates = getSalesLinesInputProps.salesLines.map(\n (salesLine, index) => new SalesLineState(`${salesLine.LineId ?? ''}-${index}`, index >= input.salesLinesLimit!)\n );\n if (extraProductsCount > 0) {\n const expandButtonState = new ExpandButtonState(extraProductsCount);\n expandProductsButton = (\n <>\n <Observer>\n {() => {\n const text = format(\n input.resources.orderHistoryExpandProductsButtonText,\n expandButtonState.extraProductsCount\n );\n return (\n expandButtonState.extraProductsCount > 0 && (\n <Button\n className={`${moduleName}__sales-order__expand-products-button`}\n title={text}\n role='button'\n onClick={onExpandProductsCallback(expandButtonState, getSalesLinesInputProps.salesLineStates!)}\n aria-label={text}\n >\n {text}\n </Button>\n )\n );\n }}\n </Observer>\n </>\n );\n }\n }\n salesLines = getSalesLines(getSalesLinesInputProps);\n }\n\n expandProductsButton = (\n <>\n {expandProductsButton}\n <div className={`${moduleName}__sales-order__expand-products-button-wrapper`} />\n </>\n );\n\n const payLoad = getPayloadObject('click', telemetryContent!, TelemetryConstant.OrderDetails);\n const orderDetailsAttributes = getTelemetryAttributes(telemetryContent!, payLoad);\n\n const groups =\n salesLines &&\n getGroups({\n moduleName,\n salesLines,\n resources: { orderItemLabel, orderItemsLabel },\n retailMultiplePickUpOptionEnabled\n });\n\n const orderDetailsLink = (\n <Button\n href={getOrderDetailsPageUrl(actionContext, salesOrder)}\n role='button'\n aria-label={\n salesOrder.ChannelReferenceId && detailsAriaLabel\n ? detailsAriaLabel.replace('{orderId}', salesOrder.ChannelReferenceId)\n : ''\n }\n className='ms-order-history__btn-order-details'\n {...orderDetailsAttributes}\n >\n {detailsLabel}\n </Button>\n );\n\n return {\n salesOrderProps,\n orderInfomation,\n groups,\n orderDetailsLink,\n expandProductsButton\n };\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IComponentProps, ICoreContext } from '@msdyn365-commerce/core';\nimport { isMobile, VariantType } from '@msdyn365-commerce-modules/utilities';\nimport React from 'react';\n\n/**\n * Resources which are used in order history header.\n */\nexport interface IOrderHistoryTableHeaderResources {\n orderHistoryOrderNumberText: string;\n orderHistoryCreatedDateText: string;\n orderHistoryItemsText: string;\n orderHistoryTotalText: string;\n orderHistoryOriginText: string;\n orderPlacedByFullText?: string;\n}\n\n/**\n * Configuration of the component.\n */\nexport interface IOrderHistoryTableHeaderProps extends IComponentProps {\n context: ICoreContext;\n className: string;\n\n resources: IOrderHistoryTableHeaderResources;\n\n shouldShowChannelInfo: boolean;\n shouldShowOrderPlacedBy?: boolean;\n}\n\n/**\n * Renders desktop view cells.\n * @param props - Configuration of the module.\n * @returns List of cells for the header.\n */\nconst getDesktopHeaderCells = (props: IOrderHistoryTableHeaderProps) => {\n const { resources } = props;\n\n const columnWithNumberClassName = `${props.className}__row__column-with-number`;\n\n return (\n <>\n {props.shouldShowOrderPlacedBy && <th>{resources.orderPlacedByFullText}</th>}\n <th>{resources.orderHistoryOrderNumberText}</th>\n <th>{resources.orderHistoryCreatedDateText}</th>\n <th className={columnWithNumberClassName}>{resources.orderHistoryItemsText}</th>\n <th className={columnWithNumberClassName}>{resources.orderHistoryTotalText}</th>\n {props.shouldShowChannelInfo && <th>{resources.orderHistoryOriginText}</th>}\n <th />\n </>\n );\n};\n\n/**\n * Renders mobile view cells.\n * @param props - Configuration of the module.\n * @returns List of cells for the header.\n */\nconst getMobileHeaderCells = (props: IOrderHistoryTableHeaderProps) => {\n const { resources } = props;\n return (\n <>\n <th className={`${props.className}__row__mobile-cell`}>{resources.orderHistoryOrderNumberText}</th>\n <th />\n </>\n );\n};\n\n/**\n * Order history table header component.\n * @param props - Configuration of the component.\n * @returns React node with the header.\n */\nexport const OrderHistoryTableHeaderComponent: React.FC<IOrderHistoryTableHeaderProps> = (props: IOrderHistoryTableHeaderProps) => {\n const rowClassName = `${props.className}__row`;\n\n let headerCells: JSX.Element;\n const isMobileView = isMobile({ variant: VariantType.Viewport, context: props.context.request }) === 'xs';\n if (isMobileView) {\n headerCells = getMobileHeaderCells(props);\n } else {\n headerCells = getDesktopHeaderCells(props);\n }\n\n return (\n <thead className={props.className}>\n <tr className={rowClassName}>{headerCells}</tr>\n </thead>\n );\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport MsDyn365, { IComponentProps, ICoreContext, IDateFormatOptions, isOboRequest } from '@msdyn365-commerce/core';\nimport { ChannelIdentity, Customer, format, OrderOriginator, OrderShipments, OrgUnitLocation } from '@msdyn365-commerce/retail-proxy';\nimport { ArrayExtensions, StringExtensions } from '@msdyn365-commerce-modules/retail-actions';\nimport { Button, isMobile, VariantType } from '@msdyn365-commerce-modules/utilities';\nimport React from 'react';\n\nimport {\n getOrderChannelAddress,\n getOrderChannelName,\n getOrderChannelTypeValue,\n isOnlineStoreChannel\n} from '../../../../../common/get-order-information';\nimport { countItems } from '../../../../../common/utilities';\nimport { getOrderDetailsPageUrl } from '../../get-sales-order';\n\n/**\n * Data required to render each order history row.\n */\nexport interface IOrderHistoryTableRowData {\n salesOrder: OrderShipments;\n channelIdentities?: ChannelIdentity[];\n orgUnitLocations?: OrgUnitLocation[];\n customer?: Customer;\n originator?: OrderOriginator;\n}\n\n/**\n * Resources for order history table rows.\n */\nexport interface IOrderHistoryTableRowResources {\n orderHistoryViewDetailsButtonText: string;\n orderHistoryViewDetailsButtonAriaLabel: string;\n orderHistoryCreatedDateMobileDescriptionText: string;\n orderHistoryOrderNumberIsNotAvailable: string;\n onlineStoreChannelNameText: string;\n posChannelNameText: string;\n orderPlacedByFullText?: string;\n orderPlacedByYouText?: string;\n orderOnBehalfOfText?: string;\n}\n\n/**\n * Configuration for the order history rows.\n */\nexport interface IOrderHistoryTableRowProps extends IComponentProps<IOrderHistoryTableRowData> {\n context: ICoreContext;\n className: string;\n\n resources: IOrderHistoryTableRowResources;\n\n shouldShowChannelInfo: boolean;\n shouldShowOrderPlacedBy?: boolean;\n}\n\n/**\n * Formats amount.\n * @param context - Core context.\n * @param amount - Amount to display.\n * @param currencyCode - Currency for the amount.\n * @returns String value.\n */\nconst formatAmount = (context: ICoreContext, amount: number | undefined, currencyCode: string | undefined) => {\n if (amount === undefined) {\n return '';\n }\n return context.cultureFormatter.formatCurrency(amount, currencyCode);\n};\n\n/**\n * Formats date.\n * @param context - Core context.\n * @param date - Date to display.\n * @returns String value.\n */\nconst formatDate = (context: ICoreContext, date: Date | undefined) => {\n if (date === undefined) {\n return '';\n }\n\n const dateOptions: IDateFormatOptions = { year: 'numeric', month: 'numeric', day: 'numeric' };\n return context.cultureFormatter.formatDate(date, dateOptions);\n};\n\nconst getShortEllipsisText = (originalText: string, maxTextLength: number) => {\n const isRtl = document.body.parentElement?.getAttribute('dir') === 'rtl';\n return originalText.length > maxTextLength\n ? isRtl\n ? `…${originalText.substring(0, maxTextLength - 1)}`\n : `${originalText.substring(0, maxTextLength - 1)}…`\n : originalText;\n};\n\n/**\n * Renders rows for desktop view.\n * @param props - Configuration for the rows.\n * @returns A react node with a list of order history rows for desktop view.\n */\nexport const OrderHistoryDesktopTableRowCellComponent: React.FC<IOrderHistoryTableRowProps> = (props: IOrderHistoryTableRowProps) => {\n const {\n data: { salesOrder, channelIdentities, orgUnitLocations, customer, originator },\n resources: { orderPlacedByFullText, orderPlacedByYouText, orderOnBehalfOfText }\n } = props;\n\n const linkToOrderHistoryDetails = getOrderDetailsPageUrl(props.context.actionContext, props.data.salesOrder);\n\n const defaultCount = 0;\n const itemsCount = ArrayExtensions.hasElements(salesOrder.SalesLines) ? countItems(salesOrder.SalesLines) : defaultCount;\n const channelName = getOrderChannelName(salesOrder, channelIdentities);\n const channelAddress = getOrderChannelAddress(salesOrder, orgUnitLocations);\n const channelTypeValue = getOrderChannelTypeValue(salesOrder, channelIdentities);\n const isOnlineStore = isOnlineStoreChannel(channelTypeValue, channelAddress);\n\n const columnWithNumberClassName = `${props.className}__column-with-number`;\n\n let orderNumberCellText = props.resources.orderHistoryOrderNumberIsNotAvailable;\n if (!StringExtensions.isNullOrWhitespace(salesOrder.SalesId)) {\n orderNumberCellText = salesOrder.SalesId!;\n }\n\n const isYou =\n !isOboRequest(props.context.request) &&\n originator?.CustomerId &&\n originator?.CustomerName &&\n !originator?.StaffId &&\n !originator?.StaffName &&\n customer?.AccountNumber === originator?.CustomerId\n ? true\n : false;\n const isYouObo = !isYou && !isOboRequest(props.context.request);\n let placedByName =\n originator?.StaffId && originator.StaffName\n ? originator.StaffName\n : originator?.CustomerId && originator.CustomerName\n ? originator.CustomerName\n : '-';\n placedByName = `${placedByName} ${isYou ? orderPlacedByYouText : ''}`;\n const isOnBehalfOfOrder = isOnlineStore && originator?.StaffName && customer?.Name;\n const maxOrderTextLength = window.innerWidth > 700 ? 20 : 12;\n const placedByText = `${orderPlacedByFullText} ${placedByName}`;\n const onBehalfOfText = `${orderOnBehalfOfText} ${customer?.Name} ${isYouObo ? orderPlacedByYouText : ''}`;\n\n return (\n <>\n {props.shouldShowOrderPlacedBy && (\n <td>\n <span\n className={`${props.className}__placed-by`}\n data-title={`${placedByName} ${isOnBehalfOfOrder ? onBehalfOfText : ''}`}\n >\n {placedByName}\n {isOnBehalfOfOrder && (\n <>\n <br /> {getShortEllipsisText(onBehalfOfText, maxOrderTextLength)}\n </>\n )}\n </span>\n </td>\n )}\n <td>\n <span className={`${props.className}__order-number`}>{orderNumberCellText}</span>\n {isOnBehalfOfOrder && !props.shouldShowOrderPlacedBy && (\n <>\n <span className={`${props.className}__placed-by`} data-title={placedByText}>\n {getShortEllipsisText(placedByText, maxOrderTextLength)}\n </span>\n </>\n )}\n </td>\n <td>{formatDate(props.context, salesOrder.CreatedDateTime)}</td>\n <td className={columnWithNumberClassName}>{itemsCount}</td>\n <td className={columnWithNumberClassName}>{formatAmount(props.context, salesOrder.TotalAmount, salesOrder.CurrencyCode)}</td>\n {props.shouldShowChannelInfo && (\n <td>\n {channelName &&\n (channelAddress\n ? `${props.resources.posChannelNameText} ${channelName}`\n : props.resources.onlineStoreChannelNameText)}\n </td>\n )}\n <td>\n <Button\n className={`${props.className}__view-details-button`}\n href={linkToOrderHistoryDetails}\n title={props.resources.orderHistoryViewDetailsButtonText}\n aria-label={props.resources.orderHistoryViewDetailsButtonAriaLabel}\n >\n {props.resources.orderHistoryViewDetailsButtonText}\n </Button>\n </td>\n </>\n );\n};\n\n/**\n * Renders rows for mobile view.\n * @param props - Configuration for the rows.\n * @returns A react node with a list of order history rows for mobile view.\n */\nexport const OrderHistoryMobileTableRowCellComponent: React.FC<IOrderHistoryTableRowProps> = (props: IOrderHistoryTableRowProps) => {\n const {\n data: { salesOrder }\n } = props;\n\n const linkToOrderHistoryDetails = getOrderDetailsPageUrl(props.context.actionContext, props.data.salesOrder);\n\n const onClickViewDetails = React.useCallback(() => {\n if (MsDyn365.isBrowser) {\n window.location.href = linkToOrderHistoryDetails;\n }\n }, [linkToOrderHistoryDetails]);\n\n const orderNumber = StringExtensions.isNullOrWhitespace(salesOrder.SalesId)\n ? props.resources.orderHistoryOrderNumberIsNotAvailable\n : salesOrder.SalesId!;\n\n const dateText = format(\n props.resources.orderHistoryCreatedDateMobileDescriptionText,\n formatDate(props.context, salesOrder.CreatedDateTime)\n );\n\n const cellClassName = `${props.className}__mobile-cell`;\n\n return (\n <>\n <td className={cellClassName}>\n <div\n className={`${cellClassName}__open-details`}\n onClick={onClickViewDetails}\n onKeyPress={onClickViewDetails}\n role='button'\n tabIndex={0}\n >\n <span className={`${cellClassName}__mobile-order-id`}>{orderNumber}</span>\n <span className={`${cellClassName}__mobile-created-date`}>{dateText}</span>\n </div>\n </td>\n <td>\n <Button\n className={`${cellClassName}__view-details-button`}\n href={linkToOrderHistoryDetails}\n title={props.resources.orderHistoryViewDetailsButtonText}\n aria-label={props.resources.orderHistoryViewDetailsButtonAriaLabel}\n >\n {props.resources.orderHistoryViewDetailsButtonText}\n </Button>\n </td>\n </>\n );\n};\n\n/**\n * Renders order history rows.\n * @param props - Configuration for the rows.\n * @returns A react node with a list of order history rows.\n */\nexport const OrderHistoryTableRowComponent: React.FC<IOrderHistoryTableRowProps> = (props: IOrderHistoryTableRowProps) => {\n const isMobileView = isMobile({ variant: VariantType.Viewport, context: props.context.request }) === 'xs';\n\n return (\n <tr className={props.className}>\n {isMobileView ? (\n <OrderHistoryMobileTableRowCellComponent {...props} />\n ) : (\n <OrderHistoryDesktopTableRowCellComponent {...props} />\n )}\n </tr>\n );\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IComponentProps, ICoreContext } from '@msdyn365-commerce/core';\nimport { ChannelIdentity, Customer, OrderOriginator, OrgUnitLocation } from '@msdyn365-commerce/retail-proxy';\nimport React from 'react';\n\nimport { IOrderHistory } from '../../actions/get-order-shipment-history';\nimport { IOrderHistoryTableHeaderResources, OrderHistoryTableHeaderComponent } from './components/order-history-table-header-component';\nimport { IOrderHistoryTableRowResources, OrderHistoryTableRowComponent } from './components/order-history-table-row-component';\n\n/**\n * Interface with the data required for order history.\n */\nexport interface IOrderHistoryTableData {\n orderHistory: IOrderHistory;\n channelIdentities?: ChannelIdentity[];\n orgUnitLocations?: OrgUnitLocation[];\n customer?: Customer;\n originators?: OrderOriginator[];\n}\n\n/**\n * Resources needed to render order history table.\n */\nexport interface IOrderHistoryTableResources extends IOrderHistoryTableHeaderResources, IOrderHistoryTableRowResources {}\n\n/**\n * Configuration of order history table.\n */\nexport interface IOrderHistoryTableProps extends IComponentProps<IOrderHistoryTableData> {\n context: ICoreContext;\n className: string;\n\n resources: IOrderHistoryTableResources;\n\n shouldShowChannelInfo: boolean;\n shouldShowOrderPlacedBy?: boolean;\n}\n\n/**\n * Renders order history table.\n * @param props - Configuration for order history table.\n * @returns React node with the table.\n */\nexport const OrderHistoryTableComponent: React.FC<IOrderHistoryTableProps> = (props: IOrderHistoryTableProps) => {\n const rowClassName = `${props.className}__row`;\n const headerClassName = `${props.className}__header`;\n\n return (\n <table className={props.className}>\n <OrderHistoryTableHeaderComponent\n context={props.context}\n typeName={props.typeName}\n id={headerClassName}\n className={headerClassName}\n resources={props.resources}\n data={{}}\n shouldShowChannelInfo={props.shouldShowChannelInfo}\n shouldShowOrderPlacedBy={props.shouldShowOrderPlacedBy}\n />\n {props.data.orderHistory.salesOrders.map((salesOrder, index) => {\n return (\n <OrderHistoryTableRowComponent\n context={props.context}\n typeName={props.typeName}\n id={`${rowClassName}-${index}`}\n key={salesOrder.SalesId}\n className={rowClassName}\n resources={props.resources}\n data={{\n salesOrder,\n channelIdentities: props.data.channelIdentities,\n orgUnitLocations: props.data.orgUnitLocations,\n customer: props.data.customer,\n originator: props.data.originators?.find(\n o =>\n (salesOrder.SalesId && o.SalesId === salesOrder.SalesId) ||\n (salesOrder.TransactionId && o.TransactionId === salesOrder.TransactionId)\n )\n }}\n shouldShowChannelInfo={props.shouldShowChannelInfo}\n shouldShowOrderPlacedBy={props.shouldShowOrderPlacedBy}\n />\n );\n })}\n </table>\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 Msdyn365 from '@msdyn365-commerce/core';\nimport {\n Button,\n getPayloadObject,\n getTelemetryAttributes,\n getTelemetryObject,\n IModuleProps,\n INodeProps,\n IPayLoad,\n ITelemetryContent,\n TelemetryConstant\n} from '@msdyn365-commerce-modules/utilities';\nimport classname from 'classnames';\nimport { observable } from 'mobx';\nimport { observer } from 'mobx-react';\nimport * as React from 'react';\n\nimport { OrderOriginator, OrderShipments } from '@msdyn365-commerce/retail-proxy';\nimport { Label } from '../../common/label';\nimport {\n getSalesOrderHistoryWithHydrationsAction,\n GetSalesOrderHistoryWithHydrationsInput,\n IOrderHistory,\n IPaging\n} from './actions/get-order-shipment-history';\nimport { getOriginatorsAction, GetOrderOriginatorsInput } from '../../actions/get-sales-order-originators';\nimport { getSalesOrder, ISalesOrder } from './components/get-sales-order';\nimport { OrderHistoryFilterComponent, OrderHistoryFilterState } from './components/order-history-filter';\nimport { OrderHistoryTableComponent } from './components/table-view';\nimport { IOrderHistoryData } from './order-history.data';\nimport { IOrderHistoryProps } from './order-history.props.autogenerated';\n\n/**\n * Specifies different layouts for order history.\n */\nexport enum OrderHistoryViewMode {\n listView = 0,\n detailedView = 1\n}\n\nexport interface IHeader {\n headerProps: INodeProps;\n heading: React.ReactNode;\n orderCountLabel?: React.ReactNode;\n extraActions?: React.ReactNode;\n}\n\nexport interface IList {\n listProps: INodeProps;\n salesOrders: ISalesOrder[];\n}\n\nexport interface IOrderHistoryViewState {\n isDataReady: boolean;\n hasError: boolean;\n isLoading: boolean;\n isShowMoreButton: boolean;\n errorCode?: string;\n errorMessage?: string;\n}\n\nexport interface IOrderHistoryViewProps extends IOrderHistoryProps<IOrderHistoryData> {\n orderHistory: IOrderHistory;\n orderHistoryProps: IModuleProps;\n alert?: React.ReactNode;\n loading?: React.ReactNode;\n emptyMessage?: React.ReactNode;\n header: IHeader;\n backToShoppingLink?: React.ReactNode;\n list?: IList;\n table?: React.ReactNode;\n moreButton?: React.ReactNode;\n viewState: IOrderHistoryViewState;\n}\n\n/**\n *\n * OrderHistory component.\n * @extends {React.Component<IOrderHistoryProps<IOrderHistoryData>>}\n */\n@observer\nclass OrderHistory extends React.Component<IOrderHistoryProps<IOrderHistoryData>> {\n @observable private orderHistory!: IOrderHistory;\n\n @observable private viewState!: IOrderHistoryViewState;\n\n @observable private _viewMode: OrderHistoryViewMode;\n\n private originatorList!: OrderOriginator[];\n\n private filterState: OrderHistoryFilterState;\n\n private pageSize!: number;\n\n private paging!: IPaging;\n\n private readonly telemetryContent?: ITelemetryContent;\n\n private readonly payLoad: IPayLoad;\n\n constructor(props: IOrderHistoryProps<IOrderHistoryData>) {\n super(props);\n this.initState();\n this._viewMode = OrderHistoryViewMode.detailedView;\n this.filterState = OrderHistoryFilterState.CurrentUser;\n this.telemetryContent = getTelemetryObject(\n this.props.context.request.telemetryPageName!,\n this.props.friendlyName,\n this.props.telemetry\n );\n this.payLoad = getPayloadObject('click', this.telemetryContent, '');\n }\n\n public componentDidMount(): void {\n if (this.props.context.actionContext.requestContext.user.isAuthenticated) {\n this._updateOrderHistory();\n } else {\n this.viewState.isDataReady = true;\n }\n }\n\n public shouldComponentUpdate(nextProps: IOrderHistoryProps<IOrderHistoryData>, nextState: IOrderHistoryViewState): 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 {\n const {\n config: { heading, className, showChannelInfo, shouldShowCount },\n resources: {\n genericErrorMessage,\n noOrderHistoryLable,\n moreButtonText,\n backToShopping,\n orderCountLabel,\n ordersCountLabel,\n loadingLabel\n }\n } = this.props;\n const { salesOrders, products } = this.orderHistory;\n const { isDataReady, hasError, isShowMoreButton, isLoading } = this.viewState;\n const backToShoppingUrl = Msdyn365.getUrlSync('home', this.props.context.actionContext) || '';\n const channelIdentities = this.props.data.channels.result && this.props.data.channels.result.channelIdentities;\n const orgUnitLocations = this.props.data.orgUnitLocations.result && this.props.data.orgUnitLocations.result.orgUnitLocations;\n const customer = this.props.data.customerInformation && this.props.data.customerInformation.result;\n\n let viewProps: IOrderHistoryViewProps = {\n ...this.props,\n orderHistory: this.orderHistory,\n viewState: this.viewState,\n orderHistoryProps: {\n moduleProps: this.props,\n className: classname('ms-order-history', className)\n },\n header: {\n headerProps: { className: 'ms-order-history__header' },\n heading: heading && heading.text && (\n <Msdyn365.Text\n {...heading}\n className='ms-order-history__heading'\n text={heading.text}\n tag={heading.tag || 'h2'}\n editProps={{ onEdit: this.handleOrderHistoryHeadingChange, requestContext: this.props.context.request }}\n />\n ),\n extraActions: this.renderExtraActions()\n },\n backToShoppingLink: backToShoppingUrl && (\n <Button className='ms-order-history__btn-keep-shopping' href={backToShoppingUrl}>\n {backToShopping}\n </Button>\n )\n };\n\n if (hasError) {\n viewProps = {\n ...viewProps,\n alert: <Label className='ms-order-history__alert' label={genericErrorMessage} />\n };\n return this.props.renderView(viewProps) as React.ReactElement;\n }\n\n if (!isDataReady) {\n viewProps = {\n ...viewProps,\n loading: <Label className='ms-order-history__loading' label={loadingLabel} />\n };\n return this.props.renderView(viewProps) as React.ReactElement;\n }\n\n if (!salesOrders || salesOrders.length === 0) {\n if (this.viewState.errorCode === 'Microsoft_Dynamics_Commerce_Runtime_AuthorizationFailed') {\n viewProps = {\n ...viewProps,\n emptyMessage: <p className='ms-order-history__empty-message'>{this.viewState.errorMessage}</p>\n };\n } else {\n viewProps = {\n ...viewProps,\n emptyMessage: <p className='ms-order-history__empty-message'>{noOrderHistoryLable}</p>\n };\n }\n\n return this.props.renderView(viewProps) as React.ReactElement;\n }\n\n const _orderCountLabel = salesOrders.length === 1 ? orderCountLabel : ordersCountLabel;\n this.payLoad.contentAction.etext = TelemetryConstant.ViewMore;\n const viewMoreAttributes = getTelemetryAttributes(this.telemetryContent!, this.payLoad);\n\n const productsDetailedViewLimit = 5;\n\n viewProps = {\n ...viewProps,\n header: {\n ...viewProps.header,\n orderCountLabel: shouldShowCount ? (\n <span className='ms-order-history__order-count'>{`(${salesOrders.length} ${_orderCountLabel})`}</span>\n ) : (\n undefined\n ),\n extraActions: this.renderExtraActions()\n },\n table:\n this._viewMode === OrderHistoryViewMode.listView ? (\n <OrderHistoryTableComponent\n id={this.props.id}\n typeName={this.props.typeName}\n context={this.props.context}\n className='ms-order-history__table-list'\n shouldShowChannelInfo={this.props.config.showChannelInfo ?? false}\n shouldShowOrderPlacedBy={Msdyn365.isChannelTypeB2B(this.props.context.request) ?? false}\n data={{\n orderHistory: this.orderHistory,\n channelIdentities,\n orgUnitLocations,\n customer,\n originators: this.originatorList\n }}\n resources={this.props.resources}\n />\n ) : (\n undefined\n ),\n list:\n this._viewMode === OrderHistoryViewMode.detailedView\n ? {\n listProps: { className: 'ms-order-history__sales-order-list' },\n salesOrders: salesOrders.map(salesOrder =>\n getSalesOrder({\n ...this.props,\n products,\n salesOrder,\n channelIdentities,\n orgUnitLocations,\n showChannelInfo,\n customer,\n originator: this.originatorList.find(\n o =>\n (salesOrder.SalesId && o.SalesId === salesOrder.SalesId) ||\n (salesOrder.TransactionId && o.TransactionId === salesOrder.TransactionId)\n ),\n salesLinesLimit: productsDetailedViewLimit,\n telemetryContent: this.telemetryContent\n })\n )\n }\n : undefined,\n moreButton: isShowMoreButton && (\n <Button\n className={`ms-order-history__btn-more ${isLoading ? 'is-busy' : ''}`}\n {...viewMoreAttributes}\n disabled={isLoading}\n onClick={this.onMoreButtonClick}\n >\n {moreButtonText}\n </Button>\n )\n };\n\n return this.props.renderView(viewProps) as React.ReactElement;\n }\n\n public handleOrderHistoryHeadingChange = (event: Msdyn365.ContentEditableEvent) =>\n (this.props.config.heading!.text = event.target.value);\n\n private readonly onMoreButtonClick = () => {\n this.getOrderHistory();\n };\n\n private readonly renderExtraActions = () => {\n return (\n <>\n {this._renderOrderHistoryFilter()}\n {this._renderViewModes()}\n </>\n );\n };\n\n /**\n * Renders a filter for order history.\n * @returns A react node or undefined if customer info is not ready.\n */\n private readonly _renderOrderHistoryFilter = () => {\n return (\n this.props.data.customerInformation &&\n this.props.data.customerInformation.result && (\n <OrderHistoryFilterComponent\n id={this.props.id}\n typeName={this.props.typeName}\n context={this.props.context}\n className='ms-order-history__ms-order-history-filter'\n resources={this.props.resources}\n data={{ customerInformation: this.props.data.customerInformation.result }}\n currentState={this.filterState}\n onFilterStateChanged={this.onFilterStateChanged}\n />\n )\n );\n };\n\n /**\n * Renders view mode switches for order history.\n * @returns A react node.\n */\n private readonly _renderViewModes = () => {\n if (!this.props.config.isGridViewEnabled) {\n return null;\n }\n\n const viewModesClassName = 'ms-order-history__ms-order-history-view-modes';\n return (\n <div className={viewModesClassName}>\n <Button\n className={classname(\n `${viewModesClassName}__detailed-view`,\n this._viewMode === OrderHistoryViewMode.detailedView ? 'msc-view-modes__selected' : ''\n )}\n title={this.props.resources.orderHistoryDetailedViewModeAriaLabel}\n aria-label={this.props.resources.orderHistoryDetailedViewModeAriaLabel}\n role='button'\n onClick={this._setDetailedViewMode}\n />\n <Button\n className={classname(\n `${viewModesClassName}__list-view`,\n this._viewMode === OrderHistoryViewMode.listView ? 'msc-view-modes__selected' : ''\n )}\n title={this.props.resources.orderHistoryListViewModeAriaLabel}\n aria-label={this.props.resources.orderHistoryListViewModeAriaLabel}\n role='button'\n onClick={this._setListViewMode}\n />\n </div>\n );\n };\n\n private readonly initState = () => {\n this.orderHistory = {\n salesOrders: [],\n products: [],\n nextPageToken: ''\n };\n this.originatorList = [];\n this.viewState = {\n isDataReady: false,\n hasError: false,\n isShowMoreButton: (this.props.config.pageSize || 0) > 0,\n isLoading: false,\n errorCode: '',\n errorMessage: ''\n };\n this.pageSize = this.props.config.pageSize || 10;\n this.paging = {\n top: this.pageSize,\n skip: 0\n };\n };\n\n /**\n * Updates view mode to be list view.\n */\n private readonly _setListViewMode = () => {\n this._viewMode = OrderHistoryViewMode.listView;\n };\n\n /**\n * Updates view mode to be detailed view.\n */\n private readonly _setDetailedViewMode = () => {\n this._viewMode = OrderHistoryViewMode.detailedView;\n };\n\n private readonly onFilterStateChanged = (state: OrderHistoryFilterState) => {\n this.initState();\n this.filterState = state;\n this._updateOrderHistory();\n };\n\n /**\n * Retrieves the data and updates the view state.\n */\n private readonly _updateOrderHistory = () => {\n this.getOrderHistory()\n .then(() => {\n this.viewState.isDataReady = true;\n })\n .catch(() => {\n this.viewState.hasError = true;\n });\n };\n\n private readonly getOriginator = async (salesOrders: OrderShipments[]): Promise<void> => {\n if (Msdyn365.isUserTypeB2B(this.props.context.request)) {\n const actionContext = this.props.context.actionContext;\n let result: OrderOriginator[] | undefined;\n try {\n const salesIds = salesOrders.map(order => order.SalesId ?? '').filter(id => id !== '');\n const transactionIds = salesOrders.map(order => order.TransactionId ?? '').filter(id => id !== '');\n const originatorsInput = new GetOrderOriginatorsInput(transactionIds, salesIds, this.props.context.request.apiSettings);\n result = await getOriginatorsAction(originatorsInput, actionContext);\n } catch (error) {\n result = undefined;\n }\n if (result) {\n this.originatorList.push(...result);\n }\n }\n };\n\n private readonly getOrderHistory = async (): Promise<void> => {\n const actionContext = this.props.context.actionContext;\n const input = new GetSalesOrderHistoryWithHydrationsInput(\n this.paging,\n this.props.context.request.apiSettings,\n this.filterState,\n this.orderHistory.nextPageToken\n );\n\n try {\n this.viewState.isLoading = true;\n const response = await getSalesOrderHistoryWithHydrationsAction(input, actionContext);\n if (response) {\n const { products, salesOrders } = response;\n this.orderHistory.products.push(...products);\n this.orderHistory.salesOrders.push(...salesOrders);\n this.viewState.isShowMoreButton =\n this.viewState.isShowMoreButton && response.salesOrders.length > 0 && response.salesOrders.length === this.pageSize;\n this.paging.skip += this.pageSize;\n this.orderHistory.nextPageToken = response.nextPageToken;\n await this.getOriginator(salesOrders);\n }\n this.viewState.isLoading = false;\n\n await Promise.resolve();\n return;\n } catch (error) {\n this.viewState.isLoading = false;\n\n if (error?.error?.name === 'Microsoft_Dynamics_Commerce_Runtime_AuthorizationFailed') {\n this.viewState.errorCode = 'Microsoft_Dynamics_Commerce_Runtime_AuthorizationFailed';\n this.viewState.errorMessage = error.error?.name;\n return Promise.reject();\n }\n\n return Promise.reject();\n }\n };\n}\n\nexport default OrderHistory;\n"],"sourceRoot":""}