UNPKG

ng-devui

Version:

DevUI components based on Angular

746 lines 119 kB
import { DOCUMENT } from '@angular/common'; import { Directive, ElementRef, EventEmitter, HostListener, Inject, Input, NgZone, Output, Renderer2 } from '@angular/core'; import { fromEvent, Subject, Subscription } from 'rxjs'; import { distinctUntilChanged, filter } from 'rxjs/operators'; import { DragDropService } from '../services/drag-drop.service'; import { DropEvent } from '../shared/drop-event.model'; import { Utils } from '../shared/utils'; import * as i0 from "@angular/core"; import * as i1 from "../services/drag-drop.service"; export class DroppableDirective { constructor(el, renderer, dragDropService, ngZone, doc) { this.el = el; this.renderer = renderer; this.dragDropService = dragDropService; this.ngZone = ngZone; this.doc = doc; /** * Event fired when Drag dragged element enters a valid drop target. */ this.dragEnterEvent = new EventEmitter(); /** * Event fired when an element is being dragged over a valid drop target */ this.dragOverEvent = new EventEmitter(); /** * Event fired when a dragged element leaves a valid drop target. */ this.dragLeaveEvent = new EventEmitter(); /** * Event fired when an element is dropped on a valid drop target. */ this.dropEvent = new EventEmitter(); // 注意使用了虚拟滚动后,DropEvent中的dragFromIndex无效 /** * Defines compatible drag drop pairs. Values must match both in draggable and droppable.dropScope. */ this.dropScope = 'default'; this.placeholderTag = 'div'; this.placeholderStyle = { backgroundColor: ['#859bff', `var(--devui-brand-foil, #859bff)`], opacity: '.4' }; /** * 设置placeholder的提示性文字,仅支持文本(安全起见) */ this.placeholderText = ''; /** * 用于允许拖动到元素上,方便树形结构的拖动可以成为元素的子节点 */ this.allowDropOnItem = false; /** * 是否启用越过立即交换位置的算法, 不能与allowDropOnItem一起用,allowDropOnItem为true时,此规则无效 * */ this.switchWhileCrossEdge = false; /** * sortable的情况下,拖动到可以drop但不在sortContainer里的时候默认drop的位置 * */ this.defaultDropPosition = 'closest'; // 用于修复dragleave多次触发 this.dragCount = 0; this.dropIndex = undefined; /* 协同拖拽需要 */ this.placeholderInsertionEvent = new Subject(); this.placeholderRenderEvent = new Subject(); this.dropSortCountSelectorFilterFn = (value) => { return Utils.matches(value, this.dropSortCountSelector) || value.contains(this.placeholder) || value === this.dragDropService.dragOriginPlaceholder; }; this.setPlaceholder = () => { this.ngZone.runOutsideAngular(() => { this.placeholder.style.width = this.dragDropService.dragOffset.width + 'px'; this.placeholder.style.height = this.dragDropService.dragOffset.height + 'px'; // ie下clientHeight为0 Utils.addElStyles(this.placeholder, this.placeholderStyle); this.placeholderRenderEvent.next({ width: this.dragDropService.dragOffset.width, height: this.dragDropService.dragOffset.height }); }); }; this.document = this.doc; } ngOnInit() { this.placeholder = this.document.createElement(this.placeholderTag); this.placeholder.className = 'drag-placeholder'; this.placeholder.innerText = this.placeholderText; this.dragStartSubscription = this.dragDropService.dragStartEvent.subscribe(() => this.setPlaceholder()); if (this.dragDropService.draggedEl) { this.setPlaceholder(); // 虚拟滚动生成元素过程中 } this.dropEndSubscription = this.dragDropService.dropEvent.subscribe(() => { if (this.dragDropService.draggedEl) { if (!this.dragDropService.dragFollow) { this.renderer.setStyle(this.dragDropService.draggedEl, 'display', ''); this.dragDropService.dragElShowHideEvent.next(true); } } this.removePlaceholder(); this.overElement = undefined; this.allowDropCache = undefined; this.dragElIndex = undefined; this.dropIndex = undefined; }); this.dragEndSubscription = this.dragDropService.dragEndEvent.subscribe(() => { if (this.dragDropService.draggedEl) { if (!this.dragDropService.dragFollow) { this.renderer.setStyle(this.dragDropService.draggedEl, 'display', ''); this.dragDropService.dragElShowHideEvent.next(true); } } this.removePlaceholder(); this.dragCount = 0; this.overElement = undefined; this.allowDropCache = undefined; this.dragElIndex = undefined; this.dropIndex = undefined; }); this.ngZone.runOutsideAngular(() => { this.dragPartEventSub = new Subscription(); this.dragPartEventSub.add(fromEvent(this.el.nativeElement, 'dragover') .pipe(filter(event => this.allowDrop(event)), distinctUntilChanged((prev, current) => { const bool = (prev.clientX === current.clientX && prev.clientY === current.clientY && prev.target === current.target); if (bool) { current.preventDefault(); current.stopPropagation(); } return bool; })) .subscribe((event) => this.dragOver(event))); this.dragPartEventSub.add(fromEvent(this.el.nativeElement, 'dragenter').subscribe((event) => this.dragEnter(event))); this.dragPartEventSub.add(fromEvent(this.el.nativeElement, 'dragleave').subscribe((event) => this.dragLeave(event))); }); } ngAfterViewInit() { if (this.el.nativeElement.hasAttribute('d-sortable')) { this.sortContainer = this.el.nativeElement; } else { this.sortContainer = this.el.nativeElement.querySelector('[d-sortable]'); } this.sortDirection = this.sortContainer ? this.sortContainer.getAttribute('dsortable') || 'v' : 'v'; this.sortDirectionZMode = this.sortContainer ? (this.sortContainer.getAttribute('d-sortable-zmode') === 'true' || false) : false; } ngOnDestroy() { this.dragStartSubscription.unsubscribe(); this.dragEndSubscription.unsubscribe(); this.dropEndSubscription.unsubscribe(); if (this.dragPartEventSub) { this.dragPartEventSub.unsubscribe(); } } dragEnter(e) { this.dragCount++; e.preventDefault(); // ie11 dragenter需要preventDefault否则dragover无效 this.dragEnterEvent.emit(e); } dragOver(e) { if (this.allowDrop(e)) { if (this.dragDropService.dropTargets.indexOf(this.el) === -1) { this.dragDropService.dropTargets.forEach(el => { const placeHolderEl = el.nativeElement.querySelector('.drag-placeholder'); if (placeHolderEl) { placeHolderEl.parentElement.removeChild(placeHolderEl); } Utils.removeClass(el, this.dragOverClass); this.removeDragoverItemClass(el.nativeElement); }); this.dragDropService.dropTargets = [this.el]; this.overElement = undefined; // 否则会遇到上一次position= 这一次的然后不刷新和插入。 } Utils.addClass(this.el, this.dragOverClass); const hitPlaceholder = this.dragDropService.dragOriginPlaceholder && this.dragDropService.dragOriginPlaceholder.contains(e.target); if (this.sortContainer && ((hitPlaceholder && this.overElement === undefined) || !(e.target.contains(this.placeholder) || hitPlaceholder) || (this.switchWhileCrossEdge && !this.placeholder.contains(e.target) && !hitPlaceholder) // 越边交换回折的情况需要重新计算 || (!this.sortContainer.contains(e.target) && this.defaultDropPosition === 'closest') // 就近模式需要重新计算 )) { const overElement = this.findSortableEl(e); if (!(this.overElement && overElement) || this.overElement.index !== overElement.index || (this.allowDropOnItem && this.overElement.position !== overElement.position && (this.overElement.position === 'inside' || overElement.position === 'inside'))) { // overElement的参数有刷新的时候才进行插入等操作 this.overElement = overElement; this.insertPlaceholder(overElement); this.removeDragoverItemClass(this.sortContainer, overElement); if (overElement.position === 'inside' && this.dragOverItemClass) { Utils.addClass(overElement.el, this.dragOverItemClass); } } else { this.overElement = overElement; } } else { if (this.sortContainer && this.overElement && this.overElement.el) { if (!this.overElement.el.contains(e.target)) { this.overElement.realEl = e.target; } else { this.overElement.realEl = undefined; } } } if (this.dragDropService.draggedEl) { if (!this.dragDropService.dragFollow) { this.renderer.setStyle(this.dragDropService.draggedEl, 'display', 'none'); this.dragDropService.dragElShowHideEvent.next(false); if (this.dragDropService.dragOriginPlaceholder) { this.renderer.setStyle(this.dragDropService.dragOriginPlaceholder, 'display', 'block'); } } } e.preventDefault(); e.stopPropagation(); this.dragOverEvent.emit(e); } } dragLeave(e) { // 用于修复包含子元素时,多次触发dragleave this.dragCount--; if (this.dragCount === 0) { if (this.dragDropService.dropTargets.indexOf(this.el) !== -1) { this.dragDropService.dropTargets = []; } Utils.removeClass(this.el, this.dragOverClass); this.removePlaceholder(); this.removeDragoverItemClass(this.el.nativeElement); this.overElement = undefined; this.dragElIndex = undefined; this.dropIndex = undefined; } e.preventDefault(); this.dragLeaveEvent.emit(e); } drop(e) { if (!this.allowDrop(e)) { return; } this.dragCount = 0; Utils.removeClass(this.el, this.dragOverClass); this.removeDragoverItemClass(this.sortContainer); this.removePlaceholder(); e.preventDefault(); e.stopPropagation(); this.dragDropService.dropOnOrigin = this.isDragPlaceholderPosition(this.dropIndex); const draggedElIdentity = this.dragDropService.draggedElIdentity; this.dragDropService.draggedElIdentity = undefined; // 需要提前清除,避免新生成的节点复用了id 刷新了dragOriginPlaceholder let batchDraggble = []; if (this.dragDropService.batchDragData && this.dragDropService.batchDragData.length > 1) { batchDraggble = this.dragDropService.batchDragData.map(dragData => dragData.draggable) .filter(draggable => draggable && draggable.el.nativeElement !== this.dragDropService.draggedEl); } this.dropEvent.emit(new DropEvent(e, this.dragDropService.dragData, this.dragDropService.dropEvent, this.dropSortVirtualScrollOption ? this.getRealIndex(this.dropIndex, this.dropFlag) : this.dropIndex, this.sortContainer ? this.checkSelfFromIndex(this.dragDropService.draggedEl) : -1, this.dragDropService.dropOnItem, this.dragDropService.dropOnOrigin, (this.dragDropService.batchDragging) ? this.dragDropService.getBatchDragData(draggedElIdentity) : undefined)); // 如果drop之后drag元素被删除,则不会发生dragend事件,需要代替dragend清理 if (this.dragDropService.dragFollow) { this.dragDropService.disableDraggedCloneNodeFollowMouse(); } else { this.renderer.setStyle(this.dragDropService.draggedEl, 'display', ''); this.dragDropService.dragElShowHideEvent.next(false); } if (batchDraggble.length > 0 && this.dragDropService.batchDragging) { batchDraggble.forEach((draggable) => { if (!draggable.originPlaceholder || draggable.originPlaceholder.show === false) { draggable.el.nativeElement.style.display = ''; } else if (draggable.originPlaceholder.removeDelay > 0 && !this.dragDropService.dropOnOrigin) { draggable.delayRemoveOriginPlaceholder(false); } else { draggable.el.nativeElement.style.display = ''; draggable.removeOriginPlaceholder(false); } }); } this.dragDropService.dropEvent.next(e); this.dragDropService.dragData = undefined; this.dragDropService.scope = undefined; this.dragDropService.draggedEl = undefined; this.dragDropService.dragFollow = undefined; this.dragDropService.dragFollowOptions = undefined; this.dragDropService.dragOffset = undefined; this.dragDropService.dropOnOrigin = undefined; this.dragDropService.batchDragging = false; this.dragDropService.batchDragStyle = undefined; this.dragDropService.dragPreviewDirective = undefined; } allowDrop(e) { if (!e) { return false; } if (this.allowDropCache !== undefined) { return this.allowDropCache; } let allowed = false; if (typeof this.dropScope === 'string') { if (typeof this.dragDropService.scope === 'string') { allowed = this.dragDropService.scope === this.dropScope; } if (this.dragDropService.scope instanceof Array) { allowed = this.dragDropService.scope.indexOf(this.dropScope) > -1; } } if (this.dropScope instanceof Array) { if (typeof this.dragDropService.scope === 'string') { allowed = this.dropScope.indexOf(this.dragDropService.scope) > -1; } if (this.dragDropService.scope instanceof Array) { allowed = this.dropScope.filter((item) => { return this.dragDropService.scope.indexOf(item) !== -1; }).length > 0; } } this.allowDropCache = allowed; return allowed; } // 查询需要插入placeholder的位置 /* eslint-disable-next-line complexity*/ findSortableEl(event) { const moveElement = event.target; let overElement = null; if (!this.sortContainer) { return overElement; } overElement = { index: 0, el: null, position: 'before' }; this.dropIndex = 0; this.dropFlag = undefined; let childEls = Utils.slice(this.sortContainer.children); // 删除虚拟滚动等的额外元素不需要计算的元素 if (this.dropSortCountSelector) { childEls = childEls.filter(this.dropSortCountSelectorFilterFn); } // 如果没有主动删除则删除多余的originplaceholder if (childEls.some(el => el !== this.dragDropService.dragOriginPlaceholder && el.classList.contains('drag-origin-placeholder'))) { childEls = childEls.filter(el => !(el.classList.contains('drag-origin-placeholder') && el !== this.dragDropService.dragOriginPlaceholder)); } // 要先删除clonenode否则placeholderindex是错的 if (this.dragDropService.dragFollow && this.dragDropService.dragCloneNode) { const cloneNodeIndex = childEls.findIndex(value => value === this.dragDropService.dragCloneNode); if (-1 !== cloneNodeIndex) { childEls.splice(cloneNodeIndex, 1); } } // 计算index数组需要删除源占位符 if (this.dragDropService.dragOriginPlaceholder) { const dragOriginPlaceholderIndex = childEls.findIndex(value => value === this.dragDropService.dragOriginPlaceholder); if (-1 !== dragOriginPlaceholderIndex) { this.dragElIndex = dragOriginPlaceholderIndex - 1; childEls.splice(dragOriginPlaceholderIndex, 1); } else { this.dragElIndex = -1; } } else { this.dragElIndex = -1; } // 查询是否已经插入了placeholder const placeholderIndex = childEls.findIndex(value => value.contains(this.placeholder)); // 删除placeholder if (-1 !== placeholderIndex) { childEls.splice(placeholderIndex, 1); } // 如果还有placeholder在前面 dragElIndex得再减一 if (-1 !== placeholderIndex && -1 !== this.dragElIndex && placeholderIndex < this.dragElIndex) { this.dragElIndex--; } const positionIndex = -1 !== placeholderIndex ? placeholderIndex : this.dragElIndex; const currentIndex = childEls.findIndex(value => (value.contains(moveElement) || value.nextElementSibling === moveElement && value.nextElementSibling.classList.contains('drag-origin-placeholder'))); if (this.switchWhileCrossEdge && !this.allowDropOnItem && childEls.length && -1 !== positionIndex && currentIndex > -1) { // 越过元素边界立即交换位置算法 const lastIndex = positionIndex; // 解决抖动 const realEl = this.overElement && (this.overElement.realEl || this.overElement.el); if (-1 !== currentIndex && realEl === childEls[currentIndex]) { this.dropIndex = this.overElement.index; return this.overElement; } overElement = { index: lastIndex > currentIndex ? currentIndex : (currentIndex + 1), el: childEls[currentIndex], position: lastIndex > currentIndex ? 'before' : 'after' }; this.dragDropService.dropOnItem = false; this.dropIndex = overElement.index; return overElement; } if (moveElement === this.sortContainer || moveElement.classList.contains('drag-origin-placeholder') || moveElement === (this.dragDropService && this.dragDropService.dragOriginPlaceholder) || (!this.sortContainer.contains(moveElement) && this.defaultDropPosition === 'closest')) { if (!childEls.length) { this.dropIndex = 0; this.dragDropService.dropOnItem = false; return overElement; } // 落入A元素和B元素的间隙里 let findInGap = false; for (let i = 0; i < childEls.length; i++) { const targetElement = childEls[i]; // 处理非越边的落到side-origin-placeholder if (childEls[i].nextSibling === moveElement && moveElement.classList.contains('drag-origin-placeholder')) { const position = this.calcPosition(event, moveElement); this.dragDropService.dropOnItem = position === 'inside'; overElement = { index: position === 'after' ? (i + 1) : i, el: childEls[i], position: position }; this.dropIndex = overElement.index; return overElement; } const positionOutside = this.calcPositionOutside(event, targetElement); if (positionOutside === 'before') { this.dragDropService.dropOnItem = false; overElement = { index: i, el: childEls[i], position: positionOutside, realEl: moveElement }; this.dropIndex = overElement.index; findInGap = true; break; } else { // for 'notsure' } } if (!findInGap) { this.dragDropService.dropOnItem = false; overElement = { index: childEls.length, el: childEls[childEls.length - 1], position: 'after', realEl: moveElement }; this.dropIndex = childEls.length; } return overElement; } if (!this.sortContainer.contains(moveElement)) { if (this.defaultDropPosition === 'before') { overElement = { index: 0, el: childEls.length ? childEls[0] : null, position: 'before', realEl: moveElement }; this.dropFlag = 'beforeAll'; } else { overElement = { index: childEls.length, el: childEls.length ? childEls[childEls.length - 1] : null, position: 'after', realEl: moveElement }; this.dropFlag = 'afterAll'; } this.dropIndex = overElement.index; return overElement; } let find = false; for (let i = 0; i < childEls.length; i++) { if (childEls[i].contains(moveElement)) { const targetElement = childEls[i]; const position = this.calcPosition(event, targetElement); this.dragDropService.dropOnItem = position === 'inside'; overElement = { index: position === 'after' ? (i + 1) : i, el: childEls[i], position: position }; this.dropIndex = overElement.index; find = true; break; } } if (!find) { if (childEls.length) { overElement = { index: childEls.length, el: childEls[childEls.length - 1], position: 'after' }; } this.dropIndex = childEls.length; this.dragDropService.dropOnItem = false; } return overElement; } calcPosition(event, targetElement) { const rect = targetElement.getBoundingClientRect(); const relY = event.clientY - (rect.y || rect.top); const relX = event.clientX - (rect.x || rect.left); // 处理允许drop到元素自己 if (this.allowDropOnItem) { const dropOnItemEdge = { height: (this.nestingTargetRect && this.nestingTargetRect.height || rect.height), width: (this.nestingTargetRect && this.nestingTargetRect.width || rect.width) }; const threeQuartersOfHeight = dropOnItemEdge.height * 3 / 4; const threeQuartersOfWidth = dropOnItemEdge.width * 3 / 4; const AQuarterOfHeight = Number(dropOnItemEdge.height) / 4; const AQuarterOfWidth = Number(dropOnItemEdge.width) / 4; if (this.sortDirectionZMode) { const slashPosition = (relY / dropOnItemEdge.height + relX / dropOnItemEdge.width); if (slashPosition > 0.3 && slashPosition <= 0.7) { return 'inside'; } else if (slashPosition > 0.7) { const slashPositionNesting = ((relY - rect.height + dropOnItemEdge.height) / dropOnItemEdge.height + (relX - rect.width + dropOnItemEdge.width) / dropOnItemEdge.width); if (slashPositionNesting <= 0.7) { return 'inside'; } } } if ((this.sortDirection === 'v' && relY > AQuarterOfHeight && relY <= threeQuartersOfHeight) || (this.sortDirection !== 'v' && relX > AQuarterOfWidth && relX <= threeQuartersOfWidth)) { // 高度的中间1/4 - 3/4 属于drop到元素自己 return 'inside'; } else if ((this.sortDirection === 'v' && relY > threeQuartersOfHeight && relY <= (rect.height - AQuarterOfHeight)) || (this.sortDirection !== 'v' && relX > threeQuartersOfWidth && relX <= (rect.width - AQuarterOfWidth))) { // 内嵌列表后中间区域都属于inside return 'inside'; } } if (this.sortDirectionZMode) { if ((relY / rect.height + relX / rect.width) < 1) { return 'before'; } return 'after'; } // 其他情况保持原来的属于上半部分或者下半部分 if ((this.sortDirection === 'v' && relY > (rect.height / 2)) || (this.sortDirection !== 'v' && relX > (rect.width / 2))) { return 'after'; } return 'before'; } calcPositionOutside(event, targetElement) { // targetElement 获取 getBoundingClientRect const rect = this.getBoundingRectAndRealPosition(targetElement); const relY = event.clientY - (rect.y || rect.top); const relX = event.clientX - (rect.x || rect.left); if (this.sortDirectionZMode) { if ((this.sortDirection === 'v' && (relY < 0 || (relY < rect.height && relX < 0))) || (this.sortDirection !== 'v' && (relX < 0 || (relX < rect.width && relY < 0)))) { return 'before'; } return 'notsure'; } if ((this.sortDirection === 'v' && relY < (rect.height / 2)) || (this.sortDirection !== 'v' && relX < (rect.width / 2))) { return 'before'; } return 'notsure'; } // 插入placeholder insertPlaceholder(overElement) { const tempScrollTop = this.sortContainer.scrollTop; const tempScrollLeft = this.sortContainer.scrollLeft; let hitPlaceholder = false; let cmd; const getIndex = (arr, el, defaultValue) => { const index = arr.indexOf(el); return index > -1 ? index : defaultValue; }; if (null !== overElement) { const sortContainerChildren = Utils.slice(this.sortContainer.children).filter(el => el !== this.dragDropService.dragCloneNode); if (overElement.el === null) { cmd = { command: 'append' }; this.sortContainer.appendChild(this.placeholder); } else { if (overElement.position === 'inside') { cmd = { command: 'remove' }; this.removePlaceholder(); } else if (this.dragDropService.dragOriginPlaceholder && this.isDragPlaceholderPosition(overElement.index)) { cmd = { command: 'remove' }; this.removePlaceholder(); hitPlaceholder = true; } else if (overElement.position === 'after') { if (overElement.el.nextSibling && overElement.el.nextSibling.classList && overElement.el.nextSibling.classList.contains('drag-origin-placeholder')) { // 针对多源占位符场景 cmd = { command: 'insertBefore', index: getIndex(sortContainerChildren, overElement.el.nextSibling, sortContainerChildren.length) + 1 }; this.sortContainer.insertBefore(this.placeholder, overElement.el.nextSibling.nextSibling); } else { cmd = { command: 'insertBefore', index: getIndex(sortContainerChildren, overElement.el, sortContainerChildren.length) + 1 }; this.sortContainer.insertBefore(this.placeholder, overElement.el.nextSibling); } } else { cmd = { command: 'insertBefore', index: getIndex(sortContainerChildren, overElement.el, sortContainerChildren.length) }; this.sortContainer.insertBefore(this.placeholder, overElement.el); } } } this.placeholderInsertionEvent.next(cmd); this.sortContainer.scrollTop = tempScrollTop; this.sortContainer.scrollLeft = tempScrollLeft; if (this.dragDropService.dragOriginPlaceholder) { if (hitPlaceholder) { this.hitDragOriginPlaceholder(); } else { this.hitDragOriginPlaceholder(false); } } } isDragPlaceholderPosition(index) { if (this.dragElIndex > -1 && (index === this.dragElIndex || index === this.dragElIndex + 1)) { return true; } else { return false; } } hitDragOriginPlaceholder(bool = true) { const placeholder = this.dragDropService.dragOriginPlaceholder; if (bool) { placeholder.classList.add('hit-origin-placeholder'); } else { placeholder.classList.remove('hit-origin-placeholder'); } } removePlaceholder() { if (this.sortContainer && this.sortContainer.contains(this.placeholder)) { this.sortContainer.removeChild(this.placeholder); this.placeholderInsertionEvent.next({ command: 'remove' }); } } removeDragoverItemClass(container, overElement) { if (this.dragOverItemClass) { const dragOverItemClassGroup = container.querySelectorAll('.' + this.dragOverItemClass); if (dragOverItemClassGroup && dragOverItemClassGroup.length > 0) { for (const element of dragOverItemClassGroup) { if (overElement) { if (element !== overElement.el || overElement.position !== 'inside') { Utils.removeClass(element, this.dragOverItemClass); } } else { Utils.removeClass(element, this.dragOverItemClass); } } } } } checkSelfFromIndex(el) { let fromIndex = -1; if (!this.sortContainer.contains(el)) { return fromIndex; } let childs = Utils.slice(this.sortContainer.children); if (this.dropSortCountSelector) { childs = childs.filter(this.dropSortCountSelectorFilterFn); } for (let i = 0; i < childs.length; i++) { if (childs[i].contains(this.dragDropService.draggedEl)) { fromIndex = i; break; } } return this.getRealIndex(fromIndex); } getRealIndex(index, flag) { let realIndex; const startIndex = this.dropSortVirtualScrollOption && this.dropSortVirtualScrollOption.startIndex || 0; const totalLength = this.dropSortVirtualScrollOption && this.dropSortVirtualScrollOption.totalLength; if (flag === 'beforeAll') { realIndex = 0; } else if (flag === 'afterAll') { realIndex = totalLength || index; } else { realIndex = startIndex + index; } return realIndex; } getBoundingRectAndRealPosition(targetElement) { // 用于修复部分display none的元素获取到的top和left是0, 取它下一个元素的左上角为坐标 let rect = targetElement.getBoundingClientRect(); const { bottom, right, width, height } = rect; if (rect.width === 0 && rect.height === 0 && (targetElement.style.display === 'none' || getComputedStyle(targetElement).display === 'none')) { if (targetElement.nextElementSibling) { const { top: realTop, left: realLeft } = targetElement.nextElementSibling.getBoundingClientRect(); rect = { x: realLeft, y: realTop, top: realTop, left: realLeft, bottom, right, width, height }; } } return rect; } getSortContainer() { return this.sortContainer; } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DroppableDirective, deps: [{ token: i0.ElementRef }, { token: i0.Renderer2 }, { token: i1.DragDropService }, { token: i0.NgZone }, { token: DOCUMENT }], target: i0.ɵɵFactoryTarget.Directive }); } static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.13", type: DroppableDirective, selector: "[dDroppable]", inputs: { dragOverClass: "dragOverClass", dropScope: "dropScope", placeholderTag: "placeholderTag", placeholderStyle: "placeholderStyle", placeholderText: "placeholderText", allowDropOnItem: "allowDropOnItem", dragOverItemClass: "dragOverItemClass", nestingTargetRect: "nestingTargetRect", switchWhileCrossEdge: "switchWhileCrossEdge", defaultDropPosition: "defaultDropPosition", dropSortCountSelector: "dropSortCountSelector", dropSortVirtualScrollOption: "dropSortVirtualScrollOption" }, outputs: { dragEnterEvent: "dragEnterEvent", dragOverEvent: "dragOverEvent", dragLeaveEvent: "dragLeaveEvent", dropEvent: "dropEvent" }, host: { listeners: { "drop": "drop($event)" } }, ngImport: i0 }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DroppableDirective, decorators: [{ type: Directive, args: [{ selector: '[dDroppable]' }] }], ctorParameters: () => [{ type: i0.ElementRef }, { type: i0.Renderer2 }, { type: i1.DragDropService }, { type: i0.NgZone }, { type: undefined, decorators: [{ type: Inject, args: [DOCUMENT] }] }], propDecorators: { dragEnterEvent: [{ type: Output }], dragOverEvent: [{ type: Output }], dragLeaveEvent: [{ type: Output }], dropEvent: [{ type: Output }], dragOverClass: [{ type: Input }], dropScope: [{ type: Input }], placeholderTag: [{ type: Input }], placeholderStyle: [{ type: Input }], placeholderText: [{ type: Input }], allowDropOnItem: [{ type: Input }], dragOverItemClass: [{ type: Input }], nestingTargetRect: [{ type: Input }], switchWhileCrossEdge: [{ type: Input }], defaultDropPosition: [{ type: Input }], dropSortCountSelector: [{ type: Input }], dropSortVirtualScrollOption: [{ type: Input }], drop: [{ type: HostListener, args: ['drop', ['$event']] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJvcHBhYmxlLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2RldnVpL2RyYWdkcm9wL2RpcmVjdGl2ZXMvZHJvcHBhYmxlLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDM0MsT0FBTyxFQUVMLFNBQVMsRUFDVCxVQUFVLEVBQ1YsWUFBWSxFQUNaLFlBQVksRUFDWixNQUFNLEVBQ04sS0FBSyxFQUNMLE1BQU0sRUFHTixNQUFNLEVBQ04sU0FBUyxFQUNWLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUN4RCxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDOUQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQ2hFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUN2RCxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0saUJBQWlCLENBQUM7OztBQVF4QyxNQUFNLE9BQU8sa0JBQWtCO0lBc0c3QixZQUFzQixFQUFjLEVBQVUsUUFBbUIsRUFBVSxlQUFnQyxFQUFVLE1BQWMsRUFDN0YsR0FBUTtRQUR4QixPQUFFLEdBQUYsRUFBRSxDQUFZO1FBQVUsYUFBUSxHQUFSLFFBQVEsQ0FBVztRQUFVLG9CQUFlLEdBQWYsZUFBZSxDQUFpQjtRQUFVLFdBQU0sR0FBTixNQUFNLENBQVE7UUFDN0YsUUFBRyxHQUFILEdBQUcsQ0FBSztRQXJHOUM7O2FBRUs7UUFDSyxtQkFBYyxHQUFzQixJQUFJLFlBQVksRUFBTyxDQUFDO1FBRXRFOzthQUVLO1FBQ0ssa0JBQWEsR0FBc0IsSUFBSSxZQUFZLEVBQU8sQ0FBQztRQUVyRTs7YUFFSztRQUNLLG1C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