ng-devui
Version:
DevUI components based on Angular
746 lines • 119 kB
JavaScript
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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