{"version":3,"sources":["webpack:///../../src/get-product-dimensions-with-availabilities.ts?347b","webpack:///../../../src/utilities/utils.ts?fbc0","webpack:///../../src/get-selected-variant.ts?f0c0","webpack:///../../src/get-wishlist-by-customer-id.ts?e873","webpack:///../../src/delete-address.ts?f9a3","webpack:///../../src/get-attribute-definitions.ts?cc6b","webpack:///../../src/get-org-unit-configuration.ts?4793","webpack:///../../src/get-dimension-availabilities-for-products.ts?f656","webpack:///../../../src/order-templates/get-full-order-template.ts?72c6","webpack:///../../src/get-refiners-by-category.ts?6d4e","webpack:///../../src/refine-search-by-category.ts?3e65","webpack:///../../../src/order-templates/add-item-to-order-template.ts?fff3","webpack:///../../src/get-delivery-options-for-selected-variant.ts?3f6c","webpack:///../../src/get-customer.ts?8319","webpack:///../../../../src/utilities/data-structures/dictionary.ts?bab3","webpack:///../../../src/order-templates/add-order-template-to-cart.ts?6ee4","webpack:///../../../src/order-templates/create-order-template.ts?03c1","webpack:///../../src/get-feature-state.ts?1a1d","webpack:///../../../src/order-templates/update-order-template-header.ts?1f77","webpack:///../../src/get-order-history.ts?76fd","webpack:///../../../../src/utilities/events/event.ts?15a9","webpack:///../../../src/invoices/get-invoices.ts?22cb","webpack:///../../src/get-scan-results.ts?6b44","webpack:///../../../../src/utilities/regex/email-regex.ts?6a6a","webpack:///../../../../src/utilities/regex/password-regex.ts?456d","webpack:///../../../../src/utilities/regex/phone-regex.ts?9ada","webpack:///../../../src/utilities/input-data-parser.ts?027a","webpack:///../../src/update-customer-personalization.ts?4aa9","webpack:///../../src/checkout.ts?57e0","webpack:///../../src/delete-organization-user.ts?7f5d","webpack:///../../../src/utilities/QueryResultSettingsProxy.ts?5e44","webpack:///../../src/get-categories-hierarchy.ts?acde","webpack:///../../src/edit-organization-user.ts?d2ac","webpack:///../../../src/utilities/product-inventory-information.ts?0ec6","webpack:///../../src/get-simple-products.ts?fed7","webpack:///../../../src/order-templates/get-order-templates-preview.ts?b8c3","webpack:///../../src/get-channel-delivery-option-configuration.ts?a716","webpack:///../../src/get-product-list-lines.ts?ae74","webpack:///../../src/get-dimensions-for-selected-variant.ts?6bf4","webpack:///../../../../src/utilities/promise-queue/finite-promise-queue.ts?77bf","webpack:///../../src/get-ratings-summary-input.ts?3ccb","webpack:///../../src/get-pickup-options-for-cartlines.ts?843b","webpack:///../../../src/utilities/index.ts?5407","webpack:///../../src/get-dimension-availabilities-for-product-search-result.ts?5259","webpack:///../../../../src/utilities/extensions/enum-extensions.ts?cf51","webpack:///../../../../src/utilities/extensions/string-extensions.ts?ab9f","webpack:///../../src/get-checkout-cart.ts?79bc","webpack:///../../../src/utilities/quick-order-templates.ts?0ea6","webpack:///../../src/update-customer-attributes.ts?8d49","webpack:///../../../src/utilities/validate-cartlines-inventory.ts?8b82","webpack:///../../../../src/utilities/random/guid.ts?1947","webpack:///../../../../src/utilities/random/index.ts?1f9d","webpack:///../../src/get-full-available-inventory-nearby.ts?20be","webpack:///../../src/get-items-in-wishlist.ts?0d27","webpack:///../../src/get-price-for-selected-variant.ts?9e79","webpack:///../../src/get-full-products-by-refine-search-text.ts?2ad7","webpack:///../../../src/utilities/refiner-utils.ts?1e61","webpack:///../../../../src/utilities/Url-builder/parameterize.ts?f5a5","webpack:///../../../../src/utilities/Url-builder/category-url-builder.ts?e564","webpack:///../../../../src/utilities/Url-builder/invoice-url-builder.ts?d542","webpack:///../../../../src/utilities/Url-builder/product-url-builder.ts?baf1","webpack:///../../src/get-loyalty-transaction-estimation.ts?e254","webpack:///../../src/index.ts?0e3e","webpack:///../../src/get-ratings-summary.ts?49bc","webpack:///../../src/get-full-products-by-refine-search-category.ts?30ab","webpack:///../../src/get-delivery-options-for-cartlines.ts?4dfe","webpack:///../../../../src/utilities/promise-queue/promise-queue.ts?e362","webpack:///../../src/get-product-list.ts?ef13","webpack:///../../src/get-address.ts?20a3","webpack:///../../src/get-products-by-category.ts?accf","webpack:///../../../src/utilities/product-inventory-utils.ts?58b5","webpack:///../../src/get-store-location-information.ts?1df0","webpack:///../../src/get-full-products.ts?ba9a","webpack:///../../../../src/utilities/extensions/object-extensions.ts?6388","webpack:///../../../../src/utilities/promise-queue/index.ts?c43d","webpack:///../../../../src/utilities/extensions/array-extensions.ts?1a2a","webpack:///../../src/get-organization-users-count.ts?b5f7","webpack:///../../../src/order-templates/get-paginated-order-template-lines.ts?9b12","webpack:///../../src/get-full-product-list.ts?ccfb","webpack:///../../src/generic-data-action.ts?f887","webpack:///../../../src/invoices/get-invoice-details.ts?66a9","webpack:///../../src/get-customer-loyalty-cards.ts?2466","webpack:///../../../src/utilities/quick-order-template-line.ts?56d5","webpack:///../../src/get-catalogs.ts?7332","webpack:///../../../src/order-templates/get-order-templates.ts?a3b1","webpack:///../../src/get-loyalty-card.ts?7213","webpack:///../../src/get-products-in-active-cart.ts?3376","webpack:///../../src/get-related-products.ts?6f93","webpack:///../../src/add-organization-user.ts?ed86","webpack:///../../src/get-current-category-hierarchy.ts?d48e","webpack:///../../src/get-current-category.ts?354d","webpack:///../../src/get-media-locations-by-id.ts?8462","webpack:///../../src/create-product-list.ts?7367","webpack:///../../src/get-category-paths.ts?b007","webpack:///../../src/get-refiners-by-text.ts?c52a","webpack:///../../../src/utilities/order-templates.ts?d593","webpack:///../../src/get-organization-users.ts?b72e","webpack:///../../src/get-promotion-options-for-cartlines.ts?1a35","webpack:///../../src/get-price-for-product-search-result.ts?36f8","webpack:///../../src/issue-loyalty.ts?f8fa","webpack:///../../src/get-customer-balance.ts?d165","webpack:///../../src/get-availabilities-cartlines.ts?b8e8","webpack:///../../../../src/utilities/events/index.ts?d3a5","webpack:///../../src/get-media-locations-for-selected-variant.ts?fd54","webpack:///../../src/get-list.ts?4fd5","webpack:///../../src/get-product-availabilities-for-selected-variant.ts?0abd","webpack:///../../src/get-organization-wide-order-history.ts?92b8","webpack:///../../src/get-categories.ts?8dc6","webpack:///../../../src/order-templates/update-order-template-line.ts?527b","webpack:///../../src/update-address.ts?3e4d","webpack:///../../src/add-address.ts?fb17","webpack:///../../../src/utilities/getRnrKeys.ts?700f","webpack:///../../src/search-by-text.ts?ebe1","webpack:///../../src/get-search-configuration.ts?acd1","webpack:///../../src/get-attributes-for-selected-variant.ts?af00","webpack:///../../../src/order-templates/get-full-order-templates.ts?b553","webpack:///../../src/add-item-to-product-list.ts?580e","webpack:///../../src/update-primary-address.ts?83fa"],"names":["ProductDimensionsWithAvailabilitiesInput","constructor","productId","channelId","requestContext","getCacheKey","getCacheObjectType","dataCacheType","this","catalogId","getCatalogId","createProductDimensionsWithAvailabilitiesInput","inputData","getSelectedProductIdFromActionInput","apiSettings","Error","async","getProductDimensionsWithAvailabilitiesAction","input","context","_input$catalogId","activeProducts","ArrayExtensions","validValues","ProductsDataActions","getByIdsAsync","callerContext","queryResultSettings","QueryResultSettingsProxy","getPagingFromInputDataOrDefaultValue","hasElements","activeProduct","Dimensions","promises","map","dimension","shippingInventoryConfiguration","createInventoryAvailabilitySearchCriteria","undefined","searchCriteria","RequestedDimensionTypeValue","DimensionTypeValue","MatchingDimensionValues","DefaultWarehouseOnly","FilterByChannelFulfillmentGroup","DeliveryModeTypeFilterValue","CatalogId","getDimensionValuesWithEstimatedAvailabilitiesAsync","MasterProductId","RecordId","then","dimensionValues","_objectSpread","dimensionValuesWithInventory","Promise","all","getProductDimensionsWithAvailabilities","createObservableDataAction","id","action","_context$query","query","urlTokens","itemId","pageType","config","generateImageUrl","imageUrl","generateImageUrlFromSdk","DimensionTypes","DimensionSwatchDisplayTypes","checkIfShouldDisplayAsSwatch","dimensionType","displayType","arguments","length","default","productCard","dimensionsToDisplayOnProductCard","app","dimensionsInProductCard","includes","none","dimensionsToDisplayAsSwatch","dimensionsAsSwatchType","generateSwatchImageUrl","startsWith","baseImageUrl","encodeURIComponent","generateProductImageUrl","product","PrimaryImageUrl","buildWishlistLine","customerId","wishlistId","CommerceListId","ProductId","CustomerId","getProductDetailsCriteriaFromActionInput","getPrice","hidePrice","getRating","hideRating","buildCacheKey","base","locale","DefaultCacheKeyParameterKeys","generateCacheKey","_len","entries","Array","_key","parsedEntries","pair","key","toLocaleUpperCase","value","cacheKeyArgumentsKeys","channelIdKey","push","appSettingsCatalogIdKey","sort","a","b","localeCompare","join","buildCacheKeyWithUrlTokens","defaultCacheKey","recordId","getFallbackImageUrl","parsedItemId","trim","split","convertProductDimensionTypeToDimensionTypes","productDimensionType","ProductDimensionType","Color","color","Configuration","configuration","Size","size","Style","style","convertDimensionTypeToProductDimensionType","None","setDimensionValuesToQuery","inputUrl","productDimensions","_dimension$DimensionV","dimensionValue","DimensionValue","Value","StringExtensions","isNullOrWhitespace","searchParams","set","msdyn365Commerce","isBrowser","window","history","replaceState","state","toString","replace","host","location","parseDimensionsFromUrl","urlParameters","parsedDimensions","parseDimensionFromUrl","localDimensionType","get","getDimensionValuesFromQuery","URL","toLocaleLowerCase","getAttributeValuesByConfiguration","attributeValues","channelInventoryConfiguration","filter","attribute","InventoryProductAttributeRecordId","ProductAvailabilitySortableAttributeRecordId","removeDomainQspFromUrl","features","remove_domain_qsp","Url","urlParams","URLSearchParams","search","has","delete","validateCatalogId","SelectedVariantInput","matchingDimensionValues","bypassCache","getSelectedVariantActionDataAction","_input$matchingDimens","_input$catalogId2","url","requestUrl","hasUnmatchedDimension","checkIfHasUnmatchedDimensions","matchedTargetDimension","find","targetDimension","newImageUrl","fullDimensions","_product$Dimensions","fullDimensionPromises","getFullDimensions","productVariant","ProductIds","variantProductId","variantImageUrl","getProductVariant","matchedTargetDimensionFromApi","selectedProduct","retailActionDataAction","retailAction","user","isAuthenticated","createGetByCustomerInput","deleteAddressHandler","customer","address","Addresses","cur","ctx","doAddressManagementOperation","createAddressManagementInput","isBatched","GetAttributeDefinitionsInput","attributeDefinitionCriteria","getAttributeDefinitionsActionDataAction","channel","CustomerAttributeGroupId","getAttributeDefinitionsAsync","response","trace","AttributeGroupIdentifier","createGetOrgUnitConfigurationInput","ProductsDimensionAvailabilitiesInput","masterProductId","requestDimensionType","requestDimensionTypes","_this$_requestContext","keys","_requestContext","getDimensionAvailabilitiesForProductsAction","inputs","isArray","promise","RequestedDimensionTypeValues","InventoryAccuracyValue","InventoryAccuracy","Low","_inputData$config","productsDimensions","productDimension","GetFullOrderTemplateInput","orderTemplateId","getFullOrderTemplateActionDataAction","inputParams","GetOrderTemplatesInput","productLists","getOrderTemplates","inputLines","GetPaginatedOrderTemplateLinesInput","Id","linesState","getPaginatedOrderTemplateLinesAction","OrderTemplate","lines","totalCount","createGetFullOrderTemplateInput","fromInputData","QueryResultSettings","count","RefinersByCategoryInput","category","queryResultSettingsProxy","currentCategory","cacheKeyHint","shouldCacheOutput","categoryId","categorySlug","getCurrentCategory","getRefinersByCategoryAsync","CurrentCategoryInput","refinementCriteria","createRefineSearchByCategoryInput","Number","refinementCriterion","AddItemToOrderTemplateInput","quantity","unitOfMeasure","addItemToOrderTemplateActionDataAction","productListLineToAdd","ProductListId","Quantity","UnitOfMeasure","productListLine","addProductListLinesAsync","telemetry","error","addItemToOrderTemplateInput","GetDeliveryOptionsForSelectedVariantInput","featureState","getFeatureState","getFeatureStateActionDataAction","FeatureStateInput","createDeliveryOptionsForSelectedVariantInput","getDeliveryOptionsForSelectedVariantAction","_featureState$find","item","Name","IsEnabled","resolve","selectedVariantInput","getSelectedVariant","productResult","getDeliveryOptionsAsync","ItemTypeValue","ReleasedProductType","Service","FilterDeliveryModeOption","FilterOutNonPickupDeliveryMode","catch","message","exception","debug","getDeliveryOptionsForSelectedVariantActionDataAction","GetCustomerInput","accountNumber","cacheType","customerAccountNumber","getCustomerActionDataAction","CustomersDataActions","readAsync","token","Dictionary","_values","_length","forEach","keyValuePair","setValue","removeValue","hasValue","getValue","getValueWithDefaultValue","defaultValue","isEmpty","clear","getValues","getKeys","Object","getKeyValuePairs","AddOrderTemplateToCartInput","addOrderTemplateToCartActionDataAction","cartState","getCartState","Paging","Top","Skip","getPaginatedOrderTemplateLinesInput","orderTemplateLines","addedCartLines","skip","cartLines","productLine","_productLine$fullProd","ItemId","fullProduct","ProductDetails","TrackingId","UnitOfMeasureSymbol","addCartLinesAsync","cart","Version","_error$data","_error$data2","data","ValidationResults","concat","refreshCart","addOrderTemplateToCartInput","CreateOrderTemplateInput","templateName","createOrderTemplateActionDataAction","orderTemplate","ProductListTypeValue","ProductListType","createdProductList","createProductListAsync","createOrderTemplateInput","featureNames","createGetFeatureStateInput","getFeatureStateAction","StoreOperationsDataActions","getFeatureStatesAsync","UpdateOrderTemplateHeaderInput","updateOrderTemplateHeaderActionDataAction","updatedProductList","updateAsync","updateOrderTemplateHeaderInput","createGetOrderShipmentsHistoryInput","Event","_subscribers","subscribe","instance","unsubscribe","instanceId","element","unsubscribeAll","trigger","subscriber","handler","GetInvoicesInput","CreateGetInvoicesInput","InvoicePaidStatusValues","InvoicePaidStatus","getInvoices","_context$requestConte","InvoiceTypeValues","InvoiceType","SalesOrderInvoice","businessPartner","getCurrentAsync","BusinessPartnerId","getCustomer","AccountNumber","SalesOrdersDataActions","getInvoicesAsync","getInvoicesDataAction","GetScanResultInput","sku","skuNumber","scanResults","Product","getDimensionsForSelectedVariant","GetDimensionsForSelectedVariantInput","ScanResult","ProductDimensionFull","createInput","EmailRegex","html5EmailRegex","PasswordRegex","defaultRegex","PhoneRegex","parseSearchData","q","top","maxItems","itemsPerPage","updateCustomerPersonalizationInput","userAccountNumber","isOptOut","preferenceType","updateCustomerPersonalizationActionDataAction","newCustomer","OptOutWebActivityTracking","OptOutPersonalization","updatedCustomer","update","baseUrl","cartId","requestOptions","headers","oun","Authorization","cartTenderLines","cartTenderLineItem","TokenizedPaymentCard","House","CardTokenInfo","billingAddress","Phone","ThreeLetterISORegionName","Street","City","State","ZipCode","Country","toUpperCase","Address1","Zip","requestBody","receiptEmail","cartVersion","sendCommerceRequest","status","DeleteOrganizationUserInput","newUser","deleteOrganizationUserDataAction","deleteAsync","console","log","createDeleteOrganizationUserInput","fromModuleData","sortingCriteria","Sorting","_config$itemsPerPage","_inputData$requestCon","_inputData$requestCon2","parseInt","platform","defaultPageSizeForAPI","Columns","column","ColumnName","IsDescending","CategoriesInput","mappedToHierarchy","includeRootCategory","sitePath","_mappedToHierarchy","getLocale","getFriendlyName","nameTranslations","nameTranslation","Language","toLowerCase","Text","mapCategoryToHierarchy","categoryList","_rootCategory$Childre","categoryMap","localName","NameTranslations","categoryHierarchy","NeutralizedName","rootCategory","values","parentId","ParentCategory","getCategoryUrl","parent","Children","createCategoriesHierarchyInput","topItems","topCategories","getCategoryHierarchyAction","categories","getCategoryAction","RawCategoriesInput","getCategoryHierarchyActionDataAction","EditOrganizationUserInput","editOrganizationUserDataAction","updatedUser","createEditOrganizationUserInput","DeliveryMode","InventoryLevels","InventoryLevelValues","getInventoryLevelCodeFromDimensionValue","inventoryLevel","totalAvailable","TotalAvailableInventoryLevelCode","physicalAvailable","PhysicalAvailableInventoryLevelCode","getInventoryLevelCodeFromProductAvailability","productAvailability","ProductInput","warehouseId","getSimpleProductsAction","productIdMapping","index","getProductPromises","catalogIds","unique","_inputs$0$warehouseId","productInputs","mappedProducts","flatten","_unused","reduce","memo","productIds","GetOrderTemplatesPreviewInput","createGetOrderTemplatesPreviewInput","getOrderTemplatesPreview","getFullOrderTemplates","GetFullOrderTemplatesInput","getOrderTemplatesPreviewDataAction","GetChannelDeliveryConfigurationInput","getChannelDeliveryOptionConfigurationAsync","GetProductListLinesInput","productListId","searchText","getProductListLinesActionDataAction","quickOrderTemplateLinesState","ProductListsDataActions","getProductListLinesAsync","productListLines","_promise$metadata$cou","metadata","listLine","QuickOrderTemplateLine","FullProductInput","fullProductsInfo","getFullProducts","products","line","createGetProductListLinesInput","getDimensionsForSelectedVariantAction","dimensionValuesResults","newDimension","_newDimension$dimensi","oldDimension","DimensionValues","getDimensionsForSelectedVariantActionDataAction","FinitePromiseQueueError","FinitePromiseQueue","PromiseQueue","maxQueueLength","InvalidMaxQueueLengthPassed","super","_maxQueueLength","promiseBody","totalElementsCount","_queue","_isBusy","shift","reject","ProcessWasDiscardedFromTheQueue","enqueue","GetRatingsSummaryInput","tenantId","serviceEndpoint","ProductPickUpOptionsForCartLineItems","getPickUpOptionsForCartLineItems","getActiveCartProductsAction","ActiveCartProductsInput","getPickUpOptionsForCartLineItemsDataAction","DimensionAvailabilitiesForProductSearchResultInput","dimensionContext","getDimensionAvailabilitiesForProductSearchResultDataAction","productsDimensionInputs","_product$AttributeVal","filteredProductAttributes","AttributeValues","attributeValue","_attributeValue$Name$","_attributeValue$Name","productionDimensionTypes","productionDimensionType","_product$MasterProduc","dimensionForProducts","productsDimensionAvailabilities","dimensionInput","_dimensionValue$Value","inventoryLevelCode","isDisabled","outOfStock","warning","createDimensionAvailabilitiesForProductSearchResultInput","EnumExtensions","enumClass","ObjectExtensions","isNullOrUndefined","getNumericValues","isNumber","getNames","isString","getEnumValues","isNullOrEmpty","GetCheckoutCartInput","CartCookieName","CartCookie","Cookie","activeCart","checkoutCart","copyAsync","QuickOrderTemplate","productList","quickOrderTemplateLines","totalLines","ContactInfoType","updateCustomerAttributesInput","customerAttributes","phone","vatNumber","updateCustomerAttributesActionDataAction","_customer$Contacts","primaryContact","Contacts","contact","IsPrimary","AddressTypeValue","PhoneRecordId","VatNumber","Attributes","validateCartLinesInventory","productAvailabilities","actionContext","emailDeliveryModeCode","cartLineMap","Map","enableStockCheck","isValid","productIdWithErrors","cartLine","IsInvoiceLine","IsGiftCardLine","_cartLineMap$get","_cartLine$Quantity2","cartLineTotal","_cartLine$Quantity","productAvailabilityMap","ProductAvailableQuantity","from","_cartLineMap$get2","_productAvailability$","cartLineQty","availableQuantity","AvailableQuantity","cartLineProduct","isStockedItem","_cartLineProduct$Beha","Behavior","IsStockedProduct","isEmailDelivery","IsProductAvailable","Guid","Random","generateGuid","uuidv4","_guid","GetFullAvailableInventoryNearbyInput","_productId","_latitude","_longitude","_radius","_DistanceUnitValue","_IgnoreLocation","latitude","longitude","radius","DistanceUnitValue","IgnoreLocation","createGetFullAvailableInventoryNearbyInput","getFullAvailableInventoryNearbyAction","searchArea","Latitude","Longitude","Radius","retailMulitplePickupMFeatureState","pickup","getEstimatedAvailabilityAsync","productInventoryInformation","mapProductInventoryInformation","productWarehouseInformation","ProductWarehouseInventoryAvailabilities","getOrgUnitLocationsByAreaAsync","DeliveryModeTypeFilter","Pickup","storeMap","stores","store","InventoryLocationId","locationDeliveryOptions","orgUnitChannel","ChannelId","channelCollection","channelIdList","getChannelDeliveryOptionsAsync","channelDeliveryOptions","_getLocationPickUpDeliveryModes","availabilityPromiseList","_locationDeliveryOpti","locationDeliveryOption","_channeldeliveryoption","orgUnitLocation","channelDeleiveryOptions","OrgUnitNumber","OrgUnitAvailability","getStoreHoursAsync","hours","itemAvailabilities","_element$ProductAvail","InventLocationId","availability","OrgUnitLocation","ItemAvailabilities","ProductInventoryInformation","OrgUnitPickUpDeliveryModes","StoreHours","_getAvailabilityWithHours","getFullAvailableInventoryNearbyActionDataAction","ActiveWishlistInput","getActiveWishlistItems","wishlists","getByCustomerAsync","CommerceListLines","commerceListLine","PriceForSelectedVariantInput","createActivePriceForSelectedVariantInput","getPriceForSelectedVariantAction","projectDomain","_featureStates$find","_featureStates$find2","featureStates","getActivePricesAsync","Date","ProductTypeValue","ProductType","Master","KitMaster","productPrices","getPriceForSelectedVariantActionDataAction","FullProductsRefineSearchByTextInput","criteria","productDetailsCriteria","getRefinedProducts","fullProductInputs","searchResults","ProductDetailsCriteria","productSearchResult","getRefinedFullProducts","refineSearchByTextAsync","searchInputData","parameterize","name","sep","parameterizeFeatureFlags","neutralizedName","candidateName","platformSettings","enableUrlLocalization","enableUrlEncoding","Slug","getParameterizeFeatureFlags","getCategorySlug","categoryName","getUrlSync","getInvoiceDetailsPageUrlSync","invoiceId","substr","indexOf","getProductUrlSync","getProductPageUrlSync","GetLoyaltyTransactionEstimationInput","createGetLoyaltyTransactionEstimationInput","getLoyaltyTransactionEstimationAction","_getCart","_getLoyalty","_getOrgUnits","result","CardNumber","getMaxLoyaltyPointsToRedeemForTransactionBalanceAsync","Currency","points","loyaltyCardInput","GetLoyaltyCardInput","getLoyalty","getOrgUnitConfigurationAsync","getLoyaltyTransactionEstimationActionDataAction","getRnrPartnerId","getRnrEndpointId","getRatingsSummary","inputIsValid","sendRequest","getRatingsSummaryDataAction","FullProductsRefineSearchByCategoryInput","hasSortingColumn","refineSearchByCategoryAsync","ProductDeliveryOptionsForCartLineItems","getDeliveryOptionsForCartLineItems","x","getDeliveryOptionsForCartLineItemsDataAction","PromiseQueueElement","body","_dequeue","_canProcess","_processElement","_processNext","GetProductListInput","productListSearchCriteria","QuickOrder","searchAsync","createGetProductListInput","AddressInput","createGetAddressInput","getAddressAction","customerInput","getAddressActionDataAction","ProductsByCategoryInput","searchByCategoryAsync","productSearchResults","getProducts","displayLabelEnabled","inventoryCode","inventoryRanges","available","productsWarehouseInventory","physicalProductMap","mapInventoryWithPhysicalBufferEnabled","totalAvailableProductMap","mapInventoryWithTotalAvailableBufferEnabled","productMap","mapInventoryWithThresholdEnabled","productWarehouseInventoryAvailability","TotalAvailable","productQty","outOfStockThreshold","productAvailableQuantity","shouldRenderLabel","productQuantity","_productWarehouseInve","MaximumPurchasablePhysicalAvailableQuantity","PhysicalAvailable","StockLevelCode","StockLevelLabel","PhysicalAvailableInventoryLevelLabel","_productWarehouseInve2","MaximumPurchasableTotalAvailableQuantity","TotalAvailableInventoryLevelLabel","isAggregatedInventory","warehouseAggregation","mapAggregatedProductInventoryInformation","productWarehouseInventoryInformation","_productWarehouseInve3","AggregatedProductInventoryAvailabilities","_product$MaximumPurch","_product$MaximumPurch2","DataAreaId","PhysicalAvailableQuantity","TotalAvailableQuantity","isDefaultWareHouse","isFilterByChannelFulfillmentGroup","defaultDeliveryMode","deliveryMode","shipping","inventoryAvailabilitySearchCriteria","QuantityUnitTypeValue","SearchArea","GetOrgUnitLocationsByAreaInput","_Latitude","_Longitude","_Radius","createGetOrgUnitLocationsByAreaInput","getOrgUnitLocationsByArea","locationPromiseList","_getLocationWithHours","getOrgUnitLocationsByAreaDataAction","getFullProductsAction","getSimpleProducts","productCollection","validProductIds","Set","ratingsAndPricePromises","_getActivePrices","_getProductRatings","_inputs$0$catalogId","validInputs","Boolean","productPrice","versionLt","retailServerProxyVersion","CustomerContextualPrice","AdjustedPrice","ProductPrice","getProductRatingsAsync","productRating","ProductRating","getFullProductsActionDataAction","isFunction","firstOrDefault","predicate","arrayLine","equals","firstArray","secondArray","comparator","JSON","stringify","haveSameItems","valueFromFirstArray","valueFromSecondArray","some","otherItem","calculateSum","reverse","array","newArray","OrganizationUsersCountInput","createGetOrganizationUsersCountInput","getOrganizationUsersCount","getUsersAsync","users","convertToString","orderTemplateLinesState","_inputData$getPrice","_inputData$getRating","OrderTemplateLine","getPaginatedOrderTemplateLinesActionDataAction","createGetPaginatedOrderTemplateLinesInput","GetFullProductListInput","getFullProductListActionDataAction","inputParameters","getProductList","getProductListLines","createGetFullProductListInput","GenericInput","cacheKey","cacheObjectType","getGenericAction","GetInvoiceDetailsInput","CreateGetInvoiceDetailsInput","getInvoiceDetails","InvoiceId","getInvoiceDetailsAsync","getInvoiceDetailsDataAction","createGetCustomerLoyaltyCardsInput","CatalogsInput","getCustomerAccountNumberForAllChannelType","createCatalogsInput","getCatalogAction","CatalogsDataActions","getCatalogsAsync","getCatalogActionDataAction","_this$queryResultSett","_this$queryResultSett2","createGetOrderTemplatesInput","getOrderTemplatesAction","createGetLoyaltyCardInput","getLoyaltyAction","getCustomerLoyaltyCardsAsync","cards","firstCard","getLoyaltyCardAsync","card","LoyaltyEnrollmentDate","LoyaltyEnrollmentDateLocal","getLoyaltyActionDataAction","_ctx$requestContext$a","defaultOrderQuantityLimitsFeatureConfig","enableDefaultOrderQuantityLimits","isQuantityLimitsFeatureEnabledInHq","customerInfo","IsB2b","isOrderQuantityLimitsFeatureEnabled","_cart$CartLines","productIdsByWarehouseId","resultProducts","CartLines","_productIdsByWarehous","WarehouseId","_ref","entryWarehouseId","entryProductIds","accum","getActiveCartProductsActionWhenQuantityLimitsFeatureIsOn","hasInvoiceLine","getActiveCartProductsActionDataAction","GetRelatedProductsInput","relationType","querySettings","productRelationTypes","getRelationTypesAsync","productRelationTypeId","_productRelationType","foundProductRelationTypeId","productRelationType","searchProductRelationType","getRelatedProductsAsync","stack","isNaN","AddOrganizationUserInput","addOrganizationUserDataAction","errorMessage","createBusinessPartnerUserAsync","createAddOrganizationUserInput","CurrentCategoryHierarchyInput","activeCategoryId","_activeCategoryId","activeCategoryParsedId","findCategoryHierarchy","innerCategoryHierarchy","getCurrentCategoryHierarchyAction","_findCategoryHierarch","fullCategoryHierarchy","getCategoriesHierarchy","getCurrentCategoryHierarchyActionDataAction","tempActionContext","createGetCurrentCategoryInput","searchCategory","foundCategory","cat","matchingChild","getCurrentCategoryAction","categoryInput","getCategoryHierarchy","getCurrentCategoryActionDataAction","MediaLocationsByIdInput","createMediaLocationsByIdInput","getMediaLocationsByIdAction","OmniChannelMedia","mediaLocationsInput","MediaLocationsInput","getMediaLocationsForProductAction","getMediaLocationsAsync","mediaLocation","Uri","AltText","getMediaLocationsByIdActionDataAction","CreateProductListInput","templateType","createProductListActionDataAction","createProductListInput","GetCategoryPathsInput","categoryPathLooksups","categoryPath","createGetCategoryPathsInput","getCategoryPathsAction","categoryPathResults","getCategoryPathsAsync","CategoryPath","categoryUrl","getCategoriesUrlSync","slice","getCategoryPathsActionDataAction","RefinersByTextInput","getRefinersByTextAsync","OrganizationUsersInput","createGetOrganizationUsersInput","getOrganizationUsers","getOrganizationUsersDataAction","PromotionOptionsForCartLineItems","getPromotionOptionsForCartLineItemsDataAction","cartLineIds","c","LineId","getAvailablePromotionsAsync","PriceForProductSearchResultInput","getPriceForProductSearchResultDataAction","productRecIds","productResults","activePrice","price","_activePrice$Customer","_activePrice$BasePric","_activePrice$TradeAgr","_activePrice$Adjusted","Price","BasePrice","Math","max","TradeAgreementPrice","IssueLoyaltyInput","updateCart","updateLoyaltyCardId","loyaltyCardNumber","issueLoyaltyActionDataAction","issueLoyaltyCardAsync","CustomerAccount","issuedCard","GetCustomerBalanceInput","createGetCustomerBalanceInput","getCustomerBalanceAction","getCustomerBalanceAsync","InvoiceAccount","getCustomerBalanceActionDataAction","ProductAvailabilitiesForCartLineItems","getDeliveryMode","_channelDeliveryOptio","featureSate","channelDeliveryOptionConfig","pickupDeliveryMode","PickupDeliveryModeCodes","getAvailabilitiesForCartLineItems","shippingItems","bopisItems","channelConfiguration","retailMultiplePickUpOptionEnabled","PickupDeliveryModeCode","EmailDeliveryModeCode","shippingProductAvailabilities","productWarehouses","bopisItem","productWarehouse","InventLocationDataAreaId","quantityUnitTypeSales","getProductWarehouseAvail","getEstimatedProductWarehouseAvailabilityAsync","productWarehouseMapping","getAvailabilitiesForCartLineItemsDataAction","MediaLocationsForSelectedVariantInput","createMediaLocationsForSelectedVariantInput","getMediaLocationsForSelectedVariantAction","AsyncResult","_productResult$produc","getMediaLocationsForSelectedVariantActionDataAction","ListItemType","ListInput","documentId","title","description","shortDescription","backgroundColor","foregroundColor","images","items","productItems","itemsCount","skipCount","DocumentId","ItemsCount","ItemsPerPage","SkipCount","Title","Description","ShortDescription","BackgroundColor","ForegroundColor","Images","Items","ProductItems","getImages","resultImageList","image","href","imageItem","altText","width","height","getSubListItem","sitePathOfRequest","imageList","fields","content","sublistHref","listName","_name","Href","getSitePath","getListDataDataAction","inputArray","GetProducts","listitem","listData","pageData","list","_id","getInutListData","listItems","parentImageList","getItemsPerPage","getSkipCount","sum","type","clonedList","productItem","ProductAvailabilitiesForSelectedVariantInput","createProductAvailabilitiesForSelectedVariantInput","getProductAvailabilitiesForSelectedVariantAction","shippingSearchCriteria","pickupSearchCriteria","shippingAvailability","shippingInventory","deliveryType","pickupAvailability","pickupInventory","mergeProductWarehouseToProductAvailabities","productAvailable","getProductAvailabilitiesForSelectedVariantActionDataAction","GetOrganizationWideOrderHistoryInput","getOrganizationWideOrderHistoryDataAction","getOrderHistoryAsync","_context$apiSettings","createCategoriesInput","CategoriesDataActions","getCategoriesAsync","getCategoryActionDataAction","UpdateOrderTemplateInput","getLinesInput","getPaginatedOrderTemplateLines","linesToUpdate","lineToUpdate","updatedLines","updateProductListLinesAsync","updatedLine","updateOrderTemplateInput","updateAddressHandler","updateAddressActionDataAction","AddressManagementInput","operationHandler","createReadAsync","addAddressHandler","addAddressActionDataAction","args","rnr","getRnrAuthEndpointId","endpoint","proxyUrl","endsWith","substring","querySettingsProxy","createSearchByTextInput","SearchConfigurationInput","getSearchConfigurationAsync","AttributesForSelectedVariantInput","getAttributesForSelectedVariantAction","getAttributeValuesAsync","getPrices","getRatings","getFullOrderTemplatesActionDataAction","orderTemplates","inputLinesRequests","inputLinesResponses","productLinesResponse","AddItemToProductListInput","addItemToProductListActionDataAction","addItemToProductListInput","updatePrimaryAddressActionDataAction","_customer$Addresses","setPrimaryAddress","primaryAddresses","addresses","addr"],"mappings":"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","file":"static/js/5.e5f514874d9c421b6af0.chunk.js","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IProductDimensionsWithAvailabilitiesFull } from '@msdyn365-commerce/commerce-entities';\nimport {\n CacheType,\n createObservableDataAction,\n getCatalogId,\n IAction,\n IActionContext,\n IActionInput,\n IAny,\n ICreateActionContext,\n IGeneric,\n IRequestContext\n} from '@msdyn365-commerce/core';\nimport { ProductDimensionAvailabilitySearchCriteria, ProductsDataActions } from '@msdyn365-commerce/retail-proxy';\n\nimport { ArrayExtensions, getSelectedProductIdFromActionInput } from './utilities';\nimport { createInventoryAvailabilitySearchCriteria } from './utilities/product-inventory-utils';\nimport { QueryResultSettingsProxy } from './utilities/QueryResultSettingsProxy';\n\n/**\n * Product dimension with availability Input.\n */\nexport class ProductDimensionsWithAvailabilitiesInput implements IActionInput {\n public productId: number;\n\n public channelId: number;\n\n public catalogId?: number;\n\n public constructor(productId: number, channelId: number, requestContext?: IRequestContext) {\n this.productId = productId;\n this.channelId = channelId;\n\n if (requestContext) {\n this.catalogId = getCatalogId(requestContext);\n }\n }\n\n /**\n * Cache key.\n * @returns String.\n */\n public getCacheKey: () => string = () => 'ProductDimensionsWithAvailabilities';\n\n /**\n * Cache object type.\n * @returns String.\n */\n public getCacheObjectType: () => string = () => 'ProductDimensionsWithAvailabilities';\n\n /**\n * Cache type.\n * @returns String.\n */\n public dataCacheType = (): CacheType => 'none';\n}\n\n/**\n * Create input method for the get-product-dimension-with-availability data action.\n * @param inputData - The input data passed to the createInput method.\n * @returns - The input for the data action.\n */\nexport const createProductDimensionsWithAvailabilitiesInput = (\n inputData: ICreateActionContext>\n): ProductDimensionsWithAvailabilitiesInput => {\n const productId = getSelectedProductIdFromActionInput(inputData);\n\n if (productId) {\n return new ProductDimensionsWithAvailabilitiesInput(\n +productId,\n +inputData.requestContext.apiSettings.channelId,\n inputData.requestContext\n );\n }\n throw new Error('Unable to create ProductDimensionsWithAvailabilitiesInput, no productId found on module config or query');\n};\n\n/**\n * Action method for the getProductDimensionsWithAvailabilities Data Action.\n * @param input - Input for the data action.\n * @param context - Action context.\n * @returns Product dimensions with availabilities.\n */\nexport async function getProductDimensionsWithAvailabilitiesAction(\n input: ProductDimensionsWithAvailabilitiesInput,\n context: IActionContext\n): Promise {\n const activeProducts = ArrayExtensions.validValues(\n await ProductsDataActions.getByIdsAsync(\n {\n callerContext: context,\n queryResultSettings: QueryResultSettingsProxy.getPagingFromInputDataOrDefaultValue(context)\n },\n input.channelId,\n [input.productId],\n null,\n input.catalogId ?? 0\n )\n );\n\n if (!ArrayExtensions.hasElements(activeProducts)) {\n return [];\n }\n\n const activeProduct = activeProducts[0];\n\n if (!ArrayExtensions.hasElements(activeProduct.Dimensions)) {\n return [];\n }\n\n const promises = activeProduct.Dimensions.map(dimension => {\n const shippingInventoryConfiguration = createInventoryAvailabilitySearchCriteria(context, [], true, undefined, undefined);\n const searchCriteria: ProductDimensionAvailabilitySearchCriteria = {\n RequestedDimensionTypeValue: dimension.DimensionTypeValue,\n MatchingDimensionValues: [],\n DefaultWarehouseOnly: shippingInventoryConfiguration.DefaultWarehouseOnly,\n FilterByChannelFulfillmentGroup: shippingInventoryConfiguration.FilterByChannelFulfillmentGroup,\n DeliveryModeTypeFilterValue: shippingInventoryConfiguration.DeliveryModeTypeFilterValue,\n CatalogId: input.catalogId\n };\n\n const dimensionValuesPromise = ProductsDataActions.getDimensionValuesWithEstimatedAvailabilitiesAsync(\n { callerContext: context, queryResultSettings: QueryResultSettingsProxy.getPagingFromInputDataOrDefaultValue(context) },\n activeProduct.MasterProductId ? activeProduct.MasterProductId : activeProduct.RecordId,\n searchCriteria\n );\n const fullDimensionPromise = dimensionValuesPromise.then(dimensionValues => {\n const fullDimension: IProductDimensionsWithAvailabilitiesFull = {\n ...dimension,\n dimensionValuesWithInventory: dimensionValues\n };\n return fullDimension;\n });\n\n return fullDimensionPromise;\n });\n\n // eslint-disable-next-line no-return-await -- existing code\n return await Promise.all(promises);\n}\n\n/**\n * The GetProductDimensionsWithAvailabilitiesAction\n * Gets the available product dimensions for the product via the getDimensionValueswithEstimatedAvailibilities RetailServer API.\n */\nexport const getProductDimensionsWithAvailabilities = createObservableDataAction({\n id: '@msdyn365-commerce-modules/retail-actions/get-product-dimensions-with-availabilities',\n action: getProductDimensionsWithAvailabilitiesAction as IAction,\n input: createProductDimensionsWithAvailabilitiesInput\n});\n\nexport default getProductDimensionsWithAvailabilities;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport msdyn365Commerce, {\n generateImageUrl as generateImageUrlFromSdk,\n IAny,\n ICommerceApiSettings,\n ICoreContext,\n ICreateActionContext,\n IGeneric,\n IRequestContext\n} from '@msdyn365-commerce/core';\nimport {\n AsyncResult,\n AttributeValue,\n CartLine,\n ChannelInventoryConfiguration,\n CommerceListLine,\n ProductDimension,\n ProductDimensionType,\n ProductSearchResult,\n QueryResultSettings,\n SimpleProduct\n} from '@msdyn365-commerce/retail-proxy';\n\nimport { ProductDetailsCriteria } from '../get-full-products';\nimport { IKeyValuePair } from './data-structures';\nimport { ArrayExtensions, StringExtensions } from './extensions';\nimport { parseSearchData } from './input-data-parser';\nimport { InventoryLevels } from './product-inventory-information';\n\nexport const wrapInResolvedAsyncResult = (input: T | null | undefined): AsyncResult => {\n return >{\n status: 'SUCCESS',\n result: input,\n metadata: {}\n };\n};\n\nexport const wrapInRejectedAsyncResult = (input: T | null | undefined): AsyncResult => {\n return >{\n status: 'FAILED',\n result: input,\n metadata: {}\n };\n};\n\nexport const buildQueryResultSettings = (inputData: ICreateActionContext, IGeneric>): QueryResultSettings => {\n try {\n const searchInputData = parseSearchData(inputData);\n const search = searchInputData.q;\n if (!search) {\n throw new Error('Query string ?q={searchText} is needed for search actions.');\n }\n const top = (searchInputData.maxItems && Number(searchInputData.maxItems)) || searchInputData.top;\n return { Paging: { Top: top, Skip: searchInputData.skip } };\n } catch {\n return {};\n }\n};\n\n/**\n * Utility function to extract the active productId in the following priority:\n * First query param (productId), then UrlToken (itemId), then module config.\n * @param inputData - The Action Input data.\n * @returns Productid or undefined.\n */\nexport const getSelectedProductIdFromActionInput = (inputData: ICreateActionContext>): string | undefined => {\n const context = inputData.requestContext;\n if (context.query?.productId) {\n return context.query.productId;\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- Exsiting code.\n } else if (\n context.urlTokens &&\n inputData.requestContext.urlTokens.itemId &&\n inputData.requestContext.urlTokens.pageType === 'Product'\n ) {\n return context.urlTokens.itemId;\n } else if (inputData && inputData.config && inputData.config.productId) {\n return inputData.config.productId;\n }\n return undefined;\n};\n\n/**\n * Generates a Image URL based on data return from retail server.\n * @param imageUrl The image url returned by Retail Server.\n * @param ctx The request context.\n * @param apiSettings\n */\nexport const generateImageUrl = (imageUrl: string | undefined, apiSettings: ICommerceApiSettings): string | undefined => {\n return generateImageUrlFromSdk(apiSettings, imageUrl);\n};\n\n/**\n * Represents app configuration for dimensions.\n */\nexport interface IDimensionsConfig {\n dimensionsAsSwatchType?: DimensionTypes[];\n dimensionsInProductCard?: DimensionTypes[];\n inventoryLevel?: InventoryLevels;\n dimensionToPreSelectInProductCard?: DimensionTypes;\n enableStockCheck?: boolean;\n warehouseAggregation?: string;\n}\n\n/**\n * Represents app configuration for dimensions.\n */\nexport interface IDimensionsApp {\n config: IDimensionsConfig;\n}\n\n/**\n * Represents product dimension types.\n */\nexport enum DimensionTypes {\n none = 'none',\n color = 'color',\n configuration = 'configuration',\n size = 'size',\n style = 'style'\n}\n\n/**\n * Defines display configuration types.\n */\nexport enum DimensionSwatchDisplayTypes {\n default = 'default',\n productCard = 'productCard'\n}\n\n/**\n * Checks if rendering the particular dimensions is allowed.\n * @param dimensionType - Dimension to be displayed.\n * @param context - Core application context.\n * @param displayType - The swatch location, the component from which it comes from.\n * @returns Updates the state with new product page url.\n */\nexport const checkIfShouldDisplayAsSwatch = (\n dimensionType: DimensionTypes,\n context: ICoreContext,\n displayType: DimensionSwatchDisplayTypes = DimensionSwatchDisplayTypes.default\n): boolean => {\n // Additional checks for the product card since it has a separate config setting.\n if (displayType === DimensionSwatchDisplayTypes.productCard) {\n const dimensionsToDisplayOnProductCard = context.app.config.dimensionsInProductCard;\n if (\n !ArrayExtensions.hasElements(dimensionsToDisplayOnProductCard) ||\n dimensionsToDisplayOnProductCard.includes(DimensionTypes.none) ||\n !dimensionsToDisplayOnProductCard.includes(dimensionType)\n ) {\n return false;\n }\n }\n\n const dimensionsToDisplayAsSwatch = context.app.config.dimensionsAsSwatchType;\n return (\n ArrayExtensions.hasElements(dimensionsToDisplayAsSwatch) &&\n !dimensionsToDisplayAsSwatch.includes(DimensionTypes.none) &&\n dimensionsToDisplayAsSwatch.includes(dimensionType)\n );\n};\n\n/**\n * Generates an image URL for a swatch.\n * @param imageUrl - The image url returned by Retail Server.\n * @param apiSettings - The request context.\n * @returns Full image url.\n */\nexport const generateSwatchImageUrl = (imageUrl: string, apiSettings: ICommerceApiSettings): string => {\n if (imageUrl.startsWith('http')) {\n return imageUrl;\n }\n\n return apiSettings.baseImageUrl + encodeURIComponent(imageUrl);\n};\n\n/**\n * Generates a Image URL for a product based on data return from retail server.\n * @param product The Product returned by Retail Server.\n * @param ctx The request context.\n * @param apiSettings\n */\nexport const generateProductImageUrl = (\n product: SimpleProduct | ProductSearchResult,\n apiSettings: ICommerceApiSettings\n): string | undefined => {\n return generateImageUrl(product.PrimaryImageUrl, apiSettings);\n};\n\n/**\n * Creates a CartLine object from the passed data.\n * @param product The product.\n * @param quantity The quantity.\n * @param catalogId The catalog.\n */\nexport const buildCartLine = (product: SimpleProduct, quantity?: number, catalogId?: number): CartLine => {\n return {\n CatalogId: catalogId || 0,\n Description: product.Description,\n\n // TODO: Investigate this value and what it represents\n EntryMethodTypeValue: 3,\n ItemId: product.ItemId,\n ProductId: product.RecordId,\n Quantity: quantity || 1,\n TrackingId: '',\n UnitOfMeasureSymbol: product.DefaultUnitOfMeasure\n };\n};\n\n/**\n * Creates a CommerceListLine (also know as WishlistLine) object from the passed data.\n * @param productId The RecordId of the Product to be added.\n * @param customerId The account number of the customer.\n * @param wishlistId The Id of the commerce list.\n */\nexport const buildWishlistLine = (productId: number, customerId: string, wishlistId: number): CommerceListLine => {\n return {\n CommerceListId: wishlistId,\n ProductId: productId,\n CustomerId: customerId\n };\n};\n\n/**\n * Utility function to prepare the product details criteria before getting full product:\n * @param inputData The Action Input data\n */\nexport const getProductDetailsCriteriaFromActionInput = (inputData: ICreateActionContext>): ProductDetailsCriteria => {\n if (inputData && inputData.config) {\n return {\n getPrice: !inputData.config.hidePrice,\n getRating: !inputData.config.hideRating\n };\n }\n return {\n getPrice: true,\n getRating: true\n };\n};\n\n/**\n * Transforms search text into the expected 'search terms' format, expected by refiner APIs.\n * @param searchText Free-form text used for searching for products or categories of products.\n */\nexport const ensureSearchTextIsFormedProperly = (searchText: string): string => {\n const prefix = searchText.startsWith(\"'\") ? '' : \"'\";\n const suffix = searchText.endsWith(\"'\") ? '' : \"'\";\n return `${prefix}${searchText}${suffix}`;\n};\n\nexport const ensureSafeSearchText = (searchText: string): string => {\n return searchText.replace(/[^\\d\\sA-Za-z]+/g, '');\n};\n\n/**\n * @deprecated Please use `generateCacheKey` instead.\n */\nexport const buildCacheKey = (base: string, apiSettings: ICommerceApiSettings, locale?: string): string => {\n return `${base}-chanId:${apiSettings.channelId}-catId:${apiSettings.catalogId}${locale ? `-${locale}` : ''}`;\n};\n\n/**\n * Represents a list of keys for general parameters used in the cache key.\n */\nenum DefaultCacheKeyParameterKeys {\n channelIdKey = 'CHANNELID',\n appSettingsCatalogIdKey = 'APPSETTINGSCATALOGID'\n}\n\n/**\n * Generates a key from set of arguments\n * @param apiSettings - Request context API settings.\n * @param entries - Cache key parameters.\n * @returns String which represents the cache key.\n */\nexport const generateCacheKey = (\n apiSettings?: ICommerceApiSettings,\n ...entries: IKeyValuePair[]\n): string => {\n const parsedEntries: IKeyValuePair[] = entries.map(pair => {\n return { key: pair.key.toLocaleUpperCase(), value: pair.value };\n });\n\n const cacheKeyArgumentsKeys = parsedEntries.map(pair => pair.key);\n\n if (apiSettings) {\n if (!cacheKeyArgumentsKeys.includes(DefaultCacheKeyParameterKeys.channelIdKey)) {\n parsedEntries.push({ key: DefaultCacheKeyParameterKeys.channelIdKey, value: apiSettings.channelId });\n }\n\n if (!cacheKeyArgumentsKeys.includes(DefaultCacheKeyParameterKeys.appSettingsCatalogIdKey) && apiSettings.catalogId) {\n parsedEntries.push({ key: DefaultCacheKeyParameterKeys.appSettingsCatalogIdKey, value: apiSettings.catalogId });\n }\n }\n\n return parsedEntries\n .sort((a, b) => a.key.localeCompare(b.key))\n .map(pair => `${pair.key}:{${pair.value}}`)\n .join('-');\n};\n\nexport const buildCacheKeyWithUrlTokens = (base: string, requestContext: IRequestContext): string => {\n const urlTokens = requestContext.urlTokens;\n const defaultCacheKey = buildCacheKey(base, requestContext.apiSettings, requestContext.locale);\n return urlTokens ? `${defaultCacheKey}-${urlTokens.itemId}-${urlTokens.recordId}-${urlTokens.pageType}` : defaultCacheKey;\n};\n\n/**\n * Generates a key from set of arguments as inputs.\n *\n * @param args Argument list of pivots to generate key from.\n * @param handler Handler function for null/undefined values.\n */\n\ntype TKeyTypes = string | number | boolean | null | undefined;\ninterface IGenerateKeyOptions {\n separator?: string;\n handler?(input: null | undefined): string;\n}\nexport const generateKey = (args: TKeyTypes[], options?: IGenerateKeyOptions): string => {\n const { handler, separator }: IGenerateKeyOptions = { ...{ separator: '-', handler: undefined }, ...(options || {}) };\n return args\n .map(arg => {\n if (arg === null || arg === undefined) {\n if (handler) {\n return handler(arg);\n }\n }\n return arg;\n })\n .join(separator);\n};\n\n/**\n * Gets the fall back image url for a variant image.\n * @param itemId Item id of a product.\n * @param apiSettings Api setting from request context.\n */\nexport const getFallbackImageUrl = (itemId: string | undefined, apiSettings: ICommerceApiSettings): string | undefined => {\n if (!itemId) {\n return '';\n }\n\n const parsedItemId = itemId.trim().split(' ')[0];\n\n const productUrl = `Products/${parsedItemId}_000_001.png`;\n return generateImageUrl(productUrl, apiSettings);\n};\n\n/**\n * Converts retail proxy product dimension type to display dimension type.\n * @param productDimensionType - Product dimension type from retail proxy.\n * @returns Local dimension type.\n */\nexport const convertProductDimensionTypeToDimensionTypes = (productDimensionType: ProductDimensionType): DimensionTypes => {\n switch (productDimensionType) {\n case ProductDimensionType.Color:\n return DimensionTypes.color;\n case ProductDimensionType.Configuration:\n return DimensionTypes.configuration;\n case ProductDimensionType.Size:\n return DimensionTypes.size;\n case ProductDimensionType.Style:\n return DimensionTypes.style;\n default:\n return DimensionTypes.none;\n }\n};\n\n/**\n * Converts display dimension type to retail proxy product dimension type.\n * @param dimensionType - Local dimension type.\n * @returns Product dimension type from retail proxy.\n */\nexport const convertDimensionTypeToProductDimensionType = (dimensionType: DimensionTypes): ProductDimensionType => {\n switch (dimensionType) {\n case DimensionTypes.color:\n return ProductDimensionType.Color;\n case DimensionTypes.configuration:\n return ProductDimensionType.Configuration;\n case DimensionTypes.size:\n return ProductDimensionType.Size;\n case DimensionTypes.style:\n return ProductDimensionType.Style;\n default:\n return ProductDimensionType.None;\n }\n};\n\n/**\n * Sets dimensions to url.\n * @param inputUrl - Url to update.\n * @param productDimensions - Dimensions to set.\n */\nexport const setDimensionValuesToQuery = (inputUrl: URL, productDimensions: ProductDimension[]): void => {\n for (const dimension of productDimensions) {\n const dimensionValue = dimension.DimensionValue?.Value;\n if (!StringExtensions.isNullOrWhitespace(dimensionValue)) {\n inputUrl.searchParams.set(convertProductDimensionTypeToDimensionTypes(dimension.DimensionTypeValue), dimensionValue!);\n }\n }\n\n if (msdyn365Commerce.isBrowser) {\n window.history.replaceState(window.history.state, '', inputUrl.toString().replace(inputUrl.host, window.location.host));\n }\n};\n\n/**\n * Retrieves dimension value stored in url.\n * @param urlParameters - Url parameters.\n * @param productDimensionType - The dimension type to retrieve.\n * @returns Product dimension item.\n */\nconst parseDimensionFromUrl = (\n urlParameters: URLSearchParams,\n productDimensionType: ProductDimensionType\n): ProductDimension | undefined => {\n const localDimensionType = convertProductDimensionTypeToDimensionTypes(productDimensionType);\n const value = urlParameters.get(localDimensionType);\n if (!value) {\n return undefined;\n }\n return {\n DimensionTypeValue: productDimensionType,\n DimensionValue: {\n RecordId: 0,\n Value: value\n }\n };\n};\n\n/**\n * Retrieves all dimensions from URL.\n * @param urlParameters - Url parameters.\n * @returns Product dimensions stored in url.\n */\nconst parseDimensionsFromUrl = (urlParameters: URLSearchParams): ProductDimension[] => {\n const dimensionsToParse: ProductDimensionType[] = [\n ProductDimensionType.Color,\n ProductDimensionType.Configuration,\n ProductDimensionType.Size,\n ProductDimensionType.Style\n ];\n const parsedDimensions = dimensionsToParse.map(dimension => parseDimensionFromUrl(urlParameters, dimension));\n return ArrayExtensions.validValues(parsedDimensions);\n};\n\n/**\n * Utility function to extract the dimension values from input url querystring.\n * @param inputUrl - The request url.\n * @returns The selected dimension values.\n */\nexport const getDimensionValuesFromQuery = (inputUrl: URL): ProductDimension[] => {\n const urlWithIgnoredCase = new URL(inputUrl.toString().toLocaleLowerCase());\n const urlParameters = urlWithIgnoredCase.searchParams;\n const dimensions: ProductDimension[] = parseDimensionsFromUrl(urlParameters);\n return dimensions;\n};\n\n/**\n * Get attribute values by channel inventory configuration.\n * @param attributeValues - The attributeValues.\n * @param channelInventoryConfiguration - The channelInventoryConfiguration.\n * @returns The attributeValues filter by channel inventory configuration.\n */\nexport const getAttributeValuesByConfiguration = (\n attributeValues: AttributeValue[] | null,\n channelInventoryConfiguration: ChannelInventoryConfiguration | null\n): AttributeValue[] => {\n if (!attributeValues) {\n return [];\n }\n if (!channelInventoryConfiguration) {\n return attributeValues;\n }\n\n return attributeValues.filter(\n attribute =>\n attribute.RecordId !== channelInventoryConfiguration.InventoryProductAttributeRecordId &&\n attribute.RecordId !== channelInventoryConfiguration.ProductAvailabilitySortableAttributeRecordId\n );\n};\n\n/**\n * Utility function to remove domain querystring parameter from url.\n * @param inputUrl - The request url.\n * @returns The yrl after dropping domain querystring.\n */\nexport const removeDomainQspFromUrl = (inputUrl: string, requestContext: IRequestContext): string => {\n if (requestContext?.features && requestContext.features.remove_domain_qsp) {\n const Url = new URL(inputUrl);\n const urlParams: URLSearchParams = new URLSearchParams(Url.search);\n if (urlParams.has('domain')) {\n urlParams.delete('domain');\n }\n Url.search = urlParams.toString();\n return Url.toString();\n }\n return inputUrl;\n};\n\n/**\n * Utility function to validate catalog Id for B2B user .\n * @param catalogId - The catalog.\n */\nexport const validateCatalogId = (catalogId?: number | undefined) => {\n if (catalogId === -1) {\n throw new Error(\n 'Catalog id is -1. It means no valid catalogs were found for the user. Make sure the user has some valid catalogs assigned.'\n );\n }\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IProductDimensionsWithAvailabilitiesFull } from '@msdyn365-commerce/commerce-entities';\nimport {\n CacheType,\n createObservableDataAction,\n getCatalogId,\n IAction,\n IActionContext,\n IActionInput,\n IAny,\n ICreateActionContext,\n IGeneric,\n IRequestContext\n} from '@msdyn365-commerce/core';\nimport {\n BypassCache,\n ProductDimension,\n ProductDimensionAvailabilitySearchCriteria,\n ProductsDataActions,\n SimpleProduct\n} from '@msdyn365-commerce/retail-proxy';\n\nimport { ArrayExtensions } from './utilities';\nimport { createInventoryAvailabilitySearchCriteria } from './utilities/product-inventory-utils';\nimport { QueryResultSettingsProxy } from './utilities/QueryResultSettingsProxy';\nimport { generateProductImageUrl, getDimensionValuesFromQuery, getSelectedProductIdFromActionInput } from './utilities/utils';\n\n/**\n * Stores data about the selected product.\n */\nexport interface ISelectedProduct extends SimpleProduct {\n productVariant?: SimpleProduct;\n}\n\n/**\n * Get selected variant action input class.\n */\nexport class SelectedVariantInput implements IActionInput {\n public productId: number;\n\n public channelId: number;\n\n public matchingDimensionValues?: ProductDimension[];\n\n public bypassCache?: BypassCache;\n\n public catalogId?: number;\n\n public constructor(\n productId: number,\n channelId: number,\n matchingDimensionValues?: ProductDimension[],\n bypassCache?: BypassCache,\n requestContext?: IRequestContext\n ) {\n this.productId = productId;\n this.channelId = channelId;\n this.matchingDimensionValues = matchingDimensionValues;\n this.bypassCache = bypassCache;\n\n if (requestContext) {\n this.catalogId = getCatalogId(requestContext);\n }\n }\n\n /**\n * Cache key.\n * @returns String.\n */\n public getCacheKey: () => string = () => 'SelectedVariant';\n\n /**\n * Cache object type.\n * @returns String.\n */\n public getCacheObjectType: () => string = () => 'SimpleProduct';\n\n /**\n * Cache type.\n * @returns String.\n */\n public dataCacheType = (): CacheType => 'none';\n}\n\n/**\n * CreateInput method for the getSelectedVariant data action.\n * @param inputData - The input data passed to the createInput method.\n * @returns The input for the ata action getSelectedVariantNewAction.\n */\nconst createInput = (inputData: ICreateActionContext>): SelectedVariantInput => {\n const productId = getSelectedProductIdFromActionInput(inputData);\n\n if (productId) {\n return new SelectedVariantInput(\n +productId,\n +inputData.requestContext.apiSettings.channelId,\n undefined,\n undefined,\n inputData.requestContext\n );\n }\n throw new Error('Unable to create SelectedVariantInput, no productId found on module config or query');\n};\n\n/**\n * Checks if given product has any unmatched dimensions.\n * Modifies product entity to use matched dimension values.\n * @param product - The product to analyze and modify.\n * @param matchingDimensionValues - Matched dimensions.\n * @returns True if has any unmatched dimension, false if all dimensions are specified.\n */\nconst checkIfHasUnmatchedDimensions = (product: SimpleProduct, matchingDimensionValues: ProductDimension[]): boolean => {\n let hasUnmatchedDimension: boolean = false;\n if (product.Dimensions) {\n product.Dimensions = product.Dimensions.map(dimension => {\n return { ...dimension };\n });\n for (const dimension of product.Dimensions) {\n const matchedTargetDimension = matchingDimensionValues.find(\n targetDimension => targetDimension.DimensionTypeValue === dimension.DimensionTypeValue\n );\n\n if (matchedTargetDimension) {\n dimension.DimensionValue = matchedTargetDimension.DimensionValue;\n } else {\n hasUnmatchedDimension = true;\n }\n }\n }\n return hasUnmatchedDimension;\n};\n\n/**\n * Retrieves product dimensions with availabilities.\n * @param product - Product for which the dimensions need to be retrieved.\n * @param matchingDimensionValues - Selected dimensions - filter criteria for the dimensions API.\n * @param context - Action context.\n * @param catalogId - Catalog id.\n * @returns Array of dimensions.\n */\nconst getFullDimensions = async (\n product: SimpleProduct,\n matchingDimensionValues: ProductDimension[],\n context: IActionContext,\n catalogId?: number\n) => {\n let fullDimensions: IProductDimensionsWithAvailabilitiesFull[] = [];\n const fullDimensionPromises = (product.Dimensions ?? []).map(dimension => {\n const shippingInventoryConfiguration = createInventoryAvailabilitySearchCriteria(context, [], true, undefined, undefined);\n const searchCriteria: ProductDimensionAvailabilitySearchCriteria = {\n RequestedDimensionTypeValue: dimension.DimensionTypeValue,\n MatchingDimensionValues: matchingDimensionValues,\n DefaultWarehouseOnly: shippingInventoryConfiguration.DefaultWarehouseOnly,\n FilterByChannelFulfillmentGroup: shippingInventoryConfiguration.FilterByChannelFulfillmentGroup,\n DeliveryModeTypeFilterValue: shippingInventoryConfiguration.DeliveryModeTypeFilterValue,\n CatalogId: catalogId\n };\n const dimensionValuesPromise = ProductsDataActions.getDimensionValuesWithEstimatedAvailabilitiesAsync(\n { callerContext: context, queryResultSettings: QueryResultSettingsProxy.getPagingFromInputDataOrDefaultValue(context) },\n product.MasterProductId ? product.MasterProductId : product.RecordId,\n searchCriteria\n );\n\n return dimensionValuesPromise.then(dimensionValues => {\n const fullDimension: IProductDimensionsWithAvailabilitiesFull = {\n ...dimension,\n dimensionValuesWithInventory: dimensionValues\n };\n return fullDimension;\n });\n });\n fullDimensions = await Promise.all(fullDimensionPromises);\n return fullDimensions;\n};\n\n/**\n * Retrieves product variant for the given input or undefined if not found.\n * @param input - Action input.\n * @param context - Action context.\n * @param fullDimensions - Product dimensions with availabilities.\n * @returns A product variant that is available or undefined.\n */\nconst getProductVariant = async (\n input: SelectedVariantInput,\n context: IActionContext,\n fullDimensions: IProductDimensionsWithAvailabilitiesFull[]\n) => {\n let productVariant: SimpleProduct | undefined;\n if (\n ArrayExtensions.hasElements(fullDimensions) &&\n ArrayExtensions.hasElements(fullDimensions[0].dimensionValuesWithInventory) &&\n ArrayExtensions.hasElements(fullDimensions[0].dimensionValuesWithInventory[0].ProductIds)\n ) {\n const variantProductId = fullDimensions[0].dimensionValuesWithInventory[0].ProductIds[0];\n const result = await ProductsDataActions.getByIdsAsync(\n {\n callerContext: context,\n queryResultSettings: QueryResultSettingsProxy.getPagingFromInputDataOrDefaultValue(context),\n bypassCache: input.bypassCache\n },\n input.channelId,\n [variantProductId],\n null,\n input.catalogId ?? 0\n );\n productVariant = result[0];\n productVariant = { ...productVariant };\n const variantImageUrl = generateProductImageUrl(productVariant, context.requestContext.apiSettings);\n\n if (variantImageUrl) {\n productVariant.PrimaryImageUrl = variantImageUrl;\n }\n }\n\n return productVariant;\n};\n\n/**\n * Action method for the getSelectedVariant data action.\n * @param input - The action input class.\n * @param context - The action context.\n * @returns Simple product.\n */\nasync function getSelectedVariantAction(input: SelectedVariantInput, context: IActionContext): Promise {\n const matchingDimensionValues = input.matchingDimensionValues ?? getDimensionValuesFromQuery(context.requestContext.url.requestUrl);\n\n const result = await ProductsDataActions.getByIdsAsync(\n {\n callerContext: context,\n queryResultSettings: QueryResultSettingsProxy.getPagingFromInputDataOrDefaultValue(context),\n bypassCache: input.bypassCache\n },\n input.channelId,\n [input.productId],\n null,\n input.catalogId ?? 0\n );\n let product = result[0];\n\n // Need to dereference this before editing it. Otherwise we might not\n // properly get the mobx events because if things aren't properly observable\n // they won't fire when you set them, and then if you don't deref the value in\n // the cache will match the value when you try to save it, so it won't detect any\n // changes there either\n product = { ...product };\n const hasUnmatchedDimension = checkIfHasUnmatchedDimensions(product, matchingDimensionValues);\n\n const newImageUrl = generateProductImageUrl(product, context.requestContext.apiSettings);\n\n if (newImageUrl) {\n product.PrimaryImageUrl = newImageUrl;\n }\n\n const fullDimensions: IProductDimensionsWithAvailabilitiesFull[] = await getFullDimensions(\n product,\n matchingDimensionValues,\n context,\n input.catalogId\n );\n\n // Retrieve product variants only if matching dimensions are provided.\n const productVariant: SimpleProduct | undefined = ArrayExtensions.hasElements(matchingDimensionValues)\n ? await getProductVariant(input, context, fullDimensions)\n : undefined;\n\n // Update dimension value back to the one that comes from API since the URL query might have a different format for the dimension values.\n if (productVariant?.Dimensions && product.Dimensions) {\n for (const dimension of product.Dimensions) {\n const matchedTargetDimensionFromApi = productVariant.Dimensions.find(\n targetDimension => targetDimension.DimensionTypeValue === dimension.DimensionTypeValue\n );\n const matchedTargetDimensionFromSearch = matchingDimensionValues.find(\n targetDimension => targetDimension.DimensionTypeValue === dimension.DimensionTypeValue\n );\n\n if (matchedTargetDimensionFromSearch && matchedTargetDimensionFromApi) {\n dimension.DimensionValue = matchedTargetDimensionFromApi.DimensionValue;\n }\n }\n }\n\n if (!hasUnmatchedDimension && ArrayExtensions.hasElements(matchingDimensionValues) && productVariant) {\n return productVariant;\n }\n\n const selectedProduct: ISelectedProduct = product;\n selectedProduct.productVariant = productVariant;\n return selectedProduct;\n}\n\n/**\n * The complete getSelectedVariant data action.\n */\nexport const getSelectedVariantActionDataAction = createObservableDataAction({\n id: '@msdyn365-commerce-modules/retail-actions/get-selected-variant',\n action: getSelectedVariantAction as IAction,\n input: createInput\n});\n\nexport default getSelectedVariantActionDataAction;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { createObservableDataAction, IAction, ICreateActionContext } from '@msdyn365-commerce/core';\nimport { retailAction } from '@msdyn365-commerce/retail-proxy/dist';\nimport { createGetByCustomerInput } from '@msdyn365-commerce/retail-proxy/dist/DataActions/CommerceListsDataActions.g';\nimport { CommerceList } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\n\nconst createWishlistInput = (inputData: ICreateActionContext) => {\n if (inputData.requestContext && inputData.requestContext.user && inputData.requestContext.user.isAuthenticated) {\n return createGetByCustomerInput({}, null);\n }\n\n throw new Error('[get-wishlist-by-customer-id] Unable to create input for getWishlists');\n};\n\n/**\n * Get Org Unit Configuration Data Action.\n */\nexport const retailActionDataAction = createObservableDataAction({\n id: '@msdyn365-commerce-modules/retail-actions/get-wishlist-by-customer-id',\n action: >retailAction,\n input: createWishlistInput\n});\n\nexport default retailActionDataAction;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { createObservableDataAction, IAction, IActionContext, IActionInput, IAny, ICreateActionContext } from '@msdyn365-commerce/core';\nimport { Address, Customer } from '@msdyn365-commerce/retail-proxy';\n\nimport { createAddressManagementInput, doAddressManagementOperation, IAddressManagementInput } from './add-address';\n\nexport function deleteAddressHandler(customer: Customer, address: Address): Customer {\n customer.Addresses = customer.Addresses || [];\n customer.Addresses = [...customer.Addresses.filter(cur => cur.RecordId !== address.RecordId)];\n return customer;\n}\n\nexport async function deleteAddressAction(input: IAddressManagementInput, ctx: IActionContext): Promise {\n return doAddressManagementOperation(input, ctx, deleteAddressHandler);\n}\n\n/**\n * The deleteAddress data action\n * Calls the read RetailServer API to get information about a customer\n * Removes all address information from the retireved customer, and\n * then updates that customer via the update RetailServer API.\n */\nexport const deleteAddressActionDataAction = createObservableDataAction({\n id: '@msdyn365-commerce-modules/retail-actions/delete-address',\n action: >deleteAddressAction,\n input: <(args: ICreateActionContext) => IActionInput>(createAddressManagementInput),\n isBatched: false\n});\n\nexport default deleteAddressActionDataAction;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport {\n CacheType,\n createObservableDataAction,\n IAction,\n IActionContext,\n IActionInput,\n IAny,\n ICommerceApiSettings,\n ICreateActionContext,\n IGeneric\n} from '@msdyn365-commerce/core';\nimport { getAttributeDefinitionsAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/StoreOperationsDataActions.g';\nimport { AttributeDefinition, AttributeDefinitionCriteria } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\n\nimport { buildCacheKey } from './utilities/utils';\n\n/**\n * Input class for get attribute definitions data action.\n */\nexport class GetAttributeDefinitionsInput implements IActionInput {\n public attributeDefinitionCriteria?: AttributeDefinitionCriteria;\n\n private readonly apiSettings: ICommerceApiSettings;\n\n constructor(apiSettings: ICommerceApiSettings, attributeDefinitionCriteria?: AttributeDefinitionCriteria) {\n this.attributeDefinitionCriteria = attributeDefinitionCriteria;\n this.apiSettings = apiSettings;\n }\n\n public getCacheKey = () => buildCacheKey('AttributeDefinitions', this.apiSettings);\n\n public getCacheObjectType = () => 'CustomerAttribute';\n\n public dataCacheType = (): CacheType => 'request';\n}\n\n/**\n * Creates the input required to make the retail api call.\n * @param inputData\n */\nconst createInput = (inputData: ICreateActionContext>): GetAttributeDefinitionsInput => {\n const { apiSettings, channel } = inputData.requestContext;\n if (!channel || !channel.CustomerAttributeGroupId) {\n throw new Error('[getAttributeDefinitions][createInput]: Customer attribute group id is not found.');\n }\n\n return new GetAttributeDefinitionsInput(apiSettings, { AttributeGroupIdentifier: channel.CustomerAttributeGroupId });\n};\n\nconst getAttributeDefinitionsAction = async (input: GetAttributeDefinitionsInput, ctx: IActionContext): Promise => {\n if (input && ctx.requestContext.channel && ctx.requestContext.channel.CustomerAttributeGroupId) {\n return getAttributeDefinitionsAsync({ callerContext: ctx }, input.attributeDefinitionCriteria || null).then(response => {\n return response;\n });\n }\n\n ctx.trace('[getAttributeDefinitions]Invalid input passed to action');\n return [];\n};\n\nexport const getAttributeDefinitionsActionDataAction = createObservableDataAction({\n id: '@msdyn365-commerce-modules/retail-actions/get-custom-attributes',\n action: >getAttributeDefinitionsAction,\n input: createInput\n});\n\nexport default getAttributeDefinitionsActionDataAction;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { createObservableDataAction, IAction } from '@msdyn365-commerce/core';\nimport { retailAction } from '@msdyn365-commerce/retail-proxy/dist';\nimport { createGetOrgUnitConfigurationInput } from '@msdyn365-commerce/retail-proxy/dist/DataActions/OrgUnitsDataActions.g';\nimport { ProductSearchResult } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\n\n/**\n * Get Org Unit Configuration Data Action.\n */\nexport const retailActionDataAction = createObservableDataAction({\n id: '@msdyn365-commerce-modules/retail-actions/get-org-unit-configuration',\n action: >retailAction,\n input: () => {\n return createGetOrgUnitConfigurationInput();\n }\n});\n\nexport default retailActionDataAction;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport {\n CacheType,\n createObservableDataAction,\n getCatalogId,\n IAction,\n IActionContext,\n IActionInput,\n IAny,\n ICreateActionContext,\n IGeneric,\n IRequestContext\n} from '@msdyn365-commerce/core';\nimport {\n InventoryAccuracy,\n ProductDimensionAvailabilitySearchCriteria,\n ProductDimensionType,\n ProductDimensionValueInventoryAvailability,\n ProductsDataActions\n} from '@msdyn365-commerce/retail-proxy';\n\nimport { ArrayExtensions, generateCacheKey, IKeyValuePair } from './utilities';\nimport { createInventoryAvailabilitySearchCriteria } from './utilities/product-inventory-utils';\nimport { QueryResultSettingsProxy } from './utilities/QueryResultSettingsProxy';\n\n/**\n * Interface for IProductDimension.\n */\nexport interface IProductDimension {\n masterProductId: number;\n requestDimensionType?: ProductDimensionType;\n requestDimensionTypes?: ProductDimensionType[];\n}\n\n/**\n * Product Input.\n */\nexport class ProductsDimensionAvailabilitiesInput implements IActionInput {\n public masterProductId: number;\n\n public requestDimensionType: ProductDimensionType | undefined;\n\n public requestDimensionTypes: ProductDimensionType[] | undefined;\n\n public catalogId?: number;\n\n private _requestContext?: IRequestContext;\n\n public constructor(\n masterProductId: number,\n requestDimensionType?: ProductDimensionType,\n requestContext?: IRequestContext,\n requestDimensionTypes?: ProductDimensionType[]\n ) {\n this._requestContext = requestContext;\n this.masterProductId = masterProductId;\n this.requestDimensionType = requestDimensionType;\n this.requestDimensionTypes = requestDimensionTypes;\n\n if (requestContext) {\n this.catalogId = getCatalogId(requestContext);\n }\n }\n\n /**\n * Cache key.\n * @returns String.\n */\n public getCacheKey: () => string = () => {\n const keys: IKeyValuePair[] = [\n { key: 'MasterProductId', value: this.masterProductId },\n { key: 'CatalogId', value: this.catalogId }\n ];\n if (this.requestDimensionTypes) {\n keys.push({ key: 'DimensionTypes', value: this.requestDimensionTypes });\n } else {\n keys.push({ key: 'DimensionType', value: this.requestDimensionType });\n }\n return generateCacheKey(this._requestContext?.apiSettings, ...keys);\n };\n\n /**\n * Cache object type.\n * @returns String.\n */\n public getCacheObjectType = (): string => 'MasterProductDimensionAvailabilities';\n\n /**\n * Cache type.\n * @returns String.\n */\n public dataCacheType = (): CacheType => 'application';\n}\n\n/**\n * Create input method for the getDimensionsForSelectedVariant data action.\n * @param inputData - The input data passed to the createInput method.\n * @returns - The input for the data action.\n */\nexport const createProductsDimensionAvailabilitiesInput = (\n inputData: ICreateActionContext>\n): ProductsDimensionAvailabilitiesInput[] => {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment -- ignore type of config.\n const productsDimensions: IProductDimension[] = inputData.config?.productsDimensions;\n\n return productsDimensions.map((productDimension: IProductDimension) => {\n return new ProductsDimensionAvailabilitiesInput(\n productDimension.masterProductId,\n productDimension.requestDimensionType,\n inputData.requestContext,\n productDimension.requestDimensionTypes\n );\n });\n};\n\n/**\n * Action Method for the getDimensionsForSelectedVariant Data Action.\n * @param inputs - Input for the data action.\n * @param context - Action context.\n * @returns Master product dimensions with availabilities.\n */\nexport async function getDimensionAvailabilitiesForProductsAction(\n inputs: ProductsDimensionAvailabilitiesInput[],\n context: IActionContext\n): Promise {\n if (!Array.isArray(inputs) || !ArrayExtensions.hasElements(inputs)) {\n context.trace('[getDimensionAvailabilitiesForProductsAction] Invalid or empty inputs passed.');\n return [];\n }\n\n const promise = inputs.map(input => {\n // As per default PDP loads shipping inventory policies, so making swatch to pick the same configuration\n const shippingInventoryConfiguration = createInventoryAvailabilitySearchCriteria(\n context,\n [input.masterProductId],\n true,\n undefined,\n undefined\n );\n\n const searchCriteria: ProductDimensionAvailabilitySearchCriteria = {\n MatchingDimensionValues: undefined,\n DefaultWarehouseOnly: shippingInventoryConfiguration.DefaultWarehouseOnly,\n FilterByChannelFulfillmentGroup: shippingInventoryConfiguration.FilterByChannelFulfillmentGroup,\n DeliveryModeTypeFilterValue: shippingInventoryConfiguration.DeliveryModeTypeFilterValue,\n CatalogId: input.catalogId\n };\n\n if (input.requestDimensionTypes) {\n searchCriteria.RequestedDimensionTypeValues = input.requestDimensionTypes;\n searchCriteria.InventoryAccuracyValue = InventoryAccuracy.Low;\n } else {\n searchCriteria.RequestedDimensionTypeValue = input.requestDimensionType;\n }\n\n const dimensionValuesPromise = ProductsDataActions.getDimensionValuesWithEstimatedAvailabilitiesAsync(\n { callerContext: context, queryResultSettings: QueryResultSettingsProxy.getPagingFromInputDataOrDefaultValue(context) },\n input.masterProductId,\n searchCriteria\n );\n\n return dimensionValuesPromise;\n });\n\n // eslint-disable-next-line no-return-await -- existing code\n return await Promise.all(promise);\n}\n\n/**\n * The GetDimensionAvailabilitiesForProductsAction\n * Gets the available product dimensions for the master product via the getDimensionValues RetailServer API.\n */\nexport default createObservableDataAction({\n id: '@msdyn365-commerce-modules/retail-actions/get-dimension-availabilities-for-products',\n action: getDimensionAvailabilitiesForProductsAction as IAction,\n input: createProductsDimensionAvailabilitiesInput,\n isBatched: true\n});\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport {\n CacheType,\n createObservableDataAction,\n IAction,\n IActionContext,\n IActionInput,\n ICreateActionContext\n} from '@msdyn365-commerce/core';\nimport { IQueryResultSettings } from '@msdyn365-commerce/retail-proxy';\nimport { ProductList } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\n\nimport {\n getOrderTemplates,\n GetOrderTemplatesInput,\n getPaginatedOrderTemplateLinesAction,\n GetPaginatedOrderTemplateLinesInput,\n QueryResultSettingsProxy\n} from '..';\nimport { OrderTemplate } from '../utilities/order-templates';\n\n/**\n * Input class for the GetOrderTemplates data action.\n */\nexport class GetFullOrderTemplateInput implements IActionInput {\n public orderTemplateId: string;\n\n public queryResultSettings: IQueryResultSettings;\n\n constructor(orderTemplateId: string, queryResultSettings: IQueryResultSettings) {\n this.orderTemplateId = orderTemplateId;\n this.queryResultSettings = queryResultSettings;\n }\n\n public getCacheKey = () => `GetFullOrderTemplate|${this.orderTemplateId}`;\n\n public getCacheObjectType = () => 'GetFullOrderTemplate';\n\n public dataCacheType = (): CacheType => 'none';\n}\n\n/**\n * CreateInput method for the GetOrderTemplate method.\n * @param inputData The input data passed to the createInput method.\n * @param orderTemplateId\n */\nexport const createGetFullOrderTemplateInput = (inputData: ICreateActionContext, orderTemplateId: string): GetFullOrderTemplateInput => {\n const { requestContext } = inputData;\n if (!requestContext.user.isAuthenticated) {\n throw new Error('Unable to get full order templates. User is not authenticated.');\n }\n const queryResultSettings: IQueryResultSettings = QueryResultSettingsProxy.fromInputData(inputData).QueryResultSettings;\n queryResultSettings.count = true;\n\n return new GetFullOrderTemplateInput(orderTemplateId, queryResultSettings);\n};\n\n/**\n * The action method for the GetFullOrderTemplate data action.\n * @param input The action input.\n * @param ctx The action context.\n */\nexport async function getFullOrderTemplateAction(input: GetFullOrderTemplateInput, ctx: IActionContext): Promise {\n if (!ctx.requestContext.user.isAuthenticated) {\n throw new Error('Unable to get full order template. User is not authenticated.');\n }\n\n const inputParams = new GetOrderTemplatesInput(input.orderTemplateId);\n const productLists: ProductList[] = await getOrderTemplates(inputParams, ctx);\n\n if (!productLists || productLists.length !== 1) {\n throw new Error('Unable to get full order template. Order template was not found.');\n }\n\n const inputLines = new GetPaginatedOrderTemplateLinesInput(productLists[0].Id, input.queryResultSettings);\n const linesState = await getPaginatedOrderTemplateLinesAction(inputLines, ctx);\n return new OrderTemplate(productLists[0], linesState.lines, linesState.totalCount);\n}\n\n/**\n * The GetFullOrderTemplate Data Action\n * Returns order templates.\n */\nexport const getFullOrderTemplateActionDataAction = createObservableDataAction({\n id: '@msdyn365-commerce-modules/retail-actions/order-templates/get-full-order-template',\n action: >getFullOrderTemplateAction,\n input: createGetFullOrderTemplateInput\n});\n\nexport default getFullOrderTemplateActionDataAction;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport {\n createObservableDataAction,\n getCatalogId,\n IAction,\n IActionContext,\n IActionInput,\n IAny,\n ICreateActionContext,\n IGeneric\n} from '@msdyn365-commerce/core';\nimport { ProductRefiner } from '@msdyn365-commerce/retail-proxy';\nimport { getRefinersByCategoryAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/ProductsDataActions.g';\n\nimport getCurrentCategory, { CurrentCategoryInput } from './get-current-category';\nimport { generateCacheKey } from './utilities';\nimport { QueryResultSettingsProxy } from './utilities/QueryResultSettingsProxy';\n\n/**\n * Action Input class for the getRefinersByCategory data action.\n */\nexport class RefinersByCategoryInput implements IActionInput {\n public readonly catalogId: number;\n\n public readonly currentCategory: CurrentCategoryInput;\n\n public readonly queryResultSettingsProxy: QueryResultSettingsProxy;\n\n constructor(category: CurrentCategoryInput, queryResultSettingsProxy: QueryResultSettingsProxy, catalogId?: number) {\n this.queryResultSettingsProxy = queryResultSettingsProxy;\n this.catalogId = catalogId || 0;\n this.currentCategory = category;\n }\n\n public getCacheKey = () =>\n generateCacheKey(\n undefined,\n { key: 'CategoryKey', value: this.currentCategory.getCacheKey() },\n { key: 'CatalogId', value: this.catalogId },\n { key: 'QueryResultSettingsCacheKeyHint', value: this.queryResultSettingsProxy.cacheKeyHint }\n );\n\n public getCacheObjectType = () => 'ProductRefiner';\n\n public shouldCacheOutput = () => true;\n}\n\n/**\n * Creates the input required to make the retail api call.\n * @param inputData\n */\nexport const createRefinersByCategoryInput = (inputData: ICreateActionContext>): IActionInput => {\n if (inputData && inputData.requestContext) {\n const catalogId = getCatalogId(inputData.requestContext);\n const currentCategory = new CurrentCategoryInput(inputData.requestContext);\n\n return new RefinersByCategoryInput(currentCategory, QueryResultSettingsProxy.fromInputData(inputData), catalogId);\n }\n\n throw new Error('Please specify categoryId query string in request.');\n};\n\n/**\n * Calls the Retail API and returns all refiners by category.\n * @param input\n * @param ctx\n */\nexport async function getRefinersByCategoryAction(input: RefinersByCategoryInput, ctx: IActionContext): Promise {\n let categoryId = input.currentCategory.categoryId;\n if (input.currentCategory.categorySlug && !categoryId) {\n const category = await getCurrentCategory(input.currentCategory, ctx);\n if (!category) {\n ctx.trace('[getRefinersByCategoryAction] Unable to find category');\n return [];\n }\n categoryId = category.RecordId;\n }\n\n return getRefinersByCategoryAsync(\n { callerContext: ctx, queryResultSettings: input.queryResultSettingsProxy.QueryResultSettings },\n input.catalogId,\n categoryId || 0\n );\n}\n\nexport default createObservableDataAction({\n id: '@msdyn365-commerce-modules/retail-actions/get-refiners-by-category',\n action: >getRefinersByCategoryAction,\n input: createRefinersByCategoryInput\n});\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport {\n CacheType,\n createObservableDataAction,\n IAction,\n IActionInput,\n IAny,\n ICommerceApiSettings,\n ICreateActionContext,\n IGeneric\n} from '@msdyn365-commerce/core';\nimport { ProductRefinerValue, ProductSearchResult } from '@msdyn365-commerce/retail-proxy';\nimport { createRefineSearchByCategoryInput } from '@msdyn365-commerce/retail-proxy/dist/DataActions/ProductsDataActions.g';\nimport { retailAction } from '@msdyn365-commerce/retail-proxy/dist/retail-action';\n\nimport { QueryResultSettingsProxy } from './utilities/QueryResultSettingsProxy';\nimport { buildCacheKey } from './utilities/utils';\n\n/**\n * Action Input class for the refineSearchByCategory data action.\n */\nexport class RefineSearchByCriteriaInput implements IActionInput {\n public readonly categoryId?: number;\n\n public readonly channelId?: number;\n\n public readonly refinementCriteria: ProductRefinerValue[];\n\n public readonly catalogId: number;\n\n public readonly queryResultSettingsProxy: QueryResultSettingsProxy;\n\n private readonly apiSettings: ICommerceApiSettings;\n\n constructor(\n queryResultSettingsProxy: QueryResultSettingsProxy,\n apiSettings: ICommerceApiSettings,\n categoryId?: number,\n channelId?: number,\n refinementCriteria?: ProductRefinerValue[],\n catalogId?: number\n ) {\n this.categoryId = categoryId;\n this.channelId = channelId;\n this.refinementCriteria = refinementCriteria || [];\n this.queryResultSettingsProxy = queryResultSettingsProxy;\n this.catalogId = catalogId || 0;\n this.apiSettings = apiSettings;\n }\n\n public getCacheKey = () => buildCacheKey('RefineSearchByCriteriaInputCache', this.apiSettings);\n\n public getCacheObjectType = () => 'RefineSearchByCriteriaInput';\n\n public dataCacheType = (): CacheType => 'request';\n}\n\n/**\n * CreateInput method for the refineSearchByCategory data action.\n * @param inputData\n */\nexport const createInput = (inputData: ICreateActionContext>): IActionInput => {\n const refinementCriteria = inputData.config && inputData.config.refinementCriteria;\n\n if (inputData && inputData.requestContext && inputData.requestContext.query && inputData.requestContext.query.categoryId) {\n return createRefineSearchByCategoryInput(\n QueryResultSettingsProxy.fromInputData(inputData).QueryResultSettings,\n +inputData.requestContext.apiSettings.channelId,\n inputData.config ? Number(inputData.config.catalogId) : 0,\n +inputData.requestContext.query.categoryId,\n !Array.isArray(refinementCriteria)\n ? []\n : refinementCriteria.map((refinementCriterion: ProductRefinerValue) => refinementCriterion)\n );\n }\n\n throw new Error('Please specify categoryId, refinerId, and refinerSourceValue query string in request.');\n};\n\n/**\n * The RefineSearchByCategory data action\n * Uses categoryId query string parameter to call the RefinerSearchByCategory\n * RetailServer API to get information about products.\n */\nexport const retailActionDataAction = createObservableDataAction({\n id: '@msdyn365-commerce-modules/retail-actions/regin-search-by-category',\n action: >retailAction,\n input: createInput\n});\n\nexport default retailActionDataAction;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport {\n CacheType,\n createObservableDataAction,\n IAction,\n IActionContext,\n IActionInput,\n ICreateActionContext\n} from '@msdyn365-commerce/core';\nimport { addProductListLinesAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/ProductListsDataActions.g';\nimport { ProductListLine } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\n\n/**\n * Input class for the AddItemToOrderTemplate data action.\n */\nexport class AddItemToOrderTemplateInput implements IActionInput {\n public readonly orderTemplateId: string;\n\n public readonly productId: number;\n\n public readonly quantity: number;\n\n public readonly unitOfMeasure: string;\n\n constructor(orderTemplateId: string, productId: number, quantity: number, unitOfMeasure: string) {\n this.orderTemplateId = orderTemplateId;\n this.productId = productId;\n this.quantity = quantity;\n this.unitOfMeasure = unitOfMeasure || 'ea';\n }\n\n public getCacheKey = () => 'AddItemToOrderTemplateInput';\n\n public getCacheObjectType = () => 'AddItemToOrderTemplateInput';\n\n public dataCacheType = (): CacheType => 'none';\n}\n\n/**\n * CreateInput method for the AddItemToOrderTemplate method.\n * @param {ICreateActionContext} inputData The input data passed to the createInput method.\n * @param {string} orderTemplateId The id of order template to update.\n * @param {number} productId The id of a product to add.\n * @param {number} quantity How many items of this product to add.\n * @param unitOfMeasure\n */\nexport const addItemToOrderTemplateInput = (\n inputData: ICreateActionContext,\n orderTemplateId: string,\n productId: number,\n quantity: number,\n unitOfMeasure: string\n): AddItemToOrderTemplateInput => {\n const { requestContext } = inputData;\n if (!requestContext.user.isAuthenticated) {\n throw new Error('Unable to create order template. User is not authenticated.');\n }\n return new AddItemToOrderTemplateInput(orderTemplateId, productId, quantity, unitOfMeasure);\n};\n\n/**\n * The action method for the AddItemToOrderTemplate data action.\n * @param {AddItemToOrderTemplateInput} input The action input.\n * @param {IActionContext} ctx The action context.\n */\nexport async function addItemToOrderTemplateAction(input: AddItemToOrderTemplateInput, ctx: IActionContext): Promise {\n try {\n const productListLineToAdd: ProductListLine = {\n ProductListId: input.orderTemplateId,\n ProductId: input.productId,\n Quantity: input.quantity,\n UnitOfMeasure: input.unitOfMeasure\n };\n\n const productListLine: ProductListLine[] = await addProductListLinesAsync(\n {\n callerContext: ctx\n },\n input.orderTemplateId,\n [productListLineToAdd]\n );\n\n if (productListLine && productListLine.length === 1 && productListLine[0] && productListLine[0].ProductListId) {\n return productListLine[0];\n }\n ctx.telemetry.error('Product list line was not returned when adding it to order template');\n throw new Error('Product list line was not returned when adding it to order template');\n } catch (error) {\n ctx.telemetry.error('Not able to add an item to order template', error);\n throw error;\n }\n}\n\n/**\n * The AddItemToOrderTemplate Data Action.\n * Returns product list line that was added to the order template.\n */\nexport const addItemToOrderTemplateActionDataAction = createObservableDataAction({\n id: '@msdyn365-commerce-modules/retail-actions/order-templates/add-item-to-order-template',\n action: >addItemToOrderTemplateAction,\n input: addItemToOrderTemplateInput\n});\n\nexport default addItemToOrderTemplateActionDataAction;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport {\n CacheType,\n createObservableDataAction,\n IAction,\n IActionContext,\n IActionInput,\n IAny,\n ICreateActionContext,\n IGeneric\n} from '@msdyn365-commerce/core';\nimport { FeatureState } from '@msdyn365-commerce/retail-proxy';\nimport { getDeliveryOptionsAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/ProductsDataActions.g';\nimport {\n FilterDeliveryModeOption,\n ProductDeliveryOptions,\n ReleasedProductType,\n SimpleProduct\n} from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\n\nimport { getSelectedProductIdFromActionInput, getSelectedVariant, SelectedVariantInput } from '.';\nimport { FeatureStateInput, getFeatureStateActionDataAction } from './get-feature-state';\nimport { QueryResultSettingsProxy } from './utilities/QueryResultSettingsProxy';\n\n/**\n * Input class for the GetDeliveryOptionsForSelectedVariant Data Action.\n */\nexport class GetDeliveryOptionsForSelectedVariantInput implements IActionInput {\n public productId: number;\n\n public channelId: number;\n\n public selectedProduct: SimpleProduct | undefined;\n\n public customerId: string;\n\n public featureState?: boolean;\n\n constructor(productId: number, channelId: number, selectedProduct?: SimpleProduct, customerId?: string, featureState?: boolean) {\n this.productId = productId;\n this.channelId = channelId;\n this.selectedProduct = selectedProduct;\n this.customerId = customerId || '';\n this.featureState = featureState;\n }\n\n public getCacheKey = () => 'DeliveryOptionsForSelectedVariant';\n\n public getCacheObjectType = () => 'DeliveryOptions';\n\n public dataCacheType = (): CacheType => 'none';\n}\n\n/**\n * Calls the Retail Feature State API and returns a list of feature with isEnabled flag.\n * @param context\n */\nexport async function getFeatureState(context: IActionContext): Promise {\n return getFeatureStateActionDataAction(new FeatureStateInput(), context);\n}\n\n/**\n * The createInput method for the GetDeliveryOptionsForSelectedVariant Data Action.\n * @param inputData The input data for the createInput method.\n */\nexport const createDeliveryOptionsForSelectedVariantInput = (\n inputData: ICreateActionContext>\n): GetDeliveryOptionsForSelectedVariantInput => {\n const productId = getSelectedProductIdFromActionInput(inputData);\n\n if (productId) {\n return new GetDeliveryOptionsForSelectedVariantInput(\n +productId,\n +inputData.requestContext.apiSettings.channelId,\n undefined,\n undefined\n );\n }\n throw new Error('Unable to create PriceForSelectedVariantInput, no productId found on module config or query');\n};\n\n/**\n * The Action Method for the GetDeliveryOptionsForSelectedVariant Data Action\n * Pulls the currently selected variant from the cache using the getSelectedVariant data action, and gets it's supported delivery options\n * via the getDeliveryOptionsAsync RetailServer API.\n * @param input\n * @param ctx\n */\nexport async function getDeliveryOptionsForSelectedVariantAction(\n input: GetDeliveryOptionsForSelectedVariantInput,\n ctx: IActionContext\n): Promise {\n if (input.featureState === undefined) {\n const featureState = await getFeatureState(ctx);\n input.featureState = featureState?.find(\n item => item.Name === 'Dynamics.AX.Application.RetailMultiplePickupDeliveryModeFeature'\n )?.IsEnabled;\n }\n\n return Promise.resolve()\n .then(() => {\n const activeProduct: SimpleProduct | undefined = input.selectedProduct;\n\n if (!activeProduct) {\n const selectedVariantInput = new SelectedVariantInput(\n input.productId,\n input.channelId,\n undefined,\n undefined,\n ctx.requestContext\n );\n\n return getSelectedVariant(selectedVariantInput, ctx);\n }\n\n return activeProduct;\n })\n .then((productResult: SimpleProduct | null) => {\n const activeProduct: SimpleProduct | undefined = productResult;\n\n if (activeProduct) {\n return getDeliveryOptionsAsync(\n { callerContext: ctx, queryResultSettings: QueryResultSettingsProxy.getPagingFromInputDataOrDefaultValue(ctx) },\n [activeProduct.RecordId],\n {},\n\n // For service item, should not apply the filter, otherwise there will be no electronic delivery mode\n input.featureState && productResult?.ItemTypeValue !== ReleasedProductType.Service\n ? FilterDeliveryModeOption.FilterOutNonPickupDeliveryMode\n : null\n ).then(response => {\n if (response && response.length > 0) {\n return response[0];\n }\n\n return undefined;\n });\n }\n\n return undefined;\n })\n .catch((error: Error) => {\n ctx.trace(error.message);\n ctx.telemetry.exception(error);\n ctx.telemetry.debug('[getDeliveryOptionsForSelectedVariantAction]Error executing action');\n throw new Error('[getDeliveryOptionsForSelectedVariantAction]Error executing action');\n });\n}\n\nexport const getDeliveryOptionsForSelectedVariantActionDataAction = createObservableDataAction({\n id: '@msdyn365-commerce-modules/retail-actions/get-delivery-options-for-selected-variant',\n action: >getDeliveryOptionsForSelectedVariantAction,\n input: createDeliveryOptionsForSelectedVariantInput\n});\n\nexport default getDeliveryOptionsForSelectedVariantActionDataAction;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport {\n CacheType,\n createObservableDataAction,\n IAction,\n IActionContext,\n IActionInput,\n IAny,\n ICommerceApiSettings,\n ICreateActionContext,\n IGeneric\n} from '@msdyn365-commerce/core';\nimport { Customer, CustomersDataActions } from '@msdyn365-commerce/retail-proxy';\n\nimport { buildCacheKey } from './utilities/utils';\n\n/**\n * Input class for get customer data action.\n */\nexport class GetCustomerInput implements IActionInput {\n public customerAccountNumber?: string;\n\n private readonly apiSettings: ICommerceApiSettings;\n\n private readonly cacheType?: CacheType;\n\n public constructor(apiSettings: ICommerceApiSettings, accountNumber?: string, cacheType?: CacheType) {\n this.customerAccountNumber = accountNumber;\n this.apiSettings = apiSettings;\n this.cacheType = cacheType;\n }\n\n /**\n * GetCacheKey.\n * @returns - Returns string.\n */\n public getCacheKey = (): string => buildCacheKey(`Customer-${this.customerAccountNumber}`, this.apiSettings);\n\n /**\n * GetCacheObjectType.\n * @returns - Cache Object Type string.\n */\n public getCacheObjectType = (): string => 'Customer';\n\n /**\n * DataCacheType.\n * @returns - CacheType string.\n */\n public dataCacheType = (): CacheType => {\n return this.cacheType ? this.cacheType : 'request';\n };\n}\n\n/**\n * Creates the input required to make the retail api call.\n * @param inputData -- The input data passed to the createInput method.\n * @returns - ProductAvailabilitiesForSelectedVariant or error.\n */\nconst createInput = (inputData: ICreateActionContext>): GetCustomerInput => {\n const { user, apiSettings } = inputData.requestContext;\n if (!user.token || !user.isAuthenticated) {\n throw new Error('[getCustomer][createInput]: User is not Authenticated.');\n }\n\n return new GetCustomerInput(apiSettings);\n};\n\n/**\n * GetCustomerAction.\n * @param input - GetCustomerInput.\n * @param ctx - Action Context.\n * @returns - Customer information.\n */\nconst getCustomerAction = async (input: GetCustomerInput, ctx: IActionContext): Promise => {\n if (input && ctx.requestContext.user.isAuthenticated) {\n // TO-DO- Need to clean up this code once SDK releases new proxy that handles null.\n return CustomersDataActions.readAsync({ callerContext: ctx, bypassCache: 'get' }, input.customerAccountNumber || '').then(\n response => {\n return Array.isArray(response) ? response[0] : response;\n }\n );\n }\n\n ctx.trace('[getCustomer]Invalid input passed to action');\n return {};\n};\n\n/**\n * The customer data action.\n */\nexport const getCustomerActionDataAction = createObservableDataAction({\n id: '@msdyn365-commerce-modules/retail-actions/get-customer',\n action: >getCustomerAction,\n input: createInput\n});\n\nexport default getCustomerActionDataAction;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\n/**\n * Represents a pair of two fields: key and value.\n * Used to initialize a dictionary.\n */\nexport interface IKeyValuePair {\n readonly key: Key;\n readonly value: Value;\n}\n\n/**\n * Represents a dictionary in memory storage.\n */\nexport class Dictionary {\n /**\n * Values stored in the dictionary.\n */\n private _values: { [eventName: string]: Value };\n\n /**\n * The number of values stored in the dictionary (does not include keys).\n */\n private _length: number;\n\n /**\n * Initializes an empty dictionary or a dictionary with the given key value pairs.\n * @param {IKeyValuePair[]} entries The key value pairs which should be stored in the dictionary initially.\n */\n public constructor(...entries: IKeyValuePair[]) {\n this._values = {};\n this._length = 0;\n entries.forEach(keyValuePair => {\n this.setValue(keyValuePair.key, keyValuePair.value);\n });\n }\n\n /**\n * Removes value from the dictionary for the given key.\n * @param {Key} key The key to retrieve the value.\n * @remark Does nothing in case the key is not present in the dictionary.\n */\n public removeValue(key: Key): void {\n if (!this.hasValue(key)) {\n return;\n }\n\n --this._length;\n delete this._values[key];\n }\n\n /**\n * Retrieves a value from the dictionary or returns undefined in case it's not found.\n * @param {Key} key The key to retrieve the value.\n * @returns {Value | undefined} The value stored in the dictionary or undefined in case it's not found.\n */\n public getValue(key: Key): Value | undefined {\n return this._values[key];\n }\n\n /**\n * Retrieves a value from the dictionary.\n * In case it's not found, adds the default value to the dictionary and returns it.\n * @param {Key} key The key to retrieve the value.\n * @param defaultValue\n * @returns {Value} The value stored in the dictionary or the default value in case it's not found.\n */\n public getValueWithDefaultValue(key: Key, defaultValue: Value): Value {\n if (!this.hasValue(key)) {\n this.setValue(key, defaultValue);\n }\n return this.getValue(key)!;\n }\n\n /**\n * Sets the value to the dictionary for the given key.\n * @remarks In case undefined was passed, removes the value from the dictionary instead.\n * @param {Key} key The key under which the value should be stored.\n * @param {Value} value The value which should be stored in the dictionary.\n */\n public setValue(key: Key, value: Value): void {\n if (value === undefined) {\n this.removeValue(key);\n return;\n }\n\n if (!this.hasValue(key)) {\n ++this._length;\n }\n\n this._values[key] = value;\n }\n\n /**\n * Checks if the dictionary stores some value (except undefined) for the given key.\n * @param {Key} key The key to retrieve the value.\n * @returns {boolean} True in case the value is present, false otherwise or if it's undefined.\n */\n public hasValue(key: Key): boolean {\n return this._values[key] !== undefined;\n }\n\n /**\n * Checks if the dictionary is empty.\n * @returns {boolean} True if the dictionary is empty, false otherwise.\n */\n public isEmpty(): boolean {\n return this.length === 0;\n }\n\n /**\n * Retrieves the number of values stored in the dictionary.\n * @remark Use `isEmpty` to check if the dictionary has any elements.\n * @returns {number} The number of values stored.\n */\n public get length(): number {\n return this._length;\n }\n\n /**\n * Clears the dictionary by removing all elements from the storage.\n */\n public clear(): void {\n this._values = {};\n this._length = 0;\n }\n\n /**\n * Returns all values stored in the dictionary.\n * @returns {Value[]} List of values.\n */\n public getValues(): Value[] {\n return this.getKeys().map(key => this._values[key]);\n }\n\n /**\n * Returns all keys stored in the dictionary.\n * @returns {string[]} List of keys.\n */\n public getKeys(): Key[] {\n return Object.keys(this._values);\n }\n\n /**\n * Returns all key value pairs stored in the dictionary.\n * @returns {IKeyValuePair[]} List of key value pairs.\n */\n public getKeyValuePairs(): IKeyValuePair[] {\n return this.getKeys().map(key => {\n return { key, value: this._values[key] };\n });\n }\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport {\n CacheType,\n createObservableDataAction,\n IAction,\n IActionContext,\n IActionInput,\n ICreateActionContext\n} from '@msdyn365-commerce/core';\nimport { getCartState } from '@msdyn365-commerce/global-state';\nimport { CartLine, QueryResultSettings } from '@msdyn365-commerce/retail-proxy';\nimport { addCartLinesAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/CartsDataActions.g';\n\nimport { getPaginatedOrderTemplateLinesAction, GetPaginatedOrderTemplateLinesInput } from './get-paginated-order-template-lines';\n\n/**\n * Input class for the AddOrderTemplateToCart data action.\n */\nexport class AddOrderTemplateToCartInput implements IActionInput {\n public readonly orderTemplateId: string;\n\n constructor(orderTemplateId: string) {\n this.orderTemplateId = orderTemplateId;\n }\n\n public getCacheKey = () => 'AddOrderTemplateToCartInput';\n\n public getCacheObjectType = () => 'AddOrderTemplateToCartInput';\n\n public dataCacheType = (): CacheType => 'none';\n}\n\n/**\n * CreateInput method for the AddOrderTemplateToCart method.\n * @param {ICreateActionContext} inputData The input data passed to the createInput method.\n * @param {string} orderTemplateId The id of template.\n */\nexport const addOrderTemplateToCartInput = (inputData: ICreateActionContext, orderTemplateId: string): AddOrderTemplateToCartInput => {\n const { requestContext } = inputData;\n if (!requestContext.user.isAuthenticated) {\n throw new Error('Unable to create order template. User is not authenticated.');\n }\n return new AddOrderTemplateToCartInput(orderTemplateId);\n};\n\n/**\n * The action method for the AddOrderTemplateToCart data action.\n * @param {AddOrderTemplateToCartInput} input The action input.\n * @param {IActionContext} ctx The action context.\n * @param context\n */\nexport async function addOrderTemplateToCartAction(input: AddOrderTemplateToCartInput, context: IActionContext): Promise {\n const cartState = await getCartState(context);\n const chunkCount = 1000;\n const queryResultSettings: QueryResultSettings = {\n Paging: {\n Top: chunkCount,\n Skip: 0\n }\n };\n const getPaginatedOrderTemplateLinesInput = new GetPaginatedOrderTemplateLinesInput(input.orderTemplateId, queryResultSettings);\n let orderTemplateLines = await getPaginatedOrderTemplateLinesAction(getPaginatedOrderTemplateLinesInput, context);\n let addedCartLines: CartLine[] = [];\n for (let skip = chunkCount; orderTemplateLines.lines.length > 0; skip += chunkCount) {\n const cartLines: CartLine[] = orderTemplateLines.lines.map(productLine => {\n const cartLine: CartLine = {\n ItemId: productLine.fullProduct?.ProductDetails.ItemId,\n ProductId: productLine.productListLine.ProductId,\n Quantity: productLine.productListLine.Quantity,\n TrackingId: '',\n UnitOfMeasureSymbol: productLine.productListLine.UnitOfMeasure\n };\n return cartLine;\n });\n await addCartLinesAsync({ callerContext: context }, cartState.cart.Id, cartLines, cartState.cart.Version).catch(error => {\n context.telemetry.trace(error.data?.ValidationResults);\n context.telemetry.trace('Unable to add order template to cart.');\n throw error.data?.ValidationResults;\n });\n addedCartLines = addedCartLines.concat(cartLines);\n getPaginatedOrderTemplateLinesInput.queryResultSettings.Paging!.Skip = skip;\n orderTemplateLines = await getPaginatedOrderTemplateLinesAction(getPaginatedOrderTemplateLinesInput, context);\n }\n await cartState.refreshCart({});\n return addedCartLines;\n}\n\n/**\n * The AddOrderTemplateToCart Data Action.\n * Returns created order template.\n */\nexport const addOrderTemplateToCartActionDataAction = createObservableDataAction({\n id: '@msdyn365-commerce-modules/retail-actions/order-templates/add-order-template-to-cart',\n action: >addOrderTemplateToCartAction,\n input: addOrderTemplateToCartInput\n});\nexport default addOrderTemplateToCartActionDataAction;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport {\n CacheType,\n createObservableDataAction,\n IAction,\n IActionContext,\n IActionInput,\n ICreateActionContext\n} from '@msdyn365-commerce/core';\nimport { ProductList, ProductListType } from '@msdyn365-commerce/retail-proxy';\nimport { createProductListAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/ProductListsDataActions.g';\n\n/**\n * Input class for the CreateOrderTemplate data action.\n */\nexport class CreateOrderTemplateInput implements IActionInput {\n public readonly templateName: string;\n\n constructor(templateName: string) {\n this.templateName = templateName;\n }\n\n public getCacheKey = () => 'CreateOrderTemplateInput';\n\n public getCacheObjectType = () => 'CreateOrderTemplateInput';\n\n public dataCacheType = (): CacheType => 'none';\n}\n\n/**\n * CreateInput method for the CreateOrderTemplate method.\n * @param {ICreateActionContext} inputData The input data passed to the createInput method.\n * @param {string} templateName The name of template.\n */\nexport const createOrderTemplateInput = (inputData: ICreateActionContext, templateName: string): CreateOrderTemplateInput => {\n const { requestContext } = inputData;\n if (!requestContext.user.isAuthenticated) {\n throw new Error('Unable to create order template. User is not authenticated.');\n }\n return new CreateOrderTemplateInput(templateName);\n};\n\n/**\n * The action method for the CreateOrderTemplate data action.\n * @param {CreateOrderTemplateInput} input The action input.\n * @param {IActionContext} ctx The action context.\n */\nexport async function createOrderTemplateAction(input: CreateOrderTemplateInput, ctx: IActionContext): Promise {\n try {\n const orderTemplate: ProductList = {\n Id: '',\n Name: input.templateName,\n ProductListTypeValue: ProductListType.OrderTemplate\n };\n const createdProductList = await createProductListAsync(\n {\n callerContext: ctx\n },\n orderTemplate\n );\n if (createdProductList && createdProductList.Id !== '') {\n return createdProductList;\n }\n ctx.telemetry.error('Created product list was null');\n throw new Error('Created product list was null');\n } catch (error) {\n ctx.telemetry.error('Not able to create order template', error);\n throw error;\n }\n}\n\n/**\n * The CreateOrderTemplate Data Action.\n * Returns created order template.\n */\nexport const createOrderTemplateActionDataAction = createObservableDataAction({\n id: '@msdyn365-commerce-modules/retail-actions/order-templates/create-order-template',\n action: >createOrderTemplateAction,\n input: createOrderTemplateInput\n});\n\nexport default createOrderTemplateActionDataAction;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport {\n CacheType,\n createObservableDataAction,\n IAction,\n IActionContext,\n IActionInput,\n IAny,\n ICreateActionContext,\n IGeneric\n} from '@msdyn365-commerce/core';\nimport { FeatureState, StoreOperationsDataActions } from '@msdyn365-commerce/retail-proxy';\n\nimport { QueryResultSettingsProxy } from './utilities/QueryResultSettingsProxy';\n\n/**\n * Input class for the getFeatureState data action.\n * The life time of the data action is 'application'.\n */\nexport class FeatureStateInput implements IActionInput {\n // Any additional feature names that needs to be checked in the code for enablement needs to be appended here:\n public readonly featureNames: string[] = [\n 'Dynamics.AX.Application.RetailAsyncAddressCreationFeature',\n 'Dynamics.AX.Application.RetailEnableAsyncCustomerEditFeature',\n 'Dynamics.AX.Application.RetailB2BEcommerceFeature',\n 'Dynamics.AX.Application.RetailDefaultOrderQuantityLimitsFeature',\n 'Dynamics.AX.Application.RetailMultiplePickupDeliveryModeFeature',\n 'Dynamics.AX.Application.RetailSearchPriceRangeFeature',\n 'Dynamics.AX.Application.RetailSalesAgreementPriceSupportFeature',\n 'Dynamics.AX.Application.ChannelMultipleCatalogsFeature'\n ];\n\n /**\n * Get Cache Key.\n * @returns - Cache key string.\n */\n public getCacheKey = (): string => 'FeatureState';\n\n /**\n * Get Cache type Name.\n * @returns - Cache name string.\n */\n public getCacheObjectType = (): string => 'FeatureState';\n\n /**\n * Get Cache type.\n * @returns - CacheType enum.\n */\n public dataCacheType = (): CacheType => 'application';\n}\n\n/**\n * CreateInput method for the getFeatureState method.\n * @param inputData -- The input data passed to the createInput method.\n * @returns - Input for data action.\n */\nexport const createGetFeatureStateInput = (inputData: ICreateActionContext>): IActionInput => {\n return new FeatureStateInput();\n};\n\n/**\n * The action method for the getFeatureState data action.\n * @param input -- The action input.\n * @param ctx -- The action context.\n * @returns -- Feature state.\n */\nexport async function getFeatureStateAction(input: FeatureStateInput, ctx: IActionContext): Promise {\n const featureState = await StoreOperationsDataActions.getFeatureStatesAsync(\n { callerContext: ctx, queryResultSettings: QueryResultSettingsProxy.getPagingFromInputDataOrDefaultValue(ctx) },\n input.featureNames\n );\n return featureState;\n}\n\n/**\n * The getFeatureState data action.\n * Gets the feature state via the read RetailServer API.\n * @returns Address information associated with the retrieved customer.\n */\nexport const getFeatureStateActionDataAction = createObservableDataAction({\n id: '@msdyn365-commerce-modules/retail-actions/get-feature-state',\n action: getFeatureStateAction as IAction,\n input: createGetFeatureStateInput\n});\n\nexport default getFeatureStateActionDataAction;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport {\n CacheType,\n createObservableDataAction,\n IAction,\n IActionContext,\n IActionInput,\n ICreateActionContext\n} from '@msdyn365-commerce/core';\nimport { updateAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/ProductListsDataActions.g';\nimport { ProductList } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\n\n/**\n * Input class for the UpdateOrderTemplate data action.\n */\nexport class UpdateOrderTemplateHeaderInput implements IActionInput {\n public readonly orderTemplate: ProductList;\n\n constructor(orderTemplate: ProductList) {\n this.orderTemplate = orderTemplate;\n }\n\n public getCacheKey = () => 'UpdateOrderTemplateHeaderInput';\n\n public getCacheObjectType = () => 'UpdateOrderTemplateHeaderInput';\n\n public dataCacheType = (): CacheType => 'none';\n}\n\n/**\n * CreateInput method for the UpdateOrderTemplateHeader method.\n * @param {ICreateActionContext} inputData The input data passed to the createInput method.\n * @param {ProductList} orderTemplate The template header.\n */\nexport const updateOrderTemplateHeaderInput = (\n inputData: ICreateActionContext,\n orderTemplate: ProductList\n): UpdateOrderTemplateHeaderInput => {\n const { requestContext } = inputData;\n if (!requestContext.user.isAuthenticated) {\n throw new Error('Unable to update order template. User is not authenticated.');\n }\n return new UpdateOrderTemplateHeaderInput(orderTemplate);\n};\n\n/**\n * The action method for the UpdateOrderTemplate data action.\n * @param {UpdateOrderTemplateHeaderInput} input The action input.\n * @param {IActionContext} ctx The action context.\n */\nexport async function updateOrderTemplateHeaderAction(input: UpdateOrderTemplateHeaderInput, ctx: IActionContext): Promise {\n try {\n const { orderTemplate } = input;\n const updatedProductList = await updateAsync(\n {\n callerContext: ctx\n },\n orderTemplate\n );\n if (updatedProductList) {\n return updatedProductList;\n }\n ctx.telemetry.error(`Updated product list ${orderTemplate.Id} came back as null.`);\n throw new Error('Updated product list was null.');\n } catch (error) {\n ctx.telemetry.error('Not able to update order template', error);\n throw error;\n }\n}\n\n/**\n * The UpdateOrderTemplate Data Action.\n * Returns updated order template.\n */\nexport const updateOrderTemplateHeaderActionDataAction = createObservableDataAction({\n id: '@msdyn365-commerce-modules/retail-actions/order-templates/update-order-template-header',\n action: >updateOrderTemplateHeaderAction,\n input: updateOrderTemplateHeaderInput\n});\n\nexport default updateOrderTemplateHeaderActionDataAction;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { createObservableDataAction, IAction, IAny, ICreateActionContext, IGeneric } from '@msdyn365-commerce/core';\nimport { IDataServiceRequest, retailAction } from '@msdyn365-commerce/retail-proxy/dist';\nimport { createGetOrderShipmentsHistoryInput } from '@msdyn365-commerce/retail-proxy/dist/DataActions/CustomersDataActions.g';\nimport { OrderShipments } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\n\n/**\n * Creates the input required to make the retail api call.\n * @param inputData\n */\nconst createInput = (inputData: ICreateActionContext>): IDataServiceRequest => {\n if (inputData.requestContext && inputData.requestContext.user && inputData.requestContext.user.isAuthenticated) {\n return createGetOrderShipmentsHistoryInput(\n {\n Paging: {\n Top: 100,\n Skip: 0\n }\n },\n\n // @ts-expect-error\n null\n );\n }\n\n throw new Error('Unable to create order history input. User is not authenticated.');\n};\n\nexport default createObservableDataAction({\n id: '@msdyn365-commerce-modules/retail-actions/get-order-history',\n action: >retailAction,\n input: createInput\n});\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IEventSubscriber } from './event-subscriber';\n\n/**\n * Represents a simple event with subscribers. Notifies the subscribers once the event is triggered.\n */\nexport class Event {\n /**\n * The list of subscribers.\n */\n private _subscribers: IEventSubscriber[];\n\n /**\n * Initializes the event with a empty subscribers list.\n */\n public constructor() {\n this._subscribers = [];\n }\n\n /**\n * Subscribes given instance to the event.\n * @param {IEventSubscriber} instance The info about the subscriber.\n */\n public subscribe(instance: IEventSubscriber): void {\n this._subscribers.push(instance);\n }\n\n /**\n * Removes the subscriber from the list of subscribers watching the event.\n * @param {string} instanceId The unique identifier of the subscriber which was earlier passed in `subscribe` method in `IEventSubscriber`.\n */\n public unsubscribe(instanceId: string): void {\n this._subscribers = this._subscribers.filter(element => element.instanceId !== instanceId);\n }\n\n /**\n * Clears the list of subscriber removing all instances watching the event.\n */\n public unsubscribeAll(): void {\n this._subscribers = [];\n }\n\n /**\n * Triggers the event.\n * Notifies the subscribers that the event is triggered by calling `handler` method.\n */\n public trigger(): void {\n this._subscribers.forEach(subscriber => {\n subscriber.handler();\n });\n }\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport {\n CacheType,\n createObservableDataAction,\n IAction,\n IActionContext,\n IActionInput,\n ICreateActionContext\n} from '@msdyn365-commerce/core';\nimport {\n InvoicePaidStatus,\n InvoiceSearchCriteria,\n InvoiceType,\n IQueryResultSettings,\n OrderInvoice,\n SalesOrdersDataActions\n} from '@msdyn365-commerce/retail-proxy';\nimport { getCurrentAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/BusinessPartnersDataActions.g';\n\nimport getCustomer, { GetCustomerInput } from '../get-customer';\nimport { QueryResultSettingsProxy } from '../utilities/QueryResultSettingsProxy';\n\nconst getDefaultSearchCriteria = (): InvoiceSearchCriteria => {\n return {\n InvoicePaidStatusValues: [InvoicePaidStatus.None]\n };\n};\n\n/**\n * Input class for get invoice data action.\n */\nexport class GetInvoicesInput implements IActionInput {\n public readonly searchCriteria: InvoiceSearchCriteria;\n\n public readonly queryResultSettings: IQueryResultSettings;\n\n constructor(searchCriteria: InvoiceSearchCriteria, queryResultSettings: IQueryResultSettings) {\n this.searchCriteria = searchCriteria;\n this.queryResultSettings = queryResultSettings;\n }\n\n public getCacheKey = () => 'BusinessPartnerInvoices';\n\n public getCacheObjectType = () => 'OrderInvoice';\n\n public dataCacheType = (): CacheType => 'none';\n}\n\nexport const CreateGetInvoicesInput = (inputData: ICreateActionContext): IActionInput => {\n const { requestContext } = inputData;\n\n // Check if the user is authenticated.\n if (!requestContext.user.isAuthenticated) {\n throw new Error('User is not logged in.');\n }\n\n const queryResultSettings: IQueryResultSettings = QueryResultSettingsProxy.fromInputData(inputData).QueryResultSettings;\n\n return new GetInvoicesInput(getDefaultSearchCriteria(), queryResultSettings);\n};\n\nexport async function getInvoices(input: GetInvoicesInput, context: IActionContext): Promise {\n if (!context?.requestContext?.user?.isAuthenticated) {\n throw new Error('Unable to get list of invoices. User is not authenticated.');\n }\n\n input.searchCriteria.InvoiceTypeValues = [InvoiceType.SalesOrderInvoice];\n\n const businessPartner = await getCurrentAsync({ callerContext: context });\n input.searchCriteria.BusinessPartnerId = businessPartner?.BusinessPartnerId;\n\n const customer = await getCustomer(new GetCustomerInput(context.requestContext.apiSettings), context);\n input.searchCriteria.CustomerId = customer.AccountNumber;\n\n return SalesOrdersDataActions.getInvoicesAsync(\n { callerContext: context, queryResultSettings: input.queryResultSettings },\n input.searchCriteria\n );\n}\n\nexport const getInvoicesDataAction = createObservableDataAction({\n id: 'get-invoices',\n action: >getInvoices,\n input: CreateGetInvoicesInput\n});\n\nexport default getInvoicesDataAction;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport {\n CacheType,\n createObservableDataAction,\n IAction,\n IActionContext,\n IActionInput,\n ICommerceApiSettings,\n ICreateActionContext\n} from '@msdyn365-commerce/core';\nimport { readAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/ScanResultsDataActions.g';\nimport { ProductDimension } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\n\nimport { getDimensionsForSelectedVariant, GetDimensionsForSelectedVariantInput } from '.';\nimport { IScanResultWithProduct } from './utilities/scan-result-with-product';\nimport { buildCacheKey } from './utilities/utils';\n\n/**\n * Input class to get product from sku number.\n */\nexport class GetScanResultInput implements IActionInput {\n public skuNumber: string;\n\n public channelId: number;\n\n public matchingDimensionValues: ProductDimension[];\n\n private readonly apiSettings: ICommerceApiSettings;\n\n constructor(apiSettings: ICommerceApiSettings, sku: string, channelId: number, matchingDimensionValues?: ProductDimension[]) {\n this.skuNumber = sku;\n this.channelId = channelId;\n this.matchingDimensionValues = matchingDimensionValues || [];\n this.apiSettings = apiSettings;\n }\n\n public getCacheKey = () => buildCacheKey(`Product-${this.skuNumber}`, this.apiSettings);\n\n public getCacheObjectType = () => 'ProductSKU';\n\n public dataCacheType = (): CacheType => 'request';\n}\n\n/**\n * CreateInput method for the getSelectedVariant data action.\n * @param inputData The input data passed to the createInput method.\n * @param skuuNumber SkuNumber to send ScanResult API.\n * @param skuNumber\n * @param channelId ChannelId required to get dimension for given product.\n * @param matchingDimensionValues\n */\nconst createInput = (\n inputData: ICreateActionContext,\n skuNumber: string,\n channelId: number,\n matchingDimensionValues?: ProductDimension[]\n) => {\n return new GetScanResultInput(inputData.requestContext.apiSettings, skuNumber, channelId, matchingDimensionValues);\n};\n\n/**\n * Action method for the product and dimension from scan result and dimension api.\n * @param input The action input class.\n * @param ctx The action context.\n */\nexport async function getScanResult(input: GetScanResultInput, ctx: IActionContext): Promise {\n return readAsync({ callerContext: ctx }, input.skuNumber)\n .then(scanResults => {\n if (scanResults && scanResults.Product) {\n return getDimensionsForSelectedVariant(\n new GetDimensionsForSelectedVariantInput(\n scanResults.Product.MasterProductId ? scanResults.Product.MasterProductId : scanResults.Product.RecordId,\n input.channelId,\n input.matchingDimensionValues,\n ctx.requestContext\n ),\n ctx\n )\n .then(response => {\n if (response && response.length > 0) {\n return { ScanResult: scanResults, Product: scanResults.Product, ProductDimensionFull: response };\n }\n return { ScanResult: scanResults, Product: scanResults.Product };\n })\n .catch((error: Error) => {\n ctx.trace(error.message);\n ctx.telemetry.exception(error);\n ctx.telemetry.debug('[getScanResult, getDimensionsForSelectedVariant]Error executing action');\n throw new Error('[getScanResult, getDimensionsForSelectedVariant]Error executing action');\n });\n }\n\n throw new Error('Unable to get result from scan result data action.');\n })\n .catch((error: Error) => {\n ctx.trace(error.message);\n ctx.telemetry.exception(error);\n ctx.telemetry.debug('[getScanResult]Error executing action');\n throw new Error('[getScanResult]Error executing action');\n });\n}\n\nexport default createObservableDataAction({\n id: '@msdyn365-commerce-modules/retail-actions/get-scan-results',\n action: >getScanResult,\n input: createInput\n});\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\n/**\n * Regular expressions to validate emails.\n */\n// eslint-disable-next-line @typescript-eslint/no-extraneous-class\nexport abstract class EmailRegex {\n /**\n * Represents a HTML5 Validation Regex.\n *\n * A valid email address is a string that matches the email production of the following ABNF, the character set for which is Unicode.\n * This ABNF implements the extensions described in RFC 1123.\n *\n * For more info: https://html.spec.whatwg.org/multipage/input.html#valid-e-mail-address.\n */\n public static readonly html5EmailRegex = /^[a-zA-Z0-9.!#$%&'*+=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z])?)+$/;\n\n /**\n * Returns a default regex which should be used for most email validation cases.\n *\n * As of now, the default regex is HTML5 email regex standard.\n * @see EmailRegex.html5EmailRegex - The regex which is set to be default right now.\n *\n * @returns Regular expression for email validation.\n */\n public static get defaultRegex(): RegExp {\n return EmailRegex.html5EmailRegex;\n }\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\n/**\n * Regular expressions to validate passwords.\n */\n// eslint-disable-next-line @typescript-eslint/no-extraneous-class\nexport abstract class PasswordRegex {\n // eslint-disable-next-line max-len\n public static readonly defaultRegex = /^((?=.*[a-z])(?=.*[A-Z])(?=.*\\d)|(?=.*[a-z])(?=.*[A-Z])(?=.*[^A-Za-z0-9])|(?=.*[a-z])(?=.*\\d)(?=.*[^A-Za-z0-9])|(?=.*[A-Z])(?=.*\\d)(?=.*[^A-Za-z0-9]))([A-Za-z\\d@#$%^&*\\-_+=[\\]{}|\\\\:',?/`~'();!]|\\.(?!@)){8,16}$/;\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\n/**\n * Regular expressions to validate phone number.\n */\n// eslint-disable-next-line @typescript-eslint/no-extraneous-class\nexport abstract class PhoneRegex {\n public static readonly defaultRegex = '^$|^[- +()]*[0-9][- +()0-9]*$';\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IAny, ICreateActionContext, IGeneric } from '@msdyn365-commerce/core';\nimport { QueryResultSettings } from '@msdyn365-commerce/retail-proxy';\n\nimport { QueryResultSettingsProxy } from './QueryResultSettingsProxy';\n\nexport interface ISearchData {\n q: string;\n skip: number;\n top: number;\n itemsPerPage: string;\n maxItems: string;\n channelId: number;\n queryResultSettings: QueryResultSettings;\n}\n\nexport const parseSearchData = (inputData: ICreateActionContext>): ISearchData => {\n // Query is of type 'IDictionary | undefined', so that q and skip are not recognized by tsc\n const {\n requestContext: {\n // @ts-expect-error:2339\n query: { q, top, skip },\n apiSettings: { channelId }\n },\n // @ts-expect-error:2339\n config: { maxItems, itemsPerPage }\n } = inputData;\n const queryResultSettings = QueryResultSettingsProxy.fromInputData(inputData).QueryResultSettings;\n return {\n q,\n skip: (skip && Number(skip)) || 0,\n top: (top && Number(top)) || 50,\n itemsPerPage, // TODO BUGBUG 21667361\n maxItems, // TODO BUGBUG 21667361\n channelId,\n queryResultSettings\n };\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport {\n CacheType,\n createObservableDataAction,\n IAction,\n IActionContext,\n IActionInput,\n ICommerceApiSettings\n} from '@msdyn365-commerce/core';\nimport { Customer } from '@msdyn365-commerce/retail-proxy';\nimport { readAsync, updateAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/CustomersDataActions.g';\n\nimport { buildCacheKey } from '.';\nimport { GetCustomerInput } from './get-customer';\n\nexport interface IUpdateCustomerPersonalizationInput extends IActionInput {\n isOptOut: boolean;\n userAccountNumber: string;\n apiSettings: ICommerceApiSettings;\n preferenceType?: string;\n}\n\n/**\n * Input class for the updateCustomerPersonalization.\n */\n// eslint-disable-next-line @typescript-eslint/naming-convention\nexport class updateCustomerPersonalizationInput implements IUpdateCustomerPersonalizationInput {\n public userAccountNumber: string;\n\n public isOptOut: boolean;\n\n public apiSettings: ICommerceApiSettings;\n\n public preferenceType: string | undefined;\n\n constructor(userAccountNumber: string, isOptOut: boolean, apiSettings: ICommerceApiSettings, preferenceType?: string) {\n this.userAccountNumber = userAccountNumber;\n this.apiSettings = apiSettings;\n this.isOptOut = isOptOut;\n this.preferenceType = preferenceType;\n }\n\n public getCacheKey = (): string => buildCacheKey(`${this.userAccountNumber}`, this.apiSettings);\n\n public getCacheObjectType = () => 'Customer';\n\n public dataCacheType = (): CacheType => 'none';\n}\n\n/**\n * The action method for the updateCustomerPersonalization data action.\n * @param input The action input.\n * @param ctx The action context.\n */\nexport async function updateCustomerPersonalizationAction(\n input: IUpdateCustomerPersonalizationInput,\n ctx: IActionContext\n): Promise {\n const { userAccountNumber, isOptOut, preferenceType } = input;\n const customer = await readAsync({ callerContext: ctx, bypassCache: 'get' }, userAccountNumber);\n if (!customer) {\n throw new Error('Unable to find customer');\n }\n\n const newCustomer = { ...customer };\n\n switch (preferenceType) {\n case 'web-tracking':\n newCustomer.OptOutWebActivityTracking = isOptOut;\n break;\n case undefined:\n case 'personalization':\n default:\n newCustomer.OptOutPersonalization = isOptOut;\n }\n\n const updatedCustomer = await updateAsync({ callerContext: ctx }, newCustomer);\n\n if (!updatedCustomer) {\n throw new Error('Unable to update customer');\n }\n\n ctx.update(new GetCustomerInput(ctx.requestContext.apiSettings), updatedCustomer);\n\n return updatedCustomer;\n}\n\n/**\n * The updateCustomerPersonalization data action\n * Returns the updated customer.\n */\nexport const updateCustomerPersonalizationActionDataAction = createObservableDataAction({\n id: '@msdyn365-commerce-modules/retail-actions/update-customer-personalization',\n action: >updateCustomerPersonalizationAction\n});\n\nexport default updateCustomerPersonalizationActionDataAction;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport {\n CacheType,\n createObservableDataAction,\n IAction,\n IActionContext,\n IActionInput,\n IHTTPRequestOptions,\n IHTTPResponse,\n sendCommerceRequest\n} from '@msdyn365-commerce/core';\nimport { Address, CartTenderLine, SalesOrder } from '@msdyn365-commerce/retail-proxy';\n\n/**\n * Check Out action Input.\n */\nexport class CheckOutInput implements IActionInput {\n public cartId: string;\n\n public cartVersion: number;\n\n public receiptEmail?: string;\n\n public cartTenderLines?: CartTenderLine[];\n\n public billingAddress?: Address;\n\n constructor(cartId: string, cartVersion: number, receiptEmail?: string, cartTenderLines?: CartTenderLine[], billingAddress?: Address) {\n this.cartId = cartId;\n this.cartVersion = cartVersion;\n this.receiptEmail = receiptEmail;\n this.cartTenderLines = cartTenderLines;\n this.billingAddress = billingAddress;\n }\n\n public getCacheKey = () => `${this.cartId}-${this.cartVersion}`;\n\n public getCacheObjectType = () => 'CheckOut';\n\n public dataCacheType = (): CacheType => 'none';\n}\n\n/**\n * Calls the Retail API to check out and returns sales order.\n * @param input\n * @param ctx\n */\nexport async function checkOutAction(input: CheckOutInput, ctx: IActionContext): Promise {\n const { apiSettings } = ctx.requestContext;\n const requestUrl = `${apiSettings.baseUrl}Commerce/Carts('${input.cartId}')/Checkout?api-version=7.3`;\n const requestOptions: IHTTPRequestOptions = {\n headers: {\n oun: apiSettings.oun,\n 'Content-Type': 'application/json'\n }\n };\n\n if (requestOptions.headers && ctx.requestContext.user.token) {\n requestOptions.headers.Authorization = `id_token ${ctx.requestContext.user.token}`;\n }\n\n if (input.cartTenderLines && input.cartTenderLines.length > 0) {\n input.cartTenderLines = input.cartTenderLines.map((cartTenderLineItem: CartTenderLine) => {\n cartTenderLineItem['@odata.type'] = '#Microsoft.Dynamics.Commerce.Runtime.DataModel.CartTenderLine';\n\n cartTenderLineItem['Amount@odata.type'] = '#Decimal';\n\n if (cartTenderLineItem.TokenizedPaymentCard) {\n cartTenderLineItem.TokenizedPaymentCard['@odata.type'] =\n '#Microsoft.Dynamics.Commerce.Runtime.DataModel.TokenizedPaymentCard';\n\n // Force the House prop to be set, so that call succeeds\n if (!cartTenderLineItem.TokenizedPaymentCard.House) {\n cartTenderLineItem.TokenizedPaymentCard.House = 'N/A';\n }\n\n if (cartTenderLineItem.TokenizedPaymentCard.CardTokenInfo) {\n cartTenderLineItem.TokenizedPaymentCard.CardTokenInfo['@odata.type'] =\n '#Microsoft.Dynamics.Commerce.Runtime.DataModel.CardTokenInfo';\n }\n\n if (input.billingAddress) {\n const { Phone, ThreeLetterISORegionName = '', Street, City, State, ZipCode } = input.billingAddress;\n cartTenderLineItem.TokenizedPaymentCard = {\n ...cartTenderLineItem.TokenizedPaymentCard,\n Phone,\n Country: ThreeLetterISORegionName.toUpperCase(),\n Address1: Street,\n City,\n State,\n Zip: ZipCode\n };\n }\n }\n\n return cartTenderLineItem;\n });\n }\n\n const requestBody = {\n receiptEmail: input.receiptEmail,\n cartVersion: input.cartVersion || null,\n ...(input.cartTenderLines && { cartTenderLines: input.cartTenderLines })\n };\n\n // Perform check-out operation\n return sendCommerceRequest(requestUrl, 'post', requestBody, requestOptions).then((response: IHTTPResponse) => {\n if (response.status >= 200 && response.status < 300 && response.data) {\n return response.data;\n } else if (response.data) {\n throw response.data;\n }\n throw new Error('[checkOutAction] Invalid response recieved from RetailServer');\n });\n}\n\nexport const checkOutActionDataAction = createObservableDataAction({\n id: '@msdyn365-commerce-modules/retail-actions/checkout',\n action: >checkOutAction\n});\nexport default checkOutActionDataAction;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport {\n CacheType,\n createObservableDataAction,\n IAction,\n IActionContext,\n IActionInput,\n IAny,\n ICreateActionContext,\n IGeneric\n} from '@msdyn365-commerce/core';\nimport { BusinessPartnerUser, NullResult } from '@msdyn365-commerce/retail-proxy';\nimport { deleteAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/BusinessPartnerUsersDataActions.g';\n\n/**\n * Input class for DeleteOrganizationUser data action.\n */\nexport class DeleteOrganizationUserInput implements IActionInput {\n public user: BusinessPartnerUser;\n\n constructor(newUser: BusinessPartnerUser) {\n this.user = newUser;\n }\n\n public getCacheKey = () => 'DeleteOrganizationUser';\n\n public getCacheObjectType = () => 'DeleteOrganizationUser';\n\n public dataCacheType = (): CacheType => 'none';\n}\n\n/**\n * Input class for DeleteOrganizationUser data action.\n * @param inputData\n * @param newUser\n */\nexport const createDeleteOrganizationUserInput = (\n inputData: ICreateActionContext>,\n newUser: BusinessPartnerUser\n): IActionInput => {\n const { requestContext } = inputData;\n\n // Check if the user is authenticated.\n if (!requestContext.user.isAuthenticated) {\n throw new Error('User is not logged in.');\n }\n\n return new DeleteOrganizationUserInput(newUser);\n};\n\n/**\n * The DeleteOrganizationUser data action\n * Calls getCurrent() to get a businessPartnerId from the user requesting the action.\n * It then maps the newUsers' businessPartnerId to the same as the above user.\n * Calls the createBusinessPartner to then create a new entitiy in the database with the\n * information passed into through newUser.\n * @param input\n * @param ctx\n */\nexport async function deleteOrganizationUser(input: DeleteOrganizationUserInput, ctx: IActionContext): Promise {\n const { user } = input;\n\n return deleteAsync({ callerContext: ctx }, user).catch(error => {\n console.log(error);\n ctx.telemetry.debug('[Delete-organization-user] Unable to delete BusinessPartnerUser account');\n throw new Error('[Delete-organization-user] Unable to delete BusinessPartnerUser account');\n });\n}\n\n/**\n * The DeleteOrganizationUser data action\n * Calls the read RetailServer API to get the BusinessPartnerId from the admin\n * account and Deletes that businessPartner to the recieved input (new User)/\n * We then send this new User through the RetailServer API so that the database\n * is updated.\n */\nexport const deleteOrganizationUserDataAction = createObservableDataAction({\n id: '@msdyn365-commerce-modules/retail-actions/delete-organization-user',\n action: >deleteOrganizationUser,\n input: <(args: ICreateActionContext) => IActionInput>(createDeleteOrganizationUserInput)\n});\n\nexport default deleteOrganizationUserDataAction;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IAny, ICreateActionContext, IGeneric, IRequestContext } from '@msdyn365-commerce/core';\nimport { QueryResultSettings, SortColumn } from '@msdyn365-commerce/retail-proxy';\n\nimport { IQueryResultSettingsModuleConfig } from './IQueryResultSettingsModuleConfig';\n\n/**\n * Wrapper for query result settings, which guarantees some properties that are optional in the real subject\n * and includes some common utilities for data actions.\n */\nexport class QueryResultSettingsProxy {\n // Real subject\n private readonly queryResultSettings: QueryResultSettings;\n\n /**\n * Factory method for data actions.\n * @param inputData - Input data.\n * @returns - Returns query result settings proxy.\n */\n public static fromInputData(inputData: ICreateActionContext>): QueryResultSettingsProxy {\n const { requestContext, config } = inputData;\n return QueryResultSettingsProxy.fromModuleData(requestContext, config as IQueryResultSettingsModuleConfig);\n }\n\n /**\n * Factory method for modules.\n * @param requestContext - RequestContext.\n * @param config - Module config from props.\n * @returns - Returns query result settings proxy.\n */\n public static fromModuleData(requestContext: IRequestContext, config: IQueryResultSettingsModuleConfig): QueryResultSettingsProxy {\n const sortingCriteria = (config && config.sortingCriteria) || undefined;\n const query = requestContext && requestContext.query;\n const top = (query && query.top) || undefined;\n const skip = (query && query.skip) || undefined;\n\n const queryResultSettings = {\n Paging: {\n Skip: (skip && Number(skip)) || 0,\n Top: (top && Number(top)) || config?.itemsPerPage || 50\n },\n Sorting: sortingCriteria || {}\n };\n\n return new QueryResultSettingsProxy(queryResultSettings);\n }\n\n /**\n * Return the query result settings with default paging or with the passed value.\n * @param inputData - Input Data.\n * @returns - Query Result settings.\n */\n public static getPagingFromInputDataOrDefaultValue(inputData: ICreateActionContext>): QueryResultSettings {\n const config: IQueryResultSettingsModuleConfig | undefined = inputData.config;\n const defaultPageSize: number = 100;\n const queryResultSettings: QueryResultSettings = {\n Paging: {\n // eslint-disable-next-line max-len -- Disable max length for next line.\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-argument, @typescript-eslint/no-unnecessary-condition -- Reading from config.\n Top:\n config?.itemsPerPage ??\n Number.parseInt(inputData.requestContext?.app?.platform?.defaultPageSizeForAPI ?? defaultPageSize, 10)\n }\n };\n return queryResultSettings;\n }\n\n /**\n * Factory method.\n * @returns - Returns query result settings proxy.\n */\n public static getDefault(): QueryResultSettingsProxy {\n return new QueryResultSettingsProxy({ Paging: {}, Sorting: {} });\n }\n\n /**\n * Private constructor, expect instances to be created with the factory method.\n * @param queryResultSettings - Query result setting.\n */\n private constructor(queryResultSettings: QueryResultSettings) {\n this.queryResultSettings = queryResultSettings;\n }\n\n public get QueryResultSettings(): QueryResultSettings {\n return this.queryResultSettings;\n }\n\n /**\n * Gets the hints for the cache key based on query result settings.\n * @returns - Returns cache key hint.\n */\n public get cacheKeyHint(): string {\n // The factory method guarantees values are defined\n const topHint = `top-${this.queryResultSettings.Paging!.Top!}`;\n const skipHint = `skip-${this.queryResultSettings.Paging!.Skip!}`;\n const sortingHintData =\n (this.queryResultSettings.Sorting!.Columns || [])\n .map((column: SortColumn) => {\n return `${column.ColumnName}--${(column.IsDescending && 'desc') || 'asc'}`;\n })\n .join(',') || undefined;\n const sortingHint = `sortBy-${sortingHintData}`;\n return `${topHint}|${skipHint}|${sortingHint}`;\n }\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { CategoryHierarchy } from '@msdyn365-commerce/commerce-entities';\nimport {\n CacheType,\n createObservableDataAction,\n getCatalogId,\n IAction,\n IActionContext,\n IActionInput,\n IAny,\n ICommerceApiSettings,\n ICreateActionContext,\n IGeneric,\n IRequestContext\n} from '@msdyn365-commerce/core';\nimport { Category, TextValueTranslation } from '@msdyn365-commerce/retail-proxy';\n\nimport getCategoryAction, { CategoriesInput as RawCategoriesInput } from './get-categories';\nimport { getCategoryUrl } from './utilities/Url-builder';\nimport { generateCacheKey } from './utilities/utils';\n\n/**\n * Input for get-categories data action.\n */\nexport class CategoriesInput implements IActionInput {\n public readonly maxItems: number;\n\n public readonly channelId: number;\n\n public includeRootCategory?: boolean;\n\n private readonly catalogId: number;\n\n private readonly sitePath: string;\n\n private readonly _mappedToHierarchy: boolean;\n\n private readonly apiSettings: ICommerceApiSettings;\n\n private readonly locale?: string;\n\n public constructor(context: IRequestContext, mappedToHierarchy: boolean, maxItems?: number, includeRootCategory?: boolean) {\n this._mappedToHierarchy = mappedToHierarchy;\n this.includeRootCategory = includeRootCategory;\n this.maxItems = maxItems || 250;\n this.channelId = context && context.apiSettings && context.apiSettings.channelId ? +context.apiSettings.channelId : 0;\n this.sitePath = (context && context.sitePath) || '';\n this.apiSettings = context.apiSettings;\n this.locale = context.locale || '';\n this.catalogId = getCatalogId(context);\n }\n\n public getCacheKey = () =>\n generateCacheKey(\n this.apiSettings,\n { key: 'SitePath', value: this.sitePath },\n { key: 'IncludeRootCategory', value: this.includeRootCategory },\n { key: 'Top', value: this.maxItems },\n { key: 'CatalogId', value: this.catalogId },\n { key: 'Locale', value: this.locale }\n );\n\n public getCacheObjectType = () => (this._mappedToHierarchy ? 'CategoryHierarchy' : 'Category');\n\n public dataCacheType = (): CacheType => 'request';\n\n public getLocale = (): string => this.locale || '';\n}\n\nconst 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\nexport interface ICategoryMap {\n [RecordId: number]: CategoryHierarchy;\n}\n\n/**\n * Creates a hierarchy of categories based on the ParentCategory property.\n * @param categoryList Categories that will be converted into a hierarchy.\n * @param ctx\n * @param locale\n * @returns Hierarchy of categories in array.\n */\nexport const mapCategoryToHierarchy = (\n categoryList: Category[],\n ctx: IActionContext,\n locale?: string,\n includeRootCategory?: boolean\n): CategoryHierarchy[] => {\n if (!categoryList || categoryList.length === 0) {\n return [];\n }\n\n const categoryMap: ICategoryMap = {};\n\n for (const category of categoryList) {\n const localName = getFriendlyName(locale, category.NameTranslations);\n const categoryHierarchy = { ...category };\n categoryHierarchy.NeutralizedName = category.Name;\n categoryHierarchy.Name = localName || categoryHierarchy.NeutralizedName;\n categoryMap[category.RecordId] = categoryHierarchy;\n }\n\n let rootCategory: CategoryHierarchy | undefined;\n\n for (const category of Object.values(categoryMap)) {\n const parentId = category.ParentCategory;\n category.Url = getCategoryUrl(category, ctx, categoryMap);\n if (parentId === 0) {\n rootCategory = category;\n continue;\n }\n\n const parent = parentId && categoryMap[parentId];\n if (parent) {\n parent.Children = parent.Children || [];\n parent.Children.push(category);\n }\n }\n\n if (!rootCategory) {\n return [];\n }\n\n if (includeRootCategory) {\n const categoryHierarchy: CategoryHierarchy[] = [];\n categoryHierarchy.push(rootCategory);\n return categoryHierarchy;\n }\n\n return rootCategory.Children ?? [];\n};\n\n/**\n * Creates the input required to make the retail api call.\n * @param inputData\n */\nexport const createCategoriesHierarchyInput = (inputData: ICreateActionContext>): IActionInput => {\n const topItems = inputData.config && inputData.config.topCategories && Number.parseInt(inputData.config.topCategories, 10);\n return new CategoriesInput(inputData.requestContext, true, topItems);\n};\n\n/**\n * Calls the Retail API and returns all the categories as a hierarchy.\n * @param input\n * @param ctx\n */\nexport async function getCategoryHierarchyAction(input: CategoriesInput, ctx: IActionContext): Promise {\n const categories = await getCategoryAction(new RawCategoriesInput(ctx.requestContext, false, input.maxItems), ctx);\n return mapCategoryToHierarchy(categories, ctx, input.getLocale(), input.includeRootCategory);\n}\n\nexport const getCategoryHierarchyActionDataAction = createObservableDataAction({\n id: '@msdyn365-commerce-modules/retail-actions/get-categories-hierarchy',\n action: >getCategoryHierarchyAction,\n input: createCategoriesHierarchyInput\n});\n\nexport default getCategoryHierarchyActionDataAction;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport {\n CacheType,\n createObservableDataAction,\n IAction,\n IActionContext,\n IActionInput,\n IAny,\n ICreateActionContext,\n IGeneric\n} from '@msdyn365-commerce/core';\nimport { BusinessPartnerUser } from '@msdyn365-commerce/retail-proxy';\nimport { updateAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/BusinessPartnerUsersDataActions.g';\n\n/**\n * Input class for edit organization user data action.\n */\nexport class EditOrganizationUserInput implements IActionInput {\n public user: BusinessPartnerUser;\n\n constructor(newUser: BusinessPartnerUser) {\n this.user = newUser;\n }\n\n public getCacheKey = () => 'EditOrganizationUser';\n\n public getCacheObjectType = () => 'EditOrganizationUser';\n\n public dataCacheType = (): CacheType => 'none';\n}\n\n/**\n * Input class for edit organization user data action.\n * @param inputData\n * @param newUser\n */\nexport const createEditOrganizationUserInput = (\n inputData: ICreateActionContext>,\n newUser: BusinessPartnerUser\n): IActionInput => {\n const { requestContext } = inputData;\n\n // Check if the user is authenticated.\n if (!requestContext.user.isAuthenticated) {\n throw new Error('User is not logged in.');\n }\n\n return new EditOrganizationUserInput(newUser);\n};\n\nexport async function editOrganizationUser(input: EditOrganizationUserInput, ctx: IActionContext): Promise {\n const { user } = input;\n\n return updateAsync({ callerContext: ctx }, user)\n .then(updatedUser => {\n return updatedUser;\n })\n .catch(() => {\n ctx.telemetry.debug('[Edit-organization-user] Unable to update BusinessPartnerUser account');\n throw new Error('[Edit-organization-user] Unable to update BusinessPartnerUser account');\n });\n}\n\n/**\n * The EditOrganizationUser data action\n * Takes in an instance of a BusinessPartnerUser and updates the\n * same user with the new information.\n */\nexport const editOrganizationUserDataAction = createObservableDataAction({\n id: '@msdyn365-commerce-modules/retail-actions/Edit-organization-user',\n action: >editOrganizationUser,\n input: <(args: ICreateActionContext) => IActionInput>(createEditOrganizationUserInput)\n});\n\nexport default editOrganizationUserDataAction;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport {\n ProductAvailableQuantity,\n ProductDimensionValueInventoryAvailability,\n ProductInventoryAvailability\n} from '@msdyn365-commerce/retail-proxy';\n\n/**\n * This setting defines the delivery modes supported.\n */\nexport enum DeliveryMode {\n allWareHouses = 0,\n shipping = 1,\n pickup = 2\n}\n\n/**\n * This setting defines the inventory levels supported.\n */\nexport enum InventoryLevels {\n physicalAvailable = 'physicalAvailable',\n totalAvailable = 'totalAvailable',\n threshold = 'inventoryThreshold'\n}\n\n/**\n * Product inventory information class.\n */\nexport interface IProductInventoryInformation {\n ProductAvailableQuantity: ProductAvailableQuantity;\n StockLevelCode?: string;\n StockLevelLabel?: string;\n IsProductAvailable: boolean;\n InventLocationId?: string;\n deliveryType?: DeliveryMode;\n}\n\n/**\n * This setting defines the inventory level values return by the API.\n */\nexport enum InventoryLevelValues {\n outOfStock = 'OOS',\n available = 'AVAIL'\n}\n\n/**\n * Retrieves inventory level code from the dimension based on the app config setting.\n * @param dimensionValuesWithInventory - The dimension info.\n * @param inventoryLevel - App config setting for inventory level.\n * @returns Inventory level code value.\n */\nexport const getInventoryLevelCodeFromDimensionValue = (\n dimensionValuesWithInventory: ProductDimensionValueInventoryAvailability,\n inventoryLevel?: InventoryLevels | undefined\n): InventoryLevelValues | undefined => {\n if (inventoryLevel === InventoryLevels.totalAvailable) {\n return dimensionValuesWithInventory.TotalAvailableInventoryLevelCode as InventoryLevelValues | undefined;\n }\n if (inventoryLevel === InventoryLevels.physicalAvailable) {\n return dimensionValuesWithInventory.PhysicalAvailableInventoryLevelCode as InventoryLevelValues | undefined;\n }\n return undefined;\n};\n\n/**\n * Retrieves inventory level code from the product availability based on the app config setting.\n * @param productAvailability - The product availability info.\n * @param inventoryLevel - App config setting for inventory level.\n * @returns Inventory level code value.\n */\nexport const getInventoryLevelCodeFromProductAvailability = (\n productAvailability: ProductInventoryAvailability,\n inventoryLevel?: InventoryLevels | undefined\n): InventoryLevelValues | undefined => {\n if (inventoryLevel === InventoryLevels.totalAvailable) {\n return productAvailability.TotalAvailableInventoryLevelCode as InventoryLevelValues | undefined;\n }\n if (inventoryLevel === InventoryLevels.physicalAvailable) {\n return productAvailability.PhysicalAvailableInventoryLevelCode as InventoryLevelValues | undefined;\n }\n return undefined;\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport {\n CacheType,\n createObservableDataAction,\n getCatalogId,\n IAction,\n IActionContext,\n IActionInput,\n IAny,\n ICommerceApiSettings,\n ICreateActionContext,\n IDictionary,\n IGeneric,\n IRequestContext\n} from '@msdyn365-commerce/core';\nimport { getByIdsAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/ProductsDataActions.g';\nimport { SimpleProduct } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\n\nimport { ArrayExtensions, generateCacheKey } from './utilities';\nimport { QueryResultSettingsProxy } from './utilities/QueryResultSettingsProxy';\nimport { generateProductImageUrl } from './utilities/utils';\n\n/**\n * Product Input.\n */\nexport class ProductInput implements IActionInput {\n public productId: number;\n\n public channelId: number;\n\n public warehouseId?: string;\n\n public catalogId?: number;\n\n private readonly apiSettings: ICommerceApiSettings;\n\n public constructor(\n productId: number | string,\n apiSettings: ICommerceApiSettings,\n channelId?: number,\n warehouseId?: string,\n requestContext?: IRequestContext,\n catalogId?: number\n ) {\n this.apiSettings = apiSettings;\n this.productId = +productId;\n this.channelId = channelId || apiSettings.channelId;\n this.warehouseId = warehouseId;\n this.catalogId = catalogId;\n\n if (requestContext && catalogId === undefined) {\n this.catalogId = getCatalogId(requestContext);\n }\n }\n\n public getCacheKey = () =>\n generateCacheKey(\n this.apiSettings,\n { key: 'ProductRecordId', value: this.productId },\n { key: 'ChannelId', value: this.channelId },\n { key: 'WarehouseId', value: this.warehouseId },\n { key: 'CatalogId', value: this.catalogId }\n );\n\n public getCacheObjectType = () => 'SimpleProduct';\n\n public dataCacheType = (): CacheType => 'application';\n}\n\n/**\n * Creates the input required to make the retail api call.\n * @param inputData\n */\nexport const createSimpleProductsInput = (inputData: ICreateActionContext>): IActionInput[] => {\n let productIds = inputData.config && inputData.config.productIds;\n if (!productIds) {\n return [];\n }\n\n productIds = typeof productIds === 'string' ? productIds.split(',') : productIds;\n return !Array.isArray(productIds)\n ? []\n : productIds.map((productId: string) => {\n return new ProductInput(productId, inputData.requestContext.apiSettings, undefined, undefined, inputData.requestContext);\n });\n};\n\n/**\n * Calls the Retail API and returns the product based on the passed ProductInput.\n * @param inputs\n * @param ctx\n */\nexport async function getSimpleProductsAction(inputs: ProductInput[], ctx: IActionContext): Promise {\n if (!ArrayExtensions.hasElements(inputs)) {\n ctx.trace('[getSimpleProductsAction] Invalid or empty inputs passed.');\n return [];\n }\n\n const productIdMapping: IDictionary = {};\n\n for (let index = 0; index < inputs.length; ++index) {\n productIdMapping[inputs[index].productId] = index;\n }\n\n const getProductPromises: Promise[] = [];\n const catalogIds = ArrayExtensions.unique(inputs.map(input => input.catalogId));\n for (const catalogId of catalogIds) {\n const productInputs = inputs.filter(input => input.catalogId === catalogId);\n getProductPromises.push(\n getByIdsAsync(\n { callerContext: ctx, queryResultSettings: QueryResultSettingsProxy.getPagingFromInputDataOrDefaultValue(ctx) },\n inputs[0].channelId,\n productInputs.map(input => input.productId),\n inputs[0].warehouseId ?? null,\n catalogId ?? 0\n )\n .then(response => {\n return response;\n })\n .catch(error => {\n ctx.telemetry.debug(`[getSimpleProductsAction] Error in getting response from server. ${error}`);\n return {};\n })\n );\n }\n\n const products = ArrayExtensions.flatten(await Promise.all(getProductPromises));\n const mappedProducts = products\n .map(product => {\n try {\n const newImageUrl = generateProductImageUrl(product, ctx.requestContext.apiSettings);\n\n if (newImageUrl) {\n product.PrimaryImageUrl = newImageUrl;\n }\n\n return product;\n } catch {\n ctx.trace('[getSimpleProductsAction] Unable to update ImageURL for Product');\n return undefined;\n }\n })\n .reduce((memo: SimpleProduct[], product: SimpleProduct | undefined) => {\n if (!product) {\n return memo;\n }\n const index = productIdMapping[product.RecordId];\n memo[index] = product;\n return memo;\n }, []);\n\n // NOTE: This is not an ideal fix, but will resolve all current issues\n return inputs.map(input => {\n const foundProduct = mappedProducts.find(product => product && product.RecordId === input.productId);\n return foundProduct || {};\n });\n}\n\nexport default createObservableDataAction({\n id: '@msdyn365-commerce-modules/retail-actions/get-simple-products',\n action: >getSimpleProductsAction,\n input: createSimpleProductsInput,\n isBatched: true\n});\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport {\n CacheType,\n createObservableDataAction,\n IAction,\n IActionContext,\n IActionInput,\n ICreateActionContext\n} from '@msdyn365-commerce/core';\nimport { IQueryResultSettings } from '@msdyn365-commerce/retail-proxy';\n\nimport { OrderTemplate } from '../utilities/order-templates';\nimport { QueryResultSettingsProxy } from '../utilities/QueryResultSettingsProxy';\nimport getFullOrderTemplates, { GetFullOrderTemplatesInput } from './get-full-order-templates';\n\n/**\n * Input class for the GetOrderTemplates data action.\n */\nexport class GetOrderTemplatesPreviewInput implements IActionInput {\n public queryResultSettings: IQueryResultSettings;\n\n constructor(queryResultSettings: IQueryResultSettings) {\n this.queryResultSettings = queryResultSettings;\n this.queryResultSettings.count = true;\n this.queryResultSettings.Paging!.Top = 4;\n }\n\n public getCacheKey = () => 'GetOrderTemplatesPreview';\n\n public getCacheObjectType = () => 'GetOrderTemplatesPreview';\n\n public dataCacheType = (): CacheType => 'none';\n}\n\n/**\n * CreateInput method for the GetOrderTemplate method.\n * @param inputData The input data passed to the createInput method.\n */\nexport const createGetOrderTemplatesPreviewInput = (inputData: ICreateActionContext): GetOrderTemplatesPreviewInput => {\n const queryResultSettings: IQueryResultSettings = QueryResultSettingsProxy.fromInputData(inputData).QueryResultSettings;\n return new GetOrderTemplatesPreviewInput(queryResultSettings);\n};\n\n/**\n * The action method for the GetOrderTemplatesPreview data action.\n * @param input The action input.\n * @param context The action context.\n */\nexport async function getOrderTemplatesPreview(input: GetOrderTemplatesPreviewInput, context: IActionContext): Promise {\n const response: OrderTemplate[] = [];\n if (!context.requestContext.user.isAuthenticated) {\n context.trace('Unable to get order templates preview. User is not authenticated.');\n return Promise.resolve(response);\n }\n return getFullOrderTemplates(new GetFullOrderTemplatesInput(input.queryResultSettings, false, false), context);\n}\n\n/**\n * The GetOrderTemplatesPreview Data Action\n * Returns order templates.\n */\nexport const getOrderTemplatesPreviewDataAction = createObservableDataAction({\n id: '@msdyn365-commerce-modules/retail-actions/order-templates/get-order-templates-preview',\n action: >getOrderTemplatesPreview,\n input: createGetOrderTemplatesPreviewInput\n});\n\nexport default getOrderTemplatesPreviewDataAction;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport {\n CacheType,\n createObservableDataAction,\n IAction,\n IActionContext,\n IActionInput,\n IAny,\n ICommerceApiSettings,\n ICreateActionContext,\n IGeneric\n} from '@msdyn365-commerce/core';\nimport { ChannelDeliveryOptionConfiguration } from '@msdyn365-commerce/retail-proxy';\nimport { getChannelDeliveryOptionConfigurationAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/StoreOperationsDataActions.g';\n\nimport { buildCacheKey } from './utilities/utils';\n\n/**\n * Input class for get channel delivery option configuration data action.\n */\nexport class GetChannelDeliveryConfigurationInput implements IActionInput {\n private readonly apiSettings: ICommerceApiSettings;\n\n constructor(apiSettings: ICommerceApiSettings, accountNumber?: string) {\n this.apiSettings = apiSettings;\n }\n\n public getCacheKey = () => buildCacheKey('ChannelDeliveryConfiguration', this.apiSettings);\n\n public getCacheObjectType = () => 'ChannelDeliveryConfiguration';\n\n public dataCacheType = (): CacheType => 'application';\n}\n\n/**\n * Creates the input required to make the retail api call.\n * @param inputData\n */\nconst createInput = (inputData: ICreateActionContext>): GetChannelDeliveryConfigurationInput => {\n const { apiSettings } = inputData.requestContext;\n if (!apiSettings) {\n throw new Error('[getChannelDeliveryOptionConfiguration][createInput]: API setting not available.');\n }\n\n return new GetChannelDeliveryConfigurationInput(apiSettings);\n};\n\nconst getChannelDeliveryOptionConfigurationAction = async (\n input: GetChannelDeliveryConfigurationInput,\n ctx: IActionContext\n): Promise => {\n if (input) {\n return getChannelDeliveryOptionConfigurationAsync({ callerContext: ctx }).then(response => {\n return response;\n });\n }\n\n ctx.trace('[get-channel-delivery-option-configuration]Invalid input passed to action');\n return {};\n};\n\nexport default createObservableDataAction({\n id: '@msdyn365-commerce-modules/retail-actions/get-channel-delivery-option-configuration',\n action: >getChannelDeliveryOptionConfigurationAction,\n input: createInput\n});\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { FullProduct } from '@msdyn365-commerce/commerce-entities';\nimport { CacheType, createObservableDataAction, IAction, IActionContext, IActionInput } from '@msdyn365-commerce/core';\nimport { ProductListsDataActions } from '@msdyn365-commerce/retail-proxy';\n\nimport getFullProducts, { FullProductInput } from './get-full-products';\nimport { ArrayExtensions } from './utilities';\nimport { IQuickOrderTemplateLinesState, QuickOrderTemplateLine } from './utilities/quick-order-template-line';\nimport { getProductDetailsCriteriaFromActionInput } from './utilities/utils';\n\n/**\n * Input class for the GetProductListLines data action.\n *\n */\nexport class GetProductListLinesInput implements IActionInput {\n public productListId: string;\n\n public searchText: string;\n\n public constructor(productListId: string, searchText?: string) {\n this.productListId = productListId;\n this.searchText = searchText ?? '';\n }\n\n /**\n * Get Cache Key.\n * @returns - Cache key string.\n */\n public getCacheKey = (): string => `GetProductListLines|${this.productListId}|${this.searchText}`;\n\n /**\n * Get Cachetype Name.\n * @returns - Cache name string.\n */\n public getCacheObjectType = (): string => 'GetProductListLines';\n\n /**\n * Get Cachetype.\n * @returns - CacheType enum.\n */\n public dataCacheType = (): CacheType => 'none';\n}\n\n/**\n * CreateInput method for the GetProductListLines method.\n * @param productListId - ProductList Id.\n * @param searchText - Search Text.\n * @returns - Input data for getproductlistlines.\n */\nexport const createGetProductListLinesInput = (productListId: string, searchText?: string): GetProductListLinesInput => {\n return new GetProductListLinesInput(productListId, searchText);\n};\n\n/**\n * The action method for the GetProductListLines data action.\n * @param input - The action input.\n * @param context - The action context.\n * @returns - Product list lines.\n */\nexport async function getProductListLinesAction(\n input: GetProductListLinesInput,\n context: IActionContext\n): Promise {\n if (!context.requestContext.user.isAuthenticated) {\n throw new Error('Unable to get full product list lines. User is not authenticated.');\n }\n\n const quickOrderTemplateLinesState: IQuickOrderTemplateLinesState = {\n lines: [],\n totalCount: 0\n };\n\n const promise = ProductListsDataActions.getProductListLinesAsync(\n {\n callerContext: context\n },\n input.productListId,\n input.searchText\n );\n\n const productListLines = await promise;\n const productInputs: FullProductInput[] = [];\n\n if (ArrayExtensions.hasElements(productListLines)) {\n quickOrderTemplateLinesState.totalCount = promise.metadata.count ?? quickOrderTemplateLinesState.lines.length;\n productListLines.map(listLine => {\n if (listLine.ProductId) {\n quickOrderTemplateLinesState.lines.push(new QuickOrderTemplateLine(listLine));\n productInputs.push(\n new FullProductInput(\n listLine.ProductId,\n context.requestContext.apiSettings,\n getProductDetailsCriteriaFromActionInput(context),\n context.requestContext\n )\n );\n }\n return productInputs;\n });\n if (ArrayExtensions.hasElements(productInputs)) {\n const fullProductsInfo = await getFullProducts(productInputs, context)\n .then((products: FullProduct[]) => {\n return products;\n })\n .catch((error: Error) => {\n context.trace(error.message);\n context.telemetry.error('[getProductListLinesAction] Unable to retrieve product info.');\n });\n if (fullProductsInfo) {\n quickOrderTemplateLinesState.lines.map(line => {\n const fullProduct = fullProductsInfo.find(\n product => product.ProductDetails.RecordId === line.productListLine.ProductId\n );\n if (!fullProduct) {\n context.telemetry.error('[getProductListLinesAction] Unable to find product info for an product list line.');\n return null;\n }\n line.fullProduct = fullProduct;\n return null;\n });\n }\n return quickOrderTemplateLinesState;\n }\n context.trace(quickOrderTemplateLinesState.lines.length.toString());\n return quickOrderTemplateLinesState;\n }\n return quickOrderTemplateLinesState;\n}\n\n/**\n * The GetProductListLines Data Action\n * Returns order templates.\n */\nexport const getProductListLinesActionDataAction = createObservableDataAction({\n id: '@msdyn365-commerce-modules/retail-actions/get-product-list-lines',\n action: getProductListLinesAction as IAction,\n input: createGetProductListLinesInput\n});\n\nexport default getProductListLinesActionDataAction;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IProductDimensionsWithAvailabilitiesFull, ProductDimensionFull } from '@msdyn365-commerce/commerce-entities';\nimport {\n CacheType,\n createObservableDataAction,\n getCatalogId,\n IAction,\n IActionContext,\n IActionInput,\n IAny,\n ICreateActionContext,\n IGeneric,\n IRequestContext\n} from '@msdyn365-commerce/core';\nimport {\n ProductDimension,\n ProductDimensionAvailabilitySearchCriteria,\n ProductDimensionValue,\n ProductDimensionValueInventoryAvailability,\n ProductsDataActions\n} from '@msdyn365-commerce/retail-proxy';\n\nimport { ArrayExtensions, generateCacheKey } from './utilities';\nimport { createInventoryAvailabilitySearchCriteria } from './utilities/product-inventory-utils';\nimport { QueryResultSettingsProxy } from './utilities/QueryResultSettingsProxy';\nimport { getDimensionValuesFromQuery, getSelectedProductIdFromActionInput } from './utilities/utils';\n\n/**\n * Defines the dimension value type for get dimensions for selected variant data action.\n * Includes old API format for backward compatibility and new API info for availabilities for new logic.\n */\nexport interface IDimensionValueForSelectedVariant extends ProductDimensionValueInventoryAvailability, ProductDimensionValue {}\n\n/**\n * Defines the returned type for get dimensions for selected variant data action.\n * Includes old API format for backward compatibility and new API info for availabilities for new logic.\n */\nexport interface IDimensionForSelectedVariant extends ProductDimensionFull, IProductDimensionsWithAvailabilitiesFull {}\n\n/**\n * Input class for the getDimensionsForSelectedVariant data action.\n */\nexport class GetDimensionsForSelectedVariantInput implements IActionInput {\n public productId: number;\n\n public channelId: number;\n\n public matchingDimensionValues: ProductDimension[];\n\n public catalogId?: number;\n\n private _requestContext?: IRequestContext;\n\n public constructor(\n productId: number,\n channelId: number,\n matchingDimensionValues?: ProductDimension[],\n requestContext?: IRequestContext\n ) {\n this._requestContext = requestContext;\n this.productId = productId;\n this.channelId = channelId;\n this.matchingDimensionValues = matchingDimensionValues || [];\n\n if (requestContext) {\n this.catalogId = getCatalogId(requestContext);\n }\n }\n\n /**\n * Cache key.\n * @returns String.\n */\n public getCacheKey: () => string = () =>\n generateCacheKey(\n this._requestContext?.apiSettings,\n { key: 'Key', value: 'DimensionsForSelectedVariantInput' },\n { key: 'ProductId', value: this.productId },\n { key: 'ChannelId', value: this.channelId },\n { key: 'CatalogId', value: this.catalogId }\n );\n\n /**\n * Cache object type.\n * @returns String.\n */\n public getCacheObjectType: () => string = () => 'DimensionsForSelectedVariantInput';\n\n /**\n * Cache type.\n * @returns String.\n */\n public dataCacheType = (): CacheType => 'none';\n}\n\n/**\n * Create input method for the getDimensionsForSelectedVariant data action.\n * @param inputData - The input data passed to the createInput method.\n * @returns - The input for the data action.\n */\nconst createDimensionsForSelectedVariantInput = (inputData: ICreateActionContext>): GetDimensionsForSelectedVariantInput => {\n const productId = getSelectedProductIdFromActionInput(inputData);\n\n if (productId) {\n return new GetDimensionsForSelectedVariantInput(\n +productId,\n +inputData.requestContext.apiSettings.channelId,\n getDimensionValuesFromQuery(inputData.requestContext.url.requestUrl),\n inputData.requestContext\n );\n }\n throw new Error('Unable to create DimensionsForSelectedVariantInput, no productId found on module config or query');\n};\n\n/**\n * Converts new API type with availabilities to old API type to preserve backward compatibility.\n * @param dimensions - Dimensions to convert.\n * @returns Dimensions in old API format.\n */\nconst prepareDimensionsDataResult = (dimensions: IProductDimensionsWithAvailabilitiesFull[]): IDimensionForSelectedVariant[] => {\n return dimensions.map(newDimension => {\n const oldDimension: IDimensionForSelectedVariant = { ...newDimension };\n oldDimension.DimensionValues = ArrayExtensions.validValues(\n newDimension.dimensionValuesWithInventory?.map(value => value.DimensionValue)\n );\n return oldDimension;\n });\n};\n\n/**\n * Action Method for the getDimensionsForSelectedVariant Data Action.\n * @param input - Input for the data action.\n * @param context - Action context.\n * @returns Product dimensions with availability.\n */\nexport async function getDimensionsForSelectedVariantAction(\n input: GetDimensionsForSelectedVariantInput,\n context: IActionContext\n): Promise {\n const activeProducts = ArrayExtensions.validValues(\n await ProductsDataActions.getByIdsAsync(\n {\n callerContext: context,\n queryResultSettings: QueryResultSettingsProxy.getPagingFromInputDataOrDefaultValue(context)\n },\n input.channelId,\n [input.productId],\n null,\n input.catalogId ?? 0\n )\n );\n\n if (!ArrayExtensions.hasElements(activeProducts)) {\n return [];\n }\n\n const activeProduct = activeProducts[0];\n\n if (!ArrayExtensions.hasElements(activeProduct.Dimensions)) {\n return [];\n }\n\n const promises = activeProduct.Dimensions.map(dimension => {\n const shippingInventoryConfiguration = createInventoryAvailabilitySearchCriteria(context, [], true, undefined, undefined);\n\n const searchCriteria: ProductDimensionAvailabilitySearchCriteria = {\n RequestedDimensionTypeValue: dimension.DimensionTypeValue,\n MatchingDimensionValues: input.matchingDimensionValues.filter(item => item.DimensionTypeValue !== dimension.DimensionTypeValue),\n DefaultWarehouseOnly: shippingInventoryConfiguration.DefaultWarehouseOnly,\n FilterByChannelFulfillmentGroup: shippingInventoryConfiguration.FilterByChannelFulfillmentGroup,\n DeliveryModeTypeFilterValue: shippingInventoryConfiguration.DeliveryModeTypeFilterValue,\n CatalogId: input.catalogId\n };\n\n const dimensionValuesPromise = ProductsDataActions.getDimensionValuesWithEstimatedAvailabilitiesAsync(\n { callerContext: context, queryResultSettings: QueryResultSettingsProxy.getPagingFromInputDataOrDefaultValue(context) },\n activeProduct.MasterProductId ? activeProduct.MasterProductId : activeProduct.RecordId,\n searchCriteria\n );\n const fullDimensionPromise = dimensionValuesPromise.then(dimensionValues => {\n const fullDimension: IProductDimensionsWithAvailabilitiesFull = {\n ...dimension,\n dimensionValuesWithInventory: dimensionValues\n };\n return fullDimension;\n });\n\n return fullDimensionPromise;\n });\n\n const dimensionValuesResults = await Promise.all(promises);\n\n return prepareDimensionsDataResult(dimensionValuesResults);\n}\n\n/**\n * The GetDimensionsForSelectedVariantDataAction\n * Get the currently selected Variant via the getSelectedVariant data action, and the gets the\n * available product dimensions for the variant via the getDimensionValues RetailServer API.\n */\nexport const getDimensionsForSelectedVariantActionDataAction = createObservableDataAction({\n id: '@msdyn365-commerce-modules/retail-actions/get-dimensions/for-selected-variant',\n action: getDimensionsForSelectedVariantAction as IAction,\n input: createDimensionsForSelectedVariantInput\n});\n\nexport default getDimensionsForSelectedVariantActionDataAction;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { PromiseBodyWrapper } from './base-promise-queue';\nimport { PromiseQueue } from './promise-queue';\n\nexport enum FinitePromiseQueueError {\n InvalidMaxQueueLengthPassed = 'Invalid maxQueueLength value passed to FinitePromiseQueue. maxQueueLength should be more or equal to 2.',\n ProcessWasDiscardedFromTheQueue = 'The process was discarded from FinitePromiseQueue.'\n}\n\n/**\n * Represents a FIFO queue over promises with a limited number of elements waiting for execution.\n * @remark\n * In case the queue reaches the limit,\n * before adding a new element the queue discards the oldest added element which is waiting to be processed.\n * Does not discard elements which are in progress under execution.\n * The discarded element will not be processed and executed.\n * @author Bohdan Yevchenko \n */\nexport class FinitePromiseQueue extends PromiseQueue {\n /**\n * @see constructor\n */\n private readonly _maxQueueLength: number;\n\n /**\n * Initializes the queue with the given limit.\n * @param {number} maxQueueLength\n * Defines the limit of maximum number of elements in the queue.\n * @remarks Includes both the number of elements waiting for the execution\n * and the element processed by the queue at the moment (in case there is some).\n * Value can't be less than 2.\n */\n public constructor(maxQueueLength: number) {\n if (maxQueueLength < 2) {\n throw new Error(FinitePromiseQueueError.InvalidMaxQueueLengthPassed);\n }\n\n super();\n this._maxQueueLength = maxQueueLength;\n }\n\n /**\n * Adds promise to the queue and automatically starts the queue execution.\n * @remarks In case the queue has reached the limit, also discards the oldest added element.\n * @param {PromiseBodyWrapper} promiseBody\n * The body of a function which contains a call to the promise which has to be executed in the queue.\n */\n public async enqueue(promiseBody: PromiseBodyWrapper): Promise {\n let totalElementsCount = this._queue.length;\n\n // If queue hasn't finished processing an element,\n // consider this element as pending.\n if (this._isBusy) {\n ++totalElementsCount;\n }\n\n // Discards the oldest added element from the queue to meet the given limitations.\n // The very first element in the queue is considered as oldest added.\n // Can't discard the element which is under execution as the promise can't be cancelled.\n if (totalElementsCount === this._maxQueueLength) {\n const element = this._queue.shift();\n if (element) {\n element.reject(FinitePromiseQueueError.ProcessWasDiscardedFromTheQueue);\n }\n }\n\n return super.enqueue(promiseBody);\n }\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { CacheType, IActionInput } from '@msdyn365-commerce/core';\n\n/**\n * ReviewsGetRatingsSummary Input Action.\n */\nexport class GetRatingsSummaryInput 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 ratings and reviews service endpoint.\n */\n public serviceEndpoint: string;\n\n constructor(productId: string, tenantId: string, serviceEndpoint: string) {\n this.productId = productId;\n this.tenantId = tenantId;\n this.serviceEndpoint = serviceEndpoint;\n }\n\n // RnR does not use RS endpoint, so shouldn't use buildCacheKey\n public getCacheKey = () => `${this.productId}-${this.tenantId}`;\n\n public getCacheObjectType = () => 'RatingsSummary';\n\n public dataCacheType = (): CacheType => 'application';\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport {\n CacheType,\n createObservableDataAction,\n IAction,\n IActionContext,\n IActionInput,\n IAny,\n ICommerceApiSettings,\n ICreateActionContext,\n IGeneric\n} from '@msdyn365-commerce/core';\nimport { getCartState } from '@msdyn365-commerce/global-state';\nimport { ProductDeliveryOptions, ProductsDataActions } from '@msdyn365-commerce/retail-proxy';\n\nimport { ActiveCartProductsInput, buildCacheKey, getActiveCartProductsAction } from '.';\nimport { ArrayExtensions } from './utilities';\nimport { QueryResultSettingsProxy } from './utilities/QueryResultSettingsProxy';\n\n/**\n * Input class for pickup delivery options for items in cart.\n */\nexport class ProductPickUpOptionsForCartLineItems implements IActionInput {\n public readonly apiSettings: ICommerceApiSettings;\n\n public constructor(apiSettings: ICommerceApiSettings) {\n this.apiSettings = apiSettings;\n }\n\n /**\n * Get Cache Key.\n * @returns - Cache key string.\n */\n public getCacheKey = (): string => buildCacheKey('ActiveCartLineItemsPickUpOptions', this.apiSettings);\n\n /**\n * Get Cachetype Name.\n * @returns - Cache name string.\n */\n public getCacheObjectType = (): string => 'ActiveCartLineItemsPickUpOptions';\n\n /**\n * Get Cachetype.\n * @returns - CacheType enum.\n */\n public dataCacheType = (): CacheType => 'request';\n}\n\n/**\n * CreateInput method for the GetPickUpOptionCartLineItems method.\n * @param inputData - The input data passed to the createInput method.\n * @returns - Input for data action.\n */\nconst createInput = (inputData: ICreateActionContext>) => {\n return new ProductPickUpOptionsForCartLineItems(inputData.requestContext.apiSettings);\n};\n\n/**\n * The action method for the GetPickUpOptionCartLineItems data action.\n * @param input - The action input.\n * @param context - The action context.\n * @returns - Order Template object.\n */\nexport async function getPickUpOptionsForCartLineItems(\n input: ProductPickUpOptionsForCartLineItems,\n context: IActionContext\n): Promise {\n // If no input is provided fail out\n if (!input.apiSettings.channelId) {\n throw new Error('[getPickUpOptionsForCartLineItems]No valid Input was provided, failing');\n }\n const cartState = await getCartState(context);\n const cart = cartState.cart;\n const products = await getActiveCartProductsAction(new ActiveCartProductsInput(), context);\n const filterOption = 4;\n const response: ProductDeliveryOptions[] = [];\n\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- existing code.\n if (cart === undefined || !ArrayExtensions.hasElements(products)) {\n return Promise.resolve(response);\n }\n\n const pickupoptions = await ProductsDataActions.getDeliveryOptionsAsync(\n {\n callerContext: context,\n queryResultSettings: QueryResultSettingsProxy.getPagingFromInputDataOrDefaultValue(context)\n },\n products.map(product => product.RecordId),\n {},\n filterOption\n );\n\n return pickupoptions;\n}\n\n/**\n * The GetPickupOptionCartLineItems Data Action\n * Returns pickup options.\n */\nexport const getPickUpOptionsForCartLineItemsDataAction = createObservableDataAction({\n id: '@msdyn365-commerce-modules/retail-actions/get-pickup-options-for-cartlines',\n action: getPickUpOptionsForCartLineItems as IAction,\n input: createInput\n});\n\nexport default getPickUpOptionsForCartLineItemsDataAction;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nexport * from './data-structures';\nexport * from './events';\nexport * from './extensions';\nexport * from './product-inventory-information';\nexport * from './promise-queue';\nexport * from './QueryResultSettingsProxy';\nexport * from './random';\nexport * from './regex';\nexport * from './utils';\nexport * from './validate-cartlines-inventory';\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IProductsDimensionsAvailabilities } from '@msdyn365-commerce/commerce-entities';\nimport { CacheType, createObservableDataAction, IAction, IActionContext, IActionInput, ICoreContext } from '@msdyn365-commerce/core';\nimport { ProductDimensionType, ProductDimensionValueInventoryAvailability, ProductSearchResult } from '@msdyn365-commerce/retail-proxy';\n\nimport {\n getDimensionAvailabilitiesForProductsAction,\n ProductsDimensionAvailabilitiesInput\n} from './get-dimension-availabilities-for-products';\nimport {\n ArrayExtensions,\n checkIfShouldDisplayAsSwatch,\n DimensionTypes,\n DimensionSwatchDisplayTypes,\n getInventoryLevelCodeFromDimensionValue,\n IDimensionsApp,\n InventoryLevelValues\n} from './utilities';\n\n/**\n * Input class for the GetDimensionAvailabilitiesForProductSearchResult Data Action.\n */\nexport class DimensionAvailabilitiesForProductSearchResultInput implements IActionInput {\n public products: ProductSearchResult[];\n\n public dimensionContext: ICoreContext;\n\n public displayType: DimensionSwatchDisplayTypes | undefined;\n\n public constructor(\n products: ProductSearchResult[],\n dimensionContext: ICoreContext,\n displayType?: DimensionSwatchDisplayTypes\n ) {\n this.products = products;\n this.dimensionContext = dimensionContext;\n this.displayType = displayType;\n }\n\n /**\n * Get the cache key.\n * @returns The cache key.\n */\n public getCacheKey = (): string =>\n `DimensionAvailabilitiesForProductSearchResult:${this.products.map(product => product.RecordId).join('-')}`;\n\n /**\n * Get the cache object type.\n * @returns The cache object type.\n */\n public getCacheObjectType = (): string => 'ProductDimensionValueInventoryAvailability';\n\n /**\n * Define the data cache type.\n * @returns The cache type.\n */\n public dataCacheType = (): CacheType => 'none';\n}\n\n/**\n * The createInput method for the GetDimensionAvailabilitiesForProductSearchResultDataAction.\n * @param products -- The product search result.\n * @param dimensionContext -- The dimension app context.\n * @returns The input.\n */\nexport const createDimensionAvailabilitiesForProductSearchResultInput = (\n products: ProductSearchResult[],\n dimensionContext: ICoreContext\n): DimensionAvailabilitiesForProductSearchResultInput => {\n return new DimensionAvailabilitiesForProductSearchResultInput(products, dimensionContext);\n};\n\n/**\n * The Action Method for the GetDimensionAvailabilitiesForProductSearchResultInput Data Action\n * Gets the active price for product search result via the getDimensionAvailabilitiesForProduct API.\n * @param input -- The data input.\n * @param context -- The core context.\n * @returns The ProductsDimensionsAvailabilities.\n */\nexport async function getDimensionAvailabilitiesForProductSearchResultAction(\n input: DimensionAvailabilitiesForProductSearchResultInput,\n context: IActionContext\n): Promise {\n const products = input.products;\n const productsDimensionInputs: ProductsDimensionAvailabilitiesInput[] = [];\n const inventoryLevel = input.dimensionContext.app.config.inventoryLevel;\n const displayType = input.displayType;\n\n for (const product of products) {\n const filteredProductAttributes = product.AttributeValues?.filter(attributeValue => {\n return checkIfShouldDisplayAsSwatch(\n (attributeValue.Name?.toLocaleLowerCase() ?? '') as DimensionTypes,\n input.dimensionContext,\n displayType\n );\n });\n\n if (ArrayExtensions.hasElements(filteredProductAttributes)) {\n const productionDimensionTypes: ProductDimensionType[] = [];\n for (const attributeValue of filteredProductAttributes) {\n if (attributeValue.Name) {\n const productionDimensionType: ProductDimensionType =\n ProductDimensionType[attributeValue.Name as keyof typeof ProductDimensionType];\n productionDimensionTypes.push(productionDimensionType);\n }\n }\n if (ArrayExtensions.hasElements(productionDimensionTypes)) {\n productsDimensionInputs.push(\n new ProductsDimensionAvailabilitiesInput(\n product.MasterProductId ?? product.RecordId,\n undefined,\n context.requestContext,\n productionDimensionTypes\n )\n );\n }\n }\n }\n\n if (!ArrayExtensions.hasElements(productsDimensionInputs)) {\n return Promise.resolve([]);\n }\n\n try {\n const dimensionForProducts: ProductDimensionValueInventoryAvailability[][] = await getDimensionAvailabilitiesForProductsAction(\n productsDimensionInputs,\n context\n );\n const productsDimensionAvailabilities = productsDimensionInputs.map((dimensionInput, index) => {\n return dimensionForProducts[index].map(dimensionValuesWithInventory => {\n const inventoryLevelCode = getInventoryLevelCodeFromDimensionValue(dimensionValuesWithInventory, inventoryLevel);\n const dimensionValue = dimensionValuesWithInventory.DimensionValue!;\n return {\n value: dimensionValue.Value ?? '',\n isDisabled: inventoryLevelCode === InventoryLevelValues.outOfStock,\n masterProductId: dimensionInput.masterProductId\n };\n });\n });\n\n if (!ArrayExtensions.hasElements(productsDimensionAvailabilities)) {\n context.telemetry.warning('ProductsDimensionAvailabilities is empty');\n return Promise.resolve([]);\n }\n\n return Promise.resolve(productsDimensionAvailabilities);\n } catch (error) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument -- existing error.\n context.telemetry.warning(error);\n }\n\n return Promise.resolve([]);\n}\n\n/**\n * The GetDimensionAvailabilitiesForProductSearchResult data action.\n */\nexport const getDimensionAvailabilitiesForProductSearchResultDataAction = createObservableDataAction({\n id: '@msdyn365-commerce-modules/retail-actions/get-dimension-availabilities-for-product-search-result',\n // eslint-disable-next-line @typescript-eslint/consistent-type-assertions -- existing pattern.\n action: >getDimensionAvailabilitiesForProductSearchResultAction,\n input: createDimensionAvailabilitiesForProductSearchResultInput\n});\n\nexport default getDimensionAvailabilitiesForProductSearchResultDataAction;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { ObjectExtensions } from './object-extensions';\n\n/**\n * Namespace which extends enum functionality.\n */\n/* eslint-disable @typescript-eslint/no-explicit-any */\nexport namespace EnumExtensions {\n /**\n * @description Returns a list of numeric values and enum names for the specified enum.\n * @param enumClass\n * @param {any} value The enum to examine.\n * @returns {(number | string)[]} An array of numeric values and enum names.\n */\n export function getValues(enumClass: any): (number | string)[] {\n if (ObjectExtensions.isNullOrUndefined(enumClass)) {\n return [];\n }\n\n return Object.keys(enumClass).map(item => enumClass[item]);\n }\n\n /**\n * @description Returns a list of enum names for the specified enum.\n * @param enumClass\n * @param {any} value The enum to examine.\n * @returns {(number | string)[]} An array of string values.\n */\n export function getNames(enumClass: any): string[] {\n return getValues(enumClass).filter(ObjectExtensions.isString);\n }\n\n /**\n * @description Returns a list of numeric values for the specified enum.\n * @param enumClass\n * @param {any} value The enum to examine.\n * @returns {number[]} An array of numeric values.\n */\n export function getNumericValues(enumClass: any): number[] {\n return getValues(enumClass).filter(ObjectExtensions.isNumber);\n }\n\n /**\n * @description Returns a list of enum values for the specified enum.\n * @param enumClass\n * @param {any} value The enum to examine.\n * @returns {number[]} An array of enum values.\n */\n export function getEnumValues(enumClass: any): T[] {\n return getNumericValues(enumClass).map(value => value);\n }\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { ObjectExtensions } from './object-extensions';\n\n/**\n * Namespace which extends string functionality.\n */\nexport namespace StringExtensions {\n /**\n * Checks if string is null, undefined, empty, or whitespace.\n * @param {string | null | undefined} value The string to examine.\n * @returns {boolean} True if it's null, undefined, empty, or whitespace; false otherwise.\n */\n export function isNullOrWhitespace(value: string | null | undefined): boolean {\n return isNullOrEmpty(value) || value!.trim() === '';\n }\n\n /**\n * Checks if string is null, undefined, or empty.\n * @param {string | null | undefined} value The string to examine.\n * @returns {boolean} True if it's null, undefined, empty, or whitespace; false otherwise.\n */\n export function isNullOrEmpty(value: string | null | undefined): boolean {\n if (ObjectExtensions.isNullOrUndefined(value)) {\n return true;\n }\n\n if (!ObjectExtensions.isString(value)) {\n throw new Error('StringExtensions has received a non-string input.');\n }\n\n return value === '';\n }\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport {\n CacheType,\n createObservableDataAction,\n IAction,\n IActionContext,\n IActionInput,\n ICommerceApiSettings,\n ICreateActionContext,\n msdyn365Commerce\n} from '@msdyn365-commerce/core';\nimport { getCartState } from '@msdyn365-commerce/global-state';\nimport { Cart } from '@msdyn365-commerce/retail-proxy';\nimport { copyAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/CartsDataActions.g';\nimport Cookie from 'js-cookie';\n\nimport { buildCacheKey } from './utilities/utils';\n\n/**\n * Input class for getCheckoutCart data action.\n */\nexport class GetCheckoutCartInput implements IActionInput {\n private readonly apiSettings: ICommerceApiSettings;\n\n constructor(apiSettings: ICommerceApiSettings) {\n this.apiSettings = apiSettings;\n }\n\n public getCacheKey = () => buildCacheKey('ActiveCheckoutCart', this.apiSettings);\n\n public getCacheObjectType = () => 'ActiveCheckoutCart';\n\n public dataCacheType = (): CacheType => 'request';\n}\n\nconst createInput = (inputData: ICreateActionContext) => {\n return new GetCheckoutCartInput(inputData.requestContext.apiSettings);\n};\n\nconst CartCookieName: string = msdyn365Commerce.CartCookie || 'cart';\n\n/**\n * Data action to copy the cart for checkout actions.\n * @param input\n * @param ctx\n */\nexport async function getCheckoutCart(input: GetCheckoutCartInput, ctx: IActionContext): Promise {\n const cartId = Cookie.get(CartCookieName) || '';\n if (cartId) {\n const currentCartState = await getCartState(ctx);\n const activeCart = currentCartState.cart;\n\n // Check if there is an active cart and it isn't empty\n if (activeCart && Object.keys(activeCart).length > 0) {\n const checkoutCart = await copyAsync({ callerContext: ctx }, activeCart.Id, 2);\n\n if (checkoutCart) {\n return Array.isArray(checkoutCart) ? checkoutCart[0] : checkoutCart;\n }\n } else {\n ctx.trace(\"[get-checkout-cart] Can't create a checkout cart since active cart is empty\");\n }\n }\n\n return {};\n}\n\nexport const getCheckoutCartDataAction = createObservableDataAction({\n id: '@msdyn365-commerce-modules/retail-actions/get-checkout-cart',\n action: >getCheckoutCart,\n input: createInput\n});\n\nexport default getCheckoutCartDataAction;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { ProductList } from '@msdyn365-commerce/retail-proxy';\n\nimport { QuickOrderTemplateLine } from './quick-order-template-line';\n\n/**\n * Quick Order template class.\n */\nexport class QuickOrderTemplate {\n public productList: ProductList;\n\n public quickOrderTemplateLines: QuickOrderTemplateLine[];\n\n public totalLines: number;\n\n public constructor(productList: ProductList, quickOrderTemplateLines: QuickOrderTemplateLine[], totalLines: number) {\n this.productList = productList;\n this.quickOrderTemplateLines = quickOrderTemplateLines;\n this.totalLines = totalLines;\n }\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport {\n CacheType,\n createObservableDataAction,\n IAction,\n IActionContext,\n IActionInput,\n ICommerceApiSettings\n} from '@msdyn365-commerce/core';\nimport { Customer, CustomerAttribute } from '@msdyn365-commerce/retail-proxy';\nimport { readAsync, updateAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/CustomersDataActions.g';\n\nimport { buildCacheKey } from '.';\nimport { GetCustomerInput } from './get-customer';\n\nexport interface IUpdateCustomerAttributesInput extends IActionInput {\n phone?: string;\n vatNumber?: string;\n customerAttributes: CustomerAttribute[];\n userAccountNumber: string;\n apiSettings: ICommerceApiSettings;\n}\n\nexport enum ContactInfoType {\n None = 0,\n Phone = 1,\n Email = 2,\n Url = 3,\n Telex = 4,\n Fax = 5\n}\n\n/**\n * Input class for the updateCustomerAttributes.\n */\n// eslint-disable-next-line @typescript-eslint/naming-convention\nexport class updateCustomerAttributesInput implements IUpdateCustomerAttributesInput {\n public userAccountNumber: string;\n\n public customerAttributes: CustomerAttribute[];\n\n public apiSettings: ICommerceApiSettings;\n\n public phone?: string;\n\n public vatNumber?: string;\n\n constructor(\n userAccountNumber: string,\n customerAttributes: CustomerAttribute[],\n apiSettings: ICommerceApiSettings,\n phone?: string,\n vatNumber?: string\n ) {\n this.userAccountNumber = userAccountNumber;\n this.apiSettings = apiSettings;\n this.customerAttributes = customerAttributes;\n this.phone = phone;\n this.vatNumber = vatNumber;\n }\n\n public getCacheKey = (): string => buildCacheKey(`${this.userAccountNumber}`, this.apiSettings);\n\n public getCacheObjectType = () => 'Customer';\n\n public dataCacheType = (): CacheType => 'none';\n}\n\n/**\n * The action method for the updateCustomerAttributes data action.\n * @param input The action input.\n * @param ctx The action context.\n */\nexport async function updateCustomerAttributesAction(input: IUpdateCustomerAttributesInput, ctx: IActionContext): Promise {\n const { customerAttributes, phone, vatNumber, userAccountNumber } = input;\n\n const customer = await readAsync({ callerContext: ctx, bypassCache: 'get' }, userAccountNumber);\n\n if (!customer) {\n ctx.telemetry.debug('[update-customer-attributes] Unable to find customer');\n throw new Error('Unable to find customer');\n }\n\n // The customer level phone (customer.phone) is the primary phone number. We need to update the primary phone in customer.Contacts as well.\n const primaryContact = customer.Contacts?.filter(\n contact => contact && contact.IsPrimary && contact.AddressTypeValue === ContactInfoType.Phone\n )?.[0];\n\n if (primaryContact) {\n primaryContact.Value = phone;\n }\n\n const newCustomer = { ...customer };\n newCustomer.Phone = phone;\n newCustomer.PhoneRecordId = primaryContact?.RecordId ? primaryContact?.RecordId : 0;\n newCustomer.VatNumber = vatNumber;\n newCustomer.Attributes = customerAttributes;\n\n const updatedCustomer = await updateAsync({ callerContext: ctx }, newCustomer);\n\n if (!updatedCustomer) {\n ctx.telemetry.debug('[update-customer-attributes] Unable to update customer attributes');\n throw new Error('Unable to update customer attributes');\n }\n\n ctx.update(new GetCustomerInput(ctx.requestContext.apiSettings), updatedCustomer);\n\n return updatedCustomer;\n}\n\n/**\n * The updateCustomerAttributes data action\n * Returns the updated customer.\n */\nexport const updateCustomerAttributesActionDataAction = createObservableDataAction({\n id: '@msdyn365-commerce-modules/retail-actions/update-customer-attributes',\n action: >updateCustomerAttributesAction\n});\n\nexport default updateCustomerAttributesActionDataAction;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IActionContext } from '@msdyn365-commerce/core';\nimport { CartLine } from '@msdyn365-commerce/retail-proxy';\nimport { SimpleProduct } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\n\nimport { ArrayExtensions } from './extensions/array-extensions';\nimport { IProductInventoryInformation } from './product-inventory-information';\n\n/**\n * Cart line inventory validation result interface.\n */\nexport interface ICartLineInventoryValidationResult {\n /**\n * Define whether the cart lines inventory is valid across multiple cart lines.\n */\n readonly isValid: boolean;\n\n /**\n * Defines the list of product id with invalid inventory.\n */\n readonly productIdWithErrors: number[];\n}\n\n/**\n * Validates inventory across cart lines.\n * @param cartLines - The cart lines.\n * @param productAvailabilities - The product availability collection.\n * @param actionContext - The action context.\n * @param products - The products.\n * @param emailDeliveryModeCode - The emailDeliveryModeCode.\n * @returns True if all product quantity are available, false otherwise.\n */\n// eslint-disable-next-line complexity -- existing code.\nexport function validateCartLinesInventory(\n cartLines: CartLine[],\n productAvailabilities: IProductInventoryInformation[],\n actionContext: IActionContext,\n products?: SimpleProduct[],\n emailDeliveryModeCode?: string | undefined\n): ICartLineInventoryValidationResult {\n const cartLineMap = new Map();\n const defaultCartLineQuantity = 1;\n if (!actionContext.requestContext.app.config.enableStockCheck) {\n return {\n isValid: true,\n productIdWithErrors: []\n };\n }\n const productIdWithErrors = [];\n let isValid = true;\n\n if (ArrayExtensions.hasElements(cartLines) && ArrayExtensions.hasElements(productAvailabilities)) {\n // Consolidate products in different cart lines into single entry with the total cart quantity\n for (const cartLine of cartLines) {\n // Skip validation if is an invoice inline.\n if (cartLine.ProductId && !cartLine.IsInvoiceLine && !cartLine.IsGiftCardLine) {\n if (!cartLineMap.has(cartLine.ProductId)) {\n cartLineMap.set(cartLine.ProductId, cartLine.Quantity ?? defaultCartLineQuantity);\n } else {\n const cartLineTotal = cartLineMap.get(cartLine.ProductId) ?? 0;\n cartLineMap.delete(cartLine.ProductId);\n cartLineMap.set(cartLine.ProductId, cartLineTotal + (cartLine.Quantity ?? defaultCartLineQuantity));\n }\n }\n }\n\n // Hashing product availability object by product ID.\n const productAvailabilityMap = new Map();\n for (const productAvailability of productAvailabilities) {\n if (\n productAvailability.ProductAvailableQuantity.ProductId &&\n !productAvailabilityMap.has(productAvailability.ProductAvailableQuantity.ProductId)\n ) {\n productAvailabilityMap.set(productAvailability.ProductAvailableQuantity.ProductId, productAvailability);\n }\n }\n\n // Compare total quantity with the available quantity from the inventory API, also validate that the product is available.\n for (const productId of Array.from(cartLineMap.keys())) {\n const cartLineQty = cartLineMap.get(productId) ?? defaultCartLineQuantity;\n const productAvailability = productAvailabilityMap.get(productId);\n const availableQuantity = productAvailability?.ProductAvailableQuantity.AvailableQuantity ?? undefined;\n\n // If product is non-stocked or cartLine is electronic delivery, then no inventory check\n const cartLine = cartLines.find(line => line.ProductId === productId);\n const cartLineProduct = products?.find(product => product.RecordId === productId);\n let isStockedItem = true;\n if (cartLineProduct) {\n isStockedItem = !!cartLineProduct.Behavior?.IsStockedProduct;\n }\n const isEmailDelivery =\n cartLine?.DeliveryMode && cartLine.DeliveryMode !== '' ? cartLine.DeliveryMode === emailDeliveryModeCode : false;\n const shouldSkipInventoryCheck = !isStockedItem || isEmailDelivery;\n\n // If product is non-stocked or cartLine is electronic delivery, then no inventory check\n if (shouldSkipInventoryCheck) {\n continue;\n }\n if (!productAvailability?.IsProductAvailable || (availableQuantity && cartLineQty > availableQuantity)) {\n productIdWithErrors.push(productId);\n isValid = false;\n }\n }\n }\n return {\n isValid,\n productIdWithErrors\n };\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { v4 as uuidv4 } from 'uuid';\n\n/**\n * Namespace which provides functionality for GUID.\n */\nexport namespace Guid {\n export function generateGuid(): string {\n return uuidv4();\n }\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { Guid as _guid } from './guid';\n\nexport namespace Random {\n export import Guid = _guid;\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport {\n CacheType,\n createObservableDataAction,\n IAction,\n IActionContext,\n IActionInput,\n IAny,\n ICreateActionContext,\n IGeneric\n} from '@msdyn365-commerce/core';\nimport {\n ChannelDeliveryOption,\n DeliveryModeTypeFilter,\n FeatureState,\n ItemAvailability,\n OrgUnitAvailability,\n OrgUnitLocation,\n ProductWarehouseInventoryInformation,\n SearchArea,\n StoreHours\n} from '@msdyn365-commerce/retail-proxy';\nimport {\n getChannelDeliveryOptionsAsync,\n getOrgUnitLocationsByAreaAsync,\n getStoreHoursAsync\n} from '@msdyn365-commerce/retail-proxy/dist/DataActions/OrgUnitsDataActions.g';\nimport { getEstimatedAvailabilityAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/ProductsDataActions.g';\n\nimport { FeatureStateInput, getFeatureStateActionDataAction } from './get-feature-state';\nimport { IFullOrgUnitAvailability } from './utilities/full-org-unit-availability';\nimport { DeliveryMode, IProductInventoryInformation } from './utilities/product-inventory-information';\nimport { createInventoryAvailabilitySearchCriteria, mapProductInventoryInformation } from './utilities/product-inventory-utils';\nimport { QueryResultSettingsProxy } from './utilities/QueryResultSettingsProxy';\n\n/**\n * Get selected variant action input class.\n */\nexport class GetFullAvailableInventoryNearbyInput implements IActionInput {\n public latitude?: number;\n\n public longitude?: number;\n\n public radius?: number;\n\n public productId?: number;\n\n public DistanceUnitValue?: number;\n\n public IgnoreLocation?: boolean;\n\n constructor(\n _productId?: number,\n _latitude?: number,\n _longitude?: number,\n _radius?: number,\n _DistanceUnitValue?: number,\n _IgnoreLocation?: boolean\n ) {\n this.productId = _productId;\n this.latitude = _latitude;\n this.longitude = _longitude;\n this.radius = _radius;\n this.DistanceUnitValue = _DistanceUnitValue;\n this.IgnoreLocation = _IgnoreLocation;\n }\n\n public getCacheKey = () => 'GetFullAvailableInventoryNearbyInputCache';\n\n public getCacheObjectType = () => 'GetFullAvailableInventoryNearbyInput';\n\n public dataCacheType = (): CacheType => 'none';\n}\n\n/**\n * CreateInput method for the getSelectedVariant data action.\n * @param inputData - The input data passed to the createInput method.\n * @returns GetFullAvailableInventoryNearbyInput - The action input.\n */\nexport const createGetFullAvailableInventoryNearbyInput = (\n inputData: ICreateActionContext>\n): GetFullAvailableInventoryNearbyInput => {\n return new GetFullAvailableInventoryNearbyInput();\n};\n\n/**\n * Calls the Retail Feature State API and returns a list of feature with isEnabled flag.\n * @param context - The context.\n * @returns FeatureState - The feature state.\n */\nexport async function getFeatureState(context: IActionContext): Promise {\n return getFeatureStateActionDataAction(new FeatureStateInput(), context);\n}\n\n/**\n * Action method for the getSelectedVariant data aciton.\n * @param input - The action input class.\n * @param ctx - The action context.\n * @returns IFullOrgUnitAvailability - The full org unit availability.\n */\nexport async function getFullAvailableInventoryNearbyAction(\n input: GetFullAvailableInventoryNearbyInput,\n ctx: IActionContext\n): Promise {\n // No valid product we want to return undefined so module knows there are no results yet\n if (!input.productId) {\n return undefined;\n }\n\n if (((!input.radius && input.radius !== 0) || !input.latitude || !input.longitude) && !input.IgnoreLocation) {\n // No valid location we want to return empty array so module can show no locations message\n return [];\n }\n\n const searchArea: SearchArea = {\n Latitude: input.latitude,\n Longitude: input.longitude,\n Radius: input.radius,\n DistanceUnitValue: input.DistanceUnitValue || 0 // 0 is miles\n };\n\n const featureState = await getFeatureState(ctx);\n const retailMulitplePickupMFeatureState = featureState?.find(\n item => item.Name === 'Dynamics.AX.Application.RetailMultiplePickupDeliveryModeFeature'\n )?.IsEnabled;\n const searchCriteria = createInventoryAvailabilitySearchCriteria(ctx, [input.productId], false, true, searchArea, DeliveryMode.pickup);\n return getEstimatedAvailabilityAsync({ callerContext: ctx }, searchCriteria)\n .then(async (productWarehouseInformation: ProductWarehouseInventoryInformation) => {\n // For store selector, inventory should always come from an individual store\n const productInventoryInformation = mapProductInventoryInformation(\n ctx,\n productWarehouseInformation.ProductWarehouseInventoryAvailabilities\n );\n return getOrgUnitLocationsByAreaAsync(\n {\n callerContext: ctx,\n queryResultSettings: QueryResultSettingsProxy.getPagingFromInputDataOrDefaultValue(ctx)\n },\n searchArea,\n DeliveryModeTypeFilter.Pickup\n )\n .then(async (stores: OrgUnitLocation[]) => {\n // Constructing a store mapping based on the InventoryId.\n const storeMap = new Map();\n stores.forEach(store => {\n if (store.InventoryLocationId) {\n storeMap.set(store.InventoryLocationId, store);\n }\n });\n\n let locationDeliveryOptions: ChannelDeliveryOption[] | undefined = [];\n\n // If multiple pickup mode is enable then call getchanneldeliveryoption\n if (retailMulitplePickupMFeatureState) {\n const orgUnitChannel = stores.map(store => store.ChannelId);\n locationDeliveryOptions = await _getLocationPickUpDeliveryModes(orgUnitChannel, ctx);\n }\n\n const availabilityPromiseList = stores.map(store => {\n const locationDeliveryOption = locationDeliveryOptions?.find(\n _channeldeliveryoption => _channeldeliveryoption.ChannelId === store.ChannelId\n );\n return _getAvailabilityWithHours(store, productInventoryInformation, storeMap, ctx, locationDeliveryOption);\n });\n\n return Promise.all(availabilityPromiseList);\n })\n .catch((error: Error) => {\n ctx.trace('[GetFullAvailableInventoryNearby] error getting Available Inventory Nearby');\n ctx.trace(error.message);\n ctx.telemetry.error(error.message);\n ctx.telemetry.debug('[GetFullAvailableInventoryNearby] error getting Available Inventory Nearby');\n return [];\n });\n })\n .catch((error: Error) => {\n ctx.trace(\n '[GetFullAvailableInventoryNearby][getEstimatedAvailabilityAsync] error getting availability product warehouse information.'\n );\n ctx.trace(error.message);\n ctx.telemetry.error(error.message);\n ctx.telemetry.debug(\n '[GetFullAvailableInventoryNearby][getEstimatedAvailabilityAsync] error getting availability product warehouse information.'\n );\n return [];\n });\n}\n\n/**\n * Action method that obtains the store information along with store hours and product availability.\n * @param orgUnitLocation - The org unit location.\n * @param productInventoryInformation - The product inventory information.\n * @param storeMap - A map that contains store information group by the inventory location id.\n * @param ctx The action context.\n * @param channelDeleiveryOptions - The channel delivery options.\n * @returns IFullOrgUnitAvailability - The full org unit availability.\n */\nasync function _getAvailabilityWithHours(\n orgUnitLocation: OrgUnitLocation,\n productInventoryInformation: IProductInventoryInformation[],\n storeMap: Map,\n ctx: IActionContext,\n channelDeleiveryOptions: ChannelDeliveryOption | undefined\n): Promise {\n if (!orgUnitLocation || !orgUnitLocation.OrgUnitNumber) {\n return { OrgUnitAvailability: undefined };\n }\n\n return getStoreHoursAsync({ callerContext: ctx }, orgUnitLocation.OrgUnitNumber)\n .then((hours: StoreHours) => {\n const itemAvailabilities: ItemAvailability[] = [];\n if (productInventoryInformation && storeMap) {\n productInventoryInformation.forEach(element => {\n if (\n element.InventLocationId &&\n storeMap.has(element.InventLocationId) &&\n element.InventLocationId === orgUnitLocation.InventoryLocationId\n ) {\n itemAvailabilities.push({ AvailableQuantity: element.ProductAvailableQuantity?.AvailableQuantity });\n }\n });\n }\n\n const availability: OrgUnitAvailability = {\n OrgUnitLocation: orgUnitLocation,\n ItemAvailabilities: itemAvailabilities\n };\n\n if (hours && !(hours instanceof Error)) {\n return {\n OrgUnitAvailability: availability,\n StoreHours: hours,\n ProductInventoryInformation: productInventoryInformation,\n OrgUnitPickUpDeliveryModes: channelDeleiveryOptions\n };\n }\n\n return {\n OrgUnitAvailability: availability,\n ProductInventoryInformation: productInventoryInformation,\n OrgUnitPickUpDeliveryModes: channelDeleiveryOptions\n };\n })\n .catch((error: Error) => {\n ctx.trace('[GetFullAvailableInventoryNearby] error getting availability with hours');\n ctx.trace(error.message);\n ctx.telemetry.exception(error);\n ctx.telemetry.debug('[GetFullAvailableInventoryNearby] error getting availability with hours');\n return { OrgUnitAvailability: {} };\n });\n}\n\n/**\n * Action method that obtains the channel delivery option information.\n * @param channelCollection - The org unit channel Id list.\n * @param ctx - The action context.\n * @returns ChannelDeliveryOption - The channel delivery option collection.\n */\nasync function _getLocationPickUpDeliveryModes(\n channelCollection: (number | undefined)[],\n ctx: IActionContext\n): Promise {\n if (channelCollection?.length === 0 || channelCollection === undefined) {\n return undefined;\n }\n\n const channelIdList: number[] = [];\n channelCollection?.forEach(id => {\n if (id !== undefined) {\n channelIdList.push(id);\n }\n });\n\n // To get all channel pickup delivery mode filterOption should be 4\n return getChannelDeliveryOptionsAsync(\n {\n callerContext: ctx,\n queryResultSettings: QueryResultSettingsProxy.getPagingFromInputDataOrDefaultValue(ctx)\n },\n channelIdList,\n 4\n )\n .then((channelDeliveryOptions: ChannelDeliveryOption[]) => {\n if (channelDeliveryOptions && !(channelDeliveryOptions instanceof Error)) {\n return channelDeliveryOptions;\n }\n\n return undefined;\n })\n .catch((error: Error) => {\n ctx.trace(\n '[GetFullAvailableInventoryNearby][getChannelDeliveryOptionsAsync] error getting availability with channel delivery options'\n );\n ctx.trace(error.message);\n ctx.telemetry.exception(error);\n ctx.telemetry.debug(\n '[GetFullAvailableInventoryNearby] [getChannelDeliveryOptionsAsync] error getting availability with channel delivery options'\n );\n return [];\n });\n}\n\n/**\n * The complete getFullAvailableInventoryNearby data action.\n */\nexport const getFullAvailableInventoryNearbyActionDataAction = createObservableDataAction({\n id: '@msdyn365-commerce-modules/retail-actions/get-full-available-inventory-nearby',\n action: >getFullAvailableInventoryNearbyAction,\n input: createGetFullAvailableInventoryNearbyInput\n});\n\nexport default getFullAvailableInventoryNearbyActionDataAction;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { FullProduct } from '@msdyn365-commerce/commerce-entities';\nimport {\n CacheType,\n createObservableDataAction,\n IAction,\n IActionContext,\n IActionInput,\n ICreateActionContext\n} from '@msdyn365-commerce/core';\nimport { CommerceListLine } from '@msdyn365-commerce/retail-proxy';\nimport { getByCustomerAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/CommerceListsDataActions.g';\n\nimport { FullProductInput, getFullProducts, getProductDetailsCriteriaFromActionInput } from '.';\n\n/**\n * Input class for getActiveWishlistItems data action.\n */\nexport class ActiveWishlistInput implements IActionInput {\n public getCacheKey = () => 'ActiveWishlistItems';\n\n public getCacheObjectType = () => 'ActiveWishlistItems';\n\n public dataCacheType = (): CacheType => 'none';\n}\n\nconst createInput = (inputData: ICreateActionContext) => {\n return new ActiveWishlistInput();\n};\n\n/**\n * Calls the Retail API and returns a CommerceList object based on the passed GetCartInput.\n * @param input\n * @param ctx\n */\nexport async function getActiveWishlistItems(input: ActiveWishlistInput, ctx: IActionContext): Promise {\n // If no cart ID is provided in input, we need to create a cart object\n if (!input) {\n throw new Error('[getActiveWishlistItems]No valid Input was provided, failing');\n }\n\n if (ctx.requestContext.user.isAuthenticated) {\n const wishlists = await getByCustomerAsync(\n {\n callerContext: ctx,\n queryResultSettings: {}\n },\n null\n );\n\n if (wishlists && wishlists.length > 0) {\n const productInputs: FullProductInput[] = [];\n if (wishlists[0].CommerceListLines) {\n wishlists[0].CommerceListLines.forEach((commerceListLine: CommerceListLine) => {\n if (commerceListLine.ProductId) {\n productInputs.push(\n new FullProductInput(\n commerceListLine.ProductId,\n ctx.requestContext.apiSettings,\n getProductDetailsCriteriaFromActionInput(ctx),\n ctx.requestContext\n )\n );\n }\n });\n }\n\n if (productInputs.length > 0) {\n return getFullProducts(productInputs, ctx)\n .then(products => {\n if (products) {\n return products;\n }\n return [];\n })\n .catch(error => {\n ctx.trace(error);\n ctx.telemetry.exception(error);\n ctx.telemetry.debug('[getActiveWishlistItems]Unable to hydrate cart with product information');\n throw new Error('[getActiveWishlistItems]Unable to hydrate cart with product information');\n });\n }\n ctx.trace('No productIds found for wishlist');\n } else {\n ctx.trace('[getActiveWishlistItems]Not able to get wishlists for the customer');\n return [];\n }\n }\n ctx.trace('[getActiveWishlistItems]User token not found for wishlists');\n return [];\n}\n\nexport default createObservableDataAction({\n id: '@msdyn365-commerce-modules/retail-actions/get-items-in-wishlist',\n action: >getActiveWishlistItems,\n input: createInput\n});\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport {\n CacheType,\n createObservableDataAction,\n getCatalogId,\n IAction,\n IActionContext,\n IActionInput,\n IAny,\n ICreateActionContext,\n IGeneric\n} from '@msdyn365-commerce/core';\nimport { FeatureState } from '@msdyn365-commerce/retail-proxy';\nimport { getActivePricesAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/ProductsDataActions.g';\nimport { ProductPrice, ProductType, ProjectionDomain, SimpleProduct } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\n\nimport { getSelectedProductIdFromActionInput, getSelectedVariant, SelectedVariantInput } from '.';\nimport { FeatureStateInput, getFeatureStateActionDataAction } from './get-feature-state';\nimport { ArrayExtensions } from './utilities';\nimport { QueryResultSettingsProxy } from './utilities/QueryResultSettingsProxy';\n\n/**\n * Input class for the GetPriceForSelectedVariant Data Action.\n */\nexport class PriceForSelectedVariantInput implements IActionInput {\n public productId: number;\n\n public channelId: number;\n\n public selectedProduct: SimpleProduct | undefined;\n\n public customerId?: string;\n\n public constructor(productId: number, channelId: number, selectedProduct?: SimpleProduct, customerId?: string) {\n this.productId = productId;\n this.channelId = channelId;\n this.selectedProduct = selectedProduct;\n this.customerId = customerId ?? '';\n }\n\n public getCacheKey = (): string => 'PriceForSelectedVariant';\n\n public getCacheObjectType = (): string => 'Price';\n\n public dataCacheType = (): CacheType => 'none';\n}\n\n/**\n * The createInput method for the GetPriceForSelectedVariantDataAction.\n * @param inputData - The input data for the createInput method.\n * @returns The PriceForSelectedVariantInput.\n */\nexport const createActivePriceForSelectedVariantInput = (inputData: ICreateActionContext>): PriceForSelectedVariantInput => {\n const productId = getSelectedProductIdFromActionInput(inputData);\n\n if (productId) {\n return new PriceForSelectedVariantInput(+productId, +inputData.requestContext.apiSettings.channelId, undefined);\n }\n throw new Error('Unable to create PriceForSelectedVariantInput, no productId found on module config or query');\n};\n\n/**\n * The Action Method for the GetPriceForSelectedVariant Data Action\n * Pulls the currently selected variant from the cache using the getSelectedVariant data action, and gets it's current contextual price\n * via the getActivePrice RetailServer API.\n * @param input - The input.\n * @param ctx - The ctx.\n * @returns The Promise.\n */\nexport async function getPriceForSelectedVariantAction(\n input: PriceForSelectedVariantInput,\n ctx: IActionContext\n): Promise {\n return Promise.resolve()\n .then(() => {\n const activeProduct: SimpleProduct | undefined = input.selectedProduct;\n\n if (!activeProduct) {\n const selectedVariantInput = new SelectedVariantInput(\n input.productId,\n input.channelId,\n undefined,\n undefined,\n ctx.requestContext\n );\n\n return getSelectedVariant(selectedVariantInput, ctx);\n }\n\n return activeProduct;\n })\n .then(async (productResult: SimpleProduct | null) => {\n const catalogId = getCatalogId(ctx.requestContext);\n const projectDomain: ProjectionDomain = {\n ChannelId: +ctx.requestContext.apiSettings.channelId,\n CatalogId: catalogId\n };\n\n const activeProduct: SimpleProduct | undefined = productResult as SimpleProduct | undefined;\n if (activeProduct) {\n const featureStates: FeatureState[] = await getFeatureStateActionDataAction(new FeatureStateInput(), ctx);\n return getActivePricesAsync(\n { callerContext: ctx, queryResultSettings: QueryResultSettingsProxy.getPagingFromInputDataOrDefaultValue(ctx) },\n projectDomain,\n [activeProduct.RecordId],\n new Date(),\n input.customerId,\n undefined,\n true,\n featureStates.find(featureState => featureState.Name === 'Dynamics.AX.Application.RetailSearchPriceRangeFeature')\n ?.IsEnabled &&\n (activeProduct.ProductTypeValue === ProductType.Master || activeProduct.ProductTypeValue === ProductType.KitMaster),\n featureStates.find(\n featureState => featureState.Name === 'Dynamics.AX.Application.RetailSalesAgreementPriceSupportFeature'\n )?.IsEnabled\n ).then((productPrices: ProductPrice[]) => {\n if (!ArrayExtensions.hasElements(productPrices)) {\n throw new Error('[getPriceForSelectedVariantAction]Invalid response recieved from getActivePricesAsync');\n }\n return productPrices[0];\n });\n }\n\n return null;\n })\n .catch((error: Error) => {\n ctx.trace(error.message);\n ctx.telemetry.exception(error);\n ctx.telemetry.debug('[getPriceForSelectedVariantAction]Error executing action');\n throw new Error('[getPriceForSelectedVariantAction]Error executing action');\n });\n}\n\nexport const getPriceForSelectedVariantActionDataAction = createObservableDataAction({\n id: '@msdyn365-commerce-modules/retail-actions/get-price-for-selected-variant',\n action: getPriceForSelectedVariantAction as IAction,\n input: createActivePriceForSelectedVariantInput\n});\n\nexport default getPriceForSelectedVariantActionDataAction;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IRefineFullProductSearchOutput } from '@msdyn365-commerce/commerce-entities';\nimport {\n CacheType,\n createObservableDataAction,\n getCatalogId,\n IAction,\n IActionContext,\n IActionInput,\n IAny,\n ICreateActionContext,\n IGeneric\n} from '@msdyn365-commerce/core';\nimport { ProductRefinerValue } from '@msdyn365-commerce/retail-proxy';\nimport { refineSearchByTextAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/ProductsDataActions.g';\n\nimport { ProductDetailsCriteria } from './get-full-products';\nimport { parseSearchData } from './utilities/input-data-parser';\nimport { QueryResultSettingsProxy } from './utilities/QueryResultSettingsProxy';\nimport { getRefinedFullProducts, IRefinableProductsInput } from './utilities/refiner-utils';\nimport { getProductDetailsCriteriaFromActionInput } from './utilities/utils';\n\n/**\n * Input for refining products returned by the search text.\n */\nexport class FullProductsRefineSearchByTextInput implements IActionInput, IRefinableProductsInput {\n public readonly searchText: string;\n\n public readonly channelId?: number;\n\n public readonly refinementCriteria: ProductRefinerValue[];\n\n public readonly itemsPerPage?: number;\n\n public readonly skipCount?: number;\n\n public readonly catalogId: number;\n\n public productDetailsCriteria?: ProductDetailsCriteria;\n\n public readonly queryResultSettingsProxy: QueryResultSettingsProxy;\n\n public constructor(\n queryResultSettingsProxy: QueryResultSettingsProxy,\n searchText?: string,\n channelId?: number,\n refinementCriteria?: ProductRefinerValue[],\n catalogId?: number,\n criteria?: ProductDetailsCriteria\n ) {\n this.queryResultSettingsProxy = queryResultSettingsProxy;\n this.searchText = searchText || '';\n this.channelId = channelId;\n this.refinementCriteria = refinementCriteria || [];\n this.catalogId = catalogId ?? 0;\n this.productDetailsCriteria = criteria;\n }\n\n public getCacheKey = () => 'FullProductsRefineSearchByTextInputCache';\n\n public getCacheObjectType = () => 'FullProductsRefineSearchByTextInput';\n\n public dataCacheType = (): CacheType => 'none';\n}\n\n/**\n * Creates the input required to make the core action calls.\n * @param inputData\n */\nexport const createFullProductsRefineSearchByTextInput = (inputData: ICreateActionContext>): IActionInput => {\n const refinementCriteria = inputData.config && inputData.config.refinementCriteria;\n const queryResultSettingsProxy = QueryResultSettingsProxy.fromInputData(inputData);\n if (!Array.isArray(refinementCriteria)) {\n return new FullProductsRefineSearchByTextInput(queryResultSettingsProxy);\n }\n\n const searchInputData = parseSearchData(inputData);\n const productDetailsCriteria = getProductDetailsCriteriaFromActionInput(inputData);\n\n return new FullProductsRefineSearchByTextInput(\n queryResultSettingsProxy,\n searchInputData.q,\n searchInputData.channelId,\n refinementCriteria,\n undefined,\n productDetailsCriteria\n );\n};\n\n/**\n * Calls the refine-search-by-text action.\n * Based on search result calls get-full-products to get all the product details.\n * @param input\n * @param ctx\n */\nexport function getFullProductsByRefineSearchTextAction(\n input: FullProductsRefineSearchByTextInput,\n ctx: IActionContext\n): Promise {\n const catalogId = getCatalogId(ctx.requestContext);\n\n return getRefinedFullProducts(input, ctx, () => {\n return refineSearchByTextAsync(\n { callerContext: ctx, queryResultSettings: input.queryResultSettingsProxy.QueryResultSettings },\n input.channelId || 0,\n input.catalogId || catalogId,\n input.searchText,\n input.refinementCriteria\n );\n });\n}\n\nexport const getFullProductsByRefineSearchTextActionDataAction = createObservableDataAction({\n id: '@msdyn365-commerce-modules/retail-actions/get-full-products-by-refine-search-text',\n action: >getFullProductsByRefineSearchTextAction,\n input: createFullProductsRefineSearchByTextInput,\n isBatched: false\n});\n\nexport default getFullProductsByRefineSearchTextActionDataAction;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IRefineFullProductSearchOutput } from '@msdyn365-commerce/commerce-entities';\nimport { IActionContext } from '@msdyn365-commerce/core';\nimport { ProductRefinerValue, ProductSearchResult } from '@msdyn365-commerce/retail-proxy';\n\nimport getFullProducts, { FullProductInput, ProductDetailsCriteria } from '../get-full-products';\n\n/**\n * Common refinable products input includes both product detail criteria and refinement criteria.\n */\nexport interface IRefinableProductsInput {\n refinementCriteria: ProductRefinerValue[];\n productDetailsCriteria?: ProductDetailsCriteria;\n}\n\n/**\n * If refinement criteria is set, then gets refined products.\n * @param input Refinable products input.\n * @param ctx Action context.\n * @param getRefinedProducts Callback function to get a promise (e.g. RefineSearchByCategoryAsync, refineSearchByTextAsync)\n * that is executed to get refined products or full set of products.\n */\nexport async function getRefinedFullProducts(\n input: IRefinableProductsInput,\n ctx: IActionContext,\n getRefinedProducts: () => Promise\n): Promise {\n if (!input || !input.refinementCriteria) {\n ctx.trace('[getFullProductsByRefineSearchCategoryAction] Invalid input.');\n return {};\n }\n\n if (input.refinementCriteria.length === 0) {\n ctx.trace('[getFullProductsByRefineSearchCategoryAction] No refiners specified.');\n return {};\n }\n const { apiSettings } = ctx.requestContext;\n\n let fullProductInputs: FullProductInput[] = [];\n\n const searchResults = await getRefinedProducts();\n if (!searchResults) {\n ctx.telemetry.error('[getFullProductsByRefineSearchCategoryAction] no searchResults returned');\n } else {\n fullProductInputs = searchResults.map(\n (product: ProductSearchResult): FullProductInput => {\n return new FullProductInput(\n product.RecordId,\n apiSettings,\n input.productDetailsCriteria || new ProductDetailsCriteria(),\n ctx.requestContext\n );\n }\n );\n }\n\n if (fullProductInputs.length > 0) {\n const productResult = await getFullProducts(fullProductInputs, ctx);\n return {\n productSearchResult: productResult,\n refinementCriteria: input.refinementCriteria\n };\n }\n return {\n productSearchResult: [],\n refinementCriteria: input.refinementCriteria\n };\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport msdyn365Commerce, { IParameterizeFeatureFlags } from '@msdyn365-commerce/core';\n\nexport function parameterize(\n name: string = '',\n sep = '-',\n parameterizeFeatureFlags: IParameterizeFeatureFlags = {},\n neutralizedName?: string\n) {\n // If neutralizedName flag enabled, we use neutralizedName to construct string\n const candidateName =\n (msdyn365Commerce.platformSettings && msdyn365Commerce.platformSettings.enableUrlLocalization) ||\n parameterizeFeatureFlags.enableUrlLocalization\n ? name\n : neutralizedName || name;\n\n /*\n 1\t‘ ‘ (space)\t-> (single dash)\n 3\tAny character disallowed in URLs -> URL-encode\n 5\t‘ & ‘ (space ampersand space) -> (single dash)\n 6\t‘ - ‘ (space dash space) -> (single dash)\n 7\t‘ ‘ (2+ spaces) -> (single dash)\n 10\t[A-Z] (capital letters) -> [a-z] (lower-case)\n 12\tAny non-ASCII character outside of the set of disallowed characters -> URL-encode\n */\n if (\n parameterizeFeatureFlags.enableUrlEncoding ||\n (msdyn365Commerce.platformSettings && msdyn365Commerce.platformSettings.enableUrlEncoding)\n ) {\n // Replace url reserved characters with dash, and remove front and end dash;\n // &*!() reserved characters that can not be encoded by encodeURIComponent()\n return encodeURIComponent(\n candidateName\n .toLowerCase()\n .replace(/[\\s!&'()*]+/g, '-')\n .trim()\n .replace(/-+/g, '-')\n .replace(/^-+|-+$/g, '')\n );\n }\n return name\n .toLowerCase()\n .replace(/[^\\d_a-z\\-]+/g, ' ')\n .trim()\n .replace(/\\s+/g, sep);\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { CategoryHierarchy } from '@msdyn365-commerce/commerce-entities';\nimport { getParameterizeFeatureFlags, getUrlSync, IActionContext, IParameterizeFeatureFlags } from '@msdyn365-commerce/core';\n\nimport { parameterize } from './parameterize';\n\ninterface ICategoryMap {\n [RecordId: number]: CategoryHierarchy;\n}\n\n/**\n * Builds slugs for category.\n * @param category\n * @param categoryMap\n * @param parameterizeFeatureFlags\n */\nexport function getCategorySlug(\n category: CategoryHierarchy,\n categoryMap: ICategoryMap,\n parameterizeFeatureFlags?: IParameterizeFeatureFlags\n): string {\n if (!category || !category.Name) {\n // Invalid category\n return '';\n }\n const categoryName = parameterize(category.Name, undefined, parameterizeFeatureFlags, category.NeutralizedName);\n if (!category.ParentCategory || category.ParentCategory === 0) {\n // Base case assign url\n category.Slug = category.Slug || `/${categoryName}`;\n } else if (category.ParentCategory) {\n category.Slug =\n category.Slug ||\n `${getCategorySlug(categoryMap[category.ParentCategory], categoryMap, parameterizeFeatureFlags)}/${categoryName}`;\n }\n\n return category.Slug || '';\n}\n\n/**\n * Gets Url for category hierarchy. Returns string and adds url to Url property of category hierarchy.\n * @param category Category to generate URL for.\n * @param ctx\n * @param categoryMap Dictionary of all categories.\n */\nexport function getCategoryUrl(category: CategoryHierarchy, ctx?: IActionContext, categoryMap?: ICategoryMap): string | undefined {\n if (!category.Url && ctx && categoryMap) {\n if (!category.Slug) {\n const parameterizeFeatureFlags: IParameterizeFeatureFlags = ctx.requestContext ? getParameterizeFeatureFlags(ctx) : {};\n category.Slug = getCategorySlug(category, categoryMap, parameterizeFeatureFlags);\n }\n category.Url = getUrlSync('category', ctx, { category });\n }\n return category.Url;\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { getUrlSync, IActionContext } from '@msdyn365-commerce/core';\n\n/**\n * Syncronously creates an invoice detail page url.\n * @param invoiceId Invoice Id.\n * @param ctx\n */\nexport function getInvoiceDetailsPageUrlSync(invoiceId: string, ctx: IActionContext): string {\n let url = getUrlSync('invoice-details', ctx) || '';\n url = url.includes('?') ? url.substr(0, url.indexOf('?')) : url;\n return `${url}?invoiceId=${invoiceId}`;\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { CategoryHierarchy } from '@msdyn365-commerce/commerce-entities';\nimport { getUrlSync, IActionContext } from '@msdyn365-commerce/core';\nimport { SimpleProduct } from '@msdyn365-commerce/retail-proxy';\n\n/**\n * Syncronously creates a product url.\n * @param product Simple product to get url from.\n * @param ctx\n * @param category Category to add to product url.\n */\nexport function getProductUrlSync(product: SimpleProduct, ctx: IActionContext, category?: CategoryHierarchy): string {\n const selectedProduct = { ...product, RecordId: product.MasterProductId || product.RecordId };\n\n return getProductPageUrlSync(selectedProduct.Name || '', selectedProduct.RecordId, ctx, category)!;\n}\n\n/**\n * Syncronously creates a product detail page url.\n * @param name Simple product name.\n * @param recordId Record id of product.\n * @param ctx\n * @param category\n */\nexport function getProductPageUrlSync(name: string, recordId: number, ctx: IActionContext, category?: CategoryHierarchy): string {\n return getUrlSync('product', ctx, {\n product: { Name: name || '', RecordId: recordId },\n category\n })!;\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport {\n CacheType,\n createObservableDataAction,\n IAction,\n IActionContext,\n IActionInput,\n ICommerceApiSettings,\n ICreateActionContext\n} from '@msdyn365-commerce/core';\nimport { getCartState } from '@msdyn365-commerce/global-state';\nimport { Cart, ChannelConfiguration, LoyaltyCard, LoyaltyPointRedemptionEstimate } from '@msdyn365-commerce/retail-proxy';\nimport { getMaxLoyaltyPointsToRedeemForTransactionBalanceAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/CartsDataActions.g';\nimport { getOrgUnitConfigurationAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/OrgUnitsDataActions.g';\n\nimport { buildCacheKey, getLoyalty, GetLoyaltyCardInput } from '.';\n\n/**\n * Input class for the getLoyaltyCard data action.\n */\nexport class GetLoyaltyTransactionEstimationInput implements IActionInput {\n public userAccountNumber?: string;\n\n public apiSettings: ICommerceApiSettings;\n\n constructor(apiSettings: ICommerceApiSettings, userAccountNumber?: string) {\n this.userAccountNumber = userAccountNumber;\n this.apiSettings = apiSettings;\n }\n\n public getCacheKey = () => buildCacheKey(`GetLoyaltyCardTransactionEstimation-${this.userAccountNumber}`, this.apiSettings);\n\n public getCacheObjectType = () => 'GetLoyaltyCardTransactionEstimation';\n\n public dataCacheType = (): CacheType => 'request';\n}\n\n/**\n * CreateInput method for the getLoyaltyCard method.\n * @param inputData The input data passed to the createInput method.\n */\nexport const createGetLoyaltyTransactionEstimationInput = (inputData: ICreateActionContext): GetLoyaltyTransactionEstimationInput => {\n const { requestContext } = inputData;\n if (!requestContext.user.isAuthenticated) {\n return new GetLoyaltyTransactionEstimationInput(inputData.requestContext.apiSettings);\n }\n\n return new GetLoyaltyTransactionEstimationInput(inputData.requestContext.apiSettings);\n};\n\n/**\n * The action method for the getLoyaltyCard data action.\n * @param input The action input.\n * @param ctx The action context.\n */\nexport async function getLoyaltyTransactionEstimationAction(\n input: GetLoyaltyTransactionEstimationInput,\n ctx: IActionContext\n): Promise {\n if (!ctx.requestContext.user.isAuthenticated) {\n return {};\n }\n\n const promises: [Promise, Promise, Promise] = [\n _getCart(ctx),\n _getLoyalty(input, ctx),\n _getOrgUnits(ctx)\n ];\n return Promise.all(promises)\n .then(result => {\n if (result && result.length >= 2 && result[1].CardNumber) {\n return getMaxLoyaltyPointsToRedeemForTransactionBalanceAsync(\n { callerContext: ctx },\n result[0].Id,\n result[1].CardNumber,\n result[2].Currency || ''\n )\n .then(points => {\n return points;\n })\n .catch(error => {\n ctx.telemetry.exception(error);\n ctx.telemetry.debug('Error getting Loyalty Point Redemption Estimate');\n throw new Error('Error getting Loyalty Point Redemption Estimate');\n });\n }\n return {};\n })\n .catch(error => {\n return {};\n });\n}\n\nasync function _getCart(ctx: IActionContext): Promise {\n const cartState = await getCartState(ctx);\n\n return cartState.cart;\n}\n\nasync function _getLoyalty(input: GetLoyaltyTransactionEstimationInput, ctx: IActionContext): Promise {\n const loyaltyCardInput = new GetLoyaltyCardInput(input.apiSettings);\n return getLoyalty(loyaltyCardInput, ctx);\n}\n\nasync function _getOrgUnits(ctx: IActionContext): Promise {\n return getOrgUnitConfigurationAsync({ callerContext: ctx, queryResultSettings: {} });\n}\n\n/**\n * The getLoyaltyTransactionEstimation data action\n * Returns the loyalty card belonging to the customer.\n */\nexport const getLoyaltyTransactionEstimationActionDataAction = createObservableDataAction({\n id: '@msdyn365-commerce-modules/retail-actions/get-loyalty-transaction-estimation',\n action: >getLoyaltyTransactionEstimationAction,\n input: <(args: ICreateActionContext) => IActionInput>createGetLoyaltyTransactionEstimationInput\n});\n\nexport default getLoyaltyTransactionEstimationActionDataAction;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport addAddress, { AddressManagementInput } from './add-address';\nimport addItemToProductListAction, { AddItemToProductListInput } from './add-item-to-product-list';\nimport addOrganizationUser, { AddOrganizationUserInput } from './add-organization-user';\nimport checkout, { CheckOutInput } from './checkout';\nimport createProductList, { CreateProductListInput } from './create-product-list';\nimport deleteAddress from './delete-address';\nimport deleteOrganizationUser, { DeleteOrganizationUserInput } from './delete-organization-user';\nimport editOrganizationUser, { EditOrganizationUserInput } from './edit-organization-user';\nimport { GenericInput, getGenericAction } from './generic-data-action';\nimport getAddress, { AddressInput } from './get-address';\nimport getAttributeDefinitions, { GetAttributeDefinitionsInput } from './get-attribute-definitions';\nimport getAttributesForSelectedVariant, {\n AttributesForSelectedVariantInput,\n createAttributesForSelectedVariantInput,\n getAttributesForSelectedVariantAction\n} from './get-attributes-for-selected-variant';\nimport getAvailabilitiesForCartLineItems, { ProductAvailabilitiesForCartLineItems } from './get-availabilities-cartlines';\nimport getCatalogs from './get-catalogs';\nimport getCategories from './get-categories';\nimport getCategoriesHierarchy, { CategoriesInput } from './get-categories-hierarchy';\nimport getCategoryPaths from './get-category-paths';\nimport getChannelDeliveryOptionConfiguration, { GetChannelDeliveryConfigurationInput } from './get-channel-delivery-option-configuration';\nimport getCheckoutCart, { GetCheckoutCartInput } from './get-checkout-cart';\nimport getCurrentCategory, { CurrentCategoryInput } from './get-current-category';\nimport getCurrentCategoryHierarchy from './get-current-category-hierarchy';\nimport getCustomer, { GetCustomerInput } from './get-customer';\nimport getCustomerBalance, { GetCustomerBalanceInput } from './get-customer-balance';\nimport getCustomerLoyaltyCards from './get-customer-loyalty-cards';\nimport getDeliveryOptionsForCartLineItems, { ProductDeliveryOptionsForCartLineItems } from './get-delivery-options-for-cartlines';\nimport getDeliveryOptionsForSelectedVariant, {\n GetDeliveryOptionsForSelectedVariantInput\n} from './get-delivery-options-for-selected-variant';\nimport getDimensionAvailabilitiesForProductSearchResultAction, {\n DimensionAvailabilitiesForProductSearchResultInput\n} from './get-dimension-availabilities-for-product-search-result';\nimport getDimensionAvailabilitiesForProductsAction, {\n createProductsDimensionAvailabilitiesInput,\n IProductDimension,\n ProductsDimensionAvailabilitiesInput\n} from './get-dimension-availabilities-for-products';\nimport getDimensionsForSelectedVariant from './get-dimensions-for-selected-variant';\nimport getFeatureState, { createGetFeatureStateInput } from './get-feature-state';\nimport getFullAvailableInventoryNearby, { GetFullAvailableInventoryNearbyInput } from './get-full-available-inventory-nearby';\nimport getFullProductList, { GetFullProductListInput } from './get-full-product-list';\nimport getFullProducts, { FullProductInput, getFullProductsAction, ProductDetailsCriteria } from './get-full-products';\nimport getFullProductByRefineSearchCategory, {\n FullProductsRefineSearchByCategoryInput\n} from './get-full-products-by-refine-search-category';\nimport getFullProductByRefineSearchText, { FullProductsRefineSearchByTextInput } from './get-full-products-by-refine-search-text';\nimport getActiveWishlistItems, { ActiveWishlistInput } from './get-items-in-wishlist';\nimport getList, { ListInput } from './get-list';\nimport getLoyalty, { GetLoyaltyCardInput } from './get-loyalty-card';\nimport getLoyaltyTransactionEstimation, { GetLoyaltyTransactionEstimationInput } from './get-loyalty-transaction-estimation';\nimport getMediaLocationsById, { MediaLocationsByIdInput } from './get-media-locations-by-id';\nimport getMediaLocationsForSelectedVariant from './get-media-locations-for-selected-variant';\nimport getOrderHistory from './get-order-history';\nimport getOrgUnitConfiguration from './get-org-unit-configuration';\nimport getOrganizationUsers, { OrganizationUsersInput } from './get-organization-users';\nimport getOrganizationUsersCount from './get-organization-users-count';\nimport getOrganizationWideOrderHistory, { GetOrganizationWideOrderHistoryInput } from './get-organization-wide-order-history';\nimport getPickUpOptionsForCartLineItems, { ProductPickUpOptionsForCartLineItems } from './get-pickup-options-for-cartlines';\nimport {\n getPriceForProductSearchResultDataAction as getPriceForProductSearchResult,\n PriceForProductSearchResultInput\n} from './get-price-for-product-search-result';\nimport getPriceForSelectedVariant, { PriceForSelectedVariantInput } from './get-price-for-selected-variant';\nimport getProductAvailabilitiesForSelectedVariant, {\n ProductAvailabilitiesForSelectedVariantInput\n} from './get-product-availabilities-for-selected-variant';\nimport getProductList, { GetProductListInput } from './get-product-list';\nimport getProductListLines, { GetProductListLinesInput } from './get-product-list-lines';\nimport getProductsByCategory from './get-products-by-category';\nimport getActiveCartProductsAction, { ActiveCartProductsInput } from './get-products-in-active-cart';\nimport getPromotionOptionsForCartLineItems, { PromotionOptionsForCartLineItems } from './get-promotion-options-for-cartlines';\nimport getRatingsSummary from './get-ratings-summary';\nimport { GetRatingsSummaryInput } from './get-ratings-summary-input';\nimport getRefinersByCategory, { createRefinersByCategoryInput, RefinersByCategoryInput } from './get-refiners-by-category';\nimport getRefinersByText, { createRefinersByTextInput, RefinersByTextInput } from './get-refiners-by-text';\nimport getRelatedProducts, { GetRelatedProductsInput } from './get-related-products';\nimport getScanResult, { GetScanResultInput } from './get-scan-results';\nimport getSearchConfiguration, { SearchConfigurationInput } from './get-search-configuration';\nimport getSelectedVariant from './get-selected-variant';\nimport getSimpleProducts, { getSimpleProductsAction, ProductInput } from './get-simple-products';\nimport getOrgUnitLocationsByArea, { GetOrgUnitLocationsByAreaInput } from './get-store-location-information';\nimport getWishlistByCustomerId from './get-wishlist-by-customer-id';\nimport getInvoiceDetails, { GetInvoiceDetailsInput } from './invoices/get-invoice-details';\nimport getInvoices, { GetInvoicesInput } from './invoices/get-invoices';\nimport issueLoyalty, { IssueLoyaltyInput } from './issue-loyalty';\nimport addItemToOrderTemplate, { AddItemToOrderTemplateInput } from './order-templates/add-item-to-order-template';\nimport addOrderTemplateToCartAction, { AddOrderTemplateToCartInput } from './order-templates/add-order-template-to-cart';\nimport createOrderTemplate, { CreateOrderTemplateInput } from './order-templates/create-order-template';\nimport getFullOrderTemplate, { GetFullOrderTemplateInput } from './order-templates/get-full-order-template';\nimport getFullOrderTemplates, { GetFullOrderTemplatesInput } from './order-templates/get-full-order-templates';\nimport getOrderTemplates, { createGetOrderTemplatesInput, GetOrderTemplatesInput } from './order-templates/get-order-templates';\nimport getOrderTemplatesPreview, { GetOrderTemplatesPreviewInput } from './order-templates/get-order-templates-preview';\nimport getPaginatedOrderTemplateLinesAction, {\n GetPaginatedOrderTemplateLinesInput\n} from './order-templates/get-paginated-order-template-lines';\nimport updateOrderTemplateHeader, { UpdateOrderTemplateHeaderInput } from './order-templates/update-order-template-header';\nimport updateOrderTemplateAction, { UpdateOrderTemplateInput } from './order-templates/update-order-template-line';\nimport refineSearchByCategory, { RefineSearchByCriteriaInput } from './refine-search-by-category';\nimport searchByText from './search-by-text';\nimport updateAddress from './update-address';\nimport updateCustomerAttributes, { updateCustomerAttributesInput } from './update-customer-attributes';\nimport updateCustomerPersonalization, { updateCustomerPersonalizationInput } from './update-customer-personalization';\nimport updatePrimaryAddress from './update-primary-address';\nimport { IFullOrgUnitAvailability } from './utilities/full-org-unit-availability';\nimport { getRnrAuthEndpointId, getRnrEndpointId, getRnrPartnerId } from './utilities/getRnrKeys';\nimport {\n createInventoryAvailabilitySearchCriteria,\n isAggregatedInventory,\n mapAggregatedProductInventoryInformation,\n mapProductInventoryInformation\n} from './utilities/product-inventory-utils';\nimport { IScanResultWithProduct } from './utilities/scan-result-with-product';\nimport { validateCartLinesInventory } from './utilities/validate-cartlines-inventory';\n\nexport * from './get-dimensions-for-selected-variant';\nexport * from './get-media-locations-for-selected-variant';\nexport * from './get-product-dimensions-with-availabilities';\nexport * from './get-selected-variant';\nexport * from './utilities';\nexport * from './utilities/order-templates';\nexport * from './utilities/quick-order-template-line';\nexport * from './utilities/quick-order-templates';\nexport * from './utilities/Url-builder';\n\nexport {\n ActiveCartProductsInput,\n ActiveWishlistInput,\n addAddress,\n addItemToOrderTemplate,\n AddItemToOrderTemplateInput,\n addItemToProductListAction,\n AddItemToProductListInput,\n addOrderTemplateToCartAction,\n AddOrderTemplateToCartInput,\n addOrganizationUser,\n AddOrganizationUserInput,\n AddressInput,\n AddressManagementInput,\n AttributesForSelectedVariantInput,\n CategoriesInput,\n checkout,\n CheckOutInput,\n createAttributesForSelectedVariantInput,\n createGetFeatureStateInput,\n createGetOrderTemplatesInput,\n createInventoryAvailabilitySearchCriteria,\n createOrderTemplate,\n CreateOrderTemplateInput,\n createProductList,\n CreateProductListInput,\n createProductsDimensionAvailabilitiesInput,\n createRefinersByCategoryInput,\n createRefinersByTextInput,\n CurrentCategoryInput,\n deleteAddress,\n deleteOrganizationUser,\n DeleteOrganizationUserInput,\n DimensionAvailabilitiesForProductSearchResultInput,\n editOrganizationUser,\n EditOrganizationUserInput,\n FullProductInput,\n FullProductsRefineSearchByCategoryInput,\n FullProductsRefineSearchByTextInput,\n GenericInput,\n getActiveCartProductsAction,\n getActiveWishlistItems,\n getAddress,\n getAttributeDefinitions,\n GetAttributeDefinitionsInput,\n getAttributesForSelectedVariant,\n getAttributesForSelectedVariantAction,\n getAvailabilitiesForCartLineItems,\n getCatalogs,\n getCategories,\n getCategoriesHierarchy,\n getCategoryPaths,\n GetChannelDeliveryConfigurationInput,\n getChannelDeliveryOptionConfiguration,\n getCheckoutCart,\n GetCheckoutCartInput,\n getCurrentCategory,\n getCurrentCategoryHierarchy,\n getCustomer,\n getCustomerBalance,\n GetCustomerBalanceInput,\n GetCustomerInput,\n getCustomerLoyaltyCards,\n getDeliveryOptionsForCartLineItems,\n getDeliveryOptionsForSelectedVariant,\n GetDeliveryOptionsForSelectedVariantInput,\n getDimensionAvailabilitiesForProductsAction,\n getDimensionAvailabilitiesForProductSearchResultAction,\n getDimensionsForSelectedVariant,\n getFeatureState,\n getFullAvailableInventoryNearby,\n GetFullAvailableInventoryNearbyInput,\n getFullOrderTemplate,\n GetFullOrderTemplateInput,\n getFullOrderTemplates,\n GetFullOrderTemplatesInput,\n getFullProductByRefineSearchCategory,\n getFullProductByRefineSearchText,\n getFullProductList,\n GetFullProductListInput,\n getFullProducts,\n getFullProductsAction,\n getGenericAction,\n getInvoiceDetails,\n GetInvoiceDetailsInput,\n getInvoices,\n GetInvoicesInput,\n getList,\n getLoyalty,\n GetLoyaltyCardInput,\n getLoyaltyTransactionEstimation,\n GetLoyaltyTransactionEstimationInput,\n getMediaLocationsById,\n getMediaLocationsForSelectedVariant,\n getOrderHistory,\n getOrderTemplates,\n GetOrderTemplatesInput,\n getOrderTemplatesPreview,\n GetOrderTemplatesPreviewInput,\n getOrganizationUsers,\n getOrganizationUsersCount,\n getOrganizationWideOrderHistory,\n GetOrganizationWideOrderHistoryInput,\n getOrgUnitConfiguration,\n getOrgUnitLocationsByArea,\n GetOrgUnitLocationsByAreaInput,\n getPaginatedOrderTemplateLinesAction,\n GetPaginatedOrderTemplateLinesInput,\n getPickUpOptionsForCartLineItems,\n getPriceForProductSearchResult,\n getPriceForSelectedVariant,\n getProductAvailabilitiesForSelectedVariant,\n getProductList,\n GetProductListInput,\n getProductListLines,\n GetProductListLinesInput,\n getProductsByCategory,\n getPromotionOptionsForCartLineItems,\n getRatingsSummary,\n GetRatingsSummaryInput,\n getRefinersByCategory,\n getRefinersByText,\n getRelatedProducts,\n GetRelatedProductsInput,\n getRnrAuthEndpointId,\n getRnrEndpointId,\n getRnrPartnerId,\n getScanResult,\n GetScanResultInput,\n getSearchConfiguration,\n getSelectedVariant,\n getSimpleProducts,\n getSimpleProductsAction,\n getWishlistByCustomerId,\n IFullOrgUnitAvailability,\n IProductDimension,\n isAggregatedInventory,\n IScanResultWithProduct,\n issueLoyalty,\n IssueLoyaltyInput,\n ListInput,\n mapAggregatedProductInventoryInformation,\n mapProductInventoryInformation,\n MediaLocationsByIdInput,\n OrganizationUsersInput,\n PriceForProductSearchResultInput,\n PriceForSelectedVariantInput,\n ProductAvailabilitiesForCartLineItems,\n ProductAvailabilitiesForSelectedVariantInput,\n ProductDeliveryOptionsForCartLineItems,\n ProductDetailsCriteria,\n ProductInput,\n ProductPickUpOptionsForCartLineItems,\n ProductsDimensionAvailabilitiesInput,\n PromotionOptionsForCartLineItems,\n RefinersByCategoryInput,\n RefinersByTextInput,\n refineSearchByCategory,\n RefineSearchByCriteriaInput,\n searchByText,\n SearchConfigurationInput,\n updateAddress,\n updateCustomerAttributes,\n updateCustomerAttributesInput,\n updateCustomerPersonalization,\n updateCustomerPersonalizationInput,\n updateOrderTemplateAction,\n updateOrderTemplateHeader,\n UpdateOrderTemplateHeaderInput,\n UpdateOrderTemplateInput,\n updatePrimaryAddress,\n validateCartLinesInventory\n};\n\nexport { IQueryResultSettingsModuleConfig } from './utilities/IQueryResultSettingsModuleConfig';\nexport { QueryResultSettingsProxy } from './utilities/QueryResultSettingsProxy';\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { RatingsSummary } from '@msdyn365-commerce/commerce-entities';\nimport {\n createObservableDataAction,\n IAction,\n IActionContext,\n IActionInput,\n IAny,\n ICreateActionContext,\n IGeneric,\n sendRequest\n} from '@msdyn365-commerce/core';\n\nimport { GetRatingsSummaryInput, getSelectedProductIdFromActionInput } from '.';\nimport { getRnrEndpointId, getRnrPartnerId } from './utilities/getRnrKeys';\n\nexport const createInput = (input: ICreateActionContext>): IActionInput => {\n const productId = getSelectedProductIdFromActionInput(input);\n if (productId) {\n return new GetRatingsSummaryInput(productId, getRnrPartnerId(input), getRnrEndpointId(input));\n }\n throw new Error('[GetRatingsSummary] Not all necessary parameters found while creating Input for getRatingsSummaryApi');\n};\n\n/**\n * This function gets the ratings summary.\n * @param input\n * @param ctx\n */\nexport async function getRatingsSummary(input: GetRatingsSummaryInput, ctx: IActionContext): Promise {\n if (!inputIsValid(input)) {\n ctx.trace('[GetRatingsSummary] Failed to get ratings summary for product');\n return {};\n }\n\n const requestUrl = `${input.serviceEndpoint}/v2.0/ratings/product/${input.productId}/summary?` + `tenantId=${input.tenantId}`;\n return sendRequest(requestUrl, 'get')\n .then(response => {\n return response.data;\n })\n .catch(error => {\n ctx.trace('[GetRatingsSummary] Failed to get ratings summary for product');\n throw error;\n });\n}\n\nfunction inputIsValid(input: GetRatingsSummaryInput): boolean {\n return input && input.productId.length > 0 && input.tenantId.length > 0;\n}\n\nexport const getRatingsSummaryDataAction = createObservableDataAction({\n id: '@msdyn365-commerce-modules/retail-actions/get-ratings-summary',\n action: >getRatingsSummary,\n input: createInput\n});\n\nexport default getRatingsSummaryDataAction;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { FullProduct, IRefineFullProductSearchOutput } from '@msdyn365-commerce/commerce-entities';\nimport {\n CacheType,\n createObservableDataAction,\n getCatalogId,\n IAction,\n IActionContext,\n IActionInput,\n IAny,\n ICreateActionContext,\n IGeneric\n} from '@msdyn365-commerce/core';\nimport { ProductRefinerValue, ProductSearchResult } from '@msdyn365-commerce/retail-proxy';\nimport { refineSearchByCategoryAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/ProductsDataActions.g';\n\nimport getFullProducts, { FullProductInput, ProductDetailsCriteria } from './get-full-products';\nimport { QueryResultSettingsProxy } from './utilities/QueryResultSettingsProxy';\nimport { getProductDetailsCriteriaFromActionInput } from './utilities/utils';\n\n/**\n * Refine search for full products input.\n */\nexport class FullProductsRefineSearchByCategoryInput implements IActionInput {\n public readonly categoryId?: number;\n\n public readonly channelId?: number;\n\n public readonly refinementCriteria: ProductRefinerValue[];\n\n public readonly catalogId: number;\n\n public ProductDetailsCriteria?: ProductDetailsCriteria;\n\n public readonly queryResultSettingsProxy: QueryResultSettingsProxy;\n\n constructor(\n queryResultSettingsProxy: QueryResultSettingsProxy,\n categoryId?: number,\n channelId?: number,\n refinementCriteria?: ProductRefinerValue[],\n catalogId?: number,\n criteria?: ProductDetailsCriteria\n ) {\n this.queryResultSettingsProxy = queryResultSettingsProxy;\n this.categoryId = categoryId;\n this.channelId = channelId;\n this.refinementCriteria = refinementCriteria || [];\n this.catalogId = catalogId ?? 0;\n this.ProductDetailsCriteria = criteria;\n }\n\n public getCacheKey = () => 'FullProductsRefineSearchByCategoryInputCache';\n\n public getCacheObjectType = () => 'FullProductsRefineSearchByCategoryInput';\n\n public dataCacheType = (): CacheType => 'none';\n}\n\n/**\n * Creates the input required to make the core action calls.\n * @param inputData\n */\nexport const createFullProductsRefineSearchByCategoryInput = (inputData: ICreateActionContext>): IActionInput => {\n const refinementCriteria = inputData.config && inputData.config.refinementCriteria;\n const queryResultSettingsProxy = QueryResultSettingsProxy.fromInputData(inputData);\n if (!Array.isArray(refinementCriteria)) {\n return new FullProductsRefineSearchByCategoryInput(queryResultSettingsProxy);\n }\n\n if (inputData && inputData.requestContext && inputData.requestContext.query && inputData.requestContext.query.categoryId) {\n const categoryId = Number(inputData.requestContext.query.categoryId);\n const channelId = inputData.requestContext.apiSettings.channelId;\n const productDetailsCriteria = getProductDetailsCriteriaFromActionInput(inputData);\n return new FullProductsRefineSearchByCategoryInput(\n queryResultSettingsProxy,\n categoryId,\n +channelId,\n refinementCriteria,\n undefined,\n productDetailsCriteria\n );\n }\n\n throw new Error('Please specify categoryId, refinerId, and refinerSourceValue query string in request.');\n};\n\n/**\n * Calls the refine-search-by-category action.\n * Based on search result calls get-full-products to get all the product details.\n * @param input\n * @param ctx\n */\nexport async function getFullProductsByRefineSearchCategoryAction(\n input: FullProductsRefineSearchByCategoryInput,\n ctx: IActionContext\n): Promise {\n if (!input || !input.refinementCriteria) {\n ctx.trace('[getFullProductsByRefineSearchCategoryAction] Invalid input.');\n return {};\n }\n\n const hasSortingColumn =\n input.queryResultSettingsProxy.QueryResultSettings &&\n input.queryResultSettingsProxy.QueryResultSettings.Sorting &&\n input.queryResultSettingsProxy.QueryResultSettings.Sorting.Columns &&\n input.queryResultSettingsProxy.QueryResultSettings.Sorting.Columns.length > 0;\n if (input.refinementCriteria.length === 0 && !hasSortingColumn) {\n ctx.telemetry.trace('[getFullProductsByRefineSearchCategoryAction] No refiners or sorting specified.');\n return {};\n }\n const { apiSettings } = ctx.requestContext;\n\n const catalogId = getCatalogId(ctx.requestContext);\n\n let refinementCriteria: ProductRefinerValue[] = [];\n const fullProductInputs = await refineSearchByCategoryAsync(\n { callerContext: ctx, queryResultSettings: input.queryResultSettingsProxy.QueryResultSettings },\n input.channelId || 0,\n input.catalogId || catalogId,\n input.categoryId || 0,\n input.refinementCriteria\n ).then(searchResults => {\n refinementCriteria = input.refinementCriteria;\n return searchResults.map(\n (product: ProductSearchResult): FullProductInput => {\n return new FullProductInput(\n product.RecordId,\n apiSettings,\n input.ProductDetailsCriteria || new ProductDetailsCriteria(),\n ctx.requestContext\n );\n }\n );\n });\n\n if (fullProductInputs.length > 0) {\n const productResult = await (>getFullProducts(fullProductInputs, ctx));\n return {\n productSearchResult: productResult,\n refinementCriteria\n };\n }\n return {\n productSearchResult: [],\n refinementCriteria\n };\n}\n\nexport const getFullProductsByRefineSearchCategoryActionDataAction = createObservableDataAction({\n id: '@msdyn365-commerce-modules/retail-actions/get-full-products-by-refine-search-category',\n action: >getFullProductsByRefineSearchCategoryAction,\n input: createFullProductsRefineSearchByCategoryInput,\n isBatched: false\n});\n\nexport default getFullProductsByRefineSearchCategoryActionDataAction;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport {\n CacheType,\n createObservableDataAction,\n IAction,\n IActionContext,\n IActionInput,\n IAny,\n ICommerceApiSettings,\n ICreateActionContext,\n IGeneric\n} from '@msdyn365-commerce/core';\nimport { getCartState } from '@msdyn365-commerce/global-state';\nimport { ProductAvailableQuantity, ProductDeliveryOptions, ProductsDataActions } from '@msdyn365-commerce/retail-proxy';\n\nimport { ActiveCartProductsInput, buildCacheKey, getActiveCartProductsAction } from '.';\nimport { QueryResultSettingsProxy } from './utilities/QueryResultSettingsProxy';\n\n/**\n * Input class for delivery options for items in cart.\n */\nexport class ProductDeliveryOptionsForCartLineItems implements IActionInput {\n private readonly apiSettings: ICommerceApiSettings;\n\n constructor(apiSettings: ICommerceApiSettings) {\n this.apiSettings = apiSettings;\n }\n\n public getCacheKey = () => buildCacheKey('ActiveCartLineItemsDeliveryOptions', this.apiSettings);\n\n public getCacheObjectType = () => 'ActiveCartLineItemsDeliveryOptions';\n\n public dataCacheType = (): CacheType => 'request';\n}\n\nconst createInput = (inputData: ICreateActionContext>) => {\n return new ProductDeliveryOptionsForCartLineItems(inputData.requestContext.apiSettings);\n};\n\n/**\n * Calls the Retail API to get the delivery options for items in the cart.\n * @param input\n * @param ctx\n */\nexport async function getDeliveryOptionsForCartLineItems(\n input: ProductDeliveryOptionsForCartLineItems,\n ctx: IActionContext\n): Promise {\n // If no input is provided fail out\n if (!input) {\n throw new Error('[getDeliveryOptionsForCartLineItems]No valid Input was provided, failing');\n }\n const cartState = await getCartState(ctx);\n const cart = cartState.cart;\n const products = await getActiveCartProductsAction(new ActiveCartProductsInput(), ctx);\n\n if (!cart || !products || products.length === 0) {\n ctx.trace('[getDeliveryOptionsForCartLineItems] Not able to get cart OR channelConfiguration or no products in cart');\n return [];\n }\n\n return ProductsDataActions.getDeliveryOptionsAsync(\n {\n callerContext: ctx,\n queryResultSettings: QueryResultSettingsProxy.getPagingFromInputDataOrDefaultValue(ctx)\n },\n products.map(x => x.RecordId),\n {},\n null\n )\n .then(result => {\n return result;\n })\n .catch((error: Error) => {\n ctx.trace(error.message);\n ctx.telemetry.exception(error);\n ctx.telemetry.debug('[getDeliveryOptionsForCartLineItems]Error executing action');\n throw new Error('[getDeliveryOptionsForCartLineItems]Error executing action');\n });\n}\n\nexport const getDeliveryOptionsForCartLineItemsDataAction = createObservableDataAction({\n id: '@msdyn365-commerce-modules/retail-actions/get-delivery-options-for-cartlines',\n action: >getDeliveryOptionsForCartLineItems,\n input: createInput\n});\n\nexport default getDeliveryOptionsForCartLineItemsDataAction;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IPromiseQueue, PromiseBodyWrapper, PromiseRejectType, PromiseResolveType } from './base-promise-queue';\n\n/**\n * Represents an inner node which is stored in a promise queue.\n * Used internally in the PromiseQueue implementation.\n * @author Bohdan Yevchenko \n */\nclass PromiseQueueElement {\n /**\n * The body of a wrapper-function which contains a call to the promise which has to be executed in the queue.\n */\n public readonly body: PromiseBodyWrapper;\n\n /**\n * Method that resolves the promise after the promise from the body is resolved.\n */\n public readonly resolve: PromiseResolveType;\n\n /**\n * Method that rejects the promise after the promise from the body is rejected.\n */\n public readonly reject: PromiseRejectType;\n\n /**\n * Initializes queue element with the given data.\n * @param {PromiseBodyWrapper} body The body of a wrapper-function which contains a call to the promise which has to be executed in the queue.\n * @param {PromiseResolveType} resolve Method that resolves the promise after the promise from the body is resolved.\n * @param {PromiseRejectType} reject Method that rejects the promise after the promise from the body is rejected.\n */\n public constructor(\n body: PromiseBodyWrapper,\n resolve: PromiseResolveType,\n reject: PromiseRejectType\n ) {\n this.body = body;\n this.resolve = resolve;\n this.reject = reject;\n }\n}\n\n/**\n * Represents a FIFO basic queue over promises.\n * @author Bohdan Yevchenko \n */\nexport class PromiseQueue implements IPromiseQueue {\n /**\n * A list of promises waiting for execution.\n */\n protected readonly _queue: PromiseQueueElement[];\n\n /**\n * Defines whether the queue is processing some element.\n */\n protected _isBusy: boolean;\n\n /**\n * Defines whether the queue can start processing new element.\n */\n private get _canProcess(): boolean {\n return !this._isBusy && this._queue.length > 0;\n }\n\n /**\n * Creates a new instance of PromiseQueue.\n */\n public constructor() {\n this._queue = [];\n this._isBusy = false;\n }\n\n /**\n * Adds promise to the queue and automatically starts the queue execution.\n * @param {PromiseBodyWrapper} promiseBody\n * The body of a function which contains a call to the promise which has to be executed in the queue.\n */\n public async enqueue(promiseBody: PromiseBodyWrapper): Promise {\n return new Promise(async (resolve, reject) => {\n this._queue.push(new PromiseQueueElement(promiseBody, resolve, reject));\n await this._dequeue();\n });\n }\n\n /**\n * If the queue is free, starts processing the first element in the queue and waits until all the elements are processed.\n * Otherwise (if busy or has no elements to process), does nothing.\n */\n private async _dequeue(): Promise {\n // Skip if queue is not able to process any elements.\n if (!this._canProcess) {\n return;\n }\n\n // Lock queue to prevent parallel execution.\n this._isBusy = true;\n\n // Retrieve an element from the waiting queue and start processing.\n const element: PromiseQueueElement = this._queue.shift()!;\n await this._processElement(element);\n\n // Continue executing the subsequent queue elements.\n await this._processNext();\n }\n\n /**\n * Executes the given wrapper over the promise and calls initial resolve/reject correspondingly.\n * @param {PromiseQueueElement} element The queue element which should be processed now.\n */\n private async _processElement(element: PromiseQueueElement): Promise {\n try {\n await element\n .body()\n .then(element.resolve)\n .catch(element.reject);\n } catch (error) {\n element.reject(error);\n }\n }\n\n /**\n * Unlocks the queue and tries to process the next element in the queue.\n */\n private async _processNext(): Promise {\n this._isBusy = false;\n await this._dequeue();\n }\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport {\n CacheType,\n createObservableDataAction,\n IAction,\n IActionContext,\n IActionInput,\n ICreateActionContext\n} from '@msdyn365-commerce/core';\nimport {\n ProductList,\n ProductListsDataActions,\n ProductListSearchCriteria,\n ProductListType,\n QueryResultSettings\n} from '@msdyn365-commerce/retail-proxy';\n\n/**\n * Input class for the GetProductList data action.\n */\nexport class GetProductListInput implements IActionInput {\n public readonly productListId: string;\n\n public readonly queryResultSettings?: QueryResultSettings;\n\n public constructor(productListId?: string, queryResultSettings?: QueryResultSettings) {\n this.productListId = productListId ? productListId : '';\n this.queryResultSettings = queryResultSettings;\n }\n\n /**\n * Get Cache Key.\n * @returns - Cache key string.\n */\n public getCacheKey = (): string => 'ProductList';\n\n /**\n * Get Cachetype Name.\n * @returns - Cache name string.\n */\n public getCacheObjectType = (): string => 'ProductList';\n\n /**\n * Get Cachetype.\n * @returns - CacheType enum.\n */\n public dataCacheType = (): CacheType => 'none';\n\n /**\n * Set Cache output.\n * @returns - Flag for cache output.\n */\n public shouldCacheOutput = (): boolean => false;\n}\n\n/**\n * CreateInput method for the GetProductList method.\n * @param inputData - The input data passed to the createInput method.\n * @param productListId - The product list identifier.\n * @param queryResultSettings - The query result setting required for pagination/ordering.\n * @returns - Product List input.\n */\nexport const createGetProductListInput = (\n inputData: ICreateActionContext,\n productListId?: string,\n queryResultSettings?: QueryResultSettings\n): GetProductListInput => {\n const { requestContext } = inputData;\n if (!requestContext.user.isAuthenticated) {\n throw new Error('Unable to create get product list. User is not authenticated.');\n }\n\n return new GetProductListInput(productListId ? productListId : '', queryResultSettings);\n};\n\n/**\n * The action method for the GetProductList data action.\n * @param input - The action input.\n * @param context - The action context.\n * @returns - ProductList array.\n */\nexport async function getProductListAction(input: GetProductListInput, context: IActionContext): Promise {\n const productListType = ProductListType.QuickOrder.toString();\n const productListSearchCriteria: ProductListSearchCriteria = {\n ProductListType: productListType\n };\n const productLists = await ProductListsDataActions.searchAsync(\n {\n callerContext: context,\n queryResultSettings: input.queryResultSettings\n },\n productListSearchCriteria\n ).then(result => {\n return result;\n });\n\n return productLists;\n}\n\n/**\n * The GetProductList Data Action\n * Returns product list.\n */\nexport default createObservableDataAction({\n id: '@msdyn365-commerce-modules/retail-actions/get-product-list',\n action: getProductListAction as IAction,\n input: createGetProductListInput\n});\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport {\n CacheType,\n createObservableDataAction,\n IAction,\n IActionContext,\n IActionInput,\n ICommerceApiSettings,\n ICreateActionContext\n} from '@msdyn365-commerce/core';\nimport { Address } from '@msdyn365-commerce/retail-proxy';\n\nimport getCustomer, { GetCustomerInput } from './get-customer';\nimport { buildCacheKey } from './utilities/utils';\n\n/**\n * Input class for the getAddress data action.\n */\nexport class AddressInput implements IActionInput {\n public userAccountNumber?: string;\n\n private readonly apiSettings: ICommerceApiSettings;\n\n constructor(apiSettings: ICommerceApiSettings, userAccountNumber?: string) {\n this.userAccountNumber = userAccountNumber;\n this.apiSettings = apiSettings;\n }\n\n public getCacheKey = () => buildCacheKey(`GetAddress-${this.userAccountNumber}`, this.apiSettings);\n\n public getCacheObjectType = () => 'GetAddress';\n\n public dataCacheType = (): CacheType => 'request';\n}\n\n/**\n * CreateInput method for the getAddress method.\n * @param inputData The input data passed to the createInput method.\n */\nexport const createGetAddressInput = (inputData: ICreateActionContext): IActionInput => {\n const { requestContext } = inputData;\n if (!requestContext.user.isAuthenticated) {\n throw new Error('Unable to create address input. User is not authenticated.');\n }\n\n return new AddressInput(inputData.requestContext.apiSettings);\n};\n\n/**\n * The action method for the getAddress data action.\n * @param input The action input.\n * @param ctx The action context.\n */\nexport async function getAddressAction(input: AddressInput, ctx: IActionContext): Promise {\n const customerInput = new GetCustomerInput(ctx.requestContext.apiSettings, input.userAccountNumber);\n const customer = await getCustomer(customerInput, ctx);\n\n if (!customer) {\n throw new Error('Not able to get customer');\n }\n\n return customer.Addresses || [];\n}\n\n/**\n * The getAddress data action\n * Gets a customers information via the read RetailServer API\n * Returns address information associated with the retrieved customer.\n */\nexport const getAddressActionDataAction = createObservableDataAction({\n id: '@msdyn365-commerce-modules/retail-actions/get-address',\n action: >getAddressAction,\n input: <(args: ICreateActionContext) => IActionInput>createGetAddressInput\n});\n\nexport default getAddressActionDataAction;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport {\n CacheType,\n createObservableDataAction,\n IAction,\n IActionContext,\n IActionInput,\n IAny,\n ICommerceApiSettings,\n ICreateActionContext,\n IGeneric\n} from '@msdyn365-commerce/core';\nimport { ProductSearchResult, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\nimport { searchByCategoryAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/ProductsDataActions.g';\n\nimport getCurrentCategory, { CurrentCategoryInput } from './get-current-category';\nimport getProducts, { ProductInput } from './get-simple-products';\nimport { QueryResultSettingsProxy } from './utilities/QueryResultSettingsProxy';\nimport { generateCacheKey } from './utilities/utils';\n\n/**\n * Product by category ID Input action.\n * @deprecated\n */\nexport class ProductsByCategoryInput implements IActionInput {\n public categoryId?: number;\n\n public categorySlug?: string;\n\n public categoryName?: string;\n\n public catalogId: number;\n\n public currentCategory: CurrentCategoryInput;\n\n public readonly queryResultSettingsProxy: QueryResultSettingsProxy;\n\n private readonly apiSettings: ICommerceApiSettings;\n\n constructor(category: CurrentCategoryInput, apiSettings: ICommerceApiSettings, queryResultSettingsProxy: QueryResultSettingsProxy) {\n this.apiSettings = apiSettings;\n this.currentCategory = category;\n this.queryResultSettingsProxy = queryResultSettingsProxy;\n this.catalogId = apiSettings.catalogId;\n this.categoryId = category.categoryId;\n this.categorySlug = category.categorySlug;\n }\n\n public getCacheKey = () =>\n generateCacheKey(\n this.apiSettings,\n { key: 'CategoryId', value: this.categoryId || this.categorySlug },\n { key: 'CatalogId', value: this.catalogId },\n { key: 'QueryResultSettingsCacheKeyHint', value: this.queryResultSettingsProxy.cacheKeyHint }\n );\n\n public getCacheObjectType = () => 'Products-From-Search';\n\n public dataCacheType = (): CacheType => 'application';\n}\n\n/**\n * CreateInput method for the getProductsByCategory data aciton.\n * @param inputData\n * @deprecated\n */\nexport const createGetProductsByCategoryInput = (inputData: ICreateActionContext>): IActionInput => {\n if (inputData && inputData.requestContext) {\n const currentCategory = new CurrentCategoryInput(inputData.requestContext);\n const queryResultSettingsProxy = QueryResultSettingsProxy.fromInputData(inputData);\n return new ProductsByCategoryInput(currentCategory, inputData.requestContext.apiSettings, queryResultSettingsProxy);\n }\n\n throw new Error('Please specify categoryId query string in request.');\n};\n\n/**\n * Action method for the getProductsByCategory data action.\n * @param input\n * @param ctx\n * @deprecated\n */\nexport async function getProductsByCategoryAction(input: ProductsByCategoryInput, ctx: IActionContext): Promise {\n const { apiSettings } = ctx.requestContext;\n let categoryId = input.currentCategory.categoryId;\n if (input.currentCategory.categorySlug && !categoryId) {\n const category = await getCurrentCategory(input.currentCategory, ctx);\n if (!category) {\n ctx.trace('[getProductsByCategoryAction] Unable to find category');\n return [];\n }\n categoryId = category.RecordId;\n }\n\n const productInputs = await searchByCategoryAsync(\n { callerContext: ctx, queryResultSettings: input.queryResultSettingsProxy.QueryResultSettings },\n +apiSettings.channelId,\n input.catalogId,\n categoryId || 0\n ).then(productSearchResults => {\n return productSearchResults.map(\n (product: ProductSearchResult): ProductInput => {\n return new ProductInput(product.RecordId, apiSettings, undefined, undefined, ctx.requestContext);\n }\n );\n });\n\n if (productInputs.length > 0) {\n // eslint-disable-next-line no-return-await -- existing code\n return await getProducts(productInputs, ctx);\n }\n return [];\n}\n\n/**\n * The getProductsByCategory data action\n * Retrieves the current category of the request via the getCurrentCategory data action\n * Then calls the searchByCategory RetailServer API to get a list of products associated with\n * the current category, and finally fully hydrates the data for those prodcuts via the\n * getProducts data action, returning a list of SimpleProducts within the current category.\n * @deprecated\n */\nexport const getProductsByCategoryActionDataAction = createObservableDataAction({\n id: '@msdyn365-commerce-modules/retail-actions/get-products-by-category',\n action: >getProductsByCategoryAction,\n input: createGetProductsByCategoryInput\n});\n\n/**\n * @deprecated\n */\nexport default getProductsByCategoryActionDataAction;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IActionContext } from '@msdyn365-commerce/core';\nimport {\n InventoryAvailabilitySearchCriteria,\n ProductAvailableQuantity,\n ProductWarehouseInventoryAvailability,\n ProductWarehouseInventoryInformation,\n SearchArea\n} from '@msdyn365-commerce/retail-proxy';\n\nimport { DeliveryMode, InventoryLevels, InventoryLevelValues, IProductInventoryInformation } from './product-inventory-information';\n\n/**\n * The function defines whether the inventory label should be displayed or not.\n * @param context - The action context.\n * @param inventoryCode - The inventory code.\n * @returns Boolean.\n */\nexport function displayLabelEnabled(context: IActionContext, inventoryCode?: string): boolean {\n if (!inventoryCode) {\n return false;\n }\n\n // eslint-disable-next-line default-case\n switch (context.requestContext.app.config.inventoryRanges) {\n case 'lowAndOutofStock':\n if (inventoryCode !== InventoryLevelValues.available) {\n return true;\n }\n break;\n case 'outOfStock':\n if (inventoryCode === InventoryLevelValues.outOfStock) {\n return true;\n }\n break;\n case 'all':\n return true;\n }\n return false;\n}\n\n/**\n * The function that maps a ProductWareHouse object into a ProductAvailabilityQuantity.\n * @param context - The action context.\n * @param productsWarehouseInventory - The product warehouse inventory information.\n * @returns IProductInventoryInformation[].\n */\nexport function mapProductInventoryInformation(\n context: IActionContext,\n productsWarehouseInventory?: ProductWarehouseInventoryAvailability[]\n): IProductInventoryInformation[] {\n const productInventoryInformation: IProductInventoryInformation[] = [];\n\n if (context.requestContext.app.config.enableStockCheck === undefined || context.requestContext.app.config.enableStockCheck === false) {\n return productInventoryInformation;\n }\n\n if (productsWarehouseInventory && productsWarehouseInventory.length > 0) {\n for (const product of productsWarehouseInventory) {\n switch (context.requestContext.app.config.inventoryLevel) {\n case InventoryLevels.physicalAvailable:\n // Inventory level is enabled with Physical inventory\n const physicalProductMap = mapInventoryWithPhysicalBufferEnabled(context, product);\n if (physicalProductMap) {\n productInventoryInformation.push(physicalProductMap);\n }\n break;\n case InventoryLevels.totalAvailable:\n // Inventory level is enabled with Total available inventory\n const totalAvailableProductMap = mapInventoryWithTotalAvailableBufferEnabled(context, product);\n if (totalAvailableProductMap) {\n productInventoryInformation.push(totalAvailableProductMap);\n }\n break;\n default:\n // When inventory level is inventoryThreshold or not defined\n const productMap = mapInventoryWithThresholdEnabled(context, product);\n if (productMap) {\n productInventoryInformation.push(productMap);\n }\n break;\n }\n }\n }\n\n return productInventoryInformation;\n}\n\n/**\n * The function that maps inventory for when threshold is selected.\n * @param context - The action context.\n * @param productWarehouseInventoryAvailability - The product warehouse inventory information.\n * @returns IProductInventoryInformation.\n */\nexport function mapInventoryWithThresholdEnabled(\n context: IActionContext,\n productWarehouseInventoryAvailability: ProductWarehouseInventoryAvailability\n): IProductInventoryInformation | null {\n if (productWarehouseInventoryAvailability.ProductId && productWarehouseInventoryAvailability.TotalAvailable !== undefined) {\n const productQty = productWarehouseInventoryAvailability.TotalAvailable - context.requestContext.app.config.outOfStockThreshold;\n const productAvailableQuantity: ProductAvailableQuantity = {\n ProductId: productWarehouseInventoryAvailability.ProductId,\n AvailableQuantity: productQty > 0 ? productQty : 0\n };\n\n return {\n ProductAvailableQuantity: productAvailableQuantity,\n IsProductAvailable: !!(productAvailableQuantity.AvailableQuantity && productAvailableQuantity.AvailableQuantity > 0),\n InventLocationId: productWarehouseInventoryAvailability.InventLocationId\n };\n }\n\n return null;\n}\n\n/**\n * The function that maps inventory for when physical available is selected.\n * @param context - The action context.\n * @param productWarehouseInventoryAvailability - The product warehouse inventory information.\n * @returns IProductInventoryInformation.\n */\nexport function mapInventoryWithPhysicalBufferEnabled(\n context: IActionContext,\n productWarehouseInventoryAvailability: ProductWarehouseInventoryAvailability\n): IProductInventoryInformation | null {\n const shouldRenderLabel = displayLabelEnabled(context, productWarehouseInventoryAvailability.PhysicalAvailableInventoryLevelCode);\n\n if (productWarehouseInventoryAvailability.ProductId && productWarehouseInventoryAvailability.TotalAvailable !== undefined) {\n // As per the new buffer logic from RS,\n // if code is out of stock then we set the available quantity to 0 regardless of the actual value from API\n let productQuantity: number | undefined = 0;\n if (productWarehouseInventoryAvailability.PhysicalAvailableInventoryLevelCode !== InventoryLevelValues.outOfStock) {\n productQuantity =\n productWarehouseInventoryAvailability.MaximumPurchasablePhysicalAvailableQuantity ??\n productWarehouseInventoryAvailability.PhysicalAvailable;\n }\n\n const productAvailableQuantity: ProductAvailableQuantity = {\n ProductId: productWarehouseInventoryAvailability.ProductId,\n AvailableQuantity: productQuantity\n };\n return {\n ProductAvailableQuantity: productAvailableQuantity,\n StockLevelCode: shouldRenderLabel ? productWarehouseInventoryAvailability.PhysicalAvailableInventoryLevelCode : undefined,\n StockLevelLabel: shouldRenderLabel ? productWarehouseInventoryAvailability.PhysicalAvailableInventoryLevelLabel : undefined,\n IsProductAvailable: productAvailableQuantity.AvailableQuantity !== undefined && productAvailableQuantity.AvailableQuantity > 0,\n InventLocationId: productWarehouseInventoryAvailability.InventLocationId\n };\n }\n\n return null;\n}\n\n/**\n * The function that maps inventory for when total available is selected.\n * @param context - The action context.\n * @param productWarehouseInventoryAvailability - The product warehouse inventory information.\n * @returns IProductInventoryInformation.\n */\nexport function mapInventoryWithTotalAvailableBufferEnabled(\n context: IActionContext,\n productWarehouseInventoryAvailability: ProductWarehouseInventoryAvailability\n): IProductInventoryInformation | null {\n const shouldRenderLabel = displayLabelEnabled(context, productWarehouseInventoryAvailability.TotalAvailableInventoryLevelCode);\n if (productWarehouseInventoryAvailability.ProductId && productWarehouseInventoryAvailability.TotalAvailable !== undefined) {\n // As per the new buffer logic from RS,\n // if code is out of stock then we set the available quantity to 0 regardless of the actual value from API\n let productQuantity: number | undefined = 0;\n if (productWarehouseInventoryAvailability.TotalAvailableInventoryLevelCode !== InventoryLevelValues.outOfStock) {\n productQuantity =\n productWarehouseInventoryAvailability.MaximumPurchasableTotalAvailableQuantity ??\n productWarehouseInventoryAvailability.TotalAvailable;\n }\n\n const productAvailableQuantity: ProductAvailableQuantity = {\n ProductId: productWarehouseInventoryAvailability.ProductId,\n AvailableQuantity: productQuantity\n };\n return {\n ProductAvailableQuantity: productAvailableQuantity,\n StockLevelCode: shouldRenderLabel ? productWarehouseInventoryAvailability.TotalAvailableInventoryLevelCode : undefined,\n StockLevelLabel: shouldRenderLabel ? productWarehouseInventoryAvailability.TotalAvailableInventoryLevelLabel : undefined,\n // eslint-disable-next-line eqeqeq\n IsProductAvailable: productAvailableQuantity.AvailableQuantity != undefined && productAvailableQuantity.AvailableQuantity > 0,\n InventLocationId: productWarehouseInventoryAvailability.InventLocationId\n };\n }\n\n return null;\n}\n\n/**\n * The function created a InventoryAvailabilitySearchCriteria object for getEstimatedAvailability API.\n * @param context - The action context.\n * @returns Boolean.\n */\nexport function isAggregatedInventory(context: IActionContext): boolean {\n // If warehouse aggregated is true then query inventory from multiple warehouses\n // else query from single warehouse\n return (\n (context.requestContext.app.config.inventoryLevel === InventoryLevels.totalAvailable ||\n context.requestContext.app.config.inventoryLevel === InventoryLevels.physicalAvailable) &&\n context.requestContext.app.config.warehouseAggregation === 'multiple'\n );\n}\n\n/**\n * The function created a InventoryAvailabilitySearchCriteria object for getEstimatedAvailability API.\n * @param context - The action context.\n * @param productWarehouseInventoryInformation - The product ware house inventory information.\n * @returns ProductWarehouseInventoryInformation.\n */\nexport function mapAggregatedProductInventoryInformation(\n context: IActionContext,\n productWarehouseInventoryInformation: ProductWarehouseInventoryInformation\n): IProductInventoryInformation[] {\n if (isAggregatedInventory(context)) {\n const productInventoryMapping:\n | ProductWarehouseInventoryAvailability[]\n | undefined = productWarehouseInventoryInformation.AggregatedProductInventoryAvailabilities?.map(product => {\n return {\n DataAreaId: product.DataAreaId,\n MaximumPurchasablePhysicalAvailableQuantity:\n product.MaximumPurchasablePhysicalAvailableQuantity ?? product.PhysicalAvailableQuantity,\n MaximumPurchasableTotalAvailableQuantity:\n product.MaximumPurchasableTotalAvailableQuantity ?? product.TotalAvailableQuantity,\n ProductId: product.ProductId,\n PhysicalAvailable: product.PhysicalAvailableQuantity,\n PhysicalAvailableInventoryLevelCode: product.PhysicalAvailableInventoryLevelCode,\n PhysicalAvailableInventoryLevelLabel: product.PhysicalAvailableInventoryLevelLabel,\n TotalAvailable: product.TotalAvailableQuantity,\n TotalAvailableInventoryLevelCode: product.TotalAvailableInventoryLevelCode,\n TotalAvailableInventoryLevelLabel: product.TotalAvailableInventoryLevelLabel\n };\n });\n return mapProductInventoryInformation(context, productInventoryMapping);\n }\n\n return mapProductInventoryInformation(context, productWarehouseInventoryInformation.ProductWarehouseInventoryAvailabilities);\n}\n\n/**\n * The function created a InventoryAvailabilitySearchCriteria object for getEstimatedAvailability API.\n * @param context - The action context.\n * @param productIds - The product id collection.\n * @param isDefaultWareHouse - Flag to define whether inventory is from default warehouse or not.\n * @param isFilterByChannelFulfillmentGroup - Filter by fulfillment group.\n * @param searchArea - The search area.\n * @param defaultDeliveryMode - The delivery mode.\n * @returns InventoryAvailabilitySearchCriteria.\n */\nexport function createInventoryAvailabilitySearchCriteria(\n context: IActionContext,\n productIds: number[],\n isDefaultWareHouse?: boolean,\n isFilterByChannelFulfillmentGroup?: boolean,\n searchArea?: SearchArea,\n defaultDeliveryMode?: DeliveryMode\n): InventoryAvailabilitySearchCriteria {\n const salesUnitType = 2;\n const deliveryMode = defaultDeliveryMode ? defaultDeliveryMode : DeliveryMode.shipping;\n\n const inventoryAvailabilitySearchCriteria: InventoryAvailabilitySearchCriteria = {\n ProductIds: productIds,\n QuantityUnitTypeValue: salesUnitType,\n SearchArea: searchArea\n };\n\n if (isAggregatedInventory(context)) {\n inventoryAvailabilitySearchCriteria.FilterByChannelFulfillmentGroup = true;\n inventoryAvailabilitySearchCriteria.DeliveryModeTypeFilterValue = deliveryMode;\n } else {\n inventoryAvailabilitySearchCriteria.DefaultWarehouseOnly = isDefaultWareHouse;\n inventoryAvailabilitySearchCriteria.FilterByChannelFulfillmentGroup = isFilterByChannelFulfillmentGroup;\n }\n\n return inventoryAvailabilitySearchCriteria;\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport {\n CacheType,\n createObservableDataAction,\n IAction,\n IActionContext,\n IActionInput,\n IAny,\n ICreateActionContext,\n IGeneric\n} from '@msdyn365-commerce/core';\nimport {\n ChannelDeliveryOption,\n FeatureState,\n OrgUnitAvailability,\n OrgUnitLocation,\n SearchArea,\n StoreHours\n} from '@msdyn365-commerce/retail-proxy';\nimport {\n getChannelDeliveryOptionsAsync,\n getOrgUnitLocationsByAreaAsync,\n getStoreHoursAsync\n} from '@msdyn365-commerce/retail-proxy/dist/DataActions/OrgUnitsDataActions.g';\n\nimport { FeatureStateInput, getFeatureStateActionDataAction } from './get-feature-state';\nimport { IFullOrgUnitAvailability } from './utilities/full-org-unit-availability';\nimport { QueryResultSettingsProxy } from './utilities/QueryResultSettingsProxy';\n\n/**\n * Get selected variant action input class.\n */\nexport class GetOrgUnitLocationsByAreaInput implements IActionInput {\n public Latitude?: number;\n\n public Longitude?: number;\n\n public Radius?: number;\n\n public DistanceUnitValue?: number;\n\n public IgnoreLocation?: boolean;\n\n constructor(_Latitude?: number, _Longitude?: number, _Radius?: number, _DistanceUnitValue?: number, _IgnoreLocation?: boolean) {\n this.Latitude = _Latitude;\n this.Longitude = _Longitude;\n this.Radius = _Radius;\n this.DistanceUnitValue = _DistanceUnitValue;\n this.IgnoreLocation = _IgnoreLocation;\n }\n\n public getCacheKey = () => 'GetOrgUnitLocationsByAreaInput';\n\n public getCacheObjectType = () => 'GetOrgUnitLocationsByAreaInput';\n\n public dataCacheType = (): CacheType => 'none';\n}\n\n/**\n * CreateInput method for the getSelectedVariant data action.\n * @param inputData The input data passed to the createInput method.\n */\nexport const createGetOrgUnitLocationsByAreaInput = (inputData: ICreateActionContext>): GetOrgUnitLocationsByAreaInput => {\n return new GetOrgUnitLocationsByAreaInput();\n};\n\n/**\n * Calls the Retail Feature State API and returns a list of feature with isEnabled flag.\n * @param context\n */\nexport async function getFeatureState(context: IActionContext): Promise {\n return getFeatureStateActionDataAction(new FeatureStateInput(), context);\n}\n\n/**\n * Action method for the getSelectedVariant data action.\n * @param input The action input class.\n * @param ctx The action context.\n */\nexport async function getOrgUnitLocationsByArea(\n input: GetOrgUnitLocationsByAreaInput,\n ctx: IActionContext\n): Promise {\n if ((input.Radius === undefined || !input.Latitude || !input.Longitude) && !input.IgnoreLocation) {\n // No valid location we want to return empty array so module can show no locations message\n return [];\n }\n\n const searchArea: SearchArea = {\n Latitude: input.Latitude,\n Longitude: input.Longitude,\n Radius: input.Radius,\n DistanceUnitValue: input.DistanceUnitValue || 0 // 0 is miles\n };\n\n const featureState = await getFeatureState(ctx);\n const retailMulitplePickupMFeatureState = featureState?.find(\n item => item.Name === 'Dynamics.AX.Application.RetailMultiplePickupDeliveryModeFeature'\n )?.IsEnabled;\n\n return getOrgUnitLocationsByAreaAsync(\n {\n callerContext: ctx,\n queryResultSettings: QueryResultSettingsProxy.getPagingFromInputDataOrDefaultValue(ctx)\n },\n searchArea\n )\n .then(async (stores: OrgUnitLocation[]) => {\n let locationDeliveryOptions: ChannelDeliveryOption[] | undefined = [];\n\n // If mulitple pickup mode is enable then call getchanneldeliveryoption\n if (retailMulitplePickupMFeatureState) {\n const orgUnitChannel = stores.map(store => store.ChannelId);\n locationDeliveryOptions = await _getLocationPickUpDeliveryModes(orgUnitChannel, ctx);\n }\n const locationPromiseList = stores.map(store => {\n const locationDeliveryOption = locationDeliveryOptions?.find(\n _channeldeliveryoption => _channeldeliveryoption.ChannelId === store.ChannelId\n );\n return _getLocationWithHours(store, locationDeliveryOption, ctx);\n });\n return Promise.all(locationPromiseList);\n })\n .catch((error: Error) => {\n ctx.trace('[GetOrgUnitLocationsByArea] error getting Locations');\n ctx.trace(error.message);\n ctx.telemetry.error(error.message);\n ctx.telemetry.debug('[GetOrgUnitLocationsByArea] error getting Locations');\n return [];\n });\n}\n\n/**\n * Action method that obtains the store information.\n * @param orgUnitLocation The org unit location.\n * @param storeMap A map that contains store information group by the inventory location id.\n * @param channelDeleiveryOptions\n * @param ctx The action context.\n */\nasync function _getLocationWithHours(\n orgUnitLocation: OrgUnitLocation,\n channelDeleiveryOptions: ChannelDeliveryOption | undefined,\n ctx: IActionContext\n): Promise {\n if (!orgUnitLocation || !orgUnitLocation.OrgUnitNumber) {\n return { OrgUnitAvailability: undefined };\n }\n\n return getStoreHoursAsync({ callerContext: ctx }, orgUnitLocation.OrgUnitNumber)\n .then((hours: StoreHours) => {\n const availability: OrgUnitAvailability = {\n OrgUnitLocation: orgUnitLocation\n };\n\n if (hours && !(hours instanceof Error)) {\n return { OrgUnitAvailability: availability, StoreHours: hours, OrgUnitPickUpDeliveryModes: channelDeleiveryOptions };\n }\n\n return { OrgUnitAvailability: availability, OrgUnitPickUpDeliveryModes: channelDeleiveryOptions };\n })\n .catch((error: Error) => {\n ctx.trace('[GetFullAvailableInventoryNearby] error getting availability with hours');\n ctx.trace(error.message);\n ctx.telemetry.exception(error);\n ctx.telemetry.debug('[GetFullAvailableInventoryNearby] error getting availability with hours');\n return { OrgUnitAvailability: {} };\n });\n}\n\n/**\n * Action method that obtains the store information.\n * @param channelCollection The org unit channel Id list.\n * @param ctx The action context.\n */\nasync function _getLocationPickUpDeliveryModes(\n channelCollection: (number | undefined)[],\n ctx: IActionContext\n): Promise {\n if (channelCollection?.length === 0 || channelCollection === undefined) {\n return undefined;\n }\n\n const channelIdList: number[] = [];\n channelCollection?.forEach(id => {\n if (id !== undefined) {\n channelIdList.push(id);\n }\n });\n\n // To get all channel pickup delivery mode filterOption should be 4\n return getChannelDeliveryOptionsAsync(\n {\n callerContext: ctx,\n queryResultSettings: QueryResultSettingsProxy.getPagingFromInputDataOrDefaultValue(ctx)\n },\n channelIdList,\n 4\n )\n .then((channelDeliveryOptions: ChannelDeliveryOption[]) => {\n if (channelDeliveryOptions && !(channelDeliveryOptions instanceof Error)) {\n return channelDeliveryOptions;\n }\n\n return undefined;\n })\n .catch((error: Error) => {\n ctx.trace(\n '[GetFullAvailableInventoryNearby][getChannelDeliveryOptionsAsync] error getting availability with channel delivery options'\n );\n ctx.trace(error.message);\n ctx.telemetry.exception(error);\n ctx.telemetry.debug(\n '[GetFullAvailableInventoryNearby] [getChannelDeliveryOptionsAsync] error getting availability with channel delivery options'\n );\n return [];\n });\n}\n\n/**\n * The complete getOrgUnitLocationsByArea data action.\n */\nexport const getOrgUnitLocationsByAreaDataAction = createObservableDataAction({\n id: '@msdyn365-commerce-modules/retail-actions/get-store-location-information',\n action: >getOrgUnitLocationsByArea,\n input: createGetOrgUnitLocationsByAreaInput\n});\n\nexport default getOrgUnitLocationsByAreaDataAction;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { FullProduct } from '@msdyn365-commerce/commerce-entities';\nimport {\n CacheType,\n createObservableDataAction,\n IAction,\n IActionContext,\n IActionInput,\n IAny,\n ICommerceApiSettings,\n ICreateActionContext,\n IGeneric\n} from '@msdyn365-commerce/core';\nimport { getCatalogId, IRequestContext, versionLt } from '@msdyn365-commerce/core-internal';\nimport { ProjectionDomain } from '@msdyn365-commerce/retail-proxy';\nimport { getActivePricesAsync, getProductRatingsAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/ProductsDataActions.g';\n\nimport getSimpleProducts, { ProductInput } from './get-simple-products';\nimport { ArrayExtensions, QueryResultSettingsProxy } from './utilities';\nimport { generateCacheKey, getProductDetailsCriteriaFromActionInput } from './utilities/utils';\n\n/**\n * Full Product Input.\n */\nexport class FullProductInput implements IActionInput {\n public productId: number;\n\n public channelId: number;\n\n public readonly catalogId?: number;\n\n public ProductDetailsCriteria: ProductDetailsCriteria;\n\n private readonly apiSettings: ICommerceApiSettings;\n\n public constructor(\n productId: number | string,\n apiSettings: ICommerceApiSettings,\n criteria: ProductDetailsCriteria,\n requestContext?: IRequestContext,\n catalogId?: number\n ) {\n this.productId = typeof productId === 'string' ? Number.parseInt(productId, 10) : productId;\n this.ProductDetailsCriteria = criteria;\n this.apiSettings = apiSettings;\n this.channelId = apiSettings.channelId;\n this.catalogId = catalogId;\n\n if (this.catalogId === undefined && requestContext) {\n this.catalogId = getCatalogId(requestContext);\n }\n }\n\n public getCacheKey = () => {\n return generateCacheKey(\n this.apiSettings,\n { key: 'ProductId', value: this.productId },\n { key: 'CatalogId', value: this.catalogId },\n { key: 'ShouldGetPrice', value: this.ProductDetailsCriteria.getPrice },\n { key: 'ShouldGetRating', value: this.ProductDetailsCriteria.getRating }\n );\n };\n\n public getCacheObjectType = () => 'FullProduct';\n\n public dataCacheType = (): CacheType => 'application';\n}\n\n/**\n * Class to define criteria to get full product like price, ratings etc.\n */\nexport class ProductDetailsCriteria {\n public getPrice: boolean;\n\n public getRating: boolean;\n\n constructor(getPrice?: boolean, getRating?: boolean) {\n this.getPrice = getPrice || false;\n this.getRating = getRating || false;\n }\n}\n\n/**\n * Creates the input required to make the retail api call.\n * @param inputData\n */\nexport const createInput = (inputData: ICreateActionContext>): IActionInput[] => {\n let productIds = inputData.config && inputData.config.productIds;\n const productDetailsCriteria = getProductDetailsCriteriaFromActionInput(inputData);\n if (typeof productIds === 'string') {\n productIds = productIds.split(',');\n }\n if (Array.isArray(productIds) && productIds.length > 0) {\n return productIds.map((productId: string) => {\n return new FullProductInput(+productId, inputData.requestContext.apiSettings, productDetailsCriteria, inputData.requestContext);\n });\n }\n return [];\n};\n\n/**\n * Calls the Retail API and returns the product based on the passed ProductInput.\n * @param inputs\n * @param ctx\n */\nexport async function getFullProductsAction(inputs: FullProductInput[], ctx: IActionContext): Promise {\n if (!Array.isArray(inputs) || inputs.length === 0) {\n ctx.trace('[getFullProductsAction] Invalid or empty inputs passed.');\n return {};\n }\n\n const { apiSettings } = ctx.requestContext;\n const productInputs = inputs.map(\n (input: FullProductInput): ProductInput => {\n return new ProductInput(input.productId, apiSettings, undefined, undefined, ctx.requestContext);\n }\n );\n\n return getSimpleProducts(productInputs, ctx)\n .then(result => {\n return result.map(product => {\n return { ProductDetails: product };\n });\n })\n .then((productCollection: FullProduct[]) => {\n const validProductIds = new Set(productCollection.map(input => input.ProductDetails && input.ProductDetails.RecordId));\n\n const ratingsAndPricePromises = [\n _getActivePrices(inputs, validProductIds, productCollection, ctx),\n _getProductRatings(inputs, validProductIds, productCollection, ctx)\n ];\n return Promise.all(ratingsAndPricePromises).then(() => {\n return productCollection;\n });\n })\n .catch(error => {\n ctx.telemetry.exception(error);\n ctx.telemetry.debug('Unable to get Simple products');\n return [];\n });\n}\n\nasync function _getActivePrices(\n inputs: FullProductInput[],\n validProductIds: Set,\n productCollection: FullProduct[],\n ctx: IActionContext\n): Promise {\n let catalogId = 0;\n if (ArrayExtensions.hasElements(inputs)) {\n catalogId = inputs[0].catalogId ?? 0;\n }\n\n const projectDomain: ProjectionDomain = { ChannelId: +ctx.requestContext.apiSettings.channelId, CatalogId: catalogId };\n const validInputs = inputs\n .filter(input => input.ProductDetailsCriteria.getPrice && validProductIds.has(input.productId))\n .map(input => input.productId)\n .filter(Boolean);\n\n if (validInputs.length === 0) {\n return Promise.resolve();\n }\n\n return getActivePricesAsync(\n { callerContext: ctx, queryResultSettings: QueryResultSettingsProxy.getPagingFromInputDataOrDefaultValue(ctx) },\n projectDomain,\n validInputs,\n new Date(),\n null,\n undefined,\n true\n )\n .then(result => {\n result.forEach(productPrice => {\n const fullProduct: FullProduct | undefined = productCollection.find(x => {\n return x.ProductDetails && x.ProductDetails.RecordId === productPrice.ProductId;\n });\n if (fullProduct) {\n // If RS Version < 9.16.0 (aka 10.0.6), customer contextual price won't be\n // included so instead just use AdjustedPrice\n if (versionLt(ctx.requestContext.apiSettings.retailServerProxyVersion, '9.16.0')) {\n productPrice.CustomerContextualPrice = productPrice.AdjustedPrice;\n }\n fullProduct.ProductPrice = productPrice;\n }\n });\n })\n .catch((error: Error) => {\n const telemetry = ctx.telemetry;\n telemetry.debug('[getActivePricesAsync] Unable to get active price.');\n telemetry.exception(error);\n });\n}\n\nasync function _getProductRatings(\n inputs: FullProductInput[],\n validProductIds: Set,\n productCollection: FullProduct[],\n ctx: IActionContext\n): Promise {\n const validInputs = inputs\n .filter(input => input.ProductDetailsCriteria.getRating && validProductIds.has(input.productId))\n .map(input => input.productId)\n .filter(Boolean);\n\n if (validInputs.length === 0) {\n return Promise.resolve();\n }\n\n return getProductRatingsAsync(\n {\n callerContext: ctx,\n queryResultSettings: QueryResultSettingsProxy.getPagingFromInputDataOrDefaultValue(ctx)\n },\n validInputs\n )\n .then(result => {\n result.forEach(productRating => {\n const fullProduct: FullProduct | undefined = productCollection.find(x => {\n return x.ProductDetails && x.ProductDetails.RecordId === productRating.ProductId;\n });\n if (fullProduct) {\n fullProduct.ProductRating = productRating;\n }\n });\n })\n .catch(error => {\n const telemetry = ctx.telemetry;\n telemetry.debug('[getProductRatingsAsync] Unable to get product ratings.');\n telemetry.exception(error);\n });\n}\n\nexport const getFullProductsActionDataAction = createObservableDataAction({\n id: '@msdyn365-commerce-modules/retail-actions/get-full-products',\n action: >getFullProductsAction,\n input: createInput,\n isBatched: true\n});\n\nexport default getFullProductsActionDataAction;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\n/**\n * Namespace which extends Object functionality.\n */\n/* eslint-disable @typescript-eslint/no-explicit-any */\nexport namespace ObjectExtensions {\n /**\n * @description Verifies whether the value is null or undefined.\n * @param {any} value The value to examine.\n * @returns {boolean} True if the value is null or undefined, false otherwise.\n */\n export function isNullOrUndefined(value: any): value is null | undefined {\n return value === null || value === undefined;\n }\n\n /**\n * @description Verifies whether the value is of type string.\n * @param {any} value The value to examine.\n * @returns {boolean} True if the value is a string, false otherwise.\n */\n export function isString(value: any): value is string {\n return typeof value === 'string';\n }\n\n /**\n * @description Verifies whether the value is of type number.\n * @param {any} value The value to examine.\n * @returns {boolean} True if the value is a number, false otherwise.\n */\n export function isNumber(value: any): value is number {\n return typeof value === 'number';\n }\n\n /**\n * Verifies whether the object is a function.\n * @param {any} object The object.\n * @param value\n * @returns {boolean} True if the object is a function, false otherwise.\n */\n export function isFunction(value: any): boolean {\n return typeof value === 'function';\n }\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nexport * from './base-promise-queue';\nexport * from './finite-promise-queue';\nexport * from './promise-queue';\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { ObjectExtensions } from './object-extensions';\n\n/**\n * Represents an array which is defined with at least one value.\n */\nexport type NonEmptyArray = [T, ...T[]];\n\n/**\n * Namespace which extends Array functionality.\n */\nexport namespace ArrayExtensions {\n /**\n * Verifies whether the object array has elements.\n * @param value - The array to examine.\n * @returns True if the object has at least one element in the array, false otherwise (if array is not defined or empty).\n */\n export function hasElements(value: NonEmptyArray | T[] | null | undefined): value is NonEmptyArray {\n const emptyArrayLength = 0;\n return !ObjectExtensions.isNullOrUndefined(value) && value.length > emptyArrayLength;\n }\n\n /**\n * Retrieves the first element in the array or default value if the array is empty.\n * @param values - The array with values.\n * @param defaultValue - Optional parameter to specify default value. If not specified, undefined will be used.\n * @returns First element or default value.\n */\n export function firstOrDefault(values: NonEmptyArray | T[] | null | undefined, defaultValue?: T): T | undefined {\n if (hasElements(values)) {\n return values[0];\n }\n return defaultValue;\n }\n\n /**\n * Remove duplicate elements in the array.\n * @param value - The array to examine.\n * @returns An array with only unique elements.\n */\n export function unique(value: T[]): T[] {\n if (!hasElements(value)) {\n return [];\n }\n\n return Array.from(new Set(value));\n }\n\n /**\n * Checks if all elements satisfy given condition.\n * @param value - The array to examine.\n * @param predicate - The function which checks an element.\n * @returns True if the array is empty or all the inner elements satisfy given condition,\n * false if at least one element does not pass the condition.\n */\n export function all(value: T[] | null | undefined, predicate: (value: T, index: number, array: T[]) => boolean): boolean {\n if (!hasElements(value)) {\n return true;\n }\n\n return value.filter(predicate).length === value.length;\n }\n\n /**\n * Filters out null and undefined values from the given array.\n * @param value - The array with possibly undefined/null items.\n * @returns All items which are not null or undefined.\n */\n export function validValues(value: (T | undefined | null)[] | undefined | null): T[] {\n if (!hasElements(value)) {\n return [];\n }\n\n return value.filter(item => !ObjectExtensions.isNullOrUndefined(item)) as T[];\n }\n\n /**\n * Merges items from 2-dimensional array into one array with all items.\n * @param value - The 2-dimensional array with the items.\n * @returns All items retrieved from all inner arrays.\n */\n export function flatten(value: ((T | undefined | null)[] | undefined | null)[]): T[] {\n let result: T[] = [];\n\n if (!hasElements(value)) {\n return result;\n }\n\n for (const arrayLine of value) {\n if (!ObjectExtensions.isNullOrUndefined(arrayLine)) {\n result = result.concat(validValues(arrayLine));\n }\n }\n\n return result;\n }\n\n /**\n * Check if two arrays are equal.\n * @param firstArray - The array with the items.\n * @param secondArray - Another array with the items.\n * @param comparator - The comparator which compares the values and returns true if two objects are equal, false otherwise.\n * @returns True if arrays have the same items, false otherwise.\n */\n export function equals(\n firstArray: T[],\n secondArray: T[],\n comparator?: (valueFromFirstArray: T, valueFromSecondArray: T) => boolean\n ): boolean {\n if (firstArray.length !== secondArray.length) {\n return false;\n }\n\n if (comparator === undefined) {\n return JSON.stringify(firstArray) === JSON.stringify(secondArray);\n }\n\n for (let index = 0; index < firstArray.length; ++index) {\n if (!comparator(firstArray[index], secondArray[index])) {\n return false;\n }\n }\n\n return true;\n }\n\n /**\n * Check if two arrays have the same elements irrespective of the order.\n * @param firstArray - The array with the items.\n * @param secondArray - Another array with the items.\n * @param comparator - The comparator which compares the values and returns true if two objects are equal, false otherwise.\n * @returns True if arrays have the same items, false otherwise.\n */\n export function haveSameItems(\n firstArray: T[],\n secondArray: T[],\n comparator: (valueFromFirstArray: T, valueFromSecondArray: T) => boolean = (valueFromFirstArray: T, valueFromSecondArray: T) =>\n valueFromFirstArray === valueFromSecondArray\n ): boolean {\n if (firstArray.length !== secondArray.length) {\n return false;\n }\n\n for (const item of firstArray) {\n if (!secondArray.some(otherItem => comparator(item, otherItem))) {\n return false;\n }\n }\n\n return true;\n }\n\n /**\n * Calculates a sum of elements in the given array.\n * @param data - List of items.\n * @returns Sum of elements.\n */\n export function calculateSum(data: NonEmptyArray): number {\n let result = data[0];\n for (let index = 1; index < data.length; ++index) {\n result += data[index];\n }\n\n return result;\n }\n\n /**\n * Reverses the elements in the array without modifying the original one.\n * @param array - The array with the items.\n * @returns A new array with reversed order.\n */\n export function reverse(array: T[]): T[] {\n const newArray: T[] = [];\n\n for (let index = array.length - 1; index >= 0; --index) {\n newArray.push(array[index]);\n }\n\n return newArray;\n }\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport {\n CacheType,\n createObservableDataAction,\n IAction,\n IActionContext,\n IActionInput,\n ICreateActionContext\n} from '@msdyn365-commerce/core';\nimport { getCurrentAsync, getUsersAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/BusinessPartnersDataActions.g';\n\n/**\n * Input class for get customer data action.\n */\nexport class OrganizationUsersCountInput implements IActionInput {\n public getCacheKey = () => 'OrganizationUsersCount';\n\n public getCacheObjectType = () => 'BusinessPartner';\n\n public dataCacheType = (): CacheType => 'none';\n}\n\nexport const createGetOrganizationUsersCountInput = (inputData: ICreateActionContext): IActionInput => {\n const { requestContext } = inputData;\n\n // Check if the user is authenticated.\n if (!requestContext.user.isAuthenticated) {\n throw new Error('User is not logged in.');\n }\n\n return new OrganizationUsersCountInput();\n};\n\nexport async function getOrganizationUsersCount(input: OrganizationUsersCountInput, ctx: IActionContext): Promise {\n return getCurrentAsync({ callerContext: ctx })\n .then(businessPartner => {\n if (!businessPartner) {\n return 0;\n }\n\n return getUsersAsync({ callerContext: ctx }, businessPartner.BusinessPartnerId)\n .then(users => {\n return users.length;\n })\n .catch(error => {\n ctx.telemetry.exception(error);\n ctx.trace('[get-organization-users-count] Unable to load users');\n throw new Error('[get-organization-users-count] Unable to load users');\n });\n })\n .catch(error => {\n ctx.telemetry.exception(error);\n ctx.telemetry.debug('[get-organization-users-count] Unable to get BusinessPartner');\n throw new Error('[get-organization-users-count] Unable to get BusinessPartner');\n });\n}\nexport default createObservableDataAction({\n id: 'get-organization-users-count',\n action: >(getOrganizationUsersCount),\n input: createGetOrganizationUsersCountInput\n});\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { FullProduct } from '@msdyn365-commerce/commerce-entities';\nimport {\n CacheType,\n createObservableDataAction,\n IAction,\n IActionContext,\n IActionInput,\n ICreateActionContext\n} from '@msdyn365-commerce/core';\nimport { convertToString, IQueryResultSettings } from '@msdyn365-commerce/retail-proxy';\nimport { getProductListLinesAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/ProductListsDataActions.g';\n\nimport { FullProductInput, getFullProducts, ProductDetailsCriteria, QueryResultSettingsProxy } from '..';\nimport { ArrayExtensions } from '../utilities';\nimport { IOrderTemplateLinesState, OrderTemplateLine } from '../utilities/order-templates';\n\n/**\n * Input class for the GetOrderTemplates data action.\n */\nexport class GetPaginatedOrderTemplateLinesInput implements IActionInput {\n public orderTemplateId: string;\n public queryResultSettings: IQueryResultSettings;\n public searchText: string;\n public getPrice: boolean = true;\n public getRating: boolean = true;\n\n constructor(\n orderTemplateId: string,\n queryResultSettings: IQueryResultSettings,\n searchText?: string,\n getPrice: boolean = true,\n getRating: boolean = true\n ) {\n this.orderTemplateId = orderTemplateId;\n this.queryResultSettings = queryResultSettings;\n this.searchText = searchText || '';\n this.getPrice = getPrice;\n this.getRating = getRating;\n }\n\n public getCacheKey = () =>\n `GetPaginatedOrderTemplateLines|${this.orderTemplateId}|${convertToString(this.queryResultSettings)}|${\n this.searchText\n }|${convertToString(this.getPrice)}|${convertToString(this.getRating)}`;\n\n public getCacheObjectType = () => 'GetPaginatedOrderTemplateLines';\n\n public dataCacheType = (): CacheType => 'none';\n}\n\n/**\n * CreateInput method for the GetOrderTemplate method.\n * @param inputData The input data passed to the createInput method.\n * @param orderTemplateId\n * @param searchText\n */\nexport const createGetPaginatedOrderTemplateLinesInput = (\n inputData: ICreateActionContext,\n orderTemplateId: string,\n searchText?: string\n): GetPaginatedOrderTemplateLinesInput => {\n const queryResultSettings: IQueryResultSettings = QueryResultSettingsProxy.fromInputData(inputData).QueryResultSettings;\n queryResultSettings.count = true;\n return new GetPaginatedOrderTemplateLinesInput(orderTemplateId, queryResultSettings, searchText);\n};\n\nexport const getProductDetailsCriteriaFromActionInput = (inputData: GetPaginatedOrderTemplateLinesInput): ProductDetailsCriteria => {\n return {\n getPrice: inputData.getPrice ?? true,\n getRating: inputData.getRating ?? true\n };\n};\n\n/**\n * The action method for the GetPaginatedOrderTemplateLines data action.\n * @param input The action input.\n * @param context The action context.\n */\nexport async function getPaginatedOrderTemplateLinesAction(\n input: GetPaginatedOrderTemplateLinesInput,\n context: IActionContext\n): Promise {\n if (!context.requestContext.user.isAuthenticated) {\n throw new Error('Unable to get full order templates. User is not authenticated.');\n }\n\n const orderTemplateLinesState: IOrderTemplateLinesState = {\n lines: [],\n totalCount: 0\n };\n const promise = getProductListLinesAsync(\n {\n callerContext: context,\n queryResultSettings: input.queryResultSettings,\n bypassCache: 'get'\n },\n input.orderTemplateId,\n input.searchText\n );\n const productListLines = await promise;\n const productInputs: FullProductInput[] = [];\n if (ArrayExtensions.hasElements(productListLines)) {\n orderTemplateLinesState.totalCount = promise.metadata.count || productListLines.length;\n productListLines.forEach(listLine => {\n if (listLine.ProductId) {\n orderTemplateLinesState.lines.push(new OrderTemplateLine(listLine));\n productInputs.push(\n new FullProductInput(\n listLine.ProductId,\n context.requestContext.apiSettings,\n getProductDetailsCriteriaFromActionInput(input),\n context.requestContext\n )\n );\n }\n });\n if (ArrayExtensions.hasElements(productInputs)) {\n const fullProductsInfo = await getFullProducts(productInputs, context)\n .then((products: FullProduct[]) => {\n if (products) {\n return products;\n }\n return [];\n })\n .catch(error => {\n context.trace(error);\n context.telemetry.error(error.message);\n context.telemetry.error('[getPaginatedOrderTemplateLinesAction] Unable to retrieve product info.');\n });\n if (fullProductsInfo) {\n orderTemplateLinesState.lines.forEach(line => {\n const fullProduct = fullProductsInfo.find(\n product => product.ProductDetails.RecordId === line.productListLine.ProductId\n );\n if (!fullProduct) {\n context.telemetry.error(\n '[getPaginatedOrderTemplateLinesAction] Unable to find product info for an order template line.'\n );\n return;\n }\n line.fullProduct = fullProduct;\n });\n }\n return orderTemplateLinesState;\n }\n context.trace(orderTemplateLinesState.lines.length.toString());\n return orderTemplateLinesState;\n }\n return orderTemplateLinesState;\n}\n\n/**\n * The GetPaginatedOrderTemplateLines Data Action\n * Returns order templates.\n */\nexport const getPaginatedOrderTemplateLinesActionDataAction = createObservableDataAction({\n id: '@msdyn365-commerce-modules/retail-actions/order-templates/get-paginated-order-template-lines',\n action: getPaginatedOrderTemplateLinesAction as IAction,\n input: createGetPaginatedOrderTemplateLinesInput\n});\n\nexport default getPaginatedOrderTemplateLinesActionDataAction;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport {\n CacheType,\n createObservableDataAction,\n IAction,\n IActionContext,\n IActionInput,\n ICreateActionContext\n} from '@msdyn365-commerce/core';\n\nimport getProductList, { GetProductListInput } from './get-product-list';\nimport getProductListLines, { GetProductListLinesInput } from './get-product-list-lines';\nimport { QuickOrderTemplate } from './utilities/quick-order-templates';\n\n/**\n * Input class for the GetProductList data action.\n */\nexport class GetFullProductListInput implements IActionInput {\n public productListId: string | undefined;\n\n public constructor(productListId?: string) {\n this.productListId = productListId;\n }\n\n /**\n * Get Cache Key.\n * @returns - Cache key string.\n */\n public getCacheKey = (): string => 'GetFullProductList';\n\n /**\n * Get Cachetype Name.\n * @returns - Cache name string.\n */\n public getCacheObjectType = (): string => 'GetFullProductList';\n\n /**\n * Get Cachetype.\n * @returns - CacheType enum.\n */\n public dataCacheType = (): CacheType => 'none';\n}\n\n/**\n * CreateInput method for the GetProductList method.\n * @param inputData - The input data passed to the createInput method.\n * @param productListId - ProductListId.\n * @returns - Input for data action.\n */\nexport const createGetFullProductListInput = (inputData: ICreateActionContext, productListId?: string): GetFullProductListInput => {\n const { requestContext } = inputData;\n if (!requestContext.user.isAuthenticated) {\n throw new Error('Unable to get full product list. User is not authenticated.');\n }\n\n return new GetFullProductListInput(productListId);\n};\n\n/**\n * The action method for the GetFullProductList data action.\n * @param input - The action input.\n * @param context - The action context.\n * @returns - Quick Order Template object.\n */\nexport async function getFullProductListAction(input: GetFullProductListInput, context: IActionContext): Promise {\n if (!context.requestContext.user.isAuthenticated) {\n throw new Error('Unable to get full quick order template. User is not authenticated.');\n }\n\n const inputParameters = new GetProductListInput(input.productListId);\n const quickorderTemplate = await getProductList(inputParameters, context).then(productLists => {\n const inputLines = new GetProductListLinesInput(productLists[0].Id);\n return getProductListLines(inputLines, context).then(linesState => {\n return new QuickOrderTemplate(productLists[0], linesState.lines, linesState.totalCount);\n });\n });\n return quickorderTemplate;\n}\n\n/**\n * The GetFullProductList Data Action\n * Returns order templates.\n */\nexport const getFullProductListActionDataAction = createObservableDataAction({\n id: '@msdyn365-commerce-modules/retail-actions/get-full-product-list',\n action: getFullProductListAction as IAction,\n input: createGetFullProductListInput\n});\n\nexport default getFullProductListActionDataAction;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { CacheType, IActionContext, IActionInput } from '@msdyn365-commerce/core';\n\n/**\n * Generic input type for use with generic data actions.\n */\nexport class GenericInput implements IActionInput {\n public result: T;\n\n public cacheKey: string;\n\n public cacheObjectType: string;\n\n constructor(cacheKey: string, result: T, cacheObjectType: string) {\n this.cacheKey = cacheKey;\n this.cacheObjectType = cacheObjectType;\n this.result = result;\n }\n\n public getCacheKey = () => `Generic-${this.cacheKey}`;\n\n public getCacheObjectType = () => `${this.cacheObjectType}`;\n\n public dataCacheType = (): CacheType => 'none';\n}\n\n/**\n * Generic data action that is just used for passing data around the app.\n *\n * Note that this doesn't actually expose a data action, its just a base action\n * that others can use to create a data action with their own input.\n * @param input\n * @param ctx\n */\nexport async function getGenericAction(input: GenericInput, ctx: IActionContext): Promise {\n return input.result;\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport {\n CacheType,\n createObservableDataAction,\n IAction,\n IActionContext,\n IActionInput,\n ICreateActionContext\n} from '@msdyn365-commerce/core';\nimport { InvoiceDetailsSearchCriteria, SalesInvoice, SalesOrdersDataActions } from '@msdyn365-commerce/retail-proxy';\n\n/**\n * Input class for get invoice details data action.\n */\nexport class GetInvoiceDetailsInput implements IActionInput {\n public invoiceId: string;\n\n constructor(invoiceId: string) {\n this.invoiceId = invoiceId;\n }\n\n public getCacheKey = () => `GetInvoiceDetails|${this.invoiceId}`;\n\n public getCacheObjectType = () => 'SalesInvoice';\n\n public dataCacheType = (): CacheType => 'request';\n}\n\nexport const CreateGetInvoiceDetailsInput = (inputData: ICreateActionContext): IActionInput => {\n const { requestContext } = inputData;\n\n // Check if the user is authenticated.\n if (!requestContext.user.isAuthenticated) {\n throw new Error('Unable to get invoice details as User is not logged in.');\n }\n if (!inputData?.requestContext?.query?.invoiceId) {\n throw new Error('Unable to get invoice details as no valid invoice id found.');\n }\n\n return new GetInvoiceDetailsInput(inputData.requestContext.query.invoiceId);\n};\n\nexport async function getInvoiceDetails(input: GetInvoiceDetailsInput, context: IActionContext): Promise {\n if (!context?.requestContext?.user?.isAuthenticated) {\n throw new Error('Unable to get details for the invoice. User is not authenticated.');\n }\n\n if (!input.invoiceId) {\n throw new Error('Unable to get invoice details as no valid invoice id found.');\n }\n\n const invoiceId = input.invoiceId;\n\n const searchCriteria: InvoiceDetailsSearchCriteria = {\n InvoiceId: invoiceId\n };\n\n return SalesOrdersDataActions.getInvoiceDetailsAsync({ callerContext: context }, searchCriteria);\n}\n\nexport const getInvoiceDetailsDataAction = createObservableDataAction({\n id: 'get-invoice-details',\n action: >getInvoiceDetails,\n input: CreateGetInvoiceDetailsInput\n});\n\nexport default getInvoiceDetailsDataAction;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { createObservableDataAction, IAction, IActionInput, IAny, ICreateActionContext, IGeneric } from '@msdyn365-commerce/core';\nimport { LoyaltyCard, retailAction } from '@msdyn365-commerce/retail-proxy';\nimport { createGetCustomerLoyaltyCardsInput } from '@msdyn365-commerce/retail-proxy/dist/DataActions/StoreOperationsDataActions.g';\n\n/**\n * Creates the input required to make the retail api call.\n * @param inputData\n */\nconst createCustomerLoyaltyCardsInput = (inputData: ICreateActionContext>): IActionInput => {\n if (inputData.requestContext && inputData.requestContext.user && inputData.requestContext.user.isAuthenticated) {\n return createGetCustomerLoyaltyCardsInput({}, null);\n }\n\n throw new Error('Unable to create order history input. User is not authenticated.');\n};\n\nexport const retailActionDataAction = createObservableDataAction({\n id: '@msdyn365-commerce-modules/retail-actions/get-customer-loyalty-cards',\n action: >retailAction,\n input: createCustomerLoyaltyCardsInput\n});\n\nexport default retailActionDataAction;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { FullProduct } from '@msdyn365-commerce/commerce-entities';\nimport { ProductListLine } from '@msdyn365-commerce/retail-proxy';\n\n/**\n * QuickOrderTemplateLine state information.\n */\nexport class QuickOrderTemplateLine {\n public productListLine: ProductListLine;\n\n public fullProduct?: FullProduct;\n\n public constructor(productListLine: ProductListLine, fullProduct?: FullProduct) {\n this.productListLine = productListLine;\n this.fullProduct = fullProduct;\n }\n}\n\n/**\n * Quick Order template line state.\n */\nexport interface IQuickOrderTemplateLinesState {\n lines: QuickOrderTemplateLine[];\n totalCount: number;\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport {\n CacheType,\n createObservableDataAction,\n IAction,\n IActionContext,\n IActionInput,\n IAny,\n ICommerceApiSettings,\n ICreateActionContext,\n IGeneric,\n IRequestContext,\n getCustomerAccountNumberForAllChannelType\n} from '@msdyn365-commerce/core';\nimport { CatalogsDataActions, ProductCatalog } from '@msdyn365-commerce/retail-proxy';\n\nimport { generateCacheKey } from './utilities';\n\n/**\n * Input for get-catalogs data action.\n */\nexport class CatalogsInput implements IActionInput {\n public readonly channelId: number;\n\n public readonly customerAccountNumber?: string;\n\n private readonly apiSettings: ICommerceApiSettings;\n\n private readonly locale?: string;\n\n public constructor(context: IRequestContext, customerAccountNumber?: string) {\n this.channelId = context.apiSettings.channelId ? Number(context.apiSettings.channelId) : 0;\n this.customerAccountNumber = customerAccountNumber ? customerAccountNumber : getCustomerAccountNumberForAllChannelType(context);\n\n this.apiSettings = context.apiSettings;\n this.locale = context.locale || '';\n }\n\n /**\n * Get Cache Key.\n * @returns - Cache key string.\n */\n public getCacheKey = (): string =>\n generateCacheKey(\n this.apiSettings,\n { key: 'CustomerAccountNumber', value: this.customerAccountNumber },\n { key: 'Locale', value: this.locale }\n );\n\n /**\n * Get Cache object type.\n * @returns - Cache object type.\n */\n public getCacheObjectType = (): string => 'productCatalogs';\n\n /**\n * Get data cache type.\n * @returns - Cache type enum.\n */\n public dataCacheType = (): CacheType => 'request';\n}\n\n/**\n * Creates the input required to make the retail api call.\n * @param inputData - The input data passed to the createInput method.\n * @param customerAccountNumber - Customer account number.\n * @returns - Catalogs input.\n */\nexport const createCatalogsInput = (inputData: ICreateActionContext>, customerAccountNumber?: string): IActionInput => {\n if (!inputData.requestContext.user.isAuthenticated) {\n throw new Error('Unable to get product catalog. User is not authenticated.');\n }\n return new CatalogsInput(inputData.requestContext, customerAccountNumber);\n};\n\n/**\n * Calls the Retail API and returns the product catalog for an user.\n * @param input - Catalogs Input.\n * @param context - Current context.\n * @returns - Product catalog for the user.\n */\nexport async function getCatalogAction(input: CatalogsInput, context: IActionContext): Promise {\n const productCatalogs = await CatalogsDataActions.getCatalogsAsync(\n { callerContext: context, bypassCache: 'getAndPut' },\n input.channelId,\n true\n );\n return productCatalogs;\n}\n\n/**\n * The GetProductCatalogs Data Action\n * Returns product catalogs.\n */\nexport const getCatalogActionDataAction = createObservableDataAction({\n id: '@msdyn365-commerce-modules/retail-actions/get-catalogs',\n action: getCatalogAction as IAction,\n input: createCatalogsInput\n});\n\nexport default getCatalogActionDataAction;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport {\n CacheType,\n createObservableDataAction,\n IAction,\n IActionContext,\n IActionInput,\n ICreateActionContext\n} from '@msdyn365-commerce/core';\nimport { QueryResultSettings } from '@msdyn365-commerce/retail-proxy';\nimport { searchAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/ProductListsDataActions.g';\nimport { ProductList, ProductListSearchCriteria, ProductListType } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\n\nimport { QueryResultSettingsProxy } from '../utilities/QueryResultSettingsProxy';\n\n/**\n * Input class for the GetOrderTemplates data action.\n */\nexport class GetOrderTemplatesInput implements IActionInput {\n public readonly productListId: string;\n\n public readonly queryResultSettings?: QueryResultSettings;\n\n constructor(productListId?: string, queryResultSettings?: QueryResultSettings) {\n this.productListId = productListId || '';\n this.queryResultSettings = queryResultSettings;\n }\n\n public getCacheKey = (): string =>\n `${this.productListId}|${this.queryResultSettings?.Paging?.Top}|${this.queryResultSettings?.Paging?.Skip}`;\n\n public getCacheObjectType = () => 'ProductList';\n\n public dataCacheType = (): CacheType => 'instance';\n\n public shouldCacheOutput = () => false;\n}\n\n/**\n * CreateInput method for the GetOrderTemplate method.\n * @param inputData The input data passed to the createInput method.\n * @param productListId? The product list identifier.\n * @param queryResultSettings? The query result setting required for pagination/ordering.\n * @param productListId\n * @param queryResultSettings\n */\nexport const createGetOrderTemplatesInput = (\n inputData: ICreateActionContext,\n productListId?: string,\n queryResultSettings?: QueryResultSettings\n): GetOrderTemplatesInput => {\n const { requestContext } = inputData;\n if (!requestContext.user.isAuthenticated) {\n throw new Error('Unable to create get order template. User is not authenticated.');\n }\n\n return new GetOrderTemplatesInput(productListId || '', queryResultSettings);\n};\n\n/**\n * The action method for the GetOrderTemplates data action.\n * @param input The action input.\n * @param ctx The action context.\n */\nexport async function getOrderTemplatesAction(input: GetOrderTemplatesInput, ctx: IActionContext): Promise {\n try {\n const productListSearchCriteria: ProductListSearchCriteria = {\n ProductListId: input.productListId,\n ProductListType: `${ProductListType.OrderTemplate}`\n };\n return await searchAsync(\n {\n callerContext: ctx,\n queryResultSettings: QueryResultSettingsProxy.getPagingFromInputDataOrDefaultValue(ctx)\n },\n productListSearchCriteria\n );\n } catch (error) {\n ctx.telemetry.error('Not able to get order template(s)', error);\n throw error;\n }\n}\n\n/**\n * The GetOrderTemplates Data Action\n * Returns order templates.\n */\nexport default createObservableDataAction({\n id: '@msdyn365-commerce-modules/retail-actions/order-templates/get-order-templates',\n action: >getOrderTemplatesAction,\n input: createGetOrderTemplatesInput\n});\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport {\n CacheType,\n createObservableDataAction,\n IAction,\n IActionContext,\n IActionInput,\n ICommerceApiSettings,\n ICreateActionContext\n} from '@msdyn365-commerce/core';\nimport { LoyaltyCard } from '@msdyn365-commerce/retail-proxy';\nimport {\n getCustomerLoyaltyCardsAsync,\n getLoyaltyCardAsync\n} from '@msdyn365-commerce/retail-proxy/dist/DataActions/StoreOperationsDataActions.g';\n\nimport { buildCacheKey, QueryResultSettingsProxy } from '.';\n\n/**\n * Input class for the getLoyaltyCard data action.\n */\nexport class GetLoyaltyCardInput implements IActionInput {\n public userAccountNumber?: string;\n\n public apiSettings: ICommerceApiSettings;\n\n constructor(apiSettings: ICommerceApiSettings, userAccountNumber?: string) {\n this.userAccountNumber = userAccountNumber;\n this.apiSettings = apiSettings;\n }\n\n public getCacheKey = () => buildCacheKey(`GetLoyaltyCard-${this.userAccountNumber}`, this.apiSettings);\n\n public getCacheObjectType = () => 'GetLoyaltyCard';\n\n public dataCacheType = (): CacheType => 'request';\n}\n\n/**\n * CreateInput method for the getLoyaltyCard method.\n * @param inputData The input data passed to the createInput method.\n */\nexport const createGetLoyaltyCardInput = (inputData: ICreateActionContext): GetLoyaltyCardInput => {\n const { requestContext } = inputData;\n if (!requestContext.user.isAuthenticated) {\n throw new Error('Unable to create get loyalty card input. User is not authenticated.');\n }\n\n return new GetLoyaltyCardInput(inputData.requestContext.apiSettings);\n};\n\n/**\n * The action method for the getLoyaltyCard data action.\n * @param input The action input.\n * @param ctx The action context.\n */\nexport async function getLoyaltyAction(input: GetLoyaltyCardInput, ctx: IActionContext): Promise {\n return getCustomerLoyaltyCardsAsync(\n {\n callerContext: ctx,\n queryResultSettings: QueryResultSettingsProxy.getPagingFromInputDataOrDefaultValue(ctx)\n },\n input.userAccountNumber || null\n )\n .then(cards => {\n if (!cards || cards.length === 0) {\n return {};\n }\n\n const firstCard = cards[0];\n\n return getLoyaltyCardAsync(\n {\n callerContext: ctx,\n queryResultSettings: QueryResultSettingsProxy.getPagingFromInputDataOrDefaultValue(ctx)\n },\n firstCard.CardNumber\n )\n .then(card => {\n card.LoyaltyEnrollmentDate = firstCard.LoyaltyEnrollmentDate;\n card.LoyaltyEnrollmentDateLocal = firstCard.LoyaltyEnrollmentDateLocal;\n return card;\n })\n\n .catch(error => {\n ctx.telemetry.exception(error);\n ctx.telemetry.debug('Unable to get loyalty card');\n throw new Error('Unable to get loyalty card');\n });\n })\n .catch(error => {\n ctx.telemetry.exception(error.message);\n ctx.telemetry.debug('Unable to get customers loyalty card');\n throw new Error('Unable to get customers loyalty card');\n });\n}\n\n/**\n * The getLoyaltyCard data action\n * Returns the loyalty card belonging to the customer.\n */\nexport const getLoyaltyActionDataAction = createObservableDataAction({\n id: '@msdyn365-commerce-modules/retail-actions/get-loyalty-card',\n action: >getLoyaltyAction,\n input: <(args: ICreateActionContext) => IActionInput>createGetLoyaltyCardInput\n});\n\nexport default getLoyaltyActionDataAction;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport {\n CacheType,\n createObservableDataAction,\n IAction,\n IActionContext,\n IActionInput,\n ICreateActionContext\n} from '@msdyn365-commerce/core';\nimport { getCartState } from '@msdyn365-commerce/global-state';\nimport { FeatureState } from '@msdyn365-commerce/retail-proxy';\nimport { Cart, CartLine, SimpleProduct } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\n\nimport { createGetFeatureStateInput, getCustomer, GetCustomerInput, getFeatureState, getSimpleProducts, ProductInput } from '.';\nimport { ArrayExtensions } from './utilities';\n\n/**\n * Input class for activeCartWithProducts data action.\n */\nexport class ActiveCartProductsInput implements IActionInput {\n public getCacheKey = () => 'ActiveCartProducts';\n\n public getCacheObjectType = () => 'ActiveCartProducts';\n\n public dataCacheType = (): CacheType => 'none';\n}\n\nconst createInput = (inputData: ICreateActionContext) => {\n return new ActiveCartProductsInput();\n};\n\n/**\n * Calls the Retail API and returns a cart object based on the passed GetCartInput.\n * @param input\n * @param ctx\n */\nexport async function getActiveCartProductsAction(input: ActiveCartProductsInput, ctx: IActionContext): Promise {\n // If no cart ID is provided in input, we need to create a cart object\n if (!input) {\n throw new Error('[getActiveCartWithProducts]No valid Input was provided, failing');\n }\n\n const cartState = await getCartState(ctx);\n const cart = cartState.cart;\n\n const isQuantityLimitsFeatureIsOn: boolean = await isOrderQuantityLimitsFeatureEnabled(ctx);\n\n if (isQuantityLimitsFeatureIsOn) {\n return getActiveCartProductsActionWhenQuantityLimitsFeatureIsOn(cart, ctx);\n }\n\n // If there are cart lines, make call to get products\n if (!cartState.hasInvoiceLine && cart && cart.CartLines && cart.CartLines.length > 0) {\n ctx.trace('Getting cart product information...');\n return getSimpleProducts(\n cart.CartLines.map(cartLine => {\n if (cartLine.ProductId) {\n return new ProductInput(\n cartLine.ProductId,\n ctx.requestContext.apiSettings,\n undefined,\n undefined,\n ctx.requestContext,\n cartLine.CatalogId\n );\n }\n return undefined;\n }).filter(Boolean),\n ctx\n )\n .then((products: SimpleProduct[]) => {\n if (products) {\n return products;\n }\n return [];\n })\n .catch((error: Error) => {\n ctx.trace(error.toString());\n ctx.telemetry.error(error.message);\n ctx.telemetry.debug('[getActiveCartWithProducts]Unable to hydrate cart with product information');\n throw new Error('[getActiveCartWithProducts]Unable to hydrate cart with product information');\n });\n }\n\n ctx.trace('[getActiveCartWithProducts]No Products Found in cart');\n return [];\n}\n\nexport const getActiveCartProductsActionDataAction = createObservableDataAction({\n id: '@msdyn365-commerce-modules/retail-actions/get-products-in-active-cart',\n action: >getActiveCartProductsAction,\n input: createInput\n});\nexport default getActiveCartProductsActionDataAction;\n\nasync function getActiveCartProductsActionWhenQuantityLimitsFeatureIsOn(cart: Cart, ctx: IActionContext): Promise {\n const productIdsByWarehouseId: Map = new Map();\n let resultProducts: SimpleProduct[] = [];\n cart.CartLines?.forEach(cartLine =>\n productIdsByWarehouseId.has(cartLine.WarehouseId!)\n ? productIdsByWarehouseId.get(cartLine.WarehouseId!)?.push(cartLine)\n : productIdsByWarehouseId.set(cartLine.WarehouseId!, [cartLine])\n );\n return Promise.all(\n [...productIdsByWarehouseId].map(([entryWarehouseId, entryProductIds]) => {\n return getSimpleProducts(\n entryProductIds\n .map(cartLine => {\n if (cartLine.ProductId) {\n return new ProductInput(\n cartLine.ProductId,\n ctx.requestContext.apiSettings,\n undefined,\n entryWarehouseId,\n ctx.requestContext,\n cartLine.CatalogId\n );\n }\n return undefined;\n })\n .filter(Boolean),\n ctx\n ).then((products: SimpleProduct[]) => {\n if (products) {\n resultProducts = products.reduce((accum, product) => {\n if (product) {\n accum.push(product);\n }\n return accum;\n }, resultProducts);\n }\n });\n })\n ).then(() => resultProducts);\n}\n\nasync function isOrderQuantityLimitsFeatureEnabled(ctx: IActionContext): Promise {\n const defaultOrderQuantityLimitsFeatureConfig = ctx.requestContext.app?.platform?.enableDefaultOrderQuantityLimits;\n if (defaultOrderQuantityLimitsFeatureConfig === 'none') {\n return Promise.resolve(false);\n }\n\n const featureStates = await getFeatureState(createGetFeatureStateInput(ctx), ctx);\n let isQuantityLimitsFeatureEnabledInHq = false;\n if (ArrayExtensions.hasElements(featureStates)) {\n isQuantityLimitsFeatureEnabledInHq =\n featureStates.find(\n (featureState: FeatureState) => featureState.Name === 'Dynamics.AX.Application.RetailDefaultOrderQuantityLimitsFeature'\n )?.IsEnabled || false;\n }\n\n if (!isQuantityLimitsFeatureEnabledInHq) {\n return false;\n }\n\n if (defaultOrderQuantityLimitsFeatureConfig === 'all') {\n return Promise.resolve(true);\n }\n\n return getCustomer(new GetCustomerInput(ctx.requestContext.apiSettings), ctx)\n .then(customerInfo => {\n return (\n !!customerInfo &&\n ((defaultOrderQuantityLimitsFeatureConfig === 'b2b' && customerInfo.IsB2b) ||\n (defaultOrderQuantityLimitsFeatureConfig === 'b2c' && !customerInfo.IsB2b))\n );\n })\n .catch((error: Error) => {\n ctx.telemetry.warning(error.message);\n ctx.telemetry.debug('Unable to get customer info');\n return false;\n });\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { FullProduct } from '@msdyn365-commerce/commerce-entities';\nimport {\n CacheType,\n createObservableDataAction,\n getCatalogId,\n IAction,\n IActionContext,\n IActionInput,\n IAny,\n ICreateActionContext,\n IGeneric\n} from '@msdyn365-commerce/core';\nimport { getRelatedProductsAsync, getRelationTypesAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/ProductsDataActions.g';\nimport { ProductRelationType, ProductSearchResult } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\n\nimport getFullProducts, { FullProductInput, ProductDetailsCriteria } from './get-full-products';\nimport { QueryResultSettingsProxy } from './utilities/QueryResultSettingsProxy';\nimport { generateCacheKey, getProductDetailsCriteriaFromActionInput } from './utilities/utils';\n\n/**\n * GetRelatedProducts Input Action.\n */\nexport class GetRelatedProductsInput implements IActionInput {\n public readonly productId: number;\n\n public readonly catalogId: number;\n\n public readonly relationType: string;\n\n public ProductDetailsCriteria: ProductDetailsCriteria;\n\n public readonly queryResultSettingsProxy: QueryResultSettingsProxy;\n\n public constructor(\n productId: number,\n catalogId: number,\n relationType: string,\n queryResultSettingsProxy: QueryResultSettingsProxy,\n criteria: ProductDetailsCriteria\n ) {\n this.productId = productId;\n this.catalogId = catalogId;\n this.relationType = relationType;\n this.queryResultSettingsProxy = queryResultSettingsProxy;\n this.ProductDetailsCriteria = criteria;\n }\n\n public getCacheKey = () =>\n generateCacheKey(\n undefined,\n { key: 'ProductId', value: this.productId },\n { key: 'CatalogId', value: this.catalogId },\n { key: 'RelationType', value: this.relationType.toLowerCase() },\n { key: 'QueryResultSettingsCacheKeyHint', value: this.queryResultSettingsProxy.cacheKeyHint },\n { key: 'ShouldGetPrice', value: this.ProductDetailsCriteria.getPrice }\n );\n\n public getCacheObjectType = () => 'GetRelatedProducts';\n\n public dataCacheType = (): CacheType => 'none';\n}\n\n/**\n * Creates the input required to make GetRelatedProducts retail api call.\n * @param inputData\n */\nexport const createGetRelatedProductsInput = (inputData: ICreateActionContext>): IActionInput => {\n if (inputData && inputData.requestContext && inputData.config) {\n const catalogId = getCatalogId(inputData.requestContext);\n const relationType = inputData.config.relationType;\n\n let productId = inputData.requestContext.urlTokens ? Number(inputData.requestContext.urlTokens.recordId) : 0;\n const productDetailsCriteria = getProductDetailsCriteriaFromActionInput(inputData);\n if (!relationType) {\n throw new Error('Input relation type is invalid.');\n }\n\n // Query string may override the product id from url\n if (inputData.requestContext.query && inputData.requestContext.query.productId) {\n productId = Number(inputData.requestContext.query.productId);\n }\n\n if (Number.isNaN(productId) || productId <= 0) {\n throw new Error('No valid product id available in url or query string.');\n }\n\n const queryResultSettingsProxy = QueryResultSettingsProxy.fromInputData(inputData);\n return new GetRelatedProductsInput(productId, catalogId, relationType, queryResultSettingsProxy, productDetailsCriteria);\n }\n\n throw new Error('Invalid input data or request context');\n};\n\nexport function searchProductRelationType(productRelationTypes: ProductRelationType[], _productRelationType: string): number | undefined {\n let foundProductRelationTypeId;\n _productRelationType = _productRelationType.toLowerCase();\n productRelationTypes.forEach((productRelationType: ProductRelationType) => {\n if (productRelationType.Name && productRelationType.Name.toLowerCase() === _productRelationType) {\n foundProductRelationTypeId = productRelationType.RecordId;\n }\n });\n\n return foundProductRelationTypeId;\n}\n\nasync function getRelatedProductsAction(input: GetRelatedProductsInput, ctx: IActionContext): Promise {\n const apiSettings = ctx.requestContext.apiSettings;\n const querySettings = input.queryResultSettingsProxy.QueryResultSettings;\n\n const productRelationTypes = await getRelationTypesAsync(\n { callerContext: ctx, queryResultSettings: querySettings },\n input.productId,\n +apiSettings.channelId,\n input.catalogId\n );\n if (!productRelationTypes) {\n ctx.trace(`[getProductRelationType] Unable to get product relation types for product ${input.productId}`);\n return [];\n }\n const productRelationTypeId = searchProductRelationType(productRelationTypes, input.relationType);\n if (!productRelationTypeId) {\n ctx.trace(`[getRelatedProducts] Unable to find relation type ${input.relationType} for product ${input.productId}`);\n return [];\n }\n\n const productInputs = await getRelatedProductsAsync(\n { callerContext: ctx, queryResultSettings: querySettings },\n input.productId,\n +apiSettings.channelId,\n input.catalogId,\n productRelationTypeId\n )\n .then(response => {\n if (response && response.length > 0) {\n return response.map(\n (product: ProductSearchResult): FullProductInput => {\n return new FullProductInput(product.RecordId, apiSettings, input.ProductDetailsCriteria, ctx.requestContext);\n }\n );\n }\n\n ctx.trace('[getRelatedProductsAction] Invalid response from server');\n return [];\n })\n .catch((error: Error) => {\n ctx.trace(error.message);\n ctx.trace(error.stack || '');\n ctx.telemetry.exception(error);\n ctx.telemetry.debug('[getRelatedProductsAction] Unable to Fetch Products.');\n ctx.trace('[getRelatedProductsAction] Unable to Fetch Products.');\n return [];\n });\n\n if (productInputs.length > 0) {\n return getFullProducts(productInputs, ctx);\n }\n return [];\n}\n\n/**\n * The getRelatedProducts data action\n * Uses a productId URL Token and finds the relation types for said product\n * using the getRelationTypes RetailServer API, and then finds and retusn all products that\n * share that relation type via the getRelatedProducts RetailServer API.\n */\nexport const getRelatedProductsActionDataAction = createObservableDataAction({\n id: '@msdyn365-commerce-modules/retail-actions/get-related-products',\n action: >getRelatedProductsAction,\n input: createGetRelatedProductsInput\n});\n\nexport default getRelatedProductsActionDataAction;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport {\n CacheType,\n createObservableDataAction,\n IAction,\n IActionContext,\n IActionInput,\n IAny,\n ICreateActionContext,\n IGeneric\n} from '@msdyn365-commerce/core';\nimport { BusinessPartner, BusinessPartnerUser } from '@msdyn365-commerce/retail-proxy';\nimport { getCurrentAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/BusinessPartnersDataActions.g';\nimport { createBusinessPartnerUserAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/BusinessPartnerUsersDataActions.g';\n\n/**\n * Input class for addOrganizationUser data action.\n */\nexport class AddOrganizationUserInput implements IActionInput {\n public user: BusinessPartnerUser;\n\n constructor(newUser: BusinessPartnerUser) {\n this.user = newUser;\n }\n\n public getCacheKey = () => 'AddOrganizationUser';\n\n public getCacheObjectType = () => 'AddOrganizationUser';\n\n public dataCacheType = (): CacheType => 'none';\n}\n\n/**\n * Input class for addOrganizationUser data action.\n * @param inputData\n * @param newUser\n */\nexport const createAddOrganizationUserInput = (\n inputData: ICreateActionContext>,\n newUser: BusinessPartnerUser\n): IActionInput => {\n const { requestContext } = inputData;\n\n // Check if the user is authenticated.\n if (!requestContext.user.isAuthenticated) {\n throw new Error('User is not logged in.');\n }\n\n return new AddOrganizationUserInput(newUser);\n};\n\n/**\n * The addOrganizationUser data action\n * Calls getCurrent() to get a businessPartnerId from the user requesting the action.\n * It then maps the newUsers' businessPartnerId to the same as the above user.\n * Calls the createBusinessPartner to then create a new entitiy in the database with the\n * information passed into through newUser.\n * @param input\n * @param ctx\n */\nexport async function addOrganizationUser(input: AddOrganizationUserInput, ctx: IActionContext): Promise {\n const { user } = input;\n let errorMessage = '';\n\n return getCurrentAsync({ callerContext: ctx })\n .then((businessPartner: BusinessPartner) => {\n // Set the new accounts businessPartnerId from the admin account\n user.BusinessPartnerId = businessPartner.BusinessPartnerId;\n\n return createBusinessPartnerUserAsync({ callerContext: ctx }, user)\n .then(newUser => {\n return newUser;\n })\n .catch(error => {\n ctx.telemetry.debug('[add-organization-user] Unable to create BusinessPartnerUser account');\n if (error && error.name === 'Microsoft_Dynamics_Commerce_Runtime_EmailIdAlreadyRegistered') {\n errorMessage = error.message;\n }\n throw new Error('[add-organization-user] Unable to create BusinessPartnerUser account');\n });\n })\n .catch(error => {\n ctx.telemetry.exception(error);\n ctx.telemetry.debug('[add-organization-user] Unable to get BusinessPartner Admin account');\n throw errorMessage;\n });\n}\n\n/**\n * The addOrganizationUser data action\n * Calls the read RetailServer API to get the BusinessPartnerId from the admin\n * account and adds that businessPartner to the recieved input (new User)/\n * We then send this new User through the RetailServer API so that the database\n * is updated.\n */\nexport const addOrganizationUserDataAction = createObservableDataAction({\n id: '@msdyn365-commerce-modules/retail-actions/add-organization-user',\n action: >addOrganizationUser,\n input: <(args: ICreateActionContext) => IActionInput>(createAddOrganizationUserInput)\n});\n\nexport default addOrganizationUserDataAction;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { CategoryHierarchy } from '@msdyn365-commerce/commerce-entities';\nimport {\n createObservableDataAction,\n IAction,\n IActionContext,\n IActionInput,\n IAny,\n ICreateActionContext,\n IGeneric,\n IRequestContext\n} from '@msdyn365-commerce/core';\n\nimport getCategoriesHierarchy, { CategoriesInput } from './get-categories-hierarchy';\nimport { ArrayExtensions } from './utilities';\n\n/**\n * Action Input Class for get-current-category-hierarchy.\n */\nexport class CurrentCategoryHierarchyInput extends CategoriesInput {\n public activeCategoryId: number;\n\n public constructor(context: IRequestContext, mappedToHierarchy: boolean, maxItems?: number, activeCategoryId?: number) {\n super(context, mappedToHierarchy, maxItems);\n const defaultActiveCategoryId = 0;\n this.activeCategoryId = activeCategoryId ?? defaultActiveCategoryId;\n }\n\n // @ts-expect-error: Overriding cache object type\n public getCacheObjectType = () => 'CurrentCategoryHierarchy';\n\n public getCacheKey = () => `${this.activeCategoryId}-${this.channelId}`;\n}\n\n/**\n * Creates the input required for the data action.\n * @param inputData\n */\nexport const createCategoriesHierarchyInput = (inputData: ICreateActionContext>): IActionInput => {\n const topItems = inputData.config?.topCategories && Number.parseInt(inputData.config.topCategories, 10);\n let activeCategoryId =\n inputData.requestContext.urlTokens.pageType === 'Category' ? inputData.requestContext.urlTokens.itemId : undefined;\n activeCategoryId = activeCategoryId ?? inputData.requestContext.query?.categoryId;\n const activeCategoryParsedId = activeCategoryId ? Number.parseInt(activeCategoryId, 10) : undefined;\n\n return new CurrentCategoryHierarchyInput(inputData.requestContext, true, topItems, activeCategoryParsedId);\n};\n\n/**\n * Finds the given category in the list of categories and returns an array with the info on where it's located.\n * @param categories - Categories list to search from.\n * @param categoryId - The category id to find.\n * @returns A list of categories starting from the given category id, ending up the root parent.\n */\nconst findCategoryHierarchy = (categories: CategoryHierarchy[], categoryId: number): CategoryHierarchy[] | null => {\n for (const category of categories) {\n if (category.RecordId === categoryId) {\n return [category];\n }\n\n if (ArrayExtensions.hasElements(category.Children)) {\n const innerCategoryHierarchy = findCategoryHierarchy(category.Children, categoryId);\n if (ArrayExtensions.hasElements(innerCategoryHierarchy)) {\n innerCategoryHierarchy.push(category);\n return innerCategoryHierarchy;\n }\n }\n }\n\n return null;\n};\n\n/**\n * Get the hierarchy of categories that are currently active as a parent -> child array.\n * Return will be as follows: [ParentCategory, Child, SubChild, SubSubChild].\n * @param input\n * @param ctx\n */\nexport async function getCurrentCategoryHierarchyAction(\n input: CurrentCategoryHierarchyInput,\n ctx: IActionContext\n): Promise {\n const fullCategoryHierarchy = await getCategoriesHierarchy(new CategoriesInput(ctx.requestContext, true, input.maxItems), ctx);\n const categoryArray = findCategoryHierarchy(fullCategoryHierarchy, input.activeCategoryId) ?? [];\n const sortedCategoryArray = categoryArray.reverse();\n return sortedCategoryArray;\n}\n\nexport const getCurrentCategoryHierarchyActionDataAction = createObservableDataAction({\n id: '@msdyn365-commerce-modules/retail-actions/get-current-category-hierarchy',\n action: getCurrentCategoryHierarchyAction as IAction,\n input: createCategoriesHierarchyInput\n});\n\nexport default getCurrentCategoryHierarchyActionDataAction;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { CategoryHierarchy } from '@msdyn365-commerce/commerce-entities';\nimport {\n CacheType,\n createObservableDataAction,\n getParameterizeFeatureFlags,\n IAction,\n IActionContext,\n IActionInput,\n IAny,\n ICommerceApiSettings,\n ICreateActionContext,\n IGeneric,\n IParameterizeFeatureFlags,\n IRequestContext\n} from '@msdyn365-commerce/core';\n\nimport { generateCacheKey } from './utilities';\nimport getCategoryHierarchy, { CategoriesInput } from './get-categories-hierarchy';\nimport { parameterize } from './utilities/Url-builder';\n\n/**\n * Input class for GetCurrentCategory data action.\n */\nexport class CurrentCategoryInput implements IActionInput {\n public categoryId?: number;\n\n public categorySlug?: string;\n\n public includeRootCategory?: boolean;\n\n private readonly apiSettings: ICommerceApiSettings;\n\n private readonly locale?: string;\n\n constructor(context: IRequestContext, includeRootCategory?: boolean) {\n this.includeRootCategory = includeRootCategory;\n let categoryId;\n let categorySlug;\n if (context.query && context.query.categoryId) {\n categoryId = Number(context.query.categoryId);\n\n if (Number.isNaN(categoryId)) {\n throw new Error('Failed to cast category id into a number.');\n }\n } else if (context.urlTokens && context.urlTokens.recordId) {\n categoryId = Number(context.urlTokens.recordId);\n if (Number.isNaN(categoryId)) {\n throw new Error('Failed to cast category id into a number.');\n }\n } else if (context.urlTokens && context.urlTokens.categories && context.urlTokens.categories.length > 0) {\n const categories: string[] = (context.urlTokens.categories);\n\n if (categories.length === 0) {\n throw new Error('Failed to get category name from urlTokens');\n }\n\n // TODO: fix getParameterizeFeatureFlags to take requestContext as input.\n const tempActionContext = {\n requestContext: context\n };\n categorySlug = `/${categories\n .map(category => {\n // @ts-expect-error TODO: fix getParameterizeFeatureFlags to take requestContext as an input\n const parameterizeFeatureFlags: IParameterizeFeatureFlags = getParameterizeFeatureFlags(tempActionContext);\n return parameterize(category, undefined, parameterizeFeatureFlags);\n })\n .join('/')}`;\n }\n this.categoryId = categoryId;\n this.categorySlug = categorySlug;\n this.apiSettings = context.apiSettings;\n this.locale = context.locale || '';\n }\n\n public getCacheKey = () =>\n generateCacheKey(\n this.apiSettings,\n { key: 'CategoryId', value: this.categoryId },\n { key: 'CategorySlug', value: this.categorySlug },\n { key: 'IncludeRootCategory', value: this.includeRootCategory },\n { key: 'Locale', value: this.locale }\n );\n\n public getCacheObjectType = () => 'Current-Category';\n\n public dataCacheType = (): CacheType => 'application';\n}\n\n/**\n * Creates a current category input from an ICreateActionContext.\n * @param inputData\n */\nexport const createGetCurrentCategoryInput = (inputData: ICreateActionContext>): IActionInput => {\n if (inputData && inputData.requestContext) {\n return new CurrentCategoryInput(inputData.requestContext, true);\n }\n\n throw new Error('Please specify categoryId query string in request.');\n};\n\n/**\n * Recursive Search Method to find a given category among a complete CategoryHierarchy.\n * @param categories The current Category Hierarchy.\n * @param categorySlug The category slug being searched for.\n * @param categoryId The category Id being search for.\n */\nexport function searchCategory(categories: CategoryHierarchy[], categorySlug?: string, categoryId?: number): CategoryHierarchy | undefined {\n let foundCategory;\n for (const cat of categories) {\n if ((categoryId && cat.RecordId === categoryId) || (categorySlug && cat.Slug === categorySlug)) {\n foundCategory = cat;\n break;\n } else if (cat.Children && cat.Children.length > 0) {\n const matchingChild = searchCategory(cat.Children, categorySlug, categoryId);\n if (matchingChild) {\n foundCategory = matchingChild;\n }\n }\n }\n return foundCategory;\n}\n\n/**\n * Action method for the getCurrentCategory Data Action.\n * @param input The action input class.\n * @param ctx The action context.\n */\nexport async function getCurrentCategoryAction(input: CurrentCategoryInput, ctx: IActionContext): Promise {\n if (input.categorySlug || input.categoryId) {\n const categoryInput = new CategoriesInput(ctx.requestContext, true, undefined, input.includeRootCategory);\n const categories = await getCategoryHierarchy(categoryInput, ctx);\n if (!categories) {\n ctx.trace('[getCurrentCategory] Unable to get categories from server');\n return;\n }\n\n const category = searchCategory(categories, input.categorySlug, input.categoryId);\n if (!category) {\n ctx.trace('[getCurrentCategory] Unable to find category');\n return;\n }\n return category;\n }\n return;\n}\n\n/**\n * The getCurrentCategory data action\n * First makes a call to the getCategories RetailServer API\n * to get a list of every available category, then returns a CategoryHierarchy\n * based on the categoryId query param set in the URL of the request.\n */\nexport const getCurrentCategoryActionDataAction = createObservableDataAction({\n id: '@msdyn365-commerce-modules/retail-actions/get-current-category',\n action: >getCurrentCategoryAction,\n input: createGetCurrentCategoryInput\n});\n\nexport default getCurrentCategoryActionDataAction;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport {\n CacheType,\n createObservableDataAction,\n getCatalogId,\n getMediaLocationsForProductAction,\n IAction,\n IActionContext,\n IActionInput,\n IAny,\n ICommerceApiSettings,\n ICreateActionContext,\n IGeneric,\n MediaLocationsInput\n} from '@msdyn365-commerce/core';\nimport { getMediaLocationsAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/ProductsDataActions.g';\nimport { MediaLocation } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\n\nimport { QueryResultSettingsProxy } from './utilities/QueryResultSettingsProxy';\nimport { generateCacheKey, generateImageUrl } from './utilities/utils';\n\n/**\n * Product Input.\n */\nexport class MediaLocationsByIdInput implements IActionInput {\n public productId?: number;\n\n public channelId: number;\n\n public catalogId: number;\n\n private readonly apiSettings: ICommerceApiSettings;\n\n constructor(apiSettings: ICommerceApiSettings, productId?: number, catalogId?: number) {\n this.productId = productId;\n this.channelId = +apiSettings.channelId;\n this.catalogId = catalogId || 0;\n this.apiSettings = apiSettings;\n }\n\n public getCacheKey = () =>\n generateCacheKey(\n this.apiSettings,\n { key: 'Key', value: 'MediaLocationID' },\n { key: 'ProductId', value: this.productId },\n { key: 'CatalogId', value: this.catalogId }\n );\n\n public getCacheObjectType = () => 'MediaLocations';\n\n public dataCacheType = (): CacheType => 'none';\n}\n\n/**\n * Creates the input required to make the retail api call.\n * @param inputData\n */\nexport const createMediaLocationsByIdInput = (inputData: ICreateActionContext>): MediaLocationsByIdInput => {\n const productId = (inputData.config && +inputData.config.productId) || undefined;\n const catalogId = getCatalogId(inputData.requestContext);\n return new MediaLocationsByIdInput(inputData.requestContext.apiSettings, productId, catalogId);\n};\n\n/**\n * Calls the Retail API and returns the product based on the passed MediaLocationsByIdInput.\n * @param input\n * @param ctx\n */\nexport async function getMediaLocationsByIdAction(input: MediaLocationsByIdInput, ctx: IActionContext): Promise {\n if (input.productId) {\n if (ctx.requestContext.app?.config?.OmniChannelMedia) {\n const mediaLocationsInput = new MediaLocationsInput(ctx.requestContext, input.productId, input.channelId, input.catalogId);\n return getMediaLocationsForProductAction(mediaLocationsInput, ctx);\n }\n return getMediaLocationsAsync(\n { callerContext: ctx, queryResultSettings: QueryResultSettingsProxy.getPagingFromInputDataOrDefaultValue(ctx) },\n input.productId,\n input.channelId,\n input.catalogId\n ).then(response => {\n return response.map(\n (mediaLocation: MediaLocation): MediaLocation => {\n mediaLocation.Uri = generateImageUrl(mediaLocation.Uri, ctx.requestContext.apiSettings);\n mediaLocation.AltText = mediaLocation.AltText ? mediaLocation.AltText : '';\n return mediaLocation;\n }\n );\n });\n }\n return [];\n}\n\nexport const getMediaLocationsByIdActionDataAction = createObservableDataAction({\n id: '@msdyn365-commerce-modules/retail-actions/get-media-locations-by-id',\n action: >getMediaLocationsByIdAction,\n input: createMediaLocationsByIdInput\n});\n\nexport default getMediaLocationsByIdActionDataAction;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport {\n CacheType,\n createObservableDataAction,\n IAction,\n IActionContext,\n IActionInput,\n ICreateActionContext\n} from '@msdyn365-commerce/core';\nimport { ProductList, ProductListsDataActions } from '@msdyn365-commerce/retail-proxy';\n\n/**\n * Input class for the CreateProductList data action.\n */\nexport class CreateProductListInput implements IActionInput {\n public readonly templateName: string;\n\n public readonly templateType: number;\n\n public constructor(templateName: string, templateType: number) {\n this.templateName = templateName;\n this.templateType = templateType;\n }\n\n /**\n * GetCacheObjectType.\n * @returns - Returns string.\n */\n public getCacheKey = (): string => 'CreateProductListInput';\n\n /**\n * GetCacheKey.\n * @returns - Returns string.\n */\n public getCacheObjectType = (): string => 'CreateProductListInput';\n\n /**\n * DataCacheType.\n * @returns - CacheType string.\n */\n public dataCacheType = (): CacheType => 'none';\n}\n\n/**\n * CreateInput method for the CreateProductList method.\n * @param inputData - The input data passed to the createInput method.\n * @param templateName - The name of template.\n * @param templateType - The type of template.\n * @returns - The Action input.\n */\nexport const createProductListInput = (\n inputData: ICreateActionContext,\n templateName: string,\n templateType: number\n): CreateProductListInput => {\n const { requestContext } = inputData;\n if (!requestContext.user.isAuthenticated) {\n throw new Error('Unable to create product list. User is not authenticated.');\n }\n return new CreateProductListInput(templateName, templateType);\n};\n\n/**\n * The action method for the CreateProductList data action.\n * @param input - The action input.\n * @param context - The action context.\n * @returns - ProductList object.\n */\nexport async function createProductListAction(input: CreateProductListInput, context: IActionContext): Promise {\n try {\n const orderTemplate: ProductList = {\n Id: '',\n Name: input.templateName,\n ProductListTypeValue: input.templateType\n };\n const createdProductList = await ProductListsDataActions.createProductListAsync(\n {\n callerContext: context\n },\n orderTemplate\n );\n if (createdProductList.Id !== '') {\n return createdProductList;\n }\n context.telemetry.error('Created product list was null');\n throw new Error('Created product list was null');\n } catch (error) {\n context.telemetry.error('Not able to create product list', error);\n throw error;\n }\n}\n\n/**\n * The CreateProductList Data Action.\n * Returns created Product List.\n */\nexport const createProductListActionDataAction = createObservableDataAction({\n id: '@msdyn365-commerce-modules/retail-actions/create-product-list',\n action: createProductListAction as IAction,\n input: createProductListInput\n});\n\nexport default createProductListActionDataAction;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport {\n CacheType,\n createObservableDataAction,\n getCatalogId,\n getCategoriesUrlSync,\n IAction,\n IActionContext,\n IActionInput,\n IAny,\n ICommerceApiSettings,\n ICreateActionContext,\n IGeneric,\n IRequestContext\n} from '@msdyn365-commerce/core';\nimport { ICategoryPath, ICategoryUrl } from '@msdyn365-commerce/core-internal/dist/types/interfaces/ICategoryPathInterfaces';\nimport { getCategoryPathsAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/ProductsDataActions.g';\nimport { CategoryPathLookup } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\n\nimport { QueryResultSettingsProxy } from './utilities/QueryResultSettingsProxy';\nimport { generateCacheKey, getSelectedProductIdFromActionInput } from './utilities/utils';\n\n/**\n * Category path input.\n */\nexport class GetCategoryPathsInput implements IActionInput {\n public readonly ChannelId: number;\n\n public readonly CatalogId: number;\n\n public readonly categoryPathLooksups: CategoryPathLookup[];\n\n public readonly apiSettings: ICommerceApiSettings;\n\n private readonly locale: string;\n\n private _requestContext: IRequestContext;\n\n public constructor(context: IRequestContext, categoryPathLooksups: CategoryPathLookup[]) {\n this._requestContext = context;\n this.ChannelId = context.apiSettings.channelId;\n this.CatalogId = getCatalogId(context);\n this.categoryPathLooksups = categoryPathLooksups;\n this.apiSettings = context.apiSettings;\n this.locale = context.locale;\n }\n\n public getCacheKey = () =>\n generateCacheKey(\n this._requestContext.apiSettings,\n { key: 'CategoryPathProductIds', value: this.categoryPathLooksups.map(categoryPath => categoryPath.ProductId) },\n { key: 'CatalogId', value: this.CatalogId },\n { key: 'locale', value: this.locale }\n );\n\n public getCacheObjectType = () => 'CategoryPath';\n\n public dataCacheType = (): CacheType => 'request';\n\n /**\n * Retrieves locale to use for the current API call.\n * @returns A string which represents locale.\n */\n public getLocale = (): string => this.locale;\n}\n\n/**\n * Creates the input required to make the getCategoryPath retail api call.\n * @param inputData\n */\nexport const createGetCategoryPathsInput = (inputData: ICreateActionContext>): IActionInput => {\n const productId = getSelectedProductIdFromActionInput(inputData);\n if (productId) {\n return new GetCategoryPathsInput(inputData.requestContext, [{ ProductId: +productId }]);\n }\n throw new Error('Unable to create SelectedVariantInput, no productId found on module config or query');\n};\n\n/**\n * Calls the Retail API and returns the category path for a product.\n * @param input\n * @param ctx\n */\nexport async function getCategoryPathsAction(input: GetCategoryPathsInput, ctx: IActionContext): Promise {\n const categoryPathResults = await getCategoryPathsAsync(\n {\n callerContext: ctx,\n queryResultSettings: QueryResultSettingsProxy.getPagingFromInputDataOrDefaultValue(ctx)\n },\n input.ChannelId,\n input.CatalogId,\n input.categoryPathLooksups\n );\n const categoryPath = categoryPathResults[0].CategoryPath && categoryPathResults[0].CategoryPath[0];\n const categoryUrl = getCategoriesUrlSync(categoryPath, ctx);\n if (categoryUrl) {\n /* Do not return the root category of the product*/\n return categoryUrl.slice(1);\n }\n return [];\n}\n\nexport const getCategoryPathsActionDataAction = createObservableDataAction({\n id: '@msdyn365-commerce-modules/retail-actions/get-category-paths',\n action: >getCategoryPathsAction,\n input: createGetCategoryPathsInput\n});\n\nexport default getCategoryPathsActionDataAction;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport {\n CacheType,\n createObservableDataAction,\n IAction,\n IActionContext,\n IActionInput,\n IAny,\n ICommerceApiSettings,\n ICreateActionContext,\n IGeneric\n} from '@msdyn365-commerce/core';\nimport { ProductRefiner } from '@msdyn365-commerce/retail-proxy';\nimport { getRefinersByTextAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/ProductsDataActions.g';\n\nimport { parseSearchData } from './utilities/input-data-parser';\nimport { QueryResultSettingsProxy } from './utilities/QueryResultSettingsProxy';\nimport { generateCacheKey } from './utilities/utils';\n\n/**\n * Action Input class for the getRefinersByText data action.\n */\nexport class RefinersByTextInput implements IActionInput {\n public readonly catalogId: number;\n\n public readonly searchText: string;\n\n public readonly queryResultSettingsProxy: QueryResultSettingsProxy;\n\n private readonly apiSettings: ICommerceApiSettings;\n\n constructor(\n searchText: string,\n catalogId: number,\n queryResultSettingsProxy: QueryResultSettingsProxy,\n apiSettings: ICommerceApiSettings\n ) {\n this.catalogId = catalogId;\n this.searchText = searchText;\n this.queryResultSettingsProxy = queryResultSettingsProxy;\n this.apiSettings = apiSettings;\n }\n\n public getCacheKey = () =>\n generateCacheKey(\n this.apiSettings,\n { key: 'SearchText', value: this.searchText },\n { key: 'CatalogId', value: this.catalogId },\n { key: 'QueryResultSettingsCacheKeyHint', value: this.queryResultSettingsProxy.cacheKeyHint }\n );\n\n public getCacheObjectType = () => 'ProductRefiner';\n\n public dataCacheType = (): CacheType => 'request';\n}\n\n/**\n * Creates the input required to make the retail api call.\n * @param inputData\n */\nexport const createRefinersByTextInput = (inputData: ICreateActionContext>): IActionInput => {\n const searchInputData = parseSearchData(inputData);\n const catalogId = inputData.config ? Number(inputData.config.catalogId) : 0;\n\n return new RefinersByTextInput(\n searchInputData.q,\n Number.isNaN(catalogId) ? 0 : catalogId,\n QueryResultSettingsProxy.fromInputData(inputData),\n inputData.requestContext.apiSettings\n );\n};\n\n/**\n * Calls the Retail API and returns all refiners by text.\n * @param input\n * @param ctx\n */\nexport async function getRefinersByTextAction(input: RefinersByTextInput, ctx: IActionContext): Promise {\n return getRefinersByTextAsync(\n { callerContext: ctx, queryResultSettings: input.queryResultSettingsProxy.QueryResultSettings },\n input.catalogId,\n input.searchText\n );\n}\n\nexport const getRefinersByTextActionDataAction = createObservableDataAction({\n id: '@msdyn365-commerce-modules/retail-actions/get-refiners-by-text',\n action: >getRefinersByTextAction,\n input: createRefinersByTextInput\n});\n\nexport default getRefinersByTextActionDataAction;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { FullProduct } from '@msdyn365-commerce/commerce-entities';\nimport { ProductList, ProductListLine } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\n\n/**\n * OrderTemplateLine state information.\n */\nexport class OrderTemplateLine {\n public productListLine: ProductListLine;\n\n public fullProduct?: FullProduct;\n\n constructor(productListLine: ProductListLine, fullProduct?: FullProduct) {\n this.productListLine = productListLine;\n this.fullProduct = fullProduct;\n }\n}\n\nexport interface IOrderTemplateLinesState {\n lines: OrderTemplateLine[];\n totalCount: number;\n}\n\n/**\n * Order template class.\n */\nexport class OrderTemplate {\n public productList: ProductList;\n\n public orderTemplateLines: OrderTemplateLine[];\n\n public totalLines: number;\n\n constructor(productList: ProductList, orderTemplateLines: OrderTemplateLine[], totalLines: number) {\n this.productList = productList;\n this.orderTemplateLines = orderTemplateLines;\n this.totalLines = totalLines;\n }\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport {\n CacheType,\n createObservableDataAction,\n IAction,\n IActionContext,\n IActionInput,\n ICommerceApiSettings,\n ICreateActionContext\n} from '@msdyn365-commerce/core';\nimport { BusinessPartnerUser } from '@msdyn365-commerce/retail-proxy';\nimport { getCurrentAsync, getUsersAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/BusinessPartnersDataActions.g';\n\nimport { buildCacheKey } from './utilities/utils';\n\n/**\n * Input class for get customer data action.\n */\nexport class OrganizationUsersInput implements IActionInput {\n private readonly apiSettings: ICommerceApiSettings;\n\n constructor(apiSettings: ICommerceApiSettings) {\n this.apiSettings = apiSettings;\n }\n\n public getCacheKey = () => buildCacheKey('OrganizationUsers', this.apiSettings);\n\n public getCacheObjectType = () => 'BusinessPartner';\n\n public dataCacheType = (): CacheType => 'request';\n}\n\nexport const createGetOrganizationUsersInput = (inputData: ICreateActionContext): IActionInput => {\n const { requestContext } = inputData;\n\n // Check if the user is authenticated.\n if (!requestContext.user.isAuthenticated) {\n throw new Error('User is not logged in.');\n }\n\n return new OrganizationUsersInput(requestContext.apiSettings);\n};\n\nexport async function getOrganizationUsers(input: OrganizationUsersInput, ctx: IActionContext): Promise {\n return getCurrentAsync({ callerContext: ctx })\n .then(businessPartner => {\n return getUsersAsync({ callerContext: ctx }, businessPartner.BusinessPartnerId)\n .then(users => {\n return users;\n })\n .catch(error => {\n ctx.telemetry.exception(error);\n ctx.trace('[get-organization-users] Unable to load users');\n throw new Error('[get-organization-users] Unable to load users');\n });\n })\n .catch(error => {\n ctx.telemetry.exception(error);\n ctx.telemetry.debug('[get-organization-users] Unable to get BusinessPartner');\n throw new Error('[get-organization-users] Unable to get BusinessPartner');\n });\n}\nexport const getOrganizationUsersDataAction = createObservableDataAction({\n id: 'get-organization-users',\n action: >(getOrganizationUsers),\n input: createGetOrganizationUsersInput\n});\n\nexport default getOrganizationUsersDataAction;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport {\n CacheType,\n createObservableDataAction,\n IAction,\n IActionContext,\n IActionInput,\n IAny,\n ICommerceApiSettings,\n ICreateActionContext,\n IGeneric\n} from '@msdyn365-commerce/core';\nimport { getCartState } from '@msdyn365-commerce/global-state';\nimport { CartPromotionLine } from '@msdyn365-commerce/retail-proxy';\nimport { getAvailablePromotionsAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/CartsDataActions.g';\n\nimport { ActiveCartProductsInput, buildCacheKey, getActiveCartProductsAction } from '.';\n\n/**\n * Input class for promotion options for items in cart.\n */\nexport class PromotionOptionsForCartLineItems implements IActionInput {\n private readonly apiSettings: ICommerceApiSettings;\n\n constructor(apiSettings: ICommerceApiSettings) {\n this.apiSettings = apiSettings;\n }\n\n public getCacheKey = () => buildCacheKey('ActiveCartLineItemsPromotionOptions', this.apiSettings);\n\n public getCacheObjectType = () => 'ActiveCartLineItemsPromotionOptions';\n\n public dataCacheType = (): CacheType => 'none';\n}\n\nconst createInput = (inputData: ICreateActionContext>) => {\n return new PromotionOptionsForCartLineItems(inputData.requestContext.apiSettings);\n};\n\n/**\n * Calls the Retail API to get the promotion options for items in the cart.\n * @param input\n * @param ctx\n */\nexport async function getPromotionOptionsForCartLineItems(\n input: PromotionOptionsForCartLineItems,\n ctx: IActionContext\n): Promise {\n // If no input is provided fail out\n if (!input) {\n throw new Error('[getPromotionOptionsForCartLineItems]No valid Input was provided, failing');\n }\n const cartState = await getCartState(ctx);\n if (cartState.hasInvoiceLine) {\n ctx.trace('[getPromotionOptionsForCartLineItems] cart has invoice line');\n return [];\n }\n const cart = cartState.cart;\n const products = await getActiveCartProductsAction(new ActiveCartProductsInput(), ctx);\n\n if (!cart || !cart.CartLines || !products || products.length === 0) {\n ctx.trace('[getPromotionOptionsForCartLineItems] Not able to get cart OR channelConfiguration or no products in cart');\n return [];\n }\n\n const cartLineIds = cart.CartLines.map(c => c.LineId || '');\n\n return getAvailablePromotionsAsync({ callerContext: ctx, queryResultSettings: {}, bypassCache: 'get' }, cart.Id, cartLineIds || null)\n .then(result => {\n return result;\n })\n .catch((error: Error) => {\n ctx.trace(error.message);\n ctx.telemetry.exception(error);\n ctx.telemetry.debug('[getPromotionOptionsForCartLineItems]Error executing action');\n throw new Error('[getPromotionOptionsForCartLineItems]Error executing action');\n });\n}\n\nexport const getPromotionOptionsForCartLineItemsDataAction = createObservableDataAction({\n id: '@msdyn365-commerce-modules/retail-actions/get-promotion-options-for-cartlines',\n action: >getPromotionOptionsForCartLineItems,\n input: createInput\n});\n\nexport default getPromotionOptionsForCartLineItemsDataAction;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { CacheType, createObservableDataAction, getCatalogId, IAction, IActionContext, IActionInput } from '@msdyn365-commerce/core';\nimport { ProductPrice, ProductsDataActions, ProductSearchResult, ProjectionDomain } from '@msdyn365-commerce/retail-proxy';\n\nimport { ArrayExtensions } from './utilities';\nimport { QueryResultSettingsProxy } from './utilities/QueryResultSettingsProxy';\n\n/**\n * Input class for the GetPriceForProductSearchResult Data Action.\n */\nexport class PriceForProductSearchResultInput implements IActionInput {\n public products: ProductSearchResult[];\n\n public constructor(products: ProductSearchResult[]) {\n this.products = products;\n }\n\n /**\n * Get the cache key.\n * @returns The cache key.\n */\n public getCacheKey = (): string => `PriceForProductSearchResult-${JSON.stringify(this.products)}`;\n\n /**\n * Get the cache object type.\n * @returns The cache object type.\n */\n public getCacheObjectType = (): string => 'ProductSearchResult';\n\n /**\n * Define the data cache type.\n * @returns The cache type.\n */\n public dataCacheType = (): CacheType => 'none';\n}\n\n/**\n * The createInput method for the GetPriceForProductSearchResultDataAction.\n * @param products -- The product search result.\n * @returns The input.\n */\nexport const createActivePriceForProductSearchResultInput = (products: ProductSearchResult[]): PriceForProductSearchResultInput => {\n return new PriceForProductSearchResultInput(products);\n};\n\n/**\n * The Action Method for the GetPriceForProductSearchResult Data Action\n * Gets the active price for product search result via the getActivePrice RetailServer API.\n * @param input -- The data input.\n * @param context -- The action context.\n * @returns The product search result updated with price.\n */\nexport async function getPriceForProductSearchResultAction(\n input: PriceForProductSearchResultInput,\n context: IActionContext\n): Promise {\n let productRecIds: number[];\n if (ArrayExtensions.hasElements(input.products)) {\n productRecIds = input.products.map(product => product.RecordId);\n } else {\n return Promise.resolve([]);\n }\n\n const catalogId = getCatalogId(context.requestContext);\n\n const projectDomain: ProjectionDomain = { ChannelId: +context.requestContext.apiSettings.channelId, CatalogId: catalogId };\n const priceZero = 0;\n\n try {\n const productPrices: ProductPrice[] = await ProductsDataActions.getActivePricesAsync(\n { callerContext: context, queryResultSettings: QueryResultSettingsProxy.getPagingFromInputDataOrDefaultValue(context) },\n projectDomain,\n productRecIds,\n new Date(),\n null,\n undefined,\n true\n );\n\n const productResults: ProductSearchResult[] = input.products.map(product => {\n const activePrice = productPrices.find(price => price.ProductId === product.RecordId);\n if (activePrice) {\n product.Price = activePrice.CustomerContextualPrice ?? product.Price;\n product.BasePrice = Math.max(\n activePrice.BasePrice ?? priceZero,\n activePrice.TradeAgreementPrice ?? priceZero,\n activePrice.AdjustedPrice ?? priceZero\n );\n }\n return product;\n });\n\n return Promise.resolve(productResults);\n } catch (error) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument -- existing error type.\n context.telemetry.exception(error);\n context.telemetry.debug('[getPriceForProductSearchResultAction]Error executing action');\n throw new Error('[getPriceForProductSearchResultAction]Error executing action');\n }\n}\n\n/**\n * The getPriceForProductSearchResult data action.\n */\nexport const getPriceForProductSearchResultDataAction = createObservableDataAction({\n id: '@msdyn365-commerce-modules/retail-actions/get-price-for-product-search-result',\n // eslint-disable-next-line @typescript-eslint/consistent-type-assertions -- existing pattern.\n action: >getPriceForProductSearchResultAction,\n input: createActivePriceForProductSearchResultInput\n});\n\nexport default getPriceForProductSearchResultDataAction;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport {\n CacheType,\n createObservableDataAction,\n IAction,\n IActionContext,\n IActionInput,\n ICommerceApiSettings,\n ICreateActionContext\n} from '@msdyn365-commerce/core';\nimport { getCartState, ICartState } from '@msdyn365-commerce/global-state';\nimport { LoyaltyCard } from '@msdyn365-commerce/retail-proxy';\nimport { issueLoyaltyCardAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/StoreOperationsDataActions.g';\n\nimport { buildCacheKey } from '.';\nimport { getLoyaltyAction, GetLoyaltyCardInput } from './get-loyalty-card';\n\n/**\n * Input class for the issueLoyalty data action.\n */\nexport class IssueLoyaltyInput implements IActionInput {\n public userAccountNumber?: string;\n\n public apiSettings: ICommerceApiSettings;\n\n constructor(apiSettings: ICommerceApiSettings, userAccountNumber?: string) {\n this.userAccountNumber = userAccountNumber;\n this.apiSettings = apiSettings;\n }\n\n public getCacheKey = () => buildCacheKey(`IssueLoyalty-${this.userAccountNumber}`, this.apiSettings);\n\n public getCacheObjectType = () => 'GetIssueLoyalty';\n\n public dataCacheType = (): CacheType => 'request';\n}\n\n/**\n * CreateInput method for the issueLoyalty method.\n * @param inputData The input data passed to the createInput method.\n */\nexport const createIssueLoyaltyInput = (inputData: ICreateActionContext): IActionInput => {\n const { requestContext } = inputData;\n\n if (!requestContext.user.isAuthenticated) {\n throw new Error('Unable to create issue loyalty input. User is not authenticated.');\n }\n\n return new IssueLoyaltyInput(inputData.requestContext.apiSettings);\n};\n\n/**\n * The action method for the issueLoyalty data action.\n * @param input The action input.\n * @param ctx The action context.\n */\nexport async function issueLoyaltyAction(input: IssueLoyaltyInput, ctx: IActionContext): Promise {\n const promises: [Promise, Promise] = [getCartState(ctx), _getLoyalty(input, ctx)];\n return Promise.all(promises)\n .then(result => {\n const cartState = result[0];\n const card = result[1];\n if (card && card.CardNumber) {\n updateCart(cartState, card);\n return card;\n }\n\n // @ts-expect-error\n // TO-DO: Remove after SDK bug fix https://msdyneng.visualstudio.com/FinOps/_workitems/edit/473891\n return issueLoyaltyCardAsync({ callerContext: ctx }, { CustomerAccount: input.userAccountNumber || null })\n .then((issuedCard: LoyaltyCard) => {\n updateCart(cartState, issuedCard);\n return issuedCard;\n })\n .catch(error => {\n ctx.telemetry.exception(error);\n ctx.telemetry.debug('Issuing loyalty card failed');\n throw new Error('Issuing loyalty card failed');\n });\n })\n .catch((error: Error) => {\n ctx.telemetry.exception(error);\n ctx.telemetry.debug('Unable to issue loyalty card');\n throw new Error('Unable to issue loyalty card');\n });\n}\n\nasync function _getLoyalty(input: IssueLoyaltyInput, ctx: IActionContext): Promise {\n const loyaltyCardInput = new GetLoyaltyCardInput(input.apiSettings);\n return getLoyaltyAction(loyaltyCardInput, ctx);\n}\n\nfunction updateCart(cartState: ICartState, card: LoyaltyCard): void {\n cartState.updateLoyaltyCardId({ loyaltyCardNumber: card.CardNumber });\n}\n\n/**\n * The getLoyaltyCard data action\n * Returns the loyalty card belonging to the customer.\n */\nexport const issueLoyaltyActionDataAction = createObservableDataAction({\n id: '@msdyn365-commerce-modules/retail-actions/issue-loyalty',\n action: >issueLoyaltyAction,\n input: <(args: ICreateActionContext) => IActionInput>createIssueLoyaltyInput\n});\n\nexport default issueLoyaltyActionDataAction;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport {\n CacheType,\n createObservableDataAction,\n IAction,\n IActionContext,\n IActionInput,\n ICommerceApiSettings,\n ICreateActionContext\n} from '@msdyn365-commerce/core';\nimport { CustomerBalances } from '@msdyn365-commerce/retail-proxy';\nimport { getCustomerBalanceAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/StoreOperationsDataActions.g';\n\nimport { buildCacheKey } from '.';\nimport getCustomer, { GetCustomerInput } from './get-customer';\n\n/**\n * Input class for the GetCustomerBalance data action.\n */\nexport class GetCustomerBalanceInput implements IActionInput {\n public customerAccountNumber?: string;\n\n public apiSettings: ICommerceApiSettings;\n\n constructor(apiSettings: ICommerceApiSettings, customerAccountNumber?: string) {\n this.customerAccountNumber = customerAccountNumber;\n this.apiSettings = apiSettings;\n }\n\n public getCacheKey = () => buildCacheKey(`CustomerBalance-${this.customerAccountNumber}`, this.apiSettings);\n\n public getCacheObjectType = () => 'GetCustomerBalance';\n\n public dataCacheType = (): CacheType => 'request';\n}\n\n/**\n * CreateInput method for the GetCustomerBalance method.\n * @param inputData The input data passed to the createInput method.\n */\n\nexport const createGetCustomerBalanceInput = (inputData: ICreateActionContext): GetCustomerBalanceInput => {\n const { requestContext } = inputData;\n if (!requestContext.user.isAuthenticated) {\n throw new Error('Unable to create get customer balance input. User is not authenticated.');\n }\n\n return new GetCustomerBalanceInput(requestContext.apiSettings);\n};\n\n/**\n * The action method for the GetCustomerBalance data action.\n * @param input The action input.\n * @param ctx The action context.\n */\nexport async function getCustomerBalanceAction(input: GetCustomerBalanceInput, ctx: IActionContext): Promise {\n const customerInput = new GetCustomerInput(input.apiSettings, input.customerAccountNumber);\n const customer = await getCustomer(customerInput, ctx);\n\n if (!customer) {\n ctx.telemetry.error('Not able to get customer', new Error('Not able to get customer'));\n }\n\n return getCustomerBalanceAsync(\n {\n callerContext: ctx,\n queryResultSettings: {}\n },\n customer.AccountNumber,\n customer.InvoiceAccount\n );\n}\n\n/**\n * The GetCustomerBalance data action\n * Returns the customer's balance.\n */\nexport const getCustomerBalanceActionDataAction = createObservableDataAction({\n id: '@msdyn365-commerce-modules/retail-actions/get-customer-balance',\n action: >getCustomerBalanceAction,\n input: <(args: ICreateActionContext) => IActionInput>createGetCustomerBalanceInput\n});\n\nexport default getCustomerBalanceActionDataAction;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport {\n CacheType,\n createObservableDataAction,\n IAction,\n IActionContext,\n IActionInput,\n IAny,\n ICommerceApiSettings,\n ICreateActionContext,\n IGeneric\n} from '@msdyn365-commerce/core';\nimport { getCartState } from '@msdyn365-commerce/global-state';\nimport { CartLine, ChannelDeliveryOptionConfiguration, FeatureState, ProductWarehouse } from '@msdyn365-commerce/retail-proxy';\nimport { getOrgUnitConfigurationAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/OrgUnitsDataActions.g';\nimport {\n getEstimatedAvailabilityAsync,\n getEstimatedProductWarehouseAvailabilityAsync\n} from '@msdyn365-commerce/retail-proxy/dist/DataActions/ProductsDataActions.g';\nimport { getChannelDeliveryOptionConfigurationAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/StoreOperationsDataActions.g';\n\nimport {\n ActiveCartProductsInput,\n ArrayExtensions,\n buildCacheKey,\n createInventoryAvailabilitySearchCriteria,\n getActiveCartProductsAction,\n IProductInventoryInformation,\n mapAggregatedProductInventoryInformation,\n mapProductInventoryInformation\n} from '.';\nimport { FeatureStateInput, getFeatureStateActionDataAction } from './get-feature-state';\n\n/**\n * Input class for availabilities for items in cart.\n */\nexport class ProductAvailabilitiesForCartLineItems implements IActionInput {\n private readonly apiSettings: ICommerceApiSettings;\n\n constructor(apiSettings: ICommerceApiSettings) {\n this.apiSettings = apiSettings;\n }\n\n public getCacheKey = () => buildCacheKey('ActiveCartLineItemsAvailability', this.apiSettings);\n\n public getCacheObjectType = () => 'ActiveCartLineItemsAvailability';\n\n public dataCacheType = (): CacheType => 'none';\n}\n\nconst createInput = (inputData: ICreateActionContext>) => {\n return new ProductAvailabilitiesForCartLineItems(inputData.requestContext.apiSettings);\n};\n\n/**\n * Calls the Retail Feature State API and returns a list of feature with isEnabled flag.\n * @param cartLine\n * @param featureSate\n * @param channelDeliveryOptionConfig\n * @param pickupDeliveryMode\n */\nconst getDeliveryMode = (\n cartLine: CartLine,\n featureSate: boolean = false,\n channelDeliveryOptionConfig: ChannelDeliveryOptionConfiguration,\n pickupDeliveryMode?: string\n) => {\n if (!featureSate) {\n return cartLine.DeliveryMode === pickupDeliveryMode;\n }\n return (\n cartLine.DeliveryMode ===\n channelDeliveryOptionConfig?.PickupDeliveryModeCodes?.find(deliveryMode => deliveryMode === cartLine.DeliveryMode)\n );\n};\n\n/**\n * Calls the Retail API to get the product availabilities for items in the cart.\n * @param input\n * @param ctx\n */\n// eslint-disable-next-line complexity\nexport async function getAvailabilitiesForCartLineItems(\n input: ProductAvailabilitiesForCartLineItems,\n ctx: IActionContext\n): Promise {\n // If no input is provided fail out\n if (!input) {\n throw new Error('[getAvailabilitiesForCartLineItems]No valid Input was provided, failing');\n }\n\n const shippingItems: CartLine[] = [];\n const bopisItems = [];\n let productAvailabilities: IProductInventoryInformation[] = [];\n const multiplePickupStoreSwitchName = 'Dynamics.AX.Application.RetailMultiplePickupDeliveryModeFeature';\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let channelDeliveryOptionConfig: any;\n\n const cartState = await getCartState(ctx);\n const cart = cartState.cart;\n const channelConfiguration = await getOrgUnitConfigurationAsync({ callerContext: ctx });\n const products = await getActiveCartProductsAction(new ActiveCartProductsInput(), ctx);\n\n /**\n * Calls the Retail Feature State API and returns a list of feature with isEnabled flag.\n * @param context\n */\n async function getFeatureState(context: IActionContext): Promise {\n return getFeatureStateActionDataAction(new FeatureStateInput(), context);\n }\n const featureState = await getFeatureState(ctx);\n const retailMultiplePickUpOptionEnabled = featureState?.find(item => item.Name === multiplePickupStoreSwitchName)?.IsEnabled;\n if (retailMultiplePickUpOptionEnabled) {\n channelDeliveryOptionConfig = await getChannelDeliveryOptionConfigurationAsync({ callerContext: ctx });\n }\n const PickupDeliveryModeCode = channelConfiguration.PickupDeliveryModeCode;\n const EmailDeliveryModeCode = channelConfiguration.EmailDeliveryModeCode;\n\n if (!cart || !channelConfiguration || !products || products.length === 0) {\n ctx.trace('[getAvailabilitiesForCartLineItems] Not able to get cart OR channelConfiguration or no products in cart');\n return [];\n }\n\n if (cart && cart.Id && cart.CartLines && cart.CartLines.length > 0 && channelConfiguration) {\n for (const cartLine of cart.CartLines) {\n if (\n cartLine.DeliveryMode &&\n cartLine.DeliveryMode !== '' &&\n getDeliveryMode(cartLine, retailMultiplePickUpOptionEnabled, channelDeliveryOptionConfig, PickupDeliveryModeCode)\n ) {\n bopisItems.push(cartLine);\n } else if (EmailDeliveryModeCode === '' || cartLine.DeliveryMode !== EmailDeliveryModeCode) {\n shippingItems.push(cartLine);\n }\n }\n }\n\n if (shippingItems && shippingItems.length > 0) {\n let productIds = shippingItems.map(x => x.ProductId!);\n productIds = ArrayExtensions.unique(productIds);\n const searchCriteria = createInventoryAvailabilitySearchCriteria(ctx, productIds, true);\n const shippingProductAvailabilities = await getEstimatedAvailabilityAsync(\n { callerContext: ctx, bypassCache: 'get' },\n searchCriteria\n );\n\n if (\n shippingProductAvailabilities &&\n shippingProductAvailabilities.ProductWarehouseInventoryAvailabilities &&\n shippingProductAvailabilities.ProductWarehouseInventoryAvailabilities.length > 0\n ) {\n productAvailabilities = mapAggregatedProductInventoryInformation(ctx, shippingProductAvailabilities);\n }\n }\n\n if (bopisItems && bopisItems.length > 0) {\n const productWarehouses: ProductWarehouse[] = [];\n\n for (const bopisItem of bopisItems) {\n const productWarehouse: ProductWarehouse = {\n ProductId: bopisItem.ProductId,\n InventLocationId: bopisItem.WarehouseId\n };\n\n if (ctx.requestContext.channel && ctx.requestContext.channel.InventLocationDataAreaId) {\n productWarehouse.DataAreaId = ctx.requestContext.channel.InventLocationDataAreaId;\n }\n productWarehouses.push(productWarehouse);\n }\n const quantityUnitTypeSales: number = 2;\n const getProductWarehouseAvail = await getEstimatedProductWarehouseAvailabilityAsync(\n { callerContext: ctx, bypassCache: 'get', queryResultSettings: {} },\n productWarehouses,\n quantityUnitTypeSales\n );\n\n if (\n getProductWarehouseAvail &&\n getProductWarehouseAvail.ProductWarehouseInventoryAvailabilities &&\n getProductWarehouseAvail.ProductWarehouseInventoryAvailabilities.length > 0\n ) {\n const productWarehouseMapping = mapProductInventoryInformation(\n ctx,\n getProductWarehouseAvail?.ProductWarehouseInventoryAvailabilities\n );\n if (productWarehouseMapping && productWarehouseMapping.length > 0) {\n for (const item of productWarehouseMapping) {\n productAvailabilities.push(item);\n }\n }\n }\n }\n\n if (productAvailabilities && productAvailabilities.length > 0) {\n return productAvailabilities;\n }\n\n ctx.trace('[getAvailabilitiesForCartLineItems] unable to get availabilities for product');\n return [];\n}\n\nexport const getAvailabilitiesForCartLineItemsDataAction = createObservableDataAction({\n id: '@msdyn365-commerce-modules/retail-actions/get-availabilities-cartlines',\n action: >getAvailabilitiesForCartLineItems,\n input: createInput\n});\n\nexport default getAvailabilitiesForCartLineItemsDataAction;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nexport * from './event';\nexport * from './event-subscriber';\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport {\n CacheType,\n createObservableDataAction,\n getCatalogId,\n getMediaLocationsForProductAction,\n IAction,\n IActionContext,\n IActionInput,\n IAny,\n ICreateActionContext,\n IGeneric,\n MediaLocationsInput\n} from '@msdyn365-commerce/core';\nimport { AsyncResult, MediaLocation, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\nimport { getMediaLocationsAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/ProductsDataActions.g';\n\nimport getSelectedVariant, { SelectedVariantInput } from './get-selected-variant';\nimport { generateImageUrl, getSelectedProductIdFromActionInput } from './utilities';\nimport { QueryResultSettingsProxy } from './utilities/QueryResultSettingsProxy';\n\n/**\n * The action input class for the getMediaLocationsForSelectedVariant data action.\n */\nexport class MediaLocationsForSelectedVariantInput implements IActionInput {\n public productId: number;\n\n public channelId: number;\n\n public catalogId: number;\n\n public selectedProduct: SimpleProduct | undefined;\n\n constructor(productId: number, channelId: number, selectedProduct?: SimpleProduct, catalogId?: number) {\n this.productId = productId;\n this.channelId = channelId;\n this.catalogId = catalogId || 0;\n this.selectedProduct = selectedProduct;\n }\n\n public getCacheKey = () => 'MediaLocationsForSelectedVariant';\n\n public getCacheObjectType = () => 'MediaLocations';\n\n public dataCacheType = (): CacheType => 'none';\n}\n\n/**\n * The createInput method for the getMediaLocationsForSelectedVariant data action.\n * @param inputData The input data passed to the createInput method.\n */\nexport const createMediaLocationsForSelectedVariantInput = (\n inputData: ICreateActionContext>\n): MediaLocationsForSelectedVariantInput => {\n const productId = getSelectedProductIdFromActionInput(inputData);\n const catalogId = getCatalogId(inputData.requestContext);\n\n if (productId) {\n return new MediaLocationsForSelectedVariantInput(+productId, +inputData.requestContext.apiSettings.channelId, undefined, catalogId);\n }\n throw new Error('Unable to create MediaLocationsForSelectedVariantInput, no productId found on module config or query');\n};\n\n/**\n * The action method for the getMediaLocationsForSelectedVariant data action.\n * @param input\n * @param ctx\n */\nexport async function getMediaLocationsForSelectedVariantAction(\n input: MediaLocationsForSelectedVariantInput,\n ctx: IActionContext\n): Promise {\n return AsyncResult.resolve()\n .then(() => {\n const activeProduct: SimpleProduct | undefined = input.selectedProduct;\n\n if (!activeProduct) {\n const selectedVariantInput = new SelectedVariantInput(\n input.productId,\n input.channelId,\n undefined,\n undefined,\n ctx.requestContext\n );\n return getSelectedVariant(selectedVariantInput, ctx);\n }\n\n return activeProduct;\n })\n .then(productResult => {\n const activeProduct = productResult?.productVariant ?? productResult;\n\n if (activeProduct) {\n if (ctx.requestContext.app?.config?.OmniChannelMedia) {\n const mediaLocationsInput = new MediaLocationsInput(\n ctx.requestContext,\n activeProduct.RecordId,\n input.channelId,\n input.catalogId\n );\n return getMediaLocationsForProductAction(mediaLocationsInput, ctx);\n }\n return getMediaLocationsAsync(\n { callerContext: ctx, queryResultSettings: QueryResultSettingsProxy.getPagingFromInputDataOrDefaultValue(ctx) },\n activeProduct.RecordId,\n input.channelId,\n input.catalogId\n ).then(response => {\n return response.map(\n (mediaLocation: MediaLocation): MediaLocation => {\n mediaLocation.Uri = generateImageUrl(mediaLocation.Uri, ctx.requestContext.apiSettings);\n mediaLocation.AltText = mediaLocation.AltText ? mediaLocation.AltText : activeProduct.Name;\n return mediaLocation;\n }\n );\n });\n }\n\n return [];\n })\n .catch(error => {\n ctx.trace(error);\n ctx.telemetry.error(error.message);\n ctx.telemetry.debug('[getMediaLocationsForSelectedVariantAction]Error executing action');\n throw new Error('[getMediaLocationsForSelectedVariantAction]Error executing action');\n });\n}\n\n/**\n * The getMediaLocationsForSelectedVariant data action\n * Gets the currently selected variant for the page via the getSelectedVariant data action,\n * and then gets the media location information for the variant via the MediaLocations RetailServer API.\n */\nexport const getMediaLocationsForSelectedVariantActionDataAction = createObservableDataAction({\n id: '@msdyn365-commerce-modules/retail-actions/get-media-locations-for-selected-variant',\n action: >getMediaLocationsForSelectedVariantAction,\n input: createMediaLocationsForSelectedVariantInput\n});\n\nexport default getMediaLocationsForSelectedVariantActionDataAction;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport {\n createObservableDataAction,\n IAction,\n IActionContext,\n IActionInput,\n IAny,\n ICreateActionContext,\n IGeneric\n} from '@msdyn365-commerce/core';\nimport { SimpleProduct } from '@msdyn365-commerce/retail-proxy';\nimport { Image, ISubList, List } from '@msdyn365-commerce-modules/data-types';\n\nimport GetProducts, { ProductInput } from './get-simple-products';\n\n/**\n * List Input action.\n */\nexport class ListInput implements IActionInput {\n public DocumentId: string;\n\n public Title: string;\n\n public Description: string;\n\n public ShortDescription: string;\n\n public BackgroundColor: string;\n\n public ForegroundColor: string;\n\n public Images: Image[];\n\n public Items: (IProductItem[] | ISubList)[];\n\n public ProductItems: IProductItem[];\n\n public ItemsCount: number;\n\n public ItemsPerPage: number;\n\n public SkipCount: number;\n\n constructor(\n documentId: string,\n title: string,\n description: string,\n shortDescription: string,\n backgroundColor: string,\n foregroundColor: string,\n images: Image[],\n items: (IProductItem[] | ISubList)[],\n productItems: IProductItem[],\n itemsCount: number,\n itemsPerPage: number,\n skipCount: number\n ) {\n this.DocumentId = documentId;\n this.Title = title;\n this.Description = description;\n this.ShortDescription = shortDescription;\n this.BackgroundColor = backgroundColor;\n this.ForegroundColor = foregroundColor;\n this.Images = images;\n this.Items = items;\n this.ProductItems = productItems;\n this.ItemsCount = itemsCount;\n this.ItemsPerPage = itemsPerPage;\n this.SkipCount = skipCount;\n }\n\n public shouldCacheOutput = () => true;\n\n public getCacheObjectType = () => 'LIST';\n\n public getCacheKey = () => `${this.DocumentId}-${this.ItemsCount}-${this.ItemsPerPage}-${this.SkipCount}`;\n}\n\nexport interface IProductItem {\n RecordId: string;\n CatalogId: string;\n}\n\n/**\n * List item type enum.\n */\nenum ListItemType {\n list = 'list',\n product = 'product'\n}\n\n/**\n * Calls to getSimpleProducts to get product array by ID's in list.\n * @param input\n * @param ctx\n */\nexport async function getListData(input: ListInput, ctx: IActionContext): Promise {\n ctx.trace(`List Title: ${input.Title}`);\n\n const { apiSettings } = ctx.requestContext;\n\n const sublists: (SimpleProduct | ISubList)[] = [];\n const result: List = {\n Title: input.Title,\n Description: input.Description,\n ShortDescription: input.ShortDescription,\n BackgroundColor: input.BackgroundColor,\n ForegroundColor: input.ForegroundColor,\n Items: sublists,\n ItemsCount: input.ItemsCount\n };\n\n if (input && input.Items && input.Items.length > 0) {\n // Get all products\n let products: SimpleProduct[] = [];\n if (input.ProductItems && input.ProductItems.length > 0) {\n const inputArray = input.ProductItems.map(\n item => new ProductInput(+item.RecordId, apiSettings, undefined, undefined, ctx.requestContext)\n );\n products = await GetProducts(inputArray, ctx);\n }\n\n // Build map from recordId to product, which will be used later when build the output.\n const productMap: { [recordId: string]: SimpleProduct } = {};\n products.forEach(item => {\n if (item) {\n productMap[`${item.RecordId}`] = item;\n }\n });\n\n for (const listitem of input.Items) {\n if (isSublist(listitem)) {\n result.Items.push(listitem);\n } else {\n listitem.forEach(item => {\n if (productMap[item.RecordId]) {\n result.Items.push(productMap[item.RecordId]);\n }\n });\n }\n }\n }\n\n return result;\n}\n\n/**\n * Check if an item is sublist.\n * @param listItem\n */\nfunction isSublist(listItem: IProductItem[] | ISubList): listItem is ISubList {\n return (listItem).Images !== undefined;\n}\n\n/**\n * Get images.\n * @param images\n */\nfunction getImages(images: IGeneric[]): Image[] {\n const resultImageList: Image[] = [];\n\n if (!images) {\n return resultImageList;\n }\n\n images.forEach(item => {\n if (item && item.image && item.image.href) {\n // Add image item\n const imageItem: Image = {\n href: item.image.href,\n altText: item.image.altText,\n title: item.image.title,\n width: item.image.width,\n height: item.image.height\n };\n\n resultImageList.push(imageItem);\n }\n });\n\n return resultImageList;\n}\n\n/**\n * Get the url of sub list.\n * @param listName\n * @param sitePath\n */\nfunction getSubListUrl(listName: string, sitePath: string): string {\n if (!listName) {\n return '';\n }\n\n if (!sitePath) {\n return `/${listName}.l`;\n }\n\n // SitePath has a leading '/'\n return `${sitePath}/${listName}.l`;\n}\n\n/**\n * Get input list data.\n * @param inputData\n */\nfunction getInutListData(inputData: ICreateActionContext, IGeneric>): IGeneric {\n let listData =\n !inputData || !inputData.requestContext || !inputData.requestContext.pageData ? null : inputData.requestContext.pageData.list;\n if (\n !inputData ||\n !inputData.requestContext ||\n !inputData.requestContext.pageData ||\n !inputData.requestContext.pageData.list ||\n !inputData.requestContext.pageData.list.content ||\n !inputData.requestContext.pageData.list.content.items ||\n !inputData.requestContext.pageData.list.content.title ||\n !inputData.requestContext.pageData.list._id\n ) {\n if (\n !inputData ||\n !inputData.data ||\n !inputData.data.list ||\n !inputData.data.list.content ||\n !inputData.data.list.content.items ||\n !inputData.data.list.content.title ||\n !inputData.data.list._id\n ) {\n console.error('data is not well defined for list action input');\n throw new Error('data is not well defined for list action input');\n }\n\n listData = inputData.data.list;\n }\n return listData;\n}\n\n/**\n * Get sub list item.\n * @param item\n * @param sitePathOfRequest\n */\nfunction getSubListItem(item: IGeneric, sitePathOfRequest: string): ISubList {\n const imageList: Image[] = getImages(item.fields.content.images);\n\n const sublistHref = getSubListUrl(item.fields._name, sitePathOfRequest);\n return {\n Title: item.fields.content.title,\n Description: item.fields.content.description,\n ShortDescription: item.fields.content.shortDescription,\n BackgroundColor: item.fields.content.backgroundColor,\n ForegroundColor: item.fields.content.foregroundColor,\n Href: sublistHref,\n Images: imageList\n };\n}\n\n/**\n * Get site path.\n * @param inputData\n */\nfunction getSitePath(inputData: ICreateActionContext, IGeneric>): string {\n return inputData && inputData.requestContext && inputData.requestContext.sitePath ? inputData.requestContext.sitePath : '';\n}\n\n/**\n * Get items per page.\n * @param inputData\n */\nfunction getItemsPerPage(inputData: ICreateActionContext, IGeneric>): number {\n if (!inputData || !inputData.config || !inputData.config.itemsPerPage) {\n return 50;\n }\n\n const result = Number(inputData.config.itemsPerPage);\n if (isNaN(result)) {\n return 50;\n }\n\n return result;\n}\n\n/**\n * Get skip count.\n * @param inputData\n */\nfunction getSkipCount(inputData: ICreateActionContext, IGeneric>): number {\n return inputData && inputData.requestContext && inputData.requestContext.query && inputData.requestContext.query.skipCount\n ? Number(inputData.requestContext.query.skipCount)\n : 0;\n}\n\n/**\n * Creates the input required to make the list call to get products.\n * @param inputData\n */\nconst createListInput = (inputData: ICreateActionContext, IGeneric>): IActionInput => {\n const listData: IGeneric = getInutListData(inputData);\n const listItems: (IProductItem[] | ISubList)[] = [];\n let productList: IProductItem[] = [];\n\n const parentImageList: Image[] = getImages(listData.content.images);\n\n const itemsPerPage = getItemsPerPage(inputData);\n const skipCount = getSkipCount(inputData);\n\n // This is the list contains all product and will be used to call getSimpleProducts data action.\n const productItems: IProductItem[] = [];\n const sum = skipCount + itemsPerPage;\n for (let index = skipCount; index < listData.content.items.length && index < sum; index++) {\n const item = listData.content.items[index];\n if (item.type === ListItemType.list) {\n if (!item.fields || !item.fields.content || !item.fields.content.title) {\n console.error(`sublist item fields, content or title missing in list ${listData._id}`);\n continue;\n }\n\n // If any elements in product list, then copy it and add to list items\n if (productList.length > 0) {\n const clonedList = [...productList];\n listItems.push(clonedList);\n productList = [];\n }\n\n // Build and add sublist item\n listItems.push(getSubListItem(item, getSitePath(inputData)));\n }\n\n if (item.type === ListItemType.product) {\n if (!item.fields || !item.fields.recordId) {\n console.error(`product item missing recordId in list ${listData._id}`);\n continue;\n }\n\n // Add product item\n const productItem: IProductItem = {\n RecordId: item.fields.recordId,\n CatalogId: item.fields.catalogId || '0'\n };\n\n productList.push(productItem);\n productItems.push(productItem);\n }\n }\n\n // Save the last portion of product items.\n if (productList.length > 0) {\n listItems.push(productList);\n }\n\n return new ListInput(\n listData._id,\n listData.content.title,\n listData.content.description,\n listData.content.shortDescription,\n listData.content.backgroundColor,\n listData.content.foregroundColor,\n parentImageList,\n listItems,\n productItems,\n listData.content.items.length,\n itemsPerPage,\n skipCount\n );\n};\n\nexport const getListDataDataAction = createObservableDataAction({\n id: '@msdyn365-commerce-modules/retail-actions/get-list',\n action: >getListData,\n input: createListInput\n});\n\nexport default getListDataDataAction;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport {\n CacheType,\n createObservableDataAction,\n IAction,\n IActionContext,\n IActionInput,\n IAny,\n ICreateActionContext,\n IGeneric\n} from '@msdyn365-commerce/core';\nimport {\n ProductAvailableQuantity,\n ProductsDataActions,\n ProductType,\n ProductWarehouseInventoryAvailability,\n ReleasedProductType\n} from '@msdyn365-commerce/retail-proxy';\n\nimport getSelectedVariant, { SelectedVariantInput } from './get-selected-variant';\nimport { ArrayExtensions, getSelectedProductIdFromActionInput } from './utilities';\nimport { DeliveryMode, IProductInventoryInformation } from './utilities/product-inventory-information';\nimport { createInventoryAvailabilitySearchCriteria, mapAggregatedProductInventoryInformation } from './utilities/product-inventory-utils';\n\n/**\n * Input class for the getProductAvailabilitiesForSelectedVariant Data Action.\n */\nexport class ProductAvailabilitiesForSelectedVariantInput implements IActionInput {\n public productId: number;\n\n public channelId: number;\n\n public constructor(productId: number | string, channelId: number) {\n this.productId = typeof productId === 'string' ? +productId : productId;\n this.channelId = channelId;\n }\n\n /**\n * GetCacheKey.\n * @returns - Returns string.\n */\n public getCacheKey = (): string => 'ProductAvailabilitiesForSelectedVariant';\n\n /**\n * GetCacheObjectType.\n * @returns - Cache Object Type string.\n */\n public getCacheObjectType = (): string => 'ProductAvailabilities';\n\n /**\n * DataCacheType.\n * @returns - CacheType string.\n */\n public dataCacheType = (): CacheType => 'none';\n}\n\n/**\n * CreateInput method for the getProductAvailabilitiesForSelectedVariant data action.\n * @param inputData - The input data passed to the createInput method.\n * @returns - ProductAvailabilitiesForSelectedVariant or error.\n */\nexport const createProductAvailabilitiesForSelectedVariantInput = (\n inputData: ICreateActionContext>\n): ProductAvailabilitiesForSelectedVariantInput => {\n const productId = getSelectedProductIdFromActionInput(inputData);\n\n if (productId) {\n return new ProductAvailabilitiesForSelectedVariantInput(+productId, +inputData.requestContext.apiSettings.channelId);\n }\n throw new Error('Unable to create ProductAvailabilitiesForSelectedVariantInput, no productId found on module config or query');\n};\n\n/**\n * The action method for the getProductAvailabilitiesForSelectedVariant data action.\n * @param input - ProductAvailabilitiesForSelectedVariant.\n * @param ctx - Action Context.\n * @returns - Product inventory information.\n */\nexport async function getProductAvailabilitiesForSelectedVariantAction(\n input: ProductAvailabilitiesForSelectedVariantInput,\n ctx: IActionContext\n): Promise {\n const selectedVariantInput = new SelectedVariantInput(input.productId, input.channelId, undefined, undefined, ctx.requestContext);\n const productInventoryInformation: IProductInventoryInformation[] = [];\n\n try {\n const productResult = await getSelectedVariant(selectedVariantInput, ctx);\n\n // Don't get availability if it is service item && enableStockCheck is disbaled.\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- Reading config.\n if (\n ctx.requestContext.app.config.enableStockCheck &&\n productResult &&\n productResult.ItemTypeValue !== ReleasedProductType.Service &&\n productResult.ProductTypeValue !== ProductType.Master\n ) {\n const shippingSearchCriteria = createInventoryAvailabilitySearchCriteria(\n ctx,\n [productResult.RecordId],\n true,\n undefined,\n undefined,\n DeliveryMode.shipping\n );\n const pickupSearchCriteria = createInventoryAvailabilitySearchCriteria(\n ctx,\n [input.productId],\n false,\n true,\n undefined,\n DeliveryMode.pickup\n );\n const shippingAvailability = await ProductsDataActions.getEstimatedAvailabilityAsync(\n { callerContext: ctx },\n shippingSearchCriteria\n );\n if (shippingAvailability.ProductWarehouseInventoryAvailabilities) {\n const shippingInventory = mapAggregatedProductInventoryInformation(ctx, shippingAvailability);\n if (ArrayExtensions.hasElements(shippingInventory)) {\n shippingInventory[0].deliveryType = DeliveryMode.shipping;\n productInventoryInformation.push(shippingInventory[0]);\n }\n }\n const pickupAvailability = await ProductsDataActions.getEstimatedAvailabilityAsync(\n { callerContext: ctx },\n pickupSearchCriteria\n );\n if (pickupAvailability.ProductWarehouseInventoryAvailabilities) {\n const pickupInventory = mapAggregatedProductInventoryInformation(ctx, pickupAvailability);\n if (ArrayExtensions.hasElements(pickupInventory)) {\n pickupInventory[0].deliveryType = DeliveryMode.pickup;\n productInventoryInformation.push(pickupInventory[0]);\n }\n }\n return productInventoryInformation;\n }\n return undefined;\n } catch (error) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument -- cann't assign type to the error variable.\n ctx.telemetry.exception(error);\n ctx.telemetry.debug('[getPriceForSelectedVariantAction]Error executing action');\n return undefined;\n }\n}\n\n/**\n * The function that maps a ProductWareHouse object into a ProductAvailabilityQuantity.\n * @param productsWarehouseInventory - Product warehouse inventory.\n * @returns Product Available quantity.\n */\nexport function mergeProductWarehouseToProductAvailabities(\n productsWarehouseInventory: ProductWarehouseInventoryAvailability[]\n): ProductAvailableQuantity[] {\n const productAvailable: ProductAvailableQuantity[] = [];\n if (ArrayExtensions.hasElements(productsWarehouseInventory)) {\n for (const product of productsWarehouseInventory) {\n if (product.TotalAvailable !== undefined && product.ProductId !== undefined) {\n productAvailable.push({ ProductId: product.ProductId, AvailableQuantity: product.TotalAvailable });\n }\n }\n }\n return productAvailable;\n}\n\n/**\n * The complete getProductAvailabilitiesForSelectedVariant data action\n * Get the currently selected variant via the getSelectedVariant data action, and\n * then gets the availabilities for the variant via the getProductAvailabilities RetailServer API.\n */\nexport const getProductAvailabilitiesForSelectedVariantActionDataAction = createObservableDataAction({\n id: '@msdyn365-commerce-modules/retail-actions/get-product-availabilities-for-selected-variant',\n action: >getProductAvailabilitiesForSelectedVariantAction,\n input: createProductAvailabilitiesForSelectedVariantInput\n});\n\nexport default getProductAvailabilitiesForSelectedVariantActionDataAction;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport {\n CacheType,\n createObservableDataAction,\n IAction,\n IActionContext,\n IActionInput,\n ICreateActionContext\n} from '@msdyn365-commerce/core';\nimport { convertToString, IQueryResultSettings } from '@msdyn365-commerce/retail-proxy';\nimport { getCurrentAsync, getOrderHistoryAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/BusinessPartnersDataActions.g';\nimport { OrderShipments } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\n\nimport { QueryResultSettingsProxy } from './utilities/QueryResultSettingsProxy';\n\n/**\n * Input class for the GetOrganizationWideOrderHistory data action.\n */\nexport class GetOrganizationWideOrderHistoryInput implements IActionInput {\n public queryResultSettings: IQueryResultSettings;\n\n constructor(queryResultSettings: IQueryResultSettings) {\n this.queryResultSettings = queryResultSettings;\n }\n\n public getCacheKey = () => `GetOrganizationWideOrderHistoryInput|${convertToString(this.queryResultSettings)}`;\n\n public getCacheObjectType = () => 'GetOrganizationWideOrderHistoryInput';\n\n public dataCacheType = (): CacheType => 'request';\n}\n\n/**\n * CreateInput method for the GetOrganizationWideOrderHistory method.\n * @param {ICreateActionContext} inputData The input data passed to the createInput method.\n */\nexport const getOrganizationWideOrderHistoryInput = (inputData: ICreateActionContext): GetOrganizationWideOrderHistoryInput => {\n if (!inputData?.requestContext?.user?.isAuthenticated) {\n throw new Error('Unable to get order history. User is not authenticated.');\n }\n\n const queryResultSettings: IQueryResultSettings = QueryResultSettingsProxy.fromInputData(inputData).QueryResultSettings;\n return new GetOrganizationWideOrderHistoryInput(queryResultSettings);\n};\n\n/**\n * The action method for the GetOrganizationWideOrderHistory data action.\n * @param {GetOrganizationWideOrderHistory} input The action input.\n * @param {IActionContext} ctx The action context.\n * @param context\n */\nexport async function getOrganizationWideOrderHistory(\n input: GetOrganizationWideOrderHistoryInput,\n context: IActionContext\n): Promise {\n if (!context?.requestContext?.user?.isAuthenticated) {\n throw new Error('Unable to get order history. User is not authenticated.');\n }\n\n const businessPartner = await getCurrentAsync({ callerContext: context });\n if (!businessPartner) {\n throw new Error('Unable to get order history. Failed to retrieve business partner id.');\n }\n\n return getOrderHistoryAsync(\n { callerContext: context, queryResultSettings: input.queryResultSettings },\n businessPartner.BusinessPartnerId\n );\n}\n\nexport const getOrganizationWideOrderHistoryDataAction = createObservableDataAction({\n id: '@msdyn365-commerce-modules/retail-actions/get-organization-wide-order-history',\n action: >getOrganizationWideOrderHistory,\n input: getOrganizationWideOrderHistoryInput\n});\n\nexport default getOrganizationWideOrderHistoryDataAction;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { CategoryHierarchy } from '@msdyn365-commerce/commerce-entities';\nimport {\n CacheType,\n createObservableDataAction,\n getCatalogId,\n IAction,\n IActionContext,\n IActionInput,\n IAny,\n ICreateActionContext,\n IGeneric,\n IRequestContext\n} from '@msdyn365-commerce/core';\nimport { CategoriesDataActions } from '@msdyn365-commerce/retail-proxy';\nimport { generateCacheKey } from './utilities';\n\n/**\n * Input for get-categories data action.\n */\nexport class CategoriesInput implements IActionInput {\n public readonly maxItems: number;\n\n public readonly channelId: number;\n\n public readonly catalogId?: number;\n\n private readonly _requestContext: IRequestContext;\n\n private readonly _mappedToHierarchy: boolean;\n\n public constructor(context: IRequestContext, mappedToHierarchy: boolean, maxItems?: number) {\n this._requestContext = context;\n this._mappedToHierarchy = mappedToHierarchy;\n this.maxItems = maxItems || 250;\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- Required.\n this.channelId = context?.apiSettings?.channelId ? Number(context.apiSettings.channelId) : 0;\n this.catalogId = getCatalogId(context);\n }\n\n /**\n * Get Cache Key.\n * @returns - Cache key string.\n */\n public getCacheKey = (): string =>\n generateCacheKey(\n this._requestContext.apiSettings,\n { key: 'Top', value: this.maxItems },\n { key: 'CatalogId', value: this.catalogId }\n );\n\n /**\n * Get Cache type Name.\n * @returns - Cache name string.\n */\n public getCacheObjectType = (): string => (this._mappedToHierarchy ? 'CategoryHierarchy' : 'Category');\n\n /**\n * Get Cache type.\n * @returns - CacheType enum.\n */\n public dataCacheType = (): CacheType => 'application';\n}\n\n/**\n * Creates the input required to make the retail api call.\n * @param inputData -- Input data.\n * @returns -- IActionInput.\n */\nexport const createCategoriesInput = (inputData: ICreateActionContext>): IActionInput => {\n const topItems = inputData.config?.topCategories && Number.parseInt(inputData.config.topCategories, 10);\n return new CategoriesInput(inputData.requestContext, false, topItems);\n};\n\n/**\n * Calls the Retail API and returns all the categories as a flat list.\n * @param input - Input.\n * @param ctx - Context.\n * @returns - CategoryHierarchy.\n */\nexport async function getCategoryAction(input: CategoriesInput, ctx: IActionContext): Promise {\n return ((await CategoriesDataActions.getCategoriesAsync(\n {\n callerContext: ctx\n },\n input.channelId,\n input.catalogId\n )) as unknown) as CategoryHierarchy[];\n}\n\n/**\n * The getCategory Data Action.\n */\nexport const getCategoryActionDataAction = createObservableDataAction({\n id: '@msdyn365-commerce-modules/retail-actions/get-categories',\n action: getCategoryAction as IAction,\n input: createCategoriesInput\n});\n\nexport default getCategoryActionDataAction;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport {\n CacheType,\n createObservableDataAction,\n IAction,\n IActionContext,\n IActionInput,\n ICreateActionContext\n} from '@msdyn365-commerce/core';\nimport { updateProductListLinesAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/ProductListsDataActions.g';\nimport { ProductListLine } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\n\nimport getPaginatedOrderTemplateLines, { GetPaginatedOrderTemplateLinesInput } from './get-paginated-order-template-lines';\n\n/**\n * Input class for the UpdateOrderTemplate data action.\n */\nexport class UpdateOrderTemplateInput implements IActionInput {\n public readonly orderTemplateId: string;\n\n public readonly productId: number;\n\n public readonly quantity: number;\n\n public readonly unitOfMeasure: string;\n\n constructor(orderTemplateId: string, productId: number, quantity: number, unitOfMeasure: string) {\n this.orderTemplateId = orderTemplateId;\n this.productId = productId;\n this.quantity = quantity;\n this.unitOfMeasure = unitOfMeasure || 'ea';\n }\n\n public getCacheKey = () => 'UpdateOrderTemplateInput';\n\n public getCacheObjectType = () => 'UpdateOrderTemplateInput';\n\n public dataCacheType = (): CacheType => 'none';\n}\n\n/**\n * CreateInput method for the UpdateOrderTemplate method.\n * @param {ICreateActionContext} inputData The input data passed to the createInput method.\n * @param {string} orderTemplateId The id of order template to update.\n * @param {number} productId The id of a product to add.\n * @param {number} quantity How many items of this product to add.\n * @param unitOfMeasure\n */\nexport const updateOrderTemplateInput = (\n inputData: ICreateActionContext,\n orderTemplateId: string,\n productId: number,\n quantity: number,\n unitOfMeasure: string\n): UpdateOrderTemplateInput => {\n const { requestContext } = inputData;\n if (!requestContext.user.isAuthenticated) {\n throw new Error('Unable to create order template. User is not authenticated.');\n }\n return new UpdateOrderTemplateInput(orderTemplateId, productId, quantity, unitOfMeasure);\n};\n\n/**\n * The action method for the UpdateOrderTemplate data action.\n * @param {UpdateOrderTemplateInput} input The action input.\n * @param {IActionContext} ctx The action context.\n */\nexport async function updateOrderTemplateAction(input: UpdateOrderTemplateInput, ctx: IActionContext): Promise {\n try {\n if (!ctx.requestContext.user.isAuthenticated) {\n throw new Error('User token was not found when updating the order template');\n }\n const getLinesInput = new GetPaginatedOrderTemplateLinesInput(input.orderTemplateId, {}, input.productId.toString());\n const linesState = await getPaginatedOrderTemplateLines(getLinesInput, ctx);\n if (!linesState) {\n throw new Error('Order template was not found when updating the order template');\n }\n\n const linesToUpdate = linesState.lines.filter(line => line.productListLine.ProductId === input.productId);\n if (linesToUpdate.length !== 1) {\n throw new Error('Unable to find the line to update when updating the order template');\n }\n\n const lineToUpdate = linesToUpdate[0].productListLine;\n\n lineToUpdate.UnitOfMeasure = input.unitOfMeasure;\n lineToUpdate.Quantity = input.quantity;\n\n const updatedLines: ProductListLine[] = await updateProductListLinesAsync(\n {\n callerContext: ctx\n },\n input.orderTemplateId,\n [lineToUpdate]\n );\n\n if (!updatedLines || updatedLines.length !== 1) {\n throw new Error('Server returned invalid lines when updating order template');\n }\n const updatedLine = updatedLines.filter(line => line.ProductId === input.productId);\n if (\n updatedLine.length !== 1 ||\n updatedLine[0].Quantity !== input.quantity ||\n updatedLine[0].UnitOfMeasure !== input.unitOfMeasure\n ) {\n throw new Error('Server did not update the line when updating order template');\n }\n return updatedLine[0];\n } catch (error) {\n ctx.telemetry.error('Not able to add an item to order template', error);\n throw error;\n }\n}\n\n/**\n * The UpdateOrderTemplate Data Action.\n * Returns product list line that was added to the order template.\n */\nexport default createObservableDataAction({\n id: '@msdyn365-commerce-modules/retail-actions/order-templates/update-order-template-line',\n action: >updateOrderTemplateAction,\n input: updateOrderTemplateInput\n});\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { createObservableDataAction, IAction, IActionContext, IActionInput, IAny, ICreateActionContext } from '@msdyn365-commerce/core';\nimport { Address, Customer } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\n\nimport { createAddressManagementInput, doAddressManagementOperation, IAddressManagementInput } from './add-address';\n\n// TODO: Centralize this logic in a common utility area\nexport function updateAddressHandler(customer: Customer, address: Address): Customer {\n customer.Addresses = customer.Addresses || [];\n if (address.IsPrimary) {\n customer.Addresses.forEach(cur => (cur.IsPrimary = false));\n }\n customer.Addresses = [...customer.Addresses.filter(cur => cur.RecordId !== address.RecordId), address];\n return customer;\n}\n\nexport async function updateAddressAction(input: IAddressManagementInput, ctx: IActionContext): Promise {\n return doAddressManagementOperation(input, ctx, updateAddressHandler);\n}\n\n/**\n * The updateAddress data action\n * Calls the read RetailServer API to get information about a customer\n * Merge the passed address information with the address information from\n * the retireved customer, and then updates that customer via the update RetailServer API.\n */\nexport const updateAddressActionDataAction = createObservableDataAction({\n id: '@msdyn365-commerce-modules/retail-actions/update-address',\n action: >updateAddressAction,\n input: <(args: ICreateActionContext) => IActionInput>(createAddressManagementInput)\n});\n\nexport default updateAddressActionDataAction;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport {\n CacheType,\n createObservableDataAction,\n IAction,\n IActionContext,\n IActionInput,\n IAny,\n ICreateActionContext,\n IGeneric\n} from '@msdyn365-commerce/core';\nimport { Address, Customer } from '@msdyn365-commerce/retail-proxy';\nimport { createReadAsync, updateAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/CustomersDataActions.g';\n\nimport getCustomer, { GetCustomerInput } from './get-customer';\n\nexport interface IAddressManagementData {\n address: Address;\n}\nexport interface IAddressManagementInput extends IActionInput {\n address: Address;\n userAccountNumber?: string;\n}\n\n/**\n * The input class for the addAddress data action.\n */\nexport class AddressManagementInput implements IAddressManagementInput {\n public address: Address;\n\n public userAccountNumber?: string;\n\n constructor(address: Address, userAccountNumber?: string) {\n this.userAccountNumber = userAccountNumber;\n this.address = address;\n }\n\n public getCacheKey = () => 'AddAddress';\n\n public getCacheObjectType = () => 'AddAddress';\n\n public dataCacheType = (): CacheType => 'none';\n}\n\n/**\n * The createInput method for the addAddress data action.\n * @param inputData The input data passed to the createInput method.\n */\nexport const createAddressManagementInput = (\n inputData: ICreateActionContext, IAddressManagementData>\n): IAddressManagementInput => {\n if (inputData.requestContext.user.isAuthenticated) {\n throw new Error('User is not authenticated. Cannot call UpdateAddress API');\n }\n\n const { address } = inputData.data || { address: undefined };\n\n if (!address) {\n throw new Error('address is not provided. Cannot call UpdateAddress API');\n }\n\n return new AddressManagementInput(address);\n};\n\nexport async function doAddressManagementOperation(\n input: IAddressManagementInput,\n ctx: IActionContext,\n operationHandler: (customer: Customer, address: Address) => Customer\n): Promise {\n const { userAccountNumber, address } = input;\n const customerInput = new GetCustomerInput(ctx.requestContext.apiSettings, userAccountNumber, 'none');\n const customer = await getCustomer(customerInput, ctx);\n\n if (!customer) {\n throw new Error('Not able to create customer');\n }\n\n const newCustomer = operationHandler({ ...customer }, address);\n const updatedCustomer = await updateAsync({ callerContext: ctx }, newCustomer);\n\n if (!updatedCustomer) {\n throw new Error('Not able to update customer');\n }\n\n ctx.update(createReadAsync(updatedCustomer.AccountNumber), updatedCustomer);\n\n return updatedCustomer.Addresses || [];\n}\n\nexport function addAddressHandler(customer: Customer, address: Address): Customer {\n customer.Addresses = [...(customer.Addresses || [])];\n customer.Addresses.push(address);\n return customer;\n}\n\nexport async function addAddressAction(input: IAddressManagementInput, ctx: IActionContext): Promise {\n return doAddressManagementOperation(input, ctx, addAddressHandler);\n}\n\n/**\n * The addAddress data action\n * Calls the read RetailServer API to get information about a customer\n * Adds the passed address information to the retireved customer, and\n * then updates that customer via the update RetailServer API.\n */\nexport const addAddressActionDataAction = createObservableDataAction({\n id: '@msdyn365-commerce-modules/retail-actions/add-address',\n action: >addAddressAction,\n input: <(args: ICreateActionContext) => IActionInput>(createAddressManagementInput),\n isBatched: false\n});\n\nexport default addAddressActionDataAction;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IActionContext, IAny, ICreateActionContext, IGeneric } from '@msdyn365-commerce/core';\n\nexport const getRnrPartnerId = (args: ICreateActionContext> | IActionContext): string => {\n return args.requestContext.apiSettings.rnr.id || '';\n};\n\nexport const getRnrEndpointId = (args: ICreateActionContext> | IActionContext): string => {\n return args.requestContext.apiSettings.rnr.url || '';\n};\n\nexport const getRnrAuthEndpointId = (args: ICreateActionContext> | IActionContext): string => {\n const endpoint = args.requestContext.apiSettings.rnr.proxyUrl\n ? args.requestContext.apiSettings.rnr.proxyUrl\n : args.requestContext.apiSettings.rnr.url || '';\n if (endpoint.length > 0 && endpoint.endsWith('/')) {\n return endpoint.substring(0, endpoint.length - 1);\n }\n return endpoint;\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { createObservableDataAction, IAction, IAny, ICreateActionContext, IGeneric } from '@msdyn365-commerce/core';\nimport { IDataServiceRequest, retailAction } from '@msdyn365-commerce/retail-proxy/dist';\nimport { createSearchByTextInput } from '@msdyn365-commerce/retail-proxy/dist/DataActions/ProductsDataActions.g';\nimport { ProductSearchResult } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\n\nimport { QueryResultSettingsProxy } from './utilities/QueryResultSettingsProxy';\n\n/**\n * CreateInput method for the searchByText data action.\n * @param inputData\n */\nexport function createSearchByTextInputFunc(inputData: ICreateActionContext, IGeneric>): IDataServiceRequest {\n const {\n requestContext: {\n query,\n apiSettings: { channelId }\n }\n } = inputData;\n\n const search = query && query.q;\n\n if (!search) {\n throw new Error(\n 'Unable to preform search without search text. Query string ?q={searchText} must be present or should be configued in module data.'\n );\n }\n\n const querySettingsProxy = QueryResultSettingsProxy.fromInputData(inputData);\n return createSearchByTextInput(querySettingsProxy.QueryResultSettings, Number(channelId), 0, search);\n}\n\n/**\n * The searchByText data action\n * Queries RetailServers product searchByText API using a\n * query string parameter and returns a list of ProductSearchResults.\n */\nexport const retailActionDataAction = createObservableDataAction({\n id: '@msdyn365-commerce-modules/retail-actions/search-by-text',\n action: >retailAction,\n input: createSearchByTextInputFunc\n});\n\nexport default retailActionDataAction;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport {\n CacheType,\n createObservableDataAction,\n IAction,\n IActionContext,\n IActionInput,\n IAny,\n ICommerceApiSettings,\n ICreateActionContext,\n IGeneric\n} from '@msdyn365-commerce/core';\nimport { SortColumn } from '@msdyn365-commerce/retail-proxy';\nimport { getSearchConfigurationAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/StoreOperationsDataActions.g';\n\nimport { buildCacheKey } from '.';\n\n// TODO: import from commerce entities when available\n// eslint-disable-next-line @typescript-eslint/naming-convention\ninterface SearchConfiguration {\n ProductSortColumns?: SortColumn[];\n}\n\n/**\n * Action Input class for the getSearchConfiguration data action.\n */\nexport class SearchConfigurationInput implements IActionInput {\n private readonly apiSettings: ICommerceApiSettings;\n\n constructor(apiSettings: ICommerceApiSettings) {\n this.apiSettings = apiSettings;\n }\n\n public getCacheKey = () => buildCacheKey('SearchConfig', this.apiSettings);\n\n public getCacheObjectType = () => 'SearchConfiguration';\n\n public dataCacheType = (): CacheType => 'request';\n}\n\n/**\n * Creates the input required to make the retail api call.\n * @param inputData\n */\nexport const createSearchConfigurationInput = (inputData: ICreateActionContext>): IActionInput => {\n return new SearchConfigurationInput(inputData.requestContext.apiSettings);\n};\n\n/**\n * Calls the Retail API.\n * @param input\n * @param ctx\n */\nexport async function getSearchConfigurationAction(input: SearchConfigurationInput, ctx: IActionContext): Promise {\n return getSearchConfigurationAsync({ callerContext: ctx });\n}\n\nexport const getSearchConfigurationActionDataAction = createObservableDataAction({\n id: '@msdyn365-commerce-modules/retail-actions/get-search-configurations',\n action: >getSearchConfigurationAction,\n input: createSearchConfigurationInput\n});\n\nexport default getSearchConfigurationActionDataAction;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport {\n CacheType,\n createObservableDataAction,\n getCatalogId,\n IAction,\n IActionContext,\n IActionInput,\n IAny,\n ICreateActionContext,\n IGeneric\n} from '@msdyn365-commerce/core';\nimport { AttributeValue, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\nimport { getAttributeValuesAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/ProductsDataActions.g';\n\nimport { getSelectedProductIdFromActionInput, SelectedVariantInput } from '.';\nimport { getSelectedVariantActionDataAction } from './get-selected-variant';\nimport { QueryResultSettingsProxy } from './utilities/QueryResultSettingsProxy';\n\n/**\n * Chains getting the SelectedVariant with GetActivePrice.\n */\nexport class AttributesForSelectedVariantInput implements IActionInput {\n public productId: number;\n\n public channelId: number;\n\n public catalogId: number;\n\n public selectedProduct: SimpleProduct | undefined;\n\n constructor(productId: number, channelId: number, selectedProduct?: SimpleProduct, catalogId?: number) {\n this.productId = productId;\n this.channelId = channelId;\n this.selectedProduct = selectedProduct;\n this.catalogId = catalogId || 0;\n }\n\n public getCacheKey = () => 'AttributesForSelectedVariant';\n\n public getCacheObjectType = () => 'ProductAttributeValue';\n\n public dataCacheType = (): CacheType => 'none';\n}\n\nexport const createAttributesForSelectedVariantInput = (\n inputData: ICreateActionContext>\n): AttributesForSelectedVariantInput => {\n const productId = getSelectedProductIdFromActionInput(inputData);\n const catalogId = getCatalogId(inputData.requestContext);\n\n if (productId) {\n return new AttributesForSelectedVariantInput(+productId, +inputData.requestContext.apiSettings.channelId, undefined, catalogId);\n }\n throw new Error('Unable to create PriceForSelectedVariantInput, no productId found on module config or query');\n};\n\n/**\n * Calls the Retail API a get a list of dimension values for a given product.\n * @param input\n * @param ctx\n */\nexport async function getAttributesForSelectedVariantAction(\n input: AttributesForSelectedVariantInput,\n ctx: IActionContext\n): Promise {\n return Promise.resolve()\n .then(() => {\n const activeProduct: SimpleProduct | undefined = input.selectedProduct;\n\n if (!activeProduct) {\n const selectedVariantInput = new SelectedVariantInput(\n input.productId,\n input.channelId,\n undefined,\n undefined,\n ctx.requestContext\n );\n\n return getSelectedVariantActionDataAction(selectedVariantInput, ctx);\n }\n\n return activeProduct;\n })\n .then((productResult: SimpleProduct | null) => {\n const activeProduct: SimpleProduct | undefined = productResult;\n\n if (activeProduct) {\n return getAttributeValuesAsync(\n {\n callerContext: ctx,\n queryResultSettings: QueryResultSettingsProxy.getPagingFromInputDataOrDefaultValue(ctx)\n },\n activeProduct.RecordId,\n input.channelId,\n input.catalogId\n );\n }\n\n return null;\n })\n .then((attributeValues: AttributeValue[] | null) => {\n const resultArray = attributeValues;\n if (resultArray) {\n return resultArray;\n }\n\n return [];\n })\n .catch((error: Error) => {\n ctx.trace(error.message);\n ctx.telemetry.exception(error);\n ctx.telemetry.debug('[getPriceForSelectedVariantAction]Error executing action');\n throw new Error('[getPriceForSelectedVariantAction]Error executing action');\n });\n}\n\nexport const getAttributesForSelectedVariantActionDataAction = createObservableDataAction({\n id: '@msdyn365-commerce-modules/retail-actions/get-attributes-for-selected-variant',\n action: >getAttributesForSelectedVariantAction,\n input: createAttributesForSelectedVariantInput\n});\n\nexport default getAttributesForSelectedVariantActionDataAction;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport {\n AsyncResult,\n CacheType,\n createObservableDataAction,\n IAction,\n IActionContext,\n IActionInput,\n ICreateActionContext\n} from '@msdyn365-commerce/core';\nimport { IQueryResultSettings } from '@msdyn365-commerce/retail-proxy';\nimport { ProductList } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\n\nimport {\n getOrderTemplates,\n GetOrderTemplatesInput,\n getPaginatedOrderTemplateLinesAction,\n GetPaginatedOrderTemplateLinesInput,\n QueryResultSettingsProxy\n} from '..';\nimport { IOrderTemplateLinesState, OrderTemplate } from '../utilities/order-templates';\n\n/**\n * Input class for the GetOrderTemplates data action.\n */\nexport class GetFullOrderTemplatesInput implements IActionInput {\n public queryResultSettings: IQueryResultSettings;\n public getPrice?: boolean;\n public getRating?: boolean;\n\n constructor(queryResultSettings: IQueryResultSettings, getPrices = true, getRatings = true) {\n this.queryResultSettings = queryResultSettings;\n this.getPrice = getPrices;\n this.getRating = getRatings;\n }\n\n public getCacheKey = () => 'GetFullOrderTemplates';\n\n public getCacheObjectType = () => 'GetFullOrderTemplates';\n\n public dataCacheType = (): CacheType => 'none';\n}\n\n/**\n * CreateInput method for the GetOrderTemplate method.\n * @param inputData The input data passed to the createInput method.\n */\nexport const createGetFullOrderTemplatesInput = (inputData: ICreateActionContext): GetFullOrderTemplatesInput => {\n const { requestContext } = inputData;\n if (!requestContext.user.isAuthenticated) {\n throw new Error('Unable to get full order templates. User is not authenticated.');\n }\n\n const queryResultSettings: IQueryResultSettings = QueryResultSettingsProxy.fromInputData(inputData).QueryResultSettings;\n queryResultSettings.count = true;\n\n return new GetFullOrderTemplatesInput(queryResultSettings);\n};\n\n/**\n * The action method for the GetFullOrderTemplates data action.\n * @param input The action input.\n * @param ctx The action context.\n */\nexport async function getFullOrderTemplatesAction(input: GetFullOrderTemplatesInput, ctx: IActionContext): Promise {\n if (!ctx.requestContext.user.isAuthenticated) {\n throw new Error('Unable to get full order templates. User is not authenticated.');\n }\n\n const orderTemplates: OrderTemplate[] = [];\n\n const inputParams = new GetOrderTemplatesInput();\n const productLists: ProductList[] = await getOrderTemplates(inputParams, ctx);\n\n if (!productLists || productLists.length === 0) {\n return orderTemplates;\n }\n\n const inputLinesRequests: AsyncResult[] = [];\n\n // Preparing requests for parallel queries.\n for (const list of productLists) {\n const inputLines = new GetPaginatedOrderTemplateLinesInput(\n list.Id,\n input.queryResultSettings,\n undefined,\n input.getPrice,\n input.getRating\n );\n\n inputLinesRequests.push(getPaginatedOrderTemplateLinesAction(inputLines, ctx));\n }\n\n const inputLinesResponses = await Promise.all(inputLinesRequests);\n\n for (const list of productLists) {\n const productLinesResponse = inputLinesResponses.filter(\n x => x.lines.length > 0 && x.lines[0].productListLine.ProductListId === list.Id\n );\n\n // Lines exist for this product\n if (productLinesResponse.length > 0) {\n orderTemplates.push(new OrderTemplate(list, productLinesResponse[0].lines, productLinesResponse[0].totalCount));\n } else {\n // Add empty order template\n orderTemplates.push(new OrderTemplate(list, [], 0));\n }\n }\n\n ctx.trace(orderTemplates.length.toString());\n return orderTemplates;\n}\n\n/**\n * The GetFullOrderTemplates Data Action\n * Returns order templates.\n */\nexport const getFullOrderTemplatesActionDataAction = createObservableDataAction({\n id: '@msdyn365-commerce-modules/retail-actions/order-templates/get-full-order-templates',\n action: >getFullOrderTemplatesAction,\n input: createGetFullOrderTemplatesInput\n});\n\nexport default getFullOrderTemplatesActionDataAction;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport {\n CacheType,\n createObservableDataAction,\n IAction,\n IActionContext,\n IActionInput,\n ICreateActionContext\n} from '@msdyn365-commerce/core';\nimport { ProductListLine, ProductListsDataActions } from '@msdyn365-commerce/retail-proxy';\n\nimport { ArrayExtensions } from './utilities';\n\n/**\n * Input class for the AddItemToProductList data action.\n */\nexport class AddItemToProductListInput implements IActionInput {\n public readonly productListId: string;\n\n public readonly productId: number;\n\n public readonly quantity: number;\n\n public readonly unitOfMeasure: string;\n\n public constructor(productListId: string, productId: number, quantity: number, unitOfMeasure: string) {\n this.productListId = productListId;\n this.productId = productId;\n this.quantity = quantity;\n this.unitOfMeasure = unitOfMeasure || 'ea';\n }\n\n /**\n * Get Cache Key.\n * @returns - Cache key string.\n */\n public getCacheKey = (): string => 'AddItemToProductListInput';\n\n /**\n * Get Cachetype Name.\n * @returns - Cache name string.\n */\n public getCacheObjectType = (): string => 'AddItemToProductListInput';\n\n /**\n * Get Cachetype.\n * @returns - CacheType enum.\n */\n public dataCacheType = (): CacheType => 'none';\n}\n\n/**\n * CreateInput method for the AddItemToProductList method.\n * @param inputData - The input data passed to the createInput method.\n * @param productListId - The id of product list to update.\n * @param productId - The id of a product to add.\n * @param quantity - How many items of this product to add.\n * @param unitOfMeasure - Product measuring unit.\n * @returns - Input data for productlist add api.\n */\nexport const addItemToProductListInput = (\n inputData: ICreateActionContext,\n productListId: string,\n productId: number,\n quantity: number,\n unitOfMeasure: string\n): AddItemToProductListInput => {\n const { requestContext } = inputData;\n if (!requestContext.user.isAuthenticated) {\n throw new Error('Unable to create product list. User is not authenticated.');\n }\n return new AddItemToProductListInput(productListId, productId, quantity, unitOfMeasure);\n};\n\n/**\n * The action method for the AddItemToProductList data action.\n * @param input - The action input.\n * @param context - The action context.\n * @returns - ProductList.\n */\nexport async function addItemToProductListAction(input: AddItemToProductListInput, context: IActionContext): Promise {\n try {\n const productListLineToAdd: ProductListLine = {\n ProductListId: input.productListId,\n ProductId: input.productId,\n Quantity: input.quantity,\n UnitOfMeasure: input.unitOfMeasure\n };\n\n const productListLine: ProductListLine[] = await ProductListsDataActions.addProductListLinesAsync(\n {\n callerContext: context\n },\n input.productListId,\n [productListLineToAdd]\n );\n\n if (ArrayExtensions.hasElements(productListLine) && productListLine[0].ProductListId) {\n return productListLine[0];\n }\n context.telemetry.error('Product list line was not returned when adding it to quick order bag');\n throw new Error('Product list line was not returned when adding it to quick order bag');\n } catch (error) {\n context.telemetry.error('Not able to add an item to quick order bag', error);\n throw error;\n }\n}\n\n/**\n * The AddItemToOrderTemplate Data Action.\n * Returns product list line that was added to the order template.\n */\nexport const addItemToProductListActionDataAction = createObservableDataAction({\n id: '@msdyn365-commerce-modules/retail-actions/add-item-to-product-list',\n action: addItemToProductListAction as IAction,\n input: addItemToProductListInput\n});\n\nexport default addItemToProductListActionDataAction;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { createObservableDataAction, IAction, IActionContext, IActionInput, IAny, ICreateActionContext } from '@msdyn365-commerce/core';\nimport { readAsync, updateAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/CustomersDataActions.g';\nimport { Address, Customer } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\n\nimport { createAddressManagementInput, IAddressManagementInput } from './add-address';\nimport { GetCustomerInput } from './get-customer';\n\nexport function updatePrimaryAddressHandler(customer: Customer, address: Address): Customer {\n customer.Addresses = setPrimaryAddress({ ...address }, [...(customer.Addresses || [])]);\n return customer;\n}\n\nexport async function updatePrimaryAddressAction(input: IAddressManagementInput, ctx: IActionContext): Promise {\n const { address } = input;\n\n const customer = await readAsync({ callerContext: ctx, bypassCache: 'get' }, '');\n\n if (!customer) {\n throw new Error('Unable to find customer');\n }\n\n customer.Addresses = setPrimaryAddress({ ...address }, [...(customer.Addresses ?? [])]);\n const updatedCustomer = await updateAsync({ callerContext: ctx }, customer);\n\n if (!updatedCustomer) {\n throw new Error('Unable to update customer');\n }\n\n ctx.update(new GetCustomerInput(ctx.requestContext.apiSettings), updatedCustomer);\n\n return updatedCustomer.Addresses || [];\n}\n\n/**\n * The updatePrimaryAddress data action\n * Calls the read RetailServer API to get information about a customer\n * Merge the passed address information with the address information from\n * the retireved customer, and then updates that customer via the update RetailServer API.\n */\nexport const updatePrimaryAddressActionDataAction = createObservableDataAction({\n id: '@msdyn365-commerce-modules/retail-actions/update-primary-address',\n action: >updatePrimaryAddressAction,\n input: <(args: ICreateActionContext) => IActionInput>(createAddressManagementInput),\n isBatched: false\n});\nexport default updatePrimaryAddressActionDataAction;\n\nconst setPrimaryAddress = (primaryAddresses: Address, addresses: Address[]): Address[] => {\n return addresses.map(addr => {\n if (addr.RecordId === primaryAddresses.RecordId) {\n addr.IsPrimary = true;\n } else {\n addr.IsPrimary = false;\n }\n return addr;\n });\n};\n"],"sourceRoot":""}