{"version":3,"sources":["webpack:///./src/modules/store-selector/components/store-selector-location-line-item/date-time-helpers.ts?3240","webpack:///./src/modules/store-selector/components/pickup-option-list.tsx?d204","webpack:///./src/modules/store-selector/components/store-pickup-option-list.tsx?ed2c","webpack:///./src/modules/store-selector/components/store-selector-location-line-item/store-selector-location-line-item.components.tsx?76bb","webpack:///./src/modules/store-selector/components/store-selector-location-lines.tsx?0014","webpack:///./src/modules/store-selector/components/store-selector-search-form.tsx?1677","webpack:///./src/modules/store-selector/components/store-selector-small-components.tsx?c6d5","webpack:///./src/modules/store-selector/store-selector.props.autogenerated.ts?ef85","webpack:///./src/modules/store-selector/store-selector.tsx?1a43","webpack:///./src/themes/henrys/views/search-result-container.view.tsx?3c4f","webpack:///./src/modules/conditional-tab-item/conditional-tab-item.view.tsx?2014","webpack:///src/modules/fabrikam/views/cart.view.tsx?8115","webpack:///./src/modules/hei-store-hours/hei-store-hours.view.tsx?72e5","webpack:///./src/modules/conditional-tab-item/conditional-tab-item.tsx?0806","webpack:///./src/modules/hei-store-hours/hei-store-hours.tsx?d9bf","webpack:///./src/modules/store-selector/store-selector.view.tsx?be09","webpack:///src/modules/footer-item/footer-item.tsx?f8b4","webpack:///src/modules/footer-item/footer-item.view.tsx?235e"],"names":["secondsToTime","seconds","undefined","hours","Math","floor","ampm","divisorForMinutes","minutes","getShortTimeString","day","resources","days","monday","tuesday","wednesday","thursday","friday","saturday","sunday","getFullTimeString","mondayFull","tuesdayFull","wednesdayFull","thursdayFull","fridayFull","saturdayFull","sundayFull","buildHoursDisplayInfo","startDay","endDay","hoursInfo","startDayShort","startDayFull","endDayShort","endDayFull","timeRange","shouldMergeLines","firstLine","secondLine","isClosed","openTime","closeTime","getStoreHoursData","storeHours","dateForLookup","get","buildStoreHoursString","closedText","openFrom","openTo","buildStoreHours","storeHoursList","mondayHours","tuesdayHours","wednesdayHours","thursdayHours","fridayHours","saturdayHours","sundayHours","periodStart","periodEnd","push","PickUpOptionList","React","constructor","props","super","_onSelect","async","e","preventDefault","deliveryCode","currentTarget","getAttribute","length","this","onChange","_rendeDeliveryOptions","bind","_pickupListOptionMenu","state","expandSiteOptions","render","pickupListOptionMenuText","pickupmodeList","className","onClick","role","ref","map","delivery","key","Code","tabIndex","Description","expandSiteOptionsState","setState","StorePickUpOptionList","isExpandOptionsState","isFilterExpanded","event","selectedPickupMode","_onKeyDown","_storePickupListOptionMenu","productPickupListOptionMenuText","productPickupModeList","selectedPickupModeDesc","find","onKeyDown","StoreSelectorLocationLineItemComponentActions","onLocationSelected","deliveryMode","handlers","onSelected","location","onSetAsPreferredStore","OrgUnitNumber","onRemovePreferredStore","onPickupInStoreClickHandler","onPickupModeSelectHandler","pickupMode","onSetPreferredStoreClickHandler","removePreferredStoreHandler","onChangeHandler","Promise","resolve","matchDeliveryOptions","productdeliveryOptions","storePickUpOptionList","deliveryOption","pickup","_delivery","StoreSelectorLocationLineItemComponent","storeUrl","hideStockStatus","isCurrentLocation","isInStock","stockStatusLabel","storeLocatorView","index","preferredStoreLocationId","isPreferredStoreEnabled","isLocationDisabled","telemetryContent","productPickUpOptionList","storeName","OrgUnitName","distanceAsString","distance","preferredDistanceUnit","buildDistanceString","Distance","storeAddress","Address","phoneNumber","contacts","allPhoneContacts","filter","contact","ContactTypeValue","IsPrivate","primaryPhoneContact","IsPrimary","Locator","extractPhoneNumber","Contacts","resourceLabel","inStock","outOfStock","stockLabel","stockText","canSelectLocation","pickupInStoreButtonText","selectLocation","pickupInStoreAriaLabel","selectLocationAriaLabelFormat","replace","isPreferredStore","payLoad","getPayloadObject","TelemetryConstant","PickupInStore","attributes","getTelemetryAttributes","contentAction","etext","PreferredStore","preferredStoreAttr","RemovePreferredStore","RemovePreferredStoreAttr","deliveryOptionList","href","contactInfoHeader","storeHoursHeader","RegularStoreHours","displayTime","JSON","stringify","title","storeOpenFrom","OpenFrom","storeOpenTo","OpenTo","renderStoreHours","availabilityInfoHeader","currentLocation","filteredPickupMode","renderPickupModes","preferredStoreAriaLabel","preferredStoreText","setAsPreferredStoreTextAriaLabel","setAsPreferredStoreText","StoreSelectorLocationLines","onClickHandler","orgUnitLocation","_scrollIntoView","selectedLocationDiv","selectedLocationRef","current","parent","parentElement","scrollTop","offsetTop","clientHeight","_isCurrentLocation","alreadySelectedLocation","_isProductInStock","ItemAvailabilities","enableOutOfStockCheck","AvailableQuantity","_stockInventoryLabel","availabilityWithHours","ProductInventoryInformation","i","OrgUnitAvailability","OrgUnitLocation","InventoryLocationId","InventLocationId","StockLevelLabel","_mapResources","contactText","timeText","availabilityText","storeHoursClosedText","outOfStockText","inStockText","selectedStoreLocationText","selectStoreText","selectStoreAriaFormatText","storeHoursMondayText","storeHoursTuesdayText","storeHoursWednesdayText","storeHoursThursdayText","storeHoursFridayText","storeHoursSaturdayText","storeHoursSundayText","storeHoursMondayFullText","storeHoursTuesdayFullText","storeHoursWednesdayFullText","storeHoursThursdayFullText","storeHoursFridayFullText","storeHoursSaturdayFullText","storeHoursSundayFullText","storeCounter","componentDidUpdate","prevProps","selectedStoreLocationId","componentDidMount","locations","_stores","_sortStores","regex","storeUrlFormat","classnames","show","displayList","store","orgUnitNumber","url","_renderStoreLocation","deliveryOptions","OrgUnitPickUpDeliveryModes","selected","ArrayExtensions","hasElements","StoreHours","toString","DeliveryOptions","productPickUpDeliveryOptions","stores","value","__decorate","observable","observer","StoreSelectorSearchForm","searchBoxRef","_handleKeyPressPrev","keyCode","KeyCodes","Enter","Space","onShowAllStores","_searchTextChanged","inputValue","target","searchTermChanged","_onSubmit","blur","performSearch","_onChangeHandler","filterPickupModeSelected","renderPickupModesList","toggleButtonText","pickupFilterMenuHeading","locatorView","pickupFilterByHeading","hasEnabledPickupFilterToShowStore","onToggleListMapViewState","toggleMapViewAttributes","SearchStore","storeSearchAttributes","ShowAllStore","showAllStoreAttributes","ToggleMapView","searchButtonAriaLabel","searchPlaceholderText","seeAllStoresText","viewListText","viewMapText","id","isMapDisabled","showAllStores","name","autoComplete","onSubmit","type","searchInputAriaLabel","placeholder","color","onKeyUp","StoreSelectorEmptyMessage","emptyLocationsText","StoreSelectorWaiting","StoreSelectorTermsOfService","link","requestContext","onTextChange","editableLink","ariaLabel","linkText","linkUrl","destinationUrl","openInNewTab","Msdyn365","editProps","StoreSelectorFoundLocationsMessage","searchRadius","isSeeAllStore","storeCountMessage","milesShortText","storeCountMessageInKm","storeAllCountMessage","mode","searchRadiusUnit","style","StoreSelector","handleLinkTextChange","config","termsOfServiceLink","handleHeadingChange","heading","onShowAllStoresHandler","_getAndUpdateStoreLocation","onFilteredPickupMode","_attachMapAutoSuggest","autoSuggestOptions","context","telemetry","actionContext","channel","data","storeSelectorStateManager","result","isMapApiLoaded","autoSuggestManager","Microsoft","Maps","loadModule","callback","options","countryCode","ChannelCountryRegionISOCode","AutosuggestManager","attachAutosuggest","_onSuggestionSelected","errorCallback","debug","credentials","BingMapsApiKey","_searchTermChanged","formattedSuggestion","_performSearch","_setPreferredStore","storeId","cookies","storeLocations","availabilitiesWithHours","modeEnum","pickupInStore","findStores","preferedStore","setPreferredStoreLocation","isConsentGiven","Latitude","Longitude","_removePreferredStore","clearPreferredStore","_setSelectedStore","setSelectedStoreLocationId","searchTerm","isSearchInProgress","isSeeAllStoreValue","geoLocate","trim","_updateLocations","latitude","longitude","styleEnum","dialog","inline","isDialogOpen","navigator","geolocation","getCurrentPosition","position","coords","error","PERMISSION_DENIED","timeout","_closeDialog","parentElementRef","focus","closeDialog","_setOrgUnitStoreInformation","styleDefault","setOrgUnitStoreInformation","showMapViewLink","isDialog","orgUnitStoreInformation","catch","message","radius","lookupRadius","calRadius","distanceUnitValue","kilometers","modeDefault","preferredStore","lat","long","lastInlineStoreLocation","lastInlineShownStoreInfo","setLastInlineStoreInfo","orgUnitLocationsInput","GetOrgUnitLocationsByAreaInput","orgUnitLocations","getOrgUnitLocationsByArea","product","input","GetFullAvailableInventoryNearbyInput","RecordId","getFullAvailableInventoryNearby","warning","_onOrgUnitLocationSelected","selectedLocation","hasEnableOutOfStockCheck","itemAvailabilities","getTelemetryObject","request","telemetryPageName","friendlyName","autoSuggestionEnabled","setTimeout","reaction","loadMapApi","BingMapsEnabled","lang","DefaultLanguageId","market","then","when","isSameContext","shouldComponentUpdate","nextProps","setAsPreferredStore","enablePickupFilterToShowStore","app","appConfig","inlineView","hideInventory","listMapViewState","showLocationView","isMapModuleLoaded","StoreSelectorActions","toggleListMapViewState","configHeading","storeLocatorHeaderText","storeSelectorHeaderText","kilometersShortText","preferredLocationId","StoreId","locationsList","sortLocation","enableOutofStock","enableStockCheck","locationListProps","_getStoreLocationListProps","viewProps","ModuleProps","tag","Modal","moduleProps","classname","autoFocus","fade","isOpen","onClosed","horizontalPosition","verticalPosition","toggle","HeaderContainerProps","ModalHeader","HeaderProps","Object","text","onEdit","FooterContainerProps","ModalFooter","BodyContainerProps","ModalBody","locationsMessage","search","spinner","outOfStockThreshold","noLocationsMessage","terms","headerText","sortLocations","callbacks","getAndUpdateUserLocation","attachMapAutoSuggest","onSuggestionSelected","setPreferredStore","removePreferredStore","setSelectedStore","renderView","hasEnabledOutOfStockCheck","isStoreLocatorView","storeList","storeLineProps","_createStoreLocationList","selectedStoreLocation","lineResources","locationOpen","createSearchResultModal","modalProps","refineMenu","sortByDropDown","modal","modalHeader","createModalBody","modalFooter","modalBody","renderSort","renderRefiner","refiners","RefineMenuContainer","RefinerSectionContainer","Node","submenu","SortingContainer","renderCategoryBanner","categoryHierarchy","gridSettings","bannerImage","NeutralizedName","categoryImageUrl","generateImageUrl","apiSettings","ImageData","src","Image","loadFailureBehavior","renderCategoryHierarchy","CategoryHierarchyContainer","categoryHierarchyList","categoryHierarchySeparator","category","renderTitle","TitleContainer","titlePrefix","titleText","titleCount","SearchResultContainerView","SearchResultContainer","products","pagination","ProductsContainer","ProductSectionContainer","choiceSummary","isMobile","modalToggle","searchResultModal","TitleViewProps","sortByOptions","CategoryNavContainer","RefineAndProductSectionContainer","errorMessage","FeatureSearchContainer","similarLookProduct","Module","_renderTabItemContent","items","onVisibilityChange","item","ConditionalTabItemView","tabItemType","tabSlots","TabContentContainer","TabHeaderContainer","TabItemContent","tabHeader","TabItemType","TabContent","tabItemContent","TabHeader","_renderPromotions","promotions","promotionMessageWrapper","promotionMessage","promotionSeeAllLink","promotionDialog","_renderCartlines","cartLines","storeSelector","backToShoppingButton","waitingComponent","cartLoadingStatus","cartDataResult","mulitplePickUp","emailDeliveryModeCode","emptyCartText","cartLine","cartline","_renderBOPISBlock","_renderGroupBOPISBlock","addToOrderTemplate","addToWishlist","remove","onToggleBopisHandler","isBopisSelected","pickUpInStore","toggleBopis","onChangeStoreHandler","DeliveryMode","shipInsteadDisplayText","shipToAddressDisplayText","pickItUpDisplayText","pickUpAtStoreWithLocationText","changeStoreDisplayText","puckUpinStoreAttribute","ContainerProps","orgUnitName","Button","_renderErrorBlock","errorData","errors","Wrapper","header","_renderOrderSummarylines","orderSummaryLines","OrderSummaryItems","promoCode","subtotal","shipping","otherCharge","tax","totalDiscounts","orderTotal","_renderInvoiceSummarylines","invoiceSummaryLines","invoices","giftCard","loyalty","_renderCartLinesGroup","cartLinesGroup","cartlines","_renderCartLinesGroupHeader","_countItems","EmailDeliveryModeCode","multiplePickUpEnabled","count","pickUpText","shippingText","emailshippingText","groupTitle","toLowerCase","_renderCartLinesGroupTitle","countItem","reduce","Quantity","itemLabel","itemsLabel","suffix","CartView","renderModuleAttributes","promotionOptions","CartlinesWrapper","orderSummaryHeading","OrderSummaryWrapper","cart","hasInvoiceLine","invoiceSummaryLineitems","orderSummaryLineitems","OrderSummaryErrors","checkoutAsSignInUserButton","checkoutAsGuestButton","createTemplateFromCartButton","HeiStoreHoursView","storeInfo","ConditionalTabItem","moduleContentClassName","moduleHeaderClassName","_renderTabHeader","slots","isSelected","itemIndex","contentID","getContentID","tabId","activeContentIDResult","activeTabState","shown","activeContentIndex","visibilityState","tabItemTitle","mapResources","HeiStoreHours","allStores","setStoreHours","useState","storeHoursLoaded","setStoreHoursLoaded","s","useEffect","ctx","callerContext","getStoreHoursAsync","Error","exception","StoreSelectorView","FooterItem","handleTextChange","image","footerItemClassName","_createHeading","_createImageMarkup","_createText","_createLinkText","EditableLink","_createLink","HeadingContainer","ItemContainer","Link","onTelemetryClick","additionalProperties","ariaHiddenAttr","imageSettings","viewports","xs","q","w","h","lg","lazyload","shouldSkipToMainImage","FooterItemView","_renderElement"],"mappings":"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","file":"static/js/15.3eeb45c6920c92f8cdd5.chunk.js","sourcesContent":["/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\nimport { RegularStoreHours } from '@msdyn365-commerce/retail-proxy';\r\nimport get from 'lodash/get';\r\n\r\nimport { IStoreSelectorLocationLineItemResources } from '.';\r\n\r\nexport interface IHoursDisplayInfo {\r\n startDayShort: string;\r\n startDayFull: string;\r\n endDayShort?: string;\r\n endDayFull?: string;\r\n timeRange: string;\r\n}\r\n\r\ninterface IHoursInfo {\r\n isClosed: boolean;\r\n openTime?: number;\r\n closeTime?: number;\r\n}\r\n\r\ntype DayType = 'MON' | 'TUE' | 'WED' | 'THU' | 'FRI' | 'SAT' | 'SUN';\r\n\r\nexport const secondsToTime = (seconds: number | undefined): string | undefined => {\r\n if (seconds === undefined) {\r\n return undefined;\r\n }\r\n let hours = Math.floor(seconds / (60 * 60));\r\n const ampm = hours >= 12 ? 'pm' : 'am';\r\n hours %= 12;\r\n hours = hours ? hours : 12;\r\n const divisorForMinutes = seconds % (60 * 60);\r\n const minutes = Math.floor(divisorForMinutes / 60) < 10 ? `0${Math.floor(divisorForMinutes / 60)}` : Math.floor(divisorForMinutes / 60);\r\n return `${hours}:${minutes} ${ampm}`;\r\n};\r\n\r\nconst getShortTimeString = (day: DayType, resources: IStoreSelectorLocationLineItemResources): string => {\r\n switch (day) {\r\n case 'MON':\r\n return resources.days.monday;\r\n case 'TUE':\r\n return resources.days.tuesday;\r\n case 'WED':\r\n return resources.days.wednesday;\r\n case 'THU':\r\n return resources.days.thursday;\r\n case 'FRI':\r\n return resources.days.friday;\r\n case 'SAT':\r\n return resources.days.saturday;\r\n default:\r\n // Case 'SUN':\r\n return resources.days.sunday;\r\n }\r\n};\r\n\r\nconst getFullTimeString = (day: DayType, resources: IStoreSelectorLocationLineItemResources): string => {\r\n switch (day) {\r\n case 'MON':\r\n return resources.days.mondayFull;\r\n case 'TUE':\r\n return resources.days.tuesdayFull;\r\n case 'WED':\r\n return resources.days.wednesdayFull;\r\n case 'THU':\r\n return resources.days.thursdayFull;\r\n case 'FRI':\r\n return resources.days.fridayFull;\r\n case 'SAT':\r\n return resources.days.saturdayFull;\r\n default:\r\n // Case 'SUN':\r\n return resources.days.sundayFull;\r\n }\r\n};\r\n\r\nconst buildHoursDisplayInfo = (\r\n startDay: DayType,\r\n endDay: DayType,\r\n hoursInfo: string,\r\n resources: IStoreSelectorLocationLineItemResources\r\n): IHoursDisplayInfo => {\r\n return {\r\n startDayShort: getShortTimeString(startDay, resources),\r\n startDayFull: getFullTimeString(startDay, resources),\r\n endDayShort: startDay !== endDay ? getShortTimeString(endDay, resources) : undefined,\r\n endDayFull: startDay !== endDay ? getFullTimeString(endDay, resources) : undefined,\r\n timeRange: hoursInfo\r\n };\r\n};\r\n\r\nconst shouldMergeLines = (firstLine: IHoursInfo, secondLine: IHoursInfo): boolean => {\r\n if (firstLine.isClosed && secondLine.isClosed) {\r\n return true;\r\n }\r\n\r\n if (!firstLine.isClosed && !secondLine.isClosed) {\r\n return firstLine.openTime === secondLine.openTime && firstLine.closeTime === secondLine.closeTime;\r\n }\r\n\r\n return false;\r\n};\r\n\r\nconst getStoreHoursData = (storeHours: RegularStoreHours, dateForLookup: string): IHoursInfo => {\r\n return {\r\n isClosed: get(storeHours, `IsClosedOn${dateForLookup}`, false),\r\n openTime: get(storeHours, `${dateForLookup}OpenTime`, undefined),\r\n closeTime: get(storeHours, `${dateForLookup}CloseTime`, undefined)\r\n };\r\n};\r\n\r\nconst buildStoreHoursString = (hoursInfo: IHoursInfo, resources: IStoreSelectorLocationLineItemResources): string => {\r\n if (hoursInfo.isClosed) {\r\n return resources.closedText;\r\n }\r\n const openFrom: string | undefined = secondsToTime(hoursInfo.openTime);\r\n const openTo: string | undefined = secondsToTime(hoursInfo.closeTime);\r\n\r\n return `${openFrom}–${openTo}`;\r\n};\r\n\r\nexport const buildStoreHours = (storeHours: RegularStoreHours, resources: IStoreSelectorLocationLineItemResources): IHoursDisplayInfo[] => {\r\n const storeHoursList: IHoursDisplayInfo[] = [];\r\n\r\n const mondayHours = getStoreHoursData(storeHours, 'Monday');\r\n const tuesdayHours = getStoreHoursData(storeHours, 'Tuesday');\r\n const wednesdayHours = getStoreHoursData(storeHours, 'Wednesday');\r\n const thursdayHours = getStoreHoursData(storeHours, 'Thursday');\r\n const fridayHours = getStoreHoursData(storeHours, 'Friday');\r\n const saturdayHours = getStoreHoursData(storeHours, 'Saturday');\r\n const sundayHours = getStoreHoursData(storeHours, 'Sunday');\r\n\r\n let periodStart: DayType = 'MON';\r\n let periodEnd: DayType = 'MON';\r\n\r\n if (!shouldMergeLines(mondayHours, tuesdayHours)) {\r\n storeHoursList.push(buildHoursDisplayInfo(periodStart, periodEnd, buildStoreHoursString(mondayHours, resources), resources));\r\n\r\n periodStart = 'TUE';\r\n }\r\n periodEnd = 'TUE';\r\n\r\n if (!shouldMergeLines(tuesdayHours, wednesdayHours)) {\r\n storeHoursList.push(buildHoursDisplayInfo(periodStart, periodEnd, buildStoreHoursString(tuesdayHours, resources), resources));\r\n\r\n periodStart = 'WED';\r\n }\r\n periodEnd = 'WED';\r\n\r\n if (!shouldMergeLines(wednesdayHours, thursdayHours)) {\r\n storeHoursList.push(buildHoursDisplayInfo(periodStart, periodEnd, buildStoreHoursString(wednesdayHours, resources), resources));\r\n\r\n periodStart = 'THU';\r\n }\r\n periodEnd = 'THU';\r\n\r\n if (!shouldMergeLines(thursdayHours, fridayHours)) {\r\n storeHoursList.push(buildHoursDisplayInfo(periodStart, periodEnd, buildStoreHoursString(thursdayHours, resources), resources));\r\n\r\n periodStart = 'FRI';\r\n }\r\n periodEnd = 'FRI';\r\n\r\n if (!shouldMergeLines(fridayHours, saturdayHours)) {\r\n storeHoursList.push(buildHoursDisplayInfo(periodStart, periodEnd, buildStoreHoursString(fridayHours, resources), resources));\r\n\r\n periodStart = 'SAT';\r\n }\r\n periodEnd = 'SAT';\r\n\r\n if (!shouldMergeLines(saturdayHours, sundayHours)) {\r\n storeHoursList.push(buildHoursDisplayInfo(periodStart, periodEnd, buildStoreHoursString(saturdayHours, resources), resources));\r\n\r\n periodStart = 'SUN';\r\n }\r\n periodEnd = 'SUN';\r\n\r\n storeHoursList.push(buildHoursDisplayInfo(periodStart, periodEnd, buildStoreHoursString(sundayHours, resources), resources));\r\n\r\n return storeHoursList;\r\n};\r\n","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\nimport { DeliveryOption } from '@msdyn365-commerce/retail-proxy';\r\nimport * as React from 'react';\r\n\r\nexport interface IPickUpOptionListProps {\r\n pickupListOptionMenuText: string;\r\n pickupmodeList?: DeliveryOption[];\r\n onChange(deliveryCode: string): Promise;\r\n}\r\n\r\nexport interface IPickOptionListState {\r\n expandSiteOptions: boolean;\r\n}\r\n\r\n/**\r\n * Simple Pickup option dropdown with Button to get menu option.\r\n */\r\nexport class PickUpOptionList extends React.PureComponent {\r\n private readonly _pickupListOptionMenu: React.RefObject;\r\n\r\n constructor(props: IPickUpOptionListProps) {\r\n super(props);\r\n this._rendeDeliveryOptions = this._rendeDeliveryOptions.bind(this);\r\n this._pickupListOptionMenu = React.createRef();\r\n this.state = {\r\n expandSiteOptions: false\r\n };\r\n }\r\n\r\n public render(): JSX.Element {\r\n const { pickupListOptionMenuText, pickupmodeList } = this.props;\r\n\r\n return (\r\n
\r\n \r\n {this.state.expandSiteOptions ? (\r\n
    \r\n {pickupmodeList?.map((delivery: DeliveryOption) => {\r\n return (\r\n
  • \r\n \r\n \r\n {delivery.Description}\r\n \r\n \r\n
  • \r\n );\r\n })}\r\n
\r\n ) : null}\r\n
\r\n );\r\n }\r\n\r\n private _rendeDeliveryOptions(): void {\r\n const expandSiteOptionsState = this.state.expandSiteOptions;\r\n this.setState({\r\n expandSiteOptions: !expandSiteOptionsState\r\n });\r\n }\r\n\r\n private readonly _onSelect = async (e: React.MouseEvent): Promise => {\r\n e.preventDefault();\r\n const deliveryCode = e.currentTarget.getAttribute('data-value');\r\n if (deliveryCode && deliveryCode.length > 0) {\r\n await this.props.onChange(deliveryCode);\r\n }\r\n };\r\n}\r\n","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\nimport { DeliveryOption } from '@msdyn365-commerce/retail-proxy';\r\nimport * as React from 'react';\r\n\r\n/**\r\n * Store Pickup option list interface.\r\n */\r\nexport interface IStorePickUpOptionListProps {\r\n productPickupListOptionMenuText?: string;\r\n productPickupModeList?: DeliveryOption[];\r\n onChange(deliveryCode: string): Promise;\r\n}\r\n\r\n/**\r\n * Store Pickup option state interface.\r\n */\r\nexport interface IStorePickOptionListState {\r\n isFilterExpanded: boolean;\r\n selectedPickupMode?: string;\r\n}\r\n\r\n/**\r\n * Simple Pickup option dropdown with Button to get menu option.\r\n */\r\nexport class StorePickUpOptionList extends React.PureComponent {\r\n private readonly _storePickupListOptionMenu: React.RefObject;\r\n\r\n public constructor(props: IStorePickUpOptionListProps) {\r\n super(props);\r\n this._storePickupListOptionMenu = React.createRef();\r\n this.state = {\r\n isFilterExpanded: false,\r\n selectedPickupMode: ''\r\n };\r\n }\r\n\r\n public render(): JSX.Element {\r\n const { productPickupListOptionMenuText, productPickupModeList } = this.props;\r\n const selectedPickupModeDesc = productPickupModeList?.find(\r\n (delivery: DeliveryOption) => delivery.Code === this.state.selectedPickupMode\r\n )?.Description;\r\n return (\r\n
\r\n \r\n {this.state.isFilterExpanded ? (\r\n
    \r\n {productPickupModeList?.map((delivery: DeliveryOption) => {\r\n return (\r\n \r\n \r\n \r\n {delivery.Description}\r\n \r\n \r\n \r\n );\r\n })}\r\n
\r\n ) : null}\r\n
\r\n );\r\n }\r\n\r\n /**\r\n * Method to call when drop dwon get selected.\r\n */\r\n private readonly _rendeDeliveryOptions = () => {\r\n const isExpandOptionsState = this.state.isFilterExpanded;\r\n this.setState({\r\n isFilterExpanded: !isExpandOptionsState\r\n });\r\n };\r\n\r\n /**\r\n * Method to call on select pickup mode.\r\n * @param event - Mouse event.\r\n * @returns Void.\r\n */\r\n private readonly _onSelect = async (event: React.MouseEvent): Promise => {\r\n event.preventDefault();\r\n const deliveryCode = event.currentTarget.getAttribute('data-value');\r\n if (deliveryCode !== null) {\r\n this.setState({\r\n selectedPickupMode: deliveryCode\r\n });\r\n\r\n this._rendeDeliveryOptions();\r\n await this.props.onChange(deliveryCode);\r\n }\r\n };\r\n\r\n /**\r\n * Method to call on select pickup mode.\r\n * @param event - Mouse event.\r\n * @returns Void.\r\n */\r\n private readonly _onKeyDown = async (event: React.KeyboardEvent): Promise => {\r\n event.preventDefault();\r\n const deliveryCode = event.currentTarget.getAttribute('data-value');\r\n if (deliveryCode !== null) {\r\n this.setState({\r\n selectedPickupMode: deliveryCode\r\n });\r\n\r\n this._rendeDeliveryOptions();\r\n await this.props.onChange(deliveryCode);\r\n }\r\n };\r\n}\r\n","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\nimport { DeliveryOption, OrgUnitContact, OrgUnitLocation, StoreHours } from '@msdyn365-commerce/retail-proxy';\r\nimport {\r\n getPayloadObject,\r\n getTelemetryAttributes,\r\n IPayLoad,\r\n ITelemetryContent,\r\n TelemetryConstant\r\n} from '@msdyn365-commerce-modules/utilities';\r\nimport * as React from 'react';\r\n\r\nimport { PickUpOptionList } from '../pickup-option-list';\r\nimport { buildStoreHours, IHoursDisplayInfo, secondsToTime } from './date-time-helpers';\r\n\r\n/**\r\n * Store Locator line item resources.\r\n */\r\nexport interface IStoreSelectorLocationLineItemResources {\r\n contactInfoHeader: string;\r\n storeHoursHeader: string;\r\n availabilityInfoHeader: string;\r\n\r\n closedText: string;\r\n\r\n outOfStock: string;\r\n inStock: string;\r\n\r\n currentLocation: string;\r\n selectLocation: string;\r\n selectLocationAriaLabelFormat: string;\r\n setAsPreferredStoreText: string;\r\n setAsPreferredStoreTextAriaLabel: string;\r\n preferredStoreText: string;\r\n preferredStoreAriaLabel: string;\r\n\r\n days: {\r\n monday: string;\r\n tuesday: string;\r\n wednesday: string;\r\n thursday: string;\r\n friday: string;\r\n saturday: string;\r\n sunday: string;\r\n mondayFull: string;\r\n tuesdayFull: string;\r\n wednesdayFull: string;\r\n thursdayFull: string;\r\n fridayFull: string;\r\n saturdayFull: string;\r\n sundayFull: string;\r\n };\r\n}\r\n\r\n/**\r\n * Store Locator line item props.\r\n */\r\nexport interface IStoreSelectorLocationLineItemProps {\r\n location: OrgUnitLocation;\r\n storeHours?: StoreHours;\r\n\r\n storeUrl?: string;\r\n\r\n hideStockStatus?: boolean;\r\n isInStock?: boolean;\r\n isCurrentLocation?: boolean;\r\n\r\n resources: IStoreSelectorLocationLineItemResources;\r\n stockStatusLabel?: string;\r\n storeLocatorView?: boolean;\r\n isPreferredStoreEnabled?: boolean;\r\n index: string;\r\n preferredStoreLocationId: string | null;\r\n storePickUpOptionList?: DeliveryOption[];\r\n productPickUpOptionList?: DeliveryOption[];\r\n filteredPickupMode?: string;\r\n\r\n /**\r\n * The telemetry content\r\n */\r\n telemetryContent?: ITelemetryContent;\r\n preferredDistanceUnit: string;\r\n isLocationDisabled?: boolean;\r\n handlers: {\r\n onSelected(location: OrgUnitLocation, deliveryMode?: string): void;\r\n onSetAsPreferredStore(locationId: string | undefined): void;\r\n onRemovePreferredStore(): void;\r\n };\r\n}\r\n\r\n/**\r\n * Store Locator line item action component.\r\n */\r\nconst StoreSelectorLocationLineItemComponentActions = {\r\n onLocationSelected(props: IStoreSelectorLocationLineItemProps, deliveryMode?: string): void {\r\n props.handlers.onSelected(props.location, deliveryMode);\r\n },\r\n onSetAsPreferredStore(props: IStoreSelectorLocationLineItemProps): void {\r\n props.handlers.onSetAsPreferredStore(props.location.OrgUnitNumber);\r\n },\r\n onRemovePreferredStore(props: IStoreSelectorLocationLineItemProps): void {\r\n props.handlers.onRemovePreferredStore();\r\n }\r\n};\r\n\r\n/**\r\n * Function to render store hours.\r\n * @param storeHours - Store Hours object.\r\n * @param location - Store Unit.\r\n * @param resources - Resources.\r\n * @returns - Jsx element.\r\n */\r\nconst renderStoreHours = (\r\n storeHours: StoreHours | undefined,\r\n location: OrgUnitLocation,\r\n resources: IStoreSelectorLocationLineItemResources\r\n): JSX.Element | null => {\r\n // First, use the store hours. This will allow listing day by day houts\r\n if (storeHours && storeHours.RegularStoreHours) {\r\n const storeHoursList: IHoursDisplayInfo[] = buildStoreHours(storeHours.RegularStoreHours, resources);\r\n\r\n return (\r\n
\r\n {storeHoursList.map(displayTime => (\r\n
\r\n {displayTime.endDayShort ? (\r\n
\r\n {displayTime.startDayShort}–\r\n {displayTime.endDayShort}\r\n
\r\n ) : (\r\n
\r\n {displayTime.startDayShort}\r\n
\r\n )}\r\n
{displayTime.timeRange}
\r\n
\r\n ))}\r\n
\r\n );\r\n }\r\n\r\n // If that fails, fall back to using the OpenFrom and OpenTo properties on the location\r\n const storeOpenFrom: string | undefined = secondsToTime(location.OpenFrom);\r\n const storeOpenTo: string | undefined = secondsToTime(location.OpenTo);\r\n\r\n return (\r\n
\r\n {storeOpenFrom}-{storeOpenTo}\r\n
\r\n );\r\n};\r\n\r\n/**\r\n * Function to retrun distance measure unit.\r\n * @param distance - Store location within radius.\r\n * @param preferredDistanceUnit - Unit configuration.\r\n * @param isLocationDisabled - Flag to check user location.\r\n * @returns - Unit of distance.\r\n */\r\nconst buildDistanceString = (\r\n distance: number | undefined,\r\n preferredDistanceUnit: string,\r\n isLocationDisabled?: boolean\r\n): string | undefined => {\r\n if (distance === undefined || isLocationDisabled) {\r\n return undefined;\r\n } else if (distance < 1) {\r\n return `(<1 ${preferredDistanceUnit})`;\r\n }\r\n return `(${Math.floor(distance)} ${preferredDistanceUnit})`;\r\n};\r\n\r\n/**\r\n * Function to store contact.\r\n * @param contacts - Store location within radius.\r\n * @returns - Return primary contact number of store.\r\n */\r\nconst extractPhoneNumber = (contacts: OrgUnitContact[] | undefined): string | undefined => {\r\n if (!contacts) {\r\n return undefined;\r\n }\r\n\r\n const allPhoneContacts = contacts.filter(contact => contact.ContactTypeValue === 1 && !contact.IsPrivate);\r\n\r\n if (allPhoneContacts && allPhoneContacts.length > 0) {\r\n const primaryPhoneContact = allPhoneContacts.find(contact => contact.IsPrimary);\r\n\r\n if (primaryPhoneContact) {\r\n return primaryPhoneContact.Locator;\r\n }\r\n\r\n return allPhoneContacts[0].Locator;\r\n }\r\n\r\n return undefined;\r\n};\r\n\r\n/**\r\n * On Store locator click functionality.\r\n * @param props -Store locator location items.\r\n * @returns Store locator selected location line item action.\r\n */\r\nconst onPickupInStoreClickHandler = (props: IStoreSelectorLocationLineItemProps) => () => {\r\n StoreSelectorLocationLineItemComponentActions.onLocationSelected(props);\r\n};\r\n\r\n/**\r\n * On Store locator click functionality.\r\n * @param props -Store locator location items.\r\n * @param pickupMode -Store locator location items.\r\n * @returns Store locator selected location line item action.\r\n */\r\nconst onPickupModeSelectHandler = (props: IStoreSelectorLocationLineItemProps, pickupMode?: string) => () => {\r\n StoreSelectorLocationLineItemComponentActions.onLocationSelected(props, pickupMode);\r\n};\r\n\r\n/**\r\n * Set Preferred store functionality.\r\n * @param props -Store locator location items.\r\n * @returns Store locator selected location line item action.\r\n */\r\nconst onSetPreferredStoreClickHandler = (props: IStoreSelectorLocationLineItemProps) => () => {\r\n StoreSelectorLocationLineItemComponentActions.onSetAsPreferredStore(props);\r\n};\r\n\r\n/**\r\n * Remove preferred store functionality.\r\n * @param props -Store locator location items.\r\n * @returns Store locator selected location line item action.\r\n */\r\nconst removePreferredStoreHandler = (props: IStoreSelectorLocationLineItemProps) => () => {\r\n StoreSelectorLocationLineItemComponentActions.onRemovePreferredStore(props);\r\n};\r\n\r\n/**\r\n * On Change functionality.\r\n * @param props -Store locator location items.\r\n * @returns Store locator selected location line item action.\r\n */\r\nconst onChangeHandler = (props: IStoreSelectorLocationLineItemProps) => async (deliveryCode: string): Promise => {\r\n StoreSelectorLocationLineItemComponentActions.onLocationSelected(props, deliveryCode);\r\n return Promise.resolve();\r\n};\r\n\r\n/**\r\n * Method to render pickup modes.\r\n * @param props - StoreSelector Line item props.\r\n * @param deliveryOptionList - Product DeliveryOption List.\r\n * @param pickupInStoreButtonText - Pickup store button text.\r\n * @param pickupInStoreAriaLabel - Pickup store aria label.\r\n * @returns Jsx component.\r\n */\r\nconst renderPickupModes = (\r\n props: IStoreSelectorLocationLineItemProps,\r\n deliveryOptionList: DeliveryOption[],\r\n pickupInStoreButtonText: string,\r\n pickupInStoreAriaLabel: string\r\n): JSX.Element | null => {\r\n if (props.filteredPickupMode === undefined) {\r\n return (\r\n \r\n );\r\n }\r\n return (\r\n \r\n {pickupInStoreButtonText}\r\n \r\n );\r\n};\r\n\r\nconst StoreSelectorLocationLineItem: React.FC = (props: IStoreSelectorLocationLineItemProps) => {\r\n const {\r\n storeUrl,\r\n hideStockStatus,\r\n isCurrentLocation,\r\n isInStock,\r\n location,\r\n resources,\r\n storeHours,\r\n stockStatusLabel,\r\n storeLocatorView,\r\n index,\r\n preferredStoreLocationId,\r\n isPreferredStoreEnabled,\r\n isLocationDisabled,\r\n telemetryContent,\r\n storePickUpOptionList,\r\n productPickUpOptionList\r\n } = props;\r\n\r\n const storeName: string | undefined = location.OrgUnitName;\r\n const distanceAsString: string | undefined = buildDistanceString(location.Distance, props.preferredDistanceUnit, isLocationDisabled);\r\n const storeAddress: string | undefined = location.Address;\r\n const phoneNumber: string | undefined = extractPhoneNumber(location.Contacts);\r\n\r\n const resourceLabel = isInStock ? resources.inStock : resources.outOfStock;\r\n const stockLabel = stockStatusLabel ? stockStatusLabel : undefined;\r\n const stockText: string | undefined = hideStockStatus ? undefined : stockLabel ? stockLabel : resourceLabel;\r\n const canSelectLocation = hideStockStatus || isInStock;\r\n const pickupInStoreButtonText: string = resources.selectLocation;\r\n const pickupInStoreAriaLabel: string = resources.selectLocationAriaLabelFormat.replace('{StoreName}', storeName || '');\r\n const isPreferredStore = preferredStoreLocationId === location.OrgUnitNumber;\r\n const payLoad: IPayLoad = getPayloadObject('click', telemetryContent!, TelemetryConstant.PickupInStore);\r\n const attributes = getTelemetryAttributes(telemetryContent!, payLoad);\r\n payLoad.contentAction.etext = TelemetryConstant.PreferredStore;\r\n const preferredStoreAttr = getTelemetryAttributes(telemetryContent!, payLoad);\r\n payLoad.contentAction.etext = TelemetryConstant.RemovePreferredStore;\r\n const RemovePreferredStoreAttr = getTelemetryAttributes(telemetryContent!, payLoad);\r\n const deliveryOptionList = matchDeliveryOptions(productPickUpOptionList, storePickUpOptionList);\r\n\r\n return (\r\n
\r\n
\r\n {storeLocatorView && {index}}\r\n \r\n {storeUrl && {storeName}}\r\n {!storeUrl && <>{storeName}}\r\n \r\n {distanceAsString ? {distanceAsString} : false}\r\n
\r\n
\r\n
\r\n

{resources.contactInfoHeader}

\r\n {storeAddress && (\r\n
\r\n \r\n {storeAddress}\r\n
\r\n )}\r\n {phoneNumber && (\r\n
\r\n \r\n {phoneNumber}\r\n
\r\n )}\r\n
\r\n
\r\n

{resources.storeHoursHeader}

\r\n {renderStoreHours(storeHours, location, resources)}\r\n
\r\n {!storeLocatorView && (\r\n
\r\n

{resources.availabilityInfoHeader}

\r\n {stockText &&

{stockText}

}\r\n {isCurrentLocation ? (\r\n

{resources.currentLocation}

\r\n ) : canSelectLocation ? (\r\n deliveryOptionList.length === 0 ? (\r\n \r\n {pickupInStoreButtonText}\r\n \r\n ) : (\r\n renderPickupModes(props, deliveryOptionList, pickupInStoreButtonText, pickupInStoreAriaLabel)\r\n )\r\n ) : (\r\n false\r\n )}\r\n
\r\n )}\r\n {isPreferredStoreEnabled ? (\r\n isPreferredStore ? (\r\n \r\n {resources.preferredStoreText}\r\n \r\n ) : (\r\n \r\n {resources.setAsPreferredStoreText}\r\n \r\n )\r\n ) : null}\r\n
\r\n
\r\n );\r\n};\r\n\r\n/**\r\n * Method to check if we have atleast one common delivery code between product and channel.\r\n * @param productdeliveryOptions - Product DeliveryOption List.\r\n * @param storePickUpOptionList - Channel DeliveryOption List.\r\n * @returns DeliveryOptionList.\r\n */\r\nconst matchDeliveryOptions = (\r\n productdeliveryOptions: DeliveryOption[] | undefined,\r\n storePickUpOptionList: DeliveryOption[] | undefined\r\n): DeliveryOption[] => {\r\n const deliveryOption: DeliveryOption[] = [];\r\n productdeliveryOptions?.map(delivery => {\r\n const pickup = storePickUpOptionList?.find(_delivery => _delivery.Code === delivery.Code);\r\n if (pickup) {\r\n deliveryOption.push(pickup);\r\n }\r\n });\r\n\r\n return deliveryOption;\r\n};\r\n\r\nexport const StoreSelectorLocationLineItemComponent = StoreSelectorLocationLineItem as (\r\n props: IStoreSelectorLocationLineItemProps\r\n) => JSX.Element;\r\n","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\nimport { DeliveryOption, ItemAvailability, OrgUnitLocation } from '@msdyn365-commerce/retail-proxy';\r\nimport { ArrayExtensions, IFullOrgUnitAvailability } from '@msdyn365-commerce-modules/retail-actions';\r\nimport { ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\r\nimport classnames from 'classnames';\r\nimport { observable } from 'mobx';\r\nimport { observer } from 'mobx-react';\r\nimport * as React from 'react';\r\n\r\nimport { IStoreSelectorResources } from '../store-selector.props.autogenerated';\r\nimport { IStoreSelectorLocationLineItemResources, StoreSelectorLocationLineItemComponent } from './store-selector-location-line-item';\r\n\r\nexport interface IStoreSelectorLocationLinesProps {\r\n locations?: IFullOrgUnitAvailability[];\r\n resources: IStoreSelectorResources;\r\n preferredDistanceUnit?: string;\r\n storeUrlFormat?: string;\r\n\r\n alreadySelectedLocation?: OrgUnitLocation;\r\n outOfStockThreshold: number;\r\n enableOutOfStockCheck: boolean;\r\n storeLocatorView?: boolean;\r\n selectedStoreLocationId?: string;\r\n isPreferredStoreEnabled?: boolean;\r\n displayList?: boolean;\r\n isLocationDisabled?: boolean;\r\n productPickUpDeliveryOptions?: DeliveryOption[];\r\n onClick: (locationId: string | undefined) => void;\r\n preferredStoreLocationId: string | null;\r\n onSetAsPreferredStore: (locationId: string | undefined) => void;\r\n onRemovePreferredStore: () => void;\r\n filteredPickupMode?: string;\r\n\r\n /**\r\n * The telemetry content\r\n */\r\n telemetryContent?: ITelemetryContent;\r\n onLocationSelected(location: OrgUnitLocation | undefined): void;\r\n}\r\n\r\n/**\r\n * Displays all the location line items, or null if none exists.\r\n */\r\n@observer\r\nexport class StoreSelectorLocationLines extends React.PureComponent {\r\n private readonly selectedLocationRef: React.RefObject;\r\n\r\n @observable private _stores: IFullOrgUnitAvailability[] | undefined;\r\n\r\n private storeCounter: number;\r\n\r\n public constructor(props: IStoreSelectorLocationLinesProps) {\r\n super(props);\r\n this.selectedLocationRef = React.createRef();\r\n this.storeCounter = 0;\r\n }\r\n\r\n public componentDidUpdate(prevProps: IStoreSelectorLocationLinesProps): void {\r\n if (this.props.selectedStoreLocationId !== prevProps.selectedStoreLocationId) {\r\n this._scrollIntoView();\r\n }\r\n }\r\n\r\n public componentDidMount(): void {\r\n if (this.props.locations) {\r\n this._stores = this._sortStores(this.props.locations);\r\n }\r\n }\r\n\r\n public render(): JSX.Element | null {\r\n if (!this._stores || this._stores.length === 0) {\r\n return null;\r\n }\r\n\r\n this.storeCounter = 0;\r\n const regex = /\\{OrgUnitNumber\\}/g;\r\n const storeUrlFormat = this.props.storeUrlFormat;\r\n\r\n return (\r\n
\r\n {this._stores.map((store, index) => {\r\n const orgUnitLocation = store?.OrgUnitAvailability?.OrgUnitLocation;\r\n const orgUnitNumber = orgUnitLocation?.OrgUnitNumber;\r\n const url = orgUnitNumber && storeUrlFormat && storeUrlFormat.replace(regex, orgUnitNumber);\r\n return this._renderStoreLocation(store, index, url);\r\n })}\r\n
\r\n );\r\n }\r\n\r\n /**\r\n * On click Handler function.\r\n * @param orgUnitLocation -OrgUnit location.\r\n * @returns Click action on orgUnit Location.\r\n */\r\n private readonly onClickHandler = (orgUnitLocation: OrgUnitLocation | undefined) => () => {\r\n this.props.onClick(orgUnitLocation?.OrgUnitNumber);\r\n };\r\n\r\n private _renderStoreLocation(store: IFullOrgUnitAvailability, index: number, storeUrl?: string): JSX.Element | undefined {\r\n const orgUnitLocation = store?.OrgUnitAvailability?.OrgUnitLocation;\r\n const selectedStoreLocationId = this.props.selectedStoreLocationId;\r\n const deliveryOptions = store?.OrgUnitPickUpDeliveryModes;\r\n const defaultAriaSetsize = 0;\r\n if (orgUnitLocation) {\r\n ++this.storeCounter;\r\n return (\r\n \r\n \r\n \r\n );\r\n }\r\n return undefined;\r\n }\r\n\r\n private _sortStores(stores: IFullOrgUnitAvailability[]): IFullOrgUnitAvailability[] {\r\n const isPreferredStore = (value: IFullOrgUnitAvailability) =>\r\n this.props.isPreferredStoreEnabled &&\r\n this.props.preferredStoreLocationId &&\r\n value?.OrgUnitAvailability?.OrgUnitLocation?.OrgUnitNumber === this.props.preferredStoreLocationId;\r\n\r\n return [...stores.filter(isPreferredStore), ...stores.filter(store => !isPreferredStore(store))];\r\n }\r\n\r\n private readonly _scrollIntoView = () => {\r\n const selectedLocationDiv = this.selectedLocationRef.current;\r\n const parent = selectedLocationDiv?.parentElement;\r\n if (selectedLocationDiv && parent) {\r\n if (parent.scrollTop > selectedLocationDiv.offsetTop) {\r\n parent.scrollTop = selectedLocationDiv.offsetTop;\r\n } else if (selectedLocationDiv.offsetTop + selectedLocationDiv.clientHeight > parent.scrollTop + parent.clientHeight) {\r\n parent.scrollTop = selectedLocationDiv.offsetTop + selectedLocationDiv.clientHeight - parent.clientHeight;\r\n }\r\n }\r\n };\r\n\r\n private readonly _isCurrentLocation = (location: OrgUnitLocation | undefined): boolean =>\r\n (this.props.alreadySelectedLocation && location && this.props.alreadySelectedLocation.OrgUnitNumber === location.OrgUnitNumber) ||\r\n false;\r\n\r\n private readonly _isProductInStock = (ItemAvailabilities: ItemAvailability[] | undefined): boolean => {\r\n if (!this.props.enableOutOfStockCheck) {\r\n return true;\r\n }\r\n\r\n if (ItemAvailabilities && ItemAvailabilities.length > 0) {\r\n return ItemAvailabilities[0].AvailableQuantity ? ItemAvailabilities[0].AvailableQuantity > 0 : false;\r\n }\r\n\r\n return false;\r\n };\r\n\r\n private readonly _stockInventoryLabel = (availabilityWithHours: IFullOrgUnitAvailability | undefined): string | undefined => {\r\n if (availabilityWithHours?.ProductInventoryInformation && availabilityWithHours?.ProductInventoryInformation.length > 0) {\r\n for (let i = 0; i < availabilityWithHours.ProductInventoryInformation.length; i++) {\r\n if (\r\n availabilityWithHours.OrgUnitAvailability?.OrgUnitLocation?.InventoryLocationId ===\r\n availabilityWithHours.ProductInventoryInformation[i].InventLocationId\r\n ) {\r\n return availabilityWithHours.ProductInventoryInformation[i].StockLevelLabel;\r\n }\r\n }\r\n }\r\n\r\n return undefined;\r\n };\r\n\r\n private readonly _mapResources = (resources: IStoreSelectorResources): IStoreSelectorLocationLineItemResources => {\r\n return {\r\n contactInfoHeader: resources.contactText,\r\n storeHoursHeader: resources.timeText,\r\n availabilityInfoHeader: resources.availabilityText,\r\n\r\n closedText: resources.storeHoursClosedText,\r\n outOfStock: resources.outOfStockText,\r\n inStock: resources.inStockText,\r\n\r\n currentLocation: resources.selectedStoreLocationText,\r\n selectLocation: resources.selectStoreText,\r\n selectLocationAriaLabelFormat: resources.selectStoreAriaFormatText,\r\n setAsPreferredStoreText: resources.setAsPreferredStoreText,\r\n setAsPreferredStoreTextAriaLabel: resources.setAsPreferredStoreTextAriaLabel,\r\n preferredStoreText: resources.preferredStoreText,\r\n preferredStoreAriaLabel: resources.preferredStoreAriaLabel,\r\n\r\n days: {\r\n monday: resources.storeHoursMondayText,\r\n tuesday: resources.storeHoursTuesdayText,\r\n wednesday: resources.storeHoursWednesdayText,\r\n thursday: resources.storeHoursThursdayText,\r\n friday: resources.storeHoursFridayText,\r\n saturday: resources.storeHoursSaturdayText,\r\n sunday: resources.storeHoursSundayText,\r\n mondayFull: resources.storeHoursMondayFullText,\r\n tuesdayFull: resources.storeHoursTuesdayFullText,\r\n wednesdayFull: resources.storeHoursWednesdayFullText,\r\n thursdayFull: resources.storeHoursThursdayFullText,\r\n fridayFull: resources.storeHoursFridayFullText,\r\n saturdayFull: resources.storeHoursSaturdayFullText,\r\n sundayFull: resources.storeHoursSundayFullText\r\n }\r\n };\r\n };\r\n}\r\n","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\nimport * as Msdyn365 from '@msdyn365-commerce/core';\r\nimport { DeliveryOption } from '@msdyn365-commerce/retail-proxy';\r\nimport {\r\n getPayloadObject,\r\n getTelemetryAttributes,\r\n IPayLoad,\r\n ITelemetryContent,\r\n KeyCodes,\r\n TelemetryConstant\r\n} from '@msdyn365-commerce-modules/utilities';\r\nimport * as React from 'react';\r\n\r\nimport { StorePickUpOptionList } from './store-pickup-option-list';\r\n\r\n/**\r\n * Store Selector Search Form Props interface.\r\n */\r\nexport interface IStoreSelectorSearchFormProps {\r\n resources: {\r\n searchInputAriaLabel: string;\r\n searchButtonAriaLabel: string;\r\n searchPlaceholderText: string;\r\n seeAllStoresText: string;\r\n viewListText: string;\r\n viewMapText: string;\r\n pickupFilterByHeading?: string;\r\n pickupFilterMenuHeading?: string;\r\n };\r\n\r\n id: string;\r\n value: string;\r\n isMapDisabled?: boolean;\r\n showAllStores?: boolean;\r\n displayList?: boolean;\r\n locatorView?: boolean;\r\n productPickUpDeliveryOptions?: DeliveryOption[];\r\n hasEnabledPickupFilterToShowStore?: boolean;\r\n filteredPickupMode?: string;\r\n\r\n /**\r\n * The telemetry content\r\n */\r\n telemetryContent?: ITelemetryContent;\r\n onShowAllStores(): void;\r\n onToggleListMapViewState(): void;\r\n performSearch(searchTerm: string): Promise;\r\n searchTermChanged(searchTerm: string): Promise;\r\n filterPickupModeSelected(pickupMode: string): void;\r\n}\r\n\r\n/**\r\n * Simple search form consisting of search text and a search button.\r\n */\r\nexport class StoreSelectorSearchForm extends React.PureComponent {\r\n private readonly searchBoxRef: React.RefObject = React.createRef();\r\n\r\n private readonly storeSearchAttributes: Msdyn365.IDictionary | undefined;\r\n\r\n private readonly showAllStoreAttributes: Msdyn365.IDictionary | undefined;\r\n\r\n private readonly toggleMapViewAttributes: Msdyn365.IDictionary | undefined;\r\n\r\n constructor(props: IStoreSelectorSearchFormProps) {\r\n super(props);\r\n this.state = { value: '' };\r\n this._handleKeyPressPrev = this._handleKeyPressPrev.bind(this);\r\n const payLoad: IPayLoad = getPayloadObject('click', props.telemetryContent!, TelemetryConstant.SearchStore);\r\n this.storeSearchAttributes = getTelemetryAttributes(props.telemetryContent!, payLoad);\r\n payLoad.contentAction.etext = TelemetryConstant.ShowAllStore;\r\n this.showAllStoreAttributes = getTelemetryAttributes(props.telemetryContent!, payLoad);\r\n payLoad.contentAction.etext = TelemetryConstant.ToggleMapView;\r\n this.toggleMapViewAttributes = getTelemetryAttributes(props.telemetryContent!, payLoad);\r\n }\r\n\r\n public render(): JSX.Element {\r\n const {\r\n resources: {\r\n searchButtonAriaLabel,\r\n searchPlaceholderText,\r\n seeAllStoresText,\r\n viewListText,\r\n viewMapText,\r\n pickupFilterByHeading,\r\n pickupFilterMenuHeading\r\n },\r\n id,\r\n value,\r\n isMapDisabled,\r\n showAllStores,\r\n displayList,\r\n locatorView,\r\n onShowAllStores,\r\n productPickUpDeliveryOptions,\r\n hasEnabledPickupFilterToShowStore\r\n } = this.props;\r\n\r\n const toggleButtonText = displayList ? viewMapText : viewListText;\r\n\r\n return (\r\n
\r\n \r\n
\r\n )}\r\n {this.renderPickupModesList(\r\n this.props,\r\n toggleButtonText,\r\n productPickUpDeliveryOptions,\r\n pickupFilterMenuHeading,\r\n locatorView,\r\n pickupFilterByHeading,\r\n hasEnabledPickupFilterToShowStore\r\n )}\r\n \r\n );\r\n }\r\n\r\n /**\r\n * Calls method display result.\r\n * @param event - The first number.\r\n */\r\n private readonly _handleKeyPressPrev = (event: React.KeyboardEvent): void => {\r\n if (event.keyCode === KeyCodes.Enter || event.keyCode === KeyCodes.Space) {\r\n this.props.onShowAllStores();\r\n }\r\n };\r\n\r\n /**\r\n * Method called on search text changed.\r\n * @param event - Input value.\r\n */\r\n private readonly _searchTextChanged = async (event: React.ChangeEvent): Promise => {\r\n const inputValue: string = event.target.value;\r\n\r\n await this.props.searchTermChanged(inputValue);\r\n };\r\n\r\n /**\r\n * Method called on search submit.\r\n * @param event - Input value.\r\n */\r\n private readonly _onSubmit = async (event: React.SyntheticEvent): Promise => {\r\n event.preventDefault(); // Prevents form submission\r\n this.searchBoxRef.current?.blur();\r\n await this.props.performSearch(this.props.value);\r\n };\r\n\r\n /**\r\n * Method called on product pickup option change.\r\n * @returns - Void.\r\n */\r\n private readonly _onChangeHandler = () => async (deliveryCode: string): Promise => {\r\n this.props.filterPickupModeSelected(deliveryCode);\r\n return Promise.resolve();\r\n };\r\n\r\n /**\r\n * Method to render pickup mode list.\r\n * @param props - Store selector search form props.\r\n * @param toggleButtonText - Locator view button text.\r\n * @param productPickUpDeliveryOptions - Product DeliveryOption List.\r\n * @param pickupFilterMenuHeading - Pickup store button text.\r\n * @param locatorView - Locator View is on\\off.\r\n * @param pickupFilterByHeading - Pickup list label text.\r\n * @param hasEnabledPickupFilterToShowStore - Flag to check header filter is enabled.\r\n * @returns Jsx component.\r\n */\r\n private readonly renderPickupModesList = (\r\n props: IStoreSelectorSearchFormProps,\r\n toggleButtonText: string,\r\n productPickUpDeliveryOptions: DeliveryOption[] | undefined,\r\n pickupFilterMenuHeading: string | undefined,\r\n locatorView: boolean | undefined,\r\n pickupFilterByHeading: string | undefined,\r\n hasEnabledPickupFilterToShowStore: boolean | undefined\r\n ): JSX.Element | null => {\r\n if (hasEnabledPickupFilterToShowStore) {\r\n return (\r\n
\r\n {locatorView && (\r\n \r\n {toggleButtonText}\r\n \r\n )}\r\n \r\n
{pickupFilterByHeading}
\r\n
\r\n );\r\n }\r\n if (locatorView) {\r\n return (\r\n \r\n );\r\n }\r\n return null;\r\n };\r\n}\r\n","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\nimport * as Msdyn365 from '@msdyn365-commerce/core';\r\nimport { IFullOrgUnitAvailability } from '@msdyn365-commerce-modules/retail-actions';\r\nimport classnames from 'classnames';\r\nimport * as React from 'react';\r\n\r\nimport { IStoreSelectorResources, ITermsOfServiceLinkData } from '../store-selector.props.autogenerated';\r\n\r\nexport interface IStoreSelectorEmptyMessageProps {\r\n resources: IStoreSelectorResources;\r\n}\r\nexport const StoreSelectorEmptyMessage: React.FC = ({ resources }) => (\r\n
\r\n

{resources.emptyLocationsText}

\r\n
\r\n);\r\n\r\nexport const StoreSelectorWaiting: React.FC = () =>
;\r\n\r\nexport interface IStoreSelectorTermsOfServiceProps {\r\n link?: ITermsOfServiceLinkData;\r\n requestContext: Msdyn365.IRequestContext;\r\n onTextChange?(event: Msdyn365.ContentEditableEvent): void;\r\n}\r\n\r\nexport const StoreSelectorTermsOfService: React.FC = ({ link, requestContext, onTextChange }) => {\r\n if (link) {\r\n const editableLink: Msdyn365.ILinksData = {\r\n ariaLabel: link.ariaLabel,\r\n className: 'ms-store-select__terms-link',\r\n linkText: link.linkText,\r\n linkUrl: link.linkUrl.destinationUrl,\r\n openInNewTab: link.openInNewTab,\r\n role: 'link'\r\n };\r\n\r\n return (\r\n
\r\n \r\n
\r\n );\r\n }\r\n return null;\r\n};\r\n\r\nexport interface IStoreSelectorFoundLocationsMessage {\r\n resources: IStoreSelectorResources;\r\n locations?: IFullOrgUnitAvailability[];\r\n searchRadius: number;\r\n preferredDistanceUnit: string;\r\n isSeeAllStore: boolean;\r\n}\r\nexport const StoreSelectorFoundLocationsMessage: React.FC = ({\r\n locations,\r\n searchRadius,\r\n resources,\r\n isSeeAllStore,\r\n preferredDistanceUnit\r\n}) => {\r\n if (locations) {\r\n const storeCountMessage =\r\n preferredDistanceUnit === resources.milesShortText ? resources.storeCountMessage : resources.storeCountMessageInKm;\r\n return (\r\n
\r\n {isSeeAllStore\r\n ? resources.storeAllCountMessage.replace('{count}', locations.length.toString())\r\n : storeCountMessage.replace('{count}', locations.length.toString()).replace('{radius}', searchRadius.toString())}\r\n
\r\n );\r\n }\r\n\r\n return null;\r\n};\r\n","/**\r\n * Copyright (c) Microsoft Corporation\r\n * All rights reserved. See License.txt in the project root for license information.\r\n * IStoreSelector 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 mode {\r\n findStores = 'findStores',\r\n pickupInStore = 'pickupInStore'\r\n}\r\n\r\nexport const enum searchRadiusUnit {\r\n miles = 'miles',\r\n kilometers = 'kilometers'\r\n}\r\n\r\nexport const enum style {\r\n inline = 'inline',\r\n dialog = 'dialog'\r\n}\r\n\r\nexport interface IStoreSelectorConfig extends Msdyn365.IModuleConfig {\r\n heading?: string;\r\n termsOfServiceLink?: ITermsOfServiceLinkData;\r\n mode?: mode;\r\n searchRadiusUnit?: searchRadiusUnit;\r\n lookupRadius: number;\r\n style?: style;\r\n setAsPreferredStore?: boolean;\r\n enablePickupFilterToShowStore?: boolean;\r\n showAllStores?: boolean;\r\n autoSuggestionEnabled?: boolean;\r\n autoSuggestOptions?: IAutoSuggestOptionsData;\r\n storeUrlFormat?: string;\r\n className?: string;\r\n}\r\n\r\nexport interface IStoreSelectorResources {\r\n searchPlaceholderText: string;\r\n searchButtonAriaLabel: string;\r\n searchInputAriaLabel: string;\r\n outOfStockText: string;\r\n inStockText: string;\r\n selectedStoreLocationText: string;\r\n emptyLocationsText: string;\r\n selectStoreText: string;\r\n selectStoreAriaFormatText: string;\r\n setAsPreferredStoreText: string;\r\n setAsPreferredStoreTextAriaLabel: string;\r\n preferredStoreText: string;\r\n preferredStoreAriaLabel: string;\r\n timeText: string;\r\n captionText: string;\r\n milesShortText: string;\r\n kilometersShortText: string;\r\n contactText: string;\r\n availabilityText: string;\r\n productDimensionTypeColor: string;\r\n productDimensionTypeConfiguration: string;\r\n productDimensionTypeSize: string;\r\n productDimensionTypeStyle: string;\r\n storeHoursClosedText: string;\r\n storeHoursMondayText: string;\r\n storeHoursTuesdayText: string;\r\n storeHoursWednesdayText: string;\r\n storeHoursThursdayText: string;\r\n storeHoursFridayText: string;\r\n storeHoursSaturdayText: string;\r\n storeHoursSundayText: string;\r\n storeHoursMondayFullText: string;\r\n storeHoursTuesdayFullText: string;\r\n storeHoursWednesdayFullText: string;\r\n storeHoursThursdayFullText: string;\r\n storeHoursFridayFullText: string;\r\n storeHoursSaturdayFullText: string;\r\n storeHoursSundayFullText: string;\r\n storePhoneAriaLabel: string;\r\n storeAddressAriaLabel: string;\r\n storeCountMessage: string;\r\n storeAllCountMessage: string;\r\n storeCountMessageInKm: string;\r\n storeSelectorHeaderText: string;\r\n storeLocatorHeaderText: string;\r\n seeAllStoresText: string;\r\n viewMapText: string;\r\n viewListText: string;\r\n pickupFilterByHeading: string;\r\n pickupFilterMenuHeading: string;\r\n}\r\n\r\nexport interface ITermsOfServiceLinkData {\r\n linkText?: string;\r\n linkUrl: Msdyn365.ILinkData;\r\n ariaLabel?: string;\r\n openInNewTab?: boolean;\r\n}\r\n\r\nexport interface IAutoSuggestOptionsData {\r\n maxResults?: number;\r\n}\r\n\r\nexport interface IStoreSelectorProps extends Msdyn365.IModule {\r\n resources: IStoreSelectorResources;\r\n config: IStoreSelectorConfig;\r\n}\r\n","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\n/// \r\n\r\nimport * as Msdyn365 from '@msdyn365-commerce/core';\r\nimport { DeliveryOption, ItemAvailability, OrgUnitLocation, StoreHours } from '@msdyn365-commerce/retail-proxy';\r\nimport { IStoreInfo } from '@msdyn365-commerce-modules/bopis-utilities';\r\nimport {\r\n ArrayExtensions,\r\n getFullAvailableInventoryNearby,\r\n GetFullAvailableInventoryNearbyInput,\r\n getOrgUnitLocationsByArea,\r\n GetOrgUnitLocationsByAreaInput,\r\n IFullOrgUnitAvailability\r\n} from '@msdyn365-commerce-modules/retail-actions';\r\nimport {\r\n getTelemetryObject,\r\n IModuleProps,\r\n INodeProps,\r\n ITelemetryContent,\r\n Modal,\r\n ModalBody,\r\n ModalFooter,\r\n ModalHeader,\r\n NodeTag\r\n} from '@msdyn365-commerce-modules/utilities';\r\nimport classname from 'classnames';\r\nimport { reaction, when } from 'mobx';\r\nimport { observer } from 'mobx-react';\r\nimport * as React from 'react';\r\n\r\nimport {\r\n StoreSelectorEmptyMessage,\r\n StoreSelectorFoundLocationsMessage,\r\n StoreSelectorLocationLines,\r\n StoreSelectorSearchForm,\r\n StoreSelectorTermsOfService,\r\n StoreSelectorWaiting\r\n} from './components';\r\nimport { buildStoreHours, IHoursDisplayInfo, secondsToTime } from './components/store-selector-location-line-item/date-time-helpers';\r\nimport { IStoreSelectorData } from './store-selector.data';\r\nimport {\r\n IStoreSelectorProps,\r\n IStoreSelectorResources,\r\n mode as modeEnum,\r\n searchRadiusUnit,\r\n style as styleEnum\r\n} from './store-selector.props.autogenerated';\r\n\r\n/**\r\n * StoreSelector State Interface.\r\n */\r\nexport interface IStoreSelectorState {\r\n isSearchInProgress: boolean;\r\n searchTerm?: string;\r\n isSeeAllStoreValue: boolean;\r\n isLocationDisabled?: boolean;\r\n filteredPickupMode?: string;\r\n}\r\n\r\n/**\r\n * StoreSelector View Props Interface.\r\n */\r\nexport interface IStoreSelectorViewProps extends IStoreSelectorProps {\r\n state: IStoreSelectorState;\r\n\r\n // Containers:\r\n ModuleProps: IModuleProps;\r\n BodyContainerProps: INodeProps;\r\n FooterContainerProps: INodeProps;\r\n HeaderContainerProps: INodeProps;\r\n HeaderProps?: React.ReactNode;\r\n\r\n // Components\r\n locationsMessage?: React.ReactNode;\r\n search?: React.ReactNode;\r\n spinner?: React.ReactNode;\r\n locationsList?: React.ReactNode;\r\n noLocationsMessage?: React.ReactNode;\r\n terms?: React.ReactNode;\r\n headerText?: React.ReactNode;\r\n sortLocations?: IFullOrgUnitAvailability[];\r\n locationListProps?: IStoreSelectorLocationLineItemProps[];\r\n\r\n callbacks: {\r\n closeDialog(): Promise;\r\n searchTermChanged(searchTerm: string): Promise;\r\n performSearch(searchTerm: string): Promise;\r\n selectedLocation(location: OrgUnitLocation | undefined): Promise;\r\n getAndUpdateUserLocation(): Promise;\r\n attachMapAutoSuggest(): Promise;\r\n onSuggestionSelected(result: Microsoft.Maps.ISuggestionResult): Promise;\r\n setPreferredStore(storeId: string | undefined): Promise;\r\n removePreferredStore(): Promise;\r\n setSelectedStore(storeId: string | undefined): Promise;\r\n setOrgUnitStoreInformation(location: OrgUnitLocation | undefined): Promise;\r\n };\r\n}\r\n\r\n/**\r\n * StoreSelectorLocation Line Resources Interface.\r\n */\r\nexport interface IStoreSelectorLocationLineItemResources {\r\n contactInfoHeader: string;\r\n storeHoursHeader: string;\r\n availabilityInfoHeader: string;\r\n closedText: string;\r\n outOfStock: string;\r\n inStock: string;\r\n currentLocation: string;\r\n selectLocation: string;\r\n selectLocationAriaLabelFormat: string;\r\n setAsPreferredStoreText: string;\r\n setAsPreferredStoreTextAriaLabel: string;\r\n preferredStoreText: string;\r\n preferredStoreAriaLabel: string;\r\n\r\n days: {\r\n monday: string;\r\n tuesday: string;\r\n wednesday: string;\r\n thursday: string;\r\n friday: string;\r\n saturday: string;\r\n sunday: string;\r\n mondayFull: string;\r\n tuesdayFull: string;\r\n wednesdayFull: string;\r\n thursdayFull: string;\r\n fridayFull: string;\r\n saturdayFull: string;\r\n sundayFull: string;\r\n };\r\n}\r\n\r\n/**\r\n * ILocationHours Interface.\r\n */\r\nexport interface ILocationHours {\r\n openFrom?: string;\r\n openTo?: string;\r\n}\r\n\r\n/**\r\n * StoreSelectorLocation Line Item Props Interface.\r\n */\r\nexport interface IStoreSelectorLocationLineItemProps {\r\n location: OrgUnitLocation;\r\n storeHours?: StoreHours;\r\n storeHoursList?: IHoursDisplayInfo[];\r\n\r\n hideStockStatus?: boolean;\r\n isInStock?: boolean;\r\n isCurrentLocation?: boolean;\r\n\r\n resources: IStoreSelectorLocationLineItemResources;\r\n stockStatusLabel?: string;\r\n storeLocatorView?: boolean;\r\n isPreferredStoreEnabled?: boolean;\r\n index: string;\r\n preferredStoreLocationId: string | null;\r\n storePickUpOptionList?: DeliveryOption[];\r\n productPickUpOptionList?: DeliveryOption[];\r\n selectedStoreLocationId?: string;\r\n locationOpen?: ILocationHours;\r\n\r\n /**\r\n * The telemetry content\r\n */\r\n telemetryContent?: ITelemetryContent;\r\n preferredDistanceUnit: string;\r\n isLocationDisabled?: boolean;\r\n handlers: {\r\n onSelected(location: OrgUnitLocation, deliveryMode?: string): void;\r\n onSetAsPreferredStore(locationId: string | undefined): void;\r\n onRemovePreferredStore(): void;\r\n };\r\n onClick: (locationId: string | undefined) => void;\r\n}\r\n\r\n/**\r\n *\r\n * Pick Up In Store module.\r\n * @extends React.Component>}\r\n */\r\n@observer\r\nclass StoreSelector extends React.Component, IStoreSelectorState> {\r\n private autoSuggestManager: Microsoft.Maps.AutosuggestManager | undefined;\r\n\r\n private readonly telemetryContent: ITelemetryContent;\r\n\r\n private storeCounter: number;\r\n\r\n public constructor(props: IStoreSelectorProps) {\r\n super(props);\r\n this.state = { isSearchInProgress: true, searchTerm: '', isSeeAllStoreValue: false, filteredPickupMode: undefined };\r\n this.telemetryContent = getTelemetryObject(\r\n this.props.context.request.telemetryPageName!,\r\n this.props.friendlyName,\r\n this.props.telemetry\r\n );\r\n this.storeCounter = 0;\r\n }\r\n\r\n public componentDidMount(): void {\r\n const {\r\n context: {\r\n actionContext: {\r\n requestContext: { channel }\r\n }\r\n },\r\n config: { autoSuggestionEnabled }\r\n } = this.props;\r\n\r\n // Adding Timeout to make sure it loads the data based upon the preferred store.\r\n setTimeout(() => {\r\n this._getAndUpdateStoreLocation();\r\n }, 0);\r\n\r\n reaction(\r\n () => this.props.data.storeSelectorStateManager.result?.isDialogOpen,\r\n async () => {\r\n const context = this.props.data.storeSelectorStateManager.result?.context;\r\n if (context?.id === this.props.id) {\r\n this._getAndUpdateStoreLocation();\r\n }\r\n }\r\n );\r\n\r\n reaction(\r\n () => this.props.data.storeSelectorStateManager.result?.context?.id,\r\n async () => {\r\n const context = this.props.data.storeSelectorStateManager.result?.context;\r\n if (!context || context?.id === this.props.id) {\r\n await this._searchTermChanged('');\r\n this._getAndUpdateStoreLocation();\r\n }\r\n }\r\n );\r\n\r\n if (this.props.data.storeSelectorStateManager.result?.loadMapApi) {\r\n this.props.data.storeSelectorStateManager.result\r\n ?.loadMapApi({\r\n key: channel?.BingMapsEnabled ? channel?.BingMapsApiKey : '',\r\n lang: this.props.context?.actionContext?.requestContext?.channel?.DefaultLanguageId,\r\n market: this.props.context?.actionContext?.requestContext?.channel?.ChannelCountryRegionISOCode\r\n })\r\n .then()\r\n .catch();\r\n }\r\n\r\n reaction(\r\n () => this.props.data.storeSelectorStateManager.result?.loadMapApi,\r\n () => {\r\n this.props.data.storeSelectorStateManager.result?.loadMapApi({\r\n key: channel?.BingMapsEnabled ? channel.BingMapsApiKey : '',\r\n lang: this.props.context.actionContext.requestContext.channel?.DefaultLanguageId,\r\n market: this.props.context.actionContext.requestContext.channel?.ChannelCountryRegionISOCode\r\n });\r\n }\r\n );\r\n\r\n if (autoSuggestionEnabled) {\r\n when(\r\n () => {\r\n const isMapApiLoaded = !!this.props.data.storeSelectorStateManager.result?.isMapApiLoaded;\r\n const isDialogOpen = !!this.props.data.storeSelectorStateManager.result?.isDialogOpen;\r\n const isSameContext = this.props.data.storeSelectorStateManager.result?.context?.id === this.props.id;\r\n return isMapApiLoaded && isDialogOpen && isSameContext;\r\n },\r\n async () => {\r\n setTimeout(async () => {\r\n await this._attachMapAutoSuggest();\r\n }, 0);\r\n }\r\n );\r\n }\r\n }\r\n\r\n public shouldComponentUpdate(nextProps: IStoreSelectorProps): boolean {\r\n const {\r\n data: {\r\n storeSelectorStateManager: { result: storeSelectorStateManager }\r\n }\r\n } = this.props;\r\n const context = storeSelectorStateManager ? storeSelectorStateManager.context : undefined;\r\n if (context && context.id === this.props.id) {\r\n return true;\r\n }\r\n return false;\r\n }\r\n\r\n // eslint-disable-next-line complexity -- disabling the complexity for this method for now as its causing lot of other warnings\r\n public render(): JSX.Element {\r\n const {\r\n config: {\r\n termsOfServiceLink,\r\n className,\r\n heading,\r\n mode,\r\n style,\r\n setAsPreferredStore,\r\n showAllStores,\r\n lookupRadius,\r\n enablePickupFilterToShowStore\r\n },\r\n context: {\r\n telemetry,\r\n app: { config: appConfig },\r\n actionContext: {\r\n requestContext: { channel, cookies }\r\n }\r\n },\r\n resources,\r\n data: {\r\n availabilitiesWithHours: { result: availabilitiesWithHours },\r\n storeSelectorStateManager: { result: storeSelectorStateManager },\r\n storeLocations: { result: storeLocations }\r\n }\r\n } = this.props;\r\n\r\n this.storeCounter = 0;\r\n const isMapDisabled = !(channel && channel.BingMapsApiKey && channel.BingMapsEnabled);\r\n const context = storeSelectorStateManager ? storeSelectorStateManager.context : undefined;\r\n const isDialogOpen: boolean = storeSelectorStateManager\r\n ? storeSelectorStateManager.isDialogOpen && context?.id === this.props.id\r\n : false;\r\n const styleDefault = style !== undefined ? style : styleEnum.dialog;\r\n const modeDefault = mode !== undefined ? mode : modeEnum.pickupInStore;\r\n const inlineView = styleDefault === styleEnum.inline;\r\n const locatorView = modeDefault === modeEnum.findStores;\r\n const hideInventory = locatorView;\r\n const selectedStoreLocationId = storeSelectorStateManager?.selectedStoreLocationId;\r\n const preferredStore: IStoreInfo | undefined = storeSelectorStateManager?.preferredStore;\r\n const displayList = storeSelectorStateManager?.listMapViewState?.displayList;\r\n const isPreferredStoreEnabled = setAsPreferredStore && cookies?.isConsentGiven();\r\n const showLocationView =\r\n context &&\r\n (context.showMapViewLink === undefined || context.showMapViewLink) &&\r\n locatorView &&\r\n storeSelectorStateManager?.isMapModuleLoaded;\r\n\r\n const StoreSelectorActions = {\r\n toggleListMapViewState(): void {\r\n storeSelectorStateManager?.toggleListMapViewState();\r\n }\r\n };\r\n\r\n if (!(channel && channel.BingMapsApiKey)) {\r\n telemetry.error('BingMapsApiKey is missing.');\r\n }\r\n\r\n const configHeading = heading ? heading : locatorView ? resources.storeLocatorHeaderText : resources.storeSelectorHeaderText;\r\n const preferredDistanceUnit =\r\n this.props.config.searchRadiusUnit === searchRadiusUnit.kilometers ? resources.kilometersShortText : resources.milesShortText;\r\n const preferredLocationId = preferredStore?.StoreId ? preferredStore.StoreId : '';\r\n const locationsList: IFullOrgUnitAvailability[] | undefined = hideInventory ? storeLocations : availabilitiesWithHours;\r\n let sortLocation = null;\r\n if (locationsList) {\r\n sortLocation = this._sortStores(locationsList, isPreferredStoreEnabled, preferredLocationId);\r\n }\r\n const enableOutofStock = appConfig?.enableStockCheck || false;\r\n const alreadySelectedLocation = context ? context.alreadySelectedLocation : undefined;\r\n const productPickUpOptionList = storeSelectorStateManager?.context?.deliveryOptions?.DeliveryOptions;\r\n const locationListProps = this._getStoreLocationListProps(\r\n enableOutofStock,\r\n locatorView,\r\n preferredLocationId,\r\n isPreferredStoreEnabled,\r\n selectedStoreLocationId,\r\n locationsList ?? null,\r\n preferredDistanceUnit,\r\n alreadySelectedLocation,\r\n productPickUpOptionList\r\n );\r\n const viewProps = {\r\n ...(this.props as IStoreSelectorProps),\r\n state: this.state,\r\n\r\n ModuleProps: {\r\n tag: inlineView ? ('div' as NodeTag) : Modal,\r\n moduleProps: this.props,\r\n className: classname(\r\n `ms-store-${inlineView ? 'locate' : 'select'}`,\r\n className,\r\n inlineView ? '' : 'msc-modal-input-required'\r\n ),\r\n autoFocus: true,\r\n fade: true,\r\n isOpen: isDialogOpen,\r\n 'aria-label': configHeading,\r\n onClosed: this._closeDialog,\r\n horizontalPosition: 'center',\r\n verticalPosition: 'center',\r\n toggle: this._closeDialog\r\n },\r\n HeaderContainerProps: {\r\n tag: inlineView ? ('div' as NodeTag) : ModalHeader,\r\n className: `ms-store-select__${inlineView ? 'header' : 'modal-header'}`,\r\n toggle: this._closeDialog\r\n },\r\n HeaderProps: configHeading && (\r\n \r\n ),\r\n FooterContainerProps: {\r\n tag: inlineView ? ('div' as NodeTag) : ModalFooter,\r\n className: `ms-store-select__${inlineView ? 'footer' : 'modal-footer'} ${!displayList ? 'map-only-view' : ''}`\r\n },\r\n BodyContainerProps: {\r\n tag: inlineView ? ('div' as NodeTag) : ModalBody,\r\n className: `ms-store-select__${inlineView ? 'body' : 'modal-body'}`\r\n },\r\n locationsMessage: !this.state.isLocationDisabled && (\r\n \r\n ),\r\n search: (\r\n \r\n ),\r\n spinner: ,\r\n locationsList: ((availabilitiesWithHours && availabilitiesWithHours.length) || (storeLocations && storeLocations.length)) && (\r\n \r\n ),\r\n noLocationsMessage: ,\r\n terms: (\r\n \r\n ),\r\n\r\n // Not being used in current context, we can use it here to pass more props.\r\n headerText: (\r\n {heading ? heading : locatorView ? resources.storeLocatorHeaderText : resources.storeSelectorHeaderText}\r\n ),\r\n sortLocations: sortLocation,\r\n locationListProps,\r\n callbacks: {\r\n searchTermChanged: this._searchTermChanged,\r\n performSearch: this._performSearch,\r\n closeDialog: this._closeDialog,\r\n selectedLocation: this._onOrgUnitLocationSelected,\r\n getAndUpdateUserLocation: async () => {\r\n this._getAndUpdateStoreLocation();\r\n return Promise.resolve();\r\n },\r\n attachMapAutoSuggest: this._attachMapAutoSuggest,\r\n onSuggestionSelected: this._onOrgUnitLocationSelected,\r\n setPreferredStore: this._setPreferredStore,\r\n removePreferredStore: this._removePreferredStore,\r\n setSelectedStore: this._setSelectedStore,\r\n setOrgUnitStoreInformation: this._setOrgUnitStoreInformation\r\n }\r\n } as IStoreSelectorViewProps;\r\n\r\n return this.props.renderView(viewProps) as React.ReactElement;\r\n }\r\n\r\n /**\r\n * Method to be called on link text change.\r\n * @param event -Content Edit Event.\r\n */\r\n public handleLinkTextChange = (event: Msdyn365.ContentEditableEvent) => {\r\n if (this.props.config.termsOfServiceLink) {\r\n this.props.config.termsOfServiceLink.linkText = event.target.value;\r\n }\r\n };\r\n\r\n /**\r\n * Method to be called on heading change.\r\n * @param event -Content Edit Event.\r\n * @returns Set the heading value.\r\n */\r\n public handleHeadingChange = (event: Msdyn365.ContentEditableEvent) => (this.props.config.heading = event.target.value);\r\n\r\n /**\r\n * Show all stores handler function.\r\n */\r\n private readonly onShowAllStoresHandler = () => {\r\n this._getAndUpdateStoreLocation(true);\r\n };\r\n\r\n /**\r\n * Filter Store by pickup mode.\r\n * @param deliveryCode -Delivery Code.\r\n */\r\n private readonly onFilteredPickupMode = (deliveryCode: string) => {\r\n this.setState({ filteredPickupMode: deliveryCode });\r\n };\r\n\r\n /**\r\n * Method will sort all stores.\r\n * @param stores -Stores List.\r\n * @param isPreferredStoreEnabled -Module config value.\r\n * @param preferredStoreLocationId -Store Id.\r\n * @returns List of Stores.\r\n */\r\n // eslint-disable-next-line class-methods-use-this -- No need of introducing new variable.\r\n private _sortStores(\r\n stores: IFullOrgUnitAvailability[],\r\n isPreferredStoreEnabled: boolean | undefined,\r\n preferredStoreLocationId: string\r\n ): IFullOrgUnitAvailability[] {\r\n const isPreferredStore = (value: IFullOrgUnitAvailability) =>\r\n isPreferredStoreEnabled &&\r\n preferredStoreLocationId &&\r\n value.OrgUnitAvailability?.OrgUnitLocation?.OrgUnitNumber === preferredStoreLocationId;\r\n\r\n return [...stores.filter(isPreferredStore), ...stores.filter(store => !isPreferredStore(store))];\r\n }\r\n\r\n /**\r\n * Method will list of store selector location line.\r\n * @param hasEnabledOutOfStockCheck -Stores List.\r\n * @param isStoreLocatorView -Module config value.\r\n * @param preferredStoreLocationId -Store Id.\r\n * @param isPreferredStoreEnabled -Stores List.\r\n * @param selectedStoreLocationId -Module config value.\r\n * @param stores -Store Id.\r\n * @param preferredDistanceUnit -Module config value.\r\n * @param alreadySelectedLocation -Already Selected Location.\r\n * @param productPickUpOptionList -Product supported Pickup Modes List.\r\n * @returns List of StoreSelectorLocation Line.\r\n */\r\n private _getStoreLocationListProps(\r\n hasEnabledOutOfStockCheck: boolean,\r\n isStoreLocatorView: boolean,\r\n preferredStoreLocationId: string,\r\n isPreferredStoreEnabled: boolean | undefined,\r\n selectedStoreLocationId: string | undefined,\r\n stores: IFullOrgUnitAvailability[] | null,\r\n preferredDistanceUnit?: string | undefined,\r\n alreadySelectedLocation?: OrgUnitLocation,\r\n productPickUpOptionList?: DeliveryOption[]\r\n ): IStoreSelectorLocationLineItemProps[] {\r\n const storeList: IStoreSelectorLocationLineItemProps[] = [];\r\n if (ArrayExtensions.hasElements(stores)) {\r\n stores?.map((store, index: number) => {\r\n const storeLineProps = this._createStoreLocationList(\r\n store,\r\n index,\r\n hasEnabledOutOfStockCheck,\r\n isStoreLocatorView,\r\n preferredStoreLocationId,\r\n isPreferredStoreEnabled,\r\n selectedStoreLocationId,\r\n preferredDistanceUnit,\r\n alreadySelectedLocation,\r\n productPickUpOptionList\r\n );\r\n if (storeLineProps) {\r\n storeList.push(storeLineProps);\r\n }\r\n });\r\n }\r\n return storeList;\r\n }\r\n\r\n /**\r\n * Intialize Map AutoSuggest.\r\n */\r\n private readonly _attachMapAutoSuggest = async (): Promise => {\r\n const {\r\n config: { autoSuggestOptions },\r\n context: {\r\n telemetry,\r\n actionContext: {\r\n requestContext: { channel }\r\n }\r\n },\r\n data: {\r\n storeSelectorStateManager: { result: storeSelectorStateManager }\r\n }\r\n } = this.props;\r\n\r\n if (storeSelectorStateManager?.isMapApiLoaded && !this.autoSuggestManager) {\r\n Microsoft.Maps.loadModule('Microsoft.Maps.AutoSuggest', {\r\n callback: () => {\r\n const options = { ...autoSuggestOptions, countryCode: channel?.ChannelCountryRegionISOCode };\r\n this.autoSuggestManager = new Microsoft.Maps.AutosuggestManager(options);\r\n this.autoSuggestManager.attachAutosuggest(\r\n `#ms-store-select__search-box_${this.props.id}`,\r\n `#ms-store-select__search-box-container_${this.props.id}`,\r\n this._onSuggestionSelected\r\n );\r\n },\r\n errorCallback: () => {\r\n if (telemetry) {\r\n telemetry.debug('Unable to attach map auto suggest.');\r\n }\r\n },\r\n credentials: channel?.BingMapsApiKey\r\n });\r\n }\r\n };\r\n\r\n /**\r\n * On Selecting Location Suggestion.\r\n * @param result - Map Suggestions List.\r\n */\r\n private readonly _onSuggestionSelected = async (result: Microsoft.Maps.ISuggestionResult): Promise => {\r\n const context =\r\n this.props.data.storeSelectorStateManager &&\r\n this.props.data.storeSelectorStateManager.result &&\r\n this.props.data.storeSelectorStateManager.result.context;\r\n if (context && context.id === this.props.id) {\r\n await this._searchTermChanged(result.formattedSuggestion);\r\n await this._performSearch(result.formattedSuggestion);\r\n }\r\n };\r\n\r\n /**\r\n * On Selecting Preferred Store.\r\n * @param storeId - Store Id.\r\n */\r\n private readonly _setPreferredStore = async (storeId: string | undefined): Promise => {\r\n if (!storeId) {\r\n return;\r\n }\r\n\r\n const {\r\n context: {\r\n actionContext: {\r\n requestContext: { cookies }\r\n }\r\n },\r\n config: { mode },\r\n data: {\r\n storeSelectorStateManager: { result: storeSelectorStateManager },\r\n storeLocations: { result: storeLocations },\r\n availabilitiesWithHours: { result: availabilitiesWithHours }\r\n }\r\n } = this.props;\r\n\r\n if (!storeSelectorStateManager) {\r\n return;\r\n }\r\n const modeDefault = mode !== undefined ? mode : modeEnum.pickupInStore;\r\n\r\n let stores: IFullOrgUnitAvailability[];\r\n if (modeDefault === modeEnum.findStores && storeLocations) {\r\n stores = storeLocations;\r\n } else {\r\n stores = availabilitiesWithHours!;\r\n }\r\n\r\n const preferedStore = stores.find(store => store.OrgUnitAvailability?.OrgUnitLocation?.OrgUnitNumber === storeId);\r\n\r\n await storeSelectorStateManager.setPreferredStoreLocation(\r\n storeId,\r\n preferedStore?.OrgUnitAvailability?.OrgUnitLocation?.OrgUnitName,\r\n cookies.isConsentGiven(),\r\n preferedStore?.OrgUnitAvailability?.OrgUnitLocation?.Latitude,\r\n preferedStore?.OrgUnitAvailability?.OrgUnitLocation?.Longitude\r\n );\r\n };\r\n\r\n /**\r\n * On Removing Preferred Store.\r\n */\r\n private readonly _removePreferredStore = async (): Promise => {\r\n const {\r\n context: {\r\n actionContext: {\r\n requestContext: { cookies }\r\n }\r\n },\r\n data: {\r\n storeSelectorStateManager: { result: storeSelectorStateManager }\r\n }\r\n } = this.props;\r\n\r\n if (!storeSelectorStateManager) {\r\n return;\r\n }\r\n\r\n await storeSelectorStateManager.clearPreferredStore(cookies.isConsentGiven());\r\n };\r\n\r\n /**\r\n * On Selecting Store for pickup.\r\n * @param storeId - Store Id.\r\n */\r\n private readonly _setSelectedStore = async (storeId: string | undefined): Promise => {\r\n const {\r\n data: {\r\n storeSelectorStateManager: { result: storeSelectorStateManager }\r\n }\r\n } = this.props;\r\n\r\n if (!storeSelectorStateManager) {\r\n return;\r\n }\r\n\r\n await storeSelectorStateManager.setSelectedStoreLocationId(storeId);\r\n };\r\n\r\n /**\r\n * Method to be called on search.\r\n * @param searchTerm - Search string.\r\n */\r\n private readonly _performSearch = async (searchTerm: string): Promise => {\r\n const {\r\n context: { actionContext },\r\n data: {\r\n storeSelectorStateManager: { result: storeSelectorStateManager }\r\n }\r\n } = this.props;\r\n\r\n if (!searchTerm || !storeSelectorStateManager) {\r\n return;\r\n }\r\n\r\n this.setState({ isSearchInProgress: true, isSeeAllStoreValue: false });\r\n\r\n const location = await storeSelectorStateManager.geoLocate(searchTerm.trim() !== '' ? searchTerm : '0', actionContext);\r\n\r\n if (location) {\r\n await this._updateLocations(location.latitude, location.longitude);\r\n } else {\r\n await this._updateLocations();\r\n }\r\n\r\n this.setState({ isSearchInProgress: false });\r\n };\r\n\r\n /**\r\n * Method to be called on search term changed.\r\n * @param searchTerm - Search string.\r\n */\r\n private readonly _searchTermChanged = async (searchTerm: string): Promise => {\r\n this.setState({ searchTerm });\r\n };\r\n\r\n /**\r\n * Method to be called updating the store location.\r\n * @param showAllStores - Flag to show all stores.\r\n */\r\n private readonly _getAndUpdateStoreLocation = (showAllStores?: boolean): void => {\r\n const {\r\n config: { style },\r\n data: {\r\n storeSelectorStateManager: { result: storeSelectorStateManager }\r\n }\r\n } = this.props;\r\n\r\n const styleDefault = style !== undefined ? style : styleEnum.dialog;\r\n\r\n if (styleDefault !== styleEnum.inline && (!storeSelectorStateManager || !storeSelectorStateManager.isDialogOpen)) {\r\n // Store selector dialog isn't open yet, so don't try and update anything\r\n return;\r\n }\r\n\r\n this.setState({ isSearchInProgress: true, isSeeAllStoreValue: false });\r\n\r\n if (navigator && navigator.geolocation) {\r\n navigator.geolocation.getCurrentPosition(\r\n async position => {\r\n // eslint-disable-next-line react/no-unused-state -- This state is used in the views.\r\n this.setState({ isLocationDisabled: false, isSearchInProgress: true });\r\n if (showAllStores) {\r\n this.setState({ isSeeAllStoreValue: true });\r\n await this._searchTermChanged('');\r\n await this._updateLocations(position.coords.latitude, position.coords.longitude, 0);\r\n } else {\r\n await this._updateLocations(position.coords.latitude, position.coords.longitude);\r\n }\r\n\r\n this.setState({ isSearchInProgress: false });\r\n },\r\n async error => {\r\n // If the location setting is turned off\r\n if (error.PERMISSION_DENIED) {\r\n this.setState({ isLocationDisabled: true });\r\n if (showAllStores) {\r\n this.setState({ isSeeAllStoreValue: true });\r\n await this._searchTermChanged('');\r\n await this._updateLocations(void 0, void 0, 0);\r\n } else {\r\n await this._updateLocations();\r\n }\r\n }\r\n\r\n this.setState({ isSearchInProgress: false });\r\n },\r\n { timeout: 5000 }\r\n );\r\n } else {\r\n this.setState({ isSearchInProgress: false });\r\n }\r\n };\r\n\r\n /**\r\n * Method to be called closing the store selector dialog.\r\n * @returns Void promise.\r\n */\r\n private readonly _closeDialog = async (): Promise => {\r\n const {\r\n data: {\r\n storeSelectorStateManager: { result: storeSelectorStateManager }\r\n }\r\n } = this.props;\r\n\r\n this.setState({ searchTerm: '' });\r\n\r\n if (storeSelectorStateManager) {\r\n storeSelectorStateManager.context?.parentElementRef?.current?.focus();\r\n return storeSelectorStateManager.closeDialog();\r\n }\r\n };\r\n\r\n /**\r\n * Method to set store info.\r\n * @param orgUnitStoreInformation - Store Info Object.\r\n * @returns Void promise.\r\n */\r\n private readonly _setOrgUnitStoreInformation = async (orgUnitStoreInformation: IFullOrgUnitAvailability[]): Promise => {\r\n const {\r\n data: {\r\n storeSelectorStateManager: { result: storeSelectorStateManager }\r\n },\r\n config: { style },\r\n telemetry\r\n } = this.props;\r\n\r\n if (!storeSelectorStateManager) {\r\n return;\r\n }\r\n\r\n const context = storeSelectorStateManager.context;\r\n const id: string = context && context.id ? context.id : this.props.id;\r\n const styleDefault = style !== undefined ? style : styleEnum.dialog;\r\n await storeSelectorStateManager\r\n .setOrgUnitStoreInformation({\r\n id,\r\n showMapViewLink: context && context.showMapViewLink,\r\n parentElementRef: context?.parentElementRef,\r\n isDialog: styleDefault === styleEnum.dialog,\r\n orgUnitStoreInformation,\r\n onLocationSelected: async orgUnitLocation => {\r\n // TO-DO handle event for when location in selected\r\n return Promise.resolve();\r\n }\r\n })\r\n .catch((error: Error) => {\r\n if (telemetry) {\r\n telemetry.error(error.message);\r\n telemetry.debug('Unable to Update store location state');\r\n }\r\n });\r\n };\r\n\r\n /**\r\n * Method to update user location.\r\n * @param latitude - User location.\r\n * @param longitude - User location.\r\n * @param radius - Search Critiria Radius.\r\n * @returns Void promise.\r\n */\r\n private readonly _updateLocations = async (latitude?: number, longitude?: number, radius?: number): Promise => {\r\n const {\r\n telemetry,\r\n config: { mode, lookupRadius, style },\r\n context: { actionContext },\r\n data: {\r\n storeSelectorStateManager: { result: storeSelectorStateManager }\r\n }\r\n } = this.props;\r\n\r\n const styleDefault = style !== undefined ? style : styleEnum.dialog;\r\n const calRadius = radius || radius === 0 ? radius : lookupRadius || 50;\r\n const distanceUnitValue = this.props.config.searchRadiusUnit === searchRadiusUnit.kilometers ? 1 : 0;\r\n const modeDefault = mode !== undefined ? mode : modeEnum.pickupInStore;\r\n const preferredStore: IStoreInfo | undefined = storeSelectorStateManager?.preferredStore;\r\n let lat = this.state.searchTerm || !preferredStore?.Latitude ? latitude : preferredStore.Latitude;\r\n let long = this.state.searchTerm || !preferredStore?.Longitude ? longitude : preferredStore.Longitude;\r\n if (styleDefault === styleEnum.inline) {\r\n const lastInlineStoreLocation = storeSelectorStateManager?.lastInlineShownStoreInfo;\r\n if (lastInlineStoreLocation && !this.state.searchTerm) {\r\n lat = lastInlineStoreLocation.Latitude ? lastInlineStoreLocation.Latitude : lat;\r\n long = lastInlineStoreLocation.Longitude ? lastInlineStoreLocation.Longitude : long;\r\n }\r\n await storeSelectorStateManager?.setLastInlineStoreInfo(lat, long);\r\n }\r\n\r\n if (modeDefault === modeEnum.findStores) {\r\n const orgUnitLocationsInput = new GetOrgUnitLocationsByAreaInput(\r\n lat,\r\n long,\r\n calRadius,\r\n distanceUnitValue,\r\n this.state.isLocationDisabled\r\n );\r\n\r\n const orgUnitLocations = await getOrgUnitLocationsByArea(orgUnitLocationsInput, actionContext);\r\n if (orgUnitLocations) {\r\n await this._setOrgUnitStoreInformation(orgUnitLocations);\r\n await this._setSelectedStore(undefined);\r\n }\r\n return;\r\n }\r\n\r\n if (!storeSelectorStateManager || !storeSelectorStateManager.context) {\r\n // Store selector dialog isn't open yet, so don't try and update anything\r\n return;\r\n }\r\n\r\n if (!storeSelectorStateManager.context.product) {\r\n // TODO: Use alternative search method here to not make inventory check\r\n return;\r\n }\r\n\r\n const input = new GetFullAvailableInventoryNearbyInput(\r\n storeSelectorStateManager.context.product.RecordId,\r\n lat || 0,\r\n long || 0,\r\n calRadius,\r\n distanceUnitValue,\r\n this.state.isLocationDisabled\r\n );\r\n\r\n await getFullAvailableInventoryNearby(input, actionContext).catch(error => {\r\n telemetry.warning(error);\r\n telemetry.error(error.message);\r\n telemetry.debug('Unable to get full available inventory near by');\r\n });\r\n };\r\n\r\n /**\r\n * Method to called on store selected.\r\n * @param location - Store Info.\r\n * @param deliveryMode - Pickup mode.\r\n * @returns Void promise.\r\n */\r\n private readonly _onOrgUnitLocationSelected = async (location: OrgUnitLocation | undefined, deliveryMode?: string): Promise => {\r\n const {\r\n telemetry,\r\n data: {\r\n storeSelectorStateManager: { result: storeSelectorStateManager }\r\n }\r\n } = this.props;\r\n\r\n if (storeSelectorStateManager) {\r\n if (location && storeSelectorStateManager.context) {\r\n // Want to eat exceptions here so that the dialog still closes even if the onLocationSelected call goes wrong\r\n await storeSelectorStateManager.context.onLocationSelected(location, deliveryMode).catch(error => {\r\n telemetry.warning(error);\r\n telemetry.error(error.message);\r\n telemetry.debug('Unable to get on org unit location selected');\r\n });\r\n }\r\n\r\n await storeSelectorStateManager.closeDialog();\r\n }\r\n };\r\n\r\n /**\r\n * Method will list of store selector location line.\r\n * @param store -Store Info.\r\n * @param index - List index.\r\n * @param hasEnabledOutOfStockCheck -Stores List.\r\n * @param isStoreLocatorView -Module config value.\r\n * @param preferredStoreLocationId -Store Id.\r\n * @param isPreferredStoreEnabled -Stores List.\r\n * @param selectedStoreLocationId -Module config value.\r\n * @param preferredDistanceUnit -Module config value.\r\n * @param alreadySelectedLocation -Already Selected Location.\r\n * @param productPickUpOptionList -Product supported Pickup Modes List.\r\n * @returns StoreSelectorLocation Line Prop.\r\n */\r\n private _createStoreLocationList(\r\n store: IFullOrgUnitAvailability,\r\n index: number,\r\n hasEnabledOutOfStockCheck: boolean,\r\n isStoreLocatorView: boolean,\r\n preferredStoreLocationId: string,\r\n isPreferredStoreEnabled: boolean | undefined,\r\n selectedStoreLocationId: string | undefined,\r\n preferredDistanceUnit?: string | undefined,\r\n alreadySelectedLocation?: OrgUnitLocation,\r\n productPickUpOptionList?: DeliveryOption[]\r\n ): IStoreSelectorLocationLineItemProps | undefined {\r\n const orgUnitLocation = store?.OrgUnitAvailability?.OrgUnitLocation;\r\n const selectedStoreLocation = selectedStoreLocationId;\r\n const deliveryOptions = store?.OrgUnitPickUpDeliveryModes;\r\n const lineResources = this._mapResources(this.props.resources);\r\n const storeOpenFrom: string | undefined = secondsToTime(orgUnitLocation?.OpenFrom);\r\n const storeOpenTo: string | undefined = secondsToTime(orgUnitLocation?.OpenTo);\r\n const storeHours = store.StoreHours;\r\n\r\n if (orgUnitLocation) {\r\n ++this.storeCounter;\r\n return {\r\n location: orgUnitLocation,\r\n selectedStoreLocationId: selectedStoreLocation,\r\n storeHours,\r\n resources: lineResources,\r\n preferredDistanceUnit: preferredDistanceUnit!,\r\n isCurrentLocation: this._isCurrentLocation(orgUnitLocation, alreadySelectedLocation),\r\n isInStock: this._isProductInStock(hasEnabledOutOfStockCheck, store?.OrgUnitAvailability?.ItemAvailabilities),\r\n stockStatusLabel: this._stockInventoryLabel(store),\r\n storeLocatorView: isStoreLocatorView,\r\n index: this.storeCounter.toString(),\r\n preferredStoreLocationId,\r\n isPreferredStoreEnabled,\r\n telemetryContent: this.telemetryContent,\r\n isLocationDisabled: this.state.isLocationDisabled,\r\n storePickUpOptionList: deliveryOptions?.DeliveryOptions,\r\n productPickUpOptionList,\r\n locationOpen: { openFrom: storeOpenFrom, openTo: storeOpenTo },\r\n storeHoursList: storeHours?.RegularStoreHours ? buildStoreHours(storeHours.RegularStoreHours, lineResources) : [],\r\n onClick: this._setSelectedStore,\r\n handlers: {\r\n onSelected: this._onOrgUnitLocationSelected,\r\n onSetAsPreferredStore: this._setPreferredStore,\r\n onRemovePreferredStore: this._removePreferredStore\r\n }\r\n };\r\n }\r\n return undefined;\r\n }\r\n\r\n /**\r\n * Method to map resources with Location Item.\r\n * @param resources - List of strings for module.\r\n * @returns Resources for StoreSelector location line.\r\n */\r\n private readonly _mapResources = (resources: IStoreSelectorResources): IStoreSelectorLocationLineItemResources => {\r\n return {\r\n contactInfoHeader: resources.contactText,\r\n storeHoursHeader: resources.timeText,\r\n availabilityInfoHeader: resources.availabilityText,\r\n\r\n closedText: resources.storeHoursClosedText,\r\n outOfStock: resources.outOfStockText,\r\n inStock: resources.inStockText,\r\n\r\n currentLocation: resources.selectedStoreLocationText,\r\n selectLocation: resources.selectStoreText,\r\n selectLocationAriaLabelFormat: resources.selectStoreAriaFormatText,\r\n setAsPreferredStoreText: resources.setAsPreferredStoreText,\r\n setAsPreferredStoreTextAriaLabel: resources.setAsPreferredStoreTextAriaLabel,\r\n preferredStoreText: resources.preferredStoreText,\r\n preferredStoreAriaLabel: resources.preferredStoreAriaLabel,\r\n\r\n days: {\r\n monday: resources.storeHoursMondayText,\r\n tuesday: resources.storeHoursTuesdayText,\r\n wednesday: resources.storeHoursWednesdayText,\r\n thursday: resources.storeHoursThursdayText,\r\n friday: resources.storeHoursFridayText,\r\n saturday: resources.storeHoursSaturdayText,\r\n sunday: resources.storeHoursSundayText,\r\n mondayFull: resources.storeHoursMondayFullText,\r\n tuesdayFull: resources.storeHoursTuesdayFullText,\r\n wednesdayFull: resources.storeHoursWednesdayFullText,\r\n thursdayFull: resources.storeHoursThursdayFullText,\r\n fridayFull: resources.storeHoursFridayFullText,\r\n saturdayFull: resources.storeHoursSaturdayFullText,\r\n sundayFull: resources.storeHoursSundayFullText\r\n }\r\n };\r\n };\r\n\r\n private readonly _isCurrentLocation = (location: OrgUnitLocation | undefined, selectedLocation?: OrgUnitLocation): boolean =>\r\n (selectedLocation && location && selectedLocation.OrgUnitNumber === location.OrgUnitNumber) || false;\r\n\r\n /**\r\n * Method to get stock.\r\n * @param hasEnableOutOfStockCheck - Config to check for stock check enabled.\r\n * @param itemAvailabilities - Item quantity availablity.\r\n * @returns Boolean value for item stock.\r\n */\r\n private readonly _isProductInStock = (\r\n hasEnableOutOfStockCheck: boolean,\r\n itemAvailabilities: ItemAvailability[] | undefined\r\n ): boolean => {\r\n if (!hasEnableOutOfStockCheck) {\r\n return true;\r\n }\r\n const quantityCount = 0;\r\n if (ArrayExtensions.hasElements(itemAvailabilities)) {\r\n return itemAvailabilities[0].AvailableQuantity ? itemAvailabilities[0].AvailableQuantity > quantityCount : false;\r\n }\r\n\r\n return false;\r\n };\r\n\r\n /**\r\n * Method to get stocklevel label.\r\n * @param isInStock - Stock available in store.\r\n * @returns Label for stock status.\r\n */\r\n private readonly _stockInventoryLabel = (isInStock: IFullOrgUnitAvailability | undefined): string | undefined => {\r\n if (isInStock?.ProductInventoryInformation && ArrayExtensions.hasElements(isInStock.ProductInventoryInformation)) {\r\n for (let index = 0; index < isInStock.ProductInventoryInformation.length; index++) {\r\n if (\r\n isInStock.OrgUnitAvailability?.OrgUnitLocation?.InventoryLocationId ===\r\n isInStock.ProductInventoryInformation[index].InventLocationId\r\n ) {\r\n return isInStock.ProductInventoryInformation[index].StockLevelLabel;\r\n }\r\n }\r\n }\r\n\r\n return undefined;\r\n };\r\n}\r\n\r\nexport default StoreSelector;\r\n","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\nimport { ICategoryHierarchyViewProps, IRefineMenuViewProps, ISearchResultContainerViewProps, ISearchResultModalViewProps, ISortByViewProps, ITitleViewProps } from '@msdyn365-commerce-modules/search-result-container';\r\nimport { Module, Node } from '@msdyn365-commerce-modules/utilities';\r\nimport { generateImageUrl } from '@msdyn365-commerce-modules/retail-actions';\r\nimport { IImageData, Image } from '@msdyn365-commerce/core';\r\nimport * as React from 'react';\r\n\r\nconst SearchResultContainerView: React.FC = props => {\r\n const { SearchResultContainer, products, pagination, ProductsContainer, ProductSectionContainer, choiceSummary, isMobile, modalToggle, searchResultModal, TitleViewProps,\r\n refineMenu, categoryHierarchy, sortByOptions, CategoryNavContainer, RefineAndProductSectionContainer, errorMessage, FeatureSearchContainer, similarLookProduct } = props;\r\n\r\n if (isMobile) {\r\n return (\r\n \r\n {categoryHierarchy && renderCategoryHierarchy(categoryHierarchy)}\r\n {renderTitle(TitleViewProps)}\r\n {choiceSummary}\r\n {modalToggle}\r\n {createSearchResultModal(searchResultModal, refineMenu, sortByOptions)}\r\n \r\n {similarLookProduct}\r\n \r\n \r\n {errorMessage}\r\n {products}\r\n \r\n {pagination}\r\n \r\n );\r\n }\r\n return (\r\n \r\n {categoryHierarchy &&\r\n \r\n {renderCategoryHierarchy(categoryHierarchy)}\r\n }\r\n \r\n {refineMenu && renderRefiner(refineMenu)}\r\n \r\n {categoryHierarchy && (\r\n
\r\n {renderCategoryBanner(props)}\r\n
\r\n )}\r\n\r\n \r\n {similarLookProduct}\r\n \r\n
\r\n {TitleViewProps && renderTitle(TitleViewProps)}\r\n {choiceSummary}\r\n
\r\n
\r\n {sortByOptions && renderSort(sortByOptions)}\r\n
\r\n \r\n {errorMessage}\r\n {products}\r\n \r\n {pagination}\r\n
\r\n
\r\n
\r\n );\r\n\r\n};\r\n\r\nconst createSearchResultModal = (modalProps: ISearchResultModalViewProps, refineMenu: IRefineMenuViewProps, sortByDropDown: ISortByViewProps): JSX.Element => {\r\n return React.cloneElement(modalProps.modal, {}, modalProps.modalHeader, createModalBody(modalProps, refineMenu, sortByDropDown), modalProps.modalFooter);\r\n};\r\n\r\nconst createModalBody = (props: ISearchResultModalViewProps, refineMenu: IRefineMenuViewProps, sortByDropDown: ISortByViewProps): JSX.Element | null => {\r\n if (sortByDropDown) {\r\n return React.cloneElement(props.modalBody, {}, renderSort(sortByDropDown), renderRefiner(refineMenu));\r\n }\r\n return null;\r\n};\r\n\r\nconst renderRefiner = (props: IRefineMenuViewProps): JSX.Element | null => {\r\n const { refiners, RefineMenuContainer, RefinerSectionContainer } = props;\r\n if (refiners) {\r\n return (\r\n \r\n \r\n {refiners.map((submenu, index) => (\r\n \r\n {submenu}\r\n \r\n ))}\r\n \r\n \r\n );\r\n }\r\n return null;\r\n};\r\n\r\nconst renderSort = (props: ISortByViewProps): JSX.Element | null => {\r\n const { SortingContainer, sortByDropDown } = props;\r\n if (sortByDropDown) {\r\n return (\r\n \r\n {sortByDropDown}\r\n \r\n );\r\n }\r\n return null;\r\n};\r\n\r\nconst renderCategoryBanner = (props: ISearchResultContainerViewProps): JSX.Element | null => {\r\n\r\n const {\r\n context,\r\n data: {\r\n categoryHierarchy: {\r\n result,\r\n },\r\n },\r\n } = props;\r\n\r\n if (result && result.length && context.request.gridSettings) {\r\n const bannerImage = result[result.length - 1].NeutralizedName;\r\n\r\n const categoryImageUrl = generateImageUrl(`Categories/Banner__${bannerImage}.jpg`, context.actionContext.requestContext.apiSettings);\r\n\r\n if (categoryImageUrl) {\r\n const ImageData: IImageData = { src: categoryImageUrl };\r\n return (\r\n \r\n );\r\n }\r\n }\r\n\r\n return null;\r\n};\r\n\r\nconst renderCategoryHierarchy = (props: ICategoryHierarchyViewProps): JSX.Element | null => {\r\n const { CategoryHierarchyContainer, categoryHierarchyList, categoryHierarchySeparator } = props;\r\n if (categoryHierarchyList) {\r\n return (\r\n \r\n {categoryHierarchyList.map((category, index) => (\r\n \r\n {category}\r\n {categoryHierarchyList && categoryHierarchyList[index + 1] && categoryHierarchySeparator}\r\n \r\n ))}\r\n \r\n );\r\n }\r\n\r\n return null;\r\n};\r\n\r\nconst renderTitle = (props: ITitleViewProps): JSX.Element | null => {\r\n const { title, TitleContainer } = props;\r\n if (title) {\r\n return (\r\n \r\n

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

\r\n \r\n (\r\n {title.titleCount}\r\n )\r\n \r\n
\r\n );\r\n }\r\n return null;\r\n};\r\n\r\nexport default SearchResultContainerView;\r\n","/*---------------------------------------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License. See License.txt in the project root for license information.\r\n *--------------------------------------------------------------------------------------------*/\r\nimport { Module, Node } from '@msdyn365-commerce-modules/utilities';\r\nimport * as React from 'react';\r\nimport { ITabItemViewProps, TabItemType } from './conditional-tab-item';\r\n\r\nconst ConditionalTabItemView: React.FC = (props: ITabItemViewProps) => {\r\n const { tabItemType, tabSlots, TabContentContainer, TabHeaderContainer, TabItemContent, tabHeader, onVisibilityChange } = props;\r\n\r\n switch (tabItemType) {\r\n case TabItemType.TabContent:\r\n return (\r\n \r\n \r\n {tabSlots &&\r\n tabSlots.tabItemContent &&\r\n tabSlots.tabItemContent.length &&\r\n _renderTabItemContent(tabSlots.tabItemContent, onVisibilityChange)}\r\n \r\n \r\n );\r\n case TabItemType.TabHeader:\r\n return {tabHeader};\r\n default:\r\n return null;\r\n }\r\n};\r\n\r\nconst _renderTabItemContent = (\r\n items: React.ReactNode[],\r\n onVisibilityChange: (visibilityState: VisibilityState) => void\r\n): JSX.Element | null => {\r\n return (\r\n <>\r\n {items && items.length > 0\r\n ? items.map((item: React.ReactNode, index: number) => {\r\n return (\r\n \r\n {React.cloneElement(item as React.ReactElement, {\r\n onVisibilityChange\r\n })}\r\n \r\n );\r\n })\r\n : null}\r\n \r\n );\r\n};\r\nexport default ConditionalTabItemView;\r\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport {\n ICartlinesViewProps,\n ICartResources,\n ICartViewProps,\n IOrderSummaryErrors\n} from '@msdyn365-commerce-modules/cart';\nimport { ICartLineItemViewProps } from '@msdyn365-commerce-modules/cart/dist/types/modules/cart/components/cart-line-items-promotion';\nimport { IInvoiceSummaryLines } from '@msdyn365-commerce-modules/invoice-payment-summary';\nimport { IOrderSummaryLines } from '@msdyn365-commerce-modules/order-summary-utilities';\nimport { Button, getPayloadObject, getTelemetryAttributes, INodeProps, ITelemetryContent, Node, TelemetryConstant } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nconst CartView: React.FC = (props: ICartViewProps) => (\n
\n {props.title}\n {props.promotionOptions && _renderPromotions(props.promotionOptions)}\n {props.multiplePickUpEnabled ? _renderCartLinesGroup(props, props.resources) : \n {_renderCartlines(props.cartlines, props.resources, props.storeSelector, props.backToShoppingButton, props.waitingComponent, props.cartLoadingStatus,\n props.cartDataResult, props.telemetryContent, props.multiplePickUpEnabled, props.context.actionContext.requestContext.channel?.EmailDeliveryModeCode)}\n }\n {props.orderSummaryHeading &&\n \n {props.orderSummaryHeading}\n {props.cart?.hasInvoiceLine ? _renderInvoiceSummarylines(props.invoiceSummaryLineitems, props.OrderSummaryItems, props) : _renderOrderSummarylines(props.orderSummaryLineitems, props.OrderSummaryItems, props)}\n {_renderErrorBlock(props.OrderSummaryErrors)}\n {props.checkoutAsSignInUserButton}\n {props.checkoutAsGuestButton}\n {props.backToShoppingButton}\n {props.createTemplateFromCartButton}\n }\n {props.storeSelector}\n
\n);\n\nconst _renderPromotions = (promotions: ICartLineItemViewProps): JSX.Element | undefined => {\n return (\n <>\n \n {promotions.promotionMessage}\n {promotions.promotionSeeAllLink}\n {promotions.promotionDialog}\n \n\n \n );\n\n};\n\nconst _renderCartlines = (cartLines: ICartlinesViewProps[] | undefined, resources: ICartResources, storeSelector: React.ReactNode | undefined,\n backToShoppingButton: React.ReactNode, waitingComponent: React.ReactNode, cartLoadingStatus: string, cartDataResult: boolean,\n telemetryContent?: ITelemetryContent, mulitplePickUp?: boolean, emailDeliveryModeCode?: string): JSX.Element[] | JSX.Element => {\n\n const { emptyCartText } = resources;\n\n if (cartLoadingStatus) {\n return (<>\n {cartLoadingStatus}\n );\n }\n if (cartLines) {\n return cartLines.map((cartLine, index) => {\n return (\n
\n {cartLine.cartline}\n {mulitplePickUp ? null : _renderBOPISBlock(cartLine, resources, storeSelector, telemetryContent, emailDeliveryModeCode)}\n {\n mulitplePickUp ? (\n \n {_renderGroupBOPISBlock(cartLine, resources, storeSelector, telemetryContent, emailDeliveryModeCode)}\n {cartLine.addToOrderTemplate}\n {cartLine.addToWishlist}\n {cartLine.remove}\n \n ) : (cartLine.addToOrderTemplate ? (\n \n {cartLine.addToOrderTemplate}\n {cartLine.addToWishlist}\n {cartLine.remove}\n \n ) : (\n <>\n {cartLine.addToWishlist}\n {cartLine.remove}\n \n ))\n }\n
\n );\n });\n }\n return (cartDataResult ? (\n
\n

\n {emptyCartText}\n

\n {backToShoppingButton}\n
\n ) : <>\n {waitingComponent}\n \n );\n\n};\n\n/**\n * On Toggle function.\n * @param cartLine -Cartline.\n * @param isBopisSelected -Boolean.\n * @returns Set state of button.\n */\nconst onToggleBopisHandler = (cartLine: ICartlinesViewProps, isBopisSelected: boolean) => () => {\n cartLine.pickUpInStore && cartLine.pickUpInStore.callbacks.toggleBopis(!isBopisSelected);\n};\n\n/**\n * On change store function.\n * @param cartLine -CartLine items prop.\n * @returns Set state of button.\n */\nconst onChangeStoreHandler = (cartLine: ICartlinesViewProps) => () => {\n cartLine.pickUpInStore && cartLine.pickUpInStore.callbacks.toggleBopis(true);\n};\n\nconst _renderBOPISBlock = (cartLine: ICartlinesViewProps, resources: ICartResources, storeSelector: React.ReactNode | undefined, telemetryContent?: ITelemetryContent, emailDeliveryModeCode?: string): JSX.Element | null => {\n // If it is electronic item cart line, then return null for BOPISBlock.\n if (!cartLine.pickUpInStore || !storeSelector || cartLine.data?.cartline.DeliveryMode === emailDeliveryModeCode) {\n return null;\n }\n\n const { shipInsteadDisplayText, shipToAddressDisplayText, pickItUpDisplayText, pickUpAtStoreWithLocationText, changeStoreDisplayText } = resources;\n\n const isBopisSelected = cartLine.pickUpInStore.isBopisSelected;\n\n const payLoad = getPayloadObject('click', telemetryContent!, TelemetryConstant.PickupInStore);\n const puckUpinStoreAttribute = getTelemetryAttributes(telemetryContent!, payLoad);\n\n return (\n \n
\n {isBopisSelected ? \n {pickUpAtStoreWithLocationText}\n : \n {shipToAddressDisplayText}\n }\n
\n {\n isBopisSelected &&\n
\n \n {cartLine.pickUpInStore.orgUnitName}\n \n \n {changeStoreDisplayText}\n \n
\n }\n \n
\n );\n};\n\nconst _renderErrorBlock = (errorData: IOrderSummaryErrors | undefined): JSX.Element | null => {\n if (!errorData || errorData.errors.length === 0) {\n return null;\n }\n return (\n \n {errorData.header}\n {errorData.errors}\n \n );\n};\n\nconst _renderOrderSummarylines = (orderSummaryLines: IOrderSummaryLines | undefined, OrderSummaryItems: INodeProps, props: ICartViewProps): JSX.Element | null => {\n if (!orderSummaryLines) {\n return null;\n }\n return (\n \n {props.promoCode}\n {orderSummaryLines.subtotal}\n {orderSummaryLines.shipping}\n {orderSummaryLines.otherCharge}\n {orderSummaryLines.tax}\n {orderSummaryLines.totalDiscounts ? orderSummaryLines.totalDiscounts : null}\n {orderSummaryLines.orderTotal}\n \n );\n};\n\nconst _renderInvoiceSummarylines = (invoiceSummaryLines: IInvoiceSummaryLines | undefined, OrderSummaryItems: INodeProps, props: ICartViewProps): JSX.Element | null => {\n if (!invoiceSummaryLines) {\n props.context.telemetry.error('InvoiceSummary content is empty, module wont render');\n return null;\n }\n return (\n \n {invoiceSummaryLines.invoices}\n {invoiceSummaryLines.giftCard}\n {invoiceSummaryLines.loyalty}\n {invoiceSummaryLines.orderTotal}\n \n );\n};\n\nconst _renderCartLinesGroup = (props: ICartViewProps, resources: ICartResources): JSX.Element | undefined => {\n if (props.cartLinesGroup && props.cartLinesGroup.length > 0) {\n return (\n
\n { props.cartLinesGroup.map(cartlines => {\n return (
\n {_renderCartLinesGroupHeader(cartlines[0], props.storeSelector, resources, _countItems(cartlines), props.context.actionContext.requestContext.channel?.EmailDeliveryModeCode)}\n {_renderCartlines(cartlines, props.resources, props.storeSelector, props.backToShoppingButton, props.waitingComponent, props.cartLoadingStatus, props.cartDataResult,\n props.telemetryContent, props.multiplePickUpEnabled, props.context.actionContext.requestContext.channel?.EmailDeliveryModeCode)}\n
);\n })}\n
\n );\n }\n return (props.cartDataResult ? (\n
\n
\n

\n {props.resources.emptyCartText}\n

\n {props.backToShoppingButton}\n
\n
\n ) : <>\n {props.waitingComponent}\n \n );\n\n};\nconst _renderCartLinesGroupHeader = (cartLine: ICartlinesViewProps, storeSelector: React.ReactNode | undefined, resources: ICartResources, count: number, emailDeliveryModeCode?: string) => {\n const isBopisSelected = cartLine.pickUpInStore?.isBopisSelected;\n const { pickUpText, shippingText, emailshippingText } = resources;\n let groupTitle: string;\n\n groupTitle = isBopisSelected ? pickUpText : shippingText;\n groupTitle = cartLine.data && cartLine.data.cartline.DeliveryMode === emailDeliveryModeCode ? emailshippingText : groupTitle;\n\n return (\n <>\n
\n

\n

\n {groupTitle}\n

\n {_renderCartLinesGroupTitle(cartLine, resources, count)}\n
\n \n );\n};\n\nconst _renderGroupBOPISBlock = (cartLine: ICartlinesViewProps, resources: ICartResources, storeSelector: React.ReactNode | undefined, telemetryContent?: ITelemetryContent, emailDeliveryModeCode?: string): JSX.Element | null => {\n // If it is electronic item cart line, then return null for GroupBOPISBlock.\n if (!cartLine.pickUpInStore || !storeSelector || cartLine.data?.cartline.DeliveryMode === emailDeliveryModeCode) {\n return null;\n }\n\n const { changeStoreDisplayText, shipInsteadDisplayText, pickItUpDisplayText } = resources;\n\n const isBopisSelected = cartLine.pickUpInStore.isBopisSelected;\n\n const payLoad = getPayloadObject('click', telemetryContent!, TelemetryConstant.PickupInStore);\n const puckUpinStoreAttribute = getTelemetryAttributes(telemetryContent!, payLoad);\n\n return (\n <>\n {isBopisSelected ? : null }\n \n {isBopisSelected ? shipInsteadDisplayText : pickItUpDisplayText}\n \n \n );\n};\n\nconst _countItems = (cartLine: ICartlinesViewProps[]): number => {\n let countItem = 0;\n countItem = cartLine.reduce((count, item) => {\n return count + (item.data?.cartline.Quantity || 0);\n\n }, 0);\n return countItem;\n};\n\nconst _renderCartLinesGroupTitle = (cartLine: ICartlinesViewProps, resources: ICartResources, count: number) => {\n const isBopisSelected = cartLine.pickUpInStore?.isBopisSelected;\n const { itemLabel, itemsLabel } = resources;\n const suffix = count > 1 ? itemsLabel : itemLabel;\n return (\n <>\n \n {isBopisSelected ?

\n {cartLine.pickUpInStore?.deliveryOption}\n {', '}\n {cartLine.pickUpInStore?.orgUnitName}\n

: null}\n

\n (\n {count}\n {' '}\n {suffix}\n )\n

\n
\n \n );\n};\n\nexport default CartView;\n","/*!\r\n * Copyright (c) Microsoft Corporation.\r\n * All rights reserved. See LICENSE in the project root for license information.\r\n */\r\n\r\nimport * as React from 'react';\r\nimport { IHeiStoreHoursViewProps } from './hei-store-hours';\r\nimport { OrgUnitLocation, StoreHours } from '@msdyn365-commerce/retail-proxy';\r\nimport classnames from 'classnames';\r\nimport {\r\n buildStoreHours,\r\n IHoursDisplayInfo,\r\n secondsToTime\r\n} from '../store-selector/components/store-selector-location-line-item/date-time-helpers';\r\nimport { IStoreSelectorLocationLineItemResources } from '../store-selector/components/store-selector-location-line-item';\r\n\r\nconst HeiStoreHoursView = (props: IHeiStoreHoursViewProps) => {\r\n const {\r\n storeInfo: { storeHours, location, resources },\r\n config: { className }\r\n } = props;\r\n\r\n return
{renderStoreHours(storeHours, location, resources)}
;\r\n};\r\n\r\nconst renderStoreHours = (\r\n storeHours: StoreHours | undefined,\r\n location: OrgUnitLocation,\r\n resources: IStoreSelectorLocationLineItemResources\r\n): JSX.Element | null => {\r\n // First, use the store hours. This will allow listing day by day houts\r\n if (storeHours && storeHours.RegularStoreHours) {\r\n const storeHoursList: IHoursDisplayInfo[] = buildStoreHours(storeHours.RegularStoreHours, resources);\r\n\r\n return (\r\n
\r\n {storeHoursList.map((displayTime, i) => (\r\n
\r\n {displayTime.endDayShort ? (\r\n
\r\n {displayTime.startDayShort}–\r\n {displayTime.endDayShort}\r\n
\r\n ) : (\r\n
\r\n {displayTime.startDayShort}\r\n
\r\n )}\r\n
{displayTime.timeRange}
\r\n
\r\n ))}\r\n
\r\n );\r\n } else {\r\n // If that fails, fall back to using the OpenFrom and OpenTo properties on the location\r\n const storeOpenFrom: string | undefined = secondsToTime(location.OpenFrom);\r\n const storeOpenTo: string | undefined = secondsToTime(location.OpenTo);\r\n\r\n return (\r\n
\r\n {storeOpenFrom}-{storeOpenTo}\r\n
\r\n );\r\n }\r\n};\r\n\r\nexport default HeiStoreHoursView;\r\n","/*---------------------------------------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License. See License.txt in the project root for license information.\r\n *--------------------------------------------------------------------------------------------*/\r\n\r\nimport { IModuleProps, INodeProps, NodeTag } from '@msdyn365-commerce-modules/utilities';\r\nimport classnames from 'classnames';\r\nimport { observer } from 'mobx-react';\r\nimport * as React from 'react';\r\nimport { IConditionalTabItemData } from './conditional-tab-item.data';\r\nimport { IConditionalTabItemProps } from './conditional-tab-item.props.autogenerated';\r\n\r\nexport interface IConditionalTabItemContentProps {\r\n onVisibilityChange(visibilityState: VisibilityState): void;\r\n}\r\n\r\nexport interface ITabItemViewProps extends IConditionalTabItemContentProps {\r\n TabContentContainer: IModuleProps;\r\n TabHeaderContainer: IModuleProps;\r\n tabSlots: INodeProps;\r\n TabItemContent: INodeProps;\r\n tabItemType?: TabItemType;\r\n tabHeader: React.ReactNode;\r\n}\r\n\r\nexport interface ITabItemExtentedProps extends IConditionalTabItemProps {\r\n tabItemType?: TabItemType;\r\n isSelected?: boolean;\r\n itemIndex?: number;\r\n tabId?: string;\r\n onVisibilityChange?(itemIndex: number, visibilityState: VisibilityState): void;\r\n}\r\n\r\nexport enum TabItemType {\r\n TabHeader,\r\n TabContent\r\n}\r\n\r\n/**\r\n *\r\n * TabItem component.\r\n * @extends {React.Component}\r\n */\r\n@observer\r\nclass ConditionalTabItem extends React.Component {\r\n private readonly moduleContentClassName: string = 'ms-tab-item-content';\r\n\r\n private readonly moduleHeaderClassName: string = 'ms-tab-item-header';\r\n\r\n constructor(props: IConditionalTabItemProps) {\r\n super(props);\r\n this._renderTabHeader = this._renderTabHeader.bind(this);\r\n }\r\n\r\n public render(): JSX.Element {\r\n const { slots, renderView, config, data, isSelected, itemIndex, onVisibilityChange } = this.props;\r\n const index = itemIndex || 0;\r\n const contentID = getContentID(index, this.props.tabId || '');\r\n const activeContentIDResult = data && data.activeTabState && data.activeTabState.result;\r\n const shown =\r\n activeContentIDResult &&\r\n activeContentIDResult.tabId === this.props.tabId &&\r\n activeContentIDResult.activeContentIndex !== undefined\r\n ? activeContentIDResult.activeContentIndex === index\r\n : isSelected || false;\r\n const viewProps = {\r\n ...this.props,\r\n TabContentContainer: {\r\n moduleProps: this.props,\r\n className: classnames(this.moduleContentClassName, config.className)\r\n },\r\n TabHeaderContainer: {\r\n moduleProps: this.props,\r\n className: classnames(this.moduleHeaderClassName, config.className)\r\n },\r\n TabItemContent: {\r\n className: 'ms-tab-item-content__content',\r\n tag: 'section' as NodeTag,\r\n 'aria-hidden': !shown,\r\n role: 'tabpanel',\r\n tabIndex: shown ? 0 : -1,\r\n id: contentID\r\n },\r\n tabHeader: this._renderTabHeader(),\r\n tabSlots: slots,\r\n onVisibilityChange: (visibilityState: VisibilityState) => onVisibilityChange && onVisibilityChange(index, visibilityState)\r\n };\r\n return renderView(viewProps) as React.ReactElement;\r\n }\r\n\r\n private _renderTabHeader(): React.ReactNode {\r\n return <>{this.props.config.tabItemTitle};\r\n }\r\n}\r\n\r\nexport const getContentID = (index: number, id: string) => {\r\n return `tab-item-content-${id}-${index}`;\r\n};\r\n\r\nexport default ConditionalTabItem;\r\n","import { OrgUnitLocation, StoreHours } from '@msdyn365-commerce/retail-proxy';\r\nimport { IHeiStoreHoursData } from './hei-store-hours.data';\r\nimport { IHeiStoreHoursProps, IHeiStoreHoursResources } from './hei-store-hours.props.autogenerated';\r\nimport { IStoreSelectorLocationLineItemResources } from '../store-selector/components/store-selector-location-line-item';\r\nimport { useEffect, useState } from 'react';\r\nimport { getStoreHoursAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/OrgUnitsDataActions.g';\r\n\r\nexport type IHeiStoreHoursViewProps = IHeiStoreHoursProps & {\r\n storeInfo: {\r\n storeHours: StoreHours | undefined;\r\n location: OrgUnitLocation;\r\n resources: IStoreSelectorLocationLineItemResources;\r\n };\r\n};\r\n\r\nconst HeiStoreHours = (props: IHeiStoreHoursProps) => {\r\n const {\r\n resources,\r\n data: { allStores },\r\n context,\r\n config: { orgUnitNumber }\r\n } = props;\r\n\r\n const [storeHours, setStoreHours] = useState();\r\n const [storeHoursLoaded, setStoreHoursLoaded] = useState(false);\r\n\r\n const store = allStores?.result?.find(s => s.OrgUnitNumber === orgUnitNumber);\r\n\r\n useEffect(() => {\r\n const ctx = { callerContext: context.actionContext };\r\n\r\n getStoreHoursAsync(ctx, orgUnitNumber)\r\n .then((hours?: StoreHours) => {\r\n if (hours && !(hours instanceof Error)) {\r\n setStoreHours(hours);\r\n }\r\n\r\n setStoreHoursLoaded(true);\r\n })\r\n .catch((error: Error) => {\r\n context.telemetry.exception(error);\r\n });\r\n }, [orgUnitNumber, !!store]);\r\n\r\n if (!store || !storeHoursLoaded) {\r\n return null;\r\n }\r\n\r\n const viewProps: IHeiStoreHoursViewProps = {\r\n ...props,\r\n storeInfo: {\r\n storeHours: storeHours,\r\n location: store,\r\n resources: mapResources(resources)\r\n }\r\n };\r\n\r\n return props.renderView(viewProps);\r\n};\r\n\r\nconst mapResources = (resources: IHeiStoreHoursResources): IStoreSelectorLocationLineItemResources => {\r\n return {\r\n contactInfoHeader: resources.contactText,\r\n storeHoursHeader: resources.timeText,\r\n availabilityInfoHeader: resources.availabilityText,\r\n\r\n closedText: resources.storeHoursClosedText,\r\n outOfStock: resources.outOfStockText,\r\n inStock: resources.inStockText,\r\n\r\n currentLocation: resources.selectedStoreLocationText,\r\n selectLocation: resources.selectStoreText,\r\n selectLocationAriaLabelFormat: resources.selectStoreAriaFormatText,\r\n setAsPreferredStoreText: resources.setAsPreferredStoreText,\r\n setAsPreferredStoreTextAriaLabel: resources.setAsPreferredStoreTextAriaLabel,\r\n preferredStoreText: resources.preferredStoreText,\r\n preferredStoreAriaLabel: resources.preferredStoreAriaLabel,\r\n\r\n days: {\r\n monday: resources.storeHoursMondayText,\r\n tuesday: resources.storeHoursTuesdayText,\r\n wednesday: resources.storeHoursWednesdayText,\r\n thursday: resources.storeHoursThursdayText,\r\n friday: resources.storeHoursFridayText,\r\n saturday: resources.storeHoursSaturdayText,\r\n sunday: resources.storeHoursSundayText,\r\n mondayFull: resources.storeHoursMondayFullText,\r\n tuesdayFull: resources.storeHoursTuesdayFullText,\r\n wednesdayFull: resources.storeHoursWednesdayFullText,\r\n thursdayFull: resources.storeHoursThursdayFullText,\r\n fridayFull: resources.storeHoursFridayFullText,\r\n saturdayFull: resources.storeHoursSaturdayFullText,\r\n sundayFull: resources.storeHoursSundayFullText\r\n }\r\n };\r\n};\r\n\r\nexport default HeiStoreHours;\r\n","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\nimport { Module, Node } from '@msdyn365-commerce-modules/utilities';\r\nimport * as React from 'react';\r\n\r\nimport { IStoreSelectorViewProps } from './store-selector';\r\n\r\nconst StoreSelectorView: React.FC = props => {\r\n const {\r\n BodyContainerProps,\r\n FooterContainerProps,\r\n HeaderContainerProps,\r\n HeaderProps,\r\n ModuleProps,\r\n\r\n // HeaderText,\r\n locationsMessage,\r\n search,\r\n state,\r\n spinner,\r\n locationsList,\r\n noLocationsMessage,\r\n terms\r\n } = props;\r\n\r\n return (\r\n \r\n {HeaderProps}\r\n \r\n {locationsMessage}\r\n {search}\r\n {state.isSearchInProgress ? spinner : <>{locationsList ? locationsList : noLocationsMessage}}\r\n \r\n {terms}\r\n \r\n );\r\n};\r\n\r\nexport default StoreSelectorView;\r\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport * as Msdyn365 from '@msdyn365-commerce/core';\nimport { getPayloadObject, getTelemetryAttributes, getTelemetryObject, IModuleProps, INodeProps, IPayLoad, ITelemetryContent, onTelemetryClick } from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport * as React from 'react';\n\nimport { IFooterItemConfig, IFooterItemProps, IHeadingData, ILinkData } from './footer-item.props.autogenerated';\n\nexport interface IFooterViewProps extends IFooterItemProps {\n heading: React.ReactNode;\n image: React.ReactNode;\n text: React.ReactNode;\n linkText: React.ReactNode;\n className?: string;\n FooterItem: IModuleProps;\n HeadingContainer: INodeProps;\n ItemContainer: INodeProps;\n Link: INodeProps;\n EditableLink: React.ReactNode;\n}\n\n/**\n *\n * FooterItem component.\n * @extends {React.PureComponent>}\n */\nexport class FooterItem extends React.PureComponent> {\n private readonly telemetryContent: ITelemetryContent;\n\n private readonly payLoad: IPayLoad;\n\n private attributes: Msdyn365.IDictionary | undefined;\n\n constructor(props: IFooterItemProps) {\n super(props);\n this.telemetryContent = getTelemetryObject(this.props.context.request.telemetryPageName!,\n this.props.friendlyName,\n this.props.telemetry);\n\n // Construct telemetry attribute to render\n this.payLoad = getPayloadObject('click', this.telemetryContent, '', '');\n }\n\n public render(): JSX.Element {\n const { heading, image, link, text } = this.props.config;\n const footerItemClassName = classnames('ms-footer__item', this.props.config.className);\n const linkText = link && link.linkText ? link.linkText : '';\n this.payLoad.contentAction.etext = linkText;\n this.attributes = getTelemetryAttributes(this.telemetryContent, this.payLoad);\n const viewProps: IFooterViewProps = {\n ...this.props,\n heading: this._createHeading(heading!),\n image: this._createImageMarkup(image!),\n text: this._createText(text!),\n linkText: this._createLinkText(link!),\n EditableLink: this._createLink(link!),\n\n FooterItem: {\n moduleProps: this.props,\n className: footerItemClassName\n },\n\n HeadingContainer: {\n className: 'ms-footer__heading'\n },\n\n ItemContainer: {\n className: 'ms-footer__link__container'\n },\n\n // @ts-expect-error\n Link: link && link.linkUrl && link.linkUrl.destinationUrl && {\n tag: 'a',\n role: 'link',\n className: 'ms-footer__link',\n href: link.linkUrl.destinationUrl,\n title: linkText,\n 'aria-label': link.ariaLabel,\n target: link.openInNewTab ? '_blank' : undefined,\n onClick: onTelemetryClick(this.telemetryContent, this.payLoad, linkText),\n ...this.attributes\n },\n className: footerItemClassName\n };\n\n return this.props.renderView(viewProps) as React.ReactElement;\n }\n\n public handleHeadingChange = (event: Msdyn365.ContentEditableEvent) => this.props.config.heading!.text = event.target.value;\n\n public handleTextChange = (event: Msdyn365.ContentEditableEvent) => this.props.config.text = event.target.value;\n\n public handleLinkTextChange = (event: Msdyn365.ContentEditableEvent) => this.props.config.link!.linkText = event.target.value;\n\n private _createLink(link: ILinkData): React.ReactNode | null {\n if (link) {\n const linkText = link.linkText ? link.linkText : '';\n\n // TODO: Update the inner tag in the anchor link to span\n const editableLink: Msdyn365.ILinksData = {\n ariaLabel: link.ariaLabel,\n className: 'ms-footer__link',\n linkText,\n linkUrl: link.linkUrl.destinationUrl,\n openInNewTab: link.openInNewTab,\n role: 'link',\n additionalProperties: this.attributes!,\n onClick: onTelemetryClick(this.telemetryContent, this.payLoad, linkText)\n };\n return (\n \n );\n\n }\n return null;\n }\n\n private _createLinkText(link: ILinkData): React.ReactNode | null {\n if (!link || !link.linkText) {\n return null;\n }\n\n return (\n {link.linkText}\n );\n }\n\n private _createHeading(heading: IHeadingData): React.ReactNode | null {\n if (!heading || !heading.text || heading.text.length === 0) {\n return null;\n }\n\n return (\n \n );\n }\n\n private _createText(text: string): React.ReactNode | null {\n if (!text) {\n return null;\n }\n return (\n \n );\n }\n\n private _createImageMarkup(item: Msdyn365.IImageData, ariaHiddenAttr?: boolean): React.ReactNode | null {\n if (!item || !item.src || item.src.length === 0) {\n return null;\n }\n\n const defaultImageSettings: Msdyn365.IImageSettings = {\n viewports: {\n xs: { q: 'w=24&h=24&m=6', w: 0, h: 0 },\n lg: { q: 'w=24&h=24&m=6', w: 0, h: 0 }\n },\n lazyload: true\n };\n return (\n \n );\n }\n}\n\nexport default FooterItem;\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { Module, Node } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { IFooterViewProps } from './footer-item';\n\n/**\n *\n * FooterItemView component.\n * @extends {React.PureComponent}\n */\nexport class FooterItemView extends React.PureComponent {\n public render(): JSX.Element | null {\n const { FooterItem } = this.props;\n return (\n \n {this._renderElement(this.props)}\n \n );\n }\n\n private _renderElement(props: IFooterViewProps): React.ReactNode | null {\n const { heading, HeadingContainer, Link, linkText, image, text, EditableLink } = props;\n if (heading) {\n return (\n {' '}\n {heading}\n {' '}\n );\n } else if (Link && image) {\n return (\n \n {linkText}\n {image}\n \n );\n } else if (Link) {\n return (EditableLink);\n }\n return (\n <>\n {text}\n {image}\n \n );\n }\n}\n\nexport default FooterItemView;\n"],"sourceRoot":""}