@hungthuanmk/ng2-dnd
Version:
Angular 14+ Drag-and-Drop without dependencies
1 lines • 66.7 kB
Source Map (JSON)
{"version":3,"file":"hungthuanmk-ng2-dnd.mjs","sources":["../../src/dnd.utils.ts","../../src/dnd.config.ts","../../src/dnd.service.ts","../../src/abstract.component.ts","../../src/draggable.component.ts","../../src/droppable.component.ts","../../src/sortable.component.ts","../../src/dnd.module.ts","../../public_api.ts","../../hungthuanmk-ng2-dnd.ts"],"sourcesContent":["// Copyright (C) 2016-2020 Sergey Akopkokhyants\r\n// This project is licensed under the terms of the MIT license.\r\n// https://github.com/akserg/ng2-dnd\r\n\r\n/**\r\n * Check and return true if an object is type of string\r\n */\r\nexport function isString(obj:any) {\r\n return typeof obj === \"string\";\r\n}\r\n\r\n/**\r\n * Check and return true if an object not undefined or null\r\n */\r\nexport function isPresent(obj: any) {\r\n return obj !== undefined && obj !== null;\r\n}\r\n\r\n/**\r\n * Check and return true if an object is type of Function\r\n */\r\nexport function isFunction(obj: any) {\r\n return typeof obj === \"function\";\r\n}\r\n\r\n/**\r\n * Create Image element with specified url string\r\n */\r\nexport function createImage(src: string) {\r\n let img:HTMLImageElement = new HTMLImageElement();\r\n img.src = src;\r\n return img;\r\n}\r\n\r\n/**\r\n * Call the function\r\n */\r\nexport function callFun(fun: Function) {\r\n return fun();\r\n}","// Copyright (C) 2016-2020 Sergey Akopkokhyants\r\n// This project is licensed under the terms of the MIT license.\r\n// https://github.com/akserg/ng2-dnd\r\n\r\nimport { isString } from './dnd.utils';\r\n\r\nexport class DataTransferEffect {\r\n\r\n static COPY = new DataTransferEffect('copy');\r\n static LINK = new DataTransferEffect('link');\r\n static MOVE = new DataTransferEffect('move');\r\n static NONE = new DataTransferEffect('none');\r\n\r\n constructor(public name: DataTransfer['dropEffect']) { }\r\n}\r\n\r\nexport class DragImage {\r\n constructor(\r\n public imageElement: any,\r\n public x_offset: number = 0,\r\n public y_offset: number = 0) {\r\n if (isString(this.imageElement)) {\r\n // Create real image from string source\r\n let imgScr: string = <string>this.imageElement;\r\n this.imageElement = new HTMLImageElement();\r\n (<HTMLImageElement>this.imageElement).src = imgScr;\r\n }\r\n }\r\n}\r\n\r\nexport class DragDropConfig {\r\n public onDragStartClass: string = \"dnd-drag-start\";\r\n public onDragEnterClass: string = \"dnd-drag-enter\";\r\n public onDragOverClass: string = \"dnd-drag-over\";\r\n public onSortableDragClass: string = \"dnd-sortable-drag\";\r\n\r\n public dragEffect: DataTransferEffect = DataTransferEffect.MOVE;\r\n public dropEffect: DataTransferEffect = DataTransferEffect.MOVE;\r\n public dragCursor: string = \"move\";\r\n public dragImage: DragImage;\r\n public defaultCursor: string = \"pointer\";\r\n}\r\n","// Copyright (C) 2016-2020 Sergey Akopkokhyants\r\n// This project is licensed under the terms of the MIT license.\r\n// https://github.com/akserg/ng2-dnd\r\n\r\nimport { Injectable, EventEmitter} from '@angular/core';\r\n\r\nimport { DragDropConfig } from './dnd.config';\r\nimport { isPresent } from './dnd.utils';\r\nimport { SortableContainer } from './sortable.component';\r\n\r\nexport class DragDropData {\r\n dragData: any;\r\n mouseEvent: MouseEvent;\r\n}\r\n\r\nexport function dragDropServiceFactory(): DragDropService {\r\n return new DragDropService();\r\n}\r\n\r\n@Injectable()\r\nexport class DragDropService {\r\n allowedDropZones: Array<string> = [];\r\n onDragSuccessCallback: EventEmitter<DragDropData>;\r\n dragData: any;\r\n isDragged: boolean;\r\n}\r\n\r\nexport function dragDropSortableServiceFactory(config: DragDropConfig): DragDropSortableService {\r\n return new DragDropSortableService(config);\r\n}\r\n\r\n@Injectable()\r\nexport class DragDropSortableService {\r\n index: number;\r\n sortableContainer: SortableContainer;\r\n isDragged: boolean;\r\n\r\n private _elem: HTMLElement;\r\n public get elem(): HTMLElement {\r\n return this._elem;\r\n }\r\n\r\n constructor(private _config:DragDropConfig) {}\r\n\r\n markSortable(elem: HTMLElement) {\r\n if (isPresent(this._elem)) {\r\n this._elem.classList.remove(this._config.onSortableDragClass);\r\n }\r\n if (isPresent(elem)) {\r\n this._elem = elem;\r\n this._elem.classList.add(this._config.onSortableDragClass);\r\n }\r\n }\r\n}\r\n","// Copyright (C) 2016-2020 Sergey Akopkokhyants\r\n// This project is licensed under the terms of the MIT license.\r\n// https://github.com/akserg/ng2-dnd\r\n\r\nimport { Injectable, ChangeDetectorRef, ViewRef, Directive } from '@angular/core';\r\nimport {ElementRef} from '@angular/core';\r\n\r\nimport { DragDropConfig, DragImage } from './dnd.config';\r\nimport { DragDropService } from './dnd.service';\r\nimport { isString, isFunction, isPresent, createImage, callFun } from './dnd.utils';\r\n\r\n@Injectable()\r\n@Directive()\r\nexport abstract class AbstractComponent {\r\n _elem: HTMLElement;\r\n _dragHandle: HTMLElement;\r\n _dragHelper: HTMLElement;\r\n _defaultCursor: string;\r\n\r\n /**\r\n * Last element that was mousedown'ed\r\n */\r\n _target: EventTarget;\r\n\r\n /**\r\n * Whether the object is draggable. Default is true.\r\n */\r\n private _dragEnabled: boolean = false;\r\n set dragEnabled(enabled: boolean) {\r\n this._dragEnabled = !!enabled;\r\n this._elem.draggable = this._dragEnabled;\r\n }\r\n get dragEnabled(): boolean {\r\n return this._dragEnabled;\r\n }\r\n\r\n /**\r\n * Allows drop on this element\r\n */\r\n dropEnabled: boolean = false;\r\n /**\r\n * Drag effect\r\n */\r\n effectAllowed: DataTransfer['effectAllowed'];\r\n /**\r\n * Drag cursor\r\n */\r\n effectCursor: string;\r\n\r\n /**\r\n * Restrict places where a draggable element can be dropped. Either one of\r\n * these two mechanisms can be used:\r\n *\r\n * - dropZones: an array of strings that permits to specify the drop zones\r\n * associated with this component. By default, if the drop-zones attribute\r\n * is not specified, the droppable component accepts drop operations by\r\n * all the draggable components that do not specify the allowed-drop-zones\r\n *\r\n * - allowDrop: a boolean function for droppable components, that is checked\r\n * when an item is dragged. The function is passed the dragData of this\r\n * item.\r\n * - if it returns true, the item can be dropped in this component\r\n * - if it returns false, the item cannot be dropped here\r\n */\r\n allowDrop: (dropData: any) => boolean;\r\n dropZones: string[] = [];\r\n\r\n /**\r\n * Here is the property dragImage you can use:\r\n * - The string value as url to the image\r\n * <div class=\"panel panel-default\"\r\n * dnd-draggable [dragEnabled]=\"true\"\r\n * [dragImage]=\"/images/simpler.png\">\r\n * ...\r\n * - The DragImage value with Image and optional offset by x and y:\r\n * let myDragImage: DragImage = new DragImage(\"/images/simpler1.png\", 0, 0);\r\n * ...\r\n * <div class=\"panel panel-default\"\r\n * dnd-draggable [dragEnabled]=\"true\"\r\n * [dragImage]=\"myDragImage\">\r\n * ...\r\n * - The custom function to return the value of dragImage programmatically:\r\n * <div class=\"panel panel-default\"\r\n * dnd-draggable [dragEnabled]=\"true\"\r\n * [dragImage]=\"getDragImage(someData)\">\r\n * ...\r\n * getDragImage(value:any): string {\r\n * return value ? \"/images/simpler1.png\" : \"/images/simpler2.png\"\r\n * }\r\n */\r\n dragImage: string | DragImage | Function;\r\n\r\n cloneItem: boolean = false;\r\n\r\n constructor(elemRef: ElementRef, public _dragDropService: DragDropService, public _config: DragDropConfig,\r\n private _cdr: ChangeDetectorRef) {\r\n\r\n // Assign default cursor unless overridden\r\n this._defaultCursor = _config.defaultCursor;\r\n this._elem = elemRef.nativeElement;\r\n this._elem.style.cursor = this._defaultCursor; // set default cursor on our element\r\n //\r\n // DROP events\r\n //\r\n this._elem.ondragenter = (event: Event) => {\r\n this._onDragEnter(event);\r\n };\r\n this._elem.ondragover = (event: DragEvent) => {\r\n this._onDragOver(event);\r\n //\r\n if (event.dataTransfer != null) {\r\n event.dataTransfer.dropEffect = this._config.dropEffect.name;\r\n }\r\n\r\n return false;\r\n };\r\n this._elem.ondragleave = (event: Event) => {\r\n this._onDragLeave(event);\r\n };\r\n this._elem.ondrop = (event: Event) => {\r\n this._onDrop(event);\r\n };\r\n //\r\n // Drag events\r\n //\r\n this._elem.onmousedown = (event: MouseEvent) => {\r\n this._target = event.target;\r\n };\r\n this._elem.ondragstart = (event: DragEvent) => {\r\n if (this._dragHandle) {\r\n if (!this._dragHandle.contains(<Element>this._target)) {\r\n event.preventDefault();\r\n return;\r\n }\r\n }\r\n\r\n this._onDragStart(event);\r\n //\r\n if (event.dataTransfer != null) {\r\n event.dataTransfer.setData('text', '');\r\n // Change drag effect\r\n event.dataTransfer.effectAllowed = this.effectAllowed || this._config.dragEffect.name;\r\n // Change drag image\r\n if (isPresent(this.dragImage)) {\r\n if (isString(this.dragImage)) {\r\n (<any>event.dataTransfer).setDragImage(createImage(<string>this.dragImage));\r\n } else if (isFunction(this.dragImage)) {\r\n (<any>event.dataTransfer).setDragImage(callFun(<Function>this.dragImage));\r\n } else {\r\n let img: DragImage = <DragImage>this.dragImage;\r\n (<any>event.dataTransfer).setDragImage(img.imageElement, img.x_offset, img.y_offset);\r\n }\r\n } else if (isPresent(this._config.dragImage)) {\r\n let dragImage: DragImage = this._config.dragImage;\r\n (<any>event.dataTransfer).setDragImage(dragImage.imageElement, dragImage.x_offset, dragImage.y_offset);\r\n } else if (this.cloneItem) {\r\n this._dragHelper = <HTMLElement>this._elem.cloneNode(true);\r\n this._dragHelper.classList.add('dnd-drag-item');\r\n this._dragHelper.style.position = \"absolute\";\r\n this._dragHelper.style.top = \"0px\";\r\n this._dragHelper.style.left = \"-1000px\";\r\n this._elem.parentElement.appendChild(this._dragHelper);\r\n (<any>event.dataTransfer).setDragImage(this._dragHelper, event.offsetX, event.offsetY);\r\n }\r\n\r\n // Change drag cursor\r\n let cursorelem = (this._dragHandle) ? this._dragHandle : this._elem;\r\n\r\n if (this._dragEnabled) {\r\n cursorelem.style.cursor = this.effectCursor ? this.effectCursor : this._config.dragCursor;\r\n } else {\r\n cursorelem.style.cursor = this._defaultCursor;\r\n }\r\n }\r\n };\r\n\r\n this._elem.ondragend = (event: Event) => {\r\n if (this._elem.parentElement && this._dragHelper) {\r\n this._elem.parentElement.removeChild(this._dragHelper);\r\n }\r\n // console.log('ondragend', event.target);\r\n this._onDragEnd(event);\r\n // Restore style of dragged element\r\n let cursorelem = (this._dragHandle) ? this._dragHandle : this._elem;\r\n cursorelem.style.cursor = this._defaultCursor;\r\n };\r\n }\r\n\r\n public setDragHandle(elem: HTMLElement) {\r\n this._dragHandle = elem;\r\n }\r\n /******* Change detection ******/\r\n\r\n detectChanges () {\r\n // Programmatically run change detection to fix issue in Safari\r\n setTimeout(() => {\r\n if ( this._cdr && !(this._cdr as ViewRef).destroyed ) {\r\n this._cdr.detectChanges();\r\n }\r\n }, 250);\r\n }\r\n\r\n //****** Droppable *******//\r\n private _onDragEnter(event: Event): void {\r\n // console.log('ondragenter._isDropAllowed', this._isDropAllowed);\r\n if (this._isDropAllowed(event)) {\r\n // event.preventDefault();\r\n this._onDragEnterCallback(event);\r\n }\r\n }\r\n\r\n private _onDragOver(event: Event) {\r\n // // console.log('ondragover._isDropAllowed', this._isDropAllowed);\r\n if (this._isDropAllowed(event)) {\r\n // The element is over the same source element - do nothing\r\n if (event.preventDefault) {\r\n // Necessary. Allows us to drop.\r\n event.preventDefault();\r\n }\r\n\r\n this._onDragOverCallback(event);\r\n }\r\n }\r\n\r\n private _onDragLeave(event: Event): void {\r\n // console.log('ondragleave._isDropAllowed', this._isDropAllowed);\r\n if (this._isDropAllowed(event)) {\r\n // event.preventDefault();\r\n this._onDragLeaveCallback(event);\r\n }\r\n }\r\n\r\n private _onDrop(event: Event): void {\r\n // console.log('ondrop._isDropAllowed', this._isDropAllowed);\r\n if (this._isDropAllowed(event)) {\r\n // Necessary. Allows us to drop.\r\n this._preventAndStop(event);\r\n\r\n this._onDropCallback(event);\r\n\r\n this.detectChanges();\r\n }\r\n }\r\n\r\n private _isDropAllowed(event: any): boolean {\r\n if ((this._dragDropService.isDragged || (event.dataTransfer && event.dataTransfer.files)) && this.dropEnabled) {\r\n // First, if `allowDrop` is set, call it to determine whether the\r\n // dragged element can be dropped here.\r\n if (this.allowDrop) {\r\n return this.allowDrop(this._dragDropService.dragData);\r\n }\r\n\r\n // Otherwise, use dropZones if they are set.\r\n if (this.dropZones.length === 0 && this._dragDropService.allowedDropZones.length === 0) {\r\n return true;\r\n }\r\n for (let i: number = 0; i < this._dragDropService.allowedDropZones.length; i++) {\r\n let dragZone: string = this._dragDropService.allowedDropZones[i];\r\n if (this.dropZones.indexOf(dragZone) !== -1) {\r\n return true;\r\n }\r\n }\r\n }\r\n return false;\r\n }\r\n\r\n private _preventAndStop(event: Event): any {\r\n if (event.preventDefault) {\r\n event.preventDefault();\r\n }\r\n if (event.stopPropagation) {\r\n event.stopPropagation();\r\n }\r\n }\r\n\r\n //*********** Draggable **********//\r\n\r\n private _onDragStart(event: Event): void {\r\n //console.log('ondragstart.dragEnabled', this._dragEnabled);\r\n if (this._dragEnabled) {\r\n this._dragDropService.allowedDropZones = this.dropZones;\r\n // console.log('ondragstart.allowedDropZones', this._dragDropService.allowedDropZones);\r\n this._onDragStartCallback(event);\r\n }\r\n }\r\n\r\n private _onDragEnd(event: Event): void {\r\n this._dragDropService.allowedDropZones = [];\r\n // console.log('ondragend.allowedDropZones', this._dragDropService.allowedDropZones);\r\n this._onDragEndCallback(event);\r\n }\r\n\r\n //**** Drop Callbacks ****//\r\n _onDragEnterCallback(event: Event) { }\r\n _onDragOverCallback(event: Event) { }\r\n _onDragLeaveCallback(event: Event) { }\r\n _onDropCallback(event: Event) { }\r\n\r\n //**** Drag Callbacks ****//\r\n _onDragStartCallback(event: Event) { }\r\n _onDragEndCallback(event: Event) { }\r\n}\r\n\r\nexport class AbstractHandleComponent {\r\n _elem: HTMLElement;\r\n constructor(elemRef: ElementRef, public _dragDropService: DragDropService, public _config: DragDropConfig,\r\n private _Component: AbstractComponent, private _cdr: ChangeDetectorRef) {\r\n this._elem = elemRef.nativeElement;\r\n this._Component.setDragHandle(this._elem);\r\n }\r\n}\r\n","// Copyright (C) 2016-2020 Sergey Akopkokhyants\r\n// This project is licensed under the terms of the MIT license.\r\n// https://github.com/akserg/ng2-dnd\r\n\r\nimport { ChangeDetectorRef } from '@angular/core';\r\nimport { Directive, Input, Output, EventEmitter, ElementRef } from '@angular/core';\r\n\r\nimport { AbstractComponent, AbstractHandleComponent } from './abstract.component';\r\nimport { DragDropConfig, DragImage } from './dnd.config';\r\nimport { DragDropService, DragDropData } from './dnd.service';\r\n\r\n@Directive({ selector: '[dnd-draggable]' })\r\nexport class DraggableComponent extends AbstractComponent {\r\n\r\n @Input(\"dragEnabled\") set draggable(value:boolean) {\r\n this.dragEnabled = !!value;\r\n }\r\n\r\n /**\r\n * Callback function called when the drag actions happened.\r\n */\r\n @Output() onDragStart: EventEmitter<DragDropData> = new EventEmitter<DragDropData>();\r\n @Output() onDragEnd: EventEmitter<DragDropData> = new EventEmitter<DragDropData>();\r\n\r\n /**\r\n * The data that has to be dragged. It can be any JS object\r\n */\r\n @Input() dragData: any;\r\n\r\n /**\r\n * Callback function called when the drag action ends with a valid drop action.\r\n * It is activated after the on-drop-success callback\r\n */\r\n @Output(\"onDragSuccess\") onDragSuccessCallback: EventEmitter<any> = new EventEmitter<any>();\r\n\r\n @Input(\"dropZones\") set dropzones(value:Array<string>) {\r\n this.dropZones = value;\r\n }\r\n\r\n /**\r\n * Drag allowed effect\r\n */\r\n @Input(\"effectAllowed\") set effectallowed(value: DataTransfer['effectAllowed']) {\r\n this.effectAllowed = value;\r\n }\r\n\r\n /**\r\n * Drag effect cursor\r\n */\r\n @Input(\"effectCursor\") set effectcursor(value: string) {\r\n this.effectCursor = value;\r\n }\r\n\r\n /**\r\n * Here is the property dragImage you can use:\r\n * - The string value as url to the image\r\n * <div class=\"panel panel-default\"\r\n * dnd-draggable [dragEnabled]=\"true\"\r\n * [dragImage]=\"/images/simpler.png\">\r\n * ...\r\n * - The DragImage value with Image and offset by x and y:\r\n * let myDragImage: DragImage = new DragImage(\"/images/simpler1.png\", 0, 0);\r\n * ...\r\n * <div class=\"panel panel-default\"\r\n * dnd-draggable [dragEnabled]=\"true\"\r\n * [dragImage]=\"myDragImage\">\r\n * ...\r\n * - The custom function to return the value of dragImage programmatically:\r\n * <div class=\"panel panel-default\"\r\n * dnd-draggable [dragEnabled]=\"true\"\r\n * [dragImage]=\"getDragImage(someData)\">\r\n * ...\r\n * getDragImage(value:any): string {\r\n * return value ? \"/images/simpler1.png\" : \"/images/simpler2.png\"\r\n * }\r\n */\r\n @Input() dragImage: string | DragImage | Function;\r\n\r\n\r\n @Input() cloneItem: boolean;\r\n\r\n constructor(elemRef: ElementRef, dragDropService: DragDropService, config:DragDropConfig,\r\n cdr:ChangeDetectorRef) {\r\n\r\n super(elemRef, dragDropService, config, cdr);\r\n this._defaultCursor = this._elem.style.cursor;\r\n this.dragEnabled = true;\r\n }\r\n\r\n _onDragStartCallback(event: MouseEvent) {\r\n this._dragDropService.isDragged = true;\r\n this._dragDropService.dragData = this.dragData;\r\n this._dragDropService.onDragSuccessCallback = this.onDragSuccessCallback;\r\n this._elem.classList.add(this._config.onDragStartClass);\r\n //\r\n this.onDragStart.emit({dragData: this.dragData, mouseEvent: event});\r\n }\r\n\r\n _onDragEndCallback(event: MouseEvent) {\r\n this._dragDropService.isDragged = false;\r\n this._dragDropService.dragData = null;\r\n this._dragDropService.onDragSuccessCallback = null;\r\n this._elem.classList.remove(this._config.onDragStartClass);\r\n //\r\n this.onDragEnd.emit({dragData: this.dragData, mouseEvent: event});\r\n }\r\n}\r\n\r\n\r\n@Directive({ selector: '[dnd-draggable-handle]' })\r\nexport class DraggableHandleComponent extends AbstractHandleComponent {\r\n constructor(elemRef: ElementRef, dragDropService: DragDropService, config:DragDropConfig, _Component: DraggableComponent,\r\n cdr:ChangeDetectorRef) {\r\n\r\n super(elemRef, dragDropService, config, _Component, cdr);\r\n }\r\n}\r\n","// Copyright (C) 2016-2020 Sergey Akopkokhyants\r\n// This project is licensed under the terms of the MIT license.\r\n// https://github.com/akserg/ng2-dnd\r\n\r\nimport { ChangeDetectorRef } from '@angular/core';\r\nimport { Directive, Input, Output, EventEmitter, ElementRef } from '@angular/core';\r\n\r\nimport { AbstractComponent } from './abstract.component';\r\nimport { DragDropConfig } from './dnd.config';\r\nimport { DragDropService, DragDropData } from './dnd.service';\r\n\r\n@Directive({ selector: '[dnd-droppable]' })\r\nexport class DroppableComponent extends AbstractComponent {\r\n\r\n @Input(\"dropEnabled\") set droppable(value:boolean) {\r\n this.dropEnabled = !!value;\r\n }\r\n\r\n /**\r\n * Callback function called when the drop action completes correctly.\r\n * It is activated before the on-drag-success callback.\r\n */\r\n @Output() onDropSuccess: EventEmitter<DragDropData> = new EventEmitter<DragDropData>();\r\n @Output() onDragEnter: EventEmitter<DragDropData> = new EventEmitter<DragDropData>();\r\n @Output() onDragOver: EventEmitter<DragDropData> = new EventEmitter<DragDropData>();\r\n @Output() onDragLeave: EventEmitter<DragDropData> = new EventEmitter<DragDropData>();\r\n\r\n @Input(\"allowDrop\") set allowdrop(value: (dropData: any) => boolean) {\r\n this.allowDrop = value;\r\n }\r\n\r\n @Input(\"dropZones\") set dropzones(value:Array<string>) {\r\n this.dropZones = value;\r\n }\r\n\r\n /**\r\n * Drag allowed effect\r\n */\r\n @Input(\"effectAllowed\") set effectallowed(value: DataTransfer['effectAllowed']) {\r\n this.effectAllowed = value;\r\n }\r\n\r\n /**\r\n * Drag effect cursor\r\n */\r\n @Input(\"effectCursor\") set effectcursor(value: string) {\r\n this.effectCursor = value;\r\n }\r\n\r\n constructor(elemRef: ElementRef, dragDropService: DragDropService, config:DragDropConfig,\r\n cdr:ChangeDetectorRef) {\r\n\r\n super(elemRef, dragDropService, config, cdr);\r\n\r\n this.dropEnabled = true;\r\n }\r\n\r\n _onDragEnterCallback(event: MouseEvent) {\r\n if (this._dragDropService.isDragged) {\r\n this._elem.classList.add(this._config.onDragEnterClass);\r\n this.onDragEnter.emit({dragData: this._dragDropService.dragData, mouseEvent: event});\r\n }\r\n }\r\n\r\n _onDragOverCallback (event: MouseEvent) {\r\n if (this._dragDropService.isDragged) {\r\n this._elem.classList.add(this._config.onDragOverClass);\r\n this.onDragOver.emit({dragData: this._dragDropService.dragData, mouseEvent: event});\r\n }\r\n };\r\n\r\n _onDragLeaveCallback (event: MouseEvent) {\r\n if (this._dragDropService.isDragged) {\r\n this._elem.classList.remove(this._config.onDragOverClass);\r\n this._elem.classList.remove(this._config.onDragEnterClass);\r\n this.onDragLeave.emit({dragData: this._dragDropService.dragData, mouseEvent: event});\r\n }\r\n };\r\n\r\n _onDropCallback (event: MouseEvent) {\r\n let dataTransfer = (event as any).dataTransfer;\r\n if (this._dragDropService.isDragged || (dataTransfer && dataTransfer.files)) {\r\n this.onDropSuccess.emit({dragData: this._dragDropService.dragData, mouseEvent: event});\r\n if (this._dragDropService.onDragSuccessCallback) {\r\n this._dragDropService.onDragSuccessCallback.emit({dragData: this._dragDropService.dragData, mouseEvent: event});\r\n }\r\n this._elem.classList.remove(this._config.onDragOverClass);\r\n this._elem.classList.remove(this._config.onDragEnterClass);\r\n }\r\n }\r\n}\r\n","// Copyright (C) 2016-2020 Sergey Akopkokhyants\r\n// This project is licensed under the terms of the MIT license.\r\n// https://github.com/akserg/ng2-dnd\r\n\r\nimport { ChangeDetectorRef } from '@angular/core';\r\nimport { Directive, Input, Output, EventEmitter, ElementRef } from '@angular/core';\r\nimport { FormArray} from '@angular/forms';\r\n\r\nimport { AbstractComponent, AbstractHandleComponent } from './abstract.component';\r\nimport { DragDropConfig } from './dnd.config';\r\nimport { DragDropService, DragDropSortableService } from './dnd.service';\r\n\r\n@Directive({ selector: '[dnd-sortable-container]' })\r\nexport class SortableContainer extends AbstractComponent {\r\n\r\n @Input(\"dragEnabled\") set draggable(value:boolean) {\r\n this.dragEnabled = !!value;\r\n }\r\n\r\n private _sortableData: Array<any>|FormArray = [];\r\n private sortableHandler: SortableFormArrayHandler|SortableArrayHandler;\r\n\r\n @Input() set sortableData(sortableData: Array<any>|FormArray) {\r\n this._sortableData = sortableData;\r\n if (sortableData instanceof FormArray) {\r\n this.sortableHandler = new SortableFormArrayHandler();\r\n } else {\r\n this.sortableHandler = new SortableArrayHandler();\r\n }\r\n //\r\n this.dropEnabled = !!this._sortableData;\r\n // console.log(\"collection is changed, drop enabled: \" + this.dropEnabled);\r\n }\r\n get sortableData(): Array<any>|FormArray {\r\n return this._sortableData;\r\n }\r\n\r\n @Input(\"dropZones\") set dropzones(value:Array<string>) {\r\n this.dropZones = value;\r\n }\r\n\r\n constructor(elemRef: ElementRef, dragDropService: DragDropService, config:DragDropConfig, cdr:ChangeDetectorRef,\r\n private _sortableDataService: DragDropSortableService) {\r\n\r\n super(elemRef, dragDropService, config, cdr);\r\n this.dragEnabled = false;\r\n }\r\n\r\n _onDragEnterCallback(event: Event) {\r\n if (this._sortableDataService.isDragged) {\r\n let item:any = this._sortableDataService.sortableContainer.getItemAt(this._sortableDataService.index);\r\n // Check does element exist in sortableData of this Container\r\n if (this.indexOf(item) === -1) {\r\n // Let's add it\r\n // console.log('Container._onDragEnterCallback. drag node [' + this._sortableDataService.index.toString() + '] over parent node');\r\n // Remove item from previouse list\r\n this._sortableDataService.sortableContainer.removeItemAt(this._sortableDataService.index);\r\n if (this._sortableDataService.sortableContainer._sortableData.length === 0) {\r\n this._sortableDataService.sortableContainer.dropEnabled = true;\r\n }\r\n // Add item to new list\r\n this.insertItemAt(item, 0);\r\n this._sortableDataService.sortableContainer = this;\r\n this._sortableDataService.index = 0;\r\n }\r\n // Refresh changes in properties of container component\r\n this.detectChanges();\r\n }\r\n }\r\n\r\n getItemAt(index: number): any {\r\n return this.sortableHandler.getItemAt(this._sortableData, index);\r\n }\r\n\r\n indexOf(item: any): number {\r\n return this.sortableHandler.indexOf(this._sortableData, item);\r\n }\r\n\r\n removeItemAt(index: number): void {\r\n this.sortableHandler.removeItemAt(this._sortableData, index);\r\n }\r\n\r\n insertItemAt(item: any, index: number) {\r\n this.sortableHandler.insertItemAt(this._sortableData, item, index);\r\n }\r\n}\r\n\r\nclass SortableArrayHandler {\r\n getItemAt(sortableData: any, index: number): any {\r\n return sortableData[index];\r\n }\r\n\r\n indexOf(sortableData: any, item: any): number {\r\n return sortableData.indexOf(item);\r\n }\r\n\r\n removeItemAt(sortableData: any, index: number) {\r\n sortableData.splice(index, 1);\r\n }\r\n\r\n insertItemAt(sortableData: any, item: any, index: number) {\r\n sortableData.splice(index, 0, item);\r\n }\r\n}\r\n\r\nclass SortableFormArrayHandler {\r\n getItemAt(sortableData: any, index: number): any {\r\n return sortableData.at(index);\r\n }\r\n\r\n indexOf(sortableData: any, item: any): number {\r\n return sortableData.controls.indexOf(item);\r\n }\r\n\r\n removeItemAt(sortableData: any, index: number) {\r\n sortableData.removeAt(index);\r\n }\r\n\r\n insertItemAt(sortableData: any, item: any, index: number) {\r\n sortableData.insert(index, item);\r\n }\r\n}\r\n\r\n@Directive({ selector: '[dnd-sortable]' })\r\nexport class SortableComponent extends AbstractComponent {\r\n\r\n @Input('sortableIndex') index: number;\r\n\r\n @Input(\"dragEnabled\") set draggable(value:boolean) {\r\n this.dragEnabled = !!value;\r\n }\r\n\r\n @Input(\"dropEnabled\") set droppable(value:boolean) {\r\n this.dropEnabled = !!value;\r\n }\r\n\r\n /**\r\n * The data that has to be dragged. It can be any JS object\r\n */\r\n @Input() dragData: any;\r\n\r\n /**\r\n * Drag allowed effect\r\n */\r\n @Input(\"effectAllowed\") set effectallowed(value: DataTransfer['effectAllowed']) {\r\n this.effectAllowed = value;\r\n }\r\n\r\n /**\r\n * Drag effect cursor\r\n */\r\n @Input(\"effectCursor\") set effectcursor(value: string) {\r\n this.effectCursor = value;\r\n }\r\n\r\n /**\r\n * Callback function called when the drag action ends with a valid drop action.\r\n * It is activated after the on-drop-success callback\r\n */\r\n @Output(\"onDragSuccess\") onDragSuccessCallback: EventEmitter<any> = new EventEmitter<any>();\r\n\r\n @Output(\"onDragStart\") onDragStartCallback: EventEmitter<any> = new EventEmitter<any>();\r\n @Output(\"onDragOver\") onDragOverCallback: EventEmitter<any> = new EventEmitter<any>();\r\n @Output(\"onDragEnd\") onDragEndCallback: EventEmitter<any> = new EventEmitter<any>();\r\n @Output(\"onDropSuccess\") onDropSuccessCallback: EventEmitter<any> = new EventEmitter<any>();\r\n\r\n constructor(elemRef: ElementRef, dragDropService: DragDropService, config:DragDropConfig,\r\n private _sortableContainer: SortableContainer,\r\n private _sortableDataService: DragDropSortableService,\r\n cdr:ChangeDetectorRef) {\r\n super(elemRef, dragDropService, config, cdr);\r\n this.dropZones = this._sortableContainer.dropZones;\r\n this.dragEnabled = true;\r\n this.dropEnabled = true;\r\n }\r\n\r\n _onDragStartCallback(event: Event) {\r\n // console.log('_onDragStartCallback. dragging elem with index ' + this.index);\r\n this._sortableDataService.isDragged = true;\r\n this._sortableDataService.sortableContainer = this._sortableContainer;\r\n this._sortableDataService.index = this.index;\r\n this._sortableDataService.markSortable(this._elem);\r\n // Add dragData\r\n this._dragDropService.isDragged = true;\r\n this._dragDropService.dragData = this.dragData;\r\n this._dragDropService.onDragSuccessCallback = this.onDragSuccessCallback;\r\n //\r\n this.onDragStartCallback.emit(this._dragDropService.dragData);\r\n }\r\n\r\n _onDragOverCallback(event: Event) {\r\n if (this._sortableDataService.isDragged && this._elem !== this._sortableDataService.elem) {\r\n // console.log('_onDragOverCallback. dragging elem with index ' + this.index);\r\n this._sortableDataService.sortableContainer = this._sortableContainer;\r\n this._sortableDataService.index = this.index;\r\n this._sortableDataService.markSortable(this._elem);\r\n this.onDragOverCallback.emit(this._dragDropService.dragData);\r\n }\r\n }\r\n\r\n _onDragEndCallback(event: Event) {\r\n // console.log('_onDragEndCallback. end dragging elem with index ' + this.index);\r\n this._sortableDataService.isDragged = false;\r\n this._sortableDataService.sortableContainer = null;\r\n this._sortableDataService.index = null;\r\n this._sortableDataService.markSortable(null);\r\n // Add dragGata\r\n this._dragDropService.isDragged = false;\r\n this._dragDropService.dragData = null;\r\n this._dragDropService.onDragSuccessCallback = null;\r\n //\r\n this.onDragEndCallback.emit(this._dragDropService.dragData);\r\n }\r\n\r\n _onDragEnterCallback(event: Event) {\r\n if (this._sortableDataService.isDragged) {\r\n this._sortableDataService.markSortable(this._elem);\r\n if ((this.index !== this._sortableDataService.index) ||\r\n (this._sortableDataService.sortableContainer.sortableData !== this._sortableContainer.sortableData)) {\r\n // console.log('Component._onDragEnterCallback. drag node [' + this.index + '] over node [' + this._sortableDataService.index + ']');\r\n // Get item\r\n let item:any = this._sortableDataService.sortableContainer.getItemAt(this._sortableDataService.index);\r\n // Remove item from previouse list\r\n this._sortableDataService.sortableContainer.removeItemAt(this._sortableDataService.index);\r\n if (this._sortableDataService.sortableContainer.sortableData.length === 0) {\r\n this._sortableDataService.sortableContainer.dropEnabled = true;\r\n }\r\n // Add item to new list\r\n this._sortableContainer.insertItemAt(item, this.index);\r\n if (this._sortableContainer.dropEnabled) {\r\n this._sortableContainer.dropEnabled = false;\r\n }\r\n this._sortableDataService.sortableContainer = this._sortableContainer;\r\n this._sortableDataService.index = this.index;\r\n this.detectChanges();\r\n }\r\n }\r\n }\r\n\r\n _onDropCallback (event: Event) {\r\n if (this._sortableDataService.isDragged) {\r\n // console.log('onDropCallback.onDropSuccessCallback.dragData', this._dragDropService.dragData);\r\n this.onDropSuccessCallback.emit(this._dragDropService.dragData);\r\n if (this._dragDropService.onDragSuccessCallback) {\r\n // console.log('onDropCallback.onDragSuccessCallback.dragData', this._dragDropService.dragData);\r\n this._dragDropService.onDragSuccessCallback.emit(this._dragDropService.dragData);\r\n }\r\n // Refresh changes in properties of container component\r\n this._sortableContainer.detectChanges();\r\n }\r\n }\r\n}\r\n\r\n@Directive({ selector: '[dnd-sortable-handle]' })\r\nexport class SortableHandleComponent extends AbstractHandleComponent {\r\n constructor(elemRef: ElementRef, dragDropService: DragDropService, config:DragDropConfig, _Component: SortableComponent,\r\n cdr:ChangeDetectorRef) {\r\n\r\n super(elemRef, dragDropService, config, _Component, cdr);\r\n }\r\n}\r\n","// Copyright (C) 2016-2020 Sergey Akopkokhyants\r\n// This project is licensed under the terms of the MIT license.\r\n// https://github.com/akserg/ng2-dnd\r\n\r\nimport { NgModule, ModuleWithProviders } from \"@angular/core\";\r\n\r\nimport { DragDropConfig } from './dnd.config';\r\nimport { DragDropService, DragDropSortableService, dragDropServiceFactory, dragDropSortableServiceFactory } from './dnd.service';\r\nimport { DraggableComponent, DraggableHandleComponent } from './draggable.component';\r\nimport { DroppableComponent } from './droppable.component';\r\nimport { SortableContainer, SortableComponent, SortableHandleComponent } from './sortable.component';\r\n\r\nexport * from './abstract.component';\r\nexport * from './dnd.config';\r\nexport * from './dnd.service';\r\nexport * from './draggable.component';\r\nexport * from './droppable.component';\r\nexport * from './sortable.component';\r\n\r\nexport let providers = [\r\n DragDropConfig,\r\n { provide: DragDropService, useFactory: dragDropServiceFactory },\r\n { provide: DragDropSortableService, useFactory: dragDropSortableServiceFactory, deps: [DragDropConfig] }\r\n];\r\n\r\n@NgModule({\r\n declarations: [\r\n DraggableComponent,\r\n DraggableHandleComponent,\r\n DroppableComponent,\r\n SortableContainer,\r\n SortableComponent,\r\n SortableHandleComponent,\r\n ],\r\n exports : [\r\n DraggableComponent,\r\n DraggableHandleComponent,\r\n DroppableComponent,\r\n SortableContainer,\r\n SortableComponent,\r\n SortableHandleComponent\r\n ],\r\n})\r\nexport class DndModule {\r\n static forRoot(): ModuleWithProviders<DndModule> {\r\n return {\r\n ngModule: DndModule,\r\n providers: providers,\r\n };\r\n }\r\n}\r\n","// Copyright (C) 2016-2020 Sergey Akopkokhyants\r\n// This project is licensed under the terms of the MIT license.\r\n// https://github.com/akserg/ng2-dnd\r\n\r\nexport * from './src/dnd.module';","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":["i1.DragDropConfig","i1.DragDropService","i2.DragDropConfig","i1.DragDropSortableService"],"mappings":"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