@igo2/common 18.0.0-next.8 → 18.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/drag-drop/drag-drop.module.d.ts +2 -1
- package/drag-drop/public_api.d.ts +1 -0
- package/drag-drop/tree-drag-drop/index.d.ts +2 -0
- package/drag-drop/tree-drag-drop/tree-drag-drop.directive.d.ts +85 -0
- package/drag-drop/tree-drag-drop/tree-drag-drop.interface.d.ts +15 -0
- package/esm2022/drag-drop/drag-drop.module.mjs +5 -4
- package/esm2022/drag-drop/public_api.mjs +2 -1
- package/esm2022/drag-drop/tree-drag-drop/index.mjs +3 -0
- package/esm2022/drag-drop/tree-drag-drop/tree-drag-drop.directive.mjs +391 -0
- package/esm2022/drag-drop/tree-drag-drop/tree-drag-drop.interface.mjs +2 -0
- package/esm2022/form/form/form.component.mjs +4 -1
- package/esm2022/form/form-field/form-field-select.component.mjs +3 -3
- package/esm2022/form/form-field/form-field-text.component.mjs +3 -3
- package/esm2022/form/form-field/form-field-textarea.component.mjs +3 -3
- package/esm2022/form/shared/form.interfaces.mjs +1 -1
- package/esm2022/form/shared/form.service.mjs +2 -2
- package/esm2022/icon/shared/icons.mjs +9 -1
- package/fesm2022/igo2-common-drag-drop.mjs +394 -5
- package/fesm2022/igo2-common-drag-drop.mjs.map +1 -1
- package/fesm2022/igo2-common-form.mjs +10 -7
- package/fesm2022/igo2-common-form.mjs.map +1 -1
- package/fesm2022/igo2-common-icon.mjs +9 -1
- package/fesm2022/igo2-common-icon.mjs.map +1 -1
- package/form/shared/form.interfaces.d.ts +1 -0
- package/icon/shared/icons.d.ts +2 -0
- package/locale/en.common.json +6 -0
- package/locale/fr.common.json +6 -0
- package/package.json +3 -3
|
@@ -1,5 +1,8 @@
|
|
|
1
1
|
import * as i0 from '@angular/core';
|
|
2
|
-
import { EventEmitter, Directive, Input, Output, HostBinding, HostListener, NgModule } from '@angular/core';
|
|
2
|
+
import { EventEmitter, Directive, Input, Output, HostBinding, HostListener, booleanAttribute, ContentChildren, NgModule } from '@angular/core';
|
|
3
|
+
import { SelectionModel } from '@angular/cdk/collections';
|
|
4
|
+
import '@angular/cdk/tree';
|
|
5
|
+
import { MatTreeNode } from '@angular/material/tree';
|
|
3
6
|
|
|
4
7
|
class DragAndDropDirective {
|
|
5
8
|
allowedExtensions = [];
|
|
@@ -81,6 +84,392 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
|
|
|
81
84
|
args: ['drop', ['$event']]
|
|
82
85
|
}] } });
|
|
83
86
|
|
|
87
|
+
/**
|
|
88
|
+
* This directive should be use with a MatTree flatened
|
|
89
|
+
* It should add all logic to drag the MatTreeNode and connect the (onDrop) output
|
|
90
|
+
* Class added:
|
|
91
|
+
* Tree: --dragging
|
|
92
|
+
* Node: --drag-hover | --dragged
|
|
93
|
+
*/
|
|
94
|
+
class TreeDragDropDirective {
|
|
95
|
+
elementRef;
|
|
96
|
+
renderer;
|
|
97
|
+
draggedNode;
|
|
98
|
+
dropNodeTarget;
|
|
99
|
+
expandTimeout;
|
|
100
|
+
nodesListeners;
|
|
101
|
+
dropLineTarget;
|
|
102
|
+
highlightedNode = new SelectionModel();
|
|
103
|
+
treeControl;
|
|
104
|
+
/** The default is 5 */
|
|
105
|
+
maxLevel = 5;
|
|
106
|
+
set treeDragDropIsDisabled(disabled) {
|
|
107
|
+
this.isDisabled = disabled;
|
|
108
|
+
disabled ? this.removeAllListener() : this.addAllListener();
|
|
109
|
+
}
|
|
110
|
+
isDisabled = false;
|
|
111
|
+
dragStart = new EventEmitter();
|
|
112
|
+
// eslint-disable-next-line @angular-eslint/no-output-on-prefix
|
|
113
|
+
onDrop = new EventEmitter(null);
|
|
114
|
+
// eslint-disable-next-line @angular-eslint/no-output-on-prefix
|
|
115
|
+
onDropError = new EventEmitter();
|
|
116
|
+
hostDragOver(event) {
|
|
117
|
+
event.preventDefault();
|
|
118
|
+
}
|
|
119
|
+
hostDrop(event) {
|
|
120
|
+
this.drop(event);
|
|
121
|
+
}
|
|
122
|
+
dragging;
|
|
123
|
+
nodes;
|
|
124
|
+
constructor(elementRef, renderer) {
|
|
125
|
+
this.elementRef = elementRef;
|
|
126
|
+
this.renderer = renderer;
|
|
127
|
+
this.onDrop.subscribe(() => this.dragEnd());
|
|
128
|
+
this.highlightedNode.changed.subscribe((change) => {
|
|
129
|
+
if (change.removed.length) {
|
|
130
|
+
this.removeNodeClass(change.removed[0].id, '--drag-hover');
|
|
131
|
+
}
|
|
132
|
+
if (change.added.length) {
|
|
133
|
+
this.addNodeClass(change.added[0].id, '--drag-hover');
|
|
134
|
+
}
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
ngAfterContentInit() {
|
|
138
|
+
this.nodes.changes.subscribe(() => {
|
|
139
|
+
this.addAllListener();
|
|
140
|
+
});
|
|
141
|
+
}
|
|
142
|
+
ngOnDestroy() {
|
|
143
|
+
this.removeAllListener();
|
|
144
|
+
}
|
|
145
|
+
onDragStart(node) {
|
|
146
|
+
this.dragging = true;
|
|
147
|
+
this.draggedNode = node;
|
|
148
|
+
this.addNodeClass(node.id, '--dragged');
|
|
149
|
+
this.dragStart.emit(node);
|
|
150
|
+
}
|
|
151
|
+
dragEnd() {
|
|
152
|
+
this.dragging = false;
|
|
153
|
+
if (this.draggedNode) {
|
|
154
|
+
this.removeNodeClass(this.draggedNode.id, '--dragged');
|
|
155
|
+
this.draggedNode = null;
|
|
156
|
+
}
|
|
157
|
+
this.dragLeave();
|
|
158
|
+
this.removeDropTargetLine();
|
|
159
|
+
}
|
|
160
|
+
dragOver(node, event) {
|
|
161
|
+
event.preventDefault();
|
|
162
|
+
event.stopPropagation();
|
|
163
|
+
this.dropNodeTarget = node;
|
|
164
|
+
const position = this.getPosition(event, node);
|
|
165
|
+
this.updateDropTargetLinePosition(position);
|
|
166
|
+
this.setHighlightedNode(node);
|
|
167
|
+
this.handleGroupExpansion(node, position.type === 'inside');
|
|
168
|
+
}
|
|
169
|
+
dragLeave() {
|
|
170
|
+
clearTimeout(this.expandTimeout);
|
|
171
|
+
this.expandTimeout = null;
|
|
172
|
+
this.highlightedNode.clear();
|
|
173
|
+
}
|
|
174
|
+
drop(event) {
|
|
175
|
+
if (!this.dropNodeTarget || this.isDisabled) {
|
|
176
|
+
return;
|
|
177
|
+
}
|
|
178
|
+
const dropPosition = this.getPosition(event, this.dropNodeTarget);
|
|
179
|
+
const validation = this.canDropNode(this.dropNodeTarget, dropPosition);
|
|
180
|
+
if (!validation.canDrop) {
|
|
181
|
+
this.onDropError.emit(validation);
|
|
182
|
+
return;
|
|
183
|
+
}
|
|
184
|
+
// Allow to drop a last child outside is group. We refer to it's ancestor for the target
|
|
185
|
+
if (dropPosition.type === 'below' &&
|
|
186
|
+
dropPosition.level !== this.dropNodeTarget.level) {
|
|
187
|
+
this.dropNodeTarget = this.getNodeAncestors(this.dropNodeTarget.id, dropPosition.level);
|
|
188
|
+
}
|
|
189
|
+
if (this.dropNodeTarget.isGroup) {
|
|
190
|
+
if (dropPosition.type === 'inside') {
|
|
191
|
+
const isExpanded = this.treeControl.isExpanded(this.dropNodeTarget);
|
|
192
|
+
if (isExpanded) {
|
|
193
|
+
const children = this.getDirectDescendants(this.dropNodeTarget);
|
|
194
|
+
if (children[0]?.id === this.draggedNode.id) {
|
|
195
|
+
return;
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
this.treeControl.expand(this.dropNodeTarget);
|
|
199
|
+
return this.onDrop.emit({
|
|
200
|
+
node: this.draggedNode,
|
|
201
|
+
ref: this.dropNodeTarget,
|
|
202
|
+
position: dropPosition.type
|
|
203
|
+
});
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
if (dropPosition.type === 'below' &&
|
|
207
|
+
dropPosition.level !== this.dropNodeTarget.level) {
|
|
208
|
+
const ancestor = this.getNodeAncestors(this.dropNodeTarget.id);
|
|
209
|
+
return this.onDrop.emit({
|
|
210
|
+
node: this.draggedNode,
|
|
211
|
+
ref: ancestor,
|
|
212
|
+
position: dropPosition.type
|
|
213
|
+
});
|
|
214
|
+
}
|
|
215
|
+
this.onDrop.emit({
|
|
216
|
+
node: this.draggedNode,
|
|
217
|
+
ref: this.dropNodeTarget,
|
|
218
|
+
position: dropPosition.type
|
|
219
|
+
});
|
|
220
|
+
}
|
|
221
|
+
addNodeClass(id, className) {
|
|
222
|
+
const node = this.nodes.find((node) => node.data.id === id);
|
|
223
|
+
this.renderer.addClass(node['_elementRef'].nativeElement, className);
|
|
224
|
+
}
|
|
225
|
+
removeNodeClass(id, className) {
|
|
226
|
+
const node = this.nodes.find((node) => node.data.id === id);
|
|
227
|
+
this.renderer.removeClass(node['_elementRef'].nativeElement, className);
|
|
228
|
+
}
|
|
229
|
+
addAllListener() {
|
|
230
|
+
if (this.isDisabled) {
|
|
231
|
+
return;
|
|
232
|
+
}
|
|
233
|
+
const nodes = this.nodes?.toArray();
|
|
234
|
+
if (this.nodesListeners) {
|
|
235
|
+
this.removeAllListener();
|
|
236
|
+
}
|
|
237
|
+
this.nodesListeners = nodes?.map((node) => this.addListener(node));
|
|
238
|
+
}
|
|
239
|
+
addListener(node) {
|
|
240
|
+
const element = node['_elementRef'].nativeElement;
|
|
241
|
+
const listeners = [
|
|
242
|
+
['dragstart', () => this.onDragStart(node.data)],
|
|
243
|
+
['dragend', () => this.dragEnd()],
|
|
244
|
+
['dragover', (event) => this.dragOver(node.data, event)],
|
|
245
|
+
['dragleave', () => this.dragLeave()]
|
|
246
|
+
];
|
|
247
|
+
element.setAttribute('draggable', 'true');
|
|
248
|
+
listeners.forEach(([type, listener]) => element.addEventListener(type, listener));
|
|
249
|
+
return { element, listeners };
|
|
250
|
+
}
|
|
251
|
+
removeAllListener() {
|
|
252
|
+
this.nodesListeners?.forEach(({ element, listeners }) => {
|
|
253
|
+
listeners.forEach(([type, listener]) => {
|
|
254
|
+
element.setAttribute('draggable', 'false');
|
|
255
|
+
element.removeEventListener(type, listener);
|
|
256
|
+
});
|
|
257
|
+
});
|
|
258
|
+
this.nodesListeners = null;
|
|
259
|
+
}
|
|
260
|
+
setHighlightedNode(node) {
|
|
261
|
+
const toHighlight = node.isGroup ? node : this.getNodeAncestors(node.id);
|
|
262
|
+
toHighlight
|
|
263
|
+
? this.highlightedNode.select(toHighlight)
|
|
264
|
+
: this.highlightedNode.clear();
|
|
265
|
+
}
|
|
266
|
+
addDropTargetLine() {
|
|
267
|
+
const target = this.renderer.createElement('div');
|
|
268
|
+
target.classList.add('drop-target-line');
|
|
269
|
+
target.setAttribute('style', `position: absolute; top: 0; width: 100%; pointer-events: none; z-index: 4; height: 2px; background-color: black; transition: margin-left 150ms;`);
|
|
270
|
+
this.dropLineTarget = target;
|
|
271
|
+
this.renderer.appendChild(this.elementRef.nativeElement.parentElement, this.dropLineTarget);
|
|
272
|
+
}
|
|
273
|
+
removeDropTargetLine() {
|
|
274
|
+
if (!this.dropLineTarget) {
|
|
275
|
+
return;
|
|
276
|
+
}
|
|
277
|
+
this.renderer.removeChild(this.elementRef.nativeElement.parentElement, this.dropLineTarget);
|
|
278
|
+
this.dropLineTarget = null;
|
|
279
|
+
}
|
|
280
|
+
updateDropTargetLinePosition(position) {
|
|
281
|
+
if (!this.dropLineTarget) {
|
|
282
|
+
this.addDropTargetLine();
|
|
283
|
+
}
|
|
284
|
+
if (position.type === 'inside') {
|
|
285
|
+
return this.removeDropTargetLine();
|
|
286
|
+
}
|
|
287
|
+
this.renderer.setStyle(this.dropLineTarget, 'margin-left', position.level * 24 + 20 + 'px');
|
|
288
|
+
this.renderer.setStyle(this.dropLineTarget, 'transform', 'translate3d(0,' + position.y + 'px, 0)');
|
|
289
|
+
}
|
|
290
|
+
handleGroupExpansion(node, isInside) {
|
|
291
|
+
if (!isInside) {
|
|
292
|
+
return this.dragLeave();
|
|
293
|
+
}
|
|
294
|
+
const isOpen = this.treeControl.isExpanded(node);
|
|
295
|
+
if (!isOpen && !this.expandTimeout) {
|
|
296
|
+
this.expandTimeout = window.setTimeout(() => {
|
|
297
|
+
this.treeControl.expand(node);
|
|
298
|
+
}, 1200);
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
getNodeElement(node) {
|
|
302
|
+
const treeNode = this.nodes.find((n) => n.data.id === node.id);
|
|
303
|
+
return treeNode?.['_elementRef'].nativeElement;
|
|
304
|
+
}
|
|
305
|
+
canDropNode(hoveredNode, position) {
|
|
306
|
+
if (this.draggedNode.isGroup) {
|
|
307
|
+
return this.canDropGroup(hoveredNode, position);
|
|
308
|
+
}
|
|
309
|
+
const hasMaxLevelRestrictions = this.validateMaxHierarchyLevel(position);
|
|
310
|
+
if (hasMaxLevelRestrictions) {
|
|
311
|
+
return hasMaxLevelRestrictions;
|
|
312
|
+
}
|
|
313
|
+
return { canDrop: true };
|
|
314
|
+
}
|
|
315
|
+
canDropGroup(hoveredNode, position) {
|
|
316
|
+
// On ne veut pas permettre le Drop pour un groupe qui s'auto référence
|
|
317
|
+
if (hoveredNode.id === this.draggedNode.id) {
|
|
318
|
+
return {
|
|
319
|
+
canDrop: false,
|
|
320
|
+
message: 'igo.common.dragDrop.cannot.dropInsideItself'
|
|
321
|
+
};
|
|
322
|
+
}
|
|
323
|
+
const hasMaxLevelRestrictions = this.validateMaxHierarchyLevel(position);
|
|
324
|
+
if (hasMaxLevelRestrictions) {
|
|
325
|
+
return hasMaxLevelRestrictions;
|
|
326
|
+
}
|
|
327
|
+
const isHoverDescendant = this.isHoverDescendant(hoveredNode.id);
|
|
328
|
+
return {
|
|
329
|
+
canDrop: !isHoverDescendant,
|
|
330
|
+
message: isHoverDescendant && 'igo.common.dragDrop.cannot.dropInsideItself'
|
|
331
|
+
};
|
|
332
|
+
}
|
|
333
|
+
validateMaxHierarchyLevel(position) {
|
|
334
|
+
if (!this.maxLevel) {
|
|
335
|
+
return;
|
|
336
|
+
}
|
|
337
|
+
let level = position.type === 'inside' ? position.level + 1 : position.level;
|
|
338
|
+
if (this.draggedNode.isGroup) {
|
|
339
|
+
// We add an extra level +1 to avoid empty group in group
|
|
340
|
+
level = level + (this.draggedNode.descendantLevels ?? 0) + 1;
|
|
341
|
+
}
|
|
342
|
+
if (level > this.maxLevel) {
|
|
343
|
+
return {
|
|
344
|
+
canDrop: false,
|
|
345
|
+
message: 'igo.common.dragDrop.cannot.maxLevel',
|
|
346
|
+
params: { value: this.maxLevel }
|
|
347
|
+
};
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
isHoverDescendant(id) {
|
|
351
|
+
return this.treeControl
|
|
352
|
+
.getDescendants(this.draggedNode)
|
|
353
|
+
.some((child) => child.id === id);
|
|
354
|
+
}
|
|
355
|
+
getPosition(event, hoveredNode) {
|
|
356
|
+
if (this.draggedNode.isGroup) {
|
|
357
|
+
if (this.isHoverDescendant(hoveredNode.id)) {
|
|
358
|
+
hoveredNode = this.draggedNode;
|
|
359
|
+
}
|
|
360
|
+
}
|
|
361
|
+
let positionType = this.getPositionType(event, hoveredNode);
|
|
362
|
+
const bellowOpenedGroup = hoveredNode.isGroup &&
|
|
363
|
+
positionType === 'below' &&
|
|
364
|
+
this.treeControl.isExpanded(hoveredNode);
|
|
365
|
+
if (bellowOpenedGroup) {
|
|
366
|
+
positionType = 'inside';
|
|
367
|
+
}
|
|
368
|
+
return {
|
|
369
|
+
x: event.x,
|
|
370
|
+
y: this.getPositionY(hoveredNode, positionType),
|
|
371
|
+
level: this.getPositionLevel(hoveredNode, positionType, event.x),
|
|
372
|
+
type: positionType
|
|
373
|
+
};
|
|
374
|
+
}
|
|
375
|
+
getPositionY(node, type) {
|
|
376
|
+
const element = this.getNodeElement(node);
|
|
377
|
+
const rect = element.getBoundingClientRect();
|
|
378
|
+
return type === 'below'
|
|
379
|
+
? element.offsetTop + rect.height - 1
|
|
380
|
+
: element.offsetTop + 1;
|
|
381
|
+
}
|
|
382
|
+
getPositionType(event, hoveredNode) {
|
|
383
|
+
const target = this.getNodeElement(hoveredNode);
|
|
384
|
+
const rect = target.getBoundingClientRect();
|
|
385
|
+
const middle = rect.top + rect.height / 2;
|
|
386
|
+
const y = event.y;
|
|
387
|
+
const selfReferencing = this.draggedNode.id === hoveredNode.id;
|
|
388
|
+
if (hoveredNode.isGroup && !selfReferencing) {
|
|
389
|
+
const tolerence = 5;
|
|
390
|
+
if (y <= middle + tolerence && y >= middle - tolerence) {
|
|
391
|
+
return 'inside';
|
|
392
|
+
}
|
|
393
|
+
}
|
|
394
|
+
const isBelow = y > middle;
|
|
395
|
+
return isBelow ? 'below' : 'above';
|
|
396
|
+
}
|
|
397
|
+
getPositionLevel(hoveredNode, type, x) {
|
|
398
|
+
if (hoveredNode.level === 0) {
|
|
399
|
+
return 0;
|
|
400
|
+
}
|
|
401
|
+
const ancestor = this.getNodeAncestors(hoveredNode.id);
|
|
402
|
+
const children = this.getDirectDescendants(ancestor);
|
|
403
|
+
const lastChild = [...children].pop();
|
|
404
|
+
if (type === 'below' && lastChild.id === hoveredNode.id) {
|
|
405
|
+
const target = this.getNodeElement(hoveredNode);
|
|
406
|
+
const rect = target.getBoundingClientRect();
|
|
407
|
+
const indentation = 24;
|
|
408
|
+
const xMin = rect.x + indentation;
|
|
409
|
+
const xMax = xMin + indentation * hoveredNode.level;
|
|
410
|
+
const isInsideSameGroup = x > xMax;
|
|
411
|
+
if (!isInsideSameGroup) {
|
|
412
|
+
const levelSubstracted = Math.round((xMax - x) / indentation);
|
|
413
|
+
return Math.max(0, hoveredNode.level - levelSubstracted);
|
|
414
|
+
}
|
|
415
|
+
}
|
|
416
|
+
return hoveredNode.level;
|
|
417
|
+
}
|
|
418
|
+
/**
|
|
419
|
+
* @param level if level is defined with go to the defined levle to find ancestor. Sinon on prend le current ancestor
|
|
420
|
+
*/
|
|
421
|
+
getNodeAncestors(id, level) {
|
|
422
|
+
const nodes = this.treeControl.dataNodes;
|
|
423
|
+
const index = nodes.findIndex((node) => node.id === id);
|
|
424
|
+
const targetLevel = level ?? Math.max(0, nodes[index].level - 1);
|
|
425
|
+
return nodes
|
|
426
|
+
.slice(0, index)
|
|
427
|
+
.reverse()
|
|
428
|
+
.find((node) => node.level === targetLevel);
|
|
429
|
+
}
|
|
430
|
+
getDirectDescendants(node) {
|
|
431
|
+
const level = node.level + 1;
|
|
432
|
+
return this.treeControl
|
|
433
|
+
.getDescendants(node)
|
|
434
|
+
.filter((child) => child.level === level);
|
|
435
|
+
}
|
|
436
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: TreeDragDropDirective, deps: [{ token: i0.ElementRef }, { token: i0.Renderer2 }], target: i0.ɵɵFactoryTarget.Directive });
|
|
437
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "16.1.0", version: "18.2.13", type: TreeDragDropDirective, isStandalone: true, selector: "[igoTreeDragDrop]", inputs: { treeControl: "treeControl", maxLevel: "maxLevel", treeDragDropIsDisabled: ["treeDragDropIsDisabled", "treeDragDropIsDisabled", booleanAttribute] }, outputs: { dragStart: "dragStart", onDrop: "onDrop", onDropError: "onDropError" }, host: { listeners: { "dragover": "hostDragOver($event)", "drop": "hostDrop($event)" }, properties: { "class.--dragging": "this.dragging" } }, queries: [{ propertyName: "nodes", predicate: MatTreeNode, descendants: true }], ngImport: i0 });
|
|
438
|
+
}
|
|
439
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: TreeDragDropDirective, decorators: [{
|
|
440
|
+
type: Directive,
|
|
441
|
+
args: [{
|
|
442
|
+
selector: '[igoTreeDragDrop]',
|
|
443
|
+
standalone: true
|
|
444
|
+
}]
|
|
445
|
+
}], ctorParameters: () => [{ type: i0.ElementRef }, { type: i0.Renderer2 }], propDecorators: { treeControl: [{
|
|
446
|
+
type: Input,
|
|
447
|
+
args: [{ required: true }]
|
|
448
|
+
}], maxLevel: [{
|
|
449
|
+
type: Input
|
|
450
|
+
}], treeDragDropIsDisabled: [{
|
|
451
|
+
type: Input,
|
|
452
|
+
args: [{ transform: booleanAttribute }]
|
|
453
|
+
}], dragStart: [{
|
|
454
|
+
type: Output
|
|
455
|
+
}], onDrop: [{
|
|
456
|
+
type: Output
|
|
457
|
+
}], onDropError: [{
|
|
458
|
+
type: Output
|
|
459
|
+
}], hostDragOver: [{
|
|
460
|
+
type: HostListener,
|
|
461
|
+
args: ['dragover', ['$event']]
|
|
462
|
+
}], hostDrop: [{
|
|
463
|
+
type: HostListener,
|
|
464
|
+
args: ['drop', ['$event']]
|
|
465
|
+
}], dragging: [{
|
|
466
|
+
type: HostBinding,
|
|
467
|
+
args: ['class.--dragging']
|
|
468
|
+
}], nodes: [{
|
|
469
|
+
type: ContentChildren,
|
|
470
|
+
args: [MatTreeNode, { descendants: true }]
|
|
471
|
+
}] } });
|
|
472
|
+
|
|
84
473
|
/**
|
|
85
474
|
* @deprecated import the DragAndDropDirective directly
|
|
86
475
|
*/
|
|
@@ -92,14 +481,14 @@ class IgoDrapDropModule {
|
|
|
92
481
|
};
|
|
93
482
|
}
|
|
94
483
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: IgoDrapDropModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
|
|
95
|
-
static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "18.2.13", ngImport: i0, type: IgoDrapDropModule, imports: [DragAndDropDirective], exports: [DragAndDropDirective] });
|
|
484
|
+
static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "18.2.13", ngImport: i0, type: IgoDrapDropModule, imports: [DragAndDropDirective, TreeDragDropDirective], exports: [DragAndDropDirective, TreeDragDropDirective] });
|
|
96
485
|
static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: IgoDrapDropModule });
|
|
97
486
|
}
|
|
98
487
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: IgoDrapDropModule, decorators: [{
|
|
99
488
|
type: NgModule,
|
|
100
489
|
args: [{
|
|
101
|
-
imports: [DragAndDropDirective],
|
|
102
|
-
exports: [DragAndDropDirective]
|
|
490
|
+
imports: [DragAndDropDirective, TreeDragDropDirective],
|
|
491
|
+
exports: [DragAndDropDirective, TreeDragDropDirective]
|
|
103
492
|
}]
|
|
104
493
|
}] });
|
|
105
494
|
|
|
@@ -107,5 +496,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
|
|
|
107
496
|
* Generated bundle index. Do not edit.
|
|
108
497
|
*/
|
|
109
498
|
|
|
110
|
-
export { DragAndDropDirective, IgoDrapDropModule };
|
|
499
|
+
export { DragAndDropDirective, IgoDrapDropModule, TreeDragDropDirective };
|
|
111
500
|
//# sourceMappingURL=igo2-common-drag-drop.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"igo2-common-drag-drop.mjs","sources":["../../../packages/common/drag-drop/src/drag-drop.directive.ts","../../../packages/common/drag-drop/src/drag-drop.module.ts","../../../packages/common/drag-drop/src/igo2-common-drag-drop.ts"],"sourcesContent":["import {\n Directive,\n EventEmitter,\n HostBinding,\n HostListener,\n Input,\n Output\n} from '@angular/core';\n\n@Directive({\n selector: '[igoDragAndDrop]',\n standalone: true\n})\nexport class DragAndDropDirective {\n @Input() allowedExtensions: string[] = [];\n\n @Output() protected filesDropped = new EventEmitter<File[]>();\n\n @Output() protected filesInvalid = new EventEmitter<File[]>();\n\n @HostBinding('style.background') private background = 'inherit';\n\n @HostListener('dragover', ['$event'])\n public onDragOver(evt) {\n evt.preventDefault();\n evt.stopPropagation();\n this.background = '#999';\n }\n\n @HostListener('dragleave', ['$event'])\n public onDragLeave(evt) {\n evt.preventDefault();\n evt.stopPropagation();\n this.background = 'inherit';\n }\n\n @HostListener('drop', ['$event'])\n public onDrop(evt) {\n evt.preventDefault();\n evt.stopPropagation();\n if (evt.alreadyFired) {\n return;\n }\n evt.alreadyFired = true;\n\n this.background = 'inherit';\n const filesObj = this.validExtensions(evt);\n if (filesObj.valid.length) {\n this.filesDropped.emit(filesObj.valid);\n }\n if (filesObj.invalid.length) {\n this.filesInvalid.emit(filesObj.invalid);\n }\n }\n\n private validExtensions(evt) {\n const files = evt.dataTransfer.files;\n const filesObj = {\n valid: [],\n invalid: []\n };\n if (files.length > 0) {\n for (const file of files) {\n const ext = file.name.split('.')[file.name.split('.').length - 1];\n if (\n this.allowedExtensions.length === 0 ||\n (this.allowedExtensions.lastIndexOf(ext) !== -1 && file.size !== 0)\n ) {\n filesObj.valid.push(file);\n } else {\n filesObj.invalid.push(file);\n }\n }\n }\n\n return filesObj;\n }\n}\n","import { ModuleWithProviders, NgModule } from '@angular/core';\n\nimport { DragAndDropDirective } from './drag-drop.directive';\n\n/**\n * @deprecated import the DragAndDropDirective directly\n */\n@NgModule({\n imports: [DragAndDropDirective],\n exports: [DragAndDropDirective]\n})\nexport class IgoDrapDropModule {\n static forRoot(): ModuleWithProviders<IgoDrapDropModule> {\n return {\n ngModule: IgoDrapDropModule,\n providers: []\n };\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"igo2-common-drag-drop.mjs","sources":["../../../packages/common/drag-drop/src/drag-drop.directive.ts","../../../packages/common/drag-drop/src/tree-drag-drop/tree-drag-drop.directive.ts","../../../packages/common/drag-drop/src/drag-drop.module.ts","../../../packages/common/drag-drop/src/igo2-common-drag-drop.ts"],"sourcesContent":["import {\n Directive,\n EventEmitter,\n HostBinding,\n HostListener,\n Input,\n Output\n} from '@angular/core';\n\n@Directive({\n selector: '[igoDragAndDrop]',\n standalone: true\n})\nexport class DragAndDropDirective {\n @Input() allowedExtensions: string[] = [];\n\n @Output() protected filesDropped = new EventEmitter<File[]>();\n\n @Output() protected filesInvalid = new EventEmitter<File[]>();\n\n @HostBinding('style.background') private background = 'inherit';\n\n @HostListener('dragover', ['$event'])\n public onDragOver(evt) {\n evt.preventDefault();\n evt.stopPropagation();\n this.background = '#999';\n }\n\n @HostListener('dragleave', ['$event'])\n public onDragLeave(evt) {\n evt.preventDefault();\n evt.stopPropagation();\n this.background = 'inherit';\n }\n\n @HostListener('drop', ['$event'])\n public onDrop(evt) {\n evt.preventDefault();\n evt.stopPropagation();\n if (evt.alreadyFired) {\n return;\n }\n evt.alreadyFired = true;\n\n this.background = 'inherit';\n const filesObj = this.validExtensions(evt);\n if (filesObj.valid.length) {\n this.filesDropped.emit(filesObj.valid);\n }\n if (filesObj.invalid.length) {\n this.filesInvalid.emit(filesObj.invalid);\n }\n }\n\n private validExtensions(evt) {\n const files = evt.dataTransfer.files;\n const filesObj = {\n valid: [],\n invalid: []\n };\n if (files.length > 0) {\n for (const file of files) {\n const ext = file.name.split('.')[file.name.split('.').length - 1];\n if (\n this.allowedExtensions.length === 0 ||\n (this.allowedExtensions.lastIndexOf(ext) !== -1 && file.size !== 0)\n ) {\n filesObj.valid.push(file);\n } else {\n filesObj.invalid.push(file);\n }\n }\n }\n\n return filesObj;\n }\n}\n","import { SelectionModel } from '@angular/cdk/collections';\nimport { FlatTreeControl } from '@angular/cdk/tree';\nimport {\n AfterContentInit,\n ContentChildren,\n Directive,\n ElementRef,\n EventEmitter,\n HostBinding,\n HostListener,\n Input,\n OnDestroy,\n Output,\n QueryList,\n Renderer2,\n booleanAttribute\n} from '@angular/core';\nimport { MatTreeNode } from '@angular/material/tree';\n\nimport {\n DropPosition,\n DropPositionType,\n TreeFlatNode\n} from './tree-drag-drop.interface';\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport interface TreeDropEvent<T = any> {\n node: TreeFlatNode<T>;\n ref: TreeFlatNode<T>;\n position: DropPositionType;\n}\n\ninterface DragNodeListeners {\n element: HTMLElement;\n listeners: [string, EventListenerOrEventListenerObject][];\n}\n\nexport interface DropPermission {\n canDrop: boolean;\n message?: string;\n params?: Record<string, unknown>;\n}\n\n/**\n * This directive should be use with a MatTree flatened\n * It should add all logic to drag the MatTreeNode and connect the (onDrop) output\n * Class added:\n * Tree: --dragging\n * Node: --drag-hover | --dragged\n */\n@Directive({\n selector: '[igoTreeDragDrop]',\n standalone: true\n})\nexport class TreeDragDropDirective implements AfterContentInit, OnDestroy {\n draggedNode: TreeFlatNode;\n dropNodeTarget: TreeFlatNode;\n expandTimeout: number;\n nodesListeners: DragNodeListeners[] | undefined;\n dropLineTarget: HTMLElement;\n highlightedNode = new SelectionModel<TreeFlatNode>();\n\n @Input({ required: true }) treeControl: FlatTreeControl<TreeFlatNode>;\n\n /** The default is 5 */\n @Input() maxLevel = 5;\n\n @Input({ transform: booleanAttribute })\n set treeDragDropIsDisabled(disabled: boolean) {\n this.isDisabled = disabled;\n disabled ? this.removeAllListener() : this.addAllListener();\n }\n private isDisabled = false;\n\n @Output() dragStart = new EventEmitter<TreeFlatNode>();\n\n // eslint-disable-next-line @angular-eslint/no-output-on-prefix\n @Output() onDrop = new EventEmitter<TreeDropEvent>(null);\n\n // eslint-disable-next-line @angular-eslint/no-output-on-prefix\n @Output() onDropError = new EventEmitter<DropPermission>();\n\n @HostListener('dragover', ['$event']) hostDragOver(event: Event): void {\n event.preventDefault();\n }\n\n @HostListener('drop', ['$event']) hostDrop(event: DragEvent): void {\n this.drop(event);\n }\n\n @HostBinding('class.--dragging') dragging: boolean;\n\n @ContentChildren(MatTreeNode, { descendants: true })\n nodes: QueryList<MatTreeNode<TreeFlatNode>>;\n\n constructor(\n private elementRef: ElementRef,\n private renderer: Renderer2\n ) {\n this.onDrop.subscribe(() => this.dragEnd());\n\n this.highlightedNode.changed.subscribe((change) => {\n if (change.removed.length) {\n this.removeNodeClass(change.removed[0].id, '--drag-hover');\n }\n\n if (change.added.length) {\n this.addNodeClass(change.added[0].id, '--drag-hover');\n }\n });\n }\n\n ngAfterContentInit(): void {\n this.nodes.changes.subscribe(() => {\n this.addAllListener();\n });\n }\n\n ngOnDestroy(): void {\n this.removeAllListener();\n }\n\n onDragStart(node: TreeFlatNode): void {\n this.dragging = true;\n this.draggedNode = node;\n this.addNodeClass(node.id, '--dragged');\n\n this.dragStart.emit(node);\n }\n\n dragEnd(): void {\n this.dragging = false;\n if (this.draggedNode) {\n this.removeNodeClass(this.draggedNode.id, '--dragged');\n this.draggedNode = null;\n }\n\n this.dragLeave();\n this.removeDropTargetLine();\n }\n\n dragOver(node: TreeFlatNode, event: DragEvent): void {\n event.preventDefault();\n event.stopPropagation();\n\n this.dropNodeTarget = node;\n\n const position = this.getPosition(event, node);\n\n this.updateDropTargetLinePosition(position);\n\n this.setHighlightedNode(node);\n\n this.handleGroupExpansion(node, position.type === 'inside');\n }\n\n dragLeave(): void {\n clearTimeout(this.expandTimeout);\n this.expandTimeout = null;\n this.highlightedNode.clear();\n }\n\n drop(event: DragEvent): void {\n if (!this.dropNodeTarget || this.isDisabled) {\n return;\n }\n\n const dropPosition: DropPosition = this.getPosition(\n event,\n this.dropNodeTarget\n );\n\n const validation = this.canDropNode(this.dropNodeTarget, dropPosition);\n if (!validation.canDrop) {\n this.onDropError.emit(validation);\n return;\n }\n\n // Allow to drop a last child outside is group. We refer to it's ancestor for the target\n if (\n dropPosition.type === 'below' &&\n dropPosition.level !== this.dropNodeTarget.level\n ) {\n this.dropNodeTarget = this.getNodeAncestors(\n this.dropNodeTarget.id,\n dropPosition.level\n );\n }\n\n if (this.dropNodeTarget.isGroup) {\n if (dropPosition.type === 'inside') {\n const isExpanded = this.treeControl.isExpanded(this.dropNodeTarget);\n if (isExpanded) {\n const children = this.getDirectDescendants(this.dropNodeTarget);\n if (children[0]?.id === this.draggedNode.id) {\n return;\n }\n }\n\n this.treeControl.expand(this.dropNodeTarget);\n return this.onDrop.emit({\n node: this.draggedNode,\n ref: this.dropNodeTarget,\n position: dropPosition.type\n });\n }\n }\n\n if (\n dropPosition.type === 'below' &&\n dropPosition.level !== this.dropNodeTarget.level\n ) {\n const ancestor = this.getNodeAncestors(this.dropNodeTarget.id);\n return this.onDrop.emit({\n node: this.draggedNode,\n ref: ancestor,\n position: dropPosition.type\n });\n }\n\n this.onDrop.emit({\n node: this.draggedNode,\n ref: this.dropNodeTarget,\n position: dropPosition.type\n });\n }\n\n private addNodeClass(id: string, className: string): void {\n const node = this.nodes.find((node) => node.data.id === id);\n this.renderer.addClass(node['_elementRef'].nativeElement, className);\n }\n\n private removeNodeClass(id: string, className: string): void {\n const node = this.nodes.find((node) => node.data.id === id);\n this.renderer.removeClass(node['_elementRef'].nativeElement, className);\n }\n\n private addAllListener(): void {\n if (this.isDisabled) {\n return;\n }\n const nodes = this.nodes?.toArray();\n if (this.nodesListeners) {\n this.removeAllListener();\n }\n\n this.nodesListeners = nodes?.map((node) => this.addListener(node));\n }\n\n private addListener(node: MatTreeNode<TreeFlatNode>): DragNodeListeners {\n const element = node['_elementRef'].nativeElement as HTMLElement;\n const listeners: [string, EventListenerOrEventListenerObject][] = [\n ['dragstart', () => this.onDragStart(node.data)],\n ['dragend', () => this.dragEnd()],\n ['dragover', (event: DragEvent) => this.dragOver(node.data, event)],\n ['dragleave', () => this.dragLeave()]\n ];\n element.setAttribute('draggable', 'true');\n listeners.forEach(([type, listener]) =>\n element.addEventListener(type, listener)\n );\n\n return { element, listeners };\n }\n\n private removeAllListener(): void {\n this.nodesListeners?.forEach(({ element, listeners }) => {\n listeners.forEach(([type, listener]) => {\n element.setAttribute('draggable', 'false');\n element.removeEventListener(type, listener);\n });\n });\n this.nodesListeners = null;\n }\n\n private setHighlightedNode(node: TreeFlatNode): void {\n const toHighlight = node.isGroup ? node : this.getNodeAncestors(node.id);\n toHighlight\n ? this.highlightedNode.select(toHighlight)\n : this.highlightedNode.clear();\n }\n\n private addDropTargetLine(): void {\n const target: HTMLElement = this.renderer.createElement('div');\n target.classList.add('drop-target-line');\n target.setAttribute(\n 'style',\n `position: absolute; top: 0; width: 100%; pointer-events: none; z-index: 4; height: 2px; background-color: black; transition: margin-left 150ms;`\n );\n this.dropLineTarget = target;\n this.renderer.appendChild(\n this.elementRef.nativeElement.parentElement,\n this.dropLineTarget\n );\n }\n\n private removeDropTargetLine(): void {\n if (!this.dropLineTarget) {\n return;\n }\n this.renderer.removeChild(\n this.elementRef.nativeElement.parentElement,\n this.dropLineTarget\n );\n this.dropLineTarget = null;\n }\n\n private updateDropTargetLinePosition(position: DropPosition): void {\n if (!this.dropLineTarget) {\n this.addDropTargetLine();\n }\n\n if (position.type === 'inside') {\n return this.removeDropTargetLine();\n }\n\n this.renderer.setStyle(\n this.dropLineTarget,\n 'margin-left',\n position.level * 24 + 20 + 'px'\n );\n this.renderer.setStyle(\n this.dropLineTarget,\n 'transform',\n 'translate3d(0,' + position.y + 'px, 0)'\n );\n }\n\n private handleGroupExpansion(node: TreeFlatNode, isInside: boolean): void {\n if (!isInside) {\n return this.dragLeave();\n }\n const isOpen = this.treeControl.isExpanded(node);\n if (!isOpen && !this.expandTimeout) {\n this.expandTimeout = window.setTimeout(() => {\n this.treeControl.expand(node);\n }, 1200);\n }\n }\n\n private getNodeElement(node: TreeFlatNode): HTMLElement | undefined {\n const treeNode = this.nodes.find((n) => n.data.id === node.id);\n return treeNode?.['_elementRef'].nativeElement;\n }\n\n private canDropNode(\n hoveredNode: TreeFlatNode,\n position: DropPosition\n ): DropPermission {\n if (this.draggedNode.isGroup) {\n return this.canDropGroup(hoveredNode, position);\n }\n\n const hasMaxLevelRestrictions = this.validateMaxHierarchyLevel(position);\n if (hasMaxLevelRestrictions) {\n return hasMaxLevelRestrictions;\n }\n\n return { canDrop: true };\n }\n\n private canDropGroup(\n hoveredNode: TreeFlatNode,\n position: DropPosition\n ): DropPermission {\n // On ne veut pas permettre le Drop pour un groupe qui s'auto référence\n if (hoveredNode.id === this.draggedNode.id) {\n return {\n canDrop: false,\n message: 'igo.common.dragDrop.cannot.dropInsideItself'\n };\n }\n\n const hasMaxLevelRestrictions = this.validateMaxHierarchyLevel(position);\n if (hasMaxLevelRestrictions) {\n return hasMaxLevelRestrictions;\n }\n\n const isHoverDescendant = this.isHoverDescendant(hoveredNode.id);\n return {\n canDrop: !isHoverDescendant,\n message:\n isHoverDescendant && 'igo.common.dragDrop.cannot.dropInsideItself'\n };\n }\n\n private validateMaxHierarchyLevel(position: DropPosition): DropPermission {\n if (!this.maxLevel) {\n return;\n }\n\n let level =\n position.type === 'inside' ? position.level + 1 : position.level;\n\n if (this.draggedNode.isGroup) {\n // We add an extra level +1 to avoid empty group in group\n level = level + (this.draggedNode.descendantLevels ?? 0) + 1;\n }\n\n if (level > this.maxLevel) {\n return {\n canDrop: false,\n message: 'igo.common.dragDrop.cannot.maxLevel',\n params: { value: this.maxLevel }\n };\n }\n }\n\n private isHoverDescendant(id: string): boolean {\n return this.treeControl\n .getDescendants(this.draggedNode)\n .some((child) => child.id === id);\n }\n\n private getPosition(\n event: DragEvent,\n hoveredNode: TreeFlatNode\n ): DropPosition {\n if (this.draggedNode.isGroup) {\n if (this.isHoverDescendant(hoveredNode.id)) {\n hoveredNode = this.draggedNode;\n }\n }\n\n let positionType = this.getPositionType(event, hoveredNode);\n\n const bellowOpenedGroup =\n hoveredNode.isGroup &&\n positionType === 'below' &&\n this.treeControl.isExpanded(hoveredNode);\n if (bellowOpenedGroup) {\n positionType = 'inside';\n }\n\n return {\n x: event.x,\n y: this.getPositionY(hoveredNode, positionType),\n level: this.getPositionLevel(hoveredNode, positionType, event.x),\n type: positionType\n };\n }\n\n private getPositionY(node: TreeFlatNode, type: DropPositionType): number {\n const element = this.getNodeElement(node);\n const rect = element.getBoundingClientRect();\n\n return type === 'below'\n ? element.offsetTop + rect.height - 1\n : element.offsetTop + 1;\n }\n\n private getPositionType(\n event: DragEvent,\n hoveredNode: TreeFlatNode\n ): DropPositionType {\n const target = this.getNodeElement(hoveredNode);\n const rect = target.getBoundingClientRect();\n const middle = rect.top + rect.height / 2;\n const y = event.y;\n\n const selfReferencing = this.draggedNode.id === hoveredNode.id;\n if (hoveredNode.isGroup && !selfReferencing) {\n const tolerence = 5;\n if (y <= middle + tolerence && y >= middle - tolerence) {\n return 'inside';\n }\n }\n\n const isBelow = y > middle;\n return isBelow ? 'below' : 'above';\n }\n\n private getPositionLevel(\n hoveredNode: TreeFlatNode,\n type: DropPositionType,\n x: number\n ): number {\n if (hoveredNode.level === 0) {\n return 0;\n }\n\n const ancestor = this.getNodeAncestors(hoveredNode.id);\n const children = this.getDirectDescendants(ancestor);\n const lastChild = [...children].pop();\n\n if (type === 'below' && lastChild.id === hoveredNode.id) {\n const target = this.getNodeElement(hoveredNode);\n const rect = target.getBoundingClientRect();\n\n const indentation = 24;\n const xMin = rect.x + indentation;\n const xMax = xMin + indentation * hoveredNode.level;\n\n const isInsideSameGroup = x > xMax;\n if (!isInsideSameGroup) {\n const levelSubstracted = Math.round((xMax - x) / indentation);\n return Math.max(0, hoveredNode.level - levelSubstracted);\n }\n }\n\n return hoveredNode.level;\n }\n\n /**\n * @param level if level is defined with go to the defined levle to find ancestor. Sinon on prend le current ancestor\n */\n private getNodeAncestors(\n id: string,\n level?: number\n ): TreeFlatNode | undefined {\n const nodes = this.treeControl.dataNodes;\n const index = nodes.findIndex((node) => node.id === id);\n\n const targetLevel = level ?? Math.max(0, nodes[index].level - 1);\n return nodes\n .slice(0, index)\n .reverse()\n .find((node) => node.level === targetLevel);\n }\n\n private getDirectDescendants(node: TreeFlatNode): TreeFlatNode[] {\n const level = node.level + 1;\n return this.treeControl\n .getDescendants(node)\n .filter((child) => child.level === level);\n }\n}\n","import { ModuleWithProviders, NgModule } from '@angular/core';\n\nimport { DragAndDropDirective } from './drag-drop.directive';\nimport { TreeDragDropDirective } from './tree-drag-drop/tree-drag-drop.directive';\n\n/**\n * @deprecated import the DragAndDropDirective directly\n */\n@NgModule({\n imports: [DragAndDropDirective, TreeDragDropDirective],\n exports: [DragAndDropDirective, TreeDragDropDirective]\n})\nexport class IgoDrapDropModule {\n static forRoot(): ModuleWithProviders<IgoDrapDropModule> {\n return {\n ngModule: IgoDrapDropModule,\n providers: []\n };\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":"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"}
|