@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.
@@ -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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"}