{"version":3,"sources":["webpack:///src/modules/fabrikam/views/components/cartlineitem.component.tsx?4b07","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/themes/fth/views/carousel.view.tsx?f466","webpack:///src/common/rnrInterface.ts?25e5","webpack:///./src/themes/emp/views/carousel.view.tsx?ae1e","webpack:///src/modules/order-template/order-template.tsx?4281","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/modules/smwe-media-gallery/utils/get-valid-product-images.ts?1984","webpack:///./src/modules/smwe-media-gallery/smwe-media-gallery.tsx?f7aa","webpack:///src/modules/search-result-container/components/link.tsx?d3ce","webpack:///src/modules/search-result-container/components/product-search-result-items.tsx?1766","webpack:///src/modules/search-result-container/components/feature-search-result-item.tsx?98c1","webpack:///src/modules/search-result-container/components/title.tsx?365d","webpack:///src/modules/search-result-container/components/separator.tsx?7b76","webpack:///src/modules/search-result-container/components/utilities.ts?41e3","webpack:///src/modules/search-result-container/components/range-refine-item.tsx?6e24","webpack:///src/modules/search-result-container/components/refine-item.tsx?b232","webpack:///src/modules/search-result-container/components/choice-summary.tsx?f4a7","webpack:///src/modules/search-result-container/components/modal.tsx?afdd","webpack:///src/modules/search-result-container/components/refine-submenu.tsx?1e62","webpack:///src/modules/search-result-container/components/error-message.tsx?c0c2","webpack:///src/modules/search-result-container/search-result-container.tsx?97e0","webpack:///src/modules/media-gallery/utils/get-valid-product-images.ts?4e26","webpack:///src/modules/media-gallery/media-gallery.tsx?3b46","webpack:///src/modules/carousel/carousel.view.tsx?b19a","webpack:///./src/modules/smwe-media-gallery/smwe-media-gallery.view.tsx?a42e","webpack:///src/modules/cart-icon/components/flyout-cart-line-items.tsx?a0df","webpack:///src/modules/cart-icon/utils/get-products-in-mini-cart.ts?f52c","webpack:///src/modules/cart-icon/cart-icon.tsx?5b5f","webpack:///src/modules/search-result-container/search-result-container.view.tsx?3d61","webpack:///src/modules/promo-banner/promo-banner.view.tsx?d069","webpack:///src/modules/fabrikam/utilities/quantity/Quantity.tsx?f073","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/modules/cart-icon/cart-icon.view.tsx?d63a","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/write-review/components/components.tsx?ead4","webpack:///src/modules/write-review/write-review.tsx?dea3","webpack:///src/modules/media-gallery/media-gallery.view.tsx?6e14","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/promo-banner/components/close-button.tsx?939d","webpack:///src/modules/promo-banner/components/links.tsx?3133","webpack:///src/modules/promo-banner/components/text.tsx?834e","webpack:///src/modules/promo-banner/promo-banner.tsx?958e","webpack:///src/index.ts?c6ae","webpack:///src/modules/reviews-list/reviews-list.view.tsx?6dd9","webpack:///src/modules/order-template/order-template.view.tsx?f2c8","webpack:///./src/themes/stemichelle-new/views/carousel.view.tsx?1429","webpack:///src/modules/carousel/carousel.tsx?bfbb","webpack:///src/modules/order-template-list/order-template-list.view.tsx?20f7","webpack:///src/modules/write-review/write-review.view.tsx?9069"],"names":["CartLineItemFunctions","Product","DimensionStrings","Dimensions","map","productDimension","DimensionTypeValue","React","key","RecordId","className","colorString","DimensionValue","Value","configString","sizeString","IsGiftCard","amountString","styleString","props","data","cartLine","DiscountLines","length","discountLine","index","OfferId","OfferName","resources","discountStringText","PriceComponent","isSalesLine","price","CustomerContextualPrice","PeriodicDiscount","EffectiveAmount","BasePrice","context","id","typeName","undefined","Percentage","inventoryInformationLabel","inventoryCssName","inventoryLabelClassName","pickupDeliveryModeCode","request","channel","PickupDeliveryModeCode","channelDeliveryOptionConfig","cartline","hasShippingMethod","DeliveryMode","PickupDeliveryModeCodes","some","deliveryMode","shippingChargeLines","ChargeLines","filter","chargeLine","IsShipping","freightFee","reduce","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","payLoad","getPayloadObject","telemetryContent","toString","prodAttribute","getTelemetryAttributes","productName","Name","onChange","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","disabled","isCartStateReady","isGiftCard","classNames","originalPriceText","currentPriceText","DiscountAmount","DiscountAmountWithoutTax","_generateQuantityandPrice","OrderTemplateActions","onRemoveOrderTemplate","handlers","itemKey","OrderTemplateRender","input","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","Button","onClick","event","orderTemplateStatusMessage","isOpen","userMessage","Alert","statusCssString","toggle","defaultImageSettings","viewports","xs","q","w","h","lg","xl","lazyload","count","slice","line","fullProduct","getProductUrlSync","ProductDetails","PrimaryImageUrl","window","location","assign","OrderTemplateListStatusMessage","errorType","text","classnames","CarouselView","Carousel","closeAnimation","config","activeIndex","next","previous","pause","pauseOnHover","ride","autoplay","interval","transitionType","items","slots","content","hideFlipper","dismissEnabled","onIndicatorsClickHandler","handleDismissCarousel","dismissCarouselAriaText","ariaLabelForDismissButton","indicatorAriaText","ariaLabelForSlide","directionTextPrev","flipperPrevious","directionTextNext","flipperNext","handleOnExited","handleOnExiting","TOGGLE_REVIEW_MODAL_BUTTON_ID","TOGGLE_EDIT_MODAL_BUTTON_CARD_ID","OrderTemplateLines","constructor","state","super","_onRemoveSelection","this","telemetry","removeSelectedFailureMessage","removeSelectedSuccessMessage","lines","productSelection","productListLines","isChecked","productListLine","productListId","ProductListId","removeProductListLinesAsync","callerContext","then","setState","messageGlyph","reload","catch","error","warning","substr","indexOf","result","productList","_onAddSelectionToBag","async","addedToCartFailureMessage","addedToCartSuccessMessage","cartState","getCartState","selectedLines","cartLines","productLine","ProductId","TrackingId","UnitOfMeasureSymbol","UnitOfMeasure","DefaultUnitOfMeasure","addCartLinesAsync","cart","Version","trace","join","refreshCart","Promise","resolve","_getCurrentUrl","reqContext","MsDyn365","isBrowser","URL","requestUrl","_renderItemAddedToCartDialog","itemAddedToCartDialogData","ItemAddedToCartDialog","_generateItemAddedToCartDialogResources","modalOpen","isItemAddedToOrderTemplateOpen","onClose","_renderPagination","fullUrl","itemsPerPage","skipCount","_getCurrentPageNumber","totalItems","previousText","nextText","UncontrolledPagination","role","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","status","getPriceForSelectedVariant","PriceForSelectedVariantInput","channelId","priceResult","productPrice","AsyncResult","reject","substatus","replace","app","maxQuantityForProductListLineItem","debug","_removeItemFromOrderTemplateLines","user","isAuthenticated","token","_renameTemplate","_removeTemplate","deleteAsync","deleteOrderTemplateFailedText","newLink","_getViewport","device","Type","innerWidth","sm","md","_viewport","_updateViewport","bind","isConfirmAddSelectionToBagModalOpen","getTelemetryObject","telemetryPageName","friendlyName","signInUrl","heading","addEventListener","componentWillUnmount","removeEventListener","render","emptyOrderTemplateLinesText","errorGettingOrderTemplateLines","errorProps","moduleProps","statusMessage","OrderTemplateLinesStatusMessage","Heading","Object","renderView","orderTemplateResult","_isFirstPage","emptyViewProps","viewProps","productsStatusMessage","tag","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","__decorate","observable","computed","action","observer","ReportReviewConcernInput","reviewId","tenantId","locale","concernCategory","authToken","serviceEndpoint","getCacheKey","getCacheObjectType","dataCacheType","SubmitHelpfulnessVoteInput","isHelpful","createObservableDataAction","ctx","inputIsValid","Error","requestBody","requestHeader","Authorization","sendRequest","response","exception","ReviewCount","currentPage","reviewsCount","reviewsShownOnEachPage","format","pageReviewCountText","_getReviewStartNumber","_getReviewEndNumber","PageControls","TelemetryConstant","Next","nextAttribute","contentAction","etext","Previous","previousAttribute","_hasPreviousPage","_getPreviousPageData","_paginationAriaLabel","pageReviewAriaLabel","previousButtonText","_hasNextPage","_getNextPageData","nextButtonText","_getPagesCount","_getReviewsShown","Math","min","ceil","isNextPage","page","pageModifier","pageReviewCount","updateReviews","selectedSortByOption","selectedFilterByOption","reportConcernDropdownOptions","radioPairs","pairs","option","inputId","checked","reportedKey","type","value","onRadioChange","htmlFor","rating","RatingComponent","readOnly","avgRating","review","ariaLabel","reviewRatingNarratorText","parentId","parentType","voteHelpfulButton","isVoted","i","votedReviews","approved","isVotedFor","isDisabled","isUserReview","label","yesButtonText","noButtonText","voteCount","helpfulPositive","helpfulNegative","title","updateReviewHelpfulness","editButton","toggleWriteReviewModal","editReviewCardText","renderDate","date","Intl","DateTimeFormat","month","day","year","Date","reportToggle","reportConcernText","reportedReviews","reportedText","ref","reportedReviewId","returnRef","toggleReportReviewModal","innerRef","ReviewsList","sortByDropdownOptions","mostHelpfulSortOptionText","mostRecentSortOptionText","highestRatedSortOptionText","lowestRatedSortOptionText","filterByDropdownOptions","allRatinsFilterByOptionText","fiveStarFilterByOptionText","fourStarFilterByOptionText","threeStarFilterByOptionText","twoStarFilterByOptionText","oneStarFilterByOptionText","handleHeadingChange","target","_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","_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","Modal","applicationNode","returnFocusRef","modalHeader","ModalHeader","modalFooter","ModalFooter","modalBody","ModalBody","header","headerSubmitted","feedbackThankYouText","cancelButton","cancelReportReviewText","submitButton","reportReview","reportReviewButtonText","succesfulButton","okReportReviewText","reportMessage","reportModalMessage","reportSubmittedMessage","radioButtons","errorMessageText","ReportReviewModal","isReportModalOpen","_onReportModalClose","_onRadioChange","_reportReview","hasReportError","reported","currentTarget","getAttribute","_reportReviewCallback","reportReviewConcern","getRnrPartnerId","getUserToken","getRnrAuthEndpointId","_value","reportedReview","updateSortByDropdown","notification","selectedOption","isFilterApplied","updateFilterByDropdown","skipItems","productId","getSelectedProductIdFromActionInput","getReviewsForGivenProduct","GetProductReviewsInput","getRnrEndpointId","pagingInfo","listOfReviews","_updateVoteUi","alreadyExists","concat","submitHelpfulnessVote","onReviewSubmitted","isSuccessful","submitReview","toggleModal","toggleReportModal","showSpinner","componentDidMount","reviewsList","reaction","ratingsReviewsState","filterKey","filterKeyValue","Number","dropdownItemsCount","isNaN","filterByOption","selectedIndex","ratingsSummary","completeClass","classname","reviewModal","reportReviewModal","filterByDropdown","LabeledDropdown","labelText","filterByDropdownText","dropdownId","dropdownOptions","onSelectOption","controlledByParent","sortByDropdown","sortByDropdownText","averageRating","averageRatingAriaLabel","ratingCount","reviewCount","refineReviewsProps","reviewsListProps","reviewCards","pageControls","noReviewsMessage","noReviewsWithFilterMessage","noReviewsWithSelectedFilterMessage","Msdyn365","editProps","onEdit","sortByOptions","filterByOptions","getValidProductImages","actionInput","MediaLocationsForSelectedVariantInput","getMediaLocationsForSelectedVariant","mediaLocations","all","validateMediaLocaionAsync","pair","mediaLocation","imageData","Uri","AltText","http","XMLHttpRequest","open","onload","onerror","send","e","MediaGallery","defaultGalleryImageSettings","defaultThumbnailImageSettings","noneWineProductImageSettings","isWineProduct","usePNGImageSetting","modifiedViewports","onExiting","animating","onExited","nextIndex","isLastItem","goToIndex","isFirstItem","mediaGalleryItems","_getCarouselItem","image","useAlternateImageSettings","galleryImageSettings","_getThumbnailItem","modifiedActiveIndex","ThumbnailItemContainerProps","tabIndex","_generateOnThumbnailClick","onKeyDown","_generateOnThumbnailKeyDown","Picture","thumbnailImageSettings","which","KeyCodes","Enter","Space","preventDefault","modifiedImageSettings","toLowerCase","giftCardImage","wineAttributes","productSpecificationData","attribute","toUpperCase","attr","TextValue","showPaginationTooltip","_mapProductToImageData","isVertical","thumbnailsOrientation","isProductLightbox","parent","isProductLightBox","CarouselProps","item","previousScreenshotFlipperText","nextScreenshotFlipperText","Thumbnails","ThumbnailsContainerProps","SingleSlideCarouselComponentProps","SingleSlideCarousel","vertical","flipperPrevLabel","flipperNextLabel","useTabList","Link","ProductSearchResultItems","products","moduleType","allowBackNavigation","ProductComponent","ratingAriaLabel","allowBack","FeatureSearchResultItem","productRecordId","getProductPageUrlSync","fallbackImage","onTelemetryClick","imageUrl","img","imageProps","renderProductPlacementImage","featureSimilarLooksTitle","Title","Separator","isRangeType","dataTypeValue","findMatchingRefinementCriterion","productRefinerValue","refinementCriteria","refinementCriterion","isMatchingRefinementCriterion","RefinerRecordId","RefinerSourceValue","DataTypeValue","LeftValueBoundString","getUpdatedRefinementCriteria","itemToggleNotification","currentRefinementCriteria","updatedRefinementCriteria","toggledItemFound","forEach","selectedCriterion","isSelecting","rangeStart","RightValueBoundString","rangeEnd","parentProductRefinerHierarchy","RefinerTypeValue","Values","child","matchingIndex","criterion","splice","RangeRefineItem","_formattedPriceReverseLookup","Map","_onRangeUpdate","_onRangeUpdateEnd","_handleRangeTooltipText","_changeMin","_changeMax","_finishChangeMin","_finishChangeMax","minInput","maxInput","selectedRefinementCriterion","initialMin","initialMax","validationErrorMin","validationErrorMax","selectedMin","selectedMax","touchedMin","touchedMax","UnitText","refineItemCommonProps","rangeType","_renderInputFields","_renderSlider","formAttrs","rangeNameFormat","KeyName","minInputClassName","maxInputClassName","formattedSelectedMin","_getFormattedSelectedValue","formattedSelectedMax","minLabel","onFocus","onBlur","maxLabel","placeholder","placeholderTextMax","sliderId","ariaAttributes","minPrice","_formatPrice","maxPrice","selectedMinPrice","selectedMaxPrice","Slider","inForm","step","orientation","labels","labelId","labelString","labelPositioning","showLabels","showTooltip","sliderThumbs","minValueSliderThumbAriaLabel","currencyCode","ariaValueText","maxValueSliderThumbAriaLabel","onChangeEnd","handleTooltipText","_changeValue","inputType","selectedKey","touchedKey","_getInputWithoutFormatting","selectedMinValue","minTouched","onToggle","maxNum","validationErrorNaN","_focus","_validateRange","selectedMaxValue","maxTouched","minNum","setTimeout","current","focus","selected","touched","validationError","validationErrorRange","amount","currency","priceAmount","NumberFormat","style","currencyDisplay","minimumFractionDigits","formatPrice","has","set","inputAsNum","get","sliderChangeNotification","eventType","firstThumbValue","secondThumbValue","_focusOnSliderThumb","element","document","getElementById","tooltip","RefineItem","_onClick","anchorType","children","attrs","JSON","stringify","isSingleSelect","itemTypeClassName","SourceValue","LeftValueBoundLocalizedString","_getRefinerUrl","Count","refinerRating","parseInt","ratingRefiner","selectedRefinerValues","selectedRating","ratingComponentClass","hideCount","urlBuilder","ChoiceSummary","closeButtonGlyph","stopPropagation","clearAll","selectedRefiner","_getSelectedRefinerChoice","onChoiceClicked","itemClicked","choiceClicked","nextItemToFocus","nextSibling","selectedChoices","_getKeyForRefinerValue","clearAllText","choiceAriaLabel","selectedRefinersMap","clearAllAttributes","listItemProps","choiceFormat","choiceRangeValueFormat","refinerHierarchy","overallFormat","rangeFormat","refinerValueName","refinerName","hierarchy","innerText","trim","ModalToggle","modalNode","autoFocus","zIndex","modalHeaderNode","modalTitle","modalFooterNode","modalCloseButtonText","RefineSubmenu","_onToggleItem","_onToggleSubmenu","isExpanded","isExpandedOnInitialLoad","expanded","productRefinerHierarchy","hideRating","Collapse","timeout","_renderChildItems","_renderRange","_renderSingleMultiSelect","refinerValuesList","listItems","selectedValue","_getRangeType","DisplayTemplateValue","onUpdateRefiners","prevState","ErrorMessage","SearchResultContainer","sortOptions","sortByOptionRelevanceDesc","sortByOptionNameAsc","sortByOptionNameDesc","sortByOptionPriceAsc","sortByOptionPriceDesc","sortByOptionRatingDesc","_pageType","urlTokens","pageType","expandrefinerCount","_getActivePrice","listPageState","activeProducts","productRecIds","prod","projectDomain","ChannelId","CatalogId","catalogId","affliations","customerInput","GetCustomerInput","customer","getCustomer","CustomerAffiliations","affliation","aff","AffiliationId","RetailAffiliationId","CustomerId","AccountNumber","getActivePricesAsync","queryResultSettings","activePricesResponse","productPrices","activePrice","TradeAgreementPrice","AdjustedPrice","message","_getSearchResultModal","SearchResultModal","modalIsOpen","_modalToggleRef","_toggleModal","_getCollectionTitle","collectionTitle","category","SearchResultContainer_1","getFriendlyName","NameTranslations","productCountNumber","productCountText","totalProductCount","numberOfProducts","oneProduct","TitleContainer","titlePrefix","searchTextPrefix","titleText","titleCount","_getCategoryHierarchy","categoryHierarchy","CategoryHierarchyContainer","categoryHierarchyList","categoryLinkAriaLabel","Url","categoryHierarchySeparator","_getSortingDropDown","activeDropdown","_getCurrentlySelectedOption","sortingState","SortingContainer","sortByDropDown","labelClassname","sortByDropdownLabel","dropdownClassname","toggleColor","_updateSortByDropdown","_sortAndFilterContainerRef","_getPagination","getCurrentUrl","currentPageNumber","_getRefineMenu","tempRangeTypeTODO","inputRange","validRefiners","refiners","refiner","activeRefiners","activeFilters","_getexpandRefinerCount","expandRefinersCount","expandedRefiners","RefineMenuContainer","RefinerSectionContainer","_refineItemCommonProps","_onUpdateRefiners","_buildRefinerUrl","_getChoiceSummary","selectedRefiners","choiceSummaryLabel","_onChoiceClicked","_buildRefinerUrlForChoiceSummary","history","pushState","buildListPageUrl","_getSortColumnFromSelectedOption","transaction","sortingCritera","Columns","searchConfiguration","mappedConfiguration","sortColumn","sortCriteria","activeSortColumn","parseQueryParam","activeMappedConfig","mappedSearchConfig","ColumnName","IsDescending","dropdownOption","newRefinementCriteria","dropdownElementId","dropdownElement","selectedChoice","isClearAll","refinerCount","pending","validationErrorNotNumber","validationErrorNotRange","querySorting","sorting","parse","decodeURIComponent","pageSize","GetFullProductsByCollectionInput","Paging","Top","Skip","Sorting","itemId","includeAttributes","getCollectionProducts","productResults","enableAffiliationBasedPricing","featureProduct","listPageStateFeature","nameTranslations","nameTranslation","Language","Text","searchProduct","errorText","breaCrumbType","breadcrumbType","resultCategoryNotFoundText","resultSearchNotFoundText","productsComponent","featureComponent","searchResultContainerViewProps","TitleViewProps","disableHierarchy","refineMenu","ProductsContainer","ProductSectionContainer","CategoryNavContainer","RefineAndProductSectionContainer","choiceSummary","modalToggle","searchResultModal","FeatureSearchContainer","similarLookProduct","imageSettingsVal","imageConcatVal","_inlineZoomDivRef","openModalDialog","imageModalSlider","ZoomView","carouselprops","_renderCarouselItemImageView","hideIndicator","carousel","imageModalSliderProps","ontoggle","galleryCarousel","ImagefullView","isImageZoomed","_onImageMouseOut","_inlineZoomImageOnHover","_onInlineImageClick","_onContainerZoomImageClick","_onMouseOutLensContainer","source","imageSource","curatedImage","images","lastUpdate","now","validateProductImages","allowFullscreen","allowFullScreen","zoomViewMode","imageZoom","zoomView","_renderImageInContainerOnZoom","_renderImageInlineOnZoom","_renderImageFullScreenOnZoom","divRef","dataScale","onMouseOver","onMouseMove","inlineZoomImageOnMouseMove","inlineZoomImageOnHover","inlineZoomInit","inlineZoomImageOnMouseOut","onContainerZoomInit","onMouseOutLensContainer","onMouseOut","onMouseMoveLensContainer","onMouseOverImageContainer","fullScreenTitleText","parentDiv","querySelector","removeAttribute","removeInlineZoomStyle","Module","carouselContainer","renderModuleAttributes","_renderThumbnailItem","thumbnail","Node","MediaGalleryView","thumbnails","_renderThumbnails","productLink","_renderStoreLocation","FulfillmentStoreId","orgUnitName","_getOrgUnitName","orgUnitLocations","fulfillmentStoreId","foundLocation","orgUnitLocation","OrgUnitNumber","OrgUnitName","_assembleCartlines","cartlines","reactNodes","_getProduct","foundProductAvailability","foundProductDeliveryOption","productAvailabilites","productAvailability","ProductAvailableQuantity","productDeliveryOptions","deliveryOption","foundProductDeliveryOptions","removeButtonText","removeItemClickHandler","outOfStockThreshold","maxCartlineQuantity","isStockCheckEnabled","AvailableQuantity","isServiceItem","ItemTypeValue","RemoveCartItem","removeCartItemAttribute","CartLineItemComponent","displayMode","remove","storeLocation","_assembleNode","getMiniCartData","miniCartData","CartLines","hasInvoiceLine","getActiveCartProductsAction","ActiveCartProductsInput","getAvailabilitiesForCartLineItems","ProductAvailabilitiesForCartLineItems","availableQuantity","getDeliveryOptionsForCartLineItems","ProductDeliveryOptionsForCartLineItems","deliveryOptions","CartIcon","Component","retailMultiplePickUpOptionEnabled","_getImageSettings","_removeItemFromCartHandler","cartlineToRemove","cartLineIds","removeCartLines","payload","TelemetryEvent","CheckOut","Checkout","checkoutBySignInAttributes","GuestCheckout","checkoutByGuestAttributes","ViewShoppingBag","viewShoppingBagAttributes","enableHoverCart","guestCheckoutUrl","cartUrl","checkoutURL","_getCheckoutURL","isCartEmpty","_getCartLines","hasErrors","includeFlyout","cartSize","goToCartButtonText","goToCartButtonTitle","flyoutTitle","TotalAmount","priceString","totalPriceFormatString","cultureFormatter","formatCurrency","featureState","feature","IsEnabled","cartIcon","CartIconComponent","cartLabel","cartQtyLabel","FlyoutContainer","UncontrolledTooltip","placement","hideArrow","trigger","CartlinesWrapper","miniCartWrapper","miniCartItemWrapper","checkoutAsSignInUserButton","checkoutButtonTitle","checkoutAsGuestButton","guestCheckoutButtonTitle","goToCartButton","totalPrice","isAbsoluteUrl","RegExp","test","returnURL","msdyn365Commerce","origin","FlyoutCartLineItems","enableStockCheck","maxQuantityForCartLineItem","productDimensionTypeConfiguration","quantityDisplayText","removeCartButtonText","outOfStockText","outOfRangeOneText","outOfRangeFormatText","createSearchResultModal","modalProps","createModalBody","renderSort","renderRefiner","submenu","renderCategoryHierarchy","renderTitle","renderTitleCount","SearchResultContainerView","PromoBannerView","promoBannerProps","contentProps","closeButton","bannerMessages","PromoBannerTextProps","PromoBannerLinksProps","handleLinks","handleText","slides","links","inputRef","_validateMin","minValue","currentInput","isUpdateing","_onIncrement","_onDecrement","_handleChange","componentDidUpdate","prevProps","glyphMinusClassName","decrementGlyphClass","glyphPlusClassName","incrementGlyphClass","decrementDisabled","incrementDisabled","currentValue","DecrementQuantity","decrementAttributes","IncrementQuantity","incrementAttributes","extraClassDecrement","extraClassIncrement","pattern","invokeCallback","currQuantity","updatedQuantity","inputElement","HTMLInputElement","setAttribute","OrderTemplateQuantity","incDisabled","extraClass","getChangeHandler","_onIncrementalChange","OrderTemplateLineActions","getAddToBag","getRemoveItem","PopUp","showMobile","setShowMobile","useState","getActionButton","removeButtonClassName","addButtonClassName","buttonText","selectLine","productImage","_renderProductImage","productInfo","renderProductInfo","_renderPrice","productUnitOfMeasure","productQuantityView","_generateQuantity","addToBagButton","popUp","MAX_VALUE","dimensions","dimension","_renderProductDimensions","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","Search","selectedProduct","searchTextInput","createRef","_renderSearchForm","autoComplete","onSubmit","_onSearchSubmit","_onInputChange","maxLength","Loading","_getSearchResults","NotFound","ProductList","_onQuantityChangeHandler","selectedQuantity","_onSelectItem","varianteInput","SelectedVariantInput","productVariant","getSelectedVariant","_getProductDimensions","selectedProductDimensions","ProductConfiguration","_onBackButtonClickHandler","_highlightSearchTerm","parsedName","unescape","dangerouslySetInnerHTML","__html","_resultCountText","_addItemToTemplateHandler","AddItemToOrderTemplateInput","addItemToOrderTemplate","reloadPage","_toggleModalHandler","onComponentDidMount","onComponentDidUpdate","showBackArrow","_renderContent","addToTemplateHandler","onQuantityChangeHandler","highlightSearchTerm","searchForm","productProps","renderResultCountText","Spinner","NotFoundComponent","searchText","searchCriteriaInput","Context","IncludeAttributes","SearchCondition","searchByCriteriaAsync","MasterProductId","getDimensionsForSelectedVariant","GetDimensionsForSelectedVariantInput","Dropdown","selectMenu","_onChanged","selectId","dropdownList","dropdownName","selectedDimensions","_getDimensionsError","dimensionName","_addToTemplateHandler","isBusy","showAddConfirmation","errors","add","missingDimensions","_onQuantityChange","_updateDimensionValue","productDimensionFull","newValueId","DimensionValues","_onDimensionChanged","remainingDimensionsErrors","selection","buttonDisabled","mappedDimensions","ExtensionProperties","variantProduct","dimensionInput","variantDimensions","availabilityInput","ProductAvailabilitiesForSelectedVariantInput","newAvailableQuantity","getProductAvailabilitiesForSelectedVariant","priceInput","productAvailableQuantity","unitPrice","sort","a","b","_getDropdownName","dimensionType","_getDimensionsNodes","_getConfirmationMessage","selectedDimensionNames","variant","values","unshift","assertive","toFixed","fallBackImg","ProductSelectButton","setBusy","CartIconView","_renderCartlines","SubmitUserReviewInput","userReviewData","authorization","submitReviewDataAction","submitButtonAttribute","cancelButtonAttribute","discardReviewButtonText","submitDisabled","submitReviewButtonText","ratingsInput","ratingLabel","ratingsLabel","titleInput","titleLabel","textInput","textLabel","privacyPolicyUrl","privacyPolicyLink","form","inputRow","editReviewModalTitle","writeReviewModalTitle","stripWhiteSpacesFromString","selectRatingAriaLabel","initialRating","selectRatingLabel","reviewTitleMaxLength","reviewTitleLabel","reviewTextMaxLength","rows","reviewTextLabel","policyTextBlocks","privacyPolicyTextFormat","split","isSeparatorAtStart","startsWith","isSeparatorAtEnd","endsWith","PrivacyPolicy","privacyPolicyAttribute","privacyPolicyTitle","onReviewSubmission","userEmail","emailAddress","submitUserReview","firstName","getReviewInput","GetUserReviewInput","SignInMessage","SignInButton","SignIn","attributes","WriteReview","PureComponent","writeReviewCallbacks","userInfo","signInMessage","signInButton","signInLabel","signInAriaLabel","editReviewButtonText","reviewButtonLabel","_buildUserReviewModal","CreateOrderTemplateButton","createOrderTemplateDialogOpen","setOrderTemplateNameDialogOpen","createOrderTemplateText","OrderTemplateNameDialog","isUpdateDialog","setModalOpen","createOrderTemplateDialogResources","onCancel","onSuccess","onOrderTemplateCreated","OrderTemplateList","_reloadPage","_onRemoveFromOrderTemplateList","orderTemplates","p","headerStatusMessage","emptyOrderTemplateText","createNewTemplateButtonText","orderTemplatesData","orderTemplateListTitle","createOrderTemplateButton","CreateNewTemplateButtonComponent","templateHeaderStatusMessage","OrderTemplates","OrderTemplate","_renderOrderTemplateList","createOrderTemplateHeader","createOrderTemplateDescription","createOrderTemplateButtonText","cancelNewOrderTemplateCreationButtonText","currentTemplateProps","PromoBannerCloseButton","closeButtonAriaLabel","PromoBannerClose","PromoBannerLinks","editableLinks","_mapEditableLinks","linkdata","link","linkText","editableLink","linkUrl","destinationUrl","openInNewTab","additionalProperties","PromoBannerText","PromoBanner","isVisible","handleTextChange","handleLinkTextChange","linkIndex","_next","_isLastItem","_goToIndex","_previous","_isFirstItem","closeButtonLabel","buildReviewCard","createReviewModal","createReportModal","ReviewsListview","_renderItem","quantityLabel","OrderTemplateLinesView","toggleDetails","wrapClassName","fade","CarouselModule","_handleDismissCarousel","cookies","dismissCarousel","closeNow","_onExiting","_onExited","newIndex","OrderTemplateListView","_renderOrderTemplate","WriteReviewView"],"mappings":"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","file":"static/js/11.f392971b727173d1425a.chunk.js","sourcesContent":["/*!\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;","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","/*---------------------------------------------------------------------------------------------\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 { ICarouselViewProps } from '@msdyn365-commerce-modules/carousel/src/modules/carousel/./carousel';\r\nimport { Carousel } from '@msdyn365-commerce/components';\r\nimport classnames from 'classnames';\r\nimport * as React from 'react';\r\n\r\nconst CarouselView: React.FC = props => (\r\n \r\n \r\n \r\n);\r\n\r\nexport default CarouselView;\r\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';","import { ICarouselViewProps } from '@msdyn365-commerce-modules/carousel/dist/types/modules/carousel/carousel';\r\nimport { Carousel } from '@msdyn365-commerce/components';\r\nimport classnames from 'classnames';\r\nimport * as React from 'react';\r\nimport { ICarouselProps } from '../definition-extensions/carousel.ext.props.autogenerated';\r\n\r\nconst CarouselView: React.FC> = props => (\r\n \r\n \r\n \r\n);\r\n\r\nexport default CarouselView;\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 *--------------------------------------------------------------------------------------------*/\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 { 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","import { getMediaLocationsForSelectedVariant, MediaLocationsForSelectedVariantInput} from '@msdyn365-commerce-modules/retail-actions';\r\nimport { IActionContext, IImageData } from '@msdyn365-commerce/core';\r\nimport { MediaLocation } from '@msdyn365-commerce/retail-proxy';\r\n\r\nexport async function getValidProductImages(productId: number, channelId: number, actionContext: IActionContext): Promise {\r\n const actionInput = new MediaLocationsForSelectedVariantInput(\r\n productId,\r\n channelId,\r\n );\r\n\r\n return getMediaLocationsForSelectedVariant(actionInput, actionContext)\r\n .then(mediaLocations => {\r\n if (mediaLocations) {\r\n return Promise.all(mediaLocations.map(validateMediaLocaionAsync))\r\n .then(pairs => {\r\n return pairs.filter(pair => pair[1]).map(pair => pair[0]);\r\n });\r\n }\r\n\r\n return [];\r\n }).catch(error => {\r\n actionContext.telemetry.error(error);\r\n\r\n return [];\r\n });\r\n}\r\n\r\nasync function validateMediaLocaionAsync(mediaLocation: MediaLocation): Promise<[IImageData, boolean]> {\r\n const imageData = {\r\n src: mediaLocation.Uri || '',\r\n altText: mediaLocation.AltText || ''\r\n };\r\n\r\n if (imageData.src === '') {\r\n return [imageData, false];\r\n }\r\n\r\n return new Promise<[IImageData, boolean]>((resolve) => {\r\n try {\r\n const http = new XMLHttpRequest();\r\n http.open('HEAD', mediaLocation.Uri!, true);\r\n\r\n http.onload = () => {\r\n resolve([imageData, http.status === 200 || http.status === 201]);\r\n };\r\n\r\n http.onerror = () => {\r\n resolve([imageData, false]);\r\n };\r\n\r\n http.send();\r\n } catch (e) {\r\n resolve([imageData, false]);\r\n }\r\n });\r\n}","/*---------------------------------------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License. See License.txt in the project root for license information.\r\n *--------------------------------------------------------------------------------------------*/\r\nimport { getProductUrlSync } from '@msdyn365-commerce-modules/retail-actions';\r\nimport { Carousel, ICarouselProps } from '@msdyn365-commerce/components';\r\nimport classnames from 'classnames';\r\nimport { reaction } from 'mobx';\r\nimport * as React from 'react';\r\n\r\n// import {thumbnailsOrientation} from '@msdyn365-commerce-modules/media-gallery';\r\nimport { IComponentNodeProps, IModuleProps, INodeProps, ISingleSlideCarouselProps, KeyCodes, NodeTag, SingleSlideCarousel } from '@msdyn365-commerce-modules/utilities';\r\nimport { IImageData, IImageDimension, IImageSettings, Image } from '@msdyn365-commerce/core';\r\nimport { SimpleProduct } from '@msdyn365-commerce/retail-proxy';\r\nimport { ISmweMediaGalleryData } from './smwe-media-gallery.data';\r\nimport { ISmweMediaGalleryProps } from './smwe-media-gallery.props.autogenerated';\r\nimport { getValidProductImages } from './utils';\r\n\r\nexport interface IMediaGalleryState {\r\n animating: boolean;\r\n activeIndex: number;\r\n mediaGalleryItems: IImageData[] | undefined;\r\n}\r\n\r\nexport interface IMediaGalleryThumbnailsViewProps {\r\n ThumbnailsContainerProps: INodeProps;\r\n SingleSlideCarouselComponentProps: INodeProps;\r\n\r\n items?: IMediaGalleryThumbnailItemViewProps[];\r\n}\r\n\r\nexport interface IMediaGalleryThumbnailItemViewProps {\r\n ThumbnailItemContainerProps: INodeProps;\r\n\r\n Picture: React.ReactElement;\r\n}\r\n\r\nexport interface IMediaGalleryViewProps extends ISmweMediaGalleryProps {\r\n state: IMediaGalleryState;\r\n productUrl?: string;\r\n isProductLightBox?: boolean;\r\n MediaGallery: IModuleProps;\r\n CarouselProps: INodeProps;\r\n Thumbnails: IMediaGalleryThumbnailsViewProps;\r\n}\r\n\r\ninterface IImageSettingsViewports {\r\n xs: IImageDimension;\r\n sm?: IImageDimension | undefined;\r\n md?: IImageDimension | undefined;\r\n lg?: IImageDimension | undefined;\r\n xl?: IImageDimension | undefined;\r\n}\r\n\r\nconst SLRAppellation: string = 'SLR Appellation';\r\nconst TastingNotes: string = 'Tasting Notes';\r\n\r\n/**\r\n * Media gallery component\r\n */\r\nclass MediaGallery extends React.Component, IMediaGalleryState> {\r\n private readonly defaultGalleryImageSettings: IImageSettings = {\r\n viewports: {\r\n xs: { q: 'w=0&h=387&m=8', w: 0, h: 0 },\r\n sm: { q: 'w=0&h=387&m=8', w: 0, h: 0 },\r\n md: { q: 'w=0&h=772&m=8', w: 0, h: 0 },\r\n lg: { q: 'w=0&h=772&m=8', w: 0, h: 0 },\r\n },\r\n lazyload: true\r\n };\r\n\r\n private readonly defaultThumbnailImageSettings: IImageSettings = {\r\n viewports: {\r\n xs: { q: 'w=100&m=8', w: 100, h: 0 },\r\n lg: { q: 'w=100&m=8', w: 100, h: 0 },\r\n },\r\n lazyload: true\r\n };\r\n\r\n private noneWineProductImageSettings: IImageSettings = {\r\n viewports: {\r\n xs: { q: 'w=180&h=0&m=8', w: 0, h: 0 },\r\n sm: { q: 'w=180&h=0&m=8', w: 0, h: 0 },\r\n md: { q: 'w=260&h=0&m=8', w: 0, h: 0 },\r\n lg: { q: 'w=260&m=0', w: 0, h: 0 },\r\n xl: { q: 'w=260&m=0', w: 0, h: 0 },\r\n },\r\n lazyload: true\r\n };\r\n\r\n private isWineProduct: boolean = true;\r\n\r\n constructor(props: ISmweMediaGalleryProps) {\r\n super(props);\r\n this.state = { activeIndex: 0, animating: false, mediaGalleryItems: undefined };\r\n\r\n const modifiedImageSettings = props.config.galleryImageSettings;\r\n if(modifiedImageSettings) {\r\n if(modifiedImageSettings.viewports) {\r\n modifiedImageSettings.viewports = this.usePNGImageSetting(modifiedImageSettings.viewports);\r\n props.config.galleryImageSettings = modifiedImageSettings;\r\n }\r\n }\r\n }\r\n\r\n public usePNGImageSetting = (viewports: IImageSettingsViewports): IImageSettingsViewports => {\r\n const modifiedViewports = viewports;\r\n if(modifiedViewports?.xs?.q) {\r\n modifiedViewports.xs.q = modifiedViewports.xs.q.replace('f=jpg', 'f=png');\r\n }\r\n if(modifiedViewports?.sm?.q) {\r\n modifiedViewports.sm.q = modifiedViewports.sm.q.replace('f=jpg', 'f=png');\r\n }\r\n if(modifiedViewports?.md?.q) {\r\n modifiedViewports.md.q = modifiedViewports.md.q.replace('f=jpg', 'f=png');\r\n }\r\n if(modifiedViewports?.lg?.q) {\r\n modifiedViewports.lg.q = modifiedViewports.lg.q.replace('f=jpg', 'f=png');\r\n }\r\n if(modifiedViewports?.xl?.q) {\r\n modifiedViewports.xl.q = modifiedViewports.xl.q.replace('f=jpg', 'f=png');\r\n }\r\n\r\n return modifiedViewports;\r\n };\r\n\r\n public async componentDidMount(): Promise {\r\n const isGiftCard = this.props.data.product && this.props.data.product.result ? this.props.data.product.result.ItemId?.toLowerCase() === 'giftcard' : false;\r\n const giftCardImage: IImageData = {src: this.props.context.app.config.giftCardImage || ''};\r\n reaction(\r\n () => this.props.data.product.result ? this.props.data.product.result.RecordId : null,\r\n async () => {\r\n if (this.props.data.product.result) {\r\n if (isGiftCard && this.props.context.app.config.giftCardImage) {\r\n this.setState({\r\n mediaGalleryItems: [giftCardImage]\r\n });\r\n } else {\r\n this.setState({\r\n mediaGalleryItems: await getValidProductImages(this.props.data.product.result.RecordId, +this.props.context.request.apiSettings.channelId, this.props.context.actionContext)\r\n });\r\n }\r\n } else {\r\n this.setState({\r\n mediaGalleryItems: []\r\n });\r\n }\r\n }\r\n );\r\n\r\n if (this.props.data.product.result) {\r\n if (isGiftCard && this.props.context.app.config.giftCardImage) {\r\n this.setState({\r\n mediaGalleryItems: [giftCardImage]\r\n });\r\n } else {\r\n this.setState({\r\n mediaGalleryItems: await getValidProductImages(this.props.data.product.result.RecordId, +this.props.context.request.apiSettings.channelId, this.props.context.actionContext)\r\n });\r\n }\r\n } else {\r\n this.setState({\r\n mediaGalleryItems: []\r\n });\r\n }\r\n }\r\n\r\n public render(): JSX.Element {\r\n const {\r\n data: {\r\n product: {\r\n result: product\r\n }\r\n },\r\n id,\r\n config,\r\n resources\r\n } = this.props;\r\n const data: ISmweMediaGalleryData = this.props.data;\r\n const wineAttributes = this.props.data.productSpecificationData.result && this.props.data.productSpecificationData.result.filter(\r\n attribute => attribute.Name && (attribute.Name.toUpperCase() === SLRAppellation.toUpperCase() || attribute.Name.toUpperCase() === TastingNotes.toUpperCase())\r\n );\r\n const isWineProduct = !!(wineAttributes && wineAttributes.map(attr => attr.TextValue).filter(value => value).length);\r\n this.isWineProduct = isWineProduct;\r\n\r\n if (!data) {\r\n throw new Error('[MediaGallery] Data items returned null or undefined');\r\n }\r\n\r\n let mediaGalleryItems = this.state.mediaGalleryItems;\r\n const { className, showPaginationTooltip } = config;\r\n\r\n if (!mediaGalleryItems && product) {\r\n mediaGalleryItems = [\r\n this._mapProductToImageData(product)\r\n ];\r\n }\r\n\r\n const isVertical: boolean = (config.thumbnailsOrientation === 'vertical');\r\n\r\n let productUrl;\r\n if (data.product && data.product.status === 'SUCCESS') {\r\n if (product) {\r\n productUrl = getProductUrlSync(product, this.props.context.actionContext, undefined);\r\n }\r\n }\r\n\r\n // tslint:disable-next-line: no-typeof-undefined\r\n const isProductLightbox = (typeof window !== 'undefined') && (window.location !== window.parent.location);\r\n\r\n const viewProps: IMediaGalleryViewProps = {\r\n ...(this.props as ISmweMediaGalleryProps),\r\n state: this.state,\r\n productUrl,\r\n isProductLightBox: isProductLightbox,\r\n MediaGallery: {\r\n moduleProps: this.props,\r\n className: classnames('ms-media-gallery', className, 'overflow-hidden',\r\n isVertical ? 'row' : 'col',\r\n isVertical ? 'media-gallery-vertical' : 'media-gallery-horizontal')\r\n },\r\n CarouselProps: {\r\n tag: Carousel,\r\n className: 'ms-media-gallery__carousel',\r\n items: mediaGalleryItems && mediaGalleryItems.map((item: IImageData, index: number) => this._getCarouselItem(item, index)),\r\n activeIndex: this.state.activeIndex,\r\n next: this.next,\r\n previous: this.previous,\r\n interval: false,\r\n directionTextPrev: resources.previousScreenshotFlipperText,\r\n directionTextNext: resources.nextScreenshotFlipperText,\r\n onIndicatorsClickHandler: this.goToIndex,\r\n showPaginationTooltip: showPaginationTooltip === true,\r\n handleOnExited: this.onExited,\r\n handleOnExiting: this.onExiting\r\n } as IComponentNodeProps,\r\n Thumbnails: {\r\n ThumbnailsContainerProps: {\r\n className: classnames('ms-media-gallery__thumbnails-container',\r\n isVertical ? 'h-100' : 'w-100',\r\n 'd-flex',\r\n 'justify-content-center',\r\n isVertical ? 'order-1' : 'row')\r\n },\r\n SingleSlideCarouselComponentProps: {\r\n tag: SingleSlideCarousel,\r\n className: 'ms-media-gallery__thumbnails',\r\n vertical: isVertical,\r\n flipperPrevLabel: resources.previousScreenshotFlipperText,\r\n flipperNextLabel: resources.nextScreenshotFlipperText,\r\n parentId: id,\r\n useTabList: true,\r\n } as IComponentNodeProps,\r\n items: mediaGalleryItems && mediaGalleryItems.map((item: IImageData, index: number) => this._getThumbnailItem(item, index, this.state.activeIndex)),\r\n }\r\n };\r\n\r\n return this.props.renderView(viewProps) as React.ReactElement;\r\n }\r\n\r\n private onExiting = () => {\r\n this.setState({ animating: true });\r\n };\r\n\r\n private onExited = () => {\r\n this.setState({ animating: false });\r\n };\r\n\r\n private next = (): void => {\r\n const nextIndex = this.isLastItem() ? 0 : this.state.activeIndex + 1;\r\n this.goToIndex(nextIndex);\r\n };\r\n\r\n private previous = (): void => {\r\n const nextIndex = this.isFirstItem() ? (this.state.mediaGalleryItems ? this.state.mediaGalleryItems.length - 1 : 0) : this.state.activeIndex - 1;\r\n this.goToIndex(nextIndex);\r\n };\r\n\r\n private goToIndex = (index: number): void => {\r\n if (this.state.animating) {\r\n return;\r\n }\r\n this.setState({ activeIndex: index });\r\n };\r\n\r\n private _getCarouselItem = (image: IImageData, index: number): React.ReactNode => (\r\n \r\n );\r\n\r\n private _getThumbnailItem = (image: IImageData, index: number, modifiedActiveIndex: number): IMediaGalleryThumbnailItemViewProps => {\r\n const classes = classnames(\r\n 'ms-media-gallery__thumbnail-item',\r\n modifiedActiveIndex === index ? 'ms-media-gallery__thumbnail-item-active' : ''\r\n );\r\n\r\n return {\r\n ThumbnailItemContainerProps: {\r\n tag: 'li' as NodeTag,\r\n className: classes,\r\n role: 'tab',\r\n tabIndex: 0,\r\n key: index,\r\n 'aria-label': image.altText,\r\n 'aria-selected': modifiedActiveIndex === index,\r\n 'aria-controls': `${this.props.id}__carousel-item__${index}`,\r\n onClick: this._generateOnThumbnailClick(index),\r\n onKeyDown: this._generateOnThumbnailKeyDown(index)\r\n },\r\n Picture: (\r\n \r\n )\r\n };\r\n };\r\n\r\n private _generateOnThumbnailKeyDown = (index: number) => {\r\n return (event: React.KeyboardEvent) => {\r\n if (event.which === KeyCodes.Enter || event.which === KeyCodes.Space) {\r\n event.preventDefault();\r\n\r\n this.goToIndex(index);\r\n }\r\n };\r\n };\r\n\r\n private _generateOnThumbnailClick = (index: number) => {\r\n return (event: React.MouseEvent) => {\r\n event.preventDefault();\r\n\r\n this.goToIndex(index);\r\n };\r\n };\r\n\r\n private _mapProductToImageData(product: SimpleProduct): IImageData {\r\n return {\r\n src: product.PrimaryImageUrl || '',\r\n };\r\n }\r\n\r\n private isFirstItem = () => this.state.activeIndex === 0;\r\n\r\n private isLastItem = () => this.state.mediaGalleryItems && this.state.activeIndex === this.state.mediaGalleryItems.length - 1;\r\n}\r\n\r\nexport default MediaGallery;","import * as React from 'react';\ninterface ILink {\n className?: string;\n text?: string;\n href?: string;\n ariaLabel?: string;\n}\n\nexport const Link: React.FC = ({ text, className, href, ariaLabel }) => ( {text} );","/*---------------------------------------------------------------------------------------------\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 { ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\nimport { ProductComponent } from '@msdyn365-commerce/components';\nimport { ICoreContext, IImageSettings } from '@msdyn365-commerce/core';\nimport { ProductSearchResult } from '@msdyn365-commerce/retail-proxy';\nimport * as React from 'react';\nimport { ISearchResultContainerResources } from '../search-result-container.props.autogenerated';\n\ninterface IProductSearchResultItems {\n products: ProductSearchResult[];\n context: ICoreContext;\n resources: ISearchResultContainerResources;\n imageSettings?: IImageSettings;\n moduleType: string;\n moduleId: string;\n allowBackNavigation?: boolean;\n telemetryContent: ITelemetryContent;\n}\n\nexport const ProductSearchResultItems: React.FC = ({\n products,\n context,\n imageSettings,\n resources,\n moduleType,\n moduleId,\n allowBackNavigation,\n telemetryContent\n}) => {\n\n return (\n\n
    \n {products.map((product: ProductSearchResult, index: number) => (\n
  • \n \n
  • \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 { getFallbackImageUrl, getProductPageUrlSync } from '@msdyn365-commerce-modules/retail-actions';\nimport { getPayloadObject, getTelemetryAttributes, ITelemetryContent ,onTelemetryClick } from '@msdyn365-commerce-modules/utilities';\nimport { ICoreContext, IGridSettings, IImageData, IImageSettings, Image} from '@msdyn365-commerce/core';\nimport { SimpleProduct } from '@msdyn365-commerce/retail-proxy';\nimport * as React from 'react';\nimport { ISearchResultContainerResources } from '../search-result-container.props.autogenerated';\n// import { IComponent, IComponentProps, ICoreContext, IGridSettings, IImageData, IImageSettings, Image, msdyn365Commerce } from '@msdyn365-commerce/core';\n\ninterface IFeatureSearchResultItem {\n product: SimpleProduct | null;\n context: ICoreContext;\n resources: ISearchResultContainerResources;\n imageSettings?: IImageSettings;\n moduleType: string;\n moduleId: string;\n telemetryContent?: ITelemetryContent;\n}\n\nexport const FeatureSearchResultItem: React.FC = ({\n product,\n context,\n imageSettings,\n resources,\n telemetryContent\n}) => {\n if(product === null) {\n return null;\n }\n\n const productName = product.Name;\n const productRecordId = product && product.RecordId ? product.RecordId: 0;\n const productUrl = getProductPageUrlSync(product.Name || '', productRecordId, context && context.actionContext, undefined);\n const fallbackImage = getFallbackImageUrl(product.ItemId, context.actionContext.requestContext.apiSettings);\n\n // Construct telemetry attribute to render\n const payLoad = getPayloadObject('click', telemetryContent!, productName!, productRecordId.toString());\n\n const attribute = getTelemetryAttributes(telemetryContent!, payLoad);\n return (\n \n );\n\n};\n\nfunction renderProductPlacementImage(imageSettings?: IImageSettings, gridSettings?: IGridSettings, imageUrl?: string, altText?: string, fallbackImage?: string,): JSX.Element | null {\n if (!imageUrl || !gridSettings || !imageSettings) {\n return null;\n }\n const img: IImageData = {\n src: imageUrl,\n altText: altText ? altText : ''\n };\n const imageProps = {\n gridSettings: gridSettings,\n imageSettings: imageSettings,\n fallBackSrc: fallbackImage\n };\n return (\n \n );\n}\n\nfunction renderProductTitle(title?: string): JSX.Element | null {\nreturn

{title}

;\n}","import * as React from 'react';\ninterface ITitle {\n className: string;\n text: string;\n}\n\nexport const Title: React.FC = ({ text, className }) => ( {text} );\n","import * as React from 'react';\ninterface ISeparator {\n separator: string;\n}\n\nexport const Separator: React.FC = ({ separator }) => ( {separator} );","import { ITelemetry } from '@msdyn365-commerce/core';\nimport { AttributeDataType, ProductRefinerValue, RefinerType } from '@msdyn365-commerce/retail-proxy';\nimport { IRefineItemToggleNotification } from './refine-item-toggle-notification';\n\n/**\n * Types of product refiner values\n * @deprecated This will be removed soon. Please, use `AttributeDataType` from `@msdyn365-commerce/retail-proxy` instead.\n * @example\n * ```\n * import { AttributeDataType } from `@msdyn365-commerce/retail-proxy`;\n * ```\n */\nexport const enum ProductRefinerValueDataTypeValue {\n /**\n * Range slider is used for selections like price\n * @deprecated This will be removed soon. Please, use `AttributeDataType` from `@msdyn365-commerce/retail-proxy` instead.\n * @example\n * ```\n * import { AttributeDataType } from `@msdyn365-commerce/retail-proxy`;\n * ```\n */\n Range = 1,\n\n /**\n * Range input is a different way to specify ranges and can be expressed with input boxes\n * as well as a set of discrete single-select type values\n * @deprecated This will be removed soon. Please, use `AttributeDataType` from `@msdyn365-commerce/retail-proxy` instead.\n * @example\n * ```\n * import { AttributeDataType } from `@msdyn365-commerce/retail-proxy`;\n * ```\n */\n RangeInput = 4,\n\n /**\n * This is a discrete list item, either multi-select or single-select\n * @deprecated This will be removed soon. Please, use `AttributeDataType` from `@msdyn365-commerce/retail-proxy` instead.\n * @example\n * ```\n * import { AttributeDataType } from `@msdyn365-commerce/retail-proxy`;\n * ```\n */\n List = 5,\n\n /**\n * Boolean types allows only single-select\n * @deprecated This will be removed soon. Please, use `AttributeDataType` from `@msdyn365-commerce/retail-proxy` instead.\n * @example\n * ```\n * import { AttributeDataType } from `@msdyn365-commerce/retail-proxy`;\n * ```\n */\n Boolean = 6\n}\n\n/**\n * Types of product refiners\n * @deprecated This will be removed soon. Please, use `RefinerType` from `@msdyn365-commerce/retail-proxy` instead.\n * @example\n * ```\n * import { RefinerType } from `@msdyn365-commerce/retail-proxy`;\n * ```\n */\nexport const enum ProductRefinerTypeValue {\n /**\n * Refiner values are single-select\n * @deprecated This will be removed soon. Please, use `RefinerType` from `@msdyn365-commerce/retail-proxy` instead.\n * @example\n * ```\n * import { RefinerType } from `@msdyn365-commerce/retail-proxy`;\n * ```\n */\n Single = 0,\n\n /**\n * Refiner values are multi-select\n * @deprecated This will be removed soon. Please, use `RefinerType` from `@msdyn365-commerce/retail-proxy` instead.\n * @example\n * ```\n * import { RefinerType } from `@msdyn365-commerce/retail-proxy`;\n * ```\n */\n Multi = 1\n}\n\n/**\n * ProductRefinerSource enum type.\n * @deprecated This will be removed soon. Please, use `ProductRefinerSource` from `@msdyn365-commerce/retail-proxy` instead.\n * @example\n * ```\n * import { ProductRefinerSource } from `@msdyn365-commerce/retail-proxy`;\n * ```\n */\nexport const enum ProductRefinerSource {\n /**\n * The None member.\n * @deprecated This will be removed soon. Please, use `ProductRefinerSource` from `@msdyn365-commerce/retail-proxy` instead.\n * @example\n * ```\n * import { ProductRefinerSource } from `@msdyn365-commerce/retail-proxy`;\n * ```\n */\n None = 0,\n /**\n * The Attribute member.\n * @deprecated This will be removed soon. Please, use `ProductRefinerSource` from `@msdyn365-commerce/retail-proxy` instead.\n * @example\n * ```\n * import { ProductRefinerSource } from `@msdyn365-commerce/retail-proxy`;\n * ```\n */\n Attribute = 1,\n /**\n * The Category member.\n * @deprecated This will be removed soon. Please, use `ProductRefinerSource` from `@msdyn365-commerce/retail-proxy` instead.\n * @example\n * ```\n * import { ProductRefinerSource } from `@msdyn365-commerce/retail-proxy`;\n * ```\n */\n Category = 2,\n /**\n * The Price member.\n * @deprecated This will be removed soon. Please, use `ProductRefinerSource` from `@msdyn365-commerce/retail-proxy` instead.\n * @example\n * ```\n * import { ProductRefinerSource } from `@msdyn365-commerce/retail-proxy`;\n * ```\n */\n Price = 3,\n /**\n * The Rating member.\n * @deprecated This will be removed soon. Please, use `ProductRefinerSource` from `@msdyn365-commerce/retail-proxy` instead.\n * @example\n * ```\n * import { ProductRefinerSource } from `@msdyn365-commerce/retail-proxy`;\n * ```\n */\n Rating = 4\n}\n\n/**\n * Checks if the data type value corresponds to a slider.\n */\nexport function isRangeType(dataTypeValue: number | undefined): boolean {\n return dataTypeValue === AttributeDataType.Currency ||\n dataTypeValue === AttributeDataType.Decimal ||\n dataTypeValue === AttributeDataType.Integer;\n}\n\n/**\n * Find the refinement criterion associated with this product refiner value\n * @param productRefinerValue product refiner value to match\n * @param refinementCriteria selected refinement criteria\n */\nexport function findMatchingRefinementCriterion(\n productRefinerValue: ProductRefinerValue,\n refinementCriteria: ProductRefinerValue[]\n): ProductRefinerValue | undefined {\n // if the value is a range, then match only on data type value; otherwise match on item string\n return refinementCriteria.find(\n (refinementCriterion: ProductRefinerValue) => isMatchingRefinementCriterion(productRefinerValue, refinementCriterion)\n );\n}\n\n/**\n * Find the refinement criterion associated with this product refiner value\n * @param productRefinerValue product refiner value to match\n * @param refinementCriteria selected refinement criteria\n */\nexport function isMatchingRefinementCriterion(\n productRefinerValue: ProductRefinerValue,\n refinementCriterion: ProductRefinerValue\n): boolean {\n // if the value is a range, then match only on data type value; otherwise match on item string\n return refinementCriterion.RefinerRecordId === productRefinerValue.RefinerRecordId &&\n refinementCriterion.RefinerSourceValue === productRefinerValue.RefinerSourceValue &&\n refinementCriterion.DataTypeValue === productRefinerValue.DataTypeValue &&\n (isRangeType(refinementCriterion.DataTypeValue) || refinementCriterion.LeftValueBoundString === productRefinerValue.LeftValueBoundString);\n}\n\nexport function getUpdatedRefinementCriteria(\n itemToggleNotification: IRefineItemToggleNotification,\n currentRefinementCriteria: ProductRefinerValue[]): ProductRefinerValue[] {\n const updatedRefinementCriteria: ProductRefinerValue[] = [];\n let toggledItemFound = false;\n currentRefinementCriteria.forEach((selectedCriterion: ProductRefinerValue) => {\n if (isMatchingRefinementCriterion(itemToggleNotification.productRefinerValue, selectedCriterion)) {\n toggledItemFound = true;\n if (itemToggleNotification.isSelecting) {\n const next = {\n ...selectedCriterion,\n LeftValueBoundString: itemToggleNotification.rangeStart !== undefined && `${itemToggleNotification.rangeStart}` || selectedCriterion.LeftValueBoundString,\n RightValueBoundString: itemToggleNotification.rangeEnd !== undefined && `${itemToggleNotification.rangeEnd}` || selectedCriterion.RightValueBoundString,\n };\n updatedRefinementCriteria.push(next);\n\n } // else the item is being de-selected, so omit it from the refinement criteria\n } else {\n // keep existing criterion because it is not in the item toggle notification\n updatedRefinementCriteria.push(selectedCriterion);\n }\n });\n\n if (!toggledItemFound) {\n const next = {\n ...itemToggleNotification.productRefinerValue,\n LeftValueBoundString: itemToggleNotification.rangeStart !== undefined && `${itemToggleNotification.rangeStart}` || itemToggleNotification.productRefinerValue.LeftValueBoundString,\n RightValueBoundString: itemToggleNotification.rangeEnd !== undefined && `${itemToggleNotification.rangeEnd}` || itemToggleNotification.productRefinerValue.RightValueBoundString,\n };\n updatedRefinementCriteria.push(next);\n\n // If single select, then deselect any others in the parent refiner group\n if ((itemToggleNotification.productRefinerValue.DataTypeValue === AttributeDataType.Text || itemToggleNotification.productRefinerValue.DataTypeValue === AttributeDataType.TrueFalse) &&\n itemToggleNotification.parentProductRefinerHierarchy.RefinerTypeValue === RefinerType.SingleSelect) {\n itemToggleNotification.parentProductRefinerHierarchy.Values.forEach((child: ProductRefinerValue) => {\n if (child.RefinerRecordId === next.RefinerRecordId && child.LeftValueBoundString === next.LeftValueBoundString) {\n // do nothing\n } else {\n const matchingIndex = updatedRefinementCriteria.findIndex((criterion: ProductRefinerValue) => isMatchingRefinementCriterion(child, criterion));\n if (matchingIndex > -1) {\n updatedRefinementCriteria.splice(matchingIndex, 1);\n }\n }\n });\n }\n }\n\n return updatedRefinementCriteria;\n}\n\nexport function formatPrice(\n amount: string | undefined,\n currency: string | undefined,\n locale: string | undefined,\n telemetry: ITelemetry): string {\n if (!amount || !currency) {\n telemetry.trace(`[refine-menu.utilities.formatPrice] could not format price for ${amount} ${currency}`);\n return amount || '';\n }\n const priceAmount = (amount && Number(amount)) || 0;\n let result: string;\n\n try {\n result = new Intl.NumberFormat(locale, {\n style: 'currency',\n currencyDisplay: 'symbol',\n currency: currency,\n minimumFractionDigits: 0\n }).format(priceAmount);\n } catch (e) {\n result = `${priceAmount} ${currency}`;\n telemetry.warning(`[refine-menu.utilities.formatPrice] Failed to format price for ${result}: ${e}`);\n }\n\n return result;\n}","import { Slider } from '@msdyn365-commerce-modules/utilities';\nimport debounce from 'lodash/debounce';\nimport { computed } from 'mobx';\nimport { observer } from 'mobx-react';\nimport * as React from 'react';\nimport { formatPrice } from './utilities';\n\ntype InputType = 'Min' | 'Max';\n\nimport { IRefineItemProps, IRefineItemState } from './refine-item';\n\nexport type RangeRefineItemType = 'slider' | 'input';\n\n/**\n * Range refine item properties\n */\nexport interface IRangeRefineItemProps extends IRefineItemProps {\n rangeType: RangeRefineItemType;\n minValueSliderThumbAriaLabel?: string;\n maxValueSliderThumbAriaLabel?: string;\n}\n\n/**\n * Range refine item state\n */\nexport interface IRangeRefineItemState extends IRefineItemState {\n validationErrorMin: string | undefined;\n validationErrorMax: string | undefined;\n selectedMin: string | undefined;\n selectedMax: string | undefined;\n touchedMin: boolean;\n touchedMax: boolean;\n}\n\n/**\n * RangeRefineItem component (controlled by RefineSubmenu)\n */\n@observer\nexport default class RangeRefineItem extends React.Component {\n private _formattedPriceReverseLookup: Map = new Map();\n\n private minInput: React.RefObject;\n private maxInput: React.RefObject;\n\n @computed get currencyCode(): string {\n return this.props.productRefinerValue.UnitText || '';\n }\n\n constructor(props: IRangeRefineItemProps) {\n super(props);\n this._onRangeUpdate = this._onRangeUpdate.bind(this);\n this._onRangeUpdateEnd = this._onRangeUpdateEnd.bind(this);\n this._handleRangeTooltipText = this._handleRangeTooltipText.bind(this);\n this._changeMin = this._changeMin.bind(this);\n this._changeMax = this._changeMax.bind(this);\n this._finishChangeMin = this._finishChangeMin.bind(this);\n this._finishChangeMax = this._finishChangeMax.bind(this);\n\n this.minInput = React.createRef();\n this.maxInput = React.createRef();\n\n const { selectedRefinementCriterion } = this.props;\n const initialMin = selectedRefinementCriterion && selectedRefinementCriterion.LeftValueBoundString || '0';\n const initialMax = selectedRefinementCriterion && selectedRefinementCriterion.RightValueBoundString || undefined;\n this.state = {\n isChecked: false,\n validationErrorMin: undefined,\n validationErrorMax: undefined,\n selectedMin: initialMin,\n selectedMax: initialMax,\n touchedMin: false,\n touchedMax: false\n };\n }\n\n public render(): JSX.Element | undefined {\n const { productRefinerValue, parentProductRefinerHierarchy, refineItemCommonProps } = this.props;\n\n if (!productRefinerValue || !parentProductRefinerHierarchy) {\n refineItemCommonProps.telemetry.error('Cannot render refine value range without productRefinerValue and parentProductRefinerHierarchy');\n return undefined;\n }\n\n if (this.props.rangeType === 'input') {\n return this._renderInputFields();\n }\n\n return this._renderSlider();\n }\n\n private _renderInputFields(): JSX.Element | undefined {\n const { isDisabled, parentProductRefinerHierarchy, refineItemCommonProps } = this.props;\n const { selectedMin, selectedMax, touchedMin, touchedMax, validationErrorMin, validationErrorMax } = this.state;\n\n const rangeAriaLabel = (refineItemCommonProps.rangeNameFormat || '{0}').replace('{0}', (parentProductRefinerHierarchy.KeyName || ''));\n const formAttrs = {\n 'aria-label': rangeAriaLabel,\n 'aria-disabled': isDisabled\n };\n\n // To enable price formatting of selected fields, this is the approach:\n // initial value: min=0 formatted as price, max=undefined\n // onFocus/onChange: convert to number (unformat) and mark as touched to indicate value is being edited\n // onBlur: validate and format entered value as price\n const minInputClassName = `ms-refine-submenu__input-range refine-submenu__input-range-min ${validationErrorMin ? 'refine-submenu__input-range--error' : ''}`;\n const maxInputClassName = `ms-refine-submenu__input-range refine-submenu__input-range-max ${validationErrorMax ? 'refine-submenu__input-range--error' : ''}`;\n const minLabelClassName = 'ms-refine-submenu__input-range-label refine-submenu__input-range-label-min';\n const maxLabelClassName = 'ms-refine-submenu__input-range-label refine-submenu__input-range-label-max';\n const formattedSelectedMin = this._getFormattedSelectedValue(selectedMin, touchedMin, validationErrorMin);\n const formattedSelectedMax = this._getFormattedSelectedValue(selectedMax, touchedMax, validationErrorMax);\n return (\n
\n \n \n {validationErrorMin &&\n {validationErrorMin}\n }\n {validationErrorMax && validationErrorMin !== validationErrorMax &&\n {validationErrorMax}\n }\n
\n );\n }\n\n private _renderSlider(): JSX.Element | undefined {\n const { isDisabled, productRefinerValue, parentProductRefinerHierarchy, selectedRefinementCriterion } = this.props;\n const min = productRefinerValue.LeftValueBoundString;\n const max = productRefinerValue.RightValueBoundString;\n const selectedMin = selectedRefinementCriterion && selectedRefinementCriterion.LeftValueBoundString || productRefinerValue.LeftValueBoundString || '0';\n const selectedMax = selectedRefinementCriterion && selectedRefinementCriterion.RightValueBoundString || productRefinerValue.RightValueBoundString || max;\n const sliderId = `slider_${parentProductRefinerHierarchy.RecordId}_${productRefinerValue.RefinerRecordId}`;\n const ariaAttributes = {\n 'aria-disabled': isDisabled\n };\n\n const minPrice = this._formatPrice(min);\n const maxPrice = this._formatPrice(max);\n const selectedMinPrice =this._formatPrice(selectedMin);\n const selectedMaxPrice =this._formatPrice(selectedMax);\n\n return (\n \n );\n }\n\n private _changeMin(event: React.FocusEvent): void {\n this._changeValue(event, 'Min');\n }\n\n private _changeMax(event: React.FocusEvent): void {\n this._changeValue(event, 'Max');\n }\n\n private _changeValue(event: React.FocusEvent, inputType: InputType): void {\n const selectedKey = `selected${inputType}`;\n const touchedKey = `touched${inputType}`;\n this.setState({\n [selectedKey]: this._getInputWithoutFormatting(event.currentTarget.value),\n [touchedKey]: true\n });\n }\n\n private _finishChangeMin(event: React.FocusEvent): boolean {\n const selectedMinValue = this._getInputWithoutFormatting(event.currentTarget.value);\n this.setState({\n selectedMin: selectedMinValue,\n minTouched: false\n });\n const minInput = Number(selectedMinValue);\n const { onToggle, parentProductRefinerHierarchy, productRefinerValue, refineItemCommonProps, selectedRefinementCriterion } = this.props;\n const max = selectedRefinementCriterion && selectedRefinementCriterion.RightValueBoundString || undefined;\n\n const maxNum = max ? Number(max) : undefined;\n\n if (isNaN(minInput)) {\n this.setState({validationErrorMin: refineItemCommonProps.validationErrorNaN});\n this._focus('Min');\n return false;\n }\n\n if (this._validateRange(minInput, maxNum)) {\n onToggle({\n parentProductRefinerHierarchy: parentProductRefinerHierarchy,\n productRefinerValue: productRefinerValue,\n isSelecting: true,\n rangeStart: minInput,\n rangeEnd: maxNum\n });\n return true;\n } else {\n this._focus('Min');\n }\n\n return false;\n }\n\n private _finishChangeMax(event: React.FocusEvent): boolean {\n const selectedMaxValue = this._getInputWithoutFormatting(event.currentTarget.value);\n this.setState({\n selectedMax: selectedMaxValue,\n maxTouched: false\n });\n const maxInput = Number(selectedMaxValue);\n const { onToggle, parentProductRefinerHierarchy, productRefinerValue, refineItemCommonProps, selectedRefinementCriterion } = this.props;\n const min = selectedRefinementCriterion && selectedRefinementCriterion.LeftValueBoundString || '0';\n\n const minNum = Number(min);\n\n if (isNaN(maxInput)) {\n this.setState({validationErrorMax: refineItemCommonProps.validationErrorNaN});\n this._focus('Max');\n return false;\n }\n\n if (this._validateRange(minNum, maxInput)) {\n if (productRefinerValue) {\n onToggle({\n parentProductRefinerHierarchy: parentProductRefinerHierarchy,\n productRefinerValue: productRefinerValue,\n isSelecting: true,\n rangeStart: minNum,\n rangeEnd: maxInput\n });\n } else {\n this._focus('Max');\n }\n return true;\n }\n\n return false;\n }\n\n private _focus(inputType: InputType): void {\n const ref = inputType === 'Max' ? this.maxInput : this.minInput;\n\n setTimeout(() => {\n if (ref && ref.current) {\n ref.current.focus();\n }\n }, 50);\n }\n\n private _getFormattedSelectedValue(selected: string | undefined, touched: boolean, validationError: string | undefined): string | undefined {\n if (touched || validationError || selected === undefined) {\n return selected;\n }\n return this._formatPrice(selected);\n }\n\n private _validateRange(min: number, max: number | undefined): boolean {\n const { refineItemCommonProps } = this.props;\n if (max === undefined) {\n return true;\n }\n\n if (min > max) {\n this.setState({\n validationErrorMin: refineItemCommonProps.validationErrorRange,\n validationErrorMax: refineItemCommonProps.validationErrorRange\n });\n return false;\n }\n\n return true;\n }\n\n private _formatPrice(amount: string | undefined): string {\n const locale = this.props.refineItemCommonProps.locale;\n const result = formatPrice(amount, this.currencyCode, locale, this.props.refineItemCommonProps.telemetry);\n\n if (amount !== undefined && !this._formattedPriceReverseLookup.has(result)) {\n this._formattedPriceReverseLookup.set(result, amount);\n }\n\n return result;\n }\n\n private _getInputWithoutFormatting(input: string): string {\n // First try to cast raw input to a number\n const inputAsNum = Number(input);\n if (!isNaN(inputAsNum)) {\n return input;\n }\n\n // Otherwise try a reverse lookup and fall back to the raw input if all else fails\n const reverseLookupResult = this._formattedPriceReverseLookup.get(input);\n return reverseLookupResult || input;\n }\n\n // NOTE: Fix types once Shared Components build pipeline bug fixed\n // tslint:disable-next-line:no-any\n private _onRangeUpdate(sliderChangeNotification: any): void {\n // Need to filter out mousemove events as these cause errors after the menu updates and slider re-renders\n if (sliderChangeNotification.eventType !== 'mousemove') {\n const { onToggle, parentProductRefinerHierarchy, productRefinerValue } = this.props;\n if (productRefinerValue && sliderChangeNotification) {\n onToggle({\n parentProductRefinerHierarchy: parentProductRefinerHierarchy,\n productRefinerValue: productRefinerValue,\n isSelecting: true,\n rangeStart: sliderChangeNotification.firstThumbValue,\n rangeEnd: sliderChangeNotification.secondThumbValue\n });\n\n this._focusOnSliderThumb(sliderChangeNotification);\n }\n }\n }\n\n // tslint:disable-next-line\n private _onRangeUpdateEnd(sliderChangeNotification: any): void {\n const { onToggle, parentProductRefinerHierarchy, productRefinerValue } = this.props;\n if (productRefinerValue && sliderChangeNotification) {\n onToggle({\n parentProductRefinerHierarchy: parentProductRefinerHierarchy,\n productRefinerValue: productRefinerValue,\n isSelecting: true,\n rangeStart: sliderChangeNotification.firstThumbValue,\n rangeEnd: sliderChangeNotification.secondThumbValue\n });\n\n this._focusOnSliderThumb(sliderChangeNotification);\n }\n }\n\n // tslint:disable-next-line\n private _focusOnSliderThumb(sliderChangeNotification: any): void {\n if (sliderChangeNotification.id) {\n const element = document.getElementById(`${sliderChangeNotification.id}range`);\n if (!!element) {\n setTimeout(\n () => {\n element.focus();\n }, 0);\n }\n }\n }\n\n private _handleRangeTooltipText(tooltip: number): string {\n return this._formatPrice(`${tooltip}`);\n }\n}","import { getPayloadObject, getTelemetryAttributes, IPayLoad, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\nimport { IProductRefinerHierarchy } from '@msdyn365-commerce/commerce-entities';\nimport { RatingComponent } from '@msdyn365-commerce/components';\nimport { ICoreContext } from '@msdyn365-commerce/core';\nimport { ProductRefinerSource, ProductRefinerValue, RefinerType } from '@msdyn365-commerce/retail-proxy';\nimport * as React from 'react';\nimport { IRefineItemToggleNotification } from './refine-item-toggle-notification';\nimport { IRefineItemCommonProps } from './refine-item.props.common';\n\n/**\n * RefineItem properties\n */\nexport interface IRefineItemProps {\n\n parentProductRefinerHierarchy: IProductRefinerHierarchy;\n productRefinerValue: ProductRefinerValue;\n selectedRefinementCriterion: ProductRefinerValue | undefined;\n selectedRefinerValues?: ProductRefinerValue[];\n refineItemCommonProps: IRefineItemCommonProps;\n isDisabled: boolean;\n context: ICoreContext;\n moduleId: string;\n moduleTypeName: string;\n index?: number;\n /** The telemetry content */\n telemetryContent?: ITelemetryContent;\n onToggle(notfication: Readonly): void;\n urlBuilder(refiner: IRefineItemToggleNotification): string;\n}\n\n/**\n * Refine item state\n */\nexport interface IRefineItemState extends React.ComponentState {\n isChecked: boolean;\n renderingError?: object;\n}\n\n/**\n * Single-select and multi-select refine item component (controlled by RefineSubmenu)\n */\nexport default class RefineItem extends React.Component {\n private anchorType: React.RefObject;\n private payLoad: IPayLoad;\n\n constructor(props: IRefineItemProps) {\n super(props);\n this._onClick = this._onClick.bind(this);\n this.state = {\n isChecked: !!this.props.selectedRefinementCriterion\n };\n this.anchorType = React.createRef();\n this.payLoad = getPayloadObject('click', this.props.telemetryContent!, '');\n }\n\n // tslint:disable-next-line:max-func-body-length\n public render(): JSX.Element | undefined {\n const {\n isDisabled,\n refineItemCommonProps,\n parentProductRefinerHierarchy,\n productRefinerValue,\n selectedRefinementCriterion,\n index,\n children,\n onToggle,\n context,\n telemetryContent,\n ...attrs\n } = this.props;\n if (!productRefinerValue) {\n refineItemCommonProps.telemetry.error('[refine-item] Cannot render refineItem without productRefinerValue');\n return undefined;\n }\n if (!productRefinerValue.LeftValueBoundString) {\n refineItemCommonProps.telemetry.warning(`[refine-item] RefineItem without LeftValueBoundString: ${JSON.stringify(productRefinerValue)}`);\n }\n const isSingleSelect = parentProductRefinerHierarchy.RefinerTypeValue === RefinerType.SingleSelect;\n let itemTypeClassName = isSingleSelect ? 'single-select' : 'multi-select';\n itemTypeClassName = `ms-refine-submenu-item ${itemTypeClassName}`;\n const inputType = isSingleSelect ? 'radio' : 'checkbox';\n const isChecked = !!selectedRefinementCriterion;\n itemTypeClassName = isChecked ? `${itemTypeClassName}-checked` : itemTypeClassName;\n if (parentProductRefinerHierarchy.SourceValue === ProductRefinerSource.Rating) {\n if (productRefinerValue.LeftValueBoundString) {\n this.payLoad.contentAction.etext = productRefinerValue.LeftValueBoundLocalizedString;\n const attribute = getTelemetryAttributes(telemetryContent!, this.payLoad);\n const refinerRating = parseInt(productRefinerValue.LeftValueBoundString, 10);\n const ratingRefiner = this.props.selectedRefinerValues?.find(value => value.DataTypeValue === productRefinerValue.DataTypeValue);\n const selectedRating = parseInt(ratingRefiner?.LeftValueBoundString || '0', 10);\n let ratingComponentClass: string = 'ms-rating-component';\n if (refinerRating > selectedRating) {\n ratingComponentClass = `${ratingComponentClass}__up`;\n } else if (refinerRating < selectedRating) {\n ratingComponentClass = `${ratingComponentClass}__down`;\n } else {\n ratingComponentClass = `${ratingComponentClass}__current`;\n }\n return (\n \n \n \n {productRefinerValue.Count !== undefined && `(${productRefinerValue.Count})`}\n \n \n );\n } else {\n return undefined;\n }\n } else {\n this.payLoad.contentAction.etext = productRefinerValue.LeftValueBoundLocalizedString || productRefinerValue.LeftValueBoundString;\n const attribute = getTelemetryAttributes(telemetryContent!, this.payLoad);\n return (\n
  • \n \n \n {productRefinerValue.LeftValueBoundLocalizedString || productRefinerValue.LeftValueBoundString}\n {productRefinerValue.Count !== undefined && ` (${productRefinerValue.Count})`}\n \n \n
  • \n );\n }\n }\n\n private _getRefinerUrl(): string {\n const { urlBuilder, parentProductRefinerHierarchy, productRefinerValue, selectedRefinementCriterion } = this.props;\n\n if (productRefinerValue) {\n return urlBuilder({\n parentProductRefinerHierarchy: parentProductRefinerHierarchy,\n productRefinerValue: productRefinerValue,\n isSelecting: !selectedRefinementCriterion\n });\n }\n\n return '';\n }\n\n private _onClick = (e: React.MouseEvent): void => {\n e.preventDefault();\n\n const { parentProductRefinerHierarchy, productRefinerValue, selectedRefinementCriterion } = this.props;\n if (productRefinerValue) {\n this.props.onToggle({\n parentProductRefinerHierarchy: parentProductRefinerHierarchy,\n productRefinerValue: productRefinerValue,\n isSelecting: !selectedRefinementCriterion\n });\n\n setTimeout(\n () => {\n this.anchorType.current && this.anchorType.current.focus();\n },\n 0\n );\n }\n }\n}","import { getPayloadObject, getTelemetryAttributes, IPayLoad } from '@msdyn365-commerce-modules/utilities';\nimport { IProductRefinerHierarchy } from '@msdyn365-commerce/commerce-entities';\nimport { ProductRefinerValue } from '@msdyn365-commerce/retail-proxy';\nimport classnames from 'classnames';\nimport { get } from 'lodash';\nimport { computed } from 'mobx';\nimport { observer } from 'mobx-react';\nimport * as React from 'react';\nimport { IChoiceSummaryProps } from './choice-summary.props';\nimport { isMatchingRefinementCriterion, isRangeType } from './utilities';\n\ninterface IRefinerMap {\n key: string;\n value: ProductRefinerValue;\n}\n\n /**\n * ChoiceSummary component\n */\n@observer\nexport default class ChoiceSummary extends React.Component {\n private closeButtonGlyph: string = 'msi-close-btn';\n private payLoad: IPayLoad;\n\n @computed get selectedRefinersMap(): IRefinerMap[] {\n const { selectedChoices } = this.props;\n return selectedChoices.map((selectedRefiner: ProductRefinerValue) => {\n return {\n key: this._getKeyForRefinerValue(selectedRefiner),\n value: selectedRefiner\n } as IRefinerMap;\n });\n }\n\n constructor(props: Readonly) {\n super(props);\n this.payLoad = getPayloadObject('click', this.props.telemetryContent!, '');\n }\n\n public render(): JSX.Element {\n const { clearAllText, label, classNames, choiceAriaLabel } = this.props;\n const items = this.selectedRefinersMap;\n this.payLoad.contentAction.etext = clearAllText;\n const clearAllAttributes = getTelemetryAttributes(this.props.telemetryContent!, this.payLoad);\n return (\n
    \n {items.length > 0 && label && {label}}\n
      \n {items.map((item: IRefinerMap, index: number) => {\n const listItemProps = {\n 'aria-posinset': index,\n 'aria-setsize': items.length\n };\n\n this.payLoad.contentAction.etext = item.key;\n const attribute = getTelemetryAttributes(this.props.telemetryContent!, this.payLoad);\n\n return (\n
    • \n \n {item.key}\n \n \n
    • \n );\n })}\n
    \n {items.length > 0 && clearAllText && {clearAllText}}\n
    \n );\n }\n\n private _getKeyForRefinerValue(productRefinerValue: ProductRefinerValue): string {\n const { choiceFormat, choiceRangeValueFormat, refinerHierarchy, telemetry } = this.props;\n const overallFormat = choiceFormat || '{1}';\n const rangeFormat = choiceRangeValueFormat;\n let refinerName = '';\n if (refinerHierarchy && refinerHierarchy.find) {\n const parent = refinerHierarchy.find(\n (hierarchy: IProductRefinerHierarchy) =>\n !!hierarchy.Values.find((value: ProductRefinerValue) => isMatchingRefinementCriterion(value, productRefinerValue))\n );\n\n if (!parent) {\n telemetry.warning('[choice-summary] could not find parent of selected refiner value');\n } else {\n refinerName = parent.KeyName || '';\n }\n }\n\n let refinerValueName: string;\n if (isRangeType(productRefinerValue.DataTypeValue)) {\n refinerValueName = rangeFormat\n .replace('{0}', this._formatPrice(productRefinerValue.LeftValueBoundString, productRefinerValue.UnitText))\n .replace('{1}', this._formatPrice(productRefinerValue.RightValueBoundString, productRefinerValue.UnitText));\n } else {\n refinerValueName = productRefinerValue.LeftValueBoundLocalizedString || productRefinerValue.LeftValueBoundString || '';\n }\n\n return overallFormat.replace('{0}', refinerName).replace('{1}', refinerValueName);\n }\n\n private _formatPrice(amount: string | undefined, currency: string | undefined): string {\n if (!amount || !currency) {\n this.props.telemetry.trace('[choice-summary] could not format price');\n return amount || '';\n }\n const priceAmount = (amount && Number(amount)) || 0;\n const locale = get(this.props, 'context.request.locale', 'en-US');\n let result: string;\n\n try {\n result = new Intl.NumberFormat(locale, {\n style: 'currency',\n currencyDisplay: 'symbol',\n currency: currency,\n minimumFractionDigits: 0\n }).format(priceAmount);\n } catch (e) {\n result = `${priceAmount} ${currency}`;\n this.props.telemetry.warning(`Failed to format price for ${result}: ${e}`);\n }\n\n return result;\n }\n\n private _onClick = (e: React.MouseEvent): void => {\n e.preventDefault();\n e.stopPropagation();\n\n const target = e.currentTarget as HTMLElement;\n const clearAll = target.getAttribute('class')!.indexOf('choice-summary__clear-all') > -1;\n const selectedRefiner = clearAll ? undefined : this._getSelectedRefinerChoice(target);\n\n if (this.props.onChoiceClicked) {\n this.props.onChoiceClicked({\n clearAll: clearAll,\n itemClicked: target,\n choiceClicked: selectedRefiner,\n nextItemToFocus: target.nextSibling as HTMLElement\n });\n }\n }\n\n private _getSelectedRefinerChoice(itemClicked: HTMLElement): ProductRefinerValue | undefined {\n const result = this.selectedRefinersMap.find(selected => (itemClicked.innerText && itemClicked.innerText.trim()) === selected.key);\n return (result && result.value) || undefined;\n }\n}\n","import {\n Button,\n Modal,\n ModalBody,\n ModalFooter,\n ModalHeader\n} from '@msdyn365-commerce-modules/utilities';\nimport React from 'react';\n\nexport interface ISearchResultModalViewProps {\n modal: React.ReactElement;\n modalHeader: React.ReactElement;\n modalFooter: React.ReactElement;\n modalBody: React.ReactElement;\n}\n\ninterface IModalToggleProps {\n innerRef: React.RefObject | undefined;\n id: string;\n text: string;\n ariaLabel: string;\n onClick(): void;\n}\n\nexport interface ISearchResultModalResources {\n modalTitle: string;\n modalCloseButtonText: string;\n}\n\nexport interface ISearchResultModalProps {\n resources: ISearchResultModalResources;\n isOpen: boolean;\n returnRef: React.RefObject | undefined;\n onModalToggle():void;\n}\n\nexport const ModalToggle: React.FC = (props: IModalToggleProps) => {\n const {text, onClick, ariaLabel, innerRef, id} = props;\n return ;\n};\n\nexport const SearchResultModal = (props: ISearchResultModalProps):ISearchResultModalViewProps => {\n return {\n modal: modalNode(props),\n modalHeader: modalHeaderNode(props),\n modalFooter: modalFooterNode(props),\n modalBody: \n };\n};\n\nconst modalNode = (props: ISearchResultModalProps) => {\n return (\n \n );\n};\n\nconst modalHeaderNode = (props: ISearchResultModalProps) => {\n return (\n \n {props.resources.modalTitle}\n \n );\n};\n\nconst modalFooterNode = (props: ISearchResultModalProps) => {\n return (\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 * as React from 'react';\n\nimport { Button, Collapse, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\nimport { IProductRefinerHierarchy } from '@msdyn365-commerce/commerce-entities';\nimport {IAny, ICoreContext, IGeneric} from '@msdyn365-commerce/core';\nimport { DisplayTemplate, ProductRefinerSource, ProductRefinerValue, RefinerType } from '@msdyn365-commerce/retail-proxy';\nimport RangeRefineItem, { RangeRefineItemType } from './range-refine-item';\nimport RefineItem from './refine-item';\nimport { IRefineItemToggleNotification } from './refine-item-toggle-notification';\nimport { IRefineItemCommonProps } from './refine-item.props.common';\nimport { findMatchingRefinementCriterion, isRangeType } from './utilities';\n\n/**\n * Properties associated with the RefineSubmenu component\n */\nexport interface IRefineSubmenuProps {\n tempRangeTypeTODO: RangeRefineItemType;\n minValueSliderThumbAriaLabel?: string;\n maxValueSliderThumbAriaLabel?: string;\n productRefinerHierarchy: IProductRefinerHierarchy;\n selectedRefinerValues: ProductRefinerValue[];\n refineItemCommonProps: IRefineItemCommonProps;\n isDisabled: boolean;\n isExpandedOnInitialLoad: boolean;\n context: ICoreContext>;\n moduleId: string;\n moduleTypeName: string;\n /** The telemetry content */\n telemetryContent?: ITelemetryContent;\n onUpdateRefiners(notfication: Readonly): void;\n urlBuilder(refiner: IRefineItemToggleNotification): string;\n}\n\n/**\n * Refine submenu state\n */\nexport interface IRefineSubmenuState extends React.ComponentState {\n expanded: boolean;\n}\n\n/**\n *\n * The RefineSubmenu component renders the submenu category and child items.\n * This computed observes the stateful category hierarchy object.\n * @extends {React.PureComponent}\n */\nclass RefineSubmenu extends React.Component {\n constructor(props: IRefineSubmenuProps) {\n super(props);\n\n this._onToggleItem = this._onToggleItem.bind(this);\n this._onToggleSubmenu = this._onToggleSubmenu.bind(this);\n\n const isExpanded = this.props.isExpandedOnInitialLoad;\n // if (this.props.productRefinerHierarchy.DataTypeValue === ProductRefinerValueDataTypeValue.Range) {\n // isExpanded = true;\n // }\n\n this.state = {\n expanded: isExpanded\n };\n }\n\n public render(): JSX.Element | null {\n const { productRefinerHierarchy, refineItemCommonProps } = this.props;\n\n if (!productRefinerHierarchy) {\n refineItemCommonProps.telemetry.error('Cannot render submenu without refiner hierarchy data');\n }\n\n if((productRefinerHierarchy.SourceValue === ProductRefinerSource.Rating) && (this.props.context.app.config.hideRating)) {\n return null;\n }\n return (\n
    \n \n {productRefinerHierarchy.KeyName}\n \n \n {this._renderChildItems(productRefinerHierarchy)}\n \n
    \n );\n }\n\n private _renderChildItems(productRefinerHierarchy: IProductRefinerHierarchy): JSX.Element | null {\n if (isRangeType(productRefinerHierarchy.DataTypeValue)) {\n return this._renderRange(productRefinerHierarchy);\n }\n return this._renderSingleMultiSelect(productRefinerHierarchy);\n }\n\n private _renderSingleMultiSelect(productRefinerHierarchy: IProductRefinerHierarchy): JSX.Element | null {\n const { isDisabled, refineItemCommonProps, selectedRefinerValues, context } = this.props;\n const isSingleSelect = (productRefinerHierarchy.RefinerTypeValue === RefinerType.SingleSelect) && (productRefinerHierarchy.SourceValue === ProductRefinerSource.Rating);\n const role = isSingleSelect ? { role: 'radiogroup' } : undefined;\n const refinerValuesList = (productRefinerHierarchy.Values || []);\n const listItems = refinerValuesList.map((child: ProductRefinerValue, index: number) => {\n if (!child) {\n refineItemCommonProps.telemetry.error(\n `[refine-submenu] Could not render refine item for refiner ${productRefinerHierarchy.RecordId} (${productRefinerHierarchy.KeyName})`\n );\n return null;\n }\n\n const selectedRefinementCriterion = findMatchingRefinementCriterion(child, selectedRefinerValues);\n\n return (\n refinerValuesList.find(value => value.RefinerRecordId === selectedValue.RefinerRecordId))}\n refineItemCommonProps={refineItemCommonProps}\n onToggle={this._onToggleItem}\n urlBuilder={this.props.urlBuilder}\n isDisabled={isDisabled}\n key={index}\n index= {index}\n context = {context}\n moduleId={this.props.moduleId}\n moduleTypeName={this.props.moduleTypeName}\n telemetryContent={this.props.telemetryContent}\n />\n );\n });\n return (\n
      \n {listItems}\n
    \n );\n }\n\n private _getRangeType(productRefinerHierarchy: IProductRefinerHierarchy): 'input' | 'slider' {\n if (productRefinerHierarchy.DisplayTemplateValue === DisplayTemplate.Range ||\n productRefinerHierarchy.DisplayTemplateValue === DisplayTemplate.Slider ||\n productRefinerHierarchy.DisplayTemplateValue === DisplayTemplate.SliderWithBars) {\n return 'slider';\n }\n return 'input';\n }\n\n private _renderRange(productRefinerHierarchy: IProductRefinerHierarchy): JSX.Element | null {\n const { isDisabled, refineItemCommonProps, selectedRefinerValues, context, minValueSliderThumbAriaLabel, maxValueSliderThumbAriaLabel } = this.props;\n const submenuClassNamePrefix = 'ms-refine-submenu__item list-group-item refine-submenu__item';\n const refinerValuesList = (productRefinerHierarchy.Values || []);\n const listItems = refinerValuesList.map((child: ProductRefinerValue, index: number) => {\n if (!child) {\n refineItemCommonProps.telemetry.error(\n `Could not render refine item for refiner ${productRefinerHierarchy.RecordId} (${productRefinerHierarchy.KeyName})`\n );\n return null;\n }\n\n const selectedRefinementCriterion = findMatchingRefinementCriterion(child, selectedRefinerValues);\n\n const rangeType = this._getRangeType(productRefinerHierarchy);\n const key = selectedRefinementCriterion ? `${selectedRefinementCriterion.LeftValueBoundString}-${selectedRefinementCriterion.RightValueBoundString}` : `not-selected-${index}`;\n return (\n
  • \n \n
  • \n );\n });\n return
      {listItems}
    ;\n }\n\n private _onToggleItem(itemToggleNotification: IRefineItemToggleNotification): void {\n this.props.onUpdateRefiners(itemToggleNotification);\n }\n\n private _onToggleSubmenu(): void {\n this.setState(prevState => ({\n expanded: !prevState.expanded\n }));\n }\n}\n\nexport default RefineSubmenu;","import * as React from 'react';\ninterface IErrorMessage {\n text?: string;\n}\n\nexport const ErrorMessage: React.FC = ({ text }) => {\n return (\n \n
    {text}
    \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 {ArrayExtensions, getCustomer, GetCustomerInput } from '@msdyn365-commerce-modules/retail-actions';\nimport { getTelemetryObject, ILabeledDropdownOnChangeNotification, ILabeledDropdownOption, IModuleProps, INodeProps, ITelemetryContent, LabeledDropdown, UncontrolledPagination } from '@msdyn365-commerce-modules/utilities';\nimport { CategoryHierarchy as CategoryHierarchyData, IProductRefinerHierarchy } from '@msdyn365-commerce/commerce-entities';\nimport MsDyn365 from '@msdyn365-commerce/core';\nimport { format, ProductPrice,ProductRefinerValue, ProjectionDomain, SortColumn, TextValueTranslation } 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 { computed, observable, reaction, transaction } from 'mobx';\nimport { observer } from 'mobx-react';\nimport * as React from 'react';\nimport { buildListPageUrl, getCollectionProducts, getCurrentUrl, GetFullProductsByCollectionInput, parseQueryParam, sortOptions } from './actions';\nimport {\n ErrorMessage, FeatureSearchResultItem, getUpdatedRefinementCriteria, IChoiceSummaryClickNotification,\n IRefineItemCommonProps, IRefineItemToggleNotification, ISearchResultModalViewProps, isMatchingRefinementCriterion,Link, ModalToggle, ProductSearchResultItems, SearchResultModal, Separator, Title\n} from './components';\nimport ChoiceSummary from './components/choice-summary';\nimport RefineSubmenu from './components/refine-submenu';\nimport { ISearchResultContainerData } from './search-result-container.data';\nimport { expandRefinersCount, ISearchResultContainerProps } from './search-result-container.props.autogenerated';\n\nexport interface ISearchResultContainerViewProps extends ISearchResultContainerProps {\n products?: React.ReactNode;\n className?: string;\n SearchResultContainer: IModuleProps;\n TitleViewProps: ITitleViewProps;\n categoryHierarchy: ICategoryHierarchyViewProps;\n pagination?: React.ReactNode;\n ProductsContainer: INodeProps;\n ProductSectionContainer: INodeProps;\n refineMenu: IRefineMenuViewProps;\n sortByOptions: ISortByViewProps;\n choiceSummary?: React.ReactNode;\n modalToggle: React.ReactNode;\n searchResultModal: ISearchResultModalViewProps;\n isMobile: boolean;\n CategoryNavContainer: INodeProps;\n RefineAndProductSectionContainer: INodeProps;\n errorMessage: React.ReactNode;\n FeatureSearchContainer: INodeProps;\n similarLookProduct?: React.ReactNode;\n productPrices?: ProductPrice[];\n}\n\nexport interface ITitleViewProps {\n TitleContainer: INodeProps;\n title:ISearchResultTitle;\n}\n\nexport interface IRefineMenuViewProps {\n RefineMenuContainer: INodeProps;\n RefinerSectionContainer: INodeProps;\n refiners?: React.ReactNode[];\n}\n\nexport interface ICategoryHierarchyViewProps {\n categoryHierarchyList?: React.ReactNode[];\n categoryHierarchySeparator?: React.ReactNode;\n CategoryHierarchyContainer: INodeProps;\n}\n\nexport interface ISortByViewProps {\n SortingContainer: INodeProps;\n sortByDropDown?:React.ReactNode;\n}\n\nexport type GridSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl';\n\n/**\n * Title component for search result container\n */\nexport interface ISearchResultTitle {\n titlePrefix?: React.ReactNode;\n titleText?: React.ReactNode;\n titleCount?: React.ReactNode;\n}\n\nexport interface ISearchResultContainerState {\n sortingState: ISortByCollectionState;\n modalIsOpen: boolean;\n}\n\ninterface ISortByCollectionState {\n selectedSortByOption: ILabeledDropdownOption;\n pending: boolean;\n}\n\n/**\n *\n * SearchResultContainer component\n * @extends {React.PureComponent>}\n */\n@observer\nexport default class SearchResultContainer extends React.PureComponent, ISearchResultContainerState> {\n\n @computed get isMobile(): boolean {\n return (this._viewport === 'xs' || this._viewport === 'sm');\n }\n\n private sortByDropdownOptions: ILabeledDropdownOption[] = [\n { key: sortOptions.sortByOptionRelevanceDesc, value: this.props.resources.sortByOptionRelevanceDesc },\n { key: sortOptions.sortByOptionNameAsc, value: this.props.resources.sortByOptionNameAsc },\n { key: sortOptions.sortByOptionNameDesc, value: this.props.resources.sortByOptionNameDesc },\n { key: sortOptions.sortByOptionPriceAsc, value: this.props.resources.sortByOptionPriceAsc },\n { key: sortOptions.sortByOptionPriceDesc, value: this.props.resources.sortByOptionPriceDesc },\n { key: sortOptions.sortByOptionRatingDesc, value: this.props.resources.sortByOptionRatingDesc },\n ];\n private _refineItemCommonProps: IRefineItemCommonProps;\n private _pageType: string | undefined = this.props.context.request.urlTokens.pageType;\n @observable\n private _viewport: GridSize;\n\n private _modalToggleRef: React.RefObject;\n private _sortAndFilterContainerRef: React.RefObject;\n private expandrefinerCount: number | undefined = 0;\n private telemetryContent: ITelemetryContent;\n private productPrices: ProductPrice[];\n\n public static getFriendlyName(locale: string, nameTranslations?: TextValueTranslation[]): string | undefined {\n let nameTranslation: TextValueTranslation | undefined;\n if (locale && nameTranslations && nameTranslations.length > 0) {\n nameTranslation = nameTranslations.find(item => item.Language!.toLowerCase() === locale.toLowerCase());\n }\n\n return nameTranslation && nameTranslation.Text;\n }\n\n constructor(props: ISearchResultContainerProps, state: ISearchResultContainerState) {\n super(props);\n this._viewport = props.context.request && props.context.request.device && props.context.request.device.Type === 'Mobile' ? 'xs' : 'lg';\n this._modalToggleRef = React.createRef();\n this._sortAndFilterContainerRef = React.createRef();\n this._toggleModal = this._toggleModal.bind(this);\n this._updateViewport = this._updateViewport.bind(this);\n this.productPrices=[];\n this.state = {\n sortingState: {\n pending: false,\n selectedSortByOption: this.sortByDropdownOptions[0]\n },\n modalIsOpen: false\n };\n const {\n placeholderTextMax,\n minLabel,\n maxLabel,\n rangeNameFormat\n } = this.props.resources;\n\n const locale = this.props.context.request.locale;\n const telemetry = this.props.telemetry;\n const validationErrorNaN = this.props.resources.validationErrorNotNumber;\n const validationErrorRange = this.props.resources.validationErrorNotRange;\n this._refineItemCommonProps = {\n telemetry,\n locale,\n placeholderTextMax,\n minLabel,\n maxLabel,\n rangeNameFormat,\n validationErrorNaN,\n validationErrorRange\n };\n this.telemetryContent = getTelemetryObject(this.props.context.request.telemetryPageName!,\n this.props.friendlyName,\n this.props.telemetry);\n\n // Initalization of list page\n this.props.data.products.then((products) => {\n this.props.data.listPageState.then((listPageState) => {\n if (this._pageType === 'Category') {\n listPageState.pageType = 'Category';\n } else {\n listPageState.pageType = 'Search';\n }\n\n let querySorting: SortColumn[] = [];\n\n if (this.props.context.request.query && this.props.context.request.query.sorting) {\n querySorting = JSON.parse(decodeURIComponent(this.props.context.request.query.sorting)) as SortColumn[];\n }\n\n listPageState.currentPageNumber = this.props.context.request.query && (+this.props.context.request.query.skip / (this.props.config.itemsPerPage || 10)) || 0;\n listPageState.sortingCritera = { Columns: querySorting };\n listPageState.pageSize = this.props.config.itemsPerPage || 10;\n listPageState.activeProducts = products.products;\n listPageState.totalProductCount = products.count;\n // Initialize reaction based on listPageState properties\n reaction(\n () => {\n return [listPageState.activeFilters && listPageState.activeFilters.length, listPageState.currentPageNumber, listPageState.sortingCritera && listPageState.sortingCritera.Columns && listPageState.sortingCritera.Columns.length];\n },\n () => {\n const input = new GetFullProductsByCollectionInput(\n listPageState.pageType,\n this.props.context.request.apiSettings,\n { Paging: { Top: this.props.config.itemsPerPage, Skip: Math.max((listPageState.pageSize * (listPageState.currentPageNumber || 0)), 0) }, count: true, Sorting: listPageState.sortingCritera || {} },\n listPageState.activeFilters || [],\n +(this.props.context.request.urlTokens.itemId || 0),\n this.props.context.request.query && this.props.context.request.query.q ? this.props.context.request.query.q : this.props.context.request.query?.productId,\n this.props && this.props.config && this.props.config.includeAttributes !== undefined && this.props.config.includeAttributes === true ? true : false,\n this.props.context.request.locale\n );\n getCollectionProducts(input, this.props.context.actionContext).then(productResults => {\n listPageState.activeProducts = productResults.products;\n listPageState.totalProductCount = productResults.count;\n if (this.props.config.enableAffiliationBasedPricing && this.props.context.actionContext.requestContext?.user?.isAuthenticated) {\n // tslint:disable-next-line:no-floating-promises\n this._getActivePrice();\n }\n });\n }\n );\n\n });\n });\n\n if (this.props.context.request.query?.productId) {\n this.props.data.featureProduct.then((products) => {\n this.props.data.listPageState.then((listPageStateFeature) => {\n listPageStateFeature.featureProduct = products;\n\n });\n });\n }\n this._updateViewport();\n }\n\n public componentDidMount(): void {\n if (MsDyn365.isBrowser && window.addEventListener) {\n window.addEventListener('resize', this._updateViewport);\n this._updateViewport();\n }\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 componentWillUnmount(): void {\n if (MsDyn365.isBrowser && window.removeEventListener) {\n window.removeEventListener('resize', this._updateViewport);\n }\n }\n\n public render(): JSX.Element {\n const { imageSettings, className, allowBackNavigation } = this.props.config;\n const { resources } = this.props;\n const products = (this.props.data.listPageState.result && this.props.data.listPageState.result.activeProducts) || [];\n const searchProduct = (this.props.data.listPageState.result && this.props.data.listPageState.result.featureProduct) || null;\n let errorText = '';\n const breaCrumbType = this.props.context.app.config.breadcrumbType;\n const allowBack = allowBackNavigation && (breaCrumbType === 'back' || breaCrumbType === 'categoryAndBack');\n if(!products || products.length === 0) {\n errorText = this._pageType === 'Category'? resources.resultCategoryNotFoundText : resources.resultSearchNotFoundText;\n\n }\n const productsComponent = (\n \n );\n\n const featureComponent = (\n \n );\n\n const searchResultContainerViewProps = {\n ...this.props,\n products: productsComponent,\n TitleViewProps: this._getCollectionTitle(),\n categoryHierarchy: !this.props.config.disableHierarchy && this._getCategoryHierarchy(),\n refineMenu: this._getRefineMenu(),\n className: classnames('ms-search-result-container', className),\n SearchResultContainer: {\n moduleProps: this.props,\n className: classnames('ms-search-result-container', className)\n },\n sortByOptions: this.props.data.listPageState.result && this.props.data.listPageState.result.totalProductCount !== 0 ? this._getSortingDropDown(): null,\n pagination: this._getPagination(),\n ProductsContainer: { className: 'ms-search-result-container__Products' },\n ProductSectionContainer: {className: 'ms-search-result-container__product-section'},\n CategoryNavContainer: {className: 'ms-search-result-container__category-nav-section'},\n RefineAndProductSectionContainer: {className: 'ms-search-result-container__refine-product-section'},\n choiceSummary: this._getChoiceSummary(),\n modalToggle: this.props.data.listPageState.result && this.props.data.listPageState.result.totalProductCount !== 0 ?\n (\n \n ) : null,\n searchResultModal: this._getSearchResultModal(),\n isMobile: this.isMobile,\n errorMessage: errorText && (\n \n ),\n FeatureSearchContainer: { className: 'ms-feature-search-result' },\n similarLookProduct: this.props.data.listPageState.result && (this.props.data.listPageState.result.featureProduct !== null && this.props.data.listPageState.result.featureProduct !== undefined) ? featureComponent : null,\n productPrices: this.productPrices\n };\n return this.props.renderView(searchResultContainerViewProps) as React.ReactElement;\n }\n\n private _getActivePrice = async (): Promise => {\n let products = (this.props.data.listPageState.result && this.props.data.listPageState.result.activeProducts) || [];\n const productRecIds = ArrayExtensions.hasElements(products) ? 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.props.data.listPageState.then((listPageState) => {\n listPageState.activeProducts = products;\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 search result container ]Error executing action`);\n throw new Error('[get Affiliation based price on search result container]Error executing action');\n });\n }\n private _getSearchResultModal = (): ISearchResultModalViewProps => {\n const {resources} = this.props;\n return SearchResultModal(\n {\n resources:{\n modalCloseButtonText: resources.modalCloseButtonText,\n modalTitle: resources.modalTitle\n },\n isOpen:this.state.modalIsOpen,\n returnRef: this._modalToggleRef,\n onModalToggle: this._toggleModal\n });\n }\n\n private _getCollectionTitle = (): ITitleViewProps => {\n const { data, context, resources } = this.props;\n\n let collectionTitle: string | undefined = '';\n if (context && context.request && context.request.query && context.request.query.q) {\n collectionTitle = `\"${context.request.query.q}\"`;\n } else {\n collectionTitle = (data.category.result && SearchResultContainer.getFriendlyName(context.request.locale, data.category.result.NameTranslations)) ||\n (data.category.result && data.category.result.Name);\n }\n let productCountText = '';\n let productCountNumber: number | undefined;\n if (data.listPageState && data.listPageState.result && data.listPageState.result.totalProductCount !== undefined) {\n productCountNumber = data.listPageState.result.totalProductCount;\n } else if (data.products && data.products.result) {\n productCountNumber = data.products.result.count;\n }\n\n if (productCountNumber && productCountNumber !== 0) {\n productCountText = productCountNumber !== 1 ? format(this.props.resources.numberOfProducts, productCountNumber) : this.props.resources.oneProduct;\n } else {\n productCountText = format(this.props.resources.numberOfProducts, 0);\n }\n const titlePrefix = ;\n const titleText = collectionTitle && <Title className='ms-search-result__collection-title-text' text={collectionTitle} />;\n const titleCount = <Title className='ms-search-result__collection-title-count' text={productCountText} />;\n\n return {\n TitleContainer: { className: 'ms-search-result-container__title' },\n title:{\n titlePrefix: titlePrefix,\n titleText: titleText,\n titleCount: titleCount\n }\n };\n\n }\n private _getCategoryHierarchy = (): ICategoryHierarchyViewProps => {\n const { data } = this.props;\n const categoryHierarchy = data.categoryHierarchy.result;\n const categoryLinks =\n categoryHierarchy && categoryHierarchy.map((value: CategoryHierarchyData, index: number) => {\n\n return (\n <Link\n key={index}\n text={value.Name}\n ariaLabel={`${this.props.resources.categoryLinkAriaLabel} ${value.Name}`}\n href={value.Url}\n />\n );\n });\n const categoryLinkSeparator = <Separator separator='/' />;\n\n return {\n CategoryHierarchyContainer: { tag: 'nav', className: 'ms-search-result-container__category-hierarchy' },\n categoryHierarchyList: categoryLinks,\n categoryHierarchySeparator: categoryLinkSeparator\n };\n\n }\n\n private _getSortingDropDown = (): ISortByViewProps => {\n const { resources } = this.props;\n const activeDropdown = this._getCurrentlySelectedOption() || this.state.sortingState.selectedSortByOption;\n const dropdown = (\n <LabeledDropdown\n labelClassname='reviews-list-sort-by'\n labelText={resources.sortByDropdownLabel}\n dropdownId='categorySortByDropdown'\n dropdownClassname='reviews-list-dropdown'\n toggleColor='link'\n dropdownOptions={this.sortByDropdownOptions}\n selectedOption={activeDropdown}\n onSelectOption={this._updateSortByDropdown}\n ref={this._sortAndFilterContainerRef}\n />);\n return {\n SortingContainer: { className: 'ms-search-result-container__Sort-by-category' },\n sortByDropDown:dropdown\n };\n }\n\n private _getPagination = (): React.ReactNode => {\n const { config, context, data, resources } = this.props;\n const listPageState = data && data.listPageState && data.listPageState.result;\n const fullUrl = getCurrentUrl(context.request);\n const itemsPerPage = config.itemsPerPage || 10;\n const skipCount = listPageState && listPageState.currentPageNumber !== null ?\n (listPageState.currentPageNumber * (this.props.config.itemsPerPage || 10)) :\n ((this.props.context.request.query && +this.props.context.request.query.skip) || 0);\n const totalItems = listPageState && listPageState.totalProductCount || 0;\n const previousText = resources.flipperPrevious;\n const nextText = resources.flipperNext;\n if (totalItems <= itemsPerPage) {\n return null;\n }\n return (\n <UncontrolledPagination\n className='ms-search-result-container__pagination'\n role='navigation'\n aria-label={resources.paginationAriaLabel}\n url={fullUrl.href}\n qsp={'skip'}\n items={totalItems}\n itemsPerPage={itemsPerPage}\n startingItem={skipCount}\n previousText={<div className='msc-pagination__prev'><span className='ms-search-result__pagination-left' aria-hidden='true'/><span className='prev-text'>{previousText}</span></div>}\n nextText={<div className='msc-pagination__next'><span className='next-text'>{nextText}</span><span className='ms-search-result__pagination-right' aria-hidden='true'/></div>}\n previousAriaLabel={previousText}\n nextAriaLabel={nextText}\n telemetryContent={this.telemetryContent}\n />);\n }\n\n private _getRefineMenu = (): IRefineMenuViewProps => {\n const { data, context, config } = this.props;\n const tempRangeTypeTODO = context.request.query && context.request.query.inputRange ? 'input' : 'slider';\n const validRefiners = data.refiners.result && data.refiners.result.filter(refiner => {\n return refiner.Values.length > 0;\n });\n\n const activeRefiners = (data.listPageState.result && data.listPageState.result.activeFilters) || [];\n\n this._getexpandRefinerCount(validRefiners && validRefiners.length, config.expandRefinersCount);\n const expandedRefiners = this.expandrefinerCount;\n const subMenus = validRefiners && validRefiners.map((productRefinerHierarchy: IProductRefinerHierarchy, index: number) => {\n return (\n <RefineSubmenu\n productRefinerHierarchy={productRefinerHierarchy}\n selectedRefinerValues={activeRefiners}\n refineItemCommonProps={this._refineItemCommonProps}\n minValueSliderThumbAriaLabel={this.props.resources.minValueSliderThumbAriaLabel}\n maxValueSliderThumbAriaLabel={this.props.resources.maxValueSliderThumbAriaLabel}\n key={index}\n onUpdateRefiners={this._onUpdateRefiners}\n urlBuilder={this._buildRefinerUrl}\n isDisabled={false}\n isExpandedOnInitialLoad={expandedRefiners && expandedRefiners > index ? true : false}\n tempRangeTypeTODO={tempRangeTypeTODO}\n context = {context}\n moduleId={this.props.id}\n moduleTypeName={this.props.typeName}\n telemetryContent={this.telemetryContent}\n />\n );\n });\n\n return {\n RefineMenuContainer:{className: 'ms-search-result-container__refine-menu' },\n RefinerSectionContainer:{className: 'ms-search-result-container__refiner-section'},\n refiners: subMenus\n };\n\n }\n\n private _getChoiceSummary = (): React.ReactNode => {\n const { resources, data, telemetry } = this.props;\n const selectedRefiners = (data.listPageState.result && data.listPageState.result.activeFilters) || [];\n return (\n <ChoiceSummary\n classNames='ms-choice-summary-by-category'\n clearAllText={resources.clearAllText}\n label={resources.choiceSummaryLabel}\n selectedChoices={selectedRefiners}\n // @ts-ignore: NOTE Type-unsafe line below, null refinersByCategoryHierarchy case not handled\n refinerHierarchy={data.refiners.result}\n choiceFormat={resources.choiceFormat}\n choiceRangeValueFormat={resources.choiceRangeValueFormat}\n telemetry={telemetry}\n onChoiceClicked={this._onChoiceClicked}\n urlBuilder={this._buildRefinerUrlForChoiceSummary}\n choiceAriaLabel={resources.choiceAriaLabel}\n telemetryContent={this.telemetryContent}\n />\n );\n\n }\n\n private _updateSortByDropdown = (notification: ILabeledDropdownOnChangeNotification): void => {\n const { context } = this.props;\n const requestContext = context && context.request;\n const actionContext = context && context.actionContext;\n\n if (!requestContext || !actionContext || !this.props.data.listPageState.result) {\n const error = `[sort-by-category] cannot sort without context: ${!requestContext ? 'requestContext ' : ''} ${!actionContext ? 'actionContext ' : ''} could not be found`;\n this.props.telemetry.warning(error);\n }\n\n window.history.pushState({}, '', buildListPageUrl(getCurrentUrl(this.props.context.request), undefined, [this._getSortColumnFromSelectedOption(notification.selectedOption)], undefined));\n transaction(() => {\n this.props.data.listPageState.result!.currentPageNumber = 0;\n this.props.data.listPageState.result!.sortingCritera = { Columns: [this._getSortColumnFromSelectedOption(notification.selectedOption)] };\n });\n }\n\n private _getSortColumnFromSelectedOption = (option: ILabeledDropdownOption): SortColumn => {\n const { data } = this.props;\n\n if (!data.searchConfiguration.result) {\n return {};\n }\n\n const mappedConfiguration = data.searchConfiguration.result.find((searchConfiguration) => { return searchConfiguration.key === option.key; });\n\n if (mappedConfiguration) {\n return mappedConfiguration.sortColumn;\n }\n\n return {};\n }\n\n private _getCurrentlySelectedOption = (): ILabeledDropdownOption | undefined => {\n const { data } = this.props;\n const sortCriteria = data.listPageState.result && data.listPageState.result.sortingCritera;\n\n const activeSortColumn =\n (sortCriteria && sortCriteria.Columns && sortCriteria.Columns[0]) ||\n (parseQueryParam<SortColumn[]>('sorting', this.props.context.request) || [])[0];\n\n if (activeSortColumn && data.searchConfiguration.result) {\n const activeMappedConfig = data.searchConfiguration.result.find((mappedSearchConfig) => {\n return (mappedSearchConfig.sortColumn.ColumnName === activeSortColumn.ColumnName) &&\n (mappedSearchConfig.sortColumn.IsDescending === activeSortColumn.IsDescending);\n });\n if (activeMappedConfig) {\n return this.sortByDropdownOptions.find((dropdownOption) => dropdownOption.key === activeMappedConfig.key);\n }\n }\n\n return;\n }\n\n private _onUpdateRefiners = (itemToggleNotification: IRefineItemToggleNotification): void => {\n const { context } = this.props;\n const requestContext = context && context.request;\n const actionContext = context && context.actionContext;\n\n if (!requestContext || !actionContext || !this.props.data.listPageState.result) {\n const error = `Refine menu cannot refine search criteria: ${!requestContext ? 'requestContext ' : ''} ${!actionContext ? 'actionContext ' : ''} could not be found`;\n this.props.telemetry.warning(error);\n }\n\n const updatedRefinementCriteria = getUpdatedRefinementCriteria(itemToggleNotification, this.props.data.listPageState.result && this.props.data.listPageState.result.activeFilters || []);\n\n window.history.pushState({}, '', buildListPageUrl(getCurrentUrl(this.props.context.request), updatedRefinementCriteria));\n transaction(() => {\n this.props.data.listPageState.result!.currentPageNumber = 0;\n this.props.data.listPageState.result!.activeFilters = updatedRefinementCriteria;\n });\n }\n\n private _buildRefinerUrl = (itemToggleNotification: IRefineItemToggleNotification): string => {\n if (this.props.data.listPageState.result) {\n const newRefinementCriteria = getUpdatedRefinementCriteria(itemToggleNotification, this.props.data.listPageState.result.activeFilters || []);\n\n return buildListPageUrl(getCurrentUrl(this.props.context.request), newRefinementCriteria);\n } else {\n this.props.telemetry.warning(`[buildRefinerQueryString]List Page State Not available, unable to build refiner URL`);\n return '';\n }\n }\n\n private _onChoiceClicked = (notification: IChoiceSummaryClickNotification): void => {\n const { data, telemetry } = this.props;\n\n if (!data.listPageState.result) {\n telemetry.warning('[choice-summary-by-category._onChoiceClicked]ListPageState unavailable, unable to update refiners.');\n return;\n }\n\n let currentRefinementCriteria = (data.listPageState.result && data.listPageState.result.activeFilters) || [];\n\n if (!notification.clearAll) {\n const selectedChoice = notification.choiceClicked;\n if (!selectedChoice) {\n telemetry.warning('[choice-summary-by-category._onChoiceClicked] Choice could not be determined');\n return;\n }\n currentRefinementCriteria = currentRefinementCriteria.filter(\n (selectedCriterion: ProductRefinerValue) => !isMatchingRefinementCriterion(selectedChoice, selectedCriterion)\n );\n } else {\n currentRefinementCriteria = [];\n\n // set focus to sort and filter\n const dropdownElementId = this._sortAndFilterContainerRef.current && this._sortAndFilterContainerRef.current.props.dropdownId;\n const dropdownElement = dropdownElementId && document.getElementById(dropdownElementId);\n setTimeout(() => {\n dropdownElement && dropdownElement.focus();\n },\n 50);\n }\n\n const fullUrl = getCurrentUrl(this.props.context.request);\n window.history.pushState({}, '', buildListPageUrl(fullUrl, currentRefinementCriteria));\n data.listPageState.result.currentPageNumber = 0;\n data.listPageState.result.activeFilters = currentRefinementCriteria;\n }\n\n private _buildRefinerUrlForChoiceSummary = (selectedRefiner: ProductRefinerValue, isClearAll: boolean): string => {\n const { data, telemetry } = this.props;\n const fullUrl = getCurrentUrl(this.props.context.request);\n\n if (!data.listPageState.result) {\n telemetry.warning('[choice-summary-by-category._buildRefinerUrl]ListPageState unavailable, unable to create refiner URL.');\n return fullUrl.href;\n }\n\n let currentRefinementCriteria = (data.listPageState.result && data.listPageState.result.activeFilters) || [];\n\n if (!isClearAll) {\n if (!selectedRefiner) {\n telemetry.warning('[choice-summary-by-category._buildRefinerUrl] URL for Choice could not be determined');\n return fullUrl.href;\n }\n currentRefinementCriteria = currentRefinementCriteria.filter(\n (selectedCriterion: ProductRefinerValue) => !isMatchingRefinementCriterion(selectedRefiner, selectedCriterion)\n );\n } else {\n currentRefinementCriteria = [];\n }\n\n return buildListPageUrl(fullUrl, currentRefinementCriteria);\n }\n\n private _getViewport(): GridSize {\n const { context } = this.props;\n\n // always render in mobile viewport on a mobile device\n if (context.request && context.request.device && context.request.device.Type === 'Mobile') {\n return 'xs';\n }\n\n if (MsDyn365.isBrowser && window.innerWidth) {\n const gridSettings = context.request.gridSettings;\n if (gridSettings) {\n if (gridSettings.xs && window.innerWidth <= gridSettings.xs.w) {\n return 'xs';\n } else if (gridSettings.sm && window.innerWidth <= gridSettings.sm.w) {\n return 'sm';\n } else if (gridSettings.md && window.innerWidth <= gridSettings.md.w) {\n return 'md';\n } else if (gridSettings.lg && window.innerWidth <= gridSettings.lg.w) {\n return 'lg';\n } else {\n return 'xl';\n }\n }\n }\n\n return 'lg';\n }\n\n private _toggleModal(): void {\n this.setState({\n modalIsOpen: !this.state.modalIsOpen\n });\n }\n\n private _updateViewport(): void {\n this._viewport = this._getViewport();\n\n if (this.state.modalIsOpen && !this.isMobile) {\n this._toggleModal();\n }\n }\n\n private _getexpandRefinerCount = (validRefiners?: number, refinerCount?: expandRefinersCount): void => {\n switch(refinerCount) {\n case expandRefinersCount.all:\n this.expandrefinerCount = validRefiners;\n break;\n case expandRefinersCount.one:\n this.expandrefinerCount = 1;\n break;\n case expandRefinersCount.two:\n this.expandrefinerCount = 2;\n break;\n case expandRefinersCount.three:\n this.expandrefinerCount = 3;\n break;\n case expandRefinersCount.four:\n this.expandrefinerCount = 4;\n break;\n default:\n this.expandrefinerCount = 0;\n }\n }\n\n}\n","import { getMediaLocationsForSelectedVariant, MediaLocationsForSelectedVariantInput } from '@msdyn365-commerce-modules/retail-actions';\nimport { IActionContext, IImageData, IImageSettings } from '@msdyn365-commerce/core';\nimport { MediaLocation } from '@msdyn365-commerce/retail-proxy';\n\nexport async function getValidProductImages(productId: number, channelId: number, actionContext: IActionContext, imageSettings: IImageSettings): Promise<IImageData[]> {\n const actionInput = new MediaLocationsForSelectedVariantInput(\n productId,\n channelId,\n );\n\n return getMediaLocationsForSelectedVariant(actionInput, actionContext)\n .then(mediaLocations => {\n if (mediaLocations) {\n return Promise.all(mediaLocations.map((mediaLocation) => validateMediaLocaionAsync(mediaLocation, imageSettings)))\n .then(pairs => {\n return pairs.filter(pair => pair[1]).map(pair => pair[0]);\n });\n }\n\n return [];\n }).catch(error => {\n actionContext.telemetry.exception(error);\n actionContext.telemetry.debug('Unable to get Media Locations for Selected Variant');\n return [];\n });\n}\n\nexport async function validateProductImages(mediaLocations: MediaLocation[], actionContext: IActionContext, imageSettings: IImageSettings): Promise<IImageData[]> {\n return Promise.all(mediaLocations.map((mediaLocation) => validateMediaLocaionAsync(mediaLocation, imageSettings)))\n .then(pairs => {\n return pairs.filter(pair => pair[1]).map(pair => pair[0]);\n }).catch(error => {\n actionContext.telemetry.exception(error);\n actionContext.telemetry.debug('Unable to validate prodcut images');\n return [];\n });\n}\n\nasync function validateMediaLocaionAsync(mediaLocation: MediaLocation, imageSettings: IImageSettings): Promise<[IImageData, boolean]> {\n const imageData = {\n src: mediaLocation.Uri || '',\n altText: mediaLocation.AltText || ''\n };\n\n const imageSettingsVal = ((imageSettings.viewports?.lg!.q!).replace(/['\"]+/g, ''));\n\n if (imageData.src === '') {\n return [imageData, false];\n }\n\n const imageConcatVal = `${imageData.src}` + `&` + `${imageSettingsVal}`;\n\n return new Promise<[IImageData, boolean]>((resolve) => {\n try {\n const http = new XMLHttpRequest();\n http.open('HEAD', imageConcatVal, true);\n\n http.onload = () => {\n resolve([imageData, http.status === 200 || http.status === 201]);\n };\n\n http.onerror = () => {\n resolve([imageData, false]);\n };\n\n http.send();\n } catch (e) {\n resolve([imageData, 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 *--------------------------------------------------------------------------------------------*/\nimport classnames from 'classnames';\nimport { reaction } from 'mobx';\nimport * as React from 'react';\n\nimport { Carousel, ICarouselProps } from '@msdyn365-commerce/components';\n\nimport {\n IComponentNodeProps,\n ImagefullView,\n IModalViewProps,\n IModuleProps,\n inlineZoomImageOnHover,\n inlineZoomImageOnMouseMove,\n inlineZoomImageOnMouseOut,\n inlineZoomInit,\n INodeProps,\n ISingleSlideCarouselProps,\n KeyCodes,\n NodeTag,\n onContainerZoomInit,\n onMouseMoveLensContainer,\n onMouseOutLensContainer,\n onMouseOverImageContainer,\n removeInlineZoomStyle,\n SingleSlideCarousel\n} from '@msdyn365-commerce-modules/utilities';\nimport { IImageData, IImageSettings, Image } from '@msdyn365-commerce/core';\nimport { SimpleProduct } from '@msdyn365-commerce/retail-proxy';\nimport { imageSource, imageZoom, IMediaGalleryData, IMediaGalleryProps, thumbnailsOrientation } from '../..';\nimport { getValidProductImages, validateProductImages } from './utils';\n\nexport interface IMediaGalleryState {\n animating: boolean;\n activeIndex: number;\n mediaGalleryItems: IImageData[] | undefined;\n isImageZoomed: boolean;\n modalIsOpen: boolean;\n lastUpdate?: number;\n}\n\nexport interface IMediaGalleryThumbnailsViewProps {\n ThumbnailsContainerProps: INodeProps;\n SingleSlideCarouselComponentProps: INodeProps;\n items?: IMediaGalleryThumbnailItemViewProps[];\n}\n\nexport interface IMediaGalleryThumbnailItemViewProps {\n ThumbnailItemContainerProps: INodeProps;\n Picture: React.ReactElement;\n}\n\nexport interface IMediaGalleryViewProps extends IMediaGalleryProps<IMediaGalleryData> {\n state: IMediaGalleryState;\n MediaGallery: IModuleProps;\n CarouselProps: INodeProps;\n Thumbnails: IMediaGalleryThumbnailsViewProps;\n Modal?:React.ReactElement|null;\n}\n\n/**\n * Media gallery component\n */\nclass MediaGallery extends React.Component<IMediaGalleryProps<IMediaGalleryData>, IMediaGalleryState> {\n private _inlineZoomDivRef: Map<number, HTMLDivElement> = new Map();\n private readonly defaultGalleryImageSettings: IImageSettings = {\n viewports: {\n xs: { q: 'w=767&h=767&m=8', w: 0, h: 0 },\n sm: { q: 'w=600&h=600&m=8', w: 0, h: 0 },\n md: { q: 'w=600&h=772&m=8', w: 0, h: 0 },\n lg: { q: 'h=772&m=8', w: 0, h: 0 }\n },\n lazyload: true,\n cropFocalRegion: true\n };\n\n private readonly defaultThumbnailImageSettings: IImageSettings = {\n viewports: {\n xs: { q: 'w=100&m=8', w: 100, h: 0 },\n lg: { q: 'w=100&m=8', w: 100, h: 0 }\n },\n lazyload: true,\n cropFocalRegion: true\n };\n\n constructor(props: IMediaGalleryProps<IMediaGalleryData>) {\n super(props);\n this._toggleModal = this._toggleModal.bind(this);\n this.state = { activeIndex: 0, animating: false, mediaGalleryItems: undefined, isImageZoomed: false, modalIsOpen:false };\n\n this._onImageMouseOut = this._onImageMouseOut.bind(this);\n this._inlineZoomImageOnHover = this._inlineZoomImageOnHover.bind(this);\n this._onInlineImageClick = this._onInlineImageClick.bind(this);\n this._onContainerZoomImageClick = this._onContainerZoomImageClick.bind(this);\n this._onMouseOutLensContainer = this._onMouseOutLensContainer.bind(this);\n }\n\n public async componentDidMount(): Promise<void> {\n const source = this.props.config.imageSource || imageSource.pageContext;\n const curatedImage = this.props.config.images || [];\n\n if (source === imageSource.pageContext) {\n reaction(\n () => (this.props.data.product.result ? this.props.data.product.result.RecordId : null),\n async () => {\n if (this.props.data.product.result) {\n const images = await getValidProductImages(\n this.props.data.product.result.RecordId,\n +this.props.context.request.apiSettings.channelId,\n this.props.context.actionContext,\n this.props.config.thumbnailImageSettings || this.defaultThumbnailImageSettings\n );\n this.setState({\n mediaGalleryItems: [...images, ...curatedImage],\n activeIndex: 0,\n lastUpdate: Date.now()\n });\n } else {\n this.setState({\n mediaGalleryItems: [...curatedImage],\n activeIndex: 0,\n lastUpdate: Date.now()\n });\n }\n }\n );\n }\n\n if (source === imageSource.productId && this.props.data.mediaLocations.result) {\n const images = await validateProductImages(\n this.props.data.mediaLocations.result,\n this.props.context.actionContext,\n this.props.config.thumbnailImageSettings || this.defaultThumbnailImageSettings\n );\n this.setState({\n mediaGalleryItems: [...images, ...curatedImage],\n activeIndex: 0,\n lastUpdate: Date.now()\n });\n } else if (source === imageSource.pageContext && this.props.data.product.result) {\n const images = await getValidProductImages(\n this.props.data.product.result.RecordId,\n +this.props.context.request.apiSettings.channelId,\n this.props.context.actionContext,\n this.props.config.thumbnailImageSettings || this.defaultThumbnailImageSettings\n );\n\n this.setState({\n mediaGalleryItems: [...images, ...curatedImage],\n activeIndex: 0,\n lastUpdate: Date.now()\n });\n } else {\n this.setState({\n mediaGalleryItems: [...curatedImage],\n activeIndex: 0,\n lastUpdate: Date.now()\n });\n }\n }\n\n public render(): JSX.Element {\n const {\n id,\n config,\n resources\n } = this.props;\n\n const mediaGalleryItems = this.state.mediaGalleryItems;\n const { className, showPaginationTooltip } = config;\n const galleryImageSettings = config.galleryImageSettings;\n if(galleryImageSettings) {\n galleryImageSettings.cropFocalRegion = true;\n }\n const thumbnailImageSettings = config.thumbnailImageSettings;\n if(thumbnailImageSettings) {\n thumbnailImageSettings.cropFocalRegion = true;\n }\n\n const isVertical: boolean = config.thumbnailsOrientation === thumbnailsOrientation.vertical;\n const allowFullscreen:boolean = config.allowFullScreen || false;\n const zoomViewMode: string =\n config.imageZoom === imageZoom.inline\n ? imageZoom.inline\n : config.imageZoom === imageZoom.container\n ? imageZoom.container\n : '';\n const zoomView = allowFullscreen ? 'fullscreen': zoomViewMode;\n\n const viewProps: IMediaGalleryViewProps = {\n ...(this.props as IMediaGalleryProps<IMediaGalleryData>),\n state: this.state,\n MediaGallery: {\n moduleProps: this.props,\n className: classnames(`ms-media-gallery ${isVertical ? 'vertical' : ''}`, className)\n },\n Modal: allowFullscreen ? this.imageModalSlider(zoomViewMode): null,\n CarouselProps: {\n tag: Carousel,\n className: 'ms-media-gallery__carousel',\n items:\n mediaGalleryItems &&\n mediaGalleryItems.map((item: IImageData, index: number) => this._renderCarouselItemImageView(zoomView, item, galleryImageSettings || this.defaultGalleryImageSettings, index)),\n activeIndex: this.state.activeIndex,\n next: this.next,\n previous: this.previous,\n interval: false,\n directionTextPrev: resources.previousScreenshotFlipperText,\n directionTextNext: resources.nextScreenshotFlipperText,\n onIndicatorsClickHandler: this.goToIndex,\n showPaginationTooltip: showPaginationTooltip === true,\n handleOnExited: this.onExited,\n handleOnExiting: this.onExiting,\n key: this.state.lastUpdate\n } as IComponentNodeProps<ICarouselProps>,\n Thumbnails: {\n ThumbnailsContainerProps: { className: 'ms-media-gallery__thumbnails-container' },\n SingleSlideCarouselComponentProps: {\n tag: SingleSlideCarousel,\n className: 'ms-media-gallery__thumbnails',\n vertical: isVertical,\n flipperPrevLabel: resources.previousScreenshotFlipperText,\n flipperNextLabel: resources.nextScreenshotFlipperText,\n parentId: id,\n useTabList: true,\n key: this.state.lastUpdate\n } as IComponentNodeProps<ISingleSlideCarouselProps>,\n items:\n mediaGalleryItems &&\n mediaGalleryItems.map((item: IImageData, index: number) => this._getThumbnailItem(item, thumbnailImageSettings || this.defaultThumbnailImageSettings, index, this.state.activeIndex))\n }\n };\n\n return this.props.renderView(viewProps) as React.ReactElement;\n }\n\n private onExiting = () => {\n this.setState({ animating: true });\n };\n\n private onExited = () => {\n this.setState({ animating: false });\n };\n\n private next = (): void => {\n if (this.isLastItem() === undefined) {\n return;\n }\n\n const nextIndex = this.isLastItem() ? 0 : this.state.activeIndex + 1;\n this.goToIndex(nextIndex);\n };\n\n private previous = (): void => {\n const nextIndex = this.isFirstItem()\n ? this.state.mediaGalleryItems\n ? this.state.mediaGalleryItems.length - 1\n : 0\n : this.state.activeIndex - 1;\n this.goToIndex(nextIndex);\n };\n\n private goToIndex = (index: number): void => {\n this.setState({ activeIndex: index });\n };\n\n private _renderCarouselItemImageView(zoomView: string, image: IImageData, imageSettings: IImageSettings, index: number): React.ReactNode {\n if (zoomView === 'container') {\n return this._renderImageInContainerOnZoom(image, imageSettings, index);\n } else if (zoomView === 'inline') {\n return this._renderImageInlineOnZoom(image, imageSettings, index);\n } else if (zoomView === 'fullscreen') {\n return this._renderImageFullScreenOnZoom(image, imageSettings, index);\n } else {\n return <React.Fragment>{this._getCarouselItem(image, imageSettings, index)}</React.Fragment>;\n }\n }\n\n private _getCarouselItem = (image: IImageData, imageSettings: IImageSettings, index: number): React.ReactNode => (\n <Image\n className='ms-media-gallery__item'\n {...image}\n gridSettings={this.props.context.request.gridSettings!}\n imageSettings={imageSettings}\n loadFailureBehavior='default'\n role='tabpanel'\n id={`${this.props.id}__carousel-item__${index}`}\n />\n );\n\n private _getThumbnailItem = (image: IImageData, imageSettings: IImageSettings, index: number, modifiedActiveIndex: number): IMediaGalleryThumbnailItemViewProps => {\n const classes = classnames(\n 'ms-media-gallery__thumbnail-item',\n modifiedActiveIndex === index ? 'ms-media-gallery__thumbnail-item-active' : ''\n );\n\n return {\n ThumbnailItemContainerProps: {\n tag: 'li' as NodeTag,\n className: classes,\n role: 'tab',\n tabIndex: 0,\n key: index,\n 'aria-label': image.altText,\n 'aria-selected': modifiedActiveIndex === index,\n 'aria-controls': `${this.props.id}__carousel-item__${index}`,\n onClick: this._generateOnThumbnailClick(index),\n onKeyDown: this._generateOnThumbnailKeyDown(index)\n },\n Picture: (\n <Image\n className='ms-media-gallery__thumbnail'\n {...image}\n gridSettings={this.props.context.request.gridSettings!}\n imageSettings={imageSettings}\n loadFailureBehavior='default'\n />\n )\n };\n };\n\n private _generateOnThumbnailKeyDown = (index: number) => {\n return (event: React.KeyboardEvent) => {\n if (event.which === KeyCodes.Enter || event.which === KeyCodes.Space) {\n event.preventDefault();\n\n this.goToIndex(index);\n }\n };\n };\n\n private _generateOnThumbnailClick = (index: number) => {\n return (event: React.MouseEvent<HTMLLIElement>) => {\n event.preventDefault();\n\n this.goToIndex(index);\n };\n };\n\n private _renderImageInlineOnZoom(image: IImageData, imageSettings:IImageSettings, index: number): React.ReactNode {\n return (\n // tslint:disable-next-line: react-this-binding-issue\n <div className={`ms-inline-zoom ${this.state.isImageZoomed ? 'zoomed' : ''}`} ref={divRef => this._inlineZoomDivRef.set(index, divRef!)} data-scale={this.props.config.dataScale}>\n <Image\n className='ms-media-gallery__item'\n {...image}\n gridSettings={this.props.context.request.gridSettings!}\n imageSettings={imageSettings}\n loadFailureBehavior='default'\n role='tabpanel'\n onClick={this._onInlineImageClick}\n onMouseOver={this.state.isImageZoomed && this._inlineZoomImageOnHover || undefined}\n id={`${this.props.id}__carousel-item__${index}`}\n />\n <Image\n role='presentation'\n className='ms-inline-zoom__zoomedImg'\n {...image}\n onClick={this._onImageMouseOut}\n gridSettings={this.props.context.request.gridSettings!}\n imageSettings={imageSettings}\n loadFailureBehavior='default'\n id={`${this.props.id}__zoom__${index}`}\n onMouseMove={this.state.isImageZoomed && inlineZoomImageOnMouseMove || undefined}\n />\n </div>\n );\n }\n\n private _inlineZoomImageOnHover(event: React.MouseEvent<HTMLImageElement>): void {\n inlineZoomImageOnHover(event, this.props.config.dataScale);\n }\n\n private _onInlineImageClick(event: React.MouseEvent<HTMLImageElement>): void {\n if (window.innerWidth <= 768) { // $msv-breakpoint-m\n return;\n }\n\n inlineZoomInit(event, this.props.config.dataScale);\n this.setState({\n isImageZoomed: true\n });\n }\n\n private _onImageMouseOut(event: React.MouseEvent<HTMLImageElement, MouseEvent>): void {\n inlineZoomImageOnMouseOut(event);\n this.setState({\n isImageZoomed: false\n });\n\n }\n\n private _onContainerZoomImageClick(event: React.MouseEvent<HTMLImageElement>): void {\n if (window.innerWidth <= 768) { // $msv-breakpoint-m\n return;\n }\n\n onContainerZoomInit(event);\n\n this.setState({\n isImageZoomed: true\n });\n }\n\n private _onMouseOutLensContainer(event: React.MouseEvent<HTMLImageElement>): void {\n onMouseOutLensContainer(event);\n\n this.setState({\n isImageZoomed: false\n });\n }\n\n private _renderImageInContainerOnZoom(image: IImageData, imageSettings:IImageSettings, index: number): React.ReactNode {\n return (\n <div className='ms-containerZoom__container'>\n <div className='ms-containerZoom__zoom-lens' role='presentation' onMouseOut={this._onMouseOutLensContainer} onClick={this._onMouseOutLensContainer} onMouseMove={this.state.isImageZoomed && onMouseMoveLensContainer || undefined} />\n <Image\n className='ms-media-gallery__item'\n {...image}\n gridSettings={this.props.context.request.gridSettings!}\n onClick={this._onContainerZoomImageClick}\n imageSettings={imageSettings}\n loadFailureBehavior='default'\n onMouseOver={this.state.isImageZoomed && onMouseOverImageContainer || undefined}\n id={`${this.props.id}__carousel-item__${index}`}\n />\n </div>\n );\n }\n\n private _renderImageFullScreenOnZoom(image: IImageData, imageSettings:IImageSettings, index: number): React.ReactNode {\n return (\n <div className='ms-fullscreen-section'>\n <Image\n className='ms-media-gallery__item'\n {...image}\n gridSettings={this.props.context.request.gridSettings!}\n imageSettings={imageSettings}\n loadFailureBehavior='default'\n role='tabpanel'\n />\n <div className='ms-fullscreen-section__overlay'>\n <a href='javascript:void(0);' title={this.props.resources.fullScreenTitleText} role='button' onClick={this.openModalDialog} className='ms-fullscreen-section__magnifying-glass-icon'/>\n </div>\n </div>\n );\n }\n\n private _mapProductToImageData(product: SimpleProduct): IImageData {\n return {\n src: product.PrimaryImageUrl || ''\n };\n }\n\n private isFirstItem = () => this.state.activeIndex === 0;\n\n private isLastItem = () => this.state.mediaGalleryItems && this.state.activeIndex === this.state.mediaGalleryItems.length - 1;\n\n private openModalDialog = (): void => {\n this._toggleModal();\n }\n\n private _toggleModal(): void {\n if (this.state.modalIsOpen) {\n const parentDiv = this._inlineZoomDivRef.get(this.state.activeIndex);\n if (parentDiv && parentDiv.children && parentDiv.children.length >= 2) {\n const image = parentDiv.children[1].querySelector('img');\n if (image) {\n image.removeAttribute('style');\n }\n }\n this.setState({\n isImageZoomed: false\n });\n }\n this.setState({\n isImageZoomed: false,\n modalIsOpen: !this.state.modalIsOpen\n });\n removeInlineZoomStyle();\n }\n\n private imageModalSlider=(ZoomView:string):React.ReactElement => {\n const {\n data: {\n product: { result: product }\n },\n resources,\n config\n } = this.props;\n let mediaGalleryItems = this.state.mediaGalleryItems;\n\n if (!mediaGalleryItems && product) {\n mediaGalleryItems = [this._mapProductToImageData(product)];\n }\n\n const galleryImageSettings = config.galleryImageSettings;\n if(galleryImageSettings) {\n galleryImageSettings.cropFocalRegion = true;\n }\n\n const carouselprops = {\n tag: Carousel,\n className: 'ms-media-gallery__carousel',\n items:\n mediaGalleryItems &&\n mediaGalleryItems.map((item: IImageData, index: number) => this._renderCarouselItemImageView(ZoomView, item, galleryImageSettings || this.defaultGalleryImageSettings, index)),\n activeIndex: this.state.activeIndex,\n next: this.next,\n previous: this.previous,\n interval: false,\n directionTextPrev: resources.previousScreenshotFlipperText,\n directionTextNext: resources.nextScreenshotFlipperText,\n onIndicatorsClickHandler: this.goToIndex,\n showPaginationTooltip: true,\n hideIndicator: true,\n handleOnExited: this.onExited,\n handleOnExiting: this.onExiting,\n } as IComponentNodeProps<ICarouselProps>;\n\n const carousel = <Carousel {...carouselprops} />;\n\n const imageModalSliderProps:IModalViewProps = {\n modalIsOpen:this.state.modalIsOpen,\n ontoggle:this._toggleModal,\n galleryCarousel: carousel\n };\n return ImagefullView(imageModalSliderProps) as React.ReactElement;\n }\n}\n\nexport default MediaGallery;\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 { Carousel } from '@msdyn365-commerce/components';\nimport classnames from 'classnames';\nimport * as React from 'react';\nimport { ICarouselViewProps } from './carousel';\n\nconst CarouselView: React.FC<ICarouselViewProps> = props => (\n <Module {...props.carouselContainer} {...props.renderModuleAttributes(props)}>\n <Carousel\n className={classnames(props.closeAnimation)}\n activeIndex={props.activeIndex}\n next={props.next}\n previous={props.previous}\n pause={props.config.pauseOnHover ? 'hover' : false}\n ride={props.config.autoplay ? 'carousel' : undefined}\n autoplay={props.config.autoplay}\n interval={props.config.interval}\n transitionType={(props.config.transitionType) ? props.config.transitionType : undefined}\n items={props.slots && props.slots.content && props.slots.content.length ? props.slots.content : []}\n hideFlipper={props.config.hideFlipper}\n dismissEnabled={props.config.dismissEnabled}\n onIndicatorsClickHandler={props.onIndicatorsClickHandler}\n handleDismissCarousel={props.handleDismissCarousel}\n dismissCarouselAriaText={props.resources && props.resources.ariaLabelForDismissButton}\n indicatorAriaText={props.resources && props.resources.ariaLabelForSlide}\n directionTextPrev={props.resources && props.resources.flipperPrevious}\n directionTextNext={props.resources && props.resources.flipperNext}\n handleOnExited={props.handleOnExited}\n handleOnExiting={props.handleOnExiting}\n telemetryContent={props.telemetryContent}\n />\n </Module>\n);\n\nexport default CarouselView;\n","import { IMediaGalleryThumbnailItemViewProps, IMediaGalleryThumbnailsViewProps, IMediaGalleryViewProps } from '@msdyn365-commerce-modules/media-gallery';\r\nimport { Module, Node } from '@msdyn365-commerce-modules/utilities';\r\nimport * as React from 'react';\r\n\r\nconst _renderThumbnailItem = (thumbnail: IMediaGalleryThumbnailItemViewProps): JSX.Element => {\r\n const { ThumbnailItemContainerProps, Picture } = thumbnail;\r\n\r\n return (\r\n <Node {...ThumbnailItemContainerProps}>\r\n {Picture}\r\n </Node>\r\n );\r\n};\r\n\r\nconst _renderThumbnails = (thumbnails: IMediaGalleryThumbnailsViewProps): JSX.Element => {\r\n const { ThumbnailsContainerProps, SingleSlideCarouselComponentProps, items } = thumbnails;\r\n\r\n return (\r\n <Node {...ThumbnailsContainerProps}>\r\n <Node {...SingleSlideCarouselComponentProps}>\r\n {items && items.map(_renderThumbnailItem)}\r\n </Node>\r\n </Node>\r\n );\r\n};\r\n\r\nconst MediaGalleryView: React.FC<IMediaGalleryViewProps> = props => {\r\n const {CarouselProps, Thumbnails, MediaGallery} = props;\r\n\r\n return (\r\n <Module {...MediaGallery}>\r\n <Node {...CarouselProps} />\r\n {_renderThumbnails(Thumbnails)}\r\n {props.slots && props.slots.productLink && props.slots.productLink.length > 0 ? props.slots.productLink : ''}\r\n </Module>\r\n );\r\n};\r\nexport default MediaGalleryView;","/*---------------------------------------------------------------------------------------------\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 { getProductUrlSync, IProductInventoryInformation } from '@msdyn365-commerce-modules/retail-actions';\nimport { Button, getPayloadObject, getTelemetryAttributes, ITelemetryContent, TelemetryConstant } from '@msdyn365-commerce-modules/utilities';\nimport { CartLineItemComponent, ICartlineResourceString } from '@msdyn365-commerce/components';\nimport { ICoreContext, IGridSettings, IImageSettings, ITelemetry } from '@msdyn365-commerce/core';\nimport { ICartState } from '@msdyn365-commerce/global-state';\nimport { CartLine, ChannelDeliveryOptionConfiguration, OrgUnitLocation, ProductAvailableQuantity, ProductDeliveryOptions, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\nimport { ReleasedProductType } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\nimport * as React from 'react';\n\nexport interface IFlyoutCartLineItemsProps {\n cartlines: CartLine[];\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 outOfStockText: string;\n outOfRangeOneText: string;\n outOfRangeFormatText: string;\n maxCartlineQuantity: number;\n channelDeliveryOptionConfig?: ChannelDeliveryOptionConfiguration;\n\n outOfStockThreshold: number;\n isStockCheckEnabled: boolean;\n telemetryContent?: ITelemetryContent;\n removeItemClickHandler(cartlineToRemove: CartLine): void;\n}\n\nexport interface IFlyoutCartLineItemViewProps {\n cartline: React.ReactNode;\n remove: React.ReactNode;\n storeLocation: React.ReactNode;\n hasError: boolean;\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 = (outOfStockThreshold: number, maxCartlineQuantity: number, isStockCheckEnabled: boolean, productAvailability?: ProductAvailableQuantity) => {\n if(isStockCheckEnabled) {\n if(!productAvailability || !productAvailability.AvailableQuantity || productAvailability.AvailableQuantity <= 0 || productAvailability.AvailableQuantity <= outOfStockThreshold) {\n return 0;\n }\n return productAvailability.AvailableQuantity - outOfStockThreshold;\n }\n\n return maxCartlineQuantity;\n};\n\nconst _assembleNode = (\n cartline: CartLine,\n product: SimpleProduct,\n props:IFlyoutCartLineItemsProps,\n index:number,\n foundProductAvailability?:ProductAvailableQuantity,\n foundProductDeliveryOptions?:ProductDeliveryOptions,\n ):IFlyoutCartLineItemViewProps => {\n const {\n imageSettings,\n gridSettings,\n id,\n typeName,\n context,\n resources,\n removeButtonText,\n removeItemClickHandler } = props;\n\n const maxQuantity = _getCartItemMaxQuantity(props.outOfStockThreshold, props.maxCartlineQuantity, props.isStockCheckEnabled, foundProductAvailability);\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 onRemoveClickHandler = (event: React.MouseEvent<HTMLElement>) => { removeItemClickHandler(cartline); };\n const payLoad = getPayloadObject('click', props.telemetryContent!, TelemetryConstant.RemoveCartItem);\n const removeCartItemAttribute = getTelemetryAttributes(props.telemetryContent!, payLoad);\n\n return {\n data: {\n product: product,\n cartline: cartline\n },\n hasError: (!isServiceItem && props.isStockCheckEnabled) ? cartline.Quantity! > maxQuantity : false,\n cartline: (\n <CartLineItemComponent\n data={{\n cartLine: cartline,\n product: product\n }}\n currentQuantity = {cartline.Quantity!}\n maxQuantity = {maxQuantity}\n isOutOfStock = {(!isServiceItem && props.isStockCheckEnabled) ? (maxQuantity <= 0 ? true: false) : false}\n gridSettings={gridSettings}\n imageSettings={imageSettings}\n id={id}\n typeName={typeName}\n productUrl={getProductUrlSync(product, props.context.actionContext, undefined)}\n context={context}\n resources={resources}\n key={index}\n isQuantityEditable={false}\n primaryImageUrl={product.PrimaryImageUrl}\n displayMode='COMPACT'\n telemetryContent={props.telemetryContent!}\n channelDeliveryOptionConfig = {props.channelDeliveryOptionConfig}\n />),\n remove: (\n <Button\n className='msc-cart-line__remove-item'\n onClick={onRemoveClickHandler}\n title={removeButtonText}\n {...removeCartItemAttribute}\n >\n {removeButtonText}\n </Button>\n ),\n storeLocation: (\n _renderStoreLocation(cartline, props)\n )\n };\n};\n\nconst _renderStoreLocation = (cartLine: CartLine | null | undefined, props: IFlyoutCartLineItemsProps): JSX.Element | null => {\n if(cartLine && cartLine.FulfillmentStoreId) {\n const orgUnitName = _getOrgUnitName(cartLine.FulfillmentStoreId, props.orgUnitLocations);\n\n if(orgUnitName) {\n return (\n <div className={`msc-cart-line__bopis-method`}>\n <span className={`pick-up`}>{orgUnitName}</span>\n </div>\n );\n }\n }\n\n return null;\n};\n\nconst _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\nconst _assembleCartlines = (\n cartlines: CartLine[],\n products: SimpleProduct[] | undefined,\n props: IFlyoutCartLineItemsProps):IFlyoutCartLineItemViewProps[] | null => {\n const reactNodes:IFlyoutCartLineItemViewProps[] = [];\n\n if(!products || products.length === 0) {\n props.context.telemetry.error('Cartlines content is empty, module wont render');\n return null;\n }\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;\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 if(product) {\n reactNodes.push(_assembleNode(cartline, product, props, index, foundProductAvailability?.ProductAvailableQuantity, foundProductDeliveryOption));\n }\n });\n\n return reactNodes;\n};\n\n/**\n * CartLineItems component\n */\n\nexport const FlyoutCartLineItems = (props: IFlyoutCartLineItemsProps) => {\n const { products, cartlines } = props;\n return (\n _assembleCartlines(cartlines, products, props)\n );\n};","import { ActiveCartProductsInput, getActiveCartProductsAction, getAvailabilitiesForCartLineItems, getDeliveryOptionsForCartLineItems, IProductInventoryInformation, ProductAvailabilitiesForCartLineItems, ProductDeliveryOptionsForCartLineItems } from '@msdyn365-commerce-modules/retail-actions';\nimport { IActionContext } from '@msdyn365-commerce/core';\nimport { ICartState } from '@msdyn365-commerce/global-state';\nimport { ProductDeliveryOptions, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\n\n/**\n * IMiniCartData entity interface.\n */\nexport interface IMiniCartData {\n products?: SimpleProduct[];\n productAvailabilites?: IProductInventoryInformation[];\n deliveryOptions?: ProductDeliveryOptions[];\n}\n\nexport const createInput = () => {\n return new ActiveCartProductsInput();\n};\n\n/**\n * Calls the Retail API and returns a mini cart data\n */\nexport async function getMiniCartData(ctx: IActionContext, cartState: ICartState): Promise<IMiniCartData> {\n const miniCartData: IMiniCartData = {};\n\n const cart = cartState.cart;\n\n // If there are cart lines, make call to get products\n // If there are invocie linese, then there is no products, so don't make call to get products\n if (cart && cart.CartLines && cart.CartLines.length && !cartState.hasInvoiceLine) {\n await getActiveCartProductsAction(\n new ActiveCartProductsInput(),\n ctx\n )\n .then(products => {\n if (products) {\n miniCartData.products = products;\n }\n })\n .catch(error => {\n ctx.telemetry.exception(error);\n throw new Error('[getActiveCartWithProdcuts]Unable to hydrate cart with product information');\n });\n\n await getAvailabilitiesForCartLineItems(\n new ProductAvailabilitiesForCartLineItems(ctx.requestContext.apiSettings),\n ctx\n )\n .then(availableQuantity => {\n if (availableQuantity) {\n miniCartData.productAvailabilites = availableQuantity;\n }\n })\n .catch(error => {\n ctx.telemetry.exception(error);\n throw new Error('[getActiveCartWithProdcuts]Unable to hydrate cart with product information');\n });\n\n await getDeliveryOptionsForCartLineItems(\n new ProductDeliveryOptionsForCartLineItems(ctx.requestContext.apiSettings),\n ctx\n )\n .then(deliveryOptions => {\n if (deliveryOptions) {\n miniCartData.deliveryOptions = deliveryOptions;\n }\n })\n .catch(error => {\n ctx.telemetry.exception(error);\n throw new Error('[getActiveCartWithProdcuts]Unable to hydrate cart with product information');\n });\n }\n\n return miniCartData;\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, getPayloadObject, getTelemetryAttributes, getTelemetryObject, INodeProps, ITelemetryContent, TelemetryConstant, UncontrolledTooltip } from '@msdyn365-commerce-modules/utilities';\nimport { CartIconComponent } from '@msdyn365-commerce/components';\nimport { getUrlSync, IDictionary, IImageSettings, msdyn365Commerce, TelemetryEvent } from '@msdyn365-commerce/core';\nimport { CartLine, ChannelDeliveryOptionConfiguration ,OrgUnitLocation } from '@msdyn365-commerce/retail-proxy';\nimport classnames from 'classnames';\nimport { reaction } from 'mobx';\nimport { observer } from 'mobx-react';\nimport React from 'react';\nimport { ICartIconData } from './cart-icon.data';\nimport { ICartIconProps } from './cart-icon.props.autogenerated';\nimport { FlyoutCartLineItems, IFlyoutCartLineItemViewProps } from './components/flyout-cart-line-items';\nimport { getMiniCartData, IMiniCartData } from './utils/get-products-in-mini-cart';\n\nexport interface IMiniCartState {\n miniCartData: IMiniCartData;\n orgUnitLocations?: OrgUnitLocation[];\n}\n\nexport interface ICartIconViewProps extends ICartIconProps<ICartIconData> {\n className: string;\n cartIcon: React.ReactNode;\n\n FlyoutContainer?: INodeProps;\n\n CartlinesWrapper: INodeProps;\n miniCartWrapper: INodeProps;\n miniCartItemWrapper: INodeProps;\n cartlines?: IFlyoutCartLineItemViewProps[];\n flyoutTitle: React.ReactNode;\n totalPrice: React.ReactNode;\n\n checkoutAsGuestButton?: React.ReactNode;\n checkoutAsSignInUserButton?: React.ReactNode;\n goToCartButton?: React.ReactNode;\n waitingComponent?: React.ReactNode;\n\n isCartLoading: boolean;\n\n removeItemClickHandler(cartlineToRemove: CartLine): void;\n}\n\n/**\n *\n * Cart component\n * @extends {React.PureComponent<ICartProps<ICartData>>}\n */\n@observer\nclass CartIcon extends React.Component<ICartIconProps<ICartIconData>, IMiniCartState> {\n private telemetryContent: ITelemetryContent;\n private checkoutBySignInAttributes: IDictionary<string> | undefined;\n private checkoutByGuestAttributes: IDictionary<string> | undefined;\n private viewShoppingBagAttributes: IDictionary<string> | undefined;\n private retailMultiplePickUpOptionEnabled?: boolean = false;\n private channelDeliveryOptionConfig?: ChannelDeliveryOptionConfiguration;\n constructor(props: ICartIconProps<ICartIconData>) {\n super(props);\n this.state = { miniCartData: {} };\n this.telemetryContent = getTelemetryObject(this.props.context.request.telemetryPageName!, this.props.friendlyName, this.props.telemetry);\n const payload = getPayloadObject(TelemetryEvent.CheckOut, this.telemetryContent, TelemetryConstant.Checkout);\n this.checkoutBySignInAttributes = getTelemetryAttributes(this.telemetryContent, payload);\n\n payload.contentAction.etext = TelemetryConstant.GuestCheckout;\n this.checkoutByGuestAttributes = getTelemetryAttributes(this.telemetryContent, payload);\n\n payload.contentAction.etext = TelemetryConstant.ViewShoppingBag;\n this.viewShoppingBagAttributes = getTelemetryAttributes(this.telemetryContent, payload);\n }\n\n public async componentDidMount(): Promise<void> {\n const context = this.props.context.actionContext;\n\n reaction(\n () => this.props.data.cart.result?.cart.CartLines,\n async () => {\n this.setState({\n miniCartData: await getMiniCartData(context, this.props.data.cart.result!)\n });\n }\n );\n\n this.setState({\n orgUnitLocations: this.props.data.orgUnitLocations.result\n });\n }\n\n // tslint:disable-next-line:cyclomatic-complexity\n public render(): JSX.Element | null {\n const {\n id,\n typeName,\n config: {\n enableHoverCart\n },\n context: {\n request: {\n user: {\n isAuthenticated,\n signInUrl\n }\n }\n },\n context,\n resources\n } = this.props;\n\n const cart = this.props.data.cart && this.props.data.cart.result || undefined;\n const guestCheckoutUrl = getUrlSync('checkout', this.props.context.actionContext) || '';\n const cartUrl = getUrlSync('cart', 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 hasInvoiceLine = cart && cart.hasInvoiceLine;\n const cartLines = this._getCartLines();\n const hasErrors = cartLines ? cartLines.some(cartline => cartline.hasError) : false;\n const includeFlyout = this.props.data.cart && this.props.data.cart.status === 'SUCCESS' && enableHoverCart;\n const cartSize = cartLines ? cartLines.length : 0;\n const goToCartButtonText = resources.goToCartButtonTitle.replace('{count}', cartSize.toString());\n const flyoutTitle = resources.flyoutTitle;\n // If there are invoice lines, don't update mini cart price\n const price = cart && !cart.hasInvoiceLine && cart.cart.TotalAmount || undefined;\n const priceString = price ? resources.totalPriceFormatString.replace('{price}', context.cultureFormatter.formatCurrency(price)) : '';\n const multiplePickupStoreSwitchName = 'Dynamics.AX.Application.RetailMultiplePickupDeliveryModeFeature';\n this.channelDeliveryOptionConfig = this.props.data.channelDeliveryOptionConfig?.result;\n this.retailMultiplePickUpOptionEnabled = this.props.data.featureState?.result?.\n find(feature => feature.Name === multiplePickupStoreSwitchName)?.IsEnabled;\n\n const viewProps = {\n ...this.props,\n cartIcon: (\n <CartIconComponent\n cartLabel={resources.cartLabel}\n cartQtyLabel={resources.cartQtyLabel}\n context={context}\n id={id}\n typeName={typeName}\n data={{cart: cart}}\n telemetryContent={this.telemetryContent}\n />\n ),\n cartlines: cartLines,\n FlyoutContainer: includeFlyout ? {\n tag: UncontrolledTooltip,\n placement: 'bottom-end',\n hideArrow: true,\n className: 'ms-cart-icon__flyout-container',\n trigger: 'hover focus',\n displayMode: 'FLYOUT',\n target: id\n } : undefined,\n CartlinesWrapper: {\n className: 'ms-cart-icon__cart-lines'\n },\n miniCartWrapper: {\n className: classnames('ms-cart-icon'),\n id: this.props.id\n },\n miniCartItemWrapper: {\n className: classnames('msc-cart-lines-item')\n },\n // If there are invoice lines, don't update mini cart checkout button\n checkoutAsSignInUserButton: (!isCartEmpty && !hasInvoiceLine) ?\n (\n <Button disabled={hasErrors} className={'ms-cart-icon__btn-checkout'} href={checkoutURL} title={resources.checkoutButtonTitle}{...this.checkoutBySignInAttributes}>{resources.checkoutButtonTitle}</Button>\n ) : null,\n checkoutAsGuestButton: (!isCartEmpty && !isAuthenticated) ?\n (\n <Button disabled={hasErrors} className={'ms-cart-icon__btn-guestcheckout'} href={guestCheckoutUrl} title={resources.guestCheckoutButtonTitle}{...this.checkoutByGuestAttributes}>{resources.guestCheckoutButtonTitle}</Button>\n ) : null,\n goToCartButton:\n (\n <Button className={'ms-cart-icon__btn-gotocart'} href={cartUrl} title={goToCartButtonText} {...this.viewShoppingBagAttributes}>{goToCartButtonText}</Button>\n ),\n flyoutTitle:\n (\n <span className={`ms-cart-icon__flyout-title`}>{flyoutTitle}</span>\n ),\n totalPrice:\n (\n <div className={`ms-cart-icon__subtotal`}>{priceString}</div>\n )\n };\n\n return this.props.renderView(viewProps) as React.ReactElement;\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 (msdyn365Commerce.isBrowser && !isAbsoluteUrl) {\n returnURL = `${window.location.origin}${guestCheckoutUrl}`;\n }\n\n return `${signInUrl}${signInUrl.indexOf('?') === -1 ? '?' : '&'}ru=${returnURL}`;\n }\n\n private _getCartLines(): IFlyoutCartLineItemViewProps[] | null {\n const {\n context: {\n request: {\n channel: {\n PickupDeliveryModeCode\n } = { PickupDeliveryModeCode: undefined }\n }\n },\n config: config,\n telemetry,\n resources\n } = this.props;\n\n const imageSettings = this._getImageSettings(config.imageSettings);\n const cart = this.props.data.cart && this.props.data.cart.result;\n\n return this.state.miniCartData.products && cart && cart.cart.CartLines && cart.cart.CartLines.length > 0 ?\n (\n FlyoutCartLineItems({\n cartlines: cart.cart.CartLines,\n products: this.state.miniCartData.products,\n productAvailabilites: this.state.miniCartData.productAvailabilites,\n productDeliveryOptions: this.state.miniCartData.deliveryOptions,\n imageSettings: imageSettings,\n outOfStockThreshold: this.props.context.app.config.outOfStockThreshold || 0,\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 quantityDisplayString: resources.quantityDisplayText,\n inputQuantityAriaLabel: '', // not used\n discountStringText: '', // not used\n originalPriceText: '',\n currentPriceText: '',\n shippingChargesText: ''\n },\n telemetry: telemetry,\n removeButtonText: resources.removeCartButtonText,\n outOfStockText: '', // not used\n outOfRangeOneText: '', // not used\n outOfRangeFormatText: '', // not used\n cartState: cart,\n orgUnitLocations: this.state.orgUnitLocations,\n removeItemClickHandler: this._removeItemFromCartHandler,\n pickupDeliveryModeCode: PickupDeliveryModeCode,\n telemetryContent: this.telemetryContent,\n channelDeliveryOptionConfig : this.retailMultiplePickUpOptionEnabled ? this.channelDeliveryOptionConfig : undefined\n })\n ) : null;\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 .catch((error) => {\n this.props.telemetry.warning(error);\n this.props.telemetry.debug('Unable to Remove Cart Line');\n });\n }\n }\n}\n\nexport default CartIcon;\n","import { Module, Node } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\nimport { ISearchResultModalViewProps } from './components';\nimport { ICategoryHierarchyViewProps, IRefineMenuViewProps, ISearchResultContainerViewProps, ISortByViewProps, ITitleViewProps } from './search-result-container';\n\nconst SearchResultContainerView: React.FC<ISearchResultContainerViewProps> = props => {\n const { SearchResultContainer, products, pagination, ProductsContainer, ProductSectionContainer, choiceSummary, isMobile, modalToggle, searchResultModal, TitleViewProps,\n refineMenu, categoryHierarchy, sortByOptions, CategoryNavContainer, RefineAndProductSectionContainer, errorMessage, FeatureSearchContainer, similarLookProduct } = props;\n if (isMobile) {\n return (\n <Module {...SearchResultContainer}>\n {renderCategoryHierarchy(categoryHierarchy)}\n {renderTitle(TitleViewProps)}\n {choiceSummary}\n {modalToggle}\n {createSearchResultModal(searchResultModal, refineMenu, sortByOptions)}\n <Node {...FeatureSearchContainer}>\n {similarLookProduct}\n </Node>\n <Node {...ProductsContainer}>\n {errorMessage}\n {products}\n </Node>\n {pagination}\n </Module>\n );\n }\n return (\n <Module {...SearchResultContainer}>\n <Node {...CategoryNavContainer}>\n {categoryHierarchy && renderCategoryHierarchy(categoryHierarchy)}\n {TitleViewProps && renderTitleCount(TitleViewProps)}\n </Node>\n <Node {...RefineAndProductSectionContainer}>\n {refineMenu && renderRefiner(refineMenu)}\n <Node {...ProductSectionContainer}>\n {TitleViewProps && renderTitle(TitleViewProps)}\n {choiceSummary}\n {sortByOptions && renderSort(sortByOptions)}\n <Node {...FeatureSearchContainer}>\n {similarLookProduct}\n </Node>\n <Node {...ProductsContainer}>\n {errorMessage}\n {products}\n </Node>\n {pagination}\n </Node>\n </Node>\n </Module>\n );\n\n};\n\nconst createSearchResultModal = (modalProps: ISearchResultModalViewProps, refineMenu: IRefineMenuViewProps, sortByDropDown: ISortByViewProps): JSX.Element => {\n return React.cloneElement(modalProps.modal, {}, modalProps.modalHeader, createModalBody(modalProps, refineMenu, sortByDropDown), modalProps.modalFooter);\n};\n\nconst createModalBody = (props: ISearchResultModalViewProps, refineMenu: IRefineMenuViewProps, sortByDropDown: ISortByViewProps): JSX.Element | null => {\n if (sortByDropDown) {\n return React.cloneElement(props.modalBody, {}, renderSort(sortByDropDown), renderRefiner(refineMenu));\n }\n return null;\n};\n\nconst renderRefiner = (props: IRefineMenuViewProps): JSX.Element | null => {\n const { refiners, RefineMenuContainer, RefinerSectionContainer } = props;\n if (refiners) {\n return (\n <Node {...RefinerSectionContainer}>\n <Node {...RefineMenuContainer}>\n {refiners.map((submenu, index) => (\n <React.Fragment key={index}>\n {submenu}\n </React.Fragment>\n ))}\n </Node>\n </Node>\n );\n }\n return null;\n};\n\nconst renderSort = (props: ISortByViewProps): JSX.Element | null => {\n const { SortingContainer, sortByDropDown } = props;\n if (sortByDropDown) {\n return (\n <Node {...SortingContainer}>\n {sortByDropDown}\n </Node>\n );\n }\n return null;\n};\n\nconst renderCategoryHierarchy = (props: ICategoryHierarchyViewProps): JSX.Element | null => {\n const { CategoryHierarchyContainer, categoryHierarchyList, categoryHierarchySeparator } = props;\n if (categoryHierarchyList) {\n return (\n <Node {...CategoryHierarchyContainer}>\n {categoryHierarchyList.map((category, index) => (\n <React.Fragment key={index}>\n {category}\n {categoryHierarchyList && categoryHierarchyList[index + 1] && categoryHierarchySeparator}\n </React.Fragment>\n ))}\n </Node>\n );\n }\n\n return null;\n};\n\nconst renderTitle = (props: ITitleViewProps): JSX.Element | null => {\n const { title, TitleContainer } = props;\n if (title) {\n return (\n <Node {...TitleContainer}>\n <h2>\n {title.titlePrefix}\n {title.titleText}\n </h2>\n </Node>\n );\n }\n return null;\n};\n\nconst renderTitleCount = (props: ITitleViewProps): JSX.Element | null => {\n const { title, TitleContainer } = props;\n if (title) {\n return (\n <Node {...TitleContainer}>\n <h5>\n {title.titleCount}\n </h5>\n </Node>\n );\n }\n return null;\n};\n\nexport default SearchResultContainerView;","/*---------------------------------------------------------------------------------------------\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 { IPromoBannerViewProps } from './promo-banner';\n\nconst PromoBannerView: React.FC<IPromoBannerViewProps> = props => {\n const {\n promoBannerProps,\n contentProps,\n closeButton,\n bannerMessages,\n PromoBannerTextProps,\n PromoBannerLinksProps,\n CarouselProps,\n handleLinks,\n handleText\n } = props;\n\n const slides = bannerMessages && bannerMessages.map((message, index) => {\n return (\n <Node {...contentProps} key={index}>\n {message.text && <Node {...PromoBannerTextProps} text={message.text} onClick={handleText}/>}\n {message.links && message.links.length > 0 && <Node {...PromoBannerLinksProps} links={message.links} onClick={handleLinks} />}\n </Node>\n );\n });\n\n return (\n <Module {...promoBannerProps}>\n <Node {...CarouselProps} items={slides} />\n {closeButton}\n </Module>\n );\n};\nexport default PromoBannerView;\n","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<IQuantityProps, IQuantityState> {\n public static defaultProps: Partial<IQuantityProps> = {\n min: 1,\n decrementGlyphClass: 'fas fa-minus',\n incrementGlyphClass: 'fas fa-plus'\n };\n\n private inputRef: React.RefObject<HTMLInputElement> = React.createRef<HTMLInputElement>();\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 <div className='quantity' id={this.props.id}>\n <button\n disabled={this.props.disabled || decrementDisabled}\n title= {decrementDisabled ? '' : this.props.decrementButtonAriaLabel}\n className={`decrement quantity__controls ${extraClassDecrement}`}\n onClick={this._onDecrement}\n aria-hidden={true}\n aria-label={`${this.props.decrementButtonAriaLabel}`}\n tabIndex={-1}\n color={'secondary'}\n {...decrementAttributes}\n >\n <span className={glyphMinusClassName} />\n </button>\n <input\n type='number'\n className='quantity-input'\n pattern='[0-9]*'\n value={this.state.currentInput}\n onChange={this._handleChange}\n onBlur={this._validateMin}\n aria-live='polite'\n aria-label={`${this.props.inputQuantityAriaLabel}`}\n role='spinbutton'\n aria-valuemin={min}\n aria-valuemax={max}\n aria-valuenow={currentValue}\n ref={this.inputRef}\n disabled={this.props.disabled}\n />\n <button\n disabled={this.props.disabled || incrementDisabled}\n title={incrementDisabled ? '' : this.props.incrementButtonAriaLabel}\n className={`increment quantity__controls ${extraClassIncrement}`}\n onClick={this._onIncrement}\n aria-hidden={true}\n aria-label={`${this.props.incrementButtonAriaLabel}`}\n tabIndex={-1}\n color={'secondary'}\n {...incrementAttributes}\n >\n <span className={glyphPlusClassName} />\n </button>\n </div>\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<HTMLInputElement>): 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}","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<IQuantityProps, IQuantityState> {\n public static defaultProps: Partial<IQuantityProps> = {\n min: 1,\n decrementGlyphClass: 'fas fa-minus',\n incrementGlyphClass: 'fas fa-plus'\n };\n\n private inputRef: React.RefObject<HTMLInputElement> = React.createRef<HTMLInputElement>();\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 <div className='quantity'/* id={this.props.id}*/>\n <button\n disabled={this.props.disabled || disabled}\n title= {disabled ? '' : this.props.decrementButtonAriaLabel}\n className={`decrement quantity__controls ${extraClass}`}\n onClick={getChangeHandler(-1)}\n aria-hidden={true}\n aria-label={`${this.props.decrementButtonAriaLabel}`}\n tabIndex={-1}\n color={'secondary'}\n >\n <span className={glyphMinusClassName} />\n </button>\n <input\n type='number'\n className='quantity-input'\n pattern='[0-9]*'\n value={currentValue}\n onChange={this._handleChange}\n onBlur={this._validateMin}\n aria-live='polite'\n aria-label={`${this.props.inputQuantityAriaLabel}`}\n role='spinbutton'\n aria-valuemin={1}\n aria-valuemax={this.props.max}\n aria-valuenow={currentValue}\n ref={this.inputRef}\n disabled={this.props.disabled}\n />\n <button\n disabled={this.props.disabled || incDisabled}\n title={incDisabled ? '' : this.props.incrementButtonAriaLabel}\n className={`increment quantity__controls ${incDisabled ? 'disabled' : ''}`}\n onClick={getChangeHandler(1)}\n aria-hidden={true}\n aria-label={`${this.props.incrementButtonAriaLabel}`}\n tabIndex={-1}\n color={'secondary'}\n >\n <span className={glyphPlusClassName} />\n </button>\n </div>\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<HTMLInputElement>): 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<HTMLElement>) => void;\n getRemoveItem(): (event: React.MouseEvent<HTMLElement>) => 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<HTMLElement>) => LineId && orderTemplateLine.fullProduct && onAddToBag(orderTemplateLine.fullProduct.ProductDetails, quantity, LineId),\n getRemoveItem: () => (event: React.MouseEvent<HTMLElement>) => 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<HTMLElement>) => {\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 <div className={`${componentClassName}__row-links-minified`}>\n {<Button className={`${componentClassName}__row-links-toggle`} data-type={props.index} onClick={toggle}/>}\n {showMobile &&\n <div className={`${componentClassName}__row-links`}>\n <Button\n className='ms-table__row-links-view'\n onClick={getViewHandler()}\n title={viewTitle}\n >View\n </Button>\n {getActionButton(true, props.removeButtonClassName, props.isMobile ? removeFromOrderTemplateLinesText : '', OrderTemplateLineActions(props).getRemoveItem())}\n {getActionButton(true, props.addButtonClassName, props.isMobile ? addToBagButtonText : '', OrderTemplateLineActions(props).getAddToBag())}\n </div>}\n </div>\n );\n};\n\nconst getActionButton = (isMobile: boolean, className: string, buttonText: string, clickHandler: (event: React.MouseEvent<HTMLElement>) => void): React.ReactNode => (\n <Button\n className={className}\n onClick={clickHandler}\n title={buttonText}\n >{buttonText}\n </Button>\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<HTMLInputElement>) => {\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 <label className='checkbox-container'>\n <input type='checkbox' checked={orderTemplateLine.isChecked} aria-checked={orderTemplateLine.isChecked} onChange={onSelectLine}/>\n <span className='checkmark'/>\n </label>\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 && <div className='ms-order-template-table-line__product-number'>{ItemId}</div>,\n productUnitOfMeasure: price ? (\n <div className='ms-order-template-table-line__product-unit-of-measure'>{UnitOfMeasure || price.UnitOfMeasure}</div>\n ) : (\n undefined\n ),\n productListId: LineId!,\n removeButton: getActionButton(true, removeButtonClassName, input.isMobile ? removeFromOrderTemplateLinesText : '', OrderTemplateLineActions(input).getRemoveItem()),\n productQuantityView: <div>{_generateQuantity(input, LineId!)}</div>,\n productQuantity: quantity,\n addToBagButton: getActionButton(true, addButtonClassName, input.isMobile ? addToBagButtonText : '', OrderTemplateLineActions(input).getAddToBag()),\n popUp: (\n <PopUp\n {...input}\n addButtonClassName={addButtonClassName}\n removeButtonClassName={removeButtonClassName}\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 <OrderTemplateQuantity\n currentCount={quantity}\n onChange={onChange}\n max={Number.MAX_VALUE}\n inputQuantityAriaLabel={resources.inputQuantityAriaLabel}\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 <Image\n className={className}\n altText={heading}\n title={heading}\n src={image}\n fallBackSrc={fallbackImage}\n gridSettings={context.request.gridSettings!}\n imageSettings={imageSettings || defaultImageSettings}\n loadFailureBehavior='empty'\n />\n );\n }\n return null;\n};\n\nconst _renderPrice = (props: IOrderTemplateLineProps): JSX.Element | null => {\n const { price, context, moduleId, moduleTypeName, resources } = props;\n\n if (price) {\n return (\n <PriceComponent\n id={moduleId}\n typeName={moduleTypeName}\n data={{ price: price }}\n className='ms-order-template-table-line__product-price'\n freePriceText={resources.freePriceText}\n originalPriceText={resources.originalPriceText}\n currentPriceText={resources.currentPriceText}\n context={context}\n />\n );\n }\n return null;\n};\n\nconst _renderProductDimensions = (props: 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 <a className='ms-order-template-table-line__product-info-name' href={productUrl}>\n {name}\n </a>\n ) : (\n <div className='ms-order-template-table-line__product-info-name'>{name}</div>\n );\n\n return (\n <div className='ms-order-template-table-line__product-info'>\n <div className='ms-order-template-table-line__product-info-name'>{productName}</div>\n <div className='ms-order-template-table-line__product-info-dimension'>\n {dimensions.length && dimensions.join(', ')}\n </div>\n </div>\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<IOrderTemplateLinesStatusMessageProps> = ({className, errorType, text}) => {\n switch(errorType) {\n case 'EMPTY':\n return (\n <p className={classnames('ms-order-template-lines__message-empty', className)}>{ text }</p>\n );\n case 'FAILED':\n return (\n <p className={classnames('ms-order-template-lines__message-failed', className)}>{ text }</p>\n );\n case 'LOADING':\n default:\n return (\n <p className='ms-order-template-lines__message-waiting'>{ text }</p>\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<IOrderTemplateTableHeadingProps> {\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<HTMLInputElement>) => {\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 <thead>\n <tr className={`${this.componentClassName}__heading-row`}>\n <th>\n <label className='checkbox-container'>\n <input type='checkbox' aria-checked={this.state.isChecked} checked={this.state.isChecked} onChange={this.getOnChange()}/>\n <span className='checkmark'/>\n </label>\n </th>\n <th/>\n <th>{this.props.productNumber}</th>\n {!this.props.isMobile ? <th>{this.props.productName}</th> : null}\n {!this.props.isMobile ? <th>{this.props.productUnitPrice}</th> : null}\n {!this.props.isMobile ? <th>{this.props.productUOM}</th> : null}\n {!this.props.isMobile ? <th>{this.props.productQuantity}</th> : null}\n {!this.props.isMobile ? <th>{this.props.productActions}</th> : <td/>}\n </tr>\n </thead>\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<IOrderTemplateActionsData> {\n context: ICoreContext;\n telemetryContent?: ITelemetryContent;\n handlers: {\n onRemoveTemplate(orderTemplateId: string): void;\n onRenameTemplate(orderTemplate: ProductList): Promise<void>;\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<HTMLElement>) => {\n return _removeOrderTemplate(props);\n };\n\n return {\n addTemplateToBag: _getOrderTemplateAddToCartDialog(props),\n renameTemplate: _getOrderTemplateRenameControl(props),\n removeTemplate: (\n <Button className='ms-order-template-action-bar__delete-template-button' onClick={removeOrderAction}>\n {deleteTemplateButtonText}\n </Button>\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 <AddOrderTemplateToCartComponent\n context={context}\n id={id}\n typeName={typeName}\n data={{orderTemplate}}\n className=''\n addToCartText={addTemplateToBagButtonText}\n dialogStrings={dialogStrings}\n telemetryContent={telemetryContent}\n />\n );\n};\n\nconst _getOrderTemplateRenameControl = (props: IOrderTemplateActionsProps): React.ReactNode => {\n const { renameOrderTemplateDialogStrings, resources, context, handlers } = props;\n return (\n <RenameOrderTemplateComponent\n onRenameTemplate={handlers.onRenameTemplate}\n className={'msc-order-template-name-dialog'}\n context={context}\n id={props.id}\n data={{orderTemplate: props.data.orderTemplate.productList}}\n typeName={props.typeName}\n renameOrderTemplateDialogStrings={renameOrderTemplateDialogStrings}\n renameOrderTemplateButtonText={resources.renameTemplateButtonText}\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<IOrderTemplateData> {\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<IOrderTemplateBulkActionsProps, IOrderTemplateBulkActionsState> {\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 <AddLineToTemplate {...addLineProps}/>\n <Button\n onClick={this.addHandler}\n disabled={this.state.isAddDisabled}\n className='add-selected-to-bag'\n aria-label={addSelectedToBagButtonText}\n >\n <span/>{!this.props.isMinifiedView && addSelectedToBagButtonText}\n </Button>\n <Button\n onClick={this.removeHandler}\n disabled={this.state.isRemoveDisabled}\n className='remove-selected'\n aria-label={removeSelectedToBagButtonText}\n >\n <span/>{!this.props.isMinifiedView && removeSelectedToBagButtonText}\n </Button>\n </>\n );\n }\n\n private addHandler = (event: React.MouseEvent<HTMLElement>) => {\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<HTMLElement>) => {\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<IAddLineToTemplateProps, IAddLineToTemplateState> {\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<HTMLInputElement> = 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 <Modal {...modalProps}>\n <ModalHeader toggle={this._toggleModalHandler}>\n {this.showBackArrow && <button\n type='button'\n className='msc-modal__back-button'\n aria-label='Back to search results'\n onClick={this._onBackButtonClickHandler}\n />}{addLineModalLinkText}\n </ModalHeader>\n {this._renderContent()}\n </Modal>\n <Button className={'msc-add-line-to-template__button'} aria-label={addLineModalLinkText} onClick={this._toggleModalHandler}><span/>{addLineModalLinkText}</Button>\n </>\n );\n }\n\n private _renderSearchForm = () => {\n const {\n resources: { searchButtonAriaLabel, searchInputAriaLabel, searchModalPlaceholderText }\n } = this.props;\n\n return (\n <form\n className='msc-add-line-to-template__search-form'\n aria-label={searchButtonAriaLabel}\n name='add-line-to-template-search-form'\n role='form'\n autoComplete='off'\n onSubmit={this._onSearchSubmit}\n >\n <input\n type='text'\n autoFocus\n aria-label={searchInputAriaLabel}\n className={'msc-form-control msc-add-line-to-template__search-input'}\n placeholder={searchModalPlaceholderText}\n value={this.state.query}\n onChange={this._onInputChange}\n ref={this.searchTextInput}\n maxLength={200}\n />\n <button\n className={'msc-add-line-to-template__search-button'}\n aria-label={'Add To Template Search Button'}\n color={'primary'}\n />\n </form>\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<HTMLInputElement>) => {\n this.setState({\n selectedQuantity: +event.target.value\n });\n }\n\n private _onSelectItem = async (product: ProductSearchResult): Promise<ProductDimensionFull[]> => {\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<HTMLInputElement>): 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'), '<span>$&</span>'));\n // tslint:disable-next-line:react-no-dangerous-html\n return <div className='msc-add-line-to-template__product__name' dangerouslySetInnerHTML={{__html: parsedName || ''}}/>;\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 <ProductConfiguration {...viewProps}/>;\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 <ModalBody>\n <ProductList {...productProps}/>\n </ModalBody>\n );\n\n case CONTENT.Loading:\n return (\n <ModalBody>\n {this._renderSearchForm()}\n <Spinner className='msc-add-line-to-template' msg={this.props.resources.progressNotificationText}/>\n </ModalBody>\n );\n\n case CONTENT.NotFound:\n const { notFoundSearchErrorNotice, notFoundSearchErrorRedediation } = this.props.resources;\n\n return (\n <ModalBody>\n <p className='msc-add-line-to-template__search-result-count'>{this._resultCountText()}</p>\n {this._renderSearchForm()}\n <NotFoundComponent error={notFoundSearchErrorNotice} msg={notFoundSearchErrorRedediation}/>\n </ModalBody>\n );\n\n case CONTENT.Error:\n return (\n <ModalBody>\n {this._renderSearchForm()}\n <div className='msc-alert-danger'>{this.props.resources.searchErrorMessage}</div>\n </ModalBody>\n );\n\n default:\n return (\n <ModalBody>\n {this._renderSearchForm()}\n </ModalBody>\n );\n }\n }\n\n private _addItemToTemplateHandler = async (config: IProductConfigurationState): Promise<ProductListLine> => {\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<ProductSearchResult[]> {\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<ProductDimensionFull[]> {\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 <div className={`${props.className}__loading__icon`}/>\n {props?.msg && <div className={`${props.className}__loading__msg`}>{props?.msg}</div>}\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<IDropdownProps, IDropdownState>}\n */\nexport class Dropdown extends React.PureComponent<IDropdownProps, IDropdownState> {\n private selectMenu: React.RefObject<HTMLSelectElement> = React.createRef<HTMLSelectElement>();\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 <select\n id={`msc-dropdown__entry-${dropdownId}`}\n ref={this.selectMenu}\n aria-label={dropdownName}\n className='msc-dropdown__select'\n onChange={this._onChanged}\n >\n {dropdownList.map((item: IDropdownItemProps) => (item &&\n <option\n value={item.id}\n key={item.id}\n selected={+this.state.selectedIndex === +item.id}\n aria-selected={+this.state.selectedIndex === +item.id}\n >\n {item.value}\n </option>\n ))}\n </select>\n );\n }\n\n private _onChanged = (event: React.ChangeEvent<HTMLSelectElement>): 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 <div className='msc-add-line-to-template__not-found__icon'/>\n <div className='msc-add-line-to-template__not-found__msg'>{props.error}</div>\n <div className='msc-add-line-to-template__not-found__remediation-instructions'>{props.msg}</div>\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<ProductListLine>;\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<IProductCnnfigurationProps, IProductConfigurationState> {\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 <ModalBody>\n {this.props.searchForm}\n <div className='msc-add-line-to-template__product-config'>\n <div className='msc-add-line-to-template__product__positioning-container-2'>\n <div className='msc-add-line-to-template__product__positioning-container-1'>\n <Image\n src={product?.PrimaryImageUrl || ''}\n fallBackSrc={\n getFallbackImageUrl(product?.ItemId, apiSettings) || ''\n }\n className={'thumbnail'}\n imageSettings={imageSettings}\n gridSettings={gridSettings!}\n loadFailureBehavior='empty'\n />\n <div className='msc-add-line-to-template__product__attributes'>\n <div className='msc-add-line-to-template__product__id'>{product?.ItemId}</div>\n {highlightSearchTerm(product?.Name || '')}\n <div className='msc-add-line-to-template__product__unit-price'>{addLineProductUnitPricePrefix} {this._formatPrice(unitPrice)}</div>\n <div className='msc-add-line-to-template__product__uom'>{addLineProductUnitOfMeasurePrefix} {product?.DefaultUnitOfMeasure}</div>\n </div>\n </div>\n <div className='msc-add-line-to-template__product-config__dimensions'>\n {this._getDimensionsNodes()}\n </div>\n </div>\n <div className='quantity-container'>\n <div>{quantitySelectLabel}</div>\n <OrderTemplateQuantity\n id={'msc-add-line-to-template__product-config__quantity'}\n currentCount={quantity}\n onChange={this._onQuantityChange}\n inputQuantityAriaLabel='Press to increment quantity by 1'\n max={10000000}\n decrementButtonAriaLabel={decrementButtonAriaLabel}\n incrementButtonAriaLabel={incrementButtonAriaLabel}\n />\n </div>\n </div>\n <div className='msc-add-line-to-template__product__total-price'>{totalPriceLabel} {this._formatPrice(totalPrice)}</div>\n </ModalBody>\n <ModalFooter>\n {showAddConfirmation && <div className='msc-add-line-to-template__add-success msc-alert-success msc-alert'><span aria-hidden='true'/>{this._getConfirmationMessage()}</div>}\n {errors?.add && <div className='msc-add-line-to-template__add-error msc-alert-danger msc-alert'><span className='msi-exclamation-triangle' aria-hidden='true'/>{errors?.add}</div>}\n <Button\n className={classnames('msc-add-line-to-template__add-configured-product-button', { 'is-busy': this.state.isBusy })}\n aria-label={addItemToTemplateText}\n onClick={this._addToTemplateHandler}\n disabled={buttonDisabled}\n >\n {addItemToTemplateText}\n </Button>\n </ModalFooter>\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<IDropdownItemProps>(mapDimensions) : [];\n dropdownList.unshift({id:0, value:`Choose a ${dimensionName}`});\n\n return (\n <div key={DimensionTypeValue}>\n <div>{dimensionName}</div>\n {this.state.errors?.dimension?.includes(DimensionTypeValue.toString()) && (\n <Alert color='danger' assertive={true} aria-label={'aria label'}>\n <div className='msc-alert__header' aria-hidden='true'>\n <span className='msi-exclamation-triangle' />\n <span>{this._getDimensionsError(dimensionName)}</span>\n </div>\n </Alert>\n )}\n <Dropdown\n dropdownId={DimensionTypeValue}\n dropdownName={this._getDropdownName(DimensionTypeValue, resources)}\n dropdownList={dropdownList}\n onChange={this._onDimensionChanged}\n />\n </div>\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<HTMLButtonElement, 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<void> => {\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<ProductDimensionFull[]>;\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 <p className='msc-add-line-to-template__search-result-count'>{renderResultCountText()}</p>\n {props.searchForm}\n <div className='msc-add-line-to-template__product-list'>\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 <div key={`product-${index}`} className='msc-add-line-to-template__product'>\n <div className='msc-add-line-to-template__product__positioning-container-1'>\n <Image\n src={PrimaryImageUrl || ''}\n fallBackSrc={fallBackImg}\n className={'thumbnail'}\n gridSettings={gridSettings!}\n imageSettings={imageSettings}\n loadFailureBehavior='empty'\n />\n <div className='msc-add-line-to-template__product__attributes'>\n <div className='msc-add-line-to-template__product__id'>{ItemId}</div>\n {highlightSearchTerm(Name || '')}\n </div>\n </div>\n <div className='msc-add-line-to-template__product__price-container'>\n <span>{price}</span>\n <ProductSelectButton product={product} buttonText={selectProductButtonText} clickHandler={clickHandler}/>\n </div>\n </div>\n );\n })}\n </div>\n </>\n );\n};\n\ninterface IProductSelectButton {\n product: ProductSearchResult;\n buttonText: string;\n clickHandler(product: ProductSearchResult): Promise<ProductDimensionFull[]>;\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 <Button\n className={classnames('msc-add-line-to-template__product__select-button', { 'is-busy': isBusy })}\n aria-label={buttonText}\n onClick={getClickHandler}\n >\n {buttonText}\n </Button>\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 { Node } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\nimport { ICartIconViewProps } from './cart-icon';\nimport { IFlyoutCartLineItemViewProps } from './components/flyout-cart-line-items';\n\nconst _renderCartlines = (cartLines: IFlyoutCartLineItemViewProps[] | undefined, props: ICartIconViewProps): JSX.Element[] | null => {\n if (!cartLines) {\n props.context.telemetry.error('Cartlines content is empty, module wont render');\n return null;\n }\n return cartLines.map((cartLine, index) => {\n return (\n <Node {...props.miniCartItemWrapper} key={index}>\n {cartLine.cartline}\n {cartLine.storeLocation}\n {cartLine.remove}\n </Node>\n );\n });\n};\n\nconst CartIconView: React.FC<ICartIconViewProps> = (props: ICartIconViewProps) => (\n <Node {...props.miniCartWrapper} {...props.renderModuleAttributes(props)}>\n {props.cartIcon}\n {props.FlyoutContainer ? (\n <Node {...props.FlyoutContainer}>\n {props.flyoutTitle}\n <Node {...props.CartlinesWrapper}>\n {_renderCartlines(props.cartlines, props)}\n </Node>\n {props.totalPrice}\n {props.checkoutAsSignInUserButton}\n {props.goToCartButton}\n </Node>\n ) : false }\n </Node>\n);\n\nexport default CartIconView;","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<string> {\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<string>(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: <IAction<string>>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<IGeneric<IAny>>;\n parentId: string;\n parentType: string;\n isOpen: boolean;\n rating: number;\n reviewTitle: string;\n reviewText: string;\n returnRef: React.RefObject<HTMLButtonElement> | undefined;\n hasError: boolean;\n telemetryContent?: ITelemetryContent;\n onModalToggle():void;\n onTitleChange(event: React.ChangeEvent<HTMLInputElement>):void;\n onTextChange(event: React.ChangeEvent<HTMLTextAreaElement>):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: <Button className='ms-review-modal-cancel' onClick={props.onModalToggle} {...submitButtonAttribute} >{props.resources.discardReviewButtonText}</Button>,\n submitButton: <Button className='ms-review-modal-submit' onClick={onClickSubmit} {...cancelButtonAttribute} disabled={submitDisabled(props)}>{props.resources.submitReviewButtonText}</Button>,\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: <Alert className='ms-review-modal-error' isOpen={props.hasError} color='danger'>{props.resources.errorMessageText}</Alert>\n };\n};\n\nconst modalHeaderNode = (props: IReviewModalProps) => {\n return (\n <ModalHeader toggle={props.onModalToggle} className='ms-review-modal-header'>\n { props.userReview && props.userReview.reviewId ? props.resources.editReviewModalTitle : props.resources.writeReviewModalTitle }\n </ModalHeader>\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 <RatingComponent\n readOnly={false}\n avgRating={0}\n ariaLabel={props.resources.selectRatingAriaLabel}\n initialRating={props.rating}\n context={props.context}\n id={props.parentId}\n typeName={props.parentType}\n data={{}}\n key='ratings'\n onChange={props.onRatingChange}\n />\n );\n};\n\nconst ratingsLabel = (props: IReviewModalProps) => {\n return <label className='ms-review-modal-rating-label' key='ratingsLabel'>{props.resources.selectRatingLabel}*</label>;\n};\n\nconst titleInput = (props: IReviewModalProps) => {\n const maxLength = props.context.app.config.reviewTitleMaxLength;\n\n return (\n <input\n maxLength={maxLength}\n id={`reviewTitle-${props.renderContextId}`}\n onChange={props.onTitleChange}\n value={props.reviewTitle}\n aria-required='true'\n className='ms-review-modal-title'\n />\n );\n};\n\nconst titleLabel = (props: IReviewModalProps) => {\n return <label className='ms-review-modal-title-label' htmlFor={`reviewTitle-${props.renderContextId}`}>{props.resources.reviewTitleLabel}</label>;\n};\n\nconst reviewTextWidth: number = 50;\n\nconst textInput = (props: IReviewModalProps) => {\n const maxLength = props.context.app.config.reviewTextMaxLength;\n return (\n <textarea\n maxLength={maxLength}\n className='ms-review-modal-text'\n id={`reviewTextArea-${props.renderContextId}`}\n onChange={props.onTextChange}\n rows={maxLength / reviewTextWidth}\n value={props.reviewText}\n aria-required='true'\n />\n );\n};\n\nconst textLabel = (props: IReviewModalProps) => {\n return <label htmlFor={`reviewTextArea-${props.renderContextId}`} className='ms-review-modal-text-label'>{props.resources.reviewTextLabel}</label>;\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 <p className='ms-review-modal-policy'>\n {isSeparatorAtStart ? '' : policyTextBlocks[0]}\n <a href={privacyPolicyUrl} target='_blank' className='msc-link' {...privacyPolicyAttribute}>{props.resources.privacyPolicyTitle}</a>\n {isSeparatorAtEnd ? '' : isSeparatorAtStart ? policyTextBlocks[0] : policyTextBlocks[1] }\n </p>\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};","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 <p className='ms-write-review__sign-in'>{props.text}</p>;\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 <a href={href} className='ms-write-review__sign-in-btn msc-btn' aria-label={ariaLabel} {...attributes}>{text}</a>;\n};\n\ninterface IModalToggleProps {\n innerRef: React.RefObject<HTMLButtonElement> | undefined;\n id: string;\n text: string;\n ariaLabel: string;\n telemetryContent?: ITelemetryContent;\n onClick(): void;\n}\n\nexport const ModalToggle: React.FC<IModalToggleProps> = (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 <button id={id} className='ms-write-review__toggle msc-btn' aria-label={ariaLabel} onClick={onClick} ref={innerRef} {...attributes}>{text}</button>;\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<IWriteReviewData> {\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<IWriteReviewProps<IWriteReviewData>>}\n */\nclass WriteReview extends React.PureComponent<IWriteReviewProps<IWriteReviewData>, IWriteReviewState> {\n private _modalToggleRef: React.RefObject<HTMLButtonElement> | undefined;\n private telemetryContent: ITelemetryContent;\n\n public constructor(props: IWriteReviewProps<IWriteReviewData>) {\n super(props);\n const {userReview: {result: userReview}} = this.props.data;\n this._toggleReviewModal = this._toggleReviewModal.bind(this);\n this._modalToggleRef = React.createRef<HTMLButtonElement>();\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: <SignInMessage text={resources.signInMessage}/>,\n signInButton: <SignInButton text={resources.signInLabel} ariaLabel={resources.signInAriaLabel} href={userInfo.signInUrl!} telemetryContent={this.telemetryContent}/>,\n modalToggle: product && (\n <ModalToggle\n text={userReview? resources.editReviewButtonText : resources.reviewButtonLabel}\n ariaLabel={resources.reviewButtonLabel}\n innerRef={this._modalToggleRef}\n onClick={this._toggleReviewModal}\n id={TOGGLE_REVIEW_MODAL_BUTTON_ID}\n telemetryContent={this.telemetryContent}\n />\n ),\n reviewModal: this._buildUserReviewModal(),\n heading: heading && heading.text && (\n <Msdyn365.Text\n className='ms-write-review__heading'\n tag={heading.tag || 'h2'}\n text={heading.text}\n editProps={{onEdit:this.handleHeadingChange, requestContext: this.props.context.request}}\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<HTMLInputElement>): void => {\n this.writeReviewCallbacks.updateReviewTitle(event.target.value);\n }\n\n private _onTextChange = (event: React.ChangeEvent<HTMLTextAreaElement>): 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","import { Module, Node } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\nimport { IMediaGalleryThumbnailItemViewProps, IMediaGalleryThumbnailsViewProps, IMediaGalleryViewProps } from '../..';\n\nconst MediaGalleryView: React.FC<IMediaGalleryViewProps> = props => {\n const {CarouselProps, Thumbnails, MediaGallery, Modal} = props;\n\n return (\n <Module {...MediaGallery}>\n <Node {...CarouselProps} />\n {Modal}\n {_renderThumbnails(Thumbnails)}\n </Module>\n );\n};\n\nconst _renderThumbnails = (thumbnails: IMediaGalleryThumbnailsViewProps): JSX.Element => {\n const { ThumbnailsContainerProps, SingleSlideCarouselComponentProps, items } = thumbnails;\n\n return (\n <Node {...ThumbnailsContainerProps}>\n <Node {...SingleSlideCarouselComponentProps}>\n {items && items.map(_renderThumbnailItem)}\n </Node>\n </Node>\n );\n};\n\nconst _renderThumbnailItem = (thumbnail: IMediaGalleryThumbnailItemViewProps): JSX.Element => {\n const { ThumbnailItemContainerProps, Picture } = thumbnail;\n\n return (\n <Node {...ThumbnailItemContainerProps}>\n {Picture}\n </Node>\n );\n};\n\nexport default MediaGalleryView;","/*---------------------------------------------------------------------------------------------\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<void>;\n}\n\nconst CreateOrderTemplateButton: React.FC<ICreateOrderTemplateButtonProps> = (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 <Button\n className='ms-order-template__add-template-button'\n color='primary'\n onClick={onCreateButtonClick}\n >\n {props.createOrderTemplateText}\n </Button>\n <OrderTemplateNameDialog\n className={'msc-order-template-name-dialog'}\n modalOpen={createOrderTemplateDialogOpen}\n isUpdateDialog={false}\n setModalOpen={setOrderTemplateNameDialogOpen}\n context={props.context}\n id={props.id}\n data={{}}\n typeName={props.typeName}\n dialogStrings={props.createOrderTemplateDialogResources}\n onCancel={onCancel}\n onSuccess={props.onOrderTemplateCreated}\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<IOrderTemplateListData> {\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<IOrderTemplateListProps<IOrderTemplateListData>, IOrderTemplateListActionMessageState>}\n */\n@observer\nclass OrderTemplateList extends React.Component<IOrderTemplateListProps<IOrderTemplateListData>, IOrderTemplateActionMessageState> {\n\n constructor(props: IOrderTemplateListProps<IOrderTemplateListData>) {\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<void> {\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<IOrderTemplateListData>),\n OrderTemplateList: {\n moduleProps: this.props,\n className: classnames('ms-order-template', className),\n },\n status: 'LOADING',\n statusMessage: <OrderTemplateListStatusMessage errorType='LOADING' text='Loading...'/>,\n heading: (\n <Heading\n className='ms-order-template__heading'\n text={this.props.resources.orderTemplateListTitle}\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<IOrderTemplateListData>),\n OrderTemplateList: {\n moduleProps: this.props,\n className: classnames('ms-order-template', className),\n },\n status: 'EMPTY',\n statusMessage: <OrderTemplateListStatusMessage errorType='EMPTY' text={ emptyOrderTemplateText }/>,\n heading: (\n <Heading\n className='ms-order-template__heading'\n text={this.props.resources.orderTemplateListTitle}\n />\n ),\n };\n\n return this.props.renderView(emptyViewProps);\n }\n\n const viewProps: IOrderTemplateListViewProps = {\n ...(this.props as IOrderTemplateListProps<IOrderTemplateListData>),\n OrderTemplateList: {\n moduleProps: this.props,\n className: classnames('ms-order-template', className),\n },\n status: 'SUCCESS',\n heading: (\n <Heading\n className='ms-order-template__heading'\n text={this.props.resources.orderTemplateListTitle}\n />\n ),\n createOrderTemplateButton: (\n <CreateNewTemplateButtonComponent\n context={this.props.context}\n id={this.props.id}\n typeName={this.props.typeName}\n data={{}}\n createOrderTemplateText={createNewTemplateButtonText}\n onOrderTemplateCreated={this._reloadPage}\n createOrderTemplateDialogResources={this._generateOrderTemplateNameDialogResources(this.props.resources)}\n />\n ),\n templateHeaderStatusMessage: this.state.isOpen && this.state.headerStatusMessage && (\n <div className='ms-order-template__products-status'>\n <Alert color={this.state.statusCssString} isOpen={this.state.isOpen} toggle={this._onDismiss}>\n <span>{this.state.headerStatusMessage}</span>\n </Alert>\n </div>\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 *--------------------------------------------------------------------------------------------*/\nimport { getPayloadObject, getTelemetryAttributes, ITelemetryContent, TelemetryConstant } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nexport interface IPromoBannerCloseButton {\n closeButtonAriaLabel?: string;\n label?: string;\n telemetryContent?: ITelemetryContent;\n onClose(): void;\n\n}\n\nexport const PromoBannerCloseButton: React.FC<IPromoBannerCloseButton> = ({ closeButtonAriaLabel, label, telemetryContent, onClose }) => {\n const payLoad = getPayloadObject('click', telemetryContent!, TelemetryConstant.PromoBannerClose);\n const attributes = getTelemetryAttributes(telemetryContent!, payLoad);\n return (\n <button className='ms-promo-banner__close-button' aria-label={closeButtonAriaLabel} onClick={onClose} {...attributes}>\n <span className='ms-promo-banner__close-button__label' aria-hidden={true}>{label}</span>\n </button>\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 { getPayloadObject, getTelemetryAttributes, ITelemetryContent, onTelemetryClick } from '@msdyn365-commerce-modules/utilities';\nimport * as Msdyn365 from '@msdyn365-commerce/core';\nimport * as React from 'react';\nimport { ILinksData } from '../promo-banner.props.autogenerated';\n\nexport interface IPromoBannerLinks {\n links: ILinksData[];\n requestContext: Msdyn365.IRequestContext;\n telemetryContent: ITelemetryContent;\n onTextChange?(index: number): (event: Msdyn365.ContentEditableEvent) => void;\n}\n\nexport const PromoBannerLinks: React.FC<IPromoBannerLinks> = ({ links, requestContext, onTextChange, telemetryContent }) => {\n const editableLinks = _mapEditableLinks(links, telemetryContent);\n return(\n <span className='ms-promo-banner__links'>\n {editableLinks && editableLinks.length ?\n <Msdyn365.Links\n links= {editableLinks}\n editProps={{onTextChange: onTextChange, requestContext: requestContext}}\n />\n : null\n }\n </span>\n );\n};\n\nconst _mapEditableLinks = (linkdata: ILinksData[], telemetryContent: ITelemetryContent): Msdyn365.ILinksData[] | null => {\n if(!linkdata || linkdata.length === 0) {\n return null;\n }\n const editableLinks: Msdyn365.ILinksData[] = [];\n linkdata.forEach((link,index) => {\n // Construct telemetry attribute to render\n const payLoad = getPayloadObject('click', telemetryContent, '', '');\n const linkText = link.linkText ? link.linkText : '';\n payLoad.contentAction.etext = linkText;\n const attributes = getTelemetryAttributes(telemetryContent, payLoad);\n const editableLink: Msdyn365.ILinksData = {\n ariaLabel: link.ariaLabel,\n className: 'ms-promo-banner__link',\n linkText: link.linkText,\n linkUrl: link.linkUrl.destinationUrl,\n openInNewTab: link.openInNewTab,\n role: 'button',\n additionalProperties: attributes,\n onClick: onTelemetryClick(telemetryContent, payLoad, linkText)\n };\n editableLinks.push(editableLink);\n });\n\n return editableLinks;\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 Msdyn365 from '@msdyn365-commerce/core';\nimport * as React from 'react';\n\nexport interface IPromoBannerText {\n text: string;\n requestContext: Msdyn365.IRequestContext;\n onTextChange(event: Msdyn365.ContentEditableEvent): void;\n}\n\nexport const PromoBannerText: React.FC<IPromoBannerText> = ({ text, onTextChange, requestContext }) => {\n return(\n <Msdyn365.Text\n className='ms-promo-banner__text'\n tag={'span'}\n text={text}\n editProps = {{onEdit: onTextChange, requestContext: requestContext}}\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 { getTelemetryObject, IModuleProps, INodeProps, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\nimport { Carousel } from '@msdyn365-commerce/components';\nimport * as Msdyn365 from '@msdyn365-commerce/core';\nimport classnames from 'classnames';\nimport * as React from 'react';\nimport { PromoBannerCloseButton, PromoBannerLinks, PromoBannerText } from './components';\nimport { IBannerMessagesData, IPromoBannerProps } from './promo-banner.props.autogenerated';\n\nexport interface IPromoBannerState {\n animating: boolean;\n isVisible: boolean;\n activeIndex: number;\n}\n\nexport interface IPromoBannerViewProps extends IPromoBannerProps<{}>, IPromoBannerState {\n promoBannerProps: IModuleProps;\n contentProps: INodeProps ;\n bannerMessages: IBannerMessagesData[];\n PromoBannerTextProps: INodeProps;\n PromoBannerLinksProps: INodeProps;\n CarouselProps: INodeProps;\n closeButton?: React.ReactNode;\n className: string;\n onDismiss(): void;\n handleText(): void;\n handleLinks(): void;\n}\n\n/**\n *\n * PromoBannerModule component\n * @extends {React.PureComponent<IPromoBannerProps<IPromoBannerState>>}\n */\nclass PromoBanner extends React.PureComponent<IPromoBannerProps<{}>, IPromoBannerState> {\n public state: IPromoBannerState = {\n animating: false,\n isVisible: true,\n activeIndex: 0\n };\n\n private telemetryContent: ITelemetryContent = getTelemetryObject(this.props.context.request.telemetryPageName!,\n this.props.friendlyName,\n this.props.telemetry);\n\n public render(): JSX.Element | null {\n const { bannerMessages, dismissEnabled, interval, hideFlipper, autoplay, className= '' } = this.props.config;\n const { closeButtonAriaLabel, closeButtonLabel } = this.props.resources;\n const { isVisible, activeIndex } = this.state;\n\n if (!isVisible) {\n this.props.context.telemetry.error('Promo banner content is empty, module wont render.');\n return null;\n }\n\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 className: classnames('ms-promo-banner', className),\n isVisible, // state data\n onDismiss: this._onDismiss, // methods\n handleLinks: this.handleLinkTextChange,\n handleText: this.handleTextChange,\n\n promoBannerProps: { className: classnames('ms-promo-banner', className), moduleProps: this.props, role: 'banner' },\n PromoBannerTextProps: {\n tag: PromoBannerText\n },\n PromoBannerLinksProps: {\n tag: PromoBannerLinks,\n telemetryContent: this.telemetryContent\n },\n contentProps: { className: 'ms-promo-banner__content' },\n bannerMessages: bannerMessages,\n activeIndex: activeIndex,\n CarouselProps: {\n tag: Carousel,\n className: 'ms-promo-banner__carousel',\n activeIndex: activeIndex,\n next: this._next,\n previous: this._previous,\n onIndicatorsClickHandler: this._goToIndex,\n hideIndicator: hideFlipper,\n interval: interval,\n hideFlipper: hideFlipper,\n autoplay: autoplay\n },\n closeButton: dismissEnabled && <PromoBannerCloseButton {...{ onClose: this._onDismiss, label: closeButtonLabel, closeButtonAriaLabel, telemetryContent: this.telemetryContent }} />\n };\n\n return this.props.renderView(viewProps) as React.ReactElement;\n }\n public handleTextChange = (event: Msdyn365.ContentEditableEvent) => {\n if(this.props.config.bannerMessages && this.props.config.bannerMessages[0]) {\n this.props.config.bannerMessages[0].text = event.target.value;\n }\n }\n public handleLinkTextChange = (linkIndex: number) => (event: Msdyn365.ContentEditableEvent) => {\n if(this.props.config.bannerMessages && this.props.config.bannerMessages[1]) {\n const links = this.props.config.bannerMessages[1].links;\n if(links) {\n links[linkIndex].linkText = event.target.value;\n }\n }\n };\n\n private _next = (): void => {\n const nextIndex = this._isLastItem() ? 0 : this.state.activeIndex + 1;\n this._goToIndex(nextIndex);\n };\n\n private _previous = (): void => {\n const nextIndex = this._isFirstItem() ? (this.props.config.bannerMessages ? this.props.config.bannerMessages.length - 1 : 0) : this.state.activeIndex - 1;\n this._goToIndex(nextIndex);\n };\n\n private _goToIndex = (index: number): void => {\n if (this.state.animating) {\n return;\n }\n this.setState({ activeIndex: index });\n };\n\n private _isFirstItem = () => this.state.activeIndex === 0;\n\n private _isLastItem = () => this.props.config.bannerMessages && this.state.activeIndex === this.props.config.bannerMessages.length - 1;\n\n private _onDismiss = (): void => {\n this.setState({ isVisible: false });\n };\n}\n\nexport default PromoBanner;\n","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<IReviewsListViewProps> = 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 <Module {...moduleProps}>{noReviewsMessage}</Module>;\n }\n\n return (\n <Module {...moduleProps}>\n {heading}\n {averageRating}\n {reviewCount}\n { reviewCards.length === 0 ?\n null : <Node {...refineReviewsProps} >\n {sortByDropdown}\n {filterByDropdown}\n </Node>\n }\n <Node {...reviewsListProps}>\n {userReview && buildReviewCard(userReview)}\n {reviewCards.map(review => {\n return buildReviewCard(review);\n })}\n </Node>\n { reviewCards.length === 0 && state.isFilterApplied && noReviewsWithFilterMessage}\n {pageControls}\n {createReviewModal(reviewModal, moduleProps)}\n {createReportModal(reportReviewModal, state)}\n </Module>\n );\n};\n\nconst buildReviewCard = (props: IReviewCardViewProps) => {\n return (\n <Node {...props.cardProps}>\n <Node {...props.headerProps}>\n {props.rating}\n {props.name}\n </Node>\n <Node {...props.cardBodyProps}>\n <Node {...props.reviewProps}>\n {props.reviewTitle}\n {props.date}\n {props.reviewText}\n </Node>\n <Node {...props.responseProps}>\n {props.responseName}\n {props.responseDate}\n {props.responseText}\n </Node>\n <Node {...props.controlsProps}>\n {props.ratingHelpfulLabel}\n {props.like}\n {props.dislike}\n {props.edit}\n {props.report}\n </Node>\n </Node>\n </Node>\n );\n};\n\nconst createReviewModal = (props: IReviewModalViewProps, moduleProps: IModuleProps): JSX.Element => {\n return (\n <Module {...props.modal} {...moduleProps}>\n {props.modalHeader}\n <Node {...props.modalBody}>\n <Node {...props.form}>\n <Node {...props.inputRow}>\n {props.rating}\n {props.ratingLabel}\n </Node>\n <Node {...props.inputRow}>\n {props.titleLabel}\n {props.titleInput}\n </Node>\n <Node {...props.inputRow}>\n {props.textLabel}\n {props.textInput}\n </Node>\n {props.privacyPolicyUrl}\n {props.error}\n </Node>\n </Node>\n <Node {...props.modalFooter}>\n {props.submitButton}\n {props.cancelButton}\n </Node>\n </Module>\n );\n};\n\nconst createReportModal = (props: IReportReviewModalViewProps, state: IReviewsListState): JSX.Element => {\n return (\n <Node {...props.modal}>\n <Node {...props.modalHeader}>\n {state.reported ? props.headerSubmitted : props.header}\n </Node>\n <Node {...props.modalBody}>\n {state.reported ? props.reportSubmittedMessage : [props.reportMessage, props.radioButtons, props.error]}\n </Node>\n <Node {...props.modalFooter}>\n {state.reported ? props.succesfulButton : [props.submitButton, props.cancelButton]}\n </Node>\n </Node>\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 { 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<IOrderTemplateViewProps> = (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 <Module {...OrderTemplateLines}>\n {heading}\n {OrderTemplateActions && (\n <Node {...OrderTemplateActions}>\n {orderActions?.addTemplateToBag}\n {orderActions?.renameTemplate}\n {orderActions?.removeTemplate}\n {!isDetailsDisplayed && productsStatusMessage}\n </Node>\n )}\n {bulkOrderLineActions}\n {status !== 'SUCCESS' && statusMessage}\n {ProductsTable && orderLines && orderLines.length > 0 && (\n <Node className='ms-order-template__content'>\n <Node {...ProductsTable}>\n {ProductsTableHeading}\n <tbody>\n {orderLines &&\n orderLines.map(product => {\n return _renderItem(product, productQuantityText, ProductsTableRow);\n })}\n </tbody>\n </Node>\n {pagination}\n </Node>\n )}\n {itemAddedToCartDialog}\n <Modal\n wrapClassName={'ms-order-template-mobile-view-modal'}\n autoFocus={true}\n fade={false}\n applicationNode={'renderPage'}\n isOpen={isDetailsDisplayed}\n toggle ={toggleDetails}\n >\n <ModalHeader toggle={toggleDetails}>\n Product Details\n </ModalHeader>\n <ModalBody>\n <ul>\n <li>{detailedProductView?.productImage}</li>\n <li className='product-info'><span>{productText}:</span>{detailedProductView?.productInfo}</li>\n <li><span>{productNumberText}:</span>{detailedProductView?.productNumber}</li>\n <li><span>{productUnitPriceText}:</span> {detailedProductView?.productPrice}</li>\n <li><span>{productUOMText}:</span> {detailedProductView?.productUnitOfMeasure}</li>\n <li><span>{productQuantityText}:</span>{detailedProductView?.productQuantityView}</li>\n {productsStatusMessage && <li>{productsStatusMessage}</li>}\n </ul>\n </ModalBody>\n <ModalFooter>\n <Button onClick={toggleDetails}>{cancelBtnLabel}</Button>\n </ModalFooter>\n </Modal>\n </Module>\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 <Node key={key} className={ProductsTableRow!.className} {...ProductsTableRow}>\n <td>{selectLine}</td>\n <td>{productImage}</td>\n {isMobile ? <td><div>{productNumber}</div><div>{quantityLabel}: {productQuantity}</div></td> : <td>{productNumber}</td>}\n {!isMobile && <td>{productInfo}</td>}\n {!isMobile && <td>{productPrice}</td>}\n {!isMobile && <td>{productUnitOfMeasure}</td>}\n {!isMobile && <td>{productQuantityView}</td>}\n {isMobile && <td>{popUp}</td> }\n {!isMobile &&\n <td>\n {addToBagButton}\n {removeButton}\n </td>}\n </Node>\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\nimport { ICarouselViewProps } from '@msdyn365-commerce-modules/carousel/src/modules/carousel/./carousel';\r\nimport { Carousel } from '@msdyn365-commerce/components';\r\nimport classnames from 'classnames';\r\nimport * as React from 'react';\r\n\r\nconst CarouselView: React.FC<ICarouselViewProps> = props => (\r\n <React.Fragment>\r\n <Carousel\r\n className={classnames(props.closeAnimation, props.config.className)}\r\n activeIndex={props.activeIndex}\r\n next={props.next}\r\n previous={props.previous}\r\n pause={props.config.pauseOnHover ? 'hover' : false}\r\n ride={props.config.autoplay ? 'carousel' : undefined}\r\n autoplay={props.config.autoplay}\r\n interval={props.config.interval}\r\n transitionType={(props.config.transitionType) ? props.config.transitionType : undefined}\r\n items={props.slots && props.slots.content && props.slots.content.length ? props.slots.content : []}\r\n hideFlipper={props.config.hideFlipper}\r\n dismissEnabled={props.config.dismissEnabled}\r\n onIndicatorsClickHandler={props.onIndicatorsClickHandler}\r\n handleDismissCarousel={props.handleDismissCarousel}\r\n dismissCarouselAriaText={props.resources && props.resources.ariaLabelForDismissButton}\r\n indicatorAriaText={props.resources && props.resources.ariaLabelForSlide}\r\n directionTextPrev={props.resources && props.resources.flipperPrevious}\r\n directionTextNext={props.resources && props.resources.flipperNext}\r\n handleOnExited={props.handleOnExited}\r\n handleOnExiting={props.handleOnExiting}\r\n />\r\n </React.Fragment>\r\n);\r\n\r\nexport default CarouselView;\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 { getTelemetryObject, IModuleProps, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport * as React from 'react';\nimport { ICarouselData } from './carousel.data';\nimport { ICarouselProps } from './carousel.props.autogenerated';\nimport { ICarouselState } from './carousel.state';\n\nexport interface ICarouselViewProps extends ICarouselProps<{}>, ICarouselState {\n closeAnimation: string;\n carouselContainer: IModuleProps;\n telemetryContent: ITelemetryContent;\n next(): void;\n previous(): void;\n onIndicatorsClickHandler():void;\n handleDismissCarousel(): void;\n handleOnExited(): void;\n handleOnExiting(): void;\n}\n\n/**\n *\n * CarouselModule component\n * @extends {React.PureComponent<ICarouselProps<ICarouselData>>}\n */\nclass CarouselModule extends React.PureComponent<ICarouselProps<ICarouselData>, ICarouselState> {\n private animating: boolean;\n private telemetryContent: ITelemetryContent;\n\n constructor(props: ICarouselProps<ICarouselData>, state: ICarouselState) {\n super(props);\n this.state = { activeIndex: 0, closeNow: false, dismissCarousel: false };\n this.animating = false;\n this.telemetryContent = getTelemetryObject(this.props.context.request.telemetryPageName!,\n this.props.friendlyName,\n this.props.telemetry);\n }\n\n public componentDidMount(): void {\n if(this.props.context && this.props.context.request && this.props.context.request.cookies) {\n if (this.props.context.request.cookies.get(`CarouselDismiss_${this.props.id}`) === undefined) {\n this.props.context.request.cookies.set(`CarouselDismiss_${this.props.id}`, 'false');\n this.setState({ dismissCarousel: false });\n }\n }\n }\n\n public render(): JSX.Element | null {\n if (this.state.dismissCarousel) {\n return null;\n }\n\n const { className } = this.props.config;\n\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 ...this.state,\n telemetryContent: this.telemetryContent,\n carouselContainer: {\n moduleProps: this.props,\n className: classnames('ms-carousel', className)\n },\n closeAnimation: this.state.closeNow ? 'close-now' : '',\n next: this._next,\n previous: this._previous,\n onIndicatorsClickHandler: this._goToIndex,\n handleDismissCarousel: this._handleDismissCarousel,\n handleOnExited: this._onExited,\n handleOnExiting: this._onExiting};\n\n return this.props.renderView(viewProps) as React.ReactElement;\n }\n\n /**\n * function implementation to dismiss the Carousel\n */\n private _handleDismissCarousel = (): void => {\n if(this.props.context && this.props.context.request && this.props.context.request.cookies) {\n this.props.context.request.cookies.set(`CarouselDismiss_${this.props.id}`, 'true');\n this.setState({ dismissCarousel: true });\n }\n }\n\n /**\n * function implementation to move to next slide\n */\n private _next = (): void => {\n const { slots } = this.props;\n const nextIndex = this.state.activeIndex === (slots && slots.content && slots.content.length - 1) ? 0 : this.state.activeIndex + 1;\n\n if (this.animating) {\n this.setState({ closeNow: true, activeIndex: nextIndex });\n } else {\n this.setState({ activeIndex: nextIndex });\n }\n }\n\n /**\n * function implementation to move to previous slide\n */\n private _previous = (): void => {\n const slots = this.props.slots && this.props.slots.content;\n const nextIndex = this.state.activeIndex === 0 ? (slots ? slots.length - 1 : 0) : this.state.activeIndex - 1;\n\n if (this.animating) {\n this.setState({ closeNow: true, activeIndex: nextIndex });\n } else {\n this.setState({ activeIndex: nextIndex });\n }\n }\n\n private _onExiting = (): void => {\n this.animating = true;\n }\n\n private _onExited = (): void => {\n this.animating = false;\n this.setState({ closeNow: false });\n }\n\n /**\n * function implementation to move to a given slide\n */\n private _goToIndex = (newIndex: number): void => {\n if (this.animating) { return; }\n this.setState({ activeIndex: newIndex });\n }\n}\n\nexport default CarouselModule;\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<IOrderTemplateListViewProps> = props => {\n const { OrderTemplateList, status, statusMessage, heading, OrderTemplates, orderTemplates, OrderTemplate, createOrderTemplateButton, templateHeaderStatusMessage } = props;\n\n return (\n <Module {...OrderTemplateList}>\n {heading}\n {status !== 'SUCCESS' && statusMessage}\n <Node className=''>\n {createOrderTemplateButton}\n {templateHeaderStatusMessage}\n </Node>\n { OrderTemplates && orderTemplates && orderTemplates.length > 0 &&\n <Node {...OrderTemplates}>\n {orderTemplates && orderTemplates.map((orderTemplate) => {\n return _renderOrderTemplate(orderTemplate, OrderTemplate);\n })}\n </Node>\n }\n </Module>\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 <Node key={key} className={OrderTemplate!.className} {...OrderTemplate}>\n {orderTemplateName}\n {orderTemplateImage}\n {addToCartButton}\n {removeButton}\n {orderTemplateStatusMessage}\n </Node>\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<IWriteReviewViewProps> = props => {\n const { heading, signInMessage, signInButton, modalToggle, reviewModal, moduleProps } = props;\n const isAuthenticated = props.context.request.user.isAuthenticated;\n return (\n <Module {...moduleProps}>\n {heading}\n {!isAuthenticated ?\n <>\n {signInMessage}\n {signInButton}\n </>\n :\n <>\n {modalToggle}\n {createReviewModal(reviewModal, moduleProps)}\n </>\n }\n </Module>\n );\n};\n\nconst createReviewModal = (props: IReviewModalViewProps, moduleProps: IModuleProps): JSX.Element => {\n return (\n <Module {...props.modal} {...moduleProps}>\n {props.modalHeader}\n <Node {...props.modalBody}>\n <Node {...props.form}>\n <Node {...props.inputRow}>\n {props.rating}\n {props.ratingLabel}\n </Node>\n <Node {...props.inputRow}>\n {props.titleLabel}\n {props.titleInput}\n </Node>\n <Node {...props.inputRow}>\n {props.textLabel}\n {props.textInput}\n </Node>\n {props.privacyPolicyUrl}\n {props.error}\n </Node>\n </Node>\n <Node {...props.modalFooter}>\n {props.submitButton}\n {props.cancelButton}\n </Node>\n </Module>\n );\n};\n\nexport default WriteReviewView;"],"sourceRoot":""}