{"version":3,"file":"static/js/6.6fc9b9635539e9cd2c9d.chunk.js","mappings":"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","sources":["webpack://@msdyn365-commerce-partners/fabrikam/./src/modules/notification-components/base/base-notification-component.tsx?47ca","webpack://@msdyn365-commerce-partners/fabrikam/./src/modules/notification-components/base/closable-notification-component.tsx?aac5","webpack://@msdyn365-commerce-partners/fabrikam/./src/modules/notification-components/base/dismissible-notification-component.tsx?5826","webpack://@msdyn365-commerce-partners/fabrikam/./src/modules/notification-components/base/notification-close-button-component.tsx?a90a","webpack://@msdyn365-commerce-partners/fabrikam/./src/modules/notification-components/base/notification-content-component.tsx?6476","webpack://@msdyn365-commerce-partners/fabrikam/./src/modules/notification-components/base/notification-description-component.tsx?fb91","webpack://@msdyn365-commerce-partners/fabrikam/./src/modules/notification-components/base/notification-footer-component.tsx?e051","webpack://@msdyn365-commerce-partners/fabrikam/./src/modules/notification-components/base/notification-header-component.tsx?6866","webpack://@msdyn365-commerce-partners/fabrikam/./src/modules/notification-components/base/notification-instance-component.tsx?e395","webpack://@msdyn365-commerce-partners/fabrikam/./src/modules/notification-components/base/notification-title-component.tsx?c4e8","webpack://@msdyn365-commerce-partners/fabrikam/./src/modules/notification-components/notification-components-lists-manager.ts?8bd2","webpack://@msdyn365-commerce-partners/fabrikam/./src/modules/notification-components/system-notifications/error-notification-component.tsx?96e4","webpack://@msdyn365-commerce-partners/fabrikam/./src/modules/notification-components/system-notifications/loading-notification-component.tsx?bf13","webpack://@msdyn365-commerce-partners/fabrikam/./src/modules/notification-components/system-notifications/success-notification-component.tsx?dfb0","webpack://@msdyn365-commerce-partners/fabrikam/./src/modules/notification-components/system-notifications/system-notification-component.tsx?60e2","webpack://@msdyn365-commerce-partners/fabrikam/./src/modules/notification-components/system-notifications/warning-notification-component.tsx?8b88","webpack://@msdyn365-commerce-partners/fabrikam/./src/modules/notifications-data-instances/base/base-notification.ts?d830","webpack://@msdyn365-commerce-partners/fabrikam/./src/modules/notifications-data-instances/base/dismissible-notification.ts?f9b7","webpack://@msdyn365-commerce-partners/fabrikam/./src/modules/notifications-data-instances/base/events/notification-events.ts?8fd5","webpack://@msdyn365-commerce-partners/fabrikam/./src/modules/notifications-data-instances/base/with-notification-component-decorator.ts?485e","webpack://@msdyn365-commerce-partners/fabrikam/./src/modules/notifications-data-instances/system-notifications/system-notification.ts?bd82","webpack://@msdyn365-commerce-partners/fabrikam/./src/modules/notifications-data-instances/system-notifications/error-notification.ts?5a19","webpack://@msdyn365-commerce-partners/fabrikam/./src/modules/notifications-data-instances/system-notifications/loading-notification.ts?4441","webpack://@msdyn365-commerce-partners/fabrikam/./src/modules/notifications-data-instances/system-notifications/success-notification.ts?d3e3","webpack://@msdyn365-commerce-partners/fabrikam/./src/modules/notifications-data-instances/system-notifications/warning-notification.ts?d9bf","webpack://@msdyn365-commerce-partners/fabrikam/./src/modules/notifications-manager/notification-feeds.ts?12a2","webpack://@msdyn365-commerce-partners/fabrikam/./src/modules/notifications-manager/notifications-manager.ts?3350","webpack://@msdyn365-commerce-partners/fabrikam/./src/modules/notifications-list/notifications-list.tsx?8377","webpack://@msdyn365-commerce-partners/fabrikam/./src/modules/notifications-list/notifications-list.view.tsx?d466","webpack://@msdyn365-commerce-partners/fabrikam/./src/modules/default-page-summary/default-page-summary.tsx?0c78","webpack://@msdyn365-commerce-partners/fabrikam/./src/modules/product-page-summary/product-page-summary.tsx?2924","webpack://@msdyn365-commerce-partners/fabrikam/./src/modules/spacer/spacer.tsx?7565","webpack://@msdyn365-commerce-partners/fabrikam/./src/modules/spacer/spacer.view.tsx?1f15","webpack://@msdyn365-commerce-partners/fabrikam/./src/modules/starter/starter.tsx?aade","webpack://@msdyn365-commerce-partners/fabrikam/./src/modules/text-block/text-block.tsx?db84","webpack://@msdyn365-commerce-partners/fabrikam/./src/modules/text-block/text-block.view.tsx?9307"],"sourcesContent":["/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport React from 'react';\n\nimport { BaseNotification } from '../../notifications-data-instances';\n\n/**\n * Default props for a component responsible for rendering the given notification.\n * @remark Modify carefully as it's initialized by the notifications manager to provide dynamic rendering.\n */\nexport interface INotificationProps {\n notification: NotificationType;\n}\n\n/**\n * Default props for a component responsible for rendering some part of notification, but not the whole notification (e.g. @see NotificationTitle).\n */\nexport interface INotificationElementProps extends INotificationProps {\n}\n\n/**\n * Represents a base class which renders a notification or a part of notification.\n */\nexport abstract class BaseNotificationComponent<\n NotificationType extends BaseNotification,\n PropsType extends INotificationProps = INotificationProps,\n StateType = {}> extends React.PureComponent {\n\n public constructor(props: PropsType) {\n super(props);\n }\n\n public abstract render(): React.ReactNode;\n}\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { Random } from '@msdyn365-commerce-modules/retail-actions';\nimport classnames from 'classnames';\nimport React, { ReactNode } from 'react';\n\nimport { BaseNotification, IClosableNotification } from '../../notifications-data-instances';\nimport { NotificationEvents } from '../../notifications-data-instances/base/events';\nimport { BaseNotificationComponent, INotificationElementProps } from './base-notification-component';\n\n/**\n * Represents state for closable wrapper.\n */\nexport interface IClosableNotificationWrapperState {\n isClosed: boolean;\n}\n\n/**\n * Wraps children into closable wrapper which hides the children (notification body) when the notification is closed.\n */\nexport class ClosableNotificationWrapper\n extends BaseNotificationComponent, IClosableNotificationWrapperState> {\n /**\n * The class for the styles.\n */\n public static readonly className: string = 'msc-closable-notification';\n\n /**\n * Unique id of the component.\n */\n private readonly _instanceId: string;\n\n public constructor(props: INotificationElementProps) {\n super(props);\n\n this._instanceId = `ClosableNotificationWrapper-${Random.Guid.generateGuid()}`;\n\n this.state = {\n isClosed: false\n };\n\n this._close = this._close.bind(this);\n this._unsubscribeFromEvents = this._unsubscribeFromEvents.bind(this);\n }\n\n public componentDidMount(): void {\n this._subscribeToEvents(this.props.notification);\n }\n\n public componentDidUpdate(previousProps: INotificationElementProps): void {\n this._unsubscribeFromEvents(previousProps.notification);\n this._subscribeToEvents(this.props.notification);\n }\n\n public componentWillUnmount(): void {\n this._unsubscribeFromEvents(this.props.notification);\n }\n\n public render(): ReactNode {\n let className = ClosableNotificationWrapper.className;\n if (this.state.isClosed) {\n className = classnames(className, `${ClosableNotificationWrapper.className}__closed`);\n }\n\n return (\n
\n {this.props.children}\n
\n );\n }\n\n private _subscribeToEvents(notification: NotificationType): void {\n notification.events.getValue(NotificationEvents.Close)!.subscribe({\n instanceId: this._instanceId,\n handler: this._close\n });\n notification.events.getValue(NotificationEvents.RemovedFromList)!.subscribe({\n instanceId: this._instanceId,\n handler: () => {\n this._unsubscribeFromEvents(notification);\n }\n });\n }\n\n private _unsubscribeFromEvents(notification: NotificationType): void {\n notification.unsubscribeFromEvents(this._instanceId);\n }\n\n private _close(): void {\n this._unsubscribeFromEvents(this.props.notification);\n\n this.setState({ isClosed: this.props.notification.isClosed });\n\n // Wait for the animation before removing completely.\n setTimeout(() => {\n this.props.notification.remove();\n }, 100);\n }\n}\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { ObjectExtensions, Random } from '@msdyn365-commerce-modules/retail-actions';\nimport classnames from 'classnames';\nimport React, { ReactNode } from 'react';\n\nimport { DismissibleNotification, NotificationEvents } from '../../notifications-data-instances';\nimport { BaseNotificationComponent, INotificationElementProps } from './base-notification-component';\n\nexport interface IDismissibleNotificationWrapperState {\n isDismissing: boolean;\n isDismissed: boolean;\n}\n\n/**\n * Wrapper over notification body which allows dismissing of the notification.\n * It setups timeouts and hides the notification body when the notification should be dismissed.\n */\nexport class DismissibleNotificationWrapper\n extends BaseNotificationComponent, IDismissibleNotificationWrapperState> {\n\n /**\n * The class for the styles.\n */\n public static readonly className: string = 'msc-dismissible-notification';\n\n /**\n * Waiting for dismissing timer.\n */\n private _timer?: NodeJS.Timeout;\n\n /**\n * Unique id of the component.\n */\n private readonly _instanceId: string;\n\n public constructor(props: INotificationElementProps) {\n super(props);\n\n this.state = {\n isDismissing: false,\n isDismissed: false\n };\n\n this._instanceId = `DismissibleNotificationWrapper-${Random.Guid.generateGuid()}`;\n\n this._setTimer = this._setTimer.bind(this);\n this._clearTimer = this._clearTimer.bind(this);\n this._startDismissing = this._startDismissing.bind(this);\n this._preventDismissing = this._preventDismissing.bind(this);\n this._preventDismissingHandler = this._preventDismissingHandler.bind(this);\n this._finishDismissing = this._finishDismissing.bind(this);\n this._updateState = this._updateState.bind(this);\n this._unsubscribeFromEvents = this._unsubscribeFromEvents.bind(this);\n }\n\n public componentDidMount(): void {\n if (this.props.notification.autoDismissTimeout !== null) {\n this._setTimer();\n }\n this._subscribeToEvents(this.props.notification);\n }\n\n public componentDidUpdate(previousProps: INotificationElementProps): void {\n this._unsubscribeFromEvents(previousProps.notification);\n this._subscribeToEvents(this.props.notification);\n }\n\n public componentWillUnmount(): void {\n this._unsubscribeFromEvents(this.props.notification);\n }\n\n public render(): ReactNode {\n let className = DismissibleNotificationWrapper.className;\n if (this.state.isDismissing) {\n className = classnames(className, `${DismissibleNotificationWrapper.className}__dismissing`);\n }\n if (this.state.isDismissed) {\n className = classnames(className, `${DismissibleNotificationWrapper.className}__dismissed`);\n }\n\n const onMouseEnter = this.props.notification.shouldResetOnHover ? this._preventDismissing : undefined;\n const onMouseLeave = this.props.notification.shouldResetOnHover ? this._setTimer : undefined;\n\n return (\n \n {this.props.children}\n \n );\n }\n\n private _subscribeToEvents(notification: NotificationType): void {\n notification.events.getValue(NotificationEvents.StartDismissing)!.subscribe({\n instanceId: this._instanceId,\n handler: this._updateState\n });\n notification.events.getValue(NotificationEvents.PreventDismissing)!.subscribe({\n instanceId: this._instanceId,\n handler: this._preventDismissingHandler\n });\n notification.events.getValue(NotificationEvents.FinishDismissing)!.subscribe({\n instanceId: this._instanceId,\n handler: () => this._updateState\n });\n notification.events.getValue(NotificationEvents.RemovedFromList)!.subscribe({\n instanceId: this._instanceId,\n handler: () => {\n this._unsubscribeFromEvents(notification);\n }\n });\n }\n\n private _unsubscribeFromEvents(notification: NotificationType): void {\n notification.unsubscribeFromEvents(this._instanceId);\n }\n\n private _setTimer(): void {\n this._timer = setTimeout(() => {\n this._startDismissing();\n }, this.props.notification.autoDismissTimeout!);\n }\n\n private _clearTimer(): void {\n if (!ObjectExtensions.isNullOrUndefined(this._timer)) {\n clearTimeout(this._timer);\n }\n }\n\n private _startDismissing(): void {\n this.props.notification.startDismissing();\n }\n\n private _preventDismissingHandler(): void {\n this._clearTimer();\n this._updateState();\n }\n\n private _preventDismissing(): void {\n this.props.notification.preventDismissing();\n }\n\n private _finishDismissing(): void {\n this.props.notification.finishDismissing();\n this._updateState();\n }\n\n private _updateState(): void {\n this.setState({ isDismissing: this.props.notification.isDismissing, isDismissed: this.props.notification.isDismissed });\n }\n}\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport * as React from 'react';\n\nimport { BaseNotification, IClosableNotification } from '../../notifications-data-instances';\nimport { BaseNotificationComponent, INotificationElementProps } from './base-notification-component';\n\nexport interface INotificationCloseButtonState {\n isClosed: boolean;\n}\n\nexport interface INotificationCloseButtonProps extends INotificationElementProps { }\n\n/**\n * Represents a close button for the notification which triggers notification.close().\n */\nexport class NotificationCloseButton\n extends BaseNotificationComponent, INotificationCloseButtonState> {\n /**\n * The class for the styles.\n */\n public static readonly className: string = 'msc-notification-close';\n\n public constructor(props: INotificationCloseButtonProps) {\n // Disable jest test coverage due to the issue in jest processing super calls.\n /* istanbul ignore next */\n super(props);\n this.state = {\n isClosed: false\n };\n }\n\n public render(): React.ReactNode {\n return (\n \n );\n }\n\n /**\n * Sends a message to close the notification.\n */\n private readonly _close: () => void = () => {\n this.props.notification.close();\n };\n}\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport * as React from 'react';\n\nimport { BaseNotification } from '../../notifications-data-instances';\nimport { BaseNotificationComponent, INotificationElementProps } from './base-notification-component';\n\n/**\n * Represents the component which composes the body of a notification.\n */\nexport class NotificationContent extends BaseNotificationComponent> {\n /**\n * The class for the styles.\n */\n public static readonly className: string = 'msc-notification-content';\n\n public constructor(props: INotificationElementProps) {\n // Disable jest test coverage due to the issue in jest processing super calls.\n /* istanbul ignore next */\n super(props);\n }\n\n public render(): React.ReactNode {\n return (\n
\n {this.props.children}\n
\n );\n }\n}\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { RichTextComponent } from '@msdyn365-commerce/core';\nimport { ArrayExtensions, StringExtensions } from '@msdyn365-commerce-modules/retail-actions';\nimport * as React from 'react';\n\nimport { BaseNotification, IDescriptiveNotification } from '../../notifications-data-instances';\nimport { BaseNotificationComponent, INotificationElementProps } from './base-notification-component';\n\n/**\n * Displays notification description lines.\n */\nexport class NotificationDescription extends BaseNotificationComponent> {\n /**\n * The class for the styles.\n */\n public static readonly className: string = 'msc-notification-description';\n\n public constructor(props: INotificationElementProps) {\n // Disable jest test coverage due to the issue in jest processing super calls.\n /* istanbul ignore next */\n super(props);\n }\n\n public render(): React.ReactNode {\n if (!ArrayExtensions.hasElements(this.props.notification.descriptionLines)) {\n return null;\n }\n\n return (\n
\n {\n this.props.notification.descriptionLines.map((line, index) => {\n if (StringExtensions.isNullOrWhitespace(line.toString())) {\n return null;\n }\n return (\n \n );\n })\n }\n {this.props.children}\n
\n );\n }\n}\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport * as React from 'react';\n\nimport { BaseNotification } from '../../notifications-data-instances';\nimport { BaseNotificationComponent, INotificationElementProps } from './base-notification-component';\n\n/**\n * Displays footer of the notification.\n * Usually footer is used for extra actions.\n */\nexport class NotificationFooter extends BaseNotificationComponent> {\n /**\n * The class for the styles.\n */\n public static readonly className: string = 'msc-notification-footer';\n\n public constructor(props: INotificationElementProps) {\n // Disable jest test coverage due to the issue in jest processing super calls.\n /* istanbul ignore next */\n super(props);\n }\n\n public render(): React.ReactNode {\n return (\n
\n {this.props.children}\n
\n );\n }\n}\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport React, { ReactNode } from 'react';\n\nimport { BaseNotification } from '../../notifications-data-instances';\nimport { BaseNotificationComponent, INotificationElementProps } from './base-notification-component';\n\n/**\n * Displays header of the notification.\n * Usually header is used for displaying the title and close X button.\n */\nexport class NotificationHeader extends BaseNotificationComponent> {\n /**\n * The class for the styles.\n */\n public static readonly className: string = 'msc-notification-header';\n\n public constructor(props: INotificationElementProps) {\n // Disable jest test coverage due to the issue in jest processing super calls.\n /* istanbul ignore next */\n super(props);\n }\n\n public render(): ReactNode {\n return (\n
\n {this.props.children}\n
\n );\n }\n}\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport React, { ReactNode } from 'react';\n\nimport { BaseNotification } from '../../notifications-data-instances';\nimport { BaseNotificationComponent, INotificationElementProps } from './base-notification-component';\n\n/**\n * Represents the notification body which is displayed to the user.\n * It should include header, content, footer.\n */\nexport class NotificationInstance extends BaseNotificationComponent> {\n /**\n * The class for the styles.\n */\n public static readonly className: string = 'msc-notification-instance';\n\n public constructor(props: INotificationElementProps) {\n // Disable jest test coverage due to the issue in jest processing super calls.\n /* istanbul ignore next */\n super(props);\n }\n\n public render(): ReactNode {\n return (\n
\n {this.props.children}\n
\n );\n }\n}\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { RichTextComponent } from '@msdyn365-commerce/core';\nimport * as React from 'react';\n\nimport { BaseNotification, ITitledNotification } from '../../notifications-data-instances';\nimport { BaseNotificationComponent, INotificationElementProps } from './base-notification-component';\n\n/**\n * Props for the notification title component.\n */\nexport interface INotificationTitleProps extends INotificationElementProps {\n\n /**\n * Represents a node which should be displayed before the title. Optional field.\n */\n preChildren?: React.ReactNode;\n\n /**\n * Represents a node which should be displayed after the title. Optional field.\n */\n postChildren?: React.ReactNode;\n}\n\n/**\n * Renders notification title.\n */\nexport class NotificationTitle extends BaseNotificationComponent> {\n /**\n * The class for the styles.\n */\n public static readonly className: string = 'msc-notification-title';\n\n public constructor(props: INotificationTitleProps) {\n // Disable jest test coverage due to the issue in jest processing super calls.\n /* istanbul ignore next */\n super(props);\n }\n\n public render(): React.ReactNode {\n return (\n
\n {this.props.preChildren}\n \n {this.props.postChildren}\n
\n );\n }\n}\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { Dictionary } from '@msdyn365-commerce-modules/retail-actions';\n\nimport { NotificationFeeds, NotificationFeedType } from '../notifications-manager/notification-feeds';\nimport { INotificationComponentsList } from './base-notification-component-list';\n\n/**\n * A notification list which is operated by notification manager.\n * It is responsible for rendering the received notifications.\n */\nexport class NotificationComponentsListsManager {\n /**\n * Instances of the lists currently shown on the page.\n * Dictionary of lists by the feed.\n */\n private static readonly _instances: Dictionary = new Dictionary();\n\n /**\n * Retrieve the lists which are displayed currently on the page for the given feed.\n * @param {NotificationFeeds} [feed] The feed to filter the lists. Global feed by default.\n */\n public static getNotificationLists(feed: NotificationFeeds): INotificationComponentsList[] {\n return NotificationComponentsListsManager._instances.getValueWithDefaultValue(feed, []);\n }\n\n /**\n * Registers notification components list to listen to notification manager.\n * @param {INotificationComponentsList} notificationComponentsList The component which renders the notifications.\n */\n public static subscribe(notificationComponentsList: INotificationComponentsList): void {\n NotificationComponentsListsManager._instances.getValueWithDefaultValue(notificationComponentsList.feed, []).push(notificationComponentsList);\n }\n\n /**\n * Removes the notification components list from the instances which listen to notification manager.\n * @param {INotificationComponentsList} notificationComponentsList The component which renders the notifications.\n */\n public static unsubscribe(notificationComponentsList: INotificationComponentsList): void {\n const instances = NotificationComponentsListsManager._instances.getValueWithDefaultValue(notificationComponentsList.feed, []);\n const newInstances = instances.filter(list => list !== notificationComponentsList);\n NotificationComponentsListsManager._instances.setValue(notificationComponentsList.feed, newInstances);\n }\n}\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport React from 'react';\n\nimport { ErrorNotification } from '../../notifications-data-instances/system-notifications';\nimport { INotificationCloseButtonProps } from '../base';\nimport { BaseNotificationComponent, INotificationProps } from '../base/base-notification-component';\nimport { SystemNotificationComponent } from './system-notification-component';\n\n/**\n * Props for error notification.\n */\nexport interface IErrorNotificationProps extends INotificationProps, INotificationCloseButtonProps {}\n\n/**\n * Component responsible for rendering an error notification.\n */\nexport class ErrorNotificationComponent extends BaseNotificationComponent {\n /**\n * The class for the styles.\n */\n public static readonly className: string = 'msc-notification-error';\n\n /**\n * Initializes the component with the given configuration.\n * @param {IErrorNotificationProps} props Configuration of the component.\n */\n public constructor(props: IErrorNotificationProps) {\n // Disable jest test coverage due to the issue in jest processing super calls.\n /* istanbul ignore next */\n super(props);\n }\n\n /**\n * Renders the given error notification.\n */\n public render(): React.ReactNode {\n return (\n \n );\n }\n}\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { ArrayExtensions } from '@msdyn365-commerce-modules/retail-actions';\nimport { Spinner } from 'office-ui-fabric-react';\nimport React from 'react';\n\nimport { LoadingNotification } from '../../notifications-data-instances/system-notifications';\nimport { DismissibleNotificationWrapper, NotificationContent, NotificationDescription, NotificationHeader, NotificationInstance, NotificationTitle } from '../base';\nimport { BaseNotificationComponent, INotificationProps } from '../base/base-notification-component';\n\n/**\n * Props for loading notification.\n */\nexport interface ILoadingNotificationProps extends INotificationProps {}\n\n/**\n * Component responsible for rendering a loading notification.\n */\nexport class LoadingNotificationComponent extends BaseNotificationComponent {\n /**\n * The class for the styles.\n */\n public static readonly className: string = 'msc-notification-loading';\n\n /**\n * Initializes the component with the given configuration.\n * @param {ILoadingNotificationProps} props Configuration of the component.\n */\n public constructor(props: ILoadingNotificationProps) {\n super(props);\n }\n\n /**\n * Renders the given notification.\n */\n public render(): React.ReactNode {\n return (\n
\n \n \n \n \n \n {\n ArrayExtensions.hasElements(this.props.notification.descriptionLines) ? (\n \n \n \n ) : null\n }\n \n \n
\n );\n }\n\n /**\n * Renders a loading spinner.\n * @returns Spinner.\n */\n private readonly _renderSpinner = () => {\n return (\n \n );\n };\n}\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport React from 'react';\n\nimport { SuccessNotification } from '../../notifications-data-instances/system-notifications';\nimport { INotificationCloseButtonProps } from '../base';\nimport { BaseNotificationComponent, INotificationProps } from '../base/base-notification-component';\nimport { SystemNotificationComponent } from './system-notification-component';\n\n/**\n * Props for success notification.\n */\nexport interface ISuccessNotificationProps extends INotificationProps, INotificationCloseButtonProps {}\n\n/**\n * Component responsible for rendering a success notification.\n */\nexport class SuccessNotificationComponent extends BaseNotificationComponent {\n /**\n * The class for the styles.\n */\n public static readonly className: string = 'msc-notification-success';\n\n /**\n * Initializes the component with the given configuration.\n * @param {ISuccessNotificationProps} props Configuration of the component.\n */\n public constructor(props: ISuccessNotificationProps) {\n // Disable jest test coverage due to the issue in jest processing super calls.\n /* istanbul ignore next */\n super(props);\n }\n\n /**\n * Renders the given success notification.\n */\n public render(): React.ReactNode {\n return (\n \n );\n }\n}\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { ArrayExtensions } from '@msdyn365-commerce-modules/retail-actions';\nimport React from 'react';\n\nimport { SystemNotification } from '../../notifications-data-instances/system-notifications';\nimport { ClosableNotificationWrapper, DismissibleNotificationWrapper, INotificationCloseButtonProps, NotificationCloseButton, NotificationContent, NotificationDescription, NotificationHeader, NotificationInstance, NotificationTitle } from '../base';\nimport { BaseNotificationComponent, INotificationElementProps } from '../base/base-notification-component';\n\n/**\n * Props for system notification.\n */\nexport interface ISystemNotificationProps extends INotificationElementProps, INotificationCloseButtonProps {\n\n /**\n * The class for the styles.\n */\n className: string;\n}\n\n/**\n * Component responsible for rendering a system notification.\n */\nexport class SystemNotificationComponent extends BaseNotificationComponent {\n\n /**\n * Initializes the component with the given configuration.\n * @param {ISuccessNotificationProps} props Configuration of the component.\n */\n public constructor(props: ISystemNotificationProps) {\n super(props);\n }\n\n /**\n * Renders the given success notification.\n */\n public render(): React.ReactNode {\n return (\n
\n \n \n \n \n \n \n \n {\n ArrayExtensions.hasElements(this.props.notification.descriptionLines) ? (\n \n \n \n ) : null\n }\n \n \n \n
\n );\n }\n}\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport React from 'react';\n\nimport { WarningNotification } from '../../notifications-data-instances/system-notifications/warning-notification';\nimport { INotificationCloseButtonProps } from '../base';\nimport { BaseNotificationComponent, INotificationProps } from '../base/base-notification-component';\nimport { SystemNotificationComponent } from './system-notification-component';\n\n/**\n * Component responsible for rendering a warning notification.\n */\nexport interface IWarningNotificationProps extends INotificationProps, INotificationCloseButtonProps {}\n\n/**\n * Component responsible for rendering a success notification.\n */\nexport class WarningNotificationComponent extends BaseNotificationComponent {\n /**\n * The class for the styles.\n */\n public static readonly className: string = 'msc-notification-warning';\n\n /**\n * Initializes the component with the given configuration.\n * @param {ISuccessNotificationProps} props Configuration of the component.\n */\n public constructor(props: IWarningNotificationProps) {\n // Disable jest test coverage due to the issue in jest processing super calls.\n /* istanbul ignore next */\n super(props);\n }\n\n /**\n * Renders the given success notification.\n */\n public render(): React.ReactNode {\n return (\n \n );\n }\n}\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { Dictionary, Event, Random } from '@msdyn365-commerce-modules/retail-actions';\n\nimport { INotificationProps } from '../../notification-components/base/base-notification-component';\nimport { NotificationEvents } from './events';\n\n/**\n * Represents a react component class which renders a notification.\n */\nexport type NotificationComponentClass = React.ComponentClass, {}>;\n\n/**\n * Represents base functionality of a notification.\n */\nexport abstract class BaseNotification {\n /**\n * Notification events for the current notification.\n */\n public readonly events: Dictionary;\n\n /**\n * The local date set when the instance was created.\n */\n public readonly receivedDate: Date;\n\n /**\n * Unique identifier of the notification.\n * Represents a GUID that is automatically generated during the object initialization.\n */\n public readonly id: string;\n\n /**\n * The react class which is responsible for rendering the current instance of notification.\n * Should be set using @withNotificationComponent decorator.\n */\n public readonly notificationComponentConstructor!: NotificationComponentClass;\n\n /**\n * Specifies if the notification instance was removed from a notification list.\n */\n public get isRemoved(): boolean {\n return this._isRemoved;\n }\n\n /**\n * Specifies if the notification instance was removed from a notification list.\n */\n protected _isRemoved: boolean;\n\n /**\n * Initializes a notification with base information such as id, events, date when initialized.\n */\n public constructor() {\n this.receivedDate = new Date();\n this._isRemoved = false;\n this.events = new Dictionary({ key: NotificationEvents.RemovedFromList, value: new Event() });\n this.id = `Notification-${Random.Guid.generateGuid()}`;\n }\n\n /**\n * Updates the notification instance when it's removed from a notification list.\n * Should be called from a notification component once the notification can be disposed.\n */\n public remove(): void {\n this._isRemoved = true;\n this.events.getValue(NotificationEvents.RemovedFromList)?.trigger();\n this._dispose();\n }\n\n /**\n * Unsubscribes given instance from all the events for the notification.\n * @param {string} instanceId Unique id which represents the event handler.\n * @remarks Does nothing in case the instance was not subscribed to any event.\n */\n public unsubscribeFromEvents(instanceId: string): void {\n this.events.getValues().forEach(event => {\n event.unsubscribe(instanceId);\n });\n }\n\n /**\n * Disposes the events by unsubscribing all members.\n */\n protected _dispose(): void {\n this.events.getValues().forEach(event => {\n event.unsubscribeAll();\n });\n this.events.clear();\n }\n}\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { Event } from '@msdyn365-commerce-modules/retail-actions';\n\nimport { BaseNotification } from './base-notification';\nimport { NotificationEvents } from './events';\n\n/**\n * Specifies the timeouts in milliseconds used for the dismissing.\n */\nexport enum DismissTimeout {\n\n /**\n * Default timeout which should be used for most of the notification.\n */\n Default = 10_000\n}\n\n/**\n * Represents a notification which can be automatically dismissed.\n * @remark Dismissing means automatically hiding the notification after some specific delay.\n */\nexport abstract class DismissibleNotification extends BaseNotification {\n /**\n * Shows that the notification is in progress of dismissing when dismissing animation is in progress.\n * @remark The process can be prevented by hovering on a notification.\n */\n public get isDismissing(): boolean {\n return this._isDismissing;\n }\n\n /**\n * Shows that the notification is fully dismissed and is hidden to user now.\n * The notification can be removed from the list and disposed.\n */\n public get isDismissed(): boolean {\n return this._isDismissed;\n }\n\n /**\n * Specifies the delay in milliseconds for the notification.\n * @remarks Using `DismissTimeout` is preferable.\n */\n public readonly autoDismissTimeout: DismissTimeout | number | null;\n\n /**\n * Specifies if the dismissing should be delayed (the timer should be reset) when user hovers on the notification.\n * True by default. Use false when notification should be dismissed regardless if user wants to interact with it or not (e.g. For limited time offers).\n */\n public readonly shouldResetOnHover: boolean;\n\n /**\n * Shows that the notification is in progress of dismissing when dismissing animation is in progress.\n * @remark The process can be prevented by hovering on a notification.\n */\n protected _isDismissing: boolean;\n\n /**\n * Shows that the notification is fully dismissed and is hidden to user now.\n * The notification can be removed from the list and disposed.\n */\n protected _isDismissed: boolean;\n\n /**\n * Initializes events and sets the delays for the dismissing.\n * @param {DismissTimeout | number} autoDismissTimeout The delay in milliseconds after which the notification should start play the hiding animation.\n * By default refers to `DismissTimeout.Default`.\n * Prefer using `DismissTimeout` than specifying the number.\n * @param {boolean} shouldResetOnHover Flag which specifies if the dismissing should be delayed (the timer should be reset) when user hovers on the notification.\n * True by default. Use false when notification should be dismissed regardless if user wants to interact with it or not (e.g. for limited time offers).\n */\n public constructor(autoDismissTimeout: DismissTimeout | number | null = DismissTimeout.Default, shouldResetOnHover: boolean = true) {\n if (autoDismissTimeout === null && shouldResetOnHover) {\n throw new Error('Invalid parameters passed for dismissible notification. shouldResetOnHover = true is incompatible with autoDismissTimeout = null.');\n }\n\n super();\n\n this.autoDismissTimeout = autoDismissTimeout;\n this.shouldResetOnHover = shouldResetOnHover;\n\n this._isDismissed = false;\n this._isDismissing = false;\n\n this.events.setValue(NotificationEvents.StartDismissing, new Event());\n this.events.setValue(NotificationEvents.PreventDismissing, new Event());\n this.events.setValue(NotificationEvents.FinishDismissing, new Event());\n }\n\n /**\n * Starts dismissing process by updating the `isDismissing` field and triggering the start dismissing event.\n */\n public startDismissing(): void {\n this._isDismissing = true;\n this.events.getValue(NotificationEvents.StartDismissing)?.trigger();\n }\n\n /**\n * Prevents dismissing process by updating the `isDismissing` field and triggering the prevent dismissing event.\n */\n public preventDismissing(): void {\n this._isDismissing = false;\n this.events.getValue(NotificationEvents.PreventDismissing)?.trigger();\n }\n\n /**\n * Finishes dismissing process by updating the `isDismissing` and `isDismissed` fields,\n * triggers the finish dismissing event,\n * removes the notification from the list as it should be hidden already.\n */\n public finishDismissing(): void {\n this._isDismissing = false;\n this._isDismissed = true;\n this.events.getValue(NotificationEvents.FinishDismissing)?.trigger();\n this.remove();\n }\n}\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\n/**\n * Enum with the possible notification UI events.\n */\nexport enum NotificationEvents {\n Close = 'Close',\n StartDismissing = 'StartDismissing',\n FinishDismissing = 'FinishDismissing',\n PreventDismissing = 'PreventDismissing',\n RemovedFromList = 'RemovedFromList'\n}\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { INotificationProps } from '../../notification-components';\nimport { BaseNotification } from './base-notification';\n\n/**\n * Decorator which should be used to specify the react component class for a notification data instances.\n * @param {React.ComponentClass} componentClass The component class responsible for rendering all the data instances of this notification class.\n */\nexport const withNotificationComponent = <\n NotificationType extends BaseNotification,\n PropsType extends INotificationProps,\n StateType extends {}>(\n componentClass: React.ComponentClass) => {\n\n return {}>(constructor: T) => {\n return class extends constructor {\n public readonly notificationComponentConstructor: React.ComponentClass = componentClass;\n };\n };\n};\n\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { RichText } from '@msdyn365-commerce/core';\nimport { Event, StringExtensions } from '@msdyn365-commerce-modules/retail-actions';\n\nimport { DismissibleNotification, IClosableNotification, IDescriptiveNotification, ITitledNotification, NotificationEvents } from '../base';\n\n/**\n * Represents a system notification data instance.\n * By default, all system notification should have a title, be closable, auto-dismissible.\n * You can specify some optional description text for the main message.\n */\nexport abstract class SystemNotification extends DismissibleNotification implements ITitledNotification, IDescriptiveNotification, IClosableNotification {\n /**\n * Aria label which should be used for the close button. Should be localized.\n * @see IClosableNotification\n */\n public readonly closeAriaLabel: string;\n\n /**\n * Specifies if the notification is closed or not. True if it's closed, false otherwise.\n * @remark Use only to get information about the 'close' event, dismissible notifications do not use this field.\n * @see IClosableNotification\n */\n public isClosed: boolean;\n\n /**\n * The text with the title of notification. The text should be localized.\n * @see ITitledNotification\n */\n public readonly title: RichText;\n\n /**\n * The lines of text which are displayed to user. The text should be localized. Empty by default.\n * @see IDescriptiveNotification\n */\n public readonly descriptionLines: RichText[];\n\n /**\n * Initializes system notification with the given data.\n * @param {string} title The text with the title of notification. The text should be localized.\n * @param {string} closeAriaLabel Aria label which should be used for the close button. Should be localized.\n * @param {(string | undefined)[]} [descriptionLines] Description for the notification. Optional parameter.\n * The data will be filtered to include only non-null/non-whitespace text.\n */\n public constructor(title: RichText, closeAriaLabel: string, descriptionLines?: (RichText | undefined)[]) {\n super();\n\n this.title = title;\n this.closeAriaLabel = closeAriaLabel;\n this.descriptionLines = (descriptionLines ?? []).filter(value => !StringExtensions.isNullOrWhitespace(value?.toString()));\n this.isClosed = false;\n\n this.events.setValue(NotificationEvents.Close, new Event());\n }\n\n /**\n * Triggers close event and marks that the notification is closed now.\n * Implementation should modify the `isClosed` field first and then trigger the `NotificationEvents.Close` event.\n * @see IClosableNotification\n */\n public close(): void {\n this.isClosed = true;\n this.events.getValue(NotificationEvents.Close)?.trigger();\n }\n}\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { ErrorNotificationComponent } from '../../notification-components/system-notifications/error-notification-component';\nimport { withNotificationComponent } from '../base';\nimport { SystemNotification } from './system-notification';\n\n/**\n * Represents an error notification.\n * Use this notification when some flow fails and you want to display a simple message to the user.\n * This is one of the types of system notifications.\n */\n@withNotificationComponent(ErrorNotificationComponent)\nexport class ErrorNotification extends SystemNotification {}\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { RichText } from '@msdyn365-commerce/core';\nimport { StringExtensions } from '@msdyn365-commerce-modules/retail-actions';\n\nimport { LoadingNotificationComponent } from '../../notification-components/system-notifications/loading-notification-component';\nimport { DismissibleNotification, IDescriptiveNotification, ITitledNotification, withNotificationComponent } from '../base';\n\n/**\n * Represents a loading notification.\n * Use this notification when a process takes some time to be completed.\n * This type of notification should be used to show the user that the flow is in process.\n * @remark Do not use the notification for quick actions.\n */\n@withNotificationComponent(LoadingNotificationComponent)\nexport class LoadingNotification extends DismissibleNotification implements ITitledNotification, IDescriptiveNotification {\n /**\n * The text with the title of notification. The text should be localized.\n * @see ITitledNotification\n */\n public readonly title: RichText;\n\n /**\n * The lines of text which are displayed to user. The text should be localized. Empty by default.\n * @see IDescriptiveNotification\n */\n public readonly descriptionLines: RichText[];\n\n /**\n * Represents loading state when some flow is in progress.\n */\n public get isLoading(): boolean {\n return this._isLoading;\n }\n\n /**\n * Represents loading state when some flow is in progress.\n */\n private _isLoading: boolean;\n\n /**\n * Initializes system notification with the given data.\n * @param {string} title The text with the title of notification. The text should be localized.\n * @param {string} closeAriaLabel Aria label which should be used for the close button. Should be localized.\n * @param {(string | undefined)[]} [descriptionLines] Description for the notification. Optional parameter.\n * The data will be filtered to include only non-null/non-whitespace text.\n */\n public constructor(title: RichText, descriptionLines?: (RichText | undefined)[]) {\n super(null, false);\n\n this._isLoading = true;\n this.title = title;\n this.descriptionLines = (descriptionLines ?? []).filter(value => !StringExtensions.isNullOrWhitespace(value?.toString()));\n }\n\n /**\n * Tells notification instance that the loading is completed.\n */\n public finishLoading(): void {\n this._isLoading = false;\n this.startDismissing();\n }\n}\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { SuccessNotificationComponent } from '../../notification-components/system-notifications/success-notification-component';\nimport { withNotificationComponent } from '../base';\nimport { SystemNotification } from './system-notification';\n\n/**\n * Represents a success notification.\n * Use this notification for the successful scenarios when you want to display a simple message to the user.\n * This is one of the types of system notifications.\n */\n@withNotificationComponent(SuccessNotificationComponent)\nexport class SuccessNotification extends SystemNotification {}\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { WarningNotificationComponent } from '../../notification-components/system-notifications/warning-notification-component';\nimport { withNotificationComponent } from '../base';\nimport { SystemNotification } from './system-notification';\n\n/**\n * Represents a warning notification.\n * Use this notification when you want to provide some additional information or hints to the user.\n * For the success or error scenarios, please use `SuccessNotification` or `ErrorNotification` instead.\n * This is one of the types of system notifications.\n */\n@withNotificationComponent(WarningNotificationComponent)\nexport class WarningNotification extends SystemNotification {}\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\n/**\n * Specifies different feeds for the notification lists.\n * Denotes the purpose of a notification list and what kind of notifications should be passed to the list.\n * By default is global (the global notification lists which is used to show most notifications).\n */\nexport enum NotificationFeeds {\n Global = 'global'\n}\n\n/**\n * Represents a type of each notification feed. Is used for notification lists components.\n * @see NotificationFeeds\n */\nexport type NotificationFeedType = string;\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { ArrayExtensions, Event } from '@msdyn365-commerce-modules/retail-actions';\n\nimport { INotificationComponentType } from '../notification-components/notification-component-type';\nimport { NotificationComponentsListsManager } from '../notification-components/notification-components-lists-manager';\nimport { BaseNotification, NotificationComponentClass } from '../notifications-data-instances';\nimport { NotificationFeeds } from './notification-feeds';\n\n/**\n * Notification manager is a singleton.\n * It is responsible for receiving a notification,\n * retrieving notification component class,\n * and passing the component class to the notification components lists.\n * @see NotificationComponentsList which renders the list of notifications.\n */\nexport class NotificationsManager {\n /**\n * Singleton global instance of the notification manager.\n */\n private static _applicationNotificationManager?: NotificationsManager;\n\n /**\n * Event which is triggered after the notification was added to the lists.\n * @see addNotification method.\n * @remark is not triggered in case of any errors.\n */\n public readonly notificationAddedEvent: Event;\n\n /**\n * Retrieves global singleton instance of the notifications manager.\n * @returns {NotificationsManager} Instance of the manager which is used throughout the whole application.\n */\n public static instance(): NotificationsManager {\n if (!this._applicationNotificationManager) {\n this._applicationNotificationManager = new NotificationsManager();\n }\n\n return this._applicationNotificationManager;\n }\n\n /**\n * Adds given notifications to the notification component lists.\n * It receives a notification, retrieves notification component class,\n * and passes the component class to the notification components lists.\n * @see NotificationComponentsList which renders the list of notifications.\n * Then it triggers the notification added event.\n * @remark In case of any errors, suppress the error and write it in the console.\n * @param {NotificationType} notification Notification instance with the data.\n * @param {NotificationFeeds} feed The configuration of the notification component list. By default is global.\n */\n public addNotification(\n notification: NotificationType, feed: NotificationFeeds = NotificationFeeds.Global): void {\n\n const component = this._getNotificationComponent(notification);\n\n try {\n const componentType: INotificationComponentType = {\n componentClass: component,\n props: {\n notification\n }\n };\n const lists = NotificationComponentsListsManager.getNotificationLists(feed);\n\n if (!ArrayExtensions.hasElements(lists)) {\n notification.remove();\n return;\n }\n\n lists.forEach(\n componentManager => {\n componentManager.addNotificationComponent(componentType);\n });\n\n this.notificationAddedEvent.trigger();\n } catch (error) {\n console.error('Error while adding a notification');\n console.error(notification);\n console.error(error);\n }\n }\n\n /**\n * Initializes the instance with the notification event.\n */\n private constructor() {\n this.notificationAddedEvent = new Event();\n }\n\n /**\n * Retrieves the component responsible for rendering the given notification.\n * @param {NotificationType} notification The data instance of the notification which should be added.\n * @returns {NotificationComponentClass} The react class which should render the given notification.\n */\n private _getNotificationComponent(notification: NotificationType): NotificationComponentClass {\n const componentClass = notification.notificationComponentConstructor;\n if (!componentClass) {\n const notificationName = (notification).constructor.name;\n throw new Error(`No notification component found for the given notification ${notificationName}. ` +\n 'Please use \\'withNotificationComponent\\' decorator on the notification and specify the type to use');\n }\n\n return componentClass;\n }\n}\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport MsDyn365 from '@msdyn365-commerce/core';\nimport {\n INotificationComponentsList, INotificationComponentsListState, INotificationComponentType,\n NotificationComponentsListsManager, NotificationEvents, NotificationFeedType\n} from '@msdyn365-commerce-modules/notifications-core';\nimport { ArrayExtensions, ObjectExtensions, Random } from '@msdyn365-commerce-modules/retail-actions';\nimport { IModuleProps } from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport React from 'react';\n\nimport { INotificationsListProps } from './notifications-list.props.autogenerated';\n\n/**\n * View for the notifications list which specifies the container and notifications items.\n */\nexport interface INotificationsListViewProps extends INotificationsListProps<{}> {\n container: IModuleProps;\n notificationsList: React.ReactNode;\n}\n\n/**\n * Configuration to make the list stickable to the page without overlapping any content on top.\n */\nexport interface INotificationComponentStickyConfiguration {\n\n /**\n * Minimum offset for top (default for the page).\n */\n minTopOffset: number;\n\n /**\n * Maximum offset for top (to limit the top offset while scrolling).\n */\n maxTopOffset: number;\n}\n\n/**\n * Stickable notification list state which defines the top position of the list at the moment.\n */\nexport interface IStickableNotificationComponentsListState extends INotificationComponentsListState {\n\n /**\n * The top position of the list on the page.\n */\n top?: number;\n}\n\n/**\n * A notification list which is operated by notification manager.\n * It is responsible for rendering the received notifications.\n */\nexport class NotificationComponentsList\n extends React.Component, IStickableNotificationComponentsListState>\n implements INotificationComponentsList {\n\n /**\n * The class name to use.\n */\n private static readonly _className: string = 'msc-notifications-list';\n\n /**\n * The feed which the list is responsible for displaying.\n */\n public readonly feed: NotificationFeedType;\n\n /**\n * Configuration which specifies if and how the list should be stickable.\n * If undefined, the configuration will not be used at all. And list will not be stickable.\n */\n private readonly _stickyConfiguration?: INotificationComponentStickyConfiguration;\n\n /**\n * The list of notification which should be shown in the list at the moment.\n * @remarks Should be used to retrieve the latest list of notifications\n * as the list from the state is updated only after rendering.\n */\n private _notificationsComponentList: INotificationComponentType[];\n\n /**\n * Unique identifier of the list.\n * Uses format 'NotificationComponentsList-GUID';.\n */\n private _instanceId?: string;\n\n /**\n * Initializes instance with the given props.\n * @param props - The configuration of the list.\n */\n public constructor(props: INotificationsListProps<{}>) {\n super(props);\n\n this.feed = props.config.feed;\n\n if (!ObjectExtensions.isNullOrUndefined(props.config.minTopOffset) &&\n !ObjectExtensions.isNullOrUndefined(props.config.maxTopOffset)) {\n this._stickyConfiguration = {\n minTopOffset: props.config.minTopOffset,\n maxTopOffset: props.config.maxTopOffset\n };\n }\n\n this._notificationsComponentList = [];\n\n this.state = {\n notificationsComponentList: []\n };\n\n this._handleTopUpdate = this._handleTopUpdate.bind(this);\n this._getCurrentTopPosition = this._getCurrentTopPosition.bind(this);\n }\n\n /**\n * Specifies if the component should be re-rendered.\n * @param nextProps - The next configuration the component is receiving.\n * @param nextState - The next state the component is receiving.\n * @returns True if component should be re-rendered, false if component should not be changed.\n */\n public shouldComponentUpdate(nextProps: Readonly>, nextState: Readonly): boolean {\n const isPropsDifferent = this.feed !== nextProps.config.feed ||\n this.props.config.maxNotificationsCount !== nextProps.config.maxNotificationsCount ||\n this.props.config.maxTopOffset !== nextProps.config.maxTopOffset ||\n this.props.config.minTopOffset !== nextProps.config.minTopOffset ||\n this.props.config.className !== nextProps.config.className ||\n this.props.id !== nextProps.id;\n const isStateDifferent = this.state.top !== nextState.top ||\n this.state.notificationsComponentList.length !== nextState.notificationsComponentList.length ||\n this.state.notificationsComponentList.every(value => nextState.notificationsComponentList.find(\n otherValue => otherValue.props.notification.id === value.props.notification.id));\n return isPropsDifferent || isStateDifferent;\n }\n\n /**\n * Adds the current instance to the global list of instances so that it becomes available for the notification manager.\n * In case the list is specified to be stickable, also subscribes to the scroll event to update the offsets.\n */\n public componentDidMount(): void {\n NotificationComponentsListsManager.subscribe(this);\n\n this._instanceId = `NotificationComponentsList-${Random.Guid.generateGuid()}`;\n\n if (MsDyn365.isBrowser && this._stickyConfiguration !== undefined) {\n window.addEventListener('scroll', this._handleTopUpdate);\n }\n }\n\n /**\n * Remove the instance from the global list of instances so that it becomes unavailable for the notification manager.\n * Unsubscribes itself from the notification events and scroll event.\n */\n public componentWillUnmount(): void {\n NotificationComponentsListsManager.unsubscribe(this);\n\n this._notificationsComponentList.forEach(component => component.props.notification.events.getValue(NotificationEvents.RemovedFromList)?.unsubscribe(this._instanceId!));\n\n if (MsDyn365.isBrowser && this._stickyConfiguration !== undefined) {\n window.removeEventListener('scroll', this._handleTopUpdate);\n }\n }\n\n /**\n * Adds a new notification to the list.\n * @param {INotificationComponentType} notificationComponent Data required to render the notification. @see INotificationComponentType.\n */\n public addNotificationComponent(notificationComponent: INotificationComponentType): void {\n if (this._instanceId === undefined) {\n return;\n }\n\n if (!ObjectExtensions.isNullOrUndefined(this.props.config.maxNotificationsCount) &&\n this._notificationsComponentList.length >= this.props.config.maxNotificationsCount) {\n\n throw new Error('Notifications limit reached, cannot show more notifications.');\n }\n\n // Subscribe to the remove event to filter the removed notifications out from the list.\n notificationComponent.props.notification.events.getValue(NotificationEvents.RemovedFromList)?.subscribe({\n instanceId: this._instanceId,\n handler: () => {\n notificationComponent.props.notification.events.getValue(NotificationEvents.RemovedFromList)?.unsubscribe(this._instanceId!);\n const newList = this._notificationsComponentList.filter(component => component !== notificationComponent);\n this._notificationsComponentList = newList;\n this.setState({ notificationsComponentList: this._notificationsComponentList });\n }\n });\n\n // Prepend the notification as newest should come to the top.\n this._notificationsComponentList.unshift(notificationComponent);\n this.setState({ notificationsComponentList: this._notificationsComponentList });\n this._handleTopUpdate();\n }\n\n public render(): React.ReactNode {\n const className = classnames(\n NotificationComponentsList._className,\n `${NotificationComponentsList._className}__${this.feed}`,\n this.props.config.className);\n\n const viewProps: INotificationsListViewProps = {\n ...this.props,\n container: {\n moduleProps: this.props,\n className,\n id: this._instanceId,\n style: { top: this.state.top }\n },\n notificationsList: this._renderNotificationsList()\n };\n\n return this.props.renderView(viewProps);\n }\n\n /**\n * Renders the list of notifications.\n * @returns React node with a list of notifications.\n */\n private _renderNotificationsList(): React.ReactNode {\n\n const hasNotifications = ArrayExtensions.hasElements(this.state.notificationsComponentList);\n const containerClassName = classnames(\n `${NotificationComponentsList._className}__scrollable`,\n hasNotifications ? `${NotificationComponentsList._className}__has-notifications` : `${NotificationComponentsList._className}__empty`);\n\n return (\n
\n {\n this.state.notificationsComponentList.map((component) => {\n const ComponentClass = component.componentClass;\n return (\n \n );\n })\n }\n
\n );\n }\n\n /**\n * Retrieves current top offset position by looking at scroll position and rounding it to the stickable limits.\n */\n private _getCurrentTopPosition(): number | undefined {\n const configuration = this._stickyConfiguration;\n\n if (configuration === undefined) {\n return undefined;\n }\n\n let pageYOffset = 0;\n if (MsDyn365.isBrowser) {\n pageYOffset = window.pageYOffset;\n }\n\n return Math.max(Math.min(configuration.maxTopOffset, configuration.maxTopOffset - pageYOffset), configuration.minTopOffset);\n }\n\n /**\n * Updates the top offset on scroll event to make the list stickable.\n */\n private _handleTopUpdate(): void {\n const newTop = this._getCurrentTopPosition();\n this.setState({ top: newTop });\n }\n}\n\nexport default NotificationComponentsList;\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { Module } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { INotificationsListViewProps } from './notifications-list';\n\nexport const NotificationsListView: React.FC = props => {\n return (\n \n {props.notificationsList}\n \n );\n};\n\nexport default NotificationsListView;\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { HtmlHeadInclude, IAny, IGeneric } from '@msdyn365-commerce/core';\nimport * as React from 'react';\n\nimport { IDefaultPageSummaryData } from './default-page-summary.data';\nimport { IDefaultPageSummaryProps } from './default-page-summary.props.autogenerated';\n\n/**\n *\n * DefaultPageSummaryMetadata component.\n * @extends {React.PureComponent}\n */\nclass DefaultPageSummary extends React.PureComponent> {\n public render(): JSX.Element {\n if (this.props.data.pageSummary.result === undefined) {\n throw new Error('PageSummaryData input to page-summary is undefined. Unable to generate page-summary');\n }\n let {\n data: {\n pageSummary: {\n result: { title, description, keywords, sharingImageUrl, faviconUrl }\n }\n }\n } = this.props;\n\n const {\n config,\n context,\n data: {\n pageSummary: {\n result: { canonicalUrl }\n }\n }\n } = this.props;\n\n // Override values coming from data action if config values are provided\n title = config.title || title;\n description = config.description || description;\n keywords = config.keywords || keywords;\n sharingImageUrl = (config.sharingImage && config.sharingImage.src) || sharingImageUrl;\n faviconUrl = config.faviconUrl || faviconUrl;\n\n const pageTitle = this._constructPageTitle(title, context && context.request && context.request.app);\n return (\n <>\n \n {pageTitle && \n {pageTitle}\n }\n {description && }\n {keywords && }\n {canonicalUrl && }\n {faviconUrl && }\n \n {!config.disableOgTags && this._renderOgTags(pageTitle, description, sharingImageUrl)}\n {!config.disableTwitterTags && this._renderTwitterTags(pageTitle, description, sharingImageUrl)}\n \n );\n }\n\n private _renderOgTags(title: string | undefined, description: string | undefined, sharingImageUrl: string | undefined): JSX.Element {\n return (\n \n {title && }\n {description && }\n {sharingImageUrl && }\n \n \n );\n }\n\n private _renderTwitterTags(\n title: string | undefined,\n description: string | undefined,\n sharingImageUrl: string | undefined\n ): JSX.Element {\n return (\n \n {title && }\n {description && }\n {sharingImageUrl && }\n \n \n );\n }\n\n private _constructPageTitle(title: string | undefined, app: IGeneric): string | undefined {\n if (!title) {\n title = '';\n }\n\n const moduleConfig = this.props.config;\n if (moduleConfig && moduleConfig.ignoreTitleSuffixPrefix) {\n return title;\n }\n\n const appConfig = app && app.platform;\n if (appConfig) {\n if (appConfig.pageTitlePrefix) {\n title = (appConfig.pageTitlePrefix as string) + title;\n }\n if (appConfig.pageTitleSuffix) {\n title += (appConfig.pageTitleSuffix as string);\n }\n }\n\n return title;\n }\n}\n\nexport default DefaultPageSummary;\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { HtmlHeadInclude, IAny, IGeneric } from '@msdyn365-commerce/core';\nimport * as React from 'react';\n\nimport { IProductPageSummaryData } from './product-page-summary.data';\nimport { IProductPageSummaryProps } from './product-page-summary.props.autogenerated';\n\n/**\n *\n * ProductPageSummary component.\n * @extends {React.PureComponent}\n */\nclass ProductPageSummary extends React.PureComponent> {\n public render(): JSX.Element {\n if (this.props.data.productPageSummary.result === undefined) {\n throw new Error('PageSummaryData input to page-summary is undefined. Unable to generate page-summary');\n }\n let {\n data: {\n productPageSummary: {\n result: { title, description, keywords, sharingImageUrl, faviconUrl }\n }\n }\n } = this.props;\n\n const {\n config,\n context,\n data: {\n productPageSummary: {\n result: { canonicalUrl, productId, productBrand, price }\n }\n }\n } = this.props;\n\n // Product SEO metadata specific information - non-overridable\n const productName = title;\n const productDescription = description;\n const productImageUrl = sharingImageUrl;\n\n // Override values coming from data action if config values are provided\n title = config.title || title;\n description = config.description || description;\n keywords = config.keywords || keywords;\n sharingImageUrl = (config.sharingImage && config.sharingImage.src) || sharingImageUrl;\n faviconUrl = config.faviconUrl || faviconUrl;\n\n // Construct page title with suffix and prefix if provided from app settings\n const pageTitle = this._constructPageTitle(title, context && context.request && context.request.app);\n return (\n <>\n \n {pageTitle && \n {pageTitle}\n }\n {description && }\n {keywords && }\n {canonicalUrl && }\n {faviconUrl && }\n \n {this._renderProductMetadata(productName, productDescription, productImageUrl, canonicalUrl, productId, price, context.request.channel?.Currency, productBrand)}\n {!config.disableOgTags && this._renderOgTags(pageTitle, description, sharingImageUrl)}\n {!config.disableTwitterTags && this._renderTwitterTags(pageTitle, description, sharingImageUrl)}\n \n );\n }\n\n /**\n * Renders the facebook and other social media specific metadata tags.\n *\n * @param title Page title.\n * @param description Product description.\n * @param sharingImageUrl Primary product image url.\n */\n private _renderOgTags(title: string | undefined, description: string | undefined, sharingImageUrl: string | undefined): JSX.Element {\n return (\n \n {title && }\n {description && }\n {sharingImageUrl && }\n \n \n );\n }\n\n /**\n * Constructs and renders the JSON-LD tag used to output product specific metadata used by search engine crawlers.\n *\n * @param productName Product name.\n * @param description Product description.\n * @param sharingImageUrl Primary product image url.\n * @param canonicalUrl Product canonical url.\n * @param productId Master product id.\n * @param price Proudct price.\n * @param currencyCode Current channel currency code.\n * @param productBrand Product brand.\n */\n private _renderProductMetadata(productName: string | undefined,\n description: string | undefined,\n sharingImageUrl: string | undefined,\n canonicalUrl: string | undefined,\n productId: number | undefined,\n price: number | undefined,\n currencyCode: string | undefined,\n productBrand: string | undefined): JSX.Element {\n // Construct the JSON-LD data that contains the product metadata information used by search enginge crawlers\n const productMetaData = JSON.stringify({\n '@context': 'http://schema.org',\n '@type': 'Product',\n name: productName,\n description,\n image: sharingImageUrl,\n sku: productId,\n brand: {\n '@type': 'Brand',\n name: productBrand\n },\n offers: {\n '@type': 'Offer',\n url: canonicalUrl,\n priceCurrency: currencyCode,\n price\n }\n });\n return (\n \n\n