{"version":3,"file":"static/js/b64490b6697142a258a7.bundle.js","mappings":"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","sources":["webpack://Msdyn365.Commerce.Online/./src/modules/media-gallery/media-gallery.props.autogenerated.ts?53ce","webpack://Msdyn365.Commerce.Online/./src/modules/media-gallery/utils/helper.ts?bc0e","webpack://Msdyn365.Commerce.Online/./src/modules/media-gallery/utils/get-valid-product-images.ts?e579","webpack://Msdyn365.Commerce.Online/./src/modules/media-gallery/media-gallery.tsx?d0cb","webpack://Msdyn365.Commerce.Online/./src/modules/media-gallery/media-gallery.view.tsx?d842","webpack://Msdyn365.Commerce.Online/./lib/media-gallery/module-registration.js?47e5","webpack://Msdyn365.Commerce.Online/./node_modules/@msdyn365-commerce-modules/media-gallery/node_modules/@msdyn365-commerce-modules/utilities/src/common/utilities.ts?d19b","webpack://Msdyn365.Commerce.Online/./node_modules/@msdyn365-commerce-modules/media-gallery/node_modules/@msdyn365-commerce-modules/utilities/src/fade/Fade.tsx?1d73","webpack://Msdyn365.Commerce.Online/../../../../src/utilities/extensions/object-extensions.ts?6388","webpack://Msdyn365.Commerce.Online/../../../../src/utilities/extensions/array-extensions.ts?1a2a","webpack://Msdyn365.Commerce.Online/../../../../src/utilities/extensions/enum-extensions.ts?cf51","webpack://Msdyn365.Commerce.Online/../../../../src/utilities/extensions/string-extensions.ts?ab9f","webpack://Msdyn365.Commerce.Online/../../../src/utilities/QueryResultSettingsProxy.ts?5e44","webpack://Msdyn365.Commerce.Online/../../../src/utilities/input-data-parser.ts?027a","webpack://Msdyn365.Commerce.Online/../../../src/utilities/utils.ts?fbc0","webpack://Msdyn365.Commerce.Online/../../src/get-customer.ts?8319","webpack://Msdyn365.Commerce.Online/../../src/add-address.ts?fb17","webpack://Msdyn365.Commerce.Online/../../../src/utilities/product-inventory-information.ts?0ec6","webpack://Msdyn365.Commerce.Online/../../../../src/utilities/promise-queue/finite-promise-queue.ts?77bf","webpack://Msdyn365.Commerce.Online/../../../../src/utilities/random/guid.ts?1947","webpack://Msdyn365.Commerce.Online/../../../../src/utilities/random/index.ts?1f9d","webpack://Msdyn365.Commerce.Online/../../../../src/utilities/regex/email-regex.ts?6a6a","webpack://Msdyn365.Commerce.Online/../../src/add-item-to-product-list.ts?580e","webpack://Msdyn365.Commerce.Online/../../src/add-organization-user.ts?ed86","webpack://Msdyn365.Commerce.Online/../../src/checkout.ts?57e0","webpack://Msdyn365.Commerce.Online/../../src/create-product-list.ts?7367","webpack://Msdyn365.Commerce.Online/../../src/delete-address.ts?f9a3","webpack://Msdyn365.Commerce.Online/../../src/delete-organization-user.ts?7f5d","webpack://Msdyn365.Commerce.Online/../../src/edit-organization-user.ts?d2ac","webpack://Msdyn365.Commerce.Online/../../src/get-address.ts?20a3","webpack://Msdyn365.Commerce.Online/../../src/get-attribute-definitions.ts?cc6b","webpack://Msdyn365.Commerce.Online/../../../src/utilities/product-inventory-utils.ts?58b5","webpack://Msdyn365.Commerce.Online/../../src/get-selected-variant.ts?f0c0","webpack://Msdyn365.Commerce.Online/../../src/get-attributes-for-selected-variant.ts?af00","webpack://Msdyn365.Commerce.Online/./src/cart-state/add-product-to-cart.ts?85ba","webpack://Msdyn365.Commerce.Online/./src/cart-state/add-promo-code.ts?2e69","webpack://Msdyn365.Commerce.Online/./node_modules/@msdyn365-commerce-modules/media-gallery/node_modules/@msdyn365-commerce/global-state/node_modules/tslib/tslib.es6.js?9bb5","webpack://Msdyn365.Commerce.Online/./src/global-state/global-state.ts?008e","webpack://Msdyn365.Commerce.Online/./src/cart-state/clear-cart-line-delivery-mode.ts?86b9","webpack://Msdyn365.Commerce.Online/./src/cart-state/get-or-create-active-cart.ts?26ce","webpack://Msdyn365.Commerce.Online/./src/cart-state/set-invoice-line-price.ts?9cb9","webpack://Msdyn365.Commerce.Online/./src/cart-state/update-cart-line-delivery-specifications.ts?6d68","webpack://Msdyn365.Commerce.Online/./src/cart-state/update-cart-line-quantity.ts?a037","webpack://Msdyn365.Commerce.Online/./src/cart-state/update-shipping-address.ts?4d06","webpack://Msdyn365.Commerce.Online/./src/cart-state/base-cart-state.ts?592c","webpack://Msdyn365.Commerce.Online/./src/cart-state/refresh-cart.ts?3943","webpack://Msdyn365.Commerce.Online/./src/cart-state/add-invoices-to-cart.ts?cb4a","webpack://Msdyn365.Commerce.Online/./src/cart-state/add-order-invoice-to-cart.ts?d6f8","webpack://Msdyn365.Commerce.Online/./src/cart-state/remove-cart-lines.ts?2e16","webpack://Msdyn365.Commerce.Online/./src/cart-state/clear-cart-lines-delivery-information.ts?527a","webpack://Msdyn365.Commerce.Online/./src/cart-state/update-loyalty-card-id.ts?c304","webpack://Msdyn365.Commerce.Online/./src/cart-state/remove-promo-codes.ts?ffc1","webpack://Msdyn365.Commerce.Online/./src/cart-state/remove-all-promo-codes.ts?1bb2","webpack://Msdyn365.Commerce.Online/./src/cart-state/update-receipt-email.ts?a0ea","webpack://Msdyn365.Commerce.Online/./src/cart-state/update-cart.ts?8850","webpack://Msdyn365.Commerce.Online/./src/cart-state/update-cart-lines.ts?cd2f","webpack://Msdyn365.Commerce.Online/./src/data-actions/global-state-data-action.ts?901a","webpack://Msdyn365.Commerce.Online/./src/global-state/i-global-state.ts?6850","webpack://Msdyn365.Commerce.Online/./src/data-actions/cart-state-data-action.ts?5695","webpack://Msdyn365.Commerce.Online/./src/data-actions/get-cart-state.ts?4428","webpack://Msdyn365.Commerce.Online/./src/data-actions/get-checkout-cart.ts?2235","webpack://Msdyn365.Commerce.Online/./src/checkout-state/base-checkout-cart-state.ts?509c","webpack://Msdyn365.Commerce.Online/./src/checkout-state/checkout-state-storage.ts?b049","webpack://Msdyn365.Commerce.Online/./src/checkout-state/base-checkout-state.ts?a438","webpack://Msdyn365.Commerce.Online/./src/data-actions/checkout-state-data-action.ts?ad58","webpack://Msdyn365.Commerce.Online/./src/data-actions/get-cart-state-data-action.ts?9f8e","webpack://Msdyn365.Commerce.Online/./src/state-interfaces/checkout-state-enums.ts?13e8","webpack://Msdyn365.Commerce.Online/../../src/get-feature-state.ts?1a1d","webpack://Msdyn365.Commerce.Online/../../src/get-availabilities-cartlines.ts?b8e8","webpack://Msdyn365.Commerce.Online/../../src/get-catalogs.ts?7332","webpack://Msdyn365.Commerce.Online/../../src/get-categories.ts?8dc6","webpack://Msdyn365.Commerce.Online/../../../../src/utilities/Url-builder/parameterize.ts?f5a5","webpack://Msdyn365.Commerce.Online/../../../../src/utilities/Url-builder/category-url-builder.ts?e564","webpack://Msdyn365.Commerce.Online/../../src/get-categories-hierarchy.ts?acde","webpack://Msdyn365.Commerce.Online/../../src/get-category-paths.ts?b007","webpack://Msdyn365.Commerce.Online/../../src/get-channel-delivery-option-configuration.ts?a716","webpack://Msdyn365.Commerce.Online/../../src/get-checkout-cart.ts?79bc","webpack://Msdyn365.Commerce.Online/../../src/get-current-category.ts?354d","webpack://Msdyn365.Commerce.Online/../../src/get-current-category-hierarchy.ts?d48e","webpack://Msdyn365.Commerce.Online/../../src/get-customer-balance.ts?d165","webpack://Msdyn365.Commerce.Online/../../src/get-customer-loyalty-cards.ts?2466","webpack://Msdyn365.Commerce.Online/../../src/get-delivery-options-for-cartlines.ts?4dfe","webpack://Msdyn365.Commerce.Online/../../src/get-delivery-options-for-selected-variant.ts?3f6c","webpack://Msdyn365.Commerce.Online/../../src/get-dimension-availabilities-for-products.ts?f656","webpack://Msdyn365.Commerce.Online/../../src/get-dimension-availabilities-for-product-search-result.ts?5259","webpack://Msdyn365.Commerce.Online/../../src/get-dimensions-for-selected-variant.ts?6bf4","webpack://Msdyn365.Commerce.Online/../../src/get-full-available-inventory-nearby.ts?20be","webpack://Msdyn365.Commerce.Online/../../src/get-product-list.ts?ef13","webpack://Msdyn365.Commerce.Online/../../src/get-simple-products.ts?fed7","webpack://Msdyn365.Commerce.Online/../../src/get-full-products.ts?ba9a","webpack://Msdyn365.Commerce.Online/../../../src/utilities/quick-order-template-line.ts?56d5","webpack://Msdyn365.Commerce.Online/../../src/get-product-list-lines.ts?ae74","webpack://Msdyn365.Commerce.Online/../../../src/utilities/quick-order-templates.ts?0ea6","webpack://Msdyn365.Commerce.Online/../../src/get-full-product-list.ts?ccfb","webpack://Msdyn365.Commerce.Online/../../src/get-full-products-by-refine-search-category.ts?30ab","webpack://Msdyn365.Commerce.Online/../../src/get-full-products-by-refine-search-text.ts?2ad7","webpack://Msdyn365.Commerce.Online/../../../src/utilities/refiner-utils.ts?1e61","webpack://Msdyn365.Commerce.Online/../../src/get-items-in-wishlist.ts?0d27","webpack://Msdyn365.Commerce.Online/../../src/get-list.ts?4fd5","webpack://Msdyn365.Commerce.Online/../../src/get-loyalty-card.ts?7213","webpack://Msdyn365.Commerce.Online/../../src/get-loyalty-transaction-estimation.ts?e254","webpack://Msdyn365.Commerce.Online/../../src/get-media-locations-by-id.ts?8462","webpack://Msdyn365.Commerce.Online/../../src/get-media-locations-for-selected-variant.ts?fd54","webpack://Msdyn365.Commerce.Online/../../src/get-additional-media-locations-for-selected-variant.ts?fe77","webpack://Msdyn365.Commerce.Online/../../src/get-order-history.ts?76fd","webpack://Msdyn365.Commerce.Online/../../src/get-org-unit-configuration.ts?4793","webpack://Msdyn365.Commerce.Online/../../src/get-organization-users.ts?b72e","webpack://Msdyn365.Commerce.Online/../../src/get-organization-users-count.ts?b5f7","webpack://Msdyn365.Commerce.Online/../../src/get-organization-wide-order-history.ts?92b8","webpack://Msdyn365.Commerce.Online/../../src/get-pickup-options-for-cartlines.ts?843b","webpack://Msdyn365.Commerce.Online/../../src/get-price-for-product-search-result.ts?36f8","webpack://Msdyn365.Commerce.Online/../../src/get-price-for-selected-variant.ts?9e79","webpack://Msdyn365.Commerce.Online/../../src/get-product-availabilities-for-selected-variant.ts?0abd","webpack://Msdyn365.Commerce.Online/../../src/get-products-by-category.ts?accf","webpack://Msdyn365.Commerce.Online/../../src/get-products-in-active-cart.ts?3376","webpack://Msdyn365.Commerce.Online/../../src/get-promotion-options-for-cartlines.ts?1a35","webpack://Msdyn365.Commerce.Online/../../src/get-ratings-summary.ts?49bc","webpack://Msdyn365.Commerce.Online/../../../src/utilities/getRnrKeys.ts?700f","webpack://Msdyn365.Commerce.Online/../../src/get-ratings-summary-input.ts?3ccb","webpack://Msdyn365.Commerce.Online/../../src/get-refiners-by-category.ts?6d4e","webpack://Msdyn365.Commerce.Online/../../src/get-refiners-by-text.ts?c52a","webpack://Msdyn365.Commerce.Online/../../src/get-related-products.ts?6f93","webpack://Msdyn365.Commerce.Online/../../src/get-scan-results.ts?6b44","webpack://Msdyn365.Commerce.Online/../../src/get-search-configuration.ts?acd1","webpack://Msdyn365.Commerce.Online/../../src/get-store-location-information.ts?1df0","webpack://Msdyn365.Commerce.Online/../../src/get-wishlist-by-customer-id.ts?e873","webpack://Msdyn365.Commerce.Online/../../../src/invoices/get-invoice-details.ts?66a9","webpack://Msdyn365.Commerce.Online/../../../src/invoices/get-invoices.ts?22cb","webpack://Msdyn365.Commerce.Online/../../src/issue-loyalty.ts?f8fa","webpack://Msdyn365.Commerce.Online/../../../src/order-templates/add-item-to-order-template.ts?fff3","webpack://Msdyn365.Commerce.Online/../../../src/utilities/order-templates.ts?d593","webpack://Msdyn365.Commerce.Online/../../../src/order-templates/get-paginated-order-template-lines.ts?9b12","webpack://Msdyn365.Commerce.Online/../../../src/order-templates/add-order-template-to-cart.ts?6ee4","webpack://Msdyn365.Commerce.Online/../../../src/order-templates/create-order-template.ts?03c1","webpack://Msdyn365.Commerce.Online/../../../src/order-templates/get-full-order-template.ts?72c6","webpack://Msdyn365.Commerce.Online/../../../src/order-templates/get-full-order-templates.ts?b553","webpack://Msdyn365.Commerce.Online/../../../src/order-templates/get-order-templates.ts?a3b1","webpack://Msdyn365.Commerce.Online/../../../src/order-templates/get-order-templates-preview.ts?b8c3","webpack://Msdyn365.Commerce.Online/../../../src/order-templates/update-order-template-header.ts?1f77","webpack://Msdyn365.Commerce.Online/../../../src/order-templates/update-order-template-line.ts?527b","webpack://Msdyn365.Commerce.Online/../../src/refine-search-by-category.ts?3e65","webpack://Msdyn365.Commerce.Online/../../src/search-by-text.ts?ebe1","webpack://Msdyn365.Commerce.Online/../../src/update-address.ts?3e4d","webpack://Msdyn365.Commerce.Online/../../src/update-customer-attributes.ts?8d49","webpack://Msdyn365.Commerce.Online/../../src/update-customer-personalization.ts?4aa9","webpack://Msdyn365.Commerce.Online/../../src/update-primary-address.ts?83fa","webpack://Msdyn365.Commerce.Online/../../src/get-distributors.ts?216a","webpack://Msdyn365.Commerce.Online/../../src/get-product-dimensions-with-availabilities.ts?347b","webpack://Msdyn365.Commerce.Online/./node_modules/@msdyn365-commerce-modules/media-gallery/node_modules/@msdyn365-commerce-modules/utilities/src/popper-content/PopperContent.tsx?250a","webpack://Msdyn365.Commerce.Online/./node_modules/@msdyn365-commerce-modules/media-gallery/node_modules/@msdyn365-commerce-modules/utilities/src/tooltip/Tooltip.tsx?0b59","webpack://Msdyn365.Commerce.Online/./node_modules/@msdyn365-commerce-modules/media-gallery/node_modules/@msdyn365-commerce-modules/utilities/src/tooltip/UncontrolledTooltip.tsx?2218","webpack://Msdyn365.Commerce.Online/./node_modules/@msdyn365-commerce-modules/media-gallery/node_modules/@msdyn365-commerce-modules/utilities/src/alert/Alert.tsx?523d","webpack://Msdyn365.Commerce.Online/./node_modules/@msdyn365-commerce-modules/media-gallery/node_modules/@msdyn365-commerce-modules/utilities/src/back-to-top/BackToTop.tsx?00b7","webpack://Msdyn365.Commerce.Online/./node_modules/@msdyn365-commerce-modules/media-gallery/node_modules/@msdyn365-commerce-modules/utilities/src/button/Button.tsx?8a83","webpack://Msdyn365.Commerce.Online/./node_modules/@msdyn365-commerce-modules/media-gallery/node_modules/@msdyn365-commerce-modules/utilities/src/collapse/Collapse.tsx?7e34","webpack://Msdyn365.Commerce.Online/./node_modules/@msdyn365-commerce-modules/media-gallery/node_modules/@msdyn365-commerce-modules/utilities/src/common/telemetryHelper.ts?6d01","webpack://Msdyn365.Commerce.Online/./node_modules/@msdyn365-commerce-modules/media-gallery/node_modules/@msdyn365-commerce-modules/utilities/src/drawer/ControlledDrawer.tsx?e954","webpack://Msdyn365.Commerce.Online/./node_modules/@msdyn365-commerce-modules/media-gallery/node_modules/@msdyn365-commerce-modules/utilities/src/drawer/Drawer.tsx?4c14","webpack://Msdyn365.Commerce.Online/./node_modules/@msdyn365-commerce-modules/media-gallery/node_modules/@msdyn365-commerce-modules/utilities/src/flipper/Flipper.tsx?cd58","webpack://Msdyn365.Commerce.Online/./node_modules/@msdyn365-commerce-modules/media-gallery/node_modules/@msdyn365-commerce-modules/utilities/src/form-builder/form-builder.tsx?5e5d","webpack://Msdyn365.Commerce.Online/./node_modules/@msdyn365-commerce-modules/media-gallery/node_modules/@msdyn365-commerce-modules/utilities/src/incremental-quantity/IncrementalQuantity.tsx?9789","webpack://Msdyn365.Commerce.Online/./node_modules/@msdyn365-commerce-modules/media-gallery/node_modules/@msdyn365-commerce-modules/utilities/node_modules/tslib/tslib.es6.js?4610","webpack://Msdyn365.Commerce.Online/./node_modules/@msdyn365-commerce-modules/media-gallery/node_modules/@msdyn365-commerce-modules/utilities/src/isMobile/isMobile.props.ts?d685","webpack://Msdyn365.Commerce.Online/./node_modules/@msdyn365-commerce-modules/media-gallery/node_modules/@msdyn365-commerce-modules/utilities/src/isMobile/isMobile.tsx?86a7","webpack://Msdyn365.Commerce.Online/./node_modules/@msdyn365-commerce-modules/media-gallery/node_modules/@msdyn365-commerce-modules/utilities/src/labeled-dropdown/LabeledDropdown.tsx?6bc1","webpack://Msdyn365.Commerce.Online/./node_modules/@msdyn365-commerce-modules/media-gallery/node_modules/@msdyn365-commerce-modules/utilities/src/pagination/Pagination.tsx?9ef4","webpack://Msdyn365.Commerce.Online/./node_modules/@msdyn365-commerce-modules/media-gallery/node_modules/@msdyn365-commerce-modules/utilities/src/pagination/PaginationItem.tsx?1de4","webpack://Msdyn365.Commerce.Online/./node_modules/@msdyn365-commerce-modules/media-gallery/node_modules/@msdyn365-commerce-modules/utilities/src/pagination/PaginationLink.tsx?c3a8","webpack://Msdyn365.Commerce.Online/./node_modules/@msdyn365-commerce-modules/media-gallery/node_modules/@msdyn365-commerce-modules/utilities/src/pagination/UncontrolledPagination.tsx?04cf","webpack://Msdyn365.Commerce.Online/./node_modules/@msdyn365-commerce-modules/media-gallery/node_modules/@msdyn365-commerce-modules/utilities/src/modal/Portal.tsx?ad95","webpack://Msdyn365.Commerce.Online/./node_modules/@msdyn365-commerce-modules/media-gallery/node_modules/@msdyn365-commerce-modules/utilities/src/modal/Modal.tsx?a3c7","webpack://Msdyn365.Commerce.Online/./node_modules/@msdyn365-commerce-modules/media-gallery/node_modules/@msdyn365-commerce-modules/utilities/src/modal/ModalBody.tsx?0e13","webpack://Msdyn365.Commerce.Online/./node_modules/@msdyn365-commerce-modules/media-gallery/node_modules/@msdyn365-commerce-modules/utilities/src/modal/ModalFooter.tsx?5aec","webpack://Msdyn365.Commerce.Online/./node_modules/@msdyn365-commerce-modules/media-gallery/node_modules/@msdyn365-commerce-modules/utilities/src/modal/ModalHeader.tsx?b423","webpack://Msdyn365.Commerce.Online/./node_modules/@msdyn365-commerce-modules/media-gallery/node_modules/@msdyn365-commerce-modules/utilities/src/popup/Popup.tsx?4f89","webpack://Msdyn365.Commerce.Online/./node_modules/@msdyn365-commerce-modules/media-gallery/node_modules/@msdyn365-commerce-modules/utilities/src/progress/Progress.tsx?269c","webpack://Msdyn365.Commerce.Online/./node_modules/@msdyn365-commerce-modules/media-gallery/node_modules/@msdyn365-commerce-modules/utilities/src/single-slide-carousel/SingleSlideCarousel.tsx?293f","webpack://Msdyn365.Commerce.Online/./node_modules/@msdyn365-commerce-modules/media-gallery/node_modules/@msdyn365-commerce-modules/utilities/src/slider/SliderThumb.tsx?7307","webpack://Msdyn365.Commerce.Online/./node_modules/@msdyn365-commerce-modules/media-gallery/node_modules/@msdyn365-commerce-modules/utilities/src/slider/Slider.tsx?de83","webpack://Msdyn365.Commerce.Online/./node_modules/@msdyn365-commerce-modules/media-gallery/node_modules/@msdyn365-commerce-modules/utilities/src/table/Table.tsx?9037","webpack://Msdyn365.Commerce.Online/./node_modules/@msdyn365-commerce-modules/media-gallery/node_modules/@msdyn365-commerce-modules/utilities/src/waiting/Waiting.tsx?ba56","webpack://Msdyn365.Commerce.Online/./node_modules/@msdyn365-commerce-modules/media-gallery/node_modules/@msdyn365-commerce-modules/utilities/src/common/KeyCodes.ts?3c02","webpack://Msdyn365.Commerce.Online/./node_modules/@msdyn365-commerce-modules/media-gallery/node_modules/@msdyn365-commerce-modules/utilities/src/common/stringExtensions.ts?41ee","webpack://Msdyn365.Commerce.Online/./node_modules/@msdyn365-commerce-modules/media-gallery/node_modules/@msdyn365-commerce-modules/utilities/src/popover/Popover.tsx?6005","webpack://Msdyn365.Commerce.Online/./node_modules/@msdyn365-commerce-modules/media-gallery/node_modules/@msdyn365-commerce-modules/utilities/src/price/price-editor-mode-selection.tsx?a17c","webpack://Msdyn365.Commerce.Online/./node_modules/@msdyn365-commerce-modules/media-gallery/node_modules/@msdyn365-commerce-modules/utilities/src/price/price-editor.tsx?53a0","webpack://Msdyn365.Commerce.Online/./node_modules/@msdyn365-commerce-modules/media-gallery/node_modules/@msdyn365-commerce-modules/utilities/src/quantity/Quantity.tsx?b430","webpack://Msdyn365.Commerce.Online/./node_modules/@msdyn365-commerce-modules/media-gallery/node_modules/@msdyn365-commerce-modules/utilities/src/wrapper/module.tsx?2fea","webpack://Msdyn365.Commerce.Online/./node_modules/@msdyn365-commerce-modules/media-gallery/node_modules/@msdyn365-commerce-modules/utilities/src/wrapper/node.tsx?9e5e","webpack://Msdyn365.Commerce.Online/./src/modules/media-gallery/media-gallery.view.tsx?5061","webpack://Msdyn365.Commerce.Online/./src/dataActions/get-attributes-for-selected-variant.ts?e4b6","webpack://Msdyn365.Commerce.Online/./src/modules/media-gallery/utils/helper.ts?b895","webpack://Msdyn365.Commerce.Online/./src/modules/media-gallery/media-gallery.tsx?24d7","webpack://Msdyn365.Commerce.Online/./src/modules/adventureworks/views/media-gallery.view.tsx?7624","webpack://Msdyn365.Commerce.Online/external var \"React\"?0d3b","webpack://Msdyn365.Commerce.Online/external var \"ReactDOM\"?853b"],"sourcesContent":["/**\r\n * Copyright (c) Microsoft Corporation\r\n * All rights reserved. See License.txt in the project root for license information.\r\n * IMediaGallery contentModule Interface Properties\r\n * THIS FILE IS AUTO-GENERATED - MANUAL MODIFICATIONS WILL BE LOST\r\n */\r\n\r\nimport * as Msdyn365 from '@msdyn365-commerce/core';\r\n\r\nexport const enum imageSource {\r\n pageContext = 'pageContext',\r\n productId = 'productId'\r\n}\r\n\r\nexport const enum imageZoom {\r\n inline = 'inline',\r\n container = 'container'\r\n}\r\n\r\nexport const enum thumbnailsOrientation {\r\n vertical = 'vertical',\r\n horizontal = 'horizontal'\r\n}\r\n\r\nexport const enum altTextSource {\r\n product = 'product',\r\n cms = 'cms'\r\n}\r\n\r\nexport interface IMediaGalleryConfig extends Msdyn365.IModuleConfig {\r\n imageSource?: imageSource;\r\n images?: Msdyn365.IImageData[];\r\n productId?: string;\r\n imageZoom?: imageZoom;\r\n allowFullScreen?: boolean;\r\n dataScale?: string;\r\n zoomedImageSettings?: Msdyn365.IImageSettings;\r\n thumbnailsOrientation?: thumbnailsOrientation;\r\n thumbnailImageSettings?: Msdyn365.IImageSettings;\r\n galleryImageSettings?: Msdyn365.IImageSettings;\r\n shouldHideMasterProductImagesForVariant?: boolean;\r\n altTextSource?: altTextSource;\r\n showPaginationTooltip?: boolean;\r\n shouldUpdateOnPartialDimensionSelection?: boolean;\r\n className?: string;\r\n skipImageValidation?: boolean;\r\n autoplay?: boolean;\r\n mute?: boolean;\r\n playPauseTrigger?: boolean;\r\n controls?: boolean;\r\n clientRender?: boolean;\r\n}\r\n\r\nexport interface IMediaGalleryResources {\r\n nextScreenshotFlipperText: string;\r\n previousScreenshotFlipperText: string;\r\n fullScreenTitleText: string;\r\n ariaLabelForSlide: string;\r\n playLabel: string;\r\n pauseLabel: string;\r\n pausedLabel: string;\r\n playingLabel: string;\r\n unMuteLabel: string;\r\n muteLabel: string;\r\n fullScreenLabel: string;\r\n exitFullScreenLabel: string;\r\n seekBarLabel: string;\r\n videoTimeDurationLabel: string;\r\n closedCaptionLabel: string;\r\n optionButtonLabel: string;\r\n sliderThumbLabel: string;\r\n volumeThumbLabel: string;\r\n playVideoTitleText: string;\r\n}\r\n\r\nexport interface IMediaGalleryProps extends Msdyn365.IModule {\r\n resources: IMediaGalleryResources;\r\n config: IMediaGalleryConfig;\r\n}\r\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\n/* eslint-disable no-duplicate-imports */\nimport { IImageData, IRequestContext, IVideoData } from '@msdyn365-commerce/core';\n\nexport enum MediaType {\n /**\n * The None.\n */\n None = 0,\n /**\n * The Image type.\n */\n Image = 1,\n /**\n * The video type.\n */\n Video = 2,\n /**\n * The file type.\n */\n File = 3\n}\n\nexport interface IMediaData extends IImageData {\n mediaTypeValue?: MediaType;\n displayOrder?: number;\n videoData?: IVideoData;\n}\n\n/**\n * Gets correct alt text for image based on configuration of site.\n * @param productName Product name.\n * @param context Current request context.\n * @param imageAltText Alt-text from CMS image.\n */\nexport function getAltText(\n context: IRequestContext,\n shouldUseCmsAltText: boolean,\n productName?: string,\n imageAltText?: string\n): string | undefined {\n if (!context?.app?.config?.OmniChannelMedia) {\n return productName;\n }\n if (shouldUseCmsAltText) {\n return imageAltText;\n }\n return productName;\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\n/* eslint-disable no-duplicate-imports */\nimport {\n commerceApiRequest,\n commerceVideoMetadataRequest,\n getCatalogId,\n IActionContext,\n IImageData,\n IImageSettings,\n IVideoData\n} from '@msdyn365-commerce/core';\nimport { MediaLocation, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\nimport {\n ArrayExtensions,\n getMediaLocationsForSelectedVariant,\n MediaLocationsForSelectedVariantInput\n} from '@msdyn365-commerce-modules/retail-actions';\nimport { getAltText } from './helper';\n\nasync function validateMediaLocationAsync(mediaLocation: MediaLocation): Promise<[IImageData, boolean]> {\n const imageData: IImageData = {\n src: mediaLocation.Uri || '',\n altText: mediaLocation.AltText || ''\n };\n if (mediaLocation.IsApplicableForChildEntities) {\n imageData.additionalProperties = { isApplicableForChildEntities: 'true' };\n }\n\n if (imageData.src === '') {\n return [imageData, false];\n }\n\n return new Promise<[IImageData, boolean]>(resolve => {\n try {\n const http = new XMLHttpRequest();\n http.open('HEAD', imageData.src!, true);\n\n http.addEventListener('load', () => {\n resolve([imageData, http.status === 200 || http.status === 201]);\n });\n\n http.addEventListener('error', () => {\n resolve([imageData, false]);\n });\n\n http.send();\n } catch {\n resolve([imageData, false]);\n }\n });\n}\n\nexport async function getValidProductImages(\n productId: number,\n channelId: number,\n actionContext: IActionContext,\n imageSettings: IImageSettings,\n selectedProduct?: SimpleProduct\n): Promise {\n const catalogId = getCatalogId(actionContext.requestContext);\n const actionInput = new MediaLocationsForSelectedVariantInput(productId, channelId, selectedProduct, catalogId);\n\n return getMediaLocationsForSelectedVariant(actionInput, actionContext)\n .then(mediaLocations => {\n if (mediaLocations) {\n return Promise.all(mediaLocations.map(mediaLocation => validateMediaLocationAsync(mediaLocation))).then(pairs => {\n return pairs.filter(pair => pair[1]).map(pair => pair[0]);\n });\n }\n\n return [];\n })\n .catch(error => {\n actionContext.telemetry.exception(error);\n actionContext.telemetry.debug('Unable to get Media Locations for Selected Variant');\n return [];\n });\n}\n\n/**\n * Gets product variant images on dimension change of buy-box module for Omni scenario.\n * @param productId Product record id.\n * @param shouldUseCmsAltText Alt-text source to use.\n * @param channelId Current channel id.\n * @param actionContext Current action context.\n * @param productName Product name.\n * @param selectedProduct Currently selected variant product.\n * @returns List of images.\n */\n\nexport async function getProductImages(\n productId: number,\n shouldUseCmsAltText: boolean,\n channelId: number,\n actionContext: IActionContext,\n productName?: string,\n selectedProduct?: SimpleProduct\n): Promise {\n const catalogId = getCatalogId(actionContext.requestContext);\n if (actionContext.requestContext?.params?.isPreview) {\n const response = await commerceApiRequest(actionContext.requestContext, 'msdyn365-ochannel-product-info', 'post', {\n productId: productId,\n channelId: channelId,\n catalogId: catalogId\n });\n if (response.status !== 200) {\n actionContext.telemetry.debug('Unable to get Media Locations for Selected Variant for preview scenario');\n return [];\n }\n const previewImageData = response?.data as MediaLocation[];\n if (previewImageData) {\n return previewImageData.map(mediaLocation => {\n return {\n src: mediaLocation.Uri ?? '',\n altText: getAltText(actionContext.requestContext, shouldUseCmsAltText, productName, mediaLocation.AltText),\n displayOrder: mediaLocation.DisplayOrder,\n mediaTypeValue: mediaLocation.MediaTypeValue,\n additionalProperties: mediaLocation.IsApplicableForChildEntities\n ? {\n isApplicableForChildEntities: 'true'\n }\n : undefined\n };\n });\n }\n return [];\n }\n const actionInput = new MediaLocationsForSelectedVariantInput(productId, channelId, selectedProduct, catalogId);\n return getMediaLocationsForSelectedVariant(actionInput, actionContext)\n .then(mediaLocations => {\n if (mediaLocations) {\n return mediaLocations.map(mediaLocation => {\n return {\n src: mediaLocation.Uri ?? '',\n altText: getAltText(actionContext.requestContext, shouldUseCmsAltText, productName, mediaLocation.AltText),\n displayOrder: mediaLocation.DisplayOrder,\n mediaTypeValue: mediaLocation.MediaTypeValue,\n additionalProperties: mediaLocation.IsApplicableForChildEntities\n ? {\n isApplicableForChildEntities: 'true'\n }\n : undefined\n };\n });\n }\n return [];\n })\n .catch(error => {\n actionContext.telemetry.exception(error);\n actionContext.telemetry.debug('Unable to get Media Locations for Selected Variant');\n return [];\n });\n}\n\nexport async function validateProductImages(\n mediaLocations: MediaLocation[],\n actionContext: IActionContext,\n imageSettings: IImageSettings\n): Promise {\n return Promise.all(mediaLocations.map(mediaLocation => validateMediaLocationAsync(mediaLocation)))\n .then(pairs => {\n return pairs.filter(pair => pair[1]).map(pair => pair[0]);\n })\n .catch(error => {\n actionContext.telemetry.exception(error);\n actionContext.telemetry.debug('Unable to validate product images');\n return [];\n });\n}\n\n/**\n * GetVideoMetadataFromAPI - Makes API call to get video metadata.\n * @param videoId: Video Id\n * @param actionContext: Action context\n * @returns: Returns the meta data of the video.\n */\nexport async function getVideoMetadataFromApi(videoId: string, actionContext: IActionContext): Promise {\n let videoPlayerData: IVideoData | undefined;\n if (videoId) {\n const response = await commerceVideoMetadataRequest(actionContext.requestContext, [videoId]);\n\n if (response.status !== 200) {\n actionContext.telemetry.debug(`Unable to get video metadata for videoId: ${videoId}`);\n return;\n }\n\n const videoData = response.data as [];\n if (videoData && ArrayExtensions.hasElements(videoData)) {\n videoPlayerData = videoData[0];\n }\n }\n return videoPlayerData;\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\n/* eslint-disable no-duplicate-imports */\nimport { Carousel, ICarouselProps, Player, IPlayerData, IPlayerOptions, IVideoMetadata } from '@msdyn365-commerce/components';\nimport { IImageData, IImageSettings, Image, Video } from '@msdyn365-commerce/core';\nimport { MediaLocation, MediaType, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\nimport { ArrayExtensions, getFallbackImageUrl, ObjectExtensions } from '@msdyn365-commerce-modules/retail-actions';\nimport {\n defaultDataScale,\n IComponentNodeProps,\n ImagefullView,\n IModalViewProps,\n IModuleProps,\n inlineZoomImageOnHover,\n inlineZoomImageOnMouseMove,\n inlineZoomImageOnMouseOut,\n inlineZoomInitClick,\n INodeProps,\n ISingleSlideCarouselProps,\n isMobile,\n KeyCodes,\n NodeTag,\n onContainerZoomInit,\n onMouseMoveLensContainer,\n onMouseOutLensContainer,\n onMouseOverImageContainer,\n removeContainerZoomStyle,\n removeInlineZoomStyle,\n SingleSlideCarousel,\n VariantType\n} from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport { reaction } from 'mobx';\nimport * as React from 'react';\n\nimport { IMediaGalleryData } from './media-gallery.data';\nimport { imageSource, imageZoom, IMediaGalleryProps, thumbnailsOrientation } from './media-gallery.props.autogenerated';\nimport { getProductImages, getValidProductImages, getVideoMetadataFromApi, validateProductImages } from './utils';\nimport { getAltText, IMediaData } from './utils/helper';\n\n/**\n * IMediaGalleryState Interface.\n */\nexport interface IMediaGalleryState {\n animating: boolean;\n activeIndex: number;\n isImageZoomed: boolean;\n modalIsOpen: boolean;\n lastUpdate?: number;\n isMobileImageZoomed?: boolean;\n mediaGalleryItems?: IMediaData[];\n isInitialLoad?: boolean;\n shouldUseOptimizedImage?: boolean;\n}\n\n/**\n * IMediaGalleryThumbnailsViewProps Interface.\n */\nexport interface IMediaGalleryThumbnailsViewProps {\n ThumbnailsContainerProps: INodeProps;\n SingleSlideCarouselComponentProps: INodeProps;\n items?: IMediaGalleryThumbnailItemViewProps[];\n}\n\n/**\n * IMediaGalleryThumbnailItemViewProps Interface.\n */\nexport interface IMediaGalleryThumbnailItemViewProps {\n ThumbnailItemContainerProps: INodeProps;\n Picture: React.ReactElement;\n}\n\n/**\n * IMediaGalleryViewProps Interface.\n */\nexport interface IMediaGalleryViewProps extends IMediaGalleryProps {\n state: IMediaGalleryState;\n MediaGallery: IModuleProps;\n CarouselProps: INodeProps;\n Thumbnails: IMediaGalleryThumbnailsViewProps;\n Modal?: React.ReactElement | null;\n callbackToggle?(): void;\n callbackThumbnailClick?(index: number): void;\n callbackThumbnailKeyDown?(index: number): void;\n percentageOff: any;\n}\n\n/**\n * Props for carousel.\n */\ninterface IMediaGalleryCarouselItems {\n items: ItemType[];\n keys: (string | undefined)[];\n}\n\n/**\n * Media gallery component.\n */\nclass MediaGallery extends React.Component, IMediaGalleryState> {\n private readonly _inlineZoomDivRef: Map = new Map();\n\n private readonly fullScreenOverlayButtonRef: React.RefObject = React.createRef();\n private readonly player: React.RefObject = React.createRef();\n\n private mediaGalleryImages: IImageData[] = [];\n\n private fallbackImage?: string;\n\n private readonly defaultGalleryImageSettings: IImageSettings = {\n viewports: {\n xs: { q: 'w=767&h=767&m=8', w: 0, h: 0 },\n sm: { q: 'w=600&h=600&m=8', w: 0, h: 0 },\n md: { q: 'w=600&h=772&m=8', w: 0, h: 0 },\n lg: { q: 'h=772&m=8', w: 0, h: 0 }\n },\n lazyload: true,\n cropFocalRegion: true\n };\n\n private readonly defaultThumbnailImageSettings: IImageSettings = {\n viewports: {\n xs: { q: 'w=100&m=8', w: 100, h: 0 },\n lg: { q: 'w=100&m=8', w: 100, h: 0 }\n },\n lazyload: true,\n cropFocalRegion: true\n };\n\n private readonly _zoomedImageSettings: IImageSettings;\n\n public constructor(props: IMediaGalleryProps) {\n super(props);\n this._toggleModal = this._toggleModal.bind(this);\n this.state = {\n activeIndex: 0,\n animating: false,\n isImageZoomed: false,\n modalIsOpen: false,\n isInitialLoad: true,\n shouldUseOptimizedImage: !!this.props.config.skipImageValidation\n };\n\n this._zoomedImageSettings =\n props.config.zoomedImageSettings ?? props.config.galleryImageSettings ?? this.defaultGalleryImageSettings;\n\n this._onImageMouseOut = this._onImageMouseOut.bind(this);\n this._inlineZoomImageOnHover = this._inlineZoomImageOnHover.bind(this);\n this._onInlineImageClick = this._onInlineImageClick.bind(this);\n this._onContainerZoomImageClick = this._onContainerZoomImageClick.bind(this);\n this._onMouseOutLensContainer = this._onMouseOutLensContainer.bind(this);\n }\n\n public isMobile(): boolean {\n const size = isMobile({ variant: VariantType.Viewport, context: this.props.context.request });\n return size === 'xs';\n }\n\n public async componentDidMount(): Promise {\n const source = this.props.config.imageSource ?? imageSource.pageContext;\n const shouldUpdateOnPartialDimensionSelection = this.props.config.shouldUpdateOnPartialDimensionSelection;\n this._setRenderType();\n if (!this.props.context.request.app?.config?.OmniChannelMedia) {\n if (source === imageSource.pageContext) {\n if (this.state.mediaGalleryItems === undefined && this.props.data.mediaLocationsForSelectedVariant.result) {\n const images = await validateProductImages(\n this.props.data.mediaLocationsForSelectedVariant.result,\n this.props.context.actionContext,\n this.props.config.thumbnailImageSettings ?? this.defaultThumbnailImageSettings\n );\n await this._setImages(images);\n } else if (this.state.mediaGalleryItems === undefined && this.props.data.product.result) {\n const product = this.props.data.product.result;\n const images = await getValidProductImages(\n product.RecordId,\n +this.props.context.request.apiSettings.channelId,\n this.props.context.actionContext,\n this.props.config.thumbnailImageSettings ?? this.defaultThumbnailImageSettings,\n product.productVariant\n );\n\n await this._setImages(images);\n } else {\n await this._setImages([]);\n }\n }\n }\n\n reaction(\n () => {\n const product = this.props.data.product.result;\n if (!product) {\n return null;\n }\n\n if (!shouldUpdateOnPartialDimensionSelection || !product.productVariant?.RecordId) {\n return `${product.RecordId}`;\n }\n\n return `${product.RecordId}-${product.productVariant.RecordId}`;\n },\n async () => {\n const product = this.props.data.product.result;\n let images: IImageData[] = [];\n if (product) {\n if (this.props.context.app?.config?.OmniChannelMedia) {\n images = await getProductImages(\n product.RecordId,\n this.shouldUseCmsAltText(),\n +this.props.context.request.apiSettings.channelId,\n this.props.context.actionContext,\n product.Name,\n shouldUpdateOnPartialDimensionSelection ? product.productVariant : undefined\n );\n } else {\n images = await getValidProductImages(\n product.RecordId,\n +this.props.context.request.apiSettings.channelId,\n this.props.context.actionContext,\n this.props.config.thumbnailImageSettings ?? this.defaultThumbnailImageSettings,\n shouldUpdateOnPartialDimensionSelection ? product.productVariant : undefined\n );\n }\n await this._setImages(images);\n } else {\n await this._setImages([]);\n }\n },\n { fireImmediately: true }\n );\n\n if (source === imageSource.productId && this.props.data.mediaLocations.result) {\n const images = await validateProductImages(\n this.props.data.mediaLocations.result,\n this.props.context.actionContext,\n this.props.config.thumbnailImageSettings ?? this.defaultThumbnailImageSettings\n );\n await this._setImages(images);\n }\n }\n\n public shouldComponentUpdate(nextProps: IMediaGalleryProps, nextState: IMediaGalleryState): boolean {\n if (this.state === nextState && this.props.data === nextProps.data) {\n return false;\n }\n return true;\n }\n\n public render(): JSX.Element {\n const { id, config, resources } = this.props;\n const { className, showPaginationTooltip } = config;\n const percentageOff =\n this.props.data?.productPrice?.result?.TradeAgreementPrice &&\n this.props.data?.productPrice?.result?.BasePrice &&\n this.props.data?.productPrice?.result?.TradeAgreementPrice !== this.props.data?.productPrice?.result?.BasePrice\n ? Math.floor(\n ((this.props.data?.productPrice?.result?.BasePrice - this.props.data?.productPrice?.result?.TradeAgreementPrice) /\n this.props.data?.productPrice?.result?.BasePrice) *\n 100\n )\n : 0;\n\n const isVertical: boolean = config.thumbnailsOrientation === thumbnailsOrientation.vertical;\n // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing -- || is required.\n const isFullscreenAllowed: boolean = this.isMobile() || config.allowFullScreen || false;\n const zoomViewMode: string =\n config.imageZoom === imageZoom.inline ? imageZoom.inline : config.imageZoom === imageZoom.container ? imageZoom.container : '';\n const source = this.props.config.imageSource ?? imageSource.pageContext;\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- Site level config can be of any type.\n const emptyPlaceHolderImage = this.props.context.app.config?.placeholderImageName as string;\n if (this.props.data.product.result) {\n this.fallbackImage = getFallbackImageUrl(\n this.props.data.product.result.ItemId,\n this.props.context.request.apiSettings,\n this.props.context.request.app?.config?.OmniChannelMedia\n );\n }\n if (emptyPlaceHolderImage && this.fallbackImage) {\n this.fallbackImage = `${this.fallbackImage},${emptyPlaceHolderImage}`;\n }\n if (this.props.config.skipImageValidation && !this.state.mediaGalleryItems && this.state.isInitialLoad) {\n let images: IImageData[] = [];\n let mediaLocations: MediaLocation[] = [];\n if (source === imageSource.pageContext && this.props.data.mediaLocationsForSelectedVariant.result) {\n mediaLocations = this.props.data.mediaLocationsForSelectedVariant.result;\n } else if (source === imageSource.productId && this.props.data.mediaLocations.result) {\n mediaLocations = this.props.data.mediaLocations.result;\n }\n images = mediaLocations.map(mediaLocation => {\n return {\n src: mediaLocation.Uri ?? '',\n altText: getAltText(\n this.props.context.actionContext.requestContext,\n this.shouldUseCmsAltText(),\n this.props.data.product.result?.Name,\n mediaLocation.AltText\n )\n };\n });\n const curatedImages = this.props.config.images ?? [];\n this.mediaGalleryImages = [...this._filterMasterImageFromVariant(images), ...curatedImages];\n }\n const mediaGalleryCarouselItems = this._getMediaGalleryItems(isFullscreenAllowed, zoomViewMode);\n const mediaGalleryThumbnailCarouselItems = this._getMediaGalleryThumbnailItems();\n const viewProps: IMediaGalleryViewProps = {\n ...(this.props as IMediaGalleryProps),\n state: this.state,\n percentageOff: percentageOff,\n MediaGallery: {\n moduleProps: this.props,\n className: classnames(`ms-media-gallery ${isVertical ? 'vertical' : ''}`, className)\n },\n Modal: isFullscreenAllowed ? this.imageModalSlider(zoomViewMode) : null,\n callbackToggle: this.openModalDialog,\n callbackThumbnailClick: this._generateOnThumbnailClick,\n callbackThumbnailKeyDown: this._generateOnThumbnailKeyDown,\n CarouselProps: {\n tag: Carousel,\n className: 'ms-media-gallery__carousel',\n items: mediaGalleryCarouselItems.items,\n activeIndex: this.state.activeIndex,\n next: this.next,\n previous: this.previous,\n interval: 7000,\n directionTextPrev: resources.previousScreenshotFlipperText,\n directionTextNext: resources.nextScreenshotFlipperText,\n onIndicatorsClickHandler: this.goToIndex,\n showPaginationTooltip: showPaginationTooltip === true,\n indicatorAriaText: resources.ariaLabelForSlide,\n handleOnExited: this.onExited,\n handleOnExiting: this.onExiting,\n key: mediaGalleryCarouselItems.keys\n } as IComponentNodeProps,\n Thumbnails: {\n ThumbnailsContainerProps: { className: 'ms-media-gallery__thumbnails-container' },\n SingleSlideCarouselComponentProps: {\n tag: SingleSlideCarousel,\n className: 'ms-media-gallery__thumbnails',\n vertical: isVertical,\n flipperPrevLabel: resources.previousScreenshotFlipperText,\n flipperNextLabel: resources.nextScreenshotFlipperText,\n parentId: id,\n useTabList: true,\n key: JSON.stringify(mediaGalleryThumbnailCarouselItems.keys)\n } as IComponentNodeProps,\n items: mediaGalleryThumbnailCarouselItems.items\n }\n };\n\n return this.props.renderView(viewProps) as React.ReactElement;\n }\n\n /**\n * Zoomed out image on previous/next click.\n */\n public updateZoomedInImage(): void {\n this.setState({ isImageZoomed: false });\n }\n\n private readonly onExiting = () => {\n this.setState({ animating: true });\n };\n\n private readonly onExited = () => {\n this.setState({ animating: false });\n };\n\n /**\n * On click next in carousel.\n */\n private readonly next = (): void => {\n removeInlineZoomStyle();\n if (this.isLastItem() === undefined) {\n return;\n }\n\n const nextIndex = this.isLastItem() ? 0 : this.state.activeIndex + 1;\n this.goToIndex(nextIndex);\n\n this.updateZoomedInImage();\n };\n\n /**\n * On click previous in carousel.\n */\n private readonly previous = (): void => {\n removeInlineZoomStyle();\n const images = this.state.mediaGalleryItems;\n const nextIndex = this.isFirstItem() ? (images ? images.length - 1 : 0) : this.state.activeIndex - 1;\n this.goToIndex(nextIndex);\n this.updateZoomedInImage();\n };\n\n private readonly goToIndex = (index: number): void => {\n const { autoplay } = this.props.config;\n const currentIndex = this.state.activeIndex;\n const mediaItems = this.state.mediaGalleryItems;\n if (autoplay && mediaItems) {\n if (mediaItems[`${index}`]?.mediaTypeValue === MediaType.Video) {\n this.player.current?.play();\n } else if (mediaItems[`${currentIndex}`].mediaTypeValue === MediaType.Video) {\n this.player.current?.pause();\n }\n }\n this.setState({ activeIndex: index });\n };\n\n private _getMediaGalleryThumbnailItems(): IMediaGalleryCarouselItems {\n const mediaGalleryItems = this.state.mediaGalleryItems ?? this.mediaGalleryImages;\n const thumbnailImageSettings = this.props.config.thumbnailImageSettings;\n if (thumbnailImageSettings) {\n thumbnailImageSettings.cropFocalRegion = true;\n }\n\n const hasMediaGalleryItems = ArrayExtensions.hasElements(mediaGalleryItems);\n\n if (!hasMediaGalleryItems) {\n if (this.state.lastUpdate) {\n const defaultKey = 0;\n return {\n items: [this._getEmptyThumbnailItem(thumbnailImageSettings, defaultKey, this.state.activeIndex)],\n keys: ['empty']\n };\n }\n return { items: [], keys: [] };\n }\n\n return {\n items: [\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion\n ...mediaGalleryItems!.map((item: IMediaData, index: number) => {\n if (item.mediaTypeValue === MediaType.Video) {\n return this.getVideoThumbNailItem(\n item,\n thumbnailImageSettings ?? this.defaultThumbnailImageSettings,\n index,\n this.state.activeIndex\n );\n } else {\n return this._getThumbnailItem(\n item,\n thumbnailImageSettings ?? this.defaultThumbnailImageSettings,\n index,\n this.state.activeIndex\n );\n }\n })\n ],\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion\n keys: [...mediaGalleryItems!.map(item => item.src)]\n };\n }\n\n private _getMediaGalleryItems(isFullscreenAllowed: boolean, zoomViewMode: string): IMediaGalleryCarouselItems {\n const mediaGalleryItems = this.state.mediaGalleryItems ?? this.mediaGalleryImages;\n const galleryImageSettings = this.props.config.galleryImageSettings;\n if (galleryImageSettings) {\n galleryImageSettings.cropFocalRegion = true;\n }\n\n const zoomView = isFullscreenAllowed ? 'fullscreen' : zoomViewMode;\n\n const hasMediaGalleryItems = ArrayExtensions.hasElements(mediaGalleryItems);\n\n if (!hasMediaGalleryItems) {\n if (this.state.lastUpdate) {\n return { items: [this._renderEmptyImage(galleryImageSettings)], keys: ['empty'] };\n }\n return { items: [], keys: [] };\n }\n\n return {\n items: [\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion\n ...mediaGalleryItems!.map((item: IMediaData, index: number) => {\n return this._renderCarouselItemImageView(\n zoomView,\n item,\n galleryImageSettings ?? this.defaultGalleryImageSettings,\n index\n );\n })\n ],\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion\n keys: [...mediaGalleryItems!.map(item => item.src)]\n };\n }\n\n private async _setImages(images?: IMediaData[]): Promise {\n const curatedImage = this.props.config.images || [];\n const mediaToSet: IMediaData[] = this._filterMasterImageFromVariant(images);\n\n void Promise.all(\n mediaToSet.map(async mediaData => {\n if (mediaData.mediaTypeValue === MediaType.Video && mediaData.src) {\n try {\n const url = new URL(mediaData.src);\n const videoId = url.searchParams.get('CVID');\n if (videoId) {\n mediaData.videoData = await getVideoMetadataFromApi(videoId, this.props.context.actionContext);\n }\n } catch (error) {\n if (this.props.telemetry) {\n this.props.telemetry.debug('Error while fetching videoId');\n }\n }\n }\n return mediaData;\n })\n ).then(mediaData => {\n const mediaItems = mediaData.filter(element => {\n return (\n element.mediaTypeValue !== MediaType.Video ||\n (element.mediaTypeValue === MediaType.Video && element.videoData !== undefined)\n );\n });\n\n this.setState({\n mediaGalleryItems: [...mediaItems, ...curatedImage],\n activeIndex: 0,\n lastUpdate: Date.now(),\n shouldUseOptimizedImage: false\n });\n });\n\n this.setState({\n mediaGalleryItems: [...mediaToSet, ...curatedImage],\n activeIndex: 0,\n lastUpdate: Date.now(),\n shouldUseOptimizedImage: false\n });\n }\n\n private _setRenderType(): void {\n this.setState({\n isInitialLoad: false\n });\n }\n\n private _renderCarouselItemImageView(\n zoomView: string,\n media: IMediaData,\n imageSettings: IImageSettings,\n index: number,\n isInPopup: boolean = false\n ): React.ReactNode {\n if (media.mediaTypeValue === MediaType.Video) {\n if (this.isMobile() && !isInPopup) {\n return <>{this._renderVideoFullScreen(media, index, imageSettings)};\n }\n\n return <>{this._renderCarouselItemVideo(media, index, imageSettings)};\n } else {\n if (this.isMobile()) {\n if (isInPopup) {\n return this._renderImageInContainerOnZoom(media, this._zoomedImageSettings, index);\n }\n return this._renderImageFullScreenOnZoom(media, imageSettings, index);\n }\n\n switch (zoomView) {\n case 'container': {\n return this._renderImageInContainerOnZoom(media, this._zoomedImageSettings, index);\n }\n case 'inline': {\n return this._renderImageInlineOnZoom(media, this._zoomedImageSettings, index);\n }\n case 'fullscreen': {\n return this._renderImageFullScreenOnZoom(media, imageSettings, index);\n }\n\n // No default\n }\n return <>{this._getCarouselItem(media, imageSettings, index, isInPopup)};\n }\n }\n\n private _filterMasterImageFromVariant(images?: IImageData[]): IImageData[] {\n const shouldHidePrimaryImages = this.props.config.shouldHideMasterProductImagesForVariant ?? true;\n let variantImages = images ?? [];\n const isVariantProduct =\n !ObjectExtensions.isNullOrUndefined(this.props.data.product.result?.MasterProductId) ||\n !ObjectExtensions.isNullOrUndefined(this.props.data.product.result?.productVariant);\n const itemId = this.props.data.product.result?.ItemId;\n if (shouldHidePrimaryImages && isVariantProduct && itemId) {\n variantImages = variantImages.filter(item => {\n const isApplicableForChildEntities = item.additionalProperties?.isApplicableForChildEntities;\n return !isApplicableForChildEntities;\n });\n if (!ArrayExtensions.hasElements(variantImages)) {\n variantImages = images ?? [];\n }\n }\n return variantImages;\n }\n\n private readonly _renderCarouselItemVideo = (mediaData: IMediaData, index: number, imageSettings: IImageSettings): React.ReactNode => {\n const videoData = mediaData.videoData;\n if (videoData) {\n const options: IPlayerOptions = this.props.config as IPlayerOptions;\n const playerResources = this.props.resources;\n const videoMetaData: IVideoMetadata = {};\n videoMetaData.videoId = videoData.id;\n videoMetaData.title = videoData.title;\n videoMetaData.duration = videoData.playTime;\n if (videoData.thumbnail) {\n videoMetaData.posterframeUrl = videoData.thumbnail.src;\n }\n if (videoData._links?.binaryReferences) {\n videoMetaData.videoBinaryReferences = videoData._links.binaryReferences;\n }\n const videoPlayerData: IPlayerData = { options, metaData: videoMetaData };\n const attributes = {\n id: `${this.props.id}__carousel-item__${index}`\n };\n return (\n \n );\n }\n return this._renderEmptyImage(imageSettings);\n };\n\n private readonly _getCarouselItem = (\n image: IImageData,\n imageSettings: IImageSettings,\n index: number,\n isInPopup: boolean = false\n ): React.ReactNode => (\n \n );\n\n private readonly _getThumbnailItem = (\n image: IImageData,\n imageSettings: IImageSettings,\n index: number,\n modifiedActiveIndex: number\n ): IMediaGalleryThumbnailItemViewProps => {\n const classes = classnames(\n 'ms-media-gallery__thumbnail-item',\n modifiedActiveIndex === index ? 'ms-media-gallery__thumbnail-item-active' : ''\n );\n\n return {\n ThumbnailItemContainerProps: {\n tag: 'li' as NodeTag,\n className: classes,\n role: 'tab',\n tabIndex: 0,\n key: index,\n 'aria-label': image.altText,\n 'aria-selected': modifiedActiveIndex === index,\n onClick: this._generateOnThumbnailClick(index),\n onKeyDown: this._generateOnThumbnailKeyDown(index)\n },\n Picture: (\n \n )\n };\n };\n\n /**\n * Gets the video thumbnail item to display media gallery.\n * @param props - The Media gallery view props from business layer.\n * @returns Return thumbnail view props which will be used to render video.\n */\n private readonly getVideoThumbNailItem = (\n mediaData: IMediaData,\n imageSettings: IImageSettings,\n index: number,\n modifiedActiveIndex: number\n ): IMediaGalleryThumbnailItemViewProps => {\n const classes = classnames(\n 'ms-media-gallery__thumbnail-item',\n modifiedActiveIndex === index ? 'ms-media-gallery__thumbnail-item-active' : ''\n );\n\n const videoData = mediaData.videoData;\n let image: IImageData;\n if (videoData?.thumbnail) {\n image = videoData.thumbnail;\n } else {\n image = {\n src: 'empty'\n };\n }\n\n return {\n ThumbnailItemContainerProps: {\n tag: 'li' as NodeTag,\n className: classes,\n role: 'tab',\n tabIndex: 0,\n key: index,\n 'aria-label': image.altText,\n 'aria-selected': modifiedActiveIndex === index,\n onClick: this._generateOnThumbnailClick(index),\n onKeyDown: this._generateOnThumbnailKeyDown(index)\n },\n Picture: (\n \n )\n };\n };\n\n /**\n * Ref Handler.\n * @param index -Remove item click function.\n * @returns Set inline zoom.\n */\n private readonly _refHandler = (index: number) => (divRef: HTMLDivElement) => {\n this._inlineZoomDivRef.set(index, divRef);\n };\n\n private readonly _generateOnThumbnailKeyDown = (index: number) => {\n return (event: React.KeyboardEvent) => {\n if (event.which === KeyCodes.Enter || event.which === KeyCodes.Space) {\n event.preventDefault();\n\n this.goToIndex(index);\n }\n };\n };\n\n private readonly _generateOnThumbnailClick = (index: number) => {\n return (event: React.MouseEvent) => {\n event.preventDefault();\n\n this.goToIndex(index);\n };\n };\n\n private _renderImageInlineOnZoom(image: IImageData, imageSettings: IImageSettings, index: number): React.ReactNode {\n return (\n \n \n \n \n );\n }\n\n private _inlineZoomImageOnHover(event: React.MouseEvent): void {\n inlineZoomImageOnHover(event, this.props.config.dataScale ?? String(defaultDataScale));\n }\n\n private _handleMobileViewZoomedImageClick(event: React.MouseEvent) {\n const target = this.state.shouldUseOptimizedImage ? (event.target as HTMLImageElement) : event.currentTarget;\n const mobileZoomedInImageClassName = 'msc-mobile-zoomed-in';\n if (!this.state.isMobileImageZoomed) {\n const bounds = target.getBoundingClientRect();\n const dataScale = Number(this.props.config.dataScale ?? defaultDataScale);\n\n const positionX = event.clientX - bounds.left;\n const positionY = event.clientY - bounds.top;\n const scaledPositionX = positionX * dataScale;\n const scaledPositionY = positionY * dataScale;\n\n target.style.transform = `scale(${dataScale})`;\n target.classList.add(mobileZoomedInImageClassName);\n target.parentElement!.style.overflow = 'auto';\n target.parentElement!.scrollTo(scaledPositionX - positionX, scaledPositionY - positionY);\n this.setState({\n isMobileImageZoomed: true\n });\n } else {\n target.style.transform = '';\n target.classList.remove(mobileZoomedInImageClassName);\n target.parentElement!.style.overflow = '';\n this.setState({\n isMobileImageZoomed: false\n });\n }\n }\n\n private _onInlineImageClick(event: React.MouseEvent): void {\n if (window.innerWidth <= 768) {\n // $msv-breakpoint-m\n this._handleMobileViewZoomedImageClick(event);\n return;\n }\n inlineZoomInitClick(event, this.props.config.dataScale ?? String(defaultDataScale));\n this.setState({\n isImageZoomed: true\n });\n }\n\n private _onImageMouseOut(event: React.MouseEvent): void {\n inlineZoomImageOnMouseOut(event);\n this.setState({\n isImageZoomed: false\n });\n }\n\n private _onContainerZoomImageClick(event: React.MouseEvent): void {\n if (window.innerWidth <= 768) {\n // $msv-breakpoint-m\n this._handleMobileViewZoomedImageClick(event);\n return;\n }\n\n onContainerZoomInit(event);\n\n this.setState({\n isImageZoomed: true\n });\n }\n\n private _onMouseOutLensContainer(event: React.MouseEvent): void {\n onMouseOutLensContainer(event);\n\n this.setState({\n isImageZoomed: false\n });\n }\n\n private _renderImageInContainerOnZoom(image: IImageData, imageSettings: IImageSettings, index: number): React.ReactNode {\n return (\n
\n \n \n
\n );\n }\n\n private _renderImageFullScreenOnZoom(image: IImageData, imageSettings: IImageSettings, index: number): React.ReactNode {\n return (\n
\n \n
\n {}\n \n
\n
\n );\n }\n\n private readonly _renderVideoFullScreen = (mediaData: IMediaData, index: number, imageSettings: IImageSettings): React.ReactNode => {\n const videoData = mediaData.videoData;\n let image: IImageData;\n if (videoData?.thumbnail) {\n image = videoData.thumbnail;\n } else {\n image = {\n src: 'empty'\n };\n }\n\n return (\n
\n \n
\n {}\n \n
\n
\n );\n };\n\n private _mapProductToImageData(product: SimpleProduct): IImageData {\n return {\n src: product.PrimaryImageUrl ?? ''\n };\n }\n\n private _renderEmptyImage(imageSettings: IImageSettings | undefined): React.ReactNode {\n return (\n
\n \n
\n );\n }\n\n private _getEmptyThumbnailItem(\n imageSettings: IImageSettings | undefined,\n index: number,\n modifiedActiveIndex: number\n ): IMediaGalleryThumbnailItemViewProps {\n const classes = classnames(\n 'ms-media-gallery__thumbnail-item',\n modifiedActiveIndex === index ? 'ms-media-gallery__thumbnail-item-active' : ''\n );\n return {\n ThumbnailItemContainerProps: {\n tag: 'li' as NodeTag,\n className: classes,\n role: 'tab',\n tabIndex: 0,\n key: 'empty',\n 'aria-label': '',\n 'aria-selected': modifiedActiveIndex === index,\n onClick: this._generateOnThumbnailClick(index),\n onKeyDown: this._generateOnThumbnailKeyDown(index)\n },\n Picture: (\n \n )\n };\n }\n\n private readonly isFirstItem = () => this.state.activeIndex === 0;\n\n private readonly isLastItem = () => {\n const images = this.state.mediaGalleryItems;\n return images && this.state.activeIndex === images.length - 1;\n };\n\n private readonly openModalDialog = (): void => {\n this._toggleModal();\n };\n\n private _toggleModal(): void {\n if (this.state.modalIsOpen) {\n this.fullScreenOverlayButtonRef.current?.focus();\n const parentDiv = this._inlineZoomDivRef.get(this.state.activeIndex);\n if (parentDiv && parentDiv.children && parentDiv.children.length >= 2) {\n const image = parentDiv.children[1].querySelector('img');\n if (image) {\n image.removeAttribute('style');\n }\n }\n this.setState({\n isImageZoomed: false\n });\n }\n this.setState({\n isImageZoomed: false,\n modalIsOpen: !this.state.modalIsOpen\n });\n removeInlineZoomStyle();\n removeContainerZoomStyle();\n }\n\n private readonly imageModalSlider = (ZoomView: string): React.ReactElement => {\n const {\n data: {\n product: { result: product }\n },\n resources\n } = this.props;\n let mediaGalleryItems = this.state.mediaGalleryItems;\n\n if (!mediaGalleryItems && product) {\n mediaGalleryItems = [this._mapProductToImageData(product)];\n }\n const carouselprops = {\n tag: Carousel,\n className: 'ms-media-gallery__carousel',\n items:\n mediaGalleryItems &&\n mediaGalleryItems.map((item: IImageData, index: number) =>\n this._renderCarouselItemImageView(ZoomView, item, this._zoomedImageSettings, index, true)\n ),\n activeIndex: this.state.activeIndex,\n next: this.next,\n previous: this.previous,\n interval: false,\n directionTextPrev: resources.previousScreenshotFlipperText,\n directionTextNext: resources.nextScreenshotFlipperText,\n onIndicatorsClickHandler: this.goToIndex,\n showPaginationTooltip: true,\n hideIndicator: false,\n keyboard: false,\n handleOnExited: this.onExited,\n handleOnExiting: this.onExiting,\n isDisabledFunctionality: this.state.isMobileImageZoomed\n } as IComponentNodeProps;\n const carousel = ;\n\n const imageModalSliderProps: IModalViewProps = {\n modalIsOpen: this.state.modalIsOpen,\n ontoggle: this._toggleModal,\n galleryCarousel: carousel,\n classNames: classnames('ms-media-gallery__modal', 'msc-modal-input-required')\n };\n return ImagefullView(imageModalSliderProps) as React.ReactElement;\n };\n\n private shouldUseCmsAltText = (): boolean => {\n if (this.props.config.altTextSource === 'product') {\n return false;\n } else {\n return true;\n }\n };\n}\n\nexport default MediaGallery;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\n/* eslint-disable no-duplicate-imports */\nimport { Module, Node } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { IMediaGalleryThumbnailItemViewProps, IMediaGalleryThumbnailsViewProps } from '@msdyn365-commerce-modules/media-gallery';\nimport { IMediaGalleryViewProps } from './media-gallery';\n\nconst MediaGalleryView: React.FC = props => {\n const { CarouselProps, Thumbnails, MediaGallery, Modal, percentageOff } = props;\n const attributesData = props.data.productSpecificationData.result;\n // Sounrced from region\n let sourcedFromText = '';\n if (attributesData && attributesData.length > 0) {\n const filteredSpec = attributesData.filter(sp => {\n return sp.Name && sp?.Name === 'Sourced Region';\n });\n sourcedFromText = filteredSpec && filteredSpec.length > 0 && filteredSpec[0].TextValue ? filteredSpec[0].TextValue : '';\n }\n return (\n \n {percentageOff > 0 && (\n
\n
{percentageOff}% OFF
\n
\n )}\n {sourcedFromText && (\n
\n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n {sourcedFromText}\n
\n )}\n \n {Modal}\n {_renderThumbnails(Thumbnails)}\n
\n );\n};\n\nconst _renderThumbnails = (thumbnails: IMediaGalleryThumbnailsViewProps): JSX.Element => {\n const { ThumbnailsContainerProps, SingleSlideCarouselComponentProps, items } = thumbnails;\n\n return (\n \n {items && items.map(_renderThumbnailItem)}\n \n );\n};\n\nconst _renderThumbnailItem = (thumbnail: IMediaGalleryThumbnailItemViewProps): JSX.Element => {\n const { ThumbnailItemContainerProps, Picture } = thumbnail;\n\n return {Picture};\n};\n\nexport default MediaGalleryView;\n","const binding = { modules: {}, dataActions: {} };\n\n const registerActionId = (actionPath) => {\n if (binding.dataActions[actionPath] &&\n binding.dataActions[actionPath].default &&\n binding.dataActions[actionPath].default.prototype &&\n binding.dataActions[actionPath].default.prototype.id) {\n binding.dataActions[binding.dataActions[actionPath].default.prototype.id] = binding.dataActions[actionPath];\n } else {\n Object.keys(binding.dataActions[actionPath] || {}).forEach(exportName => {\n if (binding.dataActions[actionPath][exportName] &&\n binding.dataActions[actionPath][exportName].prototype &&\n binding.dataActions[actionPath][exportName].prototype.Action) {\n binding.dataActions[binding.dataActions[actionPath][exportName].prototype.id] = binding.dataActions[actionPath][exportName];\n }\n })\n }\n };\n\n const registerSanitizedActionPath = (sanitizedActionPath, dataAction) => {\n if (process.env.NODE_ENV === 'development') {\n if (!dataAction.default) {\n throw new Error('Data action path does not have a default export');\n }\n if (!(dataAction.default.prototype.id && binding.dataActions[dataAction.default.prototype.id]) || !binding.dataActions[sanitizedActionPath]) {\n binding.dataActions[sanitizedActionPath] = dataAction;\n }\n } else {\n binding.dataActions[sanitizedActionPath] = dataAction;\n if (!binding.dataActions[sanitizedActionPath].default) {\n throw new Error('Data action path ' + sanitizedActionPath + ' does not have a default export');\n }\n binding.dataActions[sanitizedActionPath].default.prototype.RegistrationId = sanitizedActionPath;\n if (binding.dataActions[sanitizedActionPath].default.prototype.id) {\n binding.dataActions[binding.dataActions[sanitizedActionPath].default.prototype.id] = sanitizedActionPath;\n }\n }\n };\n \n\n (binding.modules['media-gallery'] = {\n c: () => require('partner/modules/media-gallery/media-gallery.tsx'),\n $type: 'contentModule',\n da: [{name:'mediaLocations', path:'@msdyn365-commerce-modules/retail-actions/dist/lib/get-media-locations-by-id', runOn: 0},{name:'mediaLocationsForSelectedVariant', path:'@msdyn365-commerce-modules/retail-actions/dist/lib/get-media-locations-for-selected-variant', runOn: 0},{name:'product', path:'@msdyn365-commerce-modules/retail-actions/dist/lib/get-selected-variant', runOn: 0},{name:'productPrice', path:'@msdyn365-commerce-modules/retail-actions/dist/lib/get-price-for-selected-variant', runOn: 0},{name:'productSpecificationData', path:'@msdyn365-commerce-modules/product-specification/dist/lib/dataActions/get-attributes-for-selected-variant', runOn: 0}],\n \n iNM: false,\n ns: '__local__',\n n: 'media-gallery',\n p: '__local__',\n \n pdp: '',\n \n \n md: 'src/modules/media-gallery'\n });\n \n\n {\n const sanitizedActionPath = '@msdyn365-commerce-modules/product-specification/dist/lib/dataActions/get-attributes-for-selected-variant';\n let dataAction = require('@msdyn365-commerce-modules/product-specification/dist/lib/dataActions/get-attributes-for-selected-variant');\n registerSanitizedActionPath(sanitizedActionPath, dataAction);\n }\n \n\n {\n const sanitizedActionPath = '@msdyn365-commerce-modules/retail-actions/dist/lib/get-media-locations-by-id';\n let dataAction = require('@msdyn365-commerce-modules/retail-actions/dist/lib/get-media-locations-by-id');\n registerSanitizedActionPath(sanitizedActionPath, dataAction);\n }\n \n\n {\n const sanitizedActionPath = '@msdyn365-commerce-modules/retail-actions/dist/lib/get-media-locations-for-selected-variant';\n let dataAction = require('@msdyn365-commerce-modules/retail-actions/dist/lib/get-media-locations-for-selected-variant');\n registerSanitizedActionPath(sanitizedActionPath, dataAction);\n }\n \n\n {\n const sanitizedActionPath = '@msdyn365-commerce-modules/retail-actions/dist/lib/get-price-for-selected-variant';\n let dataAction = require('@msdyn365-commerce-modules/retail-actions/dist/lib/get-price-for-selected-variant');\n registerSanitizedActionPath(sanitizedActionPath, dataAction);\n }\n \n\n {\n const sanitizedActionPath = '@msdyn365-commerce-modules/retail-actions/dist/lib/get-selected-variant';\n let dataAction = require('@msdyn365-commerce-modules/retail-actions/dist/lib/get-selected-variant');\n registerSanitizedActionPath(sanitizedActionPath, dataAction);\n }\n \n\n \n window.__bindings__ = window.__bindings__ || {};\n window.__bindings__.modules = {\n ...window.__bindings__.modules || {},\n ...binding.modules\n };\n \n window.__bindings__.dataActions = {\n ...window.__bindings__.dataActions || {},\n ...binding.dataActions\n };\n export const viewDictionary = {};\n viewDictionary['__local__|__local__|modules|media-gallery|media-gallery'] = {\n c: () => require('partner/modules/media-gallery/media-gallery.view.tsx'),\n cn: '__local__-__local__-media-gallery'\n };\nviewDictionary['@msdyn365-commerce-modules|media-gallery|modules|media-gallery|media-gallery'] = {\n c: () => require('@msdyn365-commerce-modules/media-gallery/dist/lib/modules/media-gallery/media-gallery.view.js'),\n cn: '@msdyn365-commerce-modules-media-gallery-media-gallery'\n };\nviewDictionary['@msdyn365-commerce-theme|adventureworks-theme-kit|modules|adventureworks|views|media-gallery'] = {\n c: () => require('@msdyn365-commerce-theme/adventureworks-theme-kit/dist/lib/modules/adventureworks/views/media-gallery.view.js'),\n cn: '@msdyn365-commerce-theme-adventureworks-theme-kit-media-gallery'\n };\nwindow.__bindings__ = window.__bindings__ || {};\nwindow.__bindings__.viewDictionary = {\n ...window.__bindings__.viewDictionary || {},\n ...viewDictionary\n };","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nexport interface IClientDimension {\n width: number;\n height: number;\n}\n\n/* A type safe Dictionary */\nexport interface IDictionaryStringString {\n [key: string]: string;\n}\n\n/**\n * @interface IGrid\n * @classdesc - The IGrid interface contract.\n * @export\n */\nexport interface IGrid {\n rows: number;\n columns: number;\n}\n\n/**\n * Clamp position between a range.\n * @param {number} value - Value to be clamped.\n * @param {number} min - Minimum value in range.\n * @param {number} max - Maximum value in range.\n * @returns The clap value if min passed is less than max else returns 0.\n */\nexport function clamp(value: number, min: number, max: number): number {\n if (min <= max) {\n return Math.min(Math.max(value, min), max);\n }\n return 0;\n}\n\n/**\n * Upper case the first letter of the string, if only one char exists on the string, uppercase it.\n * @param {string} value - Value to be upper cased.\n * @returns The upper cased string of the passed value, if it has just one char uppercase it.\n */\nexport function toUpperCaseFirstChar(value: string): string {\n if (value.length > 1) {\n return value.charAt(0).toUpperCase() + value.substr(1);\n }\n if (value.length === 1) {\n return value.charAt(0).toUpperCase();\n }\n return '';\n}\n\nexport function htmlCollectionToArray(nodeList: HTMLCollection): HTMLElement[] {\n return Array.prototype.slice.call(nodeList);\n}\n\nexport function getCSS(element: HTMLElement, property: string): string {\n let style = element.style[property];\n\n if (!style) {\n style = getComputedStyle(element)[property];\n }\n\n return style;\n}\n\nexport function createThrottledEvent(listener: EventListener, threshold: number): (event: Event) => void {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let timer: any;\n let last = 0;\n\n return (event: Event) => {\n const now = Date.now();\n\n if (timer) {\n clearTimeout(timer);\n timer = undefined;\n }\n\n if (last && now < last + threshold) {\n timer = setTimeout(() => {\n last = Date.now();\n listener(event);\n }, threshold - (now - last));\n } else {\n last = now;\n listener(event);\n }\n };\n}\n\nexport function addThrottledEvent(\n target: EventTarget,\n name: string,\n listener: EventListener,\n threshold: number = 150\n): (event: Event) => void {\n const throttledEventHandler = createThrottledEvent(listener, threshold);\n target.addEventListener(name, throttledEventHandler, false);\n\n return throttledEventHandler;\n}\n\n/* RTS utilities */\n/* TODO: Using any here for now, need to convert cssmodules into a dictionary in all modules */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function mapToCssModules(className: string = '', cssModule: any): string {\n if (!cssModule) {\n return className;\n }\n\n return className\n .split(' ')\n .map((c: string) => cssModule[c] || c)\n .join(' ');\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function isRef(target: any): boolean {\n if (!target) {\n return false;\n }\n\n return (>target).current !== undefined;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function isElement(target: any): boolean {\n if (!target) {\n return false;\n }\n\n return (target).addEventListener !== undefined;\n}\n\nexport const keyCodes = {\n esc: 27,\n space: 32,\n tab: 9,\n up: 38,\n down: 40,\n enter: 13\n};\n\ninterface IMap {\n [key: string]: T;\n}\nconst warned: IMap = {};\n\nexport function warnOnce(message: string): void {\n if (!warned[message]) {\n if (typeof console !== 'undefined') {\n throw new Error(message);\n }\n warned[message] = true;\n }\n}\n\nexport const canUseDOM = !!(typeof window !== 'undefined' && window.document && window.document.createElement);\n\nexport function findDOMElements(target: string): NodeListOf | string | null {\n try {\n if (typeof target === 'string' && canUseDOM) {\n let selection = document.querySelectorAll(target);\n\n if (selection.length === 0) {\n selection = document.querySelectorAll(`#${target}`);\n }\n\n if (selection.length === 0) {\n throw new Error();\n }\n return selection;\n }\n\n return target;\n } catch {\n console.error(`The target '${target}' could not be identified in the dom, tip: check spelling`);\n return null;\n }\n}\n\nexport function getTarget(target: string | HTMLElement | React.Ref): HTMLElement | React.Ref | null | string {\n const selection = findDOMElements(target);\n if (selection && selection.length > 0) {\n return selection[0];\n }\n\n return target;\n}\n\nexport function getTargetElement(target: string | HTMLElement | React.Ref): HTMLElement | null {\n const targetElement = getTarget(target);\n if (isRef(targetElement)) {\n return (>targetElement).current;\n }\n if (isElement(targetElement)) {\n return targetElement;\n }\n\n return null;\n}\n\nexport const TransitionTimeouts = {\n Fade: 150,\n Collapse: 350,\n Modal: 300,\n Carousel: 600\n};\n\nexport type TransitionStatuses = 'entering' | 'entered' | 'exiting' | 'exited';\n\nexport const focusableElements = [\n 'a[href]',\n 'area[href]',\n 'input:not([disabled]):not([type=hidden])',\n 'select:not([disabled])',\n 'textarea:not([disabled])',\n 'button:not([disabled])',\n 'iframe',\n 'object',\n 'embed',\n '[tabindex]:not(.modal)',\n 'audio[controls]',\n 'video[controls]',\n '[contenteditable]:not([contenteditable=\"false\"])'\n];\n\n/**\n * @name - extend\n * @description - extends an object with properties/values from one or more others.\n * @export\n * @public\n * @param {any[]} parameters - The objects to merge together.\n * @returns {any} - The extended object.\n */\n\n// eslint-disable-next-line complexity, @typescript-eslint/no-explicit-any\nexport function extend(...parameters: any[]): any {\n if (!parameters || parameters.length === 0) {\n return null;\n }\n\n const recursive = typeof parameters[0] === 'boolean' && parameters[0];\n\n if (parameters.length < 2) {\n return recursive ? null : parameters[0];\n }\n\n if (recursive && parameters.length < 3) {\n return parameters[1];\n }\n\n const target = recursive ? parameters[1] : parameters[0];\n\n for (let paramIndex = recursive ? 2 : 1; paramIndex < parameters.length; paramIndex++) {\n if (parameters[paramIndex] !== undefined) {\n for (const key of Object.keys(parameters[paramIndex])) {\n if (parameters[paramIndex].hasOwnProperty(key)) {\n const source = parameters[paramIndex][key];\n\n if (recursive) {\n let isSourceArray = Array.isArray ? Array.isArray(source) : {}.toString.call(source) === '[object Array]';\n let isTargetArray =\n !!target[key] &&\n (Array.isArray ? Array.isArray(target[key]) : {}.toString.call(target[key]) === '[object Array]');\n let isSourceObject = !isSourceArray && typeof source === 'object';\n let isTargetObject = !isTargetArray && !!target[key] && typeof target[key] === 'object';\n\n if (isSourceArray && isTargetArray) {\n for (const [arrayIndex, element] of source.entries()) {\n isSourceArray = Array.isArray ? Array.isArray(element) : {}.toString.call(element) === '[object Array]';\n isTargetArray =\n !!target[key][arrayIndex] &&\n (Array.isArray\n ? Array.isArray(target[key][arrayIndex])\n : {}.toString.call(target[key][arrayIndex]) === '[object Array]');\n isSourceObject = !isSourceArray && typeof element === 'object';\n isTargetObject = !isTargetArray && !!target[key][arrayIndex] && typeof target[key][arrayIndex] === 'object';\n\n if (isSourceArray) {\n target[key][arrayIndex] = extend(true, isTargetArray ? target[key][arrayIndex] : [], element);\n } else if (isSourceObject) {\n target[key][arrayIndex] = extend(true, isTargetObject ? target[key][arrayIndex] : {}, element);\n } else {\n target[key][arrayIndex] = element;\n }\n }\n continue;\n } else if (isSourceArray) {\n target[key] = extend(true, [], source);\n continue;\n } else if (isSourceObject) {\n target[key] = extend(true, isTargetObject ? target[key] : {}, source);\n continue;\n }\n }\n\n target[key] = source;\n }\n }\n }\n }\n\n return target;\n}\n\n/**\n * @name - getDimensions\n * @description - Gets the dimension of an element.\n * @export\n * @param {HTMLElement} containerElement - The container element.\n * @returns {IClientDimension} - The client dimension.\n * {IClientDimension.width} - The client width\n * {IClientDimension.height} - The client height.\n */\nexport function getDimensions(containerElement: HTMLElement): IClientDimension | null {\n if (containerElement === null) {\n return null;\n }\n return {\n width: containerElement.clientWidth,\n height: containerElement.clientHeight\n };\n}\n\n/**\n * Updates the max quantity for cart line item to default if not configured.\n * @param currentMaxQuantityForCartLineItem - The current max quantity for cart line item.\n * @returns The updated max quantity for cart line item.\n */\nexport function updateMaxQuantityForCartLineItem(currentMaxQuantityForCartLineItem: number | undefined): number {\n const defaultMaxQuantity = 10;\n\n const updatedMaxQuantityForCartLineItem = currentMaxQuantityForCartLineItem || defaultMaxQuantity;\n\n return updatedMaxQuantityForCartLineItem;\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport classNames from 'classnames';\nimport * as React from 'react';\nimport Transition, { ENTERED, ENTERING, EXITED, EXITING, UNMOUNTED } from 'react-transition-group/Transition';\n\nimport { mapToCssModules, TransitionTimeouts } from '../common/utilities';\nimport { IFadeProps } from './Fade.props';\n\nexport interface IFadeState {\n fadeIn: boolean;\n}\n\ntype TransitionStatus = typeof ENTERING | typeof ENTERED | typeof EXITING | typeof EXITED | typeof UNMOUNTED;\n\n/**\n * Fade component.\n */\nexport default class Fade extends React.Component {\n public static defaultProps: Partial = {\n tag: 'div',\n baseClass: 'fade',\n baseClassActive: 'show',\n timeout: TransitionTimeouts.Fade,\n in: true,\n appear: true,\n enter: true,\n exit: true\n };\n\n public shouldComponentUpdate(nextProps: IFadeProps): boolean {\n if (nextProps.in || this.props.in !== nextProps.in) {\n return true;\n }\n return false;\n }\n\n public render(): JSX.Element | null {\n const {\n tag,\n className,\n cssModule,\n baseClass,\n baseClassActive,\n\n appear,\n enter,\n exit,\n in: fadeIn,\n mountOnEnter,\n unmountOnExit,\n timeout: timeoutOrUndefined,\n addEndListener,\n onEnter,\n onEntering,\n onEntered,\n onExit,\n onExiting,\n onExited,\n children,\n\n ...otherProps\n } = this.props;\n const timeout = timeoutOrUndefined !== undefined ? timeoutOrUndefined : TransitionTimeouts.Fade;\n\n const transitionProps = {\n appear,\n enter,\n exit,\n in: fadeIn,\n mountOnEnter,\n unmountOnExit,\n timeout,\n addEndListener,\n onEnter,\n onEntering,\n onEntered,\n onExit,\n onExiting,\n onExited,\n children\n };\n\n const Tag = this.props.tag ? this.props.tag : 'div';\n const baseClassAlways = baseClass || 'fade';\n const baseClassActiveAlways = baseClassActive || 'show';\n\n return (\n \n {(status: TransitionStatus) => {\n const isActive = status === 'entered';\n const classes = mapToCssModules(classNames([className, baseClassAlways, isActive && baseClassActiveAlways]), cssModule);\n\n return (\n \n {children}\n \n );\n }}\n \n );\n }\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\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\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 { 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 { 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 { 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 msdyn365Commerce, {\n IAny,\n ICommerceApiSettings,\n ICoreContext,\n ICreateActionContext,\n IGeneric,\n IRequestContext,\n generateImageUrl as generateImageUrlFromSdk\n} from '@msdyn365-commerce/core';\nimport {\n AsyncResult,\n AttributeValue,\n CartLine,\n ChannelDeliveryOptionConfiguration,\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 = (\n itemId: string | undefined,\n apiSettings: ICommerceApiSettings,\n isOmniFeatureEnabled?: boolean\n): string | undefined => {\n if (!itemId || isOmniFeatureEnabled) {\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?.DimensionId || 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/**\n * Utility function to check deliveryMode .\n * @param cartline - CartLine item.\n * @param retailMulitplePickupFeatureState - pickUp feature state, default to false.\n * @param channelDeliveryOptionConfig - Channel Delivery Option Configuration.\n * @param pickupDeliveryModeCode -pickUp delivery mode code string.\n * @returns true id cartline item is pickUp item else false.\n */\nexport const 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 * Utility function to check if cartline item is pickupitem .\n * @param cartline - CartLine item.\n * @param retailMulitplePickupFeatureState - pickUp feature state.\n * @param channelDeliveryOptionConfig - Channel Delivery Option Configuration.\n * @param pickupDeliveryModeCode -pickUp delivery mode code string.\n * @returns true id cartline item is pickUp item else false.\n */\nexport const isCartLineItemPickUpType = (\n cartline: CartLine,\n retailMulitplePickupFeatureState: boolean = false,\n channelDeliveryOptionConfig?: ChannelDeliveryOptionConfiguration,\n pickupDeliveryModeCode?: string\n): boolean => {\n // check if cartlineitem is pickup item\n if (\n cartline.DeliveryMode &&\n cartline.DeliveryMode !== '' &&\n getDeliveryMode(cartline, retailMulitplePickupFeatureState, channelDeliveryOptionConfig, pickupDeliveryModeCode)\n ) {\n return true;\n }\n return false;\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 { 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\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 {\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 { 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 { 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\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\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 public readonly isMultipleCatalogFeatureEnabledInHq?: boolean;\n public readonly catalogId?: number | undefined;\n\n public constructor(\n productListId: string,\n productId: number,\n quantity: number,\n unitOfMeasure: string,\n isMultipleCatalogFeatureEnabledInHq?: boolean,\n catalogId?: number | undefined\n ) {\n this.productListId = productListId;\n this.productId = productId;\n this.quantity = quantity;\n this.unitOfMeasure = unitOfMeasure || 'ea';\n this.isMultipleCatalogFeatureEnabledInHq = isMultipleCatalogFeatureEnabledInHq;\n this.catalogId = catalogId;\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 isMultipleCatalogFeatureEnabledInHq?: boolean,\n catalogId?: number | undefined\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(\n productListId,\n productId,\n quantity,\n unitOfMeasure,\n isMultipleCatalogFeatureEnabledInHq || false,\n catalogId\n );\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 catalogId = input.catalogId;\n const productListLineToAdd: ProductListLine = {\n ProductListId: input.productListId,\n ProductId: input.productId,\n Quantity: input.quantity,\n UnitOfMeasure: input.unitOfMeasure,\n ...(input.isMultipleCatalogFeatureEnabledInHq && { catalogId: catalogId })\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 {\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 {\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 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 { 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 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 {\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 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 { 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 { 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 { 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 {\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 { IActionContext } from '@msdyn365-commerce/core';\nimport { addCartLinesAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/CartsDataActions.g';\nimport { Cart, CartLine } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\n\nimport { ICartActionResultWithCart } from './cart-action-result';\n\nconst quantityErrors: string[] = [\n 'Microsoft_Dynamics_Commerce_Runtime_AddingItem_ExceedsMaximumQuantity',\n 'Microsoft_Dynamics_Commerce_Runtime_UpdatingItem_ExceedsMaximumQuantity',\n 'Microsoft_Dynamics_Commerce_Runtime_AddingItem_QuantityExceedsMaximumAndViolatesMultiplicityOfConfiguredNumber',\n 'Microsoft_Dynamics_Commerce_Runtime_UpdatingItem_QuantityExceedsMaximumAndViolatesMultiplicityOfConfiguredNumber',\n 'Microsoft_Dynamics_Commerce_Runtime_ItemQuantityLessThanMinimumAndViolatesMultiplicityOfConfiguredNumber',\n 'Microsoft_Dynamics_Commerce_Runtime_ItemQuantityLessThanMinimum',\n 'Microsoft_Dynamics_Commerce_Runtime_ItemQuantityExceedsMaximum',\n 'Microsoft_Dynamics_Commerce_Runtime_ItemQuantityViolatesMultiplicityOfConfiguredNumber'\n];\n\n/**\n * Get the quantity limit.\n * @param maxQuantityForCartLineItem - Max quantity for cart line.\n * @param inputItem - The input item.\n * @param inputItem.cartLineToAdd - Cart line to add.\n * @param inputItem.availableQuantity - Available quantity.\n * @param inputItem.shouldEnableStockCheck - Is stock check enabled.\n * @param inputItem.isAddServiceItemToCart - Is add service item to cart.\n * @returns The quantity limit.\n */\nfunction getQuantityLimit(\n maxQuantityForCartLineItem: number | undefined,\n inputItem: {\n cartLineToAdd: CartLine;\n availableQuantity?: number;\n shouldEnableStockCheck?: boolean;\n isAddServiceItemToCart?: boolean;\n }\n): number {\n let quantityLimit: number;\n const defaultSiteMaxQuantity = 10;\n\n if (inputItem.shouldEnableStockCheck === false) {\n quantityLimit = maxQuantityForCartLineItem ?? defaultSiteMaxQuantity;\n } else if (maxQuantityForCartLineItem === undefined && inputItem.availableQuantity === undefined) {\n quantityLimit = defaultSiteMaxQuantity;\n } else if (inputItem.availableQuantity === undefined) {\n quantityLimit = maxQuantityForCartLineItem ?? defaultSiteMaxQuantity;\n } else if (maxQuantityForCartLineItem === undefined) {\n quantityLimit = inputItem.availableQuantity;\n } else {\n quantityLimit = Math.min(maxQuantityForCartLineItem, inputItem.availableQuantity);\n }\n\n return quantityLimit;\n}\n\n/**\n * Get the index of the item to add.\n * @param lines - The cart lines.\n * @param cartLineToAdd - The cart line to add.\n * @returns The index of the item to add.\n */\nfunction getElementIndex(lines: CartLine[], cartLineToAdd: CartLine): number {\n let elementFoundAt: number = -1;\n const productIdToFind = cartLineToAdd.ProductId;\n\n for (const [index, line] of lines.entries()) {\n if (\n line.ProductId === productIdToFind &&\n (line.DeliveryMode || '') === (cartLineToAdd.DeliveryMode || '') &&\n (line.FulfillmentStoreId || '') === (cartLineToAdd.FulfillmentStoreId || '')\n ) {\n elementFoundAt = index;\n\n break;\n }\n }\n\n return elementFoundAt;\n}\n\nasync function addProductsToCartValidateAgainstDefaultOrderSettings(\n cart: Readonly,\n actionContext: IActionContext,\n input: {\n cartLineToAdd: CartLine;\n availableQuantity?: number;\n enableStockCheck?: boolean;\n isAddServiceItemToCart?: boolean;\n }[]\n): Promise {\n if (!cart.CartLines) {\n return { cart: undefined, status: 'FAILED', substatus: 'EMPTYCART' };\n }\n\n for (const inputItem of input) {\n if (inputItem.enableStockCheck && inputItem.availableQuantity) {\n let elementFoundAt: number = -1;\n const productIdToFind = inputItem.cartLineToAdd.ProductId;\n\n for (let i = 0; i < cart.CartLines.length; i++) {\n if (\n cart.CartLines[i].ProductId === productIdToFind &&\n (cart.CartLines[i].DeliveryMode || '') === (inputItem.cartLineToAdd.DeliveryMode || '') &&\n (cart.CartLines[i].FulfillmentStoreId || '') === (inputItem.cartLineToAdd.FulfillmentStoreId || '')\n ) {\n elementFoundAt = i;\n\n break;\n }\n }\n\n if (!inputItem.isAddServiceItemToCart && elementFoundAt !== -1) {\n const cartLineToUpdate = { ...cart.CartLines[elementFoundAt] };\n const curQuantity = cartLineToUpdate.Quantity || 0;\n\n if (curQuantity + (inputItem.cartLineToAdd.Quantity || 1) > inputItem.availableQuantity) {\n return {\n cart: {\n Id: cart.Id,\n CartLines: cart.CartLines\n },\n status: 'FAILED',\n substatus: 'MAXQUANTITY'\n };\n }\n }\n }\n }\n\n const newCartLines = input.map(inputItem => {\n const cartLine = { ...inputItem.cartLineToAdd };\n return cartLine;\n });\n let addCartLinesResult: ICartActionResultWithCart;\n\n if (cart.Version) {\n return addCartLinesAsync({ callerContext: actionContext }, cart.Id, newCartLines, cart.Version)\n .then(newCart => {\n addCartLinesResult = { cart: newCart, status: 'SUCCESS', substatus: 'PRODUCTADDED' };\n return addCartLinesResult;\n })\n .catch(error => {\n actionContext.telemetry.trace(error);\n actionContext.telemetry.trace('Unable to add Cart Line');\n\n const isQuantityError = quantityErrors.includes(error.name);\n\n if (isQuantityError) {\n addCartLinesResult = {\n cart: undefined,\n status: 'FAILED',\n substatus: 'QUANTITYLIMITS',\n errorDetails: { LocalizedMessage: error.message }\n };\n return addCartLinesResult;\n }\n\n const hasInvoiceInCart = cart.CartLines?.find(cartline => cartline.IsInvoiceLine === true);\n if (hasInvoiceInCart) {\n addCartLinesResult = {\n cart: undefined,\n status: 'FAILED',\n substatus: 'INVOICEINCART',\n errorDetails: { LocalizedMessage: error.message }\n };\n return addCartLinesResult;\n }\n\n addCartLinesResult = {\n cart: undefined,\n status: 'FAILED',\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access -- existing error type.\n errorDetails: { LocalizedMessage: error.message },\n validationResults: error.data?.ValidationResults\n };\n\n return addCartLinesResult;\n });\n }\n actionContext.telemetry.warning('Unable to update Cart Line, Cart Version could not be found');\n\n addCartLinesResult = { cart: undefined, status: 'FAILED', substatus: 'NOCARTVERSION' };\n return addCartLinesResult;\n}\n\nasync function addProductsToCartValidateAgainstSiteSettings(\n cart: Readonly,\n actionContext: IActionContext,\n input: {\n cartLineToAdd: CartLine;\n availableQuantity?: number;\n enableStockCheck?: boolean;\n isAddServiceItemToCart?: boolean;\n }[]\n): Promise {\n if (!cart.CartLines) {\n return { cart: undefined, status: 'FAILED', substatus: 'EMPTYCART' };\n }\n\n const maxQuantityForCartLineItem: number | undefined = actionContext.requestContext.app.config.maxQuantityForCartLineItem;\n\n for (const inputItem of input) {\n const quantityLimit: number = getQuantityLimit(maxQuantityForCartLineItem, {\n cartLineToAdd: inputItem.cartLineToAdd,\n availableQuantity: inputItem.availableQuantity,\n shouldEnableStockCheck: inputItem.enableStockCheck,\n isAddServiceItemToCart: inputItem.isAddServiceItemToCart\n });\n const elementFoundAt: number = getElementIndex(cart.CartLines, inputItem.cartLineToAdd);\n\n if (!inputItem.isAddServiceItemToCart && elementFoundAt !== -1) {\n const cartLineToUpdate = { ...cart.CartLines[elementFoundAt] };\n const currentQuantity = cartLineToUpdate.Quantity || 0;\n\n if (currentQuantity + (inputItem.cartLineToAdd.Quantity || 1) > quantityLimit) {\n return {\n cart: {\n Id: cart.Id,\n CartLines: cart.CartLines\n },\n status: 'FAILED',\n substatus: 'MAXQUANTITY'\n };\n }\n }\n\n if (\n !inputItem.isAddServiceItemToCart &&\n inputItem.cartLineToAdd &&\n inputItem.cartLineToAdd.Quantity &&\n inputItem.cartLineToAdd.Quantity > quantityLimit\n ) {\n return {\n cart: {\n Id: cart.Id,\n CartLines: cart.CartLines\n },\n status: 'FAILED',\n substatus: 'MAXQUANTITY'\n };\n }\n }\n\n const newCartLines = input.map(inputItem => {\n const cartLine = { ...inputItem.cartLineToAdd };\n cartLine.Quantity = cartLine.Quantity || 1;\n return cartLine;\n });\n let cartActionResult: ICartActionResultWithCart;\n\n if (cart.Version) {\n return addCartLinesAsync({ callerContext: actionContext }, cart.Id, newCartLines, cart.Version)\n .then(newCart => {\n cartActionResult = { cart: newCart, status: 'SUCCESS', substatus: 'PRODUCTADDED' };\n return cartActionResult;\n })\n .catch(error => {\n actionContext.telemetry.trace(error);\n actionContext.telemetry.trace('Unable to add Cart Line');\n\n const hasInvoiceInCart = cart.CartLines?.find(cartline => cartline.IsInvoiceLine === true);\n if (hasInvoiceInCart) {\n cartActionResult = {\n cart: undefined,\n status: 'FAILED',\n substatus: 'INVOICEINCART',\n errorDetails: { LocalizedMessage: error.message }\n };\n return cartActionResult;\n }\n\n cartActionResult = {\n cart: undefined,\n status: 'FAILED',\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access -- existing error type.\n errorDetails: { LocalizedMessage: error.message },\n validationResults: error.data?.ValidationResults\n };\n return cartActionResult;\n });\n }\n actionContext.telemetry.warning('Unable to update Cart Line, Cart Version could not be found');\n\n cartActionResult = { cart: undefined, status: 'FAILED', substatus: 'NOCARTVERSION' };\n return cartActionResult;\n}\n\n/**\n * Add products to cart without site settings validation.\n * @param cart - The cart.\n * @param actionContext - The action context.\n * @param input - The cart lines to add.\n * @returns The results.\n */\nasync function addProductsToCartWithoutSiteSettings(\n cart: Readonly,\n actionContext: IActionContext,\n input: {\n cartLineToAdd: CartLine;\n }[]\n): Promise {\n if (!cart.CartLines) {\n return { cart: undefined, status: 'FAILED', substatus: 'EMPTYCART' };\n }\n\n const defaultQuantity = 1;\n const newCartLines = input.map(inputItem => {\n const cartLine = { ...inputItem.cartLineToAdd };\n cartLine.Quantity = cartLine.Quantity ?? defaultQuantity;\n return cartLine;\n });\n let addCartLinesResult: ICartActionResultWithCart;\n\n if (cart.Version) {\n return addCartLinesAsync({ callerContext: actionContext }, cart.Id, newCartLines, cart.Version)\n .then(newCart => {\n addCartLinesResult = { cart: newCart, status: 'SUCCESS', substatus: 'PRODUCTADDED' };\n return addCartLinesResult;\n })\n .catch(error => {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument -- existing error type.\n actionContext.telemetry.trace(error);\n actionContext.telemetry.trace('Unable to add cart lines');\n\n addCartLinesResult = {\n cart: undefined,\n status: 'FAILED',\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access -- existing error type.\n errorDetails: { LocalizedMessage: error.message },\n validationResults: error.data?.ValidationResults\n };\n return addCartLinesResult;\n });\n }\n\n actionContext.telemetry.warning('Unable to update cart lines, cart version could not be found');\n\n addCartLinesResult = { cart: undefined, status: 'FAILED', substatus: 'NOCARTVERSION' };\n return addCartLinesResult;\n}\n\nexport async function addProductsToCartInternal(\n cart: Readonly,\n actionContext: IActionContext,\n input: {\n cartLineToAdd: CartLine;\n availableQuantity?: number;\n isStockCheckEnabled?: boolean;\n isAddServiceItemToCart?: boolean;\n }[]\n): Promise {\n return addProductsToCartWithoutSiteSettings(cart, actionContext, input);\n}\n\nexport async function addProductToCartInternal(\n cart: Readonly,\n cartLineToAdd: CartLine,\n actionContext: IActionContext,\n validateOrderQuantityLimits: boolean,\n availableQuantity?: number,\n enableStockCheck?: boolean,\n isAddServiceItemToCart?: boolean,\n shouldSkipSiteSettings?: boolean\n): Promise {\n if (shouldSkipSiteSettings) {\n return addProductsToCartWithoutSiteSettings(cart, actionContext, [{ cartLineToAdd }]);\n }\n\n if (validateOrderQuantityLimits) {\n return addProductsToCartValidateAgainstDefaultOrderSettings(cart, actionContext, [\n { cartLineToAdd, availableQuantity, enableStockCheck, isAddServiceItemToCart }\n ]);\n }\n return addProductsToCartValidateAgainstSiteSettings(cart, actionContext, [\n { cartLineToAdd, availableQuantity, enableStockCheck, isAddServiceItemToCart }\n ]);\n}\n\nexport default addProductToCartInternal;\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 { addDiscountCodeAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/CartsDataActions.g';\nimport { Cart, Coupon } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\n\nimport { ICartActionResultWithCart } from './cart-action-result';\n\nexport default async function addPromoCode(\n cart: Readonly,\n promoCode: string,\n actionContext: IActionContext\n): Promise {\n if (!cart) {\n return { cart: undefined, status: 'FAILED', substatus: 'EMPTYCART' };\n }\n\n if (hasPromoCode(cart, promoCode)) {\n return { cart: undefined, status: 'FAILED', substatus: 'ALREADYADDED' };\n }\n\n return addDiscountCodeAsync({ callerContext: actionContext }, cart.Id, promoCode)\n .then(newCart => {\n // Retail server will still return success if a promo code is not valid,\n // but it won't actually add that promo code. So need to check if promo\n // code is actually in the new cart\n if (hasPromoCode(newCart, promoCode)) {\n return { cart: newCart, status: 'SUCCESS' };\n }\n return { cart: undefined, status: 'FAILED', substatus: 'INVALIDPROMOCODE' };\n })\n .catch(error => {\n actionContext.telemetry.warning(error);\n const resultWithCart: ICartActionResultWithCart = {\n cart: undefined,\n status: 'FAILED',\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access -- existing error type.\n errorDetails: { LocalizedMessage: error.message }\n };\n\n return resultWithCart;\n });\n}\n\nfunction hasPromoCode(cart: Cart, code: string): boolean {\n const codes = cart.Coupons\n ? cart.Coupons.map((coupon: Coupon) => {\n return coupon.Code!.toLowerCase();\n })\n : [];\n return codes.includes(code.toLowerCase());\n}\n","/*! *****************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (_) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport function __createBinding(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n}\r\n\r\nexport function __exportStar(m, exports) {\r\n for (var p in m) if (p !== \"default\" && !exports.hasOwnProperty(p)) exports[p] = m[p];\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n};\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];\r\n result.default = mod;\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, privateMap) {\r\n if (!privateMap.has(receiver)) {\r\n throw new TypeError(\"attempted to get private field on non-instance\");\r\n }\r\n return privateMap.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, privateMap, value) {\r\n if (!privateMap.has(receiver)) {\r\n throw new TypeError(\"attempted to set private field on non-instance\");\r\n }\r\n privateMap.set(receiver, value);\r\n return value;\r\n}\r\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IActionContext } from '@msdyn365-commerce/core';\nimport { computed, observable } from 'mobx';\n\nimport { GlobalStateStatus, IGlobalState } from './i-global-state';\n\n/**\n * Base global state that handles common global state behavior that other state can extend from.\n */\nexport class GlobalState implements IGlobalState {\n protected isInitialized: boolean = false;\n\n protected actionContext: IActionContext;\n\n @observable protected _status: GlobalStateStatus;\n\n @computed public get status(): Readonly {\n return this._status;\n }\n\n constructor(actionContext: IActionContext) {\n this.actionContext = actionContext;\n this._status = 'UPDATING';\n }\n\n public async initialize(): Promise {\n this.isInitialized = true;\n this._status = 'READY';\n\n return;\n }\n\n protected async _doAsyncAction(lambda: () => Promise): Promise {\n this._status = 'UPDATING';\n\n return lambda()\n .then(result => {\n this._status = 'READY';\n return result;\n })\n .catch(error => {\n console.log(error);\n this._status = 'ERROR';\n\n return Promise.reject(error);\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 { IActionContext } from '@msdyn365-commerce/core';\nimport { updateCartLinesAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/CartsDataActions.g';\nimport { Cart, CartLine } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\n\nimport { ICartActionResultWithCart } from './cart-action-result';\n\nexport default async function clearCartLineDeliveryMode(\n cart: Readonly,\n cartLineId: string,\n actionContext: IActionContext\n): Promise {\n if (!cart || !cart.CartLines) {\n return { cart: undefined, status: 'FAILED', substatus: 'EMPTYCART' };\n }\n\n const matchingLines = cart.CartLines.filter(cartLine => cartLine.LineId === cartLineId);\n\n if (matchingLines.length === 0) {\n return { cart: undefined, status: 'FAILED', substatus: 'NOMATCHEDCARTLINE' };\n }\n\n const copyCartLine: CartLine = { ...matchingLines[0] };\n\n copyCartLine.DeliveryMode = '';\n copyCartLine.FulfillmentStoreId = '';\n copyCartLine.ShippingAddress = {};\n copyCartLine.WarehouseId = actionContext.requestContext.channel?.InventLocation || cart.WarehouseId;\n\n return updateCartLinesAsync({ callerContext: actionContext }, cart.Id, [copyCartLine], null)\n .then(newCart => {\n return { cart: newCart, status: 'SUCCESS' };\n })\n .catch(error => {\n actionContext.telemetry.warning(error);\n actionContext.telemetry.debug('Unable to Update Cart Line');\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access -- existing error type.\n return { cart: undefined, status: 'FAILED', errorDetails: { LocalizedMessage: error.message } };\n });\n}\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 { FeatureState } from '@msdyn365-commerce/retail-proxy';\nimport {\n addCartLinesAsync,\n addCouponsAsync,\n createCartAsync,\n readAsync,\n removeCartLinesAsync,\n searchAsync,\n updateAsync\n} from '@msdyn365-commerce/retail-proxy/dist/DataActions/CartsDataActions.g';\nimport {\n getChannelDeliveryOptionConfigurationAsync,\n getCustomerLoyaltyCardsAsync,\n getFeatureStatesAsync\n} from '@msdyn365-commerce/retail-proxy/dist/DataActions/StoreOperationsDataActions.g';\nimport {\n Cart,\n CartLine,\n CartSearchCriteria,\n Coupon,\n QueryResultSettings\n} from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\nimport isEmpty from 'lodash/isEmpty';\n\nenum CartTokenPrefix {\n Auth = 't',\n Anon = 'p'\n}\n\nexport default async function getOrCreateActiveCart(ctx: IActionContext): Promise {\n let cart: Cart | undefined;\n const cartCookie: string = ctx.requestContext.cookies.getCartCookie();\n const cartCookieParts: string[] = cartCookie.split(':');\n try {\n // Check if there are already is a cart cookie and it is in the format we understand\n cart = await getCartFromCookie(cartCookieParts, ctx);\n const wasReadFromCookie = !!cart && cart.Id;\n\n // If the customer is authenticated, and the auth cookie didn't give us a cart OR doesn't have a cookie, search for the customer's cart\n if (!(cart && cart.Id)) {\n cart = await getCartFromCustomer(ctx);\n }\n\n // If the customer just went from anon to signed in state then get that anon cart\n // if the search of carts didn't result in a cart, claim the current anon cart as a new auth cart for the customer\n // if the search resulted in a cart, and the read also resulted in cart, then go ahead an merge the carts\n const anonCart = await claimAnonCart(cartCookieParts, cart, ctx);\n if (anonCart) {\n cart = anonCart;\n }\n\n // If there is no cookie or everything else fails, create an empty cart and return that for the customer\n if (!(cart && cart.Id)) {\n cart = await createNewCart(ctx);\n }\n if (!wasReadFromCookie && ctx.requestContext.user.isAuthenticated && cart && !cart.LoyaltyCardId) {\n const card = await getCustomerLoyaltyCardsAsync({ callerContext: ctx, queryResultSettings: {} }, null);\n if (card && card.length > 0) {\n cart = await updateAsync(\n { callerContext: ctx },\n {\n Id: cart.Id,\n LoyaltyCardId: card[0].CardNumber\n }\n );\n }\n }\n } catch (error) {\n ctx.telemetry.error(`Caught exception in getting cart: ${error}`);\n cart = await createNewCart(ctx);\n }\n return cart;\n}\n\n/**\n * Function to check cart exception due to product no available\n *\n * @param ctx Request context.\n * @param errorObj Error Object.\n */\nfunction handleItemDiscontinuedException(ctx: IActionContext, errorObj: object): boolean {\n const error = errorObj as Error;\n let response = false;\n if (error && error.name === 'Microsoft_Dynamics_Commerce_Runtime_ItemDiscontinuedFromChannel') {\n ctx.telemetry.information('Caught cart ItemDiscontinuedException error.');\n response = true;\n }\n\n return response;\n}\n\nexport async function createNewCart(ctx: IActionContext): Promise {\n const newCart = await createCartAsync({ callerContext: ctx }, {});\n if (newCart && newCart.Id) {\n ctx.requestContext.cookies.setCartCookie(newCart, ctx.requestContext.user.isAuthenticated);\n\n return newCart;\n }\n\n return undefined;\n}\n\nexport async function getCartFromCookie(cartCookieParts: string[], ctx: IActionContext): Promise {\n let readCart: Cart | undefined;\n let readCartId: string = '';\n\n const isAuthenticated = ctx.requestContext.user.isAuthenticated;\n if (cartCookieParts && cartCookieParts.length === 2) {\n // If the customer is authenticated and they have an auth cookie\n // OR if the customer is not authenticated and then have an anon cookie\n // just get the cart and return that\n\n if (\n (isAuthenticated && cartCookieParts[0] === CartTokenPrefix.Auth) ||\n (!isAuthenticated && cartCookieParts[0] === CartTokenPrefix.Anon)\n ) {\n try {\n readCartId = cartCookieParts[1];\n const readCart = await readAsync({ callerContext: ctx, bypassCache: 'none' }, cartCookieParts[1]);\n\n if (readCart && readCart.Id) {\n ctx.requestContext.cookies.setCartCookie(readCart, ctx.requestContext.user.isAuthenticated);\n return readCart;\n }\n } catch (error) {\n if (handleItemDiscontinuedException(ctx, error)) {\n readCart = await readAsync({ callerContext: ctx, bypassCache: 'none' }, readCartId);\n }\n ctx.telemetry.error('Error getting cart based on saved card id');\n ctx.telemetry.exception(error);\n }\n }\n }\n\n return readCart;\n}\n\nexport async function getCartFromCustomer(ctx: IActionContext): Promise {\n if (ctx.requestContext.user.isAuthenticated) {\n const authCarts = await searchCarts(ctx);\n if (authCarts && authCarts.length > 0) {\n ctx.requestContext.cookies.setCartCookie(authCarts[0], ctx.requestContext.user.isAuthenticated);\n return authCarts[0];\n }\n }\n\n return undefined;\n}\n\nexport async function claimAnonCart(\n cartCookieParts: string[],\n currentCart: Cart | undefined,\n ctx: IActionContext\n): Promise {\n let anonCurrentCart: Cart | undefined;\n\n if (\n ctx.requestContext.user.isAuthenticated &&\n cartCookieParts &&\n cartCookieParts.length === 2 &&\n cartCookieParts[0] === CartTokenPrefix.Anon\n ) {\n try {\n anonCurrentCart = await readAsync({ callerContext: ctx, bypassCache: 'none' }, cartCookieParts[1]);\n } catch (error) {\n if (handleItemDiscontinuedException(ctx, error)) {\n anonCurrentCart = await readAsync({ callerContext: ctx, bypassCache: 'none' }, cartCookieParts[1]);\n }\n }\n\n if (anonCurrentCart && !currentCart) {\n const newCart = await claimCart(anonCurrentCart.Id, ctx);\n if (newCart && newCart.Id) {\n ctx.requestContext.cookies.setCartCookie(newCart, ctx.requestContext.user.isAuthenticated);\n return newCart;\n }\n }\n\n if (anonCurrentCart && anonCurrentCart.Id && currentCart) {\n const mergedCart = await addCartLines(anonCurrentCart, currentCart, ctx);\n\n // Once updated, take that merged cart ID and store the cart ID in the cookie\n if (!(mergedCart instanceof Error) && mergedCart.Id) {\n ctx.requestContext.cookies.setCartCookie(mergedCart, ctx.requestContext.user.isAuthenticated);\n return mergedCart;\n }\n }\n }\n\n return undefined;\n}\n\n/**\n * Function that copies a cartline for giftcard.\n * @param cartline Source CartLine you want to copy.\n */\nfunction buildGiftCardLine(cartline: CartLine): CartLine {\n return {\n DeliveryMode: cartline.DeliveryMode,\n CatalogId: cartline.CatalogId,\n Description: cartline.Description,\n EntryMethodTypeValue: cartline.EntryMethodTypeValue || 3,\n ItemId: cartline.ItemId,\n ProductId: cartline.ProductId,\n Quantity: cartline.Quantity,\n Price: cartline.Price,\n NetPrice: cartline.NetPrice,\n GiftCardBalance: cartline.GiftCardBalance,\n TrackingId: '',\n UnitOfMeasureSymbol: cartline.UnitOfMeasureSymbol,\n IsPriceKeyedIn: true,\n IsGiftCardLine: true,\n ExtensionProperties: cartline.ExtensionProperties\n };\n}\n\n/**\n * Function that adds cart lines from source cart to destination cart.\n * @param sourceCart Source cart you want to add cart lines from.\n * @param destinationCart Destination cart that you want to add cart lines to.\n * @param ctx Request context.\n */\nexport async function addCartLines(sourceCart: Cart, destinationCart: Cart, ctx: IActionContext): Promise {\n let updatedCart;\n const cartLines: CartLine[] = [];\n const cartLinesToDelete: string[] = [];\n let hasShippingMethod: boolean;\n const channelConfiguration = ctx.requestContext.channel;\n const featureNames: string[] = ['Dynamics.AX.Application.RetailMultiplePickupDeliveryModeFeature'];\n if (destinationCart.Version) {\n if (sourceCart.CartLines && sourceCart.CartLines.length > 0) {\n for (const cartline of sourceCart.CartLines) {\n let newCartLine: CartLine;\n\n if (cartline.IsGiftCardLine) {\n newCartLine = buildGiftCardLine(cartline);\n } else {\n newCartLine = {};\n const featureStates = await getFeatureStatesAsync({ callerContext: ctx }, featureNames);\n const isfeatureStatesEnabled =\n featureStates?.find(\n (featureState: FeatureState) =>\n featureState.Name === 'Dynamics.AX.Application.RetailMultiplePickupDeliveryModeFeature'\n )?.IsEnabled || false;\n if (isfeatureStatesEnabled) {\n const channelDeliveryOptionConfig = await getChannelDeliveryOptionConfigurationAsync({ callerContext: ctx });\n hasShippingMethod =\n cartline.DeliveryMode ===\n channelDeliveryOptionConfig.PickupDeliveryModeCodes?.find(\n (deliveryMode: string) => deliveryMode === cartline.DeliveryMode\n );\n\n if (cartline.DeliveryMode !== undefined && hasShippingMethod) {\n newCartLine.DeliveryMode = cartline.DeliveryMode;\n newCartLine.FulfillmentStoreId = cartline.FulfillmentStoreId;\n newCartLine.ShippingAddress = cartline.ShippingAddress;\n newCartLine.WarehouseId = cartline.WarehouseId;\n }\n } else if (!isEmpty(cartline.DeliveryMode) && cartline.DeliveryMode === channelConfiguration?.PickupDeliveryModeCode) {\n newCartLine.DeliveryMode = channelConfiguration?.PickupDeliveryModeCode;\n newCartLine.FulfillmentStoreId = cartline.FulfillmentStoreId;\n newCartLine.ShippingAddress = cartline.ShippingAddress;\n newCartLine.WarehouseId = cartline.WarehouseId;\n }\n newCartLine.ProductId = cartline.ProductId;\n newCartLine.Quantity = cartline.Quantity;\n newCartLine.ExtensionProperties = cartline.ExtensionProperties;\n newCartLine.Description = cartline.Description;\n newCartLine.ReasonCodeLines = cartline.ReasonCodeLines;\n newCartLine.AttributeValues = cartline.AttributeValues;\n newCartLine.CatalogId = cartline.CatalogId;\n newCartLine.EntryMethodTypeValue = cartline.EntryMethodTypeValue;\n newCartLine.ItemId = cartline.ItemId;\n\n // without unitofmeasure cartline wont be aggregated in customer cart.\n newCartLine.UnitOfMeasureSymbol = cartline.UnitOfMeasureSymbol;\n if (cartline.IsPriceKeyedIn) {\n newCartLine.Price = cartline.Price;\n newCartLine.IsPriceKeyedIn = cartline.IsPriceKeyedIn;\n }\n }\n\n cartLines.push({ ...newCartLine });\n if (cartline.LineId) {\n cartLinesToDelete.push(cartline.LineId);\n }\n }\n }\n\n if (cartLines.length > 0) {\n try {\n updatedCart = await addCartLinesAsync({ callerContext: ctx }, destinationCart.Id, cartLines, destinationCart.Version);\n\n if (cartLinesToDelete.length > 0) {\n sourceCart = await removeCartLinesAsync({ callerContext: ctx }, sourceCart.Id, cartLinesToDelete);\n }\n } catch (error) {\n ctx.telemetry.error('Error adding cart lines to desination cart');\n ctx.telemetry.exception(error);\n return destinationCart;\n }\n }\n\n // Copy over coupon codes from source cart to destination cart so that the customer doesn't lose couponCodes while migration\n if (sourceCart.Coupons && sourceCart.Coupons.length > 0) {\n const coupons = sourceCart.Coupons.map((coupon: Coupon) => {\n return coupon.Code!;\n });\n\n try {\n updatedCart = await addCouponsAsync({ callerContext: ctx }, destinationCart.Id, coupons, false);\n } catch (error) {\n ctx.telemetry.error('Error adding existing coupon codes to the cart');\n ctx.telemetry.exception(error);\n return destinationCart;\n }\n }\n }\n\n return updatedCart || destinationCart;\n}\n\n/**\n * Function to claim a cart as auth cart and set the browser cookie accordingly.\n *\n * @param cartId Cart Id to claim as auth cart.\n * @param ctx Request Context.\n */\nexport async function claimCart(cartId: string, ctx: IActionContext): Promise {\n const claimAuthCart = await updateAsync(\n { callerContext: ctx },\n {\n Id: cartId\n }\n );\n if (!(claimAuthCart instanceof Error) && claimAuthCart && claimAuthCart.Id) {\n return claimAuthCart;\n }\n return {};\n}\n\n/**\n * Function to search carts that belong to a customer.\n *\n * @param ctx Request context.\n */\nexport async function searchCarts(ctx: IActionContext): Promise {\n const cartSearchCriteria: CartSearchCriteria = {\n IncludeAnonymous: false,\n CartTypeValue: 1\n };\n\n const queryResultSettings: QueryResultSettings = {\n Paging: {\n Top: 1,\n Skip: 0\n },\n Sorting: {\n Columns: [\n {\n ColumnName: 'ModifiedDateTime',\n IsDescending: true\n }\n ]\n }\n };\n\n return searchAsync({ callerContext: ctx, queryResultSettings }, cartSearchCriteria);\n}\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 { Cart, CartsDataActions } from '@msdyn365-commerce/retail-proxy';\n\nimport { ICartActionResultWithCart } from './cart-action-result';\n\n/**\n * Sets price for the given cart line with an invoice. Used to complete partial invoice payments.\n * @param cart - Cart where the invoice is located.\n * @param cartLineId - The cart line with the invoice for which to update the price.\n * @param price - The new value of price of the invoice.\n * @param actionContext - The action context from SDK.\n * @returns Result of the operation with the details.\n */\nexport async function setInvoiceLinePriceInternal(\n cart: Readonly,\n cartLineId: string | null,\n price: number,\n actionContext: IActionContext\n): Promise {\n if (!cart.Version) {\n actionContext.telemetry.warning('Unable to set invoice line price, Cart Version could not be found');\n return { cart: undefined, status: 'FAILED', substatus: 'NOCARTVERSION' };\n }\n\n try {\n const newCart = await CartsDataActions.setInvoiceLinePriceAsync(\n { callerContext: actionContext },\n cart.Id,\n cartLineId,\n price,\n cart.Version\n );\n return { cart: newCart, status: 'SUCCESS' };\n } catch (error) {\n const errorInstance = error as Error;\n actionContext.telemetry.trace(error as string);\n actionContext.telemetry.trace('Unable to set invoice line price');\n\n return {\n cart: undefined,\n status: 'FAILED',\n errorDetails: { LocalizedMessage: errorInstance.message }\n };\n }\n}\n\nexport default setInvoiceLinePriceInternal;\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 { updateLineDeliverySpecificationsAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/CartsDataActions.g';\nimport { Cart, LineDeliverySpecification } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\n\nimport { ICartActionResultWithCart } from './cart-action-result';\n\nexport default async function updateCartLineDeliverySpecificationsInternal(\n cart: Readonly,\n cartLineDeliverySpecifications: LineDeliverySpecification[],\n actionContext: IActionContext\n): Promise {\n if (!cart || !cart.CartLines || cartLineDeliverySpecifications.length === 0) {\n return { cart: undefined, status: 'FAILED', substatus: 'EMPTYCART' };\n }\n\n return updateLineDeliverySpecificationsAsync({ callerContext: actionContext }, cart.Id, cartLineDeliverySpecifications)\n .then(newCart => {\n return { cart: newCart, status: 'SUCCESS' };\n })\n .catch(error => {\n actionContext.telemetry.warning(error);\n actionContext.telemetry.debug('Unable to updateLineDeliverySpecificationsAsync');\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access -- existing error type.\n return { cart: undefined, status: 'FAILED', errorDetails: { LocalizedMessage: error.message } };\n });\n}\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 { updateCartLinesAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/CartsDataActions.g';\nimport { Cart, CartLine } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\n\nimport { ICartActionResultWithCart } from './cart-action-result';\n\nexport default async function updateCartLineQuantityInternal(\n cart: Readonly,\n cartLineId: string,\n newQuantity: number,\n actionContext: IActionContext,\n isUsingDefaultOrderSettingsMax: boolean\n): Promise {\n if (isUsingDefaultOrderSettingsMax) {\n return updateCartLineQuantityValidateMaxAgainstDefaultOrderSettings(cart, cartLineId, newQuantity, actionContext);\n }\n return updateCartLineQuantityValidateMaxAgainstSiteSettings(cart, cartLineId, newQuantity, actionContext);\n}\nasync function updateCartLineQuantityValidateMaxAgainstDefaultOrderSettings(\n cart: Readonly,\n cartLineId: string,\n newQuantity: number,\n actionContext: IActionContext\n): Promise {\n if (!cart || !cart.CartLines) {\n return { cart: undefined, status: 'FAILED', substatus: 'EMPTYCART' };\n }\n\n const matchingLines = cart.CartLines.filter(cartLine => cartLine.LineId === cartLineId);\n\n if (matchingLines.length === 0) {\n return { cart: undefined, status: 'FAILED', substatus: 'NOMATCHEDCARTLINE' };\n }\n\n const copyCartLine: CartLine = { ...matchingLines[0] };\n\n copyCartLine.Quantity = newQuantity;\n\n return updateCartLinesAsync({ callerContext: actionContext }, cart.Id, [copyCartLine], null)\n .then(newCart => {\n return { cart: newCart, status: 'SUCCESS' };\n })\n .catch(error => {\n let cartActionResult: ICartActionResultWithCart;\n\n actionContext.telemetry.warning(error);\n actionContext.telemetry.debug('Unable to Update Cart Line');\n if (\n error.name === 'Microsoft_Dynamics_Commerce_Runtime_AddingItem_ExceedsMaximumQuantity' ||\n error.name === 'Microsoft_Dynamics_Commerce_Runtime_UpdatingItem_ExceedsMaximumQuantity'\n ) {\n cartActionResult = {\n cart: undefined,\n status: 'FAILED',\n substatus: 'QUANTITYLIMITS',\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access -- existing error type.\n errorDetails: { LocalizedMessage: error.message },\n validationResults: error.data?.ValidationResults\n };\n return cartActionResult;\n }\n\n cartActionResult = {\n cart: undefined,\n status: 'FAILED',\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access -- existing error type.\n errorDetails: { LocalizedMessage: error.message },\n validationResults: error.data?.ValidationResults\n };\n return cartActionResult;\n });\n}\n\nasync function updateCartLineQuantityValidateMaxAgainstSiteSettings(\n cart: Readonly,\n cartLineId: string,\n newQuantity: number,\n actionContext: IActionContext\n): Promise {\n if (!cart || !cart.CartLines) {\n return { cart: undefined, status: 'FAILED', substatus: 'EMPTYCART' };\n }\n\n const matchingLines = cart.CartLines.filter(cartLine => cartLine.LineId === cartLineId);\n\n if (matchingLines.length === 0) {\n return { cart: undefined, status: 'FAILED', substatus: 'NOMATCHEDCARTLINE' };\n }\n\n const copyCartLine: CartLine = { ...matchingLines[0] };\n copyCartLine.Quantity = Math.min(newQuantity, actionContext.requestContext.app.config.maxQuantityForCartLineItem || 10);\n\n return updateCartLinesAsync({ callerContext: actionContext }, cart.Id, [copyCartLine], null)\n .then(newCart => {\n return { cart: newCart, status: 'SUCCESS' };\n })\n .catch(error => {\n actionContext.telemetry.warning(error);\n actionContext.telemetry.debug('Unable to Update Cart Line');\n return {\n cart: undefined,\n status: 'FAILED',\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access -- existing error type.\n errorDetails: { LocalizedMessage: error.message },\n validationResults: error.data?.ValidationResults\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 { IActionContext } from '@msdyn365-commerce/core';\nimport { Address, Cart, CartsDataActions } from '@msdyn365-commerce/retail-proxy';\n\nimport { ICartActionResultWithCart } from './cart-action-result';\n\n/**\n * Update shipping address in cart.\n * @param cart - The cart object.\n * @param shippingAddress - The new shipping address.\n * @param actionContext - The action context.\n * @returns The updated cart with new shipping address.\n */\nexport async function updateShippingAddress(\n cart: Readonly,\n shippingAddress: Address,\n actionContext: IActionContext\n): Promise {\n if (!cart) {\n return { cart: undefined, status: 'FAILED', substatus: 'EMPTYCART' };\n }\n\n return CartsDataActions.updateAsync(\n { callerContext: actionContext },\n {\n Id: cart.Id,\n ShippingAddress: shippingAddress\n }\n )\n .then(newCart => {\n const result: ICartActionResultWithCart = { cart: newCart, status: 'SUCCESS' };\n return result;\n })\n .catch(error => {\n actionContext.telemetry.warning(error);\n actionContext.telemetry.debug('Unable to update shipping address to the cart');\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access -- existing error type.\n return { cart: undefined, status: 'FAILED', errorDetails: { LocalizedMessage: error.message } };\n });\n}\n\nexport default updateShippingAddress;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { getCatalogId, IActionContext } from '@msdyn365-commerce/core';\nimport {\n Address,\n Cart,\n CartLine,\n ChannelDeliveryOptionConfiguration,\n OrgUnitLocation,\n SimpleProduct\n} from '@msdyn365-commerce/retail-proxy';\nimport {\n AttributeValueBase,\n CommerceProperty,\n LineDeliverySpecification,\n ReleasedProductType\n} from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\nimport { action, computed, observable } from 'mobx';\n\nimport { GlobalState } from '../global-state/global-state';\nimport { ICartActionResult, ICartState } from '../state-interfaces/i-cart-state';\nimport addInvoicesToCartInternal from './add-invoices-to-cart';\nimport addOrderInvoiceToCartInternal from './add-order-invoice-to-cart';\nimport addProductToCartInternal, { addProductsToCartInternal } from './add-product-to-cart';\nimport addPromoCodeInternal from './add-promo-code';\nimport { ICartActionResultWithCart } from './cart-action-result';\nimport clearCartLineDeliveryModeInternal from './clear-cart-line-delivery-mode';\nimport clearCartLinesDeliveryInformation from './clear-cart-lines-delivery-information';\nimport getOrCreateActiveCart from './get-or-create-active-cart';\nimport refreshCartInternal from './refresh-cart';\nimport removeAllPromoCodesInternal from './remove-all-promo-codes';\nimport removeCartLineInternal from './remove-cart-lines';\nimport removePromoCodesInternal from './remove-promo-codes';\nimport setInvoiceLinePriceInternal from './set-invoice-line-price';\nimport updateCart from './update-cart';\nimport updateCartLineDeliverySpecificationsInternal from './update-cart-line-delivery-specifications';\nimport updateCartLineQuantityInternal from './update-cart-line-quantity';\nimport updateLoyaltyCardIdInternal from './update-loyalty-card-id';\nimport updateReceiptEmail from './update-receipt-email';\nimport updateShippingAddress from './update-shipping-address';\nimport updateCartLinesInternal from './update-cart-lines';\n\n/**\n * Cart state information.\n */\nexport class BaseCartState extends GlobalState implements ICartState {\n @observable protected _cart: Cart;\n\n @computed public get cart(): Readonly {\n return this._cart;\n }\n\n @observable protected _attributeValues: AttributeValueBase[];\n\n @computed public get attributeValues(): AttributeValueBase[] {\n return this._attributeValues;\n }\n\n @observable protected _extensionProperties: CommerceProperty[];\n\n @computed public get extensionProperties(): CommerceProperty[] {\n return this._extensionProperties;\n }\n\n @computed public get totalItemsInCart(): number {\n if (this._cart.CartLines) {\n return this._cart.CartLines.map(cartLine => cartLine.Quantity || 1).reduce((total, num) => total + num, 0);\n }\n\n return 0;\n }\n\n @observable protected _isProductAddedToCart: boolean;\n\n @computed public get isProductAddedToCart(): boolean {\n return this._isProductAddedToCart;\n }\n\n @computed public get isEmpty(): boolean {\n return !(this._cart.CartLines && this._cart.CartLines.length > 0);\n }\n\n @computed public get hasInvoiceLine(): boolean {\n return !!(this._cart.CartLines && this._cart.CartLines.some(cartline => cartline.IsInvoiceLine === true));\n }\n\n constructor(actionContext: IActionContext) {\n super(actionContext);\n this._cart = {};\n this._attributeValues = [];\n this._extensionProperties = [];\n this._isProductAddedToCart = false;\n }\n\n /**\n * Refreshes the cart by getting it from the server.\n *\n * Other actions should keep cart up to date so shouldn't need to call this\n * outside of initialization but still might be scenarios where a manual\n * refresh is needed.\n * @param input - Input.\n * @param input.additionalProperties - Additional properties.\n * @returns - The cart action result.\n */\n @action\n public async refreshCart(input: { additionalProperties?: object }): Promise {\n return this._doAsyncAction(async () => {\n const newCart = await refreshCartInternal(this.cart.Id, this.actionContext);\n\n if (newCart) {\n this._cart = newCart;\n\n return { status: 'SUCCESS' };\n }\n\n return { status: 'FAILED' };\n });\n }\n\n /**\n * Adds the specified product to the current cart. If product is already in cart\n * will update its cart line, otherwise will add a new cart line to the cart.\n * @param input - The input.\n * @param input.product - The product to add to the cart.\n * @param input.count - How many copies of the product to add.\n * @param input.location - The org unit location, used for BuyOnlinePickupInStore scenarios\n * (If you want item to simply be shipped, leave this parameter undefined).\n * @param input.additionalProperties - Additional properties.\n * @param input.availableQuantity - Available quantity.\n * @param input.enableStockCheck - Is stock check enabled.\n * @param input.isAddEmailDeliveryItemToCart - Is add email delivery item to cart.\n * @param input.isPriceKeyedIn - Is price keyed in.\n * @param input.customPrice - Custom price.\n * @param input.deliveryMode - Delivery mode.\n * @param input.shouldSkipSiteSettings - Should skip site settings.\n * @param input.catalogId - Should skip site settings.\n * @returns Cart action result.\n */\n @action\n public async addProductToCart(input: {\n product: SimpleProduct;\n count?: number;\n location?: OrgUnitLocation;\n additionalProperties?: object;\n availableQuantity?: number;\n enableStockCheck?: boolean;\n isAddEmailDeliveryItemToCart?: boolean;\n isPriceKeyedIn?: boolean;\n customPrice?: number;\n deliveryMode?: string;\n shouldSkipSiteSettings?: boolean;\n catalogId?: number;\n retailMultiplePickupModeEnabled?: boolean;\n }): Promise {\n return this._doAsyncAction(async () => {\n const cartLine: CartLine = {\n CatalogId: input.catalogId ?? getCatalogId(this.actionContext.requestContext),\n Description: input.product.Description,\n\n // TODO: Investigate this value and what it represents\n EntryMethodTypeValue: 3,\n ItemId: input.product.ItemId,\n ProductId: input.product.RecordId,\n Quantity: input.count || 1,\n TrackingId: '',\n UnitOfMeasureSymbol: input.product.DefaultUnitOfMeasure,\n IsPriceKeyedIn: input.isPriceKeyedIn,\n IsGiftCardLine: input.product.IsGiftCard,\n Price: input.customPrice ? input.customPrice : input.product.Price\n };\n\n if (input.location) {\n if (!this.actionContext.requestContext.channel) {\n return { status: 'FAILED' };\n }\n\n // If curbside pick is not available use the default one\n if (input.deliveryMode !== undefined) {\n cartLine.DeliveryMode = input.deliveryMode;\n } else {\n cartLine.DeliveryMode = input.retailMultiplePickupModeEnabled\n ? undefined\n : this.actionContext.requestContext.channel.PickupDeliveryModeCode;\n }\n\n cartLine.FulfillmentStoreId = input.location.OrgUnitNumber;\n cartLine.WarehouseId = input.location.InventoryLocationId;\n cartLine.ShippingAddress = this._buildAddressFromOrgUnitLocation(input.location);\n }\n\n if (input.isAddEmailDeliveryItemToCart) {\n if (!this.actionContext.requestContext.channel) {\n return { status: 'FAILED' };\n }\n\n cartLine.DeliveryMode = this.actionContext.requestContext.channel.EmailDeliveryModeCode;\n }\n\n // Check if the product is service or not by product type\n const isAddServiceItemToCart = input.product.ItemTypeValue === ReleasedProductType.Service;\n\n // @ts-expect-error\n const validateQuantity: boolean = !!input.additionalProperties?.validateQuantity;\n return this._doCartOperationWithRetry(() =>\n addProductToCartInternal(\n this.cart,\n cartLine,\n this.actionContext,\n validateQuantity,\n input.availableQuantity,\n input.enableStockCheck,\n isAddServiceItemToCart,\n input.shouldSkipSiteSettings\n )\n );\n });\n }\n\n /**\n * Adds the specified product to the current cart. If product is already in cart\n * will update its cart line, otherwise will add a new cart line to the cart.\n * @param input - Input.\n * @param input.product - Product.\n * @param input.count - Count.\n * @param input.location - Location.\n * @param input.additionalProperties - Additional properties.\n * @param input.availableQuantity - Available quantity.\n * @param input.enableStockCheck - Enable stock check.\n * @param input.isAddEmailDeliveryItemToCart - Is add email delivery item to cart.\n * @param input.isPriceKeyedIn - Is price keyed in.\n * @param input.customPrice - Custom price.\n * @param input.deliveryMode - Delivery mode.\n * @returns Cart action result.\n */\n @action\n public async addProductsToCart(\n input: {\n product: SimpleProduct;\n count?: number;\n location?: OrgUnitLocation;\n additionalProperties?: object;\n availableQuantity?: number;\n enableStockCheck?: boolean;\n isAddEmailDeliveryItemToCart?: boolean;\n isPriceKeyedIn?: boolean;\n customPrice?: number;\n deliveryMode?: string;\n catalogId?: number;\n retailMultiplePickupModeEnabled?: boolean;\n }[]\n ): Promise {\n return this._doAsyncAction(async () => {\n const internalInput: {\n cartLineToAdd: CartLine;\n availableQuantity?: number;\n isStockCheckEnabled?: boolean;\n isAddServiceItemToCart?: boolean;\n }[] = [];\n\n for (const inputItem of input) {\n const cartLine: CartLine = {\n CatalogId: inputItem.catalogId ?? getCatalogId(this.actionContext.requestContext),\n Description: inputItem.product.Description,\n\n // TODO: Investigate this value and what it represents\n EntryMethodTypeValue: 3,\n ItemId: inputItem.product.ItemId,\n ProductId: inputItem.product.RecordId,\n Quantity: inputItem.count || 1,\n TrackingId: '',\n UnitOfMeasureSymbol: inputItem.product.DefaultUnitOfMeasure,\n IsPriceKeyedIn: inputItem.isPriceKeyedIn,\n IsGiftCardLine: inputItem.product.IsGiftCard,\n Price: inputItem.customPrice ? inputItem.customPrice : inputItem.product.Price\n };\n\n if (inputItem.location) {\n if (!this.actionContext.requestContext.channel) {\n return { status: 'FAILED' };\n }\n\n // If curbside pick is not available use the default one\n if (inputItem.deliveryMode !== undefined) {\n cartLine.DeliveryMode = inputItem.deliveryMode;\n } else {\n cartLine.DeliveryMode = inputItem.retailMultiplePickupModeEnabled\n ? undefined\n : this.actionContext.requestContext.channel.PickupDeliveryModeCode;\n }\n\n cartLine.FulfillmentStoreId = inputItem.location.OrgUnitNumber;\n cartLine.WarehouseId = inputItem.location.InventoryLocationId;\n cartLine.ShippingAddress = this._buildAddressFromOrgUnitLocation(inputItem.location);\n }\n\n if (inputItem.isAddEmailDeliveryItemToCart) {\n cartLine.DeliveryMode = this.actionContext.requestContext.channel?.EmailDeliveryModeCode;\n }\n\n // Check if the product is service or not by product type\n const PRODUCTASSERVICE = 2 as ReleasedProductType.Service;\n const isAddServiceItemToCart = inputItem.product.ItemTypeValue === PRODUCTASSERVICE;\n\n internalInput.push({\n cartLineToAdd: cartLine,\n availableQuantity: inputItem.availableQuantity,\n isStockCheckEnabled: inputItem.enableStockCheck,\n isAddServiceItemToCart\n });\n }\n\n return this._doCartOperationWithRetry(() => addProductsToCartInternal(this.cart, this.actionContext, internalInput));\n });\n }\n\n /**\n * Adds the specified invoices to the current cart.\n * @param input - The input.\n * @param input.invoiceIds - Invoice Ids.\n * @param input.additionalProperties - Additional properties.\n * @returns Cart action result.\n */\n @action\n public async addInvoicesToCart(input: { invoiceIds: string[]; additionalProperties?: object }): Promise {\n return this._doAsyncAction(async () => {\n return this._doCartOperationWithRetry(() => addInvoicesToCartInternal(this.cart, input.invoiceIds, this.actionContext));\n });\n }\n\n /**\n * Adds the specified order invoice to the current cart.\n * @param input - Input.\n * @param input.invoiceId - Invoice id.\n * @param input.lineDescription - Line description.\n * @param input.additionalProperties - Additional properties.\n * @returns Cart action result.\n */\n @action\n public async addOrderInvoiceToCart(input: {\n invoiceId: string;\n lineDescription: string;\n additionalProperties?: object;\n }): Promise {\n return this._doAsyncAction(async () => {\n return this._doCartOperationWithRetry(() =>\n addOrderInvoiceToCartInternal(this.cart, input.invoiceId, input.lineDescription, this.actionContext)\n );\n });\n }\n\n /**\n * Sets price for the given cart line with an invoice. Used to complete partial invoice payments.\n * @param input - Input for the operation.\n * @param input.cartLineId - The cart line with the invoice for which to update the price.\n * @param input.price - The new value of price of the invoice.\n * @returns The cart action result.\n */\n @action public async setInvoiceLinePrice(input: { cartLineId: string | null; price: number }): Promise {\n return this._doAsyncAction(async () => {\n return this._doCartOperationWithRetry(async () =>\n setInvoiceLinePriceInternal(this.cart, input.cartLineId, input.price, this.actionContext)\n );\n });\n }\n\n /**\n * Removes the cart lines with the provided ids from the cart.\n * @param input - Input.\n * @param input.cartLineIds - Cart line ids.\n * @param input.additionalProperties - Additional properties.\n * @returns The cart action result.\n */\n @action\n public async removeCartLines(input: { cartLineIds: string[]; additionalProperties?: object }): Promise {\n return this._doAsyncAction(async () => {\n return this._doCartOperationWithRetry(() => removeCartLineInternal(this.cart, input.cartLineIds, this.actionContext));\n });\n }\n\n /**\n * Clears the pickup location information from the provided cart line,\n * resulting in it getting shipped to the customer.\n * @param input - Input.\n * @param input.cartLineId - Cart line id.\n * @param input.additionalProperties - Additional properties.\n * @returns The cart action result.\n */\n @action\n public async clearCartLinePickupLocation(input: { cartLineId: string; additionalProperties?: object }): Promise {\n return this._doAsyncAction(async () => {\n return this._doCartOperationWithRetry(() => clearCartLineDeliveryModeInternal(this.cart, input.cartLineId, this.actionContext));\n });\n }\n\n /**\n * Clears the delivery mode, and other information for the shipping cart lines.\n * @param input - Input.\n * @param input.additionalProperties - Additional properties.\n * @param input.channelDeliveryOptionConfiguration -- Channel delivery option configuration.\n * @returns The cart action result.\n */\n @action\n public async clearCartLinesDeliveryInformation(input: {\n additionalProperties?: object;\n channelDeliveryOptionConfiguration?: ChannelDeliveryOptionConfiguration;\n }): Promise {\n return this._doAsyncAction(async () => {\n return this._doCartOperationWithRetry(() =>\n clearCartLinesDeliveryInformation(this.cart, this.actionContext, input.channelDeliveryOptionConfiguration)\n );\n });\n }\n\n /**\n * Marks the provided cart line for pickup in store, with the provided location as\n * the pickup location.\n * @param input - Input.\n * @param input.cartLineId - Cart line id.\n * @param input.location - Location.\n * @param input.additionalProperties - Additional properties.\n * @param input.deliveryMode - Delivery mode.\n * @returns The cart action result.\n */\n @action\n public async updateCartLinePickupLocation(input: {\n cartLineId: string;\n location: OrgUnitLocation;\n additionalProperties?: object;\n deliveryMode?: string;\n }): Promise {\n return this._doAsyncAction(async () => {\n if (!this.actionContext.requestContext.channel) {\n return { status: 'FAILED' };\n }\n\n const cartLineDeliverySpecification = {\n LineId: input.cartLineId,\n DeliverySpecification: {\n DeliveryModeId:\n input.deliveryMode !== undefined\n ? input.deliveryMode\n : this.actionContext.requestContext.channel.PickupDeliveryModeCode,\n DeliveryPreferenceTypeValue: 2, // Pick up in store\n PickUpStoreId: input.location.OrgUnitNumber,\n DeliveryAddress: this._buildAddressFromOrgUnitLocation(input.location)\n }\n };\n\n return this._doCartOperationWithRetry(() =>\n updateCartLineDeliverySpecificationsInternal(this.cart, [cartLineDeliverySpecification], this.actionContext)\n );\n });\n }\n\n /**\n * Updates cart line pick up date.\n * @param input - The cart line.\n * @param input.lineDeliverySpecifications - Line delivery specifications.\n * @returns The cart action result.\n */\n @action\n public async updateCartLinePickupDateTimeslot(input: {\n lineDeliverySpecifications: LineDeliverySpecification[];\n }): Promise {\n return this._doAsyncAction(async () => {\n return this._doCartOperationWithRetry(() =>\n updateCartLineDeliverySpecificationsInternal(this.cart, input.lineDeliverySpecifications, this.actionContext)\n );\n });\n }\n\n /**\n * Updates the delivery mode for items in the cart with the desired delivery mode, preserving BOPIS status for stuff already marked as BOPIS.\n * @param input - The input.\n * @param input.deliveryModeId - Delivery mode id.\n * @param input.shippingAddress - Shipping address.\n * @param input.additionalProperties - Additional properties.\n * @param input.channelDeliveryOptionConfig - Channel delivery option configuration.\n * @returns The cart action result.\n */\n @action\n public async updateCartDeliverySpecification(input: {\n deliveryModeId: string;\n shippingAddress: Address | undefined;\n additionalProperties?: object;\n channelDeliveryOptionConfig?: ChannelDeliveryOptionConfiguration;\n }): Promise {\n return this._doAsyncAction(async () => {\n if (input.deliveryModeId.trim() === '') {\n return { status: 'FAILED', substatus: 'EMPTYINPUT' };\n }\n\n const pickupDeliveryModeCode =\n this.actionContext.requestContext.channel && this.actionContext.requestContext.channel.PickupDeliveryModeCode;\n const emailDeliveryModeCode =\n this.actionContext.requestContext.channel && this.actionContext.requestContext.channel.EmailDeliveryModeCode;\n let cartLinesForShipping: CartLine[] = [];\n\n cartLinesForShipping =\n input.channelDeliveryOptionConfig !== undefined\n ? (this.cart.CartLines || []).filter(cartLine =>\n cartLine.DeliveryMode && cartLine.DeliveryMode !== ''\n ? cartLine.DeliveryMode !==\n input.channelDeliveryOptionConfig?.PickupDeliveryModeCodes?.find(\n deliveryMode => deliveryMode === cartLine.DeliveryMode\n ) && cartLine.DeliveryMode !== emailDeliveryModeCode\n : cartLine\n )\n : (this.cart.CartLines || []).filter(cartLine =>\n cartLine.DeliveryMode && cartLine.DeliveryMode !== ''\n ? cartLine.DeliveryMode !== pickupDeliveryModeCode && cartLine.DeliveryMode !== emailDeliveryModeCode\n : cartLine\n );\n\n if (cartLinesForShipping.length > 0) {\n const deliverySpecifications = cartLinesForShipping.map(cartLine => {\n return {\n LineId: cartLine.LineId,\n DeliverySpecification: {\n DeliveryModeId: input.deliveryModeId,\n DeliveryPreferenceTypeValue: 1, // Ship\n DeliveryAddress: input.shippingAddress\n }\n };\n });\n\n return this._doCartOperationWithRetry(() =>\n updateCartLineDeliverySpecificationsInternal(this.cart, deliverySpecifications, this.actionContext)\n );\n }\n\n return { status: 'FAILED', substatus: 'NOCONTENT' };\n });\n }\n\n /**\n * Updates the quantity of the cart line.\n * @param input - The input.\n * @param input.cartLineId - Cart line id.\n * @param input.newQuantity - New quantity.\n * @param input.additionalProperties - Additional properties.\n * @returns The cart action result.\n */\n @action\n public async updateCartLineQuantity(input: {\n cartLineId: string;\n newQuantity: number;\n additionalProperties?: object;\n }): Promise {\n return this._doAsyncAction(async () => {\n return this._doCartOperationWithRetry(() =>\n updateCartLineQuantityInternal(\n this.cart,\n input.cartLineId,\n input.newQuantity,\n this.actionContext,\n\n // @ts-expect-error\n input.additionalProperties?.isUsingDefaultOrderSettingsMax\n )\n );\n });\n }\n\n /**\n * Updates the loyalty card ID on the card.\n * @param input - The input.\n * @param input.loyaltyCardNumber - The loyalty card id to use.\n * @param input.additionalProperties - Additional properties.\n * @returns The cart action result.\n */\n @action\n public async updateLoyaltyCardId(input: {\n loyaltyCardNumber: string | undefined;\n additionalProperties?: object;\n }): Promise {\n if (!input.loyaltyCardNumber) {\n return { status: 'FAILED', substatus: 'EMPTYINPUT' };\n }\n\n return this._doAsyncAction(async () => {\n return this._doCartOperationWithRetry(() =>\n updateLoyaltyCardIdInternal(this.cart, input.loyaltyCardNumber!, this.actionContext)\n );\n });\n }\n\n /**\n * Adds promo code to the cart.\n * @param input - The input.\n * @param input.promoCode - The promo code to add.\n * @param input.additionalProperties - Additional properties.\n * @returns The cart action result.\n */\n @action\n public addPromoCode(input: { promoCode: string; additionalProperties?: object }): Promise {\n return this._doAsyncAction(async () => {\n return this._doCartOperationWithRetry(() => addPromoCodeInternal(this.cart, input.promoCode, this.actionContext));\n });\n }\n\n /**\n * Removes promo codes from the cart.\n * @param input - The input.\n * @param input.promoCodes - The promo codes to remove.\n * @param input.additionalProperties - Additional properties.\n * @returns The cart action result.\n */\n @action\n public removePromoCodes(input: { promoCodes: string[]; additionalProperties?: object }): Promise {\n return this._doAsyncAction(async () => {\n return this._doCartOperationWithRetry(() => removePromoCodesInternal(this.cart, input.promoCodes, this.actionContext));\n });\n }\n\n /**\n * Removes all promo code from the cart.\n * @param input - The input.\n * @param input.additionalProperties - Additional properties.\n * @returns The cart action result.\n */\n @action\n public removeAllPromoCodes(input: { additionalProperties?: object }): Promise {\n return this._doAsyncAction(async () => {\n return this._doCartOperationWithRetry(() => removeAllPromoCodesInternal(this.cart, this.actionContext));\n });\n }\n\n /**\n * Updates receipt email.\n * @param input - The input.\n * @param input.newEmail - The receipt email.\n * @param input.additionalProperties - Additional properties.\n * @returns The cart action result.\n */\n @action\n public async updateReceiptEmail(input: { newEmail: string; additionalProperties?: object }): Promise {\n return this._doAsyncAction(async () => {\n return this._doCartOperationWithRetry(() => updateReceiptEmail(this.cart, input.newEmail, this.actionContext));\n });\n }\n\n /**\n * Updates shipping address.\n * @param input - The input.\n * @param input.newShippingAddress - The shipping address.\n * @param input.additionalProperties - The additional properties.\n * @returns ICartActionResult.\n */\n @action\n public async updateShippingAddress(input: {\n newShippingAddress: Address;\n additionalProperties?: { [key: string]: unknown };\n }): Promise {\n return this._doAsyncAction(async () => {\n return this._doCartOperationWithRetry(async () =>\n updateShippingAddress(this.cart, input.newShippingAddress, this.actionContext)\n );\n });\n }\n\n /**\n * Updates the attribute values.\n * @param input - The input.\n * @param input.newAttributeValues - The new attribute values to update.\n * @param input.additionalProperties - The additional properties.\n * @returns ICartActionResult.\n */\n @action\n public async updateAttributeValues(input: {\n newAttributeValues: AttributeValueBase[];\n additionalProperties?: object;\n }): Promise {\n this._attributeValues = input.newAttributeValues;\n const newCartObject: Cart = {\n Id: this.cart.Id,\n AttributeValues: input.newAttributeValues\n };\n return this.updateCart({ newCartObject });\n }\n\n /**\n * Updates the extension properties.\n * @param input - The input.\n * @param input.newExtensionProperties - The new extension properties.\n * @param input.additionalProperties - The additional properties.\n * @returns ICartActionResult.\n */\n @action\n public async updateExtensionProperties(input: {\n newExtensionProperties: CommerceProperty[];\n additionalProperties?: object;\n }): Promise {\n this._extensionProperties = input.newExtensionProperties;\n const newCartObject: Cart = {\n Id: this.cart.Id,\n ExtensionProperties: input.newExtensionProperties\n };\n return this.updateCart({ newCartObject });\n }\n\n /**\n * Updates cart object.\n * @param input - The input.\n * @param input.newCartObject - The new cart object.\n * @param input.additionalProperties - Additional properties.\n * @returns Promise of cart action result.\n */\n @action\n public async updateCart(input: { newCartObject: Cart; additionalProperties?: object }): Promise {\n return this._doAsyncAction(async () => {\n return this._doCartOperationWithRetry(() => updateCart(this.cart, input.newCartObject, this.actionContext));\n });\n }\n\n /**\n * Updates cartLines objects in cart.\n * @param input - The input.\n * @param input.updatedCartLinesObject - updated cartline.\n * @returns ICartActionResult.\n */\n @action\n public async updateCartLines(input: { updatedCartLinesObject: CartLine[] }): Promise {\n return this._doAsyncAction(async () => {\n return this._doCartOperationWithRetry(() =>\n updateCartLinesInternal(this.cart, input.updatedCartLinesObject, this.actionContext)\n );\n });\n }\n\n /**\n * Initialize function.\n */\n public async initialize(): Promise {\n if (this.isInitialized) {\n return;\n }\n\n const newCart = await getOrCreateActiveCart(this.actionContext);\n\n if (newCart) {\n this._cart = newCart;\n this._status = 'READY';\n } else {\n this._status = 'ERROR';\n }\n\n this.isInitialized = true;\n }\n\n /**\n * Validates inventory across cart lines.\n * @param callback - Callback function.\n * @returns ICartActionResult.\n */\n private async _doCartOperationWithRetry(callback: () => Promise): Promise {\n let callbackResult = await callback();\n\n if (callbackResult.status === 'SUCCESS') {\n if (callbackResult.cart) {\n this._cart = callbackResult.cart;\n }\n } else {\n const refreshCartResult = await this.refreshCart({});\n\n if (refreshCartResult.status === 'SUCCESS') {\n callbackResult = await callback();\n\n if (callbackResult.status === 'SUCCESS') {\n if (callbackResult.cart) {\n this._cart = callbackResult.cart;\n }\n }\n }\n }\n\n if (callbackResult.status === 'SUCCESS' && callbackResult.substatus && callbackResult.substatus === 'PRODUCTADDED') {\n this._isProductAddedToCart = true;\n } else {\n this._isProductAddedToCart = false;\n }\n\n return {\n status: callbackResult.status,\n substatus: callbackResult.substatus,\n errorDetails: callbackResult.errorDetails,\n validationResults: callbackResult.validationResults\n };\n }\n\n /**\n * Build address from org unit location.\n * @param location - The location.\n * @returns Address.\n */\n private _buildAddressFromOrgUnitLocation(location: OrgUnitLocation): Address {\n return {\n RecordId: location.PostalAddressId,\n Name: location.OrgUnitName,\n FullAddress: location.Address,\n Street: location.Street,\n StreetNumber: location.StreetNumber,\n City: location.City,\n DistrictName: location.DistrictName,\n BuildingCompliment: location.BuildingCompliment,\n Postbox: location.Postbox,\n ThreeLetterISORegionName: location.Country,\n ZipCode: location.Zip,\n County: location.County,\n CountyName: location.CountyName,\n State: location.State,\n StateName: location.StateName\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 { IActionContext } from '@msdyn365-commerce/core';\nimport { readAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/CartsDataActions.g';\nimport { Cart } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\n\nexport default async function refreshCart(cartId: string, ctx: IActionContext): Promise {\n return readAsync({ callerContext: ctx, bypassCache: 'get' }, cartId)\n .then(cart => {\n return cart;\n })\n .catch(error => {\n return undefined;\n });\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IActionContext } from '@msdyn365-commerce/core';\nimport { Cart, CartsDataActions, CommerceException } from '@msdyn365-commerce/retail-proxy';\n\nimport { ICartActionResultWithCart } from './cart-action-result';\n\nexport default async function addInvoicesToCartInternal(\n cart: Readonly,\n invoiceIds: string[],\n actionContext: IActionContext\n): Promise {\n if (!invoiceIds || invoiceIds.length === 0) {\n actionContext.telemetry.trace('Invoice ids are empty, unable to add invoices to cart.');\n return { cart, status: 'FAILED', substatus: 'EMPTYINPUT' };\n }\n\n if (cart.Version) {\n return CartsDataActions.addInvoicesAsync({ callerContext: actionContext }, cart.Id, invoiceIds)\n .then(newCart => {\n return { cart: newCart, status: 'SUCCESS' };\n })\n .catch(error => {\n actionContext.telemetry.trace(error);\n actionContext.telemetry.trace('Unable to add invoices to cart');\n\n // Error object comes from API and doesn't have type definitions yet.\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access -- No type definition for error.\n const errorDetails: CommerceException = error.data;\n const errorResult: ICartActionResultWithCart = { cart: undefined, status: 'FAILED', errorDetails };\n return errorResult;\n });\n }\n actionContext.telemetry.warning('Unable to add invoices, Cart Version could not be found');\n\n return { cart: undefined, status: 'FAILED', substatus: 'NOCARTVERSION' };\n}\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 { addOrderInvoiceAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/CartsDataActions.g';\nimport { Cart } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\n\nimport { ICartActionResultWithCart } from './cart-action-result';\n\nexport default async function addOrderInvoiceToCartInternal(\n cart: Readonly,\n invoiceId: string,\n lineDescription: string,\n actionContext: IActionContext\n): Promise {\n if (!invoiceId || invoiceId === '') {\n actionContext.telemetry.trace('Invoice id is empty, unable to add invoice to cart.');\n return { cart, status: 'FAILED', substatus: 'EMPTYINPUT' };\n }\n\n if (cart.Version) {\n return addOrderInvoiceAsync({ callerContext: actionContext }, cart.Id, invoiceId, lineDescription)\n .then(newCart => {\n return { cart: newCart, status: 'SUCCESS' };\n })\n .catch(error => {\n actionContext.telemetry.trace(error);\n actionContext.telemetry.trace('Unable to add order invoice to cart');\n\n const resultWithCart: ICartActionResultWithCart = {\n cart: undefined,\n status: 'FAILED',\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access -- existing error type.\n errorDetails: { LocalizedMessage: error.message }\n };\n\n return resultWithCart;\n });\n }\n actionContext.telemetry.warning('Unable to add order invoice, Cart Version could not be found');\n\n return { cart: undefined, status: 'FAILED', substatus: 'NOCARTVERSION' };\n}\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 { removeCartLinesAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/CartsDataActions.g';\nimport { Cart } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\n\nimport { ICartActionResultWithCart } from './cart-action-result';\n\nexport default async function removeCartLinesInternal(\n cart: Readonly,\n cartLineIds: string[],\n actionContext: IActionContext\n): Promise {\n if (!cart) {\n return { cart: undefined, status: 'FAILED', substatus: 'EMPTYCART' };\n }\n\n return removeCartLinesAsync({ callerContext: actionContext }, cart.Id, cartLineIds)\n .then(newCart => {\n // This is because of a TSProxy typing error\n const returnedCart = Array.isArray(newCart) ? newCart[0] : newCart;\n\n return { cart: returnedCart, status: 'SUCCESS' };\n })\n .catch(error => {\n actionContext.telemetry.warning(error);\n actionContext.telemetry.debug('Unable to Remove Cart Line');\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access -- existing error type.\n return { cart: undefined, status: 'FAILED', errorDetails: { LocalizedMessage: error.message } };\n });\n}\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 { updateCartLinesAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/CartsDataActions.g';\nimport { Cart, CartLine, ChannelDeliveryOptionConfiguration } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\nimport { cloneDeep } from 'lodash';\n\nimport { ICartActionResultWithCart } from './cart-action-result';\n\nexport default async function clearCartLinesDeliveryInformation(\n cart: Readonly,\n actionContext: IActionContext,\n channelDeliveryOptionConfig?: ChannelDeliveryOptionConfiguration\n): Promise {\n if (!cart || !cart.CartLines) {\n return { cart: undefined, status: 'FAILED', substatus: 'EMPTYCART' };\n }\n let matchingLines: CartLine[] = [];\n const pickupDeliveryModeCode =\n actionContext && actionContext.requestContext && actionContext.requestContext.channel?.PickupDeliveryModeCode;\n const emailDeliveryModeCode =\n actionContext && actionContext.requestContext && actionContext.requestContext.channel?.EmailDeliveryModeCode;\n if (channelDeliveryOptionConfig !== undefined) {\n matchingLines = cart.CartLines.filter(\n cartLine =>\n cartLine.DeliveryMode &&\n cartLine.DeliveryMode !== channelDeliveryOptionConfig.PickupDeliveryModeCodes?.find(dM => dM === cartLine.DeliveryMode) &&\n cartLine.DeliveryMode !== emailDeliveryModeCode &&\n cartLine.LineId\n );\n } else {\n matchingLines = cart.CartLines.filter(\n cartLine =>\n cartLine.DeliveryMode &&\n cartLine.DeliveryMode !== pickupDeliveryModeCode &&\n cartLine.DeliveryMode !== emailDeliveryModeCode &&\n cartLine.LineId\n );\n }\n\n // If there are no lines needing updates, just return success\n if (matchingLines.length === 0) {\n return { cart, status: 'SUCCESS' };\n }\n\n const copiedLines: CartLine[] = cloneDeep(matchingLines);\n\n copiedLines.forEach(line => {\n line.DeliveryMode = '';\n line.FulfillmentStoreId = '';\n line.ShippingAddress = {};\n });\n\n return updateCartLinesAsync({ callerContext: actionContext }, cart.Id, copiedLines, null)\n .then(newCart => {\n return { cart: newCart, status: 'SUCCESS' };\n })\n .catch((error: string) => {\n actionContext.telemetry.warning(error);\n actionContext.telemetry.debug('Unable to Update Cart Lines');\n\n return { cart: undefined, status: 'FAILED', errorDetails: { LocalizedMessage: error } };\n });\n}\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 { updateAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/CartsDataActions.g';\nimport { Cart } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\n\nimport { ICartActionResultWithCart } from './cart-action-result';\n\nexport default async function updateLoyaltyCardId(\n cart: Readonly,\n newLoyaltyCardId: string,\n actionContext: IActionContext\n): Promise {\n if (!cart) {\n return { cart: undefined, status: 'FAILED', substatus: 'EMPTYCART' };\n }\n\n return updateAsync(\n { callerContext: actionContext },\n {\n Id: cart.Id,\n LoyaltyCardId: newLoyaltyCardId\n }\n )\n .then(newCart => {\n return { cart: newCart, status: 'SUCCESS' };\n })\n .catch(error => {\n actionContext.telemetry.warning(error);\n actionContext.telemetry.debug('Unable to update loyalty card id');\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access -- existing error type.\n return { cart: undefined, status: 'FAILED', errorDetails: { LocalizedMessage: error.message } };\n });\n}\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 { removeDiscountCodesAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/CartsDataActions.g';\nimport { Cart } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\n\nimport { ICartActionResultWithCart } from './cart-action-result';\n\nexport default async function removePromoCodes(\n cart: Readonly,\n promoCodes: string[],\n actionContext: IActionContext\n): Promise {\n if (!cart) {\n return { cart: undefined, status: 'FAILED', substatus: 'EMPTYCART' };\n }\n\n return removeDiscountCodesAsync({ callerContext: actionContext }, cart.Id, promoCodes)\n .then(newCart => {\n return { cart: newCart, status: 'SUCCESS' };\n })\n .catch(error => {\n actionContext.telemetry.warning(error);\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access -- existing error type.\n return { cart: undefined, status: 'FAILED', errorDetails: { LocalizedMessage: error.message } };\n });\n}\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 { removeDiscountCodesAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/CartsDataActions.g';\nimport { Cart } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\n\nimport { ICartActionResultWithCart } from './cart-action-result';\n\nexport default async function removeAllPromoCodes(\n cart: Readonly,\n actionContext: IActionContext\n): Promise {\n if (!cart) {\n return { cart: undefined, status: 'FAILED', substatus: 'EMPTYCART' };\n }\n\n if (cart.Coupons && cart.Coupons.length > 0) {\n const promoCodes = cart.Coupons.map(coupon => {\n return coupon.Code || '';\n });\n\n return removeDiscountCodesAsync({ callerContext: actionContext }, cart.Id, promoCodes)\n .then(newCart => {\n return { cart: newCart, status: 'SUCCESS' };\n })\n .catch(error => {\n actionContext.telemetry.warning(error);\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access -- existing error type.\n return { cart: undefined, status: 'FAILED', errorDetails: { LocalizedMessage: error.message } };\n });\n }\n\n return { cart, status: 'SUCCESS' };\n}\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 { updateAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/CartsDataActions.g';\nimport { Cart } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\n\nimport { ICartActionResultWithCart } from './cart-action-result';\n\nexport default async function updateReceiptEmail(\n cart: Readonly,\n email: string,\n actionContext: IActionContext\n): Promise {\n if (!cart) {\n return { cart: undefined, status: 'FAILED', substatus: 'EMPTYCART' };\n }\n\n return updateAsync(\n { callerContext: actionContext },\n {\n Id: cart.Id,\n ReceiptEmail: email\n }\n )\n .then(newCart => {\n return { cart: newCart, status: 'SUCCESS' };\n })\n .catch(error => {\n actionContext.telemetry.warning(error);\n actionContext.telemetry.debug('Unable to add receipt email to the cart');\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access -- existing error type.\n return { cart: undefined, status: 'FAILED', errorDetails: { LocalizedMessage: error.message } };\n });\n}\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 { updateAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/CartsDataActions.g';\nimport { Cart } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\n\nimport { ICartActionResultWithCart } from './cart-action-result';\n\nexport default async function updateCart(\n cart: Readonly,\n updatedCartObject: Cart,\n actionContext: IActionContext\n): Promise {\n if (!cart) {\n return { cart: undefined, status: 'FAILED', substatus: 'EMPTYCART' };\n }\n\n return updateAsync({ callerContext: actionContext }, { ...updatedCartObject, Id: cart.Id })\n .then(newCart => {\n return { cart: newCart, status: 'SUCCESS' };\n })\n .catch(error => {\n actionContext.telemetry.warning(error);\n actionContext.telemetry.debug('Unable to update the cart');\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access -- existing error type.\n return { cart: undefined, status: 'FAILED', errorDetails: { LocalizedMessage: error.message } };\n });\n}\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 { updateCartLinesAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/CartsDataActions.g';\nimport { Cart, CartLine } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\n\nimport { ICartActionResultWithCart } from './cart-action-result';\n\nexport default async function updateCartLinesInternal(\n cart: Readonly,\n cartLinesToUpdate: CartLine[],\n actionContext: IActionContext\n): Promise {\n if (!cart || !cart.CartLines) {\n return { cart: undefined, status: 'FAILED', substatus: 'EMPTYCART' };\n }\n\n return updateCartLinesAsync({ callerContext: actionContext }, cart.Id, cartLinesToUpdate, null)\n .then(newCart => {\n return { cart: newCart, status: 'SUCCESS' };\n })\n .catch((error: string) => {\n actionContext.telemetry.warning(error);\n actionContext.telemetry.debug('Unable to Update Cart Lines');\n\n return { cart: undefined, status: 'FAILED', errorDetails: { LocalizedMessage: error } };\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 getCatalogId,\n IAction,\n IActionContext,\n IActionInput,\n ICommerceApiSettings,\n ICreateActionContext,\n IObservableAction,\n IRequestContext\n} from '@msdyn365-commerce/core';\n\nimport { createGlobalState, GlobalStateConstructor, IGlobalState } from '../global-state/i-global-state';\n\nexport declare type GlobalStateType = 'CARTSTATE' | 'CHECKOUTSTATE';\n\n/**\n * Shared class that handles global state inputs.\n */\nexport class GlobalStateInput implements IActionInput {\n public readonly stateConstructor: GlobalStateConstructor;\n\n public readonly key: GlobalStateType;\n\n public readonly catalogId?: number;\n\n private readonly apiSettings: ICommerceApiSettings;\n\n public constructor(\n key: GlobalStateType,\n stateConstructor: GlobalStateConstructor,\n apiSettings: ICommerceApiSettings,\n requestContext?: IRequestContext\n ) {\n this.apiSettings = apiSettings;\n this.stateConstructor = stateConstructor;\n this.key = key;\n\n if (requestContext) {\n this.catalogId = getCatalogId(requestContext);\n }\n }\n\n public getCacheKey = () => `Key:${this.key}-ChannelId:${this.apiSettings.channelId}-CatalogId:${this.catalogId ?? 0}`;\n\n public getCacheObjectType = () => this.key;\n\n public dataCacheType = (): CacheType => 'instance';\n}\n\nexport async function getState(input: GlobalStateInput, ctx: IActionContext): Promise {\n const globalStateObject = createGlobalState(input.stateConstructor, ctx);\n\n await globalStateObject.initialize();\n\n return globalStateObject;\n}\n\nexport default function createGlobalStateDataAction(\n key: GlobalStateType,\n stateConstructor: GlobalStateConstructor\n): IObservableAction {\n return createObservableDataAction({\n action: >getState,\n input: (args: ICreateActionContext) => {\n return new GlobalStateInput(key, stateConstructor, args.requestContext.apiSettings, args.requestContext);\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 { IActionContext } from '@msdyn365-commerce/core';\n\nexport declare type GlobalStateStatus = 'READY' | 'UPDATING' | 'ERROR';\n\nexport type GlobalStateConstructor = new (actionContext: IActionContext) => T;\n\nexport function createGlobalState(ctor: GlobalStateConstructor, actionContext: IActionContext): T {\n return new ctor(actionContext);\n}\n\nexport interface IGlobalState {\n readonly status: GlobalStateStatus;\n\n initialize(): Promise;\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { BaseCartState } from '../cart-state/base-cart-state';\nimport { ICartState } from '../state-interfaces/i-cart-state';\nimport createGlobalStateDataAction from './global-state-data-action';\n\nexport default createGlobalStateDataAction('CARTSTATE', BaseCartState);\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { AsyncResult, IActionContext } from '@msdyn365-commerce/core';\n\nimport { BaseCartState } from '../cart-state/base-cart-state';\nimport { ICartState } from '../state-interfaces/i-cart-state';\nimport cartStateDataAction from './cart-state-data-action';\nimport { GlobalStateInput } from './global-state-data-action';\n\nexport function getCartState(ctx: IActionContext): AsyncResult {\n return cartStateDataAction(\n new GlobalStateInput('CARTSTATE', BaseCartState, ctx.requestContext.apiSettings, ctx.requestContext),\n ctx\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 { Cart } from '@msdyn365-commerce/retail-proxy';\nimport { copyAsync, readAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/CartsDataActions.g';\n\nimport { getCartState } from './get-cart-state';\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 = () => `CheckoutCart-ChannelId:${this.apiSettings.channelId}-ApiSettingsCatalogId:${this.apiSettings.catalogId}`;\n\n public getCacheObjectType = () => 'CheckoutCart';\n\n public dataCacheType = (): CacheType => 'request';\n}\n\nenum CartTokenPrefix {\n Auth = 't',\n Anon = 'p'\n}\n\nconst createInput = (inputData: ICreateActionContext) => {\n return new GetCheckoutCartInput(inputData.requestContext.apiSettings);\n};\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 savedCheckoutCartId = ctx.requestContext.cookies.getCheckoutCartCookie();\n const cartCookieParts: string[] = savedCheckoutCartId.split(':');\n let checkoutCartId = null;\n const isAuthenticated = ctx.requestContext.user.isAuthenticated;\n\n if (\n (isAuthenticated && cartCookieParts[0] === CartTokenPrefix.Auth) ||\n (!isAuthenticated && cartCookieParts[0] === CartTokenPrefix.Anon)\n ) {\n checkoutCartId = cartCookieParts[1];\n }\n\n let checkoutCart: Cart | undefined;\n\n if (checkoutCartId) {\n try {\n checkoutCart = await readAsync({ callerContext: ctx, bypassCache: 'none' }, checkoutCartId);\n } catch (error) {\n ctx.telemetry.error('Error getting checkout cart based on saved checkout card id');\n ctx.telemetry.exception(error);\n }\n }\n\n const cartState = await getCartState(ctx);\n if (cartState && cartState.cart.Id !== undefined) {\n if (checkoutCart && checkoutCart.Version && cartState.cart.Version && checkoutCart.Version > cartState.cart.Version) {\n return Promise.resolve(checkoutCart);\n }\n\n return copyAsync({ callerContext: ctx }, cartState.cart.Id, 2)\n .then(cart => {\n ctx.requestContext.cookies.setCheckoutCartCookie(cart, isAuthenticated);\n return cart;\n })\n .catch(error => {\n ctx.telemetry.error('Error copying cart');\n ctx.telemetry.exception(error);\n return undefined;\n });\n }\n\n return undefined;\n}\n\nexport const getCheckoutCartDataAction = createObservableDataAction({\n id: '@msdyn365-commerce/global-state/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 { BaseCartState } from '../cart-state/base-cart-state';\nimport getCheckoutCart, { GetCheckoutCartInput } from '../data-actions/get-checkout-cart';\n\n/**\n * Version of BaseCartState that uses the checkout cart.\n */\nexport class BaseCheckoutCartState extends BaseCartState {\n public async initialize(): Promise {\n if (this.isInitialized) {\n return;\n }\n\n const newCart = await getCheckoutCart(new GetCheckoutCartInput(this.actionContext.requestContext.apiSettings), this.actionContext);\n\n if (newCart) {\n this._cart = newCart;\n this._status = 'READY';\n } else {\n this._status = 'ERROR';\n }\n\n this.isInitialized = true;\n }\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nexport enum CheckoutStorageKey {\n BillingAddress = 'BillingAddress',\n GiftCard = 'GiftCard',\n LoyaltyCardNumber = 'LoyaltyCardNumber',\n LoyaltyAmount = 'LoyaltyAmount',\n TermsAndCondition = 'TermsAndCondition',\n CheckoutGenericData = 'Checkout-Generic-Data',\n PaymentTenderType = 'PaymentTenderType',\n RedirectPaymentConnectorId = 'RedirectPaymentConnectorId',\n IsExpressCheckoutApplied = 'IsExpressCheckoutApplied'\n}\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 Address,\n AttributeValueBase,\n CardPaymentAcceptResult,\n CartLine,\n CommerceProperty,\n GiftCard,\n SalesOrder,\n SimpleProduct,\n TenderLine,\n TokenizedPaymentCard\n} from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\nimport get from 'lodash/get';\nimport { action, computed, observable } from 'mobx';\n\nimport { GlobalState } from '../global-state/global-state';\nimport { CheckoutModule } from '../state-interfaces';\nimport { ICartState } from '../state-interfaces/i-cart-state';\nimport {\n ICheckoutActionResult,\n ICheckoutGenericData,\n ICheckoutState,\n IGiftCardExtend,\n ICheckoutError\n} from '../state-interfaces/i-checkout-state';\nimport { BaseCheckoutCartState } from './base-checkout-cart-state';\nimport { CheckoutStorageKey } from './checkout-state-storage';\n\n/**\n * State information related to what is needed to succesfully perform a checkout.\n */\nexport class BaseCheckoutState extends GlobalState implements ICheckoutState {\n @observable protected _checkoutCart: ICartState;\n\n @computed public get checkoutCart(): ICartState {\n return this._checkoutCart;\n }\n\n @observable protected _salesOrder?: SalesOrder;\n\n @computed public get salesOrder(): Readonly {\n return this._salesOrder;\n }\n\n @observable protected _attributeValues: AttributeValueBase[];\n\n @computed public get attributeValues(): Readonly {\n return this._attributeValues;\n }\n\n @observable protected _extensionProperties: CommerceProperty[];\n\n @computed public get extensionProperties(): Readonly {\n return this._extensionProperties;\n }\n\n @observable protected _orderedProducts?: SimpleProduct[];\n\n @computed public get orderedProducts(): Readonly {\n return this._orderedProducts;\n }\n\n @observable protected _tokenizedPaymentCard?: TokenizedPaymentCard;\n\n @computed public get tokenizedPaymentCard(): Readonly {\n return this._tokenizedPaymentCard;\n }\n\n @observable protected _tenderLine?: TenderLine;\n\n @computed public get tenderLine(): Readonly {\n return this._tenderLine;\n }\n\n @observable protected _billingAddress?: Address;\n\n @computed public get billingAddress(): Readonly
{\n return this._billingAddress;\n }\n\n @observable protected _isBillingAddressSameAsShippingAddress?: boolean;\n\n @computed public get isBillingAddressSameAsShippingAddress(): Readonly {\n return this._isBillingAddressSameAsShippingAddress;\n }\n\n @observable protected _shippingAddress?: Address;\n\n @computed public get shippingAddress(): Readonly
{\n return this._shippingAddress;\n }\n\n @observable protected _hasShippingAddress?: boolean;\n\n @computed public get hasShippingAddress(): Readonly {\n return this._hasShippingAddress;\n }\n\n @observable protected _hasCartDeliveryMode?: boolean;\n\n @computed public get hasCartDeliveryMode(): Readonly {\n return this._hasCartDeliveryMode;\n }\n\n @observable protected _cardPrefix?: string;\n\n @computed public get cardPrefix(): Readonly {\n return this._cardPrefix;\n }\n\n @observable protected _paymentTenderType?: string;\n\n @computed public get paymentTenderType(): Readonly {\n return this._paymentTenderType;\n }\n\n /**\n * @deprecated Use giftCardExtends method.\n */\n @computed public get giftCards(): Readonly {\n return this.giftCardExtends;\n }\n\n @observable protected _giftCardExtends: IGiftCardExtend[] = [];\n\n @computed public get giftCardExtends(): Readonly {\n return this._giftCardExtends;\n }\n\n @observable protected _loyaltyCardNumber?: string;\n\n @computed public get loyaltyCardNumber(): Readonly {\n return this._loyaltyCardNumber;\n }\n\n @observable protected _loyaltyAmount: number = 0;\n\n @computed public get loyaltyAmount(): Readonly {\n return this._loyaltyAmount;\n }\n\n @observable protected _guestCheckoutEmail: string = '';\n\n @computed public get guestCheckoutEmail(): Readonly {\n return this._guestCheckoutEmail;\n }\n\n @observable protected _hasGuestCheckoutEmail?: boolean;\n\n @computed public get hasGuestCheckoutEmail(): Readonly {\n return this._hasGuestCheckoutEmail;\n }\n\n @observable protected _isTermsAndConditionAccepted?: boolean;\n\n @computed public get isTermsAndConditionAccepted(): Readonly {\n return this._isTermsAndConditionAccepted;\n }\n\n @observable protected _isTermsAndConditionChecked?: boolean;\n\n @computed public get isTermsAndConditionChecked(): Readonly {\n return this._isTermsAndConditionChecked;\n }\n\n @observable protected _shouldEnableSinglePaymentAuthorizationCheckout?: boolean;\n\n @computed public get shouldEnableSinglePaymentAuthorizationCheckout(): Readonly {\n return this._shouldEnableSinglePaymentAuthorizationCheckout;\n }\n\n @observable protected _shouldEnableCheckoutErrorDisplayMessaging?: boolean;\n\n @computed public get shouldEnableCheckoutErrorDisplayMessaging(): Readonly {\n return this._shouldEnableCheckoutErrorDisplayMessaging;\n }\n\n @observable protected _shouldCollapsePaymentSection?: boolean;\n\n @computed public get shouldCollapsePaymentSection(): Readonly {\n return this._shouldCollapsePaymentSection;\n }\n\n @observable protected _shouldTriggerPaymentWithPlaceOrder?: boolean;\n\n @computed public get shouldTriggerPaymentWithPlaceOrder(): Readonly {\n return this._shouldTriggerPaymentWithPlaceOrder;\n }\n\n @observable protected _isPaymentSectionContainerReady?: boolean;\n\n @computed public get isPaymentSectionContainerReady(): Readonly {\n return this._isPaymentSectionContainerReady;\n }\n\n @observable protected _cardPaymentAcceptResult?: CardPaymentAcceptResult;\n\n @computed public get cardPaymentAcceptResult(): Readonly {\n return this._cardPaymentAcceptResult;\n }\n\n @observable protected _isPaymentSectionContainerHasError?: boolean;\n\n @computed public get isPaymentSectionContainerHasError(): Readonly {\n return this._isPaymentSectionContainerHasError;\n }\n\n @observable protected _redirectAdditionalContext?: string;\n\n @computed public get redirectAdditionalContext(): Readonly {\n return this._redirectAdditionalContext;\n }\n\n @observable protected _redirectPaymentConnectorId?: string;\n\n @computed public get redirectPaymentConnectorId(): Readonly {\n return this._redirectPaymentConnectorId;\n }\n\n @observable protected _checkoutErrorPaymentConnectorId?: string;\n\n @computed public get checkoutErrorPaymentConnectorId(): Readonly {\n return this._checkoutErrorPaymentConnectorId;\n }\n\n @observable protected _isPlaceOrderEnabledInRedirection?: boolean;\n\n @computed public get isPlaceOrderEnabledInRedirection(): Readonly {\n return this._isPlaceOrderEnabledInRedirection;\n }\n\n @observable protected _isPaymentVerificationRequired?: boolean;\n\n @computed public get isPaymentVerificationRequired(): Readonly {\n return this._isPaymentVerificationRequired;\n }\n\n @observable protected _isCheckoutCallFailed?: boolean;\n\n @computed public get isCheckoutCallFailed(): Readonly {\n return this._isCheckoutCallFailed;\n }\n\n @observable protected _customerAccountAmount: number = 0;\n\n @computed public get customerAccountAmount(): Readonly {\n return this._customerAccountAmount;\n }\n\n @observable protected _shouldEnableExpressCheckoutInCheckout?: boolean;\n\n @computed public get shouldEnableExpressCheckoutInCheckout(): Readonly {\n return this._shouldEnableExpressCheckoutInCheckout;\n }\n\n @observable protected _shouldEnableExpressCheckoutInCart?: boolean;\n\n @computed public get shouldEnableExpressCheckoutInCart(): Readonly {\n return this._shouldEnableExpressCheckoutInCart;\n }\n\n @observable protected _shippingAddressFromExpressCheckout?: Address;\n\n @computed public get shippingAddressFromExpressCheckout(): Readonly
{\n return this._shippingAddressFromExpressCheckout;\n }\n\n @observable protected _emailAddressFromExpressCheckout: string = '';\n\n @computed public get emailAddressFromExpressCheckout(): Readonly {\n return this._emailAddressFromExpressCheckout;\n }\n\n @observable protected _billingAddressFromExpressCheckout?: Address;\n\n @computed public get billingAddressFromExpressCheckout(): Readonly
{\n return this._billingAddressFromExpressCheckout;\n }\n\n @observable protected _isExpressCheckoutApplied?: boolean;\n\n @computed public get isExpressCheckoutApplied(): Readonly {\n return this._isExpressCheckoutApplied;\n }\n\n @observable protected _isExpressAddressApplied?: boolean;\n\n @computed public get isExpressAddressApplied(): Readonly {\n return this._isExpressAddressApplied;\n }\n\n @observable protected _isExpressCheckoutAppliedInCartPage?: boolean;\n\n @computed public get isExpressCheckoutAppliedInCartPage(): Readonly {\n return this._isExpressCheckoutAppliedInCartPage;\n }\n\n @observable protected _isExpressPaymentModulesReady?: CommerceProperty[];\n\n @computed public get isExpressPaymentModulesReady(): Readonly {\n return this._isExpressPaymentModulesReady;\n }\n\n @computed public get isPaymentVerificationRedirection(): Readonly {\n const { requestFormData, query } = this.actionContext.requestContext;\n return !!(query && query.pv === '1' && (requestFormData || query.redirectResult));\n }\n\n @observable protected _checkoutError?: ICheckoutError;\n\n @computed public get checkoutError(): Readonly {\n return this._checkoutError;\n }\n\n @observable protected _isBillingAddressHasError?: boolean;\n\n @computed public get isBillingAddressHasError(): Readonly {\n return this._isBillingAddressHasError;\n }\n\n @observable protected _checkoutErrorFocus?: CheckoutModule;\n\n @computed public get checkoutErrorFocus(): Readonly {\n return this._checkoutErrorFocus;\n }\n\n @observable protected _shouldFocusOnCheckoutError?: boolean;\n\n @computed public get shouldFocusOnCheckoutError(): Readonly {\n return this._shouldFocusOnCheckoutError;\n }\n\n @observable protected _checkoutGenericData: object = {};\n\n constructor(actionContext: IActionContext) {\n super(actionContext);\n this._checkoutCart = new BaseCheckoutCartState(actionContext);\n this._attributeValues = [];\n this._extensionProperties = [];\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- Do not need type check for app settings.\n this._shouldEnableSinglePaymentAuthorizationCheckout = actionContext.requestContext.app.config\n .shouldEnableSinglePaymentAuthorizationCheckout as boolean;\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- Do not need type check for app settings.\n this._shouldEnableCheckoutErrorDisplayMessaging = actionContext.requestContext.app.config\n .shouldEnableCheckoutErrorDisplayMessaging as boolean;\n }\n\n @action\n public updateSalesOrder(input: {\n newSalesOrder: SalesOrder;\n newOrderedProducts: SimpleProduct[];\n additionalProperties?: object;\n }): Promise {\n this._salesOrder = input.newSalesOrder;\n this._orderedProducts = input.newOrderedProducts;\n this._attributeValues = input.newSalesOrder.AttributeValues || [];\n this._extensionProperties = input.newSalesOrder.ExtensionProperties || [];\n\n return Promise.resolve({ status: 'SUCCESS' });\n }\n\n @action\n public async updateAttributeValues(input: {\n newAttributeValues: AttributeValueBase[];\n additionalProperties?: object;\n }): Promise {\n this._attributeValues = input.newAttributeValues;\n\n return Promise.resolve({ status: 'SUCCESS' });\n }\n\n @action\n public async updateExtensionProperties(input: {\n newExtensionProperties: CommerceProperty[];\n additionalProperties?: object;\n }): Promise {\n this._extensionProperties = input.newExtensionProperties;\n\n return Promise.resolve({ status: 'SUCCESS' });\n }\n\n @action\n public updateTokenizedPaymentCard(input: {\n newTokenizedPaymentCard?: TokenizedPaymentCard;\n additionalProperties?: object;\n }): Promise {\n this._tokenizedPaymentCard = input.newTokenizedPaymentCard;\n\n return Promise.resolve({ status: 'SUCCESS' });\n }\n\n @action\n public updateTenderLine(input: { newTenderLine?: TenderLine; additionalProperties?: object }): Promise {\n this._tenderLine = input.newTenderLine;\n\n return Promise.resolve({ status: 'SUCCESS' });\n }\n\n @action\n public async updateShippingAddress(input: {\n newShippingAddress: Address;\n additionalProperties?: object;\n }): Promise {\n this._shippingAddress = input.newShippingAddress;\n\n return Promise.resolve({ status: 'SUCCESS' });\n }\n\n @action\n public async updateHasShippingAddress(\n // eslint-disable-next-line @typescript-eslint/naming-convention -- Keep the same naming pattern.\n input: { newHasShippingAddress: boolean; additionalProperties?: { [key: string]: unknown } }\n ): Promise {\n this._hasShippingAddress = input.newHasShippingAddress;\n\n const result: ICheckoutActionResult = { status: 'SUCCESS' };\n return Promise.resolve(result);\n }\n\n @action\n public async updateHasCartDeliveryMode(\n // eslint-disable-next-line @typescript-eslint/naming-convention -- Keep the same naming pattern.\n input: { newHasCartDeliveryMode: boolean; additionalProperties?: { [key: string]: unknown } }\n ): Promise {\n this._hasCartDeliveryMode = input.newHasCartDeliveryMode;\n\n const result: ICheckoutActionResult = { status: 'SUCCESS' };\n return Promise.resolve(result);\n }\n\n @action\n public async updateTermsAndConditionsAcceptance(input: {\n newIsTermsAndConditionAccepted: boolean;\n additionalProperties?: object;\n }): Promise {\n this._isTermsAndConditionAccepted = input.newIsTermsAndConditionAccepted;\n\n return Promise.resolve({ status: 'SUCCESS' });\n }\n\n @action\n public async updateIsTermsAndConditionsChecked(\n // eslint-disable-next-line @typescript-eslint/naming-convention -- Keep the same naming pattern.\n input: { newIsTermsAndConditionChecked: boolean; additionalProperties?: { [key: string]: unknown } }\n ): Promise {\n this._isTermsAndConditionChecked = input.newIsTermsAndConditionChecked;\n\n const result: ICheckoutActionResult = { status: 'SUCCESS' };\n return Promise.resolve(result);\n }\n\n @action\n public async updateShouldCollapsePaymentSection(\n // eslint-disable-next-line @typescript-eslint/naming-convention -- Keep the same naming pattern.\n input: { newShouldCollapsePaymentSection: boolean; additionalProperties?: { [key: string]: unknown } }\n ): Promise {\n this._shouldCollapsePaymentSection = input.newShouldCollapsePaymentSection;\n\n const result: ICheckoutActionResult = { status: 'SUCCESS' };\n return Promise.resolve(result);\n }\n\n @action\n public async updateShouldTriggerPaymentWithPlaceOrder(\n // eslint-disable-next-line @typescript-eslint/naming-convention -- Keep the same naming pattern.\n input: { newShouldTriggerPaymentWithPlaceOrder: boolean; additionalProperties?: { [key: string]: unknown } }\n ): Promise {\n this._shouldTriggerPaymentWithPlaceOrder = input.newShouldTriggerPaymentWithPlaceOrder;\n\n const result: ICheckoutActionResult = { status: 'SUCCESS' };\n return Promise.resolve(result);\n }\n\n @action\n public async updateIsPaymentSectionContainerReady(\n // eslint-disable-next-line @typescript-eslint/naming-convention -- Keep the same naming pattern.\n input: { newIsPaymentSectionContainerReady: boolean; additionalProperties?: { [key: string]: unknown } }\n ): Promise {\n this._isPaymentSectionContainerReady = input.newIsPaymentSectionContainerReady;\n\n const result: ICheckoutActionResult = { status: 'SUCCESS' };\n return Promise.resolve(result);\n }\n\n @action\n public async updateCardPaymentAcceptResult(input: {\n newCardPaymentAcceptResult: CardPaymentAcceptResult;\n additionalProperties?: { [key: string]: unknown };\n }): Promise {\n this._cardPaymentAcceptResult = input.newCardPaymentAcceptResult;\n\n const result: ICheckoutActionResult = { status: 'SUCCESS' };\n return Promise.resolve(result);\n }\n\n @action\n public async updateIsPaymentSectionContainerHasError(\n // eslint-disable-next-line @typescript-eslint/naming-convention -- Keep the same naming pattern.\n input: { newIsPaymentSectionContainerHasError: boolean; additionalProperties?: { [key: string]: unknown } }\n ): Promise {\n this._isPaymentSectionContainerHasError = input.newIsPaymentSectionContainerHasError;\n\n const result: ICheckoutActionResult = { status: 'SUCCESS' };\n return Promise.resolve(result);\n }\n\n @action\n public async updateRedirectAdditionalContext(input: {\n newRedirectAdditionalContext: string;\n additionalProperties?: { [key: string]: unknown };\n }): Promise {\n this._redirectAdditionalContext = input.newRedirectAdditionalContext;\n\n const result: ICheckoutActionResult = { status: 'SUCCESS' };\n return Promise.resolve(result);\n }\n\n @action\n public async updateRedirectPaymentConnectorId(input: {\n newRedirectPaymentConnectorId: string;\n additionalProperties?: { [key: string]: unknown };\n }): Promise {\n this._redirectPaymentConnectorId = input.newRedirectPaymentConnectorId;\n\n const result: ICheckoutActionResult = { status: 'SUCCESS' };\n return Promise.resolve(result);\n }\n\n @action\n public async updateCheckoutErrorPaymentConnectorId(input: {\n newCheckoutErrorPaymentConnectorId: string;\n additionalProperties?: { [key: string]: unknown };\n }): Promise {\n this._checkoutErrorPaymentConnectorId = input.newCheckoutErrorPaymentConnectorId;\n\n const result: ICheckoutActionResult = { status: 'SUCCESS' };\n return Promise.resolve(result);\n }\n\n @action\n public async updateIsCheckoutCallFailed(\n // eslint-disable-next-line @typescript-eslint/naming-convention -- Keep the same naming pattern.\n input: { newIsCheckoutCallFailed: boolean; additionalProperties?: { [key: string]: unknown } }\n ): Promise {\n this._isCheckoutCallFailed = input.newIsCheckoutCallFailed;\n\n const result: ICheckoutActionResult = { status: 'SUCCESS' };\n return Promise.resolve(result);\n }\n\n @action\n public async updateIsPlaceOrderEnabledInRedirection(\n // eslint-disable-next-line @typescript-eslint/naming-convention -- Keep the same naming pattern.\n input: { newIsPlaceOrderEnabledInRedirection: boolean; additionalProperties?: { [key: string]: unknown } }\n ): Promise {\n this._isPlaceOrderEnabledInRedirection = input.newIsPlaceOrderEnabledInRedirection;\n\n const result: ICheckoutActionResult = { status: 'SUCCESS' };\n return Promise.resolve(result);\n }\n\n @action\n public async updateIsPaymentVerificationRequired(\n // eslint-disable-next-line @typescript-eslint/naming-convention -- Keep the same naming pattern.\n input: { newIsPaymentVerificationRequired: boolean; additionalProperties?: { [key: string]: unknown } }\n ): Promise {\n this._isPaymentVerificationRequired = input.newIsPaymentVerificationRequired;\n\n const result: ICheckoutActionResult = { status: 'SUCCESS' };\n return Promise.resolve(result);\n }\n\n @action\n public updateBillingAddress(input: { newBillingAddress: Address; additionalProperties?: object }): Promise {\n this._billingAddress = input.newBillingAddress;\n\n // @ts-expect-error\n this._isBillingAddressSameAsShippingAddress = input.additionalProperties?.isBillingAddressSameAsShippingAddress || false;\n\n return Promise.resolve({ status: 'SUCCESS' });\n }\n\n @action\n public removeBillingAddress(input: { additionalProperties?: object }): Promise {\n this._billingAddress = undefined;\n this._isBillingAddressSameAsShippingAddress = undefined;\n\n return Promise.resolve({ status: 'SUCCESS' });\n }\n\n @action\n public updatePaymentTenderType(input: {\n newPaymentTenderType?: string;\n additionalProperties?: object;\n }): Promise {\n this._paymentTenderType = input.newPaymentTenderType;\n\n return Promise.resolve({ status: 'SUCCESS' });\n }\n\n @action\n public updateCardPrefix(input: { newCardPrefix: string; additionalProperties?: object }): Promise {\n this._cardPrefix = input.newCardPrefix;\n\n return Promise.resolve({ status: 'SUCCESS' });\n }\n\n @action\n public removeGiftCard(input: { giftCardNumber: string; additionalProperties?: object }): Promise {\n this._giftCardExtends = this._giftCardExtends.filter(giftCard => giftCard.Id !== input.giftCardNumber);\n\n return Promise.resolve({ status: 'SUCCESS' });\n }\n\n @action\n public removeGiftCardExtend(input: { giftCardNumber: string; additionalProperties?: object }): Promise {\n this._giftCardExtends = this._giftCardExtends.filter(giftCard => giftCard.Id !== input.giftCardNumber);\n\n return Promise.resolve({ status: 'SUCCESS' });\n }\n\n @action\n public addGiftCard(input: { giftCard: GiftCard; additionalProperties?: object }): Promise {\n // @ts-expect-error\n const { Pin, ExpirationDate, TenderTypeId } = input.additionalProperties || {};\n\n const gitCardExtend = { ...input.giftCard, ...{ Pin, ExpirationDate, TenderTypeId } };\n\n this._giftCardExtends = [gitCardExtend, ...this._giftCardExtends];\n\n return Promise.resolve({ status: 'SUCCESS' });\n }\n\n @action\n public addGiftCardExtend(input: { giftCard: IGiftCardExtend; additionalProperties?: object }): Promise {\n this._giftCardExtends = [input.giftCard, ...this._giftCardExtends];\n\n return Promise.resolve({ status: 'SUCCESS' });\n }\n\n @action\n public updateLoyaltyCardNumber(input: { newLoyaltyCardNumber: string; additionalProperties?: object }): Promise {\n this._loyaltyCardNumber = input.newLoyaltyCardNumber;\n\n return Promise.resolve({ status: 'SUCCESS' });\n }\n\n @action\n public updateLoyaltyAmount(input: { newAmount: number; additionalProperties?: object }): Promise {\n this._loyaltyAmount = Number(input.newAmount.toFixed(2));\n\n return Promise.resolve({ status: 'SUCCESS' });\n }\n\n @action\n public async updateGuestCheckoutEmail(input: {\n newGuestCheckoutEmail: string;\n additionalProperties?: object;\n }): Promise {\n this._guestCheckoutEmail = input.newGuestCheckoutEmail;\n const emailOnCart = this.checkoutCart.cart.ReceiptEmail;\n\n if (emailOnCart !== input.newGuestCheckoutEmail) {\n await this.checkoutCart.updateReceiptEmail({ newEmail: input.newGuestCheckoutEmail });\n }\n\n return Promise.resolve({ status: 'SUCCESS' });\n }\n\n /**\n * Updates cartLines objects in cart.\n * @param input - The input.\n * @param input.updatedCartLinesObject - updated cartline.\n * @returns ICartActionResult.\n */\n @action\n public async updateCartLines(input: { updatedCartLinesObject: CartLine[] }): Promise {\n await this.checkoutCart.updateCartLines({ updatedCartLinesObject: input.updatedCartLinesObject });\n return Promise.resolve({ status: 'SUCCESS' });\n }\n\n @action\n public async updateHasGuestCheckoutEmail(\n // eslint-disable-next-line @typescript-eslint/naming-convention -- Keep the same naming pattern.\n input: { newHasGuestCheckoutEmail: boolean; additionalProperties?: { [key: string]: unknown } }\n ): Promise {\n this._hasGuestCheckoutEmail = input.newHasGuestCheckoutEmail;\n\n const result: ICheckoutActionResult = { status: 'SUCCESS' };\n return Promise.resolve(result);\n }\n\n @action\n public removeCheckoutCartId(input: { additionalProperties?: object }): Promise {\n this.actionContext.requestContext.cookies.removeCheckoutCartCookie();\n return Promise.resolve({ status: 'SUCCESS' });\n }\n\n @action\n public saveDataInStorage(input: { additionalProperties?: object }): Promise {\n const { sessionStorage } = this.actionContext.requestContext;\n\n // Add all local data to session storage\n if (this.billingAddress) {\n sessionStorage.setCheckoutCartData(CheckoutStorageKey.BillingAddress, {\n billingAddress: this.billingAddress,\n isBillingAddressSameAsShippingAddress: this.isBillingAddressSameAsShippingAddress\n });\n }\n\n if (this.giftCardExtends && this.giftCardExtends.length > 0) {\n sessionStorage.setCheckoutCartData(CheckoutStorageKey.GiftCard, this.giftCardExtends);\n }\n\n if (this.loyaltyCardNumber) {\n sessionStorage.setCheckoutCartData(CheckoutStorageKey.LoyaltyCardNumber, { loyaltyCardNumber: this.loyaltyCardNumber });\n }\n\n if (this.loyaltyAmount) {\n sessionStorage.setCheckoutCartData(CheckoutStorageKey.LoyaltyAmount, { loyaltyAmount: this.loyaltyAmount });\n }\n\n if (this.isTermsAndConditionAccepted) {\n sessionStorage.setCheckoutCartData(CheckoutStorageKey.TermsAndCondition, {\n isTermsAndConditionAccepted: this.isTermsAndConditionAccepted\n });\n }\n\n if (this.paymentTenderType) {\n window.sessionStorage.setItem(CheckoutStorageKey.PaymentTenderType, this.paymentTenderType);\n }\n\n if (this.redirectPaymentConnectorId) {\n window.sessionStorage.setItem(CheckoutStorageKey.RedirectPaymentConnectorId, this.redirectPaymentConnectorId);\n }\n\n if (this.isExpressCheckoutApplied) {\n window.sessionStorage.setItem(CheckoutStorageKey.IsExpressCheckoutApplied, this.isExpressCheckoutApplied.toString());\n }\n\n // Save generic data with SaveDataBeforeRedirect value true\n const filtered = Object.keys(this._checkoutGenericData).reduce((filteredData: object, key: string) => {\n if (this._checkoutGenericData[key].SaveDataBeforeRedirect) {\n filteredData[key] = this._checkoutGenericData[key];\n }\n return filteredData;\n }, {});\n\n if (Object.keys(filtered).length > 0) {\n sessionStorage.setCheckoutCartData(CheckoutStorageKey.CheckoutGenericData, { checkoutGenericData: filtered });\n }\n\n return Promise.resolve({ status: 'SUCCESS' });\n }\n\n @action\n public updateCustomerAccountAmount(input: { newAmount: number; additionalProperties?: object }): Promise {\n this._customerAccountAmount = Number(input.newAmount.toFixed(2));\n\n return Promise.resolve({ status: 'SUCCESS' });\n }\n\n @action\n public async updateBillingAddressFromExpressCheckout(input: {\n newBillingAddressFromExpressCheckout: Address;\n additionalProperties?: { [key: string]: unknown };\n }): Promise {\n this._billingAddressFromExpressCheckout = input.newBillingAddressFromExpressCheckout;\n\n const result: ICheckoutActionResult = { status: 'SUCCESS' };\n return Promise.resolve(result);\n }\n\n @action\n public async updateShippingAddressFromExpressCheckout(input: {\n newShippingAddressFromExpressCheckout: Address;\n additionalProperties?: { [key: string]: unknown };\n }): Promise {\n this._shippingAddressFromExpressCheckout = input.newShippingAddressFromExpressCheckout;\n\n const result: ICheckoutActionResult = { status: 'SUCCESS' };\n return Promise.resolve(result);\n }\n\n @action\n public async updateEmailAddressFromExpressCheckout(input: {\n newEmailAddressFromExpressCheckout: string;\n additionalProperties?: { [key: string]: unknown };\n }): Promise {\n this._emailAddressFromExpressCheckout = input.newEmailAddressFromExpressCheckout;\n\n const result: ICheckoutActionResult = { status: 'SUCCESS' };\n return Promise.resolve(result);\n }\n\n @action\n public async updateShouldEnableExpressCheckoutInCheckout(\n // eslint-disable-next-line @typescript-eslint/naming-convention -- Keep the same naming pattern.\n input: { newShouldEnableExpressCheckoutInCheckout: boolean; additionalProperties?: { [key: string]: unknown } }\n ): Promise {\n this._shouldEnableExpressCheckoutInCheckout = input.newShouldEnableExpressCheckoutInCheckout;\n\n const result: ICheckoutActionResult = { status: 'SUCCESS' };\n return Promise.resolve(result);\n }\n\n @action\n public async updateShouldEnableExpressCheckoutInCart(\n // eslint-disable-next-line @typescript-eslint/naming-convention -- Keep the same naming pattern.\n input: { newShouldEnableExpressCheckoutInCart: boolean; additionalProperties?: { [key: string]: unknown } }\n ): Promise {\n this._shouldEnableExpressCheckoutInCart = input.newShouldEnableExpressCheckoutInCart;\n\n const result: ICheckoutActionResult = { status: 'SUCCESS' };\n return Promise.resolve(result);\n }\n\n @action\n public async updateIsExpressCheckoutApplied(\n // eslint-disable-next-line @typescript-eslint/naming-convention -- Keep the same naming pattern.\n input: { newIsExpressCheckoutApplied: boolean; additionalProperties?: { [key: string]: unknown } }\n ): Promise {\n this._isExpressCheckoutApplied = input.newIsExpressCheckoutApplied;\n\n const result: ICheckoutActionResult = { status: 'SUCCESS' };\n return Promise.resolve(result);\n }\n\n @action\n public async updateIsExpressAddressApplied(\n // eslint-disable-next-line @typescript-eslint/naming-convention -- Keep the same naming pattern.\n input: { newIsExpressAddressApplied: boolean; additionalProperties?: { [key: string]: unknown } }\n ): Promise {\n this._isExpressAddressApplied = input.newIsExpressAddressApplied;\n\n const result: ICheckoutActionResult = { status: 'SUCCESS' };\n return Promise.resolve(result);\n }\n\n @action\n public async updateIsExpressCheckoutAppliedInCartPage(\n // eslint-disable-next-line @typescript-eslint/naming-convention -- Keep the same naming pattern.\n input: { newIsExpressCheckoutAppliedInCartPage: boolean; additionalProperties?: { [key: string]: unknown } }\n ): Promise {\n this._isExpressCheckoutAppliedInCartPage = input.newIsExpressCheckoutAppliedInCartPage;\n\n const result: ICheckoutActionResult = { status: 'SUCCESS' };\n return Promise.resolve(result);\n }\n\n @action\n public async updateIsBillingAddressHasError(\n // eslint-disable-next-line @typescript-eslint/naming-convention -- Keep the same naming pattern.\n input: { newIsBillingAddressHasError: boolean; additionalProperties?: { [key: string]: unknown } }\n ): Promise {\n this._isBillingAddressHasError = input.newIsBillingAddressHasError;\n\n const result: ICheckoutActionResult = { status: 'SUCCESS' };\n return Promise.resolve(result);\n }\n\n @action\n public async updateIsExpressPaymentModulesReady(\n // eslint-disable-next-line @typescript-eslint/naming-convention -- Keep the same naming pattern.\n input: {\n newIsExpressPaymentModulesReady: CommerceProperty[];\n additionalProperties?: { [key: string]: unknown };\n }\n ): Promise {\n this._isExpressPaymentModulesReady = input.newIsExpressPaymentModulesReady;\n\n const result: ICheckoutActionResult = { status: 'SUCCESS' };\n return Promise.resolve(result);\n }\n\n @action\n public async updateExpressCheckoutDetails(input: {\n // eslint-disable-next-line @typescript-eslint/naming-convention -- Keep the same naming pattern.\n newIsExpressCheckoutApplied: boolean;\n // eslint-disable-next-line @typescript-eslint/naming-convention -- Keep the same naming pattern.\n newIsExpressAddressApplied?: boolean;\n newCardPaymentAcceptResult?: CardPaymentAcceptResult;\n newEmailAddressFromExpressCheckout: string;\n newTenderLine?: TenderLine;\n newPaymentTenderType?: string;\n newTokenizedPaymentCard?: TokenizedPaymentCard;\n additionalProperties?: { [key: string]: unknown };\n }): Promise {\n this._isExpressCheckoutApplied = input.newIsExpressCheckoutApplied;\n\n if (input.newIsExpressAddressApplied !== undefined) {\n this._isExpressAddressApplied = input.newIsExpressAddressApplied;\n }\n\n if (input.newCardPaymentAcceptResult !== undefined) {\n this._cardPaymentAcceptResult = input.newCardPaymentAcceptResult;\n }\n\n if (input.newPaymentTenderType !== undefined) {\n this._paymentTenderType = input.newPaymentTenderType;\n }\n\n if (input.newTokenizedPaymentCard !== undefined) {\n this._tokenizedPaymentCard = input.newTokenizedPaymentCard;\n }\n\n if (input.newTenderLine !== undefined) {\n this._tenderLine = input.newTenderLine;\n }\n\n if (input.newEmailAddressFromExpressCheckout) {\n this._emailAddressFromExpressCheckout = input.newEmailAddressFromExpressCheckout;\n }\n\n const result: ICheckoutActionResult = { status: 'SUCCESS' };\n return Promise.resolve(result);\n }\n\n @action\n public async updateCheckoutError(input: {\n newCheckoutError: ICheckoutError;\n additionalProperties?: { [key: string]: unknown };\n }): Promise {\n this._checkoutError = input.newCheckoutError;\n\n const result: ICheckoutActionResult = { status: 'SUCCESS' };\n return Promise.resolve(result);\n }\n\n @action\n public setCheckoutGenericData(input: {\n key: string;\n checkoutGenericData: ICheckoutGenericData;\n additionalProperties?: object;\n }): Promise {\n this._checkoutGenericData[input.key] = input.checkoutGenericData;\n return Promise.resolve({ status: 'SUCCESS' });\n }\n\n @action\n public getCheckoutGenericData(input: { key: string }): ICheckoutGenericData | undefined {\n return this._checkoutGenericData[input.key];\n }\n\n @action\n public async updateCheckoutErrorFocus(\n // eslint-disable-next-line @typescript-eslint/naming-convention -- Keep the same naming pattern.\n input: { newCheckoutErrorFocus: CheckoutModule; additionalProperties?: { [key: string]: unknown } }\n ): Promise {\n this._checkoutErrorFocus = input.newCheckoutErrorFocus;\n\n const result: ICheckoutActionResult = { status: 'SUCCESS' };\n return Promise.resolve(result);\n }\n\n @action\n public async updateShouldFocusOnCheckoutError(\n // eslint-disable-next-line @typescript-eslint/naming-convention -- Keep the same naming pattern.\n input: { newShouldFocusOnCheckoutError: boolean; additionalProperties?: { [key: string]: unknown } }\n ): Promise {\n this._shouldFocusOnCheckoutError = input.newShouldFocusOnCheckoutError;\n\n const result: ICheckoutActionResult = { status: 'SUCCESS' };\n return Promise.resolve(result);\n }\n\n public async initialize(): Promise {\n if (this.isInitialized) {\n return;\n }\n\n await this._checkoutCart.initialize();\n\n this.setInitialData();\n this.isInitialized = true;\n this._status = 'READY';\n this._attributeValues = [];\n this._extensionProperties = [];\n }\n\n @action\n private cleanCheckoutData(input: { additionalProperties?: object }): Promise {\n this.actionContext.requestContext.sessionStorage.removeCheckoutCartData();\n return Promise.resolve({ status: 'SUCCESS' });\n }\n\n private setInitialData() {\n const { sessionStorage } = this.actionContext.requestContext;\n\n if (this.isPaymentVerificationRedirection) {\n const billingAddress = sessionStorage.getCheckoutCartData(CheckoutStorageKey.BillingAddress);\n const giftCard = sessionStorage.getCheckoutCartData(CheckoutStorageKey.GiftCard);\n\n this._billingAddress = get(billingAddress, 'billingAddress');\n this._isBillingAddressSameAsShippingAddress = get(billingAddress, 'isBillingAddressSameAsShippingAddress');\n this._giftCardExtends = (giftCard && Array.isArray(giftCard) ? giftCard : []) as IGiftCardExtend[];\n this._loyaltyCardNumber = get(sessionStorage.getCheckoutCartData(CheckoutStorageKey.LoyaltyCardNumber), 'loyaltyCardNumber');\n this._loyaltyAmount = get(sessionStorage.getCheckoutCartData(CheckoutStorageKey.LoyaltyAmount), 'loyaltyAmount');\n this._isTermsAndConditionAccepted = get(\n sessionStorage.getCheckoutCartData(CheckoutStorageKey.TermsAndCondition),\n 'isTermsAndConditionAccepted'\n );\n this._checkoutGenericData =\n get(sessionStorage.getCheckoutCartData(CheckoutStorageKey.CheckoutGenericData), 'checkoutGenericData') || {};\n this._paymentTenderType = window.sessionStorage.getItem(CheckoutStorageKey.PaymentTenderType) ?? undefined;\n this._redirectPaymentConnectorId = window.sessionStorage.getItem(CheckoutStorageKey.RedirectPaymentConnectorId) as string;\n this._isExpressCheckoutApplied = (window.sessionStorage.getItem(CheckoutStorageKey.IsExpressCheckoutApplied) as string)\n ? true\n : false;\n }\n\n this.cleanCheckoutData({});\n }\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { BaseCheckoutState } from '../checkout-state/base-checkout-state';\nimport { ICheckoutState } from '../state-interfaces/i-checkout-state';\nimport createGlobalStateDataAction from './global-state-data-action';\n\nexport default createGlobalStateDataAction('CHECKOUTSTATE', BaseCheckoutState);\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 ICommerceApiSettings,\n ICreateActionContext,\n IRequestContext\n} from '@msdyn365-commerce/core';\nimport { Cart } from '@msdyn365-commerce/retail-proxy';\n\nimport { ICartState } from '../state-interfaces';\nimport { getCartState } from './get-cart-state';\n\n/**\n * Input class for getCart data action.\n */\nexport class GetCartStateDataInput implements IActionInput {\n private readonly apiSettings: ICommerceApiSettings;\n\n private readonly catalogId?: number;\n\n constructor(apiSettings: ICommerceApiSettings, requestContext?: IRequestContext) {\n this.apiSettings = apiSettings;\n if (requestContext) {\n this.catalogId = getCatalogId(requestContext);\n }\n }\n\n public getCacheKey = () => `GetCart-ChannelId:${this.apiSettings.channelId}-CatalogId:${this.catalogId ?? 0}`;\n\n public getCacheObjectType = () => 'Cart';\n\n public dataCacheType = (): CacheType => 'none';\n}\n\nconst createInput = (inputData: ICreateActionContext) => {\n return new GetCartStateDataInput(inputData.requestContext.apiSettings, inputData.requestContext);\n};\n\n/**\n * Data action to copy the cart for actions.\n * @param input\n * @param ctx\n */\nexport async function getCartStateData(input: GetCartStateDataInput, ctx: IActionContext): Promise {\n const cartState = await getCartState(ctx);\n if (cartState && cartState.cart.Id !== undefined) {\n return cartState;\n }\n\n return undefined;\n}\n\nexport default createObservableDataAction({\n id: '@msdyn365-commerce/global-state/get-cart-state-data',\n action: >getCartStateData,\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\nexport enum ErrorCode {\n ActionError = 'ActionError',\n Microsoft_Dynamics_Commerce_Runtime_BlockedLoyaltyCard = 'Microsoft_Dynamics_Commerce_Runtime_BlockedLoyaltyCard',\n Microsoft_Dynamics_Commerce_Runtime_CustomerAccountLimitSignDifferentFromAmountDue = 'Microsoft_Dynamics_Commerce_Runtime_CustomerAccountLimitSignDifferentFromAmountDue',\n Microsoft_Dynamics_Commerce_Runtime_CustomerAccountPaymentExceedsAvailableCreditLimit = 'Microsoft_Dynamics_Commerce_Runtime_CustomerAccountPaymentExceedsAvailableCreditLimit',\n Microsoft_Dynamics_Commerce_Runtime_CustomerAccountPaymentExceedsCustomerAccountFloorLimit = 'Microsoft_Dynamics_Commerce_Runtime_CustomerAccountPaymentExceedsCustomerAccountFloorLimit',\n Microsoft_Dynamics_Commerce_Runtime_CustomerAccountPaymentExceedsTotalAmountForCarryOutAndReturnItems = 'Microsoft_Dynamics_Commerce_Runtime_CustomerAccountPaymentExceedsTotalAmountForCarryOutAndReturnItems',\n Microsoft_Dynamics_Commerce_Runtime_CustomerAccountPaymentForCustomerWithoutAllowOnAccount = 'Microsoft_Dynamics_Commerce_Runtime_CustomerAccountPaymentForCustomerWithoutAllowOnAccount',\n Microsoft_Dynamics_Commerce_Runtime_CustomerAccountPaymentNotAllowedForOpenInvoices = 'Microsoft_Dynamics_Commerce_Runtime_CustomerAccountPaymentNotAllowedForOpenInvoices',\n Microsoft_Dynamics_Commerce_Runtime_FraudRisk = 'Microsoft_Dynamics_Commerce_Runtime_FraudRisk',\n Microsoft_Dynamics_Commerce_Runtime_GiftCardBalanceInquiryFailed = 'Microsoft_Dynamics_Commerce_Runtime_GiftCardBalanceInquiryFailed',\n Microsoft_Dynamics_Commerce_Runtime_GiftCardCurrencyMismatch = 'Microsoft_Dynamics_Commerce_Runtime_GiftCardCurrencyMismatch',\n Microsoft_Dynamics_Commerce_Runtime_InvalidCartVersion = 'Microsoft_Dynamics_Commerce_Runtime_InvalidCartVersion',\n Microsoft_Dynamics_Commerce_Runtime_InvalidLoyaltyCardNumber = 'Microsoft_Dynamics_Commerce_Runtime_InvalidLoyaltyCardNumber',\n Microsoft_Dynamics_Commerce_Runtime_InvalidPaymentRequest = 'Microsoft_Dynamics_Commerce_Runtime_InvalidPaymentRequest',\n Microsoft_Dynamics_Commerce_Runtime_MissingRequiredCartTenderLines = 'Microsoft_Dynamics_Commerce_Runtime_MissingRequiredCartTenderLines',\n Microsoft_Dynamics_Commerce_Runtime_MultipleCustomerAccountPaymentsNotAllowed = ' Microsoft_Dynamics_Commerce_Runtime_MultipleCustomerAccountPaymentsNotAllowed',\n Microsoft_Dynamics_Commerce_Runtime_NoMoreThanOneLoyaltyTender = 'Microsoft_Dynamics_Commerce_Runtime_NoMoreThanOneLoyaltyTender',\n Microsoft_Dynamics_Commerce_Runtime_NoResponseFromGatewayForGiftCardBalanceInquiry = 'Microsoft_Dynamics_Commerce_Runtime_NoResponseFromGatewayForGiftCardBalanceInquiry',\n Microsoft_Dynamics_Commerce_Runtime_NoTenderLoyaltyCard = 'Microsoft_Dynamics_Commerce_Runtime_NoTenderLoyaltyCard',\n Microsoft_Dynamics_Commerce_Runtime_NotEnoughRewardPoints = 'Microsoft_Dynamics_Commerce_Runtime_NotEnoughRewardPoints',\n Microsoft_Dynamics_Commerce_Runtime_PaymentAlreadyVoided = 'Microsoft_Dynamics_Commerce_Runtime_PaymentAlreadyVoided',\n Microsoft_Dynamics_Commerce_Runtime_PaymentAmountExceedsGiftBalance = 'Microsoft_Dynamics_Commerce_Runtime_PaymentAmountExceedsGiftBalance',\n Microsoft_Dynamics_Commerce_Runtime_PaymentRequiresMerchantProperties = 'Microsoft_Dynamics_Commerce_Runtime_PaymentRequiresMerchantProperties',\n Microsoft_Dynamics_Commerce_Runtime_PaymentUsingUnauthorizedAccount = 'Microsoft_Dynamics_Commerce_Runtime_PaymentUsingUnauthorizedAccount',\n Microsoft_Dynamics_Commerce_Runtime_RefundAmountMoreThanAllowed = 'Microsoft_Dynamics_Commerce_Runtime_RefundAmountMoreThanAllowed',\n Microsoft_Dynamics_Commerce_Runtime_UnableToAuthorizePayment = 'Microsoft_Dynamics_Commerce_Runtime_UnableToAuthorizePayment',\n Microsoft_Dynamics_Commerce_Runtime_UnableToAuthorizePaymentCardAdditionalContextRequired = 'Microsoft_Dynamics_Commerce_Runtime_UnableToAuthorizePaymentCardAdditionalContextRequired',\n Microsoft_Dynamics_Commerce_Runtime_UnableToAuthorizePaymentCardTypeMissingOrNotSupported = 'Microsoft_Dynamics_Commerce_Runtime_UnableToAuthorizePaymentCardTypeMissingOrNotSupported',\n Microsoft_Dynamics_Commerce_Runtime_UnableToCancelPayment = 'Microsoft_Dynamics_Commerce_Runtime_UnableToCancelPayment',\n Microsoft_Dynamics_Commerce_Runtime_UnableToReadCardTokenInfo = 'Microsoft_Dynamics_Commerce_Runtime_UnableToReadCardTokenInfo',\n Microsoft_Dynamics_Commerce_Runtime_UnableToRetrieveCardPaymentAcceptResult = 'Microsoft_Dynamics_Commerce_Runtime_UnableToRetrieveCardPaymentAcceptResult'\n}\n\nexport enum ErrorMessageResource {\n blockedLoyaltyCardErrorMessage = 'blockedLoyaltyCardErrorMessage',\n checkoutTimeoutErrorMessage = 'checkoutTimeoutErrorMessage',\n customerAccountLimitSignDifferentFromAmountDueErrorMessage = 'customerAccountLimitSignDifferentFromAmountDueErrorMessage',\n customerAccountPaymentExceedsAvailableCreditLimitErrorMessage = 'customerAccountPaymentExceedsAvailableCreditLimitErrorMessage',\n customerAccountPaymentExceedsCustomerAccountFloorLimitErrorMessage = 'customerAccountPaymentExceedsCustomerAccountFloorLimitErrorMessage',\n customerAccountPaymentExceedsTotalAmountForCarryOutAndReturnItemsErrorMessage = 'customerAccountPaymentExceedsTotalAmountForCarryOutAndReturnItemsErrorMessage',\n customerAccountPaymentForCustomerWithoutAllowOnAccountErrorMessage = 'customerAccountPaymentForCustomerWithoutAllowOnAccountErrorMessage',\n customerAccountPaymentNotAllowedForOpenInvoicesErrorMessage = 'customerAccountPaymentNotAllowedForOpenInvoicesErrorMessage',\n fraudRiskErrorMessage = 'fraudRiskErrorMessage',\n giftCardBalanceInquiryFailedErrorMessage = 'giftCardBalanceInquiryFailedErrorMessage',\n giftCardCurrencyMismatchErrorMessage = 'giftCardCurrencyMismatchErrorMessage',\n invalidCartVersionErrorMessage = 'invalidCartVersionErrorMessage',\n invalidLoyaltyCardNumberErrorMessage = 'invalidLoyaltyCardNumberErrorMessage',\n invalidPaymentRequestConsoleErrorMessage = 'invalidPaymentRequestConsoleErrorMessage',\n invalidPaymentRequestErrorMessage = 'invalidPaymentRequestErrorMessage',\n missingRequiredCartTenderLinesErrorMessage = 'missingRequiredCartTenderLinesErrorMessage',\n multipleCustomerAccountPaymentsNotAllowedErrorMessage = 'multipleCustomerAccountPaymentsNotAllowedErrorMessage',\n noMoreThanOneLoyaltyTenderErrorMessage = 'noMoreThanOneLoyaltyTenderErrorMessage',\n noResponseFromGatewayForGiftCardBalanceInquiryErrorMessage = 'noResponseFromGatewayForGiftCardBalanceInquiryErrorMessage',\n noTenderLoyaltyCardErrorMessage = 'noTenderLoyaltyCardErrorMessage',\n notEnoughRewardPointsErrorMessage = 'notEnoughRewardPointsErrorMessage',\n paymentAlreadyVoidedErrorMessage = 'paymentAlreadyVoidedErrorMessage',\n paymentAmountExceedsGiftBalanceErrorMessage = 'paymentAmountExceedsGiftBalanceErrorMessage',\n paymentRequiresMerchantPropertiesConsoleErrorMessage = 'paymentRequiresMerchantPropertiesConsoleErrorMessage',\n paymentRequiresMerchantPropertiesErrorMessage = 'paymentRequiresMerchantPropertiesErrorMessage',\n paymentUsingUnauthorizedAccountErrorMessage = 'paymentUsingUnauthorizedAccountErrorMessage',\n refundAmountMoreThanAllowedErrorMessage = 'refundAmountMoreThanAllowedErrorMessage',\n unableToAuthorizePaymentCardAdditionalContextRequiredErrorMessage = 'unableToAuthorizePaymentCardAdditionalContextRequiredErrorMessage',\n unableToAuthorizePaymentCardTypeMissingOrNotSupportedErrorMessage = 'unableToAuthorizePaymentCardTypeMissingOrNotSupportedErrorMessage',\n unableToAuthorizePaymentErrorMessage = 'unableToAuthorizePaymentErrorMessage',\n unableToCancelPaymentErrorMessage = 'unableToCancelPaymentErrorMessage',\n unableToReadCardTokenInfoErrorMessage = 'unableToReadCardTokenInfoErrorMessage',\n unableToRetrieveCardPaymentAcceptResultErrorMessage = 'unableToRetrieveCardPaymentAcceptResultErrorMessage'\n}\n\nexport enum ErrorLocation {\n Checkout,\n CheckoutBillingAddress,\n CheckoutCustomerAccountPayment,\n CheckoutDeliveryOptions,\n CheckoutExpress,\n CheckoutGiftCard,\n CheckoutGuestProfile,\n CheckoutLoyalty,\n CheckoutPaymentInstrument,\n CheckoutPickup,\n CheckoutShippingAddress,\n CheckoutTermsAndConditions,\n Console,\n GiftCardBalanceCheck\n}\n\nexport enum CheckoutModule {\n CheckoutBillingAddress = 'checkout-billing-address',\n CheckoutCustomerAccountPayment = 'checkout-customer-account-payment',\n CheckoutDeliveryOptions = 'checkout-delivery-options',\n CheckoutExpress = 'checkout-express',\n CheckoutGiftCard = 'checkout-gift-card',\n CheckoutGuestProfile = 'checkout-guest-profile',\n CheckoutLoyalty = 'checkout-loyalty',\n CheckoutPaymentInstrument = 'checkout-payment-instrument',\n CheckoutPickup = 'checkout-pickup',\n CheckoutShippingAddress = 'checkout-shipping-address',\n CheckoutTermsAndConditions = 'checkout-terms-and-conditions',\n None = 'none'\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 { 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 'Dynamics.AX.Application.EcommerceQuantityLimitConfigurationsFeature'\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 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\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 { 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 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 { 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 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 { 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 {\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 { 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 { 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 {\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 { 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 {\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 return {};\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 {\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 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 { 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 { 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\n .filter(item => item.DimensionTypeValue !== dimension.DimensionTypeValue)\n .map(productDimension => {\n return {\n DimensionTypeValue: productDimension.DimensionTypeValue,\n DimensionValue: {\n RecordId: productDimension.DimensionValue?.RecordId!,\n Value: productDimension.DimensionValue?.DimensionId\n }\n };\n }),\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 {\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 {\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 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 { 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, input.catalogId);\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\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 { 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 { 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 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 { 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 { 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 { 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 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 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 const cardTenderTypeBlocked = 3;\n cards = cards?.filter(card => card.CardTenderTypeValue !== cardTenderTypeBlocked);\n\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 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 {\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 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;\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 CacheType,\n createObservableDataAction,\n getCatalogId,\n getAdditionalMediaLocationsForProductAction,\n IAction,\n IActionContext,\n IActionInput,\n IAny,\n ICreateActionContext,\n IGeneric\n} from '@msdyn365-commerce/core';\nimport { AdditionalMediaLocationsInput } from '@msdyn365-commerce/action-internal';\nimport { AsyncResult, MediaLocation, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\n\nimport getSelectedVariant, { SelectedVariantInput } from './get-selected-variant';\nimport { getSelectedProductIdFromActionInput } from './utilities';\n\n/**\n * The action input class for the getAdditionalMediaLocationsForSelectedVariant data action.\n */\nexport class AdditionalMediaLocationsForSelectedVariantInput 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 = () => 'AdditionalMediaLocationsForSelectedVariant';\n\n public getCacheObjectType = () => 'MediaLocations';\n\n public dataCacheType = (): CacheType => 'none';\n}\n\n/**\n * The createInput method for the getAdditionalMediaLocationsForSelectedVariant data action.\n * @param inputData The input data passed to the createInput method.\n */\nexport const createMediaLocationsForSelectedVariantInput = (\n inputData: ICreateActionContext>\n): AdditionalMediaLocationsForSelectedVariantInput => {\n const productId = getSelectedProductIdFromActionInput(inputData);\n const catalogId = getCatalogId(inputData.requestContext);\n\n if (productId) {\n return new AdditionalMediaLocationsForSelectedVariantInput(\n +productId,\n +inputData.requestContext.apiSettings.channelId,\n undefined,\n catalogId\n );\n }\n throw new Error('Unable to create AdditionalMediaLocationsForSelectedVariantInput, no productId found on module config or query');\n};\n\n/**\n * The action method for the getAdditionalMediaLocationsForSelectedVariant data action.\n * @param input\n * @param ctx\n */\nexport async function getAdditionalMediaLocationsForSelectedVariantAction(\n input: AdditionalMediaLocationsForSelectedVariantInput,\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;\n\n if (activeProduct) {\n if (ctx.requestContext.app?.config?.OmniChannelMedia) {\n const mediaLocationsInput = new AdditionalMediaLocationsInput(\n ctx.requestContext,\n activeProduct.RecordId,\n input.channelId,\n input.catalogId\n );\n return getAdditionalMediaLocationsForProductAction(mediaLocationsInput, ctx);\n }\n }\n\n return [];\n })\n .catch(error => {\n ctx.trace(error);\n ctx.telemetry.error(error.message);\n ctx.telemetry.debug('[getAdditionalMediaLocationsForSelectedVariantAction]Error executing action');\n throw new Error('[getAdditionalMediaLocationsForSelectedVariantAction]Error executing action');\n });\n}\n\n/**\n * The getAdditionalMediaLocationsForSelectedVariant 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 getAdditionalMediaLocationsForSelectedVariantActionDataAction = createObservableDataAction({\n id: '@msdyn365-commerce-modules/retail-actions/get-additional-media-locations-for-selected-variant',\n action: >getAdditionalMediaLocationsForSelectedVariantAction,\n input: createMediaLocationsForSelectedVariantInput\n});\n\nexport default getAdditionalMediaLocationsForSelectedVariantActionDataAction;\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 { 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 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 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 {\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 {\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\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 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 {\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 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 {\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 {\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 { 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 { 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 { 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 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 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 {\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 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\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 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 { 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 {\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 {\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 { 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 getCatalogId,\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';\nimport { validateCatalogId } from '../utilities';\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 public readonly isMultipleCatalogFeatureEnabledInHq?: boolean;\n public readonly catalogId?: number | undefined;\n\n constructor(\n orderTemplateId: string,\n productId: number,\n quantity: number,\n unitOfMeasure: string,\n isMultipleCatalogFeatureEnabledInHq?: boolean,\n catalogId?: number\n ) {\n this.orderTemplateId = orderTemplateId;\n this.productId = productId;\n this.quantity = quantity;\n this.unitOfMeasure = unitOfMeasure || 'ea';\n this.isMultipleCatalogFeatureEnabledInHq = isMultipleCatalogFeatureEnabledInHq;\n this.catalogId = catalogId;\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 isMultipleCatalogFeatureEnabledInHq?: boolean,\n catalogId?: number | undefined\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(\n orderTemplateId,\n productId,\n quantity,\n unitOfMeasure,\n isMultipleCatalogFeatureEnabledInHq || false,\n catalogId\n );\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 // Adding catalog from context if not passed from component\n const catalogId = input.catalogId ?? getCatalogId(ctx.requestContext);\n validateCatalogId(catalogId);\n const productListLineToAdd: ProductListLine = {\n ProductListId: input.orderTemplateId,\n ProductId: input.productId,\n Quantity: input.quantity,\n UnitOfMeasure: input.unitOfMeasure,\n ...(input.isMultipleCatalogFeatureEnabledInHq && { catalogId: catalogId })\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 { 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 public error?: string;\n\n public shouldDisable?: boolean;\n\n constructor(productListLine: ProductListLine, fullProduct?: FullProduct, error?: string, shouldDisable?: boolean) {\n this.productListLine = productListLine;\n this.fullProduct = fullProduct;\n this.error = error;\n this.shouldDisable = shouldDisable;\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 { 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, ProductsDataActions } from '@msdyn365-commerce/retail-proxy';\nimport { getProductListLinesAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/ProductListsDataActions.g';\n\nimport {\n createInventoryAvailabilitySearchCriteria,\n FullProductInput,\n getFullProducts,\n ProductDetailsCriteria,\n QueryResultSettingsProxy\n} from '..';\nimport { ArrayExtensions } from '../utilities';\nimport { IOrderTemplateLinesState, OrderTemplateLine } from '../utilities/order-templates';\nimport { mapAggregatedProductInventoryInformation } from '../utilities/product-inventory-utils';\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 listLine.CatalogId\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 for (const line of orderTemplateLinesState.lines) {\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\n const unassortedProduct: FullProduct = {\n ProductDetails: {\n RecordId: line.productListLine.ProductId || 0,\n DefaultUnitOfMeasure: line.productListLine.UnitOfMeasure?.toString() ?? '',\n ProductTypeValue: 0,\n BasePrice: 0,\n Price: 0,\n AdjustedPrice: 0\n },\n ProductPrice: {},\n ProductRating: {}\n };\n line.fullProduct = unassortedProduct;\n\n line.error = 'UNASSORTED';\n line.shouldDisable = true;\n\n continue;\n }\n line.fullProduct = fullProduct;\n\n if (context.requestContext.app) {\n const searchCriteria = createInventoryAvailabilitySearchCriteria(\n context,\n [line.fullProduct.ProductDetails.RecordId],\n true\n );\n\n try {\n const shippingProductAvailabilities = await ProductsDataActions.getEstimatedAvailabilityAsync(\n { callerContext: context },\n searchCriteria\n );\n\n if (\n shippingProductAvailabilities &&\n shippingProductAvailabilities.ProductWarehouseInventoryAvailabilities &&\n shippingProductAvailabilities.ProductWarehouseInventoryAvailabilities.length > 0\n ) {\n const productAvailabilities = mapAggregatedProductInventoryInformation(\n context,\n shippingProductAvailabilities\n );\n line.error =\n context.requestContext.app.config.enableStockCheck === false ||\n (productAvailabilities?.length > 0 && productAvailabilities[0].IsProductAvailable)\n ? 'NONE'\n : 'OOS';\n line.shouldDisable = line.error === 'OOS';\n }\n } catch (error) {\n if (error instanceof Error) {\n const errorMessage = error.message;\n context.trace(errorMessage);\n context.telemetry.error(errorMessage);\n } else {\n context.trace(String(error));\n context.telemetry.error('An unknown error occurred.');\n }\n context.telemetry.error('[getPaginatedOrderTemplateLinesAction] Unable to retrieve product availability.');\n }\n }\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';\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 public readonly isMultipleCatalogFeatureEnabledInHq?: boolean;\n constructor(orderTemplateId: string, isMultipleCatalogFeatureEnabledInHq?: boolean) {\n this.orderTemplateId = orderTemplateId;\n this.isMultipleCatalogFeatureEnabledInHq = isMultipleCatalogFeatureEnabledInHq;\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 ...(input.isMultipleCatalogFeatureEnabledInHq && { catalogId: productLine.productListLine.CatalogId })\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 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 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 { 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 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 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 {\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';\nimport { validateCatalogId } from '../utilities';\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 public readonly isMultipleCatalogFeatureEnabledInHq?: boolean;\n\n public readonly catalogId?: number | undefined;\n constructor(\n orderTemplateId: string,\n productId: number,\n quantity: number,\n unitOfMeasure: string,\n isMultipleCatalogFeatureEnabledInHq?: boolean,\n catalogId?: number\n ) {\n this.orderTemplateId = orderTemplateId;\n this.productId = productId;\n this.quantity = quantity;\n this.unitOfMeasure = unitOfMeasure || 'ea';\n this.isMultipleCatalogFeatureEnabledInHq = isMultipleCatalogFeatureEnabledInHq;\n this.catalogId = catalogId;\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 isMultipleCatalogFeatureEnabledInHq?: boolean,\n catalogId?: number | undefined\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(\n orderTemplateId,\n productId,\n quantity,\n unitOfMeasure,\n isMultipleCatalogFeatureEnabledInHq || false,\n catalogId\n );\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 const catalogId = input.catalogId;\n validateCatalogId(catalogId);\n const lineToUpdate = linesToUpdate[0].productListLine;\n\n lineToUpdate.UnitOfMeasure = input.unitOfMeasure;\n lineToUpdate.Quantity = input.quantity;\n if (input.isMultipleCatalogFeatureEnabledInHq) {\n lineToUpdate.CatalogId = catalogId;\n }\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 {\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 { 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 { 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 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 {\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 { 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","/*!\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 IMarketSettings\n} from '@msdyn365-commerce/core';\nimport {\n OrgUnitsDataActions,\n OrgUnit,\n SearchStoreCriteria,\n IQueryResultSettings,\n ChannelDeliveryOption\n} from '@msdyn365-commerce/retail-proxy';\n\nimport { IDistributorInfo, QueryResultSettingsProxy } from './utilities';\n/**\n * Get distributor variant action input class.\n */\nexport class GetDistributorListInput implements IActionInput {\n public ChannelId?: number;\n\n public StoreNumber?: string;\n\n public InventoryLocationId?: string;\n\n public queryResultSettings: IQueryResultSettings | undefined;\n\n constructor(queryResultSettings?: IQueryResultSettings, _ChannelId?: number, _StoreNumber?: string, _InventoryLocationId?: string) {\n this.ChannelId = _ChannelId;\n this.StoreNumber = _StoreNumber;\n this.InventoryLocationId = _InventoryLocationId;\n this.queryResultSettings = queryResultSettings;\n }\n\n /**\n * Get Cache Key.\n * @returns - Cache key string.\n */\n public getCacheKey = (): string => 'GetDistributorListCache';\n\n /**\n * Get Cache type Name.\n * @returns - Cache name string.\n */\n public getCacheObjectType = (): string => 'GetDistributorListInput';\n\n /**\n * Get Cache type.\n * @returns - CacheType enum.\n */\n public dataCacheType = (): CacheType => 'none';\n}\n\n/**\n * CreateInput method for the getDistributor data action.\n * @param inputData - Action context info.\n * @returns GetDistributorInput - The action input.\n */\nexport const createGetDistributorListInput = (inputData: ICreateActionContext): GetDistributorListInput => {\n if (\n (inputData.requestContext && inputData.requestContext.user && inputData.requestContext.user.isAuthenticated) ||\n inputData.requestContext.params.isEditor\n ) {\n const queryResultSettings = QueryResultSettingsProxy.fromInputData(inputData).QueryResultSettings;\n return new GetDistributorListInput(queryResultSettings);\n }\n\n throw new Error('Unable to create get distributor list. User is not authenticated.');\n};\n\n/**\n * Action method for the getDistributor data action.\n * @param input - The action input class.\n * @param ctx - The action context.\n * @returns OrgUnit - The full org unit availability.\n */\nexport async function getDistributorListAction(input: GetDistributorListInput, ctx: IActionContext): Promise {\n const searchStoreCriteria: SearchStoreCriteria = {\n // Online\n ChannelTypeValue: 3,\n // B2B\n OnlineStoreCustomerTypeValue: 1,\n ChannelId: input.ChannelId,\n StoreNumber: input.StoreNumber,\n InventoryLocationId: input.InventoryLocationId\n };\n\n const marketSettings = ctx.requestContext.markets;\n\n return OrgUnitsDataActions.searchAsync(\n {\n callerContext: ctx,\n bypassCache: 'get'\n },\n searchStoreCriteria\n )\n .then(async (channels: OrgUnit[]) => {\n const filteredChannels = filterChannelsBasedUponMarketSettings(channels, marketSettings);\n const channelIdList: number[] = [];\n filteredChannels?.forEach(channel => {\n if (channel !== undefined) {\n channelIdList.push(channel.RecordId);\n }\n });\n const locationDeliveryOptions = await _getLocationPickUpDeliveryModes(channelIdList, ctx);\n\n const channelPromiseList = filteredChannels.map(async channel => {\n const channelMarketSettings = getMarketSettingsForChannel(marketSettings, channel.RecordId);\n const channelDeliveryOption = locationDeliveryOptions?.find(\n channelDeliveryOptions => channelDeliveryOptions.ChannelId === channel.RecordId\n );\n return _getDistributorInfo(channel, channelDeliveryOption, channelMarketSettings);\n });\n return Promise.all(channelPromiseList);\n })\n .catch((error: Error) => {\n ctx.trace('[GetDistributor] error getting distributors from searchAsync');\n ctx.trace(error.message);\n ctx.telemetry.error(error.message);\n ctx.telemetry.debug('[GetDistributor] error getting distributors from searchAsync');\n return [];\n });\n}\n\n/**\n * Action method that obtains the store information.\n * @param orgUnit The org unit location.\n * @param storeMap A map that contains store information group by the inventory location id.\n * @param channelDeliveryOptions\n * @param ctx The action context.\n */\nasync function _getDistributorInfo(\n orgUnit: OrgUnit,\n channelDeliveryOptions: ChannelDeliveryOption | undefined,\n marketSettings?: IMarketSettings\n): Promise {\n if (!orgUnit || !orgUnit.OrgUnitNumber) {\n return { OrgUnit: undefined, OrgUnitDeliveryOptions: undefined, MarketSettings: undefined };\n }\n\n return {\n OrgUnit: orgUnit,\n OrgUnitDeliveryOptions: channelDeliveryOptions,\n MarketSettings: marketSettings\n };\n}\n\nfunction filterChannelsBasedUponMarketSettings(channels: OrgUnit[], marketSettings: IMarketSettings[] | undefined) {\n const intersection = channels.filter(channel =>\n marketSettings?.some(market => market.channelItem?.retailServerChannelId === channel.RecordId)\n );\n return intersection;\n}\n\nfunction getMarketSettingsForChannel(marketSettings: IMarketSettings[] | undefined, channelId: number): IMarketSettings | undefined {\n return marketSettings?.find(market => market?.channelItem?.retailServerChannelId === channelId);\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 OrgUnitsDataActions.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('[getDistributorList][_getLocationPickUpDeliveryModes] error getting availability with channel delivery options');\n ctx.trace(error.message);\n ctx.telemetry.exception(error);\n ctx.telemetry.debug(\n '[getDistributorList] [_getLocationPickUpDeliveryModes] error getting availability with channel delivery options'\n );\n return [];\n });\n}\n\n/**\n * The complete getDistributor data action.\n */\nexport const getDistributorDataAction = createObservableDataAction({\n id: '@msdyn365-commerce-modules/retail-actions/get-distributor',\n action: >getDistributorListAction,\n input: createGetDistributorListInput\n});\n\nexport default getDistributorDataAction;\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 { 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 classNames from 'classnames';\nimport { Data } from 'popper.js';\nimport * as React from 'react';\nimport { Arrow, Popper as ReactPopper } from 'react-popper';\n\nimport { getTargetElement, mapToCssModules } from '../common/utilities';\nimport { IPopperContentProps } from './PopperContent.props';\n\nexport interface IPopperContentState {\n placement?: string;\n isOpen: boolean;\n}\n\n/**\n * Renders popper content. This is an internal helper class shared between components.\n */\nexport default class PopperContent extends React.Component {\n public static defaultProps: Partial = {\n boundariesElement: 'scrollParent',\n placement: 'auto',\n hideArrow: false,\n isOpen: false,\n offset: 0,\n fallbackPlacement: 'flip',\n flip: true,\n container: 'body',\n modifiers: {}\n };\n\n constructor(props: IPopperContentProps) {\n super(props);\n\n this._handlePlacementChange = this._handlePlacementChange.bind(this);\n this.state = { isOpen: props.isOpen };\n }\n\n public componentDidMount(): void {\n this._handleProps();\n }\n\n public componentDidUpdate(prevProps: IPopperContentProps): void {\n if (this.props.isOpen !== prevProps.isOpen) {\n this._handleProps();\n }\n }\n\n public shouldComponentUpdate(nextProps: IPopperContentProps, nextState: IPopperContentState): boolean {\n if (this.state === nextState && this.props === nextProps) {\n return false;\n }\n return true;\n }\n\n public render(): JSX.Element | null {\n return this.props.isOpen ? this._renderChildren() : null;\n }\n\n private _handlePlacementChange(data: Data): Data {\n if (this.state.placement !== data.placement) {\n this.setState({ placement: data.placement });\n }\n\n return data;\n }\n\n private _handleProps(): void {\n if (this.props.container !== 'inline') {\n if (this.props.isOpen) {\n this._show();\n } else {\n this._hide();\n }\n }\n }\n\n private _hide(): void {\n this.setState({ isOpen: false });\n }\n\n private _show(): void {\n this.setState({ isOpen: true });\n }\n\n private _renderChildren(): JSX.Element | null {\n const {\n cssModule,\n children,\n isOpen,\n flip,\n offset,\n target,\n fallbackPlacement,\n focusOut,\n placementPrefix,\n arrowClassName: arrowClassNameOrUndefined,\n hideArrow,\n className,\n tag,\n modifiers,\n boundariesElement,\n ...attrs\n } = this.props;\n\n const arrowClassName = mapToCssModules(classNames('msc-arrow', arrowClassNameOrUndefined), cssModule);\n\n const placement = (this.state.placement || attrs.placement || 'auto').split('-')[0];\n const popperClassName = mapToCssModules(\n classNames(className, placementPrefix ? `${placementPrefix}-${placement}` : placement),\n this.props.cssModule\n );\n\n const extendedModifiers = {\n offset: { offset },\n flip: { enabled: flip, behavior: fallbackPlacement },\n preventOverflow: { boundariesElement },\n update: {\n enabled: true,\n order: 950,\n fn: this._handlePlacementChange\n },\n ...modifiers\n };\n\n const targetElement = getTargetElement(target);\n if (targetElement === null) {\n return null;\n }\n\n return (\n \n {children}\n {!hideArrow && }\n \n );\n }\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport classNames from 'classnames';\nimport * as React from 'react';\n\nimport { getTargetElement, mapToCssModules } from '../common/utilities';\nimport PopperContent from '../popper-content/PopperContent';\nimport { ITooltipProps } from './Tooltip.props';\n\nconst DEFAULT_DELAYS = {\n show: 0,\n hide: 250\n};\n\n/**\n * Tooltip component.\n */\nexport default class Tooltip extends React.PureComponent {\n public static defaultProps: Partial = {\n isOpen: false,\n shouldShowMiniCart: false,\n shouldShowCloseButton: false,\n hideArrow: false,\n hideAriaHidden: false,\n placement: 'top',\n placementPrefix: 'msc-bs-tooltip',\n delay: DEFAULT_DELAYS,\n toggle: () => {\n return;\n }\n };\n\n public ref: React.RefObject;\n\n public hideTimeout?: number;\n\n public showTimeout?: number;\n\n public target: HTMLElement | null;\n\n public isMobile: boolean;\n\n public tabPressed: boolean;\n\n constructor(props: ITooltipProps) {\n super(props);\n\n this.ref = React.createRef();\n this.addTargetEvents = this.addTargetEvents.bind(this);\n this.handleDocumentClick = this.handleDocumentClick.bind(this);\n this.removeTargetEvents = this.removeTargetEvents.bind(this);\n this.toggle = this.toggle.bind(this);\n this.onMouseOverTooltip = this.onMouseOverTooltip.bind(this);\n this.onMouseLeaveTooltip = this.onMouseLeaveTooltip.bind(this);\n this.onMouseOverTooltipContent = this.onMouseOverTooltipContent.bind(this);\n this.onMouseLeaveTooltipContent = this.onMouseLeaveTooltipContent.bind(this);\n this.show = this.show.bind(this);\n this.hide = this.hide.bind(this);\n this.onFocusOutTarget = this.onFocusOutTarget.bind(this);\n this.onEscKeyDown = this.onEscKeyDown.bind(this);\n this.onEscKeyDownNative = this.onEscKeyDownNative.bind(this);\n this.target = null;\n this.isMobile = false;\n this.tabPressed = false;\n }\n\n public componentDidMount(): void {\n this.target = getTargetElement(this.props.target);\n this.addTargetEvents();\n\n // Remove the attr from parent obj when tooltip is hidden\n\n const body = document.getElementsByTagName('body').item(0);\n if (body) {\n const bodyClasses = body.getAttribute('class');\n if (bodyClasses && bodyClasses.includes('mobile')) {\n this.isMobile = true;\n }\n }\n\n if (this.target !== null && this.target.attributes.getNamedItem('aria-describedby') !== null) {\n this.target.attributes.removeNamedItem('aria-describedby');\n }\n }\n\n public componentWillUnmount(): void {\n this.clearHideTimeout();\n this.clearShowTimeout();\n this.removeTargetEvents();\n }\n\n public onMouseOverTooltip(e: MouseEvent): void {\n if (this.hideTimeout) {\n this.clearHideTimeout();\n }\n this.showTimeout = window.setTimeout(this.show.bind(this, e), this.getDelay('show'));\n }\n\n public onMouseLeaveTooltip(e: MouseEvent): void {\n if (this.showTimeout) {\n this.clearShowTimeout();\n }\n this.hideTimeout = window.setTimeout(this.hide.bind(this, e), this.getDelay('hide'));\n }\n\n public onMouseOverTooltipContent(): void {\n if (this.hideTimeout) {\n this.clearHideTimeout();\n }\n }\n\n public onMouseLeaveTooltipContent(e: React.MouseEvent): void {\n if (this.showTimeout) {\n this.clearShowTimeout();\n }\n this.hideTimeout = window.setTimeout(this.hide.bind(this, e.nativeEvent), this.getDelay('hide'));\n }\n\n public onFocusOutTarget(e: Event): void {\n if (!this.props.isOpen) {\n return;\n }\n\n if (this.tabPressed) {\n this.tabPressed = false;\n setTimeout(() => {\n const nextFocus = document.activeElement;\n\n if (!this.ref || !this.ref.current || !this.ref.current.contains(nextFocus)) {\n this.hide(e);\n }\n }, 1);\n } else {\n this.hide(e);\n }\n }\n\n public onEscKeyDown(e: React.KeyboardEvent): void {\n if (e.keyCode === 9) {\n this.tabPressed = true;\n } else if (e.key === 'Escape') {\n this.hide(e.nativeEvent);\n }\n }\n\n public onEscKeyDownNative(e: KeyboardEvent): void {\n if (e.keyCode === 9) {\n this.tabPressed = true;\n } else if (e.key === 'Escape') {\n this.hide(e);\n }\n }\n\n public getDelay(key: 'show' | 'hide'): number {\n const { delay } = this.props;\n if (typeof delay === 'object') {\n return isNaN(delay[key]) ? DEFAULT_DELAYS[key] : delay[key];\n }\n\n return delay || 0;\n }\n\n public show(e: Event): void {\n if (!this.props.isOpen) {\n this.clearShowTimeout();\n this.toggle(e);\n\n // Create a new attr for parent obj when tooltip shown\n if (this.target !== null) {\n const ariaAttr = document.createAttribute('aria-describedby');\n ariaAttr.value = this.props.id as string;\n this.target.attributes.setNamedItem(ariaAttr);\n }\n }\n }\n\n public hide(e: Event): void {\n if (this.props.isOpen) {\n this.clearHideTimeout();\n this.toggle(e);\n\n // Remove the attr from parent obj when tooltip is hidden\n if (this.target !== null && this.target.attributes.getNamedItem('aria-describedby') !== null) {\n this.target.attributes.removeNamedItem('aria-describedby');\n }\n }\n }\n\n public clearShowTimeout(): void {\n clearTimeout(this.showTimeout);\n this.showTimeout = undefined;\n }\n\n public clearHideTimeout(): void {\n clearTimeout(this.hideTimeout);\n this.hideTimeout = undefined;\n }\n\n public handleDocumentClick(e: Event): void {\n if (!this.target) {\n return;\n }\n\n const target = e.target as HTMLElement;\n if (e.target === this.target || this.target.contains(target)) {\n if (this.hideTimeout) {\n this.clearHideTimeout();\n }\n\n if (!this.props.isOpen) {\n this.toggle(e);\n }\n } else if (this.props.isOpen && target.getAttribute('role') !== 'tooltip') {\n if (this.showTimeout) {\n this.clearShowTimeout();\n }\n this.hideTimeout = window.setTimeout(this.hide.bind(this, e), this.getDelay('hide'));\n }\n }\n\n public addTargetEvents(): void {\n if (!this.target) {\n return;\n }\n\n if (this.props.trigger) {\n const triggers = this.props.trigger.split(' ');\n if (!triggers.includes('manual')) {\n if (triggers.includes('click')) {\n ['click', 'touchstart'].forEach((event: string) => {\n document.addEventListener(event, this.handleDocumentClick, true);\n });\n }\n if (triggers.includes('hover')) {\n this.target.addEventListener('mouseover', this.onMouseOverTooltip, true);\n this.target.addEventListener('mouseout', this.onMouseLeaveTooltip, true);\n }\n if (triggers.includes('focus')) {\n this.target.addEventListener('focusin', this.show, true);\n if (this.props.displayMode === 'FLYOUT') {\n this.target.addEventListener('focusout', this.onFocusOutTarget, true);\n } else {\n this.target.addEventListener('focusout', this.hide, true);\n }\n }\n this.target.addEventListener('keydown', this.onEscKeyDownNative, true);\n }\n } else {\n this.target.addEventListener('mouseover', this.onMouseOverTooltip, true);\n this.target.addEventListener('mouseout', this.onMouseLeaveTooltip, true);\n this.target.addEventListener('keydown', this.onEscKeyDownNative, true);\n this.target.addEventListener('focusin', this.show, true);\n if (this.props.displayMode === 'FLYOUT') {\n this.target.addEventListener('focusout', this.onFocusOutTarget, true);\n } else {\n this.target.addEventListener('focusout', this.hide, true);\n }\n\n ['click', 'touchstart'].forEach((event: string) => {\n document.addEventListener(event, this.handleDocumentClick, true);\n });\n }\n }\n\n public removeTargetEvents(): void {\n if (!this.target) {\n return;\n }\n\n this.target.removeEventListener('mouseover', this.onMouseOverTooltip, true);\n this.target.removeEventListener('mouseout', this.onMouseLeaveTooltip, true);\n this.target.removeEventListener('keydown', this.onEscKeyDownNative, true);\n this.target.removeEventListener('focusin', this.show, true);\n this.target.removeEventListener('focusout', this.onFocusOutTarget, true);\n this.target.removeEventListener('focusout', this.hide, true);\n\n ['click', 'touchstart'].forEach((event: string) => {\n document.removeEventListener(event, this.handleDocumentClick, true);\n });\n }\n\n public toggle(e?: Event): void {\n if (e && this.props.disabled) {\n e.preventDefault();\n }\n\n if (this.props.toggle) {\n this.props.toggle();\n }\n }\n\n public render(): JSX.Element | null {\n if (!this.props.isOpen || this.isMobile) {\n return null;\n }\n\n const {\n cssModule,\n isOpen,\n target,\n placementPrefix,\n hideArrow,\n hideAriaHidden,\n className,\n innerClassName,\n innerRef,\n modifiers,\n toggle,\n delay,\n placement,\n disabled,\n trigger,\n boundariesElement,\n offset,\n arrowClassName,\n displayMode,\n id,\n ...attributes\n } = this.props;\n\n const classes = mapToCssModules(\n classNames(displayMode === 'FLYOUT' ? 'msc-flyout-inner' : 'msc-tooltip-inner', this.props.innerClassName),\n this.props.cssModule\n );\n\n const popperClasses = mapToCssModules(\n classNames(displayMode === 'FLYOUT' ? 'msc-flyout' : 'msc-tooltip', 'show', this.props.className),\n this.props.cssModule\n );\n\n return (\n
\n \n {this.props.toggle && this.props.shouldShowCloseButton ? (\n
\n );\n }\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { StringExtensions } from '@msdyn365-commerce-modules/retail-actions';\nimport * as React from 'react';\n\nimport Tooltip from './Tooltip';\nimport { IUncontrolledTooltipProps } from './Tooltip.props';\n\nexport interface IUncontrolledTooltipState {\n isOpen: boolean;\n}\n\n/**\n * UncontrolledTooltip examples.\n */\nexport default class UncontrolledTooltip extends React.PureComponent {\n private _isAutoDisplayTriggered: boolean;\n\n constructor(props: IUncontrolledTooltipProps) {\n super(props);\n this.state = { isOpen: false };\n this._toggle = this._toggle.bind(this);\n this._isAutoDisplayTriggered = false;\n }\n\n public render(): JSX.Element {\n const isCartPage =\n !StringExtensions.isNullOrWhitespace(this.props.cartPageUrl) && window.location.toString().includes(this.props.cartPageUrl!);\n\n if (this.props.shouldShowMiniCart && !isCartPage) {\n if (!this._isAutoDisplayTriggered) {\n // First time trigger auto mini cart.\n this.setState({ isOpen: true });\n this._isAutoDisplayTriggered = true;\n } else if (!this.state.isOpen) {\n // If tooptip is closed, reset the flag.\n this._isAutoDisplayTriggered = false;\n }\n }\n\n return (\n {\n this.props._toggle ? this.props._toggle() : this._toggle();\n }}\n {...this.props}\n />\n );\n }\n\n private _toggle(): void {\n this.setState(previousState => ({ isOpen: !previousState.isOpen }));\n }\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport classNames from 'classnames';\nimport * as React from 'react';\n\nimport { mapToCssModules } from '../common/utilities';\nimport Fade from '../fade/Fade';\nimport UncontrolledTooltip from '../tooltip/UncontrolledTooltip';\nimport { IAlertProps } from './Alert.props';\n\n/**\n * Alert component.\n */\nexport default class Alert extends React.PureComponent {\n public static defaultProps: Partial = {\n color: 'success',\n isOpen: true,\n tag: 'div',\n closeAriaLabel: 'Close',\n fade: true,\n assertive: false,\n includeAlertClass: true,\n transition: {\n ...Fade.defaultProps,\n unmountOnExit: true\n }\n };\n\n public render(): JSX.Element {\n const {\n id,\n className,\n closeClassName,\n cssModule,\n tag,\n toggle,\n color,\n isOpen,\n children,\n transition,\n fade,\n assertive,\n includeAlertClass,\n 'aria-label': ariaLabel\n } = this.props;\n\n const classes = includeAlertClass\n ? mapToCssModules(classNames(className, 'msc-alert', `msc-alert-${color}`), cssModule)\n : className;\n\n const closeClasses = mapToCssModules(classNames('close', closeClassName), cssModule);\n\n const alertTransition = {\n ...Fade.defaultProps,\n ...transition,\n baseClass: fade ? 'fade' : '',\n timeout: fade ? (transition ? transition.timeout : 0) : 0,\n appear: !!fade,\n enter: !!fade,\n exit: !!fade\n };\n\n const Tag = tag || 'div';\n const buttonId = fade ? 'buttonDismiss' : 'buttonFadeless';\n\n const innerContent = (\n <>\n {toggle ? (\n
\n \n \n close\n \n
\n ) : null}\n {children}\n \n );\n\n const style = isOpen ? undefined : { display: 'none' };\n\n // When using assertive alerts, you need to have the assertive region rendered on the page from\n // the start. When using fade, the entire fade region doesn't render. So you gotta first wrap the\n // fade region in a tag, keep that tag hidden if the alert is closed.\n //\n // Note that this current approach will have some issues if tag is something like li. But that is a bridge\n // that can be crossed when/if we need to cross it this works for divs/spans so it should be good enough for now\n if (fade && assertive) {\n return (\n \n \n {innerContent}\n \n \n );\n } else if (fade) {\n return (\n \n {innerContent}\n \n );\n }\n return (\n \n {innerContent}\n \n );\n }\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport * as Msdyn365 from '@msdyn365-commerce/core';\nimport * as React from 'react';\n\nimport { getPayloadObject, getTelemetryAttributes, TelemetryConstant } from '..';\nimport { IBackToTopProps } from './BackToTop.props';\n\nexport interface IBackToTopStateAttributes {\n 'aria-hidden': boolean;\n tabIndex: number;\n}\n\nexport interface IBackToTopState extends React.ComponentState {\n attributes: IBackToTopStateAttributes;\n}\n\n/**\n * Back To Top - This component is used to scroll to the top of the page.\n */\nexport default class BackToTop extends React.PureComponent {\n public static defaultProps: Partial = {\n className: 'btn btn-lg btn-secondary',\n delayInMs: 0,\n scrollStepInPx: 25\n };\n\n private readonly attributes?: Msdyn365.IDictionary;\n\n constructor(props: IBackToTopProps) {\n super(props);\n this.state = { attributes: { 'aria-hidden': true, tabIndex: -1 } };\n this._reevaluatePosition = this._reevaluatePosition.bind(this);\n this._scrollToTop = this._scrollToTop.bind(this);\n const payLoad = getPayloadObject('click', props.telemetryContent!, TelemetryConstant.BackToTop);\n this.attributes = getTelemetryAttributes(props.telemetryContent!, payLoad);\n }\n\n public componentDidMount(): void {\n window.addEventListener('resize', this._reevaluatePosition);\n window.addEventListener('scroll', this._reevaluatePosition);\n this._reevaluatePosition();\n }\n\n public componentWillUnmount(): void {\n window.removeEventListener('resize', this._reevaluatePosition);\n window.removeEventListener('scroll', this._reevaluatePosition);\n }\n\n public render(): JSX.Element {\n const { className, threshold, delayInMs, scrollStepInPx, ...props } = this.props;\n const children = this.props.children || ;\n if (this.props.text) {\n return (\n \n {this._renderHeading(this.props.text)}\n \n );\n }\n return (\n \n {children}\n \n );\n }\n\n private readonly _renderHeading = (text: string): JSX.Element | undefined => {\n return ;\n };\n\n private _scrollStep(): void {\n if ((document.documentElement.scrollTop || document.body.scrollTop) === 0) {\n clearInterval(this.state.intervalId);\n this.setState({ intervalId: 0 });\n this._reevaluatePosition();\n }\n\n if (this.state.intervalId !== 0) {\n window.scrollTo(0, document.body.scrollTop - this.props.scrollStepInPx);\n document.body.scrollTop = document.body.scrollTop > 0 ? document.body.scrollTop - this.props.scrollStepInPx : 0;\n }\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private _scrollToTop(e: any): void {\n e.preventDefault();\n const intervalId = setInterval(this._scrollStep.bind(this), this.props.delayInMs);\n this.setState({ intervalId });\n }\n\n private _reevaluatePosition(): void {\n // TODO:\n // change the threshold minimum to zero\n // add a prop for specifying multiplier of page height instead of absolute threshold\n // add clientWidth check to hide at < 768\n const scrollTop = window.pageYOffset || document.body.scrollTop;\n const height = Math.min(window.innerHeight, document.documentElement.clientHeight);\n const threshold = Math.min(this.props.threshold !== undefined ? this.props.threshold : -1, 100);\n const hide =\n scrollTop > 0 && threshold >= 0\n ? scrollTop < ((document.documentElement.scrollHeight - height) * threshold) / 100\n : scrollTop < height * 2;\n const tabIndexValue = hide ? -1 : 0;\n this.setState({ attributes: { 'aria-hidden': hide, tabIndex: tabIndexValue } });\n }\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport classNames from 'classnames';\nimport * as React from 'react';\n\nimport { mapToCssModules } from '../common/utilities';\nimport { IButtonProps } from './Button.props';\n\n/**\n * Button component.\n */\nexport default class Button extends React.PureComponent {\n public static defaultProps: Partial = {\n tag: 'button',\n outline: false\n };\n\n public props: IButtonProps;\n\n constructor(props: IButtonProps) {\n super(props);\n this.props = props;\n this.onClick = this.onClick.bind(this); // Put this in componentDidMount\n }\n\n public render(): JSX.Element {\n const { active, block, className, cssModule, color, outline, size, tag, innerRef, ...attributes } = this.props;\n const classes = mapToCssModules(\n classNames(\n className,\n 'msc-btn',\n outline && color\n ? `btn-outline-${color}`\n : color && outline === false\n ? `btn-${color}`\n : color === undefined && outline === true\n ? 'btn-outline'\n : '',\n size ? `btn-${size}` : false,\n block ? 'btn-block' : false,\n { active, disabled: this.props.disabled }\n ),\n cssModule\n );\n\n let Tag = tag || 'button';\n\n if (attributes.href && Tag === 'button') {\n Tag = 'a';\n }\n\n return (\n \n );\n }\n\n private readonly onClick = (e: React.MouseEvent) => {\n if (this.props.disabled) {\n e.preventDefault();\n\n return;\n }\n\n if (this.props.onClick) {\n this.props.onClick(e);\n }\n };\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport classNames from 'classnames';\nimport * as React from 'react';\nimport Transition from 'react-transition-group/Transition';\n\nimport { mapToCssModules, TransitionStatuses, TransitionTimeouts } from '../common/utilities';\nimport { ICollapseProps } from './Collapse.props';\n\nexport interface ICollapseState {\n height: number | null;\n}\n\ntype IHash = {\n [key in TransitionStatuses]: string;\n};\n\n/**\n * This is the controlled version of a Collapse component, and as such the toggle behavior is expected to be handled in a parent component.\n * @see See [Uncontrolled Components - React](https://reactjs.org/docs/uncontrolled-components.html) to learn more.\n * @visibleName Collapse (controlled)\n */\nexport default class Collapse extends React.Component {\n public static defaultProps: Partial = {\n isOpen: false,\n tag: 'div',\n timeout: TransitionTimeouts.Collapse\n };\n\n public props: ICollapseProps;\n\n public state: ICollapseState;\n\n private readonly _transitionStatusToClassHash: IHash = {\n entering: 'collapsing',\n entered: 'collapse show',\n exiting: 'collapsing',\n exited: 'collapse'\n };\n\n private readonly _tagRef: React.RefObject = React.createRef();\n\n constructor(props: ICollapseProps) {\n super(props);\n this.props = props;\n\n this.state = {\n height: 0\n };\n\n this._onEntering = this._onEntering.bind(this);\n this._onExit = this._onExit.bind(this);\n this._onExited = this._onExited.bind(this);\n this._onExiting = this._onExiting.bind(this);\n this._reevaluateHeight = this._reevaluateHeight.bind(this);\n }\n\n public componentDidMount(): void {\n window && window.addEventListener('resize', this._reevaluateHeight);\n }\n\n public componentDidUpdate(nextProps: ICollapseProps): void {\n if (nextProps.children !== this.props.children) {\n this._reevaluateHeight();\n }\n }\n\n public componentWillUnmount(): void {\n window && window.removeEventListener('resize', this._reevaluateHeight);\n }\n\n public shouldComponentUpdate(nextProps: ICollapseProps, nextState: ICollapseState): boolean {\n if (this.state === nextState && this.props === nextProps) {\n return false;\n }\n return true;\n }\n\n public render(): JSX.Element | null {\n const {\n tag,\n isOpen,\n className,\n children,\n navbar,\n cssModule,\n\n in: collapseIn,\n mountOnEnter,\n unmountOnExit,\n appear,\n enter,\n exit,\n timeout,\n onEnter,\n onEntering,\n onEntered,\n onExit,\n onExiting,\n onExited,\n\n ...otherProps\n } = this.props;\n\n const Tag = tag || 'div';\n const transitionProps = {\n in: collapseIn,\n mountOnEnter,\n unmountOnExit,\n appear,\n enter,\n exit,\n onEnter,\n onEntering,\n onEntered,\n onExit,\n onExiting,\n onExited\n };\n\n const { height } = this.state;\n const style = height === null || height === 0 ? null : { minHeight: height };\n\n return (\n \n {(status: TransitionStatuses) => {\n const collapseClass = this._getTransitionClass(status);\n const classes = mapToCssModules(classNames(className, collapseClass, navbar && 'navbar-collapse'), cssModule);\n\n return (\n \n {children}\n \n );\n }}\n \n );\n }\n\n public reEvaluateHeight(): void {\n this._reevaluateHeight();\n }\n\n private _reevaluateHeight(): void {\n const node = this._tagRef.current;\n if (node !== null && node.firstElementChild && node.firstElementChild.scrollHeight > 0) {\n this.setState({ height: node.firstElementChild.scrollHeight });\n }\n }\n\n private _getTransitionClass(status: TransitionStatuses): string {\n return this._transitionStatusToClassHash[status] || 'collapse';\n }\n\n private _onEntering(node: HTMLElement, isAppearing: boolean): void {\n this.setState({ height: node.scrollHeight });\n\n if (this.props.onEntering) {\n this.props.onEntering(node, isAppearing);\n }\n }\n\n private _onExit(node: HTMLElement): void {\n this.setState({ height: node.scrollHeight });\n\n if (this.props.onExit) {\n this.props.onExit(node);\n }\n }\n\n private _onExiting(node: HTMLElement): void {\n this.setState({ height: 0 });\n\n if (this.props.onExiting) {\n this.props.onExiting(node);\n }\n }\n\n /**\n * Get Parent element.\n * @param node - HTML Element.\n */\n private readonly _updateParentElement = (node: HTMLElement): void => {\n const parentElement = node.parentElement;\n if (parentElement) {\n if (parentElement.classList.contains('collapse') && parentElement.classList.contains('show')) {\n parentElement.style.minHeight = 'auto';\n }\n this._updateParentElement(parentElement);\n }\n };\n\n private _onExited(node: HTMLElement): void {\n this.setState({ height: null });\n this._updateParentElement(node);\n\n if (this.props.onExited) {\n this.props.onExited(node);\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 { IDictionary, TelemetryEvent } from '@msdyn365-commerce/core';\nimport { ITelemetry } from '@msdyn365-commerce/telemetry-internal';\n\nexport interface IContentAction {\n pgname: string;\n mname: string;\n etext?: string;\n recid?: string;\n etype?: string;\n}\n\nexport interface IPayLoad {\n contentCategory: string;\n contentAction: IContentAction;\n}\n\nexport interface ITelemetryContent {\n pageName: string;\n moduleName: string;\n telemetry?: ITelemetry;\n}\n\nexport enum TelemetryConstant {\n ShopSimliarLooks = 'shop similar looks',\n ShopSimliarDescription = 'shop similar description',\n PickupInStore = 'pick up in store',\n PreferredStore = 'set as preferred store',\n RemovePreferredStore = 'remove preferred store',\n IncrementQuantity = 'Increment quantity',\n DecrementQuantity = 'Decrement quantity',\n Checkout = 'Checkout',\n GuestCheckout = 'Guest checkout',\n BackToShopping = 'Back to shopping',\n ApplyPromoCode = 'Apply promo code',\n ViewMore = 'View more',\n OrderDetails = 'Order details',\n AvailablePoints = 'Available points',\n ExpiringPoints = 'Expiring points',\n AddUser = 'Add user',\n BuyItAgain = 'Buy it again',\n ContactNumber = 'ContactNumber',\n CheckoutChange = 'Change',\n Save = 'Save',\n SaveContinue = 'Save and Continue',\n Cancel = 'Cancel',\n DeliveryOptions = 'Delivery options',\n CheckoutTermsAndConditions = 'Checkout terms and conditions',\n ExpandAll = 'Expand all',\n CollapseAll = 'Collapse all',\n Expand = 'Expand',\n Collapse = 'Collapse',\n SignIn = 'Sign in',\n SignUp = 'Sign up',\n SignOut = 'Sign out',\n SwitchCustomer = 'Switch Customer',\n LoyaltyDetailLink = 'Loyalty detail ink',\n LoyaltyTermsLink = 'Loyalty terms link',\n LoyaltyTermsCancel = 'Loyalty terms cancel',\n LoyaltyTermsSubmit = 'Loyalty terms submit',\n LoyaltyTermsAgree = 'Loyalty terms agree',\n RemoveCartItem = 'Remove cart item',\n EditCart = 'Edit cart',\n BackToTop = 'Back to top',\n Logo = 'Logo',\n NavIcon = 'Navigation icon',\n ViewBagAndCheckout = 'View bag and checkout',\n ContinueShopping = 'Continue shopping',\n AddOrderTemplateToCart = 'Add order template to cart',\n PromoBannerClose = 'Close promo banner',\n WriteReview = 'Write Review',\n Next = 'Next',\n Previous = 'Previous',\n SubmitReview = 'Submit review',\n SuccessButton = 'Success',\n SearchStore = 'Search store',\n ShowAllStore = 'Show all store',\n ToggleMapView = 'Toggle map view',\n PrivacyPolicy = 'Privacy policy',\n ViewShoppingBag = 'View shopping bag',\n MyProfile = 'My profile',\n seeDetails = 'See Details',\n CurrentDistributor = 'Set as current distributor',\n ViewMode = 'View mode',\n ApplyRefiner = 'Apply Refiner',\n Search = 'Search'\n}\n\n/**\n * Returns the payload Object.\n * @param {string} contentCategory - Content Category.\n * @param {IModule} props - Module props.\n * @param pageName\n * @param {string} moduleName - Module Name.\n * @param {string} etext - Etext Name.\n * @param {string} recid - Recid Name.\n * @param telemetry\n */\nexport function getTelemetryObject(pageName: string, moduleName: string, telemetry: ITelemetry): ITelemetryContent {\n const telemetryContent: ITelemetryContent = { pageName, moduleName, telemetry };\n return telemetryContent;\n}\n\n/**\n * Returns the payload Object.\n * @param {string} contentCategory - Content Category.\n * @param {IModule} props - Module props.\n * @param {string} moduleName - Module Name.\n * @param eventType\n * @param telemetryContent\n * @param {string} etext - Etext Name.\n * @param {string} recid - Recid Name.\n */\nexport function getPayloadObject(eventType: string, telemetryContent: ITelemetryContent, etext: string, recid?: string): IPayLoad {\n const pageName = telemetryContent && telemetryContent.pageName ? telemetryContent.pageName : '';\n const moduleName = telemetryContent && telemetryContent.moduleName ? telemetryContent.moduleName : '';\n const payload: IPayLoad = {\n contentCategory: eventType,\n contentAction: {\n pgname: pageName,\n mname: moduleName,\n etext,\n recid,\n etype: eventType\n }\n };\n return payload;\n}\n\n/**\n * Returns the telemetry Attributes.\n * @param {IModule} props - Module Props.\n * @param telemetryContent\n * @param {IPayLoad} payLoad - Pay Load.\n */\nexport function getTelemetryAttributes(telemetryContent: ITelemetryContent, payLoad: IPayLoad): IDictionary | undefined {\n const contentData = payLoad.contentAction.recid ? payLoad.contentAction.recid : payLoad.contentAction.etext;\n const attributes: IDictionary | undefined =\n telemetryContent &&\n telemetryContent.telemetry &&\n telemetryContent.telemetry.setTelemetryAttribute &&\n telemetryContent.telemetry.setTelemetryAttribute(contentData!, payLoad.contentAction);\n return attributes;\n}\n\n/**\n * Returns the telemetry Attributes.\n * @param {IModule} props - Module Props.\n * @param {IPayLoad} payLoad - Pay Load.\n */\n\nexport const onTelemetryClick = (telemetryContent: ITelemetryContent, payLoad: IPayLoad, linkText: string) => () => {\n payLoad.contentAction.etext = linkText;\n if (telemetryContent && telemetryContent.telemetry) {\n telemetryContent.telemetry.logEvent(TelemetryEvent.Custom, payLoad);\n }\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport * as Msdyn365 from '@msdyn365-commerce/core';\nimport classnames from 'classnames';\nimport * as React from 'react';\n\nimport { Button, getPayloadObject, getTelemetryAttributes, IPayLoad, TelemetryConstant } from '..';\nimport Collapse from '../collapse/Collapse';\nimport { ICollapseProps } from '../collapse/Collapse.props';\nimport { IDrawerProps } from './Drawer.props';\n\nexport interface IControlledDrawerState {\n isOpen: boolean;\n}\n\nexport type GlyphPlacement = 'start' | 'end';\n\n/**\n * ControlledDrawer - This is a full width controlled collapse where the button glyph changes\n * when the drawer is open and closed. The toggle function can be managed by the parent.\n */\n\nexport default class ControlledDrawer extends React.PureComponent {\n private readonly drawerOpenGlyph: string;\n\n private readonly drawerCloseGlyph: string;\n\n private readonly drawerGlyphClass: string;\n\n private isManuallyToggled: boolean;\n\n private isExpanded: boolean;\n\n private readonly payLoad: IPayLoad;\n\n constructor(props: IDrawerProps) {\n super(props);\n const { openGlyph, closeGlyph } = this.props;\n this._toggle = this._toggle.bind(this);\n this.isManuallyToggled = false;\n this.state = { isOpen: (props.collapseProps && props.collapseProps.isOpen) || false };\n this.isExpanded = this.state.isOpen;\n this.drawerGlyphClass = classnames('drawer__glyph', this.props.toggleGlyphClassName || '');\n this.payLoad = getPayloadObject('click', props.telemetryContent!, '');\n\n if (this.props.animateGlyph) {\n this.drawerOpenGlyph = classnames([this.drawerGlyphClass, openGlyph || closeGlyph || '']);\n this.drawerCloseGlyph = this.drawerOpenGlyph;\n } else {\n this.drawerOpenGlyph = classnames([this.drawerGlyphClass, openGlyph || '']);\n this.drawerCloseGlyph = classnames([this.drawerGlyphClass, closeGlyph || '']);\n }\n }\n\n public render(): JSX.Element {\n const collapseProps = { ...this.props.collapseProps } as ICollapseProps;\n collapseProps.isOpen = this.isManuallyToggled ? this.state.isOpen : collapseProps.isOpen || false;\n collapseProps.children = this.props.children;\n const drawerClass = classnames('drawer', this.props.className || '');\n this.isManuallyToggled = false;\n this.isExpanded = collapseProps.isOpen;\n this.setState({ isOpen: collapseProps.isOpen });\n this.payLoad.contentAction.etext = collapseProps.isOpen ? TelemetryConstant.Collapse : TelemetryConstant.Expand;\n const attributes = getTelemetryAttributes(this.props.telemetryContent!, this.payLoad);\n return (\n
\n \n {this._generateDrawerButtonInnerMarkup(collapseProps.isOpen)}\n \n \n
\n );\n }\n\n private _generateDrawerButtonInnerMarkup(collapseState: boolean): JSX.Element {\n const { toggleButtonText } = this.props;\n const drawerButtonTextClass = classnames('drawer__buttontext', this.props.toggleButtonClassName || '');\n if (this.props.glyphPlacement === 'end') {\n return (\n <>\n {this._generateTitle(classnames(drawerButtonTextClass, '__start'), toggleButtonText.toString())}\n {this._generateGlyphMarkup('drawer__glyph__end', collapseState)}\n \n );\n }\n\n const isStart = this.props.glyphPlacement === 'start';\n const additionalClassName = `__${isStart ? 'end' : 'start'}`;\n return (\n <>\n {isStart && this._generateGlyphMarkup('drawer__glyph__start', collapseState)}\n {this._generateTitle(classnames(drawerButtonTextClass, additionalClassName), this.props.toggleButtonText.toString())}\n \n );\n }\n\n private _generateTitle(titleLClassName: string, title: string): JSX.Element {\n if (this.props.onTextChange && this.props.requestContext) {\n return (\n \n );\n }\n return {title};\n }\n\n private _generateGlyphMarkup(location: string, collapseState: boolean): JSX.Element {\n const glyphClass = `${collapseState ? this.drawerOpenGlyph : this.drawerCloseGlyph} ${location}`;\n return ;\n }\n\n private _toggle(e: React.MouseEvent | React.KeyboardEvent): void {\n e.preventDefault();\n this.isExpanded = !this.isExpanded;\n this.setState({ isOpen: this.isExpanded });\n this.isManuallyToggled = true;\n if (this.props.onToggle) {\n this.props.onToggle(this.state);\n }\n }\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport classnames from 'classnames';\nimport * as React from 'react';\n\nimport { Button } from '..';\nimport Collapse from '../collapse/Collapse';\nimport { ICollapseProps } from '../collapse/Collapse.props';\nimport { IDrawerProps } from './Drawer.props';\n\n/**\n * Drawer State Interface\n */\nexport interface IDrawerState {\n isOpen: boolean;\n buttonText?: string;\n}\n\n/**\n * Glyph placement type.\n */\nexport type GlyphPlacement = 'start' | 'end';\n\n/**\n * Drawer - This is a full width uncontrolled collapse where the button glyph changes\n * when the drawer is open and closed.\n */\n\nexport default class Drawer extends React.PureComponent {\n public state: IDrawerState;\n\n private readonly drawerOpenGlyph: string;\n\n private readonly drawerCloseGlyph: string;\n\n private readonly drawerGlyphClass: string;\n\n private isManuallyToggled: boolean;\n\n constructor(props: IDrawerProps) {\n super(props);\n this._toggle = this._toggle.bind(this);\n this.isManuallyToggled = false;\n this.state = { isOpen: props.collapseProps?.isOpen ?? false, buttonText: '' };\n this.drawerGlyphClass = classnames(\n 'drawer__glyph',\n\n this.props.toggleGlyphClassName ? this.props.toggleGlyphClassName : ''\n );\n\n if (this.props.animateGlyph) {\n this.drawerOpenGlyph = classnames(\n this.drawerGlyphClass,\n\n this.props.openGlyph ? this.props.openGlyph : this.props.closeGlyph ? this.props.closeGlyph : ''\n );\n this.drawerCloseGlyph = this.drawerOpenGlyph;\n } else {\n this.drawerOpenGlyph = classnames(\n this.drawerGlyphClass,\n\n this.props.openGlyph ? this.props.openGlyph : ''\n );\n this.drawerCloseGlyph = classnames(\n this.drawerGlyphClass,\n\n this.props.closeGlyph ? this.props.closeGlyph : ''\n );\n }\n }\n\n public render(): JSX.Element {\n const collapseProps = { ...this.props.collapseProps } as ICollapseProps;\n\n // If the drawer is manually toggled by pressing the button, then we use the internal state\n if (collapseProps.isOpen === undefined || this.isManuallyToggled) {\n collapseProps.isOpen = this.state.isOpen;\n } else {\n this.setState({\n isOpen: collapseProps.isOpen\n });\n }\n collapseProps.children = this.props.children;\n const drawerClass = classnames(\n 'drawer',\n\n this.props.className ? this.props.className : ''\n );\n this.isManuallyToggled = false;\n return (\n
\n \n {this._generateDrawerButtonInnerMarkup(collapseProps.isOpen)}\n \n \n
\n );\n }\n\n /**\n * Method generate drawer inner markup.\n * @param collapseState -Drawer button collapse state.\n * @returns Jsx element.\n */\n private _generateDrawerButtonInnerMarkup(collapseState: boolean): JSX.Element {\n const drawerButtonTextClass = classnames(\n 'drawer__buttontext',\n\n this.props.toggleButtonClassName ? this.props.toggleButtonClassName : ''\n );\n if (this.props.glyphPlacement === 'end') {\n return (\n <>\n {this.props.toggleButtonText}\n {this._generateGlyphMarkup('drawer__glyph__end', collapseState)}\n \n );\n }\n\n if (this.props.glyphPlacement === 'start') {\n return (\n <>\n {this._generateGlyphMarkup('drawer__glyph__start', collapseState)}\n {this.props.toggleButtonText}\n \n );\n }\n return {this.props.toggleButtonText};\n }\n\n /**\n * Method generate glyph markup.\n * @param location -Glyph icon location.\n * @param collapseState -Drawer button collapse state.\n * @returns Jsx element.\n */\n private _generateGlyphMarkup(location: string, collapseState: boolean): JSX.Element {\n let glyphClass = collapseState ? this.drawerOpenGlyph : this.drawerCloseGlyph;\n glyphClass = `${glyphClass} ${location}`;\n return ;\n }\n\n /**\n * Method on click of drawer button.\n * @param e -Mouse event for drawer button.\n */\n private _toggle(e: React.MouseEvent | React.KeyboardEvent): void {\n e.preventDefault();\n this.isManuallyToggled = true;\n\n if (this.props.onToggle) {\n this.setState(\n { isOpen: !this.state.isOpen, buttonText: e.currentTarget.innerText },\n () => this.props.onToggle && this.props.onToggle(this.state)\n );\n } else {\n this.setState({ isOpen: !this.state.isOpen });\n }\n }\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport * as React from 'react';\n\nimport { getPayloadObject, getTelemetryAttributes, IPayLoad, UncontrolledTooltip } from '..';\nimport { IFlipperProps } from './Flipper.props';\n\nexport type FlipperSize = 'small' | 'medium' | 'large';\n\n/**\n * Flipper Component - This component is used to add\n * flippers to a carousel/jumbotron.\n */\nexport default class Flipper extends React.PureComponent {\n private readonly payLoad: IPayLoad;\n\n constructor(props: IFlipperProps) {\n super(props);\n this.payLoad = getPayloadObject('click', this.props.telemetryContent!, this.props.telemetryLabel!);\n }\n\n public render(): JSX.Element {\n const { className, glyphProps, size, displayTooltip, disabled, telemetryContent, telemetryLabel, ...props } = this.props;\n const sizeClass = size === 'small' ? 'msc-flipper__small' : size === 'large' ? 'msc-flipper__large' : '';\n const classNames = className ? `msc-flipper ${sizeClass} ${className}` : `msc-flipper ${sizeClass}`;\n const attribute = getTelemetryAttributes(telemetryContent!, this.payLoad);\n\n // Do not flip next/previous glyphs in RTL (commonly chevron-left and chevron-right)\n glyphProps.className = `${glyphProps.className} msc-no-rtl-flip-required`;\n\n return (\n <>\n \n {displayTooltip && !disabled && (\n \n {' '}\n {props['aria-label']}\n \n )}\n \n );\n }\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { ArrayExtensions, Dictionary, ObjectExtensions } from '@msdyn365-commerce-modules/retail-actions';\nimport * as React from 'react';\n\nimport Button from '../button/Button';\nimport { IFormKeyProps } from './form-builder.props';\n\n/**\n * The state of the form builder.\n */\nexport interface IFormBuilderState {\n /**\n * The captured values.\n */\n values: string[];\n\n /**\n * If the form has been submitted.\n */\n isSubmitted: boolean;\n}\n\n/**\n * The properties of the form builder.\n */\nexport interface IFormBuilderProps {\n /**\n * The component showing confirmation after form submitted successfully.\n */\n confirmationComponent: React.ReactNode;\n\n /**\n * The heading for the component shown above the input boxes.\n */\n heading: string;\n\n /**\n * The text shown on the submit button.\n */\n submitButtonText: string;\n\n /**\n * The keys of the form values to capture, which will be shown as labels for the inputs.\n */\n keys: IFormKeyProps[];\n\n /**\n * The error message shown when submitting the form and required value is missing.\n */\n requiredValueMissingErrorMessage: string;\n\n /**\n * The action to perform when the form is submitted.\n * @param { formKey: IFormKeyProps, value: string[] } entry - The form data as key-value pairs to submit.\n */\n onSubmit(entry?: { formKey: IFormKeyProps; value: string }[]): Promise;\n}\n\n/**\n * The interface for properties of form builder error.\n */\nexport interface IFormBuilderErrorProps {\n errorMessage?: string;\n}\n\n/**\n * The error component in form builder.\n * @param errorProperties - The error properties.\n * @param errorProperties.errorMessage - The error message to show.\n * @returns The error component.\n */\nexport const FormBuilderErrorComponent: React.FC = ({ errorMessage }) => {\n if (!errorMessage) {\n return null;\n }\n\n return (\n \n {errorMessage}\n \n );\n};\n\n/**\n * The component to capture form data.\n */\nexport class FormBuilder extends React.Component {\n private readonly requiredValueMissing: Dictionary;\n\n public constructor(props: IFormBuilderProps) {\n super(props);\n this.state = { values: this.props.keys.map(() => ''), isSubmitted: false };\n\n // Setup a boolean dictionary to keep track if required value is missing for every field to submit.\n this.requiredValueMissing = new Dictionary();\n for (const formKey of this.props.keys) {\n if (formKey.resourceId) {\n this.requiredValueMissing.setValue(formKey.resourceId, formKey.isRequired ?? false);\n }\n }\n }\n\n public shouldComponentUpdate(nextProps: IFormBuilderProps, nextState: IFormBuilderState): boolean {\n if (\n this.props.heading !== nextProps.heading ||\n this.props.confirmationComponent !== nextProps.confirmationComponent ||\n this.props.submitButtonText !== nextProps.submitButtonText ||\n this.props.requiredValueMissingErrorMessage !== nextProps.requiredValueMissingErrorMessage\n ) {\n return true;\n }\n\n // If any form key has changed, the component should update.\n if (\n !this.props.keys.every((formKey: IFormKeyProps, index: number) => {\n return (\n nextProps.keys[Number(index)].isRequired === formKey.isRequired &&\n nextProps.keys[Number(index)].resourceId === formKey.resourceId &&\n nextProps.keys[Number(index)].resourceValue === formKey.resourceValue\n );\n })\n ) {\n return true;\n }\n\n // If any value has changed, the component should update.\n if (\n this.state.isSubmitted !== nextState.isSubmitted ||\n !this.state.values.every((value: string, index: number) => {\n return value === nextState[Number(index)];\n })\n ) {\n return true;\n }\n\n return false;\n }\n\n public render(): JSX.Element {\n return (\n <>\n {!this.state.isSubmitted && ArrayExtensions.hasElements(this.props.keys) && (\n
\n

{this.props.heading}

\n
\n \n {this.props.keys\n .filter((formKey: IFormKeyProps) => {\n return (\n !ObjectExtensions.isNullOrUndefined(formKey.resourceId) &&\n !ObjectExtensions.isNullOrUndefined(formKey.resourceValue)\n );\n })\n .map((formKey: IFormKeyProps, index: number) => {\n const currentValue: string = this.state.values[Number(index)];\n return (\n
\n \n {`${formKey.resourceValue!}${formKey.isRequired ? ' *' : ''}`}\n {this.requiredValueMissing.getValue(formKey.resourceId!) && (\n \n )}\n \n \n
\n );\n })}\n
\n \n {this.props.submitButtonText}\n \n
\n \n
\n
\n )}\n {this.state.isSubmitted && this.props.confirmationComponent}\n \n );\n }\n\n private get isAnyRequiredValueMissing(): boolean {\n const notFound: number = -1;\n return this.requiredValueMissing.getValues().findIndex((isMissing: boolean) => isMissing) !== notFound;\n }\n\n /**\n * The action to perform when the submit button is clicked.\n * @param event - The click event.\n * @returns The async result.\n */\n private readonly _onSubmit = async (event: React.SyntheticEvent): Promise => {\n event.preventDefault(); // Prevents form submission\n const formData: { formKey: IFormKeyProps; value: string }[] = this.props.keys.map((formKey: IFormKeyProps, index: number) => {\n const currentValue: string = this.state.values[Number(index)];\n return {\n formKey: { resourceId: formKey.resourceId!, resourceValue: formKey.resourceValue },\n value: currentValue\n };\n });\n await this.props.onSubmit(formData);\n this.setState((previousState: Readonly) => {\n return { values: previousState.values, isSubmitted: true };\n });\n };\n\n /**\n * The action to perform when any input in the form has changed.\n * @param event - The input change event.\n * @returns The async result.\n */\n private readonly _onInputChange = async (event: React.ChangeEvent): Promise => {\n event.preventDefault();\n const changedValueIndex: number = Number.parseInt(event.target.getAttribute('data-index') ?? '', 10);\n if (ObjectExtensions.isNullOrUndefined(changedValueIndex)) {\n return Promise.reject(new Error('form-builder: invalid value index.'));\n }\n const newState = {\n values: this.state.values.map((value: string, index: number) => {\n const currentKey: IFormKeyProps = this.props.keys[Number(index)];\n if (index === changedValueIndex && currentKey.resourceId) {\n this.requiredValueMissing.setValue(\n currentKey.resourceId,\n (currentKey.isRequired ?? false) && event.target.value === ''\n );\n return event.target.value;\n }\n return value;\n })\n };\n this.setState(newState);\n return Promise.resolve();\n };\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IRequestContext } from '@msdyn365-commerce/core';\nimport { debounce } from 'lodash';\nimport { observer } from 'mobx-react';\nimport * as React from 'react';\n\nimport { isMobile, VariantType } from '..';\nimport { getPayloadObject, getTelemetryAttributes, IPayLoad, TelemetryConstant } from '../common/telemetryHelper';\nimport { IIncrementalQuantityProps } from './IncrementalQuantity.props';\n\n/**\n * IIncrementalQuantityState interface.\n */\ninterface IIncrementalQuantityState {\n currentInput: number;\n isUpdating: boolean;\n}\n\n/**\n * Quantity Component - This component is used to add or remove quantity.\n */\n@observer\nexport default class IncrementalQuantity extends React.PureComponent {\n public static defaultProps: Partial = {\n min: 1,\n decrementGlyphClass: 'fas fa-minus',\n incrementGlyphClass: 'fas fa-plus'\n };\n\n private _minValue: number;\n\n private readonly inputRef: React.RefObject = React.createRef();\n\n private readonly payLoad: IPayLoad;\n\n public static getDerivedStateFromProps(\n props: Readonly,\n state: IIncrementalQuantityState\n ): IIncrementalQuantityState {\n const nextState = { ...state };\n\n if (props.disabled && !state.isUpdating) {\n nextState.isUpdating = true;\n }\n\n if (\n (!props.disabled && state.isUpdating) ||\n ((props.applyDefaultOrderSettings ?? false) &&\n state.currentInput === 1 &&\n props.currentCount &&\n props.currentCount > IncrementalQuantity.defaultProps.min!)\n ) {\n nextState.currentInput = props.currentCount ?? 1;\n nextState.isUpdating = false;\n }\n\n return nextState;\n }\n\n constructor(props: IIncrementalQuantityProps) {\n super(props);\n this.state = { currentInput: props.currentCount ?? 1, isUpdating: false };\n this._onIncrement = this._onIncrement.bind(this);\n this._onDecrement = this._onDecrement.bind(this);\n this._handleChange = this._handleChange.bind(this);\n this.payLoad = getPayloadObject('click', this.props.telemetryContent!, '');\n this._minValue = this.props.min ?? IncrementalQuantity.defaultProps.min!;\n }\n\n public render(): JSX.Element {\n const { min, max } = this.props;\n\n this._minValue = min ?? IncrementalQuantity.defaultProps.min!;\n const value = this.state.currentInput;\n\n const glyphMinusClassName: string = `${this.props.decrementGlyphClass!} quantity__controls-glyph`;\n const glyphPlusClassName: string = `${this.props.incrementGlyphClass!} quantity__controls-glyph`;\n const decrementDisabled = value <= this._minValue || this.props.isGiftCard;\n const incrementDisabled = value >= max || this.props.isGiftCard;\n const currentValue = value;\n this.payLoad.contentAction.etext = TelemetryConstant.DecrementQuantity;\n const decrementAttributes = getTelemetryAttributes(this.props.telemetryContent!, this.payLoad);\n this.payLoad.contentAction.etext = TelemetryConstant.IncrementQuantity;\n const incrementAttributes = getTelemetryAttributes(this.props.telemetryContent!, this.payLoad);\n const ariaLablelText = `${this.props.inputQuantityAriaLabel ?? ''} ${value}`;\n\n let extraClassDecrement = '';\n if (decrementDisabled) {\n // The quantity has reached its boundaries (max or min)\n extraClassDecrement = 'disabled';\n } else if (this.props.disabled) {\n // This.props.disabled shows if the state is not succeded yet\n extraClassDecrement = 'transition';\n }\n let extraClassIncrement = '';\n if (incrementDisabled) {\n // The quantity has reached its boundaries (max or min)\n extraClassIncrement = 'disabled';\n } else if (this.props.disabled) {\n // This.props.disabled shows if the state is not succeded yet\n extraClassIncrement = 'transition';\n }\n\n return (\n <>\n
\n \n \n \n \n \n \n \n
\n \n );\n }\n\n /**\n * It checks if its in mobile view or not.\n * @returns Boolean.\n */\n private readonly isMobileView = (): boolean => {\n // eslint-disable-next-line @typescript-eslint/consistent-type-assertions -- Added gridsetting values.\n const context = {\n gridSettings: {\n xs: { w: 767 },\n sm: { w: 991 },\n md: { w: 1199 },\n lg: { w: 1599 },\n xl: { w: 1600 }\n }\n } as IRequestContext;\n\n const isMobileCheck = isMobile({ variant: VariantType.Browser, context });\n return isMobileCheck === 'xs' || isMobileCheck === 'sm';\n };\n\n private _onIncrement(): void {\n let invokeCallback = false;\n const currQuantity = this.state.currentInput;\n let updatedQuantity: number;\n\n if (currQuantity < this.props.max) {\n invokeCallback = true;\n updatedQuantity = currQuantity + 1;\n } else {\n invokeCallback = false;\n updatedQuantity = this.props.max;\n }\n\n if (invokeCallback && this.props.onChange) {\n if (this.props.onChange(updatedQuantity)) {\n this.setState({ currentInput: updatedQuantity });\n }\n }\n }\n\n private _onDecrement(): void {\n let invokeCallback = false;\n const currQuantity = this.state.currentInput;\n let updatedQuantity: number;\n\n if (currQuantity >= this._minValue) {\n invokeCallback = true;\n updatedQuantity = currQuantity - 1;\n } else {\n invokeCallback = false;\n updatedQuantity = this._minValue;\n }\n\n if (invokeCallback && this.props.onChange) {\n if (this.props.onChange(updatedQuantity)) {\n this.setState({ currentInput: updatedQuantity });\n }\n }\n }\n\n private _handleChange(e: React.ChangeEvent): void {\n let currentValue = Number.parseInt(e.target.value, 10);\n if (Number.isNaN(currentValue)) {\n this.setState({ currentInput: currentValue });\n return;\n }\n currentValue = Math.min(this.props.max, Math.max(this._minValue, currentValue));\n this.setState({ currentInput: currentValue });\n debounce(() => {\n // Due of usage debouncer, we may ignore onChange return value\n this.props.onChange && this.props.onChange(this.state.currentInput);\n\n const inputElement =\n this.inputRef && this.inputRef.current && this.inputRef.current instanceof HTMLInputElement && this.inputRef.current;\n if (inputElement) {\n inputElement.setAttribute('aria-valuenow', this.state.currentInput.toString());\n inputElement.setAttribute('value', this.state.currentInput.toString());\n }\n }, 1000)();\n }\n\n /**\n * Validates min and updates.\n */\n private readonly _validateMin = (): void => {\n if (Number.isNaN(this.state.currentInput)) {\n this.setState({ currentInput: this._minValue });\n } else {\n const currentValue = Math.min(this.props.max, Math.max(this._minValue, this.state.currentInput));\n if (currentValue !== this.state.currentInput) {\n this.setState({ currentInput: currentValue });\n }\n }\n };\n}\n","/*! *****************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (_) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport function __createBinding(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n}\r\n\r\nexport function __exportStar(m, exports) {\r\n for (var p in m) if (p !== \"default\" && !exports.hasOwnProperty(p)) exports[p] = m[p];\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n};\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];\r\n result.default = mod;\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, privateMap) {\r\n if (!privateMap.has(receiver)) {\r\n throw new TypeError(\"attempted to get private field on non-instance\");\r\n }\r\n return privateMap.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, privateMap, value) {\r\n if (!privateMap.has(receiver)) {\r\n throw new TypeError(\"attempted to set private field on non-instance\");\r\n }\r\n privateMap.set(receiver, value);\r\n return value;\r\n}\r\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport * as Msdyn365 from '@msdyn365-commerce/core';\n\nexport enum VariantType {\n Browser,\n Viewport\n}\n\n/**\n * IsMobile properties.\n */\nexport interface IMobileProps {\n /**\n * Contains variant i.e browser | viewport.\n */\n variant?: VariantType;\n context?: Msdyn365.IRequestContext;\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport MsDyn365 from '@msdyn365-commerce/core';\n\nimport { IMobileProps, VariantType } from './isMobile.props';\n\n/**\n * IsMobile component.\n * @param props\n */\nexport const isMobile = (props: IMobileProps) => {\n const { variant, context } = props;\n switch (variant) {\n case VariantType.Browser:\n if (MsDyn365.isBrowser && window.innerWidth) {\n const gridSettings = context?.gridSettings;\n if (gridSettings) {\n if (gridSettings.xs && window.innerWidth <= gridSettings.xs.w) {\n return 'xs';\n } else if (gridSettings.sm && window.innerWidth <= gridSettings.sm.w) {\n return 'sm';\n } else if (gridSettings.md && window.innerWidth <= gridSettings.md.w) {\n return 'md';\n } else if (gridSettings.lg && window.innerWidth <= gridSettings.lg.w) {\n return 'lg';\n }\n return 'xl';\n }\n }\n\n return 'lg';\n case VariantType.Viewport:\n const viewport = context?.device?.Type === 'Mobile' ? 'xs' : 'lg';\n return viewport;\n default:\n return 'lg';\n }\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport classNames from 'classnames';\nimport * as React from 'react';\n\nimport { ILabeledDropdownProps } from './LabeledDropdown.props';\n\nexport interface ILabeledDropdownState {\n selectedIndex: number;\n}\n\n/**\n * Labeled Dropdown component.\n */\nexport default class LabeledDropdown extends React.PureComponent {\n public static defaultProps: Partial = {\n toggleColor: 'link'\n };\n\n constructor(props: ILabeledDropdownProps) {\n super(props);\n this._onSelectOption = this._onSelectOption.bind(this);\n const selectedKey = this.props.selectedOption.key;\n const keys = this.props.dropdownOptions.map(option => option.key);\n this.state = { selectedIndex: keys.indexOf(selectedKey) };\n }\n\n public render(): JSX.Element {\n const { labelText, labelClassname, dropdownId, dropdownOptions, dropdownClassname } = this.props;\n\n const labelClassNames = classNames('msc-l-dropdown__label', labelClassname);\n const dropdownClassNames = classNames('msc-l-dropdown', dropdownClassname);\n const selectedIndex = this._getSelectedIndex();\n\n return (\n <>\n \n \n \n );\n }\n\n private _getSelectedIndex(): number {\n if (this.props.controlledByParent) {\n let selectedIndex = -1;\n const selectedKey = this.props.selectedOption.key;\n for (let i = 0; i < this.props.dropdownOptions.length; i++) {\n if (this.props.dropdownOptions[i].key === selectedKey) {\n selectedIndex = i;\n break;\n }\n }\n\n return selectedIndex;\n }\n\n return this.state.selectedIndex;\n }\n\n private _onSelectOption(event: React.ChangeEvent): void {\n const { dropdownOptions, onSelectOption } = this.props;\n const index = event.currentTarget.selectedOptions[0].index;\n const selectedOption = dropdownOptions[index];\n this.setState({ selectedIndex: index });\n onSelectOption({ selectedOption });\n }\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport classNames from 'classnames';\nimport * as React from 'react';\n\nimport { mapToCssModules } from '../common/utilities';\nimport { IPaginationProps } from './Pagination.props';\n\n/**\n * Pagination component.\n */\nexport default class Pagination extends React.PureComponent {\n public static defaultProps: Partial = {\n tag: 'nav',\n listTag: 'ul',\n 'aria-label': 'pagination'\n };\n\n public render(): JSX.Element {\n /* eslint-disable @typescript-eslint/no-explicit-any */\n const {\n className,\n listClassName,\n cssModule,\n size,\n tag: Tag,\n listTag: ListTag,\n 'aria-label': label,\n role,\n ...props\n }: any = this.props;\n\n const paginationClasses = mapToCssModules(classNames(className), cssModule);\n\n const listpaginationClasses = mapToCssModules(\n classNames(listClassName, 'msc-pagination', {\n [`msc-pagination-${size}`]: !!size\n }),\n cssModule\n );\n\n return (\n \n \n \n );\n }\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport classNames from 'classnames';\nimport * as React from 'react';\n\nimport { mapToCssModules } from '../common/utilities';\nimport { IPaginationItemProps } from './PaginationItem.props';\n\n/**\n * PaginationItem component.\n */\nexport default class PaginationItem extends React.PureComponent {\n public static defaultProps: Partial = {\n tag: 'li'\n };\n\n public render(): JSX.Element {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const { active, className, cssModule, disabled, tag: Tag, ...props }: any = this.props;\n\n const paginationItemClasses = mapToCssModules(\n classNames(className, 'msc-page-item', {\n active,\n disabled\n }),\n cssModule\n );\n\n return ;\n }\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport classNames from 'classnames';\nimport * as React from 'react';\n\nimport { getPayloadObject, getTelemetryAttributes, IPayLoad } from '../common/telemetryHelper';\nimport { mapToCssModules } from '../common/utilities';\nimport { IPaginationLinkProps } from './PaginationLink.props';\n\n/**\n * PaginationLink component.\n */\nexport default class PaginationLink extends React.PureComponent {\n public static defaultProps: Partial = {\n tag: 'a',\n role: 'link'\n };\n\n private readonly payLoad: IPayLoad;\n\n constructor(props: IPaginationLinkProps) {\n super(props);\n this.payLoad = getPayloadObject('click', this.props.telemetryContent!, '');\n }\n\n public render(): JSX.Element {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let { className, cssModule, next, previous, tag: Tag, children, telemetryContent, ...props }: any = this.props;\n let etext: string = children;\n const paginationLinkclasses = mapToCssModules(classNames(className, 'msc-page-link'), cssModule);\n\n let defaultCaret;\n if (previous) {\n defaultCaret = '\\u00AB';\n etext = 'previous';\n } else if (next) {\n defaultCaret = '\\u00BB';\n etext = 'next';\n }\n\n if (children && Array.isArray(children) && children.length === 0) {\n children = null;\n }\n if (!props.href && Tag === 'a') {\n Tag = 'span';\n }\n\n if (previous || next) {\n children = [{children || defaultCaret}];\n }\n\n this.payLoad.contentAction.etext = etext;\n const attribute = getTelemetryAttributes(telemetryContent, this.payLoad);\n\n return (\n \n {children}\n \n );\n }\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport classNames from 'classnames';\nimport * as React from 'react';\n\nimport { UncontrolledTooltip } from '..';\nimport { mapToCssModules } from '../common/utilities';\nimport PaginationItem from './PaginationItem';\nimport PaginationLink from './PaginationLink';\nimport { IUncontrolledPaginationProps } from './UncontrolledPagination.props';\n\n/**\n * Uncontrolled Pagination component.\n */\nexport default class UncontrolledPagination extends React.PureComponent {\n public static defaultProps: Partial = {\n tag: 'nav',\n listTag: 'ul',\n 'aria-label': 'pagination',\n items: 0,\n itemsPerPage: 25,\n startingItem: 0\n };\n\n private static readonly pagesDisplayed: number = 7;\n\n private maxPages: number;\n\n private activePage: number = 0;\n\n private qsps: { [param: string]: string };\n\n private url: string;\n\n private hash: string;\n\n constructor(props: IUncontrolledPaginationProps) {\n super(props);\n this.maxPages = this.props.items ? Math.ceil(this.props.items / this.props.itemsPerPage!) : 0;\n this.activePage = Math.floor((this.props.startingItem || 0) / this.props.itemsPerPage!);\n this.qsps = {};\n const splitUrl = this.props.url.split('?');\n\n if (splitUrl[1]) {\n this.url = splitUrl[0];\n const secondSplit = splitUrl[1].split('#');\n this.hash = secondSplit[1] ? `#${secondSplit[1]}` : '';\n const parsedQsps = secondSplit[0].split('&');\n\n for (const qsp of parsedQsps) {\n const qspPair = qsp.split('=');\n\n if (this.props.qsp !== qspPair[0]) {\n this.qsps[qspPair[0]] = qspPair[1];\n }\n }\n } else {\n const secondSplit = splitUrl[0].split('#');\n this.url = secondSplit[0];\n this.hash = secondSplit[1] ? `#${secondSplit[1]}` : '';\n }\n }\n\n public render(): JSX.Element {\n /* eslint-disable @typescript-eslint/no-explicit-any */\n const {\n className,\n baseUrl,\n qsp,\n items,\n itemsPerPage,\n startingItem,\n previousText,\n nextText,\n previousAriaLabel,\n nextAriaLabel,\n listClassName,\n cssModule,\n children,\n size,\n tag: Tag,\n listTag: ListTag,\n 'aria-label': label,\n role,\n ...props\n }: any = this.props;\n\n this.maxPages = this.props.items ? Math.ceil(this.props.items / this.props.itemsPerPage!) : 0;\n this.activePage = Math.floor((this.props.startingItem || 0) / this.props.itemsPerPage!);\n this.qsps = {};\n const splitUrl = this.props.url.split('?');\n\n if (splitUrl[1]) {\n this.url = splitUrl[0];\n const secondSplit = splitUrl[1].split('#');\n this.hash = secondSplit[1] ? `#${secondSplit[1]}` : '';\n const parsedQsps = secondSplit[0].split('&');\n\n for (const activeQsp of parsedQsps) {\n const qspPair = activeQsp.split('=');\n\n if (this.props.qsp !== qspPair[0]) {\n this.qsps[qspPair[0]] = qspPair[1];\n }\n }\n } else {\n const secondSplit = splitUrl[0].split('#');\n this.url = secondSplit[0];\n this.hash = secondSplit[1] ? `#${secondSplit[1]}` : '';\n }\n\n const paginationClasses = mapToCssModules(classNames(className), cssModule);\n\n const listpaginationClasses = mapToCssModules(\n classNames(listClassName, 'msc-pagination', {\n [`msc-pagination-${size}`]: !!size\n }),\n cssModule\n );\n\n return (\n \n \n {this._generatePageLinks()}\n \n \n );\n }\n\n private _generateUrl(page: number): string {\n const items = this.props.itemsPerPage! * page;\n const keys = Object.keys(this.qsps);\n let qspUrl = page > 0 ? `?${this.props.qsp}=${items}` : '';\n\n keys.forEach((key: string) => {\n qspUrl = qspUrl ? `${qspUrl}&${key}=${this.qsps[key]}` : `?${key}=${this.qsps[key]}`;\n });\n\n return this.url + qspUrl + this.hash;\n }\n\n private _generatePaginationArrow(next: boolean, disable: boolean, className: string): React.ReactElement {\n const url = disable ? undefined : this._generateUrl(this.activePage + (next ? 1 : -1));\n const tooltipId = next ? this.props.nextId : this.props.prevId;\n const ariaDescribedBy = next ? this.props.nextAreaDescribed : this.props.prevAreaDescribed;\n const placement = next ? 'right' : 'left';\n const tag = disable ? 'span' : 'a';\n\n return (\n \n \n {next ? this.props.nextText : this.props.previousText}\n \n {tooltipId && (\n \n {next ? 'next' : 'previous'}\n \n )}\n \n );\n }\n\n private _generatePaginationItem(page: number): React.ReactElement {\n const active = this.activePage === page;\n const url = this._generateUrl(page);\n page += 1;\n\n return (\n \n \n {page}\n \n \n );\n }\n\n private _generateEllipse(): React.ReactElement {\n return (\n \n ...\n \n );\n }\n\n private _generatePageLinks(): React.ReactFragment {\n const displayCountSide = 3;\n let leftDistance = this.activePage;\n let rightDistance = this.maxPages - this.activePage - 1;\n const leftEllipse = this.maxPages > UncontrolledPagination.pagesDisplayed && leftDistance > 3;\n const rightEllipse = this.maxPages > UncontrolledPagination.pagesDisplayed && rightDistance > 3;\n\n leftDistance = Math.min(leftDistance, displayCountSide);\n rightDistance = Math.min(rightDistance, displayCountSide);\n const pages = [];\n const ellipseOffset = leftEllipse ? -1 : 0;\n const displayedPagesOnLeft = leftDistance + (displayCountSide - rightDistance) + ellipseOffset;\n const startingIndex = Math.max(this.activePage - displayedPagesOnLeft, 0);\n const endIndex = Math.min(\n startingIndex + 5 + (rightEllipse ? 0 : 1) + (leftEllipse ? 0 : 1),\n rightEllipse ? this.maxPages - 1 : this.maxPages\n );\n\n if (leftEllipse) {\n pages.push(this._generatePaginationItem(0));\n pages.push(this._generateEllipse());\n }\n\n for (let i = startingIndex; i < endIndex; i++) {\n pages.push(this._generatePaginationItem(i));\n }\n\n if (rightEllipse) {\n pages.push(this._generateEllipse());\n pages.push(this._generatePaginationItem(this.maxPages - 1));\n }\n\n return (\n <>\n {this._generatePaginationArrow(false, this.activePage === 0, 'previous')}\n {pages}\n {this._generatePaginationArrow(true, this.activePage === this.maxPages - 1, 'next')}\n \n );\n }\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport * as React from 'react';\nimport { createPortal } from 'react-dom';\n\nimport { canUseDOM } from '../common/utilities';\nimport { IPortalProps } from './Portal.props';\n\nexport interface IPortalState {\n defaultNode: Element | null;\n}\n\n/**\n * Portal component.\n */\nexport default class Portal extends React.PureComponent {\n constructor(props: IPortalProps) {\n super(props);\n\n this.state = {\n defaultNode: null\n };\n }\n\n public componentWillUnmount(): void {\n if (this.state.defaultNode) {\n this.state.defaultNode.remove();\n }\n }\n\n public render(): React.ReactPortal | null {\n let node = null;\n if (!canUseDOM) {\n return null;\n }\n\n if (!this.props.node && !this.state.defaultNode) {\n node = document.createElement('div');\n document.body.appendChild(node);\n this.setState({ defaultNode: node });\n }\n return createPortal(this.props.children, this.props.node || node);\n }\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport classNames from 'classnames';\nimport * as React from 'react';\n\nimport { focusableElements, TransitionTimeouts } from '../common/utilities';\nimport Fade from '../fade/Fade';\nimport IModalProps from './Modal.props';\nimport Portal from './Portal';\n\nexport interface IModalState {\n wasOpen: boolean;\n isOpen: boolean;\n mouseDownElement: EventTarget | null;\n}\n\nexport type ModalVerticalPosition = 'top' | 'center' | 'bottom';\nexport type ModalHorizontalPosition = 'left' | 'center' | 'right';\n\n/**\n * Modal component.\n */\nexport default class Modal extends React.PureComponent {\n public static defaultProps: Partial = {\n isOpen: false,\n autoFocus: true,\n verticalPosition: 'top', // Needs to be non-null since we use non-null assertion in getVerticalPositionClass\n horizontalPosition: 'center', // Needs to be non-null since we use non-null assertion in getHorizontalPositionClass\n role: 'dialog',\n backdrop: true,\n keyboard: true,\n zIndex: 1000,\n tabIndex: 0,\n fade: true,\n modalTransition: {\n timeout: TransitionTimeouts.Modal\n },\n backdropTransition: {\n mountOnEnter: true,\n timeout: TransitionTimeouts.Fade // Uses standard fade transition\n }\n };\n\n private static openCount: number = 0;\n\n private element: HTMLElement | null;\n\n private mounted: boolean;\n\n private readonly ref: React.RefObject;\n\n /**\n * This property is initialized in componentDidMount rather than constructor in case the dialog needs to be pre-rendered.\n */\n private applicationNode!: HTMLElement | null;\n\n constructor(props: IModalProps) {\n super(props);\n this.element = null;\n this.ref = React.createRef();\n this.mounted = false;\n\n this._getFocusableChildren = this._getFocusableChildren.bind(this);\n this._handleBackdropClick = this._handleBackdropClick.bind(this);\n this._handleBackdropMouseDown = this._handleBackdropMouseDown.bind(this);\n this._handleEscape = this._handleEscape.bind(this);\n this._handleTab = this._handleTab.bind(this);\n this._onOpened = this._onOpened.bind(this);\n this._onClosed = this._onClosed.bind(this);\n\n this.state = {\n wasOpen: false,\n isOpen: props.isOpen || false,\n mouseDownElement: null\n };\n\n if (props.isOpen) {\n this._open();\n }\n }\n\n public componentDidMount(): void {\n if (this.props.onEnter) {\n this.props.onEnter();\n }\n this.mounted = true;\n\n const element = document.createElement('div');\n element.setAttribute('tabindex', '-1');\n element.style.visibility = 'hidden';\n element.style.position = 'position';\n this.element = element;\n document.body.appendChild(element);\n\n this.applicationNode =\n this.props.applicationNode instanceof HTMLElement\n ? this.props.applicationNode\n : document.querySelector(`#${this.props.applicationNode}`);\n\n if (this.state.isOpen && !this.state.wasOpen) {\n this._open();\n }\n }\n\n public componentWillUnmount(): void {\n if (this.props.onExit) {\n this.props.onExit();\n }\n if (this.state.isOpen) {\n this._close();\n }\n this.mounted = false;\n\n if (this.element) {\n this.element.remove();\n }\n }\n\n public componentDidUpdate(_prevProps: IModalProps, prevState: IModalState): void {\n if (\n (this.state.isOpen && !prevState.isOpen) ||\n (this.props.shouldUpdateFocusToFirstElement && !_prevProps.shouldUpdateFocusToFirstElement)\n ) {\n setTimeout(() => {\n const focusableElementArr = this._getFocusableChildren();\n if (focusableElementArr && focusableElementArr.length > 0 && focusableElementArr[0]) {\n const firstFocusableElement = focusableElementArr[0] as HTMLElement;\n firstFocusableElement.focus();\n }\n }, 100);\n }\n }\n // eslint-disable-next-line react/no-deprecated\n public componentWillReceiveProps(nextProps: IModalProps): void {\n if (nextProps.isOpen && !this.props.isOpen) {\n this.setState({ isOpen: nextProps.isOpen });\n }\n }\n\n public render(): JSX.Element | null {\n if (this.state.isOpen && !this.state.wasOpen) {\n this._open();\n }\n if (this.element !== null) {\n const {\n wrapClassName,\n modalClassName,\n backdropClassName,\n contentClassName,\n className,\n cssModule,\n modalTransition,\n backdropTransition,\n backdrop,\n isOpen,\n onOpened,\n onClosed,\n role,\n size,\n tabIndex,\n external,\n verticalPosition,\n horizontalPosition,\n keyboard,\n zIndex,\n fade,\n toggle,\n children,\n applicationNode,\n returnFocusRef,\n 'aria-labelledby': ariaLabelledbyId,\n ...dialogAttributes\n } = this.props;\n\n const modalAttributes = {\n onClick: this._handleBackdropClick,\n onMouseDown: this._handleBackdropMouseDown,\n onKeyUp: this._handleEscape,\n onKeyDown: this._handleTab,\n style: { display: 'block' }\n };\n\n const modalTransitions = {\n ...Fade.defaultProps,\n ...modalTransition,\n baseClass: fade && modalTransition ? modalTransition.baseClass : '',\n timeout: fade && modalTransition ? modalTransition.timeout : 0\n };\n const backdropTransitions = {\n ...Fade.defaultProps,\n ...backdropTransition,\n baseClass: fade && backdropTransition ? backdropTransition.baseClass : '',\n timeout: fade && backdropTransition ? backdropTransition.timeout : 0\n };\n\n const Backdrop = fade ? (\n \n ) : (\n
\n );\n\n const dialogBaseClass = 'msc-modal__dialog';\n const dialogClasses = classNames([dialogBaseClass, className, size ? `msc-modal__${size}` : null]);\n\n const dialog = (\n \n
\n {children}\n
\n
\n );\n\n return (\n \n
\n \n {external}\n {dialog}\n \n {Backdrop}\n
\n
\n );\n }\n\n return null;\n }\n\n private _open(): void {\n if (this.element) {\n this.element.style.zIndex = `${this.props.zIndex || 1000}`;\n this.element.style.display = 'block';\n this.element.style.visibility = 'visible';\n if (Modal.openCount === 0) {\n if (window) {\n const scrollY = window.scrollY;\n const scrollbarWidth = window.innerWidth - document.body.clientWidth;\n document.body.style.position = 'fixed';\n document.body.style.top = `-${scrollY}px`;\n document.body.style.right = `${scrollbarWidth}px`;\n document.body.style.left = '0px';\n }\n\n document.body.className = classNames(document.body.className, 'modal-open');\n }\n Modal.openCount += 1;\n document.body.firstElementChild?.setAttribute('aria-hidden', 'true');\n if (this.applicationNode) {\n this.applicationNode.setAttribute('aria-hidden', 'true');\n }\n\n this.setState({ ...this.state, wasOpen: true });\n }\n }\n\n private _close(): void {\n if (!this.state.isOpen) {\n return;\n }\n\n if (this.element) {\n this.element.style.display = 'none';\n setTimeout(() => {\n if (this.element) {\n this.element.style.visibility = 'hidden';\n this.element.style.removeProperty('display');\n }\n }, 0);\n }\n\n if (Modal.openCount <= 1) {\n const modalOpenClassName = 'modal-open';\n document.body.firstElementChild?.setAttribute('aria-hidden', 'false');\n\n // Use regex to prevent matching `modal-open` as part of a different class, e.g. `my-modal-opened`\n const modalOpenClassNameRegex = new RegExp(`(^| )${modalOpenClassName}( |$)`);\n document.body.className = document.body.className.replace(modalOpenClassNameRegex, ' ').trim();\n\n if (window) {\n const scrollY = document.body.style.top;\n document.body.style.position = '';\n document.body.style.top = '';\n document.body.style.right = '';\n document.body.style.left = '';\n window.scrollTo(0, -Number.parseInt(scrollY || '0', 10));\n }\n }\n Modal.openCount -= 1;\n\n if (this.applicationNode) {\n this.applicationNode.setAttribute('aria-hidden', 'false');\n }\n\n if (this.props.returnFocusRef && this.props.returnFocusRef.current) {\n this.props.returnFocusRef.current.focus();\n }\n\n this.setState({ ...this.state, wasOpen: false });\n }\n\n private _getFocusableChildren(): NodeListOf | null {\n if (this.element === null) {\n return null;\n }\n\n return this.element.querySelectorAll(focusableElements.join(', '));\n }\n\n private _getFocusedChild(): Element | null {\n const focusableChildren = this._getFocusableChildren();\n\n try {\n return document.activeElement;\n } catch {\n return focusableChildren === null ? null : focusableChildren[0];\n }\n }\n\n private _handleBackdropClick(e: React.MouseEvent): void {\n if (e.target === this.state.mouseDownElement) {\n e.stopPropagation();\n if (!this.props.isOpen || this.props.backdrop !== true) {\n return;\n }\n\n const container = this.ref.current;\n\n if (e.target && container && !container.contains(e.target as Node) && this.props.toggle) {\n this.props.toggle();\n }\n }\n }\n\n private _handleTab(e: React.KeyboardEvent): void {\n if (e.which !== 9) {\n return;\n }\n\n const focusableChildren = this._getFocusableChildren();\n if (focusableChildren === null) {\n return;\n }\n\n const totalFocusable = focusableChildren.length;\n const currentFocus = this._getFocusedChild();\n\n let focusedIndex = 0;\n\n for (let i = 0; i < totalFocusable; i += 1) {\n if (focusableChildren[i] === currentFocus) {\n focusedIndex = i;\n break;\n }\n }\n\n let el: HTMLElement | null = null;\n if (e.shiftKey && focusedIndex === 0) {\n e.preventDefault();\n el = focusableChildren[totalFocusable - 1] as HTMLElement;\n } else if (!e.shiftKey && focusedIndex === totalFocusable - 1) {\n e.preventDefault();\n el = focusableChildren[0] as HTMLElement;\n }\n if (el) {\n el.focus();\n }\n }\n\n private _handleBackdropMouseDown(e: React.MouseEvent): void {\n this.setState({\n mouseDownElement: e.target\n });\n }\n\n private _handleEscape(e: React.KeyboardEvent): void {\n if (this.props.isOpen && this.props.keyboard && e.keyCode === 27 && this.props.toggle) {\n this.props.toggle();\n }\n }\n\n private _onOpened(node: HTMLElement, isAppearing: boolean): void {\n if (this.props.onOpened !== undefined) {\n this.props.onOpened();\n }\n if (this.props.modalTransition !== undefined && this.props.modalTransition.onEntered !== undefined) {\n this.props.modalTransition.onEntered(node, isAppearing);\n }\n }\n\n private _onClosed(node: HTMLElement): void {\n if (this.props.onClosed !== undefined) {\n this.props.onClosed();\n }\n this._close();\n if (this.props.modalTransition !== undefined && this.props.modalTransition.onExited !== undefined) {\n this.props.modalTransition.onExited(node);\n }\n if (this.mounted) {\n this.setState({ isOpen: false });\n }\n }\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport classNames from 'classnames';\nimport * as React from 'react';\n\nimport { mapToCssModules } from '../common/utilities';\nimport IModalBodyProps from './ModalBody.props';\n\n/**\n * ModalBody component.\n */\nexport default class ModalBody extends React.PureComponent {\n public static defaultProps: Partial = {\n tag: 'div'\n };\n\n public render(): JSX.Element {\n const { className, cssModule, tag, id, ...attributes } = this.props;\n const Tag = tag || 'div';\n const classes = mapToCssModules(classNames(className, 'msc-modal__body'), cssModule);\n return ;\n }\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport classNames from 'classnames';\nimport * as React from 'react';\n\nimport { mapToCssModules } from '../common/utilities';\nimport IModalFooterProps from './ModalFooter.props';\n\n/**\n * ModalFooter component.\n */\nexport default class ModalFooter extends React.PureComponent {\n public static defaultProps: Partial = {\n tag: 'div'\n };\n\n public render(): JSX.Element {\n const { className, cssModule, tag, ...attributes } = this.props;\n const Tag = tag || 'div';\n const classes = mapToCssModules(classNames(className, 'msc-modal__footer'), cssModule);\n return ;\n }\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport classNames from 'classnames';\nimport * as React from 'react';\n\nimport { mapToCssModules } from '../common/utilities';\nimport IModalHeaderProps from './ModalHeader.props';\n\n/**\n * ModalHeader component.\n */\nexport default class ModalHeader extends React.PureComponent {\n public render(): JSX.Element {\n let closeButton;\n const { className, cssModule, children, toggle, tag, wrapTag, closeAriaLabel, closeButtonLabel, id, ...attributes } = this.props;\n\n const Tag = tag || 'h5';\n const WrapTag = wrapTag || 'div';\n const classes = mapToCssModules(classNames(className, 'msc-modal__header'), cssModule);\n\n if (toggle) {\n closeButton = (\n \n );\n }\n\n return (\n \n {children && {children}}\n {closeButton}\n \n );\n }\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IComponentProps, IGridSettings, IImageSettings, Image } from '@msdyn365-commerce/core';\nimport { ProductPrice, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\nimport { getFallbackImageUrl } from '@msdyn365-commerce-modules/retail-actions';\nimport * as React from 'react';\n\nimport { Button, getPayloadObject, getTelemetryAttributes, ITelemetryContent, TelemetryConstant } from '..';\nimport { Modal, ModalBody, ModalFooter, ModalHeader } from '../modal';\n\nexport interface IPopupProps extends IComponentProps<{ product: SimpleProduct | undefined; price: ProductPrice | undefined }> {\n dialogStrings?: {\n goToCartText: string;\n continueShoppingText: string;\n headerItemOneText: string;\n headerItemFormatText: string;\n headerMessageText: string;\n freePriceText: string;\n originalPriceText: string;\n currentPriceText: string;\n };\n\n className: string;\n imageSettings?: IImageSettings;\n gridSettings: IGridSettings | undefined;\n productQuantity: number;\n priceComponent: React.ReactNode;\n navigationUrl?: string;\n modalOpen: boolean | undefined;\n telemetryContent?: ITelemetryContent;\n setModalOpen(newValue: boolean): void;\n}\n\nexport const Popup = (popupProps: IPopupProps) => {\n const {\n dialogStrings,\n className,\n imageSettings,\n gridSettings,\n data: { product, price },\n productQuantity,\n priceComponent,\n navigationUrl,\n modalOpen,\n telemetryContent,\n setModalOpen,\n context\n } = popupProps;\n const closeModal = React.useCallback(() => {\n setModalOpen(false);\n }, [setModalOpen]);\n if (!dialogStrings || !product) {\n return null;\n }\n const payLoad = getPayloadObject('click', telemetryContent!, TelemetryConstant.ContinueShopping);\n const continueShoppingAttribute = getTelemetryAttributes(telemetryContent!, payLoad);\n payLoad.contentAction.etext = TelemetryConstant.ViewBagAndCheckout;\n const viewBagAttribute = getTelemetryAttributes(telemetryContent!, payLoad);\n\n const fallbackImageUrl = getFallbackImageUrl(\n product.ItemId,\n context.actionContext.requestContext.apiSettings,\n context.request.app?.config?.OmniChannelMedia\n );\n if (imageSettings) {\n imageSettings.cropFocalRegion = true;\n }\n const quantity = productQuantity !== undefined ? productQuantity : 1;\n const itemsString =\n quantity === 1 ? dialogStrings.headerItemOneText : dialogStrings.headerItemFormatText.replace('{0}', quantity.toString());\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- app configs are of generic type\n const shouldDisplayUnitOfMeasure =\n context.app.config?.unitOfMeasureDisplayType && context.app.config.unitOfMeasureDisplayType !== 'none';\n\n const reducedDimensions: string = product.Dimensions\n ? product.Dimensions.reduce((str, productDimension) => {\n if (productDimension.DimensionValue && productDimension.DimensionValue.Value) {\n if (str) {\n return `${str}, ${productDimension.DimensionValue.Value}`;\n }\n\n return `${productDimension.DimensionValue.Value}`;\n }\n\n return str;\n }, '')\n : '';\n\n return (\n \n \n {itemsString}\n {dialogStrings.headerMessageText}\n \n \n \n {product.Name}\n {reducedDimensions !== '' ?
{reducedDimensions}
: ''}\n {price ?
{priceComponent}
: ''}\n {product.DefaultUnitOfMeasure && shouldDisplayUnitOfMeasure ? (\n
\n {product.DefaultUnitOfMeasure}\n
\n ) : (\n ''\n )}\n
\n \n \n {dialogStrings.goToCartText}\n \n \n {dialogStrings.continueShoppingText}\n \n \n
\n );\n};\n\nexport default Popup;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport classname from 'classnames';\nimport * as React from 'react';\n\nexport interface IProgressProps {\n id?: string;\n className?: string;\n max: number;\n min?: number;\n value: number;\n ariaLabel?: string;\n}\n\nexport const Progress: React.FC = (props: IProgressProps) => {\n const { id, className, max, min, value, ariaLabel } = props;\n const percent = Math.max(0, Math.min((value * 100) / max, 100));\n const style = { width: `${percent}%` };\n\n return (\n
\n \n
\n );\n};\n\n// Set default props\nProgress.defaultProps = {\n 'aria-valuemax': 100,\n 'aria-valuenow': 0\n} as Partial;\n\nexport default Progress;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport * as React from 'react';\n\nimport { addThrottledEvent, getCSS } from '../common/utilities';\nimport Flipper from '../flipper/Flipper';\nimport { ISingleSlideCarouselProps } from './SingleSlideCarousel.props';\n\ninterface ISingleSlideCarouselState {\n showPrevious: boolean;\n showNext: boolean;\n offset: number;\n}\n\n/**\n * SingleSlideCarousel - yup.\n */\nexport default class SingleSlideCarousel extends React.PureComponent {\n private static readonly itemsSelector: string = 'msc-ss-carousel-item';\n\n private static readonly verticalItemsSelector: string = 'msc-ss-carousel-vert-item';\n\n private direction: string;\n\n private item: HTMLElement | undefined;\n\n private slide: HTMLElement | undefined;\n\n private carousel: HTMLElement | undefined;\n\n private carouselSize: number = 0;\n\n private slideSize: number = 0;\n\n private itemSize: number = 0;\n\n private resizeThrottledEventHandler?: (event: Event) => void;\n\n private readonly ref: React.RefObject;\n\n private readonly slideRef: React.RefObject;\n\n private readonly itemRef: React.RefObject;\n\n private readonly id: string;\n\n private scrollStart: number | undefined;\n\n private readonly scrollThreshold: number;\n\n private readonly flipperNextLabel: string = 'next';\n\n private readonly flipperPrevLabel: string = 'prev';\n\n constructor(props: ISingleSlideCarouselProps) {\n super(props);\n this._nextSlide = this._nextSlide.bind(this);\n this._previousSlide = this._previousSlide.bind(this);\n this._handleTouchStart = this._handleTouchStart.bind(this);\n this._handleTouchEnd = this._handleTouchEnd.bind(this);\n this._onFocus = this._onFocus.bind(this);\n this._onResized = this._onResized.bind(this);\n this.state = { showPrevious: false, showNext: false, offset: 0 };\n this.ref = React.createRef();\n this.slideRef = React.createRef();\n this.itemRef = React.createRef();\n this.direction = 'left';\n this.id = props.parentId || '';\n this.scrollThreshold = this.props.touchScrollThreshold !== undefined ? this.props.touchScrollThreshold : 100;\n }\n\n public componentDidUpdate(): void {\n this.carousel = this.ref.current!;\n this.slide = this.slideRef.current!;\n this.item = this.itemRef.current!;\n this._setSizes();\n this._updateFlippers(this.state.offset);\n }\n\n public componentDidMount(): void {\n this.direction = this.props.vertical ? 'top' : 'left';\n this.carousel = this.ref.current!;\n this.slide = this.slideRef.current!;\n this.item = this.itemRef.current!;\n this._setSizes();\n this.resizeThrottledEventHandler = window && addThrottledEvent(window, 'resize', this._onResized as EventListener);\n this._updateFlippers(0);\n }\n\n public componentWillUnmount(): void {\n window && window.removeEventListener('resize', this.resizeThrottledEventHandler!, false);\n }\n\n public render(): JSX.Element {\n const isVert: boolean = this.props.vertical === true;\n const slidePositionStyle = {} as React.CSSProperties;\n const modifiedChildren = this._getClonedChildren(isVert);\n slidePositionStyle[this.direction] = `${this.state.offset}px`;\n const carouselClass = isVert ? 'msc-ss-carousel-vert' : 'msc-ss-carousel';\n const carouselSlideClass = isVert ? 'msc-ss-carousel-vert-slide' : 'msc-ss-carousel-slide';\n const overflowClass = isVert ? 'msc-ss-carousel-vert-strip' : 'msc-ss-carousel-strip';\n const previousFlipperGlyph = isVert ? 'msi-chevron-up' : 'msi-chevron-left';\n const nextFlipperGlyph = isVert ? 'msi-chevron-down' : 'msi-chevron-right';\n const previousFlipperClassName = isVert ? 'msc-ss-carousel-vert__flipper' : 'msc-ss-carousel__flipper';\n const nextFlipperClassName = isVert\n ? 'msc-ss-carousel-vert__flipper msc-ss-carousel-vert__flipper--next'\n : 'msc-ss-carousel__flipper msc-ss-carousel__flipper--next';\n const disableClassName = !this.state.showPrevious || !this.state.showNext ? 'disabled' : null;\n return (\n
\n 0)}\n telemetryContent={this.props.telemetryContent}\n telemetryLabel={this.flipperPrevLabel}\n />\n 0)}\n telemetryContent={this.props.telemetryContent}\n telemetryLabel={this.flipperNextLabel}\n />\n
\n \n {modifiedChildren}\n \n
\n
\n );\n }\n\n private _getClonedChildren(isVert: boolean): React.DetailedReactHTMLElement, HTMLElement>[] {\n return React.Children.map(this.props.children, (child: React.ReactNode, index: number) => {\n const castChild = (child as React.ReactChild) as React.ReactElement;\n if (index === 1) {\n return React.cloneElement(castChild, {\n className: `${isVert ? SingleSlideCarousel.verticalItemsSelector : SingleSlideCarousel.itemsSelector} ${\n castChild.props.className\n }`,\n\n // @ts-expect-error\n ref: this.itemRef,\n onFocus: this._onFocus\n });\n }\n return React.cloneElement(castChild, {\n className: `${isVert ? SingleSlideCarousel.verticalItemsSelector : SingleSlideCarousel.itemsSelector} ${\n castChild.props.className\n }`,\n\n // @ts-expect-error\n onFocus: this._onFocus\n });\n });\n }\n\n private _nextSlide(): void {\n this._moveSingleSlide(true);\n }\n\n private _previousSlide(): void {\n this._moveSingleSlide(false);\n }\n\n private _handleTouchStart(evt: React.TouchEvent): void {\n if (evt.touches.length === 0) {\n this.scrollStart = undefined;\n } else {\n this.scrollStart = this.props.vertical === true ? evt.touches[0].screenY : evt.touches[0].screenX;\n }\n }\n\n private _handleTouchEnd(evt: React.TouchEvent): void {\n if (evt.changedTouches.length > 0 && this.scrollStart !== undefined) {\n const newTarget: number = this.props.vertical === true ? evt.changedTouches[0].screenY : evt.changedTouches[0].screenX;\n\n const delta = newTarget - this.scrollStart;\n\n if (delta > this.scrollThreshold) {\n this._previousSlide();\n }\n\n if (delta < -this.scrollThreshold) {\n this._nextSlide();\n }\n }\n\n this.scrollStart = undefined;\n\n return;\n }\n\n private _moveSingleSlide(next: boolean): void {\n let currentOffset = Number.parseInt(getCSS(this.slide!, this.direction), 10);\n const carouselSize = this.carouselSize;\n let maxScrollCount = Math.floor(carouselSize / this.itemSize);\n const directionModifier = next ? -1 : 1;\n currentOffset = !isNaN(currentOffset) && typeof currentOffset === 'number' ? currentOffset : 0;\n\n if (maxScrollCount === 0) {\n maxScrollCount = 1;\n }\n\n maxScrollCount = carouselSize % this.itemSize === 0 ? maxScrollCount - 1 : maxScrollCount;\n maxScrollCount = Math.max(maxScrollCount, 1);\n const maxScrollDistance = maxScrollCount * this.itemSize;\n let distanceToEdge = next ? this.slideSize - carouselSize + currentOffset : Math.abs(currentOffset);\n distanceToEdge = Math.max(0, distanceToEdge);\n\n const offset =\n maxScrollDistance <= distanceToEdge\n ? maxScrollDistance * directionModifier + currentOffset\n : distanceToEdge * directionModifier + currentOffset;\n\n this._updateFlippers(offset);\n }\n\n private _setSizes(): void {\n const item = this.item;\n if (item) {\n this.itemSize = this.props.vertical ? item.scrollHeight : item.scrollWidth;\n } else {\n this.itemSize = 0;\n }\n\n this.carouselSize = this._calculateCarouselSize();\n this.slideSize = this.slide ? (this.props.vertical ? this.slide.scrollHeight : this.slide.scrollWidth) : 0;\n }\n\n private _calculateCarouselSize(): number {\n if (!this.carousel) {\n return 0;\n }\n\n const carouselStyle = getComputedStyle(this.carousel);\n\n const padding = this.props.vertical\n ? Number.parseFloat(carouselStyle.paddingTop || '') + Number.parseFloat(carouselStyle.paddingBottom || '')\n : Number.parseFloat(carouselStyle.paddingLeft || '') + Number.parseFloat(carouselStyle.paddingRight || '');\n\n return this.props.vertical ? this.carousel.clientHeight - padding : this.carousel.clientWidth - padding;\n }\n\n private _canScrollPrevious(offset: number): boolean {\n return !isNaN(offset) && offset !== 0;\n }\n\n private _canScrollNext(offset: number): boolean {\n if (this.carouselSize + Math.abs(offset) >= this.slideSize) {\n return false;\n }\n\n return true;\n }\n\n private _updateFlippers(offset: number): void {\n this.setState({\n showPrevious: this._canScrollPrevious(offset),\n showNext: this._canScrollNext(offset),\n offset\n });\n }\n\n private _scrollItemIntoView(item: HTMLElement): void {\n const carouselSize = this.carouselSize;\n let offset = this.props.vertical ? item.offsetTop : item.offsetLeft;\n let updateOffset = false;\n\n const left = Number.parseInt(getCSS(this.slide!, 'left'), 10) || 0;\n const top = Number.parseInt(getCSS(this.slide!, 'top'), 10) || 0;\n\n if (this.props.vertical) {\n if (top < 0 && -top > offset) {\n if (offset !== 0) {\n offset = -offset + 1;\n }\n updateOffset = true;\n } else if (top + offset > carouselSize - this.itemSize) {\n offset = carouselSize - this.itemSize - offset - 1;\n updateOffset = true;\n }\n } else if (this.direction === 'left') {\n if (left < 0 && -left > offset) {\n if (offset !== 0) {\n offset = -offset + 1;\n }\n updateOffset = true;\n } else if (left + offset > carouselSize - this.itemSize) {\n offset = carouselSize - this.itemSize - offset + 19;\n updateOffset = true;\n }\n }\n\n if (updateOffset) {\n this._updateFlippers(offset);\n\n if (this.props.vertical) {\n setTimeout(() => {\n (this.slide as Node).parentElement!.scrollTop = 0;\n }, 0);\n } else {\n setTimeout(() => {\n (this.slide as Node).parentElement!.scrollLeft = 0;\n }, 0);\n }\n }\n }\n\n private _onFocus(event: React.FocusEvent): void {\n const target = event.currentTarget as HTMLElement;\n this._scrollItemIntoView(target);\n }\n\n private _onCarouselResized(): void {\n this._setSizes();\n let offset = Number.parseInt(getCSS(this.slide!, this.direction), 10);\n\n // Ensure the carousel slide fits across the entire alotted space\n if (!isNaN(offset) && offset < 0 && this.slideSize + offset < this.carouselSize) {\n offset = Math.min(0, this.carouselSize - this.slideSize);\n }\n\n this._updateFlippers(offset);\n }\n\n private readonly _onResized = (): void => {\n this._onCarouselResized();\n };\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport * as React from 'react';\n\nimport { UncontrolledTooltip } from '..';\nimport { ISliderThumbProps } from './SliderThumb.props';\n\n/**\n * Sliderthumb - This is a sliderthumb component this component which is\n * used to control the slider thumb.\n */\nexport default class SliderThumb extends React.PureComponent {\n public static defaultProps: Partial = {\n showTooltip: true,\n showToolTipOnTab: false,\n tooltip: {\n placement: 'top'\n }\n };\n\n public sliderButtonRef: React.RefObject = React.createRef();\n\n public render(): JSX.Element {\n const sliderThumbBaseClass = 'slider__thumb ';\n const sliderThumbClass = this.props.trackThumbClass\n ? `${sliderThumbBaseClass} ${this.props.trackThumbClass}`\n : sliderThumbBaseClass;\n\n return (\n <>\n \n {this.props.showTooltip && (\n \n {this.props.handleTooltipText\n ? this.props.handleTooltipText(this.props.sliderValue!)\n : this.props.sliderValue!.toString()}\n \n )}\n \n );\n }\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport MsDyn365, { IRequestContext } from '@msdyn365-commerce/core';\nimport classnames from 'classnames';\nimport * as React from 'react';\n\nimport { format, isMobile, Progress, VariantType } from '..';\nimport { clamp, toUpperCaseFirstChar } from '../common/utilities';\nimport { ISliderChangeNotification, ISliderLabel, ISliderProps, ISliderThumbProps } from './Slider.props';\nimport SliderThumb from './SliderThumb';\n\n// This maintains the min and max values for the 2 thumbs\nexport interface ISliderState {\n sliderThumbs: ISliderThumbProps[];\n limit: number;\n grab: number;\n active: boolean;\n id: string;\n showToolTipOnTab?: boolean;\n}\n\nconst orientations = {\n horizontal: {\n dimension: 'width',\n direction: 'left',\n coordinate: 'x'\n },\n vertical: {\n dimension: 'height',\n direction: 'top',\n coordinate: 'y'\n }\n};\n\ninterface IFillCoordinates {\n fill: number;\n handle: number;\n label: number;\n}\n\nenum EventType {\n Start,\n End,\n Change\n}\n\nconst rangeDefaultChkValue = 0;\n\n/**\n * Slider - This is a slider component this component morphs into a range slider\n * based on flags.\n */\n\nexport default class Slider extends React.Component {\n public static defaultProps: Partial = {\n showTooltip: true,\n inForm: false,\n orientation: 'horizontal',\n min: 0,\n max: 100,\n step: 1,\n sliderThumbs: [{ id: 'slider_thumb_id', value: 50 }]\n };\n\n private static readonly sliderBaseClass: string = 'slider';\n\n public isRangeSlider: boolean;\n\n private readonly ref: React.RefObject = React.createRef();\n\n private readonly thumb1Ref: React.RefObject = React.createRef();\n\n private readonly thumb2Ref: React.RefObject = React.createRef();\n\n public static getDerivedStateFromProps(props: ISliderProps, state: ISliderState): ISliderState | null {\n if (\n (props.sliderThumbs.length > 0 && props.sliderThumbs[0].value !== state.sliderThumbs[0].value) ||\n (props.sliderThumbs.length > 1 && props.sliderThumbs[1].value !== state.sliderThumbs[1].value)\n ) {\n const nextState = { ...state };\n nextState.sliderThumbs[0].value = props.sliderThumbs[0].value;\n if (props.sliderThumbs.length > 1) {\n nextState.sliderThumbs[1].value = props.sliderThumbs[1].value;\n }\n return nextState;\n }\n return null;\n }\n\n constructor(props: ISliderProps) {\n super(props);\n this.isRangeSlider = this.props.sliderThumbs.length === 2;\n this.state = {\n sliderThumbs: this.props.sliderThumbs,\n grab: 0,\n limit: 0,\n active: false,\n id: '',\n showToolTipOnTab: false\n };\n this._handleUpdate = this._handleUpdate.bind(this);\n this._handleDrag = this._handleDrag.bind(this);\n this._handleEnd = this._handleEnd.bind(this);\n this._handleStart = this._handleStart.bind(this);\n this.toggle = this.toggle.bind(this);\n this._handleOnChange = this._handleOnChange.bind(this);\n this._setSliderValue = this._setSliderValue.bind(this);\n this._getThumbFromProps = this._getThumbFromProps.bind(this);\n this._publishNotification = this._publishNotification.bind(this);\n this._getThumbAndPublishEvent = this._getThumbAndPublishEvent.bind(this);\n this._willThumbsCrossOver = this._willThumbsCrossOver.bind(this);\n this._handleOnClick = this._handleOnClick.bind(this);\n if (\n MsDyn365.isBrowser &&\n document.body.parentElement &&\n document.body.parentElement.getAttribute('dir') === 'rtl' &&\n (this.props.shouldSliderAdjustToRTL === undefined || this.props.shouldSliderAdjustToRTL)\n ) {\n orientations.horizontal.direction = 'right';\n }\n }\n\n public componentDidMount(): void {\n this._handleUpdate();\n MsDyn365.isBrowser && window.addEventListener('resize', this._handleUpdate);\n }\n\n public componentDidUpdate(): void {\n if (this.ref.current && this.ref.current.offsetWidth > rangeDefaultChkValue && this.state.limit === rangeDefaultChkValue) {\n this._handleUpdate();\n }\n }\n\n public toggle = (): void => {\n this.setState((_prevState: ISliderState) => {\n return { showToolTipOnTab: !_prevState.showToolTipOnTab };\n });\n };\n\n public shouldComponentUpdate(nextProps: ISliderProps, _nextState: ISliderState): boolean {\n let shouldRender = true;\n if (this.isRangeSlider) {\n const thumb1Position = this._getPositionFromValue(nextProps.sliderThumbs[0].value);\n const thumb2Position = this._getPositionFromValue(nextProps.sliderThumbs[1].value);\n\n /**\n * During first render the second thumb isn't positioned since handleUpdate positions it after it's mounted\n * in the componentDidMount method. This check is to make sure that the first render happens correctly and then\n * for all subsequent renders and updates, the thumb2 position cannot be 0 thanks to this condition.\n */\n shouldRender = thumb2Position > 0 ? thumb2Position >= thumb1Position + nextProps.step : true;\n }\n return shouldRender;\n }\n\n public componentWillUnmount(): void {\n window.removeEventListener('resize', this._handleUpdate);\n }\n\n public render(): JSX.Element {\n const { orientation } = this.props;\n const sliderClass = this.props.className\n ? `${Slider.sliderBaseClass} slider-${orientation} ${this.props.className}`\n : `${Slider.sliderBaseClass} slider-${orientation}`;\n\n const sliderId = this.props.id;\n const dimension = orientations[orientation].dimension;\n const direction = orientations[orientation].direction;\n const camelCasedDirection = toUpperCaseFirstChar(direction);\n const positionThumb1 = this._getPositionFromValue(this.props.sliderThumbs[0].value);\n const coordsThumb1 = this._coordinates(positionThumb1);\n let fillStyle = { [dimension]: `${coordsThumb1.fill}px` };\n const handleStyle: React.CSSProperties[] = [];\n handleStyle.push({ [direction]: `${coordsThumb1.handle}px` });\n const trackProgressClass = classnames('progress-bar', this.props.trackProgressClass ? this.props.trackProgressClass : '');\n const sliderKey = this.props.sliderKey ? `_${String(this.props.sliderKey)}` : '';\n\n if (this.isRangeSlider) {\n const positionThumb2 = this._getPositionFromValue(this.props.sliderThumbs[1].value);\n const coordsThumb2 = this._coordinates(positionThumb2);\n handleStyle.push({ [direction]: `${coordsThumb2.handle}px` });\n if (orientation === 'vertical') {\n fillStyle = {\n marginBottom: `${coordsThumb1.fill}px`,\n [dimension]: `${coordsThumb2.fill - coordsThumb1.fill}px`\n };\n } else {\n fillStyle = {\n [`margin${camelCasedDirection}`]: `${\n orientations.horizontal.direction === 'right' ? coordsThumb1.fill - this.state.grab : coordsThumb1.fill\n }px`,\n [dimension]: `${coordsThumb2.handle - coordsThumb1.handle}px`\n };\n }\n }\n\n return (\n
\n
\n {this.props.showProgressBar && (\n \n )}\n
\n {this._renderSliderThumbs(handleStyle)}\n
\n {this.props.showLabels ? this._renderLabels(this.props.labels!) : null}\n
\n );\n }\n\n private readonly _renderLabels = (labels: ISliderLabel[]): JSX.Element => {\n return (\n
\n {labels.map((label: ISliderLabel) => {\n return (\n
\n {label.labelString}\n
\n );\n })}\n
\n );\n };\n\n private readonly _renderSliderThumbs = (thumbStyles: React.CSSProperties[]): React.ReactFragment | JSX.Element | null => {\n // eslint-disable-next-line @typescript-eslint/consistent-type-assertions -- Added gridsetting values.\n const context = {\n gridSettings: {\n xs: { w: 767 },\n sm: { w: 991 },\n md: { w: 1199 },\n lg: { w: 1599 },\n xl: { w: 1600 }\n }\n } as IRequestContext;\n\n const isMobileCheck = isMobile({ variant: VariantType.Browser, context });\n const isMobileView = isMobileCheck === 'xs' || isMobileCheck === 'sm';\n\n const sliderAriaLabelMin = format('{0} {1}', this.props.sliderThumbs[0].ariaLabel, this.state.sliderThumbs[0].value);\n\n const sliderAriaLabelMax = this.isRangeSlider\n ? format('{0} {1}', this.props.sliderThumbs[1].ariaLabel, this.state.sliderThumbs[1].value)\n : '';\n return (\n <>\n {\n this.setState({\n showToolTipOnTab: false\n });\n this.props.onBlur && this.props.onBlur();\n }}\n onKeyDown={() => {\n this.setState({\n showToolTipOnTab: true\n });\n }}\n onFocus={() => {\n this.setState({\n showToolTipOnTab: true\n });\n }}\n tabIndex={0}\n style={thumbStyles[0]}\n aria-valuenow={isMobileView ? undefined : this.state.sliderThumbs[0].value}\n />\n {' '}\n {this.isRangeSlider && (\n <>\n \n \n \n )}\n \n );\n };\n\n private readonly _handleUpdate = (): void => {\n const { orientation } = this.props;\n const dimensionStr = toUpperCaseFirstChar(orientations[orientation].dimension);\n\n // To get the offsetWidth and offsetHeight of the slider element\n const sliderPos = this.ref.current![`offset${dimensionStr}`];\n const handlePos = this.thumb1Ref.current!.sliderButtonRef.current![`offset${dimensionStr}`];\n\n if (handlePos !== 0) {\n this.setState({\n limit: sliderPos - handlePos,\n grab: orientations.horizontal.direction === 'right' ? -handlePos / 2 : handlePos / 2\n });\n }\n };\n\n private readonly _handleStart = (e: React.TouchEvent | React.KeyboardEvent | React.MouseEvent): void => {\n e.stopPropagation();\n const eventType = e.type;\n document.addEventListener('mousemove', (this._handleDrag as unknown) as EventListener);\n document.addEventListener('mouseup', (this._handleEnd as unknown) as EventListener);\n const castTarget = e.target as HTMLElement;\n const thumbid = castTarget && castTarget.id;\n this.setState(\n (_prevState: ISliderState) => {\n return { active: true, id: thumbid };\n },\n () => {\n this._getThumbAndPublishEvent(castTarget, EventType.Start, eventType);\n }\n );\n };\n\n private _handleEnd(e: React.KeyboardEvent | React.MouseEvent | React.TouchEvent): void {\n e.stopPropagation();\n const eventType = e.type;\n const castTarget = e.target as HTMLElement;\n this.setState(\n (_prevState: ISliderState) => {\n return { active: false, id: '' };\n },\n () => {\n this._getThumbAndPublishEvent(castTarget, EventType.End, eventType);\n }\n );\n document.removeEventListener('mousemove', (this._handleDrag as unknown) as EventListener);\n document.removeEventListener('mouseup', (this._handleEnd as unknown) as EventListener);\n }\n\n private _handleDrag(e: React.MouseEvent | React.TouchEvent): void {\n e.stopPropagation();\n const value = this._position(e);\n const eventType = e.type;\n const castThumb = e.target as HTMLElement;\n const thumbId = this.state.id || (castThumb && castThumb.id);\n const thumbPressed = this._getThumbFromProps(thumbId);\n\n if (thumbPressed && !this._willThumbsCrossOver(thumbPressed[0], e)) {\n thumbPressed[0].value = value;\n this._setSliderValue(thumbPressed, castThumb, eventType);\n }\n }\n\n private _handleOnClick(e: React.MouseEvent | React.TouchEvent): void {\n e.stopPropagation();\n const position = this._position(e);\n const castThumb = e.target as HTMLElement;\n const eventType = e.type;\n const thumb1 = this._getThumbFromProps(this.props.sliderThumbs[0].id);\n\n if (this.isRangeSlider) {\n const thumb2 = this._getThumbFromProps(this.props.sliderThumbs[1].id);\n\n if (thumb1 && thumb2) {\n const currentMinValue = thumb1[0].value;\n const currentMaxValue = thumb2[0].value;\n const lengthToMinValue = position - currentMinValue;\n const lengthToMaxValue = currentMaxValue - position;\n\n if (lengthToMinValue < lengthToMaxValue) {\n thumb1[0].value = position;\n } else {\n thumb2[0].value = position;\n }\n\n this.setState(\n (_prevState: ISliderState) => {\n return { sliderThumbs: [thumb1[0], thumb2[0]] };\n },\n () => {\n this._getThumbAndPublishEvent(castThumb, EventType.Change, eventType);\n }\n );\n }\n } else if (thumb1) {\n thumb1[0].value = position;\n this.setState(\n (_prevState: ISliderState) => {\n return { sliderThumbs: thumb1 };\n },\n () => {\n this._getThumbAndPublishEvent(castThumb, EventType.Change, eventType);\n }\n );\n }\n }\n\n private readonly _position = (e: React.KeyboardEvent | React.MouseEvent | React.TouchEvent): number => {\n const { grab } = this.state;\n const { orientation } = this.props;\n const castEvent = (e as unknown) as TouchEvent;\n const node = this.ref;\n const coordinateStyle = toUpperCaseFirstChar(orientations[orientation].coordinate);\n const directionStyle = orientations[orientation].direction;\n\n // String conversion to the right property value\n const clientCoordinateStyle = `client${coordinateStyle}`;\n const coordinate = !castEvent.touches ? e[clientCoordinateStyle] : castEvent.touches[0][clientCoordinateStyle];\n const direction = node.current!.getBoundingClientRect()[directionStyle];\n const pos = orientations.horizontal.direction === 'right' ? direction - coordinate - grab : coordinate - direction - grab;\n return this._getValueFromPosition(pos);\n };\n\n private readonly _getPositionFromValue = (value: number): number => {\n const { limit } = this.state;\n const { min, max } = this.props;\n const diffMaxMin = max - min;\n const diffValMin = value - min;\n const percentage = diffValMin / diffMaxMin;\n return Math.round(percentage * limit);\n };\n\n /**\n * Translate position of slider to slider value.\n * @param {number} pos - Current position/coordinates of slider.\n * @returns {number} Value - Slider value.\n */\n private readonly _getValueFromPosition = (pos: number): number => {\n const { limit } = this.state;\n const { orientation, min, max, step } = this.props;\n\n const percentage = clamp(pos, 0, limit) / (limit || 1);\n const baseVal = step * Math.round((percentage * (max - min)) / step);\n const value = orientation === 'horizontal' ? baseVal + min : max - baseVal;\n\n return clamp(value, min, max);\n };\n\n /**\n * Grab coordinates of slider.\n * @param {Object} pos - Position object.\n * @returns {Object} - Slider fill/handle coordinates.\n */\n private readonly _coordinates = (pos: number): IFillCoordinates => {\n const { limit, grab } = this.state;\n const { orientation } = this.props;\n const value = this._getValueFromPosition(pos);\n const position = this._getPositionFromValue(value);\n const handlePos = orientation === 'horizontal' ? position + grab : position;\n const fillPos = orientation === 'horizontal' ? handlePos : limit - handlePos;\n\n return {\n fill: fillPos,\n handle: handlePos,\n label: handlePos\n };\n };\n\n private _handleOnChange(e: React.ChangeEvent): void {\n e.stopPropagation();\n const castTarget = e.target as HTMLInputElement;\n const thumbInteractedWith = castTarget && this._getThumbFromProps(castTarget.id.replace('range', ''));\n const eventType = e.type;\n thumbInteractedWith![0].value = Number.parseInt(e.target.value, 10);\n this._setSliderValue(thumbInteractedWith!, castTarget, eventType);\n }\n\n private readonly _setSliderValue = (sliderThumb: ISliderThumbProps[], castTarget: HTMLElement, eventType: string): void => {\n if (this.isRangeSlider) {\n if (this.props.sliderThumbs[0].value > this.props.sliderThumbs[1].value) {\n this.props.sliderThumbs[0].value = this.props.sliderThumbs[1].value;\n }\n this.setState(\n (_prevState: ISliderState) => {\n return {\n sliderThumbs: { ...this.props.sliderThumbs }\n };\n },\n () => {\n this._getThumbAndPublishEvent(castTarget, EventType.Change, eventType);\n }\n );\n } else {\n this.setState(\n (_prevState: ISliderState) => {\n return {\n sliderThumbs: sliderThumb\n };\n },\n () => {\n this._getThumbAndPublishEvent(castTarget, EventType.Change, eventType);\n }\n );\n }\n };\n\n private _getThumbFromProps(thumbId: string): ISliderThumbProps[] | null {\n let thumbFound;\n\n thumbFound = this.props.sliderThumbs.filter((thumb: ISliderThumbProps) => {\n return thumb.id === thumbId;\n });\n\n return thumbFound.length > 0 ? thumbFound : null;\n }\n\n private readonly _publishNotification = (\n thumb: ISliderThumbProps | null,\n delegate: (sliderNotification: Readonly) => void,\n eventType: string\n ): void => {\n delegate({\n id: (thumb && thumb.id) || '',\n slider: this,\n firstThumbValue: this.state.sliderThumbs[0].value,\n secondThumbValue: (this.state.sliderThumbs[1] && this.state.sliderThumbs[1].value) || Number.NaN,\n eventType\n });\n };\n\n private readonly _getThumbAndPublishEvent = (element: HTMLElement, eventType: EventType, nativeEventType: string): void => {\n let elmenentId = '';\n if (element && element.id && eventType === EventType.Change) {\n elmenentId = element.id.replace('range', '');\n }\n const thumb = element && this._getThumbFromProps(elmenentId);\n\n if (eventType === EventType.End) {\n if (this.props.onChangeEnd) {\n this._publishNotification(thumb && thumb[0], this.props.onChangeEnd, nativeEventType);\n }\n }\n if (eventType === EventType.Start) {\n if (this.props.onChangeStart) {\n this._publishNotification(thumb && thumb[0], this.props.onChangeStart, nativeEventType);\n }\n }\n if (eventType === EventType.Change) {\n if (this.props.onChange) {\n this._publishNotification(thumb && thumb[0], this.props.onChange, nativeEventType);\n }\n }\n };\n\n private _willThumbsCrossOver(\n thumbPressed: ISliderThumbProps,\n event: React.KeyboardEvent | React.MouseEvent | React.TouchEvent\n ): boolean {\n if (!this.isRangeSlider) {\n return false;\n }\n let keycode = 0;\n let checkCondition = false;\n\n if (event.type === 'keydown') {\n const castEvent = (event as unknown) as KeyboardEvent;\n keycode = castEvent.keyCode;\n if (\n (thumbPressed === this.props.sliderThumbs[1] && (keycode === 38 || keycode === 39)) ||\n (thumbPressed === this.props.sliderThumbs[0] && (keycode === 37 || keycode === 40))\n ) {\n return false;\n }\n checkCondition = true;\n }\n if (event.type === 'touchmove' || event.type === 'mousemove' || event.type === 'click') {\n const value = this._position(event);\n if (\n (this.state.sliderThumbs[1].value < value && thumbPressed.id === this.props.sliderThumbs[1].id) ||\n (this.state.sliderThumbs[0].value > value && thumbPressed.id === this.props.sliderThumbs[0].id)\n ) {\n return false;\n }\n checkCondition = true;\n }\n\n return !(checkCondition && this.props.sliderThumbs[1].value - this.props.step * 2 >= this.props.sliderThumbs[0].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 '@msdyn365-commerce-modules/retail-actions';\nimport classnames from 'classnames';\nimport React from 'react';\n\nimport { Button, format, KeyCodes, Node, UncontrolledPagination } from '..';\nimport CheckBoxButton from './checkbox';\n\n/**\n * Table Resources.\n */\nexport interface ITableResources {}\n\n/**\n * Table props.\n */\nexport interface IDataTableProps {\n resources: ITableResources;\n headings: (IHeadingsProperty | undefined)[];\n rows: ITableRowProps[];\n className?: string;\n editLinkText?: string;\n actionLinkText?: string;\n deleteLinkText?: string;\n viewLinkText?: string;\n editLinkTooltip?: string;\n actionLinkTooltip?: string;\n deleteLinkTooltip?: string;\n viewLinkTooltip?: string;\n enableToModify: boolean;\n showCheckBoxes?: boolean;\n isSortable?: boolean;\n showPagination?: boolean;\n paginationProperty: IPaginationProperty;\n minifyActions?: boolean;\n minifiedButtonText?: string;\n excludedColumns?: string[]; // Filled with ITableItemProps.id of columns not to show\n isSingleSelectOnly: boolean;\n businessUserSelectCheckBoxAriaLabelText?: string;\n sortByAscending?: string;\n sortByDescending?: string;\n resourcePrefix?: string;\n actions: {\n onDelete?(userData: ITableItemProps[], referenceBack?: HTMLButtonElement | null): void | undefined;\n onEdit?(userData: ITableItemProps[], referenceBack?: HTMLButtonElement | null): void | undefined;\n onView?(userData: ITableItemProps[]): void | undefined;\n };\n checkBoxCallback?(records: ITableRowProps[]): void;\n formatPrice?(price: number): string;\n tableAriaLabel?: string;\n tableTabIndex?: number;\n}\n\n/**\n * Table IPaginationProperty props.\n */\nexport interface IPaginationProperty {\n itemPerPage: number;\n skipCount: number;\n prevText: string;\n nextText: string;\n paginationText: string;\n url: string;\n}\n\n/**\n * Table ITableItemProps props.\n */\nexport interface ITableItemProps {\n id: string;\n type: TableDataType;\n value: boolean | number | string;\n className?: string;\n}\n\n/**\n * Table IButtonReferences props.\n */\nexport interface IButtonReferences {\n edit?: React.RefObject;\n delete?: React.RefObject;\n}\n\n/**\n * Table ITableRowProps props.\n */\nexport interface ITableRowProps {\n row: ITableItemProps[];\n isSelected: boolean;\n buttonReferences?: IButtonReferences;\n}\n\n/**\n * Table IDataTableCells props.\n */\ninterface IDataTableCells {\n header: boolean;\n className: string;\n content: string | number | React.ReactNode;\n cellIndex: number;\n scope: 'col' | 'row';\n colSpan?: number;\n records?: ITableRowProps;\n}\n\n/**\n * Table IHeadingsProperty props.\n */\nexport interface IHeadingsProperty {\n name: string;\n sortable: boolean;\n ariaLabel?: string;\n}\n\n/**\n * Table ITableState props.\n */\nexport interface ITableState {\n sortingKey: string;\n ascendingOrder: boolean;\n showActions: boolean;\n selectedIndex: string;\n}\n\n/**\n * Table TableDataType props.\n */\nexport enum TableDataType {\n Number = 'Number',\n Text = 'Text',\n Price = 'Price'\n}\n\nexport default class Table extends React.PureComponent {\n public componentClassName: string = 'ms-table';\n\n private readonly headingPrefix: string = 'table';\n\n private readonly capitalizeHeadingPrefix: string = 'Table';\n\n constructor(props: IDataTableProps) {\n super(props);\n this.state = {\n ascendingOrder: true,\n sortingKey: (props.headings[0] && props.headings[0].name) || '',\n showActions: props.minifyActions !== undefined ? !props.minifyActions : true,\n selectedIndex: ''\n };\n }\n\n public render(): JSX.Element {\n const { className, headings, rows, isSortable, showPagination, paginationProperty, tableAriaLabel, tableTabIndex } = this.props;\n const { sortingKey, ascendingOrder } = this.state;\n\n const classname = classnames(this.componentClassName, className);\n let tableRows = isSortable && sortingKey ? this._sortTableRow(rows, sortingKey, ascendingOrder) : rows;\n let paginationLinks = null;\n\n if (showPagination) {\n const { skipCount, itemPerPage, nextText, prevText, paginationText, url } = paginationProperty;\n\n paginationLinks = (\n \n );\n\n tableRows = this._getCurrentPageData(tableRows, skipCount, skipCount + itemPerPage);\n }\n\n const tableBody = this._renderRow(tableRows);\n const tableHead = this._renderHeadingRow(headings);\n\n return (\n
\n \n {tableHead}\n {tableBody}\n
\n {paginationLinks}\n
\n );\n }\n\n /**\n * Set sorting key.\n * @param event -The mouse event.\n */\n private readonly _selectSortingKey = (event: React.MouseEvent | React.KeyboardEvent) => {\n const target = event.target as HTMLElement;\n const columnName = target.getAttribute('data-sort-name') ? (target.getAttribute('data-sort-name') as string) : '';\n const { sortingKey, ascendingOrder } = this.state;\n let newOrder = true;\n\n if (sortingKey === columnName) {\n newOrder = !ascendingOrder;\n }\n\n this.setState({\n sortingKey: columnName,\n ascendingOrder: newOrder,\n showActions: false\n });\n };\n\n /**\n * Checkbox change.\n * @param rows -Table rows.\n * @param checkBoxCallback -Checkboxcallback function.\n * @param index -Index value for row.\n * @returns Checkbox rows.\n */\n private readonly _onCheckBoxChangeHandler = (\n rows: ITableRowProps[],\n checkBoxCallback: (records: ITableRowProps[]) => void,\n index?: number\n ) => () => {\n if (ObjectExtensions.isNumber(index)) {\n rows[index].isSelected = !rows[index].isSelected;\n }\n checkBoxCallback(rows);\n };\n\n private readonly _renderHeadingRow = (columnData: (IHeadingsProperty | undefined)[]) => {\n const {\n resources,\n showCheckBoxes,\n enableToModify,\n minifyActions,\n rows,\n actionLinkText,\n isSortable,\n checkBoxCallback,\n resourcePrefix,\n isSingleSelectOnly,\n businessUserSelectCheckBoxAriaLabelText,\n sortByAscending,\n sortByDescending\n } = this.props;\n const { sortingKey, ascendingOrder } = this.state;\n\n const sortingClassName = ascendingOrder ? 'asc' : 'dsc';\n\n const sortingValue = ascendingOrder ? sortByAscending : sortByDescending;\n\n const columns = columnData.map((data, cellIndex) => {\n if (!data) {\n return;\n }\n const counterAddition = 1;\n const updatedCellIndex = cellIndex + counterAddition;\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment -- unsafe assignment.\n const heading =\n resources[`${this.headingPrefix}${data.name}HeadingText`] ||\n resources[`${resourcePrefix!}${this.capitalizeHeadingPrefix}${data.name}HeadingText`] ||\n resources[`${data.name}HeadingText`] ||\n data.name;\n\n const columnSortValue = sortingKey === data.name && sortingValue !== undefined ? sortingValue : '';\n\n const columnAriaLabel = data.ariaLabel ? `${format(data.ariaLabel, heading)} ${columnSortValue}` : '';\n\n const content = (isSortable && data.sortable && (\n \n \n {heading}\n
\n \n )) || (\n \n {heading}\n \n );\n\n return content;\n });\n\n const radioCheckBox = showCheckBoxes && checkBoxCallback && !isSingleSelectOnly && (\n \n );\n\n const actionContent = (\n \n {minifyActions ? '' : actionLinkText}\n \n );\n\n return (\n \n {showCheckBoxes &&\n this.tableCell({\n header: true,\n className: `${this.componentClassName}__heading-row-data__checkbox checkbox`,\n content: radioCheckBox,\n cellIndex: -1,\n scope: 'col'\n })}\n {columns}\n {enableToModify &&\n this.tableCell({\n header: true,\n className: `${this.componentClassName}__heading-row-data action-links`,\n content: actionContent,\n cellIndex: 1,\n scope: 'col'\n })}\n \n );\n };\n\n private readonly _renderRow = (rows: ITableRowProps[]) => {\n const {\n enableToModify,\n showCheckBoxes,\n excludedColumns,\n actions,\n checkBoxCallback,\n formatPrice,\n isSingleSelectOnly,\n businessUserSelectCheckBoxAriaLabelText\n } = this.props;\n\n const tableRows = rows.map((rowsData, index) => {\n let className = index % 2 ? `${this.componentClassName}__row even-row` : `${this.componentClassName}__row odd-row`;\n let showActions = false;\n\n const additionalNameAriaLabel = rowsData.row[0].value.toString();\n const columnData = rowsData.row.map(cell => {\n if (excludedColumns && excludedColumns.includes(cell.id)) {\n return;\n }\n\n // Numbers/price data types will always be right-aligned per design standards\n const extraClass = cell.type === TableDataType.Number || cell.type === TableDataType.Price ? 'num-type' : '';\n const cellContent = cell.type === TableDataType.Price && formatPrice ? formatPrice(cell.value as number) : cell.value;\n const columnSpecificClass = cell.className || '';\n return this.tableCell({\n header: false,\n className: classnames(`${this.componentClassName}__row-data`, extraClass, columnSpecificClass),\n content: cellContent,\n cellIndex: index,\n scope: 'row'\n });\n });\n\n const radioCheckBox = showCheckBoxes && checkBoxCallback && (\n \n );\n const rowKey = `row-${index}`;\n\n if (rowKey === this.state.selectedIndex && this.state.showActions) {\n className += ' selected';\n showActions = true;\n }\n\n const actionButtons = actions && this._renderActions(rowsData.row, showActions, rowKey, rowsData.buttonReferences);\n\n return (\n \n {showCheckBoxes &&\n this.tableCell({\n header: false,\n className: `${this.componentClassName}__row-data`,\n content: radioCheckBox,\n cellIndex: index,\n scope: 'row',\n records: rowsData\n })}\n {columnData}\n {enableToModify &&\n this.tableCell({\n header: false,\n className: `${this.componentClassName}__row-data`,\n content: actionButtons,\n cellIndex: index,\n scope: 'row',\n records: rowsData\n })}\n \n );\n });\n\n return tableRows;\n };\n\n private readonly _renderActions = (\n data: ITableItemProps[],\n showActions: boolean,\n key: string,\n buttonReference?: IButtonReferences\n ): React.ReactNode => {\n const {\n editLinkText,\n deleteLinkText,\n viewLinkText,\n editLinkTooltip,\n deleteLinkTooltip,\n viewLinkTooltip,\n actionLinkTooltip,\n minifyActions,\n minifiedButtonText,\n actionLinkText,\n actions: { onEdit, onDelete, onView }\n } = this.props;\n const handleClickEdit =\n onEdit !== undefined\n ? () => {\n onEdit(data, buttonReference?.edit?.current);\n }\n : undefined;\n const handleClickDelete =\n onDelete !== undefined\n ? () => {\n onDelete(data, buttonReference?.delete?.current);\n }\n : undefined;\n const handleClickView =\n onView !== undefined\n ? () => {\n onView(data);\n }\n : undefined;\n\n const actionButtons = (\n \n {handleClickView && (\n \n )}\n {handleClickEdit && (\n \n {editLinkText}\n \n )}\n {handleClickDelete && (\n \n {deleteLinkText}\n \n )}\n \n );\n\n if (minifyActions) {\n return (\n \n \n {minifiedButtonText ? minifiedButtonText : ''}\n \n {showActions && actionButtons}\n \n );\n }\n return actionButtons;\n };\n\n private readonly _toggleActions = (event: React.MouseEvent) => {\n const target = event && (event.target as HTMLElement);\n const newKey = target && target.getAttribute('data-type') ? (target.getAttribute('data-type') as string) : '';\n this.setState({\n showActions: !this.state.showActions,\n selectedIndex: newKey\n });\n };\n\n private readonly _sortTableRow = (table: ITableRowProps[], sortingkey: string, ascendingOrder: boolean): ITableRowProps[] => {\n return table.sort((userOne: ITableRowProps, userTwo: ITableRowProps) => {\n const userOneData = userOne.row.find(cell => {\n return cell.id === sortingkey;\n });\n const userTwoData = userTwo.row.find(cell => {\n return cell.id === sortingkey;\n });\n\n if (!userOneData || !userTwoData) {\n return -1;\n }\n\n if (typeof userOneData.value === 'number' && typeof userTwoData.value === 'number') {\n return ascendingOrder ? userOneData.value - userTwoData.value : userTwoData.value - userOneData.value;\n }\n\n const cleanFirst =\n (userOneData.value as string) &&\n userOneData.value\n .toString()\n .toLowerCase()\n .trim();\n const cleanSecond =\n (userOneData.value as string) &&\n userTwoData.value\n .toString()\n .toLowerCase()\n .trim();\n\n if (!cleanFirst || !cleanSecond) {\n return -1;\n }\n if (ascendingOrder) {\n return cleanFirst < cleanSecond ? -1 : 1;\n }\n return cleanFirst > cleanSecond ? -1 : 1;\n });\n };\n\n private readonly _getCurrentPageData = (tableRows: ITableRowProps[], start: number, end: number): ITableRowProps[] => {\n if (start >= end) {\n return tableRows;\n }\n\n const result = [];\n for (let i = start; i < end; i++) {\n tableRows[i] && result.push(tableRows[i]);\n }\n\n return result;\n };\n\n private readonly tableCell = (props: IDataTableCells) => {\n const { className, header, cellIndex, scope, colSpan, content } = props;\n const hiddenTabIndex = -1;\n const initialTabIndex = 0;\n return header ? (\n initialTabIndex ? initialTabIndex : hiddenTabIndex}\n >\n {content}\n \n ) : (\n \n {content}\n \n );\n };\n\n /**\n * Renders a Pagination previous text.\n * @param paginationPreviousText - Pagination previous text from resources.\n * @returns Previous text and flipper icon.\n */\n private readonly _renderPrev = (paginationPreviousText: string) => {\n return (\n
\n \n {paginationPreviousText}\n
\n );\n };\n\n /**\n * Renders a Pagination next text.\n * @param paginationNextText - Pagination next text from resources.\n * @returns Next text and flipper icon.\n */\n private readonly _renderNext = (paginationNextText: string) => {\n return (\n
\n {paginationNextText}\n \n
\n );\n };\n\n /**\n * Calls method display result.\n * @param event - Keyboard event.\n */\n private readonly _handleKeyPressPrev = (event: React.KeyboardEvent): void => {\n if (event.keyCode === KeyCodes.Enter || event.keyCode === KeyCodes.Space) {\n this._selectSortingKey(event);\n }\n };\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport * as React from 'react';\n\nimport { IWaitingProps } from './Waiting.props';\n\n/**\n * Waiting - this component is a visual indication of a pre-loader.\n */\nexport default class Waiting extends React.PureComponent {\n public static defaultProps: Partial = {\n className: 'msc-waiting-circular'\n };\n\n public render(): JSX.Element {\n const { className, ...props } = this.props;\n const watingClassName = `msc-waiting ${className}`;\n\n return
;\n }\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nexport enum KeyCodes {\n Back = 8,\n Tab = 9,\n Enter = 13,\n Shift = 16,\n Ctrl = 17,\n Alt = 18,\n Break = 19,\n CapsLock = 20,\n Escape = 27,\n Space = 32,\n PageUp = 33,\n PageDown = 34,\n End = 35,\n Home = 36,\n ArrowLeft = 37,\n ArrowUp = 38,\n ArrowRight = 39,\n ArrowDown = 40,\n Print = 44,\n Insert = 45,\n Delete = 46,\n Colon2 = 59, // Opera and Firefox\n Equals2 = 61, // Opera\n Equals3 = 107, // Firefox\n Minus2 = 109, // Opera and Firefox\n Period = 190,\n WindowsLeft = 91,\n WindowsRight = 92,\n WindowsOpera = 219, // Opera\n Menu = 93,\n NumPad0 = 96,\n NumPad1 = 97,\n NumPad2 = 98,\n NumPad3 = 99,\n NumPad4 = 100,\n NumPad5 = 101,\n NumPad6 = 102,\n NumPad7 = 103,\n NumPad8 = 104,\n NumPad9 = 105,\n NumPadMultiply = 106,\n NumPadPlus = 107,\n NumPadMinus = 109,\n NumPadDot = 110,\n NumPadDivide = 111,\n Function1 = 112,\n Function2 = 113,\n Function3 = 114,\n Function4 = 115,\n Function5 = 116,\n Function6 = 117,\n Function7 = 118,\n Function8 = 119,\n Function9 = 120,\n Function10 = 121,\n Function11 = 122,\n Function12 = 123,\n NavigationUp = 138,\n NavigationDown = 139,\n NavigationLeft = 140,\n NavigationRight = 141,\n NavigationAccept = 142,\n NumLock = 144,\n ScrollLock = 145,\n Colon = 186,\n Equals = 187,\n Comma = 188,\n Minus = 189,\n ForwardSlash = 191,\n Tilde = 192,\n GamepadA = 195,\n GamepadB = 196,\n GamepadX = 197,\n GamepadY = 198,\n GamepadRightButton = 199,\n GamepadLeftButton = 200,\n GamepadLeftTrigger = 201,\n GamepadRightTrigger = 202,\n GamepadDPadUp = 203,\n GamepadDPadDown = 204,\n GamepadDPadLeft = 205,\n GamepadDPadRight = 206,\n GamepadSelect = 207,\n GamepadStart = 208,\n GamepadLeftThumbstick = 209,\n GamepadRightThumbstick = 210,\n GamepadLeftThumbstickUp = 211,\n GamepadLeftThumbstickDown = 212,\n GamepadLeftThumbstickRight = 213,\n GamepadLeftThumbstickLeft = 214,\n GamepadRightThumbstickUp = 215,\n GamepadRightThumbstickDown = 216,\n GamepadRightThumbstickRight = 217,\n GamepadRightThumbstickLeft = 218,\n OpenBracket = 219,\n BackSlash = 220,\n CloseBracket = 221,\n Quote = 222\n}\n\n/**\n * Here for test coverage.\n */\nexport class KeycodesClass {\n public testCoverage(): string {\n return ':(';\n }\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function format(formatSpecifier: string, ...parameters: any[]): string {\n if (!formatSpecifier) {\n return '';\n }\n\n return formatSpecifier.replace(/{(\\d+)}/g, (match: string, index: number) => {\n if (index >= parameters.length) {\n return match;\n }\n\n const value = parameters[index];\n\n if (typeof value !== 'number' && !value) {\n return '';\n }\n\n if (typeof value === 'string') {\n return value;\n }\n\n return value.toString();\n });\n}\n\n/**\n * @name - isNullOrWhiteSpace\n * @description - Determines if the specified string is undefined, null, empty, or whitespace.\n * @export\n * @public\n * @param {string} value - The string to examine.\n * @returns {boolean} - True if the value is undefined, null, empty, or whitespace, otherwise false.\n */\nexport function isNullOrWhiteSpace(value: string): boolean {\n return !value || typeof value !== 'string' || !trim(value);\n}\n\n/**\n * @name - trim\n * @description - Trims leading and trailing whitespace from the string.\n * @export\n * @public\n * @param {string} value - The string to examine.\n * @returns {string} - The trimmed string.\n */\nexport function trim(value: string): string {\n // Any flavor of !value (ie. null/undefined/'') should return itself.\n if (!value || typeof value !== 'string') {\n return value;\n }\n\n if (value.trim) {\n return value.trim();\n }\n\n return value.replace(/^\\s+|\\s+$/g, '');\n}\n\n/**\n * @name - startsWith\n * @description - Determines if the specified string starts with the specified value.\n * @param ignoreCase\n * @export\n * @public\n * @param {string} value - The string to look in.\n * @param {string} prefix - The prefix to look for.\n * @returns {boolean} - True if the string starts with the prefix, otherwise false.\n */\nexport function startsWith(value: string, prefix: string, ignoreCase: boolean = true): boolean {\n if (!value || !prefix) {\n return false;\n }\n\n if (ignoreCase) {\n value = value.toLocaleLowerCase();\n prefix = prefix.toLocaleLowerCase();\n }\n\n if (value.startsWith) {\n return value.startsWith(prefix);\n }\n\n return value.startsWith(prefix);\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport classNames from 'classnames';\nimport * as React from 'react';\n\nimport { canUseDOM, getTargetElement, mapToCssModules } from '../common/utilities';\nimport PopperContent from '../popper-content/PopperContent';\nimport { IPopoverProps } from './Popover.props';\n\n/**\n * Popover component.\n */\nexport default class Popover extends React.PureComponent {\n public static defaultProps: Partial = {\n isOpen: false,\n placement: 'right',\n toggle: () => {\n return;\n }\n };\n\n public props: IPopoverProps;\n\n private target: HTMLElement | null;\n\n private popover: HTMLDivElement | null;\n\n private tabPressed: boolean = false;\n\n constructor(props: IPopoverProps) {\n super(props);\n this.props = props;\n\n this.popover = null;\n this._addTargetEvents = this._addTargetEvents.bind(this);\n this._handleDocumentClick = this._handleDocumentClick.bind(this);\n this._removeTargetEvents = this._removeTargetEvents.bind(this);\n this.getRef = this.getRef.bind(this);\n this._toggle = this._toggle.bind(this);\n this._focusOutTarget = this._focusOutTarget.bind(this);\n this._focusOutPopover = this._focusOutPopover.bind(this);\n this._keyDown = this._keyDown.bind(this);\n this._show = this._show.bind(this);\n this._hide = this._hide.bind(this);\n this.target = null;\n }\n\n public componentDidMount(): void {\n this.target = getTargetElement(this.props.target);\n this._handleProps();\n }\n\n public componentDidUpdate(): void {\n this._handleProps();\n }\n\n public componentWillUnmount(): void {\n this._removeTargetEvents();\n }\n\n public getRef(ref: HTMLDivElement | null): void {\n this.popover = ref;\n }\n\n public render(): JSX.Element | null {\n if (!this.props.isOpen) {\n return null;\n }\n\n const {\n cssModule,\n isOpen,\n target,\n placementPrefix,\n hideArrow,\n className,\n innerClassName,\n modifiers,\n placement,\n container,\n offset,\n toggle,\n boundariesElement,\n role,\n ...attributes\n } = this.props;\n\n const classes = mapToCssModules(classNames('msc-popover-inner', this.props.innerClassName), this.props.cssModule);\n\n const popperClasses = mapToCssModules(classNames('msc-popover', 'show', this.props.className), this.props.cssModule);\n\n return (\n \n
\n \n );\n }\n\n private _handleProps(): void {\n if (this.props.isOpen) {\n this._show();\n } else {\n this._hide();\n }\n }\n\n private _show(): void {\n this.tabPressed = false;\n this._addTargetEvents();\n if (!this.props.isOpen) {\n this._toggle();\n }\n }\n\n private _hide(): void {\n this._removeTargetEvents();\n if (this.props.isOpen) {\n this._toggle();\n }\n }\n\n private _handleDocumentClick(e: Event): void {\n if (!this.target) {\n return;\n }\n\n const target = e.target as HTMLElement;\n\n if (\n e.target !== this.target &&\n !this.target.contains(target) &&\n e.target !== this.popover &&\n !(this.popover && this.popover.contains(target))\n ) {\n if (this.props.isOpen) {\n this._toggle();\n }\n }\n }\n\n private _addTargetEvents(): void {\n if (!this.target) {\n return;\n }\n if (canUseDOM) {\n ['click', 'touchstart'].forEach((event: string) => {\n document.addEventListener(event, this._handleDocumentClick, true);\n });\n this.target.addEventListener('focusout', this._focusOutTarget, true);\n this.target.addEventListener('keydown', this._keyDown, true);\n }\n }\n\n private _removeTargetEvents(): void {\n if (!this.target) {\n return;\n }\n if (canUseDOM) {\n ['click', 'touchstart'].forEach((event: string) => {\n document.removeEventListener(event, this._handleDocumentClick, true);\n });\n this.target.removeEventListener('focusout', this._focusOutTarget, true);\n this.target.removeEventListener('keydown', this._keyDown, true);\n }\n }\n\n private _focusOutPopover(): void {\n setTimeout(() => {\n const nextFocus = document.activeElement;\n if (this.popover && !this.popover.contains(nextFocus)) {\n this._hide();\n }\n }, 1);\n }\n\n private _focusOutTarget(): void {\n if (this.tabPressed) {\n this.tabPressed = false;\n setTimeout(() => {\n const nextFocus = document.activeElement;\n if (this.popover && !this.popover.contains(nextFocus)) {\n this._hide();\n }\n }, 1);\n }\n }\n\n private _keyDown(e: KeyboardEvent): void {\n if (e.keyCode === 9) {\n this.tabPressed = true;\n } else if (this.props.isOpen && e.keyCode === 27 && this.props.toggle) {\n this.props.toggle();\n }\n }\n\n private _toggle(): void {\n if (this.props.disabled) {\n return;\n }\n\n if (this.props.toggle) {\n this.props.toggle();\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 { EnumExtensions } from '@msdyn365-commerce-modules/retail-actions';\nimport React from 'react';\n\nimport Button from '../button/Button';\nimport { Popover } from '../popover';\n\n/**\n * Resources for the price editor mode selection.\n */\nexport interface IPriceEditorModeSelectionResources {\n specifyAmountButtonText: string;\n payFullAmountButtonText: string;\n}\n\n/**\n * Props for the price editor mode selection.\n */\nexport interface IPriceEditorModeSelectionProps {\n className: string;\n\n resources: IPriceEditorModeSelectionResources;\n\n currentState: PriceEditorModeSelectionState;\n onStateChanged(state: PriceEditorModeSelectionState): void;\n}\n\n/**\n * Defines editor modes for the amount.\n */\nexport enum PriceEditorModeSelectionState {\n full = 0,\n partial = 1\n}\n\n/**\n * Retrieves resource value based by the given mode state.\n * @param modeState - Given state.\n * @param resources - All resources.\n * @returns Resource value for the given state.\n */\nconst getPriceEditorModeSelectionStateResources = (\n modeState: PriceEditorModeSelectionState,\n resources: IPriceEditorModeSelectionResources\n): string => {\n switch (modeState) {\n case PriceEditorModeSelectionState.full:\n return resources.payFullAmountButtonText;\n case PriceEditorModeSelectionState.partial:\n return resources.specifyAmountButtonText;\n default:\n throw new Error('Failed to retrieve resource description for unknown price editor selection state.');\n }\n};\n\n/**\n * On click functionality.\n * @param handleStateChange - Handle change state function.\n * @param modeState - New state.\n * @returns Event handler.\n */\nconst onClickHandler = (\n handleStateChange: (modeState: PriceEditorModeSelectionState) => void,\n modeState: PriceEditorModeSelectionState\n) => () => {\n handleStateChange(modeState);\n};\n\n/**\n * Renders a button that allows to update the mode to the given state.\n * @param modeState - The state to render.\n * @param resources - Resource values.\n * @param className - Element class name.\n * @param handleStateChange - Event handler to update the state.\n * @returns React node.\n */\nconst renderModeStateItem = (\n modeState: PriceEditorModeSelectionState,\n resources: IPriceEditorModeSelectionResources,\n className: string,\n handleStateChange: (modeState: PriceEditorModeSelectionState) => void\n): React.ReactNode => {\n const stateStringRepresentation = PriceEditorModeSelectionState[modeState];\n\n return (\n \n );\n};\n\n/**\n * On Toggle Popover functionality.\n * @param setPopoverState -Set popover state function.\n * @param isPopoverState -Boolean value.\n * @returns Set toggle popover state functionality.\n */\nconst togglePopoverHandler = (setPopoverState: React.Dispatch>, isPopoverState: boolean) => () => {\n setPopoverState(!isPopoverState);\n};\n\n/**\n * Price editor component which handles selection modes (for instance, full or partial amount).\n * @param props - Configuration of the component.\n * @returns React element.\n */\nexport const PriceEditorModeSelectionComponent: React.FC = (props: IPriceEditorModeSelectionProps) => {\n const popoverReference = React.createRef();\n const [isPopoverShown, setIsPopoverShown] = React.useState(false);\n\n const [modeState, setModeState] = React.useState(props.currentState);\n\n /**\n * Updates component state when a selection is changed.\n * @param clickedState - New mode state.\n */\n const onChangeMode = (clickedState: PriceEditorModeSelectionState) => {\n setModeState(clickedState);\n setIsPopoverShown(false);\n props.onStateChanged(clickedState);\n };\n\n return (\n
\n \n {getPriceEditorModeSelectionStateResources(modeState, props.resources)}\n \n \n {EnumExtensions.getEnumValues(PriceEditorModeSelectionState).map(state => {\n return renderModeStateItem(state, props.resources, props.className, onChangeMode);\n })}\n \n
\n );\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { ObjectExtensions } from '@msdyn365-commerce-modules/retail-actions';\nimport classnames from 'classnames';\nimport * as React from 'react';\n\nimport {\n IPriceEditorModeSelectionResources,\n PriceEditorModeSelectionComponent,\n PriceEditorModeSelectionState\n} from './price-editor-mode-selection';\n\n/**\n * Resources for price editor.\n */\nexport interface IPriceEditorResources extends IPriceEditorModeSelectionResources {\n priceEditorInputAriaLabel: string;\n}\n\n/**\n * The props required to render the component.\n */\nexport interface IPriceEditorProps {\n className: string;\n\n defaultAmount: number;\n\n resources: IPriceEditorResources;\n\n minimumValue?: number;\n maximumValue?: number;\n\n handleChange?(newValue: number): void;\n}\n\n/**\n * The state of the component.\n */\nexport interface IPriceEditorState {\n currentValue?: number;\n isInputFocused: boolean;\n}\n\n/**\n * Provides an input field which allows entering a price amount.\n */\nexport class PriceEditor extends React.PureComponent {\n private static readonly _precision = 2;\n\n private readonly _inputRef: React.RefObject;\n\n public constructor(props: IPriceEditorProps) {\n super(props);\n\n this._inputRef = React.createRef();\n\n let defaultValue = props.defaultAmount;\n\n if (!ObjectExtensions.isNullOrUndefined(this.props.minimumValue) && defaultValue < this.props.minimumValue) {\n defaultValue = this.props.minimumValue;\n } else if (!ObjectExtensions.isNullOrUndefined(this.props.maximumValue) && defaultValue > this.props.maximumValue) {\n defaultValue = this.props.maximumValue;\n }\n\n this.state = {\n currentValue: defaultValue,\n isInputFocused: false\n };\n }\n\n public render(): JSX.Element {\n const containerClassName = 'msc-price-editor';\n\n const hasMultipleModes = !ObjectExtensions.isNullOrUndefined(this.props.maximumValue);\n\n let mode = PriceEditorModeSelectionState.partial;\n\n if (!ObjectExtensions.isNullOrUndefined(this.props.maximumValue) && this.state.currentValue === this.props.maximumValue) {\n mode = PriceEditorModeSelectionState.full;\n }\n\n const formattedValue = this.state.currentValue?.toFixed(PriceEditor._precision) ?? '';\n const editedValue = this.state.currentValue ?? '';\n\n return (\n
\n \n {hasMultipleModes && (\n
\n \n
\n )}\n
\n );\n }\n\n /**\n * Handles input focus.\n */\n private readonly _handleInputFocus = () => {\n this.setState({ isInputFocused: true });\n };\n\n /**\n * Handles input blur.\n */\n private readonly _handleInputBlur = () => {\n this.setState({ isInputFocused: false });\n };\n\n /**\n * Handles editor mode state change.\n * @param newState - New selection mode state.\n */\n private readonly _handleEditorModeStateChange = (newState: PriceEditorModeSelectionState) => {\n if (newState === PriceEditorModeSelectionState.full) {\n this._updateAmount(this.props.maximumValue!);\n } else {\n this.setState({ currentValue: undefined });\n this._inputRef.current?.focus();\n }\n };\n\n /**\n * Update the price and calls corresponding callbacks.\n * @param newAmount - New price amount.\n */\n private readonly _updateAmount = (newAmount: number) => {\n this.setState({ currentValue: newAmount });\n\n if (this.props.handleChange) {\n this.props.handleChange(newAmount);\n }\n };\n\n /**\n * Handles value change.\n * @param event - React change event.\n */\n private readonly _handleChange = (event: React.ChangeEvent) => {\n let currentValue = Number.parseFloat(event.target.value);\n\n if (Number.isNaN(currentValue)) {\n this.setState({ currentValue: undefined });\n return;\n }\n\n currentValue = +currentValue.toFixed(PriceEditor._precision);\n\n if (!ObjectExtensions.isNullOrUndefined(this.props.minimumValue) && currentValue < this.props.minimumValue) {\n this._updateAmount(this.props.minimumValue);\n } else if (!ObjectExtensions.isNullOrUndefined(this.props.maximumValue) && currentValue > this.props.maximumValue) {\n this._updateAmount(this.props.maximumValue);\n } else {\n this._updateAmount(currentValue);\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 debounce from 'lodash/debounce';\nimport * as React from 'react';\n\nimport { IQuantityProps } from './Quantity.props';\n\ninterface IQuantityState {\n currentInput: number;\n}\n\n/**\n * Quantity Component - This component is used to allow input of quantity between a\n * range of values.\n */\n\nexport default class Quantity extends React.PureComponent {\n public static defaultProps: Partial = {\n min: 1\n };\n\n private readonly inputRef: React.RefObject = React.createRef();\n\n constructor(props: IQuantityProps) {\n super(props);\n this.state = { currentInput: props.currentCount ?? 1 };\n this._handleChange = this._handleChange.bind(this);\n }\n\n public render(): JSX.Element {\n const currentValue = this.state.currentInput;\n\n return (\n \n );\n }\n\n private _handleChange(e: React.ChangeEvent): void {\n const currentValue = Number.parseInt(e.target.value, 10);\n const minValue = this.props.min === undefined ? 1 : this.props.min;\n const inputElement =\n this.inputRef && this.inputRef.current && this.inputRef.current instanceof HTMLInputElement && this.inputRef.current;\n\n if (currentValue > this.props.max) {\n this.setState({ currentInput: this.props.max }, () => {\n debounce(() => {\n this.props.onChange && this.props.onChange(this.state.currentInput);\n }, 200)();\n });\n } else {\n this.setState({ currentInput: currentValue }, () => {\n debounce(() => {\n if (!isNaN(this.state.currentInput) && !(this.state.currentInput < minValue)) {\n this.props.onChange && this.props.onChange(this.state.currentInput);\n\n if (inputElement) {\n inputElement.setAttribute('aria-valuenow', currentValue.toString());\n inputElement.setAttribute('value', currentValue.toString());\n }\n }\n }, 200)();\n });\n }\n }\n\n private readonly _validateMin = (): void => {\n const minValue = this.props.min === undefined ? 1 : this.props.min;\n if (isNaN(this.state.currentInput) || this.state.currentInput < minValue) {\n this.setState({ currentInput: minValue }, () => {\n this.props.onChange && this.props.onChange(this.state.currentInput);\n });\n } else {\n this.props.onChange && this.props.onChange(this.state.currentInput);\n }\n };\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport * as Msdyn365 from '@msdyn365-commerce/core';\nimport * as React from 'react';\n\nimport { INodeProps } from './node';\n\nexport interface IModuleProps extends INodeProps {\n moduleProps: Msdyn365.IModule;\n}\n\nexport const Module: React.FC = React.forwardRef(\n ({ className = '', id = '', tag: Tag = 'div', moduleProps, ...restAttribute }, ref) => {\n return ;\n }\n);\n\nexport default Module;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport * as React from 'react';\n\nexport type NodeTag = React.ReactType;\n\nexport interface INodeProps {\n /* Wrapper class */\n className: string;\n\n /* Children node */\n children?: React.ReactNode;\n\n /* Wrapper Tag */\n tag?: NodeTag;\n\n /* Other attrributes */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n [x: string]: any;\n}\n\nexport type IComponentNodeProps = INodeProps &\n T & {\n /* Wrapper Tag */\n tag?: React.ReactType;\n };\n\nexport const Node: React.FC = React.forwardRef(\n ({ className = '', tag: Tag = 'div', element: Element, ...restAttribute }, ref) => {\n return ;\n }\n);\n\nexport default Node;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { Module, Node } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { IMediaGalleryThumbnailItemViewProps, IMediaGalleryThumbnailsViewProps, IMediaGalleryViewProps } from '../..';\n\nconst MediaGalleryView: React.FC = props => {\n const { CarouselProps, Thumbnails, MediaGallery, Modal } = props;\n\n return (\n \n \n {Modal}\n {_renderThumbnails(Thumbnails)}\n \n );\n};\n\nconst _renderThumbnails = (thumbnails: IMediaGalleryThumbnailsViewProps): JSX.Element => {\n const { ThumbnailsContainerProps, SingleSlideCarouselComponentProps, items } = thumbnails;\n\n return (\n \n {items && items.map(_renderThumbnailItem)}\n \n );\n};\n\nconst _renderThumbnailItem = (thumbnail: IMediaGalleryThumbnailItemViewProps): JSX.Element => {\n const { ThumbnailItemContainerProps, Picture } = thumbnail;\n\n return {Picture};\n};\n\nexport default MediaGalleryView;\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, ProductsDataActions, SimpleProduct, StoreOperationsDataActions } from '@msdyn365-commerce/retail-proxy';\nimport {\n getAttributeValuesByConfiguration,\n getSelectedProductIdFromActionInput,\n getSelectedVariant,\n QueryResultSettingsProxy,\n SelectedVariantInput\n} from '@msdyn365-commerce-modules/retail-actions';\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 - The input.\n * @param context - The context.\n * @returns The attribute values.\n */\nexport async function getAttributesForSelectedVariantAction(\n input: AttributesForSelectedVariantInput,\n context: 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 context.requestContext\n );\n\n return getSelectedVariant(selectedVariantInput, context);\n }\n\n return activeProduct;\n })\n .then((productResult: SimpleProduct | null) => {\n const activeProduct: SimpleProduct | undefined = productResult;\n\n if (activeProduct) {\n return ProductsDataActions.getAttributeValuesAsync(\n {\n callerContext: context,\n queryResultSettings: QueryResultSettingsProxy.getPagingFromInputDataOrDefaultValue(context)\n },\n activeProduct.RecordId,\n input.channelId,\n input.catalogId\n );\n }\n\n return null;\n })\n .then(async (attributeValues: AttributeValue[] | null) => {\n const channelInventoryConfiguration = await StoreOperationsDataActions.getInventoryConfigurationAsync({\n callerContext: context\n });\n\n return { attributeValues, channelInventoryConfiguration };\n })\n .then(result => {\n return getAttributeValuesByConfiguration(result.attributeValues, result.channelInventoryConfiguration);\n })\n .catch((error: Error) => {\n context.trace(error.message);\n throw new Error('[getPriceForSelectedVariantAction]Error executing action');\n });\n}\n\nexport default createObservableDataAction({\n id: '@msdyn365-commerce-modules/product-info/get-attributes-for-selected-variant',\n action: >getAttributesForSelectedVariantAction,\n input: createAttributesForSelectedVariantInput\n});\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IImageData, IRequestContext, IVideoData } from '@msdyn365-commerce/core';\n\nexport enum MediaType {\n /**\n * The None.\n */\n None = 0,\n /**\n * The Image type.\n */\n Image = 1,\n /**\n * The video type.\n */\n Video = 2,\n /**\n * The file type.\n */\n File = 3\n}\n\nexport interface IMediaData extends IImageData {\n mediaTypeValue?: MediaType;\n displayOrder?: number;\n videoData?: IVideoData;\n}\n\n/**\n * Gets correct alt text for image based on configuration of site.\n * @param productName Product name.\n * @param context Current request context.\n * @param imageAltText Alt-text from CMS image.\n */\nexport function getAltText(\n context: IRequestContext,\n shouldUseCmsAltText: boolean,\n productName?: string,\n imageAltText?: string\n): string | undefined {\n if (!context?.app?.config?.OmniChannelMedia) {\n return productName;\n }\n if (shouldUseCmsAltText) {\n return imageAltText;\n }\n return productName;\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { Carousel, ICarouselProps, Player, IPlayerData, IPlayerOptions, IVideoMetadata } from '@msdyn365-commerce/components';\nimport { IImageData, IImageSettings, Image, Video } from '@msdyn365-commerce/core';\nimport { MediaLocation, MediaType, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\nimport { ArrayExtensions, getFallbackImageUrl, ObjectExtensions } from '@msdyn365-commerce-modules/retail-actions';\nimport {\n defaultDataScale,\n IComponentNodeProps,\n ImagefullView,\n IModalViewProps,\n IModuleProps,\n inlineZoomImageOnHover,\n inlineZoomImageOnMouseMove,\n inlineZoomImageOnMouseOut,\n inlineZoomInitClick,\n INodeProps,\n ISingleSlideCarouselProps,\n isMobile,\n KeyCodes,\n NodeTag,\n onContainerZoomInit,\n onMouseMoveLensContainer,\n onMouseOutLensContainer,\n onMouseOverImageContainer,\n removeContainerZoomStyle,\n removeInlineZoomStyle,\n SingleSlideCarousel,\n VariantType\n} from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport { reaction } from 'mobx';\nimport * as React from 'react';\n\nimport { IMediaGalleryData } from './media-gallery.data';\nimport { imageSource, imageZoom, IMediaGalleryProps, thumbnailsOrientation } from './media-gallery.props.autogenerated';\nimport { getProductImages, getValidProductImages, getVideoMetadataFromApi, validateProductImages } from './utils';\nimport { getAltText, IMediaData } from './utils/helper';\n\n/**\n * IMediaGalleryState Interface.\n */\nexport interface IMediaGalleryState {\n animating: boolean;\n activeIndex: number;\n isImageZoomed: boolean;\n modalIsOpen: boolean;\n lastUpdate?: number;\n isMobileImageZoomed?: boolean;\n mediaGalleryItems?: IMediaData[];\n isInitialLoad?: boolean;\n shouldUseOptimizedImage?: boolean;\n}\n\n/**\n * IMediaGalleryThumbnailsViewProps Interface.\n */\nexport interface IMediaGalleryThumbnailsViewProps {\n ThumbnailsContainerProps: INodeProps;\n SingleSlideCarouselComponentProps: INodeProps;\n items?: IMediaGalleryThumbnailItemViewProps[];\n}\n\n/**\n * IMediaGalleryThumbnailItemViewProps Interface.\n */\nexport interface IMediaGalleryThumbnailItemViewProps {\n ThumbnailItemContainerProps: INodeProps;\n Picture: React.ReactElement;\n}\n\n/**\n * IMediaGalleryViewProps Interface.\n */\nexport interface IMediaGalleryViewProps extends IMediaGalleryProps {\n state: IMediaGalleryState;\n MediaGallery: IModuleProps;\n CarouselProps: INodeProps;\n Thumbnails: IMediaGalleryThumbnailsViewProps;\n Modal?: React.ReactElement | null;\n callbackToggle?(): void;\n callbackThumbnailClick?(index: number): void;\n callbackThumbnailKeyDown?(index: number): void;\n}\n\n/**\n * Props for carousel.\n */\ninterface IMediaGalleryCarouselItems {\n items: ItemType[];\n keys: (string | undefined)[];\n}\n\n/**\n * Media gallery component.\n */\nclass MediaGallery extends React.Component, IMediaGalleryState> {\n private readonly _inlineZoomDivRef: Map = new Map();\n\n private readonly fullScreenOverlayButtonRef: React.RefObject = React.createRef();\n private readonly player: React.RefObject = React.createRef();\n\n private mediaGalleryImages: IImageData[] = [];\n\n private fallbackImage?: string;\n\n private readonly defaultGalleryImageSettings: IImageSettings = {\n viewports: {\n xs: { q: 'w=767&h=767&m=8', w: 0, h: 0 },\n sm: { q: 'w=600&h=600&m=8', w: 0, h: 0 },\n md: { q: 'w=600&h=772&m=8', w: 0, h: 0 },\n lg: { q: 'h=772&m=8', w: 0, h: 0 }\n },\n lazyload: true,\n cropFocalRegion: true\n };\n\n private readonly defaultThumbnailImageSettings: IImageSettings = {\n viewports: {\n xs: { q: 'w=100&m=8', w: 100, h: 0 },\n lg: { q: 'w=100&m=8', w: 100, h: 0 }\n },\n lazyload: true,\n cropFocalRegion: true\n };\n\n private readonly _zoomedImageSettings: IImageSettings;\n\n public constructor(props: IMediaGalleryProps) {\n super(props);\n this._toggleModal = this._toggleModal.bind(this);\n this.state = {\n activeIndex: 0,\n animating: false,\n isImageZoomed: false,\n modalIsOpen: false,\n isInitialLoad: true,\n shouldUseOptimizedImage: !!this.props.config.skipImageValidation\n };\n\n this._zoomedImageSettings =\n props.config.zoomedImageSettings ?? props.config.galleryImageSettings ?? this.defaultGalleryImageSettings;\n\n this._onImageMouseOut = this._onImageMouseOut.bind(this);\n this._inlineZoomImageOnHover = this._inlineZoomImageOnHover.bind(this);\n this._onInlineImageClick = this._onInlineImageClick.bind(this);\n this._onContainerZoomImageClick = this._onContainerZoomImageClick.bind(this);\n this._onMouseOutLensContainer = this._onMouseOutLensContainer.bind(this);\n }\n\n public isMobile(): boolean {\n const size = isMobile({ variant: VariantType.Viewport, context: this.props.context.request });\n return size === 'xs';\n }\n\n public async componentDidMount(): Promise {\n const source = this.props.config.imageSource ?? imageSource.pageContext;\n const shouldUpdateOnPartialDimensionSelection = this.props.config.shouldUpdateOnPartialDimensionSelection;\n this._setRenderType();\n if (!this.props.context.request.app?.config?.OmniChannelMedia) {\n if (source === imageSource.pageContext) {\n if (this.state.mediaGalleryItems === undefined && this.props.data.mediaLocationsForSelectedVariant.result) {\n const images = await validateProductImages(\n this.props.data.mediaLocationsForSelectedVariant.result,\n this.props.context.actionContext,\n this.props.config.thumbnailImageSettings ?? this.defaultThumbnailImageSettings\n );\n await this._setImages(images);\n } else if (this.state.mediaGalleryItems === undefined && this.props.data.product.result) {\n const product = this.props.data.product.result;\n const images = await getValidProductImages(\n product.RecordId,\n +this.props.context.request.apiSettings.channelId,\n this.props.context.actionContext,\n this.props.config.thumbnailImageSettings ?? this.defaultThumbnailImageSettings,\n product.productVariant\n );\n\n await this._setImages(images);\n } else {\n await this._setImages([]);\n }\n }\n }\n\n reaction(\n () => {\n const product = this.props.data.product.result;\n if (!product) {\n return null;\n }\n\n if (!shouldUpdateOnPartialDimensionSelection || !product.productVariant?.RecordId) {\n return `${product.RecordId}`;\n }\n\n return `${product.RecordId}-${product.productVariant.RecordId}`;\n },\n async () => {\n const product = this.props.data.product.result;\n let images: IImageData[] = [];\n if (product) {\n if (this.props.context.app?.config?.OmniChannelMedia) {\n images = await getProductImages(\n product.RecordId,\n this.shouldUseCmsAltText(),\n +this.props.context.request.apiSettings.channelId,\n this.props.context.actionContext,\n product.Name,\n shouldUpdateOnPartialDimensionSelection ? product.productVariant : undefined\n );\n } else {\n images = await getValidProductImages(\n product.RecordId,\n +this.props.context.request.apiSettings.channelId,\n this.props.context.actionContext,\n this.props.config.thumbnailImageSettings ?? this.defaultThumbnailImageSettings,\n shouldUpdateOnPartialDimensionSelection ? product.productVariant : undefined\n );\n }\n await this._setImages(images);\n } else {\n await this._setImages([]);\n }\n },\n { fireImmediately: true }\n );\n\n if (source === imageSource.productId && this.props.data.mediaLocations.result) {\n const images = await validateProductImages(\n this.props.data.mediaLocations.result,\n this.props.context.actionContext,\n this.props.config.thumbnailImageSettings ?? this.defaultThumbnailImageSettings\n );\n await this._setImages(images);\n }\n }\n\n public shouldComponentUpdate(nextProps: IMediaGalleryProps, nextState: IMediaGalleryState): boolean {\n if (this.state === nextState && this.props.data === nextProps.data) {\n return false;\n }\n return true;\n }\n\n public render(): JSX.Element {\n const { id, config, resources } = this.props;\n\n const { className, showPaginationTooltip } = config;\n\n const isVertical: boolean = config.thumbnailsOrientation === thumbnailsOrientation.vertical;\n // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing -- || is required.\n const isFullscreenAllowed: boolean = this.isMobile() || config.allowFullScreen || false;\n const zoomViewMode: string =\n config.imageZoom === imageZoom.inline ? imageZoom.inline : config.imageZoom === imageZoom.container ? imageZoom.container : '';\n const source = this.props.config.imageSource ?? imageSource.pageContext;\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- Site level config can be of any type.\n const emptyPlaceHolderImage = this.props.context.app.config?.placeholderImageName as string;\n if (this.props.data.product.result) {\n this.fallbackImage = getFallbackImageUrl(\n this.props.data.product.result.ItemId,\n this.props.context.request.apiSettings,\n this.props.context.request.app?.config?.OmniChannelMedia\n );\n }\n if (emptyPlaceHolderImage && this.fallbackImage) {\n this.fallbackImage = `${this.fallbackImage},${emptyPlaceHolderImage}`;\n }\n if (this.props.config.skipImageValidation && !this.state.mediaGalleryItems && this.state.isInitialLoad) {\n let images: IImageData[] = [];\n let mediaLocations: MediaLocation[] = [];\n if (source === imageSource.pageContext && this.props.data.mediaLocationsForSelectedVariant.result) {\n mediaLocations = this.props.data.mediaLocationsForSelectedVariant.result;\n } else if (source === imageSource.productId && this.props.data.mediaLocations.result) {\n mediaLocations = this.props.data.mediaLocations.result;\n }\n images = mediaLocations.map(mediaLocation => {\n return {\n src: mediaLocation.Uri ?? '',\n altText: getAltText(\n this.props.context.actionContext.requestContext,\n this.shouldUseCmsAltText(),\n this.props.data.product.result?.Name,\n mediaLocation.AltText\n )\n };\n });\n const curatedImages = this.props.config.images ?? [];\n this.mediaGalleryImages = [...this._filterMasterImageFromVariant(images), ...curatedImages];\n }\n const mediaGalleryCarouselItems = this._getMediaGalleryItems(isFullscreenAllowed, zoomViewMode);\n const mediaGalleryThumbnailCarouselItems = this._getMediaGalleryThumbnailItems();\n const viewProps: IMediaGalleryViewProps = {\n ...(this.props as IMediaGalleryProps),\n state: this.state,\n MediaGallery: {\n moduleProps: this.props,\n className: classnames(`ms-media-gallery ${isVertical ? 'vertical' : ''}`, className)\n },\n Modal: isFullscreenAllowed ? this.imageModalSlider(zoomViewMode) : null,\n callbackToggle: this.openModalDialog,\n callbackThumbnailClick: this._generateOnThumbnailClick,\n callbackThumbnailKeyDown: this._generateOnThumbnailKeyDown,\n CarouselProps: {\n tag: Carousel,\n className: 'ms-media-gallery__carousel',\n items: mediaGalleryCarouselItems.items,\n activeIndex: this.state.activeIndex,\n next: this.next,\n previous: this.previous,\n interval: false,\n directionTextPrev: resources.previousScreenshotFlipperText,\n directionTextNext: resources.nextScreenshotFlipperText,\n onIndicatorsClickHandler: this.goToIndex,\n showPaginationTooltip: showPaginationTooltip === true,\n indicatorAriaText: resources.ariaLabelForSlide,\n handleOnExited: this.onExited,\n handleOnExiting: this.onExiting,\n key: mediaGalleryCarouselItems.keys\n } as IComponentNodeProps,\n Thumbnails: {\n ThumbnailsContainerProps: { className: 'ms-media-gallery__thumbnails-container' },\n SingleSlideCarouselComponentProps: {\n tag: SingleSlideCarousel,\n className: 'ms-media-gallery__thumbnails',\n vertical: isVertical,\n flipperPrevLabel: resources.previousScreenshotFlipperText,\n flipperNextLabel: resources.nextScreenshotFlipperText,\n parentId: id,\n useTabList: true,\n key: JSON.stringify(mediaGalleryThumbnailCarouselItems.keys)\n } as IComponentNodeProps,\n items: mediaGalleryThumbnailCarouselItems.items\n }\n };\n\n return this.props.renderView(viewProps) as React.ReactElement;\n }\n\n /**\n * Zoomed out image on previous/next click.\n */\n public updateZoomedInImage(): void {\n this.setState({ isImageZoomed: false });\n }\n\n private readonly onExiting = () => {\n this.setState({ animating: true });\n };\n\n private readonly onExited = () => {\n this.setState({ animating: false });\n };\n\n /**\n * On click next in carousel.\n */\n private readonly next = (): void => {\n removeInlineZoomStyle();\n if (this.isLastItem() === undefined) {\n return;\n }\n\n const nextIndex = this.isLastItem() ? 0 : this.state.activeIndex + 1;\n this.goToIndex(nextIndex);\n\n this.updateZoomedInImage();\n };\n\n /**\n * On click previous in carousel.\n */\n private readonly previous = (): void => {\n removeInlineZoomStyle();\n const images = this.state.mediaGalleryItems;\n const nextIndex = this.isFirstItem() ? (images ? images.length - 1 : 0) : this.state.activeIndex - 1;\n this.goToIndex(nextIndex);\n this.updateZoomedInImage();\n };\n\n private readonly goToIndex = (index: number): void => {\n const { autoplay } = this.props.config;\n const currentIndex = this.state.activeIndex;\n const mediaItems = this.state.mediaGalleryItems;\n if (autoplay && mediaItems) {\n if (mediaItems[`${index}`]?.mediaTypeValue === MediaType.Video) {\n this.player.current?.play();\n } else if (mediaItems[`${currentIndex}`].mediaTypeValue === MediaType.Video) {\n this.player.current?.pause();\n }\n }\n this.setState({ activeIndex: index });\n };\n\n private _getMediaGalleryThumbnailItems(): IMediaGalleryCarouselItems {\n const mediaGalleryItems = this.state.mediaGalleryItems ?? this.mediaGalleryImages;\n const thumbnailImageSettings = this.props.config.thumbnailImageSettings;\n if (thumbnailImageSettings) {\n thumbnailImageSettings.cropFocalRegion = true;\n }\n\n const hasMediaGalleryItems = ArrayExtensions.hasElements(mediaGalleryItems);\n\n if (!hasMediaGalleryItems) {\n if (this.state.lastUpdate) {\n const defaultKey = 0;\n return {\n items: [this._getEmptyThumbnailItem(thumbnailImageSettings, defaultKey, this.state.activeIndex)],\n keys: ['empty']\n };\n }\n return { items: [], keys: [] };\n }\n\n return {\n items: [\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion\n ...mediaGalleryItems!.map((item: IMediaData, index: number) => {\n if (item.mediaTypeValue === MediaType.Video) {\n return this.getVideoThumbNailItem(\n item,\n thumbnailImageSettings ?? this.defaultThumbnailImageSettings,\n index,\n this.state.activeIndex\n );\n } else {\n return this._getThumbnailItem(\n item,\n thumbnailImageSettings ?? this.defaultThumbnailImageSettings,\n index,\n this.state.activeIndex\n );\n }\n })\n ],\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion\n keys: [...mediaGalleryItems!.map(item => item.src)]\n };\n }\n\n private _getMediaGalleryItems(isFullscreenAllowed: boolean, zoomViewMode: string): IMediaGalleryCarouselItems {\n const mediaGalleryItems = this.state.mediaGalleryItems ?? this.mediaGalleryImages;\n const galleryImageSettings = this.props.config.galleryImageSettings;\n if (galleryImageSettings) {\n galleryImageSettings.cropFocalRegion = true;\n }\n\n const zoomView = isFullscreenAllowed ? 'fullscreen' : zoomViewMode;\n\n const hasMediaGalleryItems = ArrayExtensions.hasElements(mediaGalleryItems);\n\n if (!hasMediaGalleryItems) {\n if (this.state.lastUpdate) {\n return { items: [this._renderEmptyImage(galleryImageSettings)], keys: ['empty'] };\n }\n return { items: [], keys: [] };\n }\n\n return {\n items: [\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion\n ...mediaGalleryItems!.map((item: IMediaData, index: number) => {\n return this._renderCarouselItemImageView(\n zoomView,\n item,\n galleryImageSettings ?? this.defaultGalleryImageSettings,\n index\n );\n })\n ],\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion\n keys: [...mediaGalleryItems!.map(item => item.src)]\n };\n }\n\n private async _setImages(images?: IMediaData[]): Promise {\n const curatedImage = this.props.config.images || [];\n const mediaToSet: IMediaData[] = this._filterMasterImageFromVariant(images);\n\n void Promise.all(\n mediaToSet.map(async mediaData => {\n if (mediaData.mediaTypeValue === MediaType.Video && mediaData.src) {\n try {\n const url = new URL(mediaData.src);\n const videoId = url.searchParams.get('CVID');\n if (videoId) {\n mediaData.videoData = await getVideoMetadataFromApi(videoId, this.props.context.actionContext);\n }\n } catch (error) {\n if (this.props.telemetry) {\n this.props.telemetry.debug('Error while fetching videoId');\n }\n }\n }\n return mediaData;\n })\n ).then(mediaData => {\n const mediaItems = mediaData.filter(element => {\n return (\n element.mediaTypeValue !== MediaType.Video ||\n (element.mediaTypeValue === MediaType.Video && element.videoData !== undefined)\n );\n });\n\n this.setState({\n mediaGalleryItems: [...mediaItems, ...curatedImage],\n activeIndex: 0,\n lastUpdate: Date.now(),\n shouldUseOptimizedImage: false\n });\n });\n\n this.setState({\n mediaGalleryItems: [...mediaToSet, ...curatedImage],\n activeIndex: 0,\n lastUpdate: Date.now(),\n shouldUseOptimizedImage: false\n });\n }\n\n private _setRenderType(): void {\n this.setState({\n isInitialLoad: false\n });\n }\n\n private _renderCarouselItemImageView(\n zoomView: string,\n media: IMediaData,\n imageSettings: IImageSettings,\n index: number,\n isInPopup: boolean = false\n ): React.ReactNode {\n if (media.mediaTypeValue === MediaType.Video) {\n if (isInPopup || zoomView !== 'fullscreen') {\n return <>{this._renderCarouselItemVideo(media, index, imageSettings)};\n }\n return <>{this._renderVideoThumbnail(media, index, imageSettings)};\n } else {\n if (this.isMobile()) {\n if (isInPopup) {\n return this._renderImageInContainerOnZoom(media, this._zoomedImageSettings, index);\n }\n return this._renderImageFullScreenOnZoom(media, imageSettings, index);\n }\n\n switch (zoomView) {\n case 'container': {\n return this._renderImageInContainerOnZoom(media, this._zoomedImageSettings, index);\n }\n case 'inline': {\n return this._renderImageInlineOnZoom(media, this._zoomedImageSettings, index);\n }\n case 'fullscreen': {\n return this._renderImageFullScreenOnZoom(media, imageSettings, index);\n }\n\n // No default\n }\n return <>{this._getCarouselItem(media, imageSettings, index, isInPopup)};\n }\n }\n\n private _filterMasterImageFromVariant(images?: IImageData[]): IImageData[] {\n const shouldHidePrimaryImages = this.props.config.shouldHideMasterProductImagesForVariant ?? true;\n let variantImages = images ?? [];\n const isVariantProduct =\n !ObjectExtensions.isNullOrUndefined(this.props.data.product.result?.MasterProductId) ||\n !ObjectExtensions.isNullOrUndefined(this.props.data.product.result?.productVariant);\n const itemId = this.props.data.product.result?.ItemId;\n if (shouldHidePrimaryImages && isVariantProduct && itemId) {\n variantImages = variantImages.filter(item => {\n const isApplicableForChildEntities = item.additionalProperties?.isApplicableForChildEntities;\n return !isApplicableForChildEntities;\n });\n if (!ArrayExtensions.hasElements(variantImages)) {\n variantImages = images ?? [];\n }\n }\n return variantImages;\n }\n\n private readonly _renderCarouselItemVideo = (mediaData: IMediaData, index: number, imageSettings: IImageSettings): React.ReactNode => {\n const videoData = mediaData.videoData;\n if (videoData) {\n const options: IPlayerOptions = this.props.config as IPlayerOptions;\n const playerResources = this.props.resources;\n const videoMetaData: IVideoMetadata = {};\n videoMetaData.videoId = videoData.id;\n videoMetaData.title = videoData.title;\n videoMetaData.duration = videoData.playTime;\n if (videoData.thumbnail) {\n videoMetaData.posterframeUrl = videoData.thumbnail.src;\n }\n if (videoData._links?.binaryReferences) {\n videoMetaData.videoBinaryReferences = videoData._links.binaryReferences;\n }\n const videoPlayerData: IPlayerData = { options, metaData: videoMetaData };\n const attributes = {\n id: `${this.props.id}__carousel-item__${index}`\n };\n return (\n \n );\n }\n return this._renderEmptyImage(imageSettings);\n };\n\n private readonly _getCarouselItem = (\n image: IImageData,\n imageSettings: IImageSettings,\n index: number,\n isInPopup: boolean = false\n ): React.ReactNode => (\n \n );\n\n private readonly _getThumbnailItem = (\n image: IImageData,\n imageSettings: IImageSettings,\n index: number,\n modifiedActiveIndex: number\n ): IMediaGalleryThumbnailItemViewProps => {\n const classes = classnames(\n 'ms-media-gallery__thumbnail-item',\n modifiedActiveIndex === index ? 'ms-media-gallery__thumbnail-item-active' : ''\n );\n\n return {\n ThumbnailItemContainerProps: {\n tag: 'li' as NodeTag,\n className: classes,\n role: 'tab',\n tabIndex: 0,\n key: index,\n 'aria-label': image.altText,\n 'aria-selected': modifiedActiveIndex === index,\n onClick: this._generateOnThumbnailClick(index),\n onKeyDown: this._generateOnThumbnailKeyDown(index)\n },\n Picture: (\n \n )\n };\n };\n\n /**\n * Gets the video thumbnail item to display media gallery.\n * @param props - The Media gallery view props from business layer.\n * @returns Return thumbnail view props which will be used to render video.\n */\n private readonly getVideoThumbNailItem = (\n mediaData: IMediaData,\n imageSettings: IImageSettings,\n index: number,\n modifiedActiveIndex: number\n ): IMediaGalleryThumbnailItemViewProps => {\n const classes = classnames(\n 'ms-media-gallery__thumbnail-item',\n modifiedActiveIndex === index ? 'ms-media-gallery__thumbnail-item-active' : ''\n );\n\n const videoData = mediaData.videoData;\n let image: IImageData;\n if (videoData?.thumbnail) {\n image = videoData.thumbnail;\n } else {\n image = {\n src: 'empty'\n };\n }\n\n return {\n ThumbnailItemContainerProps: {\n tag: 'li' as NodeTag,\n className: classes,\n role: 'tab',\n tabIndex: 0,\n key: index,\n 'aria-label': image.altText,\n 'aria-selected': modifiedActiveIndex === index,\n onClick: this._generateOnThumbnailClick(index),\n onKeyDown: this._generateOnThumbnailKeyDown(index)\n },\n Picture: (\n \n )\n };\n };\n\n /**\n * Ref Handler.\n * @param index -Remove item click function.\n * @returns Set inline zoom.\n */\n private readonly _refHandler = (index: number) => (divRef: HTMLDivElement) => {\n this._inlineZoomDivRef.set(index, divRef);\n };\n\n private readonly _generateOnThumbnailKeyDown = (index: number) => {\n return (event: React.KeyboardEvent) => {\n if (event.which === KeyCodes.Enter || event.which === KeyCodes.Space) {\n event.preventDefault();\n\n this.goToIndex(index);\n }\n };\n };\n\n private readonly _generateOnThumbnailClick = (index: number) => {\n return (event: React.MouseEvent) => {\n event.preventDefault();\n\n this.goToIndex(index);\n };\n };\n\n private _renderImageInlineOnZoom(image: IImageData, imageSettings: IImageSettings, index: number): React.ReactNode {\n return (\n \n \n \n
\n );\n }\n\n private _inlineZoomImageOnHover(event: React.MouseEvent): void {\n inlineZoomImageOnHover(event, this.props.config.dataScale ?? String(defaultDataScale));\n }\n\n private _handleMobileViewZoomedImageClick(event: React.MouseEvent) {\n const target = this.state.shouldUseOptimizedImage ? (event.target as HTMLImageElement) : event.currentTarget;\n const mobileZoomedInImageClassName = 'msc-mobile-zoomed-in';\n if (!this.state.isMobileImageZoomed) {\n const bounds = target.getBoundingClientRect();\n const dataScale = Number(this.props.config.dataScale ?? defaultDataScale);\n\n const positionX = event.clientX - bounds.left;\n const positionY = event.clientY - bounds.top;\n const scaledPositionX = positionX * dataScale;\n const scaledPositionY = positionY * dataScale;\n\n target.style.transform = `scale(${dataScale})`;\n target.classList.add(mobileZoomedInImageClassName);\n target.parentElement!.style.overflow = 'auto';\n target.parentElement!.scrollTo(scaledPositionX - positionX, scaledPositionY - positionY);\n this.setState({\n isMobileImageZoomed: true\n });\n } else {\n target.style.transform = '';\n target.classList.remove(mobileZoomedInImageClassName);\n target.parentElement!.style.overflow = '';\n this.setState({\n isMobileImageZoomed: false\n });\n }\n }\n\n private _onInlineImageClick(event: React.MouseEvent): void {\n if (window.innerWidth <= 768) {\n // $msv-breakpoint-m\n this._handleMobileViewZoomedImageClick(event);\n return;\n }\n inlineZoomInitClick(event, this.props.config.dataScale ?? String(defaultDataScale));\n this.setState({\n isImageZoomed: true\n });\n }\n\n private _onImageMouseOut(event: React.MouseEvent): void {\n inlineZoomImageOnMouseOut(event);\n this.setState({\n isImageZoomed: false\n });\n }\n\n private _onContainerZoomImageClick(event: React.MouseEvent): void {\n if (window.innerWidth <= 768) {\n // $msv-breakpoint-m\n this._handleMobileViewZoomedImageClick(event);\n return;\n }\n\n onContainerZoomInit(event);\n\n this.setState({\n isImageZoomed: true\n });\n }\n\n private _onMouseOutLensContainer(event: React.MouseEvent): void {\n onMouseOutLensContainer(event);\n\n this.setState({\n isImageZoomed: false\n });\n }\n\n private _renderImageInContainerOnZoom(image: IImageData, imageSettings: IImageSettings, index: number): React.ReactNode {\n return (\n
\n \n \n
\n );\n }\n\n private _renderImageFullScreenOnZoom(image: IImageData, imageSettings: IImageSettings, index: number): React.ReactNode {\n return (\n
\n \n
\n {}\n \n
\n
\n );\n }\n\n /**\n * Render the video thumbnail in full screen.\n * @param mediaData - Media Data.\n * @param index - Index\n * @param imageSettings - Image settings.\n * @returns - JSX.Element\n */\n private readonly _renderVideoThumbnail = (mediaData: IMediaData, index: number, imageSettings: IImageSettings): React.ReactNode => {\n const videoData = mediaData.videoData;\n let image: IImageData;\n if (videoData?.thumbnail) {\n image = videoData.thumbnail;\n } else {\n image = {\n src: 'empty'\n };\n }\n\n return (\n
\n \n
\n {}\n \n
\n
\n );\n };\n\n private _mapProductToImageData(product: SimpleProduct): IImageData {\n return {\n src: product.PrimaryImageUrl ?? ''\n };\n }\n\n private _renderEmptyImage(imageSettings: IImageSettings | undefined): React.ReactNode {\n return (\n
\n \n
\n );\n }\n\n private _getEmptyThumbnailItem(\n imageSettings: IImageSettings | undefined,\n index: number,\n modifiedActiveIndex: number\n ): IMediaGalleryThumbnailItemViewProps {\n const classes = classnames(\n 'ms-media-gallery__thumbnail-item',\n modifiedActiveIndex === index ? 'ms-media-gallery__thumbnail-item-active' : ''\n );\n return {\n ThumbnailItemContainerProps: {\n tag: 'li' as NodeTag,\n className: classes,\n role: 'tab',\n tabIndex: 0,\n key: 'empty',\n 'aria-label': '',\n 'aria-selected': modifiedActiveIndex === index,\n onClick: this._generateOnThumbnailClick(index),\n onKeyDown: this._generateOnThumbnailKeyDown(index)\n },\n Picture: (\n \n )\n };\n }\n\n private readonly isFirstItem = () => this.state.activeIndex === 0;\n\n private readonly isLastItem = () => {\n const images = this.state.mediaGalleryItems;\n return images && this.state.activeIndex === images.length - 1;\n };\n\n private readonly openModalDialog = (): void => {\n this._toggleModal();\n };\n\n private _toggleModal(): void {\n if (this.state.modalIsOpen) {\n this.fullScreenOverlayButtonRef.current?.focus();\n const parentDiv = this._inlineZoomDivRef.get(this.state.activeIndex);\n if (parentDiv && parentDiv.children && parentDiv.children.length >= 2) {\n const image = parentDiv.children[1].querySelector('img');\n if (image) {\n image.removeAttribute('style');\n }\n }\n this.setState({\n isImageZoomed: false\n });\n }\n this.setState({\n isImageZoomed: false,\n modalIsOpen: !this.state.modalIsOpen\n });\n removeInlineZoomStyle();\n removeContainerZoomStyle();\n }\n\n private readonly imageModalSlider = (ZoomView: string): React.ReactElement => {\n const {\n data: {\n product: { result: product }\n },\n resources\n } = this.props;\n let mediaGalleryItems = this.state.mediaGalleryItems;\n\n if (!mediaGalleryItems && product) {\n mediaGalleryItems = [this._mapProductToImageData(product)];\n }\n const carouselprops = {\n tag: Carousel,\n className: 'ms-media-gallery__carousel',\n items:\n mediaGalleryItems &&\n mediaGalleryItems.map((item: IImageData, index: number) =>\n this._renderCarouselItemImageView(ZoomView, item, this._zoomedImageSettings, index, true)\n ),\n activeIndex: this.state.activeIndex,\n next: this.next,\n previous: this.previous,\n interval: false,\n directionTextPrev: resources.previousScreenshotFlipperText,\n directionTextNext: resources.nextScreenshotFlipperText,\n onIndicatorsClickHandler: this.goToIndex,\n showPaginationTooltip: true,\n hideIndicator: false,\n keyboard: false,\n handleOnExited: this.onExited,\n handleOnExiting: this.onExiting,\n isDisabledFunctionality: this.state.isMobileImageZoomed\n } as IComponentNodeProps;\n const carousel = ;\n\n const imageModalSliderProps: IModalViewProps = {\n modalIsOpen: this.state.modalIsOpen,\n ontoggle: this._toggleModal,\n galleryCarousel: carousel,\n classNames: classnames('ms-media-gallery__modal', 'msc-modal-input-required')\n };\n return ImagefullView(imageModalSliderProps) as React.ReactElement;\n };\n\n private shouldUseCmsAltText = (): boolean => {\n if (this.props.config.altTextSource === 'product') {\n return false;\n } else {\n return true;\n }\n };\n}\n\nexport default MediaGallery;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IImageData, IImageSettings, Image, Video } from '@msdyn365-commerce/core';\nimport {\n IMediaData,\n IMediaGalleryThumbnailItemViewProps,\n IMediaGalleryThumbnailsViewProps,\n IMediaGalleryViewProps,\n MediaType\n} from '@msdyn365-commerce-modules/media-gallery';\nimport { ArrayExtensions, getFallbackImageUrl } from '@msdyn365-commerce-modules/retail-actions';\nimport { Button, KeyCodes, Module, Node, NodeTag } from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport React from 'react';\nimport { IPlayerData, IPlayerOptions, IVideoMetadata, Player } from '@msdyn365-commerce-modules/video-player-utilities';\n\ninterface IMediaGalleryItemsProps extends IMediaGalleryThumbnailItemViewProps {\n Video?: React.ReactElement;\n}\n\n/**\n * Render the thumbnail item images.\n * @param thumbnail - The carousel thumbnail line props.\n * @returns Return HTML having thumbnail container props with image.\n */\nconst renderThumbnailItem = (thumbnail: IMediaGalleryItemsProps): JSX.Element => {\n // eslint-disable-next-line @typescript-eslint/naming-convention -- Dependency from media-gallery.tsx file\n const { ThumbnailItemContainerProps, Picture, Video } = thumbnail;\n\n return {Video ? Video : Picture};\n};\n\n/**\n * Gets the thumbnail item to display media gallery images.\n * @param image - The media gallery images.\n * @param imageSettings - Image settings for the image gallery items.\n * @param imageId - Image id.\n * @param modifiedActiveIndex - Modified Index of the images when selection changes.\n * @param props - The Media gallery view props from business layer.\n * @returns Return thumbnail view props which will be used to render images.\n */\nconst GetThumbnailItemComponent = (\n image: IImageData,\n imageSettings: IImageSettings,\n imageId: number,\n modifiedActiveIndex: number,\n props: IMediaGalleryViewProps,\n mediaTypeValue?: MediaType\n): IMediaGalleryThumbnailItemViewProps => {\n let fallbackImage: string | undefined = '';\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- Site level config can be of any type.\n const emptyPlaceHolderImage = props.context.app.config?.placeholderImageName as string;\n if (props.data.product.result) {\n fallbackImage = getFallbackImageUrl(\n props.data.product.result.ItemId,\n props.context.request.apiSettings,\n props.context.request.app?.config?.OmniChannelMedia\n );\n }\n if (emptyPlaceHolderImage && fallbackImage) {\n fallbackImage = `${fallbackImage},${emptyPlaceHolderImage}`;\n }\n\n /**\n * OnClick method of media gallery item.\n */\n const onClick = () => {\n props.callbackToggle?.();\n props.callbackThumbnailClick?.(imageId);\n props.state.activeIndex = imageId;\n };\n\n const classes = classnames(\n 'ms-media-gallery__thumbnail-item',\n modifiedActiveIndex === imageId ? 'ms-media-gallery__thumbnail-item-active' : ''\n );\n\n /**\n * Keydown event of media gallery item.\n * @param event - React.KeyboardEvent.\n */\n const handleKeyDown = (event: React.KeyboardEvent) => {\n if (event.keyCode === KeyCodes.Enter) {\n event.preventDefault();\n onClick();\n }\n };\n const defaultIndex = 0;\n return {\n ThumbnailItemContainerProps: {\n tag: 'li' as NodeTag,\n className: classes,\n role: 'presentation',\n key: imageId\n },\n Picture: (\n \n \n \n \n \n \n \n \n )\n };\n};\n\n/**\n * Render the video player.\n * @param mediaData - Media Data\n * @param index - Index of the video\n * @param activeIndex - Active Index\n * @param imageSettings - Image settings\n * @param props - Media gallery view props\n * @returns - JSX.Element.\n */\nconst RenderVideo = (\n mediaData: IMediaData,\n index: number,\n activeIndex: number,\n imageSettings: IImageSettings,\n props: IMediaGalleryViewProps\n): IMediaGalleryItemsProps => {\n const videoData = mediaData.videoData;\n if (videoData) {\n const options: IPlayerOptions = props.config as IPlayerOptions;\n const playerResources = props.resources;\n const videoMetaData: IVideoMetadata = {};\n videoMetaData.videoId = videoData.id;\n videoMetaData.title = videoData.title;\n videoMetaData.duration = videoData.playTime;\n if (videoData.thumbnail) {\n videoMetaData.posterframeUrl = videoData.thumbnail.src;\n }\n if (videoData._links?.binaryReferences) {\n videoMetaData.videoBinaryReferences = videoData._links.binaryReferences;\n }\n const videoPlayerData: IPlayerData = { options, metaData: videoMetaData };\n\n const classes = classnames(\n 'ms-media-gallery__thumbnail-item',\n index === activeIndex ? 'ms-media-gallery__thumbnail-item-active' : ''\n );\n\n return {\n ThumbnailItemContainerProps: {\n tag: 'li' as NodeTag,\n className: classes,\n role: 'presentation',\n key: index\n },\n Picture: <>,\n Video: (\n \n )\n };\n }\n return GetEmptyThumbnailItemComponent(imageSettings, props);\n};\n\n/**\n * Gets the empty thumbnail item to display media gallery images.\n * @param imageSettings - Image settings for the image gallery items.\n * @param props - The Media gallery view props from business layer.\n * @returns Return thumbnail view props which will be used to render empty images.\n */\nconst GetEmptyThumbnailItemComponent = (\n imageSettings: IImageSettings,\n props: IMediaGalleryViewProps\n): IMediaGalleryThumbnailItemViewProps => {\n let fallbackImage: string | undefined = '';\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- Site level config can be of any type.\n const emptyPlaceHolderImage = props.context.app.config?.placeholderImageName as string;\n\n if (props.data.product.result) {\n fallbackImage = getFallbackImageUrl(\n props.data.product.result.ItemId,\n props.context.request.apiSettings,\n props.context.request.app?.config?.OmniChannelMedia\n );\n }\n if (emptyPlaceHolderImage && fallbackImage) {\n fallbackImage = `${fallbackImage},${emptyPlaceHolderImage}`;\n }\n\n return {\n ThumbnailItemContainerProps: {\n tag: 'li' as NodeTag,\n className: 'ms-media-gallery__thumbnail-item',\n role: 'tab',\n tabIndex: 0,\n key: 0,\n 'aria-label': '',\n 'aria-selected': true\n },\n Picture: (\n \n )\n };\n};\n\n/**\n * Update media gallery items method.\n * @param items - The media gallery thumbnail item view props.\n * @returns The IImageData array.\n */\nconst getMediaGalleryItems = (items?: IMediaData[]): IMediaData[] | undefined => {\n return items?.map(item => {\n return {\n displayOrder: item.displayOrder,\n mediaTypeValue: item.mediaTypeValue,\n altText: item.altText,\n src: item.src,\n videoData: item.videoData\n };\n });\n};\n\nconst defaultThumbnailImageSettings: IImageSettings = {\n viewports: {\n xs: { q: 'w=295&h=295&q=80&m=6&f=jpg', w: 295, h: 295 },\n xl: { q: 'w=295&h=295&q=80&m=6&f=jpg', w: 295, h: 295 }\n },\n lazyload: true,\n cropFocalRegion: true\n};\n\n/**\n * Render the Media gallery thumbnails to represent images in grid view.\n * @param thumbnails - The thumbnail view props.\n * @param props - The media gallery view props.\n * @returns - The single slide carousel component to render as media gallery image.\n */\nconst renderThumbnails = (thumbnails: IMediaGalleryThumbnailsViewProps, props: IMediaGalleryViewProps): JSX.Element => {\n // eslint-disable-next-line @typescript-eslint/naming-convention -- Dependency from media-gallery.tsx file\n const { ThumbnailsContainerProps, SingleSlideCarouselComponentProps } = thumbnails;\n const { state } = props;\n const mediaGalleryItems = getMediaGalleryItems(state.mediaGalleryItems);\n\n const items: IMediaGalleryItemsProps[] | undefined =\n // eslint-disable-next-line multiline-ternary -- need multiline for easy code reading\n state.lastUpdate && ArrayExtensions.hasElements(mediaGalleryItems) && mediaGalleryItems[0].src === 'empty'\n ? [GetEmptyThumbnailItemComponent(defaultThumbnailImageSettings, props)]\n : // eslint-disable-next-line @typescript-eslint/naming-convention -- Dependency from media-gallery\n mediaGalleryItems?.map((item: IMediaData, id: number) => {\n if (item.mediaTypeValue === MediaType.Video) {\n if (props.config.allowFullScreen) {\n const videoThumbnail = item.videoData?.thumbnail;\n if (videoThumbnail) {\n return GetThumbnailItemComponent(\n videoThumbnail,\n defaultThumbnailImageSettings,\n id,\n state.activeIndex,\n props,\n item.mediaTypeValue\n );\n } else {\n return GetEmptyThumbnailItemComponent(defaultThumbnailImageSettings, props);\n }\n } else {\n return RenderVideo(item, id, state.activeIndex, defaultThumbnailImageSettings, props);\n }\n } else {\n return GetThumbnailItemComponent(item, defaultThumbnailImageSettings, id, state.activeIndex, props);\n }\n });\n\n return (\n \n {items?.map(renderThumbnailItem)}\n \n );\n};\n\n/**\n * Render the Media gallery items using viewprops.\n * @param props - The media gallery view props.\n * @returns The media gallery module wrapping up images node.\n */\nconst mediaGalleryView: React.FC = props => {\n // eslint-disable-next-line @typescript-eslint/naming-convention -- Dependency from media-gallery.tsx file\n const { CarouselProps, Thumbnails, MediaGallery, Modal } = props;\n return (\n \n \n {Modal}\n {renderThumbnails(Thumbnails, props)}\n \n );\n};\n\nexport default mediaGalleryView;\n","module.exports = React;","module.exports = ReactDOM;"],"names":["imageSource","imageZoom","thumbnailsOrientation","altTextSource","MediaType","getAltText","context","shouldUseCmsAltText","productName","imageAltText","_context$app","app","config","OmniChannelMedia","async","validateMediaLocationAsync","mediaLocation","imageData","src","Uri","altText","AltText","IsApplicableForChildEntities","additionalProperties","isApplicableForChildEntities","Promise","resolve","http","XMLHttpRequest","open","addEventListener","status","send","_unused","getValidProductImages","productId","channelId","actionContext","imageSettings","selectedProduct","catalogId","getCatalogId","requestContext","actionInput","MediaLocationsForSelectedVariantInput","getMediaLocationsForSelectedVariant","then","mediaLocations","all","map","pairs","filter","pair","catch","error","telemetry","exception","debug","validateProductImages","MediaGallery","React","constructor","props","_this","_ref","_props$config$zoomedI","super","this","_inlineZoomDivRef","Map","fullScreenOverlayButtonRef","player","mediaGalleryImages","defaultGalleryImageSettings","viewports","xs","q","w","h","sm","md","lg","lazyload","cropFocalRegion","defaultThumbnailImageSettings","onExiting","setState","animating","onExited","next","removeInlineZoomStyle","undefined","isLastItem","nextIndex","state","activeIndex","goToIndex","updateZoomedInImage","previous","images","mediaGalleryItems","isFirstItem","length","index","autoplay","currentIndex","mediaItems","_mediaItems","_this$player$current","mediaTypeValue","Video","current","play","_this$player$current2","pause","_renderCarouselItemVideo","mediaData","videoData","_videoData$_links","options","playerResources","resources","videoMetaData","videoId","id","title","duration","playTime","thumbnail","posterframeUrl","_links","binaryReferences","videoBinaryReferences","videoPlayerData","metaData","attributes","className","editProps","key","request","Player","Object","assign","ref","playerData","isEditor","params","_renderEmptyImage","_getCarouselItem","image","isInPopup","arguments","Image","fallBackSrc","fallbackImage","gridSettings","loadFailureBehavior","shouldSkipToMainImage","bypassHideOnFailure","_getThumbnailItem","modifiedActiveIndex","ThumbnailItemContainerProps","tag","classnames","role","tabIndex","onClick","_generateOnThumbnailClick","onKeyDown","_generateOnThumbnailKeyDown","Picture","imageFallbackOptimize","shouldUseOptimizedImage","getVideoThumbNailItem","classes","_refHandler","divRef","set","event","which","KeyCodes","Enter","Space","preventDefault","_renderVideoFullScreen","_this$props$config$th","thumbnailImageSettings","fullScreenTitleText","openModalDialog","_toggleModal","imageModalSlider","ZoomView","data","product","result","_mapProductToImageData","carouselprops","Carousel","items","item","_renderCarouselItemImageView","_zoomedImageSettings","interval","directionTextPrev","previousScreenshotFlipperText","directionTextNext","nextScreenshotFlipperText","onIndicatorsClickHandler","showPaginationTooltip","hideIndicator","keyboard","handleOnExited","handleOnExiting","isDisabledFunctionality","isMobileImageZoomed","carousel","imageModalSliderProps","modalIsOpen","ontoggle","galleryCarousel","classNames","ImagefullView","bind","isImageZoomed","isInitialLoad","skipImageValidation","zoomedImageSettings","galleryImageSettings","_onImageMouseOut","_inlineZoomImageOnHover","_onInlineImageClick","_onContainerZoomImageClick","_onMouseOutLensContainer","isMobile","variant","VariantType","Viewport","_this$props$config$im","_this$props$context$r","source","pageContext","shouldUpdateOnPartialDimensionSelection","_setRenderType","mediaLocationsForSelectedVariant","_this$props$config$th2","_setImages","_this$props$config$th3","RecordId","apiSettings","productVariant","reaction","_product$productVaria","_this$props$context$a","_this$props$config$th4","_actionContext$reques","isPreview","response","commerceApiRequest","previewImageData","_mediaLocation$Uri","displayOrder","DisplayOrder","MediaTypeValue","_mediaLocation$Uri2","getProductImages","Name","fireImmediately","_this$props$config$th5","shouldComponentUpdate","nextProps","nextState","render","_this$props$data","_this$props$data2","_this$props$data3","_this$props$data4","_this$props$data5","_this$props$data6","_this$props$data7","_this$props$config$im2","_this$props$context$a2","percentageOff","productPrice","TradeAgreementPrice","BasePrice","Math","floor","isVertical","vertical","isFullscreenAllowed","allowFullScreen","zoomViewMode","inline","container","emptyPlaceHolderImage","placeholderImageName","_this$props$context$r2","getFallbackImageUrl","ItemId","_this$props$config$im3","_this$props$data$prod","curatedImages","_filterMasterImageFromVariant","mediaGalleryCarouselItems","_getMediaGalleryItems","mediaGalleryThumbnailCarouselItems","_getMediaGalleryThumbnailItems","viewProps","_objectSpread","moduleProps","Modal","callbackToggle","callbackThumbnailClick","callbackThumbnailKeyDown","CarouselProps","indicatorAriaText","ariaLabelForSlide","keys","Thumbnails","ThumbnailsContainerProps","SingleSlideCarouselComponentProps","SingleSlideCarousel","flipperPrevLabel","flipperNextLabel","parentId","useTabList","JSON","stringify","renderView","_this$state$mediaGall","ArrayExtensions","hasElements","lastUpdate","defaultKey","_getEmptyThumbnailItem","_this$state$mediaGall2","zoomView","curatedImage","mediaToSet","URL","searchParams","get","commerceVideoMetadataRequest","getVideoMetadataFromApi","element","Date","now","media","_renderImageInContainerOnZoom","_renderImageFullScreenOnZoom","_renderImageInlineOnZoom","_this$props$config$sh","_this$props$data$prod2","_this$props$data$prod3","_this$props$data$prod4","shouldHidePrimaryImages","shouldHideMasterProductImagesForVariant","variantImages","isVariantProduct","ObjectExtensions","isNullOrUndefined","MasterProductId","itemId","_item$additionalPrope","_this$props$config$da","dataScale","defaultDataScale","onMouseOver","onMouseMove","inlineZoomImageOnMouseMove","_this$props$config$da2","inlineZoomImageOnHover","String","_handleMobileViewZoomedImageClick","target","currentTarget","mobileZoomedInImageClassName","style","transform","classList","remove","parentElement","overflow","_this$props$config$da3","bounds","getBoundingClientRect","Number","positionX","clientX","left","positionY","clientY","top","scaledPositionX","scaledPositionY","add","scrollTo","_this$props$config$da4","window","innerWidth","inlineZoomInitClick","inlineZoomImageOnMouseOut","onContainerZoomInit","onMouseOutLensContainer","_this$props$config$da5","onMouseOut","onMouseMoveLensContainer","onMouseOverImageContainer","href","_product$PrimaryImage","PrimaryImageUrl","_this$fullScreenOverl","focus","parentDiv","children","querySelector","removeAttribute","removeContainerZoomStyle","_renderThumbnails","thumbnails","Node","_renderThumbnailItem","attributesData","productSpecificationData","sourcedFromText","filteredSpec","sp","TextValue","Module","xmlns","width","height","viewBox","fill","d","binding","modules","dataActions","registerSanitizedActionPath","sanitizedActionPath","dataAction","default","Error","prototype","RegistrationId","c","require","$type","da","name","path","runOn","iNM","ns","n","p","pdp","__bindings__","viewDictionary","cn","clamp","value","min","max","toUpperCaseFirstChar","charAt","toUpperCase","substr","getCSS","property","getComputedStyle","createThrottledEvent","listener","threshold","timer","last","clearTimeout","setTimeout","mapToCssModules","cssModule","split","join","canUseDOM","document","createElement","getTarget","selection","querySelectorAll","console","findDOMElements","getTargetElement","targetElement","isRef","isElement","TransitionTimeouts","focusableElements","Fade","in","_this$props","baseClass","baseClassActive","appear","enter","exit","fadeIn","mountOnEnter","unmountOnExit","timeout","timeoutOrUndefined","addEndListener","onEnter","onEntering","onEntered","onExit","otherProps","_objectWithoutProperties","_excluded","transitionProps","Tag","baseClassAlways","baseClassActiveAlways","Transition","isActive","defaultProps","EnumExtensions","StringExtensions","isString","isNumber","isFunction","validValues","firstOrDefault","values","defaultValue","unique","Array","from","Set","predicate","flatten","arrayLine","concat","equals","firstArray","secondArray","comparator","haveSameItems","valueFromFirstArray","valueFromSecondArray","some","otherItem","calculateSum","reverse","array","newArray","push","getValues","enumClass","getNumericValues","getNames","getEnumValues","isNullOrEmpty","isNullOrWhitespace","trim","QueryResultSettingsProxy","queryResultSettings","inputData","fromModuleData","sortingCriteria","query","skip","Paging","Skip","Top","itemsPerPage","Sorting","_config$itemsPerPage","_inputData$requestCon","_inputData$requestCon2","parseInt","platform","defaultPageSizeForAPI","Columns","column","ColumnName","IsDescending","parseSearchData","maxItems","fromInputData","QueryResultSettings","getSelectedProductIdFromActionInput","_context$query","urlTokens","pageType","generateImageUrl","imageUrl","generateImageUrlFromSdk","DimensionTypes","DimensionSwatchDisplayTypes","checkIfShouldDisplayAsSwatch","dimensionType","displayType","productCard","dimensionsToDisplayOnProductCard","dimensionsInProductCard","includes","none","dimensionsToDisplayAsSwatch","dimensionsAsSwatchType","generateProductImageUrl","getProductDetailsCriteriaFromActionInput","getPrice","hidePrice","getRating","hideRating","buildCacheKey","base","locale","DefaultCacheKeyParameterKeys","generateCacheKey","_len","entries","_key","parsedEntries","toLocaleUpperCase","cacheKeyArgumentsKeys","channelIdKey","appSettingsCatalogIdKey","sort","a","b","localeCompare","convertProductDimensionTypeToDimensionTypes","productDimensionType","ProductDimensionType","Color","color","Configuration","configuration","Size","size","Style","parseDimensionsFromUrl","urlParameters","parsedDimensions","dimension","parseDimensionFromUrl","localDimensionType","DimensionTypeValue","DimensionValue","Value","getDimensionValuesFromQuery","inputUrl","toString","toLocaleLowerCase","validateCatalogId","GetCustomerInput","accountNumber","cacheType","getCacheKey","customerAccountNumber","getCacheObjectType","dataCacheType","createObservableDataAction","action","input","ctx","user","isAuthenticated","CustomersDataActions","callerContext","bypassCache","isArray","trace","token","AddressManagementInput","address","userAccountNumber","createAddressManagementInput","doAddressManagementOperation","operationHandler","customerInput","customer","getCustomer","newCustomer","updatedCustomer","updateAsync","update","createReadAsync","AccountNumber","Addresses","addAddressHandler","isBatched","DeliveryMode","InventoryLevels","InventoryLevelValues","FinitePromiseQueueError","Guid","Random","generateGuid","uuidv4","_guid","EmailRegex","html5EmailRegex","AddItemToProductListInput","productListId","quantity","unitOfMeasure","isMultipleCatalogFeatureEnabledInHq","productListLineToAdd","ProductListId","ProductId","Quantity","UnitOfMeasure","productListLine","ProductListsDataActions","addItemToProductListInput","AddOrganizationUserInput","newUser","errorMessage","getCurrentAsync","businessPartner","BusinessPartnerId","createBusinessPartnerUserAsync","message","createAddOrganizationUserInput","requestUrl","baseUrl","cartId","requestOptions","headers","oun","Authorization","cartTenderLines","cartTenderLineItem","TokenizedPaymentCard","House","CardTokenInfo","billingAddress","Phone","ThreeLetterISORegionName","Street","City","State","ZipCode","Country","Address1","Zip","requestBody","receiptEmail","cartVersion","sendCommerceRequest","CreateProductListInput","templateName","templateType","orderTemplate","Id","ProductListTypeValue","createdProductList","createProductListInput","deleteAddressHandler","cur","DeleteOrganizationUserInput","deleteAsync","log","createDeleteOrganizationUserInput","EditOrganizationUserInput","updatedUser","createEditOrganizationUserInput","AddressInput","GetAttributeDefinitionsInput","attributeDefinitionCriteria","channel","CustomerAttributeGroupId","getAttributeDefinitionsAsync","AttributeGroupIdentifier","displayLabelEnabled","inventoryCode","inventoryRanges","available","outOfStock","mapProductInventoryInformation","productsWarehouseInventory","productInventoryInformation","enableStockCheck","inventoryLevel","physicalAvailable","physicalProductMap","mapInventoryWithPhysicalBufferEnabled","totalAvailable","totalAvailableProductMap","mapInventoryWithTotalAvailableBufferEnabled","productMap","mapInventoryWithThresholdEnabled","productWarehouseInventoryAvailability","TotalAvailable","productQty","outOfStockThreshold","productAvailableQuantity","AvailableQuantity","ProductAvailableQuantity","IsProductAvailable","InventLocationId","shouldRenderLabel","PhysicalAvailableInventoryLevelCode","productQuantity","_productWarehouseInve","MaximumPurchasablePhysicalAvailableQuantity","PhysicalAvailable","StockLevelCode","StockLevelLabel","PhysicalAvailableInventoryLevelLabel","TotalAvailableInventoryLevelCode","_productWarehouseInve2","MaximumPurchasableTotalAvailableQuantity","TotalAvailableInventoryLevelLabel","isAggregatedInventory","warehouseAggregation","mapAggregatedProductInventoryInformation","productWarehouseInventoryInformation","_productWarehouseInve3","AggregatedProductInventoryAvailabilities","_product$MaximumPurch","_product$MaximumPurch2","DataAreaId","PhysicalAvailableQuantity","TotalAvailableQuantity","ProductWarehouseInventoryAvailabilities","createInventoryAvailabilitySearchCriteria","productIds","isDefaultWareHouse","isFilterByChannelFulfillmentGroup","searchArea","defaultDeliveryMode","deliveryMode","shipping","inventoryAvailabilitySearchCriteria","ProductIds","QuantityUnitTypeValue","SearchArea","FilterByChannelFulfillmentGroup","DeliveryModeTypeFilterValue","DefaultWarehouseOnly","SelectedVariantInput","matchingDimensionValues","getSelectedVariantActionDataAction","_input$matchingDimens","_input$catalogId2","url","ProductsDataActions","getPagingFromInputDataOrDefaultValue","hasUnmatchedDimension","checkIfHasUnmatchedDimensions","Dimensions","matchedTargetDimension","find","targetDimension","newImageUrl","fullDimensions","_product$Dimensions","fullDimensionPromises","shippingInventoryConfiguration","searchCriteria","RequestedDimensionTypeValue","MatchingDimensionValues","CatalogId","dimensionValues","dimensionValuesWithInventory","getFullDimensions","_input$catalogId","variantProductId","variantImageUrl","getProductVariant","matchedTargetDimensionFromApi","AttributesForSelectedVariantInput","activeProduct","selectedVariantInput","productResult","getAttributeValuesAsync","attributeValues","quantityErrors","getQuantityLimit","maxQuantityForCartLineItem","inputItem","quantityLimit","shouldEnableStockCheck","availableQuantity","getElementIndex","lines","cartLineToAdd","elementFoundAt","productIdToFind","line","FulfillmentStoreId","addProductsToCartWithoutSiteSettings","cart","CartLines","substatus","newCartLines","_cartLine$Quantity","cartLine","addCartLinesResult","Version","addCartLinesAsync","newCart","_error$data3","errorDetails","LocalizedMessage","validationResults","ValidationResults","warning","validateOrderQuantityLimits","isAddServiceItemToCart","shouldSkipSiteSettings","i","_cart$CartLines","_error$data","cartline","IsInvoiceLine","addProductsToCartValidateAgainstDefaultOrderSettings","cartActionResult","_cart$CartLines2","_error$data2","addProductsToCartValidateAgainstSiteSettings","hasPromoCode","code","Coupons","coupon","Code","toLowerCase","__decorate","decorators","desc","r","getOwnPropertyDescriptor","Reflect","decorate","defineProperty","GlobalState","isInitialized","_status","lambda","reject","clearCartLineDeliveryMode","cartLineId","matchingLines","LineId","copyCartLine","ShippingAddress","WarehouseId","InventLocation","updateCartLinesAsync","observable","computed","CartTokenPrefix","getOrCreateActiveCart","cartCookieParts","cookies","getCartCookie","readCart","readCartId","Auth","Anon","readAsync","setCartCookie","handleItemDiscontinuedException","getCartFromCookie","wasReadFromCookie","authCarts","cartSearchCriteria","IncludeAnonymous","CartTypeValue","searchAsync","searchCarts","getCartFromCustomer","anonCart","currentCart","anonCurrentCart","claimAuthCart","claimCart","mergedCart","sourceCart","destinationCart","updatedCart","cartLines","cartLinesToDelete","hasShippingMethod","channelConfiguration","featureNames","newCartLine","IsGiftCardLine","buildGiftCardLine","_featureStates$find","featureStates","getFeatureStatesAsync","featureState","IsEnabled","_channelDeliveryOptio","channelDeliveryOptionConfig","getChannelDeliveryOptionConfigurationAsync","PickupDeliveryModeCodes","isEmpty","PickupDeliveryModeCode","ExtensionProperties","Description","ReasonCodeLines","AttributeValues","EntryMethodTypeValue","UnitOfMeasureSymbol","IsPriceKeyedIn","Price","removeCartLinesAsync","coupons","addCouponsAsync","addCartLines","claimAnonCart","createNewCart","LoyaltyCardId","card","getCustomerLoyaltyCardsAsync","CardNumber","errorObj","information","createCartAsync","NetPrice","GiftCardBalance","TrackingId","price","CartsDataActions","errorInstance","updateCartLineDeliverySpecificationsInternal","cartLineDeliverySpecifications","updateLineDeliverySpecificationsAsync","updateCartLineQuantityInternal","newQuantity","isUsingDefaultOrderSettingsMax","updateCartLineQuantityValidateMaxAgainstDefaultOrderSettings","updateCartLineQuantityValidateMaxAgainstSiteSettings","shippingAddress","BaseCartState","_cart","_attributeValues","_extensionProperties","_isProductAddedToCart","reduce","total","num","_doAsyncAction","refreshCartInternal","_input$additionalProp","count","DefaultUnitOfMeasure","isPriceKeyedIn","IsGiftCard","customPrice","location","retailMultiplePickupModeEnabled","OrgUnitNumber","InventoryLocationId","_buildAddressFromOrgUnitLocation","isAddEmailDeliveryItemToCart","EmailDeliveryModeCode","ItemTypeValue","ReleasedProductType","Service","validateQuantity","_doCartOperationWithRetry","addProductToCartInternal","internalInput","_inputItem$catalogId","_this$actionContext$r","PRODUCTASSERVICE","isStockCheckEnabled","addProductsToCartInternal","invoiceIds","addInvoicesToCartInternal","invoiceId","lineDescription","addOrderInvoiceAsync","addOrderInvoiceToCartInternal","setInvoiceLinePriceInternal","cartLineIds","removeCartLineInternal","clearCartLineDeliveryModeInternal","_actionContext$reques2","pickupDeliveryModeCode","emailDeliveryModeCode","dM","copiedLines","_cloneDeep","forEach","clearCartLinesDeliveryInformation","channelDeliveryOptionConfiguration","cartLineDeliverySpecification","DeliverySpecification","DeliveryModeId","DeliveryPreferenceTypeValue","PickUpStoreId","DeliveryAddress","lineDeliverySpecifications","deliveryModeId","cartLinesForShipping","_input$channelDeliver","deliverySpecifications","_input$additionalProp2","loyaltyCardNumber","newLoyaltyCardId","updateLoyaltyCardIdInternal","addPromoCode","promoCode","addDiscountCodeAsync","addPromoCodeInternal","removePromoCodes","promoCodes","removeDiscountCodesAsync","removePromoCodesInternal","removeAllPromoCodes","removeAllPromoCodesInternal","email","ReceiptEmail","updateReceiptEmail","newEmail","updateShippingAddress","newShippingAddress","newAttributeValues","newCartObject","updateCart","newExtensionProperties","updatedCartObject","cartLinesToUpdate","updateCartLinesInternal","updatedCartLinesObject","callback","callbackResult","refreshCart","PostalAddressId","OrgUnitName","FullAddress","Address","StreetNumber","DistrictName","BuildingCompliment","Postbox","County","CountyName","StateName","GlobalStateInput","stateConstructor","_this$catalogId","getState","globalStateObject","createGlobalState","initialize","createGlobalStateDataAction","args","getCartState","cartStateDataAction","GetCheckoutCartInput","getCheckoutCartCookie","checkoutCartId","checkoutCart","cartState","copyAsync","setCheckoutCartCookie","BaseCheckoutCartState","getCheckoutCart","CheckoutStorageKey","BaseCheckoutState","_giftCardExtends","_loyaltyAmount","_guestCheckoutEmail","_customerAccountAmount","_emailAddressFromExpressCheckout","_checkoutGenericData","_checkoutCart","_shouldEnableSinglePaymentAuthorizationCheckout","shouldEnableSinglePaymentAuthorizationCheckout","_shouldEnableCheckoutErrorDisplayMessaging","shouldEnableCheckoutErrorDisplayMessaging","_salesOrder","_orderedProducts","_tokenizedPaymentCard","_tenderLine","_billingAddress","_isBillingAddressSameAsShippingAddress","_shippingAddress","_hasShippingAddress","_hasCartDeliveryMode","_cardPrefix","_paymentTenderType","giftCardExtends","_loyaltyCardNumber","_hasGuestCheckoutEmail","_isTermsAndConditionAccepted","_isTermsAndConditionChecked","_shouldCollapsePaymentSection","_shouldTriggerPaymentWithPlaceOrder","_isPaymentSectionContainerReady","_cardPaymentAcceptResult","_isPaymentSectionContainerHasError","_redirectAdditionalContext","_redirectPaymentConnectorId","_checkoutErrorPaymentConnectorId","_isPlaceOrderEnabledInRedirection","_isPaymentVerificationRequired","_isCheckoutCallFailed","_shouldEnableExpressCheckoutInCheckout","_shouldEnableExpressCheckoutInCart","_shippingAddressFromExpressCheckout","_billingAddressFromExpressCheckout","_isExpressCheckoutApplied","_isExpressAddressApplied","_isExpressCheckoutAppliedInCartPage","_isExpressPaymentModulesReady","requestFormData","pv","redirectResult","_checkoutError","_isBillingAddressHasError","_checkoutErrorFocus","_shouldFocusOnCheckoutError","updateSalesOrder","newSalesOrder","newOrderedProducts","updateTokenizedPaymentCard","newTokenizedPaymentCard","updateTenderLine","newTenderLine","newHasShippingAddress","newHasCartDeliveryMode","newIsTermsAndConditionAccepted","newIsTermsAndConditionChecked","newShouldCollapsePaymentSection","newShouldTriggerPaymentWithPlaceOrder","newIsPaymentSectionContainerReady","newCardPaymentAcceptResult","newIsPaymentSectionContainerHasError","newRedirectAdditionalContext","newRedirectPaymentConnectorId","newCheckoutErrorPaymentConnectorId","newIsCheckoutCallFailed","newIsPlaceOrderEnabledInRedirection","newIsPaymentVerificationRequired","updateBillingAddress","newBillingAddress","isBillingAddressSameAsShippingAddress","removeBillingAddress","updatePaymentTenderType","newPaymentTenderType","updateCardPrefix","newCardPrefix","removeGiftCard","giftCard","giftCardNumber","removeGiftCardExtend","addGiftCard","Pin","ExpirationDate","TenderTypeId","gitCardExtend","addGiftCardExtend","updateLoyaltyCardNumber","newLoyaltyCardNumber","updateLoyaltyAmount","newAmount","toFixed","newGuestCheckoutEmail","updateCartLines","newHasGuestCheckoutEmail","removeCheckoutCartId","removeCheckoutCartCookie","saveDataInStorage","sessionStorage","setCheckoutCartData","BillingAddress","GiftCard","LoyaltyCardNumber","loyaltyAmount","LoyaltyAmount","isTermsAndConditionAccepted","TermsAndCondition","paymentTenderType","setItem","PaymentTenderType","redirectPaymentConnectorId","RedirectPaymentConnectorId","isExpressCheckoutApplied","IsExpressCheckoutApplied","filtered","filteredData","SaveDataBeforeRedirect","CheckoutGenericData","checkoutGenericData","updateCustomerAccountAmount","newBillingAddressFromExpressCheckout","newShippingAddressFromExpressCheckout","newEmailAddressFromExpressCheckout","newShouldEnableExpressCheckoutInCheckout","newShouldEnableExpressCheckoutInCart","newIsExpressCheckoutApplied","newIsExpressAddressApplied","newIsExpressCheckoutAppliedInCartPage","newIsBillingAddressHasError","newIsExpressPaymentModulesReady","newCheckoutError","setCheckoutGenericData","getCheckoutGenericData","newCheckoutErrorFocus","newShouldFocusOnCheckoutError","setInitialData","cleanCheckoutData","removeCheckoutCartData","isPaymentVerificationRedirection","_window$sessionStorag","getCheckoutCartData","getItem","GetCartStateDataInput","ErrorCode","ErrorMessageResource","ErrorLocation","CheckoutModule","FeatureStateInput","createGetFeatureStateInput","getFeatureStateActionDataAction","StoreOperationsDataActions","ProductAvailabilitiesForCartLineItems","getDeliveryMode","featureSate","pickupDeliveryMode","_featureState$find","shippingItems","bopisItems","productAvailabilities","getOrgUnitConfigurationAsync","products","getActiveCartProductsAction","ActiveCartProductsInput","getFeatureState","retailMultiplePickUpOptionEnabled","x","shippingProductAvailabilities","getEstimatedAvailabilityAsync","productWarehouses","bopisItem","productWarehouse","InventLocationDataAreaId","quantityUnitTypeSales","getProductWarehouseAvail","getEstimatedProductWarehouseAvailabilityAsync","productWarehouseMapping","CatalogsInput","getCustomerAccountNumberForAllChannelType","CatalogsDataActions","createCatalogsInput","CategoriesInput","mappedToHierarchy","_context$apiSettings","_requestContext","_mappedToHierarchy","CategoriesDataActions","_inputData$config","topItems","topCategories","parameterize","sep","parameterizeFeatureFlags","neutralizedName","candidateName","msdyn365Commerce","platformSettings","enableUrlLocalization","enableUrlEncoding","encodeURIComponent","replace","getCategorySlug","category","categoryMap","categoryName","NeutralizedName","ParentCategory","Slug","getCategoryUrl","Url","getParameterizeFeatureFlags","getUrlSync","includeRootCategory","sitePath","getLocale","getFriendlyName","nameTranslations","nameTranslation","Language","Text","mapCategoryToHierarchy","categoryList","_rootCategory$Childre","localName","NameTranslations","categoryHierarchy","rootCategory","parent","Children","getCategoryAction","RawCategoriesInput","GetCategoryPathsInput","categoryPathLooksups","categoryPath","ChannelId","categoryPathResults","getCategoryPathsAsync","CategoryPath","categoryUrl","getCategoriesUrlSync","slice","GetChannelDeliveryConfigurationInput","CartCookieName","CartCookie","Cookie","activeCart","CurrentCategoryInput","categoryId","categorySlug","isNaN","recordId","categories","tempActionContext","searchCategory","foundCategory","cat","matchingChild","categoryInput","getCategoryHierarchy","CurrentCategoryHierarchyInput","activeCategoryId","findCategoryHierarchy","innerCategoryHierarchy","_findCategoryHierarch","fullCategoryHierarchy","getCategoriesHierarchy","_activeCategoryId","activeCategoryParsedId","GetCustomerBalanceInput","getCustomerBalanceAsync","InvoiceAccount","retailAction","createGetCustomerLoyaltyCardsInput","ProductDeliveryOptionsForCartLineItems","GetDeliveryOptionsForSelectedVariantInput","customerId","getSelectedVariant","getDeliveryOptionsAsync","FilterDeliveryModeOption","FilterOutNonPickupDeliveryMode","ProductsDimensionAvailabilitiesInput","masterProductId","requestDimensionType","requestDimensionTypes","_this$_requestContext","getDimensionAvailabilitiesForProductsAction","inputs","promise","RequestedDimensionTypeValues","InventoryAccuracyValue","InventoryAccuracy","Low","productsDimensions","productDimension","DimensionAvailabilitiesForProductSearchResultInput","dimensionContext","productsDimensionInputs","_product$AttributeVal","filteredProductAttributes","attributeValue","_attributeValue$Name$","_attributeValue$Name","productionDimensionTypes","productionDimensionType","_product$MasterProduc","dimensionForProducts","productsDimensionAvailabilities","dimensionInput","_dimensionValue$Value","inventoryLevelCode","getInventoryLevelCodeFromDimensionValue","isDisabled","createDimensionAvailabilitiesForProductSearchResultInput","GetDimensionsForSelectedVariantInput","activeProducts","promises","_productDimension$Dim","_productDimension$Dim2","DimensionId","newDimension","_newDimension$dimensi","oldDimension","DimensionValues","GetFullAvailableInventoryNearbyInput","_productId","_latitude","_longitude","_radius","_DistanceUnitValue","_IgnoreLocation","latitude","longitude","radius","DistanceUnitValue","IgnoreLocation","Latitude","Longitude","Radius","retailMulitplePickupMFeatureState","pickup","productWarehouseInformation","getOrgUnitLocationsByAreaAsync","DeliveryModeTypeFilter","Pickup","storeMap","stores","store","locationDeliveryOptions","orgUnitChannel","channelCollection","channelIdList","getChannelDeliveryOptionsAsync","channelDeliveryOptions","_getLocationPickUpDeliveryModes","availabilityPromiseList","_locationDeliveryOpti","locationDeliveryOption","_channeldeliveryoption","orgUnitLocation","channelDeleiveryOptions","OrgUnitAvailability","getStoreHoursAsync","hours","itemAvailabilities","_element$ProductAvail","has","availability","OrgUnitLocation","ItemAvailabilities","ProductInventoryInformation","OrgUnitPickUpDeliveryModes","StoreHours","_getAvailabilityWithHours","GetProductListInput","shouldCacheOutput","productListSearchCriteria","ProductListType","QuickOrder","createGetProductListInput","ProductInput","warehouseId","productIdMapping","getProductPromises","catalogIds","_inputs$0$warehouseId","productInputs","getByIdsAsync","mappedProducts","memo","FullProductInput","criteria","ProductDetailsCriteria","_getActivePrices","validProductIds","productCollection","_inputs$0$catalogId","projectDomain","validInputs","Boolean","getActivePricesAsync","fullProduct","ProductDetails","versionLt","retailServerProxyVersion","CustomerContextualPrice","AdjustedPrice","ProductPrice","_getProductRatings","getProductRatingsAsync","productRating","ProductRating","getSimpleProducts","ratingsAndPricePromises","productDetailsCriteria","QuickOrderTemplateLine","GetProductListLinesInput","searchText","quickOrderTemplateLinesState","totalCount","productListLines","_promise$metadata$cou","metadata","listLine","fullProductsInfo","getFullProducts","createGetProductListLinesInput","QuickOrderTemplate","productList","quickOrderTemplateLines","totalLines","GetFullProductListInput","inputParameters","getProductList","productLists","inputLines","getProductListLines","linesState","createGetFullProductListInput","FullProductsRefineSearchByCategoryInput","queryResultSettingsProxy","refinementCriteria","hasSortingColumn","fullProductInputs","refineSearchByCategoryAsync","searchResults","productSearchResult","FullProductsRefineSearchByTextInput","getRefinedProducts","getRefinedFullProducts","refineSearchByTextAsync","searchInputData","ActiveWishlistInput","wishlists","getByCustomerAsync","CommerceListLines","commerceListLine","ListItemType","ListInput","documentId","description","shortDescription","backgroundColor","foregroundColor","productItems","itemsCount","skipCount","DocumentId","ItemsCount","ItemsPerPage","SkipCount","Title","ShortDescription","BackgroundColor","ForegroundColor","Images","Items","ProductItems","getImages","resultImageList","imageItem","getSubListItem","sitePathOfRequest","imageList","fields","content","sublistHref","listName","_name","Href","getSitePath","inputArray","GetProducts","listitem","listData","pageData","list","_id","getInutListData","listItems","parentImageList","getItemsPerPage","getSkipCount","sum","type","clonedList","productItem","GetLoyaltyCardInput","getLoyaltyAction","cards","_cards","CardTenderTypeValue","firstCard","getLoyaltyCardAsync","LoyaltyEnrollmentDate","LoyaltyEnrollmentDateLocal","GetLoyaltyTransactionEstimationInput","_getCart","_getLoyalty","loyaltyCardInput","getLoyalty","_getOrgUnits","getMaxLoyaltyPointsToRedeemForTransactionBalanceAsync","Currency","points","MediaLocationsByIdInput","_ctx$requestContext$a","mediaLocationsInput","MediaLocationsInput","getMediaLocationsForProductAction","getMediaLocationsAsync","AsyncResult","AdditionalMediaLocationsForSelectedVariantInput","AdditionalMediaLocationsInput","getAdditionalMediaLocationsForProductAction","createGetOrderShipmentsHistoryInput","createGetOrgUnitConfigurationInput","OrganizationUsersInput","getUsersAsync","users","OrganizationUsersCountInput","GetOrganizationWideOrderHistoryInput","convertToString","_context$requestConte","getOrderHistoryAsync","ProductPickUpOptionsForCartLineItems","PriceForProductSearchResultInput","productRecIds","productPrices","productResults","activePrice","_activePrice$Customer","_activePrice$BasePric","_activePrice$TradeAgr","_activePrice$Adjusted","PriceForSelectedVariantInput","_featureStates$find2","ProductTypeValue","ProductType","Master","KitMaster","ProductAvailabilitiesForSelectedVariantInput","shippingSearchCriteria","pickupSearchCriteria","shippingAvailability","shippingInventory","deliveryType","pickupAvailability","pickupInventory","ProductsByCategoryInput","cacheKeyHint","currentCategory","getCurrentCategory","searchByCategoryAsync","productSearchResults","getProducts","defaultOrderQuantityLimitsFeatureConfig","enableDefaultOrderQuantityLimits","isQuantityLimitsFeatureEnabledInHq","customerInfo","IsB2b","isOrderQuantityLimitsFeatureEnabled","productIdsByWarehouseId","resultProducts","_productIdsByWarehous","entryWarehouseId","entryProductIds","accum","getActiveCartProductsActionWhenQuantityLimitsFeatureIsOn","hasInvoiceLine","PromotionOptionsForCartLineItems","getAvailablePromotionsAsync","tenantId","inputIsValid","serviceEndpoint","sendRequest","GetRatingsSummaryInput","rnr","getRnrEndpointId","RefinersByCategoryInput","getRefinersByCategoryAsync","RefinersByTextInput","getRefinersByTextAsync","GetRelatedProductsInput","relationType","querySettings","productRelationTypes","getRelationTypesAsync","productRelationTypeId","_productRelationType","foundProductRelationTypeId","productRelationType","searchProductRelationType","getRelatedProductsAsync","stack","GetScanResultInput","sku","skuNumber","scanResults","Product","getDimensionsForSelectedVariant","ScanResult","ProductDimensionFull","createInput","SearchConfigurationInput","getSearchConfigurationAsync","GetOrgUnitLocationsByAreaInput","_Latitude","_Longitude","_Radius","locationPromiseList","_getLocationWithHours","createGetByCustomerInput","GetInvoiceDetailsInput","InvoiceId","SalesOrdersDataActions","GetInvoicesInput","InvoiceTypeValues","InvoiceType","SalesOrderInvoice","CustomerId","InvoicePaidStatusValues","InvoicePaidStatus","None","IssueLoyaltyInput","updateLoyaltyCardId","issueLoyaltyCardAsync","CustomerAccount","issuedCard","AddItemToOrderTemplateInput","orderTemplateId","addProductListLinesAsync","addItemToOrderTemplateInput","OrderTemplateLine","shouldDisable","OrderTemplate","orderTemplateLines","GetPaginatedOrderTemplateLinesInput","getPaginatedOrderTemplateLinesAction","orderTemplateLinesState","getProductListLinesAsync","_inputData$getPrice","_inputData$getRating","_line$productListLine","_line$productListLine2","unassortedProduct","createGetPaginatedOrderTemplateLinesInput","AddOrderTemplateToCartInput","chunkCount","getPaginatedOrderTemplateLinesInput","addedCartLines","productLine","_productLine$fullProd","addOrderTemplateToCartInput","CreateOrderTemplateInput","createProductListAsync","createOrderTemplateInput","GetFullOrderTemplateInput","inputParams","GetOrderTemplatesInput","getOrderTemplates","createGetFullOrderTemplateInput","GetFullOrderTemplatesInput","getPrices","getRatings","orderTemplates","inputLinesRequests","inputLinesResponses","productLinesResponse","_this$queryResultSett","_this$queryResultSett2","createGetOrderTemplatesInput","GetOrderTemplatesPreviewInput","getFullOrderTemplates","UpdateOrderTemplateHeaderInput","updatedProductList","updateOrderTemplateHeaderInput","UpdateOrderTemplateInput","getLinesInput","getPaginatedOrderTemplateLines","linesToUpdate","lineToUpdate","updatedLines","updateProductListLinesAsync","updatedLine","updateOrderTemplateInput","createRefineSearchByCategoryInput","refinementCriterion","search","querySettingsProxy","createSearchByTextInput","updateAddressHandler","IsPrimary","ContactInfoType","_customer$Contacts","customerAttributes","phone","vatNumber","primaryContact","Contacts","contact","AddressTypeValue","PhoneRecordId","VatNumber","Attributes","isOptOut","preferenceType","OptOutWebActivityTracking","OptOutPersonalization","_customer$Addresses","setPrimaryAddress","primaryAddresses","addresses","addr","GetDistributorListInput","_ChannelId","_StoreNumber","_InventoryLocationId","StoreNumber","searchStoreCriteria","ChannelTypeValue","OnlineStoreCustomerTypeValue","marketSettings","markets","OrgUnitsDataActions","filteredChannels","channels","market","_market$channelItem","channelItem","retailServerChannelId","filterChannelsBasedUponMarketSettings","channelPromiseList","channelMarketSettings","_market$channelItem2","getMarketSettingsForChannel","channelDeliveryOption","orgUnit","OrgUnit","OrgUnitDeliveryOptions","MarketSettings","_getDistributorInfo","ProductDimensionsWithAvailabilitiesInput","PopperContent","_handlePlacementChange","isOpen","componentDidMount","_handleProps","componentDidUpdate","prevProps","_renderChildren","placement","_show","_hide","flip","offset","fallbackPlacement","focusOut","placementPrefix","arrowClassName","arrowClassNameOrUndefined","hideArrow","modifiers","boundariesElement","attrs","popperClassName","extendedModifiers","enabled","behavior","preventOverflow","order","fn","ReactPopper","component","onBlur","display","Arrow","DEFAULT_DELAYS","show","hide","Tooltip","addTargetEvents","handleDocumentClick","removeTargetEvents","toggle","onMouseOverTooltip","onMouseLeaveTooltip","onMouseOverTooltipContent","onMouseLeaveTooltipContent","onFocusOutTarget","onEscKeyDown","onEscKeyDownNative","tabPressed","body","getElementsByTagName","bodyClasses","getAttribute","getNamedItem","removeNamedItem","componentWillUnmount","clearHideTimeout","clearShowTimeout","e","hideTimeout","showTimeout","getDelay","nativeEvent","nextFocus","activeElement","contains","keyCode","delay","ariaAttr","createAttribute","setNamedItem","trigger","triggers","displayMode","removeEventListener","disabled","hideAriaHidden","innerClassName","innerRef","popperClasses","shouldShowCloseButton","onMouseLeave","shouldShowMiniCart","UncontrolledTooltip","_toggle","_isAutoDisplayTriggered","isCartPage","cartPageUrl","showToolTipOnTab","previousState","Alert","closeClassName","transition","fade","assertive","includeAlertClass","ariaLabel","closeClasses","alertTransition","buttonId","innerContent","closeAriaLabel","BackToTop","_renderHeading","text","Msdyn365","_reevaluatePosition","_scrollToTop","payLoad","getPayloadObject","telemetryContent","TelemetryConstant","getTelemetryAttributes","delayInMs","scrollStepInPx","_scrollStep","documentElement","scrollTop","clearInterval","intervalId","setInterval","pageYOffset","innerHeight","clientHeight","scrollHeight","tabIndexValue","Button","active","block","outline","Collapse","_transitionStatusToClassHash","entering","entered","exiting","exited","_tagRef","_updateParentElement","node","minHeight","_onEntering","_onExit","_onExited","_onExiting","_reevaluateHeight","navbar","collapseIn","collapseClass","_getTransitionClass","reEvaluateHeight","firstElementChild","isAppearing","eventType","etext","recid","contentCategory","contentAction","pgname","pageName","mname","moduleName","etype","contentData","setTelemetryAttribute","Flipper","telemetryLabel","glyphProps","displayTooltip","sizeClass","attribute","IncrementalQuantity","IncrementalQuantity_1","_props$currentCount","_this$props$min","inputRef","isMobileView","isMobileCheck","Browser","xl","_validateMin","currentInput","_minValue","currentValue","currentCount","isUpdating","_onIncrement","_onDecrement","_handleChange","_props$applyDefaultOr","_props$currentCount2","applyDefaultOrderSettings","_this$props$inputQuan","_this$props$inputQuan2","glyphMinusClassName","decrementGlyphClass","glyphPlusClassName","incrementGlyphClass","decrementDisabled","isGiftCard","incrementDisabled","DecrementQuantity","decrementAttributes","IncrementQuantity","incrementAttributes","ariaLablelText","inputQuantityAriaLabel","extraClassDecrement","extraClassIncrement","decrementButtonAriaLabel","pattern","onChange","incrementButtonAriaLabel","invokeCallback","currQuantity","updatedQuantity","_debounce","inputElement","HTMLInputElement","setAttribute","observer","_context$device","MsDyn365","isBrowser","device","Type","LabeledDropdown","_onSelectOption","selectedKey","selectedOption","dropdownOptions","option","selectedIndex","indexOf","labelText","labelClassname","dropdownId","dropdownClassname","labelClassNames","dropdownClassNames","_getSelectedIndex","htmlFor","selected","controlledByParent","onSelectOption","selectedOptions","toggleColor","Pagination","listClassName","listTag","ListTag","label","paginationClasses","listpaginationClasses","PaginationItem","paginationItemClasses","PaginationLink","paginationLinkclasses","defaultCaret","UncontrolledPagination","activePage","maxPages","ceil","startingItem","qsps","splitUrl","secondSplit","hash","parsedQsps","qsp","qspPair","previousText","nextText","previousAriaLabel","nextAriaLabel","activeQsp","_generatePageLinks","_generateUrl","page","qspUrl","_generatePaginationArrow","disable","tooltipId","nextId","prevId","ariaDescribedBy","nextAreaDescribed","prevAreaDescribed","_generatePaginationItem","_generateEllipse","leftDistance","rightDistance","leftEllipse","pagesDisplayed","rightEllipse","pages","displayedPagesOnLeft","startingIndex","endIndex","Portal","defaultNode","appendChild","createPortal","mounted","_getFocusableChildren","_handleBackdropClick","_handleBackdropMouseDown","_handleEscape","_handleTab","_onOpened","_onClosed","wasOpen","mouseDownElement","_open","visibility","position","applicationNode","HTMLElement","_close","_prevProps","prevState","shouldUpdateFocusToFirstElement","focusableElementArr","componentWillReceiveProps","wrapClassName","modalClassName","backdropClassName","contentClassName","modalTransition","backdropTransition","backdrop","onOpened","onClosed","external","verticalPosition","horizontalPosition","zIndex","returnFocusRef","ariaLabelledbyId","dialogAttributes","modalAttributes","onMouseDown","onKeyUp","modalTransitions","backdropTransitions","Backdrop","dialogBaseClass","dialogClasses","dialog","_document$body$firstE","openCount","scrollY","scrollbarWidth","clientWidth","right","removeProperty","_document$body$firstE2","modalOpenClassName","modalOpenClassNameRegex","RegExp","_getFocusedChild","focusableChildren","stopPropagation","totalFocusable","currentFocus","focusedIndex","el","shiftKey","autoFocus","ModalBody","ModalFooter","Progress","percent","classname","carouselSize","slideSize","itemSize","_onResized","_onCarouselResized","_nextSlide","_previousSlide","_handleTouchStart","_handleTouchEnd","_onFocus","showPrevious","showNext","slideRef","itemRef","direction","scrollThreshold","touchScrollThreshold","slide","_setSizes","_updateFlippers","resizeThrottledEventHandler","throttledEventHandler","addThrottledEvent","isVert","slidePositionStyle","modifiedChildren","_getClonedChildren","carouselClass","carouselSlideClass","overflowClass","previousFlipperGlyph","nextFlipperGlyph","previousFlipperClassName","nextFlipperClassName","disableClassName","onTouchStart","onTouchEnd","child","castChild","verticalItemsSelector","itemsSelector","onFocus","_moveSingleSlide","evt","touches","scrollStart","screenY","screenX","changedTouches","delta","currentOffset","maxScrollCount","directionModifier","maxScrollDistance","distanceToEdge","abs","scrollWidth","_calculateCarouselSize","carouselStyle","padding","parseFloat","paddingTop","paddingBottom","paddingLeft","paddingRight","_canScrollPrevious","_canScrollNext","_scrollItemIntoView","offsetTop","offsetLeft","updateOffset","scrollLeft","SliderThumb","sliderButtonRef","sliderThumbBaseClass","sliderThumbClass","trackThumbClass","handleStart","onMouseUp","handleEnd","onTouchMove","handleDrag","handleKeydown","handleFocus","handleBlur","showTooltip","tooltip","handleTooltipText","sliderValue","orientations","horizontal","coordinate","EventType","Slider","thumb1Ref","thumb2Ref","_prevState","_renderLabels","labels","labelId","labelPositioning","labelString","_renderSliderThumbs","thumbStyles","sliderAriaLabelMin","format","sliderThumbs","sliderAriaLabelMax","isRangeSlider","step","orientation","_handleOnChange","_handleStart","_handleDrag","_handleEnd","ariaValueText","_handleUpdate","dimensionStr","sliderPos","handlePos","limit","grab","castTarget","thumbid","_getThumbAndPublishEvent","Start","_position","castEvent","coordinateStyle","directionStyle","clientCoordinateStyle","pos","_getValueFromPosition","_getPositionFromValue","percentage","round","baseVal","_coordinates","handle","_setSliderValue","sliderThumb","Change","_publishNotification","thumb","delegate","slider","firstThumbValue","secondThumbValue","NaN","nativeEventType","elmenentId","_getThumbFromProps","End","onChangeEnd","onChangeStart","_willThumbsCrossOver","_handleOnClick","shouldSliderAdjustToRTL","offsetWidth","_nextState","shouldRender","thumb1Position","thumb2Position","sliderClass","sliderBaseClass","sliderId","camelCasedDirection","positionThumb1","coordsThumb1","fillStyle","handleStyle","trackProgressClass","sliderKey","positionThumb2","coordsThumb2","marginBottom","showProgressBar","fillTrackValue","showLabels","castThumb","thumbId","thumbPressed","thumb1","thumb2","thumbInteractedWith","thumbFound","keycode","checkCondition","inForm","TableDataType","Waiting","watingClassName","formatSpecifier","parameters","match","Popover","popover","_addTargetEvents","_handleDocumentClick","_removeTargetEvents","getRef","_focusOutTarget","_focusOutPopover","_keyDown","PriceEditorModeSelectionState","getPriceEditorModeSelectionStateResources","modeState","full","payFullAmountButtonText","partial","specifyAmountButtonText","onClickHandler","handleStateChange","togglePopoverHandler","setPopoverState","isPopoverState","PriceEditorModeSelectionComponent","popoverReference","isPopoverShown","setIsPopoverShown","setModeState","currentState","onChangeMode","clickedState","onStateChanged","renderModeStateItem","stateStringRepresentation","PriceEditor","_handleInputFocus","isInputFocused","_handleInputBlur","_handleEditorModeStateChange","newState","_this$_inputRef$curre","_updateAmount","maximumValue","_inputRef","handleChange","_precision","minimumValue","defaultAmount","_this$state$currentVa","_this$state$currentVa2","_this$state$currentVa3","containerClassName","hasMultipleModes","mode","formattedValue","editedValue","priceEditorInputAriaLabel","minValue","debounce","restAttribute","renderModuleAttributes","Element","createAttributesForSelectedVariantInput","getAttributesForSelectedVariantAction","channelInventoryConfiguration","getAttributeValuesByConfiguration","renderThumbnailItem","GetThumbnailItemComponent","imageId","_props$context$app$co","_props$config$thumbna","_props$context$reques","_props$callbackToggle","_props$callbackThumbn","call","handleKeyDown","playVideoTitleText","GetEmptyThumbnailItemComponent","_props$context$app$co2","_props$config$thumbna2","_props$context$reques2","renderThumbnails","getMediaGalleryItems","_item$videoData","videoThumbnail","RenderVideo","module","exports","ReactDOM"],"sourceRoot":""}