{"version":3,"sources":["webpack:///src/modules/fabrikam/views/components/promocode.component.tsx?7eef","webpack:///src/modules/header/header.view.tsx?40e5","webpack:///src/modules/fabrikam/views/components/cartlineitem.component.tsx?4b07","webpack:///src/modules/social-share-item/social-share-item.tsx?e01b","webpack:///./src/themes/elicit/views/smwe-search.view.tsx?6e1a","webpack:///src/modules/order-template-list/components/order-template-list.tsx?f2fd","webpack:///src/modules/order-template-list/components/orderTemplateList-status-message.tsx?dbea","webpack:///src/modules/video-player/video-player.tsx?cfb9","webpack:///src/common/rnrInterface.ts?25e5","webpack:///./src/themes/enoteca/views/smwe-search.view.tsx?5fcb","webpack:///./src/themes/generazioni/views/smwe-search.view.tsx?5efc","webpack:///./src/themes/blend/views/smwe-search.view.tsx?aee9","webpack:///src/modules/header/components/logo.tsx?be23","webpack:///src/modules/header/components/nav-icon.tsx?49a1","webpack:///src/modules/header/components/header-preferred-store.tsx?9138","webpack:///src/modules/header/header.tsx?4703","webpack:///src/modules/order-template/order-template.tsx?4281","webpack:///src/modules/ratings-histogram/component/components.tsx?2a0b","webpack:///src/modules/ratings-histogram/ratings-histogram.tsx?4c32","webpack:///src/modules/wishlist-items/components/wishlist-items-dimensions.tsx?671e","webpack:///src/modules/wishlist-items/components/wishlist-item.tsx?1fe2","webpack:///src/modules/wishlist-items/components/wishlist-items-status-message.tsx?7062","webpack:///src/modules/wishlist-items/wishlist-items.tsx?3721","webpack:///./src/themes/intrinsic-wine-co/views/smwe-search.view.tsx?d19d","webpack:///src/actions/inputs/report-review-concern-input.ts?c9d1","webpack:///src/actions/inputs/submit-helpfulness-vote-input.ts?cfb5","webpack:///src/actions/report-review-concern.ts?11eb","webpack:///src/actions/submit-helpfulness-vote.ts?be08","webpack:///src/modules/reviews-list/components/components.tsx?c96f","webpack:///src/modules/reviews-list/components/report-review-modal.tsx?22a9","webpack:///src/modules/reviews-list/components/review-card.tsx?2d16","webpack:///src/modules/reviews-list/reviews-list.tsx?b5d0","webpack:///src/order-summary-lineitem.tsx?86d9","webpack:///./src/themes/conn-creek/views/smwe-search.view.tsx?51c5","webpack:///./src/themes/fth/views/smwe-search.view.tsx?ea68","webpack:///src/modules/cart/components/cart-pick-up-in-store.tsx?f7bf","webpack:///src/modules/cart/components/cart-line-items.tsx?a1e3","webpack:///src/modules/cart/components/cart-line-groups.tsx?b88f","webpack:///src/modules/cart/utils/get-promotion-in-cart.ts?1379","webpack:///src/modules/cart/cart.tsx?f1c3","webpack:///src/modules/cart/components/cart-line-items-promotion.tsx?6882","webpack:///src/modules/product-collection/product-collection.view.tsx?9eb3","webpack:///src/search-state.ts?b5d7","webpack:///src/modules/buybox/utilities/error-utilities.ts?63c8","webpack:///src/modules/buybox/components/buybox-small-components.tsx?5a8f","webpack:///src/modules/buybox/components/buybox-find-in-store.tsx?24db","webpack:///src/modules/buybox/components/dropdown/dropdown.tsx?2922","webpack:///src/modules/buybox/components/buybox-product-configure.tsx?7d15","webpack:///src/modules/buybox/buybox.tsx?8cd9","webpack:///./src/themes/north-star/views/smwe-search.view.tsx?69ba","webpack:///./src/themes/stemichelle-new/views/smwe-search.view.tsx?e627","webpack:///./src/themes/colsolare/views/smwe-search.view.tsx?48e6","webpack:///src/modules/product-collection/product-collection.tsx?b9b8","webpack:///src/modules/cart/cart.view.tsx?394b","webpack:///./src/themes/stagsleap/views/smwe-search.view.tsx?1b17","webpack:///./src/themes/columbiacrest/views/smwe-search.view.tsx?d8b2","webpack:///src/modules/buybox/buybox.view.tsx?7b02","webpack:///src/modules/video-player/video-player.view.tsx?2e40","webpack:///src/modules/fabrikam/utilities/quantity/Quantity.tsx?f073","webpack:///./src/modules/smwe-search/actions/get-auto-suggest-suggestions.ts?69bf","webpack:///./src/modules/smwe-search/components/smwe-search.keywordsuggest.tsx?64dc","webpack:///./src/modules/smwe-search/components/smwe-search.productsuggest.tsx?ef4f","webpack:///./src/modules/smwe-search/components/smwe-search.categorysuggest.tsx?3470","webpack:///./src/modules/smwe-search/components/smwe-search.form.tsx?c8a2","webpack:///./src/modules/smwe-search/components/smwe-search.label.tsx?64d0","webpack:///./src/modules/smwe-search/smwe-search.tsx?1883","webpack:///src/modules/order-template/components/common/order-template-quantity.tsx?dfc0","webpack:///src/modules/order-template/components/order-template-lines.tsx?cdf6","webpack:///src/modules/order-template/components/order-template-lines-status-message.tsx?0022","webpack:///src/modules/order-template/components/order-template-table-heading.tsx?606c","webpack:///src/modules/order-template/components/order-template-actions.tsx?5f39","webpack:///src/modules/order-template/components/bulk-actions.tsx?f343","webpack:///src/modules/order-template/components/add-line/add-line.tsx?add3","webpack:///src/modules/order-template/components/add-line/spinner.tsx?28dd","webpack:///src/modules/order-template/components/add-line/dropdown.tsx?40af","webpack:///src/modules/order-template/components/add-line/not-found.tsx?00ed","webpack:///src/modules/order-template/components/add-line/product-configuration.tsx?ac81","webpack:///src/modules/order-template/components/add-line/product-list.tsx?5107","webpack:///src/actions/inputs/submit-user-review-input.ts?921c","webpack:///src/actions/submit-user-review.ts?d4c7","webpack:///src/common/review-modal.tsx?7ef9","webpack:///src/modules/search/search.view.tsx?e62d","webpack:///./src/themes/patzhall/views/smwe-search.view.tsx?b166","webpack:///src/modules/write-review/components/components.tsx?ead4","webpack:///src/modules/write-review/write-review.tsx?dea3","webpack:///./src/themes/emp/views/smwe-search.view.tsx?86f9","webpack:///./src/modules/smwe-search/smwe-search.view.tsx?7cda","webpack:///src/modules/order-template-list/components/create-order-template.tsx?81ed","webpack:///src/modules/order-template-list/order-template-list.tsx?bc4a","webpack:///src/modules/social-share-item/social-share-item.view.tsx?ce9b","webpack:///src/index.ts?c6ae","webpack:///src/modules/reviews-list/reviews-list.view.tsx?6dd9","webpack:///src/modules/wishlist-items/wishlist-items.view.tsx?caf1","webpack:///src/modules/order-template/order-template.view.tsx?f2c8","webpack:///./src/themes/spring-valley-vineyard/views/smwe-search.view.tsx?5fba","webpack:///src/modules/ratings-histogram/ratings-histogram.view.tsx?4481","webpack:///./src/themes/erath/views/smwe-search.view.tsx?b20a","webpack:///./src/themes/stemichelle/views/smwe-search.view.tsx?af1c","webpack:///src/modules/search/actions/get-auto-suggest-suggestions.ts?6ade","webpack:///src/modules/search/components/search.keywordsuggest.tsx?59ca","webpack:///src/modules/search/components/search.productsuggest.tsx?d6fa","webpack:///src/modules/search/components/search.categorysuggest.tsx?3bc4","webpack:///src/modules/search/components/search.form.tsx?3c4b","webpack:///src/modules/search/components/search.label.tsx?91cb","webpack:///src/modules/search/search.tsx?3f45","webpack:///src/modules/order-template-list/order-template-list.view.tsx?20f7","webpack:///src/modules/write-review/write-review.view.tsx?9069"],"names":["PromoCode","React","constructor","props","state","super","_onInputChange","e","error","target","value","this","setState","promoCodeInputValue","canApply","_applyPromotion","cartState","cart","appliedPromo","addPromoCode","promoCode","then","result","status","substatus","duplicatePromoCodeErrorText","invalidPromoCodeErrorText","catch","failedToAddPromoCodeErrorText","_renderForm","promoPlaceholderText","promoCodeApplyButtonText","attributes","getTelemetryAttributes","telemetryContent","payLoad","onSubmit","event","preventDefault","className","onChange","placeholder","Button","Object","title","onClick","disabled","_removePromotion","code","currentTarget","getAttribute","removePromoCodes","promoCodes","failedToRemovePromoCodeErrorText","_calculateDiscount","CartLines","length","discountAmount","line","DiscountLines","discountLine","DiscountCode","DiscountCost","_renderAppliedPromoCode","Coupons","promoCodTotalDiscount","reduce","count","coupon","Code","appliedPromoCodeHeadingText","PriceComponent","data","price","CustomerContextualPrice","context","id","typeName","map","ariaLabel","removePromoAriaLabelFormat","format","removePromoText","key","getPayloadObject","TelemetryConstant","ApplyPromoCode","isCollapseOpen","render","promoCodeHeadingText","_renderReactFragment","items","slot","index","headerView","HeaderTag","HeaderContainer","HeaderTopBarContainer","MobileMenuContainer","MobileMenuBodyContainer","MobileMenuLinksContainer","Divider","Module","Node","navIcon","logo","search","preferredStore","AccountInfoDropdownParentContainer","AccountInfoDropdownPopoverConentContainer","accountInfoDropdownButton","signOutLink","signInLink","accountLinks","link","telemetry","_renderDesktopAccountBlock","wishListIconDesktop","cartIcon","siteOptions","MobileMenuHeader","menuBar","wishListIconMobile","CartLineItemFunctions","Product","DimensionStrings","Dimensions","productDimension","DimensionTypeValue","RecordId","colorString","DimensionValue","Value","configString","sizeString","IsGiftCard","amountString","styleString","cartLine","OfferId","OfferName","resources","discountStringText","isSalesLine","PeriodicDiscount","EffectiveAmount","BasePrice","undefined","Percentage","inventoryInformationLabel","inventoryCssName","inventoryLabelClassName","pickupDeliveryModeCode","request","channel","PickupDeliveryModeCode","channelDeliveryOptionConfig","cartline","hasShippingMethod","DeliveryMode","PickupDeliveryModeCodes","some","deliveryMode","shippingChargeLines","ChargeLines","filter","chargeLine","IsShipping","freightFee","chargeTotal","CalculatedAmount","priceComponent","freePriceText","shippingChargesText","otherCharges","chargeline","otherCharge","Description","CartLine","productUrl","product","destructDimensionStrings","fallbackImageUrl","getFallbackImageUrl","ItemId","actionContext","requestContext","apiSettings","productDimensions","imageSettings","cropFocalRegion","renderDisountLines","renderInventoryLabel","renderShippingLabel","renderOtherCharges","toString","prodAttribute","productName","Name","newValue","quantityOnChange","_generateErrorMessage","errorMessage","Image","src","primaryImageUrl","fallBackSrc","altText","gridSettings","loadFailureBehavior","href","ArrayExtensions","hasElements","NetAmount","Price","NetAmountWithoutTax","NetPrice","showShippingChargesForLineItems","nodes","isOutOfStock","isQuantityEditable","push","quantityDisplayString","Quantity","max","maxQuantity","currentCount","currentQuantity","inputQuantityAriaLabel","decrementButtonAriaLabel","incrementButtonAriaLabel","LineId","isCartStateReady","isGiftCard","classNames","originalPriceText","currentPriceText","DiscountAmount","DiscountAmountWithoutTax","_generateQuantityandPrice","SocialShareItem","_getSocialShareItem","bind","viewprops","moduleProps","SocialShareItemElement","renderView","config","icon","MsDyn365","isBrowser","socialMedia","SocialMediaComponent","SocialMedia","Facebook","postUrl","document","URL","Twitter","Pinterest","Linkedin","Mail","form","SearchForm","FormWrapper","submitBtn","label","input","cancelBtn","_renderKeywordSuggestions","KeywordSuggest","UlKeyword","keywordSuggestions","text","_renderProductSuggestions","ProductSuggest","UlProduct","productSuggestions","item","LiProduct","AProduct","thumbnail","_renderCategorySuggestions","CategorySuggest","UlCategory","categorySuggestions","SearchView","Search","AutoSuggestAriaLabel","AutoSuggestAriaLabelText","searchText","AutoSuggest","autosuggestCategory","autosuggestKeyword","autosuggestProduct","OrderTemplateActions","onRemoveOrderTemplate","handlers","itemKey","OrderTemplateRender","Id","orderTemplate","removeFromOrderTemplateListText","orderTemplateState","name","enableImageProductLink","onDismiss","orderTemplateImage","_renderOrderTemplateImages","orderTemplateLines","orderTemplateAriaLabel","_renderAriaLabel","orderTemplateName","url","getUrlSync","separator","includes","_getOrderTemplatePageUrl","totalLines","color","addToCartButton","AddOrderTemplateToCartComponent","moduleTypeName","addToCartText","addToBagText","dialogStrings","removeButton","orderTemplateStatusMessage","isOpen","userMessage","Alert","statusCssString","toggle","defaultImageSettings","viewports","xs","q","w","h","lg","xl","lazyload","slice","fullProduct","getProductUrlSync","ProductDetails","PrimaryImageUrl","window","location","assign","OrderTemplateListStatusMessage","errorType","classnames","VideoPlayer","getTelemetryObject","telemetryPageName","friendlyName","options","video","playerResources","playAriaLabel","playLabel","pauseAriaLabel","pauseLabel","playingAriaLabel","playingLabel","pausedAriaLabel","pausedLabel","muteAriaLabel","muteLabel","unMuteAriaLabel","unMuteLabel","fullScreenAriaLabel","fullScreenLabel","exitFullScreenAriaLabel","exitFullScreenLabel","seekBarLabel","videoTimeDurationLabel","closedCaptionLabel","videoMetaData","videoId","duration","playTime","posterframeUrl","_links","binaryReferences","videoBinaryReferences","videoPlayerData","metaData","viewProps","player","editProps","Player","playerData","isEditor","params","TOGGLE_REVIEW_MODAL_BUTTON_ID","TOGGLE_EDIT_MODAL_BUTTON_CARD_ID","Logo","_renderLogo","linkUrl","destinationUrl","openInNewTab","_renderImage","Msdyn365","image","NavIcon","toggleNavBar","mobileHamburgerAriaLabel","isExpanded","targetId","observer","HeaderPreferredStore","handleClick","_findPreferreStoreOnClick","storeSelectorStateManager","slots","storeSelector","storeName","StoreName","headerPreferredStoreText","headerPreferredStoreAriaLabel","modules","storeSelectorId","keys","openDialog","showMapViewLink","onLocationSelected","orgUnitLocation","Promise","resolve","message","debug","Header","handleLinkTextChange","linkIndex","myAccountLinks","linkText","popOverRef","_toggleNavbar","_togglePopover","_keydown","mobileMenuCollapsed","signinPopoverOpen","customer","accountInformation","FirstName","componentDidMount","addEventListener","reaction","componentWillUnmount","removeEventListener","user","cartLabel","cartQtyLabel","logoLink","logoImage","headerClassName","cartIconSlot","_getSlot","menuBarSlot","searchSlot","siteOptionsSlot","preferredStoreSlot","WishListIconComponent","showButtonTooltip","wishlistTooltipText","CartIconComponent","tag","Modal","wrapClassName","ModalHeader","ModalBody","displayName","Popover","placement","_getSigninButton","_getSignOutButton","_getAccountInfoDropdownButton","_getAccountLinks","slotName","SignIn","signInLinkText","signInUrl","signInLinkAriaText","onTelemetryClick","SignOut","signOutLinkText","signOutUrl","signOutLinkAriaText","MyProfile","innerRef","cta","contentAction","etext","editableLink","role","additionalProperties","onTextChange","keyCode","__decorate","computed","OrderTemplateLines","_onRemoveSelection","removeSelectedFailureMessage","removeSelectedSuccessMessage","lines","productSelection","productListLines","isChecked","productListLine","productListId","ProductListId","removeProductListLinesAsync","callerContext","messageGlyph","reload","warning","substr","indexOf","productList","_onAddSelectionToBag","async","addedToCartFailureMessage","addedToCartSuccessMessage","getCartState","selectedLines","cartLines","productLine","ProductId","TrackingId","UnitOfMeasureSymbol","UnitOfMeasure","DefaultUnitOfMeasure","addCartLinesAsync","Version","trace","join","refreshCart","_getCurrentUrl","reqContext","requestUrl","_renderItemAddedToCartDialog","itemAddedToCartDialogData","ItemAddedToCartDialog","_generateItemAddedToCartDialogResources","modalOpen","isItemAddedToOrderTemplateOpen","onClose","_renderPagination","fullUrl","itemsPerPage","skipCount","_getCurrentPageNumber","totalItems","previousText","flipperPrevious","nextText","flipperNext","UncontrolledPagination","paginationAriaLabel","qsp","startingItem","previousAriaLabel","nextAriaLabel","_toggleDetailsDisplayed","isDetailsDisplayed","detailedProductView","OrderTemplateMobileLineView","_onDismiss","_changeQuantity","quantity","orderTemplateLinesData","orderLineIndex","findIndex","newProductListLine","prevQuantity","updateProductListLinesAsync","list","newLine","find","updatedLines","updatedOrderTemplate","ProductListLines","update","ActiveOrderTemplateLinesInput","_addItemToBag","maxQuantityLimitText","addProductToCartInput","addProductToCart","getPriceForSelectedVariant","PriceForSelectedVariantInput","channelId","priceResult","productPrice","AsyncResult","reject","replace","app","maxQuantityForProductListLineItem","_removeItemFromOrderTemplateLines","isAuthenticated","token","_renameTemplate","_removeTemplate","deleteAsync","deleteOrderTemplateFailedText","newLink","_getViewport","device","Type","innerWidth","sm","md","_viewport","_updateViewport","isConfirmAddSelectionToBagModalOpen","heading","emptyOrderTemplateLinesText","errorGettingOrderTemplateLines","errorProps","statusMessage","OrderTemplateLinesStatusMessage","Heading","orderTemplateResult","_isFirstPage","emptyViewProps","productsStatusMessage","ProductsTable","ProductsTableRow","ProductsTableHeading","_renderProductListHeader","orderLines","_renderProductList","callbacks","updateQuantity","debounce","orderActions","_renderOrderTemplateActions","pagination","itemAddedToCartDialog","bulkOrderLineActions","_getOrderTemplateLineActions","toggleDetailsDisplayed","isMobile","onSelect","updated","onSelectAll","productNumberText","productText","productUnitPriceText","productUOMText","productQuantityText","productActionsText","headers","productNumber","productUnitPrice","productUOM","productQuantity","productActions","clickHandler","OrderTemplateTableHeading","orderTemplateId","OrderTemplateBulkActions","onAddSelectionToBag","onRemoveSelection","isMinifiedView","_generateLinesAddedToCartDialogResources","viewCartButtonText","orderTemplateCloseButtonText","linesAddedToCartHeaderItemsOneText","linesAddedToCartHeaderLinesOneText","linesAddedToCartHeaderLinesFormatText","linesAddedToCartHeaderMessageText","itemAddedToCartHeaderItemOneText","itemAddedToCartHeaderItemFormatText","itemAddedToCartHeaderMessageText","addTemplateToBagButtonText","renameTemplateButtonText","deleteTemplateButtonText","closeWindowButtonText","addToCartFailureMessage","addToCartSuccessMessage","addToCartProcessMessage","orderTemplateActions","onRenameTemplate","onRemoveTemplate","renameOrderTemplateDialogStrings","_generateOrderTemplateNameDialogResources","linesAddedToCartDialogResources","OrderTemplateActionsView","orderTemplateHeaderLabel","renameOrderTemplateTitleText","orderTemplateTitleLabel","orderTemplateTitle","orderTemplateNameAriaLabel","orderTemplateDescription","defaultOrderTemplateName","orderTemplateButtonLabel","renameOrderTemplateButtonText","orderTemplateCancelButtonLabel","cancelBtnLabel","query","skip","priceFree","addOrderTemplateItemToBagButtonText","removeItemFromOrderTemplateButtonText","productDimensionTypeColor","productDimensionTypeSize","productDimensionTypeStyle","deleteButtonText","currentProductProps","orderTemplateLine","ProductPrice","moduleId","onAddToBag","onRemoveItem","onChangeQuantity","removeFromOrderTemplateLinesText","addToBagButtonText","OrderTemplateLineView","observable","action","HistogramItems","ratingsSummary","totalRatingsCount","renderItem","star5Count","star4Count","star3Count","star2Count","star1Count","stars","totalCount","percentage","formattedPercent","Intl","NumberFormat","locale","style","barItemAriaLabel","starLabel","bar","Progress","buttonProps","AverageRatingNumber","summary","averageRating","TotalReviews","RatingsHistogram","handleHeadingChange","selectFilterBy","ratingCount","completeClass","classname","histogramItems","RatingComponent","avgRating","averageRatingAriaLabel","readOnly","hideCount","averageNumber","totalReviews","ratingsSummaryProps","onEdit","histogramProps","filterKey","createRatingsReviewsStateInput","WishlistItemDimension","dimensionType","dimensionValue","WishListItemActions","onAddToCart","_renderProductImage","fallbackImage","_renderPrice","_renderProductDimensions","dimension","type","formattedPrice","dimensions","cultureFormatter","formatCurrency","CurrencyCode","WishlistItemsStatusMessage","WishlistItems","_renderHeading","_addItemToCart","productAvailability","productInventoryInformation","_getProductInventory","isOrderQuantityLimitsFeatureEnabledInHq","featureState","IsEnabled","defaultOrderQuantityLimitsFeatureConfig","platform","enableDefaultOrderQuantityLimits","customerInfo","customerInformation","isOrderQuantityLimitsFeatureEnabledInSiteSettings","IsB2b","isOrderQuantityLimitsFeatureEnabled","emailDeliveryModeCode","EmailDeliveryModeCode","deliveryOptions","getDeliveryOptionsAsync","queryResultSettings","enableStockCheck","availableQuantity","ProductAvailableQuantity","AvailableQuantity","orderQuantityLimitsFeatureIsEnabled","isAddEmailDeliveryItemToCart","DeliveryOptions","productId","curQuantity","maxQtyLimitReachedMessage","_getInventoryValueMessage","errorDetails","LocalizedMessage","_removeItemFromWishlist","wishlists","userToken","wishlistLineId","_getWishlistLineIdFromProductId","removeLinesAsync","commerceList","castCommerceList","createGetByCustomerInput","getItemsInWishlists","ActiveWishlistInput","products","castSimpleProducts","_inventoryLabel","StockLevelLabel","_inventoryClassName","StockLevelCode","toLowerCase","_isProductInStock","productResult","IsProductAvailable","CommerceListLines","foundWishlistItem","commerceListLine","emptyWishlistText","wishlistErrorGettingWishlist","productsList","Products","ProductDimensions","addToCartButtonText","outOfStockText","removeButtonText","productDimensionTypeAmount","isInStock","removeFromWishlistText","wishlistState","productAttributes","isServiceItem","ItemTypeValue","productImage","productLink","entireProductLink","productAriaLabel","inventoryInformation","productStatusMessage","WishlistItem","maxQuantityForLineItem","maxQuantityForCartLineItem","minInventory","Math","min","productInventoryCollection","ReportReviewConcernInput","reviewId","tenantId","concernCategory","authToken","serviceEndpoint","getCacheKey","getCacheObjectType","dataCacheType","SubmitHelpfulnessVoteInput","isHelpful","createObservableDataAction","ctx","inputIsValid","Error","requestBody","requestHeader","Authorization","sendRequest","response","exception","ReviewCount","currentPage","reviewsCount","reviewsShownOnEachPage","pageReviewCountText","_getReviewStartNumber","_getReviewEndNumber","PageControls","Next","nextAttribute","Previous","previousAttribute","_hasPreviousPage","_getPreviousPageData","_paginationAriaLabel","pageReviewAriaLabel","previousButtonText","_hasNextPage","_getNextPageData","nextButtonText","_getPagesCount","_getReviewsShown","ceil","isNextPage","page","pageModifier","pageReviewCount","updateReviews","selectedSortByOption","selectedFilterByOption","reportConcernDropdownOptions","radioPairs","pairs","option","inputId","checked","reportedKey","onRadioChange","htmlFor","rating","review","reviewRatingNarratorText","parentId","parentType","voteHelpfulButton","isVoted","i","votedReviews","approved","isVotedFor","isDisabled","isUserReview","yesButtonText","noButtonText","voteCount","helpfulPositive","helpfulNegative","updateReviewHelpfulness","editButton","toggleWriteReviewModal","editReviewCardText","renderDate","date","DateTimeFormat","month","day","year","Date","reportToggle","reportConcernText","reportedReviews","reportedText","ref","reportedReviewId","returnRef","toggleReportReviewModal","ReviewsList","sortByDropdownOptions","mostHelpfulSortOptionText","mostRecentSortOptionText","highestRatedSortOptionText","lowestRatedSortOptionText","filterByDropdownOptions","allRatinsFilterByOptionText","fiveStarFilterByOptionText","fourStarFilterByOptionText","threeStarFilterByOptionText","twoStarFilterByOptionText","oneStarFilterByOptionText","_userReview","userReview","_reviewCard","_reviewCards","reviewList","reviewElements","isTakenDown","isPublished","cardProps","userName","submittedDateTime","reviewTitle","reviewText","ratingHelpfulLabel","wasReviewHelpfulText","like","dislike","edit","report","responseName","userResponse","responderName","responseText","responseDate","cardBodyProps","responseProps","reviewProps","controlsProps","headerProps","ReviewCard","_userReportModalToggle","reportingReviewId","_toggleReviewModal","_onReportModalOpen","updateReviewHelpfulnessVote","_userReviewModal","ReviewModal","isReviewModalOpen","userReviewRating","userReviewTitle","userReviewText","onModalToggle","onTitleChange","_onTitleChange","_onTextChange","onRatingChange","_onRatingChange","onReviewComplete","_onReviewComplete","renderContextId","_userReviewModalToggle","hasError","hasReviewError","reviewsListCallbacks","updateReviewTitle","updateReviewText","updateRating","isSuccess","_reportReviewModal","SubmitReview","submitReviewAttribute","SuccessButton","successAttribute","Cancel","cancelAttribute","reportSpamText","offensiveContentText","profanityContentText","modal","applicationNode","returnFocusRef","modalHeader","modalFooter","ModalFooter","modalBody","header","headerSubmitted","feedbackThankYouText","cancelButton","cancelReportReviewText","submitButton","reportReview","reportReviewButtonText","succesfulButton","okReportReviewText","reportMessage","reportModalMessage","reportSubmittedMessage","radioButtons","errorMessageText","ReportReviewModal","isReportModalOpen","_onReportModalClose","_onRadioChange","_reportReview","hasReportError","reported","_reportReviewCallback","reportReviewConcern","getRnrPartnerId","getUserToken","getRnrAuthEndpointId","_value","reportedReview","updateSortByDropdown","notification","selectedOption","isFilterApplied","updateFilterByDropdown","skipItems","getSelectedProductIdFromActionInput","getReviewsForGivenProduct","GetProductReviewsInput","getRnrEndpointId","pagingInfo","listOfReviews","_updateVoteUi","alreadyExists","concat","submitHelpfulnessVote","onReviewSubmitted","isSuccessful","submitReview","toggleModal","toggleReportModal","showSpinner","reviewsList","ratingsReviewsState","filterKeyValue","Number","dropdownItemsCount","isNaN","filterByOption","selectedIndex","reviewModal","reportReviewModal","filterByDropdown","LabeledDropdown","labelText","filterByDropdownText","dropdownId","dropdownOptions","onSelectOption","controlledByParent","sortByDropdown","sortByDropdownText","reviewCount","refineReviewsProps","reviewsListProps","reviewCards","pageControls","noReviewsMessage","noReviewsWithFilterMessage","noReviewsWithSelectedFilterMessage","sortByOptions","filterByOptions","OrderSummaryLine","toBeCalculatedText","freeText","cssLabel","_buildOrderSummarySection","_computedLoyaltyAmount","checkoutState","loyaltyAmount","getDeliveryMode","featureSate","pickupDeliveryMode","dM","OrderSummary","SubtotalAmount","TaxAmount","TotalAmount","OtherChargeAmount","canShip","hasDeliveryMethod","channelConfiguration","retailMultiplePickUpOptionEnabled","deliveryModes","ShippingChargeAmount","getDeliveryConfiguration","reactNodes","subtotal","subTotalLabel","tax","taxLabel","orderTotal","orderTotalLabel","otherChargeLabel","shipping","shippingLabel","giftCardAmount","giftCardTotalValue","giftCardExtends","giftCard","Balance","amount","_computeGiftCardAmount","totalAmountAfterGiftCard","loyalty","loyaltyLabel","giftcardLabel","totalDiscounts","totalDiscountsLabel","PickUpInStore","_toggleBOPIS","isBopisSelected","storeSelectorModuleId","alreadySelectedLocation","OrgUnitNumber","FulfillmentStoreId","updateCartLinePickupLocation","cartLineId","locationChangedHandler","_onLocationChangedCallback","ShippingAddress","clearCartLinePickupLocation","_getOrgUnitName","fulfillmentStoreId","orgUnitLocations","foundLocation","OrgUnitName","toggleBopis","defaultComponent","shipItText","pickupInStoretext","changeStoreText","orgUnitName","bopisSelected","toggleBOPIS","_renderShippingMethod","shipitText","pickUpInStoreText","deliveryOption","pickupStore","delivery","_getDeliveryOption","ContainerProps","assembleCartlines","cartlines","_getProduct","foundProductAvailability","foundProductDeliveryOption","productAvailabilites","InventLocationId","WarehouseId","productDeliveryOptions","foundProductDeliveryOptions","removeItemClickHandler","moveToWishlistSuccessHandler","addToOrderTemplateButtonText","addToOrderTemplateDialogResources","createOrderTemplateDialogResources","itemAddedToOrderTemplateDialogResources","duplicateItemsWhenAddingToOrderTemplateDialogResources","addToWishlistButtonText","removeFromWishlistButtonText","orderTemplates","defaultWishlistName","nameOfWishlist","maxCartlineQuantity","isStockCheckEnabled","productMaxQuantity","lineMaxQuantity","_getCartItemMaxQuantity","isQuantityLimitsFeatureEnabled","Behavior","MaximumQuantity","ObjectExtensions","isNullOrUndefined","lineIndex","finalErrorMessage","includeErrors","outOfRangeOneText","outOfRangeFormatText","cartlinesErrors","LineIndex","forEach","DataValidationFailure","ErrorContext","_getErrorMessage","payload","TelemetryEvent","RemoveFromCart","inventoryLbl","inventoryCode","isCustomPriceSelected","CartLineItemComponent","updateCartLinesQuantitySuccessHandler","pickUpInStore","pickitUpText","remove","addToWishlist","AddToWishlistComponent","showButtonText","showStatusMessage","showRemoveButton","onSuccess","addToOrderTemplate","AddToOrderTemplateComponent","_assembleNode","CartLineGroupItems","getGroupByStorePickup","groupBy","groupDelivery","cartLinesGroup","entries","deliveryType","groupByDeliveryType","carLineViewProps","_assembleGroupCartlines","getPromotionData","promotionData","getPromotionOptionsForCartLineItems","PromotionOptionsForCartLineItems","promotionOptions","Cart","Component","showPromotionDialog","promotionPopupId","promotionLinkClick","promotionCloseButtonclick","_hidePromotionDialog","_getImageSettings","_removeItemFromCartHandler","cartlineToRemove","cartLineIds","removeCartLines","_validateCart","_moveToWishlistSuccessHandler","_updateCartlineQuantity","cartlineToUpdate","newQuantity","updateCartLineQuantity","_fulfillmentStoreIdUpdated","_getOrderQuantityLimitsFeatureFlag","showAvailablePromotions","guestCheckoutUrl","backToShoppingUrl","checkoutURL","_getCheckoutURL","isCartEmpty","_getCartLines","RetailMulitplePickupFeatureState","_getCartLinesGroup","Checkout","checkoutBySignInAttributes","GuestCheckout","checkoutByGuestAttributes","BackToShopping","backtoShoppingAttributes","hasErrors","cartTitle","CartlinesWrapper","OrderSummaryWrapper","OrderSummaryItems","_getPromoCode","_getPromotions","mulitplePickUpEnabled","orderSummaryHeading","orderSummaryTitle","orderSummaryLineitems","_getOrderSummaryLineItems","checkoutAsSignInUserButton","checkoutButtonTitle","checkoutAsGuestButton","guestCheckoutButtonTitle","backToShoppingButton","backToShoppingButtonTitle","createTemplateFromCartButton","_displayAddCartToTemplate","SaveCartToOrderTemplateComponent","_generateAddToOrderTemplateDialogResources","linesAddedToOrderTemplateDialogResources","_generateLinesAddedToOrderTemplateDialogResources","createOrderTemplateFromCartButton","waitingComponent","Waiting","cartLoadingStatus","cartLoadingErrorMessage","cartDataResult","isEmpty","OrderSummaryErrors","_getOrderSummaryErrors","RetailB2BEcommerceFeatureState","showPromotionPopup","promotions","promotionLinkText","promotionPopupHeading","onCloseButtonClick","onSeeAllClick","titleId","promotionMessageWrapper","promotionMessage","Fragment","promotionStringHeading","promotionSeeAllLink","promotionDialog","_promotion","Promotion","cartPromotions","promotionCloseButtonAriaLabel","allErrors","fullError","Wrapper","assertive","outOfStockErrorMessageHeader","errors","itemsWithCountLabel","estimatedShippingLabel","estimatedTaxLabel","yetToBeCalculatedText","PromoCodeComponent","collapseTimeOut","duplicatePromotionErrorText","addToOrderTemplateHeader","noOrderTemplatesMessage","noOrderTemplatesDescription","createAnOrderTemplateButtonText","createNewOrderTemplateButtonText","cancelOrderTemplateCreationButtonText","selectTemplatesText","addToTemplateButtonText","lineItemsText","_generateItemAddedToOrderTemplateDialogResources","viewOrderTemplateButtonText","continueShoppingButtonText","itemAddedToOrderTemplateHeaderItemOneText","itemAddedToOrderTemplateHeaderItemFormatText","itemAddedToOrderTemplateHeaderMessageText","linesAddedToOrderTemplateHeaderItemsOneText","linesAddedToOrderTemplateHeaderItemsFormatText","linesAddedToOrderTemplateHeaderLinesOneText","linesAddedToOrderTemplateHeaderLinesFormatText","linesAddedToOrderTemplateHeaderMessageText","_generateDuplicateItemsWhenAddingToOrderTemplateDialogResources","duplicatedProductsHeader","duplicatedProductsDescription","updateQuantityButtonText","cancelDuplicateItemsButtonText","createOrderTemplateHeader","createOrderTemplateDescription","createOrderTemplateButtonText","cancelNewOrderTemplateCreationButtonText","CartLineItems","productDimensionTypeConfiguration","quantityDisplayText","shippingCharges","removeCartButtonText","shipInsteadDisplayText","pickItUpDisplayText","changeStoreDisplayText","outOfStockErrorMessage","errorMessageOutOfRangeOneLeft","errorMessageOutOfRangeFormat","showOutOfStockErrors","addToOrderTemplateMessage","addItemToOrderTemplateError","isAbsoluteUrl","RegExp","test","returnURL","origin","retry","cartResult","cartVersion","validationResult","validateForCheckoutAsync","ValidationFailuresByCartLines","refreshError","validateError","featureStatuses","_renderCarousel","carouselContainer","_renderProduct","_renderGrid","gridContainer","ProductContainer","productComponent","ProductCollectionView","ProductCollectionContainer","SingleSlideCarouselComponentProps","GridComponentProps","isCarousel","SearchState","getGenericError","failureReason","cartActionResult","elementFoundAt","productIdToFind","availableQty","quantityLimit","getConfigureErrors","dimensionTypeValue","productDimensionTypeColorErrorMessage","productDimensionTypeConfigurationErrorMessage","productDimensionTypeSizeErrorMessage","productDimensionTypeAmountErrorMessage","productDimensionTypeStyleErrorMessage","getDimensionErrorString","getBuyBoxInventoryLabel","productAvailableQuantity","inventoryClassName","getBuyboxProductTitle","titleHeadingTag","headingTag","getBuyboxProductDescription","getBuyboxAddToCart","defaultMinimumKeyInPrice","defaultMaximumKeyInPrice","minimumKeyInPrice","maximumKeyInPrice","errorState","configureErrors","quantityError","customAmountError","otherError","errorHost","selectedProduct","isUpdatingDimension","isUpdatingDeliveryOptions","keyInPriceAmount","goToCartText","buyBoxGoToCartText","continueShoppingText","buyBoxContinueShoppingText","headerItemOneText","buyBoxSingleItemText","headerItemFormatText","buyBoxMultiLineItemFormatText","headerMessageText","buyBoxHeaderMessageText","isLoading","changeUpdatingDimension","isLoadingDeliveryOptions","changeUpdatingDeliveryOptions","isEmailDelivery","button","AddToCartComponent","navigationUrl","onError","quantityErrorForState","customAmountErrorForState","otherErrorForState","stockLeft","errorMessageOutOfStock","getQuantityError","formatedAmountLimit","invalidSmallCustomAmountText","invalidLargeCustomAmountText","updateErrorState","missingDimensions","getSelectedProduct","isAddServiceItemToCart","isPriceKeyedIn","customPriceAmount","_isOrderQuantityLimitsFeatureEnabled","errorBlock","BuyboxErrorBlock","showError","getBuyboxProductPrice","getBuyboxProductRating","ratingComponent","generateAddToOrderTemplateDialogResources","generateOrderTemplateNameDialogResources","generateItemAddedToOrderTemplateDialogResources","generateDuplicateItemsWhenAddingToOrderTemplateDialogResources","getBuyboxProductAddToOrderTemplate","getBuyboxProductAddToWishlist","addToWishlistMessage","removedFromWishlistMessage","addItemToWishlistError","removeItemFromWishlistError","getBuyboxProductQuantity","LabelContainerProps","productQuantityHeading","getBuyboxShopSimilarLook","ShopSimliarLooks","attribute","shopSimilarLooksText","searchURL","getBuyboxKeyInPrice","buyboxKeyInPriceLabelHeading","updateKeyInPrice","parseFloat","errorMessages","values","buyboxErrorMessageHeader","getQuantityLimitsMessages","_renderMaxLabel","maxQuantityText","_renderMinLabel","minQuantityText","MAX_VALUE","getBuyboxFindInStore","findInStoreHeaderText","findInStoreDescriptionText","findInStoreLinkText","descriptionTextToShowAllPickupOptions","retailMulitplePickupMFeatureState","dataProduct","behavior","addToCartBehavior","changeModalOpen","failureResult","findInStoreOnClick","popupProps","setModalOpen","renderModalPopup","Popup","openFindInStoreDialog","description","productPickupOptionList","Dropdown","selectMenu","_onChanged","selectId","selectedValue","innerText","dropdownName","current","dropdownList","dropdownToggleName","selected","hidden","getBuyboxProductConfigure","getDropdownName","onChanged","dimensionSelectedAsync","dropdowns","productDimensionFull","_mapProductDimensionFullToDropdownViewProps","dimensionChanged","dropdownCallback","selectDimensionFormatString","toLocaleLowerCase","DimensionValues","select","Buybox","dimensionUpdateQueue","FinitePromiseQueue","buyboxCallbacks","newErrorState","updateSelectedProduct","newSelectedProduct","newInventory","newPrice","newDeliveryOptions","_updatePrice","selectedDimensionId","selectedDimensionValueId","enqueue","_updateDimensions","reason","FinitePromiseQueueError","ProcessWasDiscardedFromTheQueue","_getDropdownName","isModalOpen","customPrice","dimensionsToUpdate","clearOtherErrorState","mappedDimensions","_updateDimensionValue","ExtensionProperties","newProduct","getSelectedVariant","SelectedVariantInput","MasterProductId","getDimensionsForSelectedVariant","GetDimensionsForSelectedVariantInput","variantProduct","newAvailableQuantity","getProductAvailabilitiesForSelectedVariant","ProductAvailabilitiesForSelectedVariantInput","RetailMulitplePickupMFeatureState","getDeliveryOptionsForSelectedVariant","GetDeliveryOptionsForSelectedVariantInput","_updateQuantitiesInState","newValueId","PRODUCTASSERVICE","mediaGallery","ModuleProps","ProductInfoContainerProps","MediaGalleryContainerProps","configure","findInStore","addToCart","hideRating","inventoryLabel","shopSimilarLook","enableShopSimilarLooks","keyInPrice","enableKeyInPrice","quantityLimitsMessages","DefaultQuantity","MinimumQuantity","information","ProductCollection","allowBackNavigation","breaCrumbType","breadcrumbType","allowBack","ProductComponent","ratingAriaLabel","_getActivePrice","productRecIds","prod","projectDomain","ChannelId","CatalogId","catalogId","affliations","customerInput","GetCustomerInput","getCustomer","CustomerAffiliations","affliation","aff","AffiliationId","RetailAffiliationId","CustomerId","AccountNumber","getActivePricesAsync","activePricesResponse","productPrices","activePrice","TradeAgreementPrice","AdjustedPrice","productCollection","enableAffiliationBasedPricing","layout","headingComponent","productCollectionViewProps","SingleSlideCarousel","flipperPrevLabel","flipperNextLabel","CartView","renderModuleAttributes","cartEmptyText","emptyCartText","orderSummaryLines","_renderOrderSummarylines","errorData","_renderAddToCart","_renderAddToOrderTemplate","_renderAddToWishlist","_renderConfigure","_renderConfigureDropdown","_renderSocialShare","socialShare","dropdown","_renderFindInStore","_renderQuantity","_renderKeyInPrice","_renderShopSimilarItem","shopSimilarItem","BuyboxView","VideoPlayerView","inputRef","_validateMin","minValue","currentInput","isUpdateing","_onIncrement","_onDecrement","_handleChange","componentDidUpdate","prevProps","glyphMinusClassName","decrementGlyphClass","glyphPlusClassName","incrementGlyphClass","decrementDisabled","incrementDisabled","currentValue","DecrementQuantity","decrementAttributes","IncrementQuantity","incrementAttributes","extraClassDecrement","extraClassIncrement","tabIndex","pattern","onBlur","invokeCallback","currQuantity","updatedQuantity","parseInt","inputElement","HTMLInputElement","setAttribute","SuggestionType","AutoSuggestInput","top","suggestionType","hitPrefix","hitSuffix","searchQuery","topResultsCount","_getAutoSuggest","autosuggest","searchCriteria","ProductSearchCriteria","SearchCondition","Context","HitPrefix","HitSuffix","searchSuggestions","getSearchSuggestionsAsync","Paging","Top","ImageUrl","generateImageUrl","AllSearchResults","autoSuggestPromises","all","inputData","KeywordSuggestionsComponent","suggestions","_generateLink","_getHighlightedText","suggestion","searchPageURL","searchQsp","formattedLink","route","formattedText","dangerouslySetInnerHTML","getRichTextHtml","ProductSuggestionsComponent","autoSuggestProps","productSuggestionHeading","moduleType","_renderTitle","productAutoSuggestionHeading","_renderThumbnail","Value3","DecimalValue","_getLiWrapper","_getAWrapper","recid","getProductPageUrlSync","adjustedPrice","basePrice","CategorySuggestionsComponent","categorySuggestionHeading","categoryAutoSuggestionHeading","splitValue","split","pop","_getCategoryLink","searchRefiners","urlPath","categoryRefiners","refiners","KeyName","refiner","Values","RefinerRecordId","encodedRefiner","encodeURIComponent","JSON","stringify","compressRefiners","compressedRefinerKeys","compressedRefiners","compressedRefiner","refinerKey","FormComponent","searchPlaceholder","hideSearchLabel","isSearchFormExpanded","searchTextInput","handleInputChange","maxChars","disableSubmitSearch","handleCancelSearchChange","ariaLabelCancel","ariaLabelSearch","ariaLabelSubmit","onInputChange","labelNode","inputNode","maxLength","submitBtnNode","LabelComponent","searchLabelClass","searchtext","searchCollapsedLabel","waitTime","_focusOutTarget","closest","_clearAutoSuggestState","_keyup","KeyCodes","Escape","formReference","contains","autoSuggestResultDiv","searchState","defaultBasicSearchUrl","searchQueryStringParameter","createSearchStateInput","_handleInputChange","cancellabelDebounce","cancel","getSearchSuggestionsAction","_getSuggestionType","inputSuggestionType","results","_getSearchRefiners","autoSuggestAriaLabel","_setAutoSuggestResultCount","setTimeout","suggestionTypes","distinctSuggestionTypes","suggestionTypeItem","charAt","toUpperCase","_handleSubmit","focus","_appendQueryParams","_handleCancelSearchChange","isInitialState","autoSuggestResultScreenReaderDiv","ariaLiveRegion","suggestResultString","autoSuggestFoundMessage","emptyResultString","noAutoSuggestionMessage","searchKeywordSuggestClass","searchProductSuggestClass","searchCategorySuggestClass","searchInputMaxLength","suggestionTypeCriterion","searchFormClass","body","searchLabelArialLabel","cancelBtnAriaLabel","searchBtnAriaLabel","submitBtnAriaLabel","searchplaceholderText","Keyword","None","Category","autoComplete","getProductSearchRefinersAsync","OrderTemplateQuantity","incDisabled","extraClass","getChangeHandler","_onIncrementalChange","OrderTemplateLineActions","getAddToBag","getRemoveItem","PopUp","showMobile","setShowMobile","useState","getActionButton","removeButtonClassName","addButtonClassName","buttonText","selectLine","productInfo","renderProductInfo","productUnitOfMeasure","productQuantityView","_generateQuantity","addToBagButton","popUp","componentClassName","getOnChange","addTemplateToBag","_getOrderTemplateAddToCartDialog","renameTemplate","_getOrderTemplateRenameControl","removeTemplate","_removeOrderTemplate","RenameOrderTemplateComponent","isAddDisabled","isRemoveDisabled","addHandler","removeHandler","addLineModalLinkText","searchButtonAriaLabel","searchInputAriaLabel","searchModalPlaceholderText","selectProductButtonText","addItemToTemplateText","addLineProductUnitPricePrefix","backButtonText","quantitySelectLabel","addLineProductUnitOfMeasurePrefix","notFoundSearchErrorNotice","notFoundSearchErrorRedediation","searchErrorMessage","addSelectedToBagButtonText","removeSelectedToBagButtonText","searchResultsCountVerbage","searchResultsCountSubject","addToTemplateConfirmation","totalPriceLabel","progressNotificationText","addToTemplateDuplicateError","addToTemplateGenericError","dimensionMissingError","addLineProps","AddLineToTemplate","CONTENT","msg","content","createRef","_renderSearchForm","_onSearchSubmit","autoFocus","Loading","_getSearchResults","NotFound","ProductList","_onQuantityChangeHandler","selectedQuantity","_onSelectItem","varianteInput","productVariant","_getProductDimensions","selectedProductDimensions","ProductConfiguration","_onBackButtonClickHandler","_highlightSearchTerm","parsedName","unescape","__html","_resultCountText","_addItemToTemplateHandler","AddItemToOrderTemplateInput","addItemToOrderTemplate","reloadPage","_toggleModalHandler","onComponentDidMount","onComponentDidUpdate","modalProps","showBackArrow","_renderContent","addToTemplateHandler","onQuantityChangeHandler","highlightSearchTerm","searchForm","productProps","renderResultCountText","Spinner","NotFoundComponent","searchCriteriaInput","IncludeAttributes","searchByCriteriaAsync","selectedDimensions","_getDimensionsError","dimensionName","_addToTemplateHandler","isBusy","showAddConfirmation","add","_onQuantityChange","totalPrice","_onDimensionChanged","remainingDimensionsErrors","selection","buttonDisabled","dimensionInput","variantDimensions","availabilityInput","priceInput","unitPrice","sort","a","b","_formatPrice","_getDimensionsNodes","_getConfirmationMessage","selectedDimensionNames","variant","unshift","currencyCode","toFixed","fallBackImg","ProductSelectButton","setBusy","SubmitUserReviewInput","userReviewData","authorization","submitReviewDataAction","submitButtonAttribute","cancelButtonAttribute","modalHeaderNode","discardReviewButtonText","submitDisabled","submitReviewButtonText","ratingsInput","ratingLabel","ratingsLabel","titleInput","titleLabel","textInput","textLabel","privacyPolicyUrl","privacyPolicyLink","inputRow","editReviewModalTitle","writeReviewModalTitle","stripWhiteSpacesFromString","selectRatingAriaLabel","initialRating","selectRatingLabel","reviewTitleMaxLength","reviewTitleLabel","reviewTextMaxLength","rows","reviewTextLabel","policyTextBlocks","privacyPolicyTextFormat","isSeparatorAtStart","startsWith","isSeparatorAtEnd","endsWith","PrivacyPolicy","privacyPolicyAttribute","privacyPolicyTitle","trim","onReviewSubmission","userEmail","emailAddress","submitUserReview","firstName","getReviewInput","GetUserReviewInput","SignInMessage","SignInButton","ModalToggle","WriteReview","PureComponent","writeReviewCallbacks","_modalToggleRef","userInfo","signInMessage","signInButton","signInLabel","signInAriaLabel","modalToggle","editReviewButtonText","reviewButtonLabel","_buildUserReviewModal","CreateOrderTemplateButton","createOrderTemplateDialogOpen","setOrderTemplateNameDialogOpen","createOrderTemplateText","OrderTemplateNameDialog","isUpdateDialog","onCancel","onOrderTemplateCreated","OrderTemplateList","_reloadPage","_onRemoveFromOrderTemplateList","p","headerStatusMessage","emptyOrderTemplateText","createNewTemplateButtonText","orderTemplatesData","orderTemplateListTitle","createOrderTemplateButton","CreateNewTemplateButtonComponent","templateHeaderStatusMessage","OrderTemplates","OrderTemplate","_renderOrderTemplateList","currentTemplateProps","SocialShareItemView","buildReviewCard","createReviewModal","createReportModal","ReviewsListview","_renderItem","WishlistItemsView","quantityLabel","OrderTemplateLinesView","toggleDetails","fade","histogramItem","RatingsHistogramView","OrderTemplateListView","_renderOrderTemplate","WriteReviewView"],"mappings":"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","file":"static/js/9.066f35bdfa12f18f1d76.chunk.js","sourcesContent":["import * as React from 'react';\n\nimport { Button, format, getPayloadObject, getTelemetryAttributes, IPayLoad, ITelemetryContent, TelemetryConstant } from '@msdyn365-commerce-modules/utilities';\nimport { PriceComponent } from '@msdyn365-commerce/components';\nimport { IComponentProps } from '@msdyn365-commerce/core';\nimport { ICartState } from '@msdyn365-commerce/global-state';\nimport { Coupon } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\n\nexport interface IPromoCodeProps extends IComponentProps<{}> {\n cart: ICartState | undefined;\n promoCodeHeadingText: string;\n appliedPromoCodeHeadingText: string;\n removePromoAriaLabelFormat: string;\n promoPlaceholderText: string;\n promoCodeApplyButtonText: string;\n collapseTimeOut: number;\n removePromoText: string;\n invalidPromoCodeErrorText: string;\n failedToAddPromoCodeErrorText: string;\n duplicatePromoCodeErrorText: string;\n failedToRemovePromoCodeErrorText: string;\n /** The telemetry content */\n telemetryContent?: ITelemetryContent;\n promoCodeApplyCallback?(): void;\n}\n\ninterface IPromoCodeState {\n isCollapseOpen: boolean;\n promoCodeInputValue: string;\n error: string;\n canApply: boolean;\n}\n\n/**\n *\n * The PromoCode component renders the promocode section.\n * @extends {React.PureComponent}\n */\nclass PromoCode extends React.Component {\n\n private payLoad: IPayLoad;\n\n constructor(props: IPromoCodeProps, state: IPromoCodeState) {\n super(props);\n this.payLoad = getPayloadObject('click', this.props.telemetryContent!, TelemetryConstant.ApplyPromoCode);\n this.state = {\n isCollapseOpen: false,\n promoCodeInputValue: '',\n error: '',\n canApply: false\n };\n }\n\n public render(): JSX.Element {\n return (\n
\n
{this.props.promoCodeHeadingText}
\n {this._renderForm(this.props.promoPlaceholderText, this.props.promoCodeApplyButtonText, this.props.cart)}\n

{this.state.error}

\n {this._renderAppliedPromoCode(this.props)}\n
\n );\n }\n\n private _onInputChange = (e: React.ChangeEvent) => {\n const error = e.target.value === '' ? '' : this.state.error;\n this.setState({\n promoCodeInputValue: e.target.value, error: error,\n canApply: e.target.value ? true : false\n });\n }\n\n private _applyPromotion = (cartState: ICartState | undefined) => {\n if (!cartState || !cartState.cart) {\n return;\n }\n const appliedPromo = this.state.promoCodeInputValue;\n\n cartState.addPromoCode({ promoCode: appliedPromo })\n .then(result => {\n if (result.status === 'SUCCESS') {\n // show success text\n this.setState({ promoCodeInputValue: '', error: '', canApply: false});\n } else if (result.substatus === 'ALREADYADDED') {\n this.setState({ error: this.props.duplicatePromoCodeErrorText });\n } else {\n this.setState({ error: this.props.invalidPromoCodeErrorText });\n }\n })\n .catch(error => {\n this.setState({ error: this.props.failedToAddPromoCodeErrorText });\n });\n }\n\n private _renderForm = (promoPlaceholderText: string, promoCodeApplyButtonText: string, cartState: ICartState | undefined) => {\n const _onSubmit = (event: React.FormEvent) => {event.preventDefault(); this._applyPromotion(cartState);};\n const _applyPromotion = (event: React.MouseEvent) => {this._applyPromotion(cartState);};\n const attributes = getTelemetryAttributes(this.props.telemetryContent!, this.payLoad);\n\n return (\n
\n
\n \n \n {promoCodeApplyButtonText}\n \n
\n
\n );\n }\n\n private _removePromotion = (cartState: ICartState | undefined, event: React.MouseEvent) => {\n if (!cartState) {\n return;\n }\n const code = event.currentTarget.getAttribute('data-value') || '';\n cartState.removePromoCodes({\n promoCodes: [\n code\n ]\n })\n .then(result => {\n if (result.status === 'SUCCESS') {\n this.setState({ error: ''});\n }\n })\n .catch(() => {\n this.setState({ error: this.props.failedToRemovePromoCodeErrorText});\n });\n\n }\n private _calculateDiscount = (code: string, cartState: ICartState | undefined) => {\n if (!cartState || !cartState.cart || !cartState.cart.CartLines || cartState.cart.CartLines.length === 0 || !code) {\n return;\n }\n let discountAmount = 0;\n for (const line of cartState.cart.CartLines) {\n if (line.DiscountLines) {\n for (const discountLine of line.DiscountLines) {\n if (discountLine.DiscountCode === code) {\n discountAmount += discountLine.DiscountCost!;\n }\n }\n }\n }\n return discountAmount * -1;\n }\n\n private _renderAppliedPromoCode = (props: IPromoCodeProps) => {\n if (!props.cart || !props.cart.cart || !props.cart.cart.Coupons || !(props.cart.cart.Coupons.length > 0)) {\n return;\n }\n\n const _removePromotion = (event: React.MouseEvent) => {this._removePromotion(props.cart, event);};\n\n const promoCodTotalDiscount = props.cart.cart.Coupons.reduce(\n (count: number, coupon: Coupon) => {\n return count + (this._calculateDiscount(coupon.Code || '', props.cart) || 0);\n },\n 0);\n\n return (\n <>\n
\n
{this.props.appliedPromoCodeHeadingText}
\n \n
\n {\n props.cart.cart.Coupons.map((coupon: Coupon) => {\n const ariaLabel = props.removePromoAriaLabelFormat ? format(props.removePromoAriaLabelFormat, props.removePromoText, coupon.Code) : '';\n\n return (\n
\n
\n {coupon.Code} (\n )\n
\n \n {props.removePromoText}\n \n
\n );\n })\n }\n \n );\n }\n}\n\nexport default PromoCode;","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport { Module, Node } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\nimport { IHeaderViewProps } from './header';\n\nconst headerView: React.FC = props => {\n const {\n HeaderTag,\n HeaderContainer,\n HeaderTopBarContainer,\n MobileMenuContainer,\n MobileMenuBodyContainer,\n MobileMenuLinksContainer,\n Divider\n } = props;\n return (\n \n \n \n {props.navIcon}\n {props.logo}\n {_renderReactFragment(props.search)}\n {props.preferredStore}\n {_renderDesktopAccountBlock(props)}\n {props.wishListIconDesktop}\n \n {props.cartIcon}\n {_renderReactFragment(props.siteOptions)}\n \n \n \n { props.MobileMenuHeader }\n {_renderReactFragment(props.menuBar)}\n \n { props.accountLinks ? props.accountLinks.map(link => link) : false }\n { props.siteOptions }\n { props.wishListIconMobile }\n { props.signInLink }\n { props.signOutLink }\n \n \n \n {_renderReactFragment(props.menuBar)}\n \n \n );\n};\n\nfunction _renderDesktopAccountBlock(props: IHeaderViewProps): JSX.Element | null {\n const {\n AccountInfoDropdownParentContainer,\n AccountInfoDropdownPopoverConentContainer,\n accountInfoDropdownButton,\n signOutLink,\n signInLink,\n accountLinks,\n } = props;\n\n if (AccountInfoDropdownParentContainer) {\n if (AccountInfoDropdownPopoverConentContainer) {\n return (\n \n {accountInfoDropdownButton}\n \n { accountLinks ? accountLinks.map(link => link) : false }\n {signOutLink}\n \n \n );\n } else if (signInLink) {\n return (\n \n {signInLink}\n \n );\n }\n }\n props.context.telemetry.error('Header content is empty, module wont render.');\n return null;\n}\n\nfunction _renderReactFragment(items: React.ReactNode[]): JSX.Element | null {\n return (\n \n {items && items.length\n ? items.map((slot: React.ReactNode, index: number) => {\n return {slot};\n })\n : null}\n \n );\n}\n\nexport default headerView;","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { ArrayExtensions, getFallbackImageUrl } from '@msdyn365-commerce-modules/retail-actions';\nimport { getPayloadObject, getTelemetryAttributes, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\nimport { PriceComponent } from '@msdyn365-commerce/components';\nimport { IComponentProps, IGridSettings, IImageSettings, Image } from '@msdyn365-commerce/core';\nimport { ChannelDeliveryOptionConfiguration, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\nimport { CartLine, SalesLine } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\nimport classNames from 'classnames';\nimport * as React from 'react';\nimport { Quantity } from '../../utilities/quantity';\n\n/**\n * ICartlineResourceString: Interface for specifying the\n * resource strings that the component needs\n */\nexport interface ICartlineResourceString {\n /** Display string for discount label */\n discountStringText: string;\n /** String for size key */\n sizeString: string;\n /** String for color key */\n colorString: string;\n /** String associated with the configuration product dimension */\n configString: string;\n /** String for style key */\n styleString: string;\n /** String for amount key */\n amountString?: string;\n /** Display string for quantity label */\n quantityDisplayString: string;\n /** Display string for quantity label */\n inputQuantityAriaLabel: string;\n /** Aria label for the decrement button in quantity component */\n decrementButtonAriaLabel: string;\n /** Aria label for the increment button in quantity component */\n incrementButtonAriaLabel: string;\n /** original text screenreader */\n originalPriceText: string;\n /** current text screenreader */\n currentPriceText: string;\n /** shipping Charges Text */\n shippingChargesText: string;\n}\n\ninterface ICartLineData {\n cartLine: CartLine | SalesLine;\n product: SimpleProduct;\n}\n\n/**\n * ICartLineProps: The props required to render cartLineitem\n */\nexport interface ICartLineProps extends IComponentProps {\n /** The flag to change the quantity component from interactible to static */\n disableQuantityInteractivity?: boolean;\n /** The primary image url */\n primaryImageUrl?: string;\n /** The product url */\n productUrl?: string;\n /** GridSettings for the product image in cartLine */\n gridSettings: IGridSettings;\n /** ImageSettings for the product image in cartLine */\n imageSettings: IImageSettings;\n /** Boolean flag to indicate if the item is out of stock */\n isOutOfStock?: boolean;\n /** Flag to make quantity section editable */\n isQuantityEditable?: boolean;\n /** Max quantity for line item */\n maxQuantity?: number;\n /** Current quantity for line item */\n currentQuantity?: number;\n /** Resource string for the component */\n resources: ICartlineResourceString;\n /** SalesLine flag */\n isSalesLine?: boolean;\n /** Error message to show in place of quantity */\n errorMessage?: string;\n /** Inventory information label */\n inventoryInformationLabel?: string;\n /** Inventory information class name */\n inventoryLabelClassName?: string;\n /** Flag to show/hide shipping charges for line items */\n showShippingChargesForLineItems?: boolean;\n /** Boolean flag to indicate if cart state status is ready */\n isCartStateReady?: boolean;\n /** Chanel Delivery Option configuration is from api. */\n channelDeliveryOptionConfig?: ChannelDeliveryOptionConfiguration;\n /** The telemetry content */\n telemetryContent?: ITelemetryContent;\n /** Quantity onChange callback */\n quantityOnChange?(cartLine: CartLine, newQuantity: number): boolean;\n}\n\ninterface IDimensionStrings {\n /** String for size key */\n sizeString: string;\n /** String for color key */\n colorString: string;\n /** String associated with the configuration product dimension */\n configString: string;\n /** String for style key */\n styleString: string;\n /** String for amount key */\n amountString?: string;\n}\n\nconst CartLineItemFunctions = {\n renderProductDimensions: (Product: SimpleProduct, DimensionStrings: IDimensionStrings) => {\n if (!Product || !Product.Dimensions) {\n return [];\n }\n\n return Product.Dimensions.map(productDimension => {\n\n if (productDimension.DimensionTypeValue === 1) {\n return (\n
\n {DimensionStrings.colorString}:\n {productDimension.DimensionValue && productDimension.DimensionValue.Value}\n
\n );\n }\n\n if (productDimension.DimensionTypeValue === 2) {\n return (\n
\n {DimensionStrings.configString}:\n {productDimension.DimensionValue && productDimension.DimensionValue.Value}\n
\n );\n }\n\n if (productDimension.DimensionTypeValue === 3) {\n return (\n
\n {DimensionStrings.sizeString}:\n {productDimension.DimensionValue && productDimension.DimensionValue.Value}\n
\n );\n }\n\n if (productDimension.DimensionTypeValue === 4) {\n return (\n
\n {Product.IsGiftCard ? DimensionStrings.amountString : DimensionStrings.styleString}:\n {productDimension.DimensionValue && productDimension.DimensionValue.Value}\n
\n );\n }\n return null;\n });\n },\n renderDiscountLines: (props: ICartLineProps) => {\n\n if (!props.data.cartLine.DiscountLines || props.data.cartLine.DiscountLines.length === 0) {\n return null;\n }\n return props.data.cartLine.DiscountLines.map((discountLine, index) => {\n return (\n
\n \n {discountLine.OfferName ? discountLine.OfferName : ''}:\n {` ${props.resources.discountStringText || 'Discount'} `}\n \n \n \n \n \n {` (${discountLine.Percentage !== undefined ? discountLine.Percentage : ''}%)`}\n \n
\n );\n });\n },\n renderInventoryLabel: (props: ICartLineProps) => {\n if (!props.inventoryInformationLabel) {\n return null;\n }\n const inventoryCssName = props.inventoryLabelClassName ? `msc-cart-line__product-inventory-label ${props.inventoryLabelClassName}` : 'msc-cart-line__product-inventory-label';\n return (\n {props.inventoryInformationLabel}\n );\n },\n renderShippingLabel: (props: ICartLineProps) => {\n const pickupDeliveryModeCode = props.context.request.channel?.PickupDeliveryModeCode;\n const channelDeliveryOptionConfig = props.channelDeliveryOptionConfig;\n const cartline = props.data.cartLine;\n let hasShippingMethod = false;\n if(channelDeliveryOptionConfig !== undefined) {\n hasShippingMethod = !!cartline.DeliveryMode && channelDeliveryOptionConfig?.PickupDeliveryModeCodes?.some(deliveryMode => deliveryMode !== cartline.DeliveryMode) ? true : false;\n } else {\n hasShippingMethod = !!cartline.DeliveryMode && cartline.DeliveryMode !== pickupDeliveryModeCode ? true : false;\n }\n if (!hasShippingMethod) {\n return undefined;\n }\n\n const shippingChargeLines = (cartline.ChargeLines || []).filter(chargeLine => chargeLine.IsShipping);\n\n if (shippingChargeLines.length === 0) {\n return undefined;\n }\n\n const freightFee = shippingChargeLines.reduce((chargeTotal, chargeLine) => {\n return chargeTotal + (chargeLine.CalculatedAmount || 0);\n }, 0);\n\n const priceComponent = (\n \n );\n return (\n <>\n \n \n {priceComponent}\n \n \n );\n },\n renderOtherCharges: (props: ICartLineProps) => {\n const cartline = props.data.cartLine;\n const otherCharges = cartline.ChargeLines?.filter((chargeline) => !chargeline.IsShipping);\n\n return otherCharges && otherCharges.map((otherCharge, key) => {\n return otherCharge && otherCharge.CalculatedAmount ? (\n
\n \n \n \n \n
\n ) : '';\n }) || undefined;\n }\n};\n\n// tslint:disable-next-line:max-func-body-length\nconst CartLine: React.FC = (props: ICartLineProps) => {\n const { isSalesLine, productUrl, resources } = props;\n const { product, cartLine } = props.data;\n\n const destructDimensionStrings = {\n sizeString: resources.sizeString,\n colorString: resources.colorString,\n styleString: resources.styleString,\n configString: resources.configString,\n amountString: resources.amountString\n };\n\n const fallbackImageUrl = product && getFallbackImageUrl(product.ItemId, props.context.actionContext.requestContext.apiSettings);\n const productDimensions = product && CartLineItemFunctions.renderProductDimensions(product, destructDimensionStrings);\n const imageSettings = props.imageSettings;\n if(imageSettings) {\n imageSettings.cropFocalRegion = true;\n }\n const renderDisountLines = CartLineItemFunctions.renderDiscountLines(props);\n const renderInventoryLabel = CartLineItemFunctions.renderInventoryLabel(props);\n const renderShippingLabel = CartLineItemFunctions.renderShippingLabel(props);\n const renderOtherCharges = CartLineItemFunctions.renderOtherCharges(props);\n const payLoad = getPayloadObject('click', props.telemetryContent!, '', product?.RecordId.toString());\n const prodAttribute = getTelemetryAttributes(props.telemetryContent!, payLoad);\n const productName = product?.Name || cartLine.Description;\n\n const onChange = (newValue: number): boolean => {\n if (props.quantityOnChange) {\n return props.quantityOnChange(props.data.cartLine, newValue);\n }\n return true;\n };\n\n const _generateErrorMessage = (): JSX.Element | null => {\n if (props.errorMessage) {\n return (\n
\n \n {props.errorMessage}\n
\n );\n }\n\n return null;\n };\n\n const _generateQuantityandPrice = (): JSX.Element[] | null => {\n const nodes = [];\n if (props.isOutOfStock) {\n const errorMessage = _generateErrorMessage();\n\n if (errorMessage) {\n return [errorMessage];\n }\n\n return null;\n }\n if (props.isQuantityEditable) {\n nodes.push(\n
\n
{resources.quantityDisplayString}
\n\n {_generateErrorMessage()}\n\n \n
\n );\n } else {\n nodes.push(\n
\n \n\n {_generateErrorMessage()}\n\n {props.data.cartLine.Quantity}\n
\n );\n }\n\n nodes.push(\n
\n \n {\n props.data.cartLine.DiscountAmount && props.data.cartLine.DiscountAmount > 0 &&\n <>\n {` ${props.resources.discountStringText || 'Discount'} `}\n \n ||\n null\n }\n
\n );\n\n return nodes;\n };\n\n return (\n
\n
\n \n
\n
\n
\n {productName}\n {ArrayExtensions.hasElements(productDimensions) ?\n
{productDimensions}
:\n ''\n }\n
\n \n
\n {renderDisountLines}\n {renderInventoryLabel}\n {props.showShippingChargesForLineItems &&
\n {renderShippingLabel}\n
}\n {renderOtherCharges}\n
\n {\n _generateQuantityandPrice()\n }\n
\n
\n );\n};\n\nexport default CartLine;","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport { IModuleProps } from '@msdyn365-commerce-modules/utilities';\nimport { SocialMedia, SocialMediaComponent } from '@msdyn365-commerce/components';\nimport MsDyn365 from '@msdyn365-commerce/core';\nimport * as React from 'react';\nimport { ISocialShareItemConfig, ISocialShareItemProps, socialMedia } from './social-share-item.props.autogenerated';\n\nexport interface ISocialShareItemViewProps extends ISocialShareItemProps {\n SocialShareItemElement: React.ReactNode | null;\n SocialShareItem: IModuleProps;\n}\n\n/**\n *\n * SocialShareItem component\n * @extends {React.PureComponent>}\n */\nclass SocialShareItem extends React.PureComponent> {\n constructor(props: ISocialShareItemProps) {\n super(props);\n\n this._getSocialShareItem = this._getSocialShareItem.bind(this);\n }\n\n public render(): JSX.Element | null {\n const viewprops = {\n ...this.props,\n SocialShareItem: {\n moduleProps: this.props,\n className: 'ms-social-share-item'\n },\n SocialShareItemElement: this._getSocialShareItem()\n };\n\n return this.props.renderView(viewprops) as React.ReactElement;\n }\n\n private _getSocialShareItem(): React.ReactNode | null {\n const src = this.props.config.icon;\n if (MsDyn365.isBrowser) {\n switch (this.props.config.socialMedia) {\n case socialMedia.facebook:\n return ;\n case socialMedia.twitter:\n return ;\n case socialMedia.pinterest:\n return ;\n case socialMedia.linkedin:\n return ;\n case socialMedia.mail:\n return ;\n default:\n return null;\n }\n }\n return null;\n }\n}\n\nexport default SocialShareItem;\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\n\r\n\r\nimport { INodeProps, Module, Node } from '@msdyn365-commerce-modules/utilities';\r\nimport * as React from 'react';\r\nimport { ISearchCategoryViewProps, ISearchFormViewProps, ISearchKeywordViewProps, ISearchProductViewProps } from '../../../modules/smwe-search/./components';\r\nimport { ISearchViewProps } from '../../../modules/smwe-search/./smwe-search';\r\n\r\nconst SearchView: React.FC = props => {\r\n const {\r\n Search,\r\n AutoSuggestAriaLabel,\r\n AutoSuggestAriaLabelText,\r\n searchText,\r\n AutoSuggest,\r\n KeywordSuggest,\r\n ProductSuggest,\r\n CategorySuggest,\r\n UlKeyword,\r\n UlProduct,\r\n UlCategory,\r\n form,\r\n autosuggestCategory,\r\n autosuggestKeyword,\r\n autosuggestProduct,\r\n SearchForm,\r\n FormWrapper,\r\n label\r\n } = props;\r\n\r\n return (\r\n \r\n {label}\r\n {_renderForm(form as ISearchFormViewProps, SearchForm, FormWrapper)}\r\n \r\n {searchText && searchText.length > 0 ?\r\n {AutoSuggestAriaLabelText} : ''\r\n }\r\n {_renderKeywordSuggestions(KeywordSuggest, UlKeyword, autosuggestKeyword)}\r\n {_renderProductSuggestions(ProductSuggest, UlProduct, autosuggestProduct)}\r\n {_renderCategorySuggestions(CategorySuggest, UlCategory, autosuggestCategory)}\r\n \r\n \r\n );\r\n};\r\n\r\nconst _renderForm = (form: ISearchFormViewProps, SearchForm: INodeProps, FormWrapper: INodeProps) => {\r\n return (\r\n \r\n \r\n {form.submitBtn}\r\n {form.label}\r\n {form.input}\r\n {form.cancelBtn}\r\n \r\n \r\n );\r\n};\r\n\r\nconst _renderKeywordSuggestions = (\r\n KeywordSuggest: INodeProps,\r\n UlKeyword: INodeProps,\r\n keywordSuggestions?: ISearchKeywordViewProps\r\n) => {\r\n return (\r\n keywordSuggestions && (\r\n \r\n \r\n {keywordSuggestions.text.map(text => {\r\n return text;\r\n })}\r\n \r\n \r\n )\r\n );\r\n};\r\n\r\nconst _renderProductSuggestions = (\r\n ProductSuggest: INodeProps,\r\n UlProduct: INodeProps,\r\n productSuggestions?: ISearchProductViewProps\r\n) => {\r\n return (\r\n productSuggestions && (\r\n \r\n \r\n {productSuggestions.title}\r\n {productSuggestions.items.map((item, index) => {\r\n return (\r\n \r\n \r\n {item.thumbnail}\r\n {item.text}\r\n {item.price !== 0 && (
{item.price}
)}\r\n
\r\n
\r\n );\r\n })}\r\n
\r\n
\r\n )\r\n );\r\n};\r\n\r\nconst _renderCategorySuggestions = (\r\n CategorySuggest: INodeProps,\r\n UlCategory: INodeProps,\r\n categorySuggestions?: ISearchCategoryViewProps\r\n) => {\r\n return (\r\n categorySuggestions && (\r\n \r\n \r\n {categorySuggestions.title}\r\n {categorySuggestions.text.map(text => {\r\n return text;\r\n })}\r\n \r\n \r\n )\r\n );\r\n};\r\n\r\nexport default SearchView;","import { getFallbackImageUrl, getProductUrlSync, OrderTemplate, OrderTemplateLine } from '@msdyn365-commerce-modules/retail-actions';\nimport { Alert, Button, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\nimport { AddOrderTemplateToCartComponent, ILinesAddedToCartDialogResources } from '@msdyn365-commerce/components';\nimport { getUrlSync, ICoreContext, IImageSettings, Image, ITelemetry } from '@msdyn365-commerce/core';\nimport { ProductList } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\nimport * as React from 'react';\nimport { IOrderTemplateActionMessageState } from '../order-template-list';\n\nexport interface ISingleOrderTemplateProps extends ProductList {\n orderTemplateState: IOrderTemplateActionMessageState;\n name?: string;\n orderTemplate: OrderTemplate;\n context: ICoreContext;\n imageSettings?: IImageSettings;\n enableImageProductLink?: boolean;\n removeFromOrderTemplateListText: string;\n addToBagText: string;\n index: number;\n itemKey: string;\n telemetry: ITelemetry;\n moduleId: string;\n moduleTypeName: string;\n handlers: {\n onRemoveOrderTemplate(id: string): void | undefined;\n onDismiss(): void;\n };\n resources: {\n closeWindowButtonText: string;\n addToCartFailureMessage: string;\n addToCartSuccessMessage: string;\n addToCartProcessMessage: string;\n linesAddedToCartDialogResources: ILinesAddedToCartDialogResources;\n };\n telemetryContent?: ITelemetryContent;\n}\n\nexport interface ISingleOrderTemplateViewProps {\n key: string;\n orderTemplateImage: React.ReactNode;\n addToCartButton?: React.ReactNode;\n removeButton?: React.ReactNode;\n orderTemplateStatusMessage?: React.ReactNode;\n orderTemplateName?: React.ReactNode;\n orderTemplateAriaLabel?: string;\n orderTemplateHeaderDivider?: React.ReactNode;\n}\n\nconst _removeItemFromOrderTemplateList = (props: ISingleOrderTemplateProps): void => {\n const { onRemoveOrderTemplate } = props.handlers;\n const { itemKey } = props;\n\n onRemoveOrderTemplate && itemKey && onRemoveOrderTemplate(itemKey);\n};\n\nconst OrderTemplateActions = {\n removeOrderTemplate: _removeItemFromOrderTemplateList,\n};\n\nexport const OrderTemplateRender = (input: ISingleOrderTemplateProps): ISingleOrderTemplateViewProps | null => {\n const { Id, orderTemplate, removeFromOrderTemplateListText, orderTemplateState, handlers, name, imageSettings, context, telemetryContent, enableImageProductLink } = input;\n\n if (!Id) {\n return null;\n }\n\n const _getOrderTemplatePageUrl = (): string => {\n const url = getUrlSync('ordertemplate', context.actionContext) || '';\n const separator = url.includes('?') ? '&' : '?';\n if (Id) {\n return `${url}${separator}id=${Id}`;\n } else {\n return '';\n }\n };\n\n const removeOrderTemplateAction = (event: React.MouseEvent) => { return OrderTemplateActions.removeOrderTemplate(input); };\n const { onDismiss } = handlers;\n\n return {\n key: `${Id}-template`,\n orderTemplateImage: _renderOrderTemplateImages(context, orderTemplate.orderTemplateLines, imageSettings, enableImageProductLink),\n orderTemplateAriaLabel: _renderAriaLabel(input),\n orderTemplateName:\n (\n
\n \n
{orderTemplate.totalLines} line items
\n
\n
\n ),\n addToCartButton:\n (\n
\n \n
\n ),\n removeButton:\n (\n \n ),\n orderTemplateStatusMessage: orderTemplateState && orderTemplateState.isOpen && orderTemplateState.userMessage &&\n (\n
\n \n {orderTemplateState.userMessage}\n \n
\n )\n\n };\n\n};\n\nconst _renderOrderTemplateImages = (context: ICoreContext, orderTemplateLines?: OrderTemplateLine[],\n imageSettings?: IImageSettings, enableImageProductLink?: boolean): JSX.Element | null => {\n const defaultImageSettings: IImageSettings = {\n viewports: {\n xs: { q: `w=140&h=140&m=6`, w: 0, h: 0 },\n lg: { q: `w=140&h=140&m=6`, w: 0, h: 0 },\n xl: { q: `w=140&h=140&m=6`, w: 0, h: 0 }\n },\n lazyload: true\n };\n\n if (orderTemplateLines) {\n const count = orderTemplateLines.length < 4 ? orderTemplateLines.length : 4;\n\n return (\n
\n {orderTemplateLines?.slice(0, count).map(line => {\n const productUrl = line.fullProduct ? getProductUrlSync(line.fullProduct.ProductDetails, context.actionContext, undefined) : '';\n\n return ( window.location.assign(productUrl))}\n className={enableImageProductLink ? 'product-link' : ''}\n />);\n })}\n
\n );\n } else {\n return (\n
\n );\n }\n};\n\nconst _renderAriaLabel = (props: ISingleOrderTemplateProps): string => {\n const { name } = props;\n return (`${name}`);\n};","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\nimport classnames from 'classnames';\nimport * as React from 'react';\nimport { orderTemplateListStatus } from '../order-template-list';\n\nexport interface IOrderTemplateListStatusMessageProps {\n className?: string;\n errorType: orderTemplateListStatus;\n text?: string;\n}\n\nexport const OrderTemplateListStatusMessage: React.FC = ({className, errorType, text}) => {\n switch(errorType) {\n case 'EMPTY':\n return (\n

{ text }

\n );\n case 'FAILED':\n return (\n

{ text }

\n );\n case 'LOADING':\n default:\n return (\n

{ text }

\n );\n }\n};\n","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport { getTelemetryObject, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\nimport { IVideoMetadata, Player } from '@msdyn365-commerce/components';\nimport { IPlayerOptions } from '@msdyn365-commerce/components/dist/types/videoplayer/components/data/player-options';\nimport { IPlayerResources } from '@msdyn365-commerce/components/dist/types/videoplayer/components/data/player-resources';\nimport { IPlayerData } from '@msdyn365-commerce/components/dist/types/videoplayer/players/player/Player.props';\nimport * as MsDyn365 from '@msdyn365-commerce/core';\nimport * as React from 'react';\nimport { IVideoPlayerConfig, IVideoPlayerProps } from './video-player.props.autogenerated';\n\nexport interface IVideoPlayerViewProps extends IVideoPlayerProps<{}> {\n player: React.ReactNode;\n}\n\n/**\n *\n * VideoPlayer component\n * @extends {React.PureComponent>}\n */\nclass VideoPlayer extends React.PureComponent> {\n private telemetryContent: ITelemetryContent;\n constructor(props: IVideoPlayerProps) {\n super(props);\n this.telemetryContent = getTelemetryObject(this.props.context.request.telemetryPageName!,\n this.props.friendlyName,\n this.props.telemetry);\n }\n\n public render(): JSX.Element {\n const options: IPlayerOptions = this.props.config;\n const video: MsDyn365.IVideoData = this.props.config.video;\n const playerResources: IPlayerResources = {\n playAriaLabel: this.props.resources.playLabel,\n pauseAriaLabel: this.props.resources.pauseLabel,\n playingAriaLabel: this.props.resources.playingLabel,\n pausedAriaLabel: this.props.resources.pausedLabel,\n muteAriaLabel:this.props.resources.muteLabel,\n unMuteAriaLabel:this.props.resources.unMuteLabel,\n fullScreenAriaLabel:this.props.resources.fullScreenLabel,\n exitFullScreenAriaLabel:this.props.resources.exitFullScreenLabel,\n seekBarLabel:this.props.resources.seekBarLabel,\n videoTimeDurationLabel:this.props.resources.videoTimeDurationLabel,\n closedCaptionLabel:this.props.resources.closedCaptionLabel\n };\n const videoMetaData: IVideoMetadata = {};\n\n if (video) {\n videoMetaData.videoId = video.id;\n videoMetaData.title = video.title;\n videoMetaData.duration = video.playTime;\n\n if (video.thumbnail) {\n videoMetaData.posterframeUrl = video.thumbnail.src;\n }\n\n if (video._links\n && video._links.binaryReferences) {\n videoMetaData.videoBinaryReferences = video._links.binaryReferences;\n }\n }\n const videoPlayerData: IPlayerData = { options: options, metaData: videoMetaData };\n const viewProps = {\n // Context for telemetry and raw data for C1 to do customization\n // Including computed data, state data and methods\n ...this.props,\n // tslint:disable-next-line: jsx-wrap-multiline\n player: \n \n \n };\n return this.props.renderView(viewProps) as React.ReactElement;\n }\n\n}\n\nexport default VideoPlayer;\n","import { OrderBy } from '../actions/inputs/get-product-reviews-input';\n\nexport interface IRnrKeyValuePair {\n key: string;\n value: string;\n}\n\nexport interface IRnrOrderByKeyValuePair {\n key: OrderBy;\n value: string;\n}\n\nexport function setFocusOnElement(id: string): void {\n const element = document.getElementById(id);\n if (!!element) {\n element.focus();\n }\n}\n\nexport const TOGGLE_REVIEW_MODAL_BUTTON_ID: string = 'reviewproductid';\nexport const TOGGLE_EDIT_MODAL_BUTTON_ID: string = 'ms-write-review__edit';\nexport const TOGGLE_EDIT_MODAL_BUTTON_CARD_ID: string = 'ms-reviews-list__edit';","/*---------------------------------------------------------------------------------------------\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\n\r\n\r\nimport { INodeProps, Module, Node } from '@msdyn365-commerce-modules/utilities';\r\nimport * as React from 'react';\r\nimport { ISearchCategoryViewProps, ISearchFormViewProps, ISearchKeywordViewProps, ISearchProductViewProps } from '../../../modules/smwe-search/./components';\r\nimport { ISearchViewProps } from '../../../modules/smwe-search/./smwe-search';\r\n\r\nconst SearchView: React.FC = props => {\r\n const {\r\n Search,\r\n AutoSuggestAriaLabel,\r\n AutoSuggestAriaLabelText,\r\n searchText,\r\n AutoSuggest,\r\n KeywordSuggest,\r\n ProductSuggest,\r\n CategorySuggest,\r\n UlKeyword,\r\n UlProduct,\r\n UlCategory,\r\n form,\r\n autosuggestCategory,\r\n autosuggestKeyword,\r\n autosuggestProduct,\r\n SearchForm,\r\n FormWrapper,\r\n label\r\n } = props;\r\n\r\n return (\r\n \r\n {label}\r\n {_renderForm(form as ISearchFormViewProps, SearchForm, FormWrapper)}\r\n \r\n {searchText && searchText.length > 0 ?\r\n {AutoSuggestAriaLabelText} : ''\r\n }\r\n {_renderKeywordSuggestions(KeywordSuggest, UlKeyword, autosuggestKeyword)}\r\n {_renderProductSuggestions(ProductSuggest, UlProduct, autosuggestProduct)}\r\n {_renderCategorySuggestions(CategorySuggest, UlCategory, autosuggestCategory)}\r\n \r\n \r\n );\r\n};\r\n\r\nconst _renderForm = (form: ISearchFormViewProps, SearchForm: INodeProps, FormWrapper: INodeProps) => {\r\n return (\r\n \r\n \r\n {form.submitBtn}\r\n {form.label}\r\n {form.input}\r\n {form.cancelBtn}\r\n \r\n \r\n );\r\n};\r\n\r\nconst _renderKeywordSuggestions = (\r\n KeywordSuggest: INodeProps,\r\n UlKeyword: INodeProps,\r\n keywordSuggestions?: ISearchKeywordViewProps\r\n) => {\r\n return (\r\n keywordSuggestions && (\r\n \r\n \r\n {keywordSuggestions.text.map(text => {\r\n return text;\r\n })}\r\n \r\n \r\n )\r\n );\r\n};\r\n\r\nconst _renderProductSuggestions = (\r\n ProductSuggest: INodeProps,\r\n UlProduct: INodeProps,\r\n productSuggestions?: ISearchProductViewProps\r\n) => {\r\n return (\r\n productSuggestions && (\r\n \r\n \r\n {productSuggestions.title}\r\n {productSuggestions.items.map((item, index) => {\r\n return (\r\n \r\n \r\n {item.thumbnail}\r\n {item.text}\r\n {item.price !== 0 && (
{item.price}
)}\r\n
\r\n
\r\n );\r\n })}\r\n
\r\n
\r\n )\r\n );\r\n};\r\n\r\nconst _renderCategorySuggestions = (\r\n CategorySuggest: INodeProps,\r\n UlCategory: INodeProps,\r\n categorySuggestions?: ISearchCategoryViewProps\r\n) => {\r\n return (\r\n categorySuggestions && (\r\n \r\n \r\n {categorySuggestions.title}\r\n {categorySuggestions.text.map(text => {\r\n return text;\r\n })}\r\n \r\n \r\n )\r\n );\r\n};\r\n\r\nexport default SearchView;","/*---------------------------------------------------------------------------------------------\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\n\r\n\r\nimport { INodeProps, Module, Node } from '@msdyn365-commerce-modules/utilities';\r\nimport * as React from 'react';\r\nimport { ISearchCategoryViewProps, ISearchFormViewProps, ISearchKeywordViewProps, ISearchProductViewProps } from '../../../modules/smwe-search/./components';\r\nimport { ISearchViewProps } from '../../../modules/smwe-search/./smwe-search';\r\n\r\nconst SearchView: React.FC = props => {\r\n const {\r\n Search,\r\n AutoSuggestAriaLabel,\r\n AutoSuggestAriaLabelText,\r\n searchText,\r\n AutoSuggest,\r\n KeywordSuggest,\r\n ProductSuggest,\r\n CategorySuggest,\r\n UlKeyword,\r\n UlProduct,\r\n UlCategory,\r\n form,\r\n autosuggestCategory,\r\n autosuggestKeyword,\r\n autosuggestProduct,\r\n SearchForm,\r\n FormWrapper,\r\n label\r\n } = props;\r\n\r\n return (\r\n \r\n {label}\r\n {_renderForm(form as ISearchFormViewProps, SearchForm, FormWrapper)}\r\n \r\n {searchText && searchText.length > 0 ?\r\n {AutoSuggestAriaLabelText} : ''\r\n }\r\n {_renderKeywordSuggestions(KeywordSuggest, UlKeyword, autosuggestKeyword)}\r\n {_renderProductSuggestions(ProductSuggest, UlProduct, autosuggestProduct)}\r\n {_renderCategorySuggestions(CategorySuggest, UlCategory, autosuggestCategory)}\r\n \r\n \r\n );\r\n};\r\n\r\nconst _renderForm = (form: ISearchFormViewProps, SearchForm: INodeProps, FormWrapper: INodeProps) => {\r\n return (\r\n \r\n \r\n {form.submitBtn}\r\n {form.label}\r\n {form.input}\r\n {form.cancelBtn}\r\n \r\n \r\n );\r\n};\r\n\r\nconst _renderKeywordSuggestions = (\r\n KeywordSuggest: INodeProps,\r\n UlKeyword: INodeProps,\r\n keywordSuggestions?: ISearchKeywordViewProps\r\n) => {\r\n return (\r\n keywordSuggestions && (\r\n \r\n \r\n {keywordSuggestions.text.map(text => {\r\n return text;\r\n })}\r\n \r\n \r\n )\r\n );\r\n};\r\n\r\nconst _renderProductSuggestions = (\r\n ProductSuggest: INodeProps,\r\n UlProduct: INodeProps,\r\n productSuggestions?: ISearchProductViewProps\r\n) => {\r\n return (\r\n productSuggestions && (\r\n \r\n \r\n {productSuggestions.title}\r\n {productSuggestions.items.map((item, index) => {\r\n return (\r\n \r\n \r\n {item.thumbnail}\r\n {item.text}\r\n {item.price !== 0 && (
{item.price}
)}\r\n
\r\n
\r\n );\r\n })}\r\n
\r\n
\r\n )\r\n );\r\n};\r\n\r\nconst _renderCategorySuggestions = (\r\n CategorySuggest: INodeProps,\r\n UlCategory: INodeProps,\r\n categorySuggestions?: ISearchCategoryViewProps\r\n) => {\r\n return (\r\n categorySuggestions && (\r\n \r\n \r\n {categorySuggestions.title}\r\n {categorySuggestions.text.map(text => {\r\n return text;\r\n })}\r\n \r\n \r\n )\r\n );\r\n};\r\n\r\nexport default SearchView;","/*---------------------------------------------------------------------------------------------\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\n\r\n\r\nimport { INodeProps, Module, Node } from '@msdyn365-commerce-modules/utilities';\r\nimport * as React from 'react';\r\nimport { ISearchCategoryViewProps, ISearchFormViewProps, ISearchKeywordViewProps, ISearchProductViewProps } from '../../../modules/smwe-search/./components';\r\nimport { ISearchViewProps } from '../../../modules/smwe-search/./smwe-search';\r\n\r\nconst SearchView: React.FC = props => {\r\n const {\r\n Search,\r\n AutoSuggestAriaLabel,\r\n AutoSuggestAriaLabelText,\r\n searchText,\r\n AutoSuggest,\r\n KeywordSuggest,\r\n ProductSuggest,\r\n CategorySuggest,\r\n UlKeyword,\r\n UlProduct,\r\n UlCategory,\r\n form,\r\n autosuggestCategory,\r\n autosuggestKeyword,\r\n autosuggestProduct,\r\n SearchForm,\r\n FormWrapper,\r\n label\r\n } = props;\r\n\r\n return (\r\n \r\n {label}\r\n \r\n {_renderForm(form as ISearchFormViewProps, FormWrapper)}\r\n \r\n {searchText && searchText.length > 0 ?\r\n {AutoSuggestAriaLabelText} : ''\r\n }\r\n {_renderKeywordSuggestions(KeywordSuggest, UlKeyword, autosuggestKeyword)}\r\n {_renderProductSuggestions(ProductSuggest, UlProduct, autosuggestProduct)}\r\n {_renderCategorySuggestions(CategorySuggest, UlCategory, autosuggestCategory)}\r\n \r\n \r\n \r\n );\r\n};\r\n\r\nconst _renderForm = (form: ISearchFormViewProps, FormWrapper: INodeProps) => {\r\n return (\r\n \r\n {form.submitBtn}\r\n
\r\n
\r\n {form.label}\r\n {form.input}\r\n
\r\n {form.cancelBtn}\r\n \r\n );\r\n};\r\n\r\nconst _renderKeywordSuggestions = (\r\n KeywordSuggest: INodeProps,\r\n UlKeyword: INodeProps,\r\n keywordSuggestions?: ISearchKeywordViewProps\r\n) => {\r\n return (\r\n keywordSuggestions && (\r\n \r\n \r\n {keywordSuggestions.text.map(text => {\r\n return text;\r\n })}\r\n \r\n \r\n )\r\n );\r\n};\r\n\r\nconst _renderProductSuggestions = (\r\n ProductSuggest: INodeProps,\r\n UlProduct: INodeProps,\r\n productSuggestions?: ISearchProductViewProps\r\n) => {\r\n return (\r\n productSuggestions && (\r\n \r\n \r\n {productSuggestions.title}\r\n {productSuggestions.items.map((item, index) => {\r\n return (\r\n \r\n \r\n {item.thumbnail}\r\n {item.text}\r\n {item.price}\r\n \r\n \r\n );\r\n })}\r\n \r\n \r\n )\r\n );\r\n};\r\n\r\nconst _renderCategorySuggestions = (\r\n CategorySuggest: INodeProps,\r\n UlCategory: INodeProps,\r\n categorySuggestions?: ISearchCategoryViewProps\r\n) => {\r\n return (\r\n categorySuggestions && (\r\n \r\n \r\n {categorySuggestions.title}\r\n {categorySuggestions.text.map(text => {\r\n return text;\r\n })}\r\n \r\n \r\n )\r\n );\r\n};\r\n\r\nexport default SearchView;\r\n","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\nimport { getPayloadObject, getTelemetryAttributes, ITelemetryContent, TelemetryConstant } from '@msdyn365-commerce-modules/utilities';\nimport * as Msdyn365 from '@msdyn365-commerce/core';\nimport * as React from 'react';\n\nexport interface ILogoProps {\n image: Msdyn365.IImageData;\n gridSettings?: Msdyn365.IGridSettings;\n link?: ILinkData;\n className?: string;\n telemetryContent?: ITelemetryContent;\n requestContext: Msdyn365.IRequestContext;\n}\n\nexport interface ILinkData {\n linkUrl: Msdyn365.ILinkData;\n ariaLabel?: string;\n openInNewTab?: boolean;\n linkText?: string;\n}\n\n/**\n *\n * Logo component\n * @extends {React.PureComponent}\n */\nexport class Logo extends React.PureComponent {\n\n private attributes?: Msdyn365.IDictionary;\n\n constructor(props: ILogoProps) {\n super(props);\n const payLoad = getPayloadObject('click', props.telemetryContent!, TelemetryConstant.Logo);\n this.attributes = getTelemetryAttributes(props.telemetryContent!, payLoad);\n }\n public render():JSX.Element {\n return(\n
\n {this._renderLogo(this.props)}\n
\n );\n }\n\n private _renderLogo(config: ILogoProps):JSX.Element {\n if(config.link && config.link.linkUrl.destinationUrl) {\n return(\n \n {this._renderImage(config)}\n \n );\n }\n return(\n this._renderImage(config)\n );\n }\n\n private _renderImage(config: ILogoProps): JSX.Element {\n const defaultImageSettings: Msdyn365.IImageSettings = {\n viewports: {\n xs: { q: `w=132&h=28&m=6`, w: 0, h: 0 },\n lg: { q: `w=160&h=48&m=6`, w: 0, h: 0 }\n },\n lazyload: true\n };\n\n return (\n \n );\n }\n}\n\nexport default Logo;","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\nimport { Button, getPayloadObject, getTelemetryAttributes, ITelemetryContent, TelemetryConstant } from '@msdyn365-commerce-modules/utilities';\nimport * as Msdyn365 from '@msdyn365-commerce/core';\nimport { observer } from 'mobx-react';\nimport * as React from 'react';\nimport { IHeaderResources } from '../header.props.autogenerated';\n\nexport interface INavIconProps {\n resources: IHeaderResources;\n isExpanded: boolean;\n targetId: string;\n telemetryContent?: ITelemetryContent;\n toggleNavBar(): void;\n}\n\n/**\n *\n * NavIcon component\n * @extends {React.PureComponent}\n */\n\n@observer\nexport class NavIcon extends React.Component {\n\n private attributes?: Msdyn365.IDictionary;\n\n constructor(props: INavIconProps) {\n super(props);\n const payLoad = getPayloadObject('click', props.telemetryContent!, TelemetryConstant.NavIcon);\n this.attributes = getTelemetryAttributes(props.telemetryContent!, payLoad);\n }\n\n public render():JSX.Element {\n return (\n \n );\n }\n}","import { observer } from 'mobx-react';\nimport * as React from 'react';\nimport { IHeaderData } from '../header.data';\nimport { IHeaderProps } from '../header.props.autogenerated';\n\n/**\n * The header preferred store component\n */\n@observer\nexport class HeaderPreferredStore extends React.PureComponent> {\n\n public handleClick = () => { return this._findPreferreStoreOnClick(this.props); };\n\n public render(): JSX.Element | undefined {\n const {\n data: {\n storeSelectorStateManager: { result: storeSelectorStateManager }\n },\n slots,\n resources\n } = this.props;\n if (slots && slots.storeSelector && slots.storeSelector.length) {\n const storeName = storeSelectorStateManager!.preferredStore && storeSelectorStateManager!.preferredStore.StoreName ?\n storeSelectorStateManager!.preferredStore.StoreName :\n resources.headerPreferredStoreText;\n\n return (\n
\n \n {slots.storeSelector}\n
\n );\n }\n\n return undefined;\n }\n\n private async _findPreferreStoreOnClick(props: IHeaderProps): Promise {\n const { data: { storeSelectorStateManager: { result: storeSelectorStateManager } }, modules } = props;\n if (!storeSelectorStateManager) {\n return;\n }\n let storeSelectorId: string = '';\n if (modules && Object.keys(modules).length > 0 && modules.storeSelector && modules.storeSelector.length > 0) {\n storeSelectorId = modules.storeSelector[0].id;\n }\n storeSelectorStateManager.openDialog({\n id: storeSelectorId,\n showMapViewLink: false,\n onLocationSelected: orgUnitLocation => {\n return Promise.resolve();\n }\n }).catch((error: Error) => {\n if (props.telemetry) {\n props.telemetry.error(error.message);\n props.telemetry.debug('Unable to set preferred store');\n }\n return;\n });\n }\n}\n\nexport default HeaderPreferredStore;\n","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\nimport {\n Button, getPayloadObject, getTelemetryAttributes, getTelemetryObject, IModuleProps, INodeProps, ITelemetryContent, KeyCodes, Modal,\n ModalBody, ModalHeader, onTelemetryClick, Popover, TelemetryConstant\n} from '@msdyn365-commerce-modules/utilities';\nimport { CartIconComponent, WishListIconComponent } from '@msdyn365-commerce/components';\nimport * as MsDyn365 from '@msdyn365-commerce/core';\nimport { ICartState } from '@msdyn365-commerce/global-state';\nimport { Customer } from '@msdyn365-commerce/retail-proxy';\nimport classnames from 'classnames';\nimport { computed, reaction } from 'mobx';\nimport { observer } from 'mobx-react';\nimport * as React from 'react';\nimport { HeaderPreferredStore, Logo, NavIcon } from './components';\nimport { IHeaderData } from './header.data';\nimport { IHeaderProps, IHeaderResources, IMyAccountLinksData } from './header.props.autogenerated';\n\nexport interface IHeaderState {\n mobileMenuCollapsed: boolean;\n signinPopoverOpen: boolean;\n}\n\nexport interface IHeaderViewProps extends IHeaderProps, IHeaderState {\n logo: React.ReactNode;\n wishListIconDesktop: React.ReactNode;\n wishListIconMobile: React.ReactNode;\n cartIcon: React.ReactNode;\n navIcon: React.ReactNode;\n className: string;\n menuBar: React.ReactNode[];\n search: React.ReactNode[];\n siteOptions: React.ReactNode[];\n HeaderTag: IModuleProps;\n HeaderContainer: INodeProps;\n MobileMenuContainer: INodeProps;\n MobileMenuHeader: React.ReactNode;\n MobileMenuBodyContainer: INodeProps;\n MobileMenuLinksContainer: INodeProps;\n HeaderTopBarContainer: INodeProps;\n Divider: INodeProps;\n\n AccountInfoDropdownParentContainer?: INodeProps;\n AccountInfoDropdownPopoverConentContainer?: INodeProps;\n accountInfoDropdownButton?: React.ReactNode;\n\n signOutLink?: React.ReactNode;\n signInLink?: React.ReactNode;\n accountLinks?: React.ReactNode[];\n preferredStore?: React.ReactNode;\n}\n\n/**\n *\n * Header component\n * @extends {React.PureComponent>}\n */\n@observer\nclass Header extends React.PureComponent, IHeaderState> {\n private popOverRef: React.RefObject;\n private telemetryContent: ITelemetryContent;\n private cart: ICartState | undefined;\n @computed public get displayName(): Readonly {\n const customer = this.props.data.accountInformation?.result;\n return customer ? customer.FirstName || customer.Name : undefined;\n }\n\n constructor(props: IHeaderProps) {\n super(props);\n this.popOverRef = React.createRef();\n this._toggleNavbar = this._toggleNavbar.bind(this);\n this._togglePopover = this._togglePopover.bind(this);\n this._keydown = this._keydown.bind(this);\n this.state = {\n mobileMenuCollapsed: true,\n signinPopoverOpen: false\n };\n this.telemetryContent = getTelemetryObject(this.props.context.request.telemetryPageName!, this.props.friendlyName, this.props.telemetry);\n }\n\n public componentDidMount(): void {\n if (MsDyn365.msdyn365Commerce.isBrowser) {\n window.addEventListener('keydown', this._keydown);\n }\n reaction(\n () => this.props.data.cart.result,\n () => {\n this.cart = this.props.data.cart.result;\n }\n );\n }\n\n public componentWillUnmount(): void {\n if (MsDyn365.msdyn365Commerce.isBrowser) {\n window.removeEventListener('keydown', this._keydown, false);\n }\n }\n\n // tslint:disable-next-line: cyclomatic-complexity max-func-body-length\n public render(): JSX.Element | null {\n const {\n id,\n typeName,\n data: { accountInformation,\n storeSelectorStateManager: {result: storeSelectorStateManager}\n },\n context: {\n request: {\n user\n }\n },\n context,\n resources: {\n cartLabel,\n cartQtyLabel\n }\n } = this.props;\n const { logoLink, logoImage } = this.props.config;\n const headerClassName = classnames('ms-header', this.props.config.className);\n const navbarKey = 'header-nav-mobile';\n const customer = accountInformation && accountInformation.result;\n const cartIconSlot = this._getSlot('cartIcon');\n const menuBarSlot = this._getSlot('menuBar');\n const searchSlot = this._getSlot('search');\n const siteOptionsSlot = this._getSlot('siteOptions');\n const preferredStoreSlot = this._getSlot('storeSelector');\n const viewProps: IHeaderViewProps = {\n ...(this.props as IHeaderProps),\n ...(this.state),\n logo: ,\n wishListIconDesktop: (\n \n ),\n wishListIconMobile: (\n \n ),\n cartIcon: (cartIconSlot && cartIconSlot.length > 0)\n ? cartIconSlot[0]\n : ,\n navIcon: ,\n menuBar: menuBarSlot && menuBarSlot.length && menuBarSlot || [],\n search: searchSlot && searchSlot.length && searchSlot || [],\n siteOptions: siteOptionsSlot && siteOptionsSlot.length && siteOptionsSlot || [],\n className: headerClassName,\n HeaderTag: {\n moduleProps: this.props,\n className: classnames(headerClassName),\n tag: 'header'\n },\n HeaderContainer: {\n className: classnames('ms-header__container')\n },\n HeaderTopBarContainer: {\n className: classnames('ms-header__topbar')\n },\n Divider: {\n className: classnames('ms-header__divider')\n },\n MobileMenuContainer: {\n tag: Modal,\n id: navbarKey,\n className: 'ms-header__mobile-hamburger',\n isOpen: !this.state.mobileMenuCollapsed,\n wrapClassName: 'ms-header__modal',\n toggle: this._toggleNavbar\n },\n MobileMenuHeader: (\n \n ),\n MobileMenuBodyContainer: {\n tag: ModalBody,\n className: 'ms-header__mobile-hamburger-menu-body',\n },\n MobileMenuLinksContainer: {\n className: 'ms-header__mobile-hamburger-menu-links',\n },\n AccountInfoDropdownParentContainer: {\n className: 'ms-header__account-info'\n },\n AccountInfoDropdownPopoverConentContainer: customer && this.displayName && {\n tag: Popover,\n id: 'myprofilePopover',\n className: 'ms-header__account-info-content',\n placement: 'bottom',\n isOpen: this.state.signinPopoverOpen,\n target: this.popOverRef,\n toggle: this._togglePopover,\n } || undefined,\n signInLink: this._getSigninButton(customer, user, this.props.resources),\n signOutLink: this._getSignOutButton(customer, user, this.props.resources),\n accountInfoDropdownButton: this._getAccountInfoDropdownButton(customer),\n accountLinks: this._getAccountLinks(customer),\n preferredStore: preferredStoreSlot\n && preferredStoreSlot.length\n && storeSelectorStateManager\n && ()\n };\n\n return this.props.renderView(viewProps) as React.ReactElement;\n }\n\n /* Handle link text change*/\n public handleLinkTextChange = (linkIndex: number) => (event: MsDyn365.ContentEditableEvent) => {\n if (this.props.config.myAccountLinks && this.props.config.myAccountLinks[linkIndex]) {\n this.props.config.myAccountLinks[linkIndex].linkText = event.target.value;\n }\n }\n\n private _getSlot(slotName: string): React.ReactNode[] | null {\n const { slots } = this.props;\n return (slots && slots[slotName] && slots[slotName].length && slots[slotName]) || null;\n }\n\n private _getSigninButton(customer: Customer | undefined, user: MsDyn365.IRequestContextUser | undefined, resources: IHeaderResources): React.ReactNode | undefined {\n const payLoad = getPayloadObject('click', this.telemetryContent, TelemetryConstant.SignIn);\n const attributes = getTelemetryAttributes(this.telemetryContent, payLoad);\n return !customer && (\n \n {resources.signInLinkText}\n \n );\n }\n\n private _getSignOutButton(customer: Customer | undefined, user: MsDyn365.IRequestContextUser | undefined, resources: IHeaderResources): React.ReactNode | undefined {\n const payLoad = getPayloadObject('click', this.telemetryContent, TelemetryConstant.SignOut);\n const attributes = getTelemetryAttributes(this.telemetryContent, payLoad);\n return customer && this.displayName && (\n \n {resources.signOutLinkText}\n \n );\n }\n\n private _getAccountInfoDropdownButton(customer: Customer | undefined): React.ReactNode | undefined {\n const payLoad = getPayloadObject('click', this.telemetryContent, TelemetryConstant.MyProfile);\n const attributes = getTelemetryAttributes(this.telemetryContent, payLoad);\n return customer && this.displayName && (\n \n {this.displayName}\n \n );\n }\n\n private _getAccountLinks(customer: Customer | undefined): React.ReactNode[] | undefined {\n const { myAccountLinks } = this.props.config;\n const payLoad = getPayloadObject('click', this.telemetryContent, '');\n if(!customer || ! this.displayName || !myAccountLinks || !myAccountLinks.length) {\n return undefined;\n }\n return myAccountLinks.map((cta: IMyAccountLinksData, index: number) => {\n payLoad.contentAction.etext = cta.linkText;\n const attributes = getTelemetryAttributes(this.telemetryContent, payLoad);\n const editableLink: MsDyn365.ILinksData = {\n ariaLabel: cta.ariaLabel,\n className: 'ms-signin-info__account-link-button',\n linkText: cta.linkText,\n linkUrl: cta.linkUrl.destinationUrl,\n openInNewTab: cta.openInNewTab,\n role: 'button',\n additionalProperties: attributes\n };\n\n return (\n \n );\n });\n }\n\n private _toggleNavbar(): void {\n this.setState({\n mobileMenuCollapsed: !this.state.mobileMenuCollapsed\n });\n }\n\n private _togglePopover(): void {\n this.setState({\n signinPopoverOpen: !this.state.signinPopoverOpen\n });\n }\n\n private _keydown(e: KeyboardEvent): void {\n if (e.keyCode === KeyCodes.Escape) {\n this.setState({ mobileMenuCollapsed: true });\n }\n }\n}\n\nexport default Header;","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport { getPriceForSelectedVariant, getProductUrlSync, OrderTemplate, OrderTemplateLine, PriceForSelectedVariantInput } from '@msdyn365-commerce-modules/retail-actions';\nimport { Alert, getTelemetryObject, Heading, IModuleProps, INodeProps, ITelemetryContent, UncontrolledPagination } from '@msdyn365-commerce-modules/utilities';\nimport { IItemAddedToCartDialogData, IItemAddedToCartDialogResources, ILinesAddedToCartDialogResources, IOrderTemplateNameDialogResources, ItemAddedToCartDialog } from '@msdyn365-commerce/components';\nimport MsDyn365, { AsyncResult, getUrlSync, IRequestContext } from '@msdyn365-commerce/core';\nimport { getCartState } from '@msdyn365-commerce/global-state';\nimport { CartLine, ProductList, ProductListLine } from '@msdyn365-commerce/retail-proxy';\nimport { addCartLinesAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/CartsDataActions.g';\nimport {\n deleteAsync,\n removeProductListLinesAsync,\n updateProductListLinesAsync\n} from '@msdyn365-commerce/retail-proxy/dist/DataActions/ProductListsDataActions.g';\nimport { SimpleProduct } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\nimport classnames from 'classnames';\nimport debounce from 'lodash/debounce';\nimport { action, computed, observable } from 'mobx';\nimport { observer } from 'mobx-react';\nimport * as React from 'react';\nimport {\n IOrderTemplateActionsProps,\n IOrderTemplateActionsViewProps,\n IOrderTemplateData,\n IOrderTemplateLineProps,\n IOrderTemplateLineViewProps,\n IOrderTemplateProps,\n IOrderTemplateResources,\n IOrderTemplateTableHeadingProps,\n OrderTemplateActionsView,\n OrderTemplateBulkActions,\n OrderTemplateLinesStatusMessage,\n OrderTemplateLineView,\n OrderTemplateMobileLineView,\n OrderTemplateTableHeading\n} from '../../';\nimport { ActiveOrderTemplateLinesInput } from './actions/get-order-template';\n\nexport interface IOrderTemplateLineActionMessageState {\n itemKey: string;\n userMessage: string;\n statusCssString: string;\n messageGlyph: string;\n isOpen: boolean;\n isItemAddedToOrderTemplateOpen: boolean;\n isConfirmAddSelectionToBagModalOpen: boolean;\n itemAddedToCartDialogData?: IItemAddedToCartDialogData;\n productSelection: IOrderTemplateLineViewModel[];\n isDetailsDisplayed: boolean;\n detailedProductView?: IOrderTemplateLineViewProps;\n}\n\nexport type orderTemplateLinesStatus = 'LOADING' | 'SUCCESS' | 'FAILED' | 'EMPTY';\ntype GridSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl';\n\nexport interface IOrderTemplateViewProps extends IOrderTemplateProps {\n OrderTemplateLines: IModuleProps;\n callbacks?: IOrderTemplateLinesCallbacks;\n status?: orderTemplateLinesStatus;\n statusMessage?: React.ReactNode;\n heading?: React.ReactNode;\n OrderTemplateActions?: INodeProps;\n ProductsTable?: INodeProps;\n ProductsTableRow?: INodeProps;\n ProductsTableHeading?: React.ReactNode;\n ProductDetails?: INodeProps;\n orderLines?: IOrderTemplateLineViewProps[];\n productListLines?: ProductListLine[];\n productsStatusMessage?: React.ReactNode;\n orderActions?: IOrderTemplateActionsViewProps | null;\n resources: IOrderTemplateResources;\n pagination?: React.ReactNode;\n itemAddedToCartDialog?: React.ReactNode;\n bulkOrderLineActions?: React.ReactNode;\n isDetailsDisplayed?: boolean;\n detailedProduct?: IOrderTemplateLineProps;\n detailedProductView?: IOrderTemplateLineViewProps;\n productQuantityView?: React.ReactNode;\n addButton?: React.ReactNode;\n isMobile?: boolean;\n toggleDetailsDisplayed?(props: IOrderTemplateLineProps | undefined): void;\n}\n\nexport interface IOrderTemplateLinesCallbacks {\n updateQuantity(itemKey: string, quantity: number): void;\n}\n\nexport interface IOrderTemplateLineViewModel extends OrderTemplateLine {\n isChecked: boolean;\n productQuantityView: React.ReactNode;\n}\n\n/**\n *\n * OrderTemplateLines component\n * @extends {React.PureComponent, IOrderTemplateLineActionMessageState>}\n */\n@observer\nclass OrderTemplateLines extends React.Component, IOrderTemplateLineActionMessageState> {\n private readonly className: string;\n private telemetryContent?: ITelemetryContent;\n\n @observable\n private _viewport: GridSize;\n @computed get isMobile(): boolean {\n return (this._viewport === 'xs' || this._viewport === 'sm');\n }\n\n constructor(props: IOrderTemplateProps, state: IOrderTemplateLineActionMessageState) {\n super(props);\n this.className = 'ms-order-template';\n this._viewport = props.context.request && props.context.request.device && props.context.request.device.Type === 'Mobile' ? 'xs' : 'lg';\n this._updateViewport = this._updateViewport.bind(this);\n\n this.state = {\n itemKey: '',\n userMessage: '',\n statusCssString: 'success',\n messageGlyph: 'fas fa-check',\n isOpen: false,\n isItemAddedToOrderTemplateOpen: false,\n isConfirmAddSelectionToBagModalOpen: false,\n productSelection: [],\n isDetailsDisplayed: false\n };\n this.telemetryContent = getTelemetryObject(this.props.context.request.telemetryPageName!, this.props.friendlyName, this.props.telemetry);\n this._updateViewport();\n\n if (!this.props.context.request.user.isAuthenticated) {\n window.location.assign(this.props.context.request.user.signInUrl || '/');\n }\n }\n\n @action\n public async componentDidMount(): Promise {\n this.setState({});\n const orderTemplate = await this.props.data.orderTemplate;\n this.props.config.heading!.text = orderTemplate.productList.Name || '';\n this.setState({\n productSelection: orderTemplate.orderTemplateLines as IOrderTemplateLineViewModel[]\n });\n\n if (typeof window !== undefined && window.addEventListener) {\n window.addEventListener('resize', this._updateViewport);\n this._updateViewport();\n }\n }\n\n public componentWillUnmount(): void {\n if (typeof window !== undefined && window.addEventListener) {\n window.removeEventListener('resize', this._updateViewport);\n }\n }\n\n // tslint:disable-next-line:max-func-body-length\n public render(): JSX.Element | null {\n const { heading, className } = this.props.config;\n const { emptyOrderTemplateLinesText, errorGettingOrderTemplateLines } = this.props.resources;\n const { orderTemplate, cart } = this.props.data;\n\n if (cart.status === 'LOADING' || orderTemplate.status === 'LOADING') {\n const errorProps: IOrderTemplateViewProps = {\n ...(this.props as IOrderTemplateProps),\n OrderTemplateLines: {\n moduleProps: this.props,\n className: classnames(this.className, className)\n },\n status: 'LOADING',\n statusMessage: ,\n heading: heading && ,\n resources: this.props.resources\n };\n return this.props.renderView(errorProps);\n }\n\n if (cart.status === 'FAILED' || orderTemplate.status === 'FAILED') {\n const errorProps: IOrderTemplateViewProps = {\n ...(this.props as IOrderTemplateProps),\n OrderTemplateLines: {\n moduleProps: this.props,\n className: classnames(`${this.className}`, className)\n },\n status: 'FAILED',\n statusMessage: ,\n heading: heading && ,\n resources: this.props.resources\n };\n\n return this.props.renderView(errorProps);\n }\n\n const orderTemplateResult = orderTemplate && orderTemplate.result;\n const orderTemplateLines = orderTemplateResult && orderTemplateResult.orderTemplateLines;\n\n if (!orderTemplateResult || !orderTemplateLines || orderTemplateLines.length === 0) {\n if (orderTemplateResult && !this._isFirstPage()) {\n window.location.href = this._getOrderTemplatePageUrl();\n return null;\n }\n\n const emptyViewProps: IOrderTemplateViewProps = {\n ...(this.props as IOrderTemplateProps),\n OrderTemplateLines: {\n moduleProps: this.props,\n className: classnames(`${this.className}`, className)\n },\n status: 'EMPTY',\n statusMessage: ,\n heading: heading && ,\n resources: this.props.resources\n };\n\n return this.props.renderView(emptyViewProps);\n }\n\n const viewProps: IOrderTemplateViewProps = {\n ...(this.props as IOrderTemplateProps),\n OrderTemplateLines: {\n moduleProps: this.props,\n className: classnames(`${this.className}`, className)\n },\n status: 'SUCCESS',\n productsStatusMessage: this.state.isOpen && (\n
\n \n {this.state.userMessage}\n \n
\n ),\n heading: heading && ,\n OrderTemplateActions: {\n className: `${this.className}-action-bar`,\n tag: 'div'\n },\n ProductsTable: {\n className: `${this.className}__table`,\n tag: 'table'\n },\n ProductsTableRow: {\n className: `${this.className}-table-line`,\n tag: 'tr'\n },\n ProductsTableHeading: this._renderProductListHeader(this.props.resources),\n ProductDetails: {\n className: `${this.className}-table-line__link`,\n tag: 'a'\n },\n orderLines: this._renderProductList(),\n callbacks: { updateQuantity: debounce(this._changeQuantity, 2000) },\n orderActions: this._renderOrderTemplateActions(orderTemplateResult),\n pagination: this._renderPagination(),\n itemAddedToCartDialog: this._renderItemAddedToCartDialog(),\n bulkOrderLineActions: this._getOrderTemplateLineActions(orderTemplateResult.productList.Id),\n isDetailsDisplayed: this.state.isDetailsDisplayed,\n toggleDetailsDisplayed: this._toggleDetailsDisplayed,\n detailedProductView: this.state.detailedProductView,\n isMobile: this.isMobile\n };\n\n return this.props.renderView(viewProps) as React.ReactElement;\n }\n\n public onSelect(line: IOrderTemplateLineViewModel, isChecked: boolean): void {\n line.isChecked = isChecked;\n\n const updated = this.state.productSelection.map(product => {\n if (product.fullProduct?.ProductDetails.ItemId === line.fullProduct?.ProductDetails.ItemId) {\n line.isChecked = isChecked;\n }\n return product;\n }) || [];\n\n this.setState({\n productSelection: updated\n });\n }\n\n public onSelectAll(isChecked: boolean): void {\n const updated = this.state.productSelection.map(line => {\n line.isChecked = isChecked;\n return line;\n }) || [];\n\n this.setState({\n productSelection: updated\n });\n }\n\n private _renderProductListHeader(resources: IOrderTemplateResources): React.ReactNode {\n const { productNumberText, productText, productUnitPriceText, productUOMText, productQuantityText, productActionsText } = resources;\n const headers: IOrderTemplateTableHeadingProps = {\n productNumber: productNumberText,\n productName: productText,\n productUnitPrice: productUnitPriceText,\n productUOM: productUOMText,\n productQuantity: productQuantityText,\n productActions: productActionsText,\n lines: this.state.productSelection,\n isMobile: this.isMobile,\n clickHandler: (isChecked: boolean) => this.onSelectAll(isChecked)\n };\n\n return ;\n }\n\n private _getOrderTemplateLineActions(orderTemplateId: string): React.ReactNode {\n return (\n line.isChecked)}\n onAddSelectionToBag={this._onAddSelectionToBag}\n onRemoveSelection={this._onRemoveSelection}\n isMinifiedView={this.isMobile}\n />\n );\n }\n\n private _generateLinesAddedToCartDialogResources(): ILinesAddedToCartDialogResources {\n return {\n viewCartButtonText: this.props.resources.viewCartButtonText,\n orderTemplateCloseButtonText: this.props.resources.orderTemplateCloseButtonText,\n linesAddedToCartHeaderItemsOneText: this.props.resources.linesAddedToCartHeaderItemsOneText,\n linesAddedToCartHeaderLinesOneText: this.props.resources.linesAddedToCartHeaderLinesOneText,\n linesAddedToCartHeaderLinesFormatText: this.props.resources.linesAddedToCartHeaderLinesFormatText,\n linesAddedToCartHeaderMessageText: this.props.resources.linesAddedToCartHeaderMessageText\n };\n }\n\n private _generateItemAddedToCartDialogResources(): IItemAddedToCartDialogResources {\n return {\n viewCartButtonText: this.props.resources.viewCartButtonText,\n orderTemplateCloseButtonText: this.props.resources.orderTemplateCloseButtonText,\n itemAddedToCartHeaderItemOneText: this.props.resources.itemAddedToCartHeaderItemOneText,\n itemAddedToCartHeaderItemFormatText: this.props.resources.itemAddedToCartHeaderItemFormatText,\n itemAddedToCartHeaderMessageText: this.props.resources.itemAddedToCartHeaderMessageText,\n freePriceText: this.props.resources.freePriceText,\n originalPriceText: this.props.resources.originalPriceText,\n currentPriceText: this.props.resources.currentPriceText\n };\n }\n\n private _onRemoveSelection = (): void => {\n const { context, resources } = this.props;\n const { telemetry } = context;\n const { removeSelectedFailureMessage, removeSelectedSuccessMessage } = resources;\n const lines = this.state.productSelection;\n const productListLines = lines && lines.length && lines\n .filter(line => line.isChecked)\n .map(line => line.productListLine);\n\n if (productListLines && productListLines.length) {\n const productListId = productListLines[0].ProductListId;\n\n removeProductListLinesAsync({ callerContext: context.actionContext }, productListId!, productListLines)\n .then(() => {\n this.setState({\n userMessage: removeSelectedSuccessMessage,\n statusCssString: 'success',\n messageGlyph: 'fas fa-check',\n isOpen: true\n });\n window.location.reload();\n })\n .catch(error => {\n telemetry.warning('[order-template-lines] Unable remove items from the order template lines');\n telemetry.error(error);\n this.setState({\n userMessage: removeSelectedFailureMessage,\n statusCssString: 'success',\n messageGlyph: 'fas fa-check',\n isOpen: true\n });\n });\n }\n }\n\n private _getOrderTemplatePageUrl = (): string => {\n let url = getUrlSync('ordertemplate', this.props.context.actionContext) || '';\n url = url.includes('?') ? url.substr(0, url.indexOf('?')) : url;\n if (this.props.data.orderTemplate.result?.productList.Id) {\n return `${url}?id=${this.props.data.orderTemplate.result.productList.Id}`;\n } else {\n return '';\n }\n };\n\n private _onAddSelectionToBag = async (): Promise => {\n const { context, resources } = this.props;\n const { addedToCartFailureMessage, addedToCartSuccessMessage } = resources;\n const lines = this.state.productSelection;\n const cartState = await getCartState(context.actionContext);\n const selectedLines = lines.filter(line => line.isChecked);\n\n if (selectedLines.length) {\n const cartLines = selectedLines.map(productLine => {\n return {\n ItemId: productLine.fullProduct?.ProductDetails.ItemId,\n ProductId: productLine.productListLine.ProductId,\n Quantity: productLine.productListLine.Quantity || 1,\n TrackingId: '',\n UnitOfMeasureSymbol: productLine.productListLine.UnitOfMeasure || productLine.fullProduct?.ProductDetails.DefaultUnitOfMeasure\n } as CartLine ;\n }) || [];\n\n return addCartLinesAsync({ callerContext: context.actionContext }, cartState.cart.Id, cartLines, cartState.cart.Version!)\n .then(async res => {\n context.telemetry.trace(`Order template; selected line items (${cartLines.map(line => line.ItemId).join(',')}) added to cart: ${cartState.cart.Id}`);\n await cartState.refreshCart({});\n this.setState({\n userMessage: addedToCartSuccessMessage,\n statusCssString: 'success',\n messageGlyph: 'fas fa-check',\n isOpen: true\n });\n })\n .catch(error => {\n context.telemetry.trace('Unable to add order template to cart.');\n this.setState({\n userMessage: addedToCartFailureMessage,\n statusCssString: 'danger',\n messageGlyph: 'fas fa-exclamation-triangle',\n isOpen: true\n });\n });\n }\n\n return Promise.resolve(void(0));\n };\n\n private _renderOrderTemplateActions(orderTemplate: OrderTemplate): IOrderTemplateActionsViewProps {\n const { id, typeName, context, resources } = this.props;\n const {\n addTemplateToBagButtonText,\n renameTemplateButtonText,\n deleteTemplateButtonText,\n closeWindowButtonText,\n addToCartFailureMessage,\n addToCartSuccessMessage,\n addToCartProcessMessage\n } = resources;\n\n const orderTemplateActions: IOrderTemplateActionsProps = {\n data: { orderTemplate },\n id: id,\n typeName: typeName,\n context: context,\n telemetryContent: this.telemetryContent,\n handlers: {\n onRenameTemplate: this._renameTemplate,\n onRemoveTemplate: this._removeTemplate\n },\n renameOrderTemplateDialogStrings: this._generateOrderTemplateNameDialogResources(resources),\n resources: {\n addTemplateToBagButtonText: addTemplateToBagButtonText,\n renameTemplateButtonText: renameTemplateButtonText,\n deleteTemplateButtonText: deleteTemplateButtonText,\n addToCartFailureMessage: addToCartFailureMessage,\n addToCartSuccessMessage: addToCartSuccessMessage,\n addToCartProcessMessage: addToCartProcessMessage,\n closeWindowButtonText: closeWindowButtonText,\n linesAddedToCartDialogResources: this._generateLinesAddedToCartDialogResources()\n }\n };\n\n return OrderTemplateActionsView(orderTemplateActions);\n }\n\n private _generateOrderTemplateNameDialogResources(resources: IOrderTemplateResources): IOrderTemplateNameDialogResources {\n return {\n orderTemplateHeaderLabel: resources.renameOrderTemplateTitleText,\n orderTemplateTitleLabel: resources.orderTemplateTitle,\n orderTemplateNameAriaLabel: resources.orderTemplateTitle,\n orderTemplateDescription: '',\n defaultOrderTemplateName: resources.defaultOrderTemplateName,\n orderTemplateButtonLabel: resources.renameOrderTemplateButtonText,\n orderTemplateCancelButtonLabel: resources.cancelBtnLabel\n };\n }\n\n private _getCurrentUrl = (reqContext: IRequestContext): URL=> {\n if (MsDyn365.isBrowser) {\n return new URL(window.location.href);\n }\n return new URL(reqContext.url.requestUrl.href);\n }\n\n private _renderItemAddedToCartDialog = (): React.ReactNode | null => {\n if (!this.state.itemAddedToCartDialogData) {\n return null;\n }\n\n const onClose = () => {\n this.setState({\n itemKey: this.state.itemKey,\n userMessage: this.state.userMessage,\n statusCssString: this.state.statusCssString,\n messageGlyph: this.state.messageGlyph,\n isOpen: this.state.isOpen,\n isItemAddedToOrderTemplateOpen: false\n });\n };\n\n return (\n \n );\n }\n\n private _isFirstPage(): boolean {\n return this._getCurrentPageNumber() === 0;\n }\n\n private _getCurrentPageNumber(): number {\n const itemsPerPage = this.props.config.itemsPerPage || 50;\n return this.props.context.request.query && (+this.props.context.request.query.skip / itemsPerPage) || 0;\n }\n\n private _renderPagination = (): React.ReactNode | null => {\n const { config, context, data, resources } = this.props;\n const orderTemplate = data && data.orderTemplate && data.orderTemplate.result;\n if (!orderTemplate) {\n return null;\n }\n\n const fullUrl = this._getCurrentUrl(context.request);\n const itemsPerPage = config.itemsPerPage || 50;\n const currentPageNumber = this._getCurrentPageNumber();\n const skipCount = currentPageNumber * itemsPerPage;\n const totalItems = orderTemplate && orderTemplate.totalLines;\n const previousText = resources.flipperPrevious;\n const nextText = resources.flipperNext;\n\n if (totalItems <= itemsPerPage) {\n return null;\n }\n\n return (\n
}\n nextText={
{nextText}
}\n previousAriaLabel={previousText}\n nextAriaLabel={nextText}\n />\n );\n }\n\n private _renderProductList(): IOrderTemplateLineViewProps[] {\n const {\n priceFree,\n originalPriceText,\n currentPriceText,\n addOrderTemplateItemToBagButtonText,\n removeItemFromOrderTemplateButtonText,\n productDimensionTypeColor,\n productDimensionTypeSize,\n productDimensionTypeStyle,\n inputQuantityAriaLabel,\n deleteButtonText\n } = this.props.resources;\n\n const { context, telemetry } = this.props;\n const { imageSettings } = this.props.config;\n\n return this.state.productSelection?.map((line, index) => {\n const currentProductProps: IOrderTemplateLineProps = {\n orderTemplateLine: line,\n productListLine: line.productListLine ,\n price: line.fullProduct?.ProductPrice,\n context: context,\n productUrl: line.fullProduct ? getProductUrlSync(line.fullProduct.ProductDetails, context.actionContext, undefined) : '',\n imageSettings: imageSettings,\n telemetry: telemetry,\n moduleId: this.props.id,\n moduleTypeName: this.props.typeName,\n quantity: line.productListLine.Quantity!,\n handlers: {\n onAddToBag: this._addItemToBag,\n onRemoveItem: this._removeItemFromOrderTemplateLines,\n onChangeQuantity: this._changeQuantity,\n onSelect: this.onSelect.bind(this)\n },\n resources: {\n productDimensionTypeColor: productDimensionTypeColor,\n productDimensionTypeSize: productDimensionTypeSize,\n productDimensionTypeStyle: productDimensionTypeStyle,\n freePriceText: priceFree,\n originalPriceText: originalPriceText,\n currentPriceText: currentPriceText,\n inputQuantityAriaLabel: inputQuantityAriaLabel,\n removeFromOrderTemplateLinesText: removeItemFromOrderTemplateButtonText,\n addToBagButtonText: addOrderTemplateItemToBagButtonText,\n deleteButtonText: deleteButtonText\n },\n index: index,\n isMobile: this.isMobile,\n toggleDetailsDisplayed: this._toggleDetailsDisplayed\n };\n\n return OrderTemplateLineView(currentProductProps)!;\n });\n }\n\n private _toggleDetailsDisplayed = (props: IOrderTemplateLineProps): void => {\n let state = {\n isDetailsDisplayed: !this.state.isDetailsDisplayed,\n };\n if (props) {\n state = {...state, ...{\n detailedProductView: OrderTemplateMobileLineView(props)\n }};\n }\n this.setState(state);\n }\n\n // dismiss alert when addingToCart/removeItem\n private _onDismiss = () => {\n this.setState({\n isOpen: false\n });\n };\n\n private _changeQuantity = (itemKey: string, quantity: number, props?: IOrderTemplateLineProps) => {\n const { context, data, telemetry, config } = this.props;\n const { orderTemplate } = data;\n\n if (context) {\n if (orderTemplate.result) {\n const orderTemplateLinesData = orderTemplate && orderTemplate.result && orderTemplate.result.orderTemplateLines;\n if (orderTemplateLinesData) {\n const orderLineIndex = orderTemplateLinesData.findIndex(lines => lines.productListLine.LineId === itemKey);\n const newProductListLine = { ...orderTemplateLinesData[orderLineIndex] };\n if (orderTemplateLinesData[orderLineIndex].productListLine.Quantity === quantity) {\n return;\n }\n const prevQuantity = newProductListLine.productListLine.Quantity;\n newProductListLine.productListLine.Quantity = quantity;\n const { fullProduct, ...line } = newProductListLine;\n\n // update mobile modal\n if (props) {\n props.quantity = quantity;\n this.setState({\n detailedProductView: OrderTemplateMobileLineView(props)\n });\n }\n\n updateProductListLinesAsync({ callerContext: context.actionContext }, orderTemplate.result.productList.Id, [line.productListLine])\n .then(list => {\n this.setState({\n itemKey: itemKey,\n userMessage: '',\n statusCssString: 'success',\n messageGlyph: 'fas fa-check',\n isOpen: false\n });\n if (list) {\n const newLine = list.find(lines => lines.LineId === itemKey);\n orderTemplateLinesData[orderLineIndex].productListLine = newLine!;\n const updatedLines = [...orderTemplateLinesData];\n updatedLines[orderLineIndex] = { fullProduct, productListLine: newLine! };\n const updatedOrderTemplate = { ...orderTemplate.result, ProductListLines: updatedLines };\n context.actionContext.update(new ActiveOrderTemplateLinesInput(context.actionContext.requestContext, config), updatedOrderTemplate);\n }\n })\n .catch(error => {\n telemetry.warning('[order-template-lines] Unable to update product quantity.');\n telemetry.error(error);\n const userMessage = 'Failed to update quantity value.';\n if (props) {\n props && (props.productListLine.Quantity = prevQuantity);\n this.setState({\n itemKey: itemKey,\n userMessage: userMessage,\n statusCssString: 'danger',\n messageGlyph: 'fas fa-exclamation-triangle',\n isOpen: true,\n detailedProductView: OrderTemplateMobileLineView(props)\n });\n } else {\n newProductListLine.productListLine.Quantity = prevQuantity;\n this.setState({\n itemKey: itemKey,\n userMessage: userMessage,\n statusCssString: 'danger',\n messageGlyph: 'fas fa-exclamation-triangle',\n isOpen: true,\n });\n }\n });\n }\n }\n }\n };\n\n private _addItemToBag = (product: SimpleProduct, quantity: number, itemKey: string): void => {\n const { context, data, resources, telemetry } = this.props;\n const { cart } = data;\n const { maxQuantityLimitText, addedToCartFailureMessage } = resources;\n\n if (context) {\n if (cart.result) {\n const addProductToCartInput = {\n product: product,\n count: quantity\n };\n\n cart.result\n .addProductToCart(addProductToCartInput)\n .then(result => {\n if (result.status === 'SUCCESS') {\n return getPriceForSelectedVariant(\n new PriceForSelectedVariantInput(\n product.RecordId,\n this.props.context.actionContext.requestContext.apiSettings.channelId,\n product),\n this.props.context.actionContext).then(priceResult => {\n if (!priceResult) {\n return AsyncResult.reject('Failed to retrieve product price');\n }\n this.setState({\n itemKey: itemKey,\n userMessage: '',\n statusCssString: 'success',\n messageGlyph: 'fas fa-check',\n isOpen: false,\n isItemAddedToOrderTemplateOpen: true,\n itemAddedToCartDialogData: {\n product: product,\n productPrice: priceResult,\n quantity: quantity\n },\n isDetailsDisplayed: false\n });\n return AsyncResult.resolve();\n });\n } else if (result.substatus === 'MAXQUANTITY') {\n this.setState({\n itemKey: itemKey,\n userMessage:\n maxQuantityLimitText\n .replace('{curQuantity}', quantity.toString())\n .replace('{maxQuantity}', context.app.config.maxQuantityForProductListLineItem.toString()) ||\n `You can only add ${context.app.config.maxQuantityForProductListLineItem} of this item to your shopping bag`,\n statusCssString: 'danger',\n messageGlyph: 'fas fa-exclamation-triangle',\n isOpen: true\n });\n return AsyncResult.resolve();\n } else {\n telemetry.debug('[order-template-lines] Unable to Update Cart Line from the order template lines');\n this.setState({\n itemKey: itemKey,\n userMessage: addedToCartFailureMessage,\n statusCssString: 'danger',\n messageGlyph: 'fas fa-exclamation-triangle',\n isOpen: true\n });\n return AsyncResult.resolve();\n }\n })\n .catch(error => {\n telemetry.warning(error);\n telemetry.debug('[order-template-lines] Error trying to Update Cart Line from the order template lines');\n this.setState({\n itemKey: itemKey,\n userMessage: addedToCartFailureMessage,\n statusCssString: 'danger',\n messageGlyph: 'fas fa-exclamation-triangle',\n isOpen: true\n });\n });\n }\n }\n };\n\n private _removeItemFromOrderTemplateLines = (line: IOrderTemplateLineViewModel): void | undefined => {\n const { context, data, telemetry } = this.props;\n const { orderTemplate } = data;\n\n if (context && context.actionContext) {\n const userToken = context.request.user.isAuthenticated && context.request.user.token;\n if (userToken && orderTemplate.result && orderTemplate.result && line) {\n removeProductListLinesAsync({ callerContext: context.actionContext }, line.productListLine.ProductListId!, [line.productListLine])\n .then(() => {\n window.location.reload(false);\n })\n .catch(error => {\n telemetry.warning('[order-template-lines] Unable remove items from the order template lines');\n telemetry.error(error);\n });\n } else {\n telemetry.warning(\n '[order-template-lines] Unable remove items from the order template lines user token or lineItemID was not found'\n );\n }\n }\n };\n\n private _renameTemplate = async (_template: ProductList): Promise => {\n window.location.reload(false);\n return Promise.resolve();\n };\n\n private _removeTemplate = () => {\n const { context, data, telemetry, resources } = this.props;\n const { orderTemplate } = data;\n\n if (context && context.actionContext) {\n const userToken = context.request.user.isAuthenticated && context.request.user.token;\n if (userToken && orderTemplate && orderTemplate.result) {\n deleteAsync({ callerContext: context.actionContext }, orderTemplate.result.productList)\n .then()\n .catch((error: string) => {\n telemetry.warning('[order-template] Unable to delete order template.');\n telemetry.error(error);\n this.setState({\n itemKey: orderTemplate.result?.productList.Id || '',\n userMessage: resources.deleteOrderTemplateFailedText,\n statusCssString: 'danger',\n messageGlyph: 'fas fa-exclamation-triangle',\n isOpen: true\n });\n });\n const newLink = getUrlSync('ordertemplatelist', this.props.context.actionContext);\n if (newLink) {\n window.location.assign(newLink);\n }\n } else {\n telemetry.warning('[order-template] Failed to delete order template. Order template was not found');\n }\n } else {\n telemetry.warning('[order-template] Failed to delete order template.');\n }\n };\n\n private _updateViewport(): void {\n this._viewport = this._getViewport();\n }\n\n private _getViewport = (): GridSize => {\n const { context } = this.props;\n\n // always render in mobile viewport on a mobile device\n if (context.request && context.request.device && context.request.device.Type === 'Mobile') {\n return 'xs';\n }\n\n if (typeof window !== undefined && window.innerWidth) {\n const gridSettings = context.request.gridSettings;\n if (gridSettings) {\n if (gridSettings.xs && window.innerWidth <= gridSettings.xs.w) {\n return 'xs';\n } else if (gridSettings.sm && window.innerWidth <= gridSettings.sm.w) {\n return 'sm';\n } else if (gridSettings.md && window.innerWidth <= gridSettings.md.w) {\n return 'md';\n } else if (gridSettings.lg && window.innerWidth <= gridSettings.lg.w) {\n return 'lg';\n } else {\n return 'xl';\n }\n }\n }\n\n return 'xs';\n }\n}\n\nexport default OrderTemplateLines;\n","import {\n format,\n INodeProps,\n Progress\n} from '@msdyn365-commerce-modules/utilities';\nimport { RatingsSummary } from '@msdyn365-commerce/commerce-entities';\nimport React from 'react';\n\nexport interface IHistogramItemsProps {\n ratingsSummary: RatingsSummary;\n resources: IHistogramItemsResources;\n locale: string;\n onClick(stars: number): void;\n}\n\nexport interface IHistogramItemsResources {\n barItemAriaLabel: string;\n}\n\nexport interface IHistogramItemViewProps {\n starLabel: React.ReactElement;\n bar: React.ReactElement;\n percentage: React.ReactElement;\n buttonProps: INodeProps;\n}\n\n/**\n * CartLineItems component\n */\n\nexport const HistogramItems = (props: IHistogramItemsProps): IHistogramItemViewProps[] => {\n const {ratingsSummary} = props;\n const totalRatingsCount: number = ratingsSummary.totalRatingsCount || 0;\n return [\n renderItem(props, 5, ratingsSummary.star5Count, totalRatingsCount),\n renderItem(props, 4, ratingsSummary.star4Count, totalRatingsCount),\n renderItem(props, 3, ratingsSummary.star3Count, totalRatingsCount),\n renderItem(props, 2, ratingsSummary.star2Count, totalRatingsCount),\n renderItem(props, 1, ratingsSummary.star1Count, totalRatingsCount),\n ];\n};\n\nconst renderItem = (props: IHistogramItemsProps, stars: number, count?: number, totalCount?: number): IHistogramItemViewProps => {\n count = count || 0;\n totalCount = totalCount || 0;\n const percentage = totalCount === 0 ? 0 : count / totalCount;\n const formattedPercent = new Intl.NumberFormat(props.locale, { style: 'percent' }).format(percentage);\n const ariaLabel = format(props.resources.barItemAriaLabel, stars, formattedPercent);\n\n return {\n starLabel: {stars},\n percentage: {formattedPercent},\n bar: ,\n buttonProps: {tag: 'button', className: 'ms-ratings-histogram__item', onClick: () => {props.onClick(stars);}}\n };\n};\n\nexport const AverageRatingNumber: React.FC<{summary: RatingsSummary}> = (props: {summary: RatingsSummary}) => {\n return

{props.summary.averageRating} / 5

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

{props.summary.totalRatingsCount}

;\n};","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\nimport { format, IModuleProps, INodeProps } from '@msdyn365-commerce-modules/utilities';\nimport { RatingComponent } from '@msdyn365-commerce/components';\nimport * as Msdyn365 from '@msdyn365-commerce/core';\nimport classname from 'classnames';\nimport { observer } from 'mobx-react';\nimport * as React from 'react';\nimport { createRatingsReviewsStateInput } from '../../actions/ratings-reviews-state-data-action';\nimport { AverageRatingNumber, HistogramItems, IHistogramItemViewProps, TotalReviews } from './component/components';\nimport { IRatingsHistogramData } from './ratings-histogram.data';\nimport { IRatingsHistogramProps } from './ratings-histogram.props.autogenerated';\n\nexport interface IRatingsHistogramViewProps extends IRatingsHistogramProps {\n className: string;\n histogramItems: IHistogramItemViewProps[];\n moduleProps: IModuleProps;\n heading: React.ReactNode;\n averageRating: React.ReactNode;\n averageNumber: React.ReactNode;\n totalReviews: React.ReactNode;\n histogramProps: INodeProps;\n ratingsSummaryProps: INodeProps;\n callbacks: IRatingsHistogramCallbacks;\n}\n\nexport interface IRatingsHistogramCallbacks {\n selectFilterBy(stars: number): void;\n}\n\n/**\n * RatingsHistogram component\n * @extends {React.Component>}\n */\n@observer\nclass RatingsHistogram extends React.Component> {\n\n constructor(props: IRatingsHistogramProps) {\n super(props);\n this.selectFilterBy = this.selectFilterBy.bind(this);\n }\n\n public render(): JSX.Element | null {\n const { resources } = this.props;\n const { className, heading } = this.props.config;\n const {ratingsSummary: {result: ratingsSummary}} = this.props.data;\n const ratingCount = ratingsSummary && ratingsSummary.totalRatingsCount ? `${ratingsSummary.totalRatingsCount}` : '0';\n\n const completeClass = classname('ms-ratings-histogram', className);\n const viewProps: IRatingsHistogramViewProps = {\n ...this.props,\n className: completeClass,\n callbacks: {\n selectFilterBy: this.selectFilterBy\n },\n moduleProps: {\n moduleProps: this.props,\n className: completeClass\n },\n histogramItems: ratingsSummary ? HistogramItems({ratingsSummary: ratingsSummary, resources: {...resources}, locale: this.props.context.request.locale, onClick: this.selectFilterBy}) : [],\n averageRating: ratingsSummary && (\n \n ),\n averageNumber: ratingsSummary && ,\n totalReviews: ratingsSummary && ,\n ratingsSummaryProps: {className: 'ms-ratings-histogram__summary'},\n heading: heading && (\n \n ),\n histogramProps: {className: 'ms-ratings-histogram__histogram'}\n };\n\n return this.props.renderView(viewProps) as React.ReactElement;\n }\n\n public handleHeadingChange = (event: Msdyn365.ContentEditableEvent) => this.props.config.heading!.text = event.target.value;\n\n public selectFilterBy(stars: number): void {\n const filterKey = `${stars}`;\n this.props.context.actionContext.update(createRatingsReviewsStateInput({filterKey}), {filterKey});\n }\n}\n\nexport default RatingsHistogram;\n","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\nimport * as React from 'react';\n\nexport interface IWishlistItemDimension {\n key: string;\n className?: string;\n dimensionType: string;\n dimensionValue: string;\n}\n\nexport const WishlistItemDimension: React.FC = ({ key, className, dimensionType, dimensionValue }) => (\n
\n {dimensionType}:\n {dimensionValue}\n
\n);","import { getFallbackImageUrl } from '@msdyn365-commerce-modules/retail-actions';\nimport { Alert, Button, getPayloadObject, getTelemetryAttributes, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\nimport { PriceComponent } from '@msdyn365-commerce/components';\nimport { ICoreContext, IImageSettings, Image, ITelemetry } from '@msdyn365-commerce/core';\nimport { CommerceListLine, ProductPrice, ReleasedProductType, SimpleProduct } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\nimport * as React from 'react';\nimport { IWishlistItemActionMessageState } from '../wishlist-items';\nimport { WishlistItemDimension } from './wishlist-items-dimensions';\n\nexport interface IWishlistItemProps extends CommerceListLine {\n product: SimpleProduct;\n wishlistState: IWishlistItemActionMessageState;\n price?: ProductPrice;\n context: ICoreContext;\n productUrl: string;\n imageSettings?: IImageSettings;\n removeFromWishlistText: string;\n isInStock: boolean;\n addToCartText: string;\n outOfStockText: string;\n index: number;\n itemKey: string;\n telemetry: ITelemetry;\n moduleId: string;\n moduleTypeName: string;\n enableImageProductLink?: boolean;\n inventoryInformationLabel?: string;\n inventoryLabelClassName?:string;\n telemetryContent?: ITelemetryContent;\n handlers: {\n onAddToCart(product: SimpleProduct, itemKey: string): void;\n onRemoveItem(productId: number): void | undefined;\n onDismiss(): void;\n };\n resources:{\n productDimensionTypeColor: string;\n productDimensionTypeSize: string;\n productDimensionTypeStyle: string;\n originalPriceText: string;\n currentPriceText: string;\n freePriceText: string;\n };\n}\n\nexport interface IWishlistItemViewProps {\n key: string;\n productImage: React.ReactNode;\n productLink: React.ReactNode;\n productDimensions?: React.ReactNode[];\n productPrice?: React.ReactNode;\n addToCartButton?: React.ReactNode;\n removeButton?: React.ReactNode;\n productStatusMessage?: React.ReactNode;\n productName?: React.ReactNode;\n productAriaLabel?: string;\n entireProductLink?: string;\n inventoryInformation?: React.ReactNode;\n}\n\nconst _addItemToCart = (props: IWishlistItemProps): void => {\n const { product, itemKey, handlers } = props;\n const { onAddToCart } = handlers;\n\n onAddToCart && product && itemKey && onAddToCart(product, itemKey);\n};\n\nconst _removeItemFromWishlist = (props: IWishlistItemProps): void => {\n const { onRemoveItem } = props.handlers;\n const { RecordId } = props.product;\n\n onRemoveItem && RecordId && onRemoveItem(RecordId);\n};\n\nconst WishListItemActions = {\n addToCart: _addItemToCart,\n removeItem: _removeItemFromWishlist,\n};\n\n// tslint:disable-next-line:cyclomatic-complexity\nexport const WishlistItem = (input: IWishlistItemProps): IWishlistItemViewProps | null => {\n const { product, productUrl, price, context, imageSettings, isInStock, removeFromWishlistText,\n addToCartText, outOfStockText, wishlistState, itemKey, handlers, enableImageProductLink, inventoryInformationLabel, inventoryLabelClassName, telemetryContent } = input;\n\n if (!product) {\n return null;\n }\n\n const { RecordId, Name, PrimaryImageUrl, Dimensions } = product;\n\n const addItemAction = (event: React.MouseEvent) => { return WishListItemActions.addToCart(input); };\n const removeItemAction = (event: React.MouseEvent) => { return WishListItemActions.removeItem(input); };\n const { onDismiss } = handlers;\n const inventoryCssName = inventoryLabelClassName? `ms-wishlist-items__inventory-label ${inventoryLabelClassName}` : 'ms-wishlist-items__inventory-label';\n const fallbackImage = getFallbackImageUrl(product.ItemId, context.actionContext.requestContext.apiSettings);\n const payLoad = getPayloadObject('click', telemetryContent!, '', RecordId.toString());\n const productAttributes = getTelemetryAttributes(telemetryContent!, payLoad);\n\n // check if the product is service or not by product type\n const PRODUCTASSERVICE = 2 as ReleasedProductType.Service;\n const isServiceItem = product.ItemTypeValue === PRODUCTASSERVICE;\n\n return {\n key: `${RecordId}-item`,\n productImage: PrimaryImageUrl && Name && _renderProductImage(context, product.Name!, PrimaryImageUrl, fallbackImage, imageSettings),\n productLink: productUrl &&\n (\n \n {Name}\n \n ),\n productDimensions: Dimensions && _renderProductDimensions(input),\n productPrice: price && _renderPrice(input),\n entireProductLink: enableImageProductLink ? productUrl : undefined,\n productAriaLabel: enableImageProductLink ? _renderAriaLabel(input) : undefined,\n productName: enableImageProductLink &&\n (\n
{Name}
\n ),\n\n addToCartButton:\n (\n \n { (isServiceItem || isInStock) && addToCartText || outOfStockText }\n \n ),\n inventoryInformation: inventoryInformationLabel && (\n {inventoryInformationLabel}\n ),\n removeButton:\n (\n \n ),\n productStatusMessage: wishlistState && wishlistState.isOpen &&\n wishlistState.productId === RecordId && wishlistState.itemKey === itemKey &&\n (\n
\n \n {wishlistState.userMessage}\n \n
\n )\n\n };\n\n};\n\nconst _renderProductImage = (context: ICoreContext, heading: string, image?: string, fallbackImage?: string, imageSettings?: IImageSettings): JSX.Element | null => {\n const defaultImageSettings: IImageSettings = {\n viewports: {\n xs: { q: `w=315&h=315&m=6`, w: 0, h: 0 },\n lg: { q: `w=315&h=315&m=6`, w: 0, h: 0 },\n xl: { q: `w=315&h=315&m=6`, w: 0, h: 0 }\n },\n lazyload: true,\n cropFocalRegion: true\n };\n\n if(imageSettings) {\n imageSettings.cropFocalRegion = true;\n }\n\n if (image) {\n return (\n \n );\n }\n return null;\n};\n\nconst _renderPrice = (props: IWishlistItemProps): JSX.Element | null => {\n const { price, context, moduleId, moduleTypeName, resources } = props;\n\n if (price) {\n return (\n \n );\n }\n return null;\n};\n\nconst _renderProductDimensions = (props: IWishlistItemProps): (React.ReactNode | undefined)[] => {\n const { product, resources } = props;\n\n if (!product || !product.Dimensions) {\n return [];\n }\n\n return product.Dimensions.map((dimension, index) => {\n if (!dimension.DimensionValue || !dimension.DimensionValue.Value) {\n return undefined;\n }\n\n let type = '';\n\n switch(dimension.DimensionTypeValue) {\n case 1: {\n type = resources.productDimensionTypeColor;\n break;\n }\n case 3: {\n type = resources.productDimensionTypeSize;\n break;\n }\n case 4: {\n type = resources.productDimensionTypeStyle;\n break;\n }\n default:\n return undefined;\n }\n\n return (\n \n );\n });\n};\n\nconst _renderAriaLabel = (props: IWishlistItemProps): string => {\n const { product, price, context, resources } = props;\n\n const { Name, Dimensions, } = product;\n const { productDimensionTypeColor, productDimensionTypeSize, productDimensionTypeStyle } = resources;\n\n let formattedPrice = 'Free';\n let dimensions = null;\n\n if (price) {\n formattedPrice = price.BasePrice === 0 ? resources.freePriceText : context.cultureFormatter.formatCurrency(price.BasePrice!, price.CurrencyCode);\n }\n\n if (Dimensions) {\n dimensions = Dimensions.map(productDimension => {\n switch(productDimension.DimensionTypeValue) {\n case 1:\n return (`${productDimensionTypeColor}${productDimension.DimensionValue && productDimension.DimensionValue.Value}`);\n case 3:\n return (`${productDimensionTypeSize}${productDimension.DimensionValue && productDimension.DimensionValue.Value}`);\n case 4:\n return (`${productDimensionTypeStyle}${productDimension.DimensionValue && productDimension.DimensionValue.Value}`);\n default:\n return '';\n }\n });\n }\n\n return (`${Name} ${formattedPrice} ${dimensions && dimensions.join('') || ''}`);\n};\n","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\nimport classnames from 'classnames';\nimport * as React from 'react';\nimport { wishlistStatus } from '../wishlist-items';\n\nexport interface IWishlistItemsStatusMessageProps {\n className?: string;\n errorType: wishlistStatus;\n text?: string;\n}\n\nexport const WishlistItemsStatusMessage: React.FC = ({className, errorType, text}) => {\n switch(errorType) {\n case 'EMPTY':\n return (\n

{ text }

\n );\n case 'FAILED':\n return (\n

{ text }

\n );\n case 'LOADING':\n default:\n return (\n

{ text }

\n );\n }\n};\n","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport { ArrayExtensions, getProductUrlSync, IProductInventoryInformation } from '@msdyn365-commerce-modules/retail-actions';\nimport { getTelemetryObject, IModuleProps, INodeProps, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\nimport { FullProduct } from '@msdyn365-commerce/commerce-entities';\nimport * as MsDyn365 from '@msdyn365-commerce/core';\nimport { AsyncResult, CommerceList, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\nimport { createGetByCustomerInput, removeLinesAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/CommerceListsDataActions.g';\nimport { getDeliveryOptionsAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/ProductsDataActions.g';\nimport classnames from 'classnames';\nimport { observer } from 'mobx-react';\nimport * as React from 'react';\nimport getItemsInWishlists, { ActiveWishlistInput } from './actions/get-items-in-wishlists';\nimport { IWishlistItemViewProps, WishlistItem, WishlistItemsStatusMessage } from './components/';\nimport { IWishlistItemsData } from './wishlist-items.data';\nimport { IHeadingData, IWishlistItemsProps } from './wishlist-items.props.autogenerated';\n\nexport interface IWishlistItemActionMessageState {\n productId: number;\n itemKey: string;\n userMessage: string;\n statusCssString: string;\n messageGlyph: string;\n isOpen: boolean;\n}\n\nexport type wishlistStatus = 'LOADING' | 'SUCCESS' | 'FAILED' | 'EMPTY';\n\nexport interface IWishlistItemsViewProps extends IWishlistItemsProps {\n WishlistItems: IModuleProps;\n status?: wishlistStatus;\n statusMessage?: React.ReactNode;\n heading?: React.ReactNode;\n Products?: INodeProps;\n Product?: INodeProps;\n ProductDetails?: INodeProps;\n ProductDimensions?: INodeProps;\n products?: IWishlistItemViewProps[];\n telemetryContent?: ITelemetryContent;\n}\n\n/**\n *\n * WishlistItems component\n * @extends {React.PureComponent, IWishlistItemActionMessageState>}\n */\n@observer\nclass WishlistItems extends React.Component, IWishlistItemActionMessageState> {\n\n private telemetryContent: ITelemetryContent;\n\n constructor(props: IWishlistItemsProps) {\n super(props);\n this.telemetryContent = getTelemetryObject(this.props.context.request.telemetryPageName!, this.props.friendlyName, this.props.telemetry);\n }\n\n public async componentDidMount(): Promise {\n this.setState({});\n }\n\n public render(): JSX.Element | null {\n const { heading, className } = this.props.config;\n const { emptyWishlistText, wishlistErrorGettingWishlist } = this.props.resources;\n const { cart, productAvailability, wishlists, products } = this.props.data;\n\n if (cart.status === 'LOADING' || productAvailability.status === 'LOADING' || wishlists.status === 'LOADING') {\n const errorProps: IWishlistItemsViewProps = {\n ...(this.props as IWishlistItemsProps),\n WishlistItems: {\n moduleProps: this.props,\n className: classnames('ms-wishlist-items', className),\n },\n status: 'LOADING',\n // statusMessage: \n statusMessage: ,\n heading: this._renderHeading(heading)\n };\n return this.props.renderView(errorProps);\n }\n\n if (cart.status === 'FAILED' || productAvailability.status === 'FAILED' || wishlists.status === 'FAILED') {\n const errorProps: IWishlistItemsViewProps = {\n ...(this.props as IWishlistItemsProps),\n WishlistItems: {\n moduleProps: this.props,\n className: classnames('ms-wishlist-items', className),\n },\n status: 'FAILED',\n statusMessage: ,\n heading: this._renderHeading(heading)\n };\n\n return this.props.renderView(errorProps);\n }\n\n const productsList = products && (products as AsyncResult).result;\n\n if (!!productsList && productsList.length === 0) {\n const emptyViewProps: IWishlistItemsViewProps = {\n ...(this.props as IWishlistItemsProps),\n WishlistItems: {\n moduleProps: this.props,\n className: classnames('ms-wishlist-items', className),\n },\n status: 'EMPTY',\n statusMessage: ,\n heading: this._renderHeading(heading)\n };\n\n return this.props.renderView(emptyViewProps);\n }\n\n const viewProps: IWishlistItemsViewProps = {\n ...(this.props as IWishlistItemsProps),\n WishlistItems: {\n moduleProps: this.props,\n className: classnames('ms-wishlist-items', className),\n },\n status: 'SUCCESS',\n heading: this._renderHeading(heading),\n Products: {\n className: 'ms-wishlist-items__products',\n tag: 'ul',\n },\n Product: {\n className: 'ms-wishlist-items__product',\n tag: 'li',\n },\n ProductDetails: {\n className: 'ms-wishlist-items__product-link',\n tag: 'a',\n },\n telemetryContent: this.telemetryContent,\n ProductDimensions: {\n className: 'ms-wishlist-items__product-dimensions',\n },\n products: productsList && this._renderProductList(productsList),\n };\n\n return this.props.renderView(viewProps) as React.ReactElement;\n }\n\n public handleHeadingChange = (event: MsDyn365.ContentEditableEvent) => this.props.config.heading!.text = event.target.value;\n\n private _renderProductList(products: FullProduct[]): IWishlistItemViewProps[] {\n\n const { priceFree, originalPriceText, currentPriceText, addToCartButtonText, outOfStockText, removeButtonText, productDimensionTypeColor, productDimensionTypeSize, productDimensionTypeStyle, productDimensionTypeAmount} = this.props.resources;\n const { context, telemetry } = this.props;\n const { imageSettings, enableImageProductLink } = this.props.config;\n\n return products.map((product: FullProduct, index) => {\n const currentProductProps = {\n product: product.ProductDetails,\n price: product.ProductPrice,\n context: context,\n wishlistState: this.state,\n productUrl: getProductUrlSync(product.ProductDetails, context.actionContext, undefined),\n imageSettings: imageSettings,\n removeFromWishlistText: removeButtonText,\n isInStock: this._isProductInStock(product),\n addToCartText: addToCartButtonText,\n outOfStockText: outOfStockText,\n index: index,\n itemKey: `${product.ProductDetails.RecordId}-${product.ProductDetails.ItemId}-${index}`,\n telemetry: telemetry,\n moduleId: this.props.id,\n moduleTypeName: this.props.typeName,\n enableImageProductLink: enableImageProductLink,\n inventoryInformationLabel: this._inventoryLabel(product),\n inventoryLabelClassName: this._inventoryClassName(product),\n telemetryContent: this.telemetryContent,\n handlers: {\n onAddToCart: this._addItemToCart,\n onRemoveItem: this._removeItemFromWishlist,\n onDismiss: this._onDismiss\n },\n resources: {\n productDimensionTypeColor: productDimensionTypeColor,\n productDimensionTypeSize: productDimensionTypeSize,\n productDimensionTypeStyle: product.ProductDetails.IsGiftCard ? productDimensionTypeAmount : productDimensionTypeStyle,\n freePriceText: priceFree,\n originalPriceText: originalPriceText,\n currentPriceText: currentPriceText\n }\n };\n\n return (\n WishlistItem(currentProductProps)!\n );\n });\n }\n\n // dismiss alert when addingToCart/removeItem\n private _onDismiss = () => {\n this.setState({\n isOpen: false\n });\n }\n\n private _renderHeading = (heading?: IHeadingData): JSX.Element | undefined => {\n if(!heading) {\n return undefined;\n }\n return(\n \n );\n }\n\n private _addItemToCart = async (product: SimpleProduct, itemKey: string): Promise => {\n const { context, data, resources, telemetry } = this.props;\n const { cart, productAvailability } = data;\n const { addedToCartSuccessMessage, addedToCartFailureMessage } = resources;\n\n const productInventoryInformation = this._getProductInventory({ProductDetails:product}, productAvailability.result);\n\n if (context) {\n if (cart.result) {\n const isOrderQuantityLimitsFeatureEnabledInHq = this.props.data.featureState.result\n ?.find(featureState => featureState.Name === 'Dynamics.AX.Application.RetailDefaultOrderQuantityLimitsFeature')?.IsEnabled || false;\n const defaultOrderQuantityLimitsFeatureConfig = this.props.context?.request?.app?.platform?.enableDefaultOrderQuantityLimits;\n const customerInfo = this.props.data.customerInformation.result;\n\n const isOrderQuantityLimitsFeatureEnabledInSiteSettings = defaultOrderQuantityLimitsFeatureConfig === 'all' ||\n (customerInfo &&\n ((defaultOrderQuantityLimitsFeatureConfig === 'b2b' && customerInfo.IsB2b) ||\n (defaultOrderQuantityLimitsFeatureConfig === 'b2c' && !customerInfo.IsB2b)));\n\n const isOrderQuantityLimitsFeatureEnabled = isOrderQuantityLimitsFeatureEnabledInHq && isOrderQuantityLimitsFeatureEnabledInSiteSettings;\n\n // check if the product delivery mode is electronic\n const emailDeliveryModeCode = this.props.context.actionContext.requestContext.channel?.EmailDeliveryModeCode;\n\n const deliveryOptions = await getDeliveryOptionsAsync(\n { callerContext: this.props.context.actionContext, queryResultSettings: {} },\n [product.RecordId]);\n\n const addProductToCartInput = {\n product: product,\n quantity: 1,\n enableStockCheck: context.app.config.enableStockCheck,\n availableQuantity: productInventoryInformation?productInventoryInformation.ProductAvailableQuantity.AvailableQuantity : 0,\n additionalProperties: { orderQuantityLimitsFeatureIsEnabled: isOrderQuantityLimitsFeatureEnabled },\n isAddEmailDeliveryItemToCart: ArrayExtensions.hasElements(deliveryOptions) && ArrayExtensions.hasElements(deliveryOptions[0].DeliveryOptions) && deliveryOptions[0].DeliveryOptions![0].Code === emailDeliveryModeCode\n };\n\n cart.result.addProductToCart(addProductToCartInput)\n .then(async result => {\n if (result.status === 'SUCCESS') {\n this.setState({\n productId: product.RecordId,\n itemKey: itemKey,\n userMessage: addedToCartSuccessMessage,\n statusCssString: 'success',\n messageGlyph: 'fas fa-check',\n isOpen: true\n });\n } else if (result.substatus === 'MAXQUANTITY') {\n const curQuantity = (await cart).cart?.CartLines?.find(item => item.ProductId === product.RecordId)?.Quantity || 0;\n const maxQtyLimitReachedMessage = this._getInventoryValueMessage(productInventoryInformation, curQuantity);\n\n this.setState({\n productId: product.RecordId,\n itemKey: itemKey,\n userMessage: maxQtyLimitReachedMessage,\n statusCssString: 'danger',\n messageGlyph: 'fas fa-exclamation-triangle',\n isOpen: true\n });\n } else if (result.substatus === 'QUANTITYLIMITS' && isOrderQuantityLimitsFeatureEnabled) {\n const maxQtyLimitReachedMessage = result.errorDetails?.LocalizedMessage!;\n\n this.setState({\n productId: product.RecordId,\n itemKey: itemKey,\n userMessage: maxQtyLimitReachedMessage || addedToCartFailureMessage,\n statusCssString: 'danger',\n messageGlyph: 'fas fa-exclamation-triangle',\n isOpen: true\n });\n } else {\n this.props.telemetry.debug('[wishlist-items] Unable to Update Cart Line from the wishlist');\n this.setState({\n productId: product.RecordId,\n itemKey: itemKey,\n userMessage: addedToCartFailureMessage,\n statusCssString: 'danger',\n messageGlyph: 'fas fa-exclamation-triangle',\n isOpen: true\n });\n }\n })\n .catch(error => {\n telemetry.warning(error);\n telemetry.debug('[wishlist-items] Error trying to Update Cart Line from the wishlist');\n this.setState({\n productId: product.RecordId,\n itemKey: itemKey,\n userMessage: addedToCartFailureMessage,\n statusCssString: 'danger',\n messageGlyph: 'fas fa-exclamation-triangle',\n isOpen: true\n });\n });\n }\n }\n };\n\n private _removeItemFromWishlist = (productId: number): void => {\n const { context, data, telemetry } = this.props;\n const { wishlists } = data;\n\n if (context && context.actionContext) {\n const userToken = context.request.user.isAuthenticated && context.request.user.token;\n const wishlistLineId = this._getWishlistLineIdFromProductId(productId);\n if (userToken && wishlists.result && wishlists.result[0] && wishlistLineId) {\n removeLinesAsync({ callerContext: context.actionContext }, wishlists.result[0].Id, [{ LineId: wishlistLineId }])\n .then(commerceList => {\n const castCommerceList: CommerceList | null = commerceList as (CommerceList | null);\n\n if (castCommerceList && castCommerceList.Id && context.request.user.isAuthenticated) {\n context.actionContext.update(createGetByCustomerInput({}, null), [castCommerceList]);\n getItemsInWishlists(new ActiveWishlistInput(), context.actionContext)\n .then((products) => {\n const castSimpleProducts: FullProduct[] | null = products as (FullProduct[] | null);\n if (castSimpleProducts && castSimpleProducts.length > 0) {\n context.actionContext.update(new ActiveWishlistInput(), castSimpleProducts);\n }\n })\n .catch(error => {\n telemetry.warning('[wishlist-items] Unable to hyderate the wishlist with product information');\n telemetry.error(error);\n });\n }\n })\n .catch(error => {\n telemetry.warning('[wishlist-items] Unable remove items from the wishlist');\n telemetry.error(error);\n });\n } else {\n telemetry.warning('[wishlist-items] Unable remove items from the wishlist user token or lineItemID wasn\\'t found');\n }\n }\n }\n\n private _getInventoryValueMessage(product: IProductInventoryInformation | undefined, curQuantity: number):string {\n const { context, resources } = this.props;\n const { maxQuantityLimitText } = resources;\n\n const maxQuantityForLineItem = context.app.config.maxQuantityForCartLineItem || 10;\n\n if(!product || !product.ProductAvailableQuantity.AvailableQuantity || !context.app.config.enableStockCheck) {\n return maxQuantityLimitText.replace('{maxQuantity}', maxQuantityForLineItem.toString()).replace('{curQuantity}', curQuantity.toString());\n }\n\n const minInventory = Math.min(maxQuantityForLineItem, product.ProductAvailableQuantity.AvailableQuantity);\n\n return maxQuantityLimitText.replace('{maxQuantity}', minInventory.toString()).replace('{curQuantity}', curQuantity.toString());\n }\n\n private _getProductInventory(product: FullProduct, productInventoryCollection: IProductInventoryInformation[] | undefined): IProductInventoryInformation | undefined {\n if(productInventoryCollection && productInventoryCollection.length) {\n for (const productResult of productInventoryCollection) {\n if(product.ProductDetails.RecordId === productResult.ProductAvailableQuantity.ProductId) {\n return productResult;\n }\n }\n }\n return undefined;\n }\n\n private _inventoryLabel = (product: FullProduct):string | undefined => {\n const { productAvailability } = this.props.data;\n if(productAvailability && productAvailability.result) {\n const productInventoryInformation = this._getProductInventory(product, productAvailability.result);\n if(productInventoryInformation) {\n return productInventoryInformation.StockLevelLabel;\n }\n }\n\n return undefined;\n }\n\n private _inventoryClassName = (product: FullProduct):string | undefined => {\n const { productAvailability } = this.props.data;\n if(productAvailability && productAvailability.result) {\n const productInventoryInformation = this._getProductInventory(product, productAvailability.result);\n if(productInventoryInformation && productInventoryInformation.StockLevelCode) {\n return `ms-wishlist-items__${productInventoryInformation.StockLevelCode.toLowerCase()}`;\n }\n }\n\n return undefined;\n }\n\n private _isProductInStock = (product: FullProduct): boolean => {\n const { data, context } = this.props;\n const { productAvailability } = data;\n\n if (!context.app.config.enableStockCheck) {\n return true;\n }\n\n if (!productAvailability.result || !product.ProductDetails) {\n return false;\n }\n\n for (const productResult of productAvailability.result) {\n if (productResult.ProductAvailableQuantity &&\n productResult.ProductAvailableQuantity.ProductId &&\n productResult.ProductAvailableQuantity.ProductId === product.ProductDetails.RecordId) {\n return productResult.IsProductAvailable;\n }\n }\n\n return false;\n }\n\n private _getWishlistLineIdFromProductId = (productId: number): number | null => {\n const { wishlists } = this.props.data;\n\n if (!wishlists.result || !(wishlists.result.length > 0) || !wishlists.result[0].CommerceListLines || !(wishlists.result[0].CommerceListLines.length > 0)) {\n this.props.telemetry.error('Wishlist content is empty, module wont render.');\n return null;\n }\n\n const foundWishlistItem = wishlists.result[0].CommerceListLines.filter((commerceListLine) => {\n return commerceListLine.ProductId === productId;\n });\n\n if (foundWishlistItem && foundWishlistItem[0].LineId) {\n return foundWishlistItem[0].LineId;\n } else {\n return null;\n }\n }\n}\n\nexport default WishlistItems;\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\n\r\n\r\nimport { INodeProps, Module, Node } from '@msdyn365-commerce-modules/utilities';\r\nimport * as React from 'react';\r\nimport { ISearchCategoryViewProps, ISearchFormViewProps, ISearchKeywordViewProps, ISearchProductViewProps } from '../../../modules/smwe-search/./components';\r\nimport { ISearchViewProps } from '../../../modules/smwe-search/./smwe-search';\r\n\r\nconst SearchView: React.FC = props => {\r\n const {\r\n Search,\r\n AutoSuggestAriaLabel,\r\n AutoSuggestAriaLabelText,\r\n searchText,\r\n AutoSuggest,\r\n KeywordSuggest,\r\n ProductSuggest,\r\n CategorySuggest,\r\n UlKeyword,\r\n UlProduct,\r\n UlCategory,\r\n form,\r\n autosuggestCategory,\r\n autosuggestKeyword,\r\n autosuggestProduct,\r\n SearchForm,\r\n FormWrapper,\r\n label\r\n } = props;\r\n\r\n return (\r\n \r\n {label}\r\n {_renderForm(form as ISearchFormViewProps, SearchForm, FormWrapper)}\r\n \r\n {searchText && searchText.length > 0 ?\r\n {AutoSuggestAriaLabelText} : ''\r\n }\r\n {_renderKeywordSuggestions(KeywordSuggest, UlKeyword, autosuggestKeyword)}\r\n {_renderProductSuggestions(ProductSuggest, UlProduct, autosuggestProduct)}\r\n {_renderCategorySuggestions(CategorySuggest, UlCategory, autosuggestCategory)}\r\n \r\n \r\n );\r\n};\r\n\r\nconst _renderForm = (form: ISearchFormViewProps, SearchForm: INodeProps, FormWrapper: INodeProps) => {\r\n return (\r\n \r\n \r\n {form.submitBtn}\r\n {form.label}\r\n {form.input}\r\n {form.cancelBtn}\r\n \r\n \r\n );\r\n};\r\n\r\nconst _renderKeywordSuggestions = (\r\n KeywordSuggest: INodeProps,\r\n UlKeyword: INodeProps,\r\n keywordSuggestions?: ISearchKeywordViewProps\r\n) => {\r\n return (\r\n keywordSuggestions && (\r\n \r\n \r\n {keywordSuggestions.text.map(text => {\r\n return text;\r\n })}\r\n \r\n \r\n )\r\n );\r\n};\r\n\r\nconst _renderProductSuggestions = (\r\n ProductSuggest: INodeProps,\r\n UlProduct: INodeProps,\r\n productSuggestions?: ISearchProductViewProps\r\n) => {\r\n return (\r\n productSuggestions && (\r\n \r\n \r\n {productSuggestions.title}\r\n {productSuggestions.items.map((item, index) => {\r\n return (\r\n \r\n \r\n {item.thumbnail}\r\n {item.text}\r\n {item.price !== 0 && (
{item.price}
)}\r\n
\r\n
\r\n );\r\n })}\r\n
\r\n
\r\n )\r\n );\r\n};\r\n\r\nconst _renderCategorySuggestions = (\r\n CategorySuggest: INodeProps,\r\n UlCategory: INodeProps,\r\n categorySuggestions?: ISearchCategoryViewProps\r\n) => {\r\n return (\r\n categorySuggestions && (\r\n \r\n \r\n {categorySuggestions.title}\r\n {categorySuggestions.text.map(text => {\r\n return text;\r\n })}\r\n \r\n \r\n )\r\n );\r\n};\r\n\r\nexport default SearchView;","import { CacheType, IActionInput } from '@msdyn365-commerce/core';\n\nexport const enum ReviewConcernCategory {\n OffensiveContent = '1',\n ReviewResponse = '7',\n SpamAdvertising = '8',\n Profanity = '9'\n}\n\n/**\n * ReportReviewConcern Input Action\n */\nexport class ReportReviewConcernInput implements IActionInput {\n public reviewId: string;\n\n public tenantId: string;\n\n public locale: string;\n\n public serviceEndpoint: string;\n\n public concernCategory: string;\n\n public authToken: string;\n\n constructor(\n reviewId: string,\n tenantId: string,\n locale: string,\n concernCategory: string,\n authToken: string,\n serviceEndpoint: string\n ) {\n this.reviewId = reviewId;\n this.tenantId = tenantId;\n this.locale = locale;\n this.concernCategory = concernCategory;\n this.authToken = authToken;\n this.serviceEndpoint = serviceEndpoint;\n }\n\n public getCacheKey = () => `ReportReviewConcern`;\n public getCacheObjectType = () => 'ReportReviewConcern';\n public dataCacheType = (): CacheType => 'none';\n}\n","import { CacheType, IActionInput } from '@msdyn365-commerce/core';\n\n/**\n * SubmitHelpfulnessVote Input Action\n */\nexport class SubmitHelpfulnessVoteInput implements IActionInput {\n public reviewId: string;\n\n public tenantId: string;\n\n public locale: string;\n\n public serviceEndpoint: string;\n\n public isHelpful: boolean;\n\n public authToken: string;\n\n constructor(\n reviewId: string,\n tenantId: string,\n locale: string,\n isHelpful: boolean,\n authToken: string,\n serviceEndpoint: string\n ) {\n this.reviewId = reviewId;\n this.tenantId = tenantId;\n this.locale = locale;\n this.isHelpful = isHelpful;\n this.authToken = authToken;\n this.serviceEndpoint = serviceEndpoint;\n }\n\n public getCacheKey = () => `SubmitHelpfulnessVote`;\n public getCacheObjectType = () => 'SubmitHelpfulnessVote';\n public dataCacheType = (): CacheType => 'none';\n}\n","import { createObservableDataAction, IAction, IActionContext, sendRequest } from '@msdyn365-commerce/core';\nimport { ReportReviewConcernInput } from './inputs/report-review-concern-input';\n\nasync function reportReviewConcern(input: ReportReviewConcernInput, ctx: IActionContext): Promise {\n if (!inputIsValid(input)) {\n throw new Error(\n `[SubmitHelpfulnessVote] Invalid input. ReviewId=${input.reviewId},tenantId=${input.tenantId},locale= ${\n input.locale\n },`\n );\n }\n\n const requestUrl =\n `${input.serviceEndpoint}/v2.0/concerns/review/${input.reviewId}` +\n `?tenantId=${input.tenantId}` +\n `&locale=${input.locale}`;\n\n const requestBody = {\n concernCategory: input.concernCategory\n };\n\n const requestHeader = {\n headers: {\n Authorization: `id_token ${input.authToken}`\n }\n };\n\n return sendRequest(requestUrl, 'post', requestBody, requestHeader)\n .then(response => {\n return response.status === 200 || response.status === 201;\n })\n .catch((error) => {\n ctx.trace(`[ReportReviewConcernInput] Failed to report a concern`);\n ctx.telemetry.exception(error);\n ctx.telemetry.debug(`[ReportReviewConcernInput] Failed to report a concern`);\n return false;\n });\n}\n\nfunction inputIsValid(input: ReportReviewConcernInput): boolean {\n return (\n input &&\n input.reviewId.length > 0 &&\n input.tenantId.length > 0 &&\n input.locale.length > 0 &&\n input.authToken.length > 0\n );\n}\n\nexport default createObservableDataAction({\n id: '@msdyn365-commerce-modules/ratings-reviews/report-review-concern',\n action: >reportReviewConcern\n});\n","import { createObservableDataAction, IAction, IActionContext, sendRequest } from '@msdyn365-commerce/core';\nimport { SubmitHelpfulnessVoteInput } from './inputs/submit-helpfulness-vote-input';\n\nasync function submitHelpfulnessVote(input: SubmitHelpfulnessVoteInput, ctx: IActionContext): Promise {\n if (!inputIsValid(input)) {\n throw new Error(\n `[SubmitHelpfulnessVote] Invalid input. ReviewId=${input.reviewId},tenantId=${input.tenantId}, locale= ${\n input.locale\n },`\n );\n }\n\n const requestUrl =\n `${input.serviceEndpoint}/v2.0/votes/review/${input.reviewId}` +\n `?tenantId=${input.tenantId}` +\n `&locale=${input.locale}`;\n\n const requestBody = {\n isHelpful: !!input.isHelpful\n };\n\n const requestHeader = {\n headers: {\n Authorization: `id_token ${input.authToken}`\n }\n };\n\n return sendRequest(requestUrl, 'post', requestBody, requestHeader)\n .then(response => {\n return response.status === 200 || response.status === 201;\n })\n .catch((error) => {\n ctx.trace(`[SubmitHelpfulnessVote] Failed to vote on a review`);\n ctx.telemetry.exception(error);\n ctx.telemetry.debug(`[SubmitHelpfulnessVote] Failed to vote on a review`);\n return false;\n });\n}\n\nfunction inputIsValid(input: SubmitHelpfulnessVoteInput): boolean {\n return (\n input &&\n input.reviewId.length > 0 &&\n input.tenantId.length > 0 &&\n input.locale.length > 0 &&\n input.authToken.length > 0\n );\n}\n\nexport default createObservableDataAction({\n id: '@msdyn365-commerce-modules/ratings-reviews/submit-helpfulness-vote',\n action: >submitHelpfulnessVote\n});\n","import { format, getPayloadObject, getTelemetryAttributes, ILabeledDropdownOption, ITelemetryContent, TelemetryConstant } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nexport interface IReviewCountResources {\n pageReviewCountText: string;\n}\n\nexport interface IReviewCountProps {\n resources: IReviewCountResources;\n currentPage: number;\n reviewsCount: number;\n reviewsShownOnEachPage: number;\n}\n\nexport const ReviewCount: React.FC = (props: IReviewCountProps) => {\n const {currentPage, resources, reviewsCount, reviewsShownOnEachPage} = props;\n\n return (\n \n {format(\n resources.pageReviewCountText,\n _getReviewStartNumber(currentPage, reviewsShownOnEachPage),\n _getReviewEndNumber(currentPage, reviewsCount, reviewsShownOnEachPage),\n reviewsCount\n )}\n \n );\n};\n\nexport interface IPageControlResources {\n previousButtonText: string;\n nextButtonText: string;\n pageReviewAriaLabel: string;\n}\n\nexport interface IPageControlsProps {\n resources: IPageControlResources;\n currentPage: number;\n reviewsCount: number;\n reviewsShownOnEachPage: number;\n selectedSortByOption: ILabeledDropdownOption;\n selectedFilterByOption: ILabeledDropdownOption;\n telemetryContent?: ITelemetryContent;\n updateReviews(skipItems: number, selectedSortByOption: ILabeledDropdownOption, selectedFilterByOption: ILabeledDropdownOption, currentPage: number, isFilterApplied: boolean): Promise;\n}\n\nexport const PageControls: React.FC = (props: IPageControlsProps) => {\n const {currentPage, resources, reviewsCount, reviewsShownOnEachPage} = props;\n const previousPageClick = () => {return _getPreviousPageData(props); };\n const nextPageClick = () => {return _getNextPageData(props); };\n const payLoad = getPayloadObject('click', props.telemetryContent!, TelemetryConstant.Next);\n const nextAttribute = getTelemetryAttributes(props.telemetryContent!, payLoad);\n payLoad.contentAction.etext = TelemetryConstant.Previous;\n const previousAttribute = getTelemetryAttributes(props.telemetryContent!, payLoad);\n\n return (\n
\n {_hasPreviousPage(currentPage) && (\n \n {resources.previousButtonText}\n \n )}\n {_hasNextPage(currentPage, reviewsCount, reviewsShownOnEachPage) && (\n \n {resources.nextButtonText}\n \n )}\n
\n );\n};\n\nconst _hasPreviousPage = (currentPage: number): boolean => {\n return currentPage > 1;\n};\n\nconst _hasNextPage = (currentPage: number, reviewsCount: number, reviewsShownOnEachPage: number): boolean => {\n return _getPagesCount(reviewsCount, reviewsShownOnEachPage) > currentPage;\n};\n\nconst _getReviewsShown = (reviewsShownOnEachPage: number) => {\n return Math.min(25, reviewsShownOnEachPage);\n};\n\nconst _getPagesCount = (reviewsCount: number, reviewsShownOnEachPage: number): number => {\n return Math.ceil(reviewsCount / _getReviewsShown(reviewsShownOnEachPage));\n};\n\nconst _paginationAriaLabel = (pageReviewAriaLabel: string, currentPage: number, reviewsCount: number, reviewsShownOnEachPage: number, isNextPage: boolean, page?: number): string => {\n const pageModifier = isNextPage ? 1: -1;\n return format(\n pageReviewAriaLabel,\n _getReviewStartNumber(currentPage, reviewsShownOnEachPage, currentPage + pageModifier),\n _getReviewEndNumber(currentPage, reviewsCount, reviewsShownOnEachPage, currentPage + pageModifier),\n reviewsCount\n );\n};\n\nconst _getReviewStartNumber = (currentPage: number, reviewsShownOnEachPage: number, page?: number): number => {\n return ((page || currentPage) - 1) * _getReviewsShown(reviewsShownOnEachPage) + 1;\n};\n\nconst _getReviewEndNumber = (currentPage: number, reviewsCount: number, reviewsShownOnEachPage: number, page?: number): number => {\n const pageUsed = page || currentPage;\n const pageReviewCount = pageUsed * _getReviewsShown(reviewsShownOnEachPage);\n return pageReviewCount < reviewsCount ? pageReviewCount : reviewsCount;\n};\n\nconst _getPreviousPageData = async (props: IPageControlsProps) => {\n await props.updateReviews(\n _getReviewStartNumber(props.currentPage, props.reviewsShownOnEachPage) - 1 - _getReviewsShown(props.reviewsShownOnEachPage),\n props.selectedSortByOption,\n props.selectedFilterByOption,\n props.currentPage - 1,\n false\n );\n};\n\nconst _getNextPageData = async (props: IPageControlsProps) => {\n\n await props.updateReviews(\n _getReviewEndNumber(props.currentPage, props.reviewsCount, props.reviewsShownOnEachPage),\n props.selectedSortByOption,\n props.selectedFilterByOption,\n props.currentPage + 1,\n false\n );\n};","import {\n Alert,\n getPayloadObject,\n getTelemetryAttributes,\n INodeProps,\n ITelemetryContent,\n Modal,\n ModalBody,\n ModalFooter,\n ModalHeader,\n TelemetryConstant\n} from '@msdyn365-commerce-modules/utilities';\nimport { IAny, ICoreContext, IGeneric} from '@msdyn365-commerce/core';\nimport React from 'react';\nimport { ReviewConcernCategory } from '../../../actions/inputs/report-review-concern-input';\nimport { IRnrKeyValuePair } from '../../../common/rnrInterface';\n\nexport interface IReportReviewModalProps {\n resources: IReportReviewModalResources;\n context: ICoreContext>;\n isOpen: boolean;\n returnRef: React.RefObject | undefined;\n reportedKey: string;\n hasError: boolean;\n telemetryContent?: ITelemetryContent;\n onModalToggle():void;\n onRadioChange(event: React.ChangeEvent): void;\n reportReview(): void;\n}\n\nexport interface IReportReviewModalResources {\n reportConcernText: string;\n feedbackThankYouText: string;\n reportModalMessage: string;\n reportSubmittedMessage: string;\n reportSpamText: string;\n offensiveContentText: string;\n profanityContentText: string;\n okReportReviewText: string;\n cancelReportReviewText: string;\n reportReviewButtonText: string;\n errorMessageText: string;\n}\n\nexport interface IReportReviewModalViewProps {\n modal: INodeProps;\n modalHeader: INodeProps;\n modalFooter: INodeProps;\n modalBody: INodeProps;\n header: React.ReactElement;\n headerSubmitted: React.ReactElement;\n cancelButton: React.ReactElement;\n submitButton: React.ReactElement;\n succesfulButton: React.ReactElement;\n reportMessage: React.ReactElement;\n reportSubmittedMessage: React.ReactElement;\n radioButtons: React.ReactElement;\n error: React.ReactElement;\n}\n\nlet reportConcernDropdownOptions: IRnrKeyValuePair[];\n\n/**\n * CartLineItems component\n */\n\nexport const ReportReviewModal = (props: IReportReviewModalProps):IReportReviewModalViewProps => {\n\n const payLoad = getPayloadObject('click', props.telemetryContent!, TelemetryConstant.SubmitReview);\n const submitReviewAttribute = getTelemetryAttributes(props.telemetryContent!, payLoad);\n payLoad.contentAction.etext = TelemetryConstant.SuccessButton;\n const successAttribute = getTelemetryAttributes(props.telemetryContent!, payLoad);\n payLoad.contentAction.etext = TelemetryConstant.Cancel;\n const cancelAttribute = getTelemetryAttributes(props.telemetryContent!, payLoad);\n\n reportConcernDropdownOptions = [\n { key: ReviewConcernCategory.SpamAdvertising, value: props.resources.reportSpamText },\n { key: ReviewConcernCategory.OffensiveContent, value: props.resources.offensiveContentText },\n { key: ReviewConcernCategory.Profanity, value: props.resources.profanityContentText }\n ];\n\n return {\n modal: {tag: Modal, className: 'ms-report-review-modal msc-modal-input-required', toggle: props.onModalToggle, applicationNode: 'renderPage', isOpen: props.isOpen, returnFocusRef: props.returnRef},\n modalHeader: {tag: ModalHeader, toggle: props.onModalToggle, className: 'ms-report-review-modal-header'},\n modalFooter: {tag: ModalFooter, className: 'ms-report-review-modal-footer'},\n modalBody: {tag: ModalBody, className: 'ms-report-review-modal-body'},\n header:

{props.resources.reportConcernText}

,\n headerSubmitted:

{props.resources.feedbackThankYouText}

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

{props.resources.reportModalMessage}

,\n reportSubmittedMessage:

{props.resources.reportSubmittedMessage}

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

{props.review.userName}

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

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

,\n reviewTitle:

{props.review.title}

,\n reviewText:

{props.review.reviewText}

,\n ratingHelpfulLabel: props.isUserReview ? undefined :

{props.resources.wasReviewHelpfulText}

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

{props.review.userResponse.responderName}

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

{props.review.userResponse.responseText}

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

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

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

{props.resources.reportedText}

;\n }\n\n const ref = props.review.reviewId === props.reportedReviewId ? props.returnRef : undefined;\n const onClick = () => {props.toggleReportReviewModal(props.review.reviewId!);};\n return ;\n\n};","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\nimport { getRnrAuthEndpointId, getRnrEndpointId, getRnrPartnerId, getSelectedProductIdFromActionInput } from '@msdyn365-commerce-modules/retail-actions';\nimport { format, getTelemetryObject, ILabeledDropdownOnChangeNotification, ILabeledDropdownOption, IModuleProps, INodeProps, ITelemetryContent, LabeledDropdown } from '@msdyn365-commerce-modules/utilities';\nimport { Review } from '@msdyn365-commerce/commerce-entities';\nimport { RatingComponent } from '@msdyn365-commerce/components';\nimport * as Msdyn365 from '@msdyn365-commerce/core';\nimport { SimpleProduct } from '@msdyn365-commerce/retail-proxy';\nimport classname from 'classnames';\nimport { reaction } from 'mobx';\nimport { observer } from 'mobx-react';\nimport * as React from 'react';\nimport { getReviewsForGivenProduct } from '../../actions/get-product-reviews';\nimport { GetProductReviewsInput } from '../../actions/inputs/get-product-reviews-input';\nimport { ReportReviewConcernInput, ReviewConcernCategory } from '../../actions/inputs/report-review-concern-input';\nimport { SubmitHelpfulnessVoteInput } from '../../actions/inputs/submit-helpfulness-vote-input';\nimport reportReviewConcern from '../../actions/report-review-concern';\nimport submitHelpfulnessVote from '../../actions/submit-helpfulness-vote';\nimport { IReviewModalViewProps, ReviewModal, submitReview } from '../../common/review-modal';\nimport { IRnrKeyValuePair, IRnrOrderByKeyValuePair } from '../../common/rnrInterface';\nimport { PageControls, ReviewCount } from './components/components';\nimport { IReportReviewModalViewProps, ReportReviewModal } from './components/report-review-modal';\nimport { IReviewCardViewProps, ReviewCard } from './components/review-card';\nimport { IReviewsListData } from './reviews-list.data';\nimport { IReviewsListProps } from './reviews-list.props.autogenerated';\n\nexport interface IReviewsListState {\n skipItems: number;\n listOfReviews: Review[];\n currentPage: number;\n reviewsCount: number;\n showSpinner: boolean;\n isFilterApplied: boolean;\n selectedSortByOption: ILabeledDropdownOption;\n selectedFilterByOption: ILabeledDropdownOption;\n userReviewRating: number;\n userReviewTitle: string;\n userReviewText: string;\n isReviewModalOpen: boolean;\n hasReviewError: boolean;\n isReportModalOpen: boolean;\n hasReportError: boolean;\n reportingReviewId: string;\n reportedKey: string;\n reported: boolean;\n reportedReviews: string[];\n votedReviews: {reviewId: string; approved: boolean}[];\n}\n\nexport interface IReviewsListCallbacks {\n toggleModal(): void;\n updateReviewTitle(title: string): void;\n updateReviewText(text: string): void;\n updateRating(rating: number): void;\n onReviewSubmitted(isSuccessful: boolean): void;\n submitReview(product: SimpleProduct, title: string, text: string, rating: number, context: Msdyn365.ICoreContext, userReview?: Review, onReviewSubmission?: (isSuccessful: boolean) => void): void;\n updateReviewHelpfulnessVote(reviewId: string, isHelpful: boolean): void;\n toggleReportModal(reviewId: string): void;\n reportReview(reviewId: string, reportedKey: string): void;\n updateSortByDropdown(notification: ILabeledDropdownOnChangeNotification): void;\n updateFilterByDropdown(notification: ILabeledDropdownOnChangeNotification): void;\n updateReviews(skipItems: number, selectedSortByOption: ILabeledDropdownOption, selectedFilterByOption: ILabeledDropdownOption, currentPage: number, isFilterApplied: boolean): void;\n}\n\nexport interface IReviewsListViewProps extends IReviewsListProps {\n state: IReviewsListState;\n className: string;\n callbacks: IReviewsListCallbacks;\n moduleProps: IModuleProps;\n reviewModal: IReviewModalViewProps;\n reportReviewModal: IReportReviewModalViewProps;\n sortByDropdown: React.ReactNode;\n filterByDropdown: React.ReactNode;\n averageRating: React.ReactNode;\n reviewCount: React.ReactElement;\n refineReviewsProps: INodeProps;\n reviewsListProps: INodeProps;\n reviewCards: IReviewCardViewProps[];\n userReview?: IReviewCardViewProps;\n pageControls: React.ReactNode;\n noReviewsMessage: React.ReactElement;\n noReviewsWithFilterMessage: React.ReactElement;\n heading: React.ReactNode;\n sortByOptions: IRnrOrderByKeyValuePair[];\n filterByOptions: IRnrOrderByKeyValuePair[];\n}\n\n/**\n *\n * ReviewsList component\n * @extends {React.Component, IReviewsListState>}\n */\n@observer\nclass ReviewsList extends React.Component, IReviewsListState> {\n public sortByDropdownOptions: IRnrOrderByKeyValuePair[] = [\n { key: 'MostHelpful', value: this.props.resources.mostHelpfulSortOptionText },\n { key: 'MostRecent', value: this.props.resources.mostRecentSortOptionText },\n { key: 'HighestRating', value: this.props.resources.highestRatedSortOptionText },\n { key: 'LowestRating', value: this.props.resources.lowestRatedSortOptionText }\n ];\n\n public filterByDropdownOptions: IRnrKeyValuePair[] = [\n { key: '1;2;3;4;5', value: this.props.resources.allRatinsFilterByOptionText },\n { key: '5', value: this.props.resources.fiveStarFilterByOptionText },\n { key: '4', value: this.props.resources.fourStarFilterByOptionText },\n { key: '3', value: this.props.resources.threeStarFilterByOptionText },\n { key: '2', value: this.props.resources.twoStarFilterByOptionText },\n { key: '1', value: this.props.resources.oneStarFilterByOptionText }\n ];\n\n private _userReviewModalToggle: React.RefObject;\n private _userReportModalToggle: React.RefObject;\n private telemetryContent?: ITelemetryContent;\n\n constructor(props: IReviewsListProps) {\n super(props);\n const {userReview: {result: userReview}} = this.props.data;\n\n this.state = {\n skipItems: 0,\n reviewsCount: 0,\n listOfReviews: [],\n currentPage: 1,\n showSpinner: false,\n isFilterApplied: false,\n selectedSortByOption: this.sortByDropdownOptions[0],\n selectedFilterByOption: this.filterByDropdownOptions[0],\n userReviewRating: userReview ? userReview.rating : 0,\n userReviewText: userReview ? userReview.reviewText : '',\n userReviewTitle: userReview ? userReview.title : '',\n isReviewModalOpen: false,\n hasReviewError: false,\n isReportModalOpen: false,\n hasReportError: false,\n reported: false,\n reportedKey: ReviewConcernCategory.SpamAdvertising,\n reportingReviewId: '',\n reportedReviews: [],\n votedReviews: []\n };\n\n this._userReviewModalToggle = React.createRef();\n this._userReportModalToggle = React.createRef();\n this.telemetryContent = getTelemetryObject(this.props.context.request.telemetryPageName!, this.props.friendlyName, this.props.telemetry);\n }\n\n public componentDidMount(): void {\n this.props.data.reviewsList.then((reviewsList) => {\n if (\n reviewsList &&\n reviewsList.pagingInfo &&\n reviewsList.pagingInfo.totalItems &&\n reviewsList.items &&\n reviewsList.items.length > 0\n ) {\n this.setState({\n listOfReviews: reviewsList.items,\n reviewsCount: reviewsList.pagingInfo.totalItems,\n });\n }\n });\n\n reaction(\n () => this.props.data.ratingsReviewsState.result && this.props.data.ratingsReviewsState.result.filterKey,\n async (filterKey: string | undefined) => {\n const filterKeyValue = Number(filterKey);\n const dropdownItemsCount = this.filterByDropdownOptions.length;\n if (\n !!filterKey &&\n !isNaN(filterKeyValue) &&\n filterKeyValue < dropdownItemsCount\n ) {\n const filterByOption = this.filterByDropdownOptions.find((option: IRnrKeyValuePair) => option.key === filterKey);\n if (!filterByOption) {\n this.props.telemetry.warning(`[reviews-list] cannot find filter with key ${filterKey}`);\n } else {\n await this.updateReviews(0, this.state.selectedSortByOption, filterByOption, 1, true);\n const selectedIndex = dropdownItemsCount - filterKeyValue;\n this.setState({\n selectedFilterByOption: this.filterByDropdownOptions[selectedIndex]\n });\n }\n }\n }\n );\n }\n\n public render(): JSX.Element | null {\n const {className, heading, reviewsShownOnEachPage} = this.props.config;\n const {currentPage, reviewsCount, selectedFilterByOption, selectedSortByOption } = this.state;\n const { ratingsSummary: { result: ratingsSummary } } = this.props.data;\n const resources = this.props.resources;\n const completeClass = classname('ms-reviews-list', className);\n const viewProps: IReviewsListViewProps = {\n ...this.props,\n state: this.state,\n className: completeClass,\n moduleProps: {\n moduleProps: this.props,\n className: completeClass\n },\n callbacks: this.reviewsListCallbacks,\n reviewModal: this._userReviewModal(),\n reportReviewModal: this._reportReviewModal(),\n filterByDropdown: (\n \n ),\n sortByDropdown: ,\n averageRating: ratingsSummary && (\n \n ),\n reviewCount: ,\n refineReviewsProps: {className: 'ms-reviews-list__refiners'},\n reviewsListProps: {className: 'ms-reviews-list__reviews'},\n reviewCards: this._reviewCards(this.state.listOfReviews),\n userReview: this._userReview(),\n pageControls: (\n ),\n noReviewsMessage: {resources.noReviewsMessage},\n noReviewsWithFilterMessage: {resources.noReviewsWithSelectedFilterMessage},\n heading: heading && heading.text && (\n \n ),\n sortByOptions: this.sortByDropdownOptions,\n filterByOptions: this.filterByDropdownOptions\n } as IReviewsListViewProps;\n\n return this.props.renderView(viewProps) as React.ReactElement;\n }\n\n public handleHeadingChange = (event: Msdyn365.ContentEditableEvent) => this.props.config.heading!.text = event.target.value;\n\n private _userReview = () => {\n const userReview = this.props.data.userReview.result;\n\n return userReview && this._reviewCard(userReview, true);\n }\n\n private _reviewCards = (reviewList: Review[]) => {\n const userReview = this.props.data.userReview.result;\n const reviewElements: IReviewCardViewProps[] = [];\n\n for (const review of reviewList) {\n if (!review.isTakenDown && review.isPublished && userReview ? review.reviewId !== userReview.reviewId : true) {\n reviewElements.push(this._reviewCard(review, false));\n }\n }\n return reviewElements;\n };\n\n private _reviewCard = (review: Review, userReview: boolean): IReviewCardViewProps => {\n return ReviewCard({\n review: review,\n resources: {...this.props.resources},\n context: this.props.context,\n isUserReview: userReview,\n parentId: this.props.id,\n parentType: this.props.typeName,\n reportedReviews: this.state.reportedReviews,\n returnRef: this._userReportModalToggle,\n reportedReviewId: this.state.reportingReviewId,\n toggleWriteReviewModal: this._toggleReviewModal,\n toggleReportReviewModal: this._onReportModalOpen,\n updateReviewHelpfulness: this.updateReviewHelpfulnessVote,\n votedReviews: this.state.votedReviews\n });\n }\n\n private _userReviewModal = (): IReviewModalViewProps => {\n return ReviewModal({\n userReview: this.props.data.userReview.result,\n product: this.props.data.product.result,\n resources: {...this.props.resources},\n context: this.props.context,\n parentId: this.props.id,\n parentType: this.props.typeName,\n isOpen: this.state.isReviewModalOpen,\n rating: this.state.userReviewRating,\n reviewTitle: this.state.userReviewTitle,\n reviewText: this.state.userReviewText,\n onModalToggle: this._toggleReviewModal,\n onTitleChange: this._onTitleChange,\n onTextChange: this._onTextChange,\n onRatingChange: this._onRatingChange,\n onReviewComplete: this._onReviewComplete,\n renderContextId: 'writeReview-list',\n returnRef: this._userReviewModalToggle,\n hasError: this.state.hasReviewError\n });\n }\n\n private _onTitleChange = (event: React.ChangeEvent): void => {\n this.reviewsListCallbacks.updateReviewTitle(event.target.value);\n }\n\n private _onTextChange = (event: React.ChangeEvent): void => {\n this.reviewsListCallbacks.updateReviewText(event.target.value);\n }\n\n private _onRatingChange = (value: number): void => {\n this.reviewsListCallbacks.updateRating(value);\n }\n\n private _toggleReviewModal = (): void => {\n const userReview = this.props.data.userReview.result;\n if (this.state.isReviewModalOpen) {\n this.setState({isReviewModalOpen: false, hasReviewError: false});\n\n } else {\n this.setState({\n isReviewModalOpen: true,\n userReviewText: userReview!.reviewText,\n userReviewTitle: userReview!.title,\n userReviewRating: userReview!.rating\n });\n }\n }\n\n private _onReviewComplete = (isSuccess: boolean): void => {\n if (isSuccess) {\n this.setState({isReviewModalOpen: false, hasReviewError: false});\n } else {\n this.setState({hasReviewError: true});\n }\n }\n\n private _reportReviewModal = () => {\n return ReportReviewModal({\n resources: {...this.props.resources},\n context: this.props.context,\n isOpen: this.state.isReportModalOpen,\n returnRef: this._userReportModalToggle,\n reportedKey: this.state.reportedKey,\n onModalToggle: this._onReportModalClose,\n onRadioChange: this._onRadioChange,\n reportReview: this._reportReview,\n hasError: this.state.hasReportError,\n telemetryContent: this.telemetryContent\n });\n }\n\n private _onReportModalOpen = (reviewId: string) => {\n this.setState({isReportModalOpen: true, reportingReviewId: reviewId, reported: false, reportedKey: ReviewConcernCategory.SpamAdvertising});\n }\n\n private _onReportModalClose = () => {\n this.setState({isReportModalOpen: false, hasReportError: false});\n }\n\n private _onRadioChange = (event: React.ChangeEvent) => {\n this.setState({reportedKey: event.currentTarget.getAttribute('data-key') || ''});\n }\n\n private _reportReviewCallback = (reviewId: string, reportedKey: string) => {\n reportReviewConcern(\n new ReportReviewConcernInput(\n reviewId,\n getRnrPartnerId(this.props.context.actionContext),\n this.props.context.request.locale,\n reportedKey,\n this.getUserToken(this.props.context.request),\n getRnrAuthEndpointId(this.props.context.actionContext)\n ),\n this.props.context.actionContext\n ).then(_value => {\n const reportedReview = this.state.reportedReviews;\n reportedReview.push(reviewId);\n this.setState({reported: true, reportedReviews: reportedReview, hasReportError: false});\n }).catch(_value => {\n this.setState({hasReportError: true});\n });\n }\n\n private _reportReview = () => {\n this._reportReviewCallback(this.state.reportingReviewId, this.state.reportedKey);\n }\n\n private updateSortByDropdown = async (notification: ILabeledDropdownOnChangeNotification) => {\n await this.updateReviews(0, notification.selectedOption, this.state.selectedFilterByOption, 1, this.state.isFilterApplied);\n };\n\n private updateFilterByDropdown = async (notification: ILabeledDropdownOnChangeNotification) => {\n await this.updateReviews(0, this.state.selectedSortByOption, notification.selectedOption, 1, true);\n };\n\n private updateReviews = async (\n skipItems: number | 0,\n selectedSortByOption: ILabeledDropdownOption,\n selectedFilterByOption: ILabeledDropdownOption,\n currentPage: number,\n isFilterApplied: boolean\n ) => {\n // @ts-ignore\n const productId = getSelectedProductIdFromActionInput(this.props.context.actionContext);\n if (productId === undefined) {\n return;\n }\n const result = await getReviewsForGivenProduct(\n // Task #211227597 Remove this hardcoded values.\n new GetProductReviewsInput(\n productId,\n getRnrPartnerId(this.props.context.actionContext),\n this.props.context.request.locale,\n getRnrEndpointId(this.props.context.actionContext),\n selectedSortByOption.key,\n selectedFilterByOption.key,\n skipItems < 0 ? 0 : skipItems\n ),\n this.props.context.actionContext\n );\n if (result && result.items && result.pagingInfo && result.pagingInfo.totalItems !== undefined) {\n this.setState({\n currentPage: currentPage,\n listOfReviews: result.items,\n selectedSortByOption,\n selectedFilterByOption,\n reviewsCount: result.pagingInfo.totalItems,\n isFilterApplied: isFilterApplied\n });\n }\n };\n\n private _updateVoteUi = (reviewId: string, isHelpful: boolean): void => {\n let alreadyExists = false;\n let list = this.state.votedReviews.map((review) => {\n if(review.reviewId === reviewId) {\n review.approved = isHelpful;\n alreadyExists = true;\n }\n return review;\n });\n\n if (!alreadyExists) {\n list = list.concat({reviewId: reviewId, approved: isHelpful});\n }\n\n this.setState({votedReviews: list});\n }\n\n private updateReviewHelpfulnessVote = (reviewId: string, isHelpful: boolean): void => {\n submitHelpfulnessVote(\n new SubmitHelpfulnessVoteInput(\n reviewId,\n getRnrPartnerId(this.props.context.actionContext),\n this.props.context.request.locale,\n isHelpful,\n this.getUserToken(this.props.context.request),\n getRnrAuthEndpointId(this.props.context.actionContext)\n ),\n this.props.context.actionContext\n ).then(() => {\n this._updateVoteUi(reviewId, isHelpful);\n });\n };\n\n private getUserToken = (context: Msdyn365.IRequestContext): string => {\n return context && context.user && context.user.token;\n };\n\n // tslint:disable-next-line\n private reviewsListCallbacks: IReviewsListCallbacks = {\n updateReviewTitle: (title: string): void => {\n this.setState({userReviewTitle: title});\n },\n updateReviewText: (text: string): void => {\n this.setState({userReviewText: text});\n },\n updateRating: (rating: number): void => {\n this.setState({userReviewRating: rating});\n },\n onReviewSubmitted: (isSuccessful: boolean): void => {\n if (isSuccessful) {\n this.setState({isReviewModalOpen: false, hasReviewError: false});\n } else {\n this.setState({hasReviewError: true});\n }\n },\n submitReview: submitReview,\n toggleModal: this._toggleReviewModal,\n updateReviewHelpfulnessVote: this.updateReviewHelpfulnessVote,\n toggleReportModal: (reviewId: string): void => {\n this.state.isReportModalOpen? this._onReportModalOpen(reviewId) : this._onReportModalClose();\n },\n reportReview: this._reportReviewCallback,\n updateFilterByDropdown: this.updateFilterByDropdown,\n updateSortByDropdown: this.updateSortByDropdown,\n updateReviews: this.updateReviews\n };\n}\n\nexport default ReviewsList;\n","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport { PriceComponent } from '@msdyn365-commerce/components';\nimport { ICoreContext, ITelemetry } from '@msdyn365-commerce/core';\nimport { ICheckoutState, IGiftCardExtend } from '@msdyn365-commerce/global-state';\nimport { Cart, ChannelConfiguration, ChannelDeliveryOptionConfiguration} from '@msdyn365-commerce/retail-proxy';\nimport * as React from 'react';\n\nexport interface IOrderSummaryProps {\n subTotalLabel: string;\n shippingLabel: string;\n taxLabel: string;\n orderTotalLabel: string;\n loyaltyLabel?:string;\n giftcardLabel?:string;\n totalDiscountsLabel: string;\n context: ICoreContext;\n telemetry: ITelemetry;\n cart: Cart;\n channelConfiguration: ChannelConfiguration;\n id: string;\n typeName: string;\n otherChargeLabel?: string;\n freeText?:string;\n toBeCalculatedText?: string;\n checkoutState?: ICheckoutState;\n retailMultiplePickUpOptionEnabled?: boolean;\n channelDeliveryOptionConfig?: ChannelDeliveryOptionConfiguration;\n}\n\nexport interface IOrderSummaryLines {\n subtotal: React.ReactNode;\n shipping?: React.ReactNode;\n otherCharge?: React.ReactNode;\n tax: React.ReactNode;\n orderTotal: React.ReactNode;\n totalDiscounts?: React.ReactNode;\n giftCard?:React.ReactNode;\n loyalty?: React.ReactNode;\n}\n\ninterface IOrderSummaryLineProps {\n label: string;\n context: ICoreContext;\n telemetry: ITelemetry;\n price?: number;\n freeText?:string;\n toBeCalculatedText?: string;\n id: string;\n typeName: string;\n cssLabel: string;\n}\n\ninterface IShippingOrderLine {\n cart: Cart;\n channelConfiguration: ChannelConfiguration;\n canShip?: boolean;\n hasDeliveryMethod?: boolean;\n hasShippingMethod?: boolean;\n freightFee?: number;\n}\n\nconst OrderSummaryLine: React.FC = ({\n price,\n label,\n context,\n id,\n typeName,\n toBeCalculatedText,\n freeText,\n cssLabel\n}) => {\n return(\n

\n {label}\n {price || price === 0 ? (\n \n ) : (\n {toBeCalculatedText}\n )}\n

\n );\n};\n\nconst _buildOrderSummarySection = (\n props: IOrderSummaryProps,\n price: number | undefined,\n cssLabel: string,\n label: string = '',\n ):React.ReactNode => {\n return (\n \n );\n};\n\nconst _computedLoyaltyAmount = (checkoutState: ICheckoutState): number => {\n return (checkoutState && checkoutState.loyaltyAmount) || 0;\n};\n\nconst _computeGiftCardAmount = (checkoutState: ICheckoutState, cart: Cart): number => {\n\n const giftCardCounter = (count: number, giftCard: IGiftCardExtend) => {\n return count + (giftCard.Balance || 0);\n };\n const giftCardTotalValue = (checkoutState.giftCardExtends || []).reduce(giftCardCounter, 0);\n const amount = (cart.TotalAmount || 0) - _computedLoyaltyAmount(checkoutState);\n return Math.min(giftCardTotalValue, amount);\n};\n\nconst getDeliveryConfiguration = (cart: Cart, channelConfiguration: ChannelConfiguration, channelDeliveryOptionConfig?: ChannelDeliveryOptionConfiguration, retailMultiplePickUpOptionEnabled?: boolean):IShippingOrderLine => {\n\n const pickupDeliveryModeCode = channelConfiguration && channelConfiguration.PickupDeliveryModeCode;\n const emailDeliveryModeCode = channelConfiguration && channelConfiguration.EmailDeliveryModeCode;\n const cartLines = cart.CartLines || [];\n const deliveryModes = cartLines.map(cartLine => cartLine.DeliveryMode);\n\n const freightFee = cart.ShippingChargeAmount;\n const canShip = deliveryModes.some(deliveryMode => (deliveryMode !== '' && (deliveryMode === getDeliveryMode(deliveryMode, retailMultiplePickUpOptionEnabled, channelDeliveryOptionConfig, pickupDeliveryModeCode) || deliveryMode === emailDeliveryModeCode)) ? false : true);\n const hasDeliveryMethod = deliveryModes.some(deliveryMode => !!deliveryMode && deliveryMode !== emailDeliveryModeCode);\n const hasShippingMethod = deliveryModes.some(deliveryMode => !!deliveryMode && deliveryMode !== getDeliveryMode(deliveryMode, retailMultiplePickUpOptionEnabled, channelDeliveryOptionConfig, pickupDeliveryModeCode) && deliveryMode !== emailDeliveryModeCode);\n return {\n canShip,\n hasDeliveryMethod,\n hasShippingMethod,\n freightFee\n } as IShippingOrderLine;\n};\n\nconst getDeliveryMode = (deliveryMode?: string, featureSate: boolean = false, channelDeliveryOptionConfig?: ChannelDeliveryOptionConfiguration, pickupDeliveryMode?: string) => {\n if(!featureSate) {\n return pickupDeliveryMode;\n } else {\n return channelDeliveryOptionConfig?.PickupDeliveryModeCodes?.find(dM => dM === deliveryMode);\n }\n};\n\nexport const OrderSummary = (props: IOrderSummaryProps) => {\n const { SubtotalAmount, TaxAmount, DiscountAmountWithoutTax = 0, TotalAmount, OtherChargeAmount } = props.cart;\n const { canShip, hasDeliveryMethod, hasShippingMethod, freightFee } = getDeliveryConfiguration(props.cart, props.channelConfiguration, props.channelDeliveryOptionConfig, props.retailMultiplePickUpOptionEnabled);\n const reactNodes:IOrderSummaryLines = {\n subtotal: _buildOrderSummarySection(props, SubtotalAmount, 'sub-total', props.subTotalLabel),\n tax: _buildOrderSummarySection(props, hasDeliveryMethod ? TaxAmount: undefined, 'tax-amount', props.taxLabel),\n orderTotal: _buildOrderSummarySection(props, TotalAmount, 'total', props.orderTotalLabel),\n otherCharge: OtherChargeAmount && _buildOrderSummarySection(props, OtherChargeAmount,'other-charges', props.otherChargeLabel) || undefined,\n };\n\n if(canShip) {\n reactNodes.shipping =_buildOrderSummarySection(props, hasShippingMethod ? freightFee : undefined, 'shipping', props.shippingLabel);\n }\n if(props.checkoutState) {\n const giftCardAmount = _computeGiftCardAmount(props.checkoutState, props.cart);\n const loyaltyAmount = _computedLoyaltyAmount(props.checkoutState);\n const totalAmountAfterGiftCard = (TotalAmount || 0) - giftCardAmount - loyaltyAmount;\n\n if(loyaltyAmount > 0) {\n reactNodes.loyalty = _buildOrderSummarySection(props, -loyaltyAmount, 'loyalty', props.loyaltyLabel || 'Loyalty amount');\n }\n\n if(giftCardAmount > 0) {\n reactNodes.giftCard = _buildOrderSummarySection(props, -giftCardAmount, 'gift-card', props.giftcardLabel || 'Gift card amount');\n }\n\n reactNodes.orderTotal = _buildOrderSummarySection({...props, freeText: undefined }, totalAmountAfterGiftCard, 'total', props.orderTotalLabel);\n }\n\n if(DiscountAmountWithoutTax > 0) {\n reactNodes.totalDiscounts = _buildOrderSummarySection(props, -DiscountAmountWithoutTax, 'total-discounts', props.totalDiscountsLabel);\n }\n\n return reactNodes;\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\n\r\n\r\nimport { INodeProps, Module, Node } from '@msdyn365-commerce-modules/utilities';\r\nimport * as React from 'react';\r\nimport { ISearchCategoryViewProps, ISearchFormViewProps, ISearchKeywordViewProps, ISearchProductViewProps } from '../../../modules/smwe-search/./components';\r\nimport { ISearchViewProps } from '../../../modules/smwe-search/./smwe-search';\r\n\r\nconst SearchView: React.FC = props => {\r\n const {\r\n Search,\r\n AutoSuggestAriaLabel,\r\n AutoSuggestAriaLabelText,\r\n searchText,\r\n AutoSuggest,\r\n KeywordSuggest,\r\n ProductSuggest,\r\n CategorySuggest,\r\n UlKeyword,\r\n UlProduct,\r\n UlCategory,\r\n form,\r\n autosuggestCategory,\r\n autosuggestKeyword,\r\n autosuggestProduct,\r\n SearchForm,\r\n FormWrapper,\r\n label\r\n } = props;\r\n\r\n return (\r\n \r\n {label}\r\n {_renderForm(form as ISearchFormViewProps, SearchForm, FormWrapper)}\r\n \r\n {searchText && searchText.length > 0 ?\r\n {AutoSuggestAriaLabelText} : ''\r\n }\r\n {_renderKeywordSuggestions(KeywordSuggest, UlKeyword, autosuggestKeyword)}\r\n {_renderProductSuggestions(ProductSuggest, UlProduct, autosuggestProduct)}\r\n {_renderCategorySuggestions(CategorySuggest, UlCategory, autosuggestCategory)}\r\n \r\n \r\n );\r\n};\r\n\r\nconst _renderForm = (form: ISearchFormViewProps, SearchForm: INodeProps, FormWrapper: INodeProps) => {\r\n return (\r\n \r\n \r\n {form.submitBtn}\r\n {form.label}\r\n {form.input}\r\n {form.cancelBtn}\r\n \r\n \r\n );\r\n};\r\n\r\nconst _renderKeywordSuggestions = (\r\n KeywordSuggest: INodeProps,\r\n UlKeyword: INodeProps,\r\n keywordSuggestions?: ISearchKeywordViewProps\r\n) => {\r\n return (\r\n keywordSuggestions && (\r\n \r\n \r\n {keywordSuggestions.text.map(text => {\r\n return text;\r\n })}\r\n \r\n \r\n )\r\n );\r\n};\r\n\r\nconst _renderProductSuggestions = (\r\n ProductSuggest: INodeProps,\r\n UlProduct: INodeProps,\r\n productSuggestions?: ISearchProductViewProps\r\n) => {\r\n return (\r\n productSuggestions && (\r\n \r\n \r\n {productSuggestions.title}\r\n {productSuggestions.items.map((item, index) => {\r\n return (\r\n \r\n \r\n {item.thumbnail}\r\n {item.text}\r\n {item.price !== 0 && (
{item.price}
)}\r\n
\r\n
\r\n );\r\n })}\r\n
\r\n
\r\n )\r\n );\r\n};\r\n\r\nconst _renderCategorySuggestions = (\r\n CategorySuggest: INodeProps,\r\n UlCategory: INodeProps,\r\n categorySuggestions?: ISearchCategoryViewProps\r\n) => {\r\n return (\r\n categorySuggestions && (\r\n \r\n \r\n {categorySuggestions.title}\r\n {categorySuggestions.text.map(text => {\r\n return text;\r\n })}\r\n \r\n \r\n )\r\n );\r\n};\r\n\r\nexport default SearchView;","/*---------------------------------------------------------------------------------------------\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\n\r\n\r\nimport { INodeProps, Module, Node } from '@msdyn365-commerce-modules/utilities';\r\nimport * as React from 'react';\r\nimport { ISearchCategoryViewProps, ISearchFormViewProps, ISearchKeywordViewProps, ISearchProductViewProps } from '../../../modules/smwe-search/./components';\r\nimport { ISearchViewProps } from '../../../modules/smwe-search/./smwe-search';\r\n\r\nconst SearchView: React.FC = props => {\r\n const {\r\n Search,\r\n AutoSuggestAriaLabel,\r\n AutoSuggestAriaLabelText,\r\n searchText,\r\n AutoSuggest,\r\n KeywordSuggest,\r\n ProductSuggest,\r\n CategorySuggest,\r\n UlKeyword,\r\n UlProduct,\r\n UlCategory,\r\n form,\r\n autosuggestCategory,\r\n autosuggestKeyword,\r\n autosuggestProduct,\r\n SearchForm,\r\n FormWrapper,\r\n label\r\n } = props;\r\n\r\n return (\r\n \r\n {label}\r\n \r\n {_renderForm(form as ISearchFormViewProps, FormWrapper)}\r\n \r\n {searchText && searchText.length > 0 ?\r\n {AutoSuggestAriaLabelText} : ''\r\n }\r\n {_renderKeywordSuggestions(KeywordSuggest, UlKeyword, autosuggestKeyword)}\r\n {_renderProductSuggestions(ProductSuggest, UlProduct, autosuggestProduct)}\r\n {_renderCategorySuggestions(CategorySuggest, UlCategory, autosuggestCategory)}\r\n \r\n \r\n \r\n );\r\n};\r\n\r\nconst _renderForm = (form: ISearchFormViewProps, FormWrapper: INodeProps) => {\r\n return (\r\n \r\n {form.submitBtn}\r\n
\r\n
\r\n {form.label}\r\n {form.input}\r\n
\r\n {form.cancelBtn}\r\n \r\n );\r\n};\r\n\r\nconst _renderKeywordSuggestions = (\r\n KeywordSuggest: INodeProps,\r\n UlKeyword: INodeProps,\r\n keywordSuggestions?: ISearchKeywordViewProps\r\n) => {\r\n return (\r\n keywordSuggestions && (\r\n \r\n \r\n {keywordSuggestions.text.map(text => {\r\n return text;\r\n })}\r\n \r\n \r\n )\r\n );\r\n};\r\n\r\nconst _renderProductSuggestions = (\r\n ProductSuggest: INodeProps,\r\n UlProduct: INodeProps,\r\n productSuggestions?: ISearchProductViewProps\r\n) => {\r\n return (\r\n productSuggestions && (\r\n \r\n \r\n {productSuggestions.title}\r\n {productSuggestions.items.map((item, index) => {\r\n return (\r\n \r\n \r\n {item.thumbnail}\r\n {item.text}\r\n {item.price}\r\n \r\n \r\n );\r\n })}\r\n \r\n \r\n )\r\n );\r\n};\r\n\r\nconst _renderCategorySuggestions = (\r\n CategorySuggest: INodeProps,\r\n UlCategory: INodeProps,\r\n categorySuggestions?: ISearchCategoryViewProps\r\n) => {\r\n return (\r\n categorySuggestions && (\r\n \r\n \r\n {categorySuggestions.title}\r\n {categorySuggestions.text.map(text => {\r\n return text;\r\n })}\r\n \r\n \r\n )\r\n );\r\n};\r\n\r\nexport default SearchView;","import { IStoreSelectorStateManager } from '@msdyn365-commerce-modules/bopis-utilities';\nimport { INodeProps } from '@msdyn365-commerce-modules/utilities';\nimport { ICartState } from '@msdyn365-commerce/global-state';\nimport { CartLine, OrgUnitLocation, ProductDeliveryOptions, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\nimport * as React from 'react';\n\nexport interface IPickUpInStoreViewProps {\n callbacks: {\n toggleBopis(isBopisSelected: boolean): void;\n };\n defaultComponent?: React.ReactNode;\n orgUnitName?: string;\n isBopisSelected: boolean;\n ContainerProps: INodeProps;\n deliveryOption?: string;\n}\n\nexport interface IPickUpInStoreProps {\n cartline: CartLine;\n product: SimpleProduct;\n shipitText: string;\n pickUpInStoreText: string;\n changeStoreText: string;\n cartState: ICartState | undefined;\n storeSelectorStateManager: IStoreSelectorStateManager | undefined;\n orgUnitLocations?: OrgUnitLocation[] | undefined;\n deliveryOptions?: ProductDeliveryOptions;\n pickupDeliveryModeCode?: string;\n storeSelectorModuleId?: string;\n locationChangedHandler(): void;\n}\n\n// tslint:disable-next-line:max-func-body-length\nexport const PickUpInStore = (props: IPickUpInStoreProps): IPickUpInStoreViewProps | undefined => {\n const _onLocationChangedCallback = (orgUnitLocation: OrgUnitLocation, cartState: ICartState | undefined, cartline: CartLine, deliveryMode?: string) => {\n if(!cartState) {\n return Promise.resolve();\n }\n return cartState.updateCartLinePickupLocation({cartLineId: cartline.LineId!, location: orgUnitLocation, deliveryMode})\n .then(result => {\n if (result.status === 'SUCCESS') {\n props.locationChangedHandler();\n }\n })\n .catch(error => {\n return;\n });\n };\n\n const _toggleBOPIS = (isBopisSelected: boolean) => {\n const { storeSelectorStateManager, product, cartline, cartState, storeSelectorModuleId } = props;\n\n if(isBopisSelected) {\n if(!storeSelectorStateManager) {\n return;\n }\n storeSelectorStateManager.openDialog({\n id: storeSelectorModuleId,\n product,\n alreadySelectedLocation: {\n OrgUnitNumber: cartline.FulfillmentStoreId\n },\n deliveryOptions: props.deliveryOptions,\n onLocationSelected: (orgUnitLocation, deliveryMode: string | undefined) => {\n return _onLocationChangedCallback(orgUnitLocation, cartState, cartline, deliveryMode);\n }\n })\n .catch(error => {\n return;\n });\n } else {\n if(!cartState) {\n return;\n }\n cartline.DeliveryMode = '';\n cartline.FulfillmentStoreId = '';\n cartline.ShippingAddress = {};\n cartState.clearCartLinePickupLocation({cartLineId: cartline.LineId!})\n .then(result => {\n if (result.status === 'SUCCESS') {\n props.locationChangedHandler();\n }\n })\n .catch(error => {\n return;\n });\n }\n };\n\n const _getOrgUnitName = (fulfillmentStoreId: string | undefined, orgUnitLocations: OrgUnitLocation[] | undefined) => {\n if(!orgUnitLocations || !fulfillmentStoreId || !(orgUnitLocations.length > 0)) {\n return '';\n }\n\n const foundLocation = orgUnitLocations.find(orgUnitLocation => {\n return orgUnitLocation.OrgUnitNumber === fulfillmentStoreId;\n });\n\n if(foundLocation) {\n return foundLocation.OrgUnitName;\n } else {\n return fulfillmentStoreId;\n }\n };\n\n const _renderShippingMethod = (\n cartLine: CartLine,\n shipItText: string,\n pickupInStoretext: string,\n changeStoreText:string,\n orgUnitLocations: OrgUnitLocation[] | undefined):JSX.Element => {\n\n const orgUnitName = _getOrgUnitName(cartLine.FulfillmentStoreId, orgUnitLocations);\n const bopisSelected = cartLine.FulfillmentStoreId ? true : false;\n\n const toggleBOPIS = (isBopisSelected: boolean) => { return () => _toggleBOPIS(isBopisSelected); };\n\n return (\n <>\n \n \n {\n cartLine.FulfillmentStoreId ? (\n
\n {orgUnitName}\n \n
\n ) : null\n }\n \n );\n };\n\n const _getDeliveryOption = (pickupStore: IPickUpInStoreProps, deliveryOptions: ProductDeliveryOptions) => {\n const delivery = deliveryOptions?.DeliveryOptions?.find(option => option.Code === pickupStore.pickupDeliveryModeCode);\n return delivery?.Description;\n };\n\n // If no delivery options present on the product, or none of the delivery options\n // match the PickupDeliveryModeCode, that means the item cannot be used for BOPIS\n if (!props.deliveryOptions ||\n !props.deliveryOptions.DeliveryOptions ||\n !props.pickupDeliveryModeCode ||\n !props.deliveryOptions.DeliveryOptions.find(option => option.Code === props.pickupDeliveryModeCode)) {\n return undefined;\n }\n\n return {\n callbacks: {\n toggleBopis: _toggleBOPIS\n },\n defaultComponent: _renderShippingMethod(props.cartline, props.shipitText, props.pickUpInStoreText, props.changeStoreText, props.orgUnitLocations),\n orgUnitName: _getOrgUnitName(props.cartline.FulfillmentStoreId, props.orgUnitLocations),\n isBopisSelected: props.cartline.FulfillmentStoreId ? true : false,\n deliveryOption: _getDeliveryOption(props, props.deliveryOptions),\n ContainerProps: {\n className: 'msc-cart-line__bopis-container'\n }\n };\n};","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport { IStoreSelectorStateManager } from '@msdyn365-commerce-modules/bopis-utilities';\nimport { getProductUrlSync, IProductInventoryInformation, ObjectExtensions, OrderTemplate } from '@msdyn365-commerce-modules/retail-actions';\nimport { Button, getPayloadObject, getTelemetryAttributes, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\nimport {\n AddToOrderTemplateComponent, AddToWishlistComponent, CartLineItemComponent,\n IAddToOrderTemplateDialogResources, ICartlineResourceString, IDuplicateItemsWhenAddingToOrderTemplateDialogResources,\n IItemAddedToOrderTemplateDialogResources, IOrderTemplateNameDialogResources, IWishlistActionSuccessResult } from '@msdyn365-commerce/components';\nimport { ICoreContext, IGridSettings, IImageSettings, ITelemetry, TelemetryEvent } from '@msdyn365-commerce/core';\nimport { ICartState } from '@msdyn365-commerce/global-state';\nimport { CartLine, ChannelDeliveryOptionConfiguration, CommerceList,Customer, LineDataValidationFailure, OrgUnitLocation, ProductDeliveryOptions, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\nimport { ProductDimensionType, ReleasedProductType } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\nimport * as React from 'react';\nimport { IPickUpInStoreViewProps, PickUpInStore } from './cart-pick-up-in-store';\n\nexport interface ICartLineItemsProps {\n cartlines: CartLine[];\n cartlinesErrors: LineDataValidationFailure[];\n cartState: ICartState | undefined;\n orgUnitLocations: OrgUnitLocation[] | undefined;\n resources: ICartlineResourceString;\n productAvailabilites: IProductInventoryInformation[] | undefined;\n products: SimpleProduct[] | undefined;\n productDeliveryOptions: ProductDeliveryOptions[] | undefined;\n pickupDeliveryModeCode?: string;\n /** GridSettings for the product image in cartline */\n gridSettings: IGridSettings;\n /** ImageSettings for the product image in cartline */\n imageSettings: IImageSettings;\n id: string;\n typeName:string;\n context: ICoreContext;\n telemetry: ITelemetry;\n removeButtonText: string;\n addToWishlistButtonText: string;\n removeFromWishlistButtonText: string;\n shipItText: string;\n pickitUpText: string;\n changeStoreText: string;\n outOfStockText: string;\n outOfRangeOneText: string;\n outOfRangeFormatText: string;\n storeSelectorStateManager: IStoreSelectorStateManager | undefined;\n isStockCheckEnabled: boolean;\n wishlists: CommerceList[] | undefined;\n defaultWishlistName: string;\n maxCartlineQuantity: number;\n includeErrors?: boolean;\n showShippingChargesForLineItems?: boolean;\n telemetryContent?: ITelemetryContent;\n isQuantityLimitsFeatureEnabled: boolean;\n storeSelectorModuleId?: string;\n channelDeliveryOptionConfig?: ChannelDeliveryOptionConfiguration;\n\n addToOrderTemplateDialogResources: IAddToOrderTemplateDialogResources;\n createOrderTemplateDialogResources: IOrderTemplateNameDialogResources;\n itemAddedToOrderTemplateDialogResources: IItemAddedToOrderTemplateDialogResources;\n duplicateItemsWhenAddingToOrderTemplateDialogResources: IDuplicateItemsWhenAddingToOrderTemplateDialogResources;\n\n addToOrderTemplateButtonText: string;\n addToOrderTemplateMessage: string;\n addItemToOrderTemplateError: string;\n orderTemplates: OrderTemplate[] | undefined;\n customerInformation: Customer | undefined;\n\n removeItemClickHandler(cartlineToRemove: CartLine): void;\n moveToWishlistSuccessHandler(result: IWishlistActionSuccessResult, cartlineId: CartLine): void;\n updateCartLinesQuantitySuccessHandler(cartline: CartLine, quantity: number): boolean;\n locationChangedHandler(): void;\n}\n\nexport interface ICartlinesViewProps {\n cartline: React.ReactNode;\n pickUpInStore?: IPickUpInStoreViewProps;\n remove: React.ReactNode;\n addToWishlist: React.ReactNode | undefined;\n addToOrderTemplate: React.ReactNode | undefined;\n\n error?: string;\n\n data?: {\n product?: SimpleProduct;\n cartline: CartLine;\n };\n}\n\nconst _getProduct = (productId: number | undefined, products?: SimpleProduct[]): SimpleProduct | undefined => {\n if (productId !== undefined && products) {\n return products.find(product => {\n return productId === product.RecordId;\n });\n }\n return undefined;\n};\n\nconst _getCartItemMaxQuantity = (maxCartlineQuantity: number, isStockCheckEnabled: boolean, productAvailability?: IProductInventoryInformation, productMaxQuantity?: number) => {\n const lineMaxQuantity = productMaxQuantity ? productMaxQuantity: maxCartlineQuantity;\n\n if(isStockCheckEnabled) {\n if(!productAvailability || !productAvailability.ProductAvailableQuantity || !productAvailability.IsProductAvailable || !productAvailability.ProductAvailableQuantity.AvailableQuantity) {\n return 0;\n }\n return productAvailability.ProductAvailableQuantity.AvailableQuantity >= lineMaxQuantity\n ? lineMaxQuantity\n : productAvailability.ProductAvailableQuantity.AvailableQuantity;\n }\n\n return lineMaxQuantity;\n};\n\nconst _getErrorMessage = (maxQuantity: number, currentQuantity: number, props: ICartLineItemsProps, lineIndex: number, isServiceItem: boolean): string | undefined => {\n const finalErrorMessage: string[] = [];\n if (props.includeErrors) {\n if (props.isStockCheckEnabled && !isServiceItem) {\n if (maxQuantity <= 0) {\n finalErrorMessage.push(props.outOfStockText);\n } else if (maxQuantity < currentQuantity) {\n if (maxQuantity === 1) {\n finalErrorMessage.push(props.outOfRangeOneText);\n } else {\n finalErrorMessage.push(props.outOfRangeFormatText.replace('{numLeft}', maxQuantity.toString()));\n }\n }\n }\n }\n\n // server-side validation\n props.cartlinesErrors\n .filter(i => i.LineIndex === lineIndex)\n .forEach(i => {\n if (i.DataValidationFailure?.ErrorContext) {\n finalErrorMessage.push(i.DataValidationFailure.ErrorContext);\n }\n });\n\n if(finalErrorMessage.length > 0) {\n return finalErrorMessage.join(' ');\n }\n\n return undefined;\n};\n\n// tslint:disable:max-func-body-length\n// tslint:disable-next-line:cyclomatic-complexity\nconst _assembleNode = (\n cartline: CartLine,\n product: SimpleProduct | undefined,\n props: ICartLineItemsProps,\n index: number,\n foundProductAvailability?: IProductInventoryInformation,\n foundProductDeliveryOptions?: ProductDeliveryOptions)\n : ICartlinesViewProps => {\n const { imageSettings, gridSettings, id, typeName, context, resources, removeButtonText,\n removeItemClickHandler, moveToWishlistSuccessHandler, addToOrderTemplateButtonText,\n addToOrderTemplateDialogResources, createOrderTemplateDialogResources,\n itemAddedToOrderTemplateDialogResources, duplicateItemsWhenAddingToOrderTemplateDialogResources,\n addToWishlistButtonText, removeFromWishlistButtonText, orderTemplates, customerInformation,\n wishlists, defaultWishlistName, storeSelectorModuleId } = props;\n\n const isAuthenticated = context.request.user.isAuthenticated;\n const nameOfWishlist = wishlists && wishlists.length > 0 && wishlists[0].Name ? wishlists[0].Name : defaultWishlistName ;\n const maxQuantity = product && _getCartItemMaxQuantity(\n props.maxCartlineQuantity,\n props.isStockCheckEnabled,\n foundProductAvailability,\n props.isQuantityLimitsFeatureEnabled ? product.Behavior?.MaximumQuantity : undefined);\n\n // check if the product is service or not by product type\n const PRODUCTASSERVICE = 2 as ReleasedProductType.Service;\n const isServiceItem = product?.ItemTypeValue === PRODUCTASSERVICE;\n\n const errorMessage = ObjectExtensions.isNullOrUndefined(maxQuantity) ? undefined : _getErrorMessage(maxQuantity, cartline.Quantity!, props, index, isServiceItem);\n\n const onRemoveClickHandler = (event: React.MouseEvent) => { removeItemClickHandler(cartline); };\n const payload = getPayloadObject(TelemetryEvent.RemoveFromCart, props.telemetryContent!, removeButtonText, '');\n const attributes = getTelemetryAttributes(props.telemetryContent!, payload);\n\n const inventoryLbl = foundProductAvailability?.StockLevelLabel;\n const inventoryCode = foundProductAvailability? `ms-cart-line__inventory-code-${foundProductAvailability.StockLevelCode?.toLowerCase()}`:undefined;\n\n const isCustomPriceSelected = product?.Dimensions?.find(dimension => dimension.DimensionTypeValue === ProductDimensionType.Style)?.DimensionValue?.Value === 'Custom';\n\n return {\n data: {\n product: product,\n cartline: cartline\n },\n error: errorMessage,\n cartline: (\n ),\n pickUpInStore: product ? (\n PickUpInStore({\n storeSelectorModuleId: storeSelectorModuleId,\n cartState: props.cartState,\n cartline: cartline,\n product: product,\n shipitText: props.shipItText,\n pickUpInStoreText: props.pickitUpText,\n changeStoreText: props.changeStoreText,\n storeSelectorStateManager: props.storeSelectorStateManager,\n orgUnitLocations: props.orgUnitLocations,\n deliveryOptions: foundProductDeliveryOptions,\n pickupDeliveryModeCode: cartline.DeliveryMode !== (undefined || '')? cartline.DeliveryMode: props.pickupDeliveryModeCode,\n locationChangedHandler: props.locationChangedHandler\n })\n ) : undefined,\n remove: (\n \n {removeButtonText}\n \n ),\n addToWishlist: (\n isAuthenticated && product && !isCustomPriceSelected ? (\n \n ) :\n undefined\n ),\n addToOrderTemplate: (\n isAuthenticated && orderTemplates && product && !isCustomPriceSelected ? (\n \n ) :\n undefined\n )\n };\n};\n\nexport const assembleCartlines = (cartlines: CartLine[], products: SimpleProduct[] | undefined, props: ICartLineItemsProps): ICartlinesViewProps[] | null => {\n const reactNodes:ICartlinesViewProps[] = [];\n\n cartlines.map((cartline, index) => {\n const product = _getProduct(cartline.ProductId, products);\n let foundProductAvailability;\n if(props.productAvailabilites && props.productAvailabilites.length > 0) {\n foundProductAvailability = props.productAvailabilites.find((productAvailability) => {\n return productAvailability.ProductAvailableQuantity?.ProductId! === cartline.ProductId && productAvailability.InventLocationId === cartline.WarehouseId;\n });\n }\n let foundProductDeliveryOption;\n if(props.productDeliveryOptions && props.productDeliveryOptions.length > 0) {\n foundProductDeliveryOption = props.productDeliveryOptions.find((deliveryOption) => {\n return deliveryOption && deliveryOption.ProductId === cartline.ProductId;\n });\n }\n reactNodes.push(_assembleNode(cartline, product, props, index, foundProductAvailability, foundProductDeliveryOption));\n });\n\n return reactNodes;\n};\n\n/**\n * CartLineItems component\n */\nexport const CartLineItems = (props: ICartLineItemsProps) => {\n const { products, cartlines } = props;\n return (\n assembleCartlines(cartlines, products, props)\n );\n};","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport { CartLine, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\nimport groupBy from 'lodash/groupBy';\nimport {assembleCartlines, ICartLineItemsProps, ICartlinesViewProps} from './cart-line-items';\n\nconst _assembleGroupCartlines = (cartlines: CartLine[], products: SimpleProduct[] | undefined, props: ICartLineItemsProps): ICartlinesViewProps[][] | null => {\n const reactNodes: ICartlinesViewProps[][] = [];\n if(!products || products.length === 0) {\n props.context.telemetry.error('Products content is empty, module wont render');\n return null;\n }\n\n const getGroupByStorePickup = (items: CartLine[]) => groupBy(items, item => item.FulfillmentStoreId);\n const getGroupByDelivery = (items: CartLine[]) => groupBy(items, item => (item.DeliveryMode));\n const groupDelivery = getGroupByDelivery(cartlines);\n const cartLinesGroup: CartLine[] = [];\n\n // 1) Group by store and pick up mode\n Object.entries(groupDelivery).forEach(([deliveryType, groupByDeliveryType]) => {\n // @ts-ignore\n groupDelivery[deliveryType] = getGroupByStorePickup(groupByDeliveryType);\n cartLinesGroup.push(getGroupByStorePickup(groupByDeliveryType));\n });\n\n // 2) Create cartlines group\n Object.keys(cartLinesGroup).forEach(key => {\n const cartLines = cartLinesGroup[key];\n Object.keys(cartLines).forEach(index => {\n const cartLine = cartLines[index];\n const carLineViewProps = assembleCartlines(cartLine, products, props);\n if(carLineViewProps !== null) {\n reactNodes.push(carLineViewProps);\n }\n });\n\n });\n\n return reactNodes;\n};\n\n/**\n * CartLine Group component\n */\nexport const CartLineGroupItems = (props: ICartLineItemsProps) => {\n const { products, cartlines } = props;\n return (\n _assembleGroupCartlines(cartlines, products, props)\n );\n};","import { getPromotionOptionsForCartLineItems, PromotionOptionsForCartLineItems } from '@msdyn365-commerce-modules/retail-actions';\nimport { IActionContext } from '@msdyn365-commerce/core';\nimport { CartPromotionLine } from '@msdyn365-commerce/retail-proxy';\n\n/**\n * IPromotionData entity interface.\n */\nexport interface IPromotionData {\n promotionOptions?: CartPromotionLine[];\n}\n\n/**\n * Calls the Retail API and returns a promotion data\n */\nexport async function getPromotionData(ctx: IActionContext): Promise {\n const promotionData: IPromotionData = {};\n\n await getPromotionOptionsForCartLineItems(\n new PromotionOptionsForCartLineItems(ctx.requestContext.apiSettings),\n ctx\n ) .then(promotionOptions => {\n if (promotionOptions) {\n promotionData.promotionOptions = promotionOptions;\n }\n })\n .catch(error => {\n ctx.telemetry.exception(error);\n return {};\n });\n\n return promotionData;\n}","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport { IOrderSummaryLines, OrderSummary } from '@msdyn365-commerce-modules/order-summary-utilities';\nimport { ArrayExtensions } from '@msdyn365-commerce-modules/retail-actions';\nimport { Alert, Button, getPayloadObject, getTelemetryAttributes, getTelemetryObject, INodeProps, IPayLoad, ITelemetryContent, TelemetryConstant, Waiting } from '@msdyn365-commerce-modules/utilities';\nimport {\n IAddToOrderTemplateDialogResources, IDuplicateItemsWhenAddingToOrderTemplateDialogResources,\n IItemAddedToOrderTemplateDialogResources, ILinesAddedToOrderTemplateDialogResources, IOrderTemplateNameDialogResources,\n IWishlistActionSuccessResult, PromoCodeComponent, SaveCartToOrderTemplateComponent } from '@msdyn365-commerce/components';\nimport MsDyn365, { getUrlSync, IImageSettings } from '@msdyn365-commerce/core';\nimport { ICartActionResult, ICartState } from '@msdyn365-commerce/global-state';\nimport { AsyncResult, CartLine, CartLineValidationResults, LineDataValidationFailure } from '@msdyn365-commerce/retail-proxy';\nimport { validateForCheckoutAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/CartsDataActions.g';\nimport { ReleasedProductType } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\nimport classnames from 'classnames';\nimport { reaction } from 'mobx';\nimport { observer } from 'mobx-react';\nimport React from 'react';\nimport { ICartData } from './cart.data';\nimport { ICartProps, ICartResources } from './cart.props.autogenerated';\nimport { CartLineGroupItems } from './components/cart-line-groups';\nimport { CartLineItems, ICartlinesViewProps } from './components/cart-line-items';\nimport { cartPromotions, ICartLineItemViewProps } from './components/cart-line-items-promotion';\nimport { getPromotionData, IPromotionData } from './utils/get-promotion-in-cart';\n\nexport interface ICartViewProps extends ICartProps {\n className: string;\n title?: React.ReactNode;\n CartlinesWrapper: INodeProps;\n cartlines?: ICartlinesViewProps[];\n cartLinesGroup?:ICartlinesViewProps[][];\n cart: ICartState | undefined;\n orderSummaryHeading: React.ReactNode;\n orderSummaryLineitems?: IOrderSummaryLines;\n OrderSummaryWrapper: INodeProps;\n OrderSummaryItems: INodeProps;\n OrderSummaryErrors?: IOrderSummaryErrors;\n checkoutAsGuestButton: React.ReactNode;\n checkoutAsSignInUserButton: React.ReactNode;\n storeSelector?: React.ReactNode;\n backToShoppingButton: React.ReactNode;\n waitingComponent: React.ReactNode;\n promotionOptions?: ICartLineItemViewProps;\n promoCode: React.ReactNode;\n cartLoadingStatus: string;\n cartDataResult: boolean;\n mulitplePickUpEnabled?: boolean;\n createTemplateFromCartButton: React.ReactNode;\n telemetryContent?: ITelemetryContent;\n removeItemClickHandler(cartlineToRemove: CartLine): void;\n moveToWishlistSuccessHandler(result: IWishlistActionSuccessResult, cartlineId: CartLine): void;\n}\n\nexport interface IOrderSummaryErrors {\n Wrapper: INodeProps;\n\n header: React.ReactNode;\n errors: React.ReactNode[];\n}\n\ninterface ICartComponentState {\n showPromotionDialog: boolean;\n cartlinesErrors: LineDataValidationFailure[];\n promotionData: IPromotionData;\n}\n\n/**\n *\n * Cart component\n * @extends {React.PureComponent>}\n */\n@observer\nclass Cart extends React.Component> {\n\n public state: ICartComponentState = {\n cartlinesErrors: [],\n showPromotionDialog: false,\n promotionData: {}\n };\n\n private telemetryContent: ITelemetryContent;\n private payLoad: IPayLoad;\n private isQuantityLimitsFeatureEnabled: boolean = false;\n private readonly promotionPopupId: string = 'cart-promotion-popup';\n\n constructor(props: ICartProps) {\n super(props);\n this.telemetryContent = getTelemetryObject(this.props.context.request.telemetryPageName!, this.props.friendlyName, this.props.telemetry);\n this.payLoad = getPayloadObject('click', this.telemetryContent, '');\n this.promotionLinkClick = this.promotionLinkClick.bind(this);\n this.promotionCloseButtonclick = this.promotionCloseButtonclick.bind(this);\n }\n\n public async componentDidMount(): Promise {\n const {\n config: config,\n context: {\n actionContext: actionContext\n },\n } = this.props;\n\n this.isQuantityLimitsFeatureEnabled = await this._getOrderQuantityLimitsFeatureFlag();\n if (this.isQuantityLimitsFeatureEnabled) {\n await this._validateCart();\n }\n\n if (config.showAvailablePromotions) {\n if (this.props.data.cart.result?.cart.CartLines) {\n this.setState({ promotionData: await getPromotionData(actionContext) });\n }\n\n reaction(\n () => this.props.data.cart.result?.cart.CartLines,\n async () => {\n this.setState({ promotionData: await getPromotionData(actionContext) });\n }\n );\n }\n }\n\n public render(): JSX.Element | null {\n const {\n data: {\n cart: { result: cart },\n products: { result: products },\n },\n context: {\n request: {\n user: {\n isAuthenticated,\n signInUrl\n }\n }\n },\n resources\n } = this.props;\n\n const guestCheckoutUrl = getUrlSync('checkout', this.props.context.actionContext) || '';\n const backToShoppingUrl = getUrlSync('home', this.props.context.actionContext) || '';\n const checkoutURL = this._getCheckoutURL(isAuthenticated, guestCheckoutUrl, signInUrl || '');\n const isCartEmpty = cart && cart.cart.CartLines && cart.cart.CartLines.length === 0;\n const cartLines = this._getCartLines();\n const RetailMulitplePickupFeatureState = this.props.data.featureState.result?.find(featureState => featureState.Name === 'Dynamics.AX.Application.RetailMultiplePickupDeliveryModeFeature');\n const cartLinesGroup = RetailMulitplePickupFeatureState?.IsEnabled? this._getCartLinesGroup(): null;\n\n this.payLoad.contentAction.etext = TelemetryConstant.Checkout;\n const checkoutBySignInAttributes = getTelemetryAttributes(this.telemetryContent, this.payLoad);\n this.payLoad.contentAction.etext = TelemetryConstant.GuestCheckout;\n const checkoutByGuestAttributes = getTelemetryAttributes(this.telemetryContent, this.payLoad);\n this.payLoad.contentAction.etext = TelemetryConstant.BackToShopping;\n const backtoShoppingAttributes = getTelemetryAttributes(this.telemetryContent, this.payLoad);\n const hasErrors = cartLines ? cartLines.some(cartline => cartline.error !== undefined) : false;\n\n const viewProps = {\n ...this.props,\n className: classnames('ms-cart'),\n title:

{resources.cartTitle}

,\n CartlinesWrapper: { className: 'msc-cartline-wraper' },\n OrderSummaryWrapper: { className: 'msc-order-summary-wrapper' },\n OrderSummaryItems: { className: 'msc-order-summary__items' },\n cartlines: cartLines,\n cartLinesGroup:cartLinesGroup,\n promoCode: this._getPromoCode(),\n promotionOptions: this._getPromotions(),\n cart: this.props.data.cart.result,\n context: this.props.context,\n typeName: this.props.typeName,\n telemetry: this.props.telemetry,\n id: this.props.id,\n mulitplePickUpEnabled: RetailMulitplePickupFeatureState?.IsEnabled,\n removePromoAriaLabelFormat: resources.removePromoAriaLabelFormat,\n orderSummaryHeading: ArrayExtensions.hasElements(cart?.cart.CartLines) ?\n (\n

{resources.orderSummaryTitle}

\n ) : null,\n orderSummaryLineitems: this._getOrderSummaryLineItems(),\n checkoutAsSignInUserButton: (!isCartEmpty) ?\n (\n \n ) : null,\n checkoutAsGuestButton: (!isCartEmpty && !isAuthenticated) ?\n (\n \n ) : null,\n backToShoppingButton: ,\n createTemplateFromCartButton: (this._displayAddCartToTemplate() && products) ?\n (\n \n ) : null,\n storeSelector: this.props.slots.storeSelector && this.props.slots.storeSelector.length > 0 ? this.props.slots.storeSelector[0] : null,\n removeItemClickHandler: this._removeItemFromCartHandler,\n moveToWishlistSuccessHandler: this._moveToWishlistSuccessHandler,\n waitingComponent: ,\n cartLoadingStatus: this.props.data.cart.status === 'FAILED' ? this.props.resources.cartLoadingErrorMessage : null,\n cartDataResult: this.props.data.cart.result && this.props.data.cart.result.isEmpty,\n OrderSummaryErrors: this._getOrderSummaryErrors(cartLines),\n telemetryContent: this.telemetryContent\n };\n\n return this.props.renderView(viewProps) as React.ReactElement;\n }\n\n private promotionLinkClick = (event: React.MouseEvent) => {\n this.setState({\n showPromotionDialog: !this.state.showPromotionDialog\n });\n };\n\n private promotionCloseButtonclick = () => {\n this._hidePromotionDialog();\n };\n\n private _hidePromotionDialog(): void {\n this.setState({\n showPromotionDialog: false\n });\n }\n\n private _displayAddCartToTemplate(): boolean {\n const RetailB2BEcommerceFeatureState = this.props.data.featureState.result?.find(featureState => featureState.Name === 'Dynamics.AX.Application.RetailB2BEcommerceFeature');\n if (RetailB2BEcommerceFeatureState?.IsEnabled && this.props.data.customerInformation.result?.IsB2b && this.props.data.orderTemplates.result &&\n this.props.data.cart.result?.cart?.CartLines?.length && this.props.data.cart.result.cart.CartLines.length > 0 &&\n this.props.data.customerInformation.result) {\n return true;\n }\n\n return false;\n }\n\n private _getPromotions(): React.ReactNode {\n return(\n this.props.config.showAvailablePromotions &&\n cartPromotions({\n id: this.promotionPopupId,\n showPromotionPopup: this.state.showPromotionDialog,\n onSeeAllClick: this.promotionLinkClick,\n onCloseButtonClick: this.promotionCloseButtonclick,\n promotions: this.state.promotionData.promotionOptions,\n resources: {\n promotionStringHeading: this.props.resources.promotionStringHeading,\n promotionLinkText: this.props.resources.promotionLinkText,\n promotionPopupHeading: this.props.resources.promotionPopupHeading,\n promotionCloseButtonAriaLabel: this.props.resources.promotionCloseButtonAriaLabel\n }\n })\n );\n }\n\n private _getOrderSummaryErrors(cartLines: ICartlinesViewProps[] | null): IOrderSummaryErrors | undefined {\n const allErrors = cartLines && cartLines.map(cartline => {\n\n // check if the product is service or not by product type\n const PRODUCTASSERVICE = 2 as ReleasedProductType.Service;\n const isServiceItem = cartline.data?.product?.ItemTypeValue === PRODUCTASSERVICE;\n\n if (!isServiceItem && cartline.error) {\n const fullError = (cartline.data && cartline.data.product?.Name) ? `${cartline.data.product.Name}: ${cartline.error}` : cartline.error;\n\n return (\n
{fullError}
\n );\n }\n\n return null;\n }).filter((line): line is JSX.Element => !!line) || [];\n\n return {\n Wrapper: {\n tag: Alert,\n className: 'msc-alert',\n isOpen: allErrors.length > 0,\n color: 'danger',\n assertive: true,\n 'aria-label': this.props.resources.outOfStockErrorMessageHeader\n },\n header: (\n \n ),\n errors: allErrors\n };\n }\n\n private _getOrderSummaryLineItems(): IOrderSummaryLines | undefined {\n const {\n data: {\n cart: { result: cart },\n channelDeliveryOptionConfig\n },\n telemetry,\n resources\n } = this.props;\n\n const channelConfiguration = this.props.context && this.props.context.request && this.props.context.request.channel;\n const multiplePickupStoreSwitchName = 'Dynamics.AX.Application.RetailMultiplePickupDeliveryModeFeature';\n const featureState = this.props?.data?.featureState;\n const retailMultiplePickUpOptionEnabled = featureState?.result?.find(item => item.Name === multiplePickupStoreSwitchName)?.IsEnabled;\n\n return channelConfiguration && ArrayExtensions.hasElements(cart?.cart.CartLines) ?\n (\n OrderSummary({\n cart: cart!.cart,\n subTotalLabel: resources.itemsWithCountLabel,\n shippingLabel: resources.estimatedShippingLabel,\n otherChargeLabel: resources.otherCharges,\n taxLabel: resources.estimatedTaxLabel,\n orderTotalLabel: resources.orderTotal,\n totalDiscountsLabel: resources.totalDiscountsLabel,\n context: this.props.context,\n typeName: this.props.typeName,\n id: this.props.id,\n toBeCalculatedText: resources.yetToBeCalculatedText,\n freeText: resources.priceFree,\n channelConfiguration: channelConfiguration,\n retailMultiplePickUpOptionEnabled: retailMultiplePickUpOptionEnabled,\n channelDeliveryOptionConfig: channelDeliveryOptionConfig?.result,\n telemetry: telemetry\n })\n ) : undefined;\n }\n\n private _getPromoCode(): React.ReactNode {\n const {\n data: {\n cart: { result: cart }\n },\n resources\n } = this.props;\n\n return cart && (\n \n );\n }\n\n private _generateAddToOrderTemplateDialogResources(resources: ICartResources): IAddToOrderTemplateDialogResources {\n return {\n addToOrderTemplateHeader: resources.addToOrderTemplateHeader,\n\n noOrderTemplatesMessage: resources.noOrderTemplatesMessage,\n noOrderTemplatesDescription: resources.noOrderTemplatesDescription,\n\n createAnOrderTemplateButtonText: resources.createAnOrderTemplateButtonText,\n createNewOrderTemplateButtonText: resources.createNewOrderTemplateButtonText,\n cancelOrderTemplateCreationButtonText: resources.cancelOrderTemplateCreationButtonText,\n\n selectTemplatesText: resources.selectTemplatesText,\n addToTemplateButtonText: resources.addToTemplateButtonText,\n lineItemsText: resources.lineItemsText\n };\n }\n\n private _generateItemAddedToOrderTemplateDialogResources(resources: ICartResources): IItemAddedToOrderTemplateDialogResources {\n return {\n viewOrderTemplateButtonText: resources.viewOrderTemplateButtonText,\n continueShoppingButtonText: resources.continueShoppingButtonText,\n itemAddedToOrderTemplateHeaderItemOneText: resources.itemAddedToOrderTemplateHeaderItemOneText,\n itemAddedToOrderTemplateHeaderItemFormatText: resources.itemAddedToOrderTemplateHeaderItemFormatText,\n itemAddedToOrderTemplateHeaderMessageText: resources.itemAddedToOrderTemplateHeaderMessageText,\n freePriceText: resources.freePriceText,\n originalPriceText: resources.originalPriceText,\n currentPriceText: resources.currentPriceText\n };\n }\n\n private _generateLinesAddedToOrderTemplateDialogResources(resources: ICartResources): ILinesAddedToOrderTemplateDialogResources {\n return {\n viewOrderTemplateButtonText: resources.viewOrderTemplateButtonText,\n continueShoppingButtonText: resources.continueShoppingButtonText,\n linesAddedToOrderTemplateHeaderItemsOneText: resources.linesAddedToOrderTemplateHeaderItemsOneText,\n linesAddedToOrderTemplateHeaderItemsFormatText: resources.linesAddedToOrderTemplateHeaderItemsFormatText,\n linesAddedToOrderTemplateHeaderLinesOneText: resources.linesAddedToOrderTemplateHeaderLinesOneText,\n linesAddedToOrderTemplateHeaderLinesFormatText: resources.linesAddedToOrderTemplateHeaderLinesFormatText,\n linesAddedToOrderTemplateHeaderMessageText: resources.linesAddedToOrderTemplateHeaderMessageText\n };\n }\n\n private _generateDuplicateItemsWhenAddingToOrderTemplateDialogResources(resources: ICartResources): IDuplicateItemsWhenAddingToOrderTemplateDialogResources {\n return {\n duplicatedProductsHeader: resources.duplicatedProductsHeader,\n duplicatedProductsDescription: resources.duplicatedProductsDescription,\n updateQuantityButtonText: resources.updateQuantityButtonText,\n cancelDuplicateItemsButtonText: resources.cancelDuplicateItemsButtonText\n };\n }\n\n private _generateOrderTemplateNameDialogResources(resources: ICartResources): IOrderTemplateNameDialogResources {\n return {\n orderTemplateHeaderLabel: resources.createOrderTemplateHeader,\n orderTemplateTitleLabel: resources.orderTemplateTitle,\n orderTemplateNameAriaLabel: resources.orderTemplateNameAriaLabel,\n orderTemplateDescription: resources.createOrderTemplateDescription,\n\n defaultOrderTemplateName: resources.defaultOrderTemplateName,\n\n orderTemplateButtonLabel: resources.createOrderTemplateButtonText,\n orderTemplateCancelButtonLabel: resources.cancelNewOrderTemplateCreationButtonText\n };\n }\n\n private _getCartLines(): ICartlinesViewProps[] | null {\n const {\n data: {\n cart: { result: cart },\n wishlists: { result: wishlists },\n orderTemplates: { result: orderTemplates },\n customerInformation: { result: customerInformation }\n },\n context: {\n request: {\n channel: {\n PickupDeliveryModeCode\n } = { PickupDeliveryModeCode: undefined }\n }\n },\n config: config,\n telemetry,\n resources,\n modules\n } = this.props;\n\n const imageSettings = this._getImageSettings(config.imageSettings);\n\n const cartlinesErrors: LineDataValidationFailure[] = this.state.cartlinesErrors ;\n let storeSelectorId: string = '';\n if (modules && Object.keys(modules).length > 0 && modules.storeSelector && modules.storeSelector.length > 0) {\n storeSelectorId = modules.storeSelector[0].id;\n }\n return ArrayExtensions.hasElements(cart?.cart.CartLines) ? (\n CartLineItems({\n cartlines: cart!.cart.CartLines!,\n storeSelectorModuleId: storeSelectorId,\n cartlinesErrors: cartlinesErrors,\n products: this.props.data.products.result,\n productAvailabilites: this.props.data.productAvailabilites.result,\n productDeliveryOptions: this.props.data.deliveryOptions.result,\n imageSettings: imageSettings,\n isStockCheckEnabled: this.props.context.app.config.enableStockCheck || false,\n maxCartlineQuantity: this.props.context.app.config.maxQuantityForCartLineItem,\n gridSettings: this.props.context.request.gridSettings!,\n context: this.props.context,\n typeName: this.props.typeName,\n id: this.props.id,\n resources: {\n sizeString: resources.productDimensionTypeSize,\n colorString: resources.productDimensionTypeColor,\n configString: resources.productDimensionTypeConfiguration,\n styleString: resources.productDimensionTypeStyle,\n amountString: resources.productDimensionTypeAmount,\n quantityDisplayString: resources.quantityDisplayText,\n inputQuantityAriaLabel: resources.inputQuantityAriaLabel,\n decrementButtonAriaLabel: resources.decrementButtonAriaLabel,\n incrementButtonAriaLabel: resources.incrementButtonAriaLabel,\n discountStringText: resources.discountStringText,\n originalPriceText: resources.originalPriceText,\n currentPriceText: resources.currentPriceText,\n shippingChargesText: resources.shippingCharges\n },\n telemetry: telemetry,\n addToWishlistButtonText: resources.addToWishlistButtonText,\n removeFromWishlistButtonText: resources.removeFromWishlistButtonText,\n removeButtonText: resources.removeCartButtonText,\n shipItText: resources.shipInsteadDisplayText,\n pickitUpText: resources.pickItUpDisplayText,\n changeStoreText: resources.changeStoreDisplayText,\n storeSelectorStateManager: this.props.data.storeSelectorStateManager.result,\n outOfStockText: resources.outOfStockErrorMessage,\n outOfRangeOneText: resources.errorMessageOutOfRangeOneLeft,\n outOfRangeFormatText: resources.errorMessageOutOfRangeFormat,\n cartState: this.props.data.cart.result,\n orgUnitLocations: this.props.data.orgUnitLocations.result,\n removeItemClickHandler: this._removeItemFromCartHandler,\n moveToWishlistSuccessHandler: this._moveToWishlistSuccessHandler,\n updateCartLinesQuantitySuccessHandler: this._updateCartlineQuantity,\n locationChangedHandler: this._fulfillmentStoreIdUpdated,\n wishlists: wishlists,\n defaultWishlistName: resources.defaultWishlistName,\n pickupDeliveryModeCode: PickupDeliveryModeCode,\n includeErrors: config.showOutOfStockErrors,\n showShippingChargesForLineItems: config.showShippingChargesForLineItems,\n telemetryContent: this.telemetryContent,\n isQuantityLimitsFeatureEnabled: this.isQuantityLimitsFeatureEnabled,\n\n addToOrderTemplateDialogResources: this._generateAddToOrderTemplateDialogResources(resources),\n createOrderTemplateDialogResources: this._generateOrderTemplateNameDialogResources(resources),\n itemAddedToOrderTemplateDialogResources: this._generateItemAddedToOrderTemplateDialogResources(resources),\n duplicateItemsWhenAddingToOrderTemplateDialogResources: this._generateDuplicateItemsWhenAddingToOrderTemplateDialogResources(resources),\n\n addToOrderTemplateButtonText: resources.addToOrderTemplateButtonText,\n addToOrderTemplateMessage: resources.addToOrderTemplateMessage,\n addItemToOrderTemplateError: resources.addItemToOrderTemplateError,\n orderTemplates: orderTemplates,\n customerInformation: customerInformation\n })\n ) : null;\n }\n\n private _getCheckoutURL(isAuthenticated: boolean, guestCheckoutUrl: string, signInUrl: string): string {\n if (isAuthenticated) {\n return guestCheckoutUrl;\n }\n\n const absoluteUrlRegExp = new RegExp('^(?:[a-z]+:)?//', 'i');\n const isAbsoluteUrl = absoluteUrlRegExp.test(guestCheckoutUrl);\n let returnURL = guestCheckoutUrl;\n if (MsDyn365.isBrowser && !isAbsoluteUrl) {\n returnURL = `${window.location.origin}${guestCheckoutUrl}`;\n }\n\n return `${signInUrl}${signInUrl.indexOf('?') === -1 ? '?' : '&'}ru=${returnURL}`;\n }\n\n private _getImageSettings = (imageSettings: IImageSettings | undefined): IImageSettings => {\n return imageSettings || {\n viewports: {\n xs: { q: `w=80&h=94&m=6`, w: 0, h: 0 },\n sm: { q: `w=148&h=174&m=6`, w: 0, h: 0 },\n lg: { q: `w=148&h=174&m=6`, w: 0, h: 0 }\n },\n lazyload: true\n };\n }\n\n private _removeItemFromCartHandler = (cartlineToRemove: CartLine) => {\n if (this.props.data.cart.result) {\n const input = {\n cartLineIds: [cartlineToRemove.LineId!.toString()]\n };\n this.props.data.cart.result.removeCartLines(input)\n .then(() => {\n this._validateCart()\n .catch((error) => {\n this.props.telemetry.warning(error);\n this.props.telemetry.debug('Unable to validate Cart');\n });\n })\n .catch((error) => {\n this.props.telemetry.warning(error);\n this.props.telemetry.debug('Unable to Remove Cart Line');\n });\n }\n }\n\n private _moveToWishlistSuccessHandler = (result: IWishlistActionSuccessResult, cartline?: CartLine) => {\n if (result.status === 'ADDED' && cartline) {\n this._removeItemFromCartHandler(cartline);\n }\n }\n\n private _updateCartlineQuantity = (cartlineToUpdate: CartLine, quantity: number): boolean => {\n if (this.props.data.cart.result) {\n const input = {\n cartLineId: cartlineToUpdate.LineId!.toString(),\n newQuantity: quantity,\n additionalProperties: { orderQuantityLimitsFeatureIsEnabled: this.isQuantityLimitsFeatureEnabled }\n };\n this.props.data.cart.result.updateCartLineQuantity(input)\n .then((result: ICartActionResult) => {\n if(result.status === 'SUCCESS') {\n this._validateCart().catch((error) => {\n this.props.telemetry.warning(error);\n this.props.telemetry.debug('Unable to validate Cart');\n });\n return true;\n }\n return false;\n })\n .catch((error) => {\n this.props.telemetry.warning(error);\n this.props.telemetry.debug('Unable to update Cart Line quantity');\n });\n }\n\n return false;\n }\n\n private _fulfillmentStoreIdUpdated = () => {\n this._validateCart().catch((error) => {\n this.props.telemetry.warning(error);\n this.props.telemetry.debug('Unable to validate Cart');\n });\n }\n\n private async _validateCart(retry: boolean = true): Promise {\n if (!this.isQuantityLimitsFeatureEnabled) {\n return AsyncResult.resolve();\n }\n\n const {\n data: { cart: cart }\n } = this.props;\n let cartResult: ICartState;\n try {\n cartResult = await cart;\n } catch (error) {\n this.props.telemetry.warning(error);\n this.props.telemetry.debug('Unable to get cart');\n return AsyncResult.resolve();\n }\n const cartVersion = cartResult.cart?.Version;\n if (cartVersion) {\n try {\n const validationResult: CartLineValidationResults = await validateForCheckoutAsync({ callerContext: this.props.context.actionContext }, cartResult?.cart?.Id, cartVersion);\n this.setState({cartlinesErrors: validationResult.ValidationFailuresByCartLines || []});\n return AsyncResult.resolve();\n } catch (error) {\n if(retry && error.name === 'Microsoft_Dynamics_Commerce_Runtime_InvalidCartVersion') {\n try {\n await cartResult.refreshCart({});\n } catch (refreshError) {\n this.props.telemetry.warning(refreshError);\n this.props.telemetry.debug('Unable to refresh Cart');\n return AsyncResult.resolve();\n }\n try {\n await this._validateCart(false);\n return AsyncResult.resolve();\n } catch (validateError) {\n this.props.telemetry.warning(validateError);\n this.props.telemetry.debug('Unable to validate Cart');\n return AsyncResult.resolve();\n }\n }\n\n this.props.telemetry.warning(error);\n this.props.telemetry.debug('Unable to validate Cart');\n return AsyncResult.resolve();\n }\n } else {\n this.props.telemetry.warning('Cart version not found for Cart validation request.');\n return AsyncResult.resolve();\n }\n }\n\n private async _getOrderQuantityLimitsFeatureFlag(): Promise {\n const defaultOrderQuantityLimitsFeatureConfig = this.props.context?.request?.app?.platform?.enableDefaultOrderQuantityLimits;\n if (defaultOrderQuantityLimitsFeatureConfig === 'none') {\n return false;\n }\n\n try {\n const featureStatuses = await this.props.data.featureState;\n const isQuantityLimitsFeatureEnabledInHq = featureStatuses\n .find(featureState => featureState.Name === 'Dynamics.AX.Application.RetailDefaultOrderQuantityLimitsFeature')?.IsEnabled || false;\n if (!isQuantityLimitsFeatureEnabledInHq) {\n return false;\n }\n } catch (error) {\n this.props.telemetry.warning(error);\n this.props.telemetry.debug('Unable to get feature states');\n return false;\n }\n\n if (defaultOrderQuantityLimitsFeatureConfig === 'all') {\n return true;\n }\n try {\n const customerInfo = await this.props.data.customerInformation;\n return !!customerInfo &&\n ((defaultOrderQuantityLimitsFeatureConfig === 'b2b' && customerInfo.IsB2b) ||\n (defaultOrderQuantityLimitsFeatureConfig === 'b2c' && !customerInfo.IsB2b));\n } catch(error) {\n this.props.telemetry.warning(error);\n this.props.telemetry.debug('Unable to get customer info');\n return false;\n }\n }\n\n private _getCartLinesGroup(): ICartlinesViewProps[][] | null {\n const {\n data: {\n cart: { result: cart },\n wishlists: { result: wishlists },\n orderTemplates: { result: orderTemplates },\n customerInformation: { result: customerInformation }\n },\n context: {\n request: {\n channel: {\n PickupDeliveryModeCode\n } = { PickupDeliveryModeCode: undefined }\n }\n },\n config: config,\n telemetry,\n resources,\n modules\n } = this.props;\n\n const imageSettings = this._getImageSettings(config.imageSettings);\n const isQuantityLimitsFeatureEnabled = this.props.data.featureState.result?.\n find(featureState => featureState.Name === 'Dynamics.AX.Application.RetailDefaultOrderQuantityLimitsFeature')?.IsEnabled || false;\n const cartlinesErrors: LineDataValidationFailure[] = this.state.cartlinesErrors ;\n let storeSelectorId: string = '';\n if (modules && Object.keys(modules).length > 0 && modules.storeSelector && modules.storeSelector.length > 0) {\n storeSelectorId = modules.storeSelector[0].id;\n }\n\n return this.props.data.products && this.props.data.products.result && cart && cart.cart.CartLines && cart.cart.CartLines.length > 0 && this.props.data.channelDeliveryOptionConfig?.result ? (\n CartLineGroupItems({\n cartlines: cart.cart.CartLines,\n storeSelectorModuleId: storeSelectorId,\n cartlinesErrors: cartlinesErrors,\n products: this.props.data.products.result,\n productAvailabilites: this.props.data.productAvailabilites.result,\n productDeliveryOptions: this.props.data.deliveryOptions.result,\n imageSettings: imageSettings,\n isStockCheckEnabled: this.props.context.app.config.enableStockCheck || false,\n maxCartlineQuantity: this.props.context.app.config.maxQuantityForCartLineItem,\n gridSettings: this.props.context.request.gridSettings!,\n context: this.props.context,\n typeName: this.props.typeName,\n id: this.props.id,\n resources: {\n sizeString: resources.productDimensionTypeSize,\n colorString: resources.productDimensionTypeColor,\n configString: resources.productDimensionTypeConfiguration,\n styleString: resources.productDimensionTypeStyle,\n amountString: resources.productDimensionTypeAmount,\n quantityDisplayString: resources.quantityDisplayText,\n inputQuantityAriaLabel: resources.inputQuantityAriaLabel,\n decrementButtonAriaLabel: resources.decrementButtonAriaLabel,\n incrementButtonAriaLabel: resources.incrementButtonAriaLabel,\n discountStringText: resources.discountStringText,\n originalPriceText: resources.originalPriceText,\n currentPriceText: resources.currentPriceText,\n shippingChargesText: resources.shippingCharges\n },\n telemetry: telemetry,\n addToWishlistButtonText: resources.addToWishlistButtonText,\n removeFromWishlistButtonText: resources.removeFromWishlistButtonText,\n removeButtonText: resources.removeCartButtonText,\n shipItText: resources.shipInsteadDisplayText,\n pickitUpText: resources.pickItUpDisplayText,\n changeStoreText: resources.changeStoreDisplayText,\n storeSelectorStateManager: this.props.data.storeSelectorStateManager.result,\n outOfStockText: resources.outOfStockErrorMessage,\n outOfRangeOneText: resources.errorMessageOutOfRangeOneLeft,\n outOfRangeFormatText: resources.errorMessageOutOfRangeFormat,\n cartState: this.props.data.cart.result,\n orgUnitLocations: this.props.data.orgUnitLocations.result,\n removeItemClickHandler: this._removeItemFromCartHandler,\n moveToWishlistSuccessHandler: this._moveToWishlistSuccessHandler,\n updateCartLinesQuantitySuccessHandler: this._updateCartlineQuantity,\n locationChangedHandler: this._fulfillmentStoreIdUpdated,\n wishlists: wishlists,\n defaultWishlistName: resources.defaultWishlistName,\n pickupDeliveryModeCode: PickupDeliveryModeCode,\n includeErrors: config.showOutOfStockErrors,\n showShippingChargesForLineItems: config.showShippingChargesForLineItems,\n telemetryContent: this.telemetryContent,\n isQuantityLimitsFeatureEnabled: isQuantityLimitsFeatureEnabled,\n\n addToOrderTemplateDialogResources: this._generateAddToOrderTemplateDialogResources(resources),\n createOrderTemplateDialogResources: this._generateOrderTemplateNameDialogResources(resources),\n itemAddedToOrderTemplateDialogResources: this._generateItemAddedToOrderTemplateDialogResources(resources),\n duplicateItemsWhenAddingToOrderTemplateDialogResources: this._generateDuplicateItemsWhenAddingToOrderTemplateDialogResources(resources),\n\n addToOrderTemplateButtonText: resources.addToOrderTemplateButtonText,\n addToOrderTemplateMessage: resources.addToOrderTemplateMessage,\n addItemToOrderTemplateError: resources.addItemToOrderTemplateError,\n orderTemplates: orderTemplates,\n customerInformation: customerInformation,\n channelDeliveryOptionConfig: this.props.data.channelDeliveryOptionConfig?.result\n })\n ) : null;\n }\n\n}\n\nexport default Cart;\n","import { ArrayExtensions } from '@msdyn365-commerce-modules/retail-actions';\nimport { INodeProps, Modal, ModalBody, ModalFooter, ModalHeader } from '@msdyn365-commerce-modules/utilities';\nimport { CartPromotionLine } from '@msdyn365-commerce/retail-proxy';\nimport React from 'react';\n\nexport interface ICartLineItemPromotion {\n id: string;\n showPromotionPopup: boolean;\n promotions: CartPromotionLine[] | undefined;\n resources: ICartLineItemPromotionResourceString;\n onSeeAllClick(event: React.MouseEvent): void;\n onCloseButtonClick(): void;\n}\n\nexport interface ICartLineItemViewProps {\n promotionMessageWrapper: INodeProps;\n promotionMessage: React.ReactNode;\n promotionSeeAllLink: React.ReactElement;\n promotionDialog: React.ReactNode;\n}\n\nexport interface ICartLineItemPromotionResourceString {\n promotionLinkText: string;\n promotionStringHeading: string;\n promotionPopupHeading: string;\n promotionCloseButtonAriaLabel: string;\n}\n\nexport const cartPromotions = (props: ICartLineItemPromotion): ICartLineItemViewProps | undefined => {\n\n const {\n id,\n showPromotionPopup,\n promotions,\n resources : {\n promotionLinkText,\n promotionPopupHeading\n },\n onCloseButtonClick,\n onSeeAllClick,\n } = props;\n\n if (!ArrayExtensions.hasElements(promotions)) {\n return;\n }\n\n const titleId = `${id}_title`;\n const className = 'msc-cart__promotion';\n return {\n promotionMessageWrapper: {\n className: 'msc-cart__promotion'\n },\n promotionMessage: (\n \n \n {props.resources.promotionStringHeading}\n \n ),\n promotionSeeAllLink: ( {promotionLinkText} ),\n promotionDialog: (\n \n \n
{promotionPopupHeading}
\n
\n \n
    \n {promotions!.map(_promotion => {\n return (\n
  • {_promotion.Promotion?.OfferName}
  • \n );\n }\n )}\n
\n
\n \n
\n )\n };\n};","import { INodeProps, Module, Node } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\nimport { IProductCollectionViewProps, IProductComponentViewProps } from './product-collection';\n\nconst ProductCollectionView: React.FC = props => {\n const { heading, ProductCollectionContainer, products, SingleSlideCarouselComponentProps, GridComponentProps, isCarousel } = props;\n if (products) {\n return (\n \n {heading}\n {\n isCarousel ? _renderCarousel(SingleSlideCarouselComponentProps, products) : _renderGrid(GridComponentProps, products)\n }\n \n );\n }\n props.context.telemetry.error('Product collection content is empty, module wont render.');\n return null;\n};\n\nconst _renderCarousel = (carouselContainer: INodeProps, items: IProductComponentViewProps[]): JSX.Element => {\n return (\n \n {items && items.map(_renderProduct)}\n \n );\n};\n\nconst _renderGrid = (gridContainer: INodeProps, items: IProductComponentViewProps[]): JSX.Element => {\n return (\n \n {items && items.map(_renderProduct)}\n \n );\n};\n\nconst _renderProduct = (product: IProductComponentViewProps): JSX.Element => {\n const { ProductContainer, productComponent } = product;\n\n return (\n \n {productComponent}\n \n );\n};\n\nexport default ProductCollectionView;","import { observable } from 'mobx';\n\n/**\n * State information related to what is needed to succesfully perform a autosuggest\n */\nexport class SearchState {\n @observable public searchText?: string;\n @observable public defaultBasicSearchUrl?: string;\n @observable public searchQueryStringParameter?: string;\n}\n","import { IAddToCartFailureResult } from '@msdyn365-commerce/components';\nimport { IAny, ICoreContext, IGeneric } from '@msdyn365-commerce/core';\nimport { ICartState } from '@msdyn365-commerce/global-state';\nimport { OrgUnitLocation, ProductAvailableQuantity , ProductDimension, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\nimport { IBuyboxResources } from '../buybox.props.autogenerated';\n\nexport function getQuantityError(stockLeft: number | undefined, resources: IBuyboxResources): string | undefined {\n if (!stockLeft || stockLeft <= 0) {\n return resources.errorMessageOutOfStock;\n } else if (stockLeft === 1) {\n return resources.errorMessageOutOfRangeOneLeft;\n } else {\n return resources.errorMessageOutOfRangeFormat.replace('{numLeft}', stockLeft.toString());\n }\n}\n\n// tslint:disable-next-line:cyclomatic-complexity\nexport function getGenericError(\n result: IAddToCartFailureResult,\n cart: ICartState | undefined,\n resources: IBuyboxResources,\n context: ICoreContext>,\n product: SimpleProduct | undefined,\n productAvailability: ProductAvailableQuantity | undefined,\n location: OrgUnitLocation | undefined)\n : string | undefined {\n if (result.failureReason === 'EMPTYINPUT') {\n return resources.addedToCartFailureMessage;\n } else if (result.failureReason === 'CARTACTIONFAILED') {\n if (result.cartActionResult && result.cartActionResult.substatus === 'MAXQUANTITY') {\n // get the quantity of the product in cart\n let elementFoundAt:number = -1;\n const productIdToFind = product?.RecordId;\n\n for (let i = 0; i < cart!.cart.CartLines!.length; i++) {\n if (cart!.cart.CartLines![i].ProductId === productIdToFind &&\n (cart!.cart.CartLines![i].DeliveryMode || '') === (location && context.actionContext.requestContext.channel?.PickupDeliveryModeCode || '') &&\n (cart!.cart.CartLines![i].FulfillmentStoreId || '') === (location?.OrgUnitNumber || '')) {\n elementFoundAt = i;\n\n break;\n }\n }\n\n let curQuantity: number = 0;\n\n if (elementFoundAt !== -1) {\n const cartLineToUpdate = {...cart!.cart.CartLines![elementFoundAt]};\n curQuantity = cartLineToUpdate.Quantity || 0;\n }\n\n // get the quantity limit for the product\n const maxQuantityForCartLineItem = context.app.config.maxQuantityForCartLineItem;\n const availableQty = productAvailability?.AvailableQuantity;\n\n let quantityLimit: number;\n\n if (maxQuantityForCartLineItem === undefined && availableQty === undefined) {\n quantityLimit = 10;\n } else if (availableQty === undefined) {\n quantityLimit = maxQuantityForCartLineItem;\n } else if (maxQuantityForCartLineItem === undefined) {\n quantityLimit = availableQty;\n } else {\n quantityLimit = Math.min(maxQuantityForCartLineItem, availableQty);\n }\n\n return resources.maxQuantityLimitText.replace('{curQuantity}', curQuantity.toString()).replace('{maxQuantity}', quantityLimit.toString());\n } else if (result.cartActionResult && result.cartActionResult.substatus === 'QUANTITYLIMITS') {\n return result.cartActionResult?.errorDetails?.LocalizedMessage;\n }\n\n return resources.addedToCartFailureMessage;\n }\n\n return undefined;\n}\n\nexport function getConfigureErrors(result: ProductDimension[] | undefined, resources: IBuyboxResources, isGiftCard?: Boolean): { [configureId: string]: string | undefined } {\n if (!result) {\n return {};\n }\n\n const dimensions: { [configureId: string]: string | undefined } = {};\n\n result.forEach(dimension => {\n dimensions[dimension.DimensionTypeValue] = getDimensionErrorString(dimension.DimensionTypeValue, resources, isGiftCard);\n });\n\n return dimensions;\n}\n\nexport function getDimensionErrorString(dimensionTypeValue: number, resources: IBuyboxResources, isGiftCard?: Boolean): string {\n switch (dimensionTypeValue) {\n case 1: // ProductDimensionType.Color\n return resources.productDimensionTypeColorErrorMessage;\n case 2: // ProductDimensionType.Configuration\n return resources.productDimensionTypeConfigurationErrorMessage;\n case 3: // ProductDimensionType.Size\n return resources.productDimensionTypeSizeErrorMessage;\n case 4: // ProductDimensionType.Style\n return isGiftCard ? resources.productDimensionTypeAmountErrorMessage : resources.productDimensionTypeStyleErrorMessage;\n default:\n return '';\n }\n}","import * as React from 'react';\n\nimport { ArrayExtensions } from '@msdyn365-commerce-modules/retail-actions';\nimport { Alert, Button, format, getPayloadObject, getTelemetryAttributes, getTelemetryObject, Heading, INodeProps, ITelemetryContent, Node, Quantity, TelemetryConstant } from '@msdyn365-commerce-modules/utilities';\nimport {\n AddToCartComponent,\n AddToOrderTemplateComponent,\n AddToWishlistComponent,\n IAddToCartFailureResult,\n IAddToOrderTemplateDialogResources,\n IDuplicateItemsWhenAddingToOrderTemplateDialogResources,\n IItemAddedToOrderTemplateDialogResources,\n IOrderTemplateActionErrorResult,\n IOrderTemplateNameDialogResources,\n IWishlistActionErrorResult,\n PriceComponent,\n RatingComponent\n} from '@msdyn365-commerce/components';\nimport { getUrlSync, IImageSettings } from '@msdyn365-commerce/core';\nimport { IBuyboxCallbacks, IBuyboxData, IBuyboxProps, IBuyboxResources, IBuyboxState } from '../../../index';\nimport { getConfigureErrors, getGenericError, getQuantityError } from '../utilities/error-utilities';\n\nexport function getBuyBoxInventoryLabel(props: IBuyboxProps): React.ReactElement | undefined {\n const {\n data: { productAvailableQuantity: { result: productAvailableQuantity } },\n } = props;\n if (!productAvailableQuantity || !productAvailableQuantity.length) {\n return undefined;\n }\n if (productAvailableQuantity &&\n productAvailableQuantity.length &&\n productAvailableQuantity[0].StockLevelLabel) {\n const inventoryClassName = productAvailableQuantity[0].StockLevelCode ?\n `ms-buybox__inventory-label ms-buybox__inventory-code-${productAvailableQuantity[0].StockLevelCode.toLowerCase()}` :\n 'ms-buybox__inventory-label';\n return (
{productAvailableQuantity[0].StockLevelLabel}
);\n }\n\n return undefined;\n\n}\nexport function getBuyboxProductTitle(props: IBuyboxProps): React.ReactElement | undefined {\n const {\n data: { product: { result: product } },\n config: { titleHeadingTag = 'h1' }\n } = props;\n\n return product && (\n \n );\n}\n\nexport function getBuyboxProductDescription(props: IBuyboxProps): React.ReactElement | undefined {\n const {\n data: { product: { result: product } }\n } = props;\n\n return product && (\n

{product.Description}

\n );\n}\n\nexport interface IBuyboxAddToCartViewProps {\n ContainerProps: INodeProps;\n errorBlock?: React.ReactNode;\n button?: React.ReactNode;\n}\n\nlet telemetryContent: ITelemetryContent;\n\n// tslint:disable-next-line:max-func-body-length\nexport function getBuyboxAddToCart(props: IBuyboxProps, state: IBuyboxState, callbacks: IBuyboxCallbacks,\n defaultMinimumKeyInPrice: number, defaultMaximumKeyInPrice: number): IBuyboxAddToCartViewProps {\n const {\n id,\n typeName,\n context,\n data: { cart: { result: cart }, product: { result: product }, productAvailableQuantity: { result: productAvailableQuantity } },\n resources,\n config: { minimumKeyInPrice, maximumKeyInPrice }\n } = props;\n\n const {\n quantity,\n errorState: {\n configureErrors,\n quantityError,\n customAmountError,\n otherError,\n errorHost\n },\n selectedProduct,\n isUpdatingDimension,\n isUpdatingDeliveryOptions,\n isServiceItem,\n keyInPriceAmount\n } = state;\n\n const productAvailability = state.productAvailableQuantity ?\n state.productAvailableQuantity.ProductAvailableQuantity :\n productAvailableQuantity && productAvailableQuantity.length ?\n productAvailableQuantity[0].ProductAvailableQuantity : undefined;\n\n const onAddToCartFailed = (result: IAddToCartFailureResult) => {\n let quantityErrorForState: string | undefined;\n let customAmountErrorForState: string | undefined;\n let otherErrorForState: string | undefined = getGenericError(result, cart, resources, context, product, productAvailability, undefined);\n\n if(result.failureReason === 'OUTOFSTOCK') {\n quantityErrorForState = result.failureReason === 'OUTOFSTOCK' ? getQuantityError(result.stockLeft, resources) : undefined;\n } else if(result.failureReason === 'CARTACTIONFAILED'\n && result.cartActionResult\n && (result.cartActionResult.substatus === 'MAXQUANTITY' || result.cartActionResult.substatus === 'QUANTITYLIMITS')) {\n quantityErrorForState = getGenericError(result, cart, resources, context, product, productAvailability, undefined);\n otherErrorForState = undefined; // prevent error duplication in otherError and quantityError\n }\n\n if(result.failureReason === 'INVALIDCUSTOMAMOUNT') {\n if (keyInPriceAmount === undefined || keyInPriceAmount < (minimumKeyInPrice || defaultMinimumKeyInPrice)) {\n const formatedAmountLimit = props.context.cultureFormatter.formatCurrency(minimumKeyInPrice || defaultMinimumKeyInPrice);\n customAmountErrorForState = resources.invalidSmallCustomAmountText.replace('{minAmount}', formatedAmountLimit);\n } else if (keyInPriceAmount > (maximumKeyInPrice || defaultMaximumKeyInPrice)) {\n const formatedAmountLimit = props.context.cultureFormatter.formatCurrency(maximumKeyInPrice || defaultMaximumKeyInPrice);\n customAmountErrorForState = resources.invalidLargeCustomAmountText.replace('{maxAmount}', formatedAmountLimit);\n }\n }\n\n callbacks.updateErrorState({\n errorHost: 'ADDTOCART',\n quantityError: quantityErrorForState,\n configureErrors: result.failureReason === 'MISSINGDIMENSION' ? getConfigureErrors(result.missingDimensions, resources, product?.IsGiftCard) : {},\n customAmountError: customAmountErrorForState,\n otherError: otherErrorForState\n });\n };\n\n const dialogStrings = {\n goToCartText: resources.buyBoxGoToCartText,\n continueShoppingText: resources.buyBoxContinueShoppingText,\n headerItemOneText: resources.buyBoxSingleItemText,\n headerItemFormatText: resources.buyBoxMultiLineItemFormatText,\n headerMessageText: resources.buyBoxHeaderMessageText,\n freePriceText: resources.priceFree,\n originalPriceText: resources.originalPriceText,\n currentPriceText: resources.currentPriceText\n };\n\n const defaultImageSettings: IImageSettings = {\n viewports: {\n xs: { q: `w=240&h=240&m=6`, w: 0, h: 0 },\n lg: { q: `w=240&h=240&m=6`, w: 0, h: 0 },\n xl: { q: `w=240&h=240&m=6`, w: 0, h: 0 }\n },\n lazyload: true\n };\n\n const isLoading = props.data.productAvailableQuantity.status === 'LOADING';\n if (isLoading) {\n callbacks.changeUpdatingDimension(false);\n }\n\n const isLoadingDeliveryOptions = typeName !== 'quickview' && props.data.deliveryOptions?.status === 'LOADING';\n if (isLoadingDeliveryOptions && callbacks.changeUpdatingDeliveryOptions) {\n callbacks.changeUpdatingDeliveryOptions(false);\n }\n\n telemetryContent = getTelemetryObject(props.context.request.telemetryPageName!,\n props.friendlyName,\n props.telemetry);\n\n // check if the product delivery mode is electronic\n const emailDeliveryModeCode = props.context.actionContext.requestContext.channel?.EmailDeliveryModeCode;\n const deliveryOptions = props.data.deliveryOptions?.result;\n const isEmailDelivery = deliveryOptions && deliveryOptions.DeliveryOptions && ArrayExtensions.hasElements(deliveryOptions.DeliveryOptions) && deliveryOptions.DeliveryOptions[0].Code === emailDeliveryModeCode;\n\n return {\n ContainerProps: {\n className: 'ms-buybox__add-to-cart-container'\n },\n button: product && (\n \n ),\n errorBlock: (\n \n )\n };\n}\n\nexport function getBuyboxProductPrice(props: IBuyboxProps, state: IBuyboxState): React.ReactElement | undefined {\n const {\n id,\n typeName,\n context,\n resources\n } = props;\n\n return state.productPrice && (\n \n );\n}\n\nexport function getBuyboxProductRating(props: IBuyboxProps): React.ReactElement | undefined {\n const {\n id,\n typeName,\n context,\n data: { ratingsSummary: { result: ratingsSummary } },\n resources\n } = props;\n\n const ratingComponent = ratingsSummary && ratingsSummary.averageRating && (\n \n ) || undefined;\n\n return ratingsSummary && ratingComponent && (\n ratingComponent\n );\n}\n\nexport interface IBuyboxAddToOrderTemplateViewProps {\n ContainerProps: INodeProps;\n errorBlock?: React.ReactNode;\n button?: React.ReactNode;\n}\n\nfunction generateAddToOrderTemplateDialogResources(resources: IBuyboxResources): IAddToOrderTemplateDialogResources {\n return {\n addToOrderTemplateHeader: resources.addToOrderTemplateHeader,\n\n noOrderTemplatesMessage: resources.noOrderTemplatesMessage,\n noOrderTemplatesDescription: resources.noOrderTemplatesDescription,\n\n createAnOrderTemplateButtonText: resources.createAnOrderTemplateButtonText,\n createNewOrderTemplateButtonText: resources.createNewOrderTemplateButtonText,\n cancelOrderTemplateCreationButtonText: resources.cancelOrderTemplateCreationButtonText,\n\n selectTemplatesText: resources.selectTemplatesText,\n addToTemplateButtonText: resources.addToTemplateButtonText,\n lineItemsText: resources.lineItemsText\n };\n}\n\nfunction generateOrderTemplateNameDialogResources(resources: IBuyboxResources): IOrderTemplateNameDialogResources {\n return {\n orderTemplateHeaderLabel: resources.createOrderTemplateHeader,\n orderTemplateTitleLabel: resources.orderTemplateTitle,\n orderTemplateNameAriaLabel: resources.orderTemplateNameAriaLabel,\n orderTemplateDescription: resources.createOrderTemplateDescription,\n\n defaultOrderTemplateName: resources.defaultOrderTemplateName,\n\n orderTemplateButtonLabel: resources.createOrderTemplateButtonText,\n orderTemplateCancelButtonLabel: resources.cancelNewOrderTemplateCreationButtonText\n };\n}\n\nfunction generateItemAddedToOrderTemplateDialogResources(resources: IBuyboxResources): IItemAddedToOrderTemplateDialogResources {\n return {\n viewOrderTemplateButtonText: resources.viewOrderTemplateButtonText,\n continueShoppingButtonText: resources.continueShoppingButtonText,\n itemAddedToOrderTemplateHeaderItemOneText: resources.itemAddedToOrderTemplateHeaderItemOneText,\n itemAddedToOrderTemplateHeaderItemFormatText: resources.itemAddedToOrderTemplateHeaderItemFormatText,\n itemAddedToOrderTemplateHeaderMessageText: resources.itemAddedToOrderTemplateHeaderMessageText,\n freePriceText: resources.priceFree,\n originalPriceText: resources.originalPriceText,\n currentPriceText: resources.currentPriceText\n };\n}\n\nfunction generateDuplicateItemsWhenAddingToOrderTemplateDialogResources(resources: IBuyboxResources): IDuplicateItemsWhenAddingToOrderTemplateDialogResources {\n return {\n duplicatedProductsHeader: resources.duplicatedProductsHeader,\n duplicatedProductsDescription: resources.duplicatedProductsDescription,\n updateQuantityButtonText: resources.updateQuantityButtonText,\n cancelDuplicateItemsButtonText: resources.cancelDuplicateItemsButtonText\n };\n}\n\nexport function getBuyboxProductAddToOrderTemplate(props: IBuyboxProps, state: IBuyboxState, callbacks: IBuyboxCallbacks): IBuyboxAddToOrderTemplateViewProps | undefined {\n const {\n id,\n typeName,\n context,\n data: {\n product: { result: product },\n orderTemplates: { result: orderTemplates },\n customerInformation: { result: customerInformation }\n },\n resources\n } = props;\n\n const\n {\n errorState: {\n configureErrors,\n quantityError,\n customAmountError,\n otherError,\n errorHost\n },\n quantity\n } = state;\n\n // If custom amount is selected, add-to-orderTemplate is disabled\n if (state.isCustomPriceSelected) {\n return undefined;\n }\n\n const onAddToOrderTemplateFailed = (result: IOrderTemplateActionErrorResult) => {\n callbacks.updateErrorState({\n errorHost: 'ORDER_TEMPLATE',\n configureErrors: result.status === 'MISSING_DIMENSION' ? getConfigureErrors(result.missingDimensions, resources, product?.IsGiftCard) : {},\n });\n };\n\n return {\n ContainerProps: {\n className: 'ms-buybox__add-to-order-template-container'\n },\n button: product && orderTemplates && (\n \n ),\n errorBlock: (\n \n )\n };\n}\n\nexport interface IBuyboxAddToWishlistViewProps {\n ContainerProps: INodeProps;\n errorBlock?: React.ReactNode;\n button?: React.ReactNode;\n}\nexport function getBuyboxProductAddToWishlist(props: IBuyboxProps, state: IBuyboxState, callbacks: IBuyboxCallbacks): IBuyboxAddToWishlistViewProps | undefined {\n const {\n id,\n typeName,\n context,\n data: {\n product: { result: product },\n wishlists: { result: wishlists }\n },\n resources\n } = props;\n\n const\n {\n errorState: {\n configureErrors,\n quantityError,\n customAmountError,\n otherError,\n errorHost\n },\n selectedProduct\n } = state;\n\n // If custom amount is selected, add-to-wishlist is disabled\n if (state.isCustomPriceSelected) {\n return undefined;\n }\n\n const onAddToWishlistFailed = (result: IWishlistActionErrorResult) => {\n callbacks.updateErrorState({\n errorHost: 'WISHLIST',\n configureErrors: result.status === 'MISSINGDIMENSION' ? getConfigureErrors(result.missingDimensions, resources, product?.IsGiftCard) : {},\n });\n };\n\n return {\n ContainerProps: {\n className: 'ms-buybox__add-to-wishlist-container'\n },\n button: product && (\n \n ),\n errorBlock: (\n \n )\n };\n}\n\nexport interface IBuyboxProductQuantityViewProps {\n ContainerProps: INodeProps;\n LabelContainerProps: INodeProps;\n\n heading: React.ReactNode;\n errors?: React.ReactNode;\n\n input: React.ReactNode;\n}\nexport function getBuyboxProductQuantity(props: IBuyboxProps, state: IBuyboxState, callbacks: IBuyboxCallbacks): IBuyboxProductQuantityViewProps {\n const {\n resources,\n } = props;\n\n const\n {\n quantity,\n max,\n errorState: {\n quantityError,\n }\n } = state;\n\n const onChange = (newValue: number) => {\n if (callbacks.updateQuantity) {\n callbacks.updateQuantity(newValue);\n }\n };\n\n return {\n ContainerProps: {\n className: 'ms-buybox__quantity'\n },\n LabelContainerProps: {\n tag: 'label',\n className: 'ms-buybox__product-quantity-label',\n htmlFor: 'ms-buybox__product-quantity-input'\n },\n heading: (\n
{resources.productQuantityHeading}
\n ),\n errors: quantityError && (\n \n \n ),\n input: (\n \n )\n };\n}\n\nexport interface IBuyboxShopSimilarLookViewProps {\n ContainerProps: INodeProps;\n errors?: React.ReactNode;\n input: React.ReactNode;\n}\n\nexport function getBuyboxShopSimilarLook(props: IBuyboxProps, state: IBuyboxState, callbacks: IBuyboxCallbacks): IBuyboxShopSimilarLookViewProps {\n const {\n resources,\n context,\n data: {\n product: { result: product }\n },\n } = props;\n\n const\n {\n errorState: { }\n } = state;\n\n const navigationUrl = () => {\n const searchURL = getUrlSync('search', context && context.actionContext);\n const separator = searchURL!.includes('?') ? '&' : '?';\n document.location.href = `${searchURL}${separator}productId=${product && product.RecordId}`;\n };\n const payLoad = getPayloadObject('click', telemetryContent, TelemetryConstant.ShopSimliarLooks);\n const attribute = getTelemetryAttributes(telemetryContent, payLoad);\n\n return {\n ContainerProps: {\n className: 'ms-buybox__shopsimilarlooks'\n },\n input: (\n \n {resources.shopSimilarLooksText}\n \n )\n };\n}\n\nexport interface IBuyboxKeyInPriceViewProps {\n ContainerProps: INodeProps;\n LabelContainerProps: INodeProps;\n heading: React.ReactNode;\n input: React.ReactNode;\n}\n\nexport function getBuyboxKeyInPrice(props: IBuyboxProps, state: IBuyboxState, callbacks: IBuyboxCallbacks): IBuyboxKeyInPriceViewProps {\n const {\n config,\n resources\n } = props;\n\n const\n {\n errorState: { }\n } = state;\n\n const onChange = (e: React.ChangeEvent) => {\n const value = e.currentTarget.value;\n callbacks.updateKeyInPrice(value.length ? Number(value) : parseFloat(value));\n };\n\n return {\n ContainerProps: {\n className: 'ms-buybox__key_in_price'\n },\n LabelContainerProps: {\n tag: 'label',\n className: 'ms-buybox__key_in_price-label',\n htmlFor: 'ms-buybox__key_in_price'\n },\n heading: (\n
{resources.buyboxKeyInPriceLabelHeading}
\n ),\n input: (\n \n )\n };\n\n}\n\nexport interface IBuyboxErrorBlockProps {\n configureErrors: { [configureId: string]: string | undefined };\n quantityError?: string;\n customAmountError?: string;\n otherError?: string;\n resources: IBuyboxResources;\n showError: boolean;\n}\nexport const BuyboxErrorBlock: React.FC = ({ showError, configureErrors, quantityError, customAmountError, otherError, resources }) => {\n let errorMessages: (string | undefined)[] = [];\n\n errorMessages = Object.values(configureErrors).filter(message => message !== undefined);\n\n if (quantityError) {\n errorMessages.push(quantityError);\n }\n\n if (customAmountError) {\n errorMessages.push(customAmountError);\n }\n\n if (otherError) {\n errorMessages.push(otherError);\n }\n\n return (\n 0} color='danger' assertive={true} aria-label={resources.buyboxErrorMessageHeader} >\n \n {errorMessages.map((message, index) => {\n return (\n
{message}
\n );\n })}\n
\n );\n};\n\nexport function getQuantityLimitsMessages(props: IBuyboxProps, state: IBuyboxState): React.ReactElement | undefined {\n const {\n resources\n } = props;\n\n const\n {\n min,\n max,\n } = state;\n\n if (!_isOrderQuantityLimitsFeatureEnabled(props)) {\n return undefined;\n }\n\n return (\n \n {_renderMaxLabel(max, resources.maxQuantityText)}\n {_renderMinLabel(min, resources.minQuantityText)}\n \n );\n}\n\nexport const RetailDefaultOrderQuantityLimitsFeatureName: string = 'Dynamics.AX.Application.RetailDefaultOrderQuantityLimitsFeature';\n\nconst _renderMaxLabel = (max: number | undefined, maxQuantityText: string): React.ReactElement | undefined => {\n if(max && max !== 0 && max !== Number.MAX_VALUE) {\n return(\n

\n {maxQuantityText.replace('{max}', max.toString())}\n

\n );\n } else {\n return undefined;\n }\n};\n\nconst _renderMinLabel = (min: number | undefined, minQuantityText: string): JSX.Element | undefined => {\n if(min && min > 1) {\n return(\n

\n {minQuantityText.replace('{min}', min.toString())}\n

\n );\n } else {\n return undefined;\n }\n};\n\nconst _isOrderQuantityLimitsFeatureEnabled = (props: IBuyboxProps): boolean | undefined => {\n const isFeatureEnabledInHq = props.data.featureState.result\n ?.find(featureState => featureState.Name === RetailDefaultOrderQuantityLimitsFeatureName)?.IsEnabled;\n if (!isFeatureEnabledInHq) {\n return false;\n }\n const defaultOrderQuantityLimitsFeatureConfig = props.context?.request?.app?.platform?.enableDefaultOrderQuantityLimits;\n if (defaultOrderQuantityLimitsFeatureConfig === 'none') {\n return false;\n }\n\n if (defaultOrderQuantityLimitsFeatureConfig === 'all') {\n return true;\n }\n\n const customerInfo = props.data.customerInformation.result;\n return customerInfo &&\n ((defaultOrderQuantityLimitsFeatureConfig === 'b2b' && customerInfo.IsB2b) ||\n (defaultOrderQuantityLimitsFeatureConfig === 'b2c' && !customerInfo.IsB2b));\n};\n","import * as React from 'react';\n\nimport { Heading, INodeProps, IPopupProps, Popup } from '@msdyn365-commerce-modules/utilities';\nimport { getUrlSync, IImageSettings } from '@msdyn365-commerce/core';\nimport { DeliveryOption, ProductDimension } from '@msdyn365-commerce/retail-proxy';\n\nimport { IAddToCartFailureResult, PriceComponent } from '@msdyn365-commerce/components';\nimport { IBuyboxCallbacks, IBuyboxData, IBuyboxProps, IBuyboxState } from '../../../index';\nimport { getConfigureErrors, getGenericError } from '../utilities/error-utilities';\nimport { BuyboxErrorBlock } from './index';\n\nexport interface IFindInStoreFailureResult {\n missingDimensions?: ProductDimension[];\n}\n\nexport interface IBuyboxFindInStoreViewProps {\n storeSelector?: React.ReactNode;\n heading?: React.ReactNode;\n description?: React.ReactNode;\n errors?: React.ReactNode;\n button?: React.ReactNode;\n productPickupOptionList?: React.ReactNode;\n\n modal?: React.ReactNode;\n\n ContainerProps: INodeProps;\n\n openFindInStoreDialog(): Promise;\n}\n\n// tslint:disable-next-line:max-func-body-length\nexport function getBuyboxFindInStore(props: IBuyboxProps, state: IBuyboxState, callbacks: IBuyboxCallbacks): IBuyboxFindInStoreViewProps | undefined {\n const {\n data,\n slots: {\n storeSelector\n },\n resources : {\n priceFree,\n originalPriceText,\n currentPriceText,\n findInStoreHeaderText,\n findInStoreDescriptionText,\n findInStoreLinkText,\n buyBoxGoToCartText,\n buyBoxContinueShoppingText,\n buyBoxSingleItemText,\n buyBoxMultiLineItemFormatText,\n buyBoxHeaderMessageText,\n descriptionTextToShowAllPickupOptions\n },\n context: {\n request: {\n channel: {\n PickupDeliveryModeCode\n } = { PickupDeliveryModeCode: undefined }\n }\n }\n } = props;\n\n const multiplePickupStoreSwitchName = 'Dynamics.AX.Application.RetailMultiplePickupDeliveryModeFeature';\n const product = data?.product?.result;\n const price = data?.productPrice?.result;\n const storeSelectorStateManager = data?.storeSelectorStateManager?.result;\n const cart = data?.cart?.result;\n const deliveryOptions = data?.deliveryOptions?.result;\n const retailMulitplePickupMFeatureState = data?.featureState?.result?.\n find(featureState => featureState.Name === multiplePickupStoreSwitchName)?.IsEnabled;\n\n const\n {\n errorState: {\n configureErrors,\n quantityError,\n otherError,\n errorHost\n },\n modalOpen,\n quantity\n } = state;\n\n const onClick = () => findInStoreOnClick(props, state, callbacks);\n\n if (!product || !storeSelectorStateManager || storeSelector.length === 0) {\n return undefined;\n }\n\n // If no delivery options present on the product, or none of the delivery options\n // match the PickupDeliveryModeCode, that means the item cannot be used for BOPIS\n if (!deliveryOptions ||\n !deliveryOptions.DeliveryOptions ||\n !PickupDeliveryModeCode ||\n !deliveryOptions.DeliveryOptions.find(option => option.Code === PickupDeliveryModeCode)) {\n return undefined;\n }\n\n const dialogStrings = {\n goToCartText: buyBoxGoToCartText,\n continueShoppingText: buyBoxContinueShoppingText,\n headerItemOneText: buyBoxSingleItemText,\n headerItemFormatText: buyBoxMultiLineItemFormatText,\n headerMessageText: buyBoxHeaderMessageText,\n freePriceText: priceFree,\n originalPriceText: originalPriceText,\n currentPriceText: currentPriceText\n };\n\n const priceComponent = price ? (\n ) : '';\n\n const defaultImageSettings: IImageSettings = {\n viewports: {\n xs: { q: `w=240&h=240&m=6`, w: 0, h: 0 },\n lg: { q: `w=240&h=240&m=6`, w: 0, h: 0 },\n xl: { q: `w=240&h=240&m=6`, w: 0, h: 0 }\n },\n lazyload: true\n };\n\n const popupProps: IPopupProps = {\n context: props.context,\n className: 'ms-buybox',\n id: props.id,\n typeName: props.typeName,\n data: {product: props.data.product?.result, price: props.data.productPrice?.result},\n dialogStrings: dialogStrings,\n imageSettings: defaultImageSettings,\n gridSettings: props.context.request.gridSettings,\n productQuantity: quantity,\n priceComponent: priceComponent,\n navigationUrl: getUrlSync('cart', props.context.actionContext),\n modalOpen: modalOpen,\n setModalOpen: callbacks.changeModalOpen\n };\n const renderModalPopup = ;\n\n return {\n ContainerProps: {\n className: 'ms-buybox__find-in-store'\n },\n\n storeSelector: storeSelector[0],\n\n openFindInStoreDialog: onClick,\n\n heading: (\n \n ),\n\n description: (\n

\n {findInStoreDescriptionText}\n

\n ),\n productPickupOptionList: retailMulitplePickupMFeatureState ? (\n \n

\n {descriptionTextToShowAllPickupOptions}\n

\n
    \n {deliveryOptions.DeliveryOptions.map((item:DeliveryOption) => {\n return
  • {item.Description}
  • ;\n })\n }\n
\n
\n ): null,\n errors: (\n \n ),\n\n button: (\n \n {findInStoreLinkText}\n \n ),\n\n modal: renderModalPopup\n };\n}\n\n// tslint:disable-next-line: max-func-body-length\nasync function findInStoreOnClick(props: IBuyboxProps, state: IBuyboxState, callbacks: IBuyboxCallbacks): Promise {\n const {\n data: {\n storeSelectorStateManager: {result: storeSelectorStateManager },\n cart: {result: cart },\n productAvailableQuantity: { result: productAvailableQuantity}\n },\n resources,\n context,\n modules,\n } = props;\n\n const {\n selectedProduct,\n quantity\n } = state;\n\n let dataProduct = props.data.product.result;\n const multiplePickupStoreSwitchName = 'Dynamics.AX.Application.RetailMultiplePickupDeliveryModeFeature';\n const retailMulitplePickupMFeatureState = props.data?.featureState?.result?.\n find(featureState => featureState.Name === multiplePickupStoreSwitchName)?.IsEnabled;\n\n if (selectedProduct) {\n dataProduct = (await selectedProduct) || dataProduct;\n }\n\n if (!dataProduct || !storeSelectorStateManager) {\n return;\n }\n\n const product = dataProduct;\n\n const missingDimensions = product.Dimensions && product.Dimensions.filter(dimension => !(dimension.DimensionValue && dimension.DimensionValue.Value));\n\n let storeSelectorId: string = '';\n if (modules && Object.keys(modules).length > 0 && modules.storeSelector && modules.storeSelector.length > 0) {\n storeSelectorId = modules.storeSelector[0].id;\n }\n\n if (missingDimensions && missingDimensions.length > 0) {\n if (callbacks.updateErrorState) {\n callbacks.updateErrorState(\n {\n errorHost: 'FINDINSTORE',\n configureErrors: getConfigureErrors(missingDimensions, resources),\n }\n );\n }\n } else {\n storeSelectorStateManager.openDialog({\n product,\n id : storeSelectorId,\n deliveryOptions: retailMulitplePickupMFeatureState ? props.data.deliveryOptions.result: undefined,\n onLocationSelected: (orgUnitLocation, deliveryMode) => {\n if (!cart) {\n return Promise.resolve();\n }\n\n const behavior = props.context?.app?.config?.addToCartBehavior;\n\n return cart.addProductToCart({product: product, count: quantity, location: orgUnitLocation, deliveryMode: deliveryMode})\n .then(result => {\n if (result.status === 'FAILED' && result.substatus === 'MAXQUANTITY') {\n callbacks.changeModalOpen(false);\n\n const productAvailability = state.productAvailableQuantity ?\n state.productAvailableQuantity.ProductAvailableQuantity :\n productAvailableQuantity && productAvailableQuantity.length?\n productAvailableQuantity[0].ProductAvailableQuantity: undefined;\n\n const failureResult: IAddToCartFailureResult = {failureReason: 'CARTACTIONFAILED', cartActionResult: {status: result.status, substatus: result.substatus}};\n callbacks.updateErrorState({\n errorHost: 'ADDTOCART',\n configureErrors: {},\n otherError: getGenericError(failureResult, cart, resources, context, product, productAvailability, orgUnitLocation)\n });\n } else {\n if((behavior === undefined || behavior === 'goToCart')) {\n const navigationUrl = getUrlSync('cart', context.actionContext);\n\n if (result.status === 'SUCCESS' && navigationUrl) {\n window.location.assign(navigationUrl);\n }\n } else if (behavior === 'showModal') {\n callbacks.updateErrorState({\n configureErrors: {}\n });\n callbacks.changeModalOpen(true);\n }\n }\n }).catch((error: Error) => {\n if (props.telemetry) {\n props.telemetry.exception(error);\n props.telemetry.debug('Unable to add product to cart');\n }\n return;\n });\n }\n }).catch((error: Error) => {\n if (props.telemetry) {\n props.telemetry.error(error.message);\n props.telemetry.debug('Unable to find in store');\n }\n return;\n });\n }\n\n return;\n}","/**\n * Copyright (c) 2018 Microsoft Corporation\n */\nimport { getPayloadObject, getTelemetryAttributes, IPayLoad } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\nimport { IDropdownProps } from './';\nimport { IDropdownItemProps } from './dropdown.props';\n\ntype IDropdownState = {\n /**\n * @friendlyName selectedIndex\n * @description selected index\n */\n selectedIndex: string;\n};\n\n/**\n *\n * DropDown component\n * @extends {React.PureComponent}\n */\nexport class Dropdown extends React.PureComponent {\n private selectMenu: React.RefObject = React.createRef();\n private payLoad: IPayLoad;\n\n constructor(props: IDropdownProps, state: IDropdownState) {\n super(props);\n this.state = {\n selectedIndex: ''\n };\n this.payLoad = getPayloadObject('click', props.telemetryContent!, this.props.dropdownName);\n }\n\n public componentDidMount(): void {\n if (this.selectMenu.current) {\n this.selectMenu.current.selectedIndex = 0;\n }\n }\n\n public render(): JSX.Element {\n const {dropdownId, dropdownList, dropdownName, dropdownToggleName} = this.props;\n const attribute = getTelemetryAttributes(this.props.telemetryContent!, this.payLoad);\n return (\n \n \n {dropdownList.map(\n (item: IDropdownItemProps) => item && \n )}\n \n );\n }\n\n private _onChanged = async (event: React.ChangeEvent) => {\n this.setState({selectedIndex: event.target.value});\n\n if (this.props.onChange) {\n await this.props.onChange({\n dropdownId: this.props.dropdownId,\n selectId: event.target.value,\n selectedValue: event.target.innerText\n });\n }\n };\n}","import * as React from 'react';\n\nimport { getTelemetryObject, INodeProps, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\nimport { ProductDimensionFull } from '@msdyn365-commerce/commerce-entities';\nimport { IActionContext } from '@msdyn365-commerce/core';\nimport { SimpleProduct } from '@msdyn365-commerce/retail-proxy';\n\nimport { IBuyboxCallbacks, IBuyboxData, IBuyboxProps, IBuyboxResources, IBuyboxState } from '../../../index';\nimport { Dropdown, IDropdownItemProps, IDropdownOnSelectionChangeNotification } from './dropdown';\n\nexport interface IBuyboxProductConfigureProps {\n product: SimpleProduct;\n productDimensions: ProductDimensionFull[];\n resources: IBuyboxResources;\n channelId: number;\n actionContext: IActionContext;\n errors: { [configureId: string]: string | undefined };\n\n dimensionChanged?(newValue: number): void;\n}\n\nexport interface IBuyboxProductConfigureDropdownViewProps {\n ContainerProps: INodeProps;\n LabelContainerProps: INodeProps;\n\n heading: React.ReactNode;\n errors?: React.ReactNode;\n\n select: React.ReactNode;\n}\n\nexport interface IBuyboxProductConfigureViewProps {\n ContainerProps: INodeProps;\n\n dropdowns: IBuyboxProductConfigureDropdownViewProps[];\n}\n\nlet telemetryContent: ITelemetryContent;\n\nexport function getBuyboxProductConfigure(props: IBuyboxProps, state: IBuyboxState, callbacks: IBuyboxCallbacks): IBuyboxProductConfigureViewProps | undefined {\n const {\n data: {\n product: {result: product },\n productDimensions: {result: productDimensions },\n },\n resources\n } = props;\n\n const\n {\n errorState: {\n configureErrors,\n }\n } = state;\n\n const\n {\n getDropdownName\n } = callbacks;\n\n if (!product || !productDimensions) {\n return undefined;\n }\n\n const onChanged = async (notification: IDropdownOnSelectionChangeNotification) =>\n _onChanged(notification, callbacks.dimensionSelectedAsync);\n\n telemetryContent = getTelemetryObject(props.context.request.telemetryPageName!, props.friendlyName, props.telemetry);\n const dropdowns = productDimensions.map(productDimensionFull => _mapProductDimensionFullToDropdownViewProps(productDimensionFull, resources, configureErrors, getDropdownName, onChanged));\n\n if (!dropdowns || dropdowns.length === 0) {\n return undefined;\n }\n\n return {\n ContainerProps: {\n className: 'ms-buybox__configure'\n },\n dropdowns: dropdowns\n };\n}\n\nconst _onChanged = async (\n notification: IDropdownOnSelectionChangeNotification,\n dimensionChanged: (newValue: number, selectedDimensionValue: string) => Promise,\n ): Promise => {\n await dimensionChanged(+notification.dropdownId, notification.selectId);\n};\n\nconst _mapProductDimensionFullToDropdownViewProps =\n (\n productDimensionFull: ProductDimensionFull,\n resources: IBuyboxResources,\n configureErrors: {[configureId: string]: string | undefined},\n getDropdownName: (dimensionType: number, resources: IBuyboxResources) => string,\n dropdownCallback: (notification: IDropdownOnSelectionChangeNotification) => Promise\n ): IBuyboxProductConfigureDropdownViewProps => {\n const dropdownName = getDropdownName(productDimensionFull.DimensionTypeValue, resources);\n const dropdownId = productDimensionFull.DimensionTypeValue.toString();\n const dropdownToggleName = resources.selectDimensionFormatString.replace('{0}', dropdownName.toLocaleLowerCase());\n const dropdownList: IDropdownItemProps[] = productDimensionFull.DimensionValues\n ? productDimensionFull.DimensionValues.map(dimensionValue => {\n return {\n value: dimensionValue.Value || '',\n id: dimensionValue.RecordId.toString()\n };\n })\n : [];\n const errorMessage = configureErrors[dropdownId];\n\n return {\n ContainerProps: {\n className: 'ms-buybox__dropdown'\n },\n LabelContainerProps: {\n tag: 'label',\n className: 'ms-buybox__dropdown-quantity-label',\n htmlFor: `ms-buybox__dropown-quantity-input-${dropdownId}`\n },\n errors: errorMessage && (\n \n \n ),\n heading: (\n
{dropdownName}
\n ),\n select: (\n \n )\n };\n};","import {\n getDeliveryOptionsForSelectedVariant,\n GetDeliveryOptionsForSelectedVariantInput,\n getDimensionsForSelectedVariant,\n GetDimensionsForSelectedVariantInput,\n getPriceForSelectedVariant,\n getProductAvailabilitiesForSelectedVariant,\n getSelectedVariant,\n IProductInventoryInformation,\n PriceForSelectedVariantInput,\n ProductAvailabilitiesForSelectedVariantInput,\n SelectedVariantInput\n} from '@msdyn365-commerce-modules/retail-actions';\n// tslint:disable-next-line:no-duplicate-imports\nimport {\n FinitePromiseQueue, FinitePromiseQueueError, IPromiseQueue\n} from '@msdyn365-commerce-modules/retail-actions';\n\nimport {\n getTelemetryObject, IModuleProps, INodeProps, ITelemetryContent\n} from '@msdyn365-commerce-modules/utilities';\nimport { ProductDimensionFull } from '@msdyn365-commerce/commerce-entities';\nimport {\n ProductDeliveryOptions, ProductDimensionValue, ProductPrice, SimpleProduct\n} from '@msdyn365-commerce/retail-proxy';\nimport { ReleasedProductType } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\nimport classnames from 'classnames';\nimport * as React from 'react';\nimport { IBuyboxData, IBuyboxProps } from '../..';\nimport { IBuyboxResources } from './buybox.props.autogenerated';\nimport {\n getBuyboxAddToCart,\n getBuyboxFindInStore,\n getBuyBoxInventoryLabel,\n getBuyboxKeyInPrice,\n getBuyboxProductAddToOrderTemplate,\n getBuyboxProductAddToWishlist,\n getBuyboxProductConfigure,\n getBuyboxProductDescription,\n getBuyboxProductPrice,\n getBuyboxProductQuantity,\n getBuyboxProductRating,\n getBuyboxProductTitle,\n getBuyboxShopSimilarLook,\n getQuantityLimitsMessages,\n IBuyboxAddToCartViewProps,\n IBuyboxAddToOrderTemplateViewProps,\n IBuyboxAddToWishlistViewProps,\n IBuyboxFindInStoreViewProps,\n IBuyboxKeyInPriceViewProps,\n IBuyboxProductConfigureViewProps,\n IBuyboxProductQuantityViewProps,\n IBuyboxShopSimilarLookViewProps,\n RetailDefaultOrderQuantityLimitsFeatureName\n} from './components';\n\nexport declare type IBuyboxErrorHost = 'ADDTOCART' | 'FINDINSTORE' | 'WISHLIST' | 'SHOPSIMILARITEM' | 'ORDER_TEMPLATE';\n\nexport interface IErrorState {\n errorHost?: IBuyboxErrorHost;\n\n configureErrors: { [configureId: string]: string | undefined };\n quantityError?: string;\n customAmountError?: string;\n otherError?: string;\n}\n\nexport interface IBuyboxCallbacks {\n updateQuantity(newQuantity: number): boolean;\n updateKeyInPrice(keyInPrice: number): void;\n updateErrorState(newErrorState: IErrorState): void;\n updateSelectedProduct(\n selectedProduct: Promise,\n newInventory: IProductInventoryInformation | undefined,\n newPrice: ProductPrice | undefined,\n newDeliveryOptions: ProductDeliveryOptions | undefined): void;\n getDropdownName(dimensionType: number, resources: IBuyboxResources): string;\n dimensionSelectedAsync(selectedDimensionId: number, selectedDimensionValueId: string): Promise;\n changeModalOpen(isModalOpen: boolean): void;\n changeUpdatingDimension(isUpdatingDimension: boolean): void;\n changeUpdatingDeliveryOptions?(isUpdatingDeliveryOptions: boolean): void;\n}\n\nexport interface IBuyboxState {\n quantity: number;\n min: number | undefined;\n max: number | undefined;\n errorState: IErrorState;\n selectedProduct?: Promise;\n productAvailableQuantity?: IProductInventoryInformation;\n productPrice?: ProductPrice;\n productDeliveryOptions?: ProductDeliveryOptions;\n modalOpen?: boolean;\n isUpdatingDimension?: boolean;\n isUpdatingDeliveryOptions?: boolean;\n isServiceItem?: boolean;\n isPriceKeyedIn?: boolean;\n keyInPriceAmount?: number;\n isCustomPriceSelected?: boolean;\n}\n\nexport interface IBuyboxViewProps extends IBuyboxProps {\n state: IBuyboxState;\n\n ModuleProps: IModuleProps;\n ProductInfoContainerProps: INodeProps;\n MediaGalleryContainerProps: INodeProps;\n\n callbacks: IBuyboxCallbacks;\n\n mediaGallery?: React.ReactNode;\n\n title?: React.ReactNode;\n description?: React.ReactNode;\n rating?: React.ReactNode;\n price?: React.ReactNode;\n addToOrderTemplate?: IBuyboxAddToOrderTemplateViewProps;\n addToWishlist?: IBuyboxAddToWishlistViewProps;\n max: number | undefined;\n\n addToCart: IBuyboxAddToCartViewProps;\n findInStore?: IBuyboxFindInStoreViewProps;\n quantity?: IBuyboxProductQuantityViewProps;\n configure?: IBuyboxProductConfigureViewProps;\n inventoryLabel?: React.ReactNode;\n shopSimilarLook?: IBuyboxShopSimilarLookViewProps;\n quantityLimitsMessages: React.ReactNode;\n telemetryContent?: ITelemetryContent;\n keyInPrice?: IBuyboxKeyInPriceViewProps;\n}\n\n/**\n * Buybox Module\n */\nclass Buybox extends React.PureComponent, IBuyboxState> {\n /**\n * A queue of tasks of processing the changes in the dimensions.\n * Limit to two processes:\n * 1 - for the current process, which is under execution at the moment.\n * 2 - next process, which will process the latest version of data.\n * @remark Enqueueing new promises will discard the previous ones (except the one which is under processing).\n */\n private dimensionUpdateQueue: IPromiseQueue = new FinitePromiseQueue(2);\n private dimensions: { [id: number]: string } = {};\n\n private buyboxCallbacks: IBuyboxCallbacks = {\n updateQuantity: (newQuantity: number): boolean => {\n const errorState = {...this.state.errorState};\n errorState.quantityError = undefined;\n errorState.otherError = undefined;\n\n this.setState({quantity: newQuantity, errorState: errorState});\n return true;\n },\n updateErrorState: (newErrorState: IErrorState): void => {\n this.setState({errorState: newErrorState});\n },\n updateSelectedProduct: (\n newSelectedProduct: Promise,\n newInventory: IProductInventoryInformation | undefined,\n newPrice: ProductPrice | undefined,\n newDeliveryOptions: ProductDeliveryOptions | undefined\n ): void => {\n this.setState({\n selectedProduct: newSelectedProduct,\n productAvailableQuantity: newInventory,\n productDeliveryOptions: newDeliveryOptions});\n this._updatePrice(newPrice);\n },\n dimensionSelectedAsync: (selectedDimensionId: number, selectedDimensionValueId: string): Promise => {\n this.dimensions[selectedDimensionId] = selectedDimensionValueId;\n return this.dimensionUpdateQueue.enqueue(() => {\n return this._updateDimensions();\n }).catch((reason: any) => { // tslint:disable-line:no-any\n // Ignore discarded processes.\n if (reason !== FinitePromiseQueueError.ProcessWasDiscardedFromTheQueue) {\n throw reason;\n }\n });\n },\n getDropdownName: (dimensionType: number, resources: IBuyboxResources): string => {\n return this._getDropdownName(dimensionType, resources);\n },\n changeModalOpen: (isModalOpen: boolean): void => {\n this.setState({modalOpen: isModalOpen});\n },\n changeUpdatingDimension: (isUpdatingDimension: boolean): void => {\n this.setState({isUpdatingDimension: isUpdatingDimension});\n },\n /**\n * Update isUpdatingDeliveryOptions state.\n *\n * @param isUpdatingDeliveryOptions - The status of updating delivery options.\n */\n changeUpdatingDeliveryOptions: (isUpdatingDeliveryOptions: boolean): void => {\n this.setState({ isUpdatingDeliveryOptions });\n },\n updateKeyInPrice: (customPrice: number): void => {\n // Remove custom amount error when updating the custom price\n const errorState = {...this.state.errorState};\n errorState.customAmountError = undefined;\n\n this.setState({isPriceKeyedIn: true, keyInPriceAmount: customPrice, errorState: errorState});\n this._updatePrice(this.state.productPrice, customPrice);\n }\n };\n\n private telemetryContent: ITelemetryContent;\n\n constructor(props: IBuyboxProps, state: IBuyboxState) {\n super(props);\n this.state = {\n errorState: {\n configureErrors: {}\n },\n quantity: 1,\n min: undefined,\n max: undefined,\n selectedProduct: undefined,\n productPrice: undefined,\n productDeliveryOptions: undefined,\n\n modalOpen: false,\n isUpdatingDimension: false,\n isUpdatingDeliveryOptions: false\n };\n this.telemetryContent = getTelemetryObject(props.context.request.telemetryPageName!, props.friendlyName, props.telemetry);\n }\n\n public async componentDidMount(): Promise {\n const {\n data: {\n product: { result: product },\n productPrice\n },\n } = this.props;\n\n productPrice.then(async (result) => {\n this._updatePrice(result);\n });\n\n if(product) {\n // check if the product is service or not by product type\n const PRODUCTASSERVICE = 2 as ReleasedProductType.Service;\n\n if (product.ItemTypeValue === PRODUCTASSERVICE) {\n this.setState({isServiceItem: true});\n }\n await this._updateQuantitiesInState(product);\n }\n }\n\n public render(): JSX.Element | null {\n const {\n slots: {\n mediaGallery,\n },\n data: {\n product: { result: product }\n },\n config: { className = '' }\n } = this.props;\n\n const\n {\n max\n } = this.state;\n\n if (!product) {\n this.props.context.telemetry.error('Product content is empty, module wont render');\n return null;\n }\n\n const defaultMinimumKeyInPrice = 10;\n const defaultMaximumKeyInPrice = 100;\n\n const viewProps: IBuyboxViewProps = {\n ...(this.props as IBuyboxProps),\n state: this.state,\n mediaGallery: mediaGallery && mediaGallery.length > 0 ? mediaGallery[0] : undefined,\n ModuleProps: {\n moduleProps: this.props,\n className: classnames('ms-buybox', className)\n },\n ProductInfoContainerProps: {\n className: 'ms-buybox__content'\n },\n MediaGalleryContainerProps: {\n className: 'ms-buybox__media-gallery'\n },\n telemetryContent: this.telemetryContent,\n callbacks: this.buyboxCallbacks,\n title: getBuyboxProductTitle(this.props),\n description: getBuyboxProductDescription(this.props),\n configure: getBuyboxProductConfigure(this.props, this.state, this.buyboxCallbacks),\n findInStore: getBuyboxFindInStore(this.props, this.state, this.buyboxCallbacks),\n price: getBuyboxProductPrice(this.props, this.state),\n addToCart: getBuyboxAddToCart(this.props, this.state, this.buyboxCallbacks, defaultMinimumKeyInPrice, defaultMaximumKeyInPrice),\n addToOrderTemplate: getBuyboxProductAddToOrderTemplate(this.props, this.state, this.buyboxCallbacks),\n addToWishlist: getBuyboxProductAddToWishlist(this.props, this.state, this.buyboxCallbacks),\n rating: !this.props.context.app.config.hideRating && getBuyboxProductRating(this.props),\n quantity: product.IsGiftCard ? undefined : getBuyboxProductQuantity(this.props, this.state, this.buyboxCallbacks),\n inventoryLabel: getBuyBoxInventoryLabel(this.props),\n shopSimilarLook: this.props.config.enableShopSimilarLooks && !product.IsGiftCard ? getBuyboxShopSimilarLook(this.props, this.state, this.buyboxCallbacks) : undefined,\n keyInPrice: this.props.config.enableKeyInPrice && this.state.isCustomPriceSelected?getBuyboxKeyInPrice(this.props, this.state, this.buyboxCallbacks):undefined,\n quantityLimitsMessages: getQuantityLimitsMessages(this.props, this.state),\n max: max\n };\n\n return this.props.renderView(viewProps) as React.ReactElement;\n }\n\n private _updatePrice(\n newPrice: ProductPrice | undefined,\n customPrice: number | undefined = this.state.keyInPriceAmount): void {\n\n if (this.state.isCustomPriceSelected && newPrice) {\n newPrice.CustomerContextualPrice = customPrice;\n }\n this.setState({productPrice: newPrice});\n }\n\n // tslint:disable-next-line:max-func-body-length\n private _updateDimensions = async (): Promise => {\n const {\n data: {\n product: {result: product },\n productDimensions: {result: productDimensions },\n },\n context: {\n actionContext,\n request: {\n apiSettings: {\n channelId\n }\n }\n }\n } = this.props;\n\n if (!product || !productDimensions) {\n return;\n }\n\n const dimensionsToUpdate: { [id: number]: string } = {...this.dimensions};\n this.setState({isUpdatingDimension: true, isUpdatingDeliveryOptions: true });\n\n // Step 1: Update state to indicate which dimensions are selected\n if (this.state.errorState.otherError) {\n const clearOtherErrorState = {...this.state.errorState};\n clearOtherErrorState.otherError = undefined;\n this.setState({errorState: clearOtherErrorState});\n }\n\n // Step 2: Clear any errors indicating the dimension wasn't selected\n for (const key of Object.keys(dimensionsToUpdate)) {\n if (this.state.errorState.configureErrors[key]) {\n const errorState = {...this.state.errorState};\n errorState.configureErrors[key] = undefined;\n\n this.setState({errorState: errorState});\n }\n }\n\n // Step 3, Build the actually selected dimensions, prioritizing the information in state\n // over the information in data\n const mappedDimensions = productDimensions.map(dimension => {\n return {\n DimensionTypeValue: dimension.DimensionTypeValue,\n DimensionValue: this._updateDimensionValue(dimension, dimensionsToUpdate[dimension.DimensionTypeValue]) || dimension.DimensionValue,\n ExtensionProperties: dimension.ExtensionProperties\n };\n }).filter(dimension => {\n return dimension && dimension.DimensionValue;\n });\n // Step 4. Use these dimensions hydrate the product. Wrap this in a promise\n // so that places like add to cart can await it\n const selectedProduct = new Promise(async (resolve, reject) => {\n const newProduct = (await getSelectedVariant(\n new SelectedVariantInput(\n product.MasterProductId ? product.MasterProductId : product.RecordId,\n channelId,\n mappedDimensions\n ),\n actionContext\n ));\n if (newProduct) {\n await getDimensionsForSelectedVariant(\n new GetDimensionsForSelectedVariantInput(\n newProduct.MasterProductId ? newProduct.MasterProductId : newProduct.RecordId,\n channelId,\n mappedDimensions\n ),\n actionContext\n );\n }\n\n resolve(newProduct);\n });\n this.setState({selectedProduct: selectedProduct});\n const variantProduct = await selectedProduct;\n\n if(variantProduct) {\n // Step 5. Use these dimensions hydrate the inventory. Wrap this in a promise\n // so that places like add to cart can await it\n const newAvailableQuantity = await getProductAvailabilitiesForSelectedVariant(\n new ProductAvailabilitiesForSelectedVariantInput(\n variantProduct.RecordId,\n channelId\n ),\n actionContext\n );\n\n const isCustompriceSelected = variantProduct && variantProduct.Dimensions && variantProduct.Dimensions.find(dimension => dimension.DimensionTypeValue === 4 && dimension.DimensionValue && dimension.DimensionValue.Value === 'Custom');\n if (isCustompriceSelected) {\n this.setState({isCustomPriceSelected: true});\n } else {\n // Remove custom amount error when unselect the custom amount\n const errorState = {...this.state.errorState};\n errorState.customAmountError = undefined;\n\n this.setState({isCustomPriceSelected: false, isPriceKeyedIn: false, errorState: errorState});\n }\n\n if(newAvailableQuantity && newAvailableQuantity.length) {\n this.setState({productAvailableQuantity: newAvailableQuantity[0]});\n } else {\n this.setState({productAvailableQuantity: undefined});\n }\n\n // Step 6. Use these dimensions hydrate the product price.\n const newPrice = await getPriceForSelectedVariant(\n new PriceForSelectedVariantInput(\n variantProduct.RecordId,\n channelId\n ),\n actionContext\n );\n\n if (newPrice) {\n this._updatePrice(newPrice);\n }\n\n const RetailMulitplePickupMFeatureState = this.props.data.featureState.result?.find(featureState => featureState.Name === 'Dynamics.AX.Application.RetailMultiplePickupDeliveryModeFeature');\n // Step 7. Use these dimensions hydrate the product delivery options.\n const newDeliveryOptions = await getDeliveryOptionsForSelectedVariant(\n new GetDeliveryOptionsForSelectedVariantInput(\n variantProduct.RecordId,\n channelId,\n undefined,\n undefined,\n RetailMulitplePickupMFeatureState?.IsEnabled\n ),\n actionContext\n );\n\n if(newDeliveryOptions) {\n this.setState({productDeliveryOptions: newDeliveryOptions});\n }\n\n await this._updateQuantitiesInState(variantProduct);\n }\n }\n\n private async _updateQuantitiesInState(product: SimpleProduct): Promise {\n const isOrderQuantityLimitsFeatureEnabled = await this._isOrderQuantityLimitsFeatureEnabled();\n if (isOrderQuantityLimitsFeatureEnabled && product) {\n this.setState({\n quantity: product.Behavior?.DefaultQuantity || 1,\n min: product.Behavior?.MinimumQuantity || 1,\n max: (product.Behavior?.MaximumQuantity && product.Behavior?.MaximumQuantity > 0)\n ? product.Behavior?.MaximumQuantity\n : Number.MAX_VALUE,\n });\n } else {\n this.setState({\n min: 1,\n max: this.props.context.app.config.maxQuantityForCartLineItem || 10,\n });\n }\n }\n\n private _updateDimensionValue = (productDimensionFull: ProductDimensionFull, newValueId: string | undefined): ProductDimensionValue | undefined => {\n if (newValueId && productDimensionFull.DimensionValues) {\n return productDimensionFull.DimensionValues.find(dimension => dimension.RecordId === +newValueId);\n }\n\n return undefined;\n };\n\n private _getDropdownName = (dimensionType: number, resources: IBuyboxResources): string => {\n const isGiftCard = this.props.data.product.result?.IsGiftCard;\n\n switch (dimensionType) {\n case 1: // ProductDimensionType.Color\n return resources.productDimensionTypeColor;\n case 2: // ProductDimensionType.Configuration\n return resources.productDimensionTypeConfiguration;\n case 3: // ProductDimensionType.Size\n return resources.productDimensionTypeSize;\n case 4: // ProductDimensionType.Style\n return isGiftCard ? resources.productDimensionTypeAmount : resources.productDimensionTypeStyle;\n default:\n return '';\n }\n };\n\n private async _isOrderQuantityLimitsFeatureEnabled(): Promise {\n const defaultOrderQuantityLimitsFeatureConfig = this.props.context?.request?.app?.platform?.enableDefaultOrderQuantityLimits;\n if (defaultOrderQuantityLimitsFeatureConfig === 'none') {\n return false;\n }\n\n const featureStatuses = await this.props.data.featureState;\n const isFeatureEnabledInHq = featureStatuses?.find(featureState => featureState.Name === RetailDefaultOrderQuantityLimitsFeatureName)?.IsEnabled;\n if (!isFeatureEnabledInHq) {\n return false;\n }\n\n if (defaultOrderQuantityLimitsFeatureConfig === 'all') {\n return true;\n }\n let customerInfo;\n try {\n customerInfo = await this.props.data.customerInformation;\n } catch(error) {\n this.props.telemetry.information(error);\n this.props.telemetry.debug('Unable to receive Customer Information. May be user is not authorized');\n return false;\n }\n\n return customerInfo &&\n ((defaultOrderQuantityLimitsFeatureConfig === 'b2b' && customerInfo.IsB2b) ||\n (defaultOrderQuantityLimitsFeatureConfig === 'b2c' && !customerInfo.IsB2b));\n }\n}\n\nexport default Buybox;\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\n\r\n\r\nimport { INodeProps, Module, Node } from '@msdyn365-commerce-modules/utilities';\r\nimport * as React from 'react';\r\nimport { ISearchCategoryViewProps, ISearchFormViewProps, ISearchKeywordViewProps, ISearchProductViewProps } from '../../../modules/smwe-search/./components';\r\nimport { ISearchViewProps } from '../../../modules/smwe-search/./smwe-search';\r\n\r\nconst SearchView: React.FC = props => {\r\n const {\r\n Search,\r\n AutoSuggestAriaLabel,\r\n AutoSuggestAriaLabelText,\r\n searchText,\r\n AutoSuggest,\r\n KeywordSuggest,\r\n ProductSuggest,\r\n CategorySuggest,\r\n UlKeyword,\r\n UlProduct,\r\n UlCategory,\r\n form,\r\n autosuggestCategory,\r\n autosuggestKeyword,\r\n autosuggestProduct,\r\n SearchForm,\r\n FormWrapper,\r\n label\r\n } = props;\r\n\r\n return (\r\n \r\n {label}\r\n {_renderForm(form as ISearchFormViewProps, SearchForm, FormWrapper)}\r\n \r\n {searchText && searchText.length > 0 ?\r\n {AutoSuggestAriaLabelText} : ''\r\n }\r\n {_renderKeywordSuggestions(KeywordSuggest, UlKeyword, autosuggestKeyword)}\r\n {_renderProductSuggestions(ProductSuggest, UlProduct, autosuggestProduct)}\r\n {_renderCategorySuggestions(CategorySuggest, UlCategory, autosuggestCategory)}\r\n \r\n \r\n );\r\n};\r\n\r\nconst _renderForm = (form: ISearchFormViewProps, SearchForm: INodeProps, FormWrapper: INodeProps) => {\r\n return (\r\n \r\n \r\n {form.submitBtn}\r\n {form.label}\r\n {form.input}\r\n {form.cancelBtn}\r\n \r\n \r\n );\r\n};\r\n\r\nconst _renderKeywordSuggestions = (\r\n KeywordSuggest: INodeProps,\r\n UlKeyword: INodeProps,\r\n keywordSuggestions?: ISearchKeywordViewProps\r\n) => {\r\n return (\r\n keywordSuggestions && (\r\n \r\n \r\n {keywordSuggestions.text.map(text => {\r\n return text;\r\n })}\r\n \r\n \r\n )\r\n );\r\n};\r\n\r\nconst _renderProductSuggestions = (\r\n ProductSuggest: INodeProps,\r\n UlProduct: INodeProps,\r\n productSuggestions?: ISearchProductViewProps\r\n) => {\r\n return (\r\n productSuggestions && (\r\n \r\n \r\n {productSuggestions.title}\r\n {productSuggestions.items.map((item, index) => {\r\n return (\r\n \r\n \r\n {item.thumbnail}\r\n {item.text}\r\n {item.price !== 0 && (
{item.price}
)}\r\n
\r\n
\r\n );\r\n })}\r\n
\r\n
\r\n )\r\n );\r\n};\r\n\r\nconst _renderCategorySuggestions = (\r\n CategorySuggest: INodeProps,\r\n UlCategory: INodeProps,\r\n categorySuggestions?: ISearchCategoryViewProps\r\n) => {\r\n return (\r\n categorySuggestions && (\r\n \r\n \r\n {categorySuggestions.title}\r\n {categorySuggestions.text.map(text => {\r\n return text;\r\n })}\r\n \r\n \r\n )\r\n );\r\n};\r\n\r\nexport default SearchView;","/*---------------------------------------------------------------------------------------------\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\n\r\n\r\nimport { INodeProps, Module, Node } from '@msdyn365-commerce-modules/utilities';\r\nimport * as React from 'react';\r\nimport { ISearchCategoryViewProps, ISearchFormViewProps, ISearchKeywordViewProps, ISearchProductViewProps } from '../../../modules/smwe-search/./components';\r\nimport { ISearchViewProps } from '../../../modules/smwe-search/./smwe-search';\r\n\r\nconst SearchView: React.FC = props => {\r\n const {\r\n Search,\r\n AutoSuggestAriaLabel,\r\n AutoSuggestAriaLabelText,\r\n searchText,\r\n AutoSuggest,\r\n KeywordSuggest,\r\n ProductSuggest,\r\n CategorySuggest,\r\n UlKeyword,\r\n UlProduct,\r\n UlCategory,\r\n form,\r\n autosuggestCategory,\r\n autosuggestKeyword,\r\n autosuggestProduct,\r\n SearchForm,\r\n FormWrapper,\r\n label\r\n } = props;\r\n\r\n return (\r\n \r\n {label}\r\n \r\n {_renderForm(form as ISearchFormViewProps, FormWrapper)}\r\n \r\n {searchText && searchText.length > 0 ?\r\n {AutoSuggestAriaLabelText} : ''\r\n }\r\n {_renderKeywordSuggestions(KeywordSuggest, UlKeyword, autosuggestKeyword)}\r\n {_renderProductSuggestions(ProductSuggest, UlProduct, autosuggestProduct)}\r\n {_renderCategorySuggestions(CategorySuggest, UlCategory, autosuggestCategory)}\r\n \r\n \r\n \r\n );\r\n};\r\n\r\nconst _renderForm = (form: ISearchFormViewProps, FormWrapper: INodeProps) => {\r\n return (\r\n \r\n {form.submitBtn}\r\n
\r\n
\r\n {form.label}\r\n {form.input}\r\n
\r\n {form.cancelBtn}\r\n \r\n );\r\n};\r\n\r\nconst _renderKeywordSuggestions = (\r\n KeywordSuggest: INodeProps,\r\n UlKeyword: INodeProps,\r\n keywordSuggestions?: ISearchKeywordViewProps\r\n) => {\r\n return (\r\n keywordSuggestions && (\r\n \r\n \r\n {keywordSuggestions.text.map(text => {\r\n return text;\r\n })}\r\n \r\n \r\n )\r\n );\r\n};\r\n\r\nconst _renderProductSuggestions = (\r\n ProductSuggest: INodeProps,\r\n UlProduct: INodeProps,\r\n productSuggestions?: ISearchProductViewProps\r\n) => {\r\n return (\r\n productSuggestions && (\r\n \r\n \r\n {productSuggestions.title}\r\n {productSuggestions.items.map((item, index) => {\r\n return (\r\n \r\n \r\n {item.thumbnail}\r\n {item.text}\r\n {item.price}\r\n \r\n \r\n );\r\n })}\r\n \r\n \r\n )\r\n );\r\n};\r\n\r\nconst _renderCategorySuggestions = (\r\n CategorySuggest: INodeProps,\r\n UlCategory: INodeProps,\r\n categorySuggestions?: ISearchCategoryViewProps\r\n) => {\r\n return (\r\n categorySuggestions && (\r\n \r\n \r\n {categorySuggestions.title}\r\n {categorySuggestions.text.map(text => {\r\n return text;\r\n })}\r\n \r\n \r\n )\r\n );\r\n};\r\n\r\nexport default SearchView;","/*---------------------------------------------------------------------------------------------\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\n\r\n\r\nimport { INodeProps, Module, Node } from '@msdyn365-commerce-modules/utilities';\r\nimport * as React from 'react';\r\nimport { ISearchCategoryViewProps, ISearchFormViewProps, ISearchKeywordViewProps, ISearchProductViewProps } from '../../../modules/smwe-search/./components';\r\nimport { ISearchViewProps } from '../../../modules/smwe-search/./smwe-search';\r\n\r\nconst SearchView: React.FC = props => {\r\n const {\r\n Search,\r\n AutoSuggestAriaLabel,\r\n AutoSuggestAriaLabelText,\r\n searchText,\r\n AutoSuggest,\r\n KeywordSuggest,\r\n ProductSuggest,\r\n CategorySuggest,\r\n UlKeyword,\r\n UlProduct,\r\n UlCategory,\r\n form,\r\n autosuggestCategory,\r\n autosuggestKeyword,\r\n autosuggestProduct,\r\n SearchForm,\r\n FormWrapper,\r\n label\r\n } = props;\r\n\r\n return (\r\n \r\n {label}\r\n {_renderForm(form as ISearchFormViewProps, SearchForm, FormWrapper)}\r\n \r\n {searchText && searchText.length > 0 ?\r\n {AutoSuggestAriaLabelText} : ''\r\n }\r\n {_renderKeywordSuggestions(KeywordSuggest, UlKeyword, autosuggestKeyword)}\r\n {_renderProductSuggestions(ProductSuggest, UlProduct, autosuggestProduct)}\r\n {_renderCategorySuggestions(CategorySuggest, UlCategory, autosuggestCategory)}\r\n \r\n \r\n );\r\n};\r\n\r\nconst _renderForm = (form: ISearchFormViewProps, SearchForm: INodeProps, FormWrapper: INodeProps) => {\r\n return (\r\n \r\n \r\n {form.submitBtn}\r\n {form.label}\r\n {form.input}\r\n {form.cancelBtn}\r\n \r\n \r\n );\r\n};\r\n\r\nconst _renderKeywordSuggestions = (\r\n KeywordSuggest: INodeProps,\r\n UlKeyword: INodeProps,\r\n keywordSuggestions?: ISearchKeywordViewProps\r\n) => {\r\n return (\r\n keywordSuggestions && (\r\n \r\n \r\n {keywordSuggestions.text.map(text => {\r\n return text;\r\n })}\r\n \r\n \r\n )\r\n );\r\n};\r\n\r\nconst _renderProductSuggestions = (\r\n ProductSuggest: INodeProps,\r\n UlProduct: INodeProps,\r\n productSuggestions?: ISearchProductViewProps\r\n) => {\r\n return (\r\n productSuggestions && (\r\n \r\n \r\n {productSuggestions.title}\r\n {productSuggestions.items.map((item, index) => {\r\n return (\r\n \r\n \r\n {item.thumbnail}\r\n {item.text}\r\n {item.price !== 0 && (
{item.price}
)}\r\n
\r\n
\r\n );\r\n })}\r\n
\r\n
\r\n )\r\n );\r\n};\r\n\r\nconst _renderCategorySuggestions = (\r\n CategorySuggest: INodeProps,\r\n UlCategory: INodeProps,\r\n categorySuggestions?: ISearchCategoryViewProps\r\n) => {\r\n return (\r\n categorySuggestions && (\r\n \r\n \r\n {categorySuggestions.title}\r\n {categorySuggestions.text.map(text => {\r\n return text;\r\n })}\r\n \r\n \r\n )\r\n );\r\n};\r\n\r\nexport default SearchView;","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\nimport { getCustomer, GetCustomerInput } from '@msdyn365-commerce-modules/retail-actions';\nimport { getTelemetryObject, IComponentNodeProps, IModuleProps, INodeProps, ISingleSlideCarouselProps, ITelemetryContent, NodeTag, SingleSlideCarousel } from '@msdyn365-commerce-modules/utilities';\nimport { ProductComponent } from '@msdyn365-commerce/components';\nimport * as Msdyn365 from '@msdyn365-commerce/core';\nimport { ProductPrice, ProductSearchResult, ProjectionDomain } from '@msdyn365-commerce/retail-proxy';\nimport {\n getActivePricesAsync\n} from '@msdyn365-commerce/retail-proxy/dist/DataActions/ProductsDataActions.g';\nimport { AffiliationLoyaltyTier, CustomerAffiliation } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\nimport classnames from 'classnames';\nimport * as React from 'react';\nimport { IProductCollectionProps, layout } from './product-collection.props.autogenerated';\nexport interface IProductCollectionViewProps extends IProductCollectionProps<{}> {\n heading?: React.ReactNode;\n ProductCollectionContainer: IModuleProps;\n SingleSlideCarouselComponentProps: INodeProps;\n GridComponentProps: INodeProps;\n products: IProductComponentViewProps[];\n isCarousel: boolean;\n productPrices?: ProductPrice[];\n}\n\nexport interface IProductComponentViewProps {\n ProductContainer: INodeProps;\n productComponent: React.ReactNode;\n}\nexport interface IProductComponentState {\n products: ProductSearchResult[];\n}\n/**\n * ProductCollection component\n */\nclass ProductCollection extends React.PureComponent,IProductComponentState> {\n private telemetryContent: ITelemetryContent;\n private productPrices: ProductPrice[];\n constructor(props: IProductCollectionProps<{}>) {\n super(props);\n this.productPrices=[];\n this.state = {\n products: this.props.config.productCollection && this.props.config.productCollection.products,\n };\n this.telemetryContent = getTelemetryObject(this.props.context.request.telemetryPageName!,\n this.props.friendlyName,\n this.props.telemetry);\n }\n public componentDidMount(): void {\n if (this.props.config.enableAffiliationBasedPricing &&\n this.props.context.actionContext.requestContext?.user?.isAuthenticated) {\n // tslint:disable-next-line:no-floating-promises\n this._getActivePrice();\n }\n }\n public render(): JSX.Element | null {\n const { heading, className } = this.props.config;\n const { resources } = this.props;\n const products = this.state.products;\n const isCarousel = this.props.config.layout === layout.carousel;\n const headingComponent = heading && (\n \n );\n\n const productCollectionViewProps = {\n ...this.props,\n heading: headingComponent,\n SingleSlideCarouselComponentProps: {\n tag: SingleSlideCarousel,\n className: '',\n flipperPrevLabel: resources.flipperPrevious,\n flipperNextLabel: resources.flipperNext,\n parentId: this.props.id,\n telemetryContent: this.telemetryContent\n } as IComponentNodeProps,\n ProductCollectionContainer: {\n moduleProps: this.props,\n className: classnames('ms-product-collection', className)\n },\n GridComponentProps: {\n tag: 'ul' as NodeTag,\n className: 'ms-product-collection__items',\n },\n isCarousel: isCarousel,\n products: products && products.length > 0 && products.map((item: ProductSearchResult, index: number) => this._getProduct(item, index)),\n productPrices: this.productPrices,\n };\n return this.props.renderView(productCollectionViewProps) as React.ReactElement;\n }\n public handleHeadingChange = (event: Msdyn365.ContentEditableEvent) => this.props.config.heading!.text = event.target.value;\n\n private _getProduct = (product:ProductSearchResult, index: number): IProductComponentViewProps | null => {\n if(!product || !product.Name) {\n this.props.telemetry.trace('[product-collection] Product or product name is null');\n return null;\n }\n const telemetryContent = getTelemetryObject(this.props.context.request.telemetryPageName!,\n this.props.friendlyName,\n this.props.telemetry);\n const { imageSettings, allowBackNavigation } = this.props.config;\n const resources = this.props.resources;\n const breaCrumbType = this.props.context.app.config.breadcrumbType;\n const allowBack = allowBackNavigation && (breaCrumbType === 'back' || breaCrumbType === 'categoryAndBack');\n return {\n ProductContainer: {\n tag: 'li' as NodeTag,\n className: 'ms-product-collection__item',\n role: 'listitem',\n key: index,\n },\n productComponent: (\n \n )\n };\n }\n private _getActivePrice = async (): Promise => {\n let products = (this.state.products) || [];\n const productRecIds = (products && products.length > 0) ? products.map(prod => prod.RecordId) : [];\n const projectDomain: ProjectionDomain = { ChannelId: this.props.context.request.apiSettings.channelId, CatalogId: this.props.context.request.apiSettings.catalogId };\n const affliations: AffiliationLoyaltyTier[] = [];\n const customerInput = new GetCustomerInput(this.props.context.actionContext.requestContext.apiSettings);\n const customer = await getCustomer(customerInput, this.props.context.actionContext);\n\n if (customer && customer.CustomerAffiliations) {\n customer.CustomerAffiliations.forEach((affliation: CustomerAffiliation) => {\n const aff: AffiliationLoyaltyTier = { AffiliationId: affliation.RetailAffiliationId, CustomerId: customer.AccountNumber };\n affliations.push(aff);\n });\n }\n\n await getActivePricesAsync(\n { callerContext: this.props.context.actionContext, queryResultSettings: {} },\n projectDomain,\n productRecIds,\n new Date(),\n null,\n affliations,\n true\n ).then((activePricesResponse:ProductPrice[]) => {\n this.productPrices = activePricesResponse;\n products = products.map(prod => {\n const activePrice = activePricesResponse.find(price => price.ProductId === prod.RecordId);\n if (activePrice) {\n prod.Price = activePrice.CustomerContextualPrice ?? prod.Price;\n prod.BasePrice = Math.max(activePrice.BasePrice || 0, activePrice.TradeAgreementPrice || 0, activePrice.AdjustedPrice || 0);\n }\n return prod;\n });\n this.setState({\n products:products\n });\n })\n .catch((error: Error) => {\n this.props.context.actionContext.trace(error.message);\n this.props.context.actionContext.telemetry.exception(error);\n this.props.context.actionContext.telemetry.debug(`[get Affiliation based price on Product Collection]Error executing action`);\n throw new Error('[get Affiliation based price on Product Collection]Error executing action');\n });\n }\n}\n\nexport default ProductCollection;\n","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\nimport { IOrderSummaryLines } from '@msdyn365-commerce-modules/order-summary-utilities';\nimport { INodeProps, Node } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\nimport { ICartViewProps, IOrderSummaryErrors } from './cart';\nimport { ICartlinesViewProps } from './components/cart-line-items';\nimport { ICartLineItemViewProps } from './components/cart-line-items-promotion';\n\nconst _renderCartlines = (cartLines: ICartlinesViewProps[] | undefined, cartEmptyText: string, CartlinesWrapper: INodeProps, storeSelector: React.ReactNode | undefined,\n backToShoppingButton: React.ReactNode, waitingComponent: React.ReactNode, cartLoadingStatus: string, cartDataResult: boolean): JSX.Element[] | JSX.Element => {\n\n if (cartLoadingStatus) {\n return <>{cartLoadingStatus};\n }\n if (cartLines) {\n return cartLines.map((cartLine, index) => {\n return (\n
\n {cartLine.cartline}\n {\n storeSelector && cartLine.pickUpInStore ?\n \n {cartLine.pickUpInStore.defaultComponent}\n :\n null\n }\n {\n cartLine.addToOrderTemplate ? (\n \n {cartLine.remove}\n {cartLine.addToWishlist}\n {cartLine.addToOrderTemplate}\n \n ) : (\n <>\n {cartLine.remove}\n {cartLine.addToWishlist}\n \n )\n }\n
\n );\n });\n } else {\n return (cartDataResult ?\n (\n
\n

{cartEmptyText}

\n {backToShoppingButton}\n
\n ) : <>{waitingComponent}\n );\n }\n};\n\nconst _renderErrorBlock = (errorData: IOrderSummaryErrors | undefined): JSX.Element | null => {\n if (!errorData || errorData.errors.length === 0) {\n return null;\n }\n return (\n \n {errorData.header}\n {errorData.errors}\n \n );\n};\n\nconst _renderOrderSummarylines = (orderSummaryLines: IOrderSummaryLines | undefined, OrderSummaryItems: INodeProps, props: ICartViewProps): JSX.Element | null => {\n if (!orderSummaryLines) {\n props.context.telemetry.error('OrderSummary content is empty, module wont render');\n return null;\n }\n return (\n \n {props.promoCode}\n {orderSummaryLines.subtotal}\n {orderSummaryLines.shipping}\n {orderSummaryLines.otherCharge}\n {orderSummaryLines.tax}\n {orderSummaryLines.totalDiscounts ? orderSummaryLines.totalDiscounts : null}\n {orderSummaryLines.orderTotal}\n \n );\n};\n\nconst _renderPromotions = (promotions: ICartLineItemViewProps): JSX.Element | undefined => {\n return (\n \n \n {promotions.promotionMessage}\n {promotions.promotionSeeAllLink}\n {promotions.promotionDialog}\n \n\n \n );\n\n};\n\nconst CartView: React.FC = (props: ICartViewProps) => (\n
\n {props.title}\n {props.promotionOptions && _renderPromotions(props.promotionOptions)}\n \n {_renderCartlines(props.cartlines, props.resources.emptyCartText, props.CartlinesWrapper, props.storeSelector, props.backToShoppingButton, props.waitingComponent, props.cartLoadingStatus, props.cartDataResult)}\n \n {props.orderSummaryHeading &&\n < Node {...props.OrderSummaryWrapper}>\n {props.orderSummaryHeading}\n {_renderOrderSummarylines(props.orderSummaryLineitems, props.OrderSummaryItems, props)}\n {_renderErrorBlock(props.OrderSummaryErrors)}\n {props.checkoutAsSignInUserButton}\n {props.checkoutAsGuestButton}\n {props.backToShoppingButton}\n {props.createTemplateFromCartButton}\n \n }\n {props.storeSelector}\n
\n);\n\nexport default CartView;","/*---------------------------------------------------------------------------------------------\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\n\r\n\r\nimport { INodeProps, Module, Node } from '@msdyn365-commerce-modules/utilities';\r\nimport * as React from 'react';\r\nimport { ISearchCategoryViewProps, ISearchFormViewProps, ISearchKeywordViewProps, ISearchProductViewProps } from '../../../modules/smwe-search/./components';\r\nimport { ISearchViewProps } from '../../../modules/smwe-search/./smwe-search';\r\n\r\nconst SearchView: React.FC = props => {\r\n const {\r\n Search,\r\n AutoSuggestAriaLabel,\r\n AutoSuggestAriaLabelText,\r\n searchText,\r\n AutoSuggest,\r\n KeywordSuggest,\r\n ProductSuggest,\r\n CategorySuggest,\r\n UlKeyword,\r\n UlProduct,\r\n UlCategory,\r\n form,\r\n autosuggestCategory,\r\n autosuggestKeyword,\r\n autosuggestProduct,\r\n SearchForm,\r\n FormWrapper,\r\n label\r\n } = props;\r\n\r\n return (\r\n \r\n {label}\r\n {_renderForm(form as ISearchFormViewProps, SearchForm, FormWrapper)}\r\n \r\n {searchText && searchText.length > 0 ?\r\n {AutoSuggestAriaLabelText} : ''\r\n }\r\n {_renderKeywordSuggestions(KeywordSuggest, UlKeyword, autosuggestKeyword)}\r\n {_renderProductSuggestions(ProductSuggest, UlProduct, autosuggestProduct)}\r\n {_renderCategorySuggestions(CategorySuggest, UlCategory, autosuggestCategory)}\r\n \r\n \r\n );\r\n};\r\n\r\nconst _renderForm = (form: ISearchFormViewProps, SearchForm: INodeProps, FormWrapper: INodeProps) => {\r\n return (\r\n \r\n \r\n {form.submitBtn}\r\n {form.label}\r\n {form.input}\r\n {form.cancelBtn}\r\n \r\n \r\n );\r\n};\r\n\r\nconst _renderKeywordSuggestions = (\r\n KeywordSuggest: INodeProps,\r\n UlKeyword: INodeProps,\r\n keywordSuggestions?: ISearchKeywordViewProps\r\n) => {\r\n return (\r\n keywordSuggestions && (\r\n \r\n \r\n {keywordSuggestions.text.map(text => {\r\n return text;\r\n })}\r\n \r\n \r\n )\r\n );\r\n};\r\n\r\nconst _renderProductSuggestions = (\r\n ProductSuggest: INodeProps,\r\n UlProduct: INodeProps,\r\n productSuggestions?: ISearchProductViewProps\r\n) => {\r\n return (\r\n productSuggestions && (\r\n \r\n \r\n {productSuggestions.title}\r\n {productSuggestions.items.map((item, index) => {\r\n return (\r\n \r\n \r\n {item.thumbnail}\r\n {item.text}\r\n {item.price !== 0 && (
{item.price}
)}\r\n
\r\n
\r\n );\r\n })}\r\n
\r\n
\r\n )\r\n );\r\n};\r\n\r\nconst _renderCategorySuggestions = (\r\n CategorySuggest: INodeProps,\r\n UlCategory: INodeProps,\r\n categorySuggestions?: ISearchCategoryViewProps\r\n) => {\r\n return (\r\n categorySuggestions && (\r\n \r\n \r\n {categorySuggestions.title}\r\n {categorySuggestions.text.map(text => {\r\n return text;\r\n })}\r\n \r\n \r\n )\r\n );\r\n};\r\n\r\nexport default SearchView;","/*---------------------------------------------------------------------------------------------\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\n\r\n\r\nimport { INodeProps, Module, Node } from '@msdyn365-commerce-modules/utilities';\r\nimport * as React from 'react';\r\nimport { ISearchCategoryViewProps, ISearchFormViewProps, ISearchKeywordViewProps, ISearchProductViewProps } from '../../../modules/smwe-search/./components';\r\nimport { ISearchViewProps } from '../../../modules/smwe-search/./smwe-search';\r\n\r\nconst SearchView: React.FC = props => {\r\n const {\r\n Search,\r\n AutoSuggestAriaLabel,\r\n AutoSuggestAriaLabelText,\r\n searchText,\r\n AutoSuggest,\r\n KeywordSuggest,\r\n ProductSuggest,\r\n CategorySuggest,\r\n UlKeyword,\r\n UlProduct,\r\n UlCategory,\r\n form,\r\n autosuggestCategory,\r\n autosuggestKeyword,\r\n autosuggestProduct,\r\n SearchForm,\r\n FormWrapper,\r\n label\r\n } = props;\r\n\r\n return (\r\n \r\n {label}\r\n {_renderForm(form as ISearchFormViewProps, SearchForm, FormWrapper)}\r\n \r\n {searchText && searchText.length > 0 ?\r\n {AutoSuggestAriaLabelText} : ''\r\n }\r\n {_renderKeywordSuggestions(KeywordSuggest, UlKeyword, autosuggestKeyword)}\r\n {_renderProductSuggestions(ProductSuggest, UlProduct, autosuggestProduct)}\r\n {_renderCategorySuggestions(CategorySuggest, UlCategory, autosuggestCategory)}\r\n \r\n \r\n );\r\n};\r\n\r\nconst _renderForm = (form: ISearchFormViewProps, SearchForm: INodeProps, FormWrapper: INodeProps) => {\r\n return (\r\n \r\n \r\n {form.submitBtn}\r\n {form.label}\r\n {form.input}\r\n {form.cancelBtn}\r\n \r\n \r\n );\r\n};\r\n\r\nconst _renderKeywordSuggestions = (\r\n KeywordSuggest: INodeProps,\r\n UlKeyword: INodeProps,\r\n keywordSuggestions?: ISearchKeywordViewProps\r\n) => {\r\n return (\r\n keywordSuggestions && (\r\n \r\n \r\n {keywordSuggestions.text.map(text => {\r\n return text;\r\n })}\r\n \r\n \r\n )\r\n );\r\n};\r\n\r\nconst _renderProductSuggestions = (\r\n ProductSuggest: INodeProps,\r\n UlProduct: INodeProps,\r\n productSuggestions?: ISearchProductViewProps\r\n) => {\r\n return (\r\n productSuggestions && (\r\n \r\n \r\n {productSuggestions.title}\r\n {productSuggestions.items.map((item, index) => {\r\n return (\r\n \r\n \r\n {item.thumbnail}\r\n {item.text}\r\n {item.price !== 0 && (
{item.price}
)}\r\n
\r\n
\r\n );\r\n })}\r\n
\r\n
\r\n )\r\n );\r\n};\r\n\r\nconst _renderCategorySuggestions = (\r\n CategorySuggest: INodeProps,\r\n UlCategory: INodeProps,\r\n categorySuggestions?: ISearchCategoryViewProps\r\n) => {\r\n return (\r\n categorySuggestions && (\r\n \r\n \r\n {categorySuggestions.title}\r\n {categorySuggestions.text.map(text => {\r\n return text;\r\n })}\r\n \r\n \r\n )\r\n );\r\n};\r\n\r\nexport default SearchView;","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\nimport * as React from 'react';\n\nimport { Module, Node } from '@msdyn365-commerce-modules/utilities';\nimport { IBuyboxViewProps } from '../..';\nimport {\n IBuyboxAddToCartViewProps,\n IBuyboxAddToOrderTemplateViewProps,\n IBuyboxAddToWishlistViewProps,\n IBuyboxFindInStoreViewProps,\n IBuyboxKeyInPriceViewProps,\n IBuyboxProductConfigureDropdownViewProps,\n IBuyboxProductConfigureViewProps,\n IBuyboxProductQuantityViewProps,\n IBuyboxShopSimilarLookViewProps\n } from './components';\n\nconst BuyboxView: React.FC = props => {\n const { ModuleProps, MediaGalleryContainerProps, ProductInfoContainerProps, addToCart, addToOrderTemplate, addToWishlist, configure, description, findInStore, quantity, price, title, rating, inventoryLabel, shopSimilarLook, keyInPrice } = props;\n\n return (\n \n \n {props.mediaGallery}\n \n \n {title}\n {price}\n {description}\n {rating}\n {configure && _renderConfigure(configure)}\n {keyInPrice && _renderKeyInPrice(keyInPrice)}\n {quantity && _renderQuantity(quantity)}\n {inventoryLabel}\n {addToCart && _renderAddToCart(addToCart)}\n {findInStore && _renderFindInStore(findInStore)}\n {addToOrderTemplate && _renderAddToOrderTemplate(addToOrderTemplate)}\n {addToWishlist && _renderAddToWishlist(addToWishlist)}\n { _renderSocialShare(props.slots && props.slots.socialShare)}\n {shopSimilarLook && _renderShopSimilarItem(shopSimilarLook)}\n \n \n );\n};\n\nconst _renderAddToCart = (addToCart: IBuyboxAddToCartViewProps): JSX.Element => {\n const { ContainerProps, errorBlock, button } = addToCart;\n\n return (\n \n {errorBlock}\n {button}\n \n );\n};\n\nconst _renderAddToOrderTemplate = (addToOrderTemplate: IBuyboxAddToOrderTemplateViewProps): JSX.Element => {\n const { ContainerProps, errorBlock, button } = addToOrderTemplate;\n\n return (\n \n {errorBlock}\n {button}\n \n );\n};\n\nconst _renderAddToWishlist = (addToWishlist: IBuyboxAddToWishlistViewProps): JSX.Element => {\n const { ContainerProps, errorBlock, button } = addToWishlist;\n\n return (\n \n {errorBlock}\n {button}\n \n );\n};\n\nconst _renderConfigure = (configure: IBuyboxProductConfigureViewProps): JSX.Element => {\n const { ContainerProps, dropdowns } = configure;\n\n return (\n \n {dropdowns.map(_renderConfigureDropdown)}\n \n );\n};\n\nconst _renderSocialShare = (socialShare: React.ReactNode[]): JSX.Element | undefined => {\n if (!socialShare || socialShare.length === 0) {\n return undefined;\n }\n\n return (\n <>\n {socialShare[0]}\n \n );\n};\n\nconst _renderConfigureDropdown = (dropdown: IBuyboxProductConfigureDropdownViewProps): JSX.Element => {\n const { ContainerProps, LabelContainerProps, heading, errors, select } = dropdown;\n\n return (\n \n \n {heading}\n {errors}\n \n {select}\n \n );\n};\n\nconst _renderFindInStore = (findInStore: IBuyboxFindInStoreViewProps): JSX.Element => {\n const { ContainerProps, storeSelector, heading, description, errors, button, modal, productPickupOptionList } = findInStore;\n\n return (\n \n {storeSelector}\n {heading}\n {productPickupOptionList}\n {description}\n {errors}\n {button}\n {modal}\n \n );\n};\n\nconst _renderQuantity = (quantity: IBuyboxProductQuantityViewProps): JSX.Element => {\n const { ContainerProps, LabelContainerProps, heading, input, errors } = quantity;\n\n return (\n \n \n {heading}\n {errors}\n \n {input}\n \n );\n};\n\nconst _renderKeyInPrice = (keyInPrice: IBuyboxKeyInPriceViewProps): JSX.Element => {\n const {ContainerProps, LabelContainerProps, heading, input } = keyInPrice;\n\n return(\n \n \n {heading}\n \n {input}\n \n );\n};\n\nconst _renderShopSimilarItem = (shopSimilarItem: IBuyboxShopSimilarLookViewProps): JSX.Element => {\n const { ContainerProps, errors, input } = shopSimilarItem;\n\n return (\n \n {errors}\n {input}\n \n );\n};\nexport default BuyboxView;\n","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\nimport * as React from 'react';\nimport { IVideoPlayerViewProps } from './video-player';\n\nconst VideoPlayerView: React.FC = props => (\n \n {props.player}\n
\n);\n\nexport default VideoPlayerView;","import { getPayloadObject, getTelemetryAttributes, IPayLoad, TelemetryConstant } from '@msdyn365-commerce-modules/utilities';\nimport { debounce } from 'lodash';\nimport { observer } from 'mobx-react';\nimport * as React from 'react';\nimport { IQuantityProps } from './Quantity.props';\n\ninterface IQuantityState {\n currentInput: number;\n isUpdateing: boolean;\n}\n/**\n * Quantity Component - This component is used to add or remove quantity\n */\n@observer\nexport default class Quantity extends React.PureComponent {\n public static defaultProps: Partial = {\n min: 1,\n decrementGlyphClass: 'fas fa-minus',\n incrementGlyphClass: 'fas fa-plus'\n };\n\n private inputRef: React.RefObject = React.createRef();\n private payLoad: IPayLoad;\n\n constructor(props: IQuantityProps) {\n super(props);\n this.state = { currentInput: props.currentCount || 1, isUpdateing: false };\n this._onIncrement = this._onIncrement.bind(this);\n this._onDecrement = this._onDecrement.bind(this);\n this._handleChange = this._handleChange.bind(this);\n this.payLoad = getPayloadObject('click', this.props.telemetryContent!, '');\n }\n\n public componentDidUpdate(prevProps: IQuantityProps): void {\n if (!this.props.disabled && this.state.currentInput !== this.props.currentCount && prevProps.currentCount !== this.props.currentCount) {\n this.setState({ currentInput: this.props.currentCount || 1});\n }\n\n if (this.props.disabled && !this.state.isUpdateing) {\n this.setState({ isUpdateing: true });\n }\n\n if (!this.props.disabled && this.state.isUpdateing) {\n this.setState({ currentInput: this.props.currentCount || 1, isUpdateing: false });\n }\n }\n\n public render(): JSX.Element {\n const {\n min,\n max,\n } = this.props;\n\n const glyphMinusClassName: string = `${this.props.decrementGlyphClass!} quantity__controls-glyph`;\n const glyphPlusClassName: string = `${this.props.incrementGlyphClass!} quantity__controls-glyph`;\n const decrementDisabled = this.state.currentInput <= (min || 1) || this.props.isGiftCard;\n const incrementDisabled = this.state.currentInput >= max || this.props.isGiftCard;\n const currentValue = this.state.currentInput;\n this.payLoad.contentAction.etext = TelemetryConstant.DecrementQuantity;\n const decrementAttributes = getTelemetryAttributes(this.props.telemetryContent!, this.payLoad);\n this.payLoad.contentAction.etext = TelemetryConstant.IncrementQuantity;\n const incrementAttributes = getTelemetryAttributes(this.props.telemetryContent!, this.payLoad);\n\n let extraClassDecrement = '';\n if(decrementDisabled) {\n // The quantity has reached its boundaries (max or min)\n extraClassDecrement ='disabled';\n\n } else if(this.props.disabled) {\n // this.props.disabled shows if the state is not succeded yet\n extraClassDecrement = 'transition';\n }\n let extraClassIncrement = '';\n if(incrementDisabled) {\n // The quantity has reached its boundaries (max or min)\n extraClassIncrement ='disabled';\n } else if(this.props.disabled) {\n // this.props.disabled shows if the state is not succeded yet\n extraClassIncrement = 'transition';\n }\n\n return (\n <>\n
\n \n \n \n \n \n \n \n
\n \n );\n }\n\n private _onIncrement(): void {\n let invokeCallback = false;\n const currQuantity = this.state.currentInput;\n let updatedQuantity: number;\n\n if (currQuantity < this.props.max) {\n invokeCallback = true;\n updatedQuantity = currQuantity + 1 ;\n } else {\n invokeCallback = false;\n updatedQuantity = this.props.max;\n }\n\n if(invokeCallback && this.props.onChange) {\n if(this.props.onChange(updatedQuantity)) {\n this.setState({ currentInput: updatedQuantity });\n }\n }\n }\n\n private _onDecrement(): void {\n let invokeCallback = false;\n const currQuantity = this.state.currentInput;\n let updatedQuantity: number;\n\n if (currQuantity > 1) {\n invokeCallback = true;\n updatedQuantity = currQuantity - 1;\n } else {\n invokeCallback = false;\n updatedQuantity = 1;\n }\n\n if(invokeCallback && this.props.onChange) {\n if(this.props.onChange(updatedQuantity)) {\n this.setState({ currentInput: updatedQuantity });\n }\n }\n }\n\n private _handleChange(e: React.ChangeEvent): void {\n const currentValue = parseInt((e.target.value), 10);\n const minValue = this.props.min === undefined ? 1 : this.props.min;\n const inputElement = this.inputRef && this.inputRef.current && this.inputRef.current instanceof HTMLInputElement && this.inputRef.current;\n\n if (currentValue > this.props.max) {\n this.setState(\n { currentInput: this.props.max },\n () => {\n debounce(\n () => {\n // due of usage debouncer, we may ignore onChange return value\n this.props.onChange && this.props.onChange(this.state.currentInput);\n },\n 200)();\n }\n );\n } else {\n this.setState(\n { currentInput: currentValue },\n () => {\n debounce(\n () => {\n if(!isNaN(this.state.currentInput) && !(this.state.currentInput < minValue)) {\n // due of usage debouncer, we may ignore onChange return value\n this.props.onChange && this.props.onChange(this.state.currentInput);\n\n if (inputElement) {\n inputElement.setAttribute('aria-valuenow', currentValue.toString());\n inputElement.setAttribute('value', currentValue.toString());\n }\n }\n },\n 200)();\n }\n );\n }\n }\n\n private _validateMin = (): void => {\n const minValue = this.props.min === undefined ? 1 : this.props.min;\n if(isNaN(this.state.currentInput) || (this.state.currentInput < minValue)) {\n this.setState({ currentInput: minValue }, () => { this.props.onChange && this.props.onChange(this.state.currentInput); });\n } else {\n this.props.onChange && this.props.onChange(this.state.currentInput);\n }\n }\n}","/* eslint-disable no-duplicate-imports */\r\nimport { generateImageUrl } from '@msdyn365-commerce-modules/retail-actions';\r\nimport { Autosuggestions } from '@msdyn365-commerce/commerce-entities';\r\nimport {\r\n CacheType, createObservableDataAction, IAction, IActionContext, IActionInput,\r\n ICreateActionContext\r\n} from '@msdyn365-commerce/core';\r\nimport { SearchSuggestion, SearchSuggestionCriteria } from '@msdyn365-commerce/retail-proxy';\r\nimport {\r\n getSearchSuggestionsAsync\r\n} from '@msdyn365-commerce/retail-proxy/dist/DataActions/StoreOperationsDataActions.g';\r\n\r\n// @ts-ignore\r\nexport const enum SuggestionType {\r\n Category = 'ScopedCategory',\r\n Keyword = 'Keyword',\r\n Product = 'Product',\r\n None = 'None'\r\n}\r\n\r\n/**\r\n * Input class for auto suggest search input\r\n */\r\nexport class AutoSuggestInput implements IActionInput {\r\n public searchQuery?: string;\r\n public topResultsCount?: number;\r\n public suggestionType?: string;\r\n public hitPrefix?: string;\r\n public hitSuffix?: string;\r\n\r\n constructor(searchText?: string, top?: number, suggestionType?: string, hitPrefix?: string, hitSuffix?: string) {\r\n this.searchQuery = searchText;\r\n this.topResultsCount = top;\r\n this.suggestionType = suggestionType;\r\n this.hitPrefix = hitPrefix;\r\n this.hitSuffix = hitSuffix;\r\n }\r\n\r\n public getCacheKey = () => `AutoSuggestSearchSuggestions`;\r\n public getCacheObjectType = () => 'AutoSuggestSearchSuggestions';\r\n public dataCacheType = (): CacheType => 'none';\r\n}\r\n\r\nconst createInput = (inputData: ICreateActionContext) => {\r\n return new AutoSuggestInput();\r\n};\r\n\r\n/**\r\n * Calls the Retail API and returns a auto-suggest suggestions\r\n */\r\nexport async function getSearchSuggestionsAction(input: AutoSuggestInput, ctx: IActionContext): Promise {\r\n // If no input is provided fail out\r\n if (!input || !input.searchQuery) {\r\n throw new Error('[getSearchSuggestionsAction]No valid Input was provided, failing');\r\n }\r\n\r\n const autosuggest: Autosuggestions = {};\r\n\r\n const autoSuggestPromises = [\r\n _getAutoSuggest(input, autosuggest, ctx),\r\n ];\r\n return Promise.all(autoSuggestPromises).then(() => {\r\n return autosuggest;\r\n });\r\n}\r\n\r\nasync function _getAutoSuggest(\r\n input: AutoSuggestInput,\r\n autosuggest: Autosuggestions,\r\n ctx: IActionContext\r\n): Promise {\r\n const searchCriteria: SearchSuggestionCriteria = {\r\n ProductSearchCriteria: {\r\n SearchCondition: input.searchQuery && input.searchQuery.length > 0 ? input.searchQuery : '',\r\n Context: {\r\n ChannelId: +ctx.requestContext.apiSettings.channelId,\r\n CatalogId: +ctx.requestContext.apiSettings.catalogId\r\n }\r\n },\r\n HitPrefix: input.hitPrefix,\r\n HitSuffix: input.hitSuffix,\r\n SuggestionType: input.suggestionType\r\n };\r\n\r\n const searchSuggestions = await getSearchSuggestionsAsync(\r\n { callerContext: ctx, queryResultSettings: { Paging: { Top: input.topResultsCount } } },\r\n searchCriteria\r\n );\r\n\r\n if (searchSuggestions && searchSuggestions.length > 0) {\r\n // Generate image url\r\n searchSuggestions.map(\r\n (item: SearchSuggestion) =>\r\n (item.ImageUrl = item.ImageUrl ? generateImageUrl(item.ImageUrl, ctx.requestContext.apiSettings) : '')\r\n );\r\n\r\n autosuggest.AllSearchResults = searchSuggestions;\r\n } else {\r\n ctx.telemetry.error(`[getSearchSuggestionsAction] unable to get availabilites for search with suggestion type ${searchCriteria.SuggestionType}`);\r\n }\r\n}\r\n\r\nexport default createObservableDataAction({\r\n id: '@msdyn365-commerce-modules/search/get-auto-suggest-suggestions',\r\n action: >getSearchSuggestionsAction,\r\n input: createInput\r\n});\r\n","/*---------------------------------------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License. See License.txt in the project root for license information.\r\n *--------------------------------------------------------------------------------------------*/\r\n\r\n/* eslint-disable no-duplicate-imports */\r\nimport * as React from 'react';\r\n\r\nimport { getPayloadObject, getTelemetryAttributes, IPayLoad, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\r\nimport { getRichTextHtml } from '@msdyn365-commerce/core';\r\nimport { SearchSuggestion } from '@msdyn365-commerce/retail-proxy';\r\n\r\nimport { ISmweSearchData } from '../smwe-search.data';\r\nimport { ISmweSearchProps } from '../smwe-search.props.autogenerated';\r\n\r\nexport interface ISearchKeywordSuggestProps {\r\n searchKeywordSuggestClass: string;\r\n searchPageURL: string;\r\n searchQsp: string | undefined;\r\n hitPrefix: string;\r\n hitSuffix: string;\r\n autoSuggestProps: ISmweSearchProps;\r\n searchText: string;\r\n suggestions: SearchSuggestion[] | undefined;\r\n telemetryContent?: ITelemetryContent;\r\n}\r\n\r\nexport interface ISearchKeywordViewProps {\r\n text: React.ReactNode[];\r\n}\r\n\r\nlet payLoad: IPayLoad;\r\n\r\n/**\r\n *\r\n * KeywordSuggestionsComponent\r\n */\r\nexport const KeywordSuggestionsComponent = (props: ISearchKeywordSuggestProps): ISearchKeywordViewProps | undefined => {\r\n const {\r\n suggestions,\r\n hitPrefix,\r\n hitSuffix\r\n } = props;\r\n\r\n if (!suggestions) {\r\n return undefined;\r\n }\r\n\r\n payLoad = getPayloadObject('click', props.telemetryContent!, '');\r\n\r\n const reactNodes: React.ReactNode[] = [];\r\n\r\n suggestions.map(item => {\r\n reactNodes.push(_assembleNode(item, hitPrefix, hitSuffix, props));\r\n });\r\n\r\n return { text: reactNodes };\r\n};\r\n\r\nconst _assembleNode = (item: SearchSuggestion, hitPrefix: string, hitSuffix: string, props: ISearchKeywordSuggestProps) => {\r\n const ariaLabel = item.Value &&\r\n (item.Value).replace(new RegExp(`[${hitPrefix}]`, 'gi'), '').replace(new RegExp(`[${hitSuffix}]`, 'gi'), '');\r\n payLoad.contentAction.etext = ariaLabel;\r\n const attribute = getTelemetryAttributes(props.telemetryContent!, payLoad);\r\n return (\r\n
  • \r\n \r\n {_generateLink(item, hitPrefix, hitSuffix, props) &&\r\n _getHighlightedText(item.Value ? item.Value : '', hitPrefix, hitSuffix)}\r\n \r\n
  • \r\n );\r\n};\r\n\r\nconst _generateLink = (suggestion: SearchSuggestion, hitPrefix: string, hitSuffix: string, props: ISearchKeywordSuggestProps): string => {\r\n const { searchPageURL, searchQsp } = props;\r\n\r\n const formattedLink = (suggestion.Value as string)\r\n .replace(new RegExp(`[${hitPrefix}]`, 'gi'), '')\r\n .replace(new RegExp(`[${hitSuffix}]`, 'gi'), '');\r\n const route = searchPageURL || '';\r\n return formattedLink && formattedLink.length > 0\r\n ? `${route}${route.indexOf('?') === -1 ? '?' : '&'}${searchQsp}=${formattedLink}`\r\n : route;\r\n};\r\n\r\nconst _getHighlightedText = (suggestion: string, hitPrefix: string, hitSuffix: string): JSX.Element => {\r\n const formattedText = suggestion\r\n .replace(new RegExp(`[${hitPrefix}]`, 'gi'), '')\r\n .replace(new RegExp(`[${hitSuffix}]`, 'gi'), '');\r\n\r\n // tslint:disable:react-no-dangerous-html\r\n return ;\r\n};\r\n","/*---------------------------------------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License. See License.txt in the project root for license information.\r\n *--------------------------------------------------------------------------------------------*/\r\n\r\n/* eslint-disable no-duplicate-imports */\r\nimport * as React from 'react';\r\n\r\nimport { PriceComponent } from '@msdyn365-commerce/components';\r\nimport { getRichTextHtml, IActionContext, IImageSettings, Image, ITelemetry } from '@msdyn365-commerce/core';\r\nimport { SearchSuggestion } from '@msdyn365-commerce/retail-proxy';\r\n\r\nimport { getProductPageUrlSync } from '@msdyn365-commerce-modules/retail-actions';\r\nimport { getPayloadObject, getTelemetryAttributes, INodeProps, IPayLoad, ITelemetryContent, NodeTag } from '@msdyn365-commerce-modules/utilities';\r\nimport { ISmweSearchData } from '../smwe-search.data';\r\nimport { ISmweSearchProps } from '../smwe-search.props.autogenerated';\r\n\r\nexport interface ISearchProductSuggestProps {\r\n searchProductSuggestClass: string;\r\n searchPageURL: string;\r\n searchQsp: string | undefined;\r\n hitPrefix: string;\r\n hitSuffix: string;\r\n autoSuggestProps: ISmweSearchProps;\r\n searchText: string;\r\n suggestions: SearchSuggestion[] | undefined;\r\n telemetry: ITelemetry;\r\n moduleType: string;\r\n moduleId: string;\r\n telemetryContent?: ITelemetryContent;\r\n}\r\n\r\nexport interface ISearchProductViewProps {\r\n title: React.ReactNode;\r\n items: ISearchProductItemViewProps[];\r\n}\r\n\r\nexport interface ISearchProductItemViewProps {\r\n text: React.ReactNode;\r\n thumbnail: React.ReactNode;\r\n price: React.ReactNode;\r\n LiProduct: INodeProps;\r\n AProduct: INodeProps;\r\n id: string | undefined;\r\n}\r\n\r\nlet payLoad: IPayLoad;\r\nlet telemetryContent: ITelemetryContent | undefined;\r\n\r\n/**\r\n *\r\n * ProductSuggestionsComponent\r\n */\r\nexport const ProductSuggestionsComponent = (props: ISearchProductSuggestProps): ISearchProductViewProps | undefined => {\r\n const {\r\n suggestions,\r\n hitSuffix,\r\n hitPrefix,\r\n autoSuggestProps: {\r\n context: { actionContext },\r\n resources: { productSuggestionHeading }\r\n },\r\n moduleType,\r\n moduleId\r\n } = props;\r\n const reactNodes: ISearchProductItemViewProps[] = [];\r\n telemetryContent = props.telemetryContent;\r\n payLoad = getPayloadObject('click', props.telemetryContent!, '');\r\n\r\n if (!suggestions) {\r\n return undefined;\r\n }\r\n\r\n suggestions.map(item => {\r\n reactNodes.push(_assembleNode(item, hitPrefix, hitSuffix, actionContext, props, moduleType, moduleId));\r\n });\r\n\r\n const titleNode = _renderTitle(productSuggestionHeading);\r\n\r\n return { title: titleNode, items: reactNodes };\r\n};\r\n\r\nconst _renderTitle = (productSuggestionHeading: string) => {\r\n const productAutoSuggestionHeading = productSuggestionHeading ? productSuggestionHeading : 'Go to products';\r\n\r\n return
  • {productAutoSuggestionHeading}
  • ;\r\n};\r\n\r\nconst _assembleNode = (\r\n item: SearchSuggestion,\r\n hitPrefix: string,\r\n hitSuffix: string,\r\n actionContext: IActionContext,\r\n props: ISearchProductSuggestProps,\r\n moduleType: string,\r\n moduleId: string\r\n): ISearchProductItemViewProps => {\r\n const altText =\r\n item.Value &&\r\n (item.Value).replace(new RegExp(`[${hitPrefix}]`, 'gi'), '').replace(new RegExp(`[${hitSuffix}]`, 'gi'), '');\r\n\r\n return {\r\n text: _getHighlightedText(item.Value ? item.Value : '', hitPrefix, hitSuffix),\r\n thumbnail: _renderThumbnail(item, altText ? altText : '', props),\r\n price:\r\n item.Id &&\r\n item.Value3 &&\r\n item.Value3.Value &&\r\n item.Value3.Value.DecimalValue &&\r\n _renderPrice(item.Value3.Value.DecimalValue, item.Value3.Value.DecimalValue, moduleId, moduleType, props),\r\n LiProduct: _getLiWrapper(),\r\n AProduct: _getAWrapper(item, hitPrefix, hitSuffix, actionContext),\r\n id: item.Id\r\n };\r\n};\r\n\r\nconst _getLiWrapper = () => {\r\n return {\r\n className: 'msc-autoSuggest__productResults-item',\r\n tag: 'li' as NodeTag\r\n };\r\n};\r\n\r\nconst _getAWrapper = (item: SearchSuggestion, hitPrefix: string, hitSuffix: string, actionContext: IActionContext) => {\r\n const ariaLabel = item.Value &&\r\n (item.Value).replace(new RegExp(`[${hitPrefix}]`, 'gi'), '').replace(new RegExp(`[${hitSuffix}]`, 'gi'), '');\r\n\r\n payLoad.contentAction.recid = item.Id;\r\n const attribute = getTelemetryAttributes(telemetryContent!, payLoad);\r\n\r\n return {\r\n className: 'msc-autoSuggest__productResults-item',\r\n tag: 'a' as NodeTag,\r\n 'aria-label': ariaLabel,\r\n href: _generateLink(item, hitPrefix, hitSuffix, actionContext),\r\n ...attribute\r\n };\r\n};\r\n\r\nconst _generateLink = (suggestion: SearchSuggestion, hitPrefix: string, hitSuffix: string, actionContext: IActionContext) => {\r\n const formattedLink = (suggestion.Value as string).replace(new RegExp(`[${hitPrefix}]`, 'gi'), '').replace(new RegExp(`[${hitSuffix}]`, 'gi'), '');\r\n return suggestion.Value && suggestion.Id ?\r\n getProductPageUrlSync(formattedLink,suggestion.Id as unknown as number, actionContext, undefined) : '';\r\n};\r\n\r\nconst _getHighlightedText = (suggestion: string, hitPrefix: string, hitSuffix: string): JSX.Element => {\r\n const formattedText = suggestion\r\n .replace(new RegExp(`[${hitPrefix}]`, 'gi'), '')\r\n .replace(new RegExp(`[${hitSuffix}]`, 'gi'), '');\r\n\r\n // tslint:disable:react-no-dangerous-html\r\n return ;\r\n};\r\n\r\nconst _renderPrice = (adjustedPrice: number, basePrice: number, moduleId: string, moduleType: string, props: ISearchProductSuggestProps): JSX.Element | null => {\r\n const {\r\n autoSuggestProps: { context }\r\n } = props;\r\n\r\n return (\r\n \r\n );\r\n};\r\n\r\nconst _renderThumbnail = (suggestion: SearchSuggestion, altText: string, props: ISearchProductSuggestProps): JSX.Element | null => {\r\n const {\r\n autoSuggestProps: {\r\n context: {\r\n request: { gridSettings }\r\n },\r\n config: { imageSettings }\r\n }\r\n } = props;\r\n if(imageSettings) {\r\n imageSettings.cropFocalRegion = true;\r\n }\r\n\r\n if (!suggestion || !suggestion.ImageUrl) {\r\n props.telemetry.error('Search suggestion content is empty, module wont render.');\r\n return null;\r\n }\r\n\r\n const defaultImageSettings: IImageSettings = {\r\n viewports: {\r\n xs: { q: `w=40&h=40&m=6`, w: 0, h: 0 },\r\n lg: { q: `w=40&h=40&m=6`, w: 0, h: 0 },\r\n xl: { q: `w=40&h=40&m=6`, w: 0, h: 0 }\r\n },\r\n lazyload: true,\r\n cropFocalRegion: true\r\n };\r\n\r\n return (\r\n \r\n );\r\n};\r\n","/*---------------------------------------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License. See License.txt in the project root for license information.\r\n *--------------------------------------------------------------------------------------------*/\r\n\r\n/* eslint-disable no-duplicate-imports */\r\nimport * as React from 'react';\r\n\r\nimport { getRichTextHtml } from '@msdyn365-commerce/core';\r\nimport { ProductRefiner, ProductRefinerValue, SearchSuggestion } from '@msdyn365-commerce/retail-proxy';\r\n\r\nimport { format, getPayloadObject, getTelemetryAttributes, IPayLoad, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\r\nimport { ISmweSearchData } from '../smwe-search.data';\r\nimport { ISmweSearchProps } from '../smwe-search.props.autogenerated';\r\n\r\nexport interface ISearchCategorySuggestProps {\r\n searchCategorySuggestClass: string;\r\n searchPageURL: string;\r\n searchQsp: string | undefined;\r\n hitPrefix: string;\r\n hitSuffix: string;\r\n autoSuggestProps: ISmweSearchProps;\r\n searchText: string;\r\n searchRefiners: ProductRefiner[] | undefined;\r\n suggestions: SearchSuggestion[] | undefined;\r\n telemetryContent?: ITelemetryContent;\r\n}\r\n\r\nexport interface ISearchCategoryViewProps {\r\n title: React.ReactNode;\r\n text: React.ReactNode[];\r\n}\r\n\r\nlet payLoad: IPayLoad;\r\n\r\n/**\r\n *\r\n * CategorySuggestionsComponent\r\n */\r\nexport const CategorySuggestionsComponent = (props: ISearchCategorySuggestProps): ISearchCategoryViewProps | undefined => {\r\n const {\r\n suggestions,\r\n searchText,\r\n autoSuggestProps: {\r\n resources: { categorySuggestionHeading }\r\n }\r\n } = props;\r\n\r\n if (!suggestions) {\r\n return undefined;\r\n }\r\n\r\n const reactNodes: React.ReactNode[] = [];\r\n payLoad = getPayloadObject('click', props.telemetryContent!, '');\r\n\r\n suggestions.map(item => {\r\n reactNodes.push(_assembleNode(item, props));\r\n });\r\n\r\n const titleNode = _renderTitle(categorySuggestionHeading, searchText);\r\n\r\n return { title: titleNode, text: reactNodes };\r\n};\r\n\r\nconst _renderTitle = (categorySuggestionHeading: string, searchText: string) => {\r\n const categoryAutoSuggestionHeading = categorySuggestionHeading\r\n ? format(categorySuggestionHeading, searchText)\r\n : `Search \"${searchText}\" in categories`;\r\n\r\n return
  • {categoryAutoSuggestionHeading}
  • ;\r\n};\r\n\r\nconst _assembleNode = (item: SearchSuggestion, props: ISearchCategorySuggestProps) => {\r\n const { searchText, hitPrefix, hitSuffix } = props;\r\n\r\n const splitValue = item.Value && item.Value.split('|').pop();\r\n const ariaLabel = splitValue\r\n ? splitValue.replace(new RegExp(`[${hitPrefix}]`, 'gi'), '').replace(new RegExp(`[${hitSuffix}]`, 'gi'), '')\r\n : item.Value && item.Value.replace(new RegExp(`[${hitPrefix}]`, 'gi'), '').replace(new RegExp(`[${hitSuffix}]`, 'gi'), '');\r\n payLoad.contentAction.etext = item.Value;\r\n const attribute = getTelemetryAttributes(props.telemetryContent!, payLoad);\r\n return (\r\n
  • \r\n \r\n {_generateLink(item, searchText, props) && _getHighlightedText(item.Value ? item.Value : '', hitPrefix, hitSuffix)}\r\n \r\n
  • \r\n );\r\n};\r\n\r\nconst _generateLink = (suggestion: SearchSuggestion, searchText: string, props: ISearchCategorySuggestProps): string => {\r\n return suggestion && suggestion.Id ? _getCategoryLink(suggestion.Id, searchText, props) : '';\r\n};\r\n\r\nconst _getCategoryLink = (id: string, searchText: string, props: ISearchCategorySuggestProps): string => {\r\n const { searchPageURL, searchQsp, searchRefiners } = props;\r\n\r\n const route = searchPageURL || '';\r\n const urlPath = `${route}${route.indexOf('?') === -1 ? '?' : '&'}${searchQsp}=${searchText}`;\r\n const categoryRefiners =\r\n searchRefiners &&\r\n searchRefiners.find(refiners => {\r\n return refiners.KeyName === 'Category';\r\n });\r\n const refiner =\r\n categoryRefiners &&\r\n categoryRefiners.Values &&\r\n categoryRefiners.Values.find(item => {\r\n return item.RefinerRecordId === parseInt(id, 10);\r\n });\r\n\r\n const encodedRefiner = refiner && encodeURIComponent(JSON.stringify(compressRefiners([refiner])));\r\n\r\n return encodedRefiner ? `${urlPath}&refiners=${encodedRefiner}` : urlPath;\r\n};\r\n\r\nconst _getHighlightedText = (suggestion: string, hitPrefix: string, hitSuffix: string): JSX.Element => {\r\n let formattedText = suggestion\r\n .replace(new RegExp(`[${hitPrefix}]`, 'gi'), '')\r\n .replace(new RegExp(`[${hitSuffix}]`, 'gi'), '');\r\n formattedText = formattedText.split('|').pop() || '';\r\n\r\n // tslint:disable:react-no-dangerous-html\r\n return ;\r\n};\r\n\r\n// TODO: This code is currently duplicated in categoryautosuggest need to either remove one of these files\r\n// or move this code to a common place\r\nconst compressedRefinerKeys = ['DataTypeValue', 'LeftValueBoundString', 'RefinerRecordId', 'RefinerSourceValue', 'RightValueBoundString', 'UnitText'];\r\n\r\n/**\r\n * Compressed a list of refiners for use in URLs\r\n * @param refiners The uncompressed refiners\r\n */\r\nconst compressRefiners = (refiners: ProductRefinerValue[]) => {\r\n const compressedRefiners: (string | number)[][] = [];\r\n\r\n refiners.forEach((refiner) => {\r\n const compressedRefiner: (string | number)[] = [];\r\n compressedRefinerKeys.forEach((refinerKey) => {\r\n // @ts-ignore: This line is intentionally not typesafe\r\n compressedRefiner.push(refiner[refinerKey]);\r\n });\r\n compressedRefiners.push(compressedRefiner);\r\n });\r\n\r\n return compressedRefiners;\r\n};\r\n","/*---------------------------------------------------------------------------------------------\r\n * 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\n\r\n/* eslint-disable no-duplicate-imports */\r\nimport { Button } from '@msdyn365-commerce-modules/utilities';\r\nimport * as React from 'react';\r\n\r\nexport interface ISearchFormProps {\r\n hideSearchLabel: boolean | undefined;\r\n isSearchFormExpanded: boolean | undefined;\r\n disableSubmitSearch: boolean | undefined;\r\n searchTextInput: React.RefObject;\r\n maxChars: number;\r\n searchQsp: string;\r\n searchPlaceholder: string;\r\n query: string;\r\n ariaLabelCancel: string;\r\n ariaLabelSearch: string;\r\n ariaLabelSubmit: string;\r\n handleCancelSearchChange(): void;\r\n handleInputChange(query: string): void;\r\n}\r\n\r\nexport interface ISearchFormViewProps {\r\n label: React.ReactNode;\r\n input: React.ReactNode;\r\n submitBtn: React.ReactNode;\r\n cancelBtn: React.ReactNode;\r\n\r\n}\r\n\r\nexport const FormComponent = (props: ISearchFormProps): ISearchFormViewProps => {\r\n const {\r\n searchQsp,\r\n searchPlaceholder,\r\n hideSearchLabel,\r\n isSearchFormExpanded,\r\n searchTextInput,\r\n handleInputChange,\r\n maxChars,\r\n disableSubmitSearch,\r\n handleCancelSearchChange,\r\n query,\r\n ariaLabelCancel,\r\n ariaLabelSearch,\r\n ariaLabelSubmit\r\n } = props;\r\n\r\n const onInputChange = (e: React.ChangeEvent): void => {\r\n handleInputChange(e.target.value || '');\r\n };\r\n\r\n const labelNode = ;\r\n\r\n const inputNode = !hideSearchLabel ? (\r\n \r\n ) : (\r\n \r\n );\r\n\r\n const submitBtnNode = !disableSubmitSearch && (\r\n \r\n
    \r\n );\r\n};\r\n","/*---------------------------------------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License. See License.txt in the project root for license information.\r\n *--------------------------------------------------------------------------------------------*/\r\n\r\n/* eslint-disable no-duplicate-imports */\r\nimport { createSearchStateInput } from '@msdyn365-commerce-modules/search-utilities';\r\nimport { getTelemetryObject, IModuleProps, INodeProps, ITelemetryContent, KeyCodes } from '@msdyn365-commerce-modules/utilities';\r\nimport { Autosuggestions } from '@msdyn365-commerce/commerce-entities';\r\nimport { getUrlSync } from '@msdyn365-commerce/core';\r\nimport { ProductRefiner } from '@msdyn365-commerce/retail-proxy';\r\nimport { getProductSearchRefinersAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/ProductsDataActions.g';\r\nimport classnames from 'classnames';\r\nimport { debounce } from 'lodash';\r\nimport * as React from 'react';\r\n\r\nimport getSearchSuggestionsAction, { AutoSuggestInput, SuggestionType } from './actions/get-auto-suggest-suggestions';\r\nimport {\r\n CategorySuggestionsComponent,\r\n FormComponent,\r\n ISearchCategoryViewProps,\r\n ISearchKeywordViewProps,\r\n ISearchProductViewProps,\r\n KeywordSuggestionsComponent,\r\n LabelComponent,\r\n ProductSuggestionsComponent\r\n} from './components';\r\nimport { ISmweSearchData } from './smwe-search.data';\r\nimport { ISmweSearchProps, ISuggestionTypeCriterionData } from './smwe-search.props.autogenerated';\r\n\r\nexport interface ISearchState {\r\n isSearchFormExpanded: boolean;\r\n searchText: string;\r\n searchKeywordSuggestClass: string;\r\n searchProductSuggestClass: string;\r\n searchCategorySuggestClass: string;\r\n suggestions: Autosuggestions | undefined;\r\n searchRefiners?: ProductRefiner[] | undefined;\r\n autoSuggestAriaLabel: string;\r\n isInitialState: boolean;\r\n}\r\n\r\nexport interface ISearchViewProps extends ISmweSearchProps {\r\n Search: IModuleProps;\r\n AutoSuggestAriaLabel: INodeProps;\r\n AutoSuggestAriaLabelText: string;\r\n searchText: string;\r\n AutoSuggest: INodeProps;\r\n KeywordSuggest: INodeProps;\r\n ProductSuggest: INodeProps;\r\n CategorySuggest: INodeProps;\r\n SearchForm: INodeProps;\r\n FormWrapper: INodeProps;\r\n UlKeyword: INodeProps;\r\n UlProduct: INodeProps;\r\n UlCategory: INodeProps;\r\n label: React.ReactNode;\r\n form: React.ReactNode;\r\n autosuggestKeyword?: ISearchKeywordViewProps;\r\n autosuggestProduct?: ISearchProductViewProps;\r\n autosuggestCategory?: ISearchCategoryViewProps;\r\n callbacks: {\r\n handleCancelSearchChange(): void;\r\n };\r\n isSearchFormExpanded: boolean;\r\n}\r\n\r\n/**\r\n *\r\n * Search module\r\n * @extends {React.Component, ISearchState>}\r\n */\r\nclass Search extends React.Component, ISearchState> {\r\n private searchTextInput: React.RefObject;\r\n private searchCollapsedLabel: React.RefObject;\r\n private formReference: React.RefObject;\r\n private maxChars: number;\r\n private inputSuggestionType?: ISuggestionTypeCriterionData[];\r\n private topResultsCount?: number;\r\n private hitPrefix: string = '{';\r\n private hitSuffix: string = '}';\r\n private waitTime: number = 500;\r\n private autoSuggestResultScreenReaderDiv: React.RefObject;\r\n private autoSuggestResultDiv: React.RefObject;\r\n private searchFormClass: string;\r\n private searchLabelClass: string;\r\n private telemetryContent: ITelemetryContent;\r\n // @ts-ignore\r\n private cancellabelDebounce: debounce;\r\n\r\n constructor(props: ISmweSearchProps) {\r\n super(props);\r\n this.searchTextInput = React.createRef();\r\n this.searchCollapsedLabel = React.createRef();\r\n this.autoSuggestResultScreenReaderDiv = React.createRef();\r\n this.autoSuggestResultDiv = React.createRef();\r\n this.formReference = React.createRef();\r\n this.state = {\r\n isSearchFormExpanded: false,\r\n searchText: '',\r\n searchKeywordSuggestClass: 'ms-search__autoSuggest__keyword',\r\n searchProductSuggestClass: 'ms-search__autoSuggest__product',\r\n searchCategorySuggestClass: 'ms-search__autoSuggest__category',\r\n suggestions: undefined,\r\n searchRefiners: undefined,\r\n autoSuggestAriaLabel: '',\r\n isInitialState: true\r\n };\r\n this.maxChars =\r\n (this.props.context &&\r\n this.props.context.app &&\r\n this.props.context.app.config &&\r\n this.props.context.app.config.searchInputMaxLength) ||\r\n 50;\r\n this.inputSuggestionType = this.props.config && this.props.config.suggestionTypeCriterion;\r\n this.topResultsCount = this.props.config && this.props.config.topResultsCount ? this.props.config.topResultsCount : 5;\r\n this.searchFormClass = 'ms-search__form';\r\n this.searchLabelClass = 'ms-search__label';\r\n this.telemetryContent = getTelemetryObject(this.props.context.request.telemetryPageName!, this.props.friendlyName, this.props.telemetry);\r\n }\r\n\r\n public async componentDidMount(): Promise {\r\n document.body && document.body.addEventListener('mousedown', this._focusOutTarget);\r\n window && window.addEventListener('keyup', this._keyup);\r\n }\r\n\r\n public componentWillUnmount(): void {\r\n document.body && document.body.removeEventListener('mousedown', this._focusOutTarget, false);\r\n window && window.removeEventListener('keyup', this._keyup, false);\r\n }\r\n\r\n public componentDidUpdate(): void {\r\n const {\r\n config: { hideSearchLabel }\r\n } = this.props;\r\n const { isSearchFormExpanded, isInitialState } = this.state;\r\n\r\n if (!this.props.context.request.params.isEditor) {\r\n if (!hideSearchLabel && isSearchFormExpanded) {\r\n this.searchTextInput && this.searchTextInput.current && this.searchTextInput.current.focus();\r\n } else if (!isInitialState) {\r\n this.searchCollapsedLabel && this.searchCollapsedLabel.current && this.searchCollapsedLabel.current.focus();\r\n }\r\n }\r\n }\r\n\r\n // tslint:disable-next-line: cyclomatic-complexity max-func-body-length\r\n public render(): JSX.Element {\r\n const {\r\n context,\r\n resources: { searchtext, searchLabelArialLabel, cancelBtnAriaLabel, searchBtnAriaLabel, submitBtnAriaLabel},\r\n config: { hideSearchLabel, disableSubmitSearch, searchplaceholderText, className = '' }\r\n } = this.props;\r\n\r\n const {\r\n isSearchFormExpanded,\r\n searchText,\r\n searchKeywordSuggestClass,\r\n searchProductSuggestClass,\r\n searchCategorySuggestClass,\r\n suggestions,\r\n searchRefiners\r\n } = this.state;\r\n\r\n const searchQsp = (context && context.app && context.app.config && context.app.config.searchQueryStringParameter) || 'q';\r\n const searchPageURL = getUrlSync('search', context && context.actionContext) || '';\r\n const searchURL = this._appendQueryParams(searchPageURL, searchText, searchQsp);\r\n const searchPlaceholder = searchplaceholderText && searchplaceholderText.length > 0 ? searchplaceholderText : 'Search in Fabrikam';\r\n\r\n const keywordSuggestions =\r\n suggestions &&\r\n suggestions.AllSearchResults &&\r\n suggestions.AllSearchResults.filter(\r\n i => i.SuggestionType === SuggestionType.Keyword || i.SuggestionType === SuggestionType.None\r\n );\r\n const productSuggestions =\r\n suggestions &&\r\n suggestions.AllSearchResults &&\r\n suggestions.AllSearchResults.filter(i => i.SuggestionType === SuggestionType.Product);\r\n const categorySuggestions =\r\n suggestions &&\r\n suggestions.AllSearchResults &&\r\n suggestions.AllSearchResults.filter(i => i.SuggestionType === SuggestionType.Category);\r\n\r\n const viewProps: ISearchViewProps = {\r\n ...(this.props as ISmweSearchProps),\r\n\r\n Search: {\r\n moduleProps: this.props,\r\n className: `${classnames('ms-search', className)} ${disableSubmitSearch ? 'no-submit' : 'with-submit'}`,\r\n },\r\n AutoSuggestAriaLabel: {\r\n tag: 'div',\r\n className: 'msc-autoSuggest__screen-reader',\r\n 'aria-live': 'assertive',\r\n ref: this.autoSuggestResultScreenReaderDiv\r\n },\r\n AutoSuggestAriaLabelText: this.state.autoSuggestAriaLabel,\r\n searchText: this.state.searchText,\r\n AutoSuggest: {\r\n ref: this.autoSuggestResultDiv,\r\n className: 'ms-search__autoSuggest'\r\n },\r\n KeywordSuggest: {\r\n className: searchKeywordSuggestClass\r\n },\r\n ProductSuggest: {\r\n className: searchProductSuggestClass\r\n },\r\n CategorySuggest: {\r\n className: searchCategorySuggestClass\r\n },\r\n SearchForm: {\r\n className: `${this.searchFormClass} ${isSearchFormExpanded ? 'bx-show' : 'bx-hide'}`\r\n },\r\n FormWrapper: {\r\n tag: 'form',\r\n ref: this.formReference,\r\n className: 'ms-search__searchForm',\r\n 'aria-label': 'Search',\r\n name: 'searchForm',\r\n role: 'search',\r\n action: searchURL,\r\n autoComplete: 'off',\r\n onSubmit: this._handleSubmit\r\n },\r\n UlKeyword: {\r\n tag: 'ul',\r\n className: classnames('msc-autoSuggest__keywordResults-items', className)\r\n },\r\n UlProduct: {\r\n tag: 'ul',\r\n className: classnames('msc-autoSuggest__productResults-items', className)\r\n },\r\n UlCategory: {\r\n tag: 'ul',\r\n className: classnames('msc-autoSuggest__categoryResults-items', className)\r\n },\r\n label:LabelComponent({\r\n isSearchFormExpanded: isSearchFormExpanded,\r\n searchLabelClass: `${this.searchLabelClass} ${isSearchFormExpanded ? 'bx-hide' : 'bx-show'}`,\r\n searchtext: searchtext,\r\n searchLabelArialLabel: searchLabelArialLabel,\r\n searchCollapsedLabel: this.searchCollapsedLabel,\r\n hideSearchLabel: hideSearchLabel,\r\n handleCancelSearchChange: this._handleCancelSearchChange,\r\n telemetryContent: this.telemetryContent\r\n }),\r\n form: FormComponent({\r\n ariaLabelCancel: cancelBtnAriaLabel,\r\n ariaLabelSearch: searchBtnAriaLabel,\r\n ariaLabelSubmit: submitBtnAriaLabel,\r\n hideSearchLabel: hideSearchLabel,\r\n searchTextInput: this.searchTextInput,\r\n isSearchFormExpanded: isSearchFormExpanded,\r\n disableSubmitSearch: disableSubmitSearch,\r\n handleInputChange: this._handleInputChange,\r\n handleCancelSearchChange: this._handleCancelSearchChange,\r\n maxChars: this.maxChars,\r\n searchQsp: searchQsp,\r\n searchPlaceholder: searchPlaceholder,\r\n query: searchText\r\n }),\r\n autosuggestKeyword:\r\n searchText && searchText.length > 0 && keywordSuggestions && keywordSuggestions.length > 0\r\n ? KeywordSuggestionsComponent({\r\n searchKeywordSuggestClass: searchKeywordSuggestClass,\r\n searchPageURL: searchPageURL,\r\n searchQsp: searchQsp,\r\n hitPrefix: this.hitPrefix,\r\n hitSuffix: this.hitSuffix,\r\n autoSuggestProps: this.props,\r\n searchText: searchText,\r\n suggestions: keywordSuggestions,\r\n telemetryContent: this.telemetryContent\r\n })\r\n : undefined,\r\n autosuggestProduct:\r\n searchText && searchText.length > 0 && productSuggestions && productSuggestions.length > 0\r\n ? ProductSuggestionsComponent({\r\n searchProductSuggestClass: searchProductSuggestClass,\r\n searchPageURL: searchPageURL,\r\n searchQsp: searchQsp,\r\n hitPrefix: this.hitPrefix,\r\n hitSuffix: this.hitSuffix,\r\n autoSuggestProps: this.props,\r\n searchText: searchText,\r\n suggestions: productSuggestions,\r\n telemetry: this.props.telemetry,\r\n moduleType: this.props.typeName,\r\n moduleId: this.props.id,\r\n telemetryContent: this.telemetryContent\r\n })\r\n : undefined,\r\n autosuggestCategory:\r\n searchText && searchText.length > 0 && categorySuggestions && categorySuggestions.length > 0\r\n ? CategorySuggestionsComponent({\r\n searchCategorySuggestClass: searchCategorySuggestClass,\r\n searchPageURL: searchPageURL,\r\n searchQsp: searchQsp,\r\n hitPrefix: this.hitPrefix,\r\n hitSuffix: this.hitSuffix,\r\n autoSuggestProps: this.props,\r\n searchText: searchText,\r\n suggestions: categorySuggestions,\r\n searchRefiners: searchRefiners,\r\n telemetryContent: this.telemetryContent\r\n })\r\n : undefined,\r\n callbacks: {\r\n handleCancelSearchChange: this._handleCancelSearchChange\r\n },\r\n isSearchFormExpanded: this.state.isSearchFormExpanded\r\n };\r\n\r\n return this.props.renderView(viewProps) as React.ReactElement;\r\n }\r\n\r\n // tslint:disable-next-line:no-any\r\n private _focusOutTarget = (e: any): void => {\r\n const { suggestions } = this.state;\r\n\r\n if (\r\n suggestions &&\r\n suggestions.AllSearchResults &&\r\n e.target.closest('.ms-search') === null\r\n ) {\r\n this._clearAutoSuggestState();\r\n }\r\n };\r\n\r\n private _keyup = (e: KeyboardEvent): void => {\r\n const { suggestions } = this.state;\r\n\r\n if (suggestions && suggestions.AllSearchResults && e.keyCode === KeyCodes.Escape) {\r\n this._clearAutoSuggestState();\r\n } else if(this.state.isSearchFormExpanded && e.keyCode === KeyCodes.Escape) {\r\n if(this.state.isSearchFormExpanded) {\r\n this.setState({ isSearchFormExpanded: false });\r\n }\r\n }\r\n\r\n if (!((this.formReference.current && this.formReference.current.contains(e.target as unknown as Node)) ||\r\n (this.autoSuggestResultDiv.current && this.autoSuggestResultDiv.current.contains(e.target as unknown as Node)))) {\r\n if (suggestions && suggestions.AllSearchResults) {\r\n this._clearAutoSuggestState();\r\n }\r\n\r\n if(this.state.isSearchFormExpanded) {\r\n this.setState({ isSearchFormExpanded: false });\r\n }\r\n }\r\n };\r\n\r\n private _clearAutoSuggestState = (): void => {\r\n const {\r\n context: { actionContext },\r\n data: { searchState }\r\n } = this.props;\r\n\r\n if (this.searchTextInput.current && this.searchTextInput.current.value.length > 0) {\r\n searchState.searchText = '';\r\n searchState.defaultBasicSearchUrl = '';\r\n searchState.searchQueryStringParameter = '';\r\n actionContext ? actionContext.update(createSearchStateInput(searchState), searchState) : null;\r\n this.searchTextInput.current.value = '';\r\n }\r\n\r\n this.setState({ searchText: '', suggestions: undefined, searchRefiners: undefined });\r\n };\r\n\r\n private _handleInputChange = (query: string): void => {\r\n if (!query || query.length < this.maxChars) {\r\n this.setState({ searchText: query });\r\n }\r\n\r\n if (this.cancellabelDebounce) {\r\n this.cancellabelDebounce.cancel();\r\n }\r\n\r\n const {\r\n telemetry,\r\n context,\r\n data: { searchState }\r\n } = this.props;\r\n\r\n if (context) {\r\n if (query && query.length > 0) {\r\n if (query.length > this.maxChars) {\r\n return;\r\n }\r\n\r\n this.cancellabelDebounce = debounce(() => {\r\n getSearchSuggestionsAction(\r\n new AutoSuggestInput(\r\n query,\r\n this.topResultsCount,\r\n this._getSuggestionType(this.inputSuggestionType),\r\n this.hitPrefix,\r\n this.hitSuffix\r\n ),\r\n context.actionContext\r\n )\r\n .then(results => {\r\n this._getSearchRefiners(query)\r\n .then(refiners => {\r\n this.setState({ suggestions: results, searchRefiners: refiners,\r\n autoSuggestAriaLabel: this._setAutoSuggestResultCount(results) });\r\n })\r\n .catch(error => {\r\n this.setState({ suggestions: results, searchRefiners: undefined,\r\n autoSuggestAriaLabel: this._setAutoSuggestResultCount(results) });\r\n telemetry.exception(error);\r\n telemetry.debug('Unable to get refiners results');\r\n });\r\n })\r\n .catch(error => {\r\n this.setState({ suggestions: undefined, searchRefiners: undefined,\r\n autoSuggestAriaLabel: this._setAutoSuggestResultCount() });\r\n telemetry.exception(error);\r\n telemetry.debug('Unable to get auto suggest results');\r\n });\r\n }, this.waitTime);\r\n\r\n setTimeout(() => {\r\n this.cancellabelDebounce();\r\n }, 0);\r\n\r\n searchState.searchText = query;\r\n } else {\r\n this.setState({ suggestions: undefined, searchRefiners: undefined });\r\n searchState.searchText = '';\r\n }\r\n context.actionContext.update(createSearchStateInput(searchState), searchState);\r\n }\r\n };\r\n\r\n private _getSuggestionType = (suggestionTypes?: ISuggestionTypeCriterionData[]): string => {\r\n if (suggestionTypes && suggestionTypes.length > 0) {\r\n const distinctSuggestionTypes: string[] = [];\r\n suggestionTypes && suggestionTypes.forEach((suggestionTypeItem, index) => {\r\n suggestionTypeItem.SuggestionType && distinctSuggestionTypes.push(suggestionTypeItem.SuggestionType.charAt(0).toUpperCase() + suggestionTypeItem.SuggestionType.slice(1));\r\n });\r\n return distinctSuggestionTypes.join(',');\r\n }\r\n return 'Keyword, Product, ScopedCategory';\r\n };\r\n\r\n private async _getSearchRefiners(searchText: string): Promise {\r\n const { actionContext: ctx } = this.props.context;\r\n return getProductSearchRefinersAsync(\r\n { callerContext: ctx },\r\n {\r\n SearchCondition: searchText,\r\n Context: {\r\n ChannelId: +ctx.requestContext.apiSettings.channelId,\r\n CatalogId: +ctx.requestContext.apiSettings.catalogId\r\n }\r\n }\r\n );\r\n }\r\n\r\n private _handleSubmit = (\r\n e: React.MouseEvent | React.KeyboardEvent | React.FormEvent\r\n ): void => {\r\n const {\r\n config: { disableSubmitSearch },\r\n context: {\r\n actionContext,\r\n app: {\r\n config: { searchQueryStringParameter }\r\n }\r\n }\r\n } = this.props;\r\n\r\n const query = this.searchTextInput.current && this.searchTextInput.current.value;\r\n e.preventDefault();\r\n\r\n if (!query || (query && query.length === 0) || disableSubmitSearch) {\r\n this.searchTextInput && this.searchTextInput.current && this.searchTextInput.current.focus();\r\n } else {\r\n const searchQsp = searchQueryStringParameter || 'q';\r\n const searchURL = this._appendQueryParams(getUrlSync('search', actionContext) || '', query, searchQsp);\r\n document.location.href = searchURL;\r\n }\r\n };\r\n\r\n private _handleCancelSearchChange = (): void => {\r\n const { isSearchFormExpanded, suggestions } = this.state;\r\n\r\n if (!isSearchFormExpanded) {\r\n this.setState({\r\n isSearchFormExpanded: true,\r\n searchText: '',\r\n isInitialState: false\r\n });\r\n } else {\r\n if (suggestions && suggestions.AllSearchResults) {\r\n this._clearAutoSuggestState();\r\n }\r\n\r\n this.setState({ isSearchFormExpanded: false });\r\n }\r\n };\r\n\r\n private _appendQueryParams = (route: string, query: string, qsp: string): string => {\r\n if (route && route.length > 0) {\r\n return query && query.length > 0 ? `${route}${route.indexOf('?') === -1 ? '?' : '&'}${qsp}=${query}` : route;\r\n }\r\n return '';\r\n };\r\n\r\n private _setAutoSuggestResultCount = (result?: Autosuggestions) => {\r\n if (this.autoSuggestResultScreenReaderDiv.current !== null) {\r\n const ariaLiveRegion = this.autoSuggestResultScreenReaderDiv.current;\r\n const suggestResultString = this.props.resources.autoSuggestFoundMessage;\r\n const emptyResultString = this.props.resources.noAutoSuggestionMessage;\r\n ariaLiveRegion.innerText = result && (result.AllSearchResults && result.AllSearchResults.length > 0) ? suggestResultString : emptyResultString;\r\n ariaLiveRegion.setAttribute('aria-live','assertive');\r\n return ariaLiveRegion.innerText;\r\n } else {\r\n return '';\r\n }\r\n };\r\n}\r\n\r\nexport default Search;\r\n","import { debounce } from 'lodash';\nimport { reaction } from 'mobx';\nimport { observer } from 'mobx-react';\nimport * as React from 'react';\n\ninterface IQuantityProps {\n min?: number;\n max: number;\n currentCount?: number;\n disabled?: boolean;\n incrementGlyphClass?:string;\n decrementGlyphClass?:string;\n decrementButtonAriaLabel?: string;\n incrementButtonAriaLabel?: string;\n inputQuantityAriaLabel?: string;\n id?: string;\n onChange?(newValue: number):void;\n}\n\ninterface IQuantityState {\n currentInput: number;\n}\n/**\n * Quantity Component - This component is used to add or remove quantity\n */\n@observer\nexport default class OrderTemplateQuantity extends React.PureComponent {\n public static defaultProps: Partial = {\n min: 1,\n decrementGlyphClass: 'fas fa-minus',\n incrementGlyphClass: 'fas fa-plus'\n };\n\n private inputRef: React.RefObject = React.createRef();\n\n constructor(props: IQuantityProps) {\n super(props);\n this.state = { currentInput: props.currentCount || 1 };\n this._handleChange = this._handleChange.bind(this);\n\n reaction(\n () => this.props.currentCount,\n () => {\n this.setState({ currentInput: this.props.currentCount || 1 });\n }\n );\n }\n\n public render(): JSX.Element {\n const glyphMinusClassName: string = `${this.props.decrementGlyphClass!} quantity__controls-glyph`;\n const glyphPlusClassName: string = `${this.props.incrementGlyphClass!} quantity__controls-glyph`;\n const disabled = this.props.currentCount === this.props.min;\n const incDisabled = this.props.currentCount === this.props.max;\n const currentValue = this.state.currentInput;\n let extraClass = '';\n if(disabled) {\n // The quantity has reached its boundaries (max or min)\n extraClass ='disabled';\n\n } else if(this.props.disabled) {\n // this.props.disabled shows if the state is not succeded yet\n extraClass = 'transition';\n }\n const getChangeHandler = (amount: number) => () => this._onIncrementalChange(amount);\n\n return (\n
    \n \n \n \n \n \n \n \n
    \n );\n }\n\n private _onIncrementalChange(amount: number): void {\n const updatedQuantity = this.state.currentInput + amount;\n\n if (updatedQuantity >= 1 && updatedQuantity <= this.props.max) {\n this.props.onChange && this.props.onChange(updatedQuantity);\n }\n }\n\n private _handleChange(e: React.ChangeEvent): void {\n const currentValue = parseInt((e.target.value), 10);\n const minValue = this.props.min === undefined ? 1 : this.props.min;\n const inputElement = this.inputRef && this.inputRef.current && this.inputRef.current instanceof HTMLInputElement && this.inputRef.current;\n\n if (currentValue > this.props.max) {\n this.setState(\n { currentInput: this.props.max },\n () => {\n debounce(\n () => {\n this.props.onChange && this.props.onChange(this.state.currentInput);\n },\n 200)();\n }\n );\n } else {\n this.setState(\n { currentInput: currentValue },\n () => {\n debounce(\n () => {\n if(!isNaN(this.state.currentInput) && !(this.state.currentInput < minValue)) {\n this.props.onChange && this.props.onChange(this.state.currentInput);\n\n if (inputElement) {\n inputElement.setAttribute('aria-valuenow', currentValue.toString());\n inputElement.setAttribute('value', currentValue.toString());\n }\n }\n },\n 200)();\n }\n );\n }\n }\n\n private _validateMin = (): void => {\n const minValue = this.props.min === undefined ? 1 : this.props.min;\n\n if (isNaN(this.state.currentInput) || (this.state.currentInput < minValue)) {\n this.props.onChange && this.props.onChange(minValue);\n } else {\n this.props.onChange && this.props.onChange(this.state.currentInput);\n }\n }\n}","import { getFallbackImageUrl } from '@msdyn365-commerce-modules/retail-actions';\nimport { Button, INodeProps } from '@msdyn365-commerce-modules/utilities';\nimport { PriceComponent } from '@msdyn365-commerce/components';\nimport { ICoreContext, IImageSettings, Image, ITelemetry } from '@msdyn365-commerce/core';\nimport { ProductListLine } from '@msdyn365-commerce/retail-proxy';\nimport { ProductPrice, SimpleProduct } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\nimport React, { useState } from 'react';\nimport { IOrderTemplateLineViewModel } from '../order-template';\nimport OrderTemplateQuantity from './common/order-template-quantity';\n\nexport interface IOrderTemplateLineProps extends ProductListLine {\n orderTemplateLine: IOrderTemplateLineViewModel;\n productListLine: ProductListLine;\n price?: ProductPrice;\n context: ICoreContext;\n productUrl: string;\n imageSettings?: IImageSettings;\n telemetry: ITelemetry;\n moduleId: string;\n moduleTypeName: string;\n quantity: number;\n handlers: {\n onAddToBag(product: SimpleProduct, quantity: number, itemKey: string): void;\n onRemoveItem(line: IOrderTemplateLineViewModel): void | undefined;\n onChangeQuantity(orderTemplateLineId: string, quantity: number, props?: IOrderTemplateLineProps): void;\n onSelect(line: IOrderTemplateLineViewModel, isChecked: boolean): void;\n };\n resources: {\n productDimensionTypeColor: string;\n productDimensionTypeSize: string;\n productDimensionTypeStyle: string;\n originalPriceText: string;\n currentPriceText: string;\n freePriceText: string;\n inputQuantityAriaLabel: string;\n removeFromOrderTemplateLinesText: string;\n addToBagButtonText: string;\n deleteButtonText: string;\n };\n index: number;\n isMobile: boolean;\n productQuantityView?: React.ReactNode;\n addToBagButton?: React.ReactNode;\n removeButton?: React.ReactNode;\n toggleDetailsDisplayed(props: IOrderTemplateLineProps): void;\n}\n\nexport interface IOrderTemplateLineViewProps {\n key?: string;\n productImage: React.ReactNode;\n productPrice?: React.ReactNode;\n addToBagButton?: React.ReactNode;\n removeButton?: React.ReactNode;\n productName?: string;\n productNumber?: React.ReactNode;\n productInfo?: React.ReactNode;\n productLabel?: React.ReactNode;\n productUnitOfMeasure?: React.ReactNode;\n productQuantity?: number;\n productQuantityView?: React.ReactNode;\n productListId?: string;\n selectLine?: React.ReactNode;\n popUp?: JSX.Element;\n isMobile?: boolean;\n}\n\ninterface IEventHandlerFactory {\n getAddToBag(): (event: React.MouseEvent) => void;\n getRemoveItem(): (event: React.MouseEvent) => void;\n}\n\nconst OrderTemplateLineActions = (props: IOrderTemplateLineProps): IEventHandlerFactory => {\n const { orderTemplateLine, productListLine, quantity, handlers } = props;\n const { LineId } = productListLine;\n const { onAddToBag, onRemoveItem } = handlers;\n\n return {\n getAddToBag: () => (event: React.MouseEvent) => LineId && orderTemplateLine.fullProduct && onAddToBag(orderTemplateLine.fullProduct.ProductDetails, quantity, LineId),\n getRemoveItem: () => (event: React.MouseEvent) => LineId && onRemoveItem(props.orderTemplateLine)\n };\n};\n\ninterface IPopupProps extends IOrderTemplateLineProps {\n addButtonClassName: string;\n removeButtonClassName: string;\n}\n\nconst PopUp = (props: IPopupProps): JSX.Element | null => {\n const { addToBagButtonText, removeFromOrderTemplateLinesText } = props.resources;\n const [ showMobile, setShowMobile ] = useState(false);\n const componentClassName = 'ms-table';\n\n const getViewHandler = () => (event: React.MouseEvent) => {\n props.toggleDetailsDisplayed(props);\n };\n\n const toggle = (event: React.MouseEvent) => {\n setShowMobile(!showMobile);\n };\n const viewTitle = 'View product details';\n\n return (\n
    \n {\n {getActionButton(true, props.removeButtonClassName, props.isMobile ? removeFromOrderTemplateLinesText : '', OrderTemplateLineActions(props).getRemoveItem())}\n {getActionButton(true, props.addButtonClassName, props.isMobile ? addToBagButtonText : '', OrderTemplateLineActions(props).getAddToBag())}\n
    }\n
    \n );\n};\n\nconst getActionButton = (isMobile: boolean, className: string, buttonText: string, clickHandler: (event: React.MouseEvent) => void): React.ReactNode => (\n {buttonText}\n \n);\n\nexport const OrderTemplateLineView = (input: IOrderTemplateLineProps): IOrderTemplateLineViewProps | null => {\n const { orderTemplateLine, productListLine, price, context, imageSettings, quantity, resources, isMobile } = input;\n const product = orderTemplateLine.fullProduct;\n const { LineId, UnitOfMeasure } = productListLine;\n const { removeFromOrderTemplateLinesText, addToBagButtonText } = resources;\n if (!product) {\n return null;\n }\n\n const onSelectLine = (event: React.ChangeEvent) => {\n orderTemplateLine.isChecked = !orderTemplateLine.isChecked;\n\n input.handlers.onSelect(orderTemplateLine, event.target.checked);\n };\n const { ItemId, Name, PrimaryImageUrl } = product.ProductDetails;\n const fallbackImage = getFallbackImageUrl(ItemId, context.actionContext.requestContext.apiSettings);\n const addButtonClassName = input.isMobile ? 'ms-table__row-links-add' : 'ms-order-template-table-line__product-add-button';\n const removeButtonClassName = input.isMobile ? 'ms-table__row-links-delete' : 'ms-order-template-table-line__product-remove-button';\n\n return {\n isMobile: isMobile,\n selectLine: (\n \n ),\n key: LineId!,\n productImage: PrimaryImageUrl && Name && (\n _renderProductImage('ms-order-template-table-line__product-image', context, product. ProductDetails.Name!, PrimaryImageUrl, fallbackImage, imageSettings)\n ),\n productInfo: renderProductInfo(input),\n productPrice: price && _renderPrice(input),\n productNumber: product &&
    {ItemId}
    ,\n productUnitOfMeasure: price ? (\n
    {UnitOfMeasure || price.UnitOfMeasure}
    \n ) : (\n undefined\n ),\n productListId: LineId!,\n removeButton: getActionButton(true, removeButtonClassName, input.isMobile ? removeFromOrderTemplateLinesText : '', OrderTemplateLineActions(input).getRemoveItem()),\n productQuantityView:
    {_generateQuantity(input, LineId!)}
    ,\n productQuantity: quantity,\n addToBagButton: getActionButton(true, addButtonClassName, input.isMobile ? addToBagButtonText : '', OrderTemplateLineActions(input).getAddToBag()),\n popUp: (\n \n )\n };\n};\n\nexport const OrderTemplateMobileLineView = (input: IOrderTemplateLineProps): IOrderTemplateLineViewProps | undefined => {\n const { orderTemplateLine, productListLine, price, context, imageSettings } = input;\n const product = orderTemplateLine.fullProduct;\n const { LineId, UnitOfMeasure } = productListLine;\n if (!product) {\n return;\n }\n const { ItemId, Name, PrimaryImageUrl } = product.ProductDetails;\n const fallbackImage = getFallbackImageUrl(ItemId, context.actionContext.requestContext.apiSettings);\n\n return {\n productImage: PrimaryImageUrl && Name && (\n _renderProductImage('thumbnail', context, product. ProductDetails.Name!, PrimaryImageUrl, fallbackImage, imageSettings)\n ),\n productInfo: renderProductInfo(input),\n productPrice: price && _renderPrice(input),\n productNumber: ItemId,\n productUnitOfMeasure: UnitOfMeasure || price?.UnitOfMeasure,\n productQuantityView: _generateQuantity(input, LineId!)\n };\n};\n\nexport interface IOrderTemplateProductQuantityViewProps {\n ContainerProps: INodeProps;\n input: React.ReactNode;\n}\n\nconst _generateQuantity = (props: IOrderTemplateLineProps, itemKey: string): React.ReactNode => {\n const { handlers, resources, quantity } = props;\n const { onChangeQuantity } = handlers;\n const onChange = (newValue: number) => {\n if (onChangeQuantity) {\n onChangeQuantity(itemKey, newValue, props);\n }\n };\n return (\n \n );\n};\n\nexport const _renderProductImage = (\n className: string,\n context: ICoreContext,\n heading: string,\n image?: string,\n fallbackImage?: string,\n imageSettings?: IImageSettings\n): JSX.Element | null => {\n const defaultImageSettings: IImageSettings = {\n viewports: {\n xs: { q: `w=64&h=64&m=6`, w: 0, h: 0 },\n lg: { q: `w=64&h=64&m=6`, w: 0, h: 0 },\n xl: { q: `w=64&h=64&m=6`, w: 0, h: 0 }\n },\n lazyload: true\n };\n\n if (image) {\n return (\n \n );\n }\n return null;\n};\n\nconst _renderPrice = (props: IOrderTemplateLineProps): JSX.Element | null => {\n const { price, context, moduleId, moduleTypeName, resources } = props;\n\n if (price) {\n return (\n \n );\n }\n return null;\n};\n\nconst _renderProductDimensions = (props: IOrderTemplateLineProps): (string | undefined)[] => {\n const { orderTemplateLine } = props;\n\n if (!orderTemplateLine.fullProduct || !orderTemplateLine.fullProduct.ProductDetails.Dimensions) {\n return [];\n }\n\n return orderTemplateLine.fullProduct.ProductDetails.Dimensions.map((dimension) => {\n if (!dimension.DimensionValue || !dimension.DimensionValue.Value) {\n return undefined;\n }\n\n return dimension.DimensionValue.Value;\n });\n};\n\nexport const renderProductInfo = (props: IOrderTemplateLineProps): React.ReactNode | undefined => {\n const { orderTemplateLine, productUrl } = props;\n const name = orderTemplateLine.fullProduct?.ProductDetails.Name;\n\n const dimensions = _renderProductDimensions(props);\n if (!orderTemplateLine.fullProduct || !orderTemplateLine.fullProduct.ProductDetails.Dimensions) {\n return [];\n }\n\n const productName = productUrl ? (\n \n {name}\n \n ) : (\n
    {name}
    \n );\n\n return (\n
    \n
    {productName}
    \n
    \n {dimensions.length && dimensions.join(', ')}\n
    \n
    \n );\n};\n","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\nimport classnames from 'classnames';\nimport * as React from 'react';\nimport { orderTemplateLinesStatus } from '../order-template';\n\nexport interface IOrderTemplateLinesStatusMessageProps {\n className?: string;\n errorType: orderTemplateLinesStatus;\n text?: string;\n}\n\nexport const OrderTemplateLinesStatusMessage: React.FC = ({className, errorType, text}) => {\n switch(errorType) {\n case 'EMPTY':\n return (\n

    { text }

    \n );\n case 'FAILED':\n return (\n

    { text }

    \n );\n case 'LOADING':\n default:\n return (\n

    { text }

    \n );\n }\n};\n","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\nimport * as React from 'react';\nimport { IOrderTemplateLineViewModel } from '../order-template';\n\nexport interface IOrderTemplateTableHeadingProps {\n productNumber: string;\n productName: string;\n productUnitPrice: string;\n productUOM: string;\n productQuantity: string;\n productActions: string;\n lines: IOrderTemplateLineViewModel[];\n isMobile: boolean;\n clickHandler(isChecked: boolean): void;\n}\n\nexport interface IOrderTemplateTableShortHeading {\n productNumber: string;\n productActions: string;\n}\n\n/**\n * Order Template's table heading\n */\nexport class OrderTemplateTableHeading extends React.PureComponent {\n public state: {\n isChecked: boolean;\n } = {\n isChecked: false\n };\n\n private componentClassName: string = 'ms-table';\n\n public componentDidUpdate(prevProps: IOrderTemplateTableHeadingProps): void {\n this.setState({\n isChecked: !this.props.lines.filter(line => !line.isChecked).length\n });\n }\n\n public getOnChange = () => (event: React.ChangeEvent) => {\n this.setState({\n isChecked: !this.state.isChecked\n }, () => {// tslint:disable-line:align\n this.props.clickHandler(this.state.isChecked);\n });\n };\n\n public render(): JSX.Element {\n return (\n \n \n \n \n \n \n {this.props.productNumber}\n {!this.props.isMobile ? {this.props.productName} : null}\n {!this.props.isMobile ? {this.props.productUnitPrice} : null}\n {!this.props.isMobile ? {this.props.productUOM} : null}\n {!this.props.isMobile ? {this.props.productQuantity} : null}\n {!this.props.isMobile ? {this.props.productActions} : }\n \n \n );\n }\n}","\nimport { OrderTemplate } from '@msdyn365-commerce-modules/retail-actions';\nimport { Button, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\nimport { AddOrderTemplateToCartComponent, ILinesAddedToCartDialogResources, IOrderTemplateNameDialogResources, RenameOrderTemplateComponent } from '@msdyn365-commerce/components';\nimport { IComponentProps, ICoreContext } from '@msdyn365-commerce/core';\nimport { ProductList } from '@msdyn365-commerce/retail-proxy';\nimport * as React from 'react';\n\nexport interface IOrderTemplateActionsData {\n orderTemplate: OrderTemplate;\n}\n\nexport interface IOrderTemplateActionsProps extends IComponentProps {\n context: ICoreContext;\n telemetryContent?: ITelemetryContent;\n handlers: {\n onRemoveTemplate(orderTemplateId: string): void;\n onRenameTemplate(orderTemplate: ProductList): Promise;\n };\n renameOrderTemplateDialogStrings: IOrderTemplateNameDialogResources;\n resources: {\n addTemplateToBagButtonText: string;\n renameTemplateButtonText: string;\n deleteTemplateButtonText: string;\n closeWindowButtonText: string;\n addToCartFailureMessage: string;\n addToCartSuccessMessage: string;\n addToCartProcessMessage: string;\n linesAddedToCartDialogResources: ILinesAddedToCartDialogResources;\n };\n}\n\nexport interface IOrderTemplateActionsViewProps {\n addTemplateToBag: React.ReactNode;\n renameTemplate?: React.ReactNode;\n removeTemplate?: React.ReactNode;\n}\n\nexport const OrderTemplateActionsView = (props: IOrderTemplateActionsProps): IOrderTemplateActionsViewProps => {\n const { resources } = props;\n const { deleteTemplateButtonText } = resources;\n\n const removeOrderAction = (event: React.MouseEvent) => {\n return _removeOrderTemplate(props);\n };\n\n return {\n addTemplateToBag: _getOrderTemplateAddToCartDialog(props),\n renameTemplate: _getOrderTemplateRenameControl(props),\n removeTemplate: (\n \n )\n };\n};\n\nconst _removeOrderTemplate = (props: IOrderTemplateActionsProps): void => {\n const { data: { orderTemplate }, handlers } = props;\n const { onRemoveTemplate } = handlers;\n\n if (onRemoveTemplate) {\n onRemoveTemplate(orderTemplate.productList.Id);\n }\n};\n\nconst _getOrderTemplateAddToCartDialog = (props: IOrderTemplateActionsProps): React.ReactNode => {\n const { data: { orderTemplate }, typeName, id, context, telemetryContent, resources } = props;\n const {\n addTemplateToBagButtonText,\n closeWindowButtonText,\n addToCartFailureMessage,\n addToCartSuccessMessage,\n addToCartProcessMessage,\n linesAddedToCartDialogResources\n } = resources;\n\n const dialogStrings = {\n closeWindowButtonText: closeWindowButtonText,\n addToCartFailureMessage: addToCartFailureMessage,\n addToCartSuccessMessage: addToCartSuccessMessage,\n addToCartProcessMessage: addToCartProcessMessage,\n linesAddedToCartDialogResources: linesAddedToCartDialogResources\n };\n\n return (\n \n );\n};\n\nconst _getOrderTemplateRenameControl = (props: IOrderTemplateActionsProps): React.ReactNode => {\n const { renameOrderTemplateDialogStrings, resources, context, handlers } = props;\n return (\n \n );\n};","import { Button } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\nimport { AddLineToTemplate } from '.';\nimport { IOrderTemplateLineViewModel } from '../order-template';\nimport { IOrderTemplateData } from '../order-template.data';\nimport { IOrderTemplateProps } from '../order-template.props.autogenerated';\n\ninterface IOrderTemplateBulkActionsProps extends IOrderTemplateProps {\n orderTemplateId: string;\n selectedLines: IOrderTemplateLineViewModel[];\n isMinifiedView: boolean;\n onAddSelectionToBag(): void;\n onRemoveSelection(): void;\n}\n\ninterface IOrderTemplateBulkActionsState {\n isAddDisabled: boolean;\n isRemoveDisabled: boolean;\n}\n\n/**\n * Bulk Order Template line actions\n */\nexport class OrderTemplateBulkActions extends React.PureComponent {\n\n public state: IOrderTemplateBulkActionsState = {\n isAddDisabled: true,\n isRemoveDisabled: true\n };\n\n public componentDidUpdate(prevProps: IOrderTemplateBulkActionsProps): void {\n if (prevProps.selectedLines.length !== this.props.selectedLines.length) {\n this.setState({\n isAddDisabled: !this.props.selectedLines.length,\n isRemoveDisabled: !this.props.selectedLines.length\n });\n }\n }\n\n public render(): JSX.Element {\n const { addLineModalLinkText,\n searchButtonAriaLabel,\n searchInputAriaLabel,\n searchModalPlaceholderText,\n selectProductButtonText,\n addItemToTemplateText,\n addLineProductUnitPricePrefix,\n backButtonText,\n decrementButtonAriaLabel,\n incrementButtonAriaLabel,\n quantitySelectLabel,\n addLineProductUnitOfMeasurePrefix,\n notFoundSearchErrorNotice,\n notFoundSearchErrorRedediation,\n searchErrorMessage,\n productDimensionTypeColor,\n productDimensionTypeConfiguration,\n productDimensionTypeSize,\n productDimensionTypeStyle,\n addSelectedToBagButtonText,\n removeSelectedToBagButtonText,\n searchResultsCountVerbage,\n searchResultsCountSubject,\n addToTemplateConfirmation,\n totalPriceLabel,\n progressNotificationText,\n addToTemplateDuplicateError,\n addToTemplateGenericError,\n dimensionMissingError,\n } = this.props.resources;\n const addLineProps = {\n context: this.props.context,\n resources: {\n addLineModalLinkText,\n searchButtonAriaLabel,\n searchInputAriaLabel,\n searchModalPlaceholderText,\n selectProductButtonText,\n addItemToTemplateText,\n addLineProductUnitPricePrefix,\n backButtonText,\n decrementButtonAriaLabel,\n incrementButtonAriaLabel,\n quantitySelectLabel,\n addLineProductUnitOfMeasurePrefix,\n notFoundSearchErrorNotice,\n notFoundSearchErrorRedediation,\n searchErrorMessage,\n productDimensionTypeColor,\n productDimensionTypeConfiguration,\n productDimensionTypeSize,\n productDimensionTypeStyle,\n searchResultsCountVerbage,\n searchResultsCountSubject,\n addToTemplateConfirmation,\n totalPriceLabel,\n progressNotificationText,\n addToTemplateDuplicateError,\n addToTemplateGenericError,\n dimensionMissingError\n },\n imageSettings: this.props.config.imageSettings,\n orderTemplateId: this.props.orderTemplateId\n };\n\n return (\n <>\n \n \n {!this.props.isMinifiedView && addSelectedToBagButtonText}\n \n \n {!this.props.isMinifiedView && removeSelectedToBagButtonText}\n \n \n );\n }\n\n private addHandler = (event: React.MouseEvent) => {\n this.setState({\n isAddDisabled: true\n });\n\n this.props.onAddSelectionToBag();\n\n this.setState({\n isAddDisabled: false\n });\n };\n\n private removeHandler = (event: React.MouseEvent) => {\n this.setState({\n isRemoveDisabled: true\n });\n\n this.props.onRemoveSelection();\n };\n}","import {\n addItemToOrderTemplate,\n AddItemToOrderTemplateInput,\n getDimensionsForSelectedVariant,\n GetDimensionsForSelectedVariantInput,\n getSelectedVariant,\n SelectedVariantInput\n} from '@msdyn365-commerce-modules/retail-actions';\nimport { Button, Modal, ModalBody, ModalHeader } from '@msdyn365-commerce-modules/utilities';\nimport { ProductDimensionFull } from '@msdyn365-commerce/commerce-entities';\nimport { ICoreContext, IImageSettings } from '@msdyn365-commerce/core';\nimport { ProductListLine, ProductSearchCriteria, ProductSearchResult } from '@msdyn365-commerce/retail-proxy';\nimport { searchByCriteriaAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/ProductsDataActions.g';\nimport { SimpleProduct } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\nimport { get } from 'lodash';\nimport { computed } from 'mobx';\nimport React from 'react';\nimport { IProductConfigurationState, NotFoundComponent, ProductConfiguration, ProductList } from './';\n\nimport Spinner from './spinner';\n\nexport interface IAddLineToTemplateProps {\n context: ICoreContext;\n resources: IAddLineToTemplateResources;\n orderTemplateId: string;\n imageSettings?: IImageSettings;\n}\n\nexport interface IAddLineToTemplateResources {\n addLineModalLinkText: string;\n searchButtonAriaLabel: string;\n searchInputAriaLabel: string;\n searchModalPlaceholderText: string;\n selectProductButtonText: string;\n addItemToTemplateText: string;\n addLineProductUnitPricePrefix: string;\n backButtonText: string;\n decrementButtonAriaLabel: string;\n incrementButtonAriaLabel: string;\n quantitySelectLabel: string;\n addLineProductUnitOfMeasurePrefix: string;\n notFoundSearchErrorNotice: string;\n notFoundSearchErrorRedediation: string;\n searchErrorMessage: string;\n productDimensionTypeColor: string;\n productDimensionTypeConfiguration: string;\n productDimensionTypeSize: string;\n productDimensionTypeStyle: string;\n searchResultsCountVerbage: string;\n searchResultsCountSubject: string;\n addToTemplateConfirmation: string;\n totalPriceLabel: string;\n progressNotificationText: string;\n addToTemplateDuplicateError: string;\n addToTemplateGenericError: string;\n dimensionMissingError: string;\n}\n\nenum CONTENT {\n Search,\n ProductList,\n ProductConfiguration,\n NotFound,\n Error,\n Loading\n}\n\ninterface IAddLineToTemplateState {\n isOpen: boolean;\n query: string;\n products: ProductSearchResult[];\n content: number;\n selectedProduct: SimpleProduct | null;\n selectedProductDimensions?: ProductDimensionFull[];\n selectedQuantity?: number;\n reloadPage?: boolean;\n}\n\n/**\n * Add Lines to order template\n */\nexport class AddLineToTemplate extends React.Component {\n public state: IAddLineToTemplateState = {\n isOpen: false,\n query: '',\n products: [],\n content: CONTENT.Search,\n selectedProduct: null,\n };\n public defaultImageSettings: IImageSettings = {\n viewports: {\n xs: { q: `w=64&h=64&m=6`, w: 0, h: 0 },\n lg: { q: `w=64&h=64&m=6`, w: 0, h: 0 },\n xl: { q: `w=64&h=64&m=6`, w: 0, h: 0 }\n },\n lazyload: true\n };\n public searchTextInput: React.RefObject = React.createRef();// @TODO public/private\n\n constructor(props: IAddLineToTemplateProps) {\n super(props);\n }\n\n public onComponentDidMount(): void {\n this.searchTextInput.current?.focus();\n }\n\n public onComponentDidUpdate(): void {\n this.searchTextInput.current?.focus();\n }\n\n // @ts-ignore\n @computed get showBackArrow(): boolean {\n return this.state.content === CONTENT.ProductConfiguration;\n }\n\n public render(): JSX.Element {\n const {\n resources: { addLineModalLinkText }\n } = this.props;\n\n const modalProps = {\n ...this.props,\n className: 'msc-add-line-to-template',\n toggle: this._toggleModalHandler,\n isOpen: this.state.isOpen\n };\n\n return (\n <>\n \n \n {this.showBackArrow && }{addLineModalLinkText}\n \n {this._renderContent()}\n \n \n \n );\n }\n\n private _renderSearchForm = () => {\n const {\n resources: { searchButtonAriaLabel, searchInputAriaLabel, searchModalPlaceholderText }\n } = this.props;\n\n return (\n \n \n \n \n );\n };\n\n private _onSearchSubmit = (event: React.FormEvent): void => {\n event.preventDefault();\n\n const query = get(this, 'searchTextInput.current.value', null);\n\n if (!query) {\n return;\n }\n\n this.setState({\n content: CONTENT.Loading\n });\n\n this._getSearchResults(query)\n .then(result => {\n if (result.length === 0) {\n this.setState({\n products: result,\n content: CONTENT.NotFound,\n });\n } else {\n this.setState({\n products: result,\n content: CONTENT.ProductList,\n });\n }\n })\n .catch(error => {\n this.setState({\n content: CONTENT.Error,\n });\n });\n };\n\n private _onQuantityChangeHandler = (event: React.ChangeEvent) => {\n this.setState({\n selectedQuantity: +event.target.value\n });\n }\n\n private _onSelectItem = async (product: ProductSearchResult): Promise => {\n const {\n actionContext,\n request: {\n apiSettings: { channelId }\n }\n } = this.props.context;\n const varianteInput = new SelectedVariantInput(product.RecordId, channelId, []);\n const productVariant = await getSelectedVariant(varianteInput, actionContext);\n\n if (!productVariant) {\n this.props.context.telemetry.error('Error retrieving product variant');\n return Promise.resolve([]);\n }\n\n const dimensions = await this._getProductDimensions(product as SimpleProduct);\n\n this.setState({\n selectedProductDimensions: dimensions,\n content: CONTENT.ProductConfiguration,\n selectedProduct: productVariant\n });\n\n return dimensions;\n };\n\n private _onInputChange = (event: React.ChangeEvent): void => {\n this.setState({\n query: event.target.value\n });\n };\n\n private _onBackButtonClickHandler = (): void => {\n this.setState({\n content: CONTENT.ProductList\n });\n }\n\n private _highlightSearchTerm = (name: string) => {\n const parsedName = name && unescape(name.replace(new RegExp(this.state.query, 'i'), '$&'));\n // tslint:disable-next-line:react-no-dangerous-html\n return
    ;\n };\n\n private _resultCountText = (): string => {\n return this.props.resources.searchResultsCountVerbage\n .replace('{count}', this.state.products.length.toString())\n .replace('{subject}', `${this.props.resources.searchResultsCountSubject}${(this.state.products.length > 1 ? 's' : '')}`);\n }\n\n private _renderContent(): React.ReactNode | null {\n switch (this.state.content) {\n case CONTENT.ProductConfiguration:\n const { selectedProduct, selectedProductDimensions } = this.state;\n const viewProps = {\n ...this.props,\n imageSettings: this.props.imageSettings || this.defaultImageSettings,\n product: selectedProduct!,\n dimensions: selectedProductDimensions!,\n addToTemplateHandler: this._addItemToTemplateHandler,\n onQuantityChangeHandler: this._onQuantityChangeHandler,\n highlightSearchTerm: this._highlightSearchTerm,\n searchForm: this._renderSearchForm()\n };\n\n return ;\n\n case CONTENT.ProductList:\n const productProps = {\n ...this.props,\n imageSettings: this.props.imageSettings || this.defaultImageSettings,\n clickHandler: this._onSelectItem,\n products: this.state.products,\n highlightSearchTerm: this._highlightSearchTerm,\n searchForm: this._renderSearchForm(),\n renderResultCountText: this._resultCountText\n };\n\n return (\n \n \n \n );\n\n case CONTENT.Loading:\n return (\n \n {this._renderSearchForm()}\n \n \n );\n\n case CONTENT.NotFound:\n const { notFoundSearchErrorNotice, notFoundSearchErrorRedediation } = this.props.resources;\n\n return (\n \n

    {this._resultCountText()}

    \n {this._renderSearchForm()}\n \n
    \n );\n\n case CONTENT.Error:\n return (\n \n {this._renderSearchForm()}\n
    {this.props.resources.searchErrorMessage}
    \n
    \n );\n\n default:\n return (\n \n {this._renderSearchForm()}\n \n );\n }\n }\n\n private _addItemToTemplateHandler = async (config: IProductConfigurationState): Promise => {\n const { orderTemplateId, context: { actionContext } } = this.props;\n const input = new AddItemToOrderTemplateInput(\n orderTemplateId,\n config.product.RecordId,\n config.quantity,\n config.product.DefaultUnitOfMeasure || 'ea'\n );\n\n const result = await addItemToOrderTemplate(input, actionContext);\n\n this.setState({\n reloadPage: true\n });\n\n return result;\n }\n\n private _getSearchResults(searchText: string): Promise {\n const {\n context: {\n actionContext,\n request: {\n apiSettings: { channelId, catalogId }\n }\n }\n } = this.props;\n const searchCriteriaInput: ProductSearchCriteria = {};\n\n searchCriteriaInput.Context = {\n ChannelId: channelId,\n CatalogId: catalogId\n };\n searchCriteriaInput.IncludeAttributes = true;\n searchCriteriaInput.SearchCondition = searchText;\n\n return searchByCriteriaAsync({ callerContext: actionContext }, searchCriteriaInput);\n }\n\n private async _getProductDimensions(product: SimpleProduct): Promise {\n const {\n context: {\n actionContext,\n request: {\n apiSettings: { channelId }\n }\n }\n } = this.props;\n const id = product.MasterProductId ? product.MasterProductId : product.RecordId;\n\n return getDimensionsForSelectedVariant(\n new GetDimensionsForSelectedVariantInput(id, channelId, []),\n actionContext\n );\n }\n\n private _toggleModalHandler = () => {\n this.setState({\n isOpen: !this.state.isOpen,\n content: CONTENT.Search\n });\n\n if (this.state.reloadPage) {\n window.location.reload();\n this.setState({\n reloadPage: false\n });\n }\n\n };\n}\n","import * as React from 'react';\n\nexport default (props: { className: string; msg?: string }) => (\n <>\n
    \n {props?.msg &&
    {props?.msg}
    }\n \n);\n","/**\n * Copyright (c) 2018 Microsoft Corporation\n */\nimport { ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\ntype IDropdownState = {\n /**\n * @friendlyName selectedIndex\n * @description selected index\n */\n selectedIndex: string;\n};\n\nexport interface IDropdownProps {\n dropdownId: number;\n dropdownName: string;\n dropdownList: IDropdownItemProps[];\n telemetryContent?: ITelemetryContent;\n onChange?(selection: IDropdownOnSelection): void;\n}\n\nexport interface IDropdownItemProps {\n value: string;\n id: number;\n}\n\nexport interface IDropdownOnSelection {\n dropdownId: number;\n selectId: string;\n selectedValue: string;\n}\n\n/**\n *\n * DropDown component\n * @extends {React.PureComponent}\n */\nexport class Dropdown extends React.PureComponent {\n private selectMenu: React.RefObject = React.createRef();\n\n constructor(props: IDropdownProps, state: IDropdownState) {\n super(props);\n this.state = {\n selectedIndex: ''\n };\n }\n\n public componentDidMount(): void {\n if (this.selectMenu.current) {\n this.selectMenu.current.selectedIndex = 0;\n }\n }\n\n public render(): JSX.Element {\n const {dropdownId, dropdownList, dropdownName } = this.props;\n\n return (\n \n {dropdownList.map((item: IDropdownItemProps) => (item &&\n \n {item.value}\n \n ))}\n \n );\n }\n\n private _onChanged = (event: React.ChangeEvent): void => {\n this.setState({selectedIndex: event.target.value});\n\n if (this.props.onChange) {\n this.props.onChange({\n dropdownId: this.props.dropdownId,\n selectId: event.target.value,\n selectedValue: event.target.innerText\n });\n }\n };\n}","import * as React from 'react';\n\nexport const NotFoundComponent = (props: {error: string; msg: string}) => (\n <>\n
    \n
    {props.error}
    \n
    {props.msg}
    \n \n);\n","import {\n getDimensionsForSelectedVariant,\n GetDimensionsForSelectedVariantInput,\n getFallbackImageUrl,\n getPriceForSelectedVariant,\n getProductAvailabilitiesForSelectedVariant,\n getSelectedVariant,\n IProductInventoryInformation,\n PriceForSelectedVariantInput,\n ProductAvailabilitiesForSelectedVariantInput,\n SelectedVariantInput\n } from '@msdyn365-commerce-modules/retail-actions';\nimport { Alert, Button, ITelemetryContent, ModalBody, ModalFooter } from '@msdyn365-commerce-modules/utilities';\nimport { ProductDimensionFull } from '@msdyn365-commerce/commerce-entities';\nimport { IImageSettings, Image } from '@msdyn365-commerce/core';\nimport { ProductDimensionValue, ProductListLine } from '@msdyn365-commerce/retail-proxy';\nimport { SimpleProduct } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\nimport classnames from 'classnames';\nimport React from 'react';\nimport { Dropdown, IAddLineToTemplateProps, IAddLineToTemplateResources, IDropdownItemProps, IDropdownOnSelection } from '.';\nimport OrderTemplateQuantity from '../common/order-template-quantity';\n\nexport interface IProductCnnfigurationProps extends IAddLineToTemplateProps {\n product: SimpleProduct;\n dimensions: ProductDimensionFull[];\n imageSettings: IImageSettings;\n telemetryContent?: ITelemetryContent;\n searchForm: React.ReactNode;\n addToTemplateHandler(params: IProductConfigurationState): Promise;\n highlightSearchTerm(name: string): React.ReactNode;\n}\n\nexport interface IProductConfigurationState {\n quantity: number;\n unitPrice: number;\n totalPrice: number;\n product: SimpleProduct;\n dimensions: ProductDimensionFull[];\n selectedDimensions: {};\n productAvailableQuantity?: IProductInventoryInformation;\n buttonDisabled: boolean;\n showAddConfirmation: boolean;\n errorMessage?: string;\n isBusy: boolean;\n errors: {dimension?: string[]; add?: string};\n}\n\n/**\n * Configure selected product for addition to order template\n */\nexport class ProductConfiguration extends React.Component {\n private selectedDimensions: {} = {};\n\n constructor(props: IProductCnnfigurationProps) {\n super(props);\n\n this.state = {\n quantity: 1,\n unitPrice: props.product.Price,\n totalPrice: props.product.Price,\n product: props.product,\n dimensions: props.dimensions.sort((a, b) => a.DimensionTypeValue - b.DimensionTypeValue),\n selectedDimensions: {},\n buttonDisabled: false,\n showAddConfirmation: false,\n } as IProductConfigurationState;\n }\n\n public render(): JSX.Element {\n const {\n context: {\n actionContext: {\n requestContext: { apiSettings }\n },\n request: { gridSettings }\n },\n resources: {\n addItemToTemplateText,\n addLineProductUnitPricePrefix,\n decrementButtonAriaLabel,\n incrementButtonAriaLabel,\n quantitySelectLabel,\n addLineProductUnitOfMeasurePrefix,\n totalPriceLabel\n },\n imageSettings,\n highlightSearchTerm\n } = this.props;\n const { buttonDisabled, product, quantity, unitPrice, totalPrice, showAddConfirmation, errors } = this.state;\n\n return (\n <>\n \n {this.props.searchForm}\n
    \n
    \n
    \n \n
    \n
    {product?.ItemId}
    \n {highlightSearchTerm(product?.Name || '')}\n
    {addLineProductUnitPricePrefix} {this._formatPrice(unitPrice)}
    \n
    {addLineProductUnitOfMeasurePrefix} {product?.DefaultUnitOfMeasure}
    \n
    \n
    \n
    \n {this._getDimensionsNodes()}\n
    \n
    \n
    \n
    {quantitySelectLabel}
    \n \n
    \n
    \n
    {totalPriceLabel} {this._formatPrice(totalPrice)}
    \n
    \n \n {showAddConfirmation &&
    }\n {errors?.add &&
    }\n \n {addItemToTemplateText}\n \n
    \n \n );\n }\n\n private _getConfirmationMessage(): string {\n const selectedDimensionNames = this.state.dimensions.map(dimension => {\n let variant = dimension.DimensionValues?.find(value => value.RecordId === this.selectedDimensions[dimension.DimensionTypeValue])?.Value;\n if (dimension.DimensionTypeValue === 3) {\n variant = `size ${variant}`;\n }\n return variant;\n }).filter(value => value);\n\n return this.props.resources.addToTemplateConfirmation\n .replace('{count}', this.state.quantity.toString())\n .replace('{productAndDimensions}', `${this.state.product.Name}, ${Object.values(selectedDimensionNames).join(', ')}`);\n\n }\n\n private _getDimensionsNodes(): React.ReactElement[] {\n const { dimensions } = this.state;\n const { resources } = this.props;\n\n return dimensions?.map((dimension: ProductDimensionFull) => {\n const { DimensionValues, DimensionTypeValue } = dimension;\n const mapDimensions = (value: ProductDimensionValue): IDropdownItemProps => ({\n id: value.RecordId,\n value: value.Value || ''\n });\n const dimensionName = this._getDropdownName(DimensionTypeValue, resources);\n const dropdownList: IDropdownItemProps[] = DimensionValues ? DimensionValues.map(mapDimensions) : [];\n dropdownList.unshift({id:0, value:`Choose a ${dimensionName}`});\n\n return (\n
    \n
    {dimensionName}
    \n {this.state.errors?.dimension?.includes(DimensionTypeValue.toString()) && (\n \n \n \n )}\n \n
    \n );\n });\n }\n\n private _getDimensionsError = (dimensionName: string) => this.props.resources.dimensionMissingError.replace(/\\{dimensionName\\}/g, dimensionName);\n\n private _addToTemplateHandler = async (event: React.MouseEvent) => {\n // hide confirmation of previous addition when adding multiple items\n this.setState({\n isBusy: true,\n showAddConfirmation: false,\n errors: {...this.state.errors, add: undefined}\n });\n\n const missingDimensions = this.state.dimensions.map(dimension => dimension.DimensionTypeValue.toString()).filter(type => !this.selectedDimensions[type]);\n\n this.setState({\n errors: {dimension: missingDimensions}\n });\n if (missingDimensions.length) {\n this.setState({\n isBusy: false\n });\n return;\n }\n\n this.props.addToTemplateHandler({...this.state})\n .then(status => {\n // validate against the existance of a ProductListId\n if (status.ProductListId) {\n this.setState({\n isBusy: false,\n showAddConfirmation: true\n });\n }\n })\n .catch(error => {\n const { addToTemplateDuplicateError, addToTemplateGenericError } = this.props.resources;\n let errorMessage;\n\n if (error.error.name === 'Microsoft_Dynamics_Commerce_Runtime_DuplicateObject') {\n errorMessage = addToTemplateDuplicateError;\n } else {\n errorMessage = addToTemplateGenericError;\n }\n\n this.setState({\n isBusy: false,\n errors: {...this.state.errors, add: errorMessage}\n });\n this.props.context.telemetry.error('Error adding item to order template');\n });\n };\n\n private _onQuantityChange = (newValue: number) => {\n this.setState({\n quantity: newValue,\n totalPrice: newValue * this.props.product.Price\n });\n }\n\n private _updateDimensionValue = (productDimensionFull: ProductDimensionFull, newValueId: string | undefined): ProductDimensionValue | undefined => {\n if (newValueId && productDimensionFull.DimensionValues) {\n return productDimensionFull.DimensionValues.find(dimension => dimension.RecordId === +newValueId);\n }\n\n return undefined;\n };\n\n // rehydrate the selected variants price, available dimensions & sizes\n private _onDimensionChanged = async (selection: IDropdownOnSelection): Promise => {\n const { product, dimensions, context } = this.props;\n const {\n actionContext,\n request: { apiSettings: { channelId } }\n } = context;\n\n // remaining error notifications for missing dimensions\n const remainingDimensionsErrors = this.state.errors?.dimension?.filter(id => id !== selection.dropdownId.toString());\n\n this.setState({\n isBusy: false,\n showAddConfirmation: false,\n buttonDisabled: true,\n errors: {add: undefined, dimension: remainingDimensionsErrors}\n });\n\n // update currenlty selected dimensions\n this.selectedDimensions[selection.dropdownId] = +selection.selectId;\n\n const mappedDimensions = dimensions?.map(dimension => {\n return {\n DimensionTypeValue: dimension.DimensionTypeValue,\n DimensionValue: this._updateDimensionValue(dimension, this.selectedDimensions[dimension.DimensionTypeValue]) || dimension.DimensionValue,\n ExtensionProperties: dimension.ExtensionProperties\n };\n }).filter(dimension => {\n return dimension && dimension.DimensionValue;\n });\n\n const variantProduct = (await getSelectedVariant(\n new SelectedVariantInput(\n product.MasterProductId ? product.MasterProductId : product.RecordId,\n channelId,\n mappedDimensions\n ),\n actionContext\n ));\n\n if (!variantProduct) {\n this.props.context.telemetry.error(`Error retrieving variant product for product ${product.MasterProductId ? product.MasterProductId : product.RecordId}`);\n return;\n }\n\n const dimensionInput = new GetDimensionsForSelectedVariantInput(\n variantProduct.RecordId,\n channelId,\n mappedDimensions\n );\n const variantDimensions = await getDimensionsForSelectedVariant(dimensionInput, actionContext);\n\n if (!variantDimensions) {\n this.props.context.telemetry.error('Error retrieving dimensions for reconfigured product variant');\n this.setState({\n buttonDisabled: false\n });\n return;\n }\n\n const availabilityInput = new ProductAvailabilitiesForSelectedVariantInput(\n product.MasterProductId ? product.MasterProductId : product.RecordId,\n channelId\n );\n // @TODO sync UX quantity w/ actual availibility\n const newAvailableQuantity = await getProductAvailabilitiesForSelectedVariant(availabilityInput, actionContext);\n const priceInput = new PriceForSelectedVariantInput(product.RecordId, channelId);\n const productPrice = await getPriceForSelectedVariant(priceInput, actionContext);\n\n if (!productPrice) {\n this.props.context.telemetry.error('Error retrieving price for reconfigured product variant');\n this.setState({\n buttonDisabled: false\n });\n return;\n }\n\n this.setState({\n buttonDisabled: false,\n productAvailableQuantity: newAvailableQuantity && newAvailableQuantity[0] || undefined,\n unitPrice: +(productPrice.BasePrice || product.Price),\n dimensions: variantDimensions.sort((a, b) => a.DimensionTypeValue - b.DimensionTypeValue),\n product: variantProduct\n });\n }\n\n private _getDropdownName = (dimensionType: number, resources: IAddLineToTemplateResources): string => {\n switch (dimensionType) {\n case 1: // Color\n return resources.productDimensionTypeColor;\n case 2: // Configuration\n return resources.productDimensionTypeConfiguration;\n case 3: // Size\n return resources.productDimensionTypeSize;\n case 4: // Style\n return resources.productDimensionTypeStyle;\n default:\n return '';\n }\n };\n\n private _formatPrice(price: number): string {\n const {\n context: {\n cultureFormatter: {\n formatCurrency,\n // @ts-ignore\n currencyCode\n }\n }\n } = this.props;\n\n return formatCurrency(price.toFixed(2), currencyCode);\n }\n}","import { getFallbackImageUrl } from '@msdyn365-commerce-modules/retail-actions';\nimport { Button } from '@msdyn365-commerce-modules/utilities';\nimport { ProductDimensionFull } from '@msdyn365-commerce/commerce-entities';\nimport { IImageSettings, Image } from '@msdyn365-commerce/core';\nimport { ProductSearchResult } from '@msdyn365-commerce/retail-proxy';\nimport classnames from 'classnames';\nimport React, { useState } from 'react';\nimport { IAddLineToTemplateProps } from '.';\n\nexport interface IProductListProps extends IAddLineToTemplateProps {\n products: ProductSearchResult[];\n imageSettings: IImageSettings;\n searchForm: React.ReactNode;\n clickHandler(product: ProductSearchResult): Promise;\n highlightSearchTerm(name: string): React.ReactNode;\n renderResultCountText(): string;\n}\n\nexport const ProductList = (props: IProductListProps) => {\n const {\n products,\n context: {\n actionContext: {\n requestContext: { apiSettings }\n },\n request: {\n gridSettings\n },\n cultureFormatter: {\n formatCurrency,\n // @ts-ignore\n currencyCode\n }\n },\n clickHandler,\n highlightSearchTerm,\n renderResultCountText,\n resources: { selectProductButtonText },\n imageSettings\n } = props;\n\n return (\n <>\n

    {renderResultCountText()}

    \n {props.searchForm}\n
    \n {products.map((product: ProductSearchResult, index: number) => {\n const { Price, ItemId, Name, PrimaryImageUrl } = product;\n const price = formatCurrency(Price.toFixed(2), currencyCode);\n const fallBackImg = getFallbackImageUrl(ItemId, apiSettings) || '';\n\n return (\n
    \n
    \n \n
    \n
    {ItemId}
    \n {highlightSearchTerm(Name || '')}\n
    \n
    \n
    \n {price}\n \n
    \n
    \n );\n })}\n
    \n \n );\n};\n\ninterface IProductSelectButton {\n product: ProductSearchResult;\n buttonText: string;\n clickHandler(product: ProductSearchResult): Promise;\n}\n\nconst ProductSelectButton = (props: IProductSelectButton) => {\n const [isBusy, setBusy] = useState(false);\n const { product, buttonText, clickHandler } = props;\n const getClickHandler = async () => {\n setBusy(!isBusy);\n await clickHandler(product);\n setBusy(!isBusy);\n };\n\n return (\n \n {buttonText}\n \n );\n};","import { CacheType, IActionInput } from '@msdyn365-commerce/core';\nimport { IUserReviewData } from './submit-user-review-input-data';\n\n/**\n * SubmitUserReview Input Action\n */\nexport class SubmitUserReviewInput implements IActionInput {\n /**\n * The Id representing the product to get the ratings for.\n */\n public productId?: string;\n\n /**\n * The ID representing the tenant.\n */\n public tenantId: string;\n\n /**\n * The calling organization's channel id.\n */\n public channelId: string;\n\n /**\n * The locale for which to get the ratings from.\n */\n public locale: string;\n\n /**\n * The user's review data\n */\n public userReviewData: IUserReviewData;\n\n /**\n * The user's authorization token\n */\n public authorization: string;\n\n /**\n * The ratings and reviews service endpoint\n */\n public serviceEndpoint: string;\n\n constructor(\n productId: string | undefined,\n tenantId: string,\n channelId: string,\n locale: string,\n userReviewData: IUserReviewData,\n authorization: string,\n serviceEndpoint: string\n ) {\n this.productId = productId;\n this.tenantId = tenantId;\n this.channelId = channelId;\n this.locale = locale;\n this.userReviewData = userReviewData;\n this.authorization = authorization;\n this.serviceEndpoint = serviceEndpoint;\n }\n\n public getCacheKey = () => 'SubmitUserReview';\n public getCacheObjectType = () => 'SubmitUserReview';\n public dataCacheType = (): CacheType => 'none';\n}\n","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport { createObservableDataAction, IAction, IActionContext, sendRequest } from '@msdyn365-commerce/core';\nimport { SubmitUserReviewInput } from './inputs/submit-user-review-input';\n\n/**\n * This data action allows submitting review to the reviews service\n * @param input This user review submission text\n * @param ctx The data action context\n */\nasync function submitReview(input:SubmitUserReviewInput, ctx: IActionContext):Promise {\n if (!inputIsValid(input)) {\n ctx.trace(`[SubmitUserReview] Failed to submit reviews for product due to bad input ${input}`);\n return '';\n }\n\n const requestUrl = `${input.serviceEndpoint}/v2.0/reviews/product/${input.productId}/user?` +\n `tenantId=${input.tenantId}&` +\n `channelId=${input.channelId}&` +\n `locale=${input.locale}`;\n\n return sendRequest(requestUrl, 'post', input.userReviewData, {headers: {Authorization: `id_token ${input.authorization}`}}).then((response) => {\n if (response.status !== 200 && response.status !== 201) {\n ctx.trace(`[SubmitUserReview] Failed to submit reviews for product`);\n ctx.trace(response.data);\n return '';\n }\n return response.data;\n }).catch((error) => {\n ctx.trace(`[SubmitUserReview] Failed to submit reviews for product`);\n ctx.telemetry.exception(error);\n ctx.telemetry.debug(`[SubmitUserReview] Failed to submit reviews for product`);\n ctx.trace(error);\n return '';\n });\n}\n\nfunction inputIsValid(input: SubmitUserReviewInput): Boolean {\n return input && !!input.productId && !!input.tenantId;\n}\n\nexport const submitReviewDataAction = createObservableDataAction({\n id: '@msdyn365-commerce-modules/ratings-reviews/submit-user-review',\n action: >submitReview\n});\n\nexport default submitReviewDataAction;\n","import React from 'react';\n\nimport { getRnrAuthEndpointId, getRnrPartnerId } from '@msdyn365-commerce-modules/retail-actions';\nimport {\n Alert, Button, getPayloadObject, getTelemetryAttributes, INodeProps, ITelemetryContent, Modal, ModalBody, ModalFooter, ModalHeader, TelemetryConstant\n} from '@msdyn365-commerce-modules/utilities';\nimport { Review } from '@msdyn365-commerce/commerce-entities';\nimport { RatingComponent } from '@msdyn365-commerce/components';\nimport { getUrlSync, IAny, ICoreContext, IGeneric } from '@msdyn365-commerce/core';\nimport { SimpleProduct } from '@msdyn365-commerce/retail-proxy';\n\nimport { GetUserReviewInput } from '../actions/inputs/get-user-review-input';\nimport { SubmitUserReviewInput } from '../actions/inputs/submit-user-review-input';\nimport submitUserReview from '../actions/submit-user-review';\n\nexport interface IReviewModalProps {\n userReview?: Review;\n product?: SimpleProduct;\n renderContextId: string;\n resources: IReviewModalResources;\n context: ICoreContext>;\n parentId: string;\n parentType: string;\n isOpen: boolean;\n rating: number;\n reviewTitle: string;\n reviewText: string;\n returnRef: React.RefObject | undefined;\n hasError: boolean;\n telemetryContent?: ITelemetryContent;\n onModalToggle():void;\n onTitleChange(event: React.ChangeEvent):void;\n onTextChange(event: React.ChangeEvent):void;\n onRatingChange(value: number):void;\n onReviewComplete?(isSuccess: boolean):void;\n}\n\nexport interface IReviewModalResources {\n selectRatingAriaLabel: string;\n selectRatingLabel: string;\n reviewTitleLabel: string;\n reviewTextLabel: string;\n privacyPolicyTitle: string;\n privacyPolicyTextFormat: string;\n writeReviewModalTitle: string;\n editReviewModalTitle: string;\n submitReviewButtonText: string;\n discardReviewButtonText: string;\n errorMessageText: string;\n}\n\nexport interface IReviewModalViewProps {\n modal: INodeProps;\n modalHeader: React.ReactElement;\n modalFooter: INodeProps;\n modalBody: INodeProps;\n cancelButton: React.ReactElement;\n submitButton: React.ReactElement;\n rating: React.ReactElement;\n ratingLabel: React.ReactElement;\n titleInput: React.ReactElement;\n titleLabel: React.ReactElement;\n textInput: React.ReactElement;\n textLabel: React.ReactElement;\n privacyPolicyUrl: React.ReactElement;\n form: INodeProps;\n inputRow: INodeProps;\n error: React.ReactElement;\n}\n\n/**\n * CartLineItems component\n */\n\nexport const ReviewModal = (props: IReviewModalProps):IReviewModalViewProps => {\n const onClickSubmit = () => {return onSubmit(props);};\n const payLoad = getPayloadObject('click', props.telemetryContent!, TelemetryConstant.SubmitReview);\n const submitButtonAttribute = getTelemetryAttributes(props.telemetryContent!, payLoad);\n payLoad.contentAction.etext = TelemetryConstant.Cancel;\n const cancelButtonAttribute = getTelemetryAttributes(props.telemetryContent!, payLoad);\n return {\n modal: {tag: Modal, className: 'ms-review-modal msc-modal-input-required', toggle: props.onModalToggle, applicationNode: 'renderPage', isOpen: props.isOpen, returnFocusRef: props.returnRef},\n modalHeader: modalHeaderNode(props),\n modalFooter: {tag: ModalFooter, className: 'ms-review-modal-footer'},\n modalBody: {tag: ModalBody, className: 'ms-review-modal-body'},\n cancelButton: ,\n submitButton: ,\n rating: ratingsInput(props),\n ratingLabel: ratingsLabel(props),\n titleInput: titleInput(props),\n titleLabel: titleLabel(props),\n textInput: textInput(props),\n textLabel: textLabel(props),\n privacyPolicyUrl: privacyPolicyLink(props),\n form: {tag: 'form', className: 'ms-review-modal-form', autoComplete: 'off'},\n inputRow: {tag: 'div', className: 'ms-review-modal-row', autoComplete: 'off'},\n error: {props.resources.errorMessageText}\n };\n};\n\nconst modalHeaderNode = (props: IReviewModalProps) => {\n return (\n \n { props.userReview && props.userReview.reviewId ? props.resources.editReviewModalTitle : props.resources.writeReviewModalTitle }\n \n );\n};\n\nconst submitDisabled = (props: IReviewModalProps) => {\n return !props.rating || !stripWhiteSpacesFromString(props.reviewText) || !stripWhiteSpacesFromString(props.reviewTitle);\n};\n\nconst ratingsInput = (props: IReviewModalProps) => {\n return (\n \n );\n};\n\nconst ratingsLabel = (props: IReviewModalProps) => {\n return ;\n};\n\nconst titleInput = (props: IReviewModalProps) => {\n const maxLength = props.context.app.config.reviewTitleMaxLength;\n\n return (\n \n );\n};\n\nconst titleLabel = (props: IReviewModalProps) => {\n return ;\n};\n\nconst reviewTextWidth: number = 50;\n\nconst textInput = (props: IReviewModalProps) => {\n const maxLength = props.context.app.config.reviewTextMaxLength;\n return (\n \n );\n};\n\nconst textLabel = (props: IReviewModalProps) => {\n return ;\n};\n\nconst privacyPolicyLink = (props: IReviewModalProps) => {\n const policyTextBlocks = props.resources.privacyPolicyTextFormat.split('{0}');\n const isSeparatorAtStart = props.resources.privacyPolicyTextFormat.startsWith('{0}');\n const isSeparatorAtEnd = props.resources.privacyPolicyTextFormat.endsWith('{0}');\n const privacyPolicyUrl = getUrlSync('rnrPrivacyPolicy', props.context.actionContext);\n const payLoad = getPayloadObject('click', props.telemetryContent!, TelemetryConstant.PrivacyPolicy);\n const privacyPolicyAttribute = getTelemetryAttributes(props.telemetryContent!, payLoad);\n\n return (\n

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

    \n );\n};\n\nconst onSubmit = (props: IReviewModalProps): void => {\n if (props.product) {\n submitReview(props.product, props.reviewTitle, props.reviewText, props.rating, props.context, props.userReview, props.onReviewComplete);\n }\n};\n\n/**\n * This method strips content of extra white spaces\n * @param text The text to be stripped of extra white spaces\n */\nconst stripWhiteSpacesFromString = (text: string): string => {\n return text\n .replace(new RegExp('\\\\r?\\\\n|\\\\r+', 'g'), ' ')\n .replace(new RegExp('\\\\s+', 'g'), ' ')\n .trim();\n};\n\nexport const submitReview = (product: SimpleProduct, title: string, text: string, rating: number, context: ICoreContext, userReview?: Review, onReviewSubmission?: (isSuccessful: boolean) => void) => {\n const { request } = context;\n const { user } = request;\n if (user && request) {\n const input = new SubmitUserReviewInput(\n product.RecordId.toString(),\n getRnrPartnerId(context.actionContext),\n request.apiSettings.channelId.toString(),\n request.locale,\n {\n productName: product && product.Name,\n rating: rating,\n reviewText: stripWhiteSpacesFromString(text),\n title: stripWhiteSpacesFromString(title),\n userEmail: user.emailAddress,\n userName: user.name\n },\n request.user.token,\n getRnrAuthEndpointId(context.actionContext)\n );\n\n submitUserReview(input, context.actionContext).then(reviewId => {\n const review = !!reviewId ? {\n rating: rating,\n title: stripWhiteSpacesFromString(title),\n reviewText: stripWhiteSpacesFromString(text),\n submittedDateTime: new Date(),\n helpfulPositive: userReview ? userReview.helpfulPositive : 0,\n helpfulNegative: userReview ? userReview.helpfulNegative : 0,\n reviewId: reviewId,\n userName: request.user.firstName || request.user.name\n } : userReview;\n\n const getReviewInput = new GetUserReviewInput(input.productId!, input.tenantId, input.authorization, input.serviceEndpoint);\n context.actionContext.update(getReviewInput, review);\n\n if (onReviewSubmission) {\n onReviewSubmission(!!reviewId);\n }\n }).catch(() => {\n const productId = product.RecordId;\n context.telemetry.error(`Failed to submit review for product with recordId: ${productId}`);\n context.telemetry.debug(`Failed to submit review for product with recordId: ${productId}`);\n if (onReviewSubmission) {\n onReviewSubmission(false);\n }\n });\n }\n};","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport { INodeProps, Module, Node } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\nimport { ISearchCategoryViewProps, ISearchFormViewProps, ISearchKeywordViewProps, ISearchProductViewProps } from './components';\nimport { ISearchViewProps } from './search';\n\nconst SearchView: React.FC = props => {\n const {\n Search,\n AutoSuggestAriaLabel,\n AutoSuggestAriaLabelText,\n searchText,\n AutoSuggest,\n KeywordSuggest,\n ProductSuggest,\n CategorySuggest,\n UlKeyword,\n UlProduct,\n UlCategory,\n form,\n autosuggestCategory,\n autosuggestKeyword,\n autosuggestProduct,\n SearchForm,\n FormWrapper,\n label\n } = props;\n\n return (\n \n {label}\n {_renderForm(form as ISearchFormViewProps, SearchForm, FormWrapper)}\n \n {searchText && searchText.length > 0 ?\n {AutoSuggestAriaLabelText} : ''\n }\n {_renderKeywordSuggestions(KeywordSuggest, UlKeyword, autosuggestKeyword)}\n {_renderProductSuggestions(ProductSuggest, UlProduct, autosuggestProduct)}\n {_renderCategorySuggestions(CategorySuggest, UlCategory, autosuggestCategory)}\n \n \n );\n};\n\nconst _renderForm = (form: ISearchFormViewProps, SearchForm: INodeProps, FormWrapper: INodeProps) => {\n return (\n \n \n {form.submitBtn}\n {form.input}\n {form.cancelBtn}\n \n \n );\n};\n\nconst _renderKeywordSuggestions = (\n KeywordSuggest: INodeProps,\n UlKeyword: INodeProps,\n keywordSuggestions?: ISearchKeywordViewProps\n) => {\n return (\n keywordSuggestions && (\n \n \n {keywordSuggestions.text.map(text => {\n return text;\n })}\n \n \n )\n );\n};\n\nconst _renderProductSuggestions = (\n ProductSuggest: INodeProps,\n UlProduct: INodeProps,\n productSuggestions?: ISearchProductViewProps\n) => {\n return (\n productSuggestions && (\n \n \n {productSuggestions.title}\n {productSuggestions.items.map((item, index) => {\n return (\n \n \n {item.thumbnail}\n {item.text}\n {item.price}\n \n \n );\n })}\n \n \n )\n );\n};\n\nconst _renderCategorySuggestions = (\n CategorySuggest: INodeProps,\n UlCategory: INodeProps,\n categorySuggestions?: ISearchCategoryViewProps\n) => {\n return (\n categorySuggestions && (\n \n \n {categorySuggestions.title}\n {categorySuggestions.text.map(text => {\n return text;\n })}\n \n \n )\n );\n};\n\nexport default SearchView;","/*---------------------------------------------------------------------------------------------\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\n\r\n\r\nimport { INodeProps, Module, Node } from '@msdyn365-commerce-modules/utilities';\r\nimport * as React from 'react';\r\nimport { ISearchCategoryViewProps, ISearchFormViewProps, ISearchKeywordViewProps, ISearchProductViewProps } from '../../../modules/smwe-search/./components';\r\nimport { ISearchViewProps } from '../../../modules/smwe-search/./smwe-search';\r\n\r\nconst SearchView: React.FC = props => {\r\n const {\r\n Search,\r\n AutoSuggestAriaLabel,\r\n AutoSuggestAriaLabelText,\r\n searchText,\r\n AutoSuggest,\r\n KeywordSuggest,\r\n ProductSuggest,\r\n CategorySuggest,\r\n UlKeyword,\r\n UlProduct,\r\n UlCategory,\r\n form,\r\n autosuggestCategory,\r\n autosuggestKeyword,\r\n autosuggestProduct,\r\n SearchForm,\r\n FormWrapper,\r\n label\r\n } = props;\r\n\r\n return (\r\n \r\n {label}\r\n {_renderForm(form as ISearchFormViewProps, SearchForm, FormWrapper)}\r\n \r\n {searchText && searchText.length > 0 ?\r\n {AutoSuggestAriaLabelText} : ''\r\n }\r\n {_renderKeywordSuggestions(KeywordSuggest, UlKeyword, autosuggestKeyword)}\r\n {_renderProductSuggestions(ProductSuggest, UlProduct, autosuggestProduct)}\r\n {_renderCategorySuggestions(CategorySuggest, UlCategory, autosuggestCategory)}\r\n \r\n \r\n );\r\n};\r\n\r\nconst _renderForm = (form: ISearchFormViewProps, SearchForm: INodeProps, FormWrapper: INodeProps) => {\r\n return (\r\n \r\n \r\n {form.submitBtn}\r\n {form.label}\r\n {form.input}\r\n {form.cancelBtn}\r\n \r\n \r\n );\r\n};\r\n\r\nconst _renderKeywordSuggestions = (\r\n KeywordSuggest: INodeProps,\r\n UlKeyword: INodeProps,\r\n keywordSuggestions?: ISearchKeywordViewProps\r\n) => {\r\n return (\r\n keywordSuggestions && (\r\n \r\n \r\n {keywordSuggestions.text.map(text => {\r\n return text;\r\n })}\r\n \r\n \r\n )\r\n );\r\n};\r\n\r\nconst _renderProductSuggestions = (\r\n ProductSuggest: INodeProps,\r\n UlProduct: INodeProps,\r\n productSuggestions?: ISearchProductViewProps\r\n) => {\r\n return (\r\n productSuggestions && (\r\n \r\n \r\n {productSuggestions.title}\r\n {productSuggestions.items.map((item, index) => {\r\n return (\r\n \r\n \r\n {item.thumbnail}\r\n {item.text}\r\n {item.price !== 0 && (
    {item.price}
    )}\r\n
    \r\n
    \r\n );\r\n })}\r\n
    \r\n
    \r\n )\r\n );\r\n};\r\n\r\nconst _renderCategorySuggestions = (\r\n CategorySuggest: INodeProps,\r\n UlCategory: INodeProps,\r\n categorySuggestions?: ISearchCategoryViewProps\r\n) => {\r\n return (\r\n categorySuggestions && (\r\n \r\n \r\n {categorySuggestions.title}\r\n {categorySuggestions.text.map(text => {\r\n return text;\r\n })}\r\n \r\n \r\n )\r\n );\r\n};\r\n\r\nexport default SearchView;","import { getPayloadObject, getTelemetryAttributes, ITelemetryContent, TelemetryConstant } from '@msdyn365-commerce-modules/utilities';\nimport React from 'react';\n\nexport const SignInMessage: React.FC<{text: string}> = (props: {text: string}) => {\n return

    {props.text}

    ;\n};\n\nexport const SignInButton: React.FC<{text: string; href: string; ariaLabel: string; telemetryContent?: ITelemetryContent}> = (props: {text: string; href: string; ariaLabel: string; telemetryContent?: ITelemetryContent}) => {\n const {text, href, ariaLabel, telemetryContent} = props;\n const payLoad = getPayloadObject('click', telemetryContent!, TelemetryConstant.SignIn);\n const attributes = getTelemetryAttributes(telemetryContent!, payLoad);\n return {text};\n};\n\ninterface IModalToggleProps {\n innerRef: React.RefObject | undefined;\n id: string;\n text: string;\n ariaLabel: string;\n telemetryContent?: ITelemetryContent;\n onClick(): void;\n}\n\nexport const ModalToggle: React.FC = (props: IModalToggleProps) => {\n const {text, onClick, ariaLabel, innerRef, telemetryContent, id} = props;\n const payLoad = getPayloadObject('click', telemetryContent!, TelemetryConstant.WriteReview);\n const attributes = getTelemetryAttributes(telemetryContent!, payLoad);\n return ;\n};","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\nimport { getTelemetryObject, IModuleProps, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\nimport { Review } from '@msdyn365-commerce/commerce-entities';\nimport * as Msdyn365 from '@msdyn365-commerce/core';\nimport { SimpleProduct } from '@msdyn365-commerce/retail-proxy';\nimport classnames from 'classnames';\nimport React from 'react';\nimport { IReviewModalViewProps, ReviewModal, submitReview } from '../../common/review-modal';\nimport { TOGGLE_REVIEW_MODAL_BUTTON_ID } from '../../common/rnrInterface';\nimport { ModalToggle, SignInButton, SignInMessage } from './components/components';\nimport { IWriteReviewData } from './write-review.data';\nimport { IWriteReviewProps } from './write-review.props.autogenerated';\n\nexport interface IWriteReviewCallbacks {\n toggleModal(): void;\n updateReviewTitle(title: string): void;\n updateReviewText(text: string): void;\n updateRating(rating: number): void;\n onReviewSubmitted(isSuccessful: boolean): void;\n submitReview(product: SimpleProduct, title: string, text: string, rating: number, context: Msdyn365.ICoreContext, userReview?: Review, onReviewSubmission?: (isSuccessful: boolean) => void): void;\n}\n\nexport interface IWriteReviewState {\n rating: number;\n reviewTitle: string;\n reviewText: string;\n isReviewModalOpen: boolean;\n hasReviewError: boolean;\n}\n\nexport interface IWriteReviewViewProps extends IWriteReviewProps {\n state: IWriteReviewState;\n className: string;\n callbacks: IWriteReviewCallbacks;\n signInMessage: React.ReactNode;\n signInButton: React.ReactNode;\n modalToggle: React.ReactNode;\n reviewModal: IReviewModalViewProps;\n moduleProps: IModuleProps;\n heading: React.ReactNode;\n}\n\n/**\n * This module is enables user's to leave ratings and reviews on a specific product\n * WriteReview module\n * @extends {React.PureComponent>}\n */\nclass WriteReview extends React.PureComponent, IWriteReviewState> {\n private _modalToggleRef: React.RefObject | undefined;\n private telemetryContent: ITelemetryContent;\n\n public constructor(props: IWriteReviewProps) {\n super(props);\n const {userReview: {result: userReview}} = this.props.data;\n this._toggleReviewModal = this._toggleReviewModal.bind(this);\n this._modalToggleRef = React.createRef();\n const rating = userReview ? userReview.rating : 0;\n const reviewTitle = userReview ? userReview.title : '';\n const reviewText = userReview ? userReview.reviewText : '';\n\n this.state = {\n isReviewModalOpen: false,\n rating: rating,\n reviewTitle: reviewTitle,\n reviewText: reviewText,\n hasReviewError: false\n };\n this.telemetryContent = getTelemetryObject(this.props.context.request.telemetryPageName!, this.props.friendlyName, this.props.telemetry);\n }\n\n public render(): JSX.Element {\n const { resources } = this.props;\n const { className, heading } = this.props.config;\n const {product: {result: product}, userReview: {result: userReview}} = this.props.data;\n\n const userInfo = this.props.context && this.props.context.request && this.props.context.request.user;\n const completeClass = classnames('ms-write-review', 'msc-modal-input-required', className);\n const viewProps = {\n ...this.props,\n state: this.state,\n className: completeClass,\n moduleProps: {\n moduleProps: this.props,\n className: completeClass,\n id: null\n },\n callbacks: this.writeReviewCallbacks,\n signInMessage: ,\n signInButton: ,\n modalToggle: product && (\n \n ),\n reviewModal: this._buildUserReviewModal(),\n heading: heading && heading.text && (\n \n )\n } as IWriteReviewViewProps;\n\n return this.props.renderView(viewProps) as React.ReactElement;\n }\n public handleHeadingChange = (event: Msdyn365.ContentEditableEvent) => this.props.config.heading!.text = event.target.value;\n\n private _onTitleChange = (event: React.ChangeEvent): void => {\n this.writeReviewCallbacks.updateReviewTitle(event.target.value);\n }\n\n private _onTextChange = (event: React.ChangeEvent): void => {\n this.writeReviewCallbacks.updateReviewText(event.target.value);\n }\n\n private _onRatingChange = (value: number): void => {\n this.writeReviewCallbacks.updateRating(value);\n }\n\n private _toggleReviewModal = (): void => {\n const userReview = this.props.data.userReview.result;\n if (this.state.isReviewModalOpen) {\n this.setState({isReviewModalOpen: false, hasReviewError: false});\n } else {\n if(userReview) {\n this.setState({\n isReviewModalOpen: true,\n reviewText: userReview.reviewText,\n reviewTitle: userReview.title,\n rating: userReview.rating\n });\n } else {\n this.setState({\n isReviewModalOpen: true,\n reviewText: '',\n reviewTitle: '',\n rating: 0\n });\n }\n }\n }\n\n /**\n * This method builds the user review modal\n * @param config The module config\n */\n private _buildUserReviewModal(): IReviewModalViewProps {\n return ReviewModal({\n userReview: this.props.data.userReview.result,\n product: this.props.data.product.result,\n resources: {...this.props.resources},\n context: this.props.context,\n parentId: this.props.id,\n parentType: this.props.typeName,\n isOpen: this.state.isReviewModalOpen,\n rating: this.state.rating,\n reviewTitle: this.state.reviewTitle,\n reviewText: this.state.reviewText,\n onModalToggle: this._toggleReviewModal,\n onTitleChange: this._onTitleChange,\n onTextChange: this._onTextChange,\n onRatingChange: this._onRatingChange,\n onReviewComplete: this.writeReviewCallbacks.onReviewSubmitted,\n renderContextId: 'writeReview',\n returnRef: this._modalToggleRef,\n hasError: this.state.hasReviewError,\n telemetryContent: this.telemetryContent\n });\n }\n\n // tslint:disable-next-line\n private writeReviewCallbacks: IWriteReviewCallbacks = {\n toggleModal: this._toggleReviewModal,\n updateReviewTitle: (title: string): void => {\n this.setState({reviewTitle: title});\n },\n updateReviewText: (text: string): void => {\n this.setState({reviewText: text});\n },\n updateRating: (rating: number): void => {\n this.setState({rating: rating});\n },\n onReviewSubmitted: (isSuccessful: boolean): void => {\n if (isSuccessful) {\n this.setState({isReviewModalOpen: false, hasReviewError: false});\n } else {\n this.setState({hasReviewError: true});\n }\n },\n submitReview: submitReview\n };\n}\n\nexport default WriteReview;\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\n\r\n\r\nimport { INodeProps, Module, Node } from '@msdyn365-commerce-modules/utilities';\r\nimport * as React from 'react';\r\nimport { ISearchCategoryViewProps, ISearchFormViewProps, ISearchKeywordViewProps, ISearchProductViewProps } from '../../../modules/smwe-search/./components';\r\nimport { ISearchViewProps } from '../../../modules/smwe-search/./smwe-search';\r\n\r\nconst SearchView: React.FC = props => {\r\n const {\r\n Search,\r\n AutoSuggestAriaLabel,\r\n AutoSuggestAriaLabelText,\r\n searchText,\r\n AutoSuggest,\r\n KeywordSuggest,\r\n ProductSuggest,\r\n CategorySuggest,\r\n UlKeyword,\r\n UlProduct,\r\n UlCategory,\r\n form,\r\n autosuggestCategory,\r\n autosuggestKeyword,\r\n autosuggestProduct,\r\n SearchForm,\r\n FormWrapper,\r\n label\r\n } = props;\r\n\r\n return (\r\n \r\n {label}\r\n {_renderForm(form as ISearchFormViewProps, SearchForm, FormWrapper)}\r\n \r\n {searchText && searchText.length > 0 ?\r\n {AutoSuggestAriaLabelText} : ''\r\n }\r\n {_renderKeywordSuggestions(KeywordSuggest, UlKeyword, autosuggestKeyword)}\r\n {_renderProductSuggestions(ProductSuggest, UlProduct, autosuggestProduct)}\r\n {_renderCategorySuggestions(CategorySuggest, UlCategory, autosuggestCategory)}\r\n \r\n \r\n );\r\n};\r\n\r\nconst _renderForm = (form: ISearchFormViewProps, SearchForm: INodeProps, FormWrapper: INodeProps) => {\r\n return (\r\n \r\n \r\n {form.submitBtn}\r\n {form.label}\r\n {form.input}\r\n {form.cancelBtn}\r\n \r\n \r\n );\r\n};\r\n\r\nconst _renderKeywordSuggestions = (\r\n KeywordSuggest: INodeProps,\r\n UlKeyword: INodeProps,\r\n keywordSuggestions?: ISearchKeywordViewProps\r\n) => {\r\n return (\r\n keywordSuggestions && (\r\n \r\n \r\n {keywordSuggestions.text.map(text => {\r\n return text;\r\n })}\r\n \r\n \r\n )\r\n );\r\n};\r\n\r\nconst _renderProductSuggestions = (\r\n ProductSuggest: INodeProps,\r\n UlProduct: INodeProps,\r\n productSuggestions?: ISearchProductViewProps\r\n) => {\r\n return (\r\n productSuggestions && (\r\n \r\n \r\n {productSuggestions.title}\r\n {productSuggestions.items.map((item, index) => {\r\n return (\r\n \r\n \r\n {item.thumbnail}\r\n {item.text}\r\n {item.price !== 0 && (
    {item.price}
    )}\r\n
    \r\n
    \r\n );\r\n })}\r\n
    \r\n
    \r\n )\r\n );\r\n};\r\n\r\nconst _renderCategorySuggestions = (\r\n CategorySuggest: INodeProps,\r\n UlCategory: INodeProps,\r\n categorySuggestions?: ISearchCategoryViewProps\r\n) => {\r\n return (\r\n categorySuggestions && (\r\n \r\n \r\n {categorySuggestions.title}\r\n {categorySuggestions.text.map(text => {\r\n return text;\r\n })}\r\n \r\n \r\n )\r\n );\r\n};\r\n\r\nexport default SearchView;","/*---------------------------------------------------------------------------------------------\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\n\r\n/* eslint-disable no-duplicate-imports */\r\nimport { INodeProps, Module, Node } from '@msdyn365-commerce-modules/utilities';\r\nimport * as React from 'react';\r\nimport { ISearchCategoryViewProps, ISearchFormViewProps, ISearchKeywordViewProps, ISearchProductViewProps } from './components';\r\nimport { ISearchViewProps } from './smwe-search';\r\n\r\nconst SearchView: React.FC = props => {\r\n const {\r\n Search,\r\n AutoSuggestAriaLabel,\r\n AutoSuggestAriaLabelText,\r\n searchText,\r\n AutoSuggest,\r\n KeywordSuggest,\r\n ProductSuggest,\r\n CategorySuggest,\r\n UlKeyword,\r\n UlProduct,\r\n UlCategory,\r\n form,\r\n autosuggestCategory,\r\n autosuggestKeyword,\r\n autosuggestProduct,\r\n SearchForm,\r\n FormWrapper,\r\n label\r\n } = props;\r\n\r\n return (\r\n \r\n {label}\r\n {_renderForm(form as ISearchFormViewProps, SearchForm, FormWrapper)}\r\n \r\n {searchText && searchText.length > 0 ?\r\n {AutoSuggestAriaLabelText} : ''\r\n }\r\n {_renderKeywordSuggestions(KeywordSuggest, UlKeyword, autosuggestKeyword)}\r\n {_renderProductSuggestions(ProductSuggest, UlProduct, autosuggestProduct)}\r\n {_renderCategorySuggestions(CategorySuggest, UlCategory, autosuggestCategory)}\r\n \r\n \r\n );\r\n};\r\n\r\nconst _renderForm = (form: ISearchFormViewProps, SearchForm: INodeProps, FormWrapper: INodeProps) => {\r\n return (\r\n \r\n \r\n {form.submitBtn}\r\n {form.label}\r\n {form.input}\r\n {form.cancelBtn}\r\n \r\n \r\n );\r\n};\r\n\r\nconst _renderKeywordSuggestions = (\r\n KeywordSuggest: INodeProps,\r\n UlKeyword: INodeProps,\r\n keywordSuggestions?: ISearchKeywordViewProps\r\n) => {\r\n return (\r\n keywordSuggestions && (\r\n \r\n \r\n {keywordSuggestions.text.map(text => {\r\n return text;\r\n })}\r\n \r\n \r\n )\r\n );\r\n};\r\n\r\nconst _renderProductSuggestions = (\r\n ProductSuggest: INodeProps,\r\n UlProduct: INodeProps,\r\n productSuggestions?: ISearchProductViewProps\r\n) => {\r\n return (\r\n productSuggestions && (\r\n \r\n \r\n {productSuggestions.title}\r\n {productSuggestions.items.map((item, index) => {\r\n return (\r\n \r\n \r\n {item.thumbnail}\r\n {item.text}\r\n {item.price}\r\n \r\n \r\n );\r\n })}\r\n \r\n \r\n )\r\n );\r\n};\r\n\r\nconst _renderCategorySuggestions = (\r\n CategorySuggest: INodeProps,\r\n UlCategory: INodeProps,\r\n categorySuggestions?: ISearchCategoryViewProps\r\n) => {\r\n return (\r\n categorySuggestions && (\r\n \r\n \r\n {categorySuggestions.title}\r\n {categorySuggestions.text.map(text => {\r\n return text;\r\n })}\r\n \r\n \r\n )\r\n );\r\n};\r\n\r\nexport default SearchView;","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\nimport { Button } from '@msdyn365-commerce-modules/utilities';\nimport { IOrderTemplateNameDialogResources, OrderTemplateNameDialog } from '@msdyn365-commerce/components';\nimport { IComponentProps } from '@msdyn365-commerce/core';\nimport React, { useState } from 'react';\n\nexport interface ICreateOrderTemplateButtonProps extends IComponentProps {\n createOrderTemplateText: string;\n createOrderTemplateDialogResources: IOrderTemplateNameDialogResources;\n onOrderTemplateCreated(): Promise;\n}\n\nconst CreateOrderTemplateButton: React.FC = (props) => {\n const onCancel = () => {\n return;\n };\n const [createOrderTemplateDialogOpen, setOrderTemplateNameDialogOpen] = useState(false);\n const onCreateButtonClick = () => {\n setOrderTemplateNameDialogOpen(true);\n };\n\n return (\n <>\n \n {props.createOrderTemplateText}\n \n \n \n );\n};\n\nexport default CreateOrderTemplateButton;","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\nimport { OrderTemplate } from '@msdyn365-commerce-modules/retail-actions';\nimport { Alert, Heading, IModuleProps, INodeProps } from '@msdyn365-commerce-modules/utilities';\nimport { IOrderTemplateNameDialogResources } from '@msdyn365-commerce/components';\nimport { deleteAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/ProductListsDataActions.g';\nimport classnames from 'classnames';\nimport { observer } from 'mobx-react';\nimport * as React from 'react';\nimport { ISingleOrderTemplateProps, ISingleOrderTemplateViewProps, OrderTemplateListStatusMessage, OrderTemplateRender } from './components/';\nimport CreateNewTemplateButtonComponent from './components/create-order-template';\nimport { IOrderTemplateListData } from './order-template-list.data';\nimport { IOrderTemplateListProps, IOrderTemplateListResources } from './order-template-list.props.autogenerated';\n\nexport interface IOrderTemplateActionMessageState {\n itemKey: string;\n userMessage: string;\n statusCssString: string;\n messageGlyph: string;\n isOpen: boolean;\n headerStatusMessage: string;\n}\n\nexport type orderTemplateListStatus = 'LOADING' | 'SUCCESS' | 'FAILED' | 'EMPTY';\n\nexport interface IOrderTemplateListViewProps extends IOrderTemplateListProps {\n OrderTemplateList: IModuleProps;\n status?: orderTemplateListStatus;\n statusMessage?: React.ReactNode;\n heading?: React.ReactNode;\n OrderTemplates?: INodeProps;\n OrderTemplate?: INodeProps;\n orderTemplates?: ISingleOrderTemplateViewProps[];\n createOrderTemplateButton?: React.ReactNode;\n templateHeaderStatusMessage?: React.ReactNode;\n}\n\n/**\n *\n * OrderTemplateList component\n * @extends {React.PureComponent, IOrderTemplateListActionMessageState>}\n */\n@observer\nclass OrderTemplateList extends React.Component, IOrderTemplateActionMessageState> {\n\n constructor(props: IOrderTemplateListProps) {\n super(props);\n this.state = {\n itemKey: '',\n userMessage: '',\n headerStatusMessage: '',\n statusCssString: 'success',\n messageGlyph: 'fas fa-check',\n isOpen: false,\n };\n }\n\n public async componentDidMount(): Promise {\n this.setState({});\n }\n\n public render(): JSX.Element | null {\n const { className } = this.props.config;\n const { emptyOrderTemplateText, createNewTemplateButtonText } = this.props.resources;\n const { orderTemplates } = this.props.data;\n const orderTemplatesData = orderTemplates && (orderTemplates).result;\n\n if (orderTemplates.status === 'LOADING') {\n const errorProps: IOrderTemplateListViewProps = {\n ...(this.props as IOrderTemplateListProps),\n OrderTemplateList: {\n moduleProps: this.props,\n className: classnames('ms-order-template', className),\n },\n status: 'LOADING',\n statusMessage: ,\n heading: (\n \n ),\n };\n return this.props.renderView(errorProps);\n }\n\n if (!!orderTemplatesData && orderTemplatesData.length === 0) {\n // when no order templates are found for customer\n const emptyViewProps: IOrderTemplateListViewProps = {\n ...(this.props as IOrderTemplateListProps),\n OrderTemplateList: {\n moduleProps: this.props,\n className: classnames('ms-order-template', className),\n },\n status: 'EMPTY',\n statusMessage: ,\n heading: (\n \n ),\n };\n\n return this.props.renderView(emptyViewProps);\n }\n\n const viewProps: IOrderTemplateListViewProps = {\n ...(this.props as IOrderTemplateListProps),\n OrderTemplateList: {\n moduleProps: this.props,\n className: classnames('ms-order-template', className),\n },\n status: 'SUCCESS',\n heading: (\n \n ),\n createOrderTemplateButton: (\n \n ),\n templateHeaderStatusMessage: this.state.isOpen && this.state.headerStatusMessage && (\n
    \n \n {this.state.headerStatusMessage}\n \n
    \n ),\n OrderTemplates: {\n className: 'ms-order-template__list-item',\n tag: 'ul',\n },\n OrderTemplate: {\n className: 'ms-order-template__tile',\n tag: 'li',\n },\n orderTemplates: orderTemplatesData && this._renderOrderTemplateList(orderTemplatesData)\n };\n\n return this.props.renderView(viewProps) as React.ReactElement;\n }\n\n private _generateOrderTemplateNameDialogResources(resources: IOrderTemplateListResources): IOrderTemplateNameDialogResources {\n return {\n orderTemplateHeaderLabel: resources.createOrderTemplateHeader,\n orderTemplateTitleLabel: resources.orderTemplateTitle,\n orderTemplateNameAriaLabel: resources.orderTemplateNameAriaLabel,\n orderTemplateDescription: resources.createOrderTemplateDescription,\n\n defaultOrderTemplateName: resources.defaultOrderTemplateName,\n\n orderTemplateButtonLabel: resources.createOrderTemplateButtonText,\n orderTemplateCancelButtonLabel: resources.cancelNewOrderTemplateCreationButtonText\n };\n }\n\n private _renderOrderTemplateList(orderTemplates: OrderTemplate[]): ISingleOrderTemplateViewProps[] {\n const { context, telemetry } = this.props;\n const { imageSettings, enableImageProductLink } = this.props.config;\n return orderTemplates.map((orderTemplate: OrderTemplate, index) => {\n const currentTemplateProps: ISingleOrderTemplateProps = {\n orderTemplateState: this.state,\n Id: orderTemplate.productList.Id,\n name: orderTemplate.productList.Name,\n orderTemplate: orderTemplate,\n context: context,\n imageSettings: imageSettings,\n enableImageProductLink: enableImageProductLink,\n removeFromOrderTemplateListText: 'remove',\n addToBagText: this.props.resources.addToBagButtonText,\n index: index,\n itemKey: orderTemplate.productList.Id,\n telemetry: telemetry,\n moduleId: this.props.id,\n moduleTypeName: this.props.typeName,\n handlers: {\n onRemoveOrderTemplate: this._onRemoveFromOrderTemplateList,\n onDismiss: this._onDismiss,\n },\n resources: {\n closeWindowButtonText: this.props.resources.closeWindowButtonText,\n addToCartFailureMessage: this.props.resources.addToCartFailureMessage,\n addToCartSuccessMessage: this.props.resources.addToCartSuccessMessage,\n addToCartProcessMessage: this.props.resources.addToCartProcessMessage,\n linesAddedToCartDialogResources: {\n viewCartButtonText: this.props.resources.viewCartButtonText,\n orderTemplateCloseButtonText: this.props.resources.orderTemplateCloseButtonText,\n linesAddedToCartHeaderItemsOneText: this.props.resources.linesAddedToCartHeaderItemsOneText,\n linesAddedToCartHeaderLinesOneText: this.props.resources.linesAddedToCartHeaderLinesOneText,\n linesAddedToCartHeaderLinesFormatText: this.props.resources.linesAddedToCartHeaderLinesFormatText,\n linesAddedToCartHeaderMessageText: this.props.resources.linesAddedToCartHeaderMessageText\n }\n }\n };\n\n return (\n OrderTemplateRender(currentTemplateProps)!\n );\n });\n }\n\n private _onDismiss = () => {\n this.setState({\n isOpen: false\n });\n }\n\n private _reloadPage = async () => {\n window.location.reload();\n }\n\n private _onRemoveFromOrderTemplateList = (productListId: string): void | undefined => {\n const { context, data, telemetry, resources } = this.props;\n const { orderTemplates } = data;\n\n if (context && context.actionContext) {\n const userToken = context.request.user.isAuthenticated && context.request.user.token;\n if (userToken && orderTemplates.result && orderTemplates.result[0] && productListId) {\n const orderTemplate = orderTemplates.result.find(p => p.productList.Id === productListId);\n if (orderTemplate) {\n deleteAsync({ callerContext: context.actionContext }, orderTemplate.productList)\n .then()\n .catch((error: string) => {\n telemetry.warning('[order-template-list] Unable to delete order template.');\n telemetry.error(error);\n this.setState({\n itemKey: productListId,\n headerStatusMessage: resources.deleteOrderTemplateFailedText,\n statusCssString: 'danger',\n messageGlyph: 'fas fa-exclamation-triangle',\n isOpen: true\n });\n }).then(this._reloadPage);\n } else {\n telemetry.warning('[order-template-list] Failed to delete order template. Order template was not found');\n }\n } else {\n telemetry.warning('[order-template-list] Failed to delete order template.');\n }\n }\n }\n\n}\n\nexport default OrderTemplateList;\n","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n*--------------------------------------------------------------------------------------------*/\n\nimport { Module } from '@msdyn365-commerce-modules/utilities';\nimport React from 'react';\nimport { ISocialShareItemViewProps } from './social-share-item';\n\nexport const SocialShareItemView: React.FC = props => {\n const { SocialShareItem, SocialShareItemElement } = props;\n\n if (!SocialShareItemElement) {\n props.context.telemetry.error('Social media is not valid, module wont render');\n return null;\n }\n return (\n \n {SocialShareItemElement}\n \n );\n};\n\nexport default SocialShareItemView;","import OrderTemplateLines from './modules/order-template/order-template';\nimport OrderTemplateLinesView from './modules/order-template/order-template.view';\n\nexport * from './modules/order-template/order-template';\nexport * from './modules/order-template/order-template.view';\nexport * from './modules/order-template/order-template.data';\nexport * from './modules/order-template/components';\n// export * from './modules/order-template/actions';\nexport * from './modules/order-template/order-template.props.autogenerated';\nexport * from './modules/order-template-list/order-template-list';\nexport * from './modules/order-template-list/order-template-list.view';\nexport * from './modules/order-template-list/order-template-list.data';\nexport * from './modules/order-template-list/components';\n\nexport {\n OrderTemplateLines,\n OrderTemplateLinesView\n};","import { IModuleProps, Module, Node } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\nimport {IReviewModalViewProps} from '../../common/review-modal';\nimport {IReportReviewModalViewProps} from './components/report-review-modal';\nimport {IReviewCardViewProps} from './components/review-card';\nimport { IReviewsListState, IReviewsListViewProps } from './reviews-list';\n\nconst ReviewsListview: React.FC = props => {\n const {\n averageRating,\n filterByDropdown,\n heading,\n moduleProps,\n noReviewsMessage,\n noReviewsWithFilterMessage,\n pageControls,\n refineReviewsProps,\n reportReviewModal,\n reviewsListProps,\n reviewCards,\n reviewCount,\n reviewModal,\n sortByDropdown,\n state,\n userReview\n } = props;\n\n if (!userReview && reviewCards.length === 0 && !state.isFilterApplied) {\n return {noReviewsMessage};\n }\n\n return (\n \n {heading}\n {averageRating}\n {reviewCount}\n { reviewCards.length === 0 ?\n null : \n {sortByDropdown}\n {filterByDropdown}\n \n }\n \n {userReview && buildReviewCard(userReview)}\n {reviewCards.map(review => {\n return buildReviewCard(review);\n })}\n \n { reviewCards.length === 0 && state.isFilterApplied && noReviewsWithFilterMessage}\n {pageControls}\n {createReviewModal(reviewModal, moduleProps)}\n {createReportModal(reportReviewModal, state)}\n \n );\n};\n\nconst buildReviewCard = (props: IReviewCardViewProps) => {\n return (\n \n \n {props.rating}\n {props.name}\n \n \n \n {props.reviewTitle}\n {props.date}\n {props.reviewText}\n \n \n {props.responseName}\n {props.responseDate}\n {props.responseText}\n \n \n {props.ratingHelpfulLabel}\n {props.like}\n {props.dislike}\n {props.edit}\n {props.report}\n \n \n \n );\n};\n\nconst createReviewModal = (props: IReviewModalViewProps, moduleProps: IModuleProps): JSX.Element => {\n return (\n \n {props.modalHeader}\n \n \n \n {props.rating}\n {props.ratingLabel}\n \n \n {props.titleLabel}\n {props.titleInput}\n \n \n {props.textLabel}\n {props.textInput}\n \n {props.privacyPolicyUrl}\n {props.error}\n \n \n \n {props.submitButton}\n {props.cancelButton}\n \n \n );\n};\n\nconst createReportModal = (props: IReportReviewModalViewProps, state: IReviewsListState): JSX.Element => {\n return (\n \n \n {state.reported ? props.headerSubmitted : props.header}\n \n \n {state.reported ? props.reportSubmittedMessage : [props.reportMessage, props.radioButtons, props.error]}\n \n \n {state.reported ? props.succesfulButton : [props.submitButton, props.cancelButton]}\n \n \n );\n};\n\nexport default ReviewsListview;","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\nimport * as React from 'react';\n\nimport {getPayloadObject, getTelemetryAttributes, INodeProps, ITelemetryContent, Module, Node } from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport { IWishlistItemViewProps } from '../..';\nimport { IWishlistItemsViewProps } from './wishlist-items';\n\nconst WishlistItemsView: React.FC = props => {\n const { WishlistItems, status, statusMessage, heading, Products, products, Product, ProductDetails, ProductDimensions, telemetryContent } = props;\n\n return (\n \n {heading}\n {status !== 'SUCCESS' && statusMessage}\n { Products && products && products.length > 0 &&\n \n {products && products.map((product) => {\n return _renderItem(product, Product, ProductDimensions, ProductDetails, telemetryContent);\n })}\n \n }\n \n );\n};\n\nconst _renderItem = (product: IWishlistItemViewProps, Product?: INodeProps, ProductDimensions?: INodeProps, ProductDetails?: INodeProps, telemetryContent?: ITelemetryContent): JSX.Element | null => {\n\n const { key, productImage, productLink, productPrice, productDimensions, addToCartButton, removeButton, productStatusMessage, entireProductLink, productName, productAriaLabel, inventoryInformation } = product;\n const payLoad = getPayloadObject('click', telemetryContent!, '', key);\n const productAttributes = getTelemetryAttributes(telemetryContent!, payLoad);\n if (entireProductLink) {\n return (\n \n \n {productImage}\n {productName}\n {productDimensions && ProductDimensions &&\n \n {\n productDimensions.map((dimension) => {\n return dimension;\n })\n }\n \n }\n {productPrice}\n \n {inventoryInformation}\n {addToCartButton}\n {removeButton}\n {productStatusMessage}\n \n );\n } else {\n return (\n \n { productImage }\n { productLink }\n { productDimensions && ProductDimensions &&\n \n {\n productDimensions.map((dimension) => {\n return dimension;\n })\n }\n \n }\n { productPrice }\n { addToCartButton }\n { removeButton }\n { productStatusMessage }\n \n );\n }\n};\n\nexport default WishlistItemsView;","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\nimport { Button, INodeProps, Modal, ModalBody, ModalFooter, ModalHeader, Module, Node } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\nimport { IOrderTemplateLineViewProps } from './components';\nimport { IOrderTemplateViewProps } from './order-template';\n\nconst OrderTemplateLinesView: React.FC = (props: IOrderTemplateViewProps) => {\n const {\n OrderTemplateLines,\n status,\n statusMessage,\n heading,\n ProductsTable,\n ProductsTableHeading,\n orderLines,\n ProductsTableRow,\n productsStatusMessage,\n OrderTemplateActions,\n orderActions,\n pagination,\n itemAddedToCartDialog,\n bulkOrderLineActions,\n isDetailsDisplayed,\n detailedProductView,\n toggleDetailsDisplayed,\n resources: {\n cancelBtnLabel,\n productNumberText,\n productText,\n productUnitPriceText,\n productUOMText,\n productQuantityText\n }\n } = props;\n\n const toggleDetails = () => {\n toggleDetailsDisplayed && toggleDetailsDisplayed(undefined);\n };\n\n return (\n \n {heading}\n {OrderTemplateActions && (\n \n {orderActions?.addTemplateToBag}\n {orderActions?.renameTemplate}\n {orderActions?.removeTemplate}\n {!isDetailsDisplayed && productsStatusMessage}\n \n )}\n {bulkOrderLineActions}\n {status !== 'SUCCESS' && statusMessage}\n {ProductsTable && orderLines && orderLines.length > 0 && (\n \n \n {ProductsTableHeading}\n \n {orderLines &&\n orderLines.map(product => {\n return _renderItem(product, productQuantityText, ProductsTableRow);\n })}\n \n \n {pagination}\n \n )}\n {itemAddedToCartDialog}\n \n \n Product Details\n \n \n
      \n
    • {detailedProductView?.productImage}
    • \n
    • {productText}:{detailedProductView?.productInfo}
    • \n
    • {productNumberText}:{detailedProductView?.productNumber}
    • \n
    • {productUnitPriceText}: {detailedProductView?.productPrice}
    • \n
    • {productUOMText}: {detailedProductView?.productUnitOfMeasure}
    • \n
    • {productQuantityText}:{detailedProductView?.productQuantityView}
    • \n {productsStatusMessage &&
    • {productsStatusMessage}
    • }\n
    \n
    \n \n \n \n \n
    \n );\n};\n\nconst _renderItem = (\n product: IOrderTemplateLineViewProps,\n quantityLabel: string,\n ProductsTableRow?: INodeProps\n): JSX.Element | null => {\n if (!product) {\n return null;\n }\n\n const {\n key,\n selectLine,\n productImage,\n productPrice,\n productNumber,\n addToBagButton,\n removeButton,\n productInfo,\n productUnitOfMeasure,\n productQuantityView,\n productQuantity,\n popUp,\n isMobile\n } = product;\n\n return (\n \n {selectLine}\n {productImage}\n {isMobile ?
    {productNumber}
    {quantityLabel}: {productQuantity}
    : {productNumber}}\n {!isMobile && {productInfo}}\n {!isMobile && {productPrice}}\n {!isMobile && {productUnitOfMeasure}}\n {!isMobile && {productQuantityView}}\n {isMobile && {popUp} }\n {!isMobile &&\n \n {addToBagButton}\n {removeButton}\n }\n
    \n );\n};\n\nexport default OrderTemplateLinesView;\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\n\r\n\r\nimport { INodeProps, Module, Node } from '@msdyn365-commerce-modules/utilities';\r\nimport * as React from 'react';\r\nimport { ISearchCategoryViewProps, ISearchFormViewProps, ISearchKeywordViewProps, ISearchProductViewProps } from '../../../modules/smwe-search/./components';\r\nimport { ISearchViewProps } from '../../../modules/smwe-search/./smwe-search';\r\n\r\nconst SearchView: React.FC = props => {\r\n const {\r\n Search,\r\n AutoSuggestAriaLabel,\r\n AutoSuggestAriaLabelText,\r\n searchText,\r\n AutoSuggest,\r\n KeywordSuggest,\r\n ProductSuggest,\r\n CategorySuggest,\r\n UlKeyword,\r\n UlProduct,\r\n UlCategory,\r\n form,\r\n autosuggestCategory,\r\n autosuggestKeyword,\r\n autosuggestProduct,\r\n SearchForm,\r\n FormWrapper,\r\n label\r\n } = props;\r\n\r\n return (\r\n \r\n {label}\r\n {_renderForm(form as ISearchFormViewProps, SearchForm, FormWrapper)}\r\n \r\n {searchText && searchText.length > 0 ?\r\n {AutoSuggestAriaLabelText} : ''\r\n }\r\n {_renderKeywordSuggestions(KeywordSuggest, UlKeyword, autosuggestKeyword)}\r\n {_renderProductSuggestions(ProductSuggest, UlProduct, autosuggestProduct)}\r\n {_renderCategorySuggestions(CategorySuggest, UlCategory, autosuggestCategory)}\r\n \r\n \r\n );\r\n};\r\n\r\nconst _renderForm = (form: ISearchFormViewProps, SearchForm: INodeProps, FormWrapper: INodeProps) => {\r\n return (\r\n \r\n \r\n {form.submitBtn}\r\n {form.label}\r\n {form.input}\r\n {form.cancelBtn}\r\n \r\n \r\n );\r\n};\r\n\r\nconst _renderKeywordSuggestions = (\r\n KeywordSuggest: INodeProps,\r\n UlKeyword: INodeProps,\r\n keywordSuggestions?: ISearchKeywordViewProps\r\n) => {\r\n return (\r\n keywordSuggestions && (\r\n \r\n \r\n {keywordSuggestions.text.map(text => {\r\n return text;\r\n })}\r\n \r\n \r\n )\r\n );\r\n};\r\n\r\nconst _renderProductSuggestions = (\r\n ProductSuggest: INodeProps,\r\n UlProduct: INodeProps,\r\n productSuggestions?: ISearchProductViewProps\r\n) => {\r\n return (\r\n productSuggestions && (\r\n \r\n \r\n {productSuggestions.title}\r\n {productSuggestions.items.map((item, index) => {\r\n return (\r\n \r\n \r\n {item.thumbnail}\r\n {item.text}\r\n {item.price !== 0 && (
    {item.price}
    )}\r\n
    \r\n
    \r\n );\r\n })}\r\n
    \r\n
    \r\n )\r\n );\r\n};\r\n\r\nconst _renderCategorySuggestions = (\r\n CategorySuggest: INodeProps,\r\n UlCategory: INodeProps,\r\n categorySuggestions?: ISearchCategoryViewProps\r\n) => {\r\n return (\r\n categorySuggestions && (\r\n \r\n \r\n {categorySuggestions.title}\r\n {categorySuggestions.text.map(text => {\r\n return text;\r\n })}\r\n \r\n \r\n )\r\n );\r\n};\r\n\r\nexport default SearchView;","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\nimport { Module, Node } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\nimport { IHistogramItemViewProps } from './component/components';\nimport { IRatingsHistogramViewProps } from './ratings-histogram';\n\nconst RatingsHistogramView: React.FC = props => {\n const {heading, histogramItems, histogramProps, moduleProps} = props;\n // tslint:disable\n return (\n \n {heading}\n \n {histogramItems.map(item => {\n return histogramItem(item);\n })}\n \n \n );\n};\n\nconst histogramItem = (props: IHistogramItemViewProps) => {\n return (\n \n {props.starLabel}\n {props.bar}\n {props.percentage}\n \n );\n};\n\nexport default RatingsHistogramView;","/*---------------------------------------------------------------------------------------------\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\n\r\n\r\nimport { INodeProps, Module, Node } from '@msdyn365-commerce-modules/utilities';\r\nimport * as React from 'react';\r\nimport { ISearchCategoryViewProps, ISearchFormViewProps, ISearchKeywordViewProps, ISearchProductViewProps } from '../../../modules/smwe-search/./components';\r\nimport { ISearchViewProps } from '../../../modules/smwe-search/./smwe-search';\r\n\r\nconst SearchView: React.FC = props => {\r\n const {\r\n Search,\r\n AutoSuggestAriaLabel,\r\n AutoSuggestAriaLabelText,\r\n searchText,\r\n AutoSuggest,\r\n KeywordSuggest,\r\n ProductSuggest,\r\n CategorySuggest,\r\n UlKeyword,\r\n UlProduct,\r\n UlCategory,\r\n form,\r\n autosuggestCategory,\r\n autosuggestKeyword,\r\n autosuggestProduct,\r\n SearchForm,\r\n FormWrapper,\r\n label\r\n } = props;\r\n\r\n return (\r\n \r\n {label}\r\n {_renderForm(form as ISearchFormViewProps, SearchForm, FormWrapper)}\r\n \r\n {searchText && searchText.length > 0 ?\r\n {AutoSuggestAriaLabelText} : ''\r\n }\r\n {_renderKeywordSuggestions(KeywordSuggest, UlKeyword, autosuggestKeyword)}\r\n {_renderProductSuggestions(ProductSuggest, UlProduct, autosuggestProduct)}\r\n {_renderCategorySuggestions(CategorySuggest, UlCategory, autosuggestCategory)}\r\n \r\n \r\n );\r\n};\r\n\r\nconst _renderForm = (form: ISearchFormViewProps, SearchForm: INodeProps, FormWrapper: INodeProps) => {\r\n return (\r\n \r\n \r\n {form.submitBtn}\r\n {form.label}\r\n {form.input}\r\n {form.cancelBtn}\r\n \r\n \r\n );\r\n};\r\n\r\nconst _renderKeywordSuggestions = (\r\n KeywordSuggest: INodeProps,\r\n UlKeyword: INodeProps,\r\n keywordSuggestions?: ISearchKeywordViewProps\r\n) => {\r\n return (\r\n keywordSuggestions && (\r\n \r\n \r\n {keywordSuggestions.text.map(text => {\r\n return text;\r\n })}\r\n \r\n \r\n )\r\n );\r\n};\r\n\r\nconst _renderProductSuggestions = (\r\n ProductSuggest: INodeProps,\r\n UlProduct: INodeProps,\r\n productSuggestions?: ISearchProductViewProps\r\n) => {\r\n return (\r\n productSuggestions && (\r\n \r\n \r\n {productSuggestions.title}\r\n {productSuggestions.items.map((item, index) => {\r\n return (\r\n \r\n \r\n {item.thumbnail}\r\n {item.text}\r\n {item.price !== 0 && (
    {item.price}
    )}\r\n
    \r\n
    \r\n );\r\n })}\r\n
    \r\n
    \r\n )\r\n );\r\n};\r\n\r\nconst _renderCategorySuggestions = (\r\n CategorySuggest: INodeProps,\r\n UlCategory: INodeProps,\r\n categorySuggestions?: ISearchCategoryViewProps\r\n) => {\r\n return (\r\n categorySuggestions && (\r\n \r\n \r\n {categorySuggestions.title}\r\n {categorySuggestions.text.map(text => {\r\n return text;\r\n })}\r\n \r\n \r\n )\r\n );\r\n};\r\n\r\nexport default SearchView;","/*---------------------------------------------------------------------------------------------\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\n\r\nimport { INodeProps, Module, Node } from '@msdyn365-commerce-modules/utilities';\r\nimport * as React from 'react';\r\nimport { ISearchCategoryViewProps, ISearchFormViewProps, ISearchKeywordViewProps, ISearchProductViewProps } from '../../../modules/smwe-search/./components';\r\nimport { ISearchViewProps } from '../../../modules/smwe-search/./smwe-search';\r\n\r\nconst SearchView: React.FC = props => {\r\n const {\r\n Search,\r\n AutoSuggestAriaLabel,\r\n AutoSuggestAriaLabelText,\r\n searchText,\r\n AutoSuggest,\r\n KeywordSuggest,\r\n ProductSuggest,\r\n CategorySuggest,\r\n UlKeyword,\r\n UlProduct,\r\n UlCategory,\r\n form,\r\n autosuggestCategory,\r\n autosuggestKeyword,\r\n autosuggestProduct,\r\n SearchForm,\r\n FormWrapper,\r\n label\r\n } = props;\r\n\r\n return (\r\n \r\n {label}\r\n {_renderForm(form as ISearchFormViewProps, SearchForm, FormWrapper)}\r\n \r\n {searchText && searchText.length > 0 ?\r\n {AutoSuggestAriaLabelText} : ''\r\n }\r\n {_renderKeywordSuggestions(KeywordSuggest, UlKeyword, autosuggestKeyword)}\r\n {_renderProductSuggestions(ProductSuggest, UlProduct, autosuggestProduct)}\r\n {_renderCategorySuggestions(CategorySuggest, UlCategory, autosuggestCategory)}\r\n \r\n \r\n );\r\n};\r\n\r\nconst _renderForm = (form: ISearchFormViewProps, SearchForm: INodeProps, FormWrapper: INodeProps) => {\r\n return (\r\n \r\n \r\n {form.submitBtn}\r\n {form.label}\r\n {form.input}\r\n {form.cancelBtn}\r\n \r\n \r\n );\r\n};\r\n\r\nconst _renderKeywordSuggestions = (\r\n KeywordSuggest: INodeProps,\r\n UlKeyword: INodeProps,\r\n keywordSuggestions?: ISearchKeywordViewProps\r\n) => {\r\n return (\r\n keywordSuggestions && (\r\n \r\n \r\n {keywordSuggestions.text.map(text => {\r\n return text;\r\n })}\r\n \r\n \r\n )\r\n );\r\n};\r\n\r\nconst _renderProductSuggestions = (\r\n ProductSuggest: INodeProps,\r\n UlProduct: INodeProps,\r\n productSuggestions?: ISearchProductViewProps\r\n) => {\r\n return (\r\n productSuggestions && (\r\n \r\n \r\n {productSuggestions.title}\r\n {productSuggestions.items.map((item, index) => {\r\n return (\r\n \r\n \r\n {item.thumbnail}\r\n {item.text}\r\n {item.price !== 0 && (
    {item.price}
    )}\r\n
    \r\n
    \r\n );\r\n })}\r\n
    \r\n
    \r\n )\r\n );\r\n};\r\n\r\nconst _renderCategorySuggestions = (\r\n CategorySuggest: INodeProps,\r\n UlCategory: INodeProps,\r\n categorySuggestions?: ISearchCategoryViewProps\r\n) => {\r\n return (\r\n categorySuggestions && (\r\n \r\n \r\n {categorySuggestions.title}\r\n {categorySuggestions.text.map(text => {\r\n return text;\r\n })}\r\n \r\n \r\n )\r\n );\r\n};\r\n\r\nexport default SearchView;","import { generateImageUrl } from '@msdyn365-commerce-modules/retail-actions';\nimport { Autosuggestions } from '@msdyn365-commerce/commerce-entities';\nimport {\n CacheType, createObservableDataAction, IAction, IActionContext, IActionInput,\n ICreateActionContext\n} from '@msdyn365-commerce/core';\nimport { SearchSuggestion, SearchSuggestionCriteria } from '@msdyn365-commerce/retail-proxy';\nimport {\n getSearchSuggestionsAsync\n} from '@msdyn365-commerce/retail-proxy/dist/DataActions/StoreOperationsDataActions.g';\n\n// @ts-ignore\nexport const enum SuggestionType {\n Category = 'ScopedCategory',\n Keyword = 'Keyword',\n Product = 'Product',\n None = 'None'\n}\n\n/**\n * Input class for auto suggest search input\n */\nexport class AutoSuggestInput implements IActionInput {\n public searchQuery?: string;\n public topResultsCount?: number;\n public suggestionType?: string;\n public hitPrefix?: string;\n public hitSuffix?: string;\n\n constructor(searchText?: string, top?: number, suggestionType?: string, hitPrefix?: string, hitSuffix?: string) {\n this.searchQuery = searchText;\n this.topResultsCount = top;\n this.suggestionType = suggestionType;\n this.hitPrefix = hitPrefix;\n this.hitSuffix = hitSuffix;\n }\n\n public getCacheKey = () => `AutoSuggestSearchSuggestions`;\n public getCacheObjectType = () => 'AutoSuggestSearchSuggestions';\n public dataCacheType = (): CacheType => 'none';\n}\n\nconst createInput = (inputData: ICreateActionContext) => {\n return new AutoSuggestInput();\n};\n\n/**\n * Calls the Retail API and returns a auto-suggest suggestions\n */\nexport async function getSearchSuggestionsAction(input: AutoSuggestInput, ctx: IActionContext): Promise {\n // If no input is provided fail out\n if (!input || !input.searchQuery) {\n throw new Error('[getSearchSuggestionsAction]No valid Input was provided, failing');\n }\n\n const autosuggest: Autosuggestions = {};\n\n const autoSuggestPromises = [\n _getAutoSuggest(input, autosuggest, ctx),\n ];\n return Promise.all(autoSuggestPromises).then(() => {\n return autosuggest;\n });\n}\n\nasync function _getAutoSuggest(\n input: AutoSuggestInput,\n autosuggest: Autosuggestions,\n ctx: IActionContext\n): Promise {\n const searchCriteria: SearchSuggestionCriteria = {\n ProductSearchCriteria: {\n SearchCondition: input.searchQuery && input.searchQuery.length > 0 ? input.searchQuery : '',\n Context: {\n ChannelId: +ctx.requestContext.apiSettings.channelId,\n CatalogId: +ctx.requestContext.apiSettings.catalogId\n }\n },\n HitPrefix: input.hitPrefix,\n HitSuffix: input.hitSuffix,\n SuggestionType: input.suggestionType\n };\n\n const searchSuggestions = await getSearchSuggestionsAsync(\n { callerContext: ctx, queryResultSettings: { Paging: { Top: input.topResultsCount } } },\n searchCriteria\n );\n\n if (searchSuggestions && searchSuggestions.length > 0) {\n // Generate image url\n searchSuggestions.map(\n (item: SearchSuggestion) =>\n (item.ImageUrl = item.ImageUrl ? generateImageUrl(item.ImageUrl, ctx.requestContext.apiSettings) : '')\n );\n\n autosuggest.AllSearchResults = searchSuggestions;\n } else {\n ctx.telemetry.error(`[getSearchSuggestionsAction] unable to get availabilites for search with suggestion type ${searchCriteria.SuggestionType}`);\n }\n}\n\nexport default createObservableDataAction({\n id: '@msdyn365-commerce-modules/search/get-auto-suggest-suggestions',\n action: >getSearchSuggestionsAction,\n input: createInput\n});\n","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport * as React from 'react';\n\nimport { getPayloadObject, getTelemetryAttributes, IPayLoad, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\nimport { getRichTextHtml } from '@msdyn365-commerce/core';\nimport { SearchSuggestion } from '@msdyn365-commerce/retail-proxy';\n\nimport { ISearchData } from '../search.data';\nimport { ISearchProps } from '../search.props.autogenerated';\n\nexport interface ISearchKeywordSuggestProps {\n searchKeywordSuggestClass: string;\n searchPageURL: string;\n searchQsp: string | undefined;\n hitPrefix: string;\n hitSuffix: string;\n autoSuggestProps: ISearchProps;\n searchText: string;\n suggestions: SearchSuggestion[] | undefined;\n telemetryContent?: ITelemetryContent;\n}\n\nexport interface ISearchKeywordViewProps {\n text: React.ReactNode[];\n}\n\nlet payLoad: IPayLoad;\n\n/**\n *\n * KeywordSuggestionsComponent\n */\nexport const KeywordSuggestionsComponent = (props: ISearchKeywordSuggestProps): ISearchKeywordViewProps | undefined => {\n const {\n suggestions,\n hitPrefix,\n hitSuffix\n } = props;\n\n if (!suggestions) {\n return undefined;\n }\n\n payLoad = getPayloadObject('click', props.telemetryContent!, '');\n\n const reactNodes: React.ReactNode[] = [];\n\n suggestions.map(item => {\n reactNodes.push(_assembleNode(item, hitPrefix, hitSuffix, props));\n });\n\n return { text: reactNodes };\n};\n\nconst _assembleNode = (item: SearchSuggestion, hitPrefix: string, hitSuffix: string, props: ISearchKeywordSuggestProps) => {\n const ariaLabel = item.Value &&\n (item.Value).replace(new RegExp(`[${hitPrefix}]`, 'gi'), '').replace(new RegExp(`[${hitSuffix}]`, 'gi'), '');\n payLoad.contentAction.etext = ariaLabel;\n const attribute = getTelemetryAttributes(props.telemetryContent!, payLoad);\n return (\n
  • \n \n {_generateLink(item, hitPrefix, hitSuffix, props) &&\n _getHighlightedText(item.Value ? item.Value : '', hitPrefix, hitSuffix)}\n \n
  • \n );\n};\n\nconst _generateLink = (suggestion: SearchSuggestion, hitPrefix: string, hitSuffix: string, props: ISearchKeywordSuggestProps): string => {\n const { searchPageURL, searchQsp } = props;\n\n const formattedLink = (suggestion.Value as string)\n .replace(new RegExp(`[${hitPrefix}]`, 'gi'), '')\n .replace(new RegExp(`[${hitSuffix}]`, 'gi'), '');\n const route = searchPageURL || '';\n return formattedLink && formattedLink.length > 0\n ? `${route}${route.indexOf('?') === -1 ? '?' : '&'}${searchQsp}=${formattedLink}`\n : route;\n};\n\nconst _getHighlightedText = (suggestion: string, hitPrefix: string, hitSuffix: string): JSX.Element => {\n const formattedText = suggestion\n .replace(new RegExp(`[${hitPrefix}]`, 'gi'), '')\n .replace(new RegExp(`[${hitSuffix}]`, 'gi'), '');\n\n // tslint:disable:react-no-dangerous-html\n return ;\n};\n","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport * as React from 'react';\n\nimport { PriceComponent } from '@msdyn365-commerce/components';\nimport { getRichTextHtml, IActionContext, IImageSettings, Image, ITelemetry } from '@msdyn365-commerce/core';\nimport { SearchSuggestion } from '@msdyn365-commerce/retail-proxy';\n\nimport { getProductPageUrlSync } from '@msdyn365-commerce-modules/retail-actions';\nimport { getPayloadObject, getTelemetryAttributes, INodeProps, IPayLoad, ITelemetryContent, NodeTag } from '@msdyn365-commerce-modules/utilities';\nimport { ISearchData } from '../search.data';\nimport { ISearchProps } from '../search.props.autogenerated';\n\nexport interface ISearchProductSuggestProps {\n searchProductSuggestClass: string;\n searchPageURL: string;\n searchQsp: string | undefined;\n hitPrefix: string;\n hitSuffix: string;\n autoSuggestProps: ISearchProps;\n searchText: string;\n suggestions: SearchSuggestion[] | undefined;\n telemetry: ITelemetry;\n moduleType: string;\n moduleId: string;\n telemetryContent?: ITelemetryContent;\n}\n\nexport interface ISearchProductViewProps {\n title: React.ReactNode;\n items: ISearchProductItemViewProps[];\n}\n\nexport interface ISearchProductItemViewProps {\n text: React.ReactNode;\n thumbnail: React.ReactNode;\n price: React.ReactNode;\n LiProduct: INodeProps;\n AProduct: INodeProps;\n id: string | undefined;\n}\n\nlet payLoad: IPayLoad;\nlet telemetryContent: ITelemetryContent | undefined;\n\n/**\n *\n * ProductSuggestionsComponent\n */\nexport const ProductSuggestionsComponent = (props: ISearchProductSuggestProps): ISearchProductViewProps | undefined => {\n const {\n suggestions,\n hitSuffix,\n hitPrefix,\n autoSuggestProps: {\n context: { actionContext },\n resources: { productSuggestionHeading }\n },\n moduleType,\n moduleId\n } = props;\n const reactNodes: ISearchProductItemViewProps[] = [];\n telemetryContent = props.telemetryContent;\n payLoad = getPayloadObject('click', props.telemetryContent!, '');\n\n if (!suggestions) {\n return undefined;\n }\n\n suggestions.map(item => {\n reactNodes.push(_assembleNode(item, hitPrefix, hitSuffix, actionContext, props, moduleType, moduleId));\n });\n\n const titleNode = _renderTitle(productSuggestionHeading);\n\n return { title: titleNode, items: reactNodes };\n};\n\nconst _renderTitle = (productSuggestionHeading: string) => {\n const productAutoSuggestionHeading = productSuggestionHeading ? productSuggestionHeading : 'Go to products';\n\n return
  • {productAutoSuggestionHeading}
  • ;\n};\n\nconst _assembleNode = (\n item: SearchSuggestion,\n hitPrefix: string,\n hitSuffix: string,\n actionContext: IActionContext,\n props: ISearchProductSuggestProps,\n moduleType: string,\n moduleId: string\n): ISearchProductItemViewProps => {\n const altText =\n item.Value &&\n (item.Value).replace(new RegExp(`[${hitPrefix}]`, 'gi'), '').replace(new RegExp(`[${hitSuffix}]`, 'gi'), '');\n\n return {\n text: _getHighlightedText(item.Value ? item.Value : '', hitPrefix, hitSuffix),\n thumbnail: _renderThumbnail(item, altText ? altText : '', props),\n price:\n item.Id &&\n item.Value3 &&\n item.Value3.Value &&\n item.Value3.Value.DecimalValue &&\n _renderPrice(item.Value3.Value.DecimalValue, item.Value3.Value.DecimalValue, moduleId, moduleType, props),\n LiProduct: _getLiWrapper(),\n AProduct: _getAWrapper(item, hitPrefix, hitSuffix, actionContext),\n id: item.Id\n };\n};\n\nconst _getLiWrapper = () => {\n return {\n className: 'msc-autoSuggest__productResults-item',\n tag: 'li' as NodeTag\n };\n};\n\nconst _getAWrapper = (item: SearchSuggestion, hitPrefix: string, hitSuffix: string, actionContext: IActionContext) => {\n const ariaLabel = item.Value &&\n (item.Value).replace(new RegExp(`[${hitPrefix}]`, 'gi'), '').replace(new RegExp(`[${hitSuffix}]`, 'gi'), '');\n\n payLoad.contentAction.recid = item.Id;\n const attribute = getTelemetryAttributes(telemetryContent!, payLoad);\n\n return {\n className: 'msc-autoSuggest__productResults-item',\n tag: 'a' as NodeTag,\n 'aria-label': ariaLabel,\n href: _generateLink(item, hitPrefix, hitSuffix, actionContext),\n ...attribute\n };\n};\n\nconst _generateLink = (suggestion: SearchSuggestion, hitPrefix: string, hitSuffix: string, actionContext: IActionContext) => {\n const formattedLink = (suggestion.Value as string).replace(new RegExp(`[${hitPrefix}]`, 'gi'), '').replace(new RegExp(`[${hitSuffix}]`, 'gi'), '');\n return suggestion.Value && suggestion.Id ?\n getProductPageUrlSync(formattedLink,suggestion.Id as unknown as number, actionContext, undefined) : '';\n};\n\nconst _getHighlightedText = (suggestion: string, hitPrefix: string, hitSuffix: string): JSX.Element => {\n const formattedText = suggestion\n .replace(new RegExp(`[${hitPrefix}]`, 'gi'), '')\n .replace(new RegExp(`[${hitSuffix}]`, 'gi'), '');\n\n // tslint:disable:react-no-dangerous-html\n return ;\n};\n\nconst _renderPrice = (adjustedPrice: number, basePrice: number, moduleId: string, moduleType: string, props: ISearchProductSuggestProps): JSX.Element | null => {\n const {\n autoSuggestProps: { context }\n } = props;\n\n return (\n \n );\n};\n\nconst _renderThumbnail = (suggestion: SearchSuggestion, altText: string, props: ISearchProductSuggestProps): JSX.Element | null => {\n const {\n autoSuggestProps: {\n context: {\n request: { gridSettings }\n },\n config: { imageSettings }\n }\n } = props;\n if(imageSettings) {\n imageSettings.cropFocalRegion = true;\n }\n\n if (!suggestion || !suggestion.ImageUrl) {\n props.telemetry.error('Search suggestion content is empty, module wont render.');\n return null;\n }\n\n const defaultImageSettings: IImageSettings = {\n viewports: {\n xs: { q: `w=40&h=40&m=6`, w: 0, h: 0 },\n lg: { q: `w=40&h=40&m=6`, w: 0, h: 0 },\n xl: { q: `w=40&h=40&m=6`, w: 0, h: 0 }\n },\n lazyload: true,\n cropFocalRegion: true\n };\n\n return (\n \n );\n};\n","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport * as React from 'react';\n\nimport { getRichTextHtml } from '@msdyn365-commerce/core';\nimport { ProductRefiner, ProductRefinerValue, SearchSuggestion } from '@msdyn365-commerce/retail-proxy';\n\nimport { format, getPayloadObject, getTelemetryAttributes, IPayLoad, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\nimport { ISearchData } from '../search.data';\nimport { ISearchProps } from '../search.props.autogenerated';\n\nexport interface ISearchCategorySuggestProps {\n searchCategorySuggestClass: string;\n searchPageURL: string;\n searchQsp: string | undefined;\n hitPrefix: string;\n hitSuffix: string;\n autoSuggestProps: ISearchProps;\n searchText: string;\n searchRefiners: ProductRefiner[] | undefined;\n suggestions: SearchSuggestion[] | undefined;\n telemetryContent?: ITelemetryContent;\n}\n\nexport interface ISearchCategoryViewProps {\n title: React.ReactNode;\n text: React.ReactNode[];\n}\n\nlet payLoad: IPayLoad;\n\n/**\n *\n * CategorySuggestionsComponent\n */\nexport const CategorySuggestionsComponent = (props: ISearchCategorySuggestProps): ISearchCategoryViewProps | undefined => {\n const {\n suggestions,\n searchText,\n autoSuggestProps: {\n resources: { categorySuggestionHeading }\n }\n } = props;\n\n if (!suggestions) {\n return undefined;\n }\n\n const reactNodes: React.ReactNode[] = [];\n payLoad = getPayloadObject('click', props.telemetryContent!, '');\n\n suggestions.map(item => {\n reactNodes.push(_assembleNode(item, props));\n });\n\n const titleNode = _renderTitle(categorySuggestionHeading, searchText);\n\n return { title: titleNode, text: reactNodes };\n};\n\nconst _renderTitle = (categorySuggestionHeading: string, searchText: string) => {\n const categoryAutoSuggestionHeading = categorySuggestionHeading\n ? format(categorySuggestionHeading, searchText)\n : `Search \"${searchText}\" in categories`;\n\n return
  • {categoryAutoSuggestionHeading}
  • ;\n};\n\nconst _assembleNode = (item: SearchSuggestion, props: ISearchCategorySuggestProps) => {\n const { searchText, hitPrefix, hitSuffix } = props;\n\n const splitValue = item.Value && item.Value.split('|').pop();\n const ariaLabel = splitValue\n ? splitValue.replace(new RegExp(`[${hitPrefix}]`, 'gi'), '').replace(new RegExp(`[${hitSuffix}]`, 'gi'), '')\n : item.Value && item.Value.replace(new RegExp(`[${hitPrefix}]`, 'gi'), '').replace(new RegExp(`[${hitSuffix}]`, 'gi'), '');\n payLoad.contentAction.etext = item.Value;\n const attribute = getTelemetryAttributes(props.telemetryContent!, payLoad);\n return (\n
  • \n \n {_generateLink(item, searchText, props) && _getHighlightedText(item.Value ? item.Value : '', hitPrefix, hitSuffix)}\n \n
  • \n );\n};\n\nconst _generateLink = (suggestion: SearchSuggestion, searchText: string, props: ISearchCategorySuggestProps): string => {\n return suggestion && suggestion.Id ? _getCategoryLink(suggestion.Id, searchText, props) : '';\n};\n\nconst _getCategoryLink = (id: string, searchText: string, props: ISearchCategorySuggestProps): string => {\n const { searchPageURL, searchQsp, searchRefiners } = props;\n\n const route = searchPageURL || '';\n const urlPath = `${route}${route.indexOf('?') === -1 ? '?' : '&'}${searchQsp}=${searchText}`;\n const categoryRefiners =\n searchRefiners &&\n searchRefiners.find(refiners => {\n return refiners.KeyName === 'Category';\n });\n const refiner =\n categoryRefiners &&\n categoryRefiners.Values &&\n categoryRefiners.Values.find(item => {\n return item.RefinerRecordId === parseInt(id, 10);\n });\n\n const encodedRefiner = refiner && encodeURIComponent(JSON.stringify(compressRefiners([refiner])));\n\n return encodedRefiner ? `${urlPath}&refiners=${encodedRefiner}` : urlPath;\n};\n\nconst _getHighlightedText = (suggestion: string, hitPrefix: string, hitSuffix: string): JSX.Element => {\n let formattedText = suggestion\n .replace(new RegExp(`[${hitPrefix}]`, 'gi'), '')\n .replace(new RegExp(`[${hitSuffix}]`, 'gi'), '');\n formattedText = formattedText.split('|').pop() || '';\n\n // tslint:disable:react-no-dangerous-html\n return ;\n};\n\n// TODO: This code is currently duplicated in categoryautosuggest need to either remove one of these files\n// or move this code to a common place\nconst compressedRefinerKeys = ['DataTypeValue', 'LeftValueBoundString', 'RefinerRecordId', 'RefinerSourceValue', 'RightValueBoundString', 'UnitText'];\n\n/**\n * Compressed a list of refiners for use in URLs\n * @param refiners The uncompressed refiners\n */\nconst compressRefiners = (refiners: ProductRefinerValue[]) => {\n const compressedRefiners: (string | number)[][] = [];\n\n refiners.forEach((refiner) => {\n const compressedRefiner: (string | number)[] = [];\n compressedRefinerKeys.forEach((refinerKey) => {\n // @ts-ignore: This line is intentionally not typesafe\n compressedRefiner.push(refiner[refinerKey]);\n });\n compressedRefiners.push(compressedRefiner);\n });\n\n return compressedRefiners;\n};\n","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport { Button } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nexport interface ISearchFormProps {\n hideSearchLabel: boolean | undefined;\n isSearchFormExpanded: boolean | undefined;\n disableSubmitSearch: boolean | undefined;\n searchTextInput: React.RefObject;\n maxChars: number;\n searchQsp: string;\n searchPlaceholder: string;\n query: string;\n ariaLabelCancel: string;\n ariaLabelSearch: string;\n ariaLabelSubmit: string;\n handleCancelSearchChange(): void;\n handleInputChange(query: string): void;\n}\n\nexport interface ISearchFormViewProps {\n input: React.ReactNode;\n submitBtn: React.ReactNode;\n cancelBtn: React.ReactNode;\n\n}\n\nexport const FormComponent = (props: ISearchFormProps): ISearchFormViewProps => {\n const {\n searchQsp,\n searchPlaceholder,\n hideSearchLabel,\n isSearchFormExpanded,\n searchTextInput,\n handleInputChange,\n maxChars,\n disableSubmitSearch,\n handleCancelSearchChange,\n query,\n ariaLabelCancel,\n ariaLabelSearch,\n ariaLabelSubmit\n } = props;\n\n const onInputChange = (e: React.ChangeEvent): void => {\n handleInputChange(e.target.value || '');\n };\n\n const inputNode = !hideSearchLabel ? (\n \n ) : (\n \n );\n\n const submitBtnNode = !disableSubmitSearch && (\n \n
    \n );\n};\n","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport { createSearchStateInput } from '@msdyn365-commerce-modules/search-utilities';\nimport { getTelemetryObject, IModuleProps, INodeProps, ITelemetryContent, KeyCodes } from '@msdyn365-commerce-modules/utilities';\nimport { Autosuggestions } from '@msdyn365-commerce/commerce-entities';\nimport { getUrlSync } from '@msdyn365-commerce/core';\nimport { ProductRefiner } from '@msdyn365-commerce/retail-proxy';\nimport { getProductSearchRefinersAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/ProductsDataActions.g';\nimport classnames from 'classnames';\nimport { debounce } from 'lodash';\nimport * as React from 'react';\n\nimport getSearchSuggestionsAction, { AutoSuggestInput, SuggestionType } from './actions/get-auto-suggest-suggestions';\nimport {\n CategorySuggestionsComponent,\n FormComponent,\n ISearchCategoryViewProps,\n ISearchKeywordViewProps,\n ISearchProductViewProps,\n KeywordSuggestionsComponent,\n LabelComponent,\n ProductSuggestionsComponent\n} from './components';\nimport { ISearchData } from './search.data';\nimport { ISearchProps, ISuggestionTypeCriterionData } from './search.props.autogenerated';\n\nexport interface ISearchState {\n isSearchFormExpanded: boolean;\n searchText: string;\n searchKeywordSuggestClass: string;\n searchProductSuggestClass: string;\n searchCategorySuggestClass: string;\n suggestions: Autosuggestions | undefined;\n searchRefiners?: ProductRefiner[] | undefined;\n autoSuggestAriaLabel: string;\n isInitialState: boolean;\n}\n\nexport interface ISearchViewProps extends ISearchProps {\n Search: IModuleProps;\n AutoSuggestAriaLabel: INodeProps;\n AutoSuggestAriaLabelText: string;\n searchText: string;\n AutoSuggest: INodeProps;\n KeywordSuggest: INodeProps;\n ProductSuggest: INodeProps;\n CategorySuggest: INodeProps;\n SearchForm: INodeProps;\n FormWrapper: INodeProps;\n UlKeyword: INodeProps;\n UlProduct: INodeProps;\n UlCategory: INodeProps;\n label: React.ReactNode;\n form: React.ReactNode;\n autosuggestKeyword?: ISearchKeywordViewProps;\n autosuggestProduct?: ISearchProductViewProps;\n autosuggestCategory?: ISearchCategoryViewProps;\n callbacks: {\n handleCancelSearchChange(): void;\n };\n isSearchFormExpanded: boolean;\n}\n\n/**\n *\n * Search module\n * @extends {React.Component, ISearchState>}\n */\nclass Search extends React.Component, ISearchState> {\n private searchTextInput: React.RefObject;\n private searchCollapsedLabel: React.RefObject;\n private formReference: React.RefObject;\n private maxChars: number;\n private inputSuggestionType?: ISuggestionTypeCriterionData[];\n private topResultsCount?: number;\n private hitPrefix: string = '{';\n private hitSuffix: string = '}';\n private waitTime: number = 500;\n private autoSuggestResultScreenReaderDiv: React.RefObject;\n private autoSuggestResultDiv: React.RefObject;\n private searchFormClass: string;\n private searchLabelClass: string;\n private telemetryContent: ITelemetryContent;\n // @ts-ignore\n private cancellabelDebounce: debounce;\n\n constructor(props: ISearchProps) {\n super(props);\n this.searchTextInput = React.createRef();\n this.searchCollapsedLabel = React.createRef();\n this.autoSuggestResultScreenReaderDiv = React.createRef();\n this.autoSuggestResultDiv = React.createRef();\n this.formReference = React.createRef();\n this.state = {\n isSearchFormExpanded: false,\n searchText: '',\n searchKeywordSuggestClass: 'ms-search__autoSuggest__keyword',\n searchProductSuggestClass: 'ms-search__autoSuggest__product',\n searchCategorySuggestClass: 'ms-search__autoSuggest__category',\n suggestions: undefined,\n searchRefiners: undefined,\n autoSuggestAriaLabel: '',\n isInitialState: true\n };\n this.maxChars =\n (this.props.context &&\n this.props.context.app &&\n this.props.context.app.config &&\n this.props.context.app.config.searchInputMaxLength) ||\n 50;\n this.inputSuggestionType = this.props.config && this.props.config.suggestionTypeCriterion;\n this.topResultsCount = this.props.config && this.props.config.topResultsCount ? this.props.config.topResultsCount : 5;\n this.searchFormClass = 'ms-search__form';\n this.searchLabelClass = 'ms-search__label';\n this.telemetryContent = getTelemetryObject(this.props.context.request.telemetryPageName!, this.props.friendlyName, this.props.telemetry);\n }\n\n public async componentDidMount(): Promise {\n document.body && document.body.addEventListener('mousedown', this._focusOutTarget);\n window && window.addEventListener('keyup', this._keyup);\n }\n\n public componentWillUnmount(): void {\n document.body && document.body.removeEventListener('mousedown', this._focusOutTarget, false);\n window && window.removeEventListener('keyup', this._keyup, false);\n }\n\n public componentDidUpdate(): void {\n const {\n config: { hideSearchLabel }\n } = this.props;\n const { isSearchFormExpanded, isInitialState } = this.state;\n\n if (!this.props.context.request.params.isEditor) {\n if (!hideSearchLabel && isSearchFormExpanded) {\n this.searchTextInput && this.searchTextInput.current && this.searchTextInput.current.focus();\n } else if (!isInitialState) {\n this.searchCollapsedLabel && this.searchCollapsedLabel.current && this.searchCollapsedLabel.current.focus();\n }\n }\n }\n\n // tslint:disable-next-line: cyclomatic-complexity max-func-body-length\n public render(): JSX.Element {\n const {\n context,\n resources: { searchtext, searchLabelArialLabel, cancelBtnAriaLabel, searchBtnAriaLabel, submitBtnAriaLabel},\n config: { hideSearchLabel, disableSubmitSearch, searchplaceholderText, className = '' }\n } = this.props;\n\n const {\n isSearchFormExpanded,\n searchText,\n searchKeywordSuggestClass,\n searchProductSuggestClass,\n searchCategorySuggestClass,\n suggestions,\n searchRefiners\n } = this.state;\n\n const searchQsp = (context && context.app && context.app.config && context.app.config.searchQueryStringParameter) || 'q';\n const searchPageURL = getUrlSync('search', context && context.actionContext) || '';\n const searchURL = this._appendQueryParams(searchPageURL, searchText, searchQsp);\n const searchPlaceholder = searchplaceholderText && searchplaceholderText.length > 0 ? searchplaceholderText : 'Search in Fabrikam';\n\n const keywordSuggestions =\n suggestions &&\n suggestions.AllSearchResults &&\n suggestions.AllSearchResults.filter(\n i => i.SuggestionType === SuggestionType.Keyword || i.SuggestionType === SuggestionType.None\n );\n const productSuggestions =\n suggestions &&\n suggestions.AllSearchResults &&\n suggestions.AllSearchResults.filter(i => i.SuggestionType === SuggestionType.Product);\n const categorySuggestions =\n suggestions &&\n suggestions.AllSearchResults &&\n suggestions.AllSearchResults.filter(i => i.SuggestionType === SuggestionType.Category);\n\n const viewProps: ISearchViewProps = {\n ...(this.props as ISearchProps),\n\n Search: {\n moduleProps: this.props,\n className: `${classnames('ms-search', className)} ${disableSubmitSearch ? 'no-submit' : 'with-submit'}`,\n },\n AutoSuggestAriaLabel: {\n tag: 'div',\n className: 'msc-autoSuggest__screen-reader',\n 'aria-live': 'assertive',\n ref: this.autoSuggestResultScreenReaderDiv\n },\n AutoSuggestAriaLabelText: this.state.autoSuggestAriaLabel,\n searchText: this.state.searchText,\n AutoSuggest: {\n ref: this.autoSuggestResultDiv,\n className: 'ms-search__autoSuggest'\n },\n KeywordSuggest: {\n className: searchKeywordSuggestClass\n },\n ProductSuggest: {\n className: searchProductSuggestClass\n },\n CategorySuggest: {\n className: searchCategorySuggestClass\n },\n SearchForm: {\n className: `${this.searchFormClass} ${isSearchFormExpanded ? 'bx-show' : 'bx-hide'}`\n },\n FormWrapper: {\n tag: 'form',\n ref: this.formReference,\n className: 'ms-search__searchForm',\n 'aria-label': 'Search',\n name: 'searchForm',\n role: 'Search',\n action: searchURL,\n autoComplete: 'off',\n onSubmit: this._handleSubmit\n },\n UlKeyword: {\n tag: 'ul',\n className: classnames('msc-autoSuggest__keywordResults-items', className)\n },\n UlProduct: {\n tag: 'ul',\n className: classnames('msc-autoSuggest__productResults-items', className)\n },\n UlCategory: {\n tag: 'ul',\n className: classnames('msc-autoSuggest__categoryResults-items', className)\n },\n label:LabelComponent({\n isSearchFormExpanded: isSearchFormExpanded,\n searchLabelClass: `${this.searchLabelClass} ${isSearchFormExpanded ? 'bx-hide' : 'bx-show'}`,\n searchtext: searchtext,\n searchLabelArialLabel: searchLabelArialLabel,\n searchCollapsedLabel: this.searchCollapsedLabel,\n hideSearchLabel: hideSearchLabel,\n handleCancelSearchChange: this._handleCancelSearchChange,\n telemetryContent: this.telemetryContent\n }),\n form: FormComponent({\n ariaLabelCancel: cancelBtnAriaLabel,\n ariaLabelSearch: searchBtnAriaLabel,\n ariaLabelSubmit: submitBtnAriaLabel,\n hideSearchLabel: hideSearchLabel,\n searchTextInput: this.searchTextInput,\n isSearchFormExpanded: isSearchFormExpanded,\n disableSubmitSearch: disableSubmitSearch,\n handleInputChange: this._handleInputChange,\n handleCancelSearchChange: this._handleCancelSearchChange,\n maxChars: this.maxChars,\n searchQsp: searchQsp,\n searchPlaceholder: searchPlaceholder,\n query: searchText\n }),\n autosuggestKeyword:\n searchText && searchText.length > 0 && keywordSuggestions && keywordSuggestions.length > 0\n ? KeywordSuggestionsComponent({\n searchKeywordSuggestClass: searchKeywordSuggestClass,\n searchPageURL: searchPageURL,\n searchQsp: searchQsp,\n hitPrefix: this.hitPrefix,\n hitSuffix: this.hitSuffix,\n autoSuggestProps: this.props,\n searchText: searchText,\n suggestions: keywordSuggestions,\n telemetryContent: this.telemetryContent\n })\n : undefined,\n autosuggestProduct:\n searchText && searchText.length > 0 && productSuggestions && productSuggestions.length > 0\n ? ProductSuggestionsComponent({\n searchProductSuggestClass: searchProductSuggestClass,\n searchPageURL: searchPageURL,\n searchQsp: searchQsp,\n hitPrefix: this.hitPrefix,\n hitSuffix: this.hitSuffix,\n autoSuggestProps: this.props,\n searchText: searchText,\n suggestions: productSuggestions,\n telemetry: this.props.telemetry,\n moduleType: this.props.typeName,\n moduleId: this.props.id,\n telemetryContent: this.telemetryContent\n })\n : undefined,\n autosuggestCategory:\n searchText && searchText.length > 0 && categorySuggestions && categorySuggestions.length > 0\n ? CategorySuggestionsComponent({\n searchCategorySuggestClass: searchCategorySuggestClass,\n searchPageURL: searchPageURL,\n searchQsp: searchQsp,\n hitPrefix: this.hitPrefix,\n hitSuffix: this.hitSuffix,\n autoSuggestProps: this.props,\n searchText: searchText,\n suggestions: categorySuggestions,\n searchRefiners: searchRefiners,\n telemetryContent: this.telemetryContent\n })\n : undefined,\n callbacks: {\n handleCancelSearchChange: this._handleCancelSearchChange\n },\n isSearchFormExpanded: this.state.isSearchFormExpanded\n };\n\n return this.props.renderView(viewProps) as React.ReactElement;\n }\n\n // tslint:disable-next-line:no-any\n private _focusOutTarget = (e: any): void => {\n const { suggestions } = this.state;\n\n if (\n suggestions &&\n suggestions.AllSearchResults &&\n e.target.closest('.ms-search') === null\n ) {\n this._clearAutoSuggestState();\n }\n };\n\n private _keyup = (e: KeyboardEvent): void => {\n const { suggestions } = this.state;\n\n if (suggestions && suggestions.AllSearchResults && e.keyCode === KeyCodes.Escape) {\n this._clearAutoSuggestState();\n } else if(this.state.isSearchFormExpanded && e.keyCode === KeyCodes.Escape) {\n if(this.state.isSearchFormExpanded) {\n this.setState({ isSearchFormExpanded: false });\n }\n }\n\n if (!((this.formReference.current && this.formReference.current.contains(e.target as unknown as Node)) ||\n (this.autoSuggestResultDiv.current && this.autoSuggestResultDiv.current.contains(e.target as unknown as Node)))) {\n if (suggestions && suggestions.AllSearchResults) {\n this._clearAutoSuggestState();\n }\n\n if(this.state.isSearchFormExpanded) {\n this.setState({ isSearchFormExpanded: false });\n }\n }\n };\n\n private _clearAutoSuggestState = (): void => {\n const {\n context: { actionContext },\n data: { searchState }\n } = this.props;\n\n if (this.searchTextInput.current && this.searchTextInput.current.value.length > 0) {\n searchState.searchText = '';\n searchState.defaultBasicSearchUrl = '';\n searchState.searchQueryStringParameter = '';\n actionContext ? actionContext.update(createSearchStateInput(searchState), searchState) : null;\n this.searchTextInput.current.value = '';\n }\n\n this.setState({ searchText: '', suggestions: undefined, searchRefiners: undefined });\n };\n\n private _handleInputChange = (query: string): void => {\n if (!query || query.length < this.maxChars) {\n this.setState({ searchText: query });\n }\n\n if (this.cancellabelDebounce) {\n this.cancellabelDebounce.cancel();\n }\n\n const {\n telemetry,\n context,\n data: { searchState }\n } = this.props;\n\n if (context) {\n if (query && query.length > 0) {\n if (query.length > this.maxChars) {\n return;\n }\n\n this.cancellabelDebounce = debounce(() => {\n getSearchSuggestionsAction(\n new AutoSuggestInput(\n query,\n this.topResultsCount,\n this._getSuggestionType(this.inputSuggestionType),\n this.hitPrefix,\n this.hitSuffix\n ),\n context.actionContext\n )\n .then(results => {\n this._getSearchRefiners(query)\n .then(refiners => {\n this.setState({ suggestions: results, searchRefiners: refiners,\n autoSuggestAriaLabel: this._setAutoSuggestResultCount(results) });\n })\n .catch(error => {\n this.setState({ suggestions: results, searchRefiners: undefined,\n autoSuggestAriaLabel: this._setAutoSuggestResultCount(results) });\n telemetry.exception(error);\n telemetry.debug('Unable to get refiners results');\n });\n })\n .catch(error => {\n this.setState({ suggestions: undefined, searchRefiners: undefined,\n autoSuggestAriaLabel: this._setAutoSuggestResultCount() });\n telemetry.exception(error);\n telemetry.debug('Unable to get auto suggest results');\n });\n }, this.waitTime);\n\n setTimeout(() => {\n this.cancellabelDebounce();\n }, 0);\n\n searchState.searchText = query;\n } else {\n this.setState({ suggestions: undefined, searchRefiners: undefined });\n searchState.searchText = '';\n }\n context.actionContext.update(createSearchStateInput(searchState), searchState);\n }\n };\n\n private _getSuggestionType = (suggestionTypes?: ISuggestionTypeCriterionData[]): string => {\n if (suggestionTypes && suggestionTypes.length > 0) {\n const distinctSuggestionTypes: string[] = [];\n suggestionTypes && suggestionTypes.forEach((suggestionTypeItem, index) => {\n suggestionTypeItem.SuggestionType && distinctSuggestionTypes.push(suggestionTypeItem.SuggestionType.charAt(0).toUpperCase() + suggestionTypeItem.SuggestionType.slice(1));\n });\n return distinctSuggestionTypes.join(',');\n }\n return 'Keyword, Product, ScopedCategory';\n };\n\n private async _getSearchRefiners(searchText: string): Promise {\n const { actionContext: ctx } = this.props.context;\n return getProductSearchRefinersAsync(\n { callerContext: ctx },\n {\n SearchCondition: searchText,\n Context: {\n ChannelId: +ctx.requestContext.apiSettings.channelId,\n CatalogId: +ctx.requestContext.apiSettings.catalogId\n }\n }\n );\n }\n\n private _handleSubmit = (\n e: React.MouseEvent | React.KeyboardEvent | React.FormEvent\n ): void => {\n const {\n config: { disableSubmitSearch },\n context: {\n actionContext,\n app: {\n config: { searchQueryStringParameter }\n }\n }\n } = this.props;\n\n const query = this.searchTextInput.current && this.searchTextInput.current.value;\n e.preventDefault();\n\n if (!query || (query && query.length === 0) || disableSubmitSearch) {\n this.searchTextInput && this.searchTextInput.current && this.searchTextInput.current.focus();\n } else {\n const searchQsp = searchQueryStringParameter || 'q';\n const searchURL = this._appendQueryParams(getUrlSync('search', actionContext) || '', query, searchQsp);\n document.location.href = searchURL;\n }\n };\n\n private _handleCancelSearchChange = (): void => {\n const { isSearchFormExpanded, suggestions } = this.state;\n\n if (!isSearchFormExpanded) {\n this.setState({\n isSearchFormExpanded: true,\n searchText: '',\n isInitialState: false\n });\n } else {\n if (suggestions && suggestions.AllSearchResults) {\n this._clearAutoSuggestState();\n }\n\n this.setState({ isSearchFormExpanded: false });\n }\n };\n\n private _appendQueryParams = (route: string, query: string, qsp: string): string => {\n if (route && route.length > 0) {\n return query && query.length > 0 ? `${route}${route.indexOf('?') === -1 ? '?' : '&'}${qsp}=${query}` : route;\n }\n return '';\n };\n\n private _setAutoSuggestResultCount = (result?: Autosuggestions) => {\n if (this.autoSuggestResultScreenReaderDiv.current !== null) {\n const ariaLiveRegion = this.autoSuggestResultScreenReaderDiv.current;\n const suggestResultString = this.props.resources.autoSuggestFoundMessage;\n const emptyResultString = this.props.resources.noAutoSuggestionMessage;\n ariaLiveRegion.innerText = result && (result.AllSearchResults && result.AllSearchResults.length > 0) ? suggestResultString : emptyResultString;\n ariaLiveRegion.setAttribute('aria-live','assertive');\n return ariaLiveRegion.innerText;\n } else {\n return '';\n }\n };\n}\n\nexport default Search;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport * as React from 'react';\n\nimport {INodeProps, Module, Node } from '@msdyn365-commerce-modules/utilities';\nimport { ISingleOrderTemplateViewProps } from './components';\nimport { IOrderTemplateListViewProps } from './order-template-list';\n\nexport const OrderTemplateListView: React.FC = props => {\n const { OrderTemplateList, status, statusMessage, heading, OrderTemplates, orderTemplates, OrderTemplate, createOrderTemplateButton, templateHeaderStatusMessage } = props;\n\n return (\n \n {heading}\n {status !== 'SUCCESS' && statusMessage}\n \n {createOrderTemplateButton}\n {templateHeaderStatusMessage}\n \n { OrderTemplates && orderTemplates && orderTemplates.length > 0 &&\n \n {orderTemplates && orderTemplates.map((orderTemplate) => {\n return _renderOrderTemplate(orderTemplate, OrderTemplate);\n })}\n \n }\n \n );\n};\n\nconst _renderOrderTemplate = (orderTemplate: ISingleOrderTemplateViewProps, OrderTemplate?: INodeProps): JSX.Element | null => {\n\n const { key, addToCartButton, orderTemplateImage, orderTemplateStatusMessage, removeButton, orderTemplateName } = orderTemplate;\n return (\n \n {orderTemplateName}\n {orderTemplateImage}\n {addToCartButton}\n {removeButton}\n {orderTemplateStatusMessage}\n \n );\n};\n\nexport default OrderTemplateListView;","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\nimport { IModuleProps, Module, Node } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\nimport {IReviewModalViewProps} from '../../common/review-modal';\nimport { IWriteReviewViewProps } from './';\n\nconst WriteReviewView: React.FC = props => {\n const { heading, signInMessage, signInButton, modalToggle, reviewModal, moduleProps } = props;\n const isAuthenticated = props.context.request.user.isAuthenticated;\n return (\n \n {heading}\n {!isAuthenticated ?\n <>\n {signInMessage}\n {signInButton}\n \n :\n <>\n {modalToggle}\n {createReviewModal(reviewModal, moduleProps)}\n \n }\n \n );\n};\n\nconst createReviewModal = (props: IReviewModalViewProps, moduleProps: IModuleProps): JSX.Element => {\n return (\n \n {props.modalHeader}\n \n \n \n {props.rating}\n {props.ratingLabel}\n \n \n {props.titleLabel}\n {props.titleInput}\n \n \n {props.textLabel}\n {props.textInput}\n \n {props.privacyPolicyUrl}\n {props.error}\n \n \n \n {props.submitButton}\n {props.cancelButton}\n \n \n );\n};\n\nexport default WriteReviewView;"],"sourceRoot":""}