UNPKG

30.5 kBJavaScriptView Raw
1import { __decorate } from 'tslib';
2import { Injectable, EventEmitter, Input, Output, Directive, NgModule } from '@angular/core';
3import { FormArray } from '@angular/forms';
4
5// Copyright (C) 2016-2020 Sergey Akopkokhyants
6// This project is licensed under the terms of the MIT license.
7// https://github.com/akserg/ng2-dnd
8/**
9 * Check and return true if an object is type of string
10 */
11function isString(obj) {
12 return typeof obj === "string";
13}
14/**
15 * Check and return true if an object not undefined or null
16 */
17function isPresent(obj) {
18 return obj !== undefined && obj !== null;
19}
20/**
21 * Check and return true if an object is type of Function
22 */
23function isFunction(obj) {
24 return typeof obj === "function";
25}
26/**
27 * Create Image element with specified url string
28 */
29function createImage(src) {
30 let img = new HTMLImageElement();
31 img.src = src;
32 return img;
33}
34/**
35 * Call the function
36 */
37function callFun(fun) {
38 return fun();
39}
40
41// Copyright (C) 2016-2020 Sergey Akopkokhyants
42class DataTransferEffect {
43 constructor(name) {
44 this.name = name;
45 }
46}
47DataTransferEffect.COPY = new DataTransferEffect('copy');
48DataTransferEffect.LINK = new DataTransferEffect('link');
49DataTransferEffect.MOVE = new DataTransferEffect('move');
50DataTransferEffect.NONE = new DataTransferEffect('none');
51class DragImage {
52 constructor(imageElement, x_offset = 0, y_offset = 0) {
53 this.imageElement = imageElement;
54 this.x_offset = x_offset;
55 this.y_offset = y_offset;
56 if (isString(this.imageElement)) {
57 // Create real image from string source
58 let imgScr = this.imageElement;
59 this.imageElement = new HTMLImageElement();
60 this.imageElement.src = imgScr;
61 }
62 }
63}
64class DragDropConfig {
65 constructor() {
66 this.onDragStartClass = "dnd-drag-start";
67 this.onDragEnterClass = "dnd-drag-enter";
68 this.onDragOverClass = "dnd-drag-over";
69 this.onSortableDragClass = "dnd-sortable-drag";
70 this.dragEffect = DataTransferEffect.MOVE;
71 this.dropEffect = DataTransferEffect.MOVE;
72 this.dragCursor = "move";
73 this.defaultCursor = "pointer";
74 }
75}
76
77// Copyright (C) 2016-2020 Sergey Akopkokhyants
78class DragDropData {
79}
80function dragDropServiceFactory() {
81 return new DragDropService();
82}
83let DragDropService = class DragDropService {
84 constructor() {
85 this.allowedDropZones = [];
86 }
87};
88DragDropService = __decorate([
89 Injectable()
90], DragDropService);
91function dragDropSortableServiceFactory(config) {
92 return new DragDropSortableService(config);
93}
94let DragDropSortableService = class DragDropSortableService {
95 constructor(_config) {
96 this._config = _config;
97 }
98 get elem() {
99 return this._elem;
100 }
101 markSortable(elem) {
102 if (isPresent(this._elem)) {
103 this._elem.classList.remove(this._config.onSortableDragClass);
104 }
105 if (isPresent(elem)) {
106 this._elem = elem;
107 this._elem.classList.add(this._config.onSortableDragClass);
108 }
109 }
110};
111DragDropSortableService = __decorate([
112 Injectable()
113], DragDropSortableService);
114
115// Copyright (C) 2016-2020 Sergey Akopkokhyants
116let AbstractComponent = class AbstractComponent {
117 constructor(elemRef, _dragDropService, _config, _cdr) {
118 this._dragDropService = _dragDropService;
119 this._config = _config;
120 this._cdr = _cdr;
121 /**
122 * Whether the object is draggable. Default is true.
123 */
124 this._dragEnabled = false;
125 /**
126 * Allows drop on this element
127 */
128 this.dropEnabled = false;
129 this.dropZones = [];
130 this.cloneItem = false;
131 // Assign default cursor unless overridden
132 this._defaultCursor = _config.defaultCursor;
133 this._elem = elemRef.nativeElement;
134 this._elem.style.cursor = this._defaultCursor; // set default cursor on our element
135 //
136 // DROP events
137 //
138 this._elem.ondragenter = (event) => {
139 this._onDragEnter(event);
140 };
141 this._elem.ondragover = (event) => {
142 this._onDragOver(event);
143 //
144 if (event.dataTransfer != null) {
145 event.dataTransfer.dropEffect = this._config.dropEffect.name;
146 }
147 return false;
148 };
149 this._elem.ondragleave = (event) => {
150 this._onDragLeave(event);
151 };
152 this._elem.ondrop = (event) => {
153 this._onDrop(event);
154 };
155 //
156 // Drag events
157 //
158 this._elem.onmousedown = (event) => {
159 this._target = event.target;
160 };
161 this._elem.ondragstart = (event) => {
162 if (this._dragHandle) {
163 if (!this._dragHandle.contains(this._target)) {
164 event.preventDefault();
165 return;
166 }
167 }
168 this._onDragStart(event);
169 //
170 if (event.dataTransfer != null) {
171 event.dataTransfer.setData('text', '');
172 // Change drag effect
173 event.dataTransfer.effectAllowed = this.effectAllowed || this._config.dragEffect.name;
174 // Change drag image
175 if (isPresent(this.dragImage)) {
176 if (isString(this.dragImage)) {
177 event.dataTransfer.setDragImage(createImage(this.dragImage));
178 }
179 else if (isFunction(this.dragImage)) {
180 event.dataTransfer.setDragImage(callFun(this.dragImage));
181 }
182 else {
183 let img = this.dragImage;
184 event.dataTransfer.setDragImage(img.imageElement, img.x_offset, img.y_offset);
185 }
186 }
187 else if (isPresent(this._config.dragImage)) {
188 let dragImage = this._config.dragImage;
189 event.dataTransfer.setDragImage(dragImage.imageElement, dragImage.x_offset, dragImage.y_offset);
190 }
191 else if (this.cloneItem) {
192 this._dragHelper = this._elem.cloneNode(true);
193 this._dragHelper.classList.add('dnd-drag-item');
194 this._dragHelper.style.position = "absolute";
195 this._dragHelper.style.top = "0px";
196 this._dragHelper.style.left = "-1000px";
197 this._elem.parentElement.appendChild(this._dragHelper);
198 event.dataTransfer.setDragImage(this._dragHelper, event.offsetX, event.offsetY);
199 }
200 // Change drag cursor
201 let cursorelem = (this._dragHandle) ? this._dragHandle : this._elem;
202 if (this._dragEnabled) {
203 cursorelem.style.cursor = this.effectCursor ? this.effectCursor : this._config.dragCursor;
204 }
205 else {
206 cursorelem.style.cursor = this._defaultCursor;
207 }
208 }
209 };
210 this._elem.ondragend = (event) => {
211 if (this._elem.parentElement && this._dragHelper) {
212 this._elem.parentElement.removeChild(this._dragHelper);
213 }
214 // console.log('ondragend', event.target);
215 this._onDragEnd(event);
216 // Restore style of dragged element
217 let cursorelem = (this._dragHandle) ? this._dragHandle : this._elem;
218 cursorelem.style.cursor = this._defaultCursor;
219 };
220 }
221 set dragEnabled(enabled) {
222 this._dragEnabled = !!enabled;
223 this._elem.draggable = this._dragEnabled;
224 }
225 get dragEnabled() {
226 return this._dragEnabled;
227 }
228 setDragHandle(elem) {
229 this._dragHandle = elem;
230 }
231 /******* Change detection ******/
232 detectChanges() {
233 // Programmatically run change detection to fix issue in Safari
234 setTimeout(() => {
235 if (this._cdr && !this._cdr.destroyed) {
236 this._cdr.detectChanges();
237 }
238 }, 250);
239 }
240 //****** Droppable *******//
241 _onDragEnter(event) {
242 // console.log('ondragenter._isDropAllowed', this._isDropAllowed);
243 if (this._isDropAllowed(event)) {
244 // event.preventDefault();
245 this._onDragEnterCallback(event);
246 }
247 }
248 _onDragOver(event) {
249 // // console.log('ondragover._isDropAllowed', this._isDropAllowed);
250 if (this._isDropAllowed(event)) {
251 // The element is over the same source element - do nothing
252 if (event.preventDefault) {
253 // Necessary. Allows us to drop.
254 event.preventDefault();
255 }
256 this._onDragOverCallback(event);
257 }
258 }
259 _onDragLeave(event) {
260 // console.log('ondragleave._isDropAllowed', this._isDropAllowed);
261 if (this._isDropAllowed(event)) {
262 // event.preventDefault();
263 this._onDragLeaveCallback(event);
264 }
265 }
266 _onDrop(event) {
267 // console.log('ondrop._isDropAllowed', this._isDropAllowed);
268 if (this._isDropAllowed(event)) {
269 // Necessary. Allows us to drop.
270 this._preventAndStop(event);
271 this._onDropCallback(event);
272 this.detectChanges();
273 }
274 }
275 _isDropAllowed(event) {
276 if ((this._dragDropService.isDragged || (event.dataTransfer && event.dataTransfer.files)) && this.dropEnabled) {
277 // First, if `allowDrop` is set, call it to determine whether the
278 // dragged element can be dropped here.
279 if (this.allowDrop) {
280 return this.allowDrop(this._dragDropService.dragData);
281 }
282 // Otherwise, use dropZones if they are set.
283 if (this.dropZones.length === 0 && this._dragDropService.allowedDropZones.length === 0) {
284 return true;
285 }
286 for (let i = 0; i < this._dragDropService.allowedDropZones.length; i++) {
287 let dragZone = this._dragDropService.allowedDropZones[i];
288 if (this.dropZones.indexOf(dragZone) !== -1) {
289 return true;
290 }
291 }
292 }
293 return false;
294 }
295 _preventAndStop(event) {
296 if (event.preventDefault) {
297 event.preventDefault();
298 }
299 if (event.stopPropagation) {
300 event.stopPropagation();
301 }
302 }
303 //*********** Draggable **********//
304 _onDragStart(event) {
305 //console.log('ondragstart.dragEnabled', this._dragEnabled);
306 if (this._dragEnabled) {
307 this._dragDropService.allowedDropZones = this.dropZones;
308 // console.log('ondragstart.allowedDropZones', this._dragDropService.allowedDropZones);
309 this._onDragStartCallback(event);
310 }
311 }
312 _onDragEnd(event) {
313 this._dragDropService.allowedDropZones = [];
314 // console.log('ondragend.allowedDropZones', this._dragDropService.allowedDropZones);
315 this._onDragEndCallback(event);
316 }
317 //**** Drop Callbacks ****//
318 _onDragEnterCallback(event) { }
319 _onDragOverCallback(event) { }
320 _onDragLeaveCallback(event) { }
321 _onDropCallback(event) { }
322 //**** Drag Callbacks ****//
323 _onDragStartCallback(event) { }
324 _onDragEndCallback(event) { }
325};
326AbstractComponent = __decorate([
327 Injectable()
328], AbstractComponent);
329class AbstractHandleComponent {
330 constructor(elemRef, _dragDropService, _config, _Component, _cdr) {
331 this._dragDropService = _dragDropService;
332 this._config = _config;
333 this._Component = _Component;
334 this._cdr = _cdr;
335 this._elem = elemRef.nativeElement;
336 this._Component.setDragHandle(this._elem);
337 }
338}
339
340// Copyright (C) 2016-2020 Sergey Akopkokhyants
341let DraggableComponent = class DraggableComponent extends AbstractComponent {
342 constructor(elemRef, dragDropService, config, cdr) {
343 super(elemRef, dragDropService, config, cdr);
344 /**
345 * Callback function called when the drag actions happened.
346 */
347 this.onDragStart = new EventEmitter();
348 this.onDragEnd = new EventEmitter();
349 /**
350 * Callback function called when the drag action ends with a valid drop action.
351 * It is activated after the on-drop-success callback
352 */
353 this.onDragSuccessCallback = new EventEmitter();
354 this._defaultCursor = this._elem.style.cursor;
355 this.dragEnabled = true;
356 }
357 set draggable(value) {
358 this.dragEnabled = !!value;
359 }
360 set dropzones(value) {
361 this.dropZones = value;
362 }
363 /**
364 * Drag allowed effect
365 */
366 set effectallowed(value) {
367 this.effectAllowed = value;
368 }
369 /**
370 * Drag effect cursor
371 */
372 set effectcursor(value) {
373 this.effectCursor = value;
374 }
375 _onDragStartCallback(event) {
376 this._dragDropService.isDragged = true;
377 this._dragDropService.dragData = this.dragData;
378 this._dragDropService.onDragSuccessCallback = this.onDragSuccessCallback;
379 this._elem.classList.add(this._config.onDragStartClass);
380 //
381 this.onDragStart.emit({ dragData: this.dragData, mouseEvent: event });
382 }
383 _onDragEndCallback(event) {
384 this._dragDropService.isDragged = false;
385 this._dragDropService.dragData = null;
386 this._dragDropService.onDragSuccessCallback = null;
387 this._elem.classList.remove(this._config.onDragStartClass);
388 //
389 this.onDragEnd.emit({ dragData: this.dragData, mouseEvent: event });
390 }
391};
392__decorate([
393 Input("dragEnabled")
394], DraggableComponent.prototype, "draggable", null);
395__decorate([
396 Output()
397], DraggableComponent.prototype, "onDragStart", void 0);
398__decorate([
399 Output()
400], DraggableComponent.prototype, "onDragEnd", void 0);
401__decorate([
402 Input()
403], DraggableComponent.prototype, "dragData", void 0);
404__decorate([
405 Output("onDragSuccess")
406], DraggableComponent.prototype, "onDragSuccessCallback", void 0);
407__decorate([
408 Input("dropZones")
409], DraggableComponent.prototype, "dropzones", null);
410__decorate([
411 Input("effectAllowed")
412], DraggableComponent.prototype, "effectallowed", null);
413__decorate([
414 Input("effectCursor")
415], DraggableComponent.prototype, "effectcursor", null);
416__decorate([
417 Input()
418], DraggableComponent.prototype, "dragImage", void 0);
419__decorate([
420 Input()
421], DraggableComponent.prototype, "cloneItem", void 0);
422DraggableComponent = __decorate([
423 Directive({ selector: '[dnd-draggable]' })
424], DraggableComponent);
425let DraggableHandleComponent = class DraggableHandleComponent extends AbstractHandleComponent {
426 constructor(elemRef, dragDropService, config, _Component, cdr) {
427 super(elemRef, dragDropService, config, _Component, cdr);
428 }
429};
430DraggableHandleComponent = __decorate([
431 Directive({ selector: '[dnd-draggable-handle]' })
432], DraggableHandleComponent);
433
434// Copyright (C) 2016-2020 Sergey Akopkokhyants
435let DroppableComponent = class DroppableComponent extends AbstractComponent {
436 constructor(elemRef, dragDropService, config, cdr) {
437 super(elemRef, dragDropService, config, cdr);
438 /**
439 * Callback function called when the drop action completes correctly.
440 * It is activated before the on-drag-success callback.
441 */
442 this.onDropSuccess = new EventEmitter();
443 this.onDragEnter = new EventEmitter();
444 this.onDragOver = new EventEmitter();
445 this.onDragLeave = new EventEmitter();
446 this.dropEnabled = true;
447 }
448 set droppable(value) {
449 this.dropEnabled = !!value;
450 }
451 set allowdrop(value) {
452 this.allowDrop = value;
453 }
454 set dropzones(value) {
455 this.dropZones = value;
456 }
457 /**
458 * Drag allowed effect
459 */
460 set effectallowed(value) {
461 this.effectAllowed = value;
462 }
463 /**
464 * Drag effect cursor
465 */
466 set effectcursor(value) {
467 this.effectCursor = value;
468 }
469 _onDragEnterCallback(event) {
470 if (this._dragDropService.isDragged) {
471 this._elem.classList.add(this._config.onDragEnterClass);
472 this.onDragEnter.emit({ dragData: this._dragDropService.dragData, mouseEvent: event });
473 }
474 }
475 _onDragOverCallback(event) {
476 if (this._dragDropService.isDragged) {
477 this._elem.classList.add(this._config.onDragOverClass);
478 this.onDragOver.emit({ dragData: this._dragDropService.dragData, mouseEvent: event });
479 }
480 }
481 ;
482 _onDragLeaveCallback(event) {
483 if (this._dragDropService.isDragged) {
484 this._elem.classList.remove(this._config.onDragOverClass);
485 this._elem.classList.remove(this._config.onDragEnterClass);
486 this.onDragLeave.emit({ dragData: this._dragDropService.dragData, mouseEvent: event });
487 }
488 }
489 ;
490 _onDropCallback(event) {
491 let dataTransfer = event.dataTransfer;
492 if (this._dragDropService.isDragged || (dataTransfer && dataTransfer.files)) {
493 this.onDropSuccess.emit({ dragData: this._dragDropService.dragData, mouseEvent: event });
494 if (this._dragDropService.onDragSuccessCallback) {
495 this._dragDropService.onDragSuccessCallback.emit({ dragData: this._dragDropService.dragData, mouseEvent: event });
496 }
497 this._elem.classList.remove(this._config.onDragOverClass);
498 this._elem.classList.remove(this._config.onDragEnterClass);
499 }
500 }
501};
502__decorate([
503 Input("dropEnabled")
504], DroppableComponent.prototype, "droppable", null);
505__decorate([
506 Output()
507], DroppableComponent.prototype, "onDropSuccess", void 0);
508__decorate([
509 Output()
510], DroppableComponent.prototype, "onDragEnter", void 0);
511__decorate([
512 Output()
513], DroppableComponent.prototype, "onDragOver", void 0);
514__decorate([
515 Output()
516], DroppableComponent.prototype, "onDragLeave", void 0);
517__decorate([
518 Input("allowDrop")
519], DroppableComponent.prototype, "allowdrop", null);
520__decorate([
521 Input("dropZones")
522], DroppableComponent.prototype, "dropzones", null);
523__decorate([
524 Input("effectAllowed")
525], DroppableComponent.prototype, "effectallowed", null);
526__decorate([
527 Input("effectCursor")
528], DroppableComponent.prototype, "effectcursor", null);
529DroppableComponent = __decorate([
530 Directive({ selector: '[dnd-droppable]' })
531], DroppableComponent);
532
533// Copyright (C) 2016-2020 Sergey Akopkokhyants
534let SortableContainer = class SortableContainer extends AbstractComponent {
535 constructor(elemRef, dragDropService, config, cdr, _sortableDataService) {
536 super(elemRef, dragDropService, config, cdr);
537 this._sortableDataService = _sortableDataService;
538 this._sortableData = [];
539 this.dragEnabled = false;
540 }
541 set draggable(value) {
542 this.dragEnabled = !!value;
543 }
544 set sortableData(sortableData) {
545 this._sortableData = sortableData;
546 if (sortableData instanceof FormArray) {
547 this.sortableHandler = new SortableFormArrayHandler();
548 }
549 else {
550 this.sortableHandler = new SortableArrayHandler();
551 }
552 //
553 this.dropEnabled = !!this._sortableData;
554 // console.log("collection is changed, drop enabled: " + this.dropEnabled);
555 }
556 get sortableData() {
557 return this._sortableData;
558 }
559 set dropzones(value) {
560 this.dropZones = value;
561 }
562 _onDragEnterCallback(event) {
563 if (this._sortableDataService.isDragged) {
564 let item = this._sortableDataService.sortableContainer.getItemAt(this._sortableDataService.index);
565 // Check does element exist in sortableData of this Container
566 if (this.indexOf(item) === -1) {
567 // Let's add it
568 // console.log('Container._onDragEnterCallback. drag node [' + this._sortableDataService.index.toString() + '] over parent node');
569 // Remove item from previouse list
570 this._sortableDataService.sortableContainer.removeItemAt(this._sortableDataService.index);
571 if (this._sortableDataService.sortableContainer._sortableData.length === 0) {
572 this._sortableDataService.sortableContainer.dropEnabled = true;
573 }
574 // Add item to new list
575 this.insertItemAt(item, 0);
576 this._sortableDataService.sortableContainer = this;
577 this._sortableDataService.index = 0;
578 }
579 // Refresh changes in properties of container component
580 this.detectChanges();
581 }
582 }
583 getItemAt(index) {
584 return this.sortableHandler.getItemAt(this._sortableData, index);
585 }
586 indexOf(item) {
587 return this.sortableHandler.indexOf(this._sortableData, item);
588 }
589 removeItemAt(index) {
590 this.sortableHandler.removeItemAt(this._sortableData, index);
591 }
592 insertItemAt(item, index) {
593 this.sortableHandler.insertItemAt(this._sortableData, item, index);
594 }
595};
596__decorate([
597 Input("dragEnabled")
598], SortableContainer.prototype, "draggable", null);
599__decorate([
600 Input()
601], SortableContainer.prototype, "sortableData", null);
602__decorate([
603 Input("dropZones")
604], SortableContainer.prototype, "dropzones", null);
605SortableContainer = __decorate([
606 Directive({ selector: '[dnd-sortable-container]' })
607], SortableContainer);
608class SortableArrayHandler {
609 getItemAt(sortableData, index) {
610 return sortableData[index];
611 }
612 indexOf(sortableData, item) {
613 return sortableData.indexOf(item);
614 }
615 removeItemAt(sortableData, index) {
616 sortableData.splice(index, 1);
617 }
618 insertItemAt(sortableData, item, index) {
619 sortableData.splice(index, 0, item);
620 }
621}
622class SortableFormArrayHandler {
623 getItemAt(sortableData, index) {
624 return sortableData.at(index);
625 }
626 indexOf(sortableData, item) {
627 return sortableData.controls.indexOf(item);
628 }
629 removeItemAt(sortableData, index) {
630 sortableData.removeAt(index);
631 }
632 insertItemAt(sortableData, item, index) {
633 sortableData.insert(index, item);
634 }
635}
636let SortableComponent = class SortableComponent extends AbstractComponent {
637 constructor(elemRef, dragDropService, config, _sortableContainer, _sortableDataService, cdr) {
638 super(elemRef, dragDropService, config, cdr);
639 this._sortableContainer = _sortableContainer;
640 this._sortableDataService = _sortableDataService;
641 /**
642 * Callback function called when the drag action ends with a valid drop action.
643 * It is activated after the on-drop-success callback
644 */
645 this.onDragSuccessCallback = new EventEmitter();
646 this.onDragStartCallback = new EventEmitter();
647 this.onDragOverCallback = new EventEmitter();
648 this.onDragEndCallback = new EventEmitter();
649 this.onDropSuccessCallback = new EventEmitter();
650 this.dropZones = this._sortableContainer.dropZones;
651 this.dragEnabled = true;
652 this.dropEnabled = true;
653 }
654 set draggable(value) {
655 this.dragEnabled = !!value;
656 }
657 set droppable(value) {
658 this.dropEnabled = !!value;
659 }
660 /**
661 * Drag allowed effect
662 */
663 set effectallowed(value) {
664 this.effectAllowed = value;
665 }
666 /**
667 * Drag effect cursor
668 */
669 set effectcursor(value) {
670 this.effectCursor = value;
671 }
672 _onDragStartCallback(event) {
673 // console.log('_onDragStartCallback. dragging elem with index ' + this.index);
674 this._sortableDataService.isDragged = true;
675 this._sortableDataService.sortableContainer = this._sortableContainer;
676 this._sortableDataService.index = this.index;
677 this._sortableDataService.markSortable(this._elem);
678 // Add dragData
679 this._dragDropService.isDragged = true;
680 this._dragDropService.dragData = this.dragData;
681 this._dragDropService.onDragSuccessCallback = this.onDragSuccessCallback;
682 //
683 this.onDragStartCallback.emit(this._dragDropService.dragData);
684 }
685 _onDragOverCallback(event) {
686 if (this._sortableDataService.isDragged && this._elem !== this._sortableDataService.elem) {
687 // console.log('_onDragOverCallback. dragging elem with index ' + this.index);
688 this._sortableDataService.sortableContainer = this._sortableContainer;
689 this._sortableDataService.index = this.index;
690 this._sortableDataService.markSortable(this._elem);
691 this.onDragOverCallback.emit(this._dragDropService.dragData);
692 }
693 }
694 _onDragEndCallback(event) {
695 // console.log('_onDragEndCallback. end dragging elem with index ' + this.index);
696 this._sortableDataService.isDragged = false;
697 this._sortableDataService.sortableContainer = null;
698 this._sortableDataService.index = null;
699 this._sortableDataService.markSortable(null);
700 // Add dragGata
701 this._dragDropService.isDragged = false;
702 this._dragDropService.dragData = null;
703 this._dragDropService.onDragSuccessCallback = null;
704 //
705 this.onDragEndCallback.emit(this._dragDropService.dragData);
706 }
707 _onDragEnterCallback(event) {
708 if (this._sortableDataService.isDragged) {
709 this._sortableDataService.markSortable(this._elem);
710 if ((this.index !== this._sortableDataService.index) ||
711 (this._sortableDataService.sortableContainer.sortableData !== this._sortableContainer.sortableData)) {
712 // console.log('Component._onDragEnterCallback. drag node [' + this.index + '] over node [' + this._sortableDataService.index + ']');
713 // Get item
714 let item = this._sortableDataService.sortableContainer.getItemAt(this._sortableDataService.index);
715 // Remove item from previouse list
716 this._sortableDataService.sortableContainer.removeItemAt(this._sortableDataService.index);
717 if (this._sortableDataService.sortableContainer.sortableData.length === 0) {
718 this._sortableDataService.sortableContainer.dropEnabled = true;
719 }
720 // Add item to new list
721 this._sortableContainer.insertItemAt(item, this.index);
722 if (this._sortableContainer.dropEnabled) {
723 this._sortableContainer.dropEnabled = false;
724 }
725 this._sortableDataService.sortableContainer = this._sortableContainer;
726 this._sortableDataService.index = this.index;
727 this.detectChanges();
728 }
729 }
730 }
731 _onDropCallback(event) {
732 if (this._sortableDataService.isDragged) {
733 // console.log('onDropCallback.onDropSuccessCallback.dragData', this._dragDropService.dragData);
734 this.onDropSuccessCallback.emit(this._dragDropService.dragData);
735 if (this._dragDropService.onDragSuccessCallback) {
736 // console.log('onDropCallback.onDragSuccessCallback.dragData', this._dragDropService.dragData);
737 this._dragDropService.onDragSuccessCallback.emit(this._dragDropService.dragData);
738 }
739 // Refresh changes in properties of container component
740 this._sortableContainer.detectChanges();
741 }
742 }
743};
744__decorate([
745 Input('sortableIndex')
746], SortableComponent.prototype, "index", void 0);
747__decorate([
748 Input("dragEnabled")
749], SortableComponent.prototype, "draggable", null);
750__decorate([
751 Input("dropEnabled")
752], SortableComponent.prototype, "droppable", null);
753__decorate([
754 Input()
755], SortableComponent.prototype, "dragData", void 0);
756__decorate([
757 Input("effectAllowed")
758], SortableComponent.prototype, "effectallowed", null);
759__decorate([
760 Input("effectCursor")
761], SortableComponent.prototype, "effectcursor", null);
762__decorate([
763 Output("onDragSuccess")
764], SortableComponent.prototype, "onDragSuccessCallback", void 0);
765__decorate([
766 Output("onDragStart")
767], SortableComponent.prototype, "onDragStartCallback", void 0);
768__decorate([
769 Output("onDragOver")
770], SortableComponent.prototype, "onDragOverCallback", void 0);
771__decorate([
772 Output("onDragEnd")
773], SortableComponent.prototype, "onDragEndCallback", void 0);
774__decorate([
775 Output("onDropSuccess")
776], SortableComponent.prototype, "onDropSuccessCallback", void 0);
777SortableComponent = __decorate([
778 Directive({ selector: '[dnd-sortable]' })
779], SortableComponent);
780let SortableHandleComponent = class SortableHandleComponent extends AbstractHandleComponent {
781 constructor(elemRef, dragDropService, config, _Component, cdr) {
782 super(elemRef, dragDropService, config, _Component, cdr);
783 }
784};
785SortableHandleComponent = __decorate([
786 Directive({ selector: '[dnd-sortable-handle]' })
787], SortableHandleComponent);
788
789// Copyright (C) 2016-2020 Sergey Akopkokhyants
790// This project is licensed under the terms of the MIT license.
791// https://github.com/akserg/ng2-dnd
792var DndModule_1;
793const ɵ0 = dragDropServiceFactory, ɵ1 = dragDropSortableServiceFactory;
794let providers = [
795 DragDropConfig,
796 { provide: DragDropService, useFactory: ɵ0 },
797 { provide: DragDropSortableService, useFactory: ɵ1, deps: [DragDropConfig] }
798];
799let DndModule = DndModule_1 = class DndModule {
800 static forRoot() {
801 return {
802 ngModule: DndModule_1,
803 providers: providers
804 };
805 }
806};
807DndModule = DndModule_1 = __decorate([
808 NgModule({
809 declarations: [DraggableComponent, DraggableHandleComponent, DroppableComponent, SortableContainer, SortableComponent, SortableHandleComponent],
810 exports: [DraggableComponent, DraggableHandleComponent, DroppableComponent, SortableContainer, SortableComponent, SortableHandleComponent],
811 })
812], DndModule);
813
814// Copyright (C) 2016-2020 Sergey Akopkokhyants
815
816/**
817 * Generated bundle index. Do not edit.
818 */
819
820export { AbstractComponent, AbstractHandleComponent, DataTransferEffect, DndModule, DragDropConfig, DragDropData, DragDropService, DragDropSortableService, DragImage, DraggableComponent, DraggableHandleComponent, DroppableComponent, SortableComponent, SortableContainer, SortableHandleComponent, dragDropServiceFactory, dragDropSortableServiceFactory, providers, ɵ0, ɵ1 };
821//# sourceMappingURL=ng2-dnd.js.map