@ng-nest/ui 20.3.0 → 20.3.2

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.
Files changed (106) hide show
  1. package/attachments/index.d.ts +4 -5
  2. package/auto-complete/index.d.ts +52 -15
  3. package/base-form/index.d.ts +8 -9
  4. package/bubble/index.d.ts +12 -7
  5. package/cascade/index.d.ts +8 -9
  6. package/checkbox/index.d.ts +5 -6
  7. package/color-picker/index.d.ts +8 -9
  8. package/contextmenu/index.d.ts +176 -0
  9. package/core/index.d.ts +37 -1
  10. package/coversations/index.d.ts +4 -5
  11. package/date-picker/index.d.ts +16 -18
  12. package/dialog/index.d.ts +182 -102
  13. package/divider/index.d.ts +113 -0
  14. package/fesm2022/ng-nest-ui-auto-complete.mjs +65 -17
  15. package/fesm2022/ng-nest-ui-auto-complete.mjs.map +1 -1
  16. package/fesm2022/ng-nest-ui-base-form.mjs +27 -46
  17. package/fesm2022/ng-nest-ui-base-form.mjs.map +1 -1
  18. package/fesm2022/ng-nest-ui-bubble.mjs +141 -129
  19. package/fesm2022/ng-nest-ui-bubble.mjs.map +1 -1
  20. package/fesm2022/ng-nest-ui-cascade.mjs +1 -1
  21. package/fesm2022/ng-nest-ui-cascade.mjs.map +1 -1
  22. package/fesm2022/ng-nest-ui-color-picker.mjs +3 -3
  23. package/fesm2022/ng-nest-ui-color-picker.mjs.map +1 -1
  24. package/fesm2022/ng-nest-ui-contextmenu.mjs +445 -0
  25. package/fesm2022/ng-nest-ui-contextmenu.mjs.map +1 -0
  26. package/fesm2022/ng-nest-ui-core.mjs +2 -2
  27. package/fesm2022/ng-nest-ui-core.mjs.map +1 -1
  28. package/fesm2022/ng-nest-ui-date-picker.mjs +2 -2
  29. package/fesm2022/ng-nest-ui-date-picker.mjs.map +1 -1
  30. package/fesm2022/ng-nest-ui-dialog.mjs +51 -46
  31. package/fesm2022/ng-nest-ui-dialog.mjs.map +1 -1
  32. package/fesm2022/ng-nest-ui-divider.mjs +124 -0
  33. package/fesm2022/ng-nest-ui-divider.mjs.map +1 -0
  34. package/fesm2022/ng-nest-ui-find.mjs.map +1 -1
  35. package/fesm2022/ng-nest-ui-form.mjs +26 -20
  36. package/fesm2022/ng-nest-ui-form.mjs.map +1 -1
  37. package/fesm2022/ng-nest-ui-i18n.mjs +19 -18
  38. package/fesm2022/ng-nest-ui-i18n.mjs.map +1 -1
  39. package/fesm2022/ng-nest-ui-image.mjs +108 -69
  40. package/fesm2022/ng-nest-ui-image.mjs.map +1 -1
  41. package/fesm2022/ng-nest-ui-input-number.mjs +1 -1
  42. package/fesm2022/ng-nest-ui-input-number.mjs.map +1 -1
  43. package/fesm2022/ng-nest-ui-input.mjs +1 -1
  44. package/fesm2022/ng-nest-ui-input.mjs.map +1 -1
  45. package/fesm2022/ng-nest-ui-menu.mjs +16 -4
  46. package/fesm2022/ng-nest-ui-menu.mjs.map +1 -1
  47. package/fesm2022/ng-nest-ui-message-box.mjs.map +1 -1
  48. package/fesm2022/ng-nest-ui-message.mjs.map +1 -1
  49. package/fesm2022/ng-nest-ui-notification.mjs.map +1 -1
  50. package/fesm2022/ng-nest-ui-scrollable.mjs +81 -9
  51. package/fesm2022/ng-nest-ui-scrollable.mjs.map +1 -1
  52. package/fesm2022/ng-nest-ui-select.mjs +1 -1
  53. package/fesm2022/ng-nest-ui-select.mjs.map +1 -1
  54. package/fesm2022/ng-nest-ui-sender.mjs +1 -1
  55. package/fesm2022/ng-nest-ui-sender.mjs.map +1 -1
  56. package/fesm2022/ng-nest-ui-slider-select.mjs +0 -1
  57. package/fesm2022/ng-nest-ui-slider-select.mjs.map +1 -1
  58. package/fesm2022/ng-nest-ui-splitter.mjs +407 -0
  59. package/fesm2022/ng-nest-ui-splitter.mjs.map +1 -0
  60. package/fesm2022/ng-nest-ui-table-view.mjs +277 -248
  61. package/fesm2022/ng-nest-ui-table-view.mjs.map +1 -1
  62. package/fesm2022/ng-nest-ui-table.mjs +18 -6
  63. package/fesm2022/ng-nest-ui-table.mjs.map +1 -1
  64. package/fesm2022/ng-nest-ui-textarea.mjs +1 -1
  65. package/fesm2022/ng-nest-ui-textarea.mjs.map +1 -1
  66. package/fesm2022/ng-nest-ui-time-picker.mjs +40 -21
  67. package/fesm2022/ng-nest-ui-time-picker.mjs.map +1 -1
  68. package/fesm2022/ng-nest-ui-tree-select.mjs +1 -1
  69. package/fesm2022/ng-nest-ui-tree-select.mjs.map +1 -1
  70. package/fesm2022/ng-nest-ui-tree.mjs +16 -4
  71. package/fesm2022/ng-nest-ui-tree.mjs.map +1 -1
  72. package/fesm2022/ng-nest-ui-watermark.mjs +378 -0
  73. package/fesm2022/ng-nest-ui-watermark.mjs.map +1 -0
  74. package/fesm2022/ng-nest-ui.mjs +4 -0
  75. package/fesm2022/ng-nest-ui.mjs.map +1 -1
  76. package/find/index.d.ts +6 -7
  77. package/form/index.d.ts +24 -13
  78. package/i18n/index.d.ts +29 -28
  79. package/image/index.d.ts +30 -14
  80. package/index.d.ts +4 -0
  81. package/input/index.d.ts +8 -9
  82. package/input-number/index.d.ts +8 -9
  83. package/list/index.d.ts +4 -5
  84. package/menu/index.d.ts +15 -3
  85. package/message/index.d.ts +15 -3
  86. package/message-box/index.d.ts +18 -5
  87. package/notification/index.d.ts +15 -3
  88. package/package.json +91 -75
  89. package/radio/index.d.ts +5 -6
  90. package/rate/index.d.ts +4 -5
  91. package/scrollable/index.d.ts +14 -2
  92. package/select/index.d.ts +8 -9
  93. package/sender/index.d.ts +6 -7
  94. package/slider-select/index.d.ts +4 -6
  95. package/splitter/index.d.ts +163 -0
  96. package/switch/index.d.ts +4 -5
  97. package/table/index.d.ts +60 -5
  98. package/table-view/index.d.ts +99 -65
  99. package/textarea/index.d.ts +8 -9
  100. package/theme/index.d.ts +4 -5
  101. package/time-picker/index.d.ts +15 -14
  102. package/transfer/index.d.ts +4 -5
  103. package/tree/index.d.ts +29 -3
  104. package/tree-select/index.d.ts +8 -9
  105. package/upload/index.d.ts +4 -5
  106. package/watermark/index.d.ts +267 -0
@@ -0,0 +1,445 @@
1
+ import * as i0 from '@angular/core';
2
+ import { input, output, Component, viewChild, signal, inject, DestroyRef, ViewContainerRef, effect, HostBinding, ChangeDetectionStrategy, ViewEncapsulation, computed, ElementRef, HostListener, NgModule } from '@angular/core';
3
+ import { XPropertyFunction, XToDataArray, XToBoolean, XToCssPixelValue, XIsEmpty, XGetChildren, XHasChildren } from '@ng-nest/ui/core';
4
+ import { Subject } from 'rxjs';
5
+ import { XPortalService } from '@ng-nest/ui/portal';
6
+ import { XListComponent } from '@ng-nest/ui/list';
7
+ import { FormsModule } from '@angular/forms';
8
+ import { Overlay } from '@angular/cdk/overlay';
9
+ import { RIGHT_ARROW, LEFT_ARROW } from '@angular/cdk/keycodes';
10
+ import { takeUntil } from 'rxjs/operators';
11
+
12
+ /**
13
+ * Contextmenu
14
+ * @selector x-contextmenu
15
+ * @decorator component
16
+ */
17
+ const XContextmenuPrefix = 'x-contextmenu';
18
+ const X_CONTEXTMENU_CONFIG_NAME = 'contextmenu';
19
+ /**
20
+ * Contextmenu Property
21
+ */
22
+ class XContextmenuProperty extends XPropertyFunction(X_CONTEXTMENU_CONFIG_NAME) {
23
+ constructor() {
24
+ super(...arguments);
25
+ /**
26
+ * @zh_CN 触发目标元素
27
+ * @en_US Trigger target element
28
+ */
29
+ this.target = input(...(ngDevMode ? [undefined, { debugName: "target" }] : []));
30
+ /**
31
+ * @zh_CN 节点数据
32
+ * @en_US Node data
33
+ */
34
+ this.data = input([], ...(ngDevMode ? [{ debugName: "data", transform: XToDataArray }] : [{ transform: XToDataArray }]));
35
+ /**
36
+ * @zh_CN 禁用
37
+ * @en_US Disabled
38
+ */
39
+ this.disabled = input(false, ...(ngDevMode ? [{ debugName: "disabled", transform: XToBoolean }] : [{ transform: XToBoolean }]));
40
+ /**
41
+ * @zh_CN 节点中已经包含子节点数据
42
+ * @en_US The node already contains child node data
43
+ */
44
+ this.children = input(false, ...(ngDevMode ? [{ debugName: "children", transform: XToBoolean }] : [{ transform: XToBoolean }]));
45
+ /**
46
+ * @zh_CN 展示位置
47
+ * @en_US Placement
48
+ */
49
+ this.placement = input(this.config?.placement ?? 'bottom-start', ...(ngDevMode ? [{ debugName: "placement" }] : []));
50
+ /**
51
+ * @zh_CN 弹框的宽度
52
+ * @en_US The width of the drop-down box
53
+ */
54
+ this.portalWidth = input('', ...(ngDevMode ? [{ debugName: "portalWidth", transform: XToCssPixelValue }] : [{ transform: XToCssPixelValue }]));
55
+ /**
56
+ * @zh_CN 弹框设置样式名
57
+ * @en_US The style class name of the drop-down box
58
+ */
59
+ this.portalClass = input('', ...(ngDevMode ? [{ debugName: "portalClass" }] : []));
60
+ /**
61
+ * @zh_CN 弹框最大高度
62
+ * @en_US The biggest height of the drop-down box
63
+ */
64
+ this.portalMaxHeight = input(this.config?.portalMaxHeight ?? '18rem', ...(ngDevMode ? [{ debugName: "portalMaxHeight", transform: XToCssPixelValue }] : [{
65
+ transform: XToCssPixelValue
66
+ }]));
67
+ /**
68
+ * @zh_CN 弹框高度,启用虚拟滚动的时候必须设置一个高度
69
+ * @en_US The biggest height of the drop-down box
70
+ */
71
+ this.portalHeight = input('', ...(ngDevMode ? [{ debugName: "portalHeight", transform: XToCssPixelValue }] : [{
72
+ transform: XToCssPixelValue
73
+ }]));
74
+ /**
75
+ * @zh_CN 尺寸
76
+ * @en_US Size
77
+ */
78
+ this.size = input(this.config?.size ?? 'medium', ...(ngDevMode ? [{ debugName: "size" }] : []));
79
+ /**
80
+ * @zh_CN 节点点击事件
81
+ * @en_US Node click event
82
+ */
83
+ this.nodeClick = output();
84
+ }
85
+ /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.5", ngImport: i0, type: XContextmenuProperty, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
86
+ /** @nocollapse */ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "20.3.5", type: XContextmenuProperty, isStandalone: true, selector: "x-contextmenu-property", inputs: { target: { classPropertyName: "target", publicName: "target", isSignal: true, isRequired: false, transformFunction: null }, data: { classPropertyName: "data", publicName: "data", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, children: { classPropertyName: "children", publicName: "children", isSignal: true, isRequired: false, transformFunction: null }, placement: { classPropertyName: "placement", publicName: "placement", isSignal: true, isRequired: false, transformFunction: null }, portalWidth: { classPropertyName: "portalWidth", publicName: "portalWidth", isSignal: true, isRequired: false, transformFunction: null }, portalClass: { classPropertyName: "portalClass", publicName: "portalClass", isSignal: true, isRequired: false, transformFunction: null }, portalMaxHeight: { classPropertyName: "portalMaxHeight", publicName: "portalMaxHeight", isSignal: true, isRequired: false, transformFunction: null }, portalHeight: { classPropertyName: "portalHeight", publicName: "portalHeight", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { nodeClick: "nodeClick" }, usesInheritance: true, ngImport: i0, template: '', isInline: true }); }
87
+ }
88
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.5", ngImport: i0, type: XContextmenuProperty, decorators: [{
89
+ type: Component,
90
+ args: [{ selector: `${XContextmenuPrefix}-property`, template: '' }]
91
+ }], propDecorators: { target: [{ type: i0.Input, args: [{ isSignal: true, alias: "target", required: false }] }], data: [{ type: i0.Input, args: [{ isSignal: true, alias: "data", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], children: [{ type: i0.Input, args: [{ isSignal: true, alias: "children", required: false }] }], placement: [{ type: i0.Input, args: [{ isSignal: true, alias: "placement", required: false }] }], portalWidth: [{ type: i0.Input, args: [{ isSignal: true, alias: "portalWidth", required: false }] }], portalClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "portalClass", required: false }] }], portalMaxHeight: [{ type: i0.Input, args: [{ isSignal: true, alias: "portalMaxHeight", required: false }] }], portalHeight: [{ type: i0.Input, args: [{ isSignal: true, alias: "portalHeight", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], nodeClick: [{ type: i0.Output, args: ["nodeClick"] }] } });
92
+
93
+ class XContextmenuPortalComponent {
94
+ constructor() {
95
+ this.animateEnter = 'x-connect-enter';
96
+ this.animateLeave = 'x-connect-leave';
97
+ this.data = input([], ...(ngDevMode ? [{ debugName: "data" }] : []));
98
+ this.size = input('medium', ...(ngDevMode ? [{ debugName: "size" }] : []));
99
+ this.portalWidth = input(...(ngDevMode ? [undefined, { debugName: "portalWidth" }] : []));
100
+ this.portalHeight = input(...(ngDevMode ? [undefined, { debugName: "portalHeight" }] : []));
101
+ this.portalMaxHeight = input(...(ngDevMode ? [undefined, { debugName: "portalMaxHeight" }] : []));
102
+ this.portalClass = input(...(ngDevMode ? [undefined, { debugName: "portalClass" }] : []));
103
+ this.level = input(0, ...(ngDevMode ? [{ debugName: "level" }] : []));
104
+ this.parentPortalComponent = input(...(ngDevMode ? [undefined, { debugName: "parentPortalComponent" }] : []));
105
+ this.closed = output();
106
+ this.animating = output();
107
+ this.nodeClick = output();
108
+ this.list = viewChild.required('list');
109
+ this.destroy = signal(false, ...(ngDevMode ? [{ debugName: "destroy" }] : []));
110
+ this.active = signal(0, ...(ngDevMode ? [{ debugName: "active" }] : []));
111
+ this.node = signal(null, ...(ngDevMode ? [{ debugName: "node" }] : []));
112
+ this.childAnimating = signal(false, ...(ngDevMode ? [{ debugName: "childAnimating" }] : []));
113
+ this.isKeyboardControlled = signal(true, ...(ngDevMode ? [{ debugName: "isKeyboardControlled" }] : []));
114
+ this.unSubject = new Subject();
115
+ this.destroyRef = inject(DestroyRef);
116
+ this.portalService = inject(XPortalService);
117
+ this.overlay = inject(Overlay);
118
+ this.viewContainerRef = inject(ViewContainerRef);
119
+ this.portalComponent = signal(null, ...(ngDevMode ? [{ debugName: "portalComponent" }] : []));
120
+ this.portalOverlayRef = signal(null, ...(ngDevMode ? [{ debugName: "portalOverlayRef" }] : []));
121
+ effect(() => this.portalComponent()?.setInput('data', this.node()?.children));
122
+ effect(() => this.portalComponent()?.setInput('level', this.level() + 1));
123
+ effect(() => this.portalComponent()?.setInput('size', this.size()));
124
+ effect(() => this.portalComponent()?.setInput('portalWidth', this.portalWidth()));
125
+ effect(() => this.portalComponent()?.setInput('parentPortalComponent', this));
126
+ this.destroyRef.onDestroy(() => {
127
+ this.destroy.set(true);
128
+ this.unSubject.next();
129
+ this.unSubject.complete();
130
+ });
131
+ }
132
+ ngOnInit() {
133
+ this.closeSubject.subscribe(() => {
134
+ this.data() && this.data().length > 0 && this.list().setUnActive(this.active());
135
+ });
136
+ this.keydownSubject.pipe(takeUntil(this.unSubject)).subscribe((x) => {
137
+ if (!this.isKeyboardControlled())
138
+ return;
139
+ const keyCode = x.keyCode;
140
+ const isRightArrow = [RIGHT_ARROW].includes(keyCode);
141
+ const isLeftArrow = [LEFT_ARROW].includes(keyCode);
142
+ if (isRightArrow) {
143
+ const item = this.list().keyManager.activeItem;
144
+ if (item?.leaf()) {
145
+ const node = item.node();
146
+ node.event = x;
147
+ node.component = item;
148
+ this.isKeyboardControlled.set(false);
149
+ this.onNodeClick(node);
150
+ }
151
+ }
152
+ if (isLeftArrow && this.level() > 0) {
153
+ this.parentPortalComponent()?.isKeyboardControlled.set(true);
154
+ this.parentPortalComponent()?.closePortal();
155
+ }
156
+ this.data() && this.data().length > 0 && this.list().keydown(x);
157
+ });
158
+ }
159
+ ngAfterViewInit() {
160
+ this.list().keyManager.setFirstItemActive();
161
+ }
162
+ onNodeClick(node) {
163
+ this.nodeClick.emit(node);
164
+ // 如果有子节点,显示子菜单
165
+ if (node.children && node.children.length > 0) {
166
+ this.showPortal(node);
167
+ }
168
+ else {
169
+ // 叶子节点,关闭所有菜单
170
+ this.closeSubject.next();
171
+ }
172
+ }
173
+ onActive(num) {
174
+ this.active.set(num);
175
+ }
176
+ onNodeMouseenter(node) {
177
+ // 鼠标悬停时展开子菜单
178
+ if (node.children && node.children.length > 0) {
179
+ this.showPortal(node);
180
+ }
181
+ }
182
+ onNodeMouseleave() {
183
+ // 可以在这里添加延迟关闭逻辑
184
+ }
185
+ portalAttached() {
186
+ return this.portalOverlayRef()?.hasAttached();
187
+ }
188
+ closePortal() {
189
+ if (this.portalAttached()) {
190
+ this.portalOverlayRef()?.dispose();
191
+ return true;
192
+ }
193
+ return false;
194
+ }
195
+ createPortal() {
196
+ const config = {
197
+ backdropClass: '',
198
+ width: this.portalWidth(),
199
+ panelClass: this.portalClass(),
200
+ positionStrategy: this.setPlacement(),
201
+ scrollStrategy: this.overlay.scrollStrategies.reposition()
202
+ };
203
+ this.portal = this.portalService.attach({
204
+ content: XContextmenuPortalComponent,
205
+ viewContainerRef: this.viewContainerRef,
206
+ overlayConfig: config
207
+ });
208
+ this.setInstance();
209
+ }
210
+ setInstance() {
211
+ let { componentRef, overlayRef } = this.portal;
212
+ if (!componentRef || !overlayRef)
213
+ return;
214
+ this.portalComponent.set(componentRef);
215
+ this.portalOverlayRef.set(overlayRef);
216
+ Object.assign(componentRef.instance, {
217
+ closeSubject: this.closeSubject,
218
+ keydownSubject: this.keydownSubject
219
+ });
220
+ const { closed, animating, nodeClick } = componentRef.instance;
221
+ closed.subscribe(() => this.closePortal());
222
+ animating.subscribe((ing) => this.childAnimating.set(ing));
223
+ nodeClick.subscribe((node) => this.nodeClick.emit(node));
224
+ }
225
+ setPlacement() {
226
+ return this.portalService.setPlacement({
227
+ elementRef: this.node()?.component?.getElementRef(),
228
+ placement: ['right-start', 'right-end', 'left-start', 'left-end'],
229
+ transformOriginOn: 'x-contextmenu-portal'
230
+ });
231
+ }
232
+ showPortal(node) {
233
+ if (this.portalAttached() && this.node()?.id !== node.id) {
234
+ this.portalOverlayRef()?.dispose();
235
+ }
236
+ this.node.set(node);
237
+ if (!this.portalAttached()) {
238
+ this.createPortal();
239
+ }
240
+ }
241
+ /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.5", ngImport: i0, type: XContextmenuPortalComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
242
+ /** @nocollapse */ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "20.3.5", type: XContextmenuPortalComponent, isStandalone: true, selector: "x-contextmenu-portal", inputs: { data: { classPropertyName: "data", publicName: "data", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, portalWidth: { classPropertyName: "portalWidth", publicName: "portalWidth", isSignal: true, isRequired: false, transformFunction: null }, portalHeight: { classPropertyName: "portalHeight", publicName: "portalHeight", isSignal: true, isRequired: false, transformFunction: null }, portalMaxHeight: { classPropertyName: "portalMaxHeight", publicName: "portalMaxHeight", isSignal: true, isRequired: false, transformFunction: null }, portalClass: { classPropertyName: "portalClass", publicName: "portalClass", isSignal: true, isRequired: false, transformFunction: null }, level: { classPropertyName: "level", publicName: "level", isSignal: true, isRequired: false, transformFunction: null }, parentPortalComponent: { classPropertyName: "parentPortalComponent", publicName: "parentPortalComponent", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { closed: "closed", animating: "animating", nodeClick: "nodeClick" }, host: { properties: { "animate.enter": "this.animateEnter", "animate.leave": "this.animateLeave" } }, viewQueries: [{ propertyName: "list", first: true, predicate: ["list"], descendants: true, isSignal: true }], ngImport: i0, template: "<div\r\n #contextmenuPortal\r\n class=\"x-contextmenu-portal\"\r\n [style.maxHeight]=\"portalHeight() ? portalHeight() : portalMaxHeight()\"\r\n [style.height]=\"portalHeight()\"\r\n>\r\n <x-list\r\n #list\r\n [data]=\"data()\"\r\n (nodeClick)=\"onNodeClick($event)\"\r\n (keyManagerChange)=\"onActive($event)\"\r\n [inPortal]=\"true\"\r\n [size]=\"size()\"\r\n (nodeMouseenter)=\"onNodeMouseenter($event)\"\r\n (nodeMouseleave)=\"onNodeMouseleave()\"\r\n ></x-list>\r\n</div>\r\n", styles: ["x-contextmenu-portal{width:100%}.x-contextmenu-portal{margin:.0625rem 0;color:var(--x-text);width:100%;background-color:var(--x-background-100);border-radius:var(--x-border-small-radius);box-shadow:var(--x-box-shadow);position:relative;display:flex;overflow:auto}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "component", type: XListComponent, selector: "x-list" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
243
+ }
244
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.5", ngImport: i0, type: XContextmenuPortalComponent, decorators: [{
245
+ type: Component,
246
+ args: [{ selector: `x-contextmenu-portal`, imports: [FormsModule, XListComponent], encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, template: "<div\r\n #contextmenuPortal\r\n class=\"x-contextmenu-portal\"\r\n [style.maxHeight]=\"portalHeight() ? portalHeight() : portalMaxHeight()\"\r\n [style.height]=\"portalHeight()\"\r\n>\r\n <x-list\r\n #list\r\n [data]=\"data()\"\r\n (nodeClick)=\"onNodeClick($event)\"\r\n (keyManagerChange)=\"onActive($event)\"\r\n [inPortal]=\"true\"\r\n [size]=\"size()\"\r\n (nodeMouseenter)=\"onNodeMouseenter($event)\"\r\n (nodeMouseleave)=\"onNodeMouseleave()\"\r\n ></x-list>\r\n</div>\r\n", styles: ["x-contextmenu-portal{width:100%}.x-contextmenu-portal{margin:.0625rem 0;color:var(--x-text);width:100%;background-color:var(--x-background-100);border-radius:var(--x-border-small-radius);box-shadow:var(--x-box-shadow);position:relative;display:flex;overflow:auto}\n"] }]
247
+ }], ctorParameters: () => [], propDecorators: { animateEnter: [{
248
+ type: HostBinding,
249
+ args: ['animate.enter']
250
+ }], animateLeave: [{
251
+ type: HostBinding,
252
+ args: ['animate.leave']
253
+ }], data: [{ type: i0.Input, args: [{ isSignal: true, alias: "data", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], portalWidth: [{ type: i0.Input, args: [{ isSignal: true, alias: "portalWidth", required: false }] }], portalHeight: [{ type: i0.Input, args: [{ isSignal: true, alias: "portalHeight", required: false }] }], portalMaxHeight: [{ type: i0.Input, args: [{ isSignal: true, alias: "portalMaxHeight", required: false }] }], portalClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "portalClass", required: false }] }], level: [{ type: i0.Input, args: [{ isSignal: true, alias: "level", required: false }] }], parentPortalComponent: [{ type: i0.Input, args: [{ isSignal: true, alias: "parentPortalComponent", required: false }] }], closed: [{ type: i0.Output, args: ["closed"] }], animating: [{ type: i0.Output, args: ["animating"] }], nodeClick: [{ type: i0.Output, args: ["nodeClick"] }], list: [{ type: i0.ViewChild, args: ['list', { isSignal: true }] }] } });
254
+
255
+ class XContextmenuComponent extends XContextmenuProperty {
256
+ constructor() {
257
+ super();
258
+ this.unSubject = new Subject();
259
+ this.portalService = inject(XPortalService);
260
+ this.viewContainerRef = inject(ViewContainerRef);
261
+ this.overlay = inject(Overlay);
262
+ this.nodes = computed(() => {
263
+ const data = this.data();
264
+ if (!this.children()) {
265
+ return data.filter((y) => XIsEmpty(y.pid)).map((y) => XGetChildren(data, y, 0));
266
+ }
267
+ return XHasChildren(data, 0);
268
+ }, ...(ngDevMode ? [{ debugName: "nodes" }] : []));
269
+ this.animating = signal(false, ...(ngDevMode ? [{ debugName: "animating" }] : []));
270
+ this.visibleClass = signal(false, ...(ngDevMode ? [{ debugName: "visibleClass" }] : []));
271
+ this.isClickNodeLeaf = signal(false, ...(ngDevMode ? [{ debugName: "isClickNodeLeaf" }] : []));
272
+ this.minWidth = signal('0px', ...(ngDevMode ? [{ debugName: "minWidth" }] : []));
273
+ this.closeSubject = new Subject();
274
+ this.keydownSubject = new Subject();
275
+ this.positionElement = null;
276
+ this.clickPosition = signal(null, ...(ngDevMode ? [{ debugName: "clickPosition" }] : []));
277
+ this.portalComponent = signal(null, ...(ngDevMode ? [{ debugName: "portalComponent" }] : []));
278
+ effect(() => this.portalComponent()?.setInput('data', this.nodes()));
279
+ effect(() => this.portalComponent()?.setInput('size', this.size()));
280
+ effect(() => this.portalComponent()?.setInput('portalMaxHeight', this.portalMaxHeight()));
281
+ effect(() => this.portalComponent()?.setInput('portalHeight', this.portalHeight()));
282
+ effect(() => this.portalComponent()?.setInput('portalWidth', this.portalWidth()));
283
+ effect(() => this.portalComponent()?.setInput('portalClass', this.portalClass()));
284
+ }
285
+ ngOnInit() {
286
+ this.setSubject();
287
+ // 监听全局键盘事件
288
+ this.keydownSubject.pipe(takeUntil(this.unSubject)).subscribe((event) => {
289
+ if (event.key === 'Escape') {
290
+ this.closePortal();
291
+ }
292
+ });
293
+ }
294
+ ngOnDestroy() {
295
+ this.unSubject.next();
296
+ this.unSubject.complete();
297
+ this.removePositionElement();
298
+ }
299
+ onContextmenu(event) {
300
+ if (this.disabled())
301
+ return;
302
+ const target = this.target();
303
+ if (!target)
304
+ return;
305
+ // 检查点击的目标是否是我们绑定的元素
306
+ const targetElement = target instanceof ElementRef ? target.nativeElement : target;
307
+ if (!targetElement.contains(event.target))
308
+ return;
309
+ // 阻止默认右键菜单
310
+ event.preventDefault();
311
+ // 先关闭已打开的菜单
312
+ this.closePortal();
313
+ // 记录点击位置
314
+ this.clickPosition.set({ x: event.clientX, y: event.clientY });
315
+ // 创建定位元素
316
+ this.createPositionElement(event.clientX, event.clientY);
317
+ // 打开菜单
318
+ this.openPortal();
319
+ }
320
+ onClose() {
321
+ this.closePortal();
322
+ }
323
+ setSubject() {
324
+ this.closeSubject.pipe(takeUntil(this.unSubject)).subscribe(() => {
325
+ this.closePortal();
326
+ });
327
+ }
328
+ openPortal() {
329
+ if (!this.clickPosition())
330
+ return;
331
+ this.visibleClass.set(true);
332
+ const config = {
333
+ backdropClass: '',
334
+ panelClass: this.portalClass(),
335
+ width: this.portalWidth(),
336
+ positionStrategy: this.createPositionStrategy(),
337
+ scrollStrategy: this.overlay.scrollStrategies.reposition(),
338
+ minWidth: this.minWidth()
339
+ };
340
+ this.portal = this.portalService.attach({
341
+ content: XContextmenuPortalComponent,
342
+ viewContainerRef: this.viewContainerRef,
343
+ overlayConfig: config
344
+ });
345
+ this.setInstance();
346
+ }
347
+ closePortal() {
348
+ if (this.portalAttached()) {
349
+ this.portal.overlayRef?.dispose();
350
+ this.visibleClass.set(false);
351
+ this.removePositionElement();
352
+ return true;
353
+ }
354
+ return false;
355
+ }
356
+ portalAttached() {
357
+ return this.portal?.overlayRef?.hasAttached();
358
+ }
359
+ createPositionElement(x, y) {
360
+ this.removePositionElement();
361
+ const element = document.createElement('div');
362
+ element.style.position = 'fixed';
363
+ element.style.left = `${x}px`;
364
+ element.style.top = `${y}px`;
365
+ element.style.width = '0px';
366
+ element.style.height = '0px';
367
+ element.style.pointerEvents = 'none';
368
+ element.className = 'x-contextmenu-position';
369
+ document.body.appendChild(element);
370
+ this.positionElement = element;
371
+ }
372
+ removePositionElement() {
373
+ if (this.positionElement) {
374
+ this.positionElement.remove();
375
+ this.positionElement = null;
376
+ }
377
+ }
378
+ setInstance() {
379
+ let { componentRef, overlayRef } = this.portal;
380
+ if (!componentRef || !overlayRef)
381
+ return;
382
+ this.portalComponent.set(componentRef);
383
+ Object.assign(componentRef.instance, {
384
+ closeSubject: this.closeSubject,
385
+ keydownSubject: this.keydownSubject
386
+ });
387
+ const { closed, animating, nodeClick } = componentRef.instance;
388
+ closed.subscribe(() => this.closeSubject.next());
389
+ animating.subscribe((ing) => this.animating.set(ing));
390
+ nodeClick.subscribe((node) => {
391
+ this.isClickNodeLeaf.set(node.leaf);
392
+ this.nodeClick.emit(node);
393
+ });
394
+ }
395
+ createPositionStrategy() {
396
+ const pos = this.clickPosition();
397
+ if (!pos)
398
+ return this.overlay.position().global();
399
+ // 使用全局定位策略,直接设置位置
400
+ const strategy = this.overlay.position().global();
401
+ strategy.left(`${pos.x}px`);
402
+ strategy.top(`${pos.y}px`);
403
+ return strategy;
404
+ }
405
+ setPlacement() {
406
+ const positionElement = this.positionElement || document.body;
407
+ return this.portalService.setPlacement({
408
+ elementRef: { nativeElement: positionElement },
409
+ placement: [this.placement(), 'bottom-start', 'bottom-end', 'bottom', 'top-start', 'top-end', 'top'],
410
+ transformOriginOn: 'x-contextmenu-portal'
411
+ });
412
+ }
413
+ /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.5", ngImport: i0, type: XContextmenuComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
414
+ /** @nocollapse */ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.5", type: XContextmenuComponent, isStandalone: true, selector: "x-contextmenu", host: { listeners: { "document:contextmenu": "onContextmenu($event)", "document:click": "onClose()" } }, usesInheritance: true, ngImport: i0, template: "<div class=\"x-contextmenu\" [class.x-visible]=\"visibleClass()\">\r\n <ng-content></ng-content>\r\n</div>\r\n", styles: [".x-contextmenu{margin:0;padding:0}.x-contextmenu{display:inline-block}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
415
+ }
416
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.5", ngImport: i0, type: XContextmenuComponent, decorators: [{
417
+ type: Component,
418
+ args: [{ selector: `${XContextmenuPrefix}`, imports: [], encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, template: "<div class=\"x-contextmenu\" [class.x-visible]=\"visibleClass()\">\r\n <ng-content></ng-content>\r\n</div>\r\n", styles: [".x-contextmenu{margin:0;padding:0}.x-contextmenu{display:inline-block}\n"] }]
419
+ }], ctorParameters: () => [], propDecorators: { onContextmenu: [{
420
+ type: HostListener,
421
+ args: ['document:contextmenu', ['$event']]
422
+ }], onClose: [{
423
+ type: HostListener,
424
+ args: ['document:click']
425
+ }] } });
426
+
427
+ class XContextmenuModule {
428
+ /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.5", ngImport: i0, type: XContextmenuModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
429
+ /** @nocollapse */ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "20.3.5", ngImport: i0, type: XContextmenuModule, imports: [XContextmenuComponent], exports: [XContextmenuComponent] }); }
430
+ /** @nocollapse */ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "20.3.5", ngImport: i0, type: XContextmenuModule }); }
431
+ }
432
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.5", ngImport: i0, type: XContextmenuModule, decorators: [{
433
+ type: NgModule,
434
+ args: [{
435
+ imports: [XContextmenuComponent],
436
+ exports: [XContextmenuComponent]
437
+ }]
438
+ }] });
439
+
440
+ /**
441
+ * Generated bundle index. Do not edit.
442
+ */
443
+
444
+ export { XContextmenuComponent, XContextmenuModule, XContextmenuPrefix, XContextmenuProperty };
445
+ //# sourceMappingURL=ng-nest-ui-contextmenu.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ng-nest-ui-contextmenu.mjs","sources":["../../../../lib/ng-nest/ui/contextmenu/contextmenu.property.ts","../../../../lib/ng-nest/ui/contextmenu/contextmenu-portal.component.ts","../../../../lib/ng-nest/ui/contextmenu/contextmenu-portal.component.html","../../../../lib/ng-nest/ui/contextmenu/contextmenu.component.ts","../../../../lib/ng-nest/ui/contextmenu/contextmenu.component.html","../../../../lib/ng-nest/ui/contextmenu/contextmenu.module.ts","../../../../lib/ng-nest/ui/contextmenu/ng-nest-ui-contextmenu.ts"],"sourcesContent":["import {\r\n XBoolean,\r\n XPlacement,\r\n XSize,\r\n XPropertyFunction,\r\n XToDataArray,\r\n XDataArray,\r\n XToBoolean,\r\n XNumber,\r\n XToCssPixelValue\r\n} from '@ng-nest/ui/core';\r\nimport { XListNode } from '@ng-nest/ui/list';\r\nimport { Component, input, output, ElementRef } from '@angular/core';\r\n\r\n/**\r\n * Contextmenu\r\n * @selector x-contextmenu\r\n * @decorator component\r\n */\r\nexport const XContextmenuPrefix = 'x-contextmenu';\r\nconst X_CONTEXTMENU_CONFIG_NAME = 'contextmenu';\r\n\r\n/**\r\n * Contextmenu Property\r\n */\r\n@Component({ selector: `${XContextmenuPrefix}-property`, template: '' })\r\nexport class XContextmenuProperty extends XPropertyFunction(X_CONTEXTMENU_CONFIG_NAME) {\r\n /**\r\n * @zh_CN 触发目标元素\r\n * @en_US Trigger target element\r\n */\r\n readonly target = input<ElementRef | HTMLElement>();\r\n /**\r\n * @zh_CN 节点数据\r\n * @en_US Node data\r\n */\r\n readonly data = input<XContextmenuNode[], XDataArray<XContextmenuNode>>([], { transform: XToDataArray });\r\n /**\r\n * @zh_CN 禁用\r\n * @en_US Disabled\r\n */\r\n readonly disabled = input<boolean, XBoolean>(false, { transform: XToBoolean });\r\n /**\r\n * @zh_CN 节点中已经包含子节点数据\r\n * @en_US The node already contains child node data\r\n */\r\n readonly children = input<boolean, XBoolean>(false, { transform: XToBoolean });\r\n /**\r\n * @zh_CN 展示位置\r\n * @en_US Placement\r\n */\r\n readonly placement = input<XPlacement>(this.config?.placement ?? 'bottom-start');\r\n /**\r\n * @zh_CN 弹框的宽度\r\n * @en_US The width of the drop-down box\r\n */\r\n readonly portalWidth = input<string, XNumber>('', { transform: XToCssPixelValue });\r\n /**\r\n * @zh_CN 弹框设置样式名\r\n * @en_US The style class name of the drop-down box\r\n */\r\n readonly portalClass = input<string | string[]>('');\r\n /**\r\n * @zh_CN 弹框最大高度\r\n * @en_US The biggest height of the drop-down box\r\n */\r\n readonly portalMaxHeight = input<string, XNumber>(this.config?.portalMaxHeight ?? '18rem', {\r\n transform: XToCssPixelValue\r\n });\r\n /**\r\n * @zh_CN 弹框高度,启用虚拟滚动的时候必须设置一个高度\r\n * @en_US The biggest height of the drop-down box\r\n */\r\n readonly portalHeight = input<string, XNumber>('', {\r\n transform: XToCssPixelValue\r\n });\r\n /**\r\n * @zh_CN 尺寸\r\n * @en_US Size\r\n */\r\n readonly size = input<XSize>(this.config?.size ?? 'medium');\r\n /**\r\n * @zh_CN 节点点击事件\r\n * @en_US Node click event\r\n */\r\n readonly nodeClick = output<XContextmenuNode>();\r\n}\r\n\r\n/**\r\n * @zh_CN Contextmenu 数据对象\r\n * @en_US Contextmenu data object\r\n */\r\nexport interface XContextmenuNode extends XListNode {}\r\n","import {\r\n Component,\r\n ViewEncapsulation,\r\n ChangeDetectionStrategy,\r\n HostBinding,\r\n input,\r\n output,\r\n signal,\r\n inject,\r\n DestroyRef,\r\n viewChild,\r\n ViewContainerRef,\r\n effect,\r\n ComponentRef\r\n} from '@angular/core';\r\nimport { XContextmenuNode } from './contextmenu.property';\r\nimport { Subject } from 'rxjs';\r\nimport { XListComponent } from '@ng-nest/ui/list';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { XSize } from '@ng-nest/ui/core';\r\nimport { XPortalOverlayRef, XPortalService } from '@ng-nest/ui/portal';\r\nimport { Overlay, OverlayConfig } from '@angular/cdk/overlay';\r\nimport { RIGHT_ARROW, LEFT_ARROW } from '@angular/cdk/keycodes';\r\nimport { takeUntil } from 'rxjs/operators';\r\n\r\n@Component({\r\n selector: `x-contextmenu-portal`,\r\n imports: [FormsModule, XListComponent],\r\n templateUrl: './contextmenu-portal.component.html',\r\n styleUrls: ['./contextmenu-portal.component.scss'],\r\n encapsulation: ViewEncapsulation.None,\r\n changeDetection: ChangeDetectionStrategy.OnPush\r\n})\r\nexport class XContextmenuPortalComponent {\r\n @HostBinding('animate.enter') animateEnter = 'x-connect-enter';\r\n @HostBinding('animate.leave') animateLeave = 'x-connect-leave';\r\n\r\n data = input<XContextmenuNode[]>([]);\r\n size = input<XSize>('medium');\r\n portalWidth = input<string>();\r\n portalHeight = input<string>();\r\n portalMaxHeight = input<string>();\r\n portalClass = input<string>();\r\n\r\n level = input(0);\r\n parentPortalComponent = input<XContextmenuPortalComponent>();\r\n\r\n closed = output();\r\n animating = output<boolean>();\r\n nodeClick = output<XContextmenuNode>();\r\n\r\n list = viewChild.required<XListComponent>('list');\r\n destroy = signal(false);\r\n closeSubject!: Subject<void>;\r\n keydownSubject!: Subject<KeyboardEvent>;\r\n active = signal(0);\r\n node = signal<XContextmenuNode | null>(null);\r\n childAnimating = signal(false);\r\n isKeyboardControlled = signal(true);\r\n private unSubject = new Subject<void>();\r\n private destroyRef = inject(DestroyRef);\r\n private portalService = inject(XPortalService);\r\n private overlay = inject(Overlay);\r\n private viewContainerRef = inject(ViewContainerRef);\r\n\r\n portal!: XPortalOverlayRef<XContextmenuPortalComponent>;\r\n portalComponent = signal<ComponentRef<XContextmenuPortalComponent> | null>(null);\r\n portalOverlayRef = signal<any>(null);\r\n\r\n constructor() {\r\n effect(() => this.portalComponent()?.setInput('data', this.node()?.children));\r\n effect(() => this.portalComponent()?.setInput('level', this.level() + 1));\r\n effect(() => this.portalComponent()?.setInput('size', this.size()));\r\n effect(() => this.portalComponent()?.setInput('portalWidth', this.portalWidth()));\r\n effect(() => this.portalComponent()?.setInput('parentPortalComponent', this));\r\n\r\n this.destroyRef.onDestroy(() => {\r\n this.destroy.set(true);\r\n this.unSubject.next();\r\n this.unSubject.complete();\r\n });\r\n }\r\n\r\n ngOnInit() {\r\n this.closeSubject.subscribe(() => {\r\n this.data() && this.data()!.length > 0 && this.list().setUnActive(this.active());\r\n });\r\n\r\n this.keydownSubject.pipe(takeUntil(this.unSubject)).subscribe((x) => {\r\n if (!this.isKeyboardControlled()) return;\r\n const keyCode = x.keyCode;\r\n const isRightArrow = [RIGHT_ARROW].includes(keyCode);\r\n const isLeftArrow = [LEFT_ARROW].includes(keyCode);\r\n\r\n if (isRightArrow) {\r\n const item = this.list().keyManager.activeItem!;\r\n if (item?.leaf()) {\r\n const node = item.node()!;\r\n node.event = x;\r\n node.component = item;\r\n this.isKeyboardControlled.set(false);\r\n this.onNodeClick(node);\r\n }\r\n }\r\n\r\n if (isLeftArrow && this.level() > 0) {\r\n this.parentPortalComponent()?.isKeyboardControlled.set(true);\r\n this.parentPortalComponent()?.closePortal();\r\n }\r\n\r\n this.data() && this.data()!.length > 0 && this.list().keydown(x);\r\n });\r\n }\r\n\r\n ngAfterViewInit() {\r\n this.list().keyManager.setFirstItemActive();\r\n }\r\n\r\n onNodeClick(node: XContextmenuNode) {\r\n this.nodeClick.emit(node);\r\n\r\n // 如果有子节点,显示子菜单\r\n if (node.children && node.children.length > 0) {\r\n this.showPortal(node);\r\n } else {\r\n // 叶子节点,关闭所有菜单\r\n this.closeSubject.next();\r\n }\r\n }\r\n\r\n onActive(num: number) {\r\n this.active.set(num);\r\n }\r\n\r\n onNodeMouseenter(node: XContextmenuNode) {\r\n // 鼠标悬停时展开子菜单\r\n if (node.children && node.children.length > 0) {\r\n this.showPortal(node);\r\n }\r\n }\r\n\r\n onNodeMouseleave() {\r\n // 可以在这里添加延迟关闭逻辑\r\n }\r\n\r\n portalAttached() {\r\n return this.portalOverlayRef()?.hasAttached();\r\n }\r\n\r\n closePortal() {\r\n if (this.portalAttached()) {\r\n this.portalOverlayRef()?.dispose();\r\n return true;\r\n }\r\n return false;\r\n }\r\n\r\n createPortal() {\r\n const config: OverlayConfig = {\r\n backdropClass: '',\r\n width: this.portalWidth(),\r\n panelClass: this.portalClass(),\r\n positionStrategy: this.setPlacement(),\r\n scrollStrategy: this.overlay.scrollStrategies.reposition()\r\n };\r\n\r\n this.portal = this.portalService.attach({\r\n content: XContextmenuPortalComponent,\r\n viewContainerRef: this.viewContainerRef,\r\n overlayConfig: config\r\n });\r\n\r\n this.setInstance();\r\n }\r\n\r\n setInstance() {\r\n let { componentRef, overlayRef } = this.portal;\r\n if (!componentRef || !overlayRef) return;\r\n\r\n this.portalComponent.set(componentRef);\r\n this.portalOverlayRef.set(overlayRef);\r\n\r\n Object.assign(componentRef.instance, {\r\n closeSubject: this.closeSubject,\r\n keydownSubject: this.keydownSubject\r\n });\r\n\r\n const { closed, animating, nodeClick } = componentRef.instance;\r\n closed.subscribe(() => this.closePortal());\r\n animating.subscribe((ing: boolean) => this.childAnimating.set(ing));\r\n nodeClick.subscribe((node: XContextmenuNode) => this.nodeClick.emit(node));\r\n }\r\n\r\n setPlacement() {\r\n return this.portalService.setPlacement({\r\n elementRef: this.node()?.component?.getElementRef(),\r\n placement: ['right-start', 'right-end', 'left-start', 'left-end'],\r\n transformOriginOn: 'x-contextmenu-portal'\r\n });\r\n }\r\n\r\n showPortal(node: XContextmenuNode) {\r\n if (this.portalAttached() && this.node()?.id !== node.id) {\r\n this.portalOverlayRef()?.dispose();\r\n }\r\n this.node.set(node);\r\n if (!this.portalAttached()) {\r\n this.createPortal();\r\n }\r\n }\r\n}\r\n","<div\r\n #contextmenuPortal\r\n class=\"x-contextmenu-portal\"\r\n [style.maxHeight]=\"portalHeight() ? portalHeight() : portalMaxHeight()\"\r\n [style.height]=\"portalHeight()\"\r\n>\r\n <x-list\r\n #list\r\n [data]=\"data()\"\r\n (nodeClick)=\"onNodeClick($event)\"\r\n (keyManagerChange)=\"onActive($event)\"\r\n [inPortal]=\"true\"\r\n [size]=\"size()\"\r\n (nodeMouseenter)=\"onNodeMouseenter($event)\"\r\n (nodeMouseleave)=\"onNodeMouseleave()\"\r\n ></x-list>\r\n</div>\r\n","import {\r\n Component,\r\n ViewEncapsulation,\r\n ChangeDetectionStrategy,\r\n ViewContainerRef,\r\n inject,\r\n OnDestroy,\r\n OnInit,\r\n signal,\r\n computed,\r\n effect,\r\n ElementRef,\r\n HostListener\r\n} from '@angular/core';\r\nimport { XContextmenuPrefix, XContextmenuNode, XContextmenuProperty } from './contextmenu.property';\r\nimport { XIsEmpty, XHasChildren, XGetChildren } from '@ng-nest/ui/core';\r\nimport { Subject } from 'rxjs';\r\nimport { XPortalOverlayRef, XPortalService } from '@ng-nest/ui/portal';\r\nimport { XContextmenuPortalComponent } from './contextmenu-portal.component';\r\nimport { takeUntil } from 'rxjs/operators';\r\nimport { Overlay, OverlayConfig } from '@angular/cdk/overlay';\r\n\r\n@Component({\r\n selector: `${XContextmenuPrefix}`,\r\n imports: [],\r\n templateUrl: './contextmenu.component.html',\r\n styleUrls: ['./contextmenu.component.scss'],\r\n encapsulation: ViewEncapsulation.None,\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n standalone: true\r\n})\r\nexport class XContextmenuComponent extends XContextmenuProperty implements OnInit, OnDestroy {\r\n private unSubject = new Subject<void>();\r\n private portalService = inject(XPortalService);\r\n private viewContainerRef = inject(ViewContainerRef);\r\n private overlay = inject(Overlay);\r\n\r\n nodes = computed(() => {\r\n const data = this.data();\r\n if (!this.children()) {\r\n return data.filter((y) => XIsEmpty(y.pid)).map((y) => XGetChildren<XContextmenuNode>(data, y, 0));\r\n }\r\n return XHasChildren(data, 0);\r\n });\r\n\r\n portal!: XPortalOverlayRef<XContextmenuPortalComponent>;\r\n animating = signal(false);\r\n visibleClass = signal(false);\r\n isClickNodeLeaf = signal(false);\r\n minWidth = signal<string>('0px');\r\n closeSubject: Subject<void> = new Subject();\r\n keydownSubject: Subject<KeyboardEvent> = new Subject();\r\n\r\n private positionElement: HTMLElement | null = null;\r\n private clickPosition = signal<{ x: number; y: number } | null>(null);\r\n portalComponent = signal<any>(null);\r\n\r\n constructor() {\r\n super();\r\n effect(() => this.portalComponent()?.setInput('data', this.nodes()));\r\n effect(() => this.portalComponent()?.setInput('size', this.size()));\r\n effect(() => this.portalComponent()?.setInput('portalMaxHeight', this.portalMaxHeight()));\r\n effect(() => this.portalComponent()?.setInput('portalHeight', this.portalHeight()));\r\n effect(() => this.portalComponent()?.setInput('portalWidth', this.portalWidth()));\r\n effect(() => this.portalComponent()?.setInput('portalClass', this.portalClass()));\r\n }\r\n\r\n ngOnInit() {\r\n this.setSubject();\r\n\r\n // 监听全局键盘事件\r\n this.keydownSubject.pipe(takeUntil(this.unSubject)).subscribe((event) => {\r\n if (event.key === 'Escape') {\r\n this.closePortal();\r\n }\r\n });\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.unSubject.next();\r\n this.unSubject.complete();\r\n this.removePositionElement();\r\n }\r\n\r\n @HostListener('document:contextmenu', ['$event'])\r\n onContextmenu(event: MouseEvent) {\r\n if (this.disabled()) return;\r\n\r\n const target = this.target();\r\n if (!target) return;\r\n\r\n // 检查点击的目标是否是我们绑定的元素\r\n const targetElement = target instanceof ElementRef ? target.nativeElement : target;\r\n if (!targetElement.contains(event.target as Node)) return;\r\n\r\n // 阻止默认右键菜单\r\n event.preventDefault();\r\n\r\n // 先关闭已打开的菜单\r\n this.closePortal();\r\n\r\n // 记录点击位置\r\n this.clickPosition.set({ x: event.clientX, y: event.clientY });\r\n\r\n // 创建定位元素\r\n this.createPositionElement(event.clientX, event.clientY);\r\n\r\n // 打开菜单\r\n this.openPortal();\r\n }\r\n\r\n @HostListener('document:click')\r\n onClose() {\r\n this.closePortal();\r\n }\r\n\r\n setSubject() {\r\n this.closeSubject.pipe(takeUntil(this.unSubject)).subscribe(() => {\r\n this.closePortal();\r\n });\r\n }\r\n\r\n openPortal() {\r\n if (!this.clickPosition()) return;\r\n\r\n this.visibleClass.set(true);\r\n\r\n const config: OverlayConfig = {\r\n backdropClass: '',\r\n panelClass: this.portalClass(),\r\n width: this.portalWidth(),\r\n positionStrategy: this.createPositionStrategy(),\r\n scrollStrategy: this.overlay.scrollStrategies.reposition(),\r\n minWidth: this.minWidth()\r\n };\r\n\r\n this.portal = this.portalService.attach({\r\n content: XContextmenuPortalComponent,\r\n viewContainerRef: this.viewContainerRef,\r\n overlayConfig: config\r\n });\r\n\r\n this.setInstance();\r\n }\r\n\r\n closePortal() {\r\n if (this.portalAttached()) {\r\n this.portal.overlayRef?.dispose();\r\n this.visibleClass.set(false);\r\n this.removePositionElement();\r\n return true;\r\n }\r\n return false;\r\n }\r\n\r\n portalAttached() {\r\n return this.portal?.overlayRef?.hasAttached();\r\n }\r\n\r\n createPositionElement(x: number, y: number) {\r\n this.removePositionElement();\r\n\r\n const element = document.createElement('div');\r\n element.style.position = 'fixed';\r\n element.style.left = `${x}px`;\r\n element.style.top = `${y}px`;\r\n element.style.width = '0px';\r\n element.style.height = '0px';\r\n element.style.pointerEvents = 'none';\r\n element.className = 'x-contextmenu-position';\r\n\r\n document.body.appendChild(element);\r\n this.positionElement = element;\r\n }\r\n\r\n removePositionElement() {\r\n if (this.positionElement) {\r\n this.positionElement.remove();\r\n this.positionElement = null;\r\n }\r\n }\r\n\r\n setInstance() {\r\n let { componentRef, overlayRef } = this.portal;\r\n if (!componentRef || !overlayRef) return;\r\n\r\n this.portalComponent.set(componentRef);\r\n\r\n Object.assign(componentRef.instance, {\r\n closeSubject: this.closeSubject,\r\n keydownSubject: this.keydownSubject\r\n });\r\n\r\n const { closed, animating, nodeClick } = componentRef.instance;\r\n closed.subscribe(() => this.closeSubject.next());\r\n animating.subscribe((ing: boolean) => this.animating.set(ing));\r\n nodeClick.subscribe((node: XContextmenuNode) => {\r\n this.isClickNodeLeaf.set(node.leaf!);\r\n this.nodeClick.emit(node);\r\n });\r\n }\r\n\r\n createPositionStrategy() {\r\n const pos = this.clickPosition();\r\n if (!pos) return this.overlay.position().global();\r\n\r\n // 使用全局定位策略,直接设置位置\r\n const strategy = this.overlay.position().global();\r\n strategy.left(`${pos.x}px`);\r\n strategy.top(`${pos.y}px`);\r\n\r\n return strategy;\r\n }\r\n\r\n setPlacement() {\r\n const positionElement = this.positionElement || document.body;\r\n return this.portalService.setPlacement({\r\n elementRef: { nativeElement: positionElement } as ElementRef,\r\n placement: [this.placement(), 'bottom-start', 'bottom-end', 'bottom', 'top-start', 'top-end', 'top'],\r\n transformOriginOn: 'x-contextmenu-portal'\r\n });\r\n }\r\n}\r\n","<div class=\"x-contextmenu\" [class.x-visible]=\"visibleClass()\">\r\n <ng-content></ng-content>\r\n</div>\r\n","import { NgModule } from '@angular/core';\r\nimport { XContextmenuComponent } from './contextmenu.component';\r\n\r\n@NgModule({\r\n imports: [XContextmenuComponent],\r\n exports: [XContextmenuComponent]\r\n})\r\nexport class XContextmenuModule {}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
@@ -1077,8 +1077,8 @@ const X_THEME_LIGHT_COLORS = {
1077
1077
  };
1078
1078
  const X_THEME_DARK_COLORS = {
1079
1079
  text: '#dddddd',
1080
- border: '#252022',
1081
- background: '#0f0f11'
1080
+ border: '#363636',
1081
+ background: '#1e1e1e'
1082
1082
  };
1083
1083
  const X_THEME_COLORS = {
1084
1084
  primary: '#3B82F6',