rd-outer-component 0.0.67 → 0.0.68
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2020/lib/modules/rd-notification/notification.component.mjs +24 -7
- package/esm2020/lib/modules/rd-notification/notification.module.mjs +30 -9
- package/esm2020/lib/modules/rd-notification/notification.service.mjs +90 -23
- package/fesm2015/rd-outer-component.mjs +150 -43
- package/fesm2015/rd-outer-component.mjs.map +1 -1
- package/fesm2020/rd-outer-component.mjs +147 -42
- package/fesm2020/rd-outer-component.mjs.map +1 -1
- package/lib/modules/rd-notification/notification.component.d.ts +6 -3
- package/lib/modules/rd-notification/notification.module.d.ts +9 -4
- package/lib/modules/rd-notification/notification.service.d.ts +12 -10
- package/package.json +1 -1
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
// notification.component.ts
|
|
1
2
|
import { Component, ViewChild } from '@angular/core';
|
|
2
3
|
import * as i0 from "@angular/core";
|
|
3
4
|
import * as i1 from "ng-zorro-antd/notification";
|
|
@@ -12,14 +13,16 @@ export class RdNotificationComponent {
|
|
|
12
13
|
constructor(notificationService, sanitizer) {
|
|
13
14
|
this.notificationService = notificationService;
|
|
14
15
|
this.sanitizer = sanitizer;
|
|
16
|
+
this.notifications = new Map();
|
|
15
17
|
}
|
|
16
18
|
showNotification(data) {
|
|
17
|
-
|
|
19
|
+
const notificationId = this.generateId();
|
|
20
|
+
const notification = this.notificationService.template(this.notificationTpl, {
|
|
18
21
|
nzData: data,
|
|
19
22
|
nzDuration: data.duration || 8 * 1000,
|
|
20
23
|
nzStyle: {
|
|
21
24
|
borderRadius: '4px',
|
|
22
|
-
border: `1px solid ${borderColorMap[data?.type]}`,
|
|
25
|
+
border: `1px solid ${borderColorMap[data?.type] || '#e5e7eb'}`,
|
|
23
26
|
boxShadow: '0px 8px 16px 0px rgba(31, 41, 55, 0.08)',
|
|
24
27
|
display: 'flex',
|
|
25
28
|
padding: '0',
|
|
@@ -28,20 +31,34 @@ export class RdNotificationComponent {
|
|
|
28
31
|
},
|
|
29
32
|
nzClass: 'custom-wallet-notification',
|
|
30
33
|
nzCloseIcon: this.closeTpl,
|
|
34
|
+
nzKey: notificationId, // 添加唯一 key
|
|
31
35
|
});
|
|
36
|
+
this.notifications.set(notificationId, notification);
|
|
37
|
+
// 自动清理
|
|
38
|
+
setTimeout(() => {
|
|
39
|
+
this.notifications.delete(notificationId);
|
|
40
|
+
}, data.duration || 8000);
|
|
32
41
|
}
|
|
33
42
|
getDesc(desc) {
|
|
34
43
|
return this.sanitizer.bypassSecurityTrustHtml(desc);
|
|
35
44
|
}
|
|
36
45
|
onClick(data) {
|
|
37
|
-
if (this.notification?.messageId) {
|
|
38
|
-
this.notificationService.remove(this.notification?.messageId);
|
|
39
|
-
}
|
|
40
46
|
if (data.onLinkClick) {
|
|
41
|
-
// 明确检查存在性
|
|
42
47
|
data.onLinkClick();
|
|
43
48
|
}
|
|
44
49
|
}
|
|
50
|
+
generateId() {
|
|
51
|
+
return `rd-notification-${Date.now()}-${Math.random()
|
|
52
|
+
.toString(36)
|
|
53
|
+
.substr(2, 9)}`;
|
|
54
|
+
}
|
|
55
|
+
ngOnDestroy() {
|
|
56
|
+
// 清理所有通知
|
|
57
|
+
this.notifications.forEach((notification, id) => {
|
|
58
|
+
this.notificationService.remove(id);
|
|
59
|
+
});
|
|
60
|
+
this.notifications.clear();
|
|
61
|
+
}
|
|
45
62
|
}
|
|
46
63
|
RdNotificationComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: RdNotificationComponent, deps: [{ token: i1.NzNotificationService }, { token: i2.DomSanitizer }], target: i0.ɵɵFactoryTarget.Component });
|
|
47
64
|
RdNotificationComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: RdNotificationComponent, selector: "app-rd-notification", viewQueries: [{ propertyName: "notificationTpl", first: true, predicate: ["notificationTpl"], descendants: true, static: true }, { propertyName: "closeTpl", first: true, predicate: ["closeTpl"], descendants: true, static: true }], ngImport: i0, template: "<ng-template #notificationTpl let-data=\"data\">\n <div class=\"rd-custom-notification\"></div>\n <div\n class=\"rd-custom-notification-icon\"\n [class]=\"\n data.type === 'warn'\n ? 'rd-custom-warn-background'\n : data.type === 'error'\n ? 'rd-custom-error-background'\n : ''\n \"\n >\n <img\n [hidden]=\"data.type !== 'success'\"\n src=\"assets/img/icon/success-tip.svg\"\n />\n <img [hidden]=\"data.type !== 'warn'\" src=\"assets/img/icon/warm-tip.svg\" />\n <img [hidden]=\"data.type !== 'error'\" src=\"assets/img/icon/error-tip.svg\" />\n </div>\n <div class=\"rd-custom-notification-container\">\n <div class=\"rd-custom-notification-title\">{{ data.title }}</div>\n <div\n class=\"rd-custom-notification-desc\"\n [innerHTML]=\"getDesc(data.desc)\"\n ></div>\n <div\n *ngIf=\"data.actionDesc\"\n class=\"rd-custom-notification-link\"\n (click)=\"onClick(data)\"\n >\n {{ data.actionDesc }}\n </div>\n </div>\n</ng-template>\n\n<ng-template #closeTpl>\n <div class=\"rd-custom-notification-close\">\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n >\n <path\n d=\"M3.40039 3.3999L8.00039 7.9999M12.6004 12.5999L8.00039 7.9999M8.00039 7.9999L12.6004 3.3999L3.40039 12.5999\"\n stroke=\"#030712\"\n stroke-width=\"1.36\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n </svg>\n </div>\n</ng-template>\n", styles: [".rd-custom-notification-container{padding:12px 40px 12px 12px}.rd-custom-notification-container .rd-custom-notification-title{font-size:12px;font-weight:600}.rd-custom-notification-container .rd-custom-notification-desc{font-size:12px;font-weight:500;margin-top:4px}.rd-custom-notification-container .rd-custom-notification-link{color:#367af6;font-size:13px;font-style:normal;font-weight:600;line-height:16px;cursor:pointer;margin-top:12px;padding:0 2px}.rd-custom-warn-background{background-color:#fef0c3!important}.rd-custom-error-background{background-color:#fce8eb!important}.rd-custom-notification-icon{display:flex;width:40px;padding:16px 12px;justify-content:center;align-items:center;flex-shrink:0;align-self:stretch;background-color:#dcfcf0}.rd-custom-notification-icon svg{flex-shrink:0;width:20px;height:20px}.rd-custom-notification-close{padding:16px 12px}.rd-custom-notification-close svg{width:16px}\n"], dependencies: [{ kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] });
|
|
@@ -55,4 +72,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImpo
|
|
|
55
72
|
type: ViewChild,
|
|
56
73
|
args: ['closeTpl', { static: true }]
|
|
57
74
|
}] } });
|
|
58
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
75
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm90aWZpY2F0aW9uLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NoYXJlZC1saWIvc3JjL2xpYi9tb2R1bGVzL3JkLW5vdGlmaWNhdGlvbi9ub3RpZmljYXRpb24uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc2hhcmVkLWxpYi9zcmMvbGliL21vZHVsZXMvcmQtbm90aWZpY2F0aW9uL25vdGlmaWNhdGlvbi5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSw0QkFBNEI7QUFDNUIsT0FBTyxFQUFFLFNBQVMsRUFBZSxTQUFTLEVBQWEsTUFBTSxlQUFlLENBQUM7Ozs7O0FBUTdFLE1BQU0sY0FBYyxHQUEyQjtJQUM3QyxPQUFPLEVBQUUsU0FBUztJQUNsQixJQUFJLEVBQUUsU0FBUztJQUNmLEtBQUssRUFBRSxTQUFTO0NBQ2pCLENBQUM7QUFPRixNQUFNLE9BQU8sdUJBQXVCO0lBU2xDLFlBQ1UsbUJBQTBDLEVBQzFDLFNBQXVCO1FBRHZCLHdCQUFtQixHQUFuQixtQkFBbUIsQ0FBdUI7UUFDMUMsY0FBUyxHQUFULFNBQVMsQ0FBYztRQUp6QixrQkFBYSxHQUFHLElBQUksR0FBRyxFQUE2QixDQUFDO0lBSzFELENBQUM7SUFFSixnQkFBZ0IsQ0FBQyxJQUFXO1FBQzFCLE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUV6QyxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUMsUUFBUSxDQUNwRCxJQUFJLENBQUMsZUFBZSxFQUNwQjtZQUNFLE1BQU0sRUFBRSxJQUFJO1lBQ1osVUFBVSxFQUFFLElBQUksQ0FBQyxRQUFRLElBQUksQ0FBQyxHQUFHLElBQUk7WUFDckMsT0FBTyxFQUFFO2dCQUNQLFlBQVksRUFBRSxLQUFLO2dCQUNuQixNQUFNLEVBQUUsY0FBYyxjQUFjLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLFNBQVMsRUFBRTtnQkFDL0QsU0FBUyxFQUFFLHlDQUF5QztnQkFDcEQsT0FBTyxFQUFFLE1BQU07Z0JBQ2YsT0FBTyxFQUFFLEdBQUc7Z0JBQ1osS0FBSyxFQUFFLE9BQU87Z0JBQ2QsU0FBUyxFQUFFLE1BQU07YUFDbEI7WUFDRCxPQUFPLEVBQUUsNEJBQTRCO1lBQ3JDLFdBQVcsRUFBRSxJQUFJLENBQUMsUUFBUTtZQUMxQixLQUFLLEVBQUUsY0FBYyxFQUFFLFdBQVc7U0FDbkMsQ0FDRixDQUFDO1FBRUYsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsY0FBYyxFQUFFLFlBQVksQ0FBQyxDQUFDO1FBRXJELE9BQU87UUFDUCxVQUFVLENBQUMsR0FBRyxFQUFFO1lBQ2QsSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDNUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxRQUFRLElBQUksSUFBSSxDQUFDLENBQUM7SUFDNUIsQ0FBQztJQUVELE9BQU8sQ0FBQyxJQUFZO1FBQ2xCLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyx1QkFBdUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUN0RCxDQUFDO0lBRUQsT0FBTyxDQUFDLElBQVc7UUFDakIsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFO1lBQ3BCLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztTQUNwQjtJQUNILENBQUM7SUFFTyxVQUFVO1FBQ2hCLE9BQU8sbUJBQW1CLElBQUksQ0FBQyxHQUFHLEVBQUUsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFO2FBQ2xELFFBQVEsQ0FBQyxFQUFFLENBQUM7YUFDWixNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUM7SUFDcEIsQ0FBQztJQUVELFdBQVc7UUFDVCxTQUFTO1FBQ1QsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxZQUFZLEVBQUUsRUFBRSxFQUFFLEVBQUU7WUFDOUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUN0QyxDQUFDLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDN0IsQ0FBQzs7cUhBbkVVLHVCQUF1Qjt5R0FBdkIsdUJBQXVCLGtTQ3BCcEMsdWpEQXNEQTs0RkRsQ2EsdUJBQXVCO2tCQUxuQyxTQUFTOytCQUNFLHFCQUFxQjt1SUFNdkIsZUFBZTtzQkFEdEIsU0FBUzt1QkFBQyxpQkFBaUIsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7Z0JBSXRDLFFBQVE7c0JBRGYsU0FBUzt1QkFBQyxVQUFVLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiLy8gbm90aWZpY2F0aW9uLmNvbXBvbmVudC50c1xuaW1wb3J0IHsgQ29tcG9uZW50LCBUZW1wbGF0ZVJlZiwgVmlld0NoaWxkLCBPbkRlc3Ryb3kgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gIE56Tm90aWZpY2F0aW9uUmVmLFxuICBOek5vdGlmaWNhdGlvblNlcnZpY2UsXG59IGZyb20gJ25nLXpvcnJvLWFudGQvbm90aWZpY2F0aW9uJztcbmltcG9ydCB7IERvbVNhbml0aXplciB9IGZyb20gJ0Bhbmd1bGFyL3BsYXRmb3JtLWJyb3dzZXInO1xuaW1wb3J0IHsgSURhdGEgfSBmcm9tICcuL25vdGlmaWNhdGlvbi5zZXJ2aWNlJztcblxuY29uc3QgYm9yZGVyQ29sb3JNYXA6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gIHN1Y2Nlc3M6ICcjYmJmN2UwJyxcbiAgd2FybjogJyNmZWYwYzMnLFxuICBlcnJvcjogJyNFRjc0ODQnLFxufTtcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXBwLXJkLW5vdGlmaWNhdGlvbicsXG4gIHRlbXBsYXRlVXJsOiAnLi9ub3RpZmljYXRpb24uY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9ub3RpZmljYXRpb24uY29tcG9uZW50LnNjc3MnXSxcbn0pXG5leHBvcnQgY2xhc3MgUmROb3RpZmljYXRpb25Db21wb25lbnQgaW1wbGVtZW50cyBPbkRlc3Ryb3kge1xuICBAVmlld0NoaWxkKCdub3RpZmljYXRpb25UcGwnLCB7IHN0YXRpYzogdHJ1ZSB9KVxuICBwcml2YXRlIG5vdGlmaWNhdGlvblRwbCE6IFRlbXBsYXRlUmVmPGFueT47XG5cbiAgQFZpZXdDaGlsZCgnY2xvc2VUcGwnLCB7IHN0YXRpYzogdHJ1ZSB9KVxuICBwcml2YXRlIGNsb3NlVHBsITogVGVtcGxhdGVSZWY8YW55PjtcblxuICBwcml2YXRlIG5vdGlmaWNhdGlvbnMgPSBuZXcgTWFwPHN0cmluZywgTnpOb3RpZmljYXRpb25SZWY+KCk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBub3RpZmljYXRpb25TZXJ2aWNlOiBOek5vdGlmaWNhdGlvblNlcnZpY2UsXG4gICAgcHJpdmF0ZSBzYW5pdGl6ZXI6IERvbVNhbml0aXplclxuICApIHt9XG5cbiAgc2hvd05vdGlmaWNhdGlvbihkYXRhOiBJRGF0YSkge1xuICAgIGNvbnN0IG5vdGlmaWNhdGlvbklkID0gdGhpcy5nZW5lcmF0ZUlkKCk7XG5cbiAgICBjb25zdCBub3RpZmljYXRpb24gPSB0aGlzLm5vdGlmaWNhdGlvblNlcnZpY2UudGVtcGxhdGUoXG4gICAgICB0aGlzLm5vdGlmaWNhdGlvblRwbCxcbiAgICAgIHtcbiAgICAgICAgbnpEYXRhOiBkYXRhLFxuICAgICAgICBuekR1cmF0aW9uOiBkYXRhLmR1cmF0aW9uIHx8IDggKiAxMDAwLFxuICAgICAgICBuelN0eWxlOiB7XG4gICAgICAgICAgYm9yZGVyUmFkaXVzOiAnNHB4JyxcbiAgICAgICAgICBib3JkZXI6IGAxcHggc29saWQgICR7Ym9yZGVyQ29sb3JNYXBbZGF0YT8udHlwZV0gfHwgJyNlNWU3ZWInfWAsXG4gICAgICAgICAgYm94U2hhZG93OiAnMHB4IDhweCAxNnB4IDBweCByZ2JhKDMxLCA0MSwgNTUsIDAuMDgpJyxcbiAgICAgICAgICBkaXNwbGF5OiAnZmxleCcsXG4gICAgICAgICAgcGFkZGluZzogJzAnLFxuICAgICAgICAgIHdpZHRoOiAnMzIwcHgnLFxuICAgICAgICAgIG1hcmdpblRvcDogJy0xcHgnLFxuICAgICAgICB9LFxuICAgICAgICBuekNsYXNzOiAnY3VzdG9tLXdhbGxldC1ub3RpZmljYXRpb24nLFxuICAgICAgICBuekNsb3NlSWNvbjogdGhpcy5jbG9zZVRwbCxcbiAgICAgICAgbnpLZXk6IG5vdGlmaWNhdGlvbklkLCAvLyDmt7vliqDllK/kuIAga2V5XG4gICAgICB9XG4gICAgKTtcblxuICAgIHRoaXMubm90aWZpY2F0aW9ucy5zZXQobm90aWZpY2F0aW9uSWQsIG5vdGlmaWNhdGlvbik7XG5cbiAgICAvLyDoh6rliqjmuIXnkIZcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMubm90aWZpY2F0aW9ucy5kZWxldGUobm90aWZpY2F0aW9uSWQpO1xuICAgIH0sIGRhdGEuZHVyYXRpb24gfHwgODAwMCk7XG4gIH1cblxuICBnZXREZXNjKGRlc2M6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLnNhbml0aXplci5ieXBhc3NTZWN1cml0eVRydXN0SHRtbChkZXNjKTtcbiAgfVxuXG4gIG9uQ2xpY2soZGF0YTogSURhdGEpIHtcbiAgICBpZiAoZGF0YS5vbkxpbmtDbGljaykge1xuICAgICAgZGF0YS5vbkxpbmtDbGljaygpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2VuZXJhdGVJZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiBgcmQtbm90aWZpY2F0aW9uLSR7RGF0ZS5ub3coKX0tJHtNYXRoLnJhbmRvbSgpXG4gICAgICAudG9TdHJpbmcoMzYpXG4gICAgICAuc3Vic3RyKDIsIDkpfWA7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICAvLyDmuIXnkIbmiYDmnInpgJrnn6VcbiAgICB0aGlzLm5vdGlmaWNhdGlvbnMuZm9yRWFjaCgobm90aWZpY2F0aW9uLCBpZCkgPT4ge1xuICAgICAgdGhpcy5ub3RpZmljYXRpb25TZXJ2aWNlLnJlbW92ZShpZCk7XG4gICAgfSk7XG4gICAgdGhpcy5ub3RpZmljYXRpb25zLmNsZWFyKCk7XG4gIH1cbn1cbiIsIjxuZy10ZW1wbGF0ZSAjbm90aWZpY2F0aW9uVHBsIGxldC1kYXRhPVwiZGF0YVwiPlxuICA8ZGl2IGNsYXNzPVwicmQtY3VzdG9tLW5vdGlmaWNhdGlvblwiPjwvZGl2PlxuICA8ZGl2XG4gICAgY2xhc3M9XCJyZC1jdXN0b20tbm90aWZpY2F0aW9uLWljb25cIlxuICAgIFtjbGFzc109XCJcbiAgICAgIGRhdGEudHlwZSA9PT0gJ3dhcm4nXG4gICAgICAgID8gJ3JkLWN1c3RvbS13YXJuLWJhY2tncm91bmQnXG4gICAgICAgIDogZGF0YS50eXBlID09PSAnZXJyb3InXG4gICAgICAgID8gJ3JkLWN1c3RvbS1lcnJvci1iYWNrZ3JvdW5kJ1xuICAgICAgICA6ICcnXG4gICAgXCJcbiAgPlxuICAgIDxpbWdcbiAgICAgIFtoaWRkZW5dPVwiZGF0YS50eXBlICE9PSAnc3VjY2VzcydcIlxuICAgICAgc3JjPVwiYXNzZXRzL2ltZy9pY29uL3N1Y2Nlc3MtdGlwLnN2Z1wiXG4gICAgLz5cbiAgICA8aW1nIFtoaWRkZW5dPVwiZGF0YS50eXBlICE9PSAnd2FybidcIiBzcmM9XCJhc3NldHMvaW1nL2ljb24vd2FybS10aXAuc3ZnXCIgLz5cbiAgICA8aW1nIFtoaWRkZW5dPVwiZGF0YS50eXBlICE9PSAnZXJyb3InXCIgc3JjPVwiYXNzZXRzL2ltZy9pY29uL2Vycm9yLXRpcC5zdmdcIiAvPlxuICA8L2Rpdj5cbiAgPGRpdiBjbGFzcz1cInJkLWN1c3RvbS1ub3RpZmljYXRpb24tY29udGFpbmVyXCI+XG4gICAgPGRpdiBjbGFzcz1cInJkLWN1c3RvbS1ub3RpZmljYXRpb24tdGl0bGVcIj57eyBkYXRhLnRpdGxlIH19PC9kaXY+XG4gICAgPGRpdlxuICAgICAgY2xhc3M9XCJyZC1jdXN0b20tbm90aWZpY2F0aW9uLWRlc2NcIlxuICAgICAgW2lubmVySFRNTF09XCJnZXREZXNjKGRhdGEuZGVzYylcIlxuICAgID48L2Rpdj5cbiAgICA8ZGl2XG4gICAgICAqbmdJZj1cImRhdGEuYWN0aW9uRGVzY1wiXG4gICAgICBjbGFzcz1cInJkLWN1c3RvbS1ub3RpZmljYXRpb24tbGlua1wiXG4gICAgICAoY2xpY2spPVwib25DbGljayhkYXRhKVwiXG4gICAgPlxuICAgICAge3sgZGF0YS5hY3Rpb25EZXNjIH19XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNjbG9zZVRwbD5cbiAgPGRpdiBjbGFzcz1cInJkLWN1c3RvbS1ub3RpZmljYXRpb24tY2xvc2VcIj5cbiAgICA8c3ZnXG4gICAgICB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCJcbiAgICAgIHdpZHRoPVwiMTZcIlxuICAgICAgaGVpZ2h0PVwiMTZcIlxuICAgICAgdmlld0JveD1cIjAgMCAxNiAxNlwiXG4gICAgICBmaWxsPVwibm9uZVwiXG4gICAgPlxuICAgICAgPHBhdGhcbiAgICAgICAgZD1cIk0zLjQwMDM5IDMuMzk5OUw4LjAwMDM5IDcuOTk5OU0xMi42MDA0IDEyLjU5OTlMOC4wMDAzOSA3Ljk5OTlNOC4wMDAzOSA3Ljk5OTlMMTIuNjAwNCAzLjM5OTlMMy40MDAzOSAxMi41OTk5XCJcbiAgICAgICAgc3Ryb2tlPVwiIzAzMDcxMlwiXG4gICAgICAgIHN0cm9rZS13aWR0aD1cIjEuMzZcIlxuICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcbiAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIlxuICAgICAgLz5cbiAgICA8L3N2Zz5cbiAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuIl19
|
|
@@ -1,19 +1,40 @@
|
|
|
1
|
-
|
|
1
|
+
// notification.module.ts
|
|
2
|
+
import { NgModule, Optional, SkipSelf } from '@angular/core';
|
|
2
3
|
import { CommonModule } from '@angular/common';
|
|
4
|
+
import { NzNotificationModule } from 'ng-zorro-antd/notification';
|
|
3
5
|
import { RdNotificationComponent } from './notification.component';
|
|
4
|
-
import {
|
|
5
|
-
import { FormsModule, ReactiveFormsModule } from '@angular/forms';
|
|
6
|
+
import { RdNotificationService } from './notification.service';
|
|
6
7
|
import * as i0 from "@angular/core";
|
|
7
8
|
export class RdNotificationModule {
|
|
9
|
+
constructor(parentModule) {
|
|
10
|
+
if (parentModule) {
|
|
11
|
+
throw new Error('RdNotificationModule is already loaded. Import it in the AppModule only');
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
// 可选:提供配置方法
|
|
15
|
+
static forRoot() {
|
|
16
|
+
return {
|
|
17
|
+
ngModule: RdNotificationModule,
|
|
18
|
+
providers: [RdNotificationService],
|
|
19
|
+
};
|
|
20
|
+
}
|
|
8
21
|
}
|
|
9
|
-
RdNotificationModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: RdNotificationModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
|
|
10
|
-
RdNotificationModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "15.2.10", ngImport: i0, type: RdNotificationModule, declarations: [RdNotificationComponent], imports: [CommonModule,
|
|
11
|
-
RdNotificationModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: RdNotificationModule, imports: [CommonModule,
|
|
22
|
+
RdNotificationModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: RdNotificationModule, deps: [{ token: RdNotificationModule, optional: true, skipSelf: true }], target: i0.ɵɵFactoryTarget.NgModule });
|
|
23
|
+
RdNotificationModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "15.2.10", ngImport: i0, type: RdNotificationModule, declarations: [RdNotificationComponent], imports: [CommonModule, NzNotificationModule], exports: [RdNotificationComponent] });
|
|
24
|
+
RdNotificationModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: RdNotificationModule, imports: [CommonModule, NzNotificationModule] });
|
|
12
25
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: RdNotificationModule, decorators: [{
|
|
13
26
|
type: NgModule,
|
|
14
27
|
args: [{
|
|
28
|
+
imports: [CommonModule, NzNotificationModule],
|
|
15
29
|
declarations: [RdNotificationComponent],
|
|
16
|
-
|
|
30
|
+
exports: [RdNotificationComponent],
|
|
31
|
+
providers: [
|
|
32
|
+
// Service 已经在 @Injectable 中提供了,这里不需要重复提供
|
|
33
|
+
],
|
|
17
34
|
}]
|
|
18
|
-
}]
|
|
19
|
-
|
|
35
|
+
}], ctorParameters: function () { return [{ type: RdNotificationModule, decorators: [{
|
|
36
|
+
type: Optional
|
|
37
|
+
}, {
|
|
38
|
+
type: SkipSelf
|
|
39
|
+
}] }]; } });
|
|
40
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm90aWZpY2F0aW9uLm1vZHVsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NoYXJlZC1saWIvc3JjL2xpYi9tb2R1bGVzL3JkLW5vdGlmaWNhdGlvbi9ub3RpZmljYXRpb24ubW9kdWxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLHlCQUF5QjtBQUN6QixPQUFPLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDN0QsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBRWxFLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ25FLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLHdCQUF3QixDQUFDOztBQVUvRCxNQUFNLE9BQU8sb0JBQW9CO0lBQy9CLFlBQW9DLFlBQW1DO1FBQ3JFLElBQUksWUFBWSxFQUFFO1lBQ2hCLE1BQU0sSUFBSSxLQUFLLENBQ2IseUVBQXlFLENBQzFFLENBQUM7U0FDSDtJQUNILENBQUM7SUFFRCxZQUFZO0lBQ1osTUFBTSxDQUFDLE9BQU87UUFDWixPQUFPO1lBQ0wsUUFBUSxFQUFFLG9CQUFvQjtZQUM5QixTQUFTLEVBQUUsQ0FBQyxxQkFBcUIsQ0FBQztTQUNuQyxDQUFDO0lBQ0osQ0FBQzs7a0hBZlUsb0JBQW9CO21IQUFwQixvQkFBb0IsaUJBTmhCLHVCQUF1QixhQUQ1QixZQUFZLEVBQUUsb0JBQW9CLGFBRWxDLHVCQUF1QjttSEFLdEIsb0JBQW9CLFlBUHJCLFlBQVksRUFBRSxvQkFBb0I7NEZBT2pDLG9CQUFvQjtrQkFSaEMsUUFBUTttQkFBQztvQkFDUixPQUFPLEVBQUUsQ0FBQyxZQUFZLEVBQUUsb0JBQW9CLENBQUM7b0JBQzdDLFlBQVksRUFBRSxDQUFDLHVCQUF1QixDQUFDO29CQUN2QyxPQUFPLEVBQUUsQ0FBQyx1QkFBdUIsQ0FBQztvQkFDbEMsU0FBUyxFQUFFO29CQUNULHlDQUF5QztxQkFDMUM7aUJBQ0Y7OzBCQUVjLFFBQVE7OzBCQUFJLFFBQVEiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBub3RpZmljYXRpb24ubW9kdWxlLnRzXG5pbXBvcnQgeyBOZ01vZHVsZSwgT3B0aW9uYWwsIFNraXBTZWxmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgTnpOb3RpZmljYXRpb25Nb2R1bGUgfSBmcm9tICduZy16b3Jyby1hbnRkL25vdGlmaWNhdGlvbic7XG5cbmltcG9ydCB7IFJkTm90aWZpY2F0aW9uQ29tcG9uZW50IH0gZnJvbSAnLi9ub3RpZmljYXRpb24uY29tcG9uZW50JztcbmltcG9ydCB7IFJkTm90aWZpY2F0aW9uU2VydmljZSB9IGZyb20gJy4vbm90aWZpY2F0aW9uLnNlcnZpY2UnO1xuXG5ATmdNb2R1bGUoe1xuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBOek5vdGlmaWNhdGlvbk1vZHVsZV0sXG4gIGRlY2xhcmF0aW9uczogW1JkTm90aWZpY2F0aW9uQ29tcG9uZW50XSxcbiAgZXhwb3J0czogW1JkTm90aWZpY2F0aW9uQ29tcG9uZW50XSxcbiAgcHJvdmlkZXJzOiBbXG4gICAgLy8gU2VydmljZSDlt7Lnu4/lnKggQEluamVjdGFibGUg5Lit5o+Q5L6b5LqG77yM6L+Z6YeM5LiN6ZyA6KaB6YeN5aSN5o+Q5L6bXG4gIF0sXG59KVxuZXhwb3J0IGNsYXNzIFJkTm90aWZpY2F0aW9uTW9kdWxlIHtcbiAgY29uc3RydWN0b3IoQE9wdGlvbmFsKCkgQFNraXBTZWxmKCkgcGFyZW50TW9kdWxlPzogUmROb3RpZmljYXRpb25Nb2R1bGUpIHtcbiAgICBpZiAocGFyZW50TW9kdWxlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICdSZE5vdGlmaWNhdGlvbk1vZHVsZSBpcyBhbHJlYWR5IGxvYWRlZC4gSW1wb3J0IGl0IGluIHRoZSBBcHBNb2R1bGUgb25seSdcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLy8g5Y+v6YCJ77ya5o+Q5L6b6YWN572u5pa55rOVXG4gIHN0YXRpYyBmb3JSb290KCkge1xuICAgIHJldHVybiB7XG4gICAgICBuZ01vZHVsZTogUmROb3RpZmljYXRpb25Nb2R1bGUsXG4gICAgICBwcm92aWRlcnM6IFtSZE5vdGlmaWNhdGlvblNlcnZpY2VdLFxuICAgIH07XG4gIH1cbn1cbiJdfQ==
|
|
@@ -1,38 +1,105 @@
|
|
|
1
|
-
|
|
2
|
-
import {
|
|
1
|
+
// notification.service.ts
|
|
2
|
+
import { Injectable, } from '@angular/core';
|
|
3
|
+
import { createComponent } from '@angular/core';
|
|
3
4
|
import { RdNotificationComponent } from './notification.component';
|
|
4
5
|
import * as i0 from "@angular/core";
|
|
5
6
|
export class RdNotificationService {
|
|
6
|
-
constructor(
|
|
7
|
-
|
|
7
|
+
constructor(injector, environmentInjector // 添加 EnvironmentInjector
|
|
8
|
+
) {
|
|
8
9
|
this.injector = injector;
|
|
9
|
-
this.
|
|
10
|
+
this.environmentInjector = environmentInjector;
|
|
11
|
+
this.isCreating = false;
|
|
12
|
+
// 防止重复实例化
|
|
13
|
+
if (RdNotificationService.instance) {
|
|
14
|
+
return RdNotificationService.instance;
|
|
15
|
+
}
|
|
16
|
+
RdNotificationService.instance = this;
|
|
10
17
|
}
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
18
|
+
ensureComponentCreated() {
|
|
19
|
+
return new Promise((resolve) => {
|
|
20
|
+
if (this.notificationComponentRef) {
|
|
21
|
+
resolve();
|
|
22
|
+
return;
|
|
23
|
+
}
|
|
24
|
+
if (this.isCreating) {
|
|
25
|
+
// 如果正在创建,等待创建完成
|
|
26
|
+
const checkInterval = setInterval(() => {
|
|
27
|
+
if (this.notificationComponentRef && !this.isCreating) {
|
|
28
|
+
clearInterval(checkInterval);
|
|
29
|
+
resolve();
|
|
30
|
+
}
|
|
31
|
+
}, 10);
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
this.isCreating = true;
|
|
35
|
+
try {
|
|
36
|
+
// 使用 setTimeout 避免在 Angular 生命周期内创建组件
|
|
37
|
+
setTimeout(() => {
|
|
38
|
+
// Angular 15+ 的正确用法
|
|
39
|
+
this.notificationComponentRef = createComponent(RdNotificationComponent, {
|
|
40
|
+
environmentInjector: this.environmentInjector,
|
|
41
|
+
elementInjector: this.injector,
|
|
42
|
+
});
|
|
43
|
+
const hostView = this.notificationComponentRef
|
|
44
|
+
.hostView;
|
|
45
|
+
const rootNode = hostView.rootNodes[0];
|
|
46
|
+
if (document.body) {
|
|
47
|
+
document.body.appendChild(rootNode);
|
|
48
|
+
}
|
|
49
|
+
else {
|
|
50
|
+
// 如果 document.body 还不存在,等待 DOM 准备就绪
|
|
51
|
+
document.addEventListener('DOMContentLoaded', () => {
|
|
52
|
+
document.body.appendChild(rootNode);
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
this.notificationComponentRef.changeDetectorRef.detectChanges();
|
|
56
|
+
this.isCreating = false;
|
|
57
|
+
resolve();
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
catch (error) {
|
|
61
|
+
console.error('Failed to create notification component:', error);
|
|
62
|
+
this.isCreating = false;
|
|
63
|
+
resolve();
|
|
64
|
+
}
|
|
16
65
|
});
|
|
17
|
-
// 添加到 DOM
|
|
18
|
-
const domElem = this.notificationComponent.hostView.rootNodes[0];
|
|
19
|
-
document.body.appendChild(domElem);
|
|
20
|
-
// 添加到 ApplicationRef
|
|
21
|
-
this.applicationRef.attachView(this.notificationComponent.hostView);
|
|
22
66
|
}
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
67
|
+
async show(data) {
|
|
68
|
+
await this.ensureComponentCreated();
|
|
69
|
+
if (this.notificationComponentRef?.instance) {
|
|
70
|
+
// 使用 setTimeout 确保在下一个 Angular 周期执行
|
|
71
|
+
setTimeout(() => {
|
|
72
|
+
this.notificationComponentRef.instance.showNotification(data);
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
ngOnDestroy() {
|
|
77
|
+
if (this.notificationComponentRef) {
|
|
78
|
+
this.notificationComponentRef.destroy();
|
|
79
|
+
this.notificationComponentRef = undefined;
|
|
80
|
+
}
|
|
81
|
+
RdNotificationService.instance = null;
|
|
82
|
+
}
|
|
83
|
+
// 静态方法用于快速访问
|
|
84
|
+
static show(data) {
|
|
85
|
+
setTimeout(() => {
|
|
86
|
+
const instance = this.getInstance();
|
|
87
|
+
if (instance) {
|
|
88
|
+
instance.show(data);
|
|
89
|
+
}
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
static getInstance() {
|
|
93
|
+
return this.instance;
|
|
28
94
|
}
|
|
29
95
|
}
|
|
30
|
-
RdNotificationService
|
|
96
|
+
RdNotificationService.instance = null;
|
|
97
|
+
RdNotificationService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: RdNotificationService, deps: [{ token: i0.Injector }, { token: i0.EnvironmentInjector }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
31
98
|
RdNotificationService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: RdNotificationService, providedIn: 'root' });
|
|
32
99
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: RdNotificationService, decorators: [{
|
|
33
100
|
type: Injectable,
|
|
34
101
|
args: [{
|
|
35
102
|
providedIn: 'root',
|
|
36
103
|
}]
|
|
37
|
-
}], ctorParameters: function () { return [{ type: i0.
|
|
38
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
104
|
+
}], ctorParameters: function () { return [{ type: i0.Injector }, { type: i0.EnvironmentInjector }]; } });
|
|
105
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm90aWZpY2F0aW9uLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zaGFyZWQtbGliL3NyYy9saWIvbW9kdWxlcy9yZC1ub3RpZmljYXRpb24vbm90aWZpY2F0aW9uLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsMEJBQTBCO0FBQzFCLE9BQU8sRUFDTCxVQUFVLEdBSVgsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFnQixlQUFlLEVBQW1CLE1BQU0sZUFBZSxDQUFDO0FBQy9FLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLDBCQUEwQixDQUFDOztBQWNuRSxNQUFNLE9BQU8scUJBQXFCO0lBS2hDLFlBQ1UsUUFBa0IsRUFDbEIsbUJBQXdDLENBQUMseUJBQXlCOztRQURsRSxhQUFRLEdBQVIsUUFBUSxDQUFVO1FBQ2xCLHdCQUFtQixHQUFuQixtQkFBbUIsQ0FBcUI7UUFKMUMsZUFBVSxHQUFHLEtBQUssQ0FBQztRQU16QixVQUFVO1FBQ1YsSUFBSSxxQkFBcUIsQ0FBQyxRQUFRLEVBQUU7WUFDbEMsT0FBTyxxQkFBcUIsQ0FBQyxRQUFRLENBQUM7U0FDdkM7UUFDRCxxQkFBcUIsQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDO0lBQ3hDLENBQUM7SUFFTyxzQkFBc0I7UUFDNUIsT0FBTyxJQUFJLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFO1lBQzdCLElBQUksSUFBSSxDQUFDLHdCQUF3QixFQUFFO2dCQUNqQyxPQUFPLEVBQUUsQ0FBQztnQkFDVixPQUFPO2FBQ1I7WUFFRCxJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUU7Z0JBQ25CLGdCQUFnQjtnQkFDaEIsTUFBTSxhQUFhLEdBQUcsV0FBVyxDQUFDLEdBQUcsRUFBRTtvQkFDckMsSUFBSSxJQUFJLENBQUMsd0JBQXdCLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFO3dCQUNyRCxhQUFh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VSxFQUFFLE1BQU07aUJBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiLy8gbm90aWZpY2F0aW9uLnNlcnZpY2UudHNcbmltcG9ydCB7XG4gIEluamVjdGFibGUsXG4gIEluamVjdG9yLFxuICBPbkRlc3Ryb3ksXG4gIEVudmlyb25tZW50SW5qZWN0b3IsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29tcG9uZW50UmVmLCBjcmVhdGVDb21wb25lbnQsIEVtYmVkZGVkVmlld1JlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgUmROb3RpZmljYXRpb25Db21wb25lbnQgfSBmcm9tICcuL25vdGlmaWNhdGlvbi5jb21wb25lbnQnO1xuXG5leHBvcnQgaW50ZXJmYWNlIElEYXRhIHtcbiAgdGl0bGU/OiBzdHJpbmc7XG4gIGRlc2M/OiBzdHJpbmc7XG4gIGFjdGlvbkRlc2M/OiBzdHJpbmc7XG4gIGR1cmF0aW9uPzogbnVtYmVyO1xuICB0eXBlOiAnc3VjY2VzcycgfCAnd2FybicgfCAnZXJyb3InO1xuICBvbkxpbmtDbGljaz86ICgpID0+IHZvaWQ7XG59XG5cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxufSlcbmV4cG9ydCBjbGFzcyBSZE5vdGlmaWNhdGlvblNlcnZpY2UgaW1wbGVtZW50cyBPbkRlc3Ryb3kge1xuICBwcml2YXRlIHN0YXRpYyBpbnN0YW5jZTogUmROb3RpZmljYXRpb25TZXJ2aWNlIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgbm90aWZpY2F0aW9uQ29tcG9uZW50UmVmPzogQ29tcG9uZW50UmVmPFJkTm90aWZpY2F0aW9uQ29tcG9uZW50PjtcbiAgcHJpdmF0ZSBpc0NyZWF0aW5nID0gZmFsc2U7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBpbmplY3RvcjogSW5qZWN0b3IsXG4gICAgcHJpdmF0ZSBlbnZpcm9ubWVudEluamVjdG9yOiBFbnZpcm9ubWVudEluamVjdG9yIC8vIOa3u+WKoCBFbnZpcm9ubWVudEluamVjdG9yXG4gICkge1xuICAgIC8vIOmYsuatoumHjeWkjeWunuS+i+WMllxuICAgIGlmIChSZE5vdGlmaWNhdGlvblNlcnZpY2UuaW5zdGFuY2UpIHtcbiAgICAgIHJldHVybiBSZE5vdGlmaWNhdGlvblNlcnZpY2UuaW5zdGFuY2U7XG4gICAgfVxuICAgIFJkTm90aWZpY2F0aW9uU2VydmljZS5pbnN0YW5jZSA9IHRoaXM7XG4gIH1cblxuICBwcml2YXRlIGVuc3VyZUNvbXBvbmVudENyZWF0ZWQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICBpZiAodGhpcy5ub3RpZmljYXRpb25Db21wb25lbnRSZWYpIHtcbiAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLmlzQ3JlYXRpbmcpIHtcbiAgICAgICAgLy8g5aaC5p6c5q2j5Zyo5Yib5bu677yM562J5b6F5Yib5bu65a6M5oiQXG4gICAgICAgIGNvbnN0IGNoZWNrSW50ZXJ2YWwgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgICAgICAgaWYgKHRoaXMubm90aWZpY2F0aW9uQ29tcG9uZW50UmVmICYmICF0aGlzLmlzQ3JlYXRpbmcpIHtcbiAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwoY2hlY2tJbnRlcnZhbCk7XG4gICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9LCAxMCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdGhpcy5pc0NyZWF0aW5nID0gdHJ1ZTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgLy8g5L2/55SoIHNldFRpbWVvdXQg6YG/5YWN5ZyoIEFuZ3VsYXIg55Sf5ZG95ZGo5pyf5YaF5Yib5bu657uE5Lu2XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIC8vIEFuZ3VsYXIgMTUrIOeahOato+ehrueUqOazlVxuICAgICAgICAgIHRoaXMubm90aWZpY2F0aW9uQ29tcG9uZW50UmVmID0gY3JlYXRlQ29tcG9uZW50KFxuICAgICAgICAgICAgUmROb3RpZmljYXRpb25Db21wb25lbnQsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGVudmlyb25tZW50SW5qZWN0b3I6IHRoaXMuZW52aXJvbm1lbnRJbmplY3RvciwgLy8g5b+F6ZyA5Y+C5pWwXG4gICAgICAgICAgICAgIGVsZW1lbnRJbmplY3RvcjogdGhpcy5pbmplY3RvcixcbiAgICAgICAgICAgIH1cbiAgICAgICAgICApO1xuXG4gICAgICAgICAgY29uc3QgaG9zdFZpZXcgPSB0aGlzLm5vdGlmaWNhdGlvbkNvbXBvbmVudFJlZlxuICAgICAgICAgICAgLmhvc3RWaWV3IGFzIEVtYmVkZGVkVmlld1JlZjxhbnk+O1xuICAgICAgICAgIGNvbnN0IHJvb3ROb2RlID0gaG9zdFZpZXcucm9vdE5vZGVzWzBdO1xuXG4gICAgICAgICAgaWYgKGRvY3VtZW50LmJvZHkpIHtcbiAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQocm9vdE5vZGUpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyDlpoLmnpwgZG9jdW1lbnQuYm9keSDov5jkuI3lrZjlnKjvvIznrYnlvoUgRE9NIOWHhuWkh+Wwsee7qlxuICAgICAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignRE9NQ29udGVudExvYWRlZCcsICgpID0+IHtcbiAgICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChyb290Tm9kZSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB0aGlzLm5vdGlmaWNhdGlvbkNvbXBvbmVudFJlZi5jaGFuZ2VEZXRlY3RvclJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgICAgdGhpcy5pc0NyZWF0aW5nID0gZmFsc2U7XG4gICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICB9KTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ0ZhaWxlZCB0byBjcmVhdGUgbm90aWZpY2F0aW9uIGNvbXBvbmVudDonLCBlcnJvcik7XG4gICAgICAgIHRoaXMuaXNDcmVhdGluZyA9IGZhbHNlO1xuICAgICAgICByZXNvbHZlKCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBhc3luYyBzaG93KGRhdGE6IElEYXRhKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5lbnN1cmVDb21wb25lbnRDcmVhdGVkKCk7XG5cbiAgICBpZiAodGhpcy5ub3RpZmljYXRpb25Db21wb25lbnRSZWY/Lmluc3RhbmNlKSB7XG4gICAgICAvLyDkvb/nlKggc2V0VGltZW91dCDnoa7kv53lnKjkuIvkuIDkuKogQW5ndWxhciDlkajmnJ/miafooYxcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aGlzLm5vdGlmaWNhdGlvbkNvbXBvbmVudFJlZiEuaW5zdGFuY2Uuc2hvd05vdGlmaWNhdGlvbihkYXRhKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLm5vdGlmaWNhdGlvbkNvbXBvbmVudFJlZikge1xuICAgICAgdGhpcy5ub3RpZmljYXRpb25Db21wb25lbnRSZWYuZGVzdHJveSgpO1xuICAgICAgdGhpcy5ub3RpZmljYXRpb25Db21wb25lbnRSZWYgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIFJkTm90aWZpY2F0aW9uU2VydmljZS5pbnN0YW5jZSA9IG51bGw7XG4gIH1cblxuICAvLyDpnZnmgIHmlrnms5XnlKjkuo7lv6vpgJ/orr/pl65cbiAgc3RhdGljIHNob3coZGF0YTogSURhdGEpOiB2b2lkIHtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGNvbnN0IGluc3RhbmNlID0gdGhpcy5nZXRJbnN0YW5jZSgpO1xuICAgICAgaWYgKGluc3RhbmNlKSB7XG4gICAgICAgIGluc3RhbmNlLnNob3coZGF0YSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBnZXRJbnN0YW5jZSgpOiBSZE5vdGlmaWNhdGlvblNlcnZpY2UgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5pbnN0YW5jZTtcbiAgfVxufVxuIl19
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import * as i0 from '@angular/core';
|
|
2
|
-
import { EventEmitter, forwardRef, Component, Input, Output, NgModule, ViewChild, createComponent, Injectable, Pipe } from '@angular/core';
|
|
2
|
+
import { EventEmitter, forwardRef, Component, Input, Output, NgModule, ViewChild, createComponent, Injectable, Optional, SkipSelf, Pipe } from '@angular/core';
|
|
3
3
|
import * as i2 from '@angular/forms';
|
|
4
4
|
import { NG_VALUE_ACCESSOR, ReactiveFormsModule, FormsModule, NG_VALIDATORS } from '@angular/forms';
|
|
5
5
|
import * as i1 from '@angular/common';
|
|
@@ -25,15 +25,15 @@ import * as i2$2 from 'ng-zorro-antd/button';
|
|
|
25
25
|
import { NzButtonModule } from 'ng-zorro-antd/button';
|
|
26
26
|
import * as i2$1 from 'ng-zorro-antd/core/transition-patch';
|
|
27
27
|
import { differenceInCalendarDays } from 'date-fns';
|
|
28
|
-
import { __decorate } from 'tslib';
|
|
28
|
+
import { __decorate, __awaiter } from 'tslib';
|
|
29
29
|
import { NzDropDownModule } from 'ng-zorro-antd/dropdown';
|
|
30
30
|
import * as i4$2 from 'ng-zorro-antd/pagination';
|
|
31
31
|
import { NzPaginationModule } from 'ng-zorro-antd/pagination';
|
|
32
32
|
import * as i5 from 'ng-zorro-antd/grid';
|
|
33
33
|
import { NzGridModule } from 'ng-zorro-antd/grid';
|
|
34
34
|
import * as i1$1 from 'ng-zorro-antd/notification';
|
|
35
|
+
import { NzNotificationModule } from 'ng-zorro-antd/notification';
|
|
35
36
|
import * as i2$3 from '@angular/platform-browser';
|
|
36
|
-
import { RouterModule } from '@angular/router';
|
|
37
37
|
import { Subject, isObservable, of } from 'rxjs';
|
|
38
38
|
import { debounceTime, filter, switchMap } from 'rxjs/operators';
|
|
39
39
|
|
|
@@ -1806,6 +1806,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImpo
|
|
|
1806
1806
|
}]
|
|
1807
1807
|
}] });
|
|
1808
1808
|
|
|
1809
|
+
// notification.component.ts
|
|
1809
1810
|
const borderColorMap = {
|
|
1810
1811
|
success: '#bbf7e0',
|
|
1811
1812
|
warn: '#fef0c3',
|
|
@@ -1815,14 +1816,16 @@ class RdNotificationComponent {
|
|
|
1815
1816
|
constructor(notificationService, sanitizer) {
|
|
1816
1817
|
this.notificationService = notificationService;
|
|
1817
1818
|
this.sanitizer = sanitizer;
|
|
1819
|
+
this.notifications = new Map();
|
|
1818
1820
|
}
|
|
1819
1821
|
showNotification(data) {
|
|
1820
|
-
|
|
1822
|
+
const notificationId = this.generateId();
|
|
1823
|
+
const notification = this.notificationService.template(this.notificationTpl, {
|
|
1821
1824
|
nzData: data,
|
|
1822
1825
|
nzDuration: data.duration || 8 * 1000,
|
|
1823
1826
|
nzStyle: {
|
|
1824
1827
|
borderRadius: '4px',
|
|
1825
|
-
border: `1px solid ${borderColorMap[data === null || data === void 0 ? void 0 : data.type]}`,
|
|
1828
|
+
border: `1px solid ${borderColorMap[data === null || data === void 0 ? void 0 : data.type] || '#e5e7eb'}`,
|
|
1826
1829
|
boxShadow: '0px 8px 16px 0px rgba(31, 41, 55, 0.08)',
|
|
1827
1830
|
display: 'flex',
|
|
1828
1831
|
padding: '0',
|
|
@@ -1831,21 +1834,34 @@ class RdNotificationComponent {
|
|
|
1831
1834
|
},
|
|
1832
1835
|
nzClass: 'custom-wallet-notification',
|
|
1833
1836
|
nzCloseIcon: this.closeTpl,
|
|
1837
|
+
nzKey: notificationId, // 添加唯一 key
|
|
1834
1838
|
});
|
|
1839
|
+
this.notifications.set(notificationId, notification);
|
|
1840
|
+
// 自动清理
|
|
1841
|
+
setTimeout(() => {
|
|
1842
|
+
this.notifications.delete(notificationId);
|
|
1843
|
+
}, data.duration || 8000);
|
|
1835
1844
|
}
|
|
1836
1845
|
getDesc(desc) {
|
|
1837
1846
|
return this.sanitizer.bypassSecurityTrustHtml(desc);
|
|
1838
1847
|
}
|
|
1839
1848
|
onClick(data) {
|
|
1840
|
-
var _a, _b;
|
|
1841
|
-
if ((_a = this.notification) === null || _a === void 0 ? void 0 : _a.messageId) {
|
|
1842
|
-
this.notificationService.remove((_b = this.notification) === null || _b === void 0 ? void 0 : _b.messageId);
|
|
1843
|
-
}
|
|
1844
1849
|
if (data.onLinkClick) {
|
|
1845
|
-
// 明确检查存在性
|
|
1846
1850
|
data.onLinkClick();
|
|
1847
1851
|
}
|
|
1848
1852
|
}
|
|
1853
|
+
generateId() {
|
|
1854
|
+
return `rd-notification-${Date.now()}-${Math.random()
|
|
1855
|
+
.toString(36)
|
|
1856
|
+
.substr(2, 9)}`;
|
|
1857
|
+
}
|
|
1858
|
+
ngOnDestroy() {
|
|
1859
|
+
// 清理所有通知
|
|
1860
|
+
this.notifications.forEach((notification, id) => {
|
|
1861
|
+
this.notificationService.remove(id);
|
|
1862
|
+
});
|
|
1863
|
+
this.notifications.clear();
|
|
1864
|
+
}
|
|
1849
1865
|
}
|
|
1850
1866
|
RdNotificationComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: RdNotificationComponent, deps: [{ token: i1$1.NzNotificationService }, { token: i2$3.DomSanitizer }], target: i0.ɵɵFactoryTarget.Component });
|
|
1851
1867
|
RdNotificationComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: RdNotificationComponent, selector: "app-rd-notification", viewQueries: [{ propertyName: "notificationTpl", first: true, predicate: ["notificationTpl"], descendants: true, static: true }, { propertyName: "closeTpl", first: true, predicate: ["closeTpl"], descendants: true, static: true }], ngImport: i0, template: "<ng-template #notificationTpl let-data=\"data\">\n <div class=\"rd-custom-notification\"></div>\n <div\n class=\"rd-custom-notification-icon\"\n [class]=\"\n data.type === 'warn'\n ? 'rd-custom-warn-background'\n : data.type === 'error'\n ? 'rd-custom-error-background'\n : ''\n \"\n >\n <img\n [hidden]=\"data.type !== 'success'\"\n src=\"assets/img/icon/success-tip.svg\"\n />\n <img [hidden]=\"data.type !== 'warn'\" src=\"assets/img/icon/warm-tip.svg\" />\n <img [hidden]=\"data.type !== 'error'\" src=\"assets/img/icon/error-tip.svg\" />\n </div>\n <div class=\"rd-custom-notification-container\">\n <div class=\"rd-custom-notification-title\">{{ data.title }}</div>\n <div\n class=\"rd-custom-notification-desc\"\n [innerHTML]=\"getDesc(data.desc)\"\n ></div>\n <div\n *ngIf=\"data.actionDesc\"\n class=\"rd-custom-notification-link\"\n (click)=\"onClick(data)\"\n >\n {{ data.actionDesc }}\n </div>\n </div>\n</ng-template>\n\n<ng-template #closeTpl>\n <div class=\"rd-custom-notification-close\">\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n >\n <path\n d=\"M3.40039 3.3999L8.00039 7.9999M12.6004 12.5999L8.00039 7.9999M8.00039 7.9999L12.6004 3.3999L3.40039 12.5999\"\n stroke=\"#030712\"\n stroke-width=\"1.36\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n </svg>\n </div>\n</ng-template>\n", styles: [".rd-custom-notification-container{padding:12px 40px 12px 12px}.rd-custom-notification-container .rd-custom-notification-title{font-size:12px;font-weight:600}.rd-custom-notification-container .rd-custom-notification-desc{font-size:12px;font-weight:500;margin-top:4px}.rd-custom-notification-container .rd-custom-notification-link{color:#367af6;font-size:13px;font-style:normal;font-weight:600;line-height:16px;cursor:pointer;margin-top:12px;padding:0 2px}.rd-custom-warn-background{background-color:#fef0c3!important}.rd-custom-error-background{background-color:#fce8eb!important}.rd-custom-notification-icon{display:flex;width:40px;padding:16px 12px;justify-content:center;align-items:center;flex-shrink:0;align-self:stretch;background-color:#dcfcf0}.rd-custom-notification-icon svg{flex-shrink:0;width:20px;height:20px}.rd-custom-notification-close{padding:16px 12px}.rd-custom-notification-close svg{width:16px}\n"], dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] });
|
|
@@ -1860,53 +1876,144 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImpo
|
|
|
1860
1876
|
args: ['closeTpl', { static: true }]
|
|
1861
1877
|
}] } });
|
|
1862
1878
|
|
|
1863
|
-
class RdNotificationModule {
|
|
1864
|
-
}
|
|
1865
|
-
RdNotificationModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: RdNotificationModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
|
|
1866
|
-
RdNotificationModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "15.2.10", ngImport: i0, type: RdNotificationModule, declarations: [RdNotificationComponent], imports: [CommonModule, RouterModule, FormsModule, ReactiveFormsModule] });
|
|
1867
|
-
RdNotificationModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: RdNotificationModule, imports: [CommonModule, RouterModule, FormsModule, ReactiveFormsModule] });
|
|
1868
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: RdNotificationModule, decorators: [{
|
|
1869
|
-
type: NgModule,
|
|
1870
|
-
args: [{
|
|
1871
|
-
declarations: [RdNotificationComponent],
|
|
1872
|
-
imports: [CommonModule, RouterModule, FormsModule, ReactiveFormsModule],
|
|
1873
|
-
}]
|
|
1874
|
-
}] });
|
|
1875
|
-
|
|
1876
1879
|
class RdNotificationService {
|
|
1877
|
-
constructor(
|
|
1878
|
-
|
|
1880
|
+
constructor(injector, environmentInjector // 添加 EnvironmentInjector
|
|
1881
|
+
) {
|
|
1879
1882
|
this.injector = injector;
|
|
1880
|
-
this.
|
|
1883
|
+
this.environmentInjector = environmentInjector;
|
|
1884
|
+
this.isCreating = false;
|
|
1885
|
+
// 防止重复实例化
|
|
1886
|
+
if (RdNotificationService.instance) {
|
|
1887
|
+
return RdNotificationService.instance;
|
|
1888
|
+
}
|
|
1889
|
+
RdNotificationService.instance = this;
|
|
1881
1890
|
}
|
|
1882
|
-
|
|
1883
|
-
|
|
1884
|
-
|
|
1885
|
-
|
|
1886
|
-
|
|
1891
|
+
ensureComponentCreated() {
|
|
1892
|
+
return new Promise((resolve) => {
|
|
1893
|
+
if (this.notificationComponentRef) {
|
|
1894
|
+
resolve();
|
|
1895
|
+
return;
|
|
1896
|
+
}
|
|
1897
|
+
if (this.isCreating) {
|
|
1898
|
+
// 如果正在创建,等待创建完成
|
|
1899
|
+
const checkInterval = setInterval(() => {
|
|
1900
|
+
if (this.notificationComponentRef && !this.isCreating) {
|
|
1901
|
+
clearInterval(checkInterval);
|
|
1902
|
+
resolve();
|
|
1903
|
+
}
|
|
1904
|
+
}, 10);
|
|
1905
|
+
return;
|
|
1906
|
+
}
|
|
1907
|
+
this.isCreating = true;
|
|
1908
|
+
try {
|
|
1909
|
+
// 使用 setTimeout 避免在 Angular 生命周期内创建组件
|
|
1910
|
+
setTimeout(() => {
|
|
1911
|
+
// Angular 15+ 的正确用法
|
|
1912
|
+
this.notificationComponentRef = createComponent(RdNotificationComponent, {
|
|
1913
|
+
environmentInjector: this.environmentInjector,
|
|
1914
|
+
elementInjector: this.injector,
|
|
1915
|
+
});
|
|
1916
|
+
const hostView = this.notificationComponentRef
|
|
1917
|
+
.hostView;
|
|
1918
|
+
const rootNode = hostView.rootNodes[0];
|
|
1919
|
+
if (document.body) {
|
|
1920
|
+
document.body.appendChild(rootNode);
|
|
1921
|
+
}
|
|
1922
|
+
else {
|
|
1923
|
+
// 如果 document.body 还不存在,等待 DOM 准备就绪
|
|
1924
|
+
document.addEventListener('DOMContentLoaded', () => {
|
|
1925
|
+
document.body.appendChild(rootNode);
|
|
1926
|
+
});
|
|
1927
|
+
}
|
|
1928
|
+
this.notificationComponentRef.changeDetectorRef.detectChanges();
|
|
1929
|
+
this.isCreating = false;
|
|
1930
|
+
resolve();
|
|
1931
|
+
});
|
|
1932
|
+
}
|
|
1933
|
+
catch (error) {
|
|
1934
|
+
console.error('Failed to create notification component:', error);
|
|
1935
|
+
this.isCreating = false;
|
|
1936
|
+
resolve();
|
|
1937
|
+
}
|
|
1887
1938
|
});
|
|
1888
|
-
|
|
1889
|
-
const domElem = this.notificationComponent.hostView.rootNodes[0];
|
|
1890
|
-
document.body.appendChild(domElem);
|
|
1891
|
-
// 添加到 ApplicationRef
|
|
1892
|
-
this.applicationRef.attachView(this.notificationComponent.hostView);
|
|
1893
|
-
}
|
|
1894
|
-
/**
|
|
1895
|
-
* 显示通知
|
|
1896
|
-
*/
|
|
1939
|
+
}
|
|
1897
1940
|
show(data) {
|
|
1898
1941
|
var _a;
|
|
1899
|
-
(
|
|
1942
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
1943
|
+
yield this.ensureComponentCreated();
|
|
1944
|
+
if ((_a = this.notificationComponentRef) === null || _a === void 0 ? void 0 : _a.instance) {
|
|
1945
|
+
// 使用 setTimeout 确保在下一个 Angular 周期执行
|
|
1946
|
+
setTimeout(() => {
|
|
1947
|
+
this.notificationComponentRef.instance.showNotification(data);
|
|
1948
|
+
});
|
|
1949
|
+
}
|
|
1950
|
+
});
|
|
1951
|
+
}
|
|
1952
|
+
ngOnDestroy() {
|
|
1953
|
+
if (this.notificationComponentRef) {
|
|
1954
|
+
this.notificationComponentRef.destroy();
|
|
1955
|
+
this.notificationComponentRef = undefined;
|
|
1956
|
+
}
|
|
1957
|
+
RdNotificationService.instance = null;
|
|
1958
|
+
}
|
|
1959
|
+
// 静态方法用于快速访问
|
|
1960
|
+
static show(data) {
|
|
1961
|
+
setTimeout(() => {
|
|
1962
|
+
const instance = this.getInstance();
|
|
1963
|
+
if (instance) {
|
|
1964
|
+
instance.show(data);
|
|
1965
|
+
}
|
|
1966
|
+
});
|
|
1967
|
+
}
|
|
1968
|
+
static getInstance() {
|
|
1969
|
+
return this.instance;
|
|
1900
1970
|
}
|
|
1901
1971
|
}
|
|
1902
|
-
RdNotificationService
|
|
1972
|
+
RdNotificationService.instance = null;
|
|
1973
|
+
RdNotificationService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: RdNotificationService, deps: [{ token: i0.Injector }, { token: i0.EnvironmentInjector }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
1903
1974
|
RdNotificationService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: RdNotificationService, providedIn: 'root' });
|
|
1904
1975
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: RdNotificationService, decorators: [{
|
|
1905
1976
|
type: Injectable,
|
|
1906
1977
|
args: [{
|
|
1907
1978
|
providedIn: 'root',
|
|
1908
1979
|
}]
|
|
1909
|
-
}], ctorParameters: function () { return [{ type: i0.
|
|
1980
|
+
}], ctorParameters: function () { return [{ type: i0.Injector }, { type: i0.EnvironmentInjector }]; } });
|
|
1981
|
+
|
|
1982
|
+
// notification.module.ts
|
|
1983
|
+
class RdNotificationModule {
|
|
1984
|
+
constructor(parentModule) {
|
|
1985
|
+
if (parentModule) {
|
|
1986
|
+
throw new Error('RdNotificationModule is already loaded. Import it in the AppModule only');
|
|
1987
|
+
}
|
|
1988
|
+
}
|
|
1989
|
+
// 可选:提供配置方法
|
|
1990
|
+
static forRoot() {
|
|
1991
|
+
return {
|
|
1992
|
+
ngModule: RdNotificationModule,
|
|
1993
|
+
providers: [RdNotificationService],
|
|
1994
|
+
};
|
|
1995
|
+
}
|
|
1996
|
+
}
|
|
1997
|
+
RdNotificationModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: RdNotificationModule, deps: [{ token: RdNotificationModule, optional: true, skipSelf: true }], target: i0.ɵɵFactoryTarget.NgModule });
|
|
1998
|
+
RdNotificationModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "15.2.10", ngImport: i0, type: RdNotificationModule, declarations: [RdNotificationComponent], imports: [CommonModule, NzNotificationModule], exports: [RdNotificationComponent] });
|
|
1999
|
+
RdNotificationModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: RdNotificationModule, imports: [CommonModule, NzNotificationModule] });
|
|
2000
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: RdNotificationModule, decorators: [{
|
|
2001
|
+
type: NgModule,
|
|
2002
|
+
args: [{
|
|
2003
|
+
imports: [CommonModule, NzNotificationModule],
|
|
2004
|
+
declarations: [RdNotificationComponent],
|
|
2005
|
+
exports: [RdNotificationComponent],
|
|
2006
|
+
providers: [
|
|
2007
|
+
// Service 已经在 @Injectable 中提供了,这里不需要重复提供
|
|
2008
|
+
],
|
|
2009
|
+
}]
|
|
2010
|
+
}], ctorParameters: function () {
|
|
2011
|
+
return [{ type: RdNotificationModule, decorators: [{
|
|
2012
|
+
type: Optional
|
|
2013
|
+
}, {
|
|
2014
|
+
type: SkipSelf
|
|
2015
|
+
}] }];
|
|
2016
|
+
} });
|
|
1910
2017
|
|
|
1911
2018
|
class SearchListBaseComponent {
|
|
1912
2019
|
constructor(searchStorageKey = '', isOutDatePicker = false) {
|