@ai-table/grid 0.0.73 → 0.1.1

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 (234) hide show
  1. package/angular-konva/components/container.component.d.ts.map +1 -1
  2. package/angular-konva/components/shape.component.d.ts.map +1 -1
  3. package/angular-konva/components/stage.component.d.ts.map +1 -1
  4. package/components/cell-editors/abstract-cell-editor.component.d.ts.map +1 -1
  5. package/components/cell-editors/date/date-editor.component.d.ts.map +1 -1
  6. package/components/cell-editors/link/edit-link/edit-link.component.d.ts.map +1 -1
  7. package/components/cell-editors/link/link-editor.component.d.ts.map +1 -1
  8. package/components/cell-editors/number/number-editor.component.d.ts.map +1 -1
  9. package/components/cell-editors/select/select-editor.component.d.ts.map +1 -1
  10. package/components/cell-editors/text/text-editor.component.d.ts.map +1 -1
  11. package/components/cell-views/select/option.component.d.ts.map +1 -1
  12. package/components/context-menu/context-menu.component.d.ts.map +1 -1
  13. package/components/drag/drag.component.d.ts.map +1 -1
  14. package/components/field-menu/field-menu.component.d.ts.map +1 -1
  15. package/components/field-setting/field-setting.component.d.ts.map +1 -1
  16. package/core/context.d.ts +2 -0
  17. package/core/context.d.ts.map +1 -1
  18. package/core/types/ai-table.d.ts.map +1 -1
  19. package/core/utils/field.d.ts.map +1 -1
  20. package/core/utils/queries.d.ts.map +1 -1
  21. package/core/utils/short-id.d.ts.map +1 -1
  22. package/dom-grid.component.d.ts.map +1 -1
  23. package/fesm2022/ai-table-grid.mjs +347 -317
  24. package/fesm2022/ai-table-grid.mjs.map +1 -1
  25. package/grid-base.component.d.ts +3 -1
  26. package/grid-base.component.d.ts.map +1 -1
  27. package/grid.component.d.ts +1 -1
  28. package/grid.component.d.ts.map +1 -1
  29. package/package.json +3 -5
  30. package/pipes/grid.pipe.d.ts.map +1 -1
  31. package/renderer/components/action-icon.component.d.ts.map +1 -1
  32. package/renderer/components/add-field-column.component.d.ts.map +1 -1
  33. package/renderer/components/cells/attachment.component.d.ts.map +1 -1
  34. package/renderer/components/cells/link.component.d.ts.map +1 -1
  35. package/renderer/components/cells/progress.component.d.ts.map +1 -1
  36. package/renderer/components/cells/rate.component.d.ts.map +1 -1
  37. package/renderer/components/cells/rich-text.component.d.ts.map +1 -1
  38. package/renderer/components/cells.component.d.ts.map +1 -1
  39. package/renderer/components/field-head.component.d.ts +2 -2
  40. package/renderer/components/field-head.component.d.ts.map +1 -1
  41. package/renderer/components/field-icon.component.d.ts.map +1 -1
  42. package/renderer/components/frozen-cells.component.d.ts.map +1 -1
  43. package/renderer/components/frozen-heads.component.d.ts +1 -1
  44. package/renderer/components/frozen-heads.component.d.ts.map +1 -1
  45. package/renderer/components/frozen-placeholder-cells.component.d.ts.map +1 -1
  46. package/renderer/components/heads.component.d.ts +1 -1
  47. package/renderer/components/heads.component.d.ts.map +1 -1
  48. package/renderer/components/hover-cell.component.d.ts.map +1 -1
  49. package/renderer/components/hover-row-heads.component.d.ts.map +1 -1
  50. package/renderer/components/icon.component.d.ts.map +1 -1
  51. package/renderer/components/other-rows.component.d.ts.map +1 -1
  52. package/renderer/components/placeholder-cells.component.d.ts.map +1 -1
  53. package/renderer/components/text.component.d.ts.map +1 -1
  54. package/renderer/creations/create-active-cell-border.d.ts.map +1 -1
  55. package/renderer/creations/create-cells.d.ts.map +1 -1
  56. package/renderer/creations/create-heads.d.ts.map +1 -1
  57. package/renderer/drawers/add-row-layout-drawer.d.ts +1 -1
  58. package/renderer/drawers/add-row-layout-drawer.d.ts.map +1 -1
  59. package/renderer/drawers/cell-drawer.d.ts.map +1 -1
  60. package/renderer/drawers/drawer.d.ts +1 -1
  61. package/renderer/renderer.component.d.ts +7 -4
  62. package/renderer/renderer.component.d.ts.map +1 -1
  63. package/types/cell.d.ts +2 -0
  64. package/types/cell.d.ts.map +1 -1
  65. package/types/component-config.d.ts +2 -0
  66. package/types/component-config.d.ts.map +1 -1
  67. package/types/grid.d.ts +4 -0
  68. package/types/grid.d.ts.map +1 -1
  69. package/types/row.d.ts +1 -0
  70. package/types/row.d.ts.map +1 -1
  71. package/utils/build.d.ts.map +1 -1
  72. package/utils/clipboard/clipboard.d.ts.map +1 -1
  73. package/utils/clipboard/copy.d.ts.map +1 -1
  74. package/utils/clipboard/paste.d.ts +5 -1
  75. package/utils/clipboard/paste.d.ts.map +1 -1
  76. package/utils/common.d.ts.map +1 -1
  77. package/utils/field/model/date.d.ts.map +1 -1
  78. package/utils/field/model/link.d.ts.map +1 -1
  79. package/utils/field/model/progress.d.ts.map +1 -1
  80. package/utils/field/model/select.d.ts +4 -1
  81. package/utils/field/model/select.d.ts.map +1 -1
  82. package/utils/field/model/text.d.ts.map +1 -1
  83. package/utils/get-text-width.d.ts.map +1 -1
  84. package/utils/i18n.d.ts +2 -0
  85. package/utils/i18n.d.ts.map +1 -1
  86. package/utils/match-keywords.d.ts.map +1 -1
  87. package/utils/position.d.ts.map +1 -1
  88. package/utils/style.d.ts.map +1 -1
  89. package/utils/text-measure.d.ts.map +1 -1
  90. package/utils/visible-range.d.ts.map +1 -1
  91. package/esm2022/ai-table-grid.mjs +0 -5
  92. package/esm2022/angular-konva/components/container.component.mjs +0 -29
  93. package/esm2022/angular-konva/components/container.token.mjs +0 -3
  94. package/esm2022/angular-konva/components/index.mjs +0 -4
  95. package/esm2022/angular-konva/components/shape.component.mjs +0 -142
  96. package/esm2022/angular-konva/components/stage.component.mjs +0 -123
  97. package/esm2022/angular-konva/index.mjs +0 -5
  98. package/esm2022/angular-konva/interfaces/component.mjs +0 -4
  99. package/esm2022/angular-konva/interfaces/config.mjs +0 -2
  100. package/esm2022/angular-konva/interfaces/event-object.mjs +0 -2
  101. package/esm2022/angular-konva/interfaces/index.mjs +0 -5
  102. package/esm2022/angular-konva/interfaces/shape.mjs +0 -42
  103. package/esm2022/angular-konva/utils/apply-node-props.mjs +0 -67
  104. package/esm2022/angular-konva/utils/common.mjs +0 -48
  105. package/esm2022/angular-konva/utils/index.mjs +0 -5
  106. package/esm2022/angular-konva/utils/types.mjs +0 -2
  107. package/esm2022/angular-konva/utils/update-picture.mjs +0 -7
  108. package/esm2022/components/cell-editors/abstract-cell-editor.component.mjs +0 -56
  109. package/esm2022/components/cell-editors/date/date-editor.component.mjs +0 -87
  110. package/esm2022/components/cell-editors/link/edit-link/edit-link.component.mjs +0 -81
  111. package/esm2022/components/cell-editors/link/link-editor.component.mjs +0 -122
  112. package/esm2022/components/cell-editors/number/number-editor.component.mjs +0 -41
  113. package/esm2022/components/cell-editors/select/select-editor.component.mjs +0 -74
  114. package/esm2022/components/cell-editors/text/text-editor.component.mjs +0 -76
  115. package/esm2022/components/cell-views/select/option.component.mjs +0 -28
  116. package/esm2022/components/context-menu/context-menu.component.mjs +0 -42
  117. package/esm2022/components/drag/drag.component.mjs +0 -300
  118. package/esm2022/components/field-menu/field-menu.component.mjs +0 -47
  119. package/esm2022/components/field-setting/field-setting.component.mjs +0 -142
  120. package/esm2022/components/index.mjs +0 -10
  121. package/esm2022/constants/colors.mjs +0 -19
  122. package/esm2022/constants/editor.mjs +0 -11
  123. package/esm2022/constants/file-icon.mjs +0 -342
  124. package/esm2022/constants/grid.mjs +0 -35
  125. package/esm2022/constants/icon.mjs +0 -30
  126. package/esm2022/constants/index.mjs +0 -7
  127. package/esm2022/constants/table.mjs +0 -78
  128. package/esm2022/constants/text.mjs +0 -23
  129. package/esm2022/core/constants/field.mjs +0 -107
  130. package/esm2022/core/context.mjs +0 -29
  131. package/esm2022/core/coordinate.mjs +0 -222
  132. package/esm2022/core/index.mjs +0 -6
  133. package/esm2022/core/types/ai-table.mjs +0 -57
  134. package/esm2022/core/types/core.mjs +0 -2
  135. package/esm2022/core/types/index.mjs +0 -3
  136. package/esm2022/core/utils/common.mjs +0 -45
  137. package/esm2022/core/utils/field.mjs +0 -64
  138. package/esm2022/core/utils/id-creator.mjs +0 -21
  139. package/esm2022/core/utils/index.mjs +0 -5
  140. package/esm2022/core/utils/queries.mjs +0 -80
  141. package/esm2022/core/utils/short-id.mjs +0 -53
  142. package/esm2022/dom-grid.component.mjs +0 -80
  143. package/esm2022/grid-base.component.mjs +0 -145
  144. package/esm2022/grid.component.mjs +0 -649
  145. package/esm2022/index.mjs +0 -2
  146. package/esm2022/pipes/grid.pipe.mjs +0 -110
  147. package/esm2022/pipes/index.mjs +0 -2
  148. package/esm2022/public-api.mjs +0 -12
  149. package/esm2022/renderer/components/action-icon.component.mjs +0 -117
  150. package/esm2022/renderer/components/add-field-column.component.mjs +0 -88
  151. package/esm2022/renderer/components/cells/attachment.component.mjs +0 -107
  152. package/esm2022/renderer/components/cells/cells.mjs +0 -6
  153. package/esm2022/renderer/components/cells/index.mjs +0 -7
  154. package/esm2022/renderer/components/cells/link.component.mjs +0 -89
  155. package/esm2022/renderer/components/cells/progress.component.mjs +0 -268
  156. package/esm2022/renderer/components/cells/rate.component.mjs +0 -153
  157. package/esm2022/renderer/components/cells/rich-text.component.mjs +0 -95
  158. package/esm2022/renderer/components/cells.component.mjs +0 -35
  159. package/esm2022/renderer/components/field-head.component.mjs +0 -146
  160. package/esm2022/renderer/components/field-icon.component.mjs +0 -72
  161. package/esm2022/renderer/components/frozen-cells.component.mjs +0 -36
  162. package/esm2022/renderer/components/frozen-heads.component.mjs +0 -214
  163. package/esm2022/renderer/components/frozen-placeholder-cells.component.mjs +0 -38
  164. package/esm2022/renderer/components/heads.component.mjs +0 -38
  165. package/esm2022/renderer/components/hover-cell.component.mjs +0 -104
  166. package/esm2022/renderer/components/hover-row-heads.component.mjs +0 -132
  167. package/esm2022/renderer/components/icon.component.mjs +0 -84
  168. package/esm2022/renderer/components/index.mjs +0 -15
  169. package/esm2022/renderer/components/other-rows.component.mjs +0 -68
  170. package/esm2022/renderer/components/placeholder-cells.component.mjs +0 -33
  171. package/esm2022/renderer/components/text.component.mjs +0 -67
  172. package/esm2022/renderer/creations/create-active-cell-border.mjs +0 -70
  173. package/esm2022/renderer/creations/create-cells.mjs +0 -190
  174. package/esm2022/renderer/creations/create-heads.mjs +0 -51
  175. package/esm2022/renderer/drawers/add-row-layout-drawer.mjs +0 -98
  176. package/esm2022/renderer/drawers/cell-drawer.mjs +0 -673
  177. package/esm2022/renderer/drawers/drawer.mjs +0 -947
  178. package/esm2022/renderer/drawers/layout-drawer.mjs +0 -64
  179. package/esm2022/renderer/drawers/record-row-layout-drawer.mjs +0 -131
  180. package/esm2022/renderer/index.mjs +0 -4
  181. package/esm2022/renderer/interfaces/hover-cell.mjs +0 -4
  182. package/esm2022/renderer/interfaces/index.mjs +0 -2
  183. package/esm2022/renderer/renderer.component.mjs +0 -197
  184. package/esm2022/services/event.service.mjs +0 -241
  185. package/esm2022/services/field.service.mjs +0 -56
  186. package/esm2022/services/index.mjs +0 -4
  187. package/esm2022/services/selection.service.mjs +0 -151
  188. package/esm2022/types/avatar.mjs +0 -27
  189. package/esm2022/types/canvas.mjs +0 -2
  190. package/esm2022/types/cell.mjs +0 -2
  191. package/esm2022/types/clipboard.mjs +0 -2
  192. package/esm2022/types/component-config.mjs +0 -7
  193. package/esm2022/types/field.mjs +0 -2
  194. package/esm2022/types/grid.mjs +0 -17
  195. package/esm2022/types/index.mjs +0 -10
  196. package/esm2022/types/layout.mjs +0 -2
  197. package/esm2022/types/row.mjs +0 -6
  198. package/esm2022/utils/build.mjs +0 -39
  199. package/esm2022/utils/cell.mjs +0 -80
  200. package/esm2022/utils/clear-cells.mjs +0 -23
  201. package/esm2022/utils/clipboard/clipboard.mjs +0 -88
  202. package/esm2022/utils/clipboard/copy.mjs +0 -99
  203. package/esm2022/utils/clipboard/extract.mjs +0 -38
  204. package/esm2022/utils/clipboard/index.mjs +0 -5
  205. package/esm2022/utils/clipboard/paste.mjs +0 -188
  206. package/esm2022/utils/common.mjs +0 -50
  207. package/esm2022/utils/field/field-operable.mjs +0 -2
  208. package/esm2022/utils/field/field.mjs +0 -20
  209. package/esm2022/utils/field/index.mjs +0 -4
  210. package/esm2022/utils/field/model/attachment.mjs +0 -56
  211. package/esm2022/utils/field/model/date.mjs +0 -141
  212. package/esm2022/utils/field/model/index.mjs +0 -12
  213. package/esm2022/utils/field/model/link.mjs +0 -56
  214. package/esm2022/utils/field/model/member.mjs +0 -81
  215. package/esm2022/utils/field/model/number.mjs +0 -59
  216. package/esm2022/utils/field/model/progress.mjs +0 -69
  217. package/esm2022/utils/field/model/rate.mjs +0 -58
  218. package/esm2022/utils/field/model/rich-text.mjs +0 -39
  219. package/esm2022/utils/field/model/select.mjs +0 -131
  220. package/esm2022/utils/field/model/text.mjs +0 -32
  221. package/esm2022/utils/field/operate.mjs +0 -73
  222. package/esm2022/utils/file.mjs +0 -116
  223. package/esm2022/utils/get-placeholder-cells.mjs +0 -66
  224. package/esm2022/utils/get-text-width.mjs +0 -30
  225. package/esm2022/utils/hover-cell.mjs +0 -25
  226. package/esm2022/utils/i18n.mjs +0 -87
  227. package/esm2022/utils/image-cache.mjs +0 -57
  228. package/esm2022/utils/index.mjs +0 -19
  229. package/esm2022/utils/match-keywords.mjs +0 -15
  230. package/esm2022/utils/os.mjs +0 -16
  231. package/esm2022/utils/position.mjs +0 -48
  232. package/esm2022/utils/style.mjs +0 -37
  233. package/esm2022/utils/text-measure.mjs +0 -122
  234. package/esm2022/utils/visible-range.mjs +0 -42
@@ -1,300 +0,0 @@
1
- import { ChangeDetectionStrategy, Component, effect, ElementRef, inject, output, Renderer2 } from '@angular/core';
2
- import { DragType } from '@ai-table/utils';
3
- import { AITableGridSelectionService } from '../../services/selection.service';
4
- import { MIN_COLUMN_WIDTH } from '../../constants/grid';
5
- import { AI_TABLE_FIELD_HEAD_HEIGHT, AI_TABLE_ROW_DRAG_ICON_WIDTH } from '../../constants/table';
6
- import * as i0 from "@angular/core";
7
- export class AITableDragComponent {
8
- constructor() {
9
- this.dragEnd = output();
10
- this.aiTableGridSelectionService = inject(AITableGridSelectionService);
11
- this.render2 = inject(Renderer2);
12
- this.elementRef = inject((ElementRef));
13
- this.draggedData = null;
14
- this.mouseStartPosition = null;
15
- this.aiTableDrag = null;
16
- this.mouseDownTimeout = null;
17
- this.isDraggingEnabled = false;
18
- effect(() => this.handleDragStateChange());
19
- }
20
- ngOnInit() {
21
- this.initElements();
22
- this.setupEventListeners();
23
- }
24
- initElements() {
25
- this.rect = this.elementRef.nativeElement.querySelector('.rect');
26
- this.auxiliaryLine = this.elementRef.nativeElement.querySelector('.auxiliary-line');
27
- }
28
- setupEventListeners() {
29
- this.mousedownListener = this.render2.listen('window', 'mousedown', (e) => {
30
- this.mouseStartPosition = { x: e.x, y: e.y };
31
- if (this.mouseDownTimeout) {
32
- clearTimeout(this.mouseDownTimeout);
33
- }
34
- this.isDraggingEnabled = false;
35
- this.mouseDownTimeout = setTimeout(() => {
36
- this.isDraggingEnabled = true;
37
- }, 200);
38
- });
39
- this.mousemoveListener = this.render2.listen('window', 'mousemove', (e) => {
40
- if (!this.isDraggingEnabled) {
41
- return;
42
- }
43
- if (this.timer) {
44
- cancelAnimationFrame(this.timer);
45
- }
46
- this.timer = requestAnimationFrame(() => {
47
- if (this.aiTableDrag && this.mouseStartPosition) {
48
- this.handleDrag(e, this.aiTableDrag);
49
- }
50
- });
51
- });
52
- this.mouseupListener = this.render2.listen('window', 'mouseup', () => {
53
- if (this.mouseDownTimeout) {
54
- clearTimeout(this.mouseDownTimeout);
55
- this.mouseDownTimeout = null;
56
- }
57
- this.isDraggingEnabled = false;
58
- this.mouseStartPosition = null;
59
- this.aiTableDrag = null;
60
- this.handleDragEnd();
61
- });
62
- }
63
- handleDragStateChange() {
64
- const drag = this.aiTableGridSelectionService.aiTable.dragState?.();
65
- if (!drag) {
66
- this.aiTableDrag = null;
67
- return;
68
- }
69
- if (drag.type === DragType.none || !this.rect || !this.auxiliaryLine) {
70
- return;
71
- }
72
- this.aiTableDrag = drag;
73
- }
74
- handleDrag(e, drag) {
75
- if (drag.type === DragType.none) {
76
- return;
77
- }
78
- this.setDisplayStyle('block');
79
- const moveX = e.x - (this.mouseStartPosition?.x || 0);
80
- const moveY = e.y - (this.mouseStartPosition?.y || 0);
81
- switch (drag.type) {
82
- case DragType.field:
83
- this.movingColumn(drag, moveX);
84
- break;
85
- case DragType.record:
86
- this.movingRecord(drag, moveY);
87
- break;
88
- case DragType.columnWidth:
89
- this.movingColumnWidth(drag, moveX);
90
- break;
91
- }
92
- }
93
- movingColumn(drag, moveX) {
94
- const aiTable = this.aiTableGridSelectionService.aiTable;
95
- const scroll = drag.scroll || { x: 0, y: 0 };
96
- const coordinate = drag.coordinate;
97
- const fields = aiTable.gridData().fields;
98
- const width = this.calculateDragWidth(fields, coordinate, drag);
99
- const visibleColumnIndexMap = aiTable.context.visibleColumnsIndexMap();
100
- const sourceColumnIndex = visibleColumnIndexMap.get(drag.sourceIds.values().next().value) || 0;
101
- const sourceColumnStartX = coordinate.getColumnOffset(sourceColumnIndex);
102
- const sourceColumnWidth = coordinate.getColumnWidth(sourceColumnIndex);
103
- // TODO: 目前默认第一列为冻结列,后期支持设置冻结列需要处理
104
- const isSourceColumnFrozen = sourceColumnIndex === 0;
105
- const frozenColumnWidth = coordinate.getColumnWidth(0);
106
- const pointerX = moveX + sourceColumnStartX;
107
- // 拖拽中心点
108
- const dragCenter = sourceColumnWidth / 2;
109
- const rectLeft = pointerX - (isSourceColumnFrozen ? 0 : scroll.x);
110
- this.setRectStyles({
111
- cursor: 'move',
112
- width: `${width}px`,
113
- height: '100%',
114
- top: '0',
115
- left: `${rectLeft}px`
116
- });
117
- const lastColumnOffset = coordinate.getColumnOffset(coordinate.columnCount - 1);
118
- const lastColumnWidth = coordinate.getColumnWidth(coordinate.columnCount - 1);
119
- let targetColumnIndex = coordinate.getColumnStartIndex(pointerX + (isSourceColumnFrozen ? scroll.x : 0) + dragCenter);
120
- let targetColumnStartX = coordinate.getColumnOffset(targetColumnIndex);
121
- let isLastColumn = false;
122
- // 处理最后一列
123
- if (pointerX + dragCenter > lastColumnOffset + lastColumnWidth) {
124
- targetColumnIndex = coordinate.columnCount;
125
- targetColumnStartX = lastColumnOffset + lastColumnWidth;
126
- isLastColumn = true;
127
- }
128
- if ((targetColumnIndex >= 0 && (targetColumnIndex - sourceColumnIndex > 1 || targetColumnIndex - sourceColumnIndex < 0)) ||
129
- isLastColumn) {
130
- let lineLeft = targetColumnStartX - scroll.x;
131
- const lineForFrozenX = lineLeft - frozenColumnWidth - aiTable.context.rowHeadWidth();
132
- const rectDistanceFrozenX = rectLeft - frozenColumnWidth - aiTable.context.rowHeadWidth();
133
- if (lineForFrozenX < 0) {
134
- if (Math.abs(rectDistanceFrozenX) > dragCenter) {
135
- lineLeft = coordinate.getColumnOffset(0);
136
- targetColumnIndex = 0;
137
- }
138
- else {
139
- return;
140
- }
141
- }
142
- this.setAuxiliaryLineStyles({
143
- width: '2px',
144
- height: '100%',
145
- top: 0,
146
- left: `${lineLeft}px`
147
- });
148
- // 向右移动目标在目标列的前一列
149
- if (targetColumnIndex > sourceColumnIndex) {
150
- targetColumnIndex -= 1;
151
- }
152
- this.draggedData = {
153
- type: DragType.field,
154
- targetIndex: targetColumnIndex,
155
- fieldIds: drag.sourceIds,
156
- fieldsIndex: Array.from(drag.sourceIds).map((id) => visibleColumnIndexMap.get(id) || 0)
157
- };
158
- }
159
- else {
160
- this.resetAuxiliaryLine();
161
- this.draggedData = null;
162
- }
163
- }
164
- movingColumnWidth(drag, moveX) {
165
- this.setCursorStyle('col-resize');
166
- const aiTable = this.aiTableGridSelectionService.aiTable;
167
- const visibleColumnIndexMap = aiTable.context.visibleColumnsIndexMap();
168
- const sourceColumnIndex = visibleColumnIndexMap.get(drag.sourceIds.values().next().value) || 0;
169
- const sourceColumnStartX = drag.coordinate.getColumnOffset(sourceColumnIndex);
170
- const sourceColumnWidth = drag.coordinate.getColumnWidth(sourceColumnIndex);
171
- const scroll = drag.scroll || { x: 0, y: 0 };
172
- const pointerX = moveX + sourceColumnStartX;
173
- const colResizeX = pointerX - (sourceColumnIndex === 0 ? 0 : scroll.x);
174
- const left = `${colResizeX + sourceColumnWidth}px`;
175
- this.setAuxiliaryLineStyles({
176
- width: '2px',
177
- height: '100%',
178
- top: '0',
179
- left
180
- });
181
- this.draggedData = {
182
- type: DragType.columnWidth,
183
- fieldIds: drag.sourceIds,
184
- width: Math.max(MIN_COLUMN_WIDTH, sourceColumnWidth + moveX)
185
- };
186
- }
187
- movingRecord(drag, moveY) {
188
- const aiTable = this.aiTableGridSelectionService.aiTable;
189
- const scroll = drag.scroll || { x: 0, y: 0 };
190
- const coordinate = drag.coordinate;
191
- const visibleRowIndexMap = aiTable.context.visibleRowsIndexMap();
192
- const sourceRowId = drag.sourceIds.values().next().value;
193
- const sourceRowIndex = visibleRowIndexMap.get(sourceRowId) || 0;
194
- const sourceRowStartY = coordinate.getRowOffset(sourceRowIndex);
195
- const sourceRowHeight = coordinate.getRowHeight(sourceRowIndex);
196
- const pointerY = sourceRowStartY + moveY;
197
- this.setRectStyles({
198
- width: '100%',
199
- height: `${sourceRowHeight}px`,
200
- top: `${pointerY - scroll.y}px`,
201
- left: '0'
202
- });
203
- const dragCenter = sourceRowHeight / 2;
204
- const targetRowIndex = coordinate.getRowStartIndex(pointerY + dragCenter);
205
- const targetRowStartY = coordinate.getRowOffset(targetRowIndex);
206
- const lineTop = targetRowStartY - scroll.y;
207
- const lineHeight = 2;
208
- if (((targetRowIndex >= 0 && sourceRowIndex > targetRowIndex && sourceRowIndex - targetRowIndex > 0) ||
209
- (sourceRowIndex < targetRowIndex && targetRowIndex - sourceRowIndex > 1)) &&
210
- lineTop > AI_TABLE_FIELD_HEAD_HEIGHT - lineHeight && // 限制可视范围内
211
- lineTop < coordinate.containerHeight - lineHeight) {
212
- this.setAuxiliaryLineStyles({
213
- width: `calc(100% - ${AI_TABLE_ROW_DRAG_ICON_WIDTH}px)`,
214
- height: `${lineHeight}px`,
215
- top: `${lineTop}px`,
216
- left: `${AI_TABLE_ROW_DRAG_ICON_WIDTH}px`
217
- });
218
- this.draggedData = {
219
- type: DragType.record,
220
- recordIds: drag.sourceIds,
221
- targetIndex: targetRowIndex
222
- };
223
- }
224
- else {
225
- this.resetAuxiliaryLine();
226
- this.draggedData = null;
227
- }
228
- }
229
- handleDragEnd() {
230
- if (this.draggedData) {
231
- this.dragEnd.emit({ ...this.draggedData });
232
- }
233
- this.clearDragState();
234
- }
235
- clearDragState() {
236
- this.setDisplayStyle('none');
237
- this.setRectStyles({
238
- width: '0',
239
- height: '0',
240
- top: '0',
241
- left: '0'
242
- });
243
- this.setAuxiliaryLineStyles({
244
- width: '0',
245
- height: '0',
246
- top: '0',
247
- left: '0'
248
- });
249
- this.draggedData = null;
250
- }
251
- calculateDragWidth(fields, coordinate, drag) {
252
- let width = 0;
253
- fields.forEach((field, index) => {
254
- if (drag.sourceIds.has(field._id)) {
255
- width += coordinate.columnIndicesSizeMap[index] || 0;
256
- }
257
- });
258
- return width;
259
- }
260
- setDisplayStyle(display) {
261
- this.render2.setStyle(this.elementRef.nativeElement, 'display', display);
262
- }
263
- setCursorStyle(cursor) {
264
- this.render2.setStyle(this.elementRef.nativeElement, 'cursor', cursor);
265
- }
266
- setRectStyles(styles) {
267
- Object.entries(styles).forEach(([prop, value]) => {
268
- this.render2.setStyle(this.rect, prop, value);
269
- });
270
- }
271
- setAuxiliaryLineStyles(styles) {
272
- Object.entries(styles).forEach(([prop, value]) => {
273
- this.render2.setStyle(this.auxiliaryLine, prop, value);
274
- });
275
- }
276
- resetAuxiliaryLine() {
277
- this.setAuxiliaryLineStyles({ width: 0, height: 0, top: '0', left: '0' });
278
- }
279
- ngOnDestroy() {
280
- if (this.mousedownListener)
281
- this.mousedownListener();
282
- if (this.mousemoveListener)
283
- this.mousemoveListener();
284
- if (this.mouseupListener)
285
- this.mouseupListener();
286
- if (this.timer) {
287
- cancelAnimationFrame(this.timer);
288
- this.timer = null;
289
- }
290
- }
291
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AITableDragComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
292
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: AITableDragComponent, isStandalone: true, selector: "ai-table-drag", outputs: { dragEnd: "dragEnd" }, host: { classAttribute: "ai-table-drag-container" }, ngImport: i0, template: "<div class=\"rect\"></div>\n<div class=\"auxiliary-line\"></div>", changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
293
- }
294
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AITableDragComponent, decorators: [{
295
- type: Component,
296
- args: [{ selector: 'ai-table-drag', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, host: {
297
- class: 'ai-table-drag-container'
298
- }, template: "<div class=\"rect\"></div>\n<div class=\"auxiliary-line\"></div>" }]
299
- }], ctorParameters: () => [] });
300
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJhZy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9ncmlkL3NyYy9jb21wb25lbnRzL2RyYWcvZHJhZy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9ncmlkL3NyYy9jb21wb25lbnRzL2RyYWcvZHJhZy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFxQixNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3JJLE9BQU8sRUFBZSxRQUFRLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUN4RCxPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUMvRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUN4RCxPQUFPLEVBQUUsMEJBQTBCLEVBQUUsNEJBQTRCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQzs7QUFZakcsTUFBTSxPQUFPLG9CQUFvQjtJQTZCN0I7UUE1QkEsWUFBTyxHQUFHLE1BQU0sRUFBZSxDQUFDO1FBRXhCLGdDQUEyQixHQUFHLE1BQU0sQ0FBQywyQkFBMkIsQ0FBQyxDQUFDO1FBRWxFLFlBQU8sR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUM7UUFFcEMsZUFBVSxHQUE0QixNQUFNLENBQUMsQ0FBQSxVQUF1QixDQUFBLENBQUMsQ0FBQztRQU05RCxnQkFBVyxHQUF1QixJQUFJLENBQUM7UUFFdkMsdUJBQWtCLEdBQW9DLElBQUksQ0FBQztRQUUzRCxnQkFBVyxHQUE0QixJQUFJLENBQUM7UUFJNUMscUJBQWdCLEdBQVEsSUFBSSxDQUFDO1FBRTdCLHNCQUFpQixHQUFZLEtBQUssQ0FBQztRQU92QyxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsSUFB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RCxXQUFXO1FBQ1AsSUFBSSxJQUFJLENBQUMsaUJBQWlCO1lBQUUsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7UUFDckQsSUFBSSxJQUFJLENBQUMsaUJBQWlCO1lBQUUsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7UUFDckQsSUFBSSxJQUFJLENBQUMsZUFBZTtZQUFFLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUVqRCxJQUFJLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNiLG9CQUFvQixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNqQyxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQztRQUN0QixDQUFDO0lBQ0wsQ0FBQzsrR0F4VVEsb0JBQW9CO21HQUFwQixvQkFBb0IsK0pDaEJqQyxrRUFDa0M7OzRGRGVyQixvQkFBb0I7a0JBVGhDLFNBQVM7K0JBQ0ksZUFBZSxjQUViLElBQUksbUJBQ0MsdUJBQXVCLENBQUMsTUFBTSxRQUN6Qzt3QkFDRixLQUFLLEVBQUUseUJBQXlCO3FCQUNuQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIGVmZmVjdCwgRWxlbWVudFJlZiwgaW5qZWN0LCBPbkRlc3Ryb3ksIE9uSW5pdCwgb3V0cHV0LCBSZW5kZXJlcjIgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IERyYWdFbmREYXRhLCBEcmFnVHlwZSB9IGZyb20gJ0BhaS10YWJsZS91dGlscyc7XG5pbXBvcnQgeyBBSVRhYmxlR3JpZFNlbGVjdGlvblNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9zZWxlY3Rpb24uc2VydmljZSc7XG5pbXBvcnQgeyBNSU5fQ09MVU1OX1dJRFRIIH0gZnJvbSAnLi4vLi4vY29uc3RhbnRzL2dyaWQnO1xuaW1wb3J0IHsgQUlfVEFCTEVfRklFTERfSEVBRF9IRUlHSFQsIEFJX1RBQkxFX1JPV19EUkFHX0lDT05fV0lEVEggfSBmcm9tICcuLi8uLi9jb25zdGFudHMvdGFibGUnO1xuaW1wb3J0IHsgQUlUYWJsZURyYWdTdGF0ZSB9IGZyb20gJy4uLy4uL2NvcmUnO1xuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ2FpLXRhYmxlLWRyYWcnLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9kcmFnLmNvbXBvbmVudC5odG1sJyxcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxuICAgIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICAgIGhvc3Q6IHtcbiAgICAgICAgY2xhc3M6ICdhaS10YWJsZS1kcmFnLWNvbnRhaW5lcidcbiAgICB9XG59KVxuZXhwb3J0IGNsYXNzIEFJVGFibGVEcmFnQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuICAgIGRyYWdFbmQgPSBvdXRwdXQ8RHJhZ0VuZERhdGE+KCk7XG5cbiAgICBwcml2YXRlIGFpVGFibGVHcmlkU2VsZWN0aW9uU2VydmljZSA9IGluamVjdChBSVRhYmxlR3JpZFNlbGVjdGlvblNlcnZpY2UpO1xuXG4gICAgcHJpdmF0ZSByZW5kZXIyID0gaW5qZWN0KFJlbmRlcmVyMik7XG5cbiAgICBlbGVtZW50UmVmOiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PiA9IGluamVjdChFbGVtZW50UmVmPEhUTUxFbGVtZW50Pik7XG5cbiAgICBwcml2YXRlIHJlY3QhOiBIVE1MRWxlbWVudDtcblxuICAgIHByaXZhdGUgYXV4aWxpYXJ5TGluZSE6IEhUTUxFbGVtZW50O1xuXG4gICAgcHJpdmF0ZSBkcmFnZ2VkRGF0YTogRHJhZ0VuZERhdGEgfCBudWxsID0gbnVsbDtcblxuICAgIHByaXZhdGUgbW91c2VTdGFydFBvc2l0aW9uOiB7IHg6IG51bWJlcjsgeTogbnVtYmVyIH0gfCBudWxsID0gbnVsbDtcblxuICAgIHByaXZhdGUgYWlUYWJsZURyYWc6IEFJVGFibGVEcmFnU3RhdGUgfCBudWxsID0gbnVsbDtcblxuICAgIHByaXZhdGUgdGltZXIhOiBudW1iZXIgfCBudWxsO1xuXG4gICAgcHJpdmF0ZSBtb3VzZURvd25UaW1lb3V0OiBhbnkgPSBudWxsO1xuXG4gICAgcHJpdmF0ZSBpc0RyYWdnaW5nRW5hYmxlZDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gICAgcHJpdmF0ZSBtb3VzZWRvd25MaXN0ZW5lcj86ICgpID0+IHZvaWQ7XG4gICAgcHJpdmF0ZSBtb3VzZW1vdmVMaXN0ZW5lcj86ICgpID0+IHZvaWQ7XG4gICAgcHJpdmF0ZSBtb3VzZXVwTGlzdGVuZXI/OiAoKSA9PiB2b2lkO1xuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIGVmZmVjdCgoKSA9PiB0aGlzLmhhbmRsZURyYWdTdGF0ZUNoYW5nZSgpKTtcbiAgICB9XG5cbiAgICBuZ09uSW5pdCgpIHtcbiAgICAgICAgdGhpcy5pbml0RWxlbWVudHMoKTtcbiAgICAgICAgdGhpcy5zZXR1cEV2ZW50TGlzdGVuZXJzKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpbml0RWxlbWVudHMoKTogdm9pZCB7XG4gICAgICAgIHRoaXMucmVjdCA9IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJy5yZWN0JykhO1xuICAgICAgICB0aGlzLmF1eGlsaWFyeUxpbmUgPSB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKCcuYXV4aWxpYXJ5LWxpbmUnKSE7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzZXR1cEV2ZW50TGlzdGVuZXJzKCk6IHZvaWQge1xuICAgICAgICB0aGlzLm1vdXNlZG93bkxpc3RlbmVyID0gdGhpcy5yZW5kZXIyLmxpc3Rlbignd2luZG93JywgJ21vdXNlZG93bicsIChlOiBNb3VzZUV2ZW50KSA9PiB7XG4gICAgICAgICAgICB0aGlzLm1vdXNlU3RhcnRQb3NpdGlvbiA9IHsgeDogZS54LCB5OiBlLnkgfTtcblxuICAgICAgICAgICAgaWYgKHRoaXMubW91c2VEb3duVGltZW91dCkge1xuICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aGlzLm1vdXNlRG93blRpbWVvdXQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5pc0RyYWdnaW5nRW5hYmxlZCA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5tb3VzZURvd25UaW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5pc0RyYWdnaW5nRW5hYmxlZCA9IHRydWU7XG4gICAgICAgICAgICB9LCAyMDApO1xuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLm1vdXNlbW92ZUxpc3RlbmVyID0gdGhpcy5yZW5kZXIyLmxpc3Rlbignd2luZG93JywgJ21vdXNlbW92ZScsIChlOiBNb3VzZUV2ZW50KSA9PiB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuaXNEcmFnZ2luZ0VuYWJsZWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy50aW1lcikge1xuICAgICAgICAgICAgICAgIGNhbmNlbEFuaW1hdGlvbkZyYW1lKHRoaXMudGltZXIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy50aW1lciA9IHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuYWlUYWJsZURyYWcgJiYgdGhpcy5tb3VzZVN0YXJ0UG9zaXRpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVEcmFnKGUsIHRoaXMuYWlUYWJsZURyYWcpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLm1vdXNldXBMaXN0ZW5lciA9IHRoaXMucmVuZGVyMi5saXN0ZW4oJ3dpbmRvdycsICdtb3VzZXVwJywgKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMubW91c2VEb3duVGltZW91dCkge1xuICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aGlzLm1vdXNlRG93blRpbWVvdXQpO1xuICAgICAgICAgICAgICAgIHRoaXMubW91c2VEb3duVGltZW91dCA9IG51bGw7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuaXNEcmFnZ2luZ0VuYWJsZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMubW91c2VTdGFydFBvc2l0aW9uID0gbnVsbDtcbiAgICAgICAgICAgIHRoaXMuYWlUYWJsZURyYWcgPSBudWxsO1xuICAgICAgICAgICAgdGhpcy5oYW5kbGVEcmFnRW5kKCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgaGFuZGxlRHJhZ1N0YXRlQ2hhbmdlKCk6IHZvaWQge1xuICAgICAgICBjb25zdCBkcmFnID0gdGhpcy5haVRhYmxlR3JpZFNlbGVjdGlvblNlcnZpY2UuYWlUYWJsZS5kcmFnU3RhdGU/LigpO1xuXG4gICAgICAgIGlmICghZHJhZykge1xuICAgICAgICAgICAgdGhpcy5haVRhYmxlRHJhZyA9IG51bGw7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZHJhZy50eXBlID09PSBEcmFnVHlwZS5ub25lIHx8ICF0aGlzLnJlY3QgfHwgIXRoaXMuYXV4aWxpYXJ5TGluZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5haVRhYmxlRHJhZyA9IGRyYWc7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBoYW5kbGVEcmFnKGU6IE1vdXNlRXZlbnQsIGRyYWc6IEFJVGFibGVEcmFnU3RhdGUpIHtcbiAgICAgICAgaWYgKGRyYWcudHlwZSA9PT0gRHJhZ1R5cGUubm9uZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2V0RGlzcGxheVN0eWxlKCdibG9jaycpO1xuICAgICAgICBjb25zdCBtb3ZlWCA9IGUueCAtICh0aGlzLm1vdXNlU3RhcnRQb3NpdGlvbj8ueCB8fCAwKTtcbiAgICAgICAgY29uc3QgbW92ZVkgPSBlLnkgLSAodGhpcy5tb3VzZVN0YXJ0UG9zaXRpb24/LnkgfHwgMCk7XG4gICAgICAgIHN3aXRjaCAoZHJhZy50eXBlKSB7XG4gICAgICAgICAgICBjYXNlIERyYWdUeXBlLmZpZWxkOlxuICAgICAgICAgICAgICAgIHRoaXMubW92aW5nQ29sdW1uKGRyYWcsIG1vdmVYKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgRHJhZ1R5cGUucmVjb3JkOlxuICAgICAgICAgICAgICAgIHRoaXMubW92aW5nUmVjb3JkKGRyYWcsIG1vdmVZKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgRHJhZ1R5cGUuY29sdW1uV2lkdGg6XG4gICAgICAgICAgICAgICAgdGhpcy5tb3ZpbmdDb2x1bW5XaWR0aChkcmFnLCBtb3ZlWCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIG1vdmluZ0NvbHVtbihkcmFnOiBBSVRhYmxlRHJhZ1N0YXRlLCBtb3ZlWDogbnVtYmVyKSB7XG4gICAgICAgIGNvbnN0IGFpVGFibGUgPSB0aGlzLmFpVGFibGVHcmlkU2VsZWN0aW9uU2VydmljZS5haVRhYmxlO1xuICAgICAgICBjb25zdCBzY3JvbGwgPSBkcmFnLnNjcm9sbCB8fCB7IHg6IDAsIHk6IDAgfTtcbiAgICAgICAgY29uc3QgY29vcmRpbmF0ZSA9IGRyYWcuY29vcmRpbmF0ZSE7XG4gICAgICAgIGNvbnN0IGZpZWxkcyA9IGFpVGFibGUuZ3JpZERhdGEoKS5maWVsZHM7XG4gICAgICAgIGNvbnN0IHdpZHRoID0gdGhpcy5jYWxjdWxhdGVEcmFnV2lkdGgoZmllbGRzLCBjb29yZGluYXRlLCBkcmFnKTtcbiAgICAgICAgY29uc3QgdmlzaWJsZUNvbHVtbkluZGV4TWFwID0gYWlUYWJsZS5jb250ZXh0IS52aXNpYmxlQ29sdW1uc0luZGV4TWFwKCk7XG4gICAgICAgIGNvbnN0IHNvdXJjZUNvbHVtbkluZGV4ID0gdmlzaWJsZUNvbHVtbkluZGV4TWFwLmdldChkcmFnLnNvdXJjZUlkcy52YWx1ZXMoKS5uZXh0KCkudmFsdWUhKSB8fCAwO1xuICAgICAgICBjb25zdCBzb3VyY2VDb2x1bW5TdGFydFggPSBjb29yZGluYXRlLmdldENvbHVtbk9mZnNldChzb3VyY2VDb2x1bW5JbmRleCk7XG4gICAgICAgIGNvbnN0IHNvdXJjZUNvbHVtbldpZHRoID0gY29vcmRpbmF0ZS5nZXRDb2x1bW5XaWR0aChzb3VyY2VDb2x1bW5JbmRleCk7XG4gICAgICAgIC8vIFRPRE86IOebruWJjem7mOiupOesrOS4gOWIl+S4uuWGu+e7k+WIl++8jOWQjuacn+aUr+aMgeiuvue9ruWGu+e7k+WIl+mcgOimgeWkhOeQhlxuICAgICAgICBjb25zdCBpc1NvdXJjZUNvbHVtbkZyb3plbiA9IHNvdXJjZUNvbHVtbkluZGV4ID09PSAwO1xuICAgICAgICBjb25zdCBmcm96ZW5Db2x1bW5XaWR0aCA9IGNvb3JkaW5hdGUuZ2V0Q29sdW1uV2lkdGgoMCk7XG4gICAgICAgIGNvbnN0IHBvaW50ZXJYID0gbW92ZVggKyBzb3VyY2VDb2x1bW5TdGFydFg7XG4gICAgICAgIC8vIOaLluaLveS4reW/g+eCuVxuICAgICAgICBjb25zdCBkcmFnQ2VudGVyID0gc291cmNlQ29sdW1uV2lkdGggLyAyO1xuICAgICAgICBjb25zdCByZWN0TGVmdCA9IHBvaW50ZXJYIC0gKGlzU291cmNlQ29sdW1uRnJvemVuID8gMCA6IHNjcm9sbC54KTtcbiAgICAgICAgdGhpcy5zZXRSZWN0U3R5bGVzKHtcbiAgICAgICAgICAgIGN1cnNvcjogJ21vdmUnLFxuICAgICAgICAgICAgd2lkdGg6IGAke3dpZHRofXB4YCxcbiAgICAgICAgICAgIGhlaWdodDogJzEwMCUnLFxuICAgICAgICAgICAgdG9wOiAnMCcsXG4gICAgICAgICAgICBsZWZ0OiBgJHtyZWN0TGVmdH1weGBcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3QgbGFzdENvbHVtbk9mZnNldCA9IGNvb3JkaW5hdGUuZ2V0Q29sdW1uT2Zmc2V0KGNvb3JkaW5hdGUuY29sdW1uQ291bnQgLSAxKTtcbiAgICAgICAgY29uc3QgbGFzdENvbHVtbldpZHRoID0gY29vcmRpbmF0ZS5nZXRDb2x1bW5XaWR0aChjb29yZGluYXRlLmNvbHVtbkNvdW50IC0gMSk7XG5cbiAgICAgICAgbGV0IHRhcmdldENvbHVtbkluZGV4ID0gY29vcmRpbmF0ZS5nZXRDb2x1bW5TdGFydEluZGV4KHBvaW50ZXJYICsgKGlzU291cmNlQ29sdW1uRnJvemVuID8gc2Nyb2xsLnggOiAwKSArIGRyYWdDZW50ZXIpO1xuICAgICAgICBsZXQgdGFyZ2V0Q29sdW1uU3RhcnRYID0gY29vcmRpbmF0ZS5nZXRDb2x1bW5PZmZzZXQodGFyZ2V0Q29sdW1uSW5kZXgpO1xuICAgICAgICBsZXQgaXNMYXN0Q29sdW1uID0gZmFsc2U7XG4gICAgICAgIC8vIOWkhOeQhuacgOWQjuS4gOWIl1xuICAgICAgICBpZiAocG9pbnRlclggKyBkcmFnQ2VudGVyID4gbGFzdENvbHVtbk9mZnNldCArIGxhc3RDb2x1bW5XaWR0aCkge1xuICAgICAgICAgICAgdGFyZ2V0Q29sdW1uSW5kZXggPSBjb29yZGluYXRlLmNvbHVtbkNvdW50O1xuICAgICAgICAgICAgdGFyZ2V0Q29sdW1uU3RhcnRYID0gbGFzdENvbHVtbk9mZnNldCArIGxhc3RDb2x1bW5XaWR0aDtcbiAgICAgICAgICAgIGlzTGFzdENvbHVtbiA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgKHRhcmdldENvbHVtbkluZGV4ID49IDAgJiYgKHRhcmdldENvbHVtbkluZGV4IC0gc291cmNlQ29sdW1uSW5kZXggPiAxIHx8IHRhcmdldENvbHVtbkluZGV4IC0gc291cmNlQ29sdW1uSW5kZXggPCAwKSkgfHxcbiAgICAgICAgICAgIGlzTGFzdENvbHVtblxuICAgICAgICApIHtcbiAgICAgICAgICAgIGxldCBsaW5lTGVmdCA9IHRhcmdldENvbHVtblN0YXJ0WCAtIHNjcm9sbC54O1xuICAgICAgICAgICAgY29uc3QgbGluZUZvckZyb3plblggPSBsaW5lTGVmdCAtIGZyb3plbkNvbHVtbldpZHRoIC0gYWlUYWJsZS5jb250ZXh0IS5yb3dIZWFkV2lkdGgoKTtcbiAgICAgICAgICAgIGNvbnN0IHJlY3REaXN0YW5jZUZyb3plblggPSByZWN0TGVmdCAtIGZyb3plbkNvbHVtbldpZHRoIC0gYWlUYWJsZS5jb250ZXh0IS5yb3dIZWFkV2lkdGgoKTtcbiAgICAgICAgICAgIGlmIChsaW5lRm9yRnJvemVuWCA8IDApIHtcbiAgICAgICAgICAgICAgICBpZiAoTWF0aC5hYnMocmVjdERpc3RhbmNlRnJvemVuWCkgPiBkcmFnQ2VudGVyKSB7XG4gICAgICAgICAgICAgICAgICAgIGxpbmVMZWZ0ID0gY29vcmRpbmF0ZS5nZXRDb2x1bW5PZmZzZXQoMCk7XG4gICAgICAgICAgICAgICAgICAgIHRhcmdldENvbHVtbkluZGV4ID0gMDtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5zZXRBdXhpbGlhcnlMaW5lU3R5bGVzKHtcbiAgICAgICAgICAgICAgICB3aWR0aDogJzJweCcsXG4gICAgICAgICAgICAgICAgaGVpZ2h0OiAnMTAwJScsXG4gICAgICAgICAgICAgICAgdG9wOiAwLFxuICAgICAgICAgICAgICAgIGxlZnQ6IGAke2xpbmVMZWZ0fXB4YFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAvLyDlkJHlj7Pnp7vliqjnm67moIflnKjnm67moIfliJfnmoTliY3kuIDliJdcbiAgICAgICAgICAgIGlmICh0YXJnZXRDb2x1bW5JbmRleCA+IHNvdXJjZUNvbHVtbkluZGV4KSB7XG4gICAgICAgICAgICAgICAgdGFyZ2V0Q29sdW1uSW5kZXggLT0gMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuZHJhZ2dlZERhdGEgPSB7XG4gICAgICAgICAgICAgICAgdHlwZTogRHJhZ1R5cGUuZmllbGQsXG4gICAgICAgICAgICAgICAgdGFyZ2V0SW5kZXg6IHRhcmdldENvbHVtbkluZGV4LFxuICAgICAgICAgICAgICAgIGZpZWxkSWRzOiBkcmFnLnNvdXJjZUlkcyxcbiAgICAgICAgICAgICAgICBmaWVsZHNJbmRleDogQXJyYXkuZnJvbShkcmFnLnNvdXJjZUlkcykubWFwKChpZCkgPT4gdmlzaWJsZUNvbHVtbkluZGV4TWFwLmdldChpZCkgfHwgMClcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnJlc2V0QXV4aWxpYXJ5TGluZSgpO1xuICAgICAgICAgICAgdGhpcy5kcmFnZ2VkRGF0YSA9IG51bGw7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIG1vdmluZ0NvbHVtbldpZHRoKGRyYWc6IEFJVGFibGVEcmFnU3RhdGUsIG1vdmVYOiBudW1iZXIpIHtcbiAgICAgICAgdGhpcy5zZXRDdXJzb3JTdHlsZSgnY29sLXJlc2l6ZScpO1xuICAgICAgICBjb25zdCBhaVRhYmxlID0gdGhpcy5haVRhYmxlR3JpZFNlbGVjdGlvblNlcnZpY2UuYWlUYWJsZTtcbiAgICAgICAgY29uc3QgdmlzaWJsZUNvbHVtbkluZGV4TWFwID0gYWlUYWJsZS5jb250ZXh0IS52aXNpYmxlQ29sdW1uc0luZGV4TWFwKCk7XG4gICAgICAgIGNvbnN0IHNvdXJjZUNvbHVtbkluZGV4ID0gdmlzaWJsZUNvbHVtbkluZGV4TWFwLmdldChkcmFnLnNvdXJjZUlkcy52YWx1ZXMoKS5uZXh0KCkudmFsdWUhKSB8fCAwO1xuICAgICAgICBjb25zdCBzb3VyY2VDb2x1bW5TdGFydFggPSBkcmFnLmNvb3JkaW5hdGUhLmdldENvbHVtbk9mZnNldChzb3VyY2VDb2x1bW5JbmRleCk7XG4gICAgICAgIGNvbnN0IHNvdXJjZUNvbHVtbldpZHRoID0gZHJhZy5jb29yZGluYXRlIS5nZXRDb2x1bW5XaWR0aChzb3VyY2VDb2x1bW5JbmRleCk7XG4gICAgICAgIGNvbnN0IHNjcm9sbCA9IGRyYWcuc2Nyb2xsIHx8IHsgeDogMCwgeTogMCB9O1xuICAgICAgICBjb25zdCBwb2ludGVyWCA9IG1vdmVYICsgc291cmNlQ29sdW1uU3RhcnRYO1xuICAgICAgICBjb25zdCBjb2xSZXNpemVYID0gcG9pbnRlclggLSAoc291cmNlQ29sdW1uSW5kZXggPT09IDAgPyAwIDogc2Nyb2xsLngpO1xuICAgICAgICBjb25zdCBsZWZ0ID0gYCR7Y29sUmVzaXplWCArIHNvdXJjZUNvbHVtbldpZHRofXB4YDtcbiAgICAgICAgdGhpcy5zZXRBdXhpbGlhcnlMaW5lU3R5bGVzKHtcbiAgICAgICAgICAgIHdpZHRoOiAnMnB4JyxcbiAgICAgICAgICAgIGhlaWdodDogJzEwMCUnLFxuICAgICAgICAgICAgdG9wOiAnMCcsXG4gICAgICAgICAgICBsZWZ0XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmRyYWdnZWREYXRhID0ge1xuICAgICAgICAgICAgdHlwZTogRHJhZ1R5cGUuY29sdW1uV2lkdGgsXG4gICAgICAgICAgICBmaWVsZElkczogZHJhZy5zb3VyY2VJZHMsXG4gICAgICAgICAgICB3aWR0aDogTWF0aC5tYXgoTUlOX0NPTFVNTl9XSURUSCwgc291cmNlQ29sdW1uV2lkdGggKyBtb3ZlWClcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBwcml2YXRlIG1vdmluZ1JlY29yZChkcmFnOiBBSVRhYmxlRHJhZ1N0YXRlLCBtb3ZlWTogbnVtYmVyKSB7XG4gICAgICAgIGNvbnN0IGFpVGFibGUgPSB0aGlzLmFpVGFibGVHcmlkU2VsZWN0aW9uU2VydmljZS5haVRhYmxlO1xuICAgICAgICBjb25zdCBzY3JvbGwgPSBkcmFnLnNjcm9sbCB8fCB7IHg6IDAsIHk6IDAgfTtcbiAgICAgICAgY29uc3QgY29vcmRpbmF0ZSA9IGRyYWcuY29vcmRpbmF0ZSE7XG5cbiAgICAgICAgY29uc3QgdmlzaWJsZVJvd0luZGV4TWFwID0gYWlUYWJsZS5jb250ZXh0IS52aXNpYmxlUm93c0luZGV4TWFwKCk7XG4gICAgICAgIGNvbnN0IHNvdXJjZVJvd0lkID0gZHJhZy5zb3VyY2VJZHMudmFsdWVzKCkubmV4dCgpLnZhbHVlITtcbiAgICAgICAgY29uc3Qgc291cmNlUm93SW5kZXggPSB2aXNpYmxlUm93SW5kZXhNYXAuZ2V0KHNvdXJjZVJvd0lkKSB8fCAwO1xuICAgICAgICBjb25zdCBzb3VyY2VSb3dTdGFydFkgPSBjb29yZGluYXRlLmdldFJvd09mZnNldChzb3VyY2VSb3dJbmRleCk7XG4gICAgICAgIGNvbnN0IHNvdXJjZVJvd0hlaWdodCA9IGNvb3JkaW5hdGUuZ2V0Um93SGVpZ2h0KHNvdXJjZVJvd0luZGV4KTtcbiAgICAgICAgY29uc3QgcG9pbnRlclkgPSBzb3VyY2VSb3dTdGFydFkgKyBtb3ZlWTtcbiAgICAgICAgdGhpcy5zZXRSZWN0U3R5bGVzKHtcbiAgICAgICAgICAgIHdpZHRoOiAnMTAwJScsXG4gICAgICAgICAgICBoZWlnaHQ6IGAke3NvdXJjZVJvd0hlaWdodH1weGAsXG4gICAgICAgICAgICB0b3A6IGAke3BvaW50ZXJZIC0gc2Nyb2xsLnl9cHhgLFxuICAgICAgICAgICAgbGVmdDogJzAnXG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBkcmFnQ2VudGVyID0gc291cmNlUm93SGVpZ2h0IC8gMjtcbiAgICAgICAgY29uc3QgdGFyZ2V0Um93SW5kZXggPSBjb29yZGluYXRlLmdldFJvd1N0YXJ0SW5kZXgocG9pbnRlclkgKyBkcmFnQ2VudGVyKTtcbiAgICAgICAgY29uc3QgdGFyZ2V0Um93U3RhcnRZID0gY29vcmRpbmF0ZS5nZXRSb3dPZmZzZXQodGFyZ2V0Um93SW5kZXgpO1xuICAgICAgICBjb25zdCBsaW5lVG9wID0gdGFyZ2V0Um93U3RhcnRZIC0gc2Nyb2xsLnk7XG4gICAgICAgIGNvbnN0IGxpbmVIZWlnaHQgPSAyO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgICAoKHRhcmdldFJvd0luZGV4ID49IDAgJiYgc291cmNlUm93SW5kZXggPiB0YXJnZXRSb3dJbmRleCAmJiBzb3VyY2VSb3dJbmRleCAtIHRhcmdldFJvd0luZGV4ID4gMCkgfHxcbiAgICAgICAgICAgICAgICAoc291cmNlUm93SW5kZXggPCB0YXJnZXRSb3dJbmRleCAmJiB0YXJnZXRSb3dJbmRleCAtIHNvdXJjZVJvd0luZGV4ID4gMSkpICYmXG4gICAgICAgICAgICBsaW5lVG9wID4gQUlfVEFCTEVfRklFTERfSEVBRF9IRUlHSFQgLSBsaW5lSGVpZ2h0ICYmIC8vIOmZkOWItuWPr+inhuiMg+WbtOWGhVxuICAgICAgICAgICAgbGluZVRvcCA8IGNvb3JkaW5hdGUuY29udGFpbmVySGVpZ2h0IC0gbGluZUhlaWdodFxuICAgICAgICApIHtcbiAgICAgICAgICAgIHRoaXMuc2V0QXV4aWxpYXJ5TGluZVN0eWxlcyh7XG4gICAgICAgICAgICAgICAgd2lkdGg6IGBjYWxjKDEwMCUgLSAke0FJX1RBQkxFX1JPV19EUkFHX0lDT05fV0lEVEh9cHgpYCxcbiAgICAgICAgICAgICAgICBoZWlnaHQ6IGAke2xpbmVIZWlnaHR9cHhgLFxuICAgICAgICAgICAgICAgIHRvcDogYCR7bGluZVRvcH1weGAsXG4gICAgICAgICAgICAgICAgbGVmdDogYCR7QUlfVEFCTEVfUk9XX0RSQUdfSUNPTl9XSURUSH1weGBcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy5kcmFnZ2VkRGF0YSA9IHtcbiAgICAgICAgICAgICAgICB0eXBlOiBEcmFnVHlwZS5yZWNvcmQsXG4gICAgICAgICAgICAgICAgcmVjb3JkSWRzOiBkcmFnLnNvdXJjZUlkcyxcbiAgICAgICAgICAgICAgICB0YXJnZXRJbmRleDogdGFyZ2V0Um93SW5kZXhcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnJlc2V0QXV4aWxpYXJ5TGluZSgpO1xuICAgICAgICAgICAgdGhpcy5kcmFnZ2VkRGF0YSA9IG51bGw7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGhhbmRsZURyYWdFbmQoKSB7XG4gICAgICAgIGlmICh0aGlzLmRyYWdnZWREYXRhKSB7XG4gICAgICAgICAgICB0aGlzLmRyYWdFbmQuZW1pdCh7IC4uLnRoaXMuZHJhZ2dlZERhdGEgfSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jbGVhckRyYWdTdGF0ZSgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgY2xlYXJEcmFnU3RhdGUoKSB7XG4gICAgICAgIHRoaXMuc2V0RGlzcGxheVN0eWxlKCdub25lJyk7XG4gICAgICAgIHRoaXMuc2V0UmVjdFN0eWxlcyh7XG4gICAgICAgICAgICB3aWR0aDogJzAnLFxuICAgICAgICAgICAgaGVpZ2h0OiAnMCcsXG4gICAgICAgICAgICB0b3A6ICcwJyxcbiAgICAgICAgICAgIGxlZnQ6ICcwJ1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5zZXRBdXhpbGlhcnlMaW5lU3R5bGVzKHtcbiAgICAgICAgICAgIHdpZHRoOiAnMCcsXG4gICAgICAgICAgICBoZWlnaHQ6ICcwJyxcbiAgICAgICAgICAgIHRvcDogJzAnLFxuICAgICAgICAgICAgbGVmdDogJzAnXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmRyYWdnZWREYXRhID0gbnVsbDtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNhbGN1bGF0ZURyYWdXaWR0aChmaWVsZHM6IGFueVtdLCBjb29yZGluYXRlOiBhbnksIGRyYWc6IEFJVGFibGVEcmFnU3RhdGUpOiBudW1iZXIge1xuICAgICAgICBsZXQgd2lkdGggPSAwO1xuICAgICAgICBmaWVsZHMuZm9yRWFjaCgoZmllbGQsIGluZGV4KSA9PiB7XG4gICAgICAgICAgICBpZiAoZHJhZy5zb3VyY2VJZHMuaGFzKGZpZWxkLl9pZCkpIHtcbiAgICAgICAgICAgICAgICB3aWR0aCArPSBjb29yZGluYXRlLmNvbHVtbkluZGljZXNTaXplTWFwW2luZGV4XSB8fCAwO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHdpZHRoO1xuICAgIH1cblxuICAgIHByaXZhdGUgc2V0RGlzcGxheVN0eWxlKGRpc3BsYXk6IHN0cmluZykge1xuICAgICAgICB0aGlzLnJlbmRlcjIuc2V0U3R5bGUodGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsICdkaXNwbGF5JywgZGlzcGxheSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzZXRDdXJzb3JTdHlsZShjdXJzb3I6IHN0cmluZykge1xuICAgICAgICB0aGlzLnJlbmRlcjIuc2V0U3R5bGUodGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsICdjdXJzb3InLCBjdXJzb3IpO1xuICAgIH1cblxuICAgIHByaXZhdGUgc2V0UmVjdFN0eWxlcyhzdHlsZXM6IFJlY29yZDxzdHJpbmcsIGFueT4pIHtcbiAgICAgICAgT2JqZWN0LmVudHJpZXMoc3R5bGVzKS5mb3JFYWNoKChbcHJvcCwgdmFsdWVdKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnJlbmRlcjIuc2V0U3R5bGUodGhpcy5yZWN0LCBwcm9wLCB2YWx1ZSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgc2V0QXV4aWxpYXJ5TGluZVN0eWxlcyhzdHlsZXM6IFJlY29yZDxzdHJpbmcsIGFueT4pIHtcbiAgICAgICAgT2JqZWN0LmVudHJpZXMoc3R5bGVzKS5mb3JFYWNoKChbcHJvcCwgdmFsdWVdKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnJlbmRlcjIuc2V0U3R5bGUodGhpcy5hdXhpbGlhcnlMaW5lLCBwcm9wLCB2YWx1ZSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgcmVzZXRBdXhpbGlhcnlMaW5lKCk6IHZvaWQge1xuICAgICAgICB0aGlzLnNldEF1eGlsaWFyeUxpbmVTdHlsZXMoeyB3aWR0aDogMCwgaGVpZ2h0OiAwLCB0b3A6ICcwJywgbGVmdDogJzAnIH0pO1xuICAgIH1cblxuICAgIG5nT25EZXN0cm95KCkge1xuICAgICAgICBpZiAodGhpcy5tb3VzZWRvd25MaXN0ZW5lcikgdGhpcy5tb3VzZWRvd25MaXN0ZW5lcigpO1xuICAgICAgICBpZiAodGhpcy5tb3VzZW1vdmVMaXN0ZW5lcikgdGhpcy5tb3VzZW1vdmVMaXN0ZW5lcigpO1xuICAgICAgICBpZiAodGhpcy5tb3VzZXVwTGlzdGVuZXIpIHRoaXMubW91c2V1cExpc3RlbmVyKCk7XG5cbiAgICAgICAgaWYgKHRoaXMudGltZXIpIHtcbiAgICAgICAgICAgIGNhbmNlbEFuaW1hdGlvbkZyYW1lKHRoaXMudGltZXIpO1xuICAgICAgICAgICAgdGhpcy50aW1lciA9IG51bGw7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwicmVjdFwiPjwvZGl2PlxuPGRpdiBjbGFzcz1cImF1eGlsaWFyeS1saW5lXCI+PC9kaXY+Il19
@@ -1,47 +0,0 @@
1
- import { ChangeDetectionStrategy, Component, Input, computed } from '@angular/core';
2
- import { ThyDivider } from 'ngx-tethys/divider';
3
- import { ThyDropdownAbstractMenu, ThyDropdownMenuItemDirective } from 'ngx-tethys/dropdown';
4
- import { ThyIcon } from 'ngx-tethys/icon';
5
- import { NgClass } from '@angular/common';
6
- import * as i0 from "@angular/core";
7
- export class AITableFieldMenu extends ThyDropdownAbstractMenu {
8
- constructor() {
9
- super(...arguments);
10
- this.field = computed(() => {
11
- return this.aiTable.fields().find((item) => item._id === this.fieldId);
12
- });
13
- }
14
- execute(menu) {
15
- if ((menu.disabled && !menu.disabled(this.aiTable, this.field)) || !menu.disabled) {
16
- menu.exec && menu.exec(this.aiTable, this.field, this.origin, this.position);
17
- }
18
- }
19
- getMenuName(menu, field) {
20
- if (typeof menu.name === 'function') {
21
- return menu.name(field);
22
- }
23
- return menu.name || '';
24
- }
25
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AITableFieldMenu, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
26
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: AITableFieldMenu, isStandalone: true, selector: "ai-table-field-menu", inputs: { fieldId: "fieldId", aiTable: "aiTable", fieldMenus: "fieldMenus", origin: "origin", position: "position" }, host: { classAttribute: "field-menu" }, usesInheritance: true, ngImport: i0, template: "@if (field()) {\n @for (menu of fieldMenus; track index; let index = $index) {\n @if ((menu.hidden && !menu.hidden(aiTable, field)) || !menu.hidden) {\n @if (menu.type === 'divider') {\n <thy-divider [thyStyle]=\"'solid'\"></thy-divider>\n } @else {\n @let disabled = !!(menu.disabled && menu.disabled(aiTable, field));\n @let isRemoveField = menu.type === 'removeField';\n <a\n thyDropdownMenuItem\n href=\"javascript:;\"\n [ngClass]=\"{ 'remove-field': isRemoveField && !disabled }\"\n (click)=\"execute(menu)\"\n [thyDisabled]=\"disabled\"\n >\n <thy-icon [thyIconName]=\"menu.icon!\"></thy-icon>\n <span>{{ getMenuName(menu, field()) }}</span>\n </a>\n }\n }\n }\n}\n", dependencies: [{ kind: "component", type: ThyIcon, selector: "thy-icon, [thy-icon]", inputs: ["thyIconType", "thyTwotoneColor", "thyIconName", "thyIconRotate", "thyIconSet", "thyIconLegging", "thyIconLinearGradient"] }, { kind: "component", type: ThyDivider, selector: "thy-divider", inputs: ["thyVertical", "thyStyle", "thyColor", "thyText", "thyTextDirection", "thyDeeper"] }, { kind: "directive", type: ThyDropdownMenuItemDirective, selector: "[thyDropdownMenuItem]", inputs: ["thyType", "thyDisabled"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
27
- }
28
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AITableFieldMenu, decorators: [{
29
- type: Component,
30
- args: [{ selector: 'ai-table-field-menu', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, host: {
31
- class: 'field-menu'
32
- }, imports: [ThyIcon, ThyDivider, ThyDropdownMenuItemDirective, NgClass], template: "@if (field()) {\n @for (menu of fieldMenus; track index; let index = $index) {\n @if ((menu.hidden && !menu.hidden(aiTable, field)) || !menu.hidden) {\n @if (menu.type === 'divider') {\n <thy-divider [thyStyle]=\"'solid'\"></thy-divider>\n } @else {\n @let disabled = !!(menu.disabled && menu.disabled(aiTable, field));\n @let isRemoveField = menu.type === 'removeField';\n <a\n thyDropdownMenuItem\n href=\"javascript:;\"\n [ngClass]=\"{ 'remove-field': isRemoveField && !disabled }\"\n (click)=\"execute(menu)\"\n [thyDisabled]=\"disabled\"\n >\n <thy-icon [thyIconName]=\"menu.icon!\"></thy-icon>\n <span>{{ getMenuName(menu, field()) }}</span>\n </a>\n }\n }\n }\n}\n" }]
33
- }], propDecorators: { fieldId: [{
34
- type: Input,
35
- args: [{ required: true }]
36
- }], aiTable: [{
37
- type: Input,
38
- args: [{ required: true }]
39
- }], fieldMenus: [{
40
- type: Input,
41
- args: [{ required: true }]
42
- }], origin: [{
43
- type: Input
44
- }], position: [{
45
- type: Input
46
- }] } });
47
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmllbGQtbWVudS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9ncmlkL3NyYy9jb21wb25lbnRzL2ZpZWxkLW1lbnUvZmllbGQtbWVudS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9ncmlkL3NyYy9jb21wb25lbnRzL2ZpZWxkLW1lbnUvZmllbGQtbWVudS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsU0FBUyxFQUFjLEtBQUssRUFBRSxRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDaEcsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ2hELE9BQU8sRUFBRSx1QkFBdUIsRUFBRSw0QkFBNEIsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQzVGLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUcxQyxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0saUJBQWlCLENBQUM7O0FBYTFDLE1BQU0sT0FBTyxnQkFBaUIsU0FBUSx1QkFBdUI7SUFWN0Q7O1FBcUJJLFVBQUssR0FBRyxRQUFRLENBQUMsR0FBRyxFQUFFO1lBQ2xCLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLEtBQUssSUFBSSxDQUFDLE9BQU8sQ0FBRSxDQUFDO1FBQzVFLENBQUMsQ0FBQyxDQUFDO0tBY047SUFaRyxPQUFPLENBQUMsSUFBMEI7UUFDOUIsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDaEYsSUFBSSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNqRixDQUFDO0lBQ0wsQ0FBQztJQUVELFdBQVcsQ0FBQyxJQUEwQixFQUFFLEtBQW1CO1FBQ3ZELElBQUksT0FBTyxJQUFJLENBQUMsSUFBSSxLQUFLLFVBQVUsRUFBRSxDQUFDO1lBQ2xDLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM1QixDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQztJQUMzQixDQUFDOytHQTFCUSxnQkFBZ0I7bUdBQWhCLGdCQUFnQixvUUNuQjdCLHE3QkFzQkEsNENETGMsT0FBTyxzTUFBRSxVQUFVLHFKQUFFLDRCQUE0QixzR0FBRSxPQUFPOzs0RkFFM0QsZ0JBQWdCO2tCQVY1QixTQUFTOytCQUNJLHFCQUFxQixjQUVuQixJQUFJLG1CQUNDLHVCQUF1QixDQUFDLE1BQU0sUUFDekM7d0JBQ0YsS0FBSyxFQUFFLFlBQVk7cUJBQ3RCLFdBQ1EsQ0FBQyxPQUFPLEVBQUUsVUFBVSxFQUFFLDRCQUE0QixFQUFFLE9BQU8sQ0FBQzs4QkFHMUMsT0FBTztzQkFBakMsS0FBSzt1QkFBQyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUU7Z0JBRUUsT0FBTztzQkFBakMsS0FBSzt1QkFBQyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUU7Z0JBRUUsVUFBVTtzQkFBcEMsS0FBSzt1QkFBQyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUU7Z0JBRWhCLE1BQU07c0JBQWQsS0FBSztnQkFFRyxRQUFRO3NCQUFoQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENvbXBvbmVudCwgRWxlbWVudFJlZiwgSW5wdXQsIGNvbXB1dGVkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBUaHlEaXZpZGVyIH0gZnJvbSAnbmd4LXRldGh5cy9kaXZpZGVyJztcbmltcG9ydCB7IFRoeURyb3Bkb3duQWJzdHJhY3RNZW51LCBUaHlEcm9wZG93bk1lbnVJdGVtRGlyZWN0aXZlIH0gZnJvbSAnbmd4LXRldGh5cy9kcm9wZG93bic7XG5pbXBvcnQgeyBUaHlJY29uIH0gZnJvbSAnbmd4LXRldGh5cy9pY29uJztcbmltcG9ydCB7IEFJVGFibGVGaWVsZCB9IGZyb20gJ0BhaS10YWJsZS91dGlscyc7XG5pbXBvcnQgeyBBSVRhYmxlRmllbGRNZW51SXRlbSB9IGZyb20gJy4uLy4uL3R5cGVzL2ZpZWxkJztcbmltcG9ydCB7IE5nQ2xhc3MgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgQUlUYWJsZSB9IGZyb20gJy4uLy4uL2NvcmUnO1xuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ2FpLXRhYmxlLWZpZWxkLW1lbnUnLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9maWVsZC1tZW51LmNvbXBvbmVudC5odG1sJyxcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxuICAgIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICAgIGhvc3Q6IHtcbiAgICAgICAgY2xhc3M6ICdmaWVsZC1tZW51J1xuICAgIH0sXG4gICAgaW1wb3J0czogW1RoeUljb24sIFRoeURpdmlkZXIsIFRoeURyb3Bkb3duTWVudUl0ZW1EaXJlY3RpdmUsIE5nQ2xhc3NdXG59KVxuZXhwb3J0IGNsYXNzIEFJVGFibGVGaWVsZE1lbnUgZXh0ZW5kcyBUaHlEcm9wZG93bkFic3RyYWN0TWVudSB7XG4gICAgQElucHV0KHsgcmVxdWlyZWQ6IHRydWUgfSkgZmllbGRJZCE6IHN0cmluZztcblxuICAgIEBJbnB1dCh7IHJlcXVpcmVkOiB0cnVlIH0pIGFpVGFibGUhOiBBSVRhYmxlO1xuXG4gICAgQElucHV0KHsgcmVxdWlyZWQ6IHRydWUgfSkgZmllbGRNZW51cyE6IEFJVGFibGVGaWVsZE1lbnVJdGVtW107XG5cbiAgICBASW5wdXQoKSBvcmlnaW4hOiBIVE1MRWxlbWVudCB8IEVsZW1lbnRSZWY8YW55PjtcblxuICAgIEBJbnB1dCgpIHBvc2l0aW9uITogeyB4OiBudW1iZXI7IHk6IG51bWJlciB9O1xuXG4gICAgZmllbGQgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICAgIHJldHVybiB0aGlzLmFpVGFibGUuZmllbGRzKCkuZmluZCgoaXRlbSkgPT4gaXRlbS5faWQgPT09IHRoaXMuZmllbGRJZCkhO1xuICAgIH0pO1xuXG4gICAgZXhlY3V0ZShtZW51OiBBSVRhYmxlRmllbGRNZW51SXRlbSkge1xuICAgICAgICBpZiAoKG1lbnUuZGlzYWJsZWQgJiYgIW1lbnUuZGlzYWJsZWQodGhpcy5haVRhYmxlLCB0aGlzLmZpZWxkKSkgfHwgIW1lbnUuZGlzYWJsZWQpIHtcbiAgICAgICAgICAgIG1lbnUuZXhlYyAmJiBtZW51LmV4ZWModGhpcy5haVRhYmxlLCB0aGlzLmZpZWxkLCB0aGlzLm9yaWdpbiwgdGhpcy5wb3NpdGlvbik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBnZXRNZW51TmFtZShtZW51OiBBSVRhYmxlRmllbGRNZW51SXRlbSwgZmllbGQ6IEFJVGFibGVGaWVsZCk6IHN0cmluZyB7XG4gICAgICAgIGlmICh0eXBlb2YgbWVudS5uYW1lID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICByZXR1cm4gbWVudS5uYW1lKGZpZWxkKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWVudS5uYW1lIHx8ICcnO1xuICAgIH1cbn1cbiIsIkBpZiAoZmllbGQoKSkge1xuICAgIEBmb3IgKG1lbnUgb2YgZmllbGRNZW51czsgdHJhY2sgaW5kZXg7IGxldCBpbmRleCA9ICRpbmRleCkge1xuICAgICAgICBAaWYgKChtZW51LmhpZGRlbiAmJiAhbWVudS5oaWRkZW4oYWlUYWJsZSwgZmllbGQpKSB8fCAhbWVudS5oaWRkZW4pIHtcbiAgICAgICAgICAgIEBpZiAobWVudS50eXBlID09PSAnZGl2aWRlcicpIHtcbiAgICAgICAgICAgICAgICA8dGh5LWRpdmlkZXIgW3RoeVN0eWxlXT1cIidzb2xpZCdcIj48L3RoeS1kaXZpZGVyPlxuICAgICAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICAgICAgQGxldCBkaXNhYmxlZCA9ICEhKG1lbnUuZGlzYWJsZWQgJiYgbWVudS5kaXNhYmxlZChhaVRhYmxlLCBmaWVsZCkpO1xuICAgICAgICAgICAgICAgIEBsZXQgaXNSZW1vdmVGaWVsZCA9IG1lbnUudHlwZSA9PT0gJ3JlbW92ZUZpZWxkJztcbiAgICAgICAgICAgICAgICA8YVxuICAgICAgICAgICAgICAgICAgICB0aHlEcm9wZG93bk1lbnVJdGVtXG4gICAgICAgICAgICAgICAgICAgIGhyZWY9XCJqYXZhc2NyaXB0OjtcIlxuICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7ICdyZW1vdmUtZmllbGQnOiBpc1JlbW92ZUZpZWxkICYmICFkaXNhYmxlZCB9XCJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImV4ZWN1dGUobWVudSlcIlxuICAgICAgICAgICAgICAgICAgICBbdGh5RGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPHRoeS1pY29uIFt0aHlJY29uTmFtZV09XCJtZW51Lmljb24hXCI+PC90aHktaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4+e3sgZ2V0TWVudU5hbWUobWVudSwgZmllbGQoKSkgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9hPlxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuIl19