{"version":3,"file":"static/js/36.635bdae47cba0b1d93ea.chunk.js","mappings":"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","sources":["webpack://msdyn365.commerce.online/./src/Utilities/product-placement-data-helper.ts?d813","webpack://msdyn365.commerce.online/./src/Utilities/event-list-render.tsx?fd14","webpack://msdyn365.commerce.online/./src/modules/event-list/event-list.tsx?9886","webpack://msdyn365.commerce.online/./src/themes/columbiacrest/views/components/event-list-render.tsx?134f","webpack://msdyn365.commerce.online/./src/themes/columbiacrest/views/event-list.view.tsx?b16f","webpack://msdyn365.commerce.online/./node_modules/moment/locale/ sync ^\\.\\/.*$?b2df"],"sourcesContent":["import { getProductPageUrlSync, getProductUrlSync } from '@msdyn365-commerce-modules/retail-actions';\r\nimport { CategoryHierarchy, FullProduct } from '@msdyn365-commerce/commerce-entities';\r\nimport { ICoreContext, IRequestContext } from '@msdyn365-commerce/core';\r\nimport { AttributeValue, ProductPrice, ProductRating, ProductSearchResult } from '@msdyn365-commerce/retail-proxy';\r\nexport interface IProductPlacementDataItem {\r\n description?: string;\r\n heading?: string;\r\n price?: IPrice;\r\n rating?: IRating;\r\n image?: string;\r\n productUrl?: string;\r\n recordId?: number;\r\n attributes?: AttributeValue[];\r\n}\r\nexport interface IPrice {\r\n locale: string;\r\n currencyCode: string;\r\n freePriceText: string;\r\n currentPrice?: IPriceRange;\r\n originalPrice?: IPriceRange;\r\n rangeFormatText?: string;\r\n savingsText?: string;\r\n originalPriceText: string;\r\n currentPriceText: string;\r\n}\r\n\r\nexport interface IRating {\r\n averageRating?: number;\r\n totalRatings?: number;\r\n ariaLabel?: string;\r\n}\r\n\r\nexport interface IPriceRange {\r\n startingValue: number;\r\n endingValue?: number;\r\n}\r\n\r\nexport function mapProductSearchResult(\r\n products: ProductSearchResult[],\r\n freePriceText: string,\r\n originalPriceText: string,\r\n currentPriceText: string,\r\n ratingAriaLabel: string,\r\n context: ICoreContext,\r\n CurrencyCode: string,\r\n category?: CategoryHierarchy\r\n): IProductPlacementDataItem[] {\r\n if (products && products.length > 0) {\r\n const productItems: IProductPlacementDataItem[] = [];\r\n products.map(product => {\r\n if (product && product !== undefined && product.RecordId !== undefined) {\r\n const productUrl = getProductPageUrlSync(product.Name || '', product.RecordId, context && context.actionContext, category);\r\n const item = {\r\n heading: product.Name,\r\n description: product.Description,\r\n price: mapProductSearchResultPrice(context.request, freePriceText, CurrencyCode, originalPriceText, currentPriceText, product.BasePrice, product.Price),\r\n rating: mapProductSearchResultRating(ratingAriaLabel, product.TotalRatings, product.AverageRating),\r\n image: product.PrimaryImageUrl,\r\n productUrl: productUrl,\r\n recordId: product.RecordId\r\n };\r\n productItems.push(item);\r\n }\r\n });\r\n return productItems;\r\n }\r\n return [];\r\n}\r\n\r\nfunction mapProductSearchResultPrice(\r\n requestContext: IRequestContext,\r\n freePriceText: string,\r\n currencyCode: string,\r\n originalPriceText: string,\r\n currentPriceText: string,\r\n productBasePrice?: number,\r\n productPrice?: number,\r\n): IPrice | undefined {\r\n if (productPrice !== undefined && requestContext) {\r\n return {\r\n locale: requestContext.locale,\r\n currencyCode: currencyCode,\r\n freePriceText: freePriceText,\r\n originalPriceText: originalPriceText,\r\n currentPriceText: currentPriceText,\r\n currentPrice: _mapNumberToIPriceRange(productPrice),\r\n originalPrice: _mapNumberToIPriceRange(productBasePrice)\r\n };\r\n }\r\n return undefined;\r\n}\r\n\r\nexport function mapProductCollection(\r\n products: FullProduct[],\r\n freePriceText: string,\r\n ratingAriaLabel: string,\r\n originalPriceText: string,\r\n currentPriceText: string,\r\n context: ICoreContext,\r\n category?: CategoryHierarchy\r\n): IProductPlacementDataItem[] {\r\n if(!products || products.length === 0) {\r\n return [];\r\n }\r\n\r\n const productItems: IProductPlacementDataItem[] = [];\r\n products.map(product => {\r\n if(product && product.ProductDetails) {\r\n const productUrl = getProductUrlSync(product.ProductDetails, context && context.actionContext, category);\r\n const item = {\r\n heading: product.ProductDetails.Name,\r\n description: product.ProductDetails.Description,\r\n price: mapProductPrice(product.ProductPrice, context.request, freePriceText, originalPriceText, currentPriceText),\r\n rating: mapProductRating(product.ProductRating, ratingAriaLabel),\r\n image: product.ProductDetails.PrimaryImageUrl,\r\n productUrl: productUrl,\r\n recordId: product.ProductDetails.RecordId,\r\n // @ts-ignore\r\n attributes: product.ProductAttributes\r\n };\r\n productItems.push(item);\r\n }\r\n });\r\n\r\n return productItems;\r\n}\r\n\r\nfunction mapProductPrice(\r\n productPrice: ProductPrice | undefined,\r\n requestContext: IRequestContext,\r\n freePriceText: string,\r\n originalPriceText: string,\r\n currentPriceText: string,\r\n): IPrice | undefined {\r\n if (productPrice && requestContext) {\r\n return {\r\n locale: requestContext.locale,\r\n currencyCode: productPrice.CurrencyCode ? productPrice.CurrencyCode : '',\r\n freePriceText: freePriceText,\r\n originalPriceText: originalPriceText,\r\n currentPriceText: currentPriceText,\r\n currentPrice: _mapNumberToIPriceRange(productPrice.CustomerContextualPrice),\r\n originalPrice: _mapNumberToIPriceRange(\r\n Math.max(productPrice.BasePrice || 0, productPrice.TradeAgreementPrice || 0, productPrice.AdjustedPrice || 0)\r\n )\r\n };\r\n }\r\n return undefined;\r\n}\r\n\r\nfunction mapProductSearchResultRating(\r\n ariaLabel: string,\r\n productTotalRating?: number,\r\n productAverageRating?: number\r\n): IRating | undefined {\r\n if (productTotalRating && productAverageRating) {\r\n return {\r\n averageRating: productAverageRating,\r\n totalRatings: productTotalRating,\r\n ariaLabel: ariaLabel\r\n };\r\n }\r\n return undefined;\r\n}\r\n\r\nfunction mapProductRating(\r\n productRating: ProductRating | undefined,\r\n ariaLabel: string\r\n): IRating | undefined {\r\n if (productRating) {\r\n return {\r\n averageRating: productRating.AverageRating || 0,\r\n totalRatings: productRating.TotalRatings || 0,\r\n ariaLabel: ariaLabel\r\n };\r\n }\r\n return undefined;\r\n}\r\n\r\nfunction _mapNumberToIPriceRange(price: number | undefined): IPriceRange | undefined {\r\n if (price !== undefined) {\r\n return {\r\n startingValue: price\r\n };\r\n }\r\n return undefined;\r\n}\r\n","// ============================================================================\r\n// Renders a list of events\r\n// ============================================================================\r\nimport { getRichTextHtml, IDictionary } from '@msdyn365-commerce/core';\r\nimport moment from 'moment-timezone';\r\nimport * as React from 'react';\r\nimport { IProductAttributeProps } from './product-lightbox';\r\nimport { IPrice, IProductPlacementDataItem } from './product-placement-data-helper';\r\n\r\n// ============================================================================\r\n// INTERFACES AND CONSTANTS\r\n// ============================================================================\r\n\r\nexport interface IEventListRenderProps {\r\n events: IProductPlacementDataItem[];\r\n maximum?: number;\r\n noFutureEventsJSX: JSX.Element;\r\n timezone: string;\r\n soldOutText?: string;\r\n debugMode?: boolean;\r\n}\r\n\r\ntype maybeMoment = moment.Moment | undefined;\r\n\r\n// Internal interface for info on a single event\r\ninterface IFormattedEvent {\r\n id?: number;\r\n name?: string;\r\n description?: string;\r\n price?: IPrice;\r\n pdp?: string;\r\n category?: string;\r\n intro?: string;\r\n startDate?: maybeMoment;\r\n endDate?: maybeMoment;\r\n time?: string;\r\n location?: string;\r\n priceText?: string;\r\n purchaseUrl?: string;\r\n eventUrlTitle?: string;\r\n soldOut?: boolean;\r\n downloadPDFUrl?: string;\r\n productImage?: string;\r\n}\r\n\r\n// -------------------------------------------------------------\r\n// Hides errors by attempting to prevent ambigious values\r\n// -------------------------------------------------------------\r\nfunction eventSortKey(event: IFormattedEvent): string {\r\n const date: string = event.startDate!.format('X');\r\n\r\n return `${date}-${event.time}-${event.name}`;\r\n}\r\n\r\n// -------------------------------------------------------------\r\n// OLD, ambiguous method. Produces errors in some cases.\r\n// -------------------------------------------------------------\r\nfunction oldSortKey(event: IFormattedEvent): number {\r\n return +event.startDate!.format('X');\r\n}\r\n\r\n// =============================================================================\r\n// CLASS DEFINITION\r\n// =============================================================================\r\n/**\r\n * Event list render component\r\n */\r\nexport default class RenderEventList extends React.PureComponent {\r\n\r\n // ============================================================================\r\n // PUBLIC METHODS\r\n // ============================================================================\r\n\r\n // -------------------------------------------------------------\r\n // -------------------------------------------------------------\r\n public render(): JSX.Element | null {\r\n return this._renderEventList();\r\n }\r\n\r\n // ============================================================================\r\n // JSX FRAGMENTS\r\n // ============================================================================\r\n\r\n // -------------------------------------------------------------\r\n // Render the event list\r\n // -------------------------------------------------------------\r\n private _renderEventList(): JSX.Element {\r\n const maxToDisplay = this.props.maximum || 999; // Default to a large number, but not ludicrously large\r\n\r\n // Format the event list\r\n let eventList: IFormattedEvent[] = this._formatList(this.props.events);\r\n\r\n // Clean up the list before display\r\n eventList = this._sortAndTrimList(eventList, maxToDisplay);\r\n\r\n // If the event list still has something to display after being trimmed\r\n // then show the list or display the no current events jsx message\r\n if (eventList.length === 0) {\r\n return this.props.noFutureEventsJSX;\r\n } else {\r\n return (\r\n
\r\n {eventList.map((event: IFormattedEvent) => (\r\n
\r\n {this._renderEvent(event)}\r\n
\r\n ))}\r\n
\r\n );\r\n }\r\n }\r\n\r\n // -------------------------------------------------------------\r\n // Render a single event\r\n // -------------------------------------------------------------\r\n // tslint:disable: react-no-dangerous-html\r\n private _renderEvent(event: IFormattedEvent): JSX.Element | null {\r\n return (\r\n \r\n
\r\n {`${event.name}\r\n
\r\n
\r\n {this._renderDateRange(event.startDate, event.endDate)}\r\n
{event.category}
\r\n {event.name}\r\n
\r\n
{event.location}
\r\n
{event.time}
\r\n
{event.priceText}
\r\n
\r\n Details\r\n
\r\n {/*
\r\n {event.eventUrlTitle}\r\n
\r\n
\r\n Download PDF\r\n
*/}\r\n {event.soldOut &&
{this.props.soldOutText}
}\r\n
\r\n \r\n );\r\n }\r\n\r\n // -------------------------------------------------------------\r\n // Render a single event\r\n // -------------------------------------------------------------\r\n private _renderDateRange(startDate: moment.Moment | undefined, endDate: moment.Moment | undefined): JSX.Element | null {\r\n\r\n // Early out if there's no dates\r\n if (!startDate && !endDate) {\r\n return null;\r\n }\r\n\r\n // Both: Display as range\r\n const isRange = (startDate && endDate);\r\n\r\n return (\r\n
\r\n\r\n {/* Single Date */}\r\n {!isRange &&\r\n
\r\n {this._renderDate(startDate!)}\r\n
\r\n }\r\n\r\n {/* Date Range */}\r\n {isRange &&\r\n
\r\n {this._renderDate(startDate!)}\r\n {/* No content: fill in with css */}\r\n {this._renderDate(endDate!)}\r\n
\r\n }\r\n
\r\n );\r\n }\r\n\r\n // -------------------------------------------------------------\r\n // -------------------------------------------------------------\r\n private _renderDate(date: moment.Moment): JSX.Element {\r\n return (\r\n \r\n {this._renderMonth(date)}\r\n {this._renderDay(date)}\r\n {this._renderYear(date)}\r\n \r\n );\r\n }\r\n\r\n // -------------------------------------------------------------\r\n // Render a month in several different formats.\r\n // It's up to the css to hide unwanted versions.\r\n // -------------------------------------------------------------\r\n private _renderMonth(date: moment.Moment): JSX.Element {\r\n return (\r\n \r\n {date.format('M')}\r\n {date.format('MMM')}\r\n {date.format('MMMM')}\r\n \r\n );\r\n }\r\n\r\n // -------------------------------------------------------------\r\n // Render a year in several different formats.\r\n // It's up to the css to hide unwanted versions.\r\n // -------------------------------------------------------------\r\n private _renderYear(date: moment.Moment): JSX.Element {\r\n return (\r\n \r\n {date.format('YY')}\r\n {date.format('YYYY')}\r\n \r\n );\r\n }\r\n\r\n // -------------------------------------------------------------\r\n // Render a day in several different formats (Currently only one).\r\n // It's up to the css to hide unwanted versions.\r\n // -------------------------------------------------------------\r\n private _renderDay(date: moment.Moment): JSX.Element {\r\n return (\r\n \r\n {date.format('D')}\r\n \r\n );\r\n }\r\n\r\n // ============================================================================\r\n // PRIVATE METHODS\r\n // ============================================================================\r\n\r\n // -------------------------------------------------------------\r\n // Formats the product and attribute data into a more useful format\r\n // -------------------------------------------------------------\r\n private _formatList(list: IProductPlacementDataItem[]): IFormattedEvent[] {\r\n\r\n const fieldSources: IDictionary = {\r\n 'End Date': 'DateTimeOffsetValue',\r\n 'Start Date': 'DateTimeOffsetValue',\r\n 'Can add to cart': 'BooleanValue', // Boolean DataTypeValue: 6\r\n 'Sold Out': 'BooleanValue',\r\n\r\n default: 'TextValue'\r\n };\r\n\r\n return list.map((entry) => {\r\n // @ts-ignore\r\n const attributes = this._getAttributes(entry.attributes, fieldSources);\r\n\r\n if (this.props.debugMode) {\r\n console.log('Event Attributes', attributes);\r\n }\r\n\r\n const startDate = attributes['Start Date'] ? moment.tz(attributes['Start Date'], this.props.timezone) : undefined;\r\n const endDate = attributes['End Date'] ? moment.tz(attributes['End Date'], this.props.timezone) : undefined;\r\n const dates = this._dateLogic(startDate, endDate);\r\n return {\r\n id: entry.recordId,\r\n name: entry.heading,\r\n price: entry.price,\r\n pdp: entry.productUrl,\r\n productImage: entry.image,\r\n\r\n category: attributes['SLR Event Type'],\r\n intro: attributes.Introduction,\r\n description: attributes.Body, // PDP only\r\n startDate: dates.start,\r\n endDate: dates.end,\r\n time: attributes['Time Range'],\r\n location: attributes['SLR Event Location'],\r\n priceText: attributes['Event Price Info'],\r\n\r\n purchaseUrl: attributes['Event Purchase URL'],\r\n eventUrlTitle: attributes['Event URL Title'],\r\n downloadPDFUrl: attributes['Download PDF URL'],\r\n\r\n soldOut: attributes['Sold Out']\r\n };\r\n });\r\n\r\n /* OTHER ATTRIBUTES\r\n Event purchase\r\n Event Purchase URL\r\n Event URL Title\r\n Featured Y/N\r\n Video Caption\r\n Video Title\r\n */\r\n }\r\n\r\n // -------------------------------------------------------------\r\n // Converts the attribute list into a simple hash\r\n // -------------------------------------------------------------\r\n // tslint:disable-next-line:no-any\r\n private _getAttributes(attributes: IProductAttributeProps[], fieldSources: IDictionary): IDictionary {\r\n\r\n return attributes.reduce((output, attribute) => {\r\n if (attribute.Name) {\r\n const attributeSource = fieldSources[attribute.Name] || fieldSources.default;\r\n (output[attribute.Name] = attribute[attributeSource]);\r\n }\r\n\r\n return output;\r\n }, {}); // <--- I hate the `align` rule\r\n }\r\n\r\n // -------------------------------------------------------------\r\n // Date logic:\r\n // Only start date: Good\r\n // Only end date: Move to start date\r\n // Start and end are the same: Remove end date\r\n // Both: Display as range\r\n // -------------------------------------------------------------\r\n private _dateLogic(startDate: moment.Moment | undefined, endDate: moment.Moment | undefined): { start: maybeMoment; end: maybeMoment } {\r\n // Only end date: Move to start date\r\n if (endDate && !startDate) {\r\n startDate = endDate;\r\n endDate = undefined;\r\n }\r\n\r\n // Start and end are the same: Remove end date\r\n if (startDate && startDate.isSame(endDate, 'day')) {\r\n endDate = undefined;\r\n }\r\n\r\n return {\r\n start: startDate,\r\n end: endDate\r\n };\r\n }\r\n\r\n // -------------------------------------------------------------\r\n // Sort the list by date, then trim it.\r\n //\r\n // @FIXME/dg: These should ideally be handled by the server query\r\n // to minimize request size\r\n // -------------------------------------------------------------\r\n private _sortAndTrimList(eventList: IFormattedEvent[], maxToDisplay: number): IFormattedEvent[] {\r\n\r\n // subtracting 1 from the current date so that we are able to show events\r\n // on the day of; since we are using the isBefore method.\r\n const today = moment.tz(Date.now(), this.props.timezone)\r\n .startOf('day');\r\n\r\n // Filter out events with no dates (logic has already occurred)\r\n eventList = eventList.filter((event: IFormattedEvent) => {\r\n\r\n // ensure events have a starting date at least, end date is unreliable\r\n if (event.startDate) {\r\n\r\n // Remove events that have past\r\n return !this._isEventPast(event, today);\r\n }\r\n\r\n return false;\r\n });\r\n\r\n // Sort the list by date\r\n // @FIXME/dg: Band-aid version. Messy! Move to its own function if we keep this.\r\n if (eventList.length) {\r\n eventList = eventList.sort((event1, event2) => {\r\n const a = this.props.debugMode ? oldSortKey(event1) : eventSortKey(event1);\r\n const b = this.props.debugMode ? oldSortKey(event2) : eventSortKey(event2);\r\n\r\n if (a < b) {\r\n return -1;\r\n } else if (a > b) {\r\n return 1;\r\n } else {\r\n return 0;\r\n }\r\n });\r\n }\r\n\r\n // Trim unwanted events\r\n if (eventList.length &&\r\n maxToDisplay &&\r\n (eventList.length > maxToDisplay)\r\n ) {\r\n eventList.splice(maxToDisplay);\r\n }\r\n\r\n return eventList;\r\n }\r\n\r\n // -------------------------------------------------------------\r\n // Determine if an event is passed the day given\r\n // -------------------------------------------------------------\r\n private _isEventPast(event: IFormattedEvent, date: moment.Moment): boolean {\r\n const { startDate, endDate } = event;\r\n\r\n // we want to use the date the references the events closure the closest\r\n const furthestDate = endDate || startDate!;\r\n return furthestDate.isBefore(date, 'day');\r\n }\r\n}\r\n","/*---------------------------------------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License. See License.txt in the project root for license information.\r\n *--------------------------------------------------------------------------------------------*/\r\n\r\nimport { observer } from 'mobx-react';\r\nimport * as React from 'react';\r\n\r\nimport { FullProduct } from '@msdyn365-commerce/commerce-entities';\r\nimport { getRichTextHtml } from '@msdyn365-commerce/core';\r\nimport { mapProductCollection } from '../../Utilities/product-placement-data-helper';\r\nimport { IEventListData } from './event-list.data';\r\nimport { IEventListProps } from './event-list.props.autogenerated';\r\n\r\nimport RenderEventList from '../../Utilities/event-list-render';\r\n\r\n// ==============================================================================\r\n// CLASS DEFINITION\r\n// ==============================================================================\r\n/**\r\n *\r\n * EventList component\r\n * @extends {React.Component>}\r\n */\r\n@observer\r\nclass EventList extends React.Component> {\r\n\r\n // =============================================================================\r\n // PUBLIC METHODS\r\n // =============================================================================\r\n\r\n // --------------------------------------------------------------\r\n // --------------------------------------------------------------\r\n public render(): JSX.Element {\r\n const { config, context, data } = this.props;\r\n const returnedView = this.props.renderView(this.props);\r\n if(returnedView){\r\n return returnedView;\r\n }\r\n\r\n const products: FullProduct[] = this._getEventListItems();\r\n\r\n if (products && products.length) {\r\n const eventList = mapProductCollection(\r\n products.filter(product => product.ProductDetails && product.ProductDetails.Name),\r\n 'Free',\r\n '',\r\n '',\r\n '',\r\n context,\r\n (data.category && data.category.result) || undefined\r\n );\r\n\r\n if (eventList && eventList.length !== 0) {\r\n return (\r\n \r\n );\r\n } else {\r\n console.log('Could not map product collection to product placement item succesfully');\r\n }\r\n }\r\n return this._renderNoEventsMessage();\r\n }\r\n\r\n // =============================================================================\r\n // JSX FRAGMENTS\r\n // =============================================================================\r\n\r\n // --------------------------------------------------------------\r\n // If no events are present, render this instead of the events\r\n // list\r\n // --------------------------------------------------------------\r\n private _renderNoEventsMessage(): JSX.Element {\r\n const { noEventsText } = this.props.config;\r\n\r\n const textToShow = noEventsText || 'No Events';\r\n\r\n return (\r\n // tslint:disable-next-line: react-no-dangerous-html\r\n \r\n );\r\n }\r\n\r\n // =============================================================================\r\n // PRIVATE METHODS\r\n // =============================================================================\r\n\r\n // --------------------------------------------------------------\r\n // Construct the event list data\r\n // --------------------------------------------------------------\r\n private _getEventListItems(): FullProduct[] {\r\n const { data } = this.props;\r\n let products: FullProduct[] = [];\r\n\r\n // TODO: May need to add refineSearch in future.\r\n // const refineSearchProducts = this.props.data.refineSearchProducts && this.props.data.refineSearchProducts.result;\r\n // if (refineSearchProducts && refineSearchProducts.refinementCriteria && refineSearchProducts.refinementCriteria.length) {\r\n // if (refineSearchProducts.productSearchResult && refineSearchProducts.productSearchResult.length) {\r\n // products = refineSearchProducts.productSearchResult;\r\n // }\r\n // }\r\n\r\n if (data.products && data.products.result && data.products.result.length > 0) {\r\n products = data.products.result;\r\n }\r\n\r\n return products;\r\n }\r\n}\r\n\r\nexport default EventList;","// ============================================================================\r\n// Renders a list of events\r\n// ============================================================================\r\nimport { getRichTextHtml, IDictionary } from '@msdyn365-commerce/core';\r\nimport moment from 'moment-timezone';\r\nimport * as React from 'react';\r\nimport { IProductAttributeProps } from '../../../../Utilities/product-lightbox';\r\nimport { IPrice, IProductPlacementDataItem } from '../../../../Utilities/product-placement-data-helper';\r\n\r\n// ============================================================================\r\n// INTERFACES AND CONSTANTS\r\n// ============================================================================\r\n\r\nexport interface IEventListRenderProps {\r\n events: IProductPlacementDataItem[];\r\n maximum?: number;\r\n noFutureEventsJSX: JSX.Element;\r\n timezone: string;\r\n soldOutText?: string;\r\n debugMode?: boolean;\r\n}\r\n\r\ntype maybeMoment = moment.Moment | undefined;\r\n\r\n// Internal interface for info on a single event\r\ninterface IFormattedEvent {\r\n id?: number;\r\n name?: string;\r\n description?: string;\r\n price?: IPrice;\r\n pdp?: string;\r\n category?: string;\r\n intro?: string;\r\n startDate?: maybeMoment;\r\n endDate?: maybeMoment;\r\n time?: string;\r\n location?: string;\r\n priceText?: string;\r\n purchaseUrl?: string;\r\n eventUrlTitle?: string;\r\n soldOut?: boolean;\r\n downloadPDFUrl?: string;\r\n productImage?: string;\r\n}\r\n\r\n// -------------------------------------------------------------\r\n// Hides errors by attempting to prevent ambigious values\r\n// -------------------------------------------------------------\r\nfunction eventSortKey(event: IFormattedEvent): string {\r\n const date: string = event.startDate!.format('X');\r\n\r\n return `${date}-${event.time}-${event.name}`;\r\n}\r\n\r\n// -------------------------------------------------------------\r\n// OLD, ambiguous method. Produces errors in some cases.\r\n// -------------------------------------------------------------\r\nfunction oldSortKey(event: IFormattedEvent): number {\r\n return +event.startDate!.format('X');\r\n}\r\n\r\n// =============================================================================\r\n// CLASS DEFINITION\r\n// =============================================================================\r\n/**\r\n * Event list render component\r\n */\r\nexport default class RenderEventList extends React.PureComponent {\r\n\r\n // ============================================================================\r\n // PUBLIC METHODS\r\n // ============================================================================\r\n\r\n // -------------------------------------------------------------\r\n // -------------------------------------------------------------\r\n public render(): JSX.Element | null {\r\n return this._renderEventList();\r\n }\r\n\r\n // ============================================================================\r\n // JSX FRAGMENTS\r\n // ============================================================================\r\n\r\n // -------------------------------------------------------------\r\n // Render the event list\r\n // -------------------------------------------------------------\r\n private _renderEventList(): JSX.Element {\r\n const maxToDisplay = this.props.maximum || 999; // Default to a large number, but not ludicrously large\r\n\r\n // Format the event list\r\n let eventList: IFormattedEvent[] = this._formatList(this.props.events);\r\n\r\n // Clean up the list before display\r\n eventList = this._sortAndTrimList(eventList, maxToDisplay);\r\n\r\n // If the event list still has something to display after being trimmed\r\n // then show the list or display the no current events jsx message\r\n if (eventList.length === 0) {\r\n return this.props.noFutureEventsJSX;\r\n } else {\r\n return (\r\n
\r\n {eventList.map((event: IFormattedEvent, i: number) => (\r\n
\r\n {i > 0 &&
}\r\n {this._renderEvent(event)}\r\n
\r\n ))}\r\n
\r\n );\r\n }\r\n }\r\n\r\n // -------------------------------------------------------------\r\n // Render a single event\r\n // -------------------------------------------------------------\r\n // tslint:disable: react-no-dangerous-html\r\n private _renderEvent(event: IFormattedEvent): JSX.Element | null {\r\n return (\r\n \r\n
\r\n {`${event.name}\r\n
\r\n
\r\n {this._renderDateRange(event.startDate, event.endDate)}\r\n
{event.category}
\r\n {event.name}\r\n
\r\n
{event.location}
\r\n
{event.time}
\r\n
{event.priceText}
\r\n
\r\n Details\r\n
\r\n {/* \r\n
\r\n Download PDF\r\n
*/}\r\n {event.soldOut &&
{this.props.soldOutText}
}\r\n
\r\n \r\n );\r\n }\r\n\r\n // -------------------------------------------------------------\r\n // Render a single event\r\n // -------------------------------------------------------------\r\n private _renderDateRange(startDate: moment.Moment | undefined, endDate: moment.Moment | undefined): JSX.Element | null {\r\n\r\n // Early out if there's no dates\r\n if (!startDate && !endDate) {\r\n return null;\r\n }\r\n\r\n // Both: Display as range\r\n const isRange = (startDate && endDate);\r\n const isMonthSame = (startDate?.month === endDate?.month);\r\n return (\r\n
\r\n\r\n {/* Single Date */}\r\n {!isRange &&\r\n
\r\n {this._renderDate(startDate!)}\r\n
\r\n }\r\n\r\n {/* Date Range */}\r\n {isRange && isMonthSame &&\r\n
\r\n {this._renderMonth(startDate!)}\r\n \r\n {this._renderDay(startDate!)}\r\n {/* No content: fill in with css */}\r\n {this._renderDay(endDate!)}\r\n \r\n
\r\n }\r\n {isRange && !isMonthSame &&\r\n
\r\n {this._renderDate(startDate!)}\r\n {/* No content: fill in with css */}\r\n {this._renderDate(endDate!)}\r\n
\r\n }\r\n
\r\n );\r\n }\r\n\r\n // -------------------------------------------------------------\r\n // -------------------------------------------------------------\r\n private _renderDate(date: moment.Moment): JSX.Element {\r\n return (\r\n \r\n {this._renderMonth(date)}\r\n {this._renderDay(date)}\r\n {this._renderYear(date)}\r\n \r\n );\r\n }\r\n\r\n // -------------------------------------------------------------\r\n // Render a month in several different formats.\r\n // It's up to the css to hide unwanted versions.\r\n // -------------------------------------------------------------\r\n private _renderMonth(date: moment.Moment): JSX.Element {\r\n return (\r\n \r\n {date.format('M')}\r\n \r\n {date.format('MMMM')}\r\n \r\n );\r\n }\r\n\r\n // -------------------------------------------------------------\r\n // Render a year in several different formats.\r\n // It's up to the css to hide unwanted versions.\r\n // -------------------------------------------------------------\r\n private _renderYear(date: moment.Moment): JSX.Element {\r\n return (\r\n \r\n {date.format('YY')}\r\n {date.format('YYYY')}\r\n \r\n );\r\n }\r\n\r\n // -------------------------------------------------------------\r\n // Render a day in several different formats (Currently only one).\r\n // It's up to the css to hide unwanted versions.\r\n // -------------------------------------------------------------\r\n private _renderDay(date: moment.Moment): JSX.Element {\r\n return (\r\n \r\n {date.format('D')}\r\n \r\n );\r\n }\r\n\r\n // ============================================================================\r\n // PRIVATE METHODS\r\n // ============================================================================\r\n\r\n // -------------------------------------------------------------\r\n // Formats the product and attribute data into a more useful format\r\n // -------------------------------------------------------------\r\n private _formatList(list: IProductPlacementDataItem[]): IFormattedEvent[] {\r\n\r\n const fieldSources: IDictionary = {\r\n 'End Date': 'DateTimeOffsetValue',\r\n 'Start Date': 'DateTimeOffsetValue',\r\n 'Can add to cart': 'BooleanValue', // Boolean DataTypeValue: 6\r\n 'Sold Out': 'BooleanValue',\r\n\r\n default: 'TextValue'\r\n };\r\n\r\n return list.map((entry) => {\r\n // @ts-ignore\r\n const attributes = this._getAttributes(entry.attributes, fieldSources);\r\n\r\n if (this.props.debugMode) {\r\n console.log('Event Attributes', attributes);\r\n }\r\n\r\n const startDate = attributes['Start Date'] ? moment.tz(attributes['Start Date'], this.props.timezone) : undefined;\r\n const endDate = attributes['End Date'] ? moment.tz(attributes['End Date'], this.props.timezone) : undefined;\r\n const dates = this._dateLogic(startDate, endDate);\r\n return {\r\n id: entry.recordId,\r\n name: entry.heading,\r\n price: entry.price,\r\n pdp: entry.productUrl,\r\n productImage: entry.image,\r\n\r\n category: attributes['SLR Event Type'],\r\n intro: attributes.Introduction,\r\n description: attributes.Body, // PDP only\r\n startDate: dates.start,\r\n endDate: dates.end,\r\n time: attributes['Time Range'],\r\n location: attributes['SLR Event Location'],\r\n priceText: attributes['Event Price Info'],\r\n\r\n purchaseUrl: attributes['Event Purchase URL'],\r\n eventUrlTitle: attributes['Event URL Title'],\r\n downloadPDFUrl: attributes['Download PDF URL'],\r\n\r\n soldOut: attributes['Sold Out']\r\n };\r\n });\r\n\r\n /* OTHER ATTRIBUTES\r\n Event purchase\r\n Event Purchase URL\r\n Event URL Title\r\n Featured Y/N\r\n Video Caption\r\n Video Title\r\n */\r\n }\r\n\r\n // -------------------------------------------------------------\r\n // Converts the attribute list into a simple hash\r\n // -------------------------------------------------------------\r\n // tslint:disable-next-line:no-any\r\n private _getAttributes(attributes: IProductAttributeProps[], fieldSources: IDictionary): IDictionary {\r\n\r\n return attributes.reduce((output, attribute) => {\r\n if (attribute.Name) {\r\n const attributeSource = fieldSources[attribute.Name] || fieldSources.default;\r\n (output[attribute.Name] = attribute[attributeSource]);\r\n }\r\n\r\n return output;\r\n }, {}); // <--- I hate the `align` rule\r\n }\r\n\r\n // -------------------------------------------------------------\r\n // Date logic:\r\n // Only start date: Good\r\n // Only end date: Move to start date\r\n // Start and end are the same: Remove end date\r\n // Both: Display as range\r\n // -------------------------------------------------------------\r\n private _dateLogic(startDate: moment.Moment | undefined, endDate: moment.Moment | undefined): { start: maybeMoment; end: maybeMoment } {\r\n // Only end date: Move to start date\r\n if (endDate && !startDate) {\r\n startDate = endDate;\r\n endDate = undefined;\r\n }\r\n\r\n // Start and end are the same: Remove end date\r\n if (startDate && startDate.isSame(endDate, 'day')) {\r\n endDate = undefined;\r\n }\r\n\r\n return {\r\n start: startDate,\r\n end: endDate\r\n };\r\n }\r\n\r\n // -------------------------------------------------------------\r\n // Sort the list by date, then trim it.\r\n //\r\n // @FIXME/dg: These should ideally be handled by the server query\r\n // to minimize request size\r\n // -------------------------------------------------------------\r\n private _sortAndTrimList(eventList: IFormattedEvent[], maxToDisplay: number): IFormattedEvent[] {\r\n\r\n // subtracting 1 from the current date so that we are able to show events\r\n // on the day of; since we are using the isBefore method.\r\n const today = moment.tz(Date.now(), this.props.timezone)\r\n .startOf('day');\r\n\r\n // Filter out events with no dates (logic has already occurred)\r\n eventList = eventList.filter((event: IFormattedEvent) => {\r\n\r\n // ensure events have a starting date at least, end date is unreliable\r\n if (event.startDate) {\r\n\r\n // Remove events that have past\r\n return !this._isEventPast(event, today);\r\n }\r\n\r\n return false;\r\n });\r\n\r\n // Sort the list by date\r\n // @FIXME/dg: Band-aid version. Messy! Move to its own function if we keep this.\r\n if (eventList.length) {\r\n eventList = eventList.sort((event1, event2) => {\r\n const a = this.props.debugMode ? oldSortKey(event1) : eventSortKey(event1);\r\n const b = this.props.debugMode ? oldSortKey(event2) : eventSortKey(event2);\r\n\r\n if (a < b) {\r\n return -1;\r\n } else if (a > b) {\r\n return 1;\r\n } else {\r\n return 0;\r\n }\r\n });\r\n }\r\n\r\n // Trim unwanted events\r\n if (eventList.length &&\r\n maxToDisplay &&\r\n (eventList.length > maxToDisplay)\r\n ) {\r\n eventList.splice(maxToDisplay);\r\n }\r\n\r\n return eventList;\r\n }\r\n\r\n // -------------------------------------------------------------\r\n // Determine if an event is passed the day given\r\n // -------------------------------------------------------------\r\n private _isEventPast(event: IFormattedEvent, date: moment.Moment): boolean {\r\n const { startDate, endDate } = event;\r\n\r\n // we want to use the date the references the events closure the closest\r\n const furthestDate = endDate || startDate!;\r\n return furthestDate.isBefore(date, 'day');\r\n }\r\n}\r\n","/*---------------------------------------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License. See License.txt in the project root for license information.\r\n *--------------------------------------------------------------------------------------------*/\r\n\r\nimport { observer } from 'mobx-react';\r\nimport * as React from 'react';\r\n\r\nimport { FullProduct } from '@msdyn365-commerce/commerce-entities';\r\nimport { getRichTextHtml } from '@msdyn365-commerce/core';\r\nimport { mapProductCollection } from '../../../Utilities/product-placement-data-helper';\r\nimport { IEventListData } from '../../../modules/event-list/event-list.data';\r\nimport { IEventListProps } from '../../../modules/event-list/event-list.props.autogenerated';\r\n\r\nimport RenderEventList from './components/event-list-render';\r\n\r\n// ==============================================================================\r\n// CLASS DEFINITION\r\n// ==============================================================================\r\n/**\r\n *\r\n * EventList component\r\n * @extends {React.Component>}\r\n */\r\n@observer\r\nclass EventList extends React.Component> {\r\n\r\n // =============================================================================\r\n // PUBLIC METHODS\r\n // =============================================================================\r\n\r\n // --------------------------------------------------------------\r\n // --------------------------------------------------------------\r\n public render(): JSX.Element {\r\n const { config, context, data } = this.props;\r\n\r\n const products: FullProduct[] = this._getEventListItems();\r\n\r\n if (products && products.length) {\r\n const eventList = mapProductCollection(\r\n products.filter(product => product.ProductDetails && product.ProductDetails.Name),\r\n 'Free',\r\n '',\r\n '',\r\n '',\r\n context,\r\n (data.category && data.category.result) || undefined\r\n );\r\n\r\n if (eventList && eventList.length !== 0) {\r\n return (\r\n \r\n );\r\n } else {\r\n console.log('Could not map product collection to product placement item succesfully');\r\n }\r\n }\r\n return this._renderNoEventsMessage();\r\n }\r\n\r\n // =============================================================================\r\n // JSX FRAGMENTS\r\n // =============================================================================\r\n\r\n // --------------------------------------------------------------\r\n // If no events are present, render this instead of the events\r\n // list\r\n // --------------------------------------------------------------\r\n private _renderNoEventsMessage(): JSX.Element {\r\n const { noEventsText } = this.props.config;\r\n\r\n const textToShow = noEventsText || 'No Events';\r\n\r\n return (\r\n // tslint:disable-next-line: react-no-dangerous-html\r\n \r\n );\r\n }\r\n\r\n // =============================================================================\r\n // PRIVATE METHODS\r\n // =============================================================================\r\n\r\n // --------------------------------------------------------------\r\n // Construct the event list data\r\n // --------------------------------------------------------------\r\n private _getEventListItems(): FullProduct[] {\r\n const { data } = this.props;\r\n let products: FullProduct[] = [];\r\n\r\n // TODO: May need to add refineSearch in future.\r\n // const refineSearchProducts = this.props.data.refineSearchProducts && this.props.data.refineSearchProducts.result;\r\n // if (refineSearchProducts && refineSearchProducts.refinementCriteria && refineSearchProducts.refinementCriteria.length) {\r\n // if (refineSearchProducts.productSearchResult && refineSearchProducts.productSearchResult.length) {\r\n // products = refineSearchProducts.productSearchResult;\r\n // }\r\n // }\r\n\r\n if (data.products && data.products.result && data.products.result.length > 0) {\r\n products = data.products.result;\r\n }\r\n\r\n return products;\r\n }\r\n}\r\n\r\nexport default EventList;","var map = {\n\t\"./af\": 651,\n\t\"./af.js\": 651,\n\t\"./ar\": 652,\n\t\"./ar-dz\": 653,\n\t\"./ar-dz.js\": 653,\n\t\"./ar-kw\": 654,\n\t\"./ar-kw.js\": 654,\n\t\"./ar-ly\": 655,\n\t\"./ar-ly.js\": 655,\n\t\"./ar-ma\": 656,\n\t\"./ar-ma.js\": 656,\n\t\"./ar-ps\": 657,\n\t\"./ar-ps.js\": 657,\n\t\"./ar-sa\": 658,\n\t\"./ar-sa.js\": 658,\n\t\"./ar-tn\": 659,\n\t\"./ar-tn.js\": 659,\n\t\"./ar.js\": 652,\n\t\"./az\": 660,\n\t\"./az.js\": 660,\n\t\"./be\": 661,\n\t\"./be.js\": 661,\n\t\"./bg\": 662,\n\t\"./bg.js\": 662,\n\t\"./bm\": 663,\n\t\"./bm.js\": 663,\n\t\"./bn\": 664,\n\t\"./bn-bd\": 665,\n\t\"./bn-bd.js\": 665,\n\t\"./bn.js\": 664,\n\t\"./bo\": 666,\n\t\"./bo.js\": 666,\n\t\"./br\": 667,\n\t\"./br.js\": 667,\n\t\"./bs\": 668,\n\t\"./bs.js\": 668,\n\t\"./ca\": 669,\n\t\"./ca.js\": 669,\n\t\"./cs\": 670,\n\t\"./cs.js\": 670,\n\t\"./cv\": 671,\n\t\"./cv.js\": 671,\n\t\"./cy\": 672,\n\t\"./cy.js\": 672,\n\t\"./da\": 673,\n\t\"./da.js\": 673,\n\t\"./de\": 674,\n\t\"./de-at\": 675,\n\t\"./de-at.js\": 675,\n\t\"./de-ch\": 676,\n\t\"./de-ch.js\": 676,\n\t\"./de.js\": 674,\n\t\"./dv\": 677,\n\t\"./dv.js\": 677,\n\t\"./el\": 678,\n\t\"./el.js\": 678,\n\t\"./en-au\": 679,\n\t\"./en-au.js\": 679,\n\t\"./en-ca\": 680,\n\t\"./en-ca.js\": 680,\n\t\"./en-gb\": 681,\n\t\"./en-gb.js\": 681,\n\t\"./en-ie\": 682,\n\t\"./en-ie.js\": 682,\n\t\"./en-il\": 683,\n\t\"./en-il.js\": 683,\n\t\"./en-in\": 684,\n\t\"./en-in.js\": 684,\n\t\"./en-nz\": 685,\n\t\"./en-nz.js\": 685,\n\t\"./en-sg\": 686,\n\t\"./en-sg.js\": 686,\n\t\"./eo\": 687,\n\t\"./eo.js\": 687,\n\t\"./es\": 688,\n\t\"./es-do\": 689,\n\t\"./es-do.js\": 689,\n\t\"./es-mx\": 690,\n\t\"./es-mx.js\": 690,\n\t\"./es-us\": 691,\n\t\"./es-us.js\": 691,\n\t\"./es.js\": 688,\n\t\"./et\": 692,\n\t\"./et.js\": 692,\n\t\"./eu\": 693,\n\t\"./eu.js\": 693,\n\t\"./fa\": 694,\n\t\"./fa.js\": 694,\n\t\"./fi\": 695,\n\t\"./fi.js\": 695,\n\t\"./fil\": 696,\n\t\"./fil.js\": 696,\n\t\"./fo\": 697,\n\t\"./fo.js\": 697,\n\t\"./fr\": 698,\n\t\"./fr-ca\": 699,\n\t\"./fr-ca.js\": 699,\n\t\"./fr-ch\": 700,\n\t\"./fr-ch.js\": 700,\n\t\"./fr.js\": 698,\n\t\"./fy\": 701,\n\t\"./fy.js\": 701,\n\t\"./ga\": 702,\n\t\"./ga.js\": 702,\n\t\"./gd\": 703,\n\t\"./gd.js\": 703,\n\t\"./gl\": 704,\n\t\"./gl.js\": 704,\n\t\"./gom-deva\": 705,\n\t\"./gom-deva.js\": 705,\n\t\"./gom-latn\": 706,\n\t\"./gom-latn.js\": 706,\n\t\"./gu\": 707,\n\t\"./gu.js\": 707,\n\t\"./he\": 708,\n\t\"./he.js\": 708,\n\t\"./hi\": 709,\n\t\"./hi.js\": 709,\n\t\"./hr\": 710,\n\t\"./hr.js\": 710,\n\t\"./hu\": 711,\n\t\"./hu.js\": 711,\n\t\"./hy-am\": 712,\n\t\"./hy-am.js\": 712,\n\t\"./id\": 713,\n\t\"./id.js\": 713,\n\t\"./is\": 714,\n\t\"./is.js\": 714,\n\t\"./it\": 715,\n\t\"./it-ch\": 716,\n\t\"./it-ch.js\": 716,\n\t\"./it.js\": 715,\n\t\"./ja\": 717,\n\t\"./ja.js\": 717,\n\t\"./jv\": 718,\n\t\"./jv.js\": 718,\n\t\"./ka\": 719,\n\t\"./ka.js\": 719,\n\t\"./kk\": 720,\n\t\"./kk.js\": 720,\n\t\"./km\": 721,\n\t\"./km.js\": 721,\n\t\"./kn\": 722,\n\t\"./kn.js\": 722,\n\t\"./ko\": 723,\n\t\"./ko.js\": 723,\n\t\"./ku\": 724,\n\t\"./ku-kmr\": 725,\n\t\"./ku-kmr.js\": 725,\n\t\"./ku.js\": 724,\n\t\"./ky\": 726,\n\t\"./ky.js\": 726,\n\t\"./lb\": 727,\n\t\"./lb.js\": 727,\n\t\"./lo\": 728,\n\t\"./lo.js\": 728,\n\t\"./lt\": 729,\n\t\"./lt.js\": 729,\n\t\"./lv\": 730,\n\t\"./lv.js\": 730,\n\t\"./me\": 731,\n\t\"./me.js\": 731,\n\t\"./mi\": 732,\n\t\"./mi.js\": 732,\n\t\"./mk\": 733,\n\t\"./mk.js\": 733,\n\t\"./ml\": 734,\n\t\"./ml.js\": 734,\n\t\"./mn\": 735,\n\t\"./mn.js\": 735,\n\t\"./mr\": 736,\n\t\"./mr.js\": 736,\n\t\"./ms\": 737,\n\t\"./ms-my\": 738,\n\t\"./ms-my.js\": 738,\n\t\"./ms.js\": 737,\n\t\"./mt\": 739,\n\t\"./mt.js\": 739,\n\t\"./my\": 740,\n\t\"./my.js\": 740,\n\t\"./nb\": 741,\n\t\"./nb.js\": 741,\n\t\"./ne\": 742,\n\t\"./ne.js\": 742,\n\t\"./nl\": 743,\n\t\"./nl-be\": 744,\n\t\"./nl-be.js\": 744,\n\t\"./nl.js\": 743,\n\t\"./nn\": 745,\n\t\"./nn.js\": 745,\n\t\"./oc-lnc\": 746,\n\t\"./oc-lnc.js\": 746,\n\t\"./pa-in\": 747,\n\t\"./pa-in.js\": 747,\n\t\"./pl\": 748,\n\t\"./pl.js\": 748,\n\t\"./pt\": 749,\n\t\"./pt-br\": 750,\n\t\"./pt-br.js\": 750,\n\t\"./pt.js\": 749,\n\t\"./ro\": 751,\n\t\"./ro.js\": 751,\n\t\"./ru\": 752,\n\t\"./ru.js\": 752,\n\t\"./sd\": 753,\n\t\"./sd.js\": 753,\n\t\"./se\": 754,\n\t\"./se.js\": 754,\n\t\"./si\": 755,\n\t\"./si.js\": 755,\n\t\"./sk\": 756,\n\t\"./sk.js\": 756,\n\t\"./sl\": 757,\n\t\"./sl.js\": 757,\n\t\"./sq\": 758,\n\t\"./sq.js\": 758,\n\t\"./sr\": 759,\n\t\"./sr-cyrl\": 760,\n\t\"./sr-cyrl.js\": 760,\n\t\"./sr.js\": 759,\n\t\"./ss\": 761,\n\t\"./ss.js\": 761,\n\t\"./sv\": 762,\n\t\"./sv.js\": 762,\n\t\"./sw\": 763,\n\t\"./sw.js\": 763,\n\t\"./ta\": 764,\n\t\"./ta.js\": 764,\n\t\"./te\": 765,\n\t\"./te.js\": 765,\n\t\"./tet\": 766,\n\t\"./tet.js\": 766,\n\t\"./tg\": 767,\n\t\"./tg.js\": 767,\n\t\"./th\": 768,\n\t\"./th.js\": 768,\n\t\"./tk\": 769,\n\t\"./tk.js\": 769,\n\t\"./tl-ph\": 770,\n\t\"./tl-ph.js\": 770,\n\t\"./tlh\": 771,\n\t\"./tlh.js\": 771,\n\t\"./tr\": 772,\n\t\"./tr.js\": 772,\n\t\"./tzl\": 773,\n\t\"./tzl.js\": 773,\n\t\"./tzm\": 774,\n\t\"./tzm-latn\": 775,\n\t\"./tzm-latn.js\": 775,\n\t\"./tzm.js\": 774,\n\t\"./ug-cn\": 776,\n\t\"./ug-cn.js\": 776,\n\t\"./uk\": 777,\n\t\"./uk.js\": 777,\n\t\"./ur\": 778,\n\t\"./ur.js\": 778,\n\t\"./uz\": 779,\n\t\"./uz-latn\": 780,\n\t\"./uz-latn.js\": 780,\n\t\"./uz.js\": 779,\n\t\"./vi\": 781,\n\t\"./vi.js\": 781,\n\t\"./x-pseudo\": 782,\n\t\"./x-pseudo.js\": 782,\n\t\"./yo\": 783,\n\t\"./yo.js\": 783,\n\t\"./zh-cn\": 784,\n\t\"./zh-cn.js\": 784,\n\t\"./zh-hk\": 785,\n\t\"./zh-hk.js\": 785,\n\t\"./zh-mo\": 786,\n\t\"./zh-mo.js\": 786,\n\t\"./zh-tw\": 787,\n\t\"./zh-tw.js\": 787\n};\n\n\nfunction webpackContext(req) {\n\tvar id = webpackContextResolve(req);\n\treturn __webpack_require__(id);\n}\nfunction webpackContextResolve(req) {\n\tif(!__webpack_require__.o(map, req)) {\n\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\te.code = 'MODULE_NOT_FOUND';\n\t\tthrow e;\n\t}\n\treturn map[req];\n}\nwebpackContext.keys = function webpackContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackContext.resolve = webpackContextResolve;\nmodule.exports = webpackContext;\nwebpackContext.id = 1105;"],"names":["mapProductCollection","products","freePriceText","ratingAriaLabel","originalPriceText","currentPriceText","context","category","length","productItems","map","product","ProductDetails","productUrl","getProductUrlSync","actionContext","item","heading","Name","description","Description","price","mapProductPrice","ProductPrice","request","rating","mapProductRating","ProductRating","image","PrimaryImageUrl","recordId","RecordId","attributes","ProductAttributes","push","productPrice","requestContext","locale","currencyCode","CurrencyCode","currentPrice","_mapNumberToIPriceRange","CustomerContextualPrice","originalPrice","Math","max","BasePrice","TradeAgreementPrice","AdjustedPrice","productRating","ariaLabel","averageRating","AverageRating","totalRatings","TotalRatings","undefined","startingValue","eventSortKey","event","startDate","format","time","name","oldSortKey","RenderEventList","React","render","this","_renderEventList","maxToDisplay","props","maximum","eventList","_formatList","events","_sortAndTrimList","noFutureEventsJSX","className","key","id","_renderEvent","href","pdp","src","productImage","alt","_renderDateRange","endDate","dangerouslySetInnerHTML","getRichTextHtml","intro","location","priceText","soldOut","soldOutText","isRange","_renderDate","date","_renderMonth","_renderDay","_renderYear","list","fieldSources","default","entry","_getAttributes","debugMode","console","log","moment","timezone","dates","_dateLogic","Introduction","Body","start","end","purchaseUrl","eventUrlTitle","downloadPDFUrl","reduce","output","attribute","attributeSource","isSame","today","Date","now","startOf","filter","_isEventPast","sort","event1","event2","a","b","splice","isBefore","EventList","config","data","returnedView","renderView","_getEventListItems","result","_renderNoEventsMessage","resources","events__soldOut","query","debug","app","siteTimezone","noEventsText","textToShow","__decorate","observer","i","isMonthSame","month","webpackContext","req","webpackContextResolve","__webpack_require__","o","e","Error","code","keys","Object","resolve","module","exports"],"sourceRoot":""}