@libs-ui/components-drag-drop 0.2.10-6.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,92 @@
1
+ import { Injectable, signal } from "@angular/core";
2
+ import { Subject } from "rxjs";
3
+ import * as i0 from "@angular/core";
4
+ export class MoLibsSharedDragDropService {
5
+ itemsClick = new Array();
6
+ onDragItemInContainerVirtualScroll = new Subject();
7
+ itemDragInfo;
8
+ container = signal(new Map());
9
+ targetItemDragFlag = 'item-drag-target';
10
+ classContainerDefine = 'libs-ui-drag-drop-container';
11
+ classItemDefine = 'libs-ui-drag-drop-item';
12
+ onDragging = new Subject();
13
+ onDragStart = new Subject();
14
+ onDragEnd = new Subject();
15
+ onDragOver = new Subject();
16
+ onDragLeave = new Subject();
17
+ onDrop = new Subject();
18
+ onDropContainer = new Subject();
19
+ onItemInit = new Subject();
20
+ get OnDragItemInContainerVirtualScroll() {
21
+ return this.onDragItemInContainerVirtualScroll;
22
+ }
23
+ set ItemDragInfo(data) {
24
+ this.itemDragInfo = data;
25
+ }
26
+ get ItemDragInfo() {
27
+ return this.itemDragInfo;
28
+ }
29
+ get Container() {
30
+ return this.container;
31
+ }
32
+ get TargetItemDragFlag() {
33
+ return this.targetItemDragFlag;
34
+ }
35
+ get ClassContainerDefine() {
36
+ return this.classContainerDefine;
37
+ }
38
+ get ClassItemDefine() {
39
+ return this.classItemDefine;
40
+ }
41
+ get OnDragging() {
42
+ return this.onDragging;
43
+ }
44
+ get OnDragOver() {
45
+ return this.onDragOver;
46
+ }
47
+ get OnDragLeave() {
48
+ return this.onDragLeave;
49
+ }
50
+ get OnDragStart() {
51
+ return this.onDragStart;
52
+ }
53
+ get OnDragEnd() {
54
+ return this.onDragEnd;
55
+ }
56
+ get OnDropContainer() {
57
+ return this.onDropContainer;
58
+ }
59
+ get OnDrop() {
60
+ return this.onDrop;
61
+ }
62
+ get OnItemInit() {
63
+ return this.onItemInit;
64
+ }
65
+ get ItemClick() {
66
+ return [...this.itemsClick];
67
+ }
68
+ set ItemClick(item) {
69
+ this.itemsClick.push(item);
70
+ }
71
+ resetItemClick() {
72
+ this.itemsClick.length = 0;
73
+ }
74
+ checkElementOverAcceptElementDrag(groupNameOfContainer, groupNameOfElementDrag, groupNameOfDropTo) {
75
+ if (groupNameOfContainer !== groupNameOfElementDrag && !groupNameOfDropTo) {
76
+ return false;
77
+ }
78
+ if (groupNameOfDropTo !== null && !groupNameOfDropTo.toString().split(';').includes(groupNameOfContainer || 'undefinedName')) {
79
+ return false;
80
+ }
81
+ return true;
82
+ }
83
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: MoLibsSharedDragDropService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
84
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: MoLibsSharedDragDropService, providedIn: 'any' });
85
+ }
86
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: MoLibsSharedDragDropService, decorators: [{
87
+ type: Injectable,
88
+ args: [{
89
+ providedIn: 'any'
90
+ }]
91
+ }] });
92
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJhZy1kcm9wLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWJzLXVpL2NvbXBvbmVudHMvZHJhZy1kcm9wL3NyYy9kcmFnLWRyb3Auc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFrQixNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbkUsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQzs7QUFNL0IsTUFBTSxPQUFPLDJCQUEyQjtJQUM5QixVQUFVLEdBQUcsSUFBSSxLQUFLLEVBQWUsQ0FBQztJQUN0QyxrQ0FBa0MsR0FBRyxJQUFJLE9BQU8sRUFBcUMsQ0FBQztJQUN0RixZQUFZLENBQWlCO0lBQzdCLFNBQVMsR0FBRyxNQUFNLENBQUMsSUFBSSxHQUFHLEVBQWlFLENBQUMsQ0FBQztJQUM3RixrQkFBa0IsR0FBRyxrQkFBa0IsQ0FBQztJQUN4QyxvQkFBb0IsR0FBRyw2QkFBNkIsQ0FBQztJQUNyRCxlQUFlLEdBQUcsd0JBQXdCLENBQUM7SUFDM0MsVUFBVSxHQUFHLElBQUksT0FBTyxFQUFhLENBQUM7SUFDdEMsV0FBVyxHQUFHLElBQUksT0FBTyxFQUFjLENBQUM7SUFDeEMsU0FBUyxHQUFHLElBQUksT0FBTyxFQUFZLENBQUM7SUFDcEMsVUFBVSxHQUFHLElBQUksT0FBTyxFQUFhLENBQUM7SUFDdEMsV0FBVyxHQUFHLElBQUksT0FBTyxFQUFjLENBQUM7SUFDeEMsTUFBTSxHQUFHLElBQUksT0FBTyxFQUFTLENBQUM7SUFDOUIsZUFBZSxHQUFHLElBQUksT0FBTyxFQUFTLENBQUM7SUFDdkMsVUFBVSxHQUFHLElBQUksT0FBTyxFQUFVLENBQUM7SUFFM0MsSUFBVyxrQ0FBa0M7UUFDM0MsT0FBTyxJQUFJLENBQUMsa0NBQWtDLENBQUM7SUFDakQsQ0FBQztJQUVELElBQVcsWUFBWSxDQUFDLElBQStCO1FBQ3JELElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDO0lBQzNCLENBQUM7SUFFRCxJQUFXLFlBQVk7UUFDckIsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDO0lBQzNCLENBQUM7SUFFRCxJQUFXLFNBQVM7UUFDbEIsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDO0lBQ3hCLENBQUM7SUFFRCxJQUFXLGtCQUFrQjtRQUMzQixPQUFPLElBQUksQ0FBQyxrQkFBa0IsQ0FBQztJQUNqQyxDQUFDO0lBRUQsSUFBVyxvQkFBb0I7UUFDN0IsT0FBTyxJQUFJLENBQUMsb0JBQW9CLENBQUM7SUFDbkMsQ0FBQztJQUVELElBQVcsZUFBZTtRQUN4QixPQUFPLElBQUksQ0FBQyxlQUFlLENBQUM7SUFDOUIsQ0FBQztJQUVELElBQVcsVUFBVTtRQUNuQixPQUFPLElBQUksQ0FBQyxVQUFVLENBQUM7SUFDekIsQ0FBQztJQUVELElBQVcsVUFBVTtRQUNuQixPQUFPLElBQUksQ0FBQyxVQUFVLENBQUM7SUFDekIsQ0FBQztJQUVELElBQVcsV0FBVztRQUNwQixPQUFPLElBQUksQ0FBQyxXQUFXLENBQUM7SUFDMUIsQ0FBQztJQUVELElBQVcsV0FBVztRQUNwQixPQUFPLElBQUksQ0FBQyxXQUFXLENBQUM7SUFDMUIsQ0FBQztJQUVELElBQVcsU0FBUztRQUNsQixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUM7SUFDeEIsQ0FBQztJQUVELElBQVcsZUFBZTtRQUN4QixPQUFPLElBQUksQ0FBQyxlQUFlLENBQUM7SUFDOUIsQ0FBQztJQUVELElBQVcsTUFBTTtRQUNmLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQztJQUNyQixDQUFDO0lBRUQsSUFBVyxVQUFVO1FBQ25CLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQztJQUN6QixDQUFDO0lBRUQsSUFBVyxTQUFTO1FBQ2xCLE9BQU8sQ0FBQyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUM5QixDQUFDO0lBRUQsSUFBVyxTQUFTLENBQUMsSUFBaUI7UUFDcEMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDN0IsQ0FBQztJQUVNLGNBQWM7UUFDbkIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO0lBQzdCLENBQUM7SUFFTSxpQ0FBaUMsQ0FBQyxvQkFBbUMsRUFBRSxzQkFBcUMsRUFBRSxpQkFBZ0M7UUFDbkosSUFBSSxvQkFBb0IsS0FBSyxzQkFBc0IsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7WUFDMUUsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDO1FBRUQsSUFBSSxpQkFBaUIsS0FBSyxJQUFJLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsUUFBUSxDQUFDLG9CQUFvQixJQUFJLGVBQWUsQ0FBQyxFQUFFLENBQUM7WUFDN0gsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDO1FBRUQsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO3dHQW5HVSwyQkFBMkI7NEdBQTNCLDJCQUEyQixjQUgxQixLQUFLOzs0RkFHTiwyQkFBMkI7a0JBSnZDLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLEtBQUs7aUJBQ2xCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgV3JpdGFibGVTaWduYWwsIHNpZ25hbCB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSBcInJ4anNcIjtcbmltcG9ydCB7IElEcmFnRW5kLCBJRHJhZ0l0ZW1JbkNvbnRhaW5lclZpcnR1YWxTY3JvbGwsIElEcmFnTGVhdmUsIElEcmFnT3ZlciwgSURyYWdTdGFydCwgSURyYWdnaW5nLCBJRHJvcCwgSUl0ZW1EcmFnSW5mbyB9IGZyb20gXCIuL2ludGVyZmFjZXMvZXZlbnQuaW50ZXJmYWNlXCI7XG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdhbnknXG59KVxuXG5leHBvcnQgY2xhc3MgTW9MaWJzU2hhcmVkRHJhZ0Ryb3BTZXJ2aWNlIHtcbiAgcHJpdmF0ZSBpdGVtc0NsaWNrID0gbmV3IEFycmF5PEhUTUxFbGVtZW50PigpO1xuICBwcml2YXRlIG9uRHJhZ0l0ZW1JbkNvbnRhaW5lclZpcnR1YWxTY3JvbGwgPSBuZXcgU3ViamVjdDxJRHJhZ0l0ZW1JbkNvbnRhaW5lclZpcnR1YWxTY3JvbGw+KCk7XG4gIHByaXZhdGUgaXRlbURyYWdJbmZvPzogSUl0ZW1EcmFnSW5mbztcbiAgcHJpdmF0ZSBjb250YWluZXIgPSBzaWduYWwobmV3IE1hcDxzdHJpbmcsIHsgZWxlbWVudDogSFRNTEVsZW1lbnQ7IGVsZW1lbnRTY3JvbGw/OiBIVE1MRWxlbWVudCB9PigpKTtcbiAgcHJpdmF0ZSB0YXJnZXRJdGVtRHJhZ0ZsYWcgPSAnaXRlbS1kcmFnLXRhcmdldCc7XG4gIHByaXZhdGUgY2xhc3NDb250YWluZXJEZWZpbmUgPSAnbGlicy11aS1kcmFnLWRyb3AtY29udGFpbmVyJztcbiAgcHJpdmF0ZSBjbGFzc0l0ZW1EZWZpbmUgPSAnbGlicy11aS1kcmFnLWRyb3AtaXRlbSc7XG4gIHByaXZhdGUgb25EcmFnZ2luZyA9IG5ldyBTdWJqZWN0PElEcmFnZ2luZz4oKTtcbiAgcHJpdmF0ZSBvbkRyYWdTdGFydCA9IG5ldyBTdWJqZWN0PElEcmFnU3RhcnQ+KCk7XG4gIHByaXZhdGUgb25EcmFnRW5kID0gbmV3IFN1YmplY3Q8SURyYWdFbmQ+KCk7XG4gIHByaXZhdGUgb25EcmFnT3ZlciA9IG5ldyBTdWJqZWN0PElEcmFnT3Zlcj4oKTtcbiAgcHJpdmF0ZSBvbkRyYWdMZWF2ZSA9IG5ldyBTdWJqZWN0PElEcmFnTGVhdmU+KCk7XG4gIHByaXZhdGUgb25Ecm9wID0gbmV3IFN1YmplY3Q8SURyb3A+KCk7XG4gIHByaXZhdGUgb25Ecm9wQ29udGFpbmVyID0gbmV3IFN1YmplY3Q8SURyb3A+KCk7XG4gIHByaXZhdGUgb25JdGVtSW5pdCA9IG5ldyBTdWJqZWN0PHN0cmluZz4oKTtcblxuICBwdWJsaWMgZ2V0IE9uRHJhZ0l0ZW1JbkNvbnRhaW5lclZpcnR1YWxTY3JvbGwoKTogU3ViamVjdDxJRHJhZ0l0ZW1JbkNvbnRhaW5lclZpcnR1YWxTY3JvbGw+IHtcbiAgICByZXR1cm4gdGhpcy5vbkRyYWdJdGVtSW5Db250YWluZXJWaXJ0dWFsU2Nyb2xsO1xuICB9XG5cbiAgcHVibGljIHNldCBJdGVtRHJhZ0luZm8oZGF0YTogSUl0ZW1EcmFnSW5mbyB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuaXRlbURyYWdJbmZvID0gZGF0YTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgSXRlbURyYWdJbmZvKCk6IElJdGVtRHJhZ0luZm8gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLml0ZW1EcmFnSW5mbztcbiAgfVxuXG4gIHB1YmxpYyBnZXQgQ29udGFpbmVyKCk6IFdyaXRhYmxlU2lnbmFsPE1hcDxzdHJpbmcsIHsgZWxlbWVudDogSFRNTEVsZW1lbnQ7IGVsZW1lbnRTY3JvbGw/OiBIVE1MRWxlbWVudCB9Pj4ge1xuICAgIHJldHVybiB0aGlzLmNvbnRhaW5lcjtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgVGFyZ2V0SXRlbURyYWdGbGFnKCkge1xuICAgIHJldHVybiB0aGlzLnRhcmdldEl0ZW1EcmFnRmxhZztcbiAgfVxuXG4gIHB1YmxpYyBnZXQgQ2xhc3NDb250YWluZXJEZWZpbmUoKSB7XG4gICAgcmV0dXJuIHRoaXMuY2xhc3NDb250YWluZXJEZWZpbmU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IENsYXNzSXRlbURlZmluZSgpIHtcbiAgICByZXR1cm4gdGhpcy5jbGFzc0l0ZW1EZWZpbmU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IE9uRHJhZ2dpbmcoKSB7XG4gICAgcmV0dXJuIHRoaXMub25EcmFnZ2luZztcbiAgfVxuXG4gIHB1YmxpYyBnZXQgT25EcmFnT3ZlcigpIHtcbiAgICByZXR1cm4gdGhpcy5vbkRyYWdPdmVyO1xuICB9XG5cbiAgcHVibGljIGdldCBPbkRyYWdMZWF2ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5vbkRyYWdMZWF2ZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgT25EcmFnU3RhcnQoKSB7XG4gICAgcmV0dXJuIHRoaXMub25EcmFnU3RhcnQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0IE9uRHJhZ0VuZCgpIHtcbiAgICByZXR1cm4gdGhpcy5vbkRyYWdFbmQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0IE9uRHJvcENvbnRhaW5lcigpIHtcbiAgICByZXR1cm4gdGhpcy5vbkRyb3BDb250YWluZXI7XG4gIH1cblxuICBwdWJsaWMgZ2V0IE9uRHJvcCgpIHtcbiAgICByZXR1cm4gdGhpcy5vbkRyb3A7XG4gIH1cblxuICBwdWJsaWMgZ2V0IE9uSXRlbUluaXQoKSB7XG4gICAgcmV0dXJuIHRoaXMub25JdGVtSW5pdDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgSXRlbUNsaWNrKCk6IEFycmF5PEhUTUxFbGVtZW50PiB7XG4gICAgcmV0dXJuIFsuLi50aGlzLml0ZW1zQ2xpY2tdO1xuICB9XG5cbiAgcHVibGljIHNldCBJdGVtQ2xpY2soaXRlbTogSFRNTEVsZW1lbnQpIHtcbiAgICB0aGlzLml0ZW1zQ2xpY2sucHVzaChpdGVtKTtcbiAgfVxuXG4gIHB1YmxpYyByZXNldEl0ZW1DbGljaygpIHtcbiAgICB0aGlzLml0ZW1zQ2xpY2subGVuZ3RoID0gMDtcbiAgfVxuXG4gIHB1YmxpYyBjaGVja0VsZW1lbnRPdmVyQWNjZXB0RWxlbWVudERyYWcoZ3JvdXBOYW1lT2ZDb250YWluZXI6IHN0cmluZyB8IG51bGwsIGdyb3VwTmFtZU9mRWxlbWVudERyYWc6IHN0cmluZyB8IG51bGwsIGdyb3VwTmFtZU9mRHJvcFRvOiBzdHJpbmcgfCBudWxsKTogYm9vbGVhbiB7XG4gICAgaWYgKGdyb3VwTmFtZU9mQ29udGFpbmVyICE9PSBncm91cE5hbWVPZkVsZW1lbnREcmFnICYmICFncm91cE5hbWVPZkRyb3BUbykge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmIChncm91cE5hbWVPZkRyb3BUbyAhPT0gbnVsbCAmJiAhZ3JvdXBOYW1lT2ZEcm9wVG8udG9TdHJpbmcoKS5zcGxpdCgnOycpLmluY2x1ZGVzKGdyb3VwTmFtZU9mQ29udGFpbmVyIHx8ICd1bmRlZmluZWROYW1lJykpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxufSJdfQ==
@@ -0,0 +1,124 @@
1
+ import { Directive, inject, output } from "@angular/core";
2
+ import { cloneIBoundingClientRect, getViewport } from "@libs-ui/utils";
3
+ import { Subject, fromEvent, takeUntil, tap } from "rxjs";
4
+ import { MoLibsSharedDragDropService } from "./drag-drop.service";
5
+ import * as i0 from "@angular/core";
6
+ export class LibsUiDragItemInContainerVirtualScrollDirective {
7
+ /* PROPERTY */
8
+ onDestroy = new Subject();
9
+ /* OUTPUT */
10
+ outDragEndContainer = output();
11
+ /* INJECT */
12
+ dragDropService = inject(MoLibsSharedDragDropService);
13
+ ngAfterViewInit() {
14
+ this.dragDropService.OnDragEnd.pipe(takeUntil(this.onDestroy)).subscribe(e => {
15
+ this.outDragEndContainer.emit(e);
16
+ });
17
+ this.dragDropService.OnDragItemInContainerVirtualScroll.pipe(takeUntil(this.onDestroy)).subscribe(dragItemInContainerVirtualScrollEvent => {
18
+ const stopEventMouse = (mouseEvent) => {
19
+ if (!dragItemInContainerVirtualScrollEvent.ignoreStopEvent) {
20
+ mouseEvent.preventDefault();
21
+ mouseEvent.stopPropagation();
22
+ }
23
+ };
24
+ const documentMouseUp = fromEvent(document, 'mouseup')
25
+ .pipe(tap((eventMouseUp) => {
26
+ this.updateMouseEventsWhenMoveOverIframe('auto');
27
+ stopEventMouse(eventMouseUp);
28
+ const mousePosition = { clientX: eventMouseUp.clientX, clientY: eventMouseUp.clientY };
29
+ if (dragItemInContainerVirtualScrollEvent.dragBoundary && dragItemInContainerVirtualScrollEvent.dragBoundaryAcceptMouseLeaveContainer) {
30
+ const result = this.getClientPosition(dragItemInContainerVirtualScrollEvent.elementDrag, mousePosition, dragItemInContainerVirtualScrollEvent.distanceStartElementAndMouseLeft, dragItemInContainerVirtualScrollEvent.distanceStartElementAndMouseTop, dragItemInContainerVirtualScrollEvent.dragBoundary, dragItemInContainerVirtualScrollEvent.elementContainer);
31
+ mousePosition.clientX = result.clientX;
32
+ mousePosition.clientY = result.clientY;
33
+ }
34
+ const dragEndEvent = { mousePosition, elementDrag: dragItemInContainerVirtualScrollEvent.elementDrag, itemDragInfo: this.dragDropService.ItemDragInfo };
35
+ this.dragDropService.ItemDragInfo = undefined;
36
+ this.dragDropService.OnDragEnd.next(dragEndEvent);
37
+ document.body.classList.remove('select-none');
38
+ dragItemInContainerVirtualScrollEvent.elementDrag.remove();
39
+ }), takeUntil(this.onDestroy));
40
+ fromEvent(document, 'mousemove').pipe(tap((eventMousemove) => {
41
+ stopEventMouse(eventMousemove);
42
+ const { clientX, clientY } = eventMousemove;
43
+ const mousePosition = { clientX, clientY };
44
+ const result = this.getClientPosition(dragItemInContainerVirtualScrollEvent.elementDrag, mousePosition, dragItemInContainerVirtualScrollEvent.distanceStartElementAndMouseLeft, dragItemInContainerVirtualScrollEvent.distanceStartElementAndMouseTop, dragItemInContainerVirtualScrollEvent.dragBoundary, dragItemInContainerVirtualScrollEvent.elementContainer);
45
+ const elementKeepContainer = result.elementKeepContainer;
46
+ const left = result.clientX - dragItemInContainerVirtualScrollEvent.distanceStartElementAndMouseLeft;
47
+ const top = result.clientY - dragItemInContainerVirtualScrollEvent.distanceStartElementAndMouseTop;
48
+ if (dragItemInContainerVirtualScrollEvent.dragBoundary && dragItemInContainerVirtualScrollEvent.dragBoundaryAcceptMouseLeaveContainer) {
49
+ if (clientX < result.viewport.left) {
50
+ mousePosition.clientX = result.viewport.left;
51
+ }
52
+ if (clientX > result.viewport.width) {
53
+ mousePosition.clientX = result.viewport.width;
54
+ }
55
+ if (clientY < result.viewport.top) {
56
+ mousePosition.clientY = result.viewport.top;
57
+ }
58
+ if (clientY > result.viewport.height) {
59
+ mousePosition.clientY = result.viewport.height;
60
+ }
61
+ }
62
+ dragItemInContainerVirtualScrollEvent.elementDrag.style.left = `${left}px`;
63
+ dragItemInContainerVirtualScrollEvent.elementDrag.style.top = `${top}px`;
64
+ this.dragDropService.OnDragging.next({ mousePosition, elementDrag: dragItemInContainerVirtualScrollEvent.elementDrag, elementKeepContainer, itemDragInfo: this.dragDropService.ItemDragInfo });
65
+ }), takeUntil((documentMouseUp)), takeUntil(this.onDestroy)).subscribe();
66
+ });
67
+ }
68
+ /* FUNCTIONS */
69
+ getClientPosition(element, mousePosition, distanceStartElementAndMouseLeft, distanceStartElementAndMouseTop, dragBoundary, elementContainer) {
70
+ let viewport = getViewport();
71
+ const rectElement = element.getBoundingClientRect();
72
+ const containerById = this.dragDropService.Container().get(element.getAttribute('groupID') || '');
73
+ const containerItem = elementContainer || containerById?.elementScroll || containerById?.element || document.body;
74
+ let { clientX, clientY } = mousePosition;
75
+ viewport.left = 0;
76
+ viewport.top = 0;
77
+ if (dragBoundary) {
78
+ viewport = cloneIBoundingClientRect(containerItem.getBoundingClientRect());
79
+ viewport.height = viewport.top + viewport.height;
80
+ viewport.width = viewport.left + viewport.width;
81
+ }
82
+ let elementKeepContainer = false;
83
+ if (clientX > viewport.width && clientY > viewport.height || clientX < viewport.left && clientY < viewport.top) {
84
+ elementKeepContainer = true;
85
+ }
86
+ if ((clientX + (rectElement.width - distanceStartElementAndMouseLeft)) > viewport.width) {
87
+ clientX -= (clientX + (rectElement.width - distanceStartElementAndMouseLeft) - viewport.width);
88
+ }
89
+ if ((clientY + (rectElement.height - distanceStartElementAndMouseTop)) > viewport.height) {
90
+ clientY -= (clientY + (rectElement.height - distanceStartElementAndMouseTop) - viewport.height);
91
+ }
92
+ if ((clientX - distanceStartElementAndMouseLeft) < (dragBoundary && containerItem ? viewport.left : 0)) {
93
+ clientX = (dragBoundary && containerItem ? viewport.left : 0) + distanceStartElementAndMouseLeft;
94
+ }
95
+ if ((clientY - distanceStartElementAndMouseTop) < (dragBoundary && containerItem ? viewport.top : 0)) {
96
+ clientY = (dragBoundary && containerItem ? viewport.top : 0) + distanceStartElementAndMouseTop;
97
+ }
98
+ return { clientX, clientY, elementKeepContainer, viewport };
99
+ }
100
+ updateMouseEventsWhenMoveOverIframe(pointerEvents) {
101
+ const frames = document.getElementsByTagName("iframe");
102
+ if (!frames?.length) {
103
+ return;
104
+ }
105
+ for (let i = 0; i < frames.length; ++i) {
106
+ frames[i].style.pointerEvents = pointerEvents;
107
+ }
108
+ }
109
+ ngOnDestroy() {
110
+ this.onDestroy.next();
111
+ this.onDestroy.complete();
112
+ }
113
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: LibsUiDragItemInContainerVirtualScrollDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
114
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.13", type: LibsUiDragItemInContainerVirtualScrollDirective, isStandalone: true, selector: "[LibsUiDragItemInContainerVirtualScrollDirective]", outputs: { outDragEndContainer: "outDragEndContainer" }, ngImport: i0 });
115
+ }
116
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: LibsUiDragItemInContainerVirtualScrollDirective, decorators: [{
117
+ type: Directive,
118
+ args: [{
119
+ // eslint-disable-next-line @angular-eslint/directive-selector
120
+ selector: "[LibsUiDragItemInContainerVirtualScrollDirective]",
121
+ standalone: true,
122
+ }]
123
+ }] });
124
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJhZy1pdGVtLWluLWNvbnRhaW5lci12aXJ0dWFsLXNjcm9sbC5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWJzLXVpL2NvbXBvbmVudHMvZHJhZy1kcm9wL3NyYy9kcmFnLWl0ZW0taW4tY29udGFpbmVyLXZpcnR1YWwtc2Nyb2xsLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQWlCLFNBQVMsRUFBYSxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRXBGLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN2RSxPQUFPLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzFELE9BQU8sRUFBRSwyQkFBMkIsRUFBRSxNQUFNLHFCQUFxQixDQUFDOztBQVNsRSxNQUFNLE9BQU8sK0NBQStDO0lBQzFELGNBQWM7SUFDSixTQUFTLEdBQUcsSUFBSSxPQUFPLEVBQVEsQ0FBQztJQUUxQyxZQUFZO0lBQ0gsbUJBQW1CLEdBQUcsTUFBTSxFQUFZLENBQUM7SUFFbEQsWUFBWTtJQUNGLGVBQWUsR0FBRyxNQUFNLENBQUMsMkJBQTJCLENBQUMsQ0FBQztJQUVoRSxlQUFlO1FBQ2IsSUFBSSxDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUU7WUFDM0UsSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNuQyxDQUFDLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxlQUFlLENBQUMsa0NBQWtDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMs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LENBQUMsRUFBRSxDQUFDO1lBQ3JHLE9BQU8sR0FBRyxDQUFDLFlBQVksSUFBSSxhQUFhLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLCtCQUErQixDQUFDO1FBQ2pHLENBQUM7UUFFRCxPQUFPLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxRQUFRLEVBQUUsQ0FBQztJQUM5RCxDQUFDO0lBRVMsbUNBQW1DLENBQUMsYUFBOEI7UUFDMUUsTUFBTSxNQUFNLEdBQUcsUUFBUSxDQUFDLG9CQUFvQixDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBRXZELElBQUksQ0FBQyxNQUFNLEVBQUUsTUFBTSxFQUFFLENBQUM7WUFDcEIsT0FBTztRQUNULENBQUM7UUFFRCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsTUFBTSxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDO1lBQ3ZDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsYUFBYSxHQUFHLGFBQWEsQ0FBQztRQUNoRCxDQUFDO0lBQ0gsQ0FBQztJQUVELFdBQVc7UUFDVCxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ3RCLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDNUIsQ0FBQzt3R0FsSVUsK0NBQStDOzRGQUEvQywrQ0FBK0M7OzRGQUEvQywrQ0FBK0M7a0JBTjNELFNBQVM7bUJBQUM7b0JBQ1QsOERBQThEO29CQUM5RCxRQUFRLEVBQUUsbURBQW1EO29CQUM3RCxVQUFVLEVBQUUsSUFBSTtpQkFFakIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBZnRlclZpZXdJbml0LCBEaXJlY3RpdmUsIE9uRGVzdHJveSwgaW5qZWN0LCBvdXRwdXQgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IHsgSUJvdW5kaW5nQ2xpZW50UmVjdCB9IGZyb20gXCJAbGlicy11aS9pbnRlcmZhY2VzLXR5cGVzXCI7XG5pbXBvcnQgeyBjbG9uZUlCb3VuZGluZ0NsaWVudFJlY3QsIGdldFZpZXdwb3J0IH0gZnJvbSBcIkBsaWJzLXVpL3V0aWxzXCI7XG5pbXBvcnQgeyBTdWJqZWN0LCBmcm9tRXZlbnQsIHRha2VVbnRpbCwgdGFwIH0gZnJvbSBcInJ4anNcIjtcbmltcG9ydCB7IE1vTGlic1NoYXJlZERyYWdEcm9wU2VydmljZSB9IGZyb20gXCIuL2RyYWctZHJvcC5zZXJ2aWNlXCI7XG5pbXBvcnQgeyBJRHJhZ0VuZCB9IGZyb20gXCIuL2ludGVyZmFjZXMvZXZlbnQuaW50ZXJmYWNlXCI7XG5cbkBEaXJlY3RpdmUoe1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGFuZ3VsYXItZXNsaW50L2RpcmVjdGl2ZS1zZWxlY3RvclxuICBzZWxlY3RvcjogXCJbTGlic1VpRHJhZ0l0ZW1JbkNvbnRhaW5lclZpcnR1YWxTY3JvbGxEaXJlY3RpdmVdXCIsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG5cbn0pXG5leHBvcnQgY2xhc3MgTGlic1VpRHJhZ0l0ZW1JbkNvbnRhaW5lclZpcnR1YWxTY3JvbGxEaXJlY3RpdmUgaW1wbGVtZW50cyBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3kge1xuICAvKiBQUk9QRVJUWSAqL1xuICBwcm90ZWN0ZWQgb25EZXN0cm95ID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcblxuICAvKiBPVVRQVVQgKi9cbiAgcmVhZG9ubHkgb3V0RHJhZ0VuZENvbnRhaW5lciA9IG91dHB1dDxJRHJhZ0VuZD4oKTtcblxuICAvKiBJTkpFQ1QgKi9cbiAgcHJvdGVjdGVkIGRyYWdEcm9wU2VydmljZSA9IGluamVjdChNb0xpYnNTaGFyZWREcmFnRHJvcFNlcnZpY2UpO1xuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmRyYWdEcm9wU2VydmljZS5PbkRyYWdFbmQucGlwZSh0YWtlVW50aWwodGhpcy5vbkRlc3Ryb3kpKS5zdWJzY3JpYmUoZSA9PiB7XG4gICAgICB0aGlzLm91dERyYWdFbmRDb250YWluZXIuZW1pdChlKTtcbiAgICB9KTtcbiAgICB0aGlzLmRyYWdEcm9wU2VydmljZS5PbkRyYWdJdGVtSW5Db250YWluZXJWaXJ0dWFsU2Nyb2xsLnBpcGUodGFrZVVudGlsKHRoaXMub25EZXN0cm95KSkuc3Vic2NyaWJlKGRyYWdJdGVtSW5Db250YWluZXJWaXJ0dWFsU2Nyb2xsRXZlbnQgPT4ge1xuICAgICAgY29uc3Qgc3RvcEV2ZW50TW91c2UgPSAobW91c2VFdmVudDogTW91c2VFdmVudCkgPT4ge1xuICAgICAgICBpZiAoIWRyYWdJdGVtSW5Db250YWluZXJWaXJ0dWFsU2Nyb2xsRXZlbnQuaWdub3JlU3RvcEV2ZW50KSB7XG4gICAgICAgICAgbW91c2VFdmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgIG1vdXNlRXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICBjb25zdCBkb2N1bWVudE1vdXNlVXAgPSBmcm9tRXZlbnQ8TW91c2VFdmVudD4oZG9jdW1lbnQsICdtb3VzZXVwJylcbiAgICAgICAgLnBpcGUoXG4gICAgICAgICAgdGFwKChldmVudE1vdXNlVXApID0+IHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlTW91c2VFdmVudHNXaGVuTW92ZU92ZXJJZnJhbWUoJ2F1dG8nKTtcbiAgICAgICAgICAgIHN0b3BFdmVudE1vdXNlKGV2ZW50TW91c2VVcCk7XG4gICAgICAgICAgICBjb25zdCBtb3VzZVBvc2l0aW9uID0geyBjbGllbnRYOiBldmVudE1vdXNlVXAuY2xpZW50WCwgY2xpZW50WTogZXZlbnRNb3VzZVVwLmNsaWVudFkgfTtcblxuICAgICAgICAgICAgaWYgKGRyYWdJdGVtSW5Db250YWluZXJWaXJ0dWFsU2Nyb2xsRXZlbnQuZHJhZ0JvdW5kYXJ5ICYmIGRyYWdJdGVtSW5Db250YWluZXJWaXJ0dWFsU2Nyb2xsRXZlbnQuZHJhZ0JvdW5kYXJ5QWNjZXB0TW91c2VMZWF2ZUNvbnRhaW5lcikge1xuICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSB0aGlzLmdldENsaWVudFBvc2l0aW9uKGRyYWdJdGVtSW5Db250YWluZXJWaXJ0dWFsU2Nyb2xsRXZlbnQuZWxlbWVudERyYWcsIG1vdXNlUG9zaXRpb24sIGRyYWdJdGVtSW5Db250YWluZXJWaXJ0dWFsU2Nyb2xsRXZlbnQuZGlzdGFuY2VTdGFydEVsZW1lbnRBbmRNb3VzZUxlZnQsIGRyYWdJdGVtSW5Db250YWluZXJWaXJ0dWFsU2Nyb2xsRXZlbnQuZGlzdGFuY2VTdGFydEVsZW1lbnRBbmRNb3VzZVRvcCwgZHJhZ0l0ZW1JbkNvbnRhaW5lclZpcnR1YWxTY3JvbGxFdmVudC5kcmFnQm91bmRhcnksIGRyYWdJdGVtSW5Db250YWluZXJWaXJ0dWFsU2Nyb2xsRXZlbnQuZWxlbWVudENvbnRhaW5lcik7XG5cbiAgICAgICAgICAgICAgbW91c2VQb3NpdGlvbi5jbGllbnRYID0gcmVzdWx0LmNsaWVudFg7XG4gICAgICAgICAgICAgIG1vdXNlUG9zaXRpb24uY2xpZW50WSA9IHJlc3VsdC5jbGllbnRZO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgZHJhZ0VuZEV2ZW50ID0geyBtb3VzZVBvc2l0aW9uLCBlbGVtZW50RHJhZzogZHJhZ0l0ZW1JbkNvbnRhaW5lclZpcnR1YWxTY3JvbGxFdmVudC5lbGVtZW50RHJhZywgaXRlbURyYWdJbmZvOiB0aGlzLmRyYWdEcm9wU2VydmljZS5JdGVtRHJhZ0luZm8gfTtcblxuICAgICAgICAgICAgdGhpcy5kcmFnRHJvcFNlcnZpY2UuSXRlbURyYWdJbmZvID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgdGhpcy5kcmFnRHJvcFNlcnZpY2UuT25EcmFnRW5kLm5leHQoZHJhZ0VuZEV2ZW50KTtcbiAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LnJlbW92ZSgnc2VsZWN0LW5vbmUnKTtcbiAgICAgICAgICAgIGRyYWdJdGVtSW5Db250YWluZXJWaXJ0dWFsU2Nyb2xsRXZlbnQuZWxlbWVudERyYWcucmVtb3ZlKCk7XG4gICAgICAgICAgfSksXG4gICAgICAgICAgdGFrZVVudGlsKHRoaXMub25EZXN0cm95KVxuICAgICAgICApO1xuXG4gICAgICBmcm9tRXZlbnQ8TW91c2VFdmVudD4oZG9jdW1lbnQsICdtb3VzZW1vdmUnKS5waXBlKHRhcCgoZXZlbnRNb3VzZW1vdmUpID0+IHtcbiAgICAgICAgc3RvcEV2ZW50TW91c2UoZXZlbnRNb3VzZW1vdmUpO1xuICAgICAgICBjb25zdCB7IGNsaWVudFgsIGNsaWVudFkgfSA9IGV2ZW50TW91c2Vtb3ZlO1xuICAgICAgICBjb25zdCBtb3VzZVBvc2l0aW9uID0geyBjbGllbnRYLCBjbGllbnRZIH07XG5cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5nZXRDbGllbnRQb3NpdGlvbihkcmFnSXRlbUluQ29udGFpbmVyVmlydHVhbFNjcm9sbEV2ZW50LmVsZW1lbnREcmFnLCBtb3VzZVBvc2l0aW9uLCBkcmFnSXRlbUluQ29udGFpbmVyVmlydHVhbFNjcm9sbEV2ZW50LmRpc3RhbmNlU3RhcnRFbGVtZW50QW5kTW91c2VMZWZ0LCBkcmFnSXRlbUluQ29udGFpbmVyVmlydHVhbFNjcm9sbEV2ZW50LmRpc3RhbmNlU3RhcnRFbGVtZW50QW5kTW91c2VUb3AsIGRyYWdJdGVtSW5Db250YWluZXJWaXJ0dWFsU2Nyb2xsRXZlbnQuZHJhZ0JvdW5kYXJ5LCBkcmFnSXRlbUluQ29udGFpbmVyVmlydHVhbFNjcm9sbEV2ZW50LmVsZW1lbnRDb250YWluZXIpO1xuICAgICAgICBjb25zdCBlbGVtZW50S2VlcENvbnRhaW5lciA9IHJlc3VsdC5lbGVtZW50S2VlcENvbnRhaW5lcjtcbiAgICAgICAgY29uc3QgbGVmdCA9IHJlc3VsdC5jbGllbnRYIC0gZHJhZ0l0ZW1JbkNvbnRhaW5lclZpcnR1YWxTY3JvbGxFdmVudC5kaXN0YW5jZVN0YXJ0RWxlbWVudEFuZE1vdXNlTGVmdDtcbiAgICAgICAgY29uc3QgdG9wID0gcmVzdWx0LmNsaWVudFkgLSBkcmFnSXRlbUluQ29udGFpbmVyVmlydHVhbFNjcm9sbEV2ZW50LmRpc3RhbmNlU3RhcnRFbGVtZW50QW5kTW91c2VUb3A7XG5cbiAgICAgICAgaWYgKGRyYWdJdGVtSW5Db250YWluZXJWaXJ0dWFsU2Nyb2xsRXZlbnQuZHJhZ0JvdW5kYXJ5ICYmIGRyYWdJdGVtSW5Db250YWluZXJWaXJ0dWFsU2Nyb2xsRXZlbnQuZHJhZ0JvdW5kYXJ5QWNjZXB0TW91c2VMZWF2ZUNvbnRhaW5lcikge1xuICAgICAgICAgIGlmIChjbGllbnRYIDwgcmVzdWx0LnZpZXdwb3J0LmxlZnQpIHtcbiAgICAgICAgICAgIG1vdXNlUG9zaXRpb24uY2xpZW50WCA9IHJlc3VsdC52aWV3cG9ydC5sZWZ0O1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoY2xpZW50WCA+IHJlc3VsdC52aWV3cG9ydC53aWR0aCkge1xuICAgICAgICAgICAgbW91c2VQb3NpdGlvbi5jbGllbnRYID0gcmVzdWx0LnZpZXdwb3J0LndpZHRoO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoY2xpZW50WSA8IHJlc3VsdC52aWV3cG9ydC50b3ApIHtcbiAgICAgICAgICAgIG1vdXNlUG9zaXRpb24uY2xpZW50WSA9IHJlc3VsdC52aWV3cG9ydC50b3A7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChjbGllbnRZID4gcmVzdWx0LnZpZXdwb3J0LmhlaWdodCkge1xuICAgICAgICAgICAgbW91c2VQb3NpdGlvbi5jbGllbnRZID0gcmVzdWx0LnZpZXdwb3J0LmhlaWdodDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZHJhZ0l0ZW1JbkNvbnRhaW5lclZpcnR1YWxTY3JvbGxFdmVudC5lbGVtZW50RHJhZy5zdHlsZS5sZWZ0ID0gYCR7bGVmdH1weGA7XG4gICAgICAgIGRyYWdJdGVtSW5Db250YWluZXJWaXJ0dWFsU2Nyb2xsRXZlbnQuZWxlbWVudERyYWcuc3R5bGUudG9wID0gYCR7dG9wfXB4YDtcblxuICAgICAgICB0aGlzLmRyYWdEcm9wU2VydmljZS5PbkRyYWdnaW5nLm5leHQoeyBtb3VzZVBvc2l0aW9uLCBlbGVtZW50RHJhZzogZHJhZ0l0ZW1JbkNvbnRhaW5lclZpcnR1YWxTY3JvbGxFdmVudC5lbGVtZW50RHJhZywgZWxlbWVudEtlZXBDb250YWluZXIsIGl0ZW1EcmFnSW5mbzogdGhpcy5kcmFnRHJvcFNlcnZpY2UuSXRlbURyYWdJbmZvIH0pO1xuICAgICAgfSksIHRha2VVbnRpbCgoZG9jdW1lbnRNb3VzZVVwKSksIHRha2VVbnRpbCh0aGlzLm9uRGVzdHJveSkpLnN1YnNjcmliZSgpO1xuXG4gICAgfSk7XG4gIH1cblxuICAvKiBGVU5DVElPTlMgKi9cblxuICBwcm90ZWN0ZWQgZ2V0Q2xpZW50UG9zaXRpb24oZWxlbWVudDogSFRNTEVsZW1lbnQsIG1vdXNlUG9zaXRpb246IHsgY2xpZW50WDogbnVtYmVyOyBjbGllbnRZOiBudW1iZXI7IH0sIGRpc3RhbmNlU3RhcnRFbGVtZW50QW5kTW91c2VMZWZ0OiBudW1iZXIsIGRpc3RhbmNlU3RhcnRFbGVtZW50QW5kTW91c2VUb3A6IG51bWJlciwgZHJhZ0JvdW5kYXJ5PzogYm9vbGVhbiwgZWxlbWVudENvbnRhaW5lcj86IEhUTUxFbGVtZW50KTogeyBjbGllbnRYOiBudW1iZXI7IGNsaWVudFk6IG51bWJlcjsgZWxlbWVudEtlZXBDb250YWluZXI6IGJvb2xlYW47IHZpZXdwb3J0OiBJQm91bmRpbmdDbGllbnRSZWN0IH0ge1xuICAgIGxldCB2aWV3cG9ydCA9IGdldFZpZXdwb3J0KCkgYXMgSUJvdW5kaW5nQ2xpZW50UmVjdDtcbiAgICBjb25zdCByZWN0RWxlbWVudCA9IGVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgY29uc3QgY29udGFpbmVyQnlJZCA9IHRoaXMuZHJhZ0Ryb3BTZXJ2aWNlLkNvbnRhaW5lcigpLmdldChlbGVtZW50LmdldEF0dHJpYnV0ZSgnZ3JvdXBJRCcpIHx8ICcnKTtcbiAgICBjb25zdCBjb250YWluZXJJdGVtID0gZWxlbWVudENvbnRhaW5lciB8fCBjb250YWluZXJCeUlkPy5lbGVtZW50U2Nyb2xsIHx8IGNvbnRhaW5lckJ5SWQ/LmVsZW1lbnQgfHwgZG9jdW1lbnQuYm9keTtcbiAgICBsZXQgeyBjbGllbnRYLCBjbGllbnRZIH0gPSBtb3VzZVBvc2l0aW9uO1xuXG4gICAgdmlld3BvcnQubGVmdCA9IDA7XG4gICAgdmlld3BvcnQudG9wID0gMDtcbiAgICBpZiAoZHJhZ0JvdW5kYXJ5KSB7XG4gICAgICB2aWV3cG9ydCA9IGNsb25lSUJvdW5kaW5nQ2xpZW50UmVjdChjb250YWluZXJJdGVtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKTtcbiAgICAgIHZpZXdwb3J0LmhlaWdodCA9IHZpZXdwb3J0LnRvcCArIHZpZXdwb3J0LmhlaWdodDtcbiAgICAgIHZpZXdwb3J0LndpZHRoID0gdmlld3BvcnQubGVmdCArIHZpZXdwb3J0LndpZHRoO1xuICAgIH1cbiAgICBsZXQgZWxlbWVudEtlZXBDb250YWluZXIgPSBmYWxzZTtcblxuICAgIGlmIChjbGllbnRYID4gdmlld3BvcnQud2lkdGggJiYgY2xpZW50WSA+IHZpZXdwb3J0LmhlaWdodCB8fCBjbGllbnRYIDwgdmlld3BvcnQubGVmdCAmJiBjbGllbnRZIDwgdmlld3BvcnQudG9wKSB7XG4gICAgICBlbGVtZW50S2VlcENvbnRhaW5lciA9IHRydWU7XG4gICAgfVxuXG4gICAgaWYgKChjbGllbnRYICsgKHJlY3RFbGVtZW50LndpZHRoIC0gZGlzdGFuY2VTdGFydEVsZW1lbnRBbmRNb3VzZUxlZnQpKSA+IHZpZXdwb3J0LndpZHRoKSB7XG4gICAgICBjbGllbnRYIC09IChjbGllbnRYICsgKHJlY3RFbGVtZW50LndpZHRoIC0gZGlzdGFuY2VTdGFydEVsZW1lbnRBbmRNb3VzZUxlZnQpIC0gdmlld3BvcnQud2lkdGgpO1xuICAgIH1cbiAgICBpZiAoKGNsaWVudFkgKyAocmVjdEVsZW1lbnQuaGVpZ2h0IC0gZGlzdGFuY2VTdGFydEVsZW1lbnRBbmRNb3VzZVRvcCkpID4gdmlld3BvcnQuaGVpZ2h0KSB7XG4gICAgICBjbGllbnRZIC09IChjbGllbnRZICsgKHJlY3RFbGVtZW50LmhlaWdodCAtIGRpc3RhbmNlU3RhcnRFbGVtZW50QW5kTW91c2VUb3ApIC0gdmlld3BvcnQuaGVpZ2h0KTtcbiAgICB9XG4gICAgaWYgKChjbGllbnRYIC0gZGlzdGFuY2VTdGFydEVsZW1lbnRBbmRNb3VzZUxlZnQpIDwgKGRyYWdCb3VuZGFyeSAmJiBjb250YWluZXJJdGVtID8gdmlld3BvcnQubGVmdCA6IDApKSB7XG4gICAgICBjbGllbnRYID0gKGRyYWdCb3VuZGFyeSAmJiBjb250YWluZXJJdGVtID8gdmlld3BvcnQubGVmdCA6IDApICsgZGlzdGFuY2VTdGFydEVsZW1lbnRBbmRNb3VzZUxlZnQ7XG4gICAgfVxuICAgIGlmICgoY2xpZW50WSAtIGRpc3RhbmNlU3RhcnRFbGVtZW50QW5kTW91c2VUb3ApIDwgKGRyYWdCb3VuZGFyeSAmJiBjb250YWluZXJJdGVtID8gdmlld3BvcnQudG9wIDogMCkpIHtcbiAgICAgIGNsaWVudFkgPSAoZHJhZ0JvdW5kYXJ5ICYmIGNvbnRhaW5lckl0ZW0gPyB2aWV3cG9ydC50b3AgOiAwKSArIGRpc3RhbmNlU3RhcnRFbGVtZW50QW5kTW91c2VUb3A7XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgY2xpZW50WCwgY2xpZW50WSwgZWxlbWVudEtlZXBDb250YWluZXIsIHZpZXdwb3J0IH07XG4gIH1cblxuICBwcm90ZWN0ZWQgdXBkYXRlTW91c2VFdmVudHNXaGVuTW92ZU92ZXJJZnJhbWUocG9pbnRlckV2ZW50czogJ25vbmUnIHwgJ2F1dG8nKSB7XG4gICAgY29uc3QgZnJhbWVzID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCJpZnJhbWVcIik7XG5cbiAgICBpZiAoIWZyYW1lcz8ubGVuZ3RoKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBmcmFtZXMubGVuZ3RoOyArK2kpIHtcbiAgICAgIGZyYW1lc1tpXS5zdHlsZS5wb2ludGVyRXZlbnRzID0gcG9pbnRlckV2ZW50cztcbiAgICB9XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLm9uRGVzdHJveS5uZXh0KCk7XG4gICAgdGhpcy5vbkRlc3Ryb3kuY29tcGxldGUoKTtcbiAgfVxufSJdfQ==
@@ -0,0 +1,263 @@
1
+ /* eslint-disable @typescript-eslint/no-explicit-any */
2
+ import { Directive, ElementRef, effect, inject, input, output, signal } from "@angular/core";
3
+ import { checkMouseOverInContainer, checkViewInScreen, get, getViewport } from "@libs-ui/utils";
4
+ import { fromEvent, mergeMap, startWith, takeUntil, tap, throttleTime } from "rxjs";
5
+ import { LibsUiDragItemInContainerVirtualScrollDirective } from "./drag-item-in-container-virtual-scroll.directive";
6
+ import * as i0 from "@angular/core";
7
+ export class LibsUiDragItemDirective extends LibsUiDragItemInContainerVirtualScrollDirective {
8
+ /* PROPERTY */
9
+ isDragOver = signal(false);
10
+ isDragging = signal(false);
11
+ /* INPUT */
12
+ //setup 3 field phía dưới nếu đang sử dụng item trong virtual-scroll
13
+ fieldId = input('');
14
+ item = input(undefined);
15
+ itemInContainerVirtualScroll = input();
16
+ //----------------------------------
17
+ throttleTimeHandlerDraggingEvent = input(0, { transform: value => value || 0 });
18
+ ignoreStopEvent = input();
19
+ onlyMouseDownStopEvent = input();
20
+ dragRootElement = input();
21
+ groupName = input('groupDragAndDropDefault', { transform: value => value ?? 'groupDragAndDropDefault' });
22
+ dragBoundary = input();
23
+ dragBoundaryAcceptMouseLeaveContainer = input();
24
+ elementContainer = input();
25
+ zIndex = input(1300, { transform: value => value ?? 1300 });
26
+ disable = input();
27
+ /* OUTPUT */
28
+ outDragStart = output();
29
+ outDragOver = output();
30
+ outDragLeave = output();
31
+ outDragEnd = output();
32
+ outDropped = output();
33
+ /* INJECT */
34
+ elementRef = inject(ElementRef);
35
+ constructor() {
36
+ super();
37
+ effect(() => {
38
+ if (!this.elementRef?.nativeElement) {
39
+ return;
40
+ }
41
+ const element = this.elementRef.nativeElement;
42
+ element.classList.remove(`${this.dragDropService.ClassItemDefine}-disable`);
43
+ if (this.disable() && !element.classList.contains(`${this.dragDropService.ClassItemDefine}-disable`)) {
44
+ element.classList.add(`${this.dragDropService.ClassItemDefine}-disable`);
45
+ }
46
+ });
47
+ }
48
+ ngAfterViewInit() {
49
+ const element = this.elementRef.nativeElement;
50
+ if (this.fieldId()) {
51
+ element.setAttribute('field_id', this.fieldId());
52
+ if (this.item()) {
53
+ element.setAttribute('item_id', get(this.item(), this.fieldId()));
54
+ }
55
+ }
56
+ element.setAttribute('groupName', this.groupName());
57
+ element.classList.add(this.dragDropService.ClassItemDefine);
58
+ this.dragDropService.OnDragging.pipe(throttleTime(this.throttleTimeHandlerDraggingEvent()), takeUntil(this.onDestroy)).subscribe((eventDragging) => {
59
+ if (this.disable() || element.getAttribute('disableDragContainer') || (this.fieldId() && this.item() && eventDragging.elementDrag.getAttribute('item_id') === get(this.item(), this.fieldId()))) {
60
+ return;
61
+ }
62
+ const containerById = this.dragDropService.Container().get(element.getAttribute('groupID') || '');
63
+ if (containerById) {
64
+ if (eventDragging.elementKeepContainer || !this.dragDropService.checkElementOverAcceptElementDrag(containerById.element.getAttribute('groupName'), eventDragging.elementDrag.getAttribute('groupName'), eventDragging.elementDrag.getAttribute('dropToGroupName'))) {
65
+ return;
66
+ }
67
+ }
68
+ if (checkMouseOverInContainer(eventDragging.mousePosition, element) && element !== eventDragging.elementDrag && containerById && checkViewInScreen(containerById.element, element, containerById.elementScroll)) {
69
+ if (this.isDragOver()) {
70
+ return;
71
+ }
72
+ const eventDragOver = { ...eventDragging, elementDragOver: element };
73
+ this.dragDropService.OnDragOver.next(eventDragOver);
74
+ this.outDragOver.emit(eventDragOver);
75
+ this.isDragOver.set(true);
76
+ return;
77
+ }
78
+ if (this.isDragOver()) {
79
+ const eventDragLeave = { ...eventDragging, elementDragLeave: element };
80
+ this.isDragOver.set(false);
81
+ this.dragDropService.OnDragLeave.next(eventDragLeave);
82
+ this.outDragLeave.emit(eventDragLeave);
83
+ }
84
+ });
85
+ this.dragDropService.OnDropContainer.pipe(takeUntil(this.onDestroy)).subscribe((eventDrop) => {
86
+ if (eventDrop.elementDrop !== element) {
87
+ return;
88
+ }
89
+ const dropEvent = { elementDrag: eventDrop.elementDrag, elementDrop: element, itemDragInfo: eventDrop.itemDragInfo };
90
+ this.outDropped.emit(dropEvent);
91
+ });
92
+ const styleTag = document.createElement("style");
93
+ styleTag.textContent = `.libs-ui-drag-drop-item-dragging{cursor:move}`;
94
+ let nodeClone = element;
95
+ let distanceStartElementAndMouseLeft = -1;
96
+ let distanceStartElementAndMouseTop = -1;
97
+ let contextMenu = false;
98
+ const stopEventMouse = (mouseEvent) => {
99
+ if (!this.ignoreStopEvent()) {
100
+ mouseEvent.preventDefault();
101
+ mouseEvent.stopPropagation();
102
+ }
103
+ };
104
+ const updatePositionElementRootAndRemoveNodeClone = () => {
105
+ if (this.dragRootElement()) {
106
+ const containerById = this.dragDropService.Container().get(element.getAttribute('groupID') || '');
107
+ const containerItem = this.elementContainer() || containerById?.elementScroll || containerById?.element || document.body;
108
+ const rectContainer = containerItem.getBoundingClientRect();
109
+ const rectNodeClone = nodeClone.getBoundingClientRect();
110
+ const numberSub = Number((getComputedStyle(containerItem).border.match(/\d+px/gi) || ['0'])[0].replace(/\D+/ig, '')).valueOf();
111
+ element.style.left = (rectNodeClone.left - rectContainer.left - numberSub) + 'px';
112
+ element.style.top = (rectNodeClone.top - rectContainer.top - numberSub) + 'px';
113
+ element.classList.remove('opacity-0');
114
+ }
115
+ distanceStartElementAndMouseLeft = -1;
116
+ distanceStartElementAndMouseTop = -1;
117
+ nodeClone.remove();
118
+ };
119
+ fromEvent(document, 'contextmenu').pipe(tap(() => {
120
+ if (this.isDragging()) {
121
+ updatePositionElementRootAndRemoveNodeClone();
122
+ }
123
+ contextMenu = true;
124
+ }), takeUntil(this.onDestroy)).subscribe();
125
+ const documentMouseUp = fromEvent(document, 'mouseup')
126
+ .pipe(tap((eventMouseup) => {
127
+ this.updateMouseEventsWhenMoveOverIframe('auto');
128
+ this.dragDropService.resetItemClick();
129
+ stopEventMouse(eventMouseup);
130
+ if (this.disable() || element.getAttribute('disableDragContainer') || contextMenu || !this.isDragging()) {
131
+ contextMenu = false;
132
+ return;
133
+ }
134
+ contextMenu = false;
135
+ this.isDragging.set(false);
136
+ element.removeAttribute(this.dragDropService.TargetItemDragFlag);
137
+ if (this.itemInContainerVirtualScroll()) {
138
+ return;
139
+ }
140
+ const mousePosition = { clientX: eventMouseup.clientX, clientY: eventMouseup.clientY };
141
+ if (this.dragBoundary() && this.dragBoundaryAcceptMouseLeaveContainer()) {
142
+ const result = this.getClientPosition(element, mousePosition, distanceStartElementAndMouseLeft, distanceStartElementAndMouseTop, this.dragBoundary(), this.elementContainer());
143
+ mousePosition.clientX = result.clientX;
144
+ mousePosition.clientY = result.clientY;
145
+ }
146
+ const dragEndEvent = { mousePosition, elementDrag: element, itemDragInfo: this.dragDropService.ItemDragInfo };
147
+ this.dragDropService.ItemDragInfo = undefined;
148
+ this.dragDropService.OnDragEnd.next(dragEndEvent);
149
+ this.outDragEnd.emit(dragEndEvent);
150
+ document.body.classList.remove('!select-none');
151
+ nodeClone.classList.remove('libs-ui-drag-drop-item-dragging');
152
+ styleTag.remove();
153
+ updatePositionElementRootAndRemoveNodeClone();
154
+ }), takeUntil(this.onDestroy));
155
+ const elementMouseDown = fromEvent(element, 'mousedown').pipe(tap(eventMousedown => {
156
+ this.dragDropService.ItemClick = element;
157
+ contextMenu = false;
158
+ this.updateMouseEventsWhenMoveOverIframe('none');
159
+ if ((this.disable() || element.getAttribute('disableDragContainer') || !this.isDragging() || this.itemInContainerVirtualScroll()) && !this.onlyMouseDownStopEvent()) {
160
+ return;
161
+ }
162
+ stopEventMouse(eventMousedown);
163
+ }), takeUntil(this.onDestroy));
164
+ const documentMouseMove = fromEvent(document, 'mousemove').pipe(tap((eventMousemove) => stopEventMouse(eventMousemove)), takeUntil((documentMouseUp)), takeUntil(this.onDestroy));
165
+ const drag = elementMouseDown.pipe(mergeMap((mouseEvent) => documentMouseMove.pipe(startWith((mouseEvent)))));
166
+ let ignoreMousedown = false;
167
+ drag.pipe(tap((dragMouseEvent) => {
168
+ const rectElement = element.getBoundingClientRect();
169
+ const viewport = getViewport();
170
+ if (this.disable() || element.getAttribute('disableDragContainer') || !dragMouseEvent.clientX || (!ignoreMousedown && dragMouseEvent.type === 'mousedown' && rectElement.height + rectElement.top >= viewport.height)) {
171
+ return;
172
+ }
173
+ const { clientX, clientY } = dragMouseEvent;
174
+ if (distanceStartElementAndMouseLeft === -1) {
175
+ distanceStartElementAndMouseLeft = clientX - rectElement.left;
176
+ }
177
+ if (distanceStartElementAndMouseTop === -1) {
178
+ distanceStartElementAndMouseTop = clientY - rectElement.top;
179
+ }
180
+ }), takeUntil(this.onDestroy)).subscribe(dragMouseEvent => {
181
+ if (this.dragDropService.ItemClick.filter(item => item !== element).some(item => element.contains(item))) {
182
+ return;
183
+ }
184
+ if (this.disable() || element.getAttribute('disableDragContainer') || !dragMouseEvent.clientX || dragMouseEvent.type === 'mousedown' || contextMenu || (this.itemInContainerVirtualScroll() && this.isDragging())) {
185
+ return;
186
+ }
187
+ ignoreMousedown = true;
188
+ const { clientX, clientY } = dragMouseEvent;
189
+ const mousePosition = { clientX, clientY };
190
+ const rectElement = element.getBoundingClientRect();
191
+ if (!this.isDragging()) {
192
+ this.isDragging.set(true);
193
+ const eventDragStart = { mousePosition, elementDrag: element, itemDragInfo: this.dragDropService.ItemDragInfo };
194
+ element.setAttribute(this.dragDropService.TargetItemDragFlag, 'true');
195
+ this.dragDropService.OnDragStart.next(eventDragStart);
196
+ eventDragStart.itemDragInfo = this.dragDropService.ItemDragInfo;
197
+ this.outDragStart.emit(eventDragStart);
198
+ nodeClone = element.cloneNode(true);
199
+ nodeClone.style.zIndex = `${this.zIndex()}`;
200
+ nodeClone.classList.add('!fixed');
201
+ nodeClone.classList.remove('libs-ui-drag-drop-item-origin-placeholder');
202
+ nodeClone.classList.remove('libs-ui-drag-drop-item-placeholder');
203
+ nodeClone.appendChild(styleTag);
204
+ nodeClone.classList.add('libs-ui-drag-drop-item-dragging');
205
+ nodeClone.style.width = `${rectElement.width}px`;
206
+ nodeClone.style.height = `${rectElement.height}px`;
207
+ nodeClone.style.left = `${-999}px`;
208
+ nodeClone.style.top = `${-999}px`;
209
+ document.body.classList.add('!select-none');
210
+ document.body.append(nodeClone);
211
+ if (this.dragRootElement()) {
212
+ element.classList.add('opacity-0');
213
+ }
214
+ if (this.itemInContainerVirtualScroll()) {
215
+ this.dragDropService.OnDragItemInContainerVirtualScroll.next({
216
+ itemDragInfo: this.dragDropService.ItemDragInfo,
217
+ elementDrag: nodeClone,
218
+ distanceStartElementAndMouseTop,
219
+ distanceStartElementAndMouseLeft,
220
+ elementContainer: this.elementContainer(),
221
+ dragBoundary: this.dragBoundary(),
222
+ dragBoundaryAcceptMouseLeaveContainer: this.dragBoundaryAcceptMouseLeaveContainer(),
223
+ ignoreStopEvent: this.ignoreStopEvent()
224
+ });
225
+ return;
226
+ }
227
+ }
228
+ const result = this.getClientPosition(nodeClone, mousePosition, distanceStartElementAndMouseLeft, distanceStartElementAndMouseTop, this.dragBoundary(), this.elementContainer());
229
+ const elementKeepContainer = result.elementKeepContainer;
230
+ const left = result.clientX - distanceStartElementAndMouseLeft;
231
+ const top = result.clientY - distanceStartElementAndMouseTop;
232
+ if (this.dragBoundary() && this.dragBoundaryAcceptMouseLeaveContainer()) {
233
+ if (clientX < result.viewport.left) {
234
+ mousePosition.clientX = result.viewport.left;
235
+ }
236
+ if (clientX > result.viewport.width) {
237
+ mousePosition.clientX = result.viewport.width;
238
+ }
239
+ if (clientY < result.viewport.top) {
240
+ mousePosition.clientY = result.viewport.top;
241
+ }
242
+ if (clientY > result.viewport.height) {
243
+ mousePosition.clientY = result.viewport.height;
244
+ }
245
+ }
246
+ nodeClone.style.left = `${left}px`;
247
+ nodeClone.style.top = `${top}px`;
248
+ const eventDragging = { mousePosition, elementDrag: nodeClone, elementKeepContainer, itemDragInfo: this.dragDropService.ItemDragInfo };
249
+ this.dragDropService.OnDragging.next(eventDragging);
250
+ });
251
+ }
252
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: LibsUiDragItemDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
253
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "18.2.13", type: LibsUiDragItemDirective, isStandalone: true, selector: "[LibsUiDragItemDirective]", inputs: { fieldId: { classPropertyName: "fieldId", publicName: "fieldId", isSignal: true, isRequired: false, transformFunction: null }, item: { classPropertyName: "item", publicName: "item", isSignal: true, isRequired: false, transformFunction: null }, itemInContainerVirtualScroll: { classPropertyName: "itemInContainerVirtualScroll", publicName: "itemInContainerVirtualScroll", isSignal: true, isRequired: false, transformFunction: null }, throttleTimeHandlerDraggingEvent: { classPropertyName: "throttleTimeHandlerDraggingEvent", publicName: "throttleTimeHandlerDraggingEvent", isSignal: true, isRequired: false, transformFunction: null }, ignoreStopEvent: { classPropertyName: "ignoreStopEvent", publicName: "ignoreStopEvent", isSignal: true, isRequired: false, transformFunction: null }, onlyMouseDownStopEvent: { classPropertyName: "onlyMouseDownStopEvent", publicName: "onlyMouseDownStopEvent", isSignal: true, isRequired: false, transformFunction: null }, dragRootElement: { classPropertyName: "dragRootElement", publicName: "dragRootElement", isSignal: true, isRequired: false, transformFunction: null }, groupName: { classPropertyName: "groupName", publicName: "groupName", isSignal: true, isRequired: false, transformFunction: null }, dragBoundary: { classPropertyName: "dragBoundary", publicName: "dragBoundary", isSignal: true, isRequired: false, transformFunction: null }, dragBoundaryAcceptMouseLeaveContainer: { classPropertyName: "dragBoundaryAcceptMouseLeaveContainer", publicName: "dragBoundaryAcceptMouseLeaveContainer", isSignal: true, isRequired: false, transformFunction: null }, elementContainer: { classPropertyName: "elementContainer", publicName: "elementContainer", isSignal: true, isRequired: false, transformFunction: null }, zIndex: { classPropertyName: "zIndex", publicName: "zIndex", isSignal: true, isRequired: false, transformFunction: null }, disable: { classPropertyName: "disable", publicName: "disable", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { outDragStart: "outDragStart", outDragOver: "outDragOver", outDragLeave: "outDragLeave", outDragEnd: "outDragEnd", outDropped: "outDropped" }, usesInheritance: true, ngImport: i0 });
254
+ }
255
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: LibsUiDragItemDirective, decorators: [{
256
+ type: Directive,
257
+ args: [{
258
+ // eslint-disable-next-line @angular-eslint/directive-selector
259
+ selector: "[LibsUiDragItemDirective]",
260
+ standalone: true
261
+ }]
262
+ }], ctorParameters: () => [] });
263
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJhZy1pdGVtLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL2xpYnMtdWkvY29tcG9uZW50cy9kcmFnLWRyb3Avc3JjL2RyYWctaXRlbS5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsdURBQXVEO0FBQ3ZELE9BQU8sRUFBaUIsU0FBUyxFQUFFLFVBQVUsRUFBYSxNQUFNLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRXZILE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxpQkFBaUIsRUFBRSxHQUFHLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDaEcsT0FBTyxFQUFjLFNBQVMsRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsWUFBWSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ2hHLE9BQU8sRUFBRSwrQ0FBK0MsRUFBRSxNQUFNLG1EQUFtRCxDQUFDOztBQVFwSCxNQUFNLE9BQU8sdUJBQXdCLFNBQVEsK0NBQStDO0lBQzFGLGNBQWM7SUFDTixVQUFVLEdBQUcsTUFBTSxDQUFVLEtBQUssQ0FBQyxDQUFDO0lBQ3BDLFVBQVUsR0FBRyxNQUFNLENBQVUsS0FBSyxDQUFDLENBQUM7SUFFNUMsV0FBVztJQUNYLHFFQUFxRTtJQUM1RCxPQUFPLEdBQUcsS0FBSyxDQUFTLEVBQUUsQ0FBQyxDQUFDO0lBQzVCLElBQUksR0FBRyxLQUFLLENBQU0sU0FBUyxDQUFDLENBQUM7SUFDN0IsNEJBQTRCLEdBQUcsS0FBSyxFQUFXLENBQUM7SUFDekQsb0NBQW9DO0lBQzNCLGdDQUFnQyxHQUFHLEtBQUssQ0FBNkIsQ0FBQyxFQUFFLEVBQUUsU0FBUyxFQUFFLEtBQUssQ0FBQyxFQUFFLENBQUMsS0FBSyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDNUcsZUFBZSxHQUFHLEtBQUss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QUFDLGVBQWUsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQ3RELENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzt3R0FwU1UsdUJBQXVCOzRGQUF2Qix1QkFBdUI7OzRGQUF2Qix1QkFBdUI7a0JBTG5DLFNBQVM7bUJBQUM7b0JBQ1QsOERBQThEO29CQUM5RCxRQUFRLEVBQUUsMkJBQTJCO29CQUNyQyxVQUFVLEVBQUUsSUFBSTtpQkFDakIiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55ICovXG5pbXBvcnQgeyBBZnRlclZpZXdJbml0LCBEaXJlY3RpdmUsIEVsZW1lbnRSZWYsIE9uRGVzdHJveSwgZWZmZWN0LCBpbmplY3QsIGlucHV0LCBvdXRwdXQsIHNpZ25hbCB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5pbXBvcnQgeyBJQm91bmRpbmdDbGllbnRSZWN0IH0gZnJvbSBcIkBsaWJzLXVpL2ludGVyZmFjZXMtdHlwZXNcIjtcbmltcG9ydCB7IGNoZWNrTW91c2VPdmVySW5Db250YWluZXIsIGNoZWNrVmlld0luU2NyZWVuLCBnZXQsIGdldFZpZXdwb3J0IH0gZnJvbSBcIkBsaWJzLXVpL3V0aWxzXCI7XG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBmcm9tRXZlbnQsIG1lcmdlTWFwLCBzdGFydFdpdGgsIHRha2VVbnRpbCwgdGFwLCB0aHJvdHRsZVRpbWUgfSBmcm9tIFwicnhqc1wiO1xuaW1wb3J0IHsgTGlic1VpRHJhZ0l0ZW1JbkNvbnRhaW5lclZpcnR1YWxTY3JvbGxEaXJlY3RpdmUgfSBmcm9tIFwiLi9kcmFnLWl0ZW0taW4tY29udGFpbmVyLXZpcnR1YWwtc2Nyb2xsLmRpcmVjdGl2ZVwiO1xuaW1wb3J0IHsgSURyYWdFbmQsIElEcmFnTGVhdmUsIElEcmFnT3ZlciwgSURyYWdTdGFydCwgSURyb3AgfSBmcm9tIFwiLi9pbnRlcmZhY2VzL2V2ZW50LmludGVyZmFjZVwiO1xuXG5ARGlyZWN0aXZlKHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBhbmd1bGFyLWVzbGludC9kaXJlY3RpdmUtc2VsZWN0b3JcbiAgc2VsZWN0b3I6IFwiW0xpYnNVaURyYWdJdGVtRGlyZWN0aXZlXVwiLFxuICBzdGFuZGFsb25lOiB0cnVlXG59KVxuZXhwb3J0IGNsYXNzIExpYnNVaURyYWdJdGVtRGlyZWN0aXZlIGV4dGVuZHMgTGlic1VpRHJhZ0l0ZW1JbkNvbnRhaW5lclZpcnR1YWxTY3JvbGxEaXJlY3RpdmUgaW1wbGVtZW50cyBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3kge1xuICAvKiBQUk9QRVJUWSAqL1xuICBwcml2YXRlIGlzRHJhZ092ZXIgPSBzaWduYWw8Ym9vbGVhbj4oZmFsc2UpO1xuICBwcml2YXRlIGlzRHJhZ2dpbmcgPSBzaWduYWw8Ym9vbGVhbj4oZmFsc2UpO1xuXG4gIC8qIElOUFVUICovXG4gIC8vc2V0dXAgMyBmaWVsZCBwaMOtYSBkxrDhu5tpIG7hur91IMSRYW5nIHPhu60gZOG7pW5nIGl0ZW0gdHJvbmcgdmlydHVhbC1zY3JvbGwgXG4gIHJlYWRvbmx5IGZpZWxkSWQgPSBpbnB1dDxzdHJpbmc+KCcnKTtcbiAgcmVhZG9ubHkgaXRlbSA9IGlucHV0PGFueT4odW5kZWZpbmVkKTtcbiAgcmVhZG9ubHkgaXRlbUluQ29udGFpbmVyVmlydHVhbFNjcm9sbCA9IGlucHV0PGJvb2xlYW4+KCk7XG4gIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICByZWFkb25seSB0aHJvdHRsZVRpbWVIYW5kbGVyRHJhZ2dpbmdFdmVudCA9IGlucHV0PG51bWJlciwgbnVtYmVyIHwgdW5kZWZpbmVkPigwLCB7IHRyYW5zZm9ybTogdmFsdWUgPT4gdmFsdWUgfHwgMCB9KTtcbiAgcmVhZG9ubHkgaWdub3JlU3RvcEV2ZW50ID0gaW5wdXQ8Ym9vbGVhbj4oKTtcbiAgcmVhZG9ubHkgb25seU1vdXNlRG93blN0b3BFdmVudCA9IGlucHV0PGJvb2xlYW4+KCk7XG4gIHJlYWRvbmx5IGRyYWdSb290RWxlbWVudCA9IGlucHV0PGJvb2xlYW4+KCk7XG4gIHJlYWRvbmx5IGdyb3VwTmFtZSA9IGlucHV0PHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPignZ3JvdXBEcmFnQW5kRHJvcERlZmF1bHQnLCB7IHRyYW5zZm9ybTogdmFsdWUgPT4gdmFsdWUgPz8gJ2dyb3VwRHJhZ0FuZERyb3BEZWZhdWx0JyB9KTtcbiAgcmVhZG9ubHkgZHJhZ0JvdW5kYXJ5ID0gaW5wdXQ8Ym9vbGVhbj4oKTtcbiAgcmVhZG9ubHkgZHJhZ0JvdW5kYXJ5QWNjZXB0TW91c2VMZWF2ZUNvbnRhaW5lciA9IGlucHV0PGJvb2xlYW4+KCk7XG4gIHJlYWRvbmx5IGVsZW1lbnRDb250YWluZXIgPSBpbnB1dDxIVE1MRWxlbWVudD4oKTtcbiAgcmVhZG9ubHkgekluZGV4ID0gaW5wdXQ8bnVtYmVyLCBudW1iZXIgfCB1bmRlZmluZWQ+KDEzMDAsIHsgdHJhbnNmb3JtOiB2YWx1ZSA9PiB2YWx1ZSA/PyAxMzAwIH0pO1xuICByZWFkb25seSBkaXNhYmxlID0gaW5wdXQ8Ym9vbGVhbj4oKTtcblxuICAvKiBPVVRQVVQgKi9cbiAgcmVhZG9ubHkgb3V0RHJhZ1N0YXJ0ID0gb3V0cHV0PElEcmFnU3RhcnQ+KCk7XG4gIHJlYWRvbmx5IG91dERyYWdPdmVyID0gb3V0cHV0PElEcmFnT3Zlcj4oKTtcbiAgcmVhZG9ubHkgb3V0RHJhZ0xlYXZlID0gb3V0cHV0PElEcmFnTGVhdmU+KCk7XG4gIHJlYWRvbmx5IG91dERyYWdFbmQgPSBvdXRwdXQ8SURyYWdFbmQ+KCk7XG4gIHJlYWRvbmx5IG91dERyb3BwZWQgPSBvdXRwdXQ8SURyb3A+KCk7XG5cbiAgLyogSU5KRUNUICovXG4gIHByaXZhdGUgZWxlbWVudFJlZiA9IGluamVjdChFbGVtZW50UmVmKTtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICAgIGVmZmVjdCgoKSA9PiB7XG4gICAgICBpZiAoIXRoaXMuZWxlbWVudFJlZj8ubmF0aXZlRWxlbWVudCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQgYXMgSFRNTEVsZW1lbnQ7XG5cbiAgICAgIGVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZShgJHt0aGlzLmRyYWdEcm9wU2VydmljZS5DbGFzc0l0ZW1EZWZpbmV9LWRpc2FibGVgKTtcbiAgICAgIGlmICh0aGlzLmRpc2FibGUoKSAmJiAhZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoYCR7dGhpcy5kcmFnRHJvcFNlcnZpY2UuQ2xhc3NJdGVtRGVmaW5lfS1kaXNhYmxlYCkpIHtcbiAgICAgICAgZWxlbWVudC5jbGFzc0xpc3QuYWRkKGAke3RoaXMuZHJhZ0Ryb3BTZXJ2aWNlLkNsYXNzSXRlbURlZmluZX0tZGlzYWJsZWApO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgb3ZlcnJpZGUgbmdBZnRlclZpZXdJbml0KCkge1xuICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCBhcyBIVE1MRWxlbWVudDtcbiAgICBpZiAodGhpcy5maWVsZElkKCkpIHtcbiAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKCdmaWVsZF9pZCcsIHRoaXMuZmllbGRJZCgpKTtcbiAgICAgIGlmICh0aGlzLml0ZW0oKSkge1xuICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZSgnaXRlbV9pZCcsIGdldCh0aGlzLml0ZW0oKSwgdGhpcy5maWVsZElkKCkpKTtcbiAgICAgIH1cbiAgICB9XG4gICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2dyb3VwTmFtZScsIHRoaXMuZ3JvdXBOYW1lKCkpO1xuICAgIGVsZW1lbnQuY2xhc3NMaXN0LmFkZCh0aGlzLmRyYWdEcm9wU2VydmljZS5DbGFzc0l0ZW1EZWZpbmUpO1xuICAgIHRoaXMuZHJhZ0Ryb3BTZXJ2aWNlLk9uRHJhZ2dpbmcucGlwZSh0aHJvdHRsZVRpbWUodGhpcy50aHJvdHRsZVRpbWVIYW5kbGVyRHJhZ2dpbmdFdmVudCgpKSwgdGFrZVVudGlsKHRoaXMub25EZXN0cm95KSkuc3Vic2NyaWJlKChldmVudERyYWdnaW5nKSA9PiB7XG4gICAgICBpZiAodGhpcy5kaXNhYmxlKCkgfHwgZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2Rpc2FibGVEcmFnQ29udGFpbmVyJykgfHwgKHRoaXMuZmllbGRJZCgpICYmIHRoaXMuaXRlbSgpICYmIGV2ZW50RHJhZ2dpbmcuZWxlbWVudERyYWcuZ2V0QXR0cmlidXRlKCdpdGVtX2lkJykgPT09IGdldCh0aGlzLml0ZW0oKSwgdGhpcy5maWVsZElkKCkpKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCBjb250YWluZXJCeUlkID0gdGhpcy5kcmFnRHJvcFNlcnZpY2UuQ29udGFpbmVyKCkuZ2V0KGVsZW1lbnQuZ2V0QXR0cmlidXRlKCdncm91cElEJykgfHwgJycpO1xuXG4gICAgICBpZiAoY29udGFpbmVyQnlJZCkge1xuICAgICAgICBpZiAoZXZlbnREcmFnZ2luZy5lbGVtZW50S2VlcENvbnRhaW5lciB8fCAhdGhpcy5kcmFnRHJvcFNlcnZpY2UuY2hlY2tFbGVtZW50T3ZlckFjY2VwdEVsZW1lbnREcmFnKGNvbnRhaW5lckJ5SWQuZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2dyb3VwTmFtZScpLCBldmVudERyYWdnaW5nLmVsZW1lbnREcmFnLmdldEF0dHJpYnV0ZSgnZ3JvdXBOYW1lJyksIGV2ZW50RHJhZ2dpbmcuZWxlbWVudERyYWcuZ2V0QXR0cmlidXRlKCdkcm9wVG9Hcm91cE5hbWUnKSkpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChjaGVja01vdXNlT3ZlckluQ29udGFpbmVyKGV2ZW50RHJhZ2dpbmcubW91c2VQb3NpdGlvbiwgZWxlbWVudCkgJiYgZWxlbWVudCAhPT0gZXZlbnREcmFnZ2luZy5lbGVtZW50RHJhZyAmJiBjb250YWluZXJCeUlkICYmIGNoZWNrVmlld0luU2NyZWVuKGNvbnRhaW5lckJ5SWQuZWxlbWVudCwgZWxlbWVudCwgY29udGFpbmVyQnlJZC5lbGVtZW50U2Nyb2xsKSkge1xuICAgICAgICBpZiAodGhpcy5pc0RyYWdPdmVyKCkpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZXZlbnREcmFnT3ZlciA9IHsgLi4uZXZlbnREcmFnZ2luZywgZWxlbWVudERyYWdPdmVyOiBlbGVtZW50IH07XG5cbiAgICAgICAgdGhpcy5kcmFnRHJvcFNlcnZpY2UuT25EcmFnT3Zlci5uZXh0KGV2ZW50RHJhZ092ZXIpO1xuICAgICAgICB0aGlzLm91dERyYWdPdmVyLmVtaXQoZXZlbnREcmFnT3Zlcik7XG4gICAgICAgIHRoaXMuaXNEcmFnT3Zlci5zZXQodHJ1ZSk7XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5pc0RyYWdPdmVyKCkpIHtcbiAgICAgICAgY29uc3QgZXZlbnREcmFnTGVhdmUgPSB7IC4uLmV2ZW50RHJhZ2dpbmcsIGVsZW1lbnREcmFnTGVhdmU6IGVsZW1lbnQgfTtcbiAgICAgICAgdGhpcy5pc0RyYWdPdmVyLnNldChmYWxzZSk7XG4gICAgICAgIHRoaXMuZHJhZ0Ryb3BTZXJ2aWNlLk9uRHJhZ0xlYXZlLm5leHQoZXZlbnREcmFnTGVhdmUpO1xuICAgICAgICB0aGlzLm91dERyYWdMZWF2ZS5lbWl0KGV2ZW50RHJhZ0xlYXZlKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHRoaXMuZHJhZ0Ryb3BTZXJ2aWNlLk9uRHJvcENvbnRhaW5lci5waXBlKHRha2VVbnRpbCh0aGlzLm9uRGVzdHJveSkpLnN1YnNjcmliZSgoZXZlbnREcm9wKSA9PiB7XG4gICAgICBpZiAoZXZlbnREcm9wLmVsZW1lbnREcm9wICE9PSBlbGVtZW50KSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGRyb3BFdmVudCA9IHsgZWxlbWVudERyYWc6IGV2ZW50RHJvcC5lbGVtZW50RHJhZywgZWxlbWVudERyb3A6IGVsZW1lbnQsIGl0ZW1EcmFnSW5mbzogZXZlbnREcm9wLml0ZW1EcmFnSW5mbyB9O1xuXG4gICAgICB0aGlzLm91dERyb3BwZWQuZW1pdChkcm9wRXZlbnQpO1xuICAgIH0pO1xuICAgIGNvbnN0IHN0eWxlVGFnID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInN0eWxlXCIpO1xuXG4gICAgc3R5bGVUYWcudGV4dENvbnRlbnQgPSBgLmxpYnMtdWktZHJhZy1kcm9wLWl0ZW0tZHJhZ2dpbmd7Y3Vyc29yOm1vdmV9YDtcbiAgICBsZXQgbm9kZUNsb25lID0gZWxlbWVudDtcbiAgICBsZXQgZGlzdGFuY2VTdGFydEVsZW1lbnRBbmRNb3VzZUxlZnQgPSAtMTtcbiAgICBsZXQgZGlzdGFuY2VTdGFydEVsZW1lbnRBbmRNb3VzZVRvcCA9IC0xO1xuICAgIGxldCBjb250ZXh0TWVudSA9IGZhbHNlO1xuICAgIGNvbnN0IHN0b3BFdmVudE1vdXNlID0gKG1vdXNlRXZlbnQ6IE1vdXNlRXZlbnQpID0+IHtcbiAgICAgIGlmICghdGhpcy5pZ25vcmVTdG9wRXZlbnQoKSkge1xuICAgICAgICBtb3VzZUV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIG1vdXNlRXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICB9XG4gICAgfTtcbiAgICBjb25zdCB1cGRhdGVQb3NpdGlvbkVsZW1lbnRSb290QW5kUmVtb3ZlTm9kZUNsb25lID0gKCkgPT4ge1xuICAgICAgaWYgKHRoaXMuZHJhZ1Jvb3RFbGVtZW50KCkpIHtcbiAgICAgICAgY29uc3QgY29udGFpbmVyQnlJZCA9IHRoaXMuZHJhZ0Ryb3BTZXJ2aWNlLkNvbnRhaW5lcigpLmdldChlbGVtZW50LmdldEF0dHJpYnV0ZSgnZ3JvdXBJRCcpIHx8ICcnKTtcblxuICAgICAgICBjb25zdCBjb250YWluZXJJdGVtID0gdGhpcy5lbGVtZW50Q29udGFpbmVyKCkgfHwgY29udGFpbmVyQnlJZD8uZWxlbWVudFNjcm9sbCB8fCBjb250YWluZXJCeUlkPy5lbGVtZW50IHx8IGRvY3VtZW50LmJvZHk7XG4gICAgICAgIGNvbnN0IHJlY3RDb250YWluZXIgPSBjb250YWluZXJJdGVtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICBjb25zdCByZWN0Tm9kZUNsb25lID0gbm9kZUNsb25lLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICBjb25zdCBudW1iZXJTdWIgPSBOdW1iZXIoKGdldENvbXB1dGVkU3R5bGUoY29udGFpbmVySXRlbSkuYm9yZGVyLm1hdGNoKC9cXGQrcHgvZ2kpIHx8IFsnMCddKVswXS5yZXBsYWNlKC9cXEQrL2lnLCAnJykpLnZhbHVlT2YoKTtcblxuICAgICAgICBlbGVtZW50LnN0eWxlLmxlZnQgPSAocmVjdE5vZGVDbG9uZS5sZWZ0IC0gcmVjdENvbnRhaW5lci5sZWZ0IC0gbnVtYmVyU3ViKSArICdweCc7XG4gICAgICAgIGVsZW1lbnQuc3R5bGUudG9wID0gKHJlY3ROb2RlQ2xvbmUudG9wIC0gcmVjdENvbnRhaW5lci50b3AgLSBudW1iZXJTdWIpICsgJ3B4JztcbiAgICAgICAgZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKCdvcGFjaXR5LTAnKTtcbiAgICAgIH1cbiAgICAgIGRpc3RhbmNlU3RhcnRFbGVtZW50QW5kTW91c2VMZWZ0ID0gLTE7XG4gICAgICBkaXN0YW5jZVN0YXJ0RWxlbWVudEFuZE1vdXNlVG9wID0gLTE7XG4gICAgICBub2RlQ2xvbmUucmVtb3ZlKCk7XG4gICAgfTtcblxuICAgIGZyb21FdmVudChkb2N1bWVudCwgJ2NvbnRleHRtZW51JykucGlwZShcbiAgICAgIHRhcCgoKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLmlzRHJhZ2dpbmcoKSkge1xuICAgICAgICAgIHVwZGF0ZVBvc2l0aW9uRWxlbWVudFJvb3RBbmRSZW1vdmVOb2RlQ2xvbmUoKTtcbiAgICAgICAgfVxuICAgICAgICBjb250ZXh0TWVudSA9IHRydWU7XG5cbiAgICAgIH0pLFxuICAgICAgdGFrZVVudGlsKHRoaXMub25EZXN0cm95KVxuICAgICkuc3Vic2NyaWJlKCk7XG5cbiAgICBjb25zdCBkb2N1bWVudE1vdXNlVXAgPSBmcm9tRXZlbnQ8TW91c2VFdmVudD4oZG9jdW1lbnQsICdtb3VzZXVwJylcbiAgICAgIC5waXBlKFxuICAgICAgICB0YXAoKGV2ZW50TW91c2V1cCkgPT4ge1xuICAgICAgICAgIHRoaXMudXBkYXRlTW91c2VFdmVudHNXaGVuTW92ZU92ZXJJZnJhbWUoJ2F1dG8nKTtcbiAgICAgICAgICB0aGlzLmRyYWdEcm9wU2VydmljZS5yZXNldEl0ZW1DbGljaygpO1xuICAgICAgICAgIHN0b3BFdmVudE1vdXNlKGV2ZW50TW91c2V1cCk7XG4gICAgICAgICAgaWYgKHRoaXMuZGlzYWJsZSgpIHx8IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCdkaXNhYmxlRHJhZ0NvbnRhaW5lcicpIHx8IGNvbnRleHRNZW51IHx8ICF0aGlzLmlzRHJhZ2dpbmcoKSkge1xuICAgICAgICAgICAgY29udGV4dE1lbnUgPSBmYWxzZTtcblxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb250ZXh0TWVudSA9IGZhbHNlO1xuICAgICAgICAgIHRoaXMuaXNEcmFnZ2luZy5zZXQoZmFsc2UpO1xuICAgICAgICAgIGVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKHRoaXMuZHJhZ0Ryb3BTZXJ2aWNlLlRhcmdldEl0ZW1EcmFnRmxhZyk7XG4gICAgICAgICAgaWYgKHRoaXMuaXRlbUluQ29udGFpbmVyVmlydHVhbFNjcm9sbCgpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IG1vdXNlUG9zaXRpb24gPSB7IGNsaWVudFg6IGV2ZW50TW91c2V1cC5jbGllbnRYLCBjbGllbnRZOiBldmVudE1vdXNldXAuY2xpZW50WSB9O1xuXG4gICAgICAgICAgaWYgKHRoaXMuZHJhZ0JvdW5kYXJ5KCkgJiYgdGhpcy5kcmFnQm91bmRhcnlBY2NlcHRNb3VzZUxlYXZlQ29udGFpbmVyKCkpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuZ2V0Q2xpZW50UG9zaXRpb24oZWxlbWVudCwgbW91c2VQb3NpdGlvbiwgZGlzdGFuY2VTdGFydEVsZW1lbnRBbmRNb3VzZUxlZnQsIGRpc3RhbmNlU3RhcnRFbGVtZW50QW5kTW91c2VUb3AsIHRoaXMuZHJhZ0JvdW5kYXJ5KCksIHRoaXMuZWxlbWVudENvbnRhaW5lcigpKTtcblxuICAgICAgICAgICAgbW91c2VQb3NpdGlvbi5jbGllbnRYID0gcmVzdWx0LmNsaWVudFg7XG4gICAgICAgICAgICBtb3VzZVBvc2l0aW9uLmNsaWVudFkgPSByZXN1bHQuY2xpZW50WTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgZHJhZ0VuZEV2ZW50ID0geyBtb3VzZVBvc2l0aW9uLCBlbGVtZW50RHJhZzogZWxlbWVudCwgaXRlbURyYWdJbmZvOiB0aGlzLmRyYWdEcm9wU2VydmljZS5JdGVtRHJhZ0luZm8gfTtcblxuICAgICAgICAgIHRoaXMuZHJhZ0Ryb3BTZXJ2aWNlLkl0ZW1EcmFnSW5mbyA9IHVuZGVmaW5lZDtcbiAgICAgICAgICB0aGlzLmRyYWdEcm9wU2VydmljZS5PbkRyYWdFbmQubmV4dChkcmFnRW5kRXZlbnQpO1xuICAgICAgICAgIHRoaXMub3V0RHJhZ0VuZC5lbWl0KGRyYWdFbmRFdmVudCk7XG5cbiAgICAgICAgICBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5yZW1vdmUoJyFzZWxlY3Qtbm9uZScpO1xuICAgICAgICAgIG5vZGVDbG9uZS5jbGFzc0xpc3QucmVtb3ZlKCdsaWJzLXVpLWRyYWctZHJvcC1pdGVtLWRyYWdnaW5nJyk7XG4gICAgICAgICAgc3R5bGVUYWcucmVtb3ZlKCk7XG5cbiAgICAgICAgICB1cGRhdGVQb3NpdGlvbkVsZW1lbnRSb290QW5kUmVtb3ZlTm9kZUNsb25lKCk7XG4gICAgICAgIH0pLFxuICAgICAgICB0YWtlVW50aWwodGhpcy5vbkRlc3Ryb3kpXG4gICAgICApO1xuXG4gICAgY29uc3QgZWxlbWVudE1vdXNlRG93biA9IGZyb21FdmVudDxNb3VzZUV2ZW50PihlbGVtZW50LCAnbW91c2Vkb3duJykucGlwZShcbiAgICAgIHRhcChldmVudE1vdXNlZG93biA9PiB7XG4gICAgICAgIHRoaXMuZHJhZ0Ryb3BTZXJ2aWNlLkl0ZW1DbGljayA9IGVsZW1lbnQ7XG4gICAgICAgIGNvbnRleHRNZW51ID0gZmFsc2U7XG4gICAgICAgIHRoaXMudXBkYXRlTW91c2VFdmVudHNXaGVuTW92ZU92ZXJJZnJhbWUoJ25vbmUnKTtcbiAgICAgICAgaWYgKCh0aGlzLmRpc2FibGUoKSB8fCBlbGVtZW50LmdldEF0dHJpYnV0ZSgnZGlzYWJsZURyYWdDb250YWluZXInKSB8fCAhdGhpcy5pc0RyYWdnaW5nKCkgfHwgdGhpcy5pdGVtSW5Db250YWluZXJWaXJ0dWFsU2Nyb2xsKCkpICYmICF0aGlzLm9ubHlNb3VzZURvd25TdG9wRXZlbnQoKSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBzdG9wRXZlbnRNb3VzZShldmVudE1vdXNlZG93bik7XG4gICAgICB9KSxcbiAgICAgIHRha2VVbnRpbCh0aGlzLm9uRGVzdHJveSlcbiAgICApO1xuICAgIGNvbnN0IGRvY3VtZW50TW91c2VNb3ZlID0gZnJvbUV2ZW50PE1vdXNlRXZlbnQ+KGRvY3VtZW50LCAnbW91c2Vtb3ZlJykucGlwZSh0YXAoKGV2ZW50TW91c2Vtb3ZlKSA9PiBzdG9wRXZlbnRNb3VzZShldmVudE1vdXNlbW92ZSkpLCB0YWtlVW50aWwoKGRvY3VtZW50TW91c2VVcCkpLCB0YWtlVW50aWwodGhpcy5vbkRlc3Ryb3kpKTtcbiAgICBjb25zdCBkcmFnID0gZWxlbWVudE1vdXNlRG93bi5waXBlKG1lcmdlTWFwKChtb3VzZUV2ZW50OiBNb3VzZUV2ZW50KSA9PiBkb2N1bWVudE1vdXNlTW92ZS5waXBlKHN0YXJ0V2l0aCgobW91c2VFdmVudCkpKSkpIGFzIE9ic2VydmFibGU8TW91c2VFdmVudD47XG4gICAgbGV0IGlnbm9yZU1vdXNlZG93biA9IGZhbHNlO1xuXG4gICAgZHJhZy5waXBlKHRhcCgoZHJhZ01vdXNlRXZlbnQ6IE1vdXNlRXZlbnQpID0+IHtcbiAgICAgIGNvbnN0IHJlY3RFbGVtZW50ID0gZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgIGNvbnN0IHZpZXdwb3J0ID0gZ2V0Vmlld3BvcnQoKSBhcyBJQm91bmRpbmdDbGllbnRSZWN0O1xuXG4gICAgICBpZiAodGhpcy5kaXNhYmxlKCkgfHwgZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2Rpc2FibGVEcmFnQ29udGFpbmVyJykgfHwgIWRyYWdNb3VzZUV2ZW50LmNsaWVudFggfHwgKCFpZ25vcmVNb3VzZWRvd24gJiYgZHJhZ01vdXNlRXZlbnQudHlwZSA9PT0gJ21vdXNlZG93bicgJiYgcmVjdEVsZW1lbnQuaGVpZ2h0ICsgcmVjdEVsZW1lbnQudG9wID49IHZpZXdwb3J0LmhlaWdodCkpIHtcblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCB7IGNsaWVudFgsIGNsaWVudFkgfSA9IGRyYWdNb3VzZUV2ZW50O1xuXG4gICAgICBpZiAoZGlzdGFuY2VTdGFydEVsZW1lbnRBbmRNb3VzZUxlZnQgPT09IC0xKSB7XG4gICAgICAgIGRpc3RhbmNlU3RhcnRFbGVtZW50QW5kTW91c2VMZWZ0ID0gY2xpZW50WCAtIHJlY3RFbGVtZW50LmxlZnQ7XG4gICAgICB9XG5cbiAgICAgIGlmIChkaXN0YW5jZVN0YXJ0RWxlbWVudEFuZE1vdXNlVG9wID09PSAtMSkge1xuICAgICAgICBkaXN0YW5jZVN0YXJ0RWxlbWVudEFuZE1vdXNlVG9wID0gY2xpZW50WSAtIHJlY3RFbGVtZW50LnRvcDtcbiAgICAgIH1cbiAgICB9KSwgdGFrZVVudGlsKHRoaXMub25EZXN0cm95KSkuc3Vic2NyaWJlKGRyYWdNb3VzZUV2ZW50ID0+IHtcbiAgICAgIGlmICh0aGlzLmRyYWdEcm9wU2VydmljZS5JdGVtQ2xpY2suZmlsdGVyKGl0ZW0gPT4gaXRlbSAhPT0gZWxlbWVudCkuc29tZShpdGVtID0+IGVsZW1lbnQuY29udGFpbnMoaXRlbSkpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmRpc2FibGUoKSB8fCBlbGVtZW50LmdldEF0dHJpYnV0ZSgnZGlzYWJsZURyYWdDb250YWluZXInKSB8fCAhZHJhZ01vdXNlRXZlbnQuY2xpZW50WCB8fCBkcmFnTW91c2VFdmVudC50eXBlID09PSAnbW91c2Vkb3duJyB8fCBjb250ZXh0TWVudSB8fCAodGhpcy5pdGVtSW5Db250YWluZXJWaXJ0dWFsU2Nyb2xsKCkgJiYgdGhpcy5pc0RyYWdnaW5nKCkpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlnbm9yZU1vdXNlZG93biA9IHRydWU7XG4gICAgICBjb25zdCB7IGNsaWVudFgsIGNsaWVudFkgfSA9IGRyYWdNb3VzZUV2ZW50O1xuICAgICAgY29uc3QgbW91c2VQb3NpdGlvbiA9IHsgY2xpZW50WCwgY2xpZW50WSB9O1xuICAgICAgY29uc3QgcmVjdEVsZW1lbnQgPSBlbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXG4gICAgICBpZiAoIXRoaXMuaXNEcmFnZ2luZygpKSB7XG4gICAgICAgIHRoaXMuaXNEcmFnZ2luZy5zZXQodHJ1ZSk7XG4gICAgICAgIGNvbnN0IGV2ZW50RHJhZ1N0YXJ0ID0geyBtb3VzZVBvc2l0aW9uLCBlbGVtZW50RHJhZzogZWxlbWVudCwgaXRlbURyYWdJbmZvOiB0aGlzLmRyYWdEcm9wU2VydmljZS5JdGVtRHJhZ0luZm8gfTtcblxuICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZSh0aGlzLmRyYWdEcm9wU2VydmljZS5UYXJnZXRJdGVtRHJhZ0ZsYWcsICd0cnVlJyk7XG4gICAgICAgIHRoaXMuZHJhZ0Ryb3BTZXJ2aWNlLk9uRHJhZ1N0YXJ0Lm5leHQoZXZlbnREcmFnU3RhcnQpO1xuICAgICAgICBldmVudERyYWdTdGFydC5pdGVtRHJhZ0luZm8gPSB0aGlzLmRyYWdEcm9wU2VydmljZS5JdGVtRHJhZ0luZm87XG4gICAgICAgIHRoaXMub3V0RHJhZ1N0YXJ0LmVtaXQoZXZlbnREcmFnU3RhcnQpO1xuXG4gICAgICAgIG5vZGVDbG9uZSA9IGVsZW1lbnQuY2xvbmVOb2RlKHRydWUpIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICBub2RlQ2xvbmUuc3R5bGUuekluZGV4ID0gYCR7dGhpcy56SW5kZXgoKX1gO1xuICAgICAgICBub2RlQ2xvbmUuY2xhc3NMaXN0LmFkZCgnIWZpeGVkJyk7XG4gICAgICAgIG5vZGVDbG9uZS5jbGFzc0xpc3QucmVtb3ZlKCdsaWJzLXVpLWRyYWctZHJvcC1pdGVtLW9yaWdpbi1wbGFjZWhvbGRlcicpO1xuICAgICAgICBub2RlQ2xvbmUuY2xhc3NMaXN0LnJlbW92ZSgnbGlicy11aS1kcmFnLWRyb3AtaXRlbS1wbGFjZWhvbGRlcicpO1xuICAgICAgICBub2RlQ2xvbmUuYXBwZW5kQ2hpbGQoc3R5bGVUYWcpO1xuICAgICAgICBub2RlQ2xvbmUuY2xhc3NMaXN0LmFkZCgnbGlicy11aS1kcmFnLWRyb3AtaXRlbS1kcmFnZ2luZycpO1xuICAgICAgICBub2RlQ2xvbmUuc3R5bGUud2lkdGggPSBgJHtyZWN0RWxlbWVudC53aWR0aH1weGA7XG4gICAgICAgIG5vZGVDbG9uZS5zdHlsZS5oZWlnaHQgPSBgJHtyZWN0RWxlbWVudC5oZWlnaHR9cHhgO1xuICAgICAgICBub2RlQ2xvbmUuc3R5bGUubGVmdCA9IGAkey05OTl9cHhgO1xuICAgICAgICBub2RlQ2xvbmUuc3R5bGUudG9wID0gYCR7LTk5OX1weGA7XG4gICAgICAgIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LmFkZCgnIXNlbGVjdC1ub25lJyk7XG4gICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kKG5vZGVDbG9uZSk7XG4gICAgICAgIGlmICh0aGlzLmRyYWdSb290RWxlbWVudCgpKSB7XG4gICAgICAgICAgZWxlbWVudC5jbGFzc0xpc3QuYWRkKCdvcGFjaXR5LTAnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLml0ZW1JbkNvbnRhaW5lclZpcnR1YWxTY3JvbGwoKSkge1xuICAgICAgICAgIHRoaXMuZHJhZ0Ryb3BTZXJ2aWNlLk9uRHJhZ0l0ZW1JbkNvbnRhaW5lclZpcnR1YWxTY3JvbGwubmV4dCh7XG4gICAgICAgICAgICBpdGVtRHJhZ0luZm86IHRoaXMuZHJhZ0Ryb3BTZXJ2aWNlLkl0ZW1EcmFnSW5mbyxcbiAgICAgICAgICAgIGVsZW1lbnREcmFnOiBub2RlQ2xvbmUsXG4gICAgICAgICAgICBkaXN0YW5jZVN0YXJ0RWxlbWVudEFuZE1vdXNlVG9wLFxuICAgICAgICAgICAgZGlzdGFuY2VTdGFydEVsZW1lbnRBbmRNb3VzZUxlZnQsXG4gICAgICAgICAgICBlbGVtZW50Q29udGFpbmVyOiB0aGlzLmVsZW1lbnRDb250YWluZXIoKSxcbiAgICAgICAgICAgIGRyYWdCb3VuZGFyeTogdGhpcy5kcmFnQm91bmRhcnkoKSxcbiAgICAgICAgICAgIGRyYWdCb3VuZGFyeUFjY2VwdE1vdXNlTGVhdmVDb250YWluZXI6IHRoaXMuZHJhZ0JvdW5kYXJ5QWNjZXB0TW91c2VMZWF2ZUNvbnRhaW5lcigpLFxuICAgICAgICAgICAgaWdub3JlU3RvcEV2ZW50OiB0aGlzLmlnbm9yZVN0b3BFdmVudCgpXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuZ2V0Q2xpZW50UG9zaXRpb24obm9kZUNsb25lLCBtb3VzZVBvc2l0aW9uLCBkaXN0YW5jZVN0YXJ0RWxlbWVudEFuZE1vdXNlTGVmdCwgZGlzdGFuY2VTdGFydEVsZW1lbnRBbmRNb3VzZVRvcCwgdGhpcy5kcmFnQm91bmRhcnkoKSwgdGhpcy5lbGVtZW50Q29udGFpbmVyKCkpO1xuXG4gICAgICBjb25zdCBlbGVtZW50S2VlcENvbnRhaW5lciA9IHJlc3VsdC5lbGVtZW50S2VlcENvbnRhaW5lcjtcbiAgICAgIGNvbnN0IGxlZnQgPSByZXN1bHQuY2xpZW50WCAtIGRpc3RhbmNlU3RhcnRFbGVtZW50QW5kTW91c2VMZWZ0O1xuICAgICAgY29uc3QgdG9wID0gcmVzdWx0LmNsaWVudFkgLSBkaXN0YW5jZVN0YXJ0RWxlbWVudEFuZE1vdXNlVG9wO1xuXG4gICAgICBpZiAodGhpcy5kcmFnQm91bmRhcnkoKSAmJiB0aGlzLmRyYWdCb3VuZGFyeUFjY2VwdE1vdXNlTGVhdmVDb250YWluZXIoKSkge1xuICAgICAgICBpZiAoY2xpZW50WCA8IHJlc3VsdC52aWV3cG9ydC5sZWZ0KSB7XG4gICAgICAgICAgbW91c2VQb3NpdGlvbi5jbGllbnRYID0gcmVzdWx0LnZpZXdwb3J0LmxlZnQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNsaWVudFggPiByZXN1bHQudmlld3BvcnQud2lkdGgpIHtcbiAgICAgICAgICBtb3VzZVBvc2l0aW9uLmNsaWVudFggPSByZXN1bHQudmlld3BvcnQud2lkdGg7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNsaWVudFkgPCByZXN1bHQudmlld3BvcnQudG9wKSB7XG4gICAgICAgICAgbW91c2VQb3NpdGlvbi5jbGllbnRZID0gcmVzdWx0LnZpZXdwb3J0LnRvcDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY2xpZW50WSA+IHJlc3VsdC52aWV3cG9ydC5oZWlnaHQpIHtcbiAgICAgICAgICBtb3VzZVBvc2l0aW9uLmNsaWVudFkgPSByZXN1bHQudmlld3BvcnQuaGVpZ2h0O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBub2RlQ2xvbmUuc3R5bGUubGVmdCA9IGAke2xlZnR9cHhgO1xuICAgICAgbm9kZUNsb25lLnN0eWxlLnRvcCA9IGAke3RvcH1weGA7XG5cbiAgICAgIGNvbnN0IGV2ZW50RHJhZ2dpbmcgPSB7IG1vdXNlUG9zaXRpb24sIGVsZW1lbnREcmFnOiBub2RlQ2xvbmUsIGVsZW1lbnRLZWVwQ29udGFpbmVyLCBpdGVtRHJhZ0luZm86IHRoaXMuZHJhZ0Ryb3BTZXJ2aWNlLkl0ZW1EcmFnSW5mbyB9O1xuXG4gICAgICB0aGlzLmRyYWdEcm9wU2VydmljZS5PbkRyYWdnaW5nLm5leHQoZXZlbnREcmFnZ2luZyk7XG4gICAgfSk7XG4gIH1cbn0iXX0=