{"version":3,"file":"ng-nest-ui-notification.mjs","sources":["../../../../lib/ng-nest/ui/notification/notification.property.ts","../../../../lib/ng-nest/ui/notification/notification.component.ts","../../../../lib/ng-nest/ui/notification/notification.component.html","../../../../lib/ng-nest/ui/notification/notification.service.ts","../../../../lib/ng-nest/ui/notification/notification.module.ts","../../../../lib/ng-nest/ui/notification/ng-nest-ui-notification.ts"],"sourcesContent":["import type { XStatus, XCorner } from '@ng-nest/ui/core';\r\nimport type { XAlertOption } from '@ng-nest/ui/alert';\r\nimport type { XPortalOverlayRef } from '@ng-nest/ui/portal';\r\nimport { Subscription, Subject } from 'rxjs';\r\nimport { ChangeDetectorRef } from '@angular/core';\r\n\r\n/**\r\n * Notification\r\n * @selector x-notification\r\n * @decorator component\r\n */\r\nexport const XNotificationPrefix = 'x-notification';\r\n\r\nexport const XNotificationPortal = 'x-notification-portal';\r\n\r\n/**\r\n * Notification Option\r\n */\r\nexport interface XNotificationOption extends XAlertOption {\r\n  /**\r\n   * @zh_CN 方位\r\n   * @en_US Placement\r\n   * @default 'top-end'\r\n   */\r\n  placement?: XCorner;\r\n  /**\r\n   * @zh_CN 偏移距离\r\n   * @en_US Offset distance\r\n   * @default '0.5rem'\r\n   */\r\n  offset?: string | string[];\r\n  /**\r\n   * @zh_CN 类型\r\n   * @en_US Types of\r\n   * @default 'info'\r\n   */\r\n  type?: XNotificationType;\r\n  /**\r\n   * @zh_CN 宽度\r\n   * @en_US Width\r\n   * @default '20rem'\r\n   */\r\n  width?: string;\r\n  /**\r\n   * @zh_CN 高度\r\n   * @en_US Height\r\n   */\r\n  height?: string;\r\n  /**\r\n   * @zh_CN 延迟关闭时间\r\n   * @en_US Delay off time\r\n   * @default 4500\r\n   */\r\n  duration?: number;\r\n  /**\r\n   * @zh_CN 隐藏关闭按钮\r\n   * @en_US Hide close button\r\n   * @default true\r\n   */\r\n  hideClose?: boolean;\r\n  /**\r\n   * @zh_CN 显示图标\r\n   * @en_US Show icon\r\n   * @default true\r\n   */\r\n  showIcon?: boolean;\r\n  /**\r\n   * @zh_CN 延迟关闭订阅后的对象，用来释放或取消\r\n   * @en_US Delayed closing the subscribed object, used to release or cancel\r\n   */\r\n  durationSubscription?: Subscription | null;\r\n  /**\r\n   * @zh_CN 延迟关闭订阅对象\r\n   * @en_US Delay in closing the subscription object\r\n   */\r\n  durationSub?: Subject<any>;\r\n}\r\n\r\n/**\r\n * @zh_CN 创建的消息对象\r\n * @en_US Message object created\r\n */\r\nexport interface XNotificationOverlayRef extends XPortalOverlayRef<XNotificationHandle> {}\r\n\r\n/**\r\n * @zh_CN 创建的消息组件定义\r\n * @en_US Message object created\r\n */\r\nexport interface XNotificationHandle {\r\n  notification: XNotificationRef;\r\n  cdr: ChangeDetectorRef;\r\n  onClose(item: XNotificationOption): void;\r\n  moveDone($event: AnimationEvent): void;\r\n  onEnter(item: XNotificationOption): void;\r\n  onLeave(item: XNotificationOption): void;\r\n}\r\n\r\n/**\r\n * @zh_CN 九宫格中的消息对象\r\n * @en_US Message object in nine grid\r\n */\r\nexport interface XNotificationPlacement {\r\n  [property: string]: XNotificationRef;\r\n}\r\n\r\nexport interface XNotificationRef {\r\n  ref?: XNotificationOverlayRef;\r\n  list?: XNotificationOption[];\r\n}\r\n\r\n/**\r\n * @zh_CN 类型\r\n * @en_US Types of\r\n */\r\nexport type XNotificationType = XStatus;\r\n","import { Component, ViewEncapsulation, ChangeDetectorRef, ChangeDetectionStrategy, inject } from '@angular/core';\r\nimport { XIsEmpty } from '@ng-nest/ui/core';\r\nimport {\r\n  XNotificationPrefix,\r\n  XNotificationOption,\r\n  XNotificationRef,\r\n  XNotificationHandle\r\n} from './notification.property';\r\nimport { of } from 'rxjs';\r\nimport { delay } from 'rxjs/operators';\r\nimport { XAlertComponent } from '@ng-nest/ui/alert';\r\n\r\n@Component({\r\n  selector: `${XNotificationPrefix}`,\r\n  imports: [XAlertComponent],\r\n  templateUrl: './notification.component.html',\r\n  styleUrls: ['./notification.component.scss'],\r\n  encapsulation: ViewEncapsulation.None,\r\n  changeDetection: ChangeDetectionStrategy.OnPush\r\n})\r\nexport class XNotificationComponent implements XNotificationHandle {\r\n  notification: XNotificationRef = { list: [] };\r\n  cdr = inject(ChangeDetectorRef);\r\n\r\n  onClose(item: XNotificationOption) {\r\n    this.notification.list?.splice(this.notification.list.indexOf(item), 1);\r\n    item.durationSubscription && item.durationSubscription.unsubscribe();\r\n    this.cdr.detectChanges();\r\n  }\r\n\r\n  moveDone($event: AnimationEvent) {\r\n    if ($event.animationName.endsWith('-leave') && XIsEmpty(this.notification.list)) {\r\n      this.notification.ref?.overlayRef?.detach();\r\n    }\r\n  }\r\n\r\n  onEnter(item: XNotificationOption) {\r\n    item.durationSubscription && item.durationSubscription.unsubscribe();\r\n  }\r\n\r\n  onLeave(item: XNotificationOption) {\r\n    if (item.duration) {\r\n      item.durationSubscription = of(true)\r\n        .pipe(delay(item.duration))\r\n        .subscribe(() => {\r\n          this.onClose(item);\r\n        });\r\n    }\r\n  }\r\n}\r\n","<div class=\"x-notification\">\r\n  <!-- TODO The style of x-alert will be cleared when the leave animation starts. This ensures that the style will definitely be loaded -->\r\n  <x-alert [style.display]=\"'none'\"></x-alert>\r\n  @for (item of notification.list; track item) {\r\n    <x-alert\r\n      [animate.enter]=\"`x-move-${item.placement}-enter`\"\r\n      [animate.leave]=\"`x-move-${item.placement}-leave`\"\r\n      (animationend)=\"moveDone($event)\"\r\n      (mouseenter)=\"onEnter(item)\"\r\n      (mouseleave)=\"onLeave(item)\"\r\n      (close)=\"onClose(item)\"\r\n      [hide]=\"item.hide!\"\r\n      [title]=\"item.title\"\r\n      [content]=\"item.content\"\r\n      [type]=\"item.type!\"\r\n      [effect]=\"item.effect!\"\r\n      [hideClose]=\"item.hideClose!\"\r\n      [closeText]=\"item.closeText\"\r\n      [showIcon]=\"item.showIcon!\"\r\n      [duration]=\"0\"\r\n      manual\r\n      disabledAnimation\r\n    ></x-alert>\r\n  }\r\n</div>\r\n","import { Injectable, inject } from '@angular/core';\r\nimport { XTemplate, XIsXTemplate, XFillDefault, XIsEmpty, XIsString } from '@ng-nest/ui/core';\r\nimport {\r\n  XNotificationOption,\r\n  XNotificationOverlayRef,\r\n  XNotificationType,\r\n  XNotificationPlacement,\r\n  XNotificationRef,\r\n  XNotificationPortal\r\n} from './notification.property';\r\nimport { XNotificationComponent } from './notification.component';\r\nimport { of } from 'rxjs';\r\nimport { delay } from 'rxjs/operators';\r\nimport { XPortalService } from '@ng-nest/ui/portal';\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class XNotificationService {\r\n  notifications: XNotificationPlacement = {};\r\n\r\n  default: XNotificationOption = {\r\n    type: 'info',\r\n    width: '20rem',\r\n    placement: 'top-end',\r\n    offset: '0.5rem',\r\n    effect: 'white',\r\n    duration: 4500,\r\n    showIcon: true\r\n  };\r\n\r\n  private portal = inject(XPortalService);\r\n\r\n  info(option: XTemplate | XNotificationOption): XNotificationRef {\r\n    return this.createNotification(option, 'info');\r\n  }\r\n\r\n  success(option: XTemplate | XNotificationOption): XNotificationRef {\r\n    return this.createNotification(option, 'success');\r\n  }\r\n\r\n  warning(option: XTemplate | XNotificationOption): XNotificationRef {\r\n    return this.createNotification(option, 'warning');\r\n  }\r\n\r\n  error(option: XTemplate | XNotificationOption): XNotificationRef {\r\n    return this.createNotification(option, 'error');\r\n  }\r\n\r\n  create(option: XNotificationOption): XNotificationOverlayRef {\r\n    const offset = XIsString(option.offset) ? [option.offset as string] : (option.offset as string[]);\r\n    return this.portal.attach({\r\n      content: XNotificationComponent,\r\n      overlayConfig: {\r\n        panelClass: XNotificationPortal,\r\n        width: option.width,\r\n        height: option.height,\r\n        positionStrategy: this.portal.setPlace(option.placement, ...offset)\r\n      }\r\n    });\r\n  }\r\n\r\n  private createNotification(option: XTemplate | XNotificationOption, type: XNotificationType): XNotificationRef {\r\n    let opt: XNotificationOption;\r\n    if (XIsXTemplate(option)) {\r\n      opt = { title: option as XTemplate, type: type };\r\n    } else {\r\n      opt = option as XNotificationOption;\r\n      opt.type = type;\r\n    }\r\n    XFillDefault(opt, this.default);\r\n    return this.createNotificationPlacement(opt);\r\n  }\r\n\r\n  private createNotificationPlacement(option: XNotificationOption): XNotificationRef {\r\n    if (typeof option.placement === 'undefined') return {};\r\n    let msgPlacement = this.notifications[option.placement];\r\n    this.setDuration(option);\r\n    if (XIsEmpty(msgPlacement) || !msgPlacement.ref?.overlayRef?.hasAttached()) {\r\n      this.notifications[option.placement] = {\r\n        ref: this.create(option),\r\n        list: [option]\r\n      };\r\n    } else {\r\n      this.notifications[option.placement].list = [\r\n        ...(this.notifications[option.placement].list as XNotificationOption[]),\r\n        option\r\n      ];\r\n    }\r\n    this.notificationChange(this.notifications[option.placement]);\r\n\r\n    return this.notifications[option.placement];\r\n  }\r\n\r\n  private notificationChange(notification: XNotificationRef) {\r\n    if (!notification.ref?.overlayRef?.hasAttached() || !notification?.ref?.componentRef?.instance) return;\r\n    notification.ref.componentRef.instance.notification = notification;\r\n    notification.ref.componentRef.instance.cdr.detectChanges();\r\n  }\r\n\r\n  private setDuration(option: XNotificationOption) {\r\n    if (option.duration) {\r\n      option.durationSubscription = of(true)\r\n        .pipe(delay(option.duration))\r\n        .subscribe(() => {\r\n          this.removeNotification(option);\r\n          option.durationSubscription && option.durationSubscription.unsubscribe();\r\n        });\r\n    }\r\n  }\r\n\r\n  private removeNotification(option: XNotificationOption) {\r\n    if (typeof option.placement === 'undefined') return;\r\n    this.notifications[option.placement].ref?.componentRef?.instance.onClose(option);\r\n  }\r\n}\r\n","import { NgModule } from '@angular/core';\r\n\r\n@NgModule({\r\n  exports: [],\r\n  imports: []\r\n})\r\nexport class XNotificationModule {}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}