ngx-drag-drop 2.0.0 → 13.0.0
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.
- package/README.md +2 -35
- package/esm2020/lib/dnd-draggable.directive.mjs +192 -0
- package/esm2020/lib/dnd-dropzone.directive.mjs +277 -0
- package/esm2020/lib/dnd-handle.directive.mjs +30 -0
- package/esm2020/lib/dnd-state.mjs +71 -0
- package/esm2020/lib/dnd-types.mjs +2 -0
- package/esm2020/lib/dnd-utils.mjs +114 -0
- package/esm2020/lib/dnd.module.mjs +44 -0
- package/esm2020/ngx-drag-drop.mjs +5 -0
- package/esm2020/public-api.mjs +9 -0
- package/fesm2015/ngx-drag-drop.mjs +726 -0
- package/fesm2015/ngx-drag-drop.mjs.map +1 -0
- package/{fesm2015/ngx-drag-drop.js → fesm2020/ngx-drag-drop.mjs} +206 -442
- package/fesm2020/ngx-drag-drop.mjs.map +1 -0
- package/{dnd-draggable.directive.d.ts → lib/dnd-draggable.directive.d.ts} +7 -2
- package/{dnd-dropzone.directive.d.ts → lib/dnd-dropzone.directive.d.ts} +8 -3
- package/{dnd-handle.directive.d.ts → lib/dnd-handle.directive.d.ts} +3 -0
- package/{dnd-state.d.ts → lib/dnd-state.d.ts} +0 -0
- package/{dnd-types.d.ts → lib/dnd-types.d.ts} +0 -0
- package/{dnd-utils.d.ts → lib/dnd-utils.d.ts} +0 -0
- package/lib/dnd.module.d.ts +10 -0
- package/ngx-drag-drop.d.ts +2 -1
- package/package.json +24 -54
- package/public-api.d.ts +6 -0
- package/LICENSE +0 -29
- package/bundles/ngx-drag-drop.umd.js +0 -1056
- package/bundles/ngx-drag-drop.umd.js.map +0 -1
- package/bundles/ngx-drag-drop.umd.min.js +0 -2
- package/bundles/ngx-drag-drop.umd.min.js.map +0 -1
- package/dnd.module.d.ts +0 -2
- package/esm2015/dnd-draggable.directive.js +0 -314
- package/esm2015/dnd-dropzone.directive.js +0 -446
- package/esm2015/dnd-handle.directive.js +0 -40
- package/esm2015/dnd-state.js +0 -116
- package/esm2015/dnd-types.js +0 -5
- package/esm2015/dnd-utils.js +0 -199
- package/esm2015/dnd.module.js +0 -33
- package/esm2015/ngx-drag-drop.js +0 -9
- package/esm2015/public_api.js +0 -10
- package/esm5/dnd-draggable.directive.js +0 -351
- package/esm5/dnd-dropzone.directive.js +0 -500
- package/esm5/dnd-handle.directive.js +0 -43
- package/esm5/dnd-state.js +0 -116
- package/esm5/dnd-types.js +0 -5
- package/esm5/dnd-utils.js +0 -199
- package/esm5/dnd.module.js +0 -37
- package/esm5/ngx-drag-drop.js +0 -9
- package/esm5/public_api.js +0 -10
- package/fesm2015/ngx-drag-drop.js.map +0 -1
- package/fesm5/ngx-drag-drop.js +0 -1052
- package/fesm5/ngx-drag-drop.js.map +0 -1
- package/ngx-drag-drop.metadata.json +0 -1
- package/public_api.d.ts +0 -6
package/README.md
CHANGED
|
@@ -318,8 +318,8 @@ https://github.com/timruffles/mobile-drag-drop
|
|
|
318
318
|
### Firefox
|
|
319
319
|
|
|
320
320
|
* Beware that Firefox does not support dragging on `<button>` elements.
|
|
321
|
-
* `<button [dndDraggable]>` and `<button [dndHandler]>` won't work.
|
|
322
|
-
* See https://bugzilla.mozilla.org/show_bug.cgi?id=568313
|
|
321
|
+
* `<button [dndDraggable]>` and `<button [dndHandler]>` won't work.
|
|
322
|
+
* See https://bugzilla.mozilla.org/show_bug.cgi?id=568313
|
|
323
323
|
|
|
324
324
|
|
|
325
325
|
## Why?
|
|
@@ -329,36 +329,3 @@ HTML Drag-And-Drop API implementations are not behaving the same way across brow
|
|
|
329
329
|
The directives contained in this module enable declarative drag and drop that "just works" across browsers in a consistent way.
|
|
330
330
|
|
|
331
331
|
Credits go to the author and contributors of [angular-drag-drop-lists](https://github.com/marceljuenemann/angular-drag-and-drop-lists).
|
|
332
|
-
|
|
333
|
-
## Maintenance
|
|
334
|
-
|
|
335
|
-
This project was generated with [Angular CLI](https://github.com/angular/angular-cli).
|
|
336
|
-
|
|
337
|
-
For the library build it uses [ng-packagr](https://github.com/dherges/ng-packagr).
|
|
338
|
-
|
|
339
|
-
#### Edit Library
|
|
340
|
-
|
|
341
|
-
* edit lib code
|
|
342
|
-
* run `npm start` (currently needs to be re-run on every lib code change)
|
|
343
|
-
|
|
344
|
-
#### Release Library
|
|
345
|
-
|
|
346
|
-
* assure correct version is set in `package.json`
|
|
347
|
-
* build library with `npm run build:lib`
|
|
348
|
-
* publish library with `npm run publish:stable` (use `npm run publish:next` for pre-releases)
|
|
349
|
-
|
|
350
|
-
#### Release Docs
|
|
351
|
-
|
|
352
|
-
* build docs site with `npm run build:docs`
|
|
353
|
-
* commit and push changes in `docs` to `master`
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
---
|
|
357
|
-
|
|
358
|
-
<p align="center">
|
|
359
|
-
Made with :heart: &
|
|
360
|
-
<a href="https://www.jetbrains.com/?from=ngx-drag-drop">
|
|
361
|
-
<img align="center" alt="jetbrains" src="jetbrains.svg" width="120px" />
|
|
362
|
-
</a>
|
|
363
|
-
& :coffee:
|
|
364
|
-
</p>
|
|
@@ -0,0 +1,192 @@
|
|
|
1
|
+
import { Directive, EventEmitter, HostBinding, HostListener, Input, Output } from "@angular/core";
|
|
2
|
+
import { calculateDragImageOffset, setDragData, setDragImage } from "./dnd-utils";
|
|
3
|
+
import { dndState, endDrag, startDrag } from "./dnd-state";
|
|
4
|
+
import * as i0 from "@angular/core";
|
|
5
|
+
export class DndDragImageRefDirective {
|
|
6
|
+
constructor(parent, elementRef) {
|
|
7
|
+
parent.registerDragImage(elementRef);
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
DndDragImageRefDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: DndDragImageRefDirective, deps: [{ token: DndDraggableDirective }, { token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Directive });
|
|
11
|
+
DndDragImageRefDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "13.1.1", type: DndDragImageRefDirective, selector: "[dndDragImageRef]", ngImport: i0 });
|
|
12
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: DndDragImageRefDirective, decorators: [{
|
|
13
|
+
type: Directive,
|
|
14
|
+
args: [{
|
|
15
|
+
selector: "[dndDragImageRef]"
|
|
16
|
+
}]
|
|
17
|
+
}], ctorParameters: function () { return [{ type: DndDraggableDirective }, { type: i0.ElementRef }]; } });
|
|
18
|
+
export class DndDraggableDirective {
|
|
19
|
+
constructor(elementRef, renderer, ngZone) {
|
|
20
|
+
this.elementRef = elementRef;
|
|
21
|
+
this.renderer = renderer;
|
|
22
|
+
this.ngZone = ngZone;
|
|
23
|
+
this.dndEffectAllowed = "copy";
|
|
24
|
+
this.dndDraggingClass = "dndDragging";
|
|
25
|
+
this.dndDraggingSourceClass = "dndDraggingSource";
|
|
26
|
+
this.dndDraggableDisabledClass = "dndDraggableDisabled";
|
|
27
|
+
this.dndDragImageOffsetFunction = calculateDragImageOffset;
|
|
28
|
+
this.dndStart = new EventEmitter();
|
|
29
|
+
this.dndDrag = new EventEmitter();
|
|
30
|
+
this.dndEnd = new EventEmitter();
|
|
31
|
+
this.dndMoved = new EventEmitter();
|
|
32
|
+
this.dndCopied = new EventEmitter();
|
|
33
|
+
this.dndLinked = new EventEmitter();
|
|
34
|
+
this.dndCanceled = new EventEmitter();
|
|
35
|
+
this.draggable = true;
|
|
36
|
+
this.isDragStarted = false;
|
|
37
|
+
this.dragEventHandler = (event) => this.onDrag(event);
|
|
38
|
+
}
|
|
39
|
+
set dndDisableIf(value) {
|
|
40
|
+
this.draggable = !value;
|
|
41
|
+
if (this.draggable) {
|
|
42
|
+
this.renderer.removeClass(this.elementRef.nativeElement, this.dndDraggableDisabledClass);
|
|
43
|
+
}
|
|
44
|
+
else {
|
|
45
|
+
this.renderer.addClass(this.elementRef.nativeElement, this.dndDraggableDisabledClass);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
set dndDisableDragIf(value) {
|
|
49
|
+
this.dndDisableIf = value;
|
|
50
|
+
}
|
|
51
|
+
ngAfterViewInit() {
|
|
52
|
+
this.ngZone.runOutsideAngular(() => {
|
|
53
|
+
this.elementRef.nativeElement.addEventListener("drag", this.dragEventHandler);
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
ngOnDestroy() {
|
|
57
|
+
this.elementRef.nativeElement.removeEventListener("drag", this.dragEventHandler);
|
|
58
|
+
if (this.isDragStarted === true) {
|
|
59
|
+
endDrag();
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
onDragStart(event) {
|
|
63
|
+
if (this.draggable === false) {
|
|
64
|
+
return false;
|
|
65
|
+
}
|
|
66
|
+
// check if there is dnd handle and if the dnd handle was used to start the drag
|
|
67
|
+
if (typeof this.dndHandle !== "undefined"
|
|
68
|
+
&& typeof event._dndUsingHandle === "undefined") {
|
|
69
|
+
return false;
|
|
70
|
+
}
|
|
71
|
+
// initialize global state
|
|
72
|
+
startDrag(event, this.dndEffectAllowed, this.dndType);
|
|
73
|
+
this.isDragStarted = true;
|
|
74
|
+
setDragData(event, { data: this.dndDraggable, type: this.dndType }, dndState.effectAllowed);
|
|
75
|
+
this.dragImage = this.determineDragImage();
|
|
76
|
+
// set dragging css class prior to setDragImage so styles are applied before
|
|
77
|
+
// TODO breaking change: add class to elementRef rather than drag image which could be another element
|
|
78
|
+
this.renderer.addClass(this.dragImage, this.dndDraggingClass);
|
|
79
|
+
// set custom dragimage if present
|
|
80
|
+
// set dragimage if drag is started from dndHandle
|
|
81
|
+
if (typeof this.dndDragImageElementRef !== "undefined"
|
|
82
|
+
|| typeof event._dndUsingHandle !== "undefined") {
|
|
83
|
+
setDragImage(event, this.dragImage, this.dndDragImageOffsetFunction);
|
|
84
|
+
}
|
|
85
|
+
// add dragging source css class on first drag event
|
|
86
|
+
const unregister = this.renderer.listen(this.elementRef.nativeElement, "drag", () => {
|
|
87
|
+
this.renderer.addClass(this.elementRef.nativeElement, this.dndDraggingSourceClass);
|
|
88
|
+
unregister();
|
|
89
|
+
});
|
|
90
|
+
this.dndStart.emit(event);
|
|
91
|
+
event.stopPropagation();
|
|
92
|
+
return true;
|
|
93
|
+
}
|
|
94
|
+
onDrag(event) {
|
|
95
|
+
this.dndDrag.emit(event);
|
|
96
|
+
}
|
|
97
|
+
onDragEnd(event) {
|
|
98
|
+
// get drop effect from custom stored state as its not reliable across browsers
|
|
99
|
+
const dropEffect = dndState.dropEffect;
|
|
100
|
+
let dropEffectEmitter;
|
|
101
|
+
switch (dropEffect) {
|
|
102
|
+
case "copy":
|
|
103
|
+
dropEffectEmitter = this.dndCopied;
|
|
104
|
+
break;
|
|
105
|
+
case "link":
|
|
106
|
+
dropEffectEmitter = this.dndLinked;
|
|
107
|
+
break;
|
|
108
|
+
case "move":
|
|
109
|
+
dropEffectEmitter = this.dndMoved;
|
|
110
|
+
break;
|
|
111
|
+
default:
|
|
112
|
+
dropEffectEmitter = this.dndCanceled;
|
|
113
|
+
break;
|
|
114
|
+
}
|
|
115
|
+
dropEffectEmitter.emit(event);
|
|
116
|
+
this.dndEnd.emit(event);
|
|
117
|
+
// reset global state
|
|
118
|
+
endDrag();
|
|
119
|
+
this.isDragStarted = false;
|
|
120
|
+
this.renderer.removeClass(this.dragImage, this.dndDraggingClass);
|
|
121
|
+
// IE9 special hammering
|
|
122
|
+
window.setTimeout(() => {
|
|
123
|
+
this.renderer.removeClass(this.elementRef.nativeElement, this.dndDraggingSourceClass);
|
|
124
|
+
}, 0);
|
|
125
|
+
event.stopPropagation();
|
|
126
|
+
}
|
|
127
|
+
registerDragHandle(handle) {
|
|
128
|
+
this.dndHandle = handle;
|
|
129
|
+
}
|
|
130
|
+
registerDragImage(elementRef) {
|
|
131
|
+
this.dndDragImageElementRef = elementRef;
|
|
132
|
+
}
|
|
133
|
+
determineDragImage() {
|
|
134
|
+
// evaluate custom drag image existence
|
|
135
|
+
if (typeof this.dndDragImageElementRef !== "undefined") {
|
|
136
|
+
return this.dndDragImageElementRef.nativeElement;
|
|
137
|
+
}
|
|
138
|
+
else {
|
|
139
|
+
return this.elementRef.nativeElement;
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
DndDraggableDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: DndDraggableDirective, deps: [{ token: i0.ElementRef }, { token: i0.Renderer2 }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Directive });
|
|
144
|
+
DndDraggableDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "13.1.1", type: DndDraggableDirective, selector: "[dndDraggable]", inputs: { dndDraggable: "dndDraggable", dndEffectAllowed: "dndEffectAllowed", dndType: "dndType", dndDraggingClass: "dndDraggingClass", dndDraggingSourceClass: "dndDraggingSourceClass", dndDraggableDisabledClass: "dndDraggableDisabledClass", dndDragImageOffsetFunction: "dndDragImageOffsetFunction", dndDisableIf: "dndDisableIf", dndDisableDragIf: "dndDisableDragIf" }, outputs: { dndStart: "dndStart", dndDrag: "dndDrag", dndEnd: "dndEnd", dndMoved: "dndMoved", dndCopied: "dndCopied", dndLinked: "dndLinked", dndCanceled: "dndCanceled" }, host: { listeners: { "dragstart": "onDragStart($event)", "dragend": "onDragEnd($event)" }, properties: { "attr.draggable": "this.draggable" } }, ngImport: i0 });
|
|
145
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: DndDraggableDirective, decorators: [{
|
|
146
|
+
type: Directive,
|
|
147
|
+
args: [{
|
|
148
|
+
selector: "[dndDraggable]"
|
|
149
|
+
}]
|
|
150
|
+
}], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.Renderer2 }, { type: i0.NgZone }]; }, propDecorators: { dndDraggable: [{
|
|
151
|
+
type: Input
|
|
152
|
+
}], dndEffectAllowed: [{
|
|
153
|
+
type: Input
|
|
154
|
+
}], dndType: [{
|
|
155
|
+
type: Input
|
|
156
|
+
}], dndDraggingClass: [{
|
|
157
|
+
type: Input
|
|
158
|
+
}], dndDraggingSourceClass: [{
|
|
159
|
+
type: Input
|
|
160
|
+
}], dndDraggableDisabledClass: [{
|
|
161
|
+
type: Input
|
|
162
|
+
}], dndDragImageOffsetFunction: [{
|
|
163
|
+
type: Input
|
|
164
|
+
}], dndStart: [{
|
|
165
|
+
type: Output
|
|
166
|
+
}], dndDrag: [{
|
|
167
|
+
type: Output
|
|
168
|
+
}], dndEnd: [{
|
|
169
|
+
type: Output
|
|
170
|
+
}], dndMoved: [{
|
|
171
|
+
type: Output
|
|
172
|
+
}], dndCopied: [{
|
|
173
|
+
type: Output
|
|
174
|
+
}], dndLinked: [{
|
|
175
|
+
type: Output
|
|
176
|
+
}], dndCanceled: [{
|
|
177
|
+
type: Output
|
|
178
|
+
}], draggable: [{
|
|
179
|
+
type: HostBinding,
|
|
180
|
+
args: ["attr.draggable"]
|
|
181
|
+
}], dndDisableIf: [{
|
|
182
|
+
type: Input
|
|
183
|
+
}], dndDisableDragIf: [{
|
|
184
|
+
type: Input
|
|
185
|
+
}], onDragStart: [{
|
|
186
|
+
type: HostListener,
|
|
187
|
+
args: ["dragstart", ["$event"]]
|
|
188
|
+
}], onDragEnd: [{
|
|
189
|
+
type: HostListener,
|
|
190
|
+
args: ["dragend", ["$event"]]
|
|
191
|
+
}] } });
|
|
192
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG5kLWRyYWdnYWJsZS5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9kbmQvc3JjL2xpYi9kbmQtZHJhZ2dhYmxlLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBRUwsU0FBUyxFQUVULFlBQVksRUFDWixXQUFXLEVBQ1gsWUFBWSxFQUNaLEtBQUssRUFHTCxNQUFNLEVBRVAsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLHdCQUF3QixFQUF3QyxXQUFXLEVBQUUsWUFBWSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBRXhILE9BQU8sRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGFBQWEsQ0FBQzs7QUFNM0QsTUFBTSxPQUFPLHdCQUF3QjtJQUVuQyxZQUFhLE1BQTRCLEVBQzVCLFVBQXFCO1FBRWhDLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBRSxVQUFVLENBQUUsQ0FBQztJQUN6QyxDQUFDOztxSEFOVSx3QkFBd0Isa0JBRWYscUJBQXFCO3lHQUY5Qix3QkFBd0I7MkZBQXhCLHdCQUF3QjtrQkFIcEMsU0FBUzttQkFBRTtvQkFDVixRQUFRLEVBQUUsbUJBQW1CO2lCQUM5QjswREFHcUIscUJBQXFCO0FBVTNDLE1BQU0sT0FBTyxxQkFBcUI7SUE2RWhDLFlBQXFCLFVBQXFCLEVBQ3JCLFFBQWtCLEVBQ2xCLE1BQWE7UUFGYixlQUFVLEdBQVYsVUFBVSxDQUFXO1FBQ3JCLGFBQVEsR0FBUixRQUFRLENBQVU7UUFDbEIsV0FBTSxHQUFOLE1BQU0sQ0FBTztRQXpFbEMscUJBQWdCLEdBQWlCLE1BQU0sQ0FBQztRQU14QyxxQkFBZ0IsR0FBRyxhQUFhLENBQUM7UUFHakMsMkJBQXNCLEdBQUcsbUJBQW1CLENBQUM7UUFHN0MsOEJBQXlCLEdBQUcsc0JBQXNCLENBQUM7UUFHbkQsK0JBQTBCLEdBQThCLHdCQUF3QixDQUFDO1FBR3hFLGFB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Z0JBQWdCO2lCQUMzQjs4SUFJQyxZQUFZO3NCQURYLEtBQUs7Z0JBSU4sZ0JBQWdCO3NCQURmLEtBQUs7Z0JBSU4sT0FBTztzQkFETixLQUFLO2dCQUlOLGdCQUFnQjtzQkFEZixLQUFLO2dCQUlOLHNCQUFzQjtzQkFEckIsS0FBSztnQkFJTix5QkFBeUI7c0JBRHhCLEtBQUs7Z0JBSU4sMEJBQTBCO3NCQUR6QixLQUFLO2dCQUlHLFFBQVE7c0JBRGhCLE1BQU07Z0JBSUUsT0FBTztzQkFEZixNQUFNO2dCQUlFLE1BQU07c0JBRGQsTUFBTTtnQkFJRSxRQUFRO3NCQURoQixNQUFNO2dCQUlFLFNBQVM7c0JBRGpCLE1BQU07Z0JBSUUsU0FBUztzQkFEakIsTUFBTTtnQkFJRSxXQUFXO3NCQURuQixNQUFNO2dCQUlQLFNBQVM7c0JBRFIsV0FBVzt1QkFBRSxnQkFBZ0I7Z0JBYzFCLFlBQVk7c0JBRGYsS0FBSztnQkFnQkYsZ0JBQWdCO3NCQURuQixLQUFLO2dCQXdCTixXQUFXO3NCQURWLFlBQVk7dUJBQUUsV0FBVyxFQUFFLENBQUUsUUFBUSxDQUFFO2dCQXVEeEMsU0FBUztzQkFEUixZQUFZO3VCQUFFLFNBQVMsRUFBRSxDQUFFLFFBQVEsQ0FBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEFmdGVyVmlld0luaXQsXG4gIERpcmVjdGl2ZSxcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBIb3N0QmluZGluZyxcbiAgSG9zdExpc3RlbmVyLFxuICBJbnB1dCxcbiAgTmdab25lLFxuICBPbkRlc3Ryb3ksXG4gIE91dHB1dCxcbiAgUmVuZGVyZXIyXG59IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5pbXBvcnQgeyBjYWxjdWxhdGVEcmFnSW1hZ2VPZmZzZXQsIERuZERyYWdJbWFnZU9mZnNldEZ1bmN0aW9uLCBEbmRFdmVudCwgc2V0RHJhZ0RhdGEsIHNldERyYWdJbWFnZSB9IGZyb20gXCIuL2RuZC11dGlsc1wiO1xuaW1wb3J0IHsgRG5kSGFuZGxlRGlyZWN0aXZlIH0gZnJvbSBcIi4vZG5kLWhhbmRsZS5kaXJlY3RpdmVcIjtcbmltcG9ydCB7IGRuZFN0YXRlLCBlbmREcmFnLCBzdGFydERyYWcgfSBmcm9tIFwiLi9kbmQtc3RhdGVcIjtcbmltcG9ydCB7IEVmZmVjdEFsbG93ZWQgfSBmcm9tIFwiLi9kbmQtdHlwZXNcIjtcblxuQERpcmVjdGl2ZSgge1xuICBzZWxlY3RvcjogXCJbZG5kRHJhZ0ltYWdlUmVmXVwiXG59IClcbmV4cG9ydCBjbGFzcyBEbmREcmFnSW1hZ2VSZWZEaXJlY3RpdmUge1xuXG4gIGNvbnN0cnVjdG9yKCBwYXJlbnQ6RG5kRHJhZ2dhYmxlRGlyZWN0aXZlLFxuICAgICAgICAgICAgICAgZWxlbWVudFJlZjpFbGVtZW50UmVmICkge1xuXG4gICAgcGFyZW50LnJlZ2lzdGVyRHJhZ0ltYWdlKCBlbGVtZW50UmVmICk7XG4gIH1cbn1cblxuQERpcmVjdGl2ZSgge1xuICBzZWxlY3RvcjogXCJbZG5kRHJhZ2dhYmxlXVwiXG59IClcbmV4cG9ydCBjbGFzcyBEbmREcmFnZ2FibGVEaXJlY3RpdmUgaW1wbGVtZW50cyBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3kge1xuXG4gIEBJbnB1dCgpXG4gIGRuZERyYWdnYWJsZTphbnk7XG5cbiAgQElucHV0KClcbiAgZG5kRWZmZWN0QWxsb3dlZDpFZmZlY3RBbGxvd2VkID0gXCJjb3B5XCI7XG5cbiAgQElucHV0KClcbiAgZG5kVHlwZT86c3RyaW5nO1xuXG4gIEBJbnB1dCgpXG4gIGRuZERyYWdnaW5nQ2xhc3MgPSBcImRuZERyYWdnaW5nXCI7XG5cbiAgQElucHV0KClcbiAgZG5kRHJhZ2dpbmdTb3VyY2VDbGFzcyA9IFwiZG5kRHJhZ2dpbmdTb3VyY2VcIjtcblxuICBASW5wdXQoKVxuICBkbmREcmFnZ2FibGVEaXNhYmxlZENsYXNzID0gXCJkbmREcmFnZ2FibGVEaXNhYmxlZFwiO1xuXG4gIEBJbnB1dCgpXG4gIGRuZERyYWdJbWFnZU9mZnNldEZ1bmN0aW9uOkRuZERyYWdJbWFnZU9mZnNldEZ1bmN0aW9uID0gY2FsY3VsYXRlRHJhZ0ltYWdlT2Zmc2V0O1xuXG4gIEBPdXRwdXQoKVxuICByZWFkb25seSBkbmRTdGFydDpFdmVudEVtaXR0ZXI8RHJhZ0V2ZW50PiA9IG5ldyBFdmVudEVtaXR0ZXI8RHJhZ0V2ZW50PigpO1xuXG4gIEBPdXRwdXQoKVxuICByZWFkb25seSBkbmREcmFnOkV2ZW50RW1pdHRlcjxEcmFnRXZlbnQ+ID0gbmV3IEV2ZW50RW1pdHRlcjxEcmFnRXZlbnQ+KCk7XG5cbiAgQE91dHB1dCgpXG4gIHJlYWRvbmx5IGRuZEVuZDpFdmVudEVtaXR0ZXI8RHJhZ0V2ZW50PiA9IG5ldyBFdmVudEVtaXR0ZXI8RHJhZ0V2ZW50PigpO1xuXG4gIEBPdXRwdXQoKVxuICByZWFkb25seSBkbmRNb3ZlZDpFdmVudEVtaXR0ZXI8RHJhZ0V2ZW50PiA9IG5ldyBFdmVudEVtaXR0ZXI8RHJhZ0V2ZW50PigpO1xuXG4gIEBPdXRwdXQoKVxuICByZWFkb25seSBkbmRDb3BpZWQ6RXZlbnRFbWl0dGVyPERyYWdFdmVudD4gPSBuZXcgRXZlbnRFbWl0dGVyPERyYWdFdmVudD4oKTtcblxuICBAT3V0cHV0KClcbiAgcmVhZG9ubHkgZG5kTGlua2VkOkV2ZW50RW1pdHRlcjxEcmFnRXZlbnQ+ID0gbmV3IEV2ZW50RW1pdHRlcjxEcmFnRXZlbnQ+KCk7XG5cbiAgQE91dHB1dCgpXG4gIHJlYWRvbmx5IGRuZENhbmNlbGVkOkV2ZW50RW1pdHRlcjxEcmFnRXZlbnQ+ID0gbmV3IEV2ZW50RW1pdHRlcjxEcmFnRXZlbnQ+KCk7XG5cbiAgQEhvc3RCaW5kaW5nKCBcImF0dHIuZHJhZ2dhYmxlXCIgKVxuICBkcmFnZ2FibGUgPSB0cnVlO1xuXG4gIHByaXZhdGUgZG5kSGFuZGxlPzpEbmRIYW5kbGVEaXJlY3RpdmU7XG5cbiAgcHJpdmF0ZSBkbmREcmFnSW1hZ2VFbGVtZW50UmVmPzpFbGVtZW50UmVmO1xuXG4gIHByaXZhdGUgZHJhZ0ltYWdlOkVsZW1lbnQgfCB1bmRlZmluZWQ7XG5cbiAgcHJpdmF0ZSBpc0RyYWdTdGFydGVkOmJvb2xlYW4gPSBmYWxzZTtcblxuICBwcml2YXRlIHJlYWRvbmx5IGRyYWdFdmVudEhhbmRsZXI6KCBldmVudDpEcmFnRXZlbnQgKSA9PiB2b2lkID0gKCBldmVudDpEcmFnRXZlbnQgKSA9PiB0aGlzLm9uRHJhZyggZXZlbnQgKTtcblxuICBASW5wdXQoKVxuICBzZXQgZG5kRGlzYWJsZUlmKCB2YWx1ZTpib29sZWFuICkge1xuXG4gICAgdGhpcy5kcmFnZ2FibGUgPSAhdmFsdWU7XG5cbiAgICBpZiggdGhpcy5kcmFnZ2FibGUgKSB7XG5cbiAgICAgIHRoaXMucmVuZGVyZXIucmVtb3ZlQ2xhc3MoIHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LCB0aGlzLmRuZERyYWdnYWJsZURpc2FibGVkQ2xhc3MgKTtcbiAgICB9XG4gICAgZWxzZSB7XG5cbiAgICAgIHRoaXMucmVuZGVyZXIuYWRkQ2xhc3MoIHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LCB0aGlzLmRuZERyYWdnYWJsZURpc2FibGVkQ2xhc3MgKTtcbiAgICB9XG4gIH1cblxuICBASW5wdXQoKVxuICBzZXQgZG5kRGlzYWJsZURyYWdJZiggdmFsdWU6Ym9vbGVhbiApIHtcbiAgICB0aGlzLmRuZERpc2FibGVJZiA9IHZhbHVlO1xuICB9XG5cbiAgY29uc3RydWN0b3IoIHByaXZhdGUgZWxlbWVudFJlZjpFbGVtZW50UmVmLFxuICAgICAgICAgICAgICAgcHJpdmF0ZSByZW5kZXJlcjpSZW5kZXJlcjIsXG4gICAgICAgICAgICAgICBwcml2YXRlIG5nWm9uZTpOZ1pvbmUgKSB7XG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKTp2b2lkIHtcbiAgICB0aGlzLm5nWm9uZS5ydW5PdXRzaWRlQW5ndWxhciggKCkgPT4ge1xuICAgICAgdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lciggXCJkcmFnXCIsIHRoaXMuZHJhZ0V2ZW50SGFuZGxlciApO1xuICAgIH0gKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6dm9pZCB7XG4gICAgdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lciggXCJkcmFnXCIsIHRoaXMuZHJhZ0V2ZW50SGFuZGxlciApO1xuICAgIGlmKHRoaXMuaXNEcmFnU3RhcnRlZCA9PT0gdHJ1ZSkge1xuICAgICAgZW5kRHJhZygpXG4gICAgfVxuICB9XG5cbiAgQEhvc3RMaXN0ZW5lciggXCJkcmFnc3RhcnRcIiwgWyBcIiRldmVudFwiIF0gKVxuICBvbkRyYWdTdGFydCggZXZlbnQ6RG5kRXZlbnQgKTogYm9vbGVhbiB7XG5cbiAgICBpZiggdGhpcy5kcmFnZ2FibGUgPT09IGZhbHNlICkge1xuXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gY2hlY2sgaWYgdGhlcmUgaXMgZG5kIGhhbmRsZSBhbmQgaWYgdGhlIGRuZCBoYW5kbGUgd2FzIHVzZWQgdG8gc3RhcnQgdGhlIGRyYWdcbiAgICBpZiggdHlwZW9mIHRoaXMuZG5kSGFuZGxlICE9PSBcInVuZGVmaW5lZFwiXG4gICAgICAmJiB0eXBlb2YgZXZlbnQuX2RuZFVzaW5nSGFuZGxlID09PSBcInVuZGVmaW5lZFwiICkge1xuXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gaW5pdGlhbGl6ZSBnbG9iYWwgc3RhdGVcbiAgICBzdGFydERyYWcoIGV2ZW50LCB0aGlzLmRuZEVmZmVjdEFsbG93ZWQsIHRoaXMuZG5kVHlwZSApO1xuXG4gICAgdGhpcy5pc0RyYWdTdGFydGVkID0gdHJ1ZTtcblxuICAgIHNldERyYWdEYXRhKCBldmVudCwge2RhdGE6IHRoaXMuZG5kRHJhZ2dhYmxlLCB0eXBlOiB0aGlzLmRuZFR5cGV9LCBkbmRTdGF0ZS5lZmZlY3RBbGxvd2VkISApO1xuXG4gICAgdGhpcy5kcmFnSW1hZ2UgPSB0aGlzLmRldGVybWluZURyYWdJbWFnZSgpO1xuXG4gICAgLy8gc2V0IGRyYWdnaW5nIGNzcyBjbGFzcyBwcmlvciB0byBzZXREcmFnSW1hZ2Ugc28gc3R5bGVzIGFyZSBhcHBsaWVkIGJlZm9yZVxuICAgIC8vIFRPRE8gYnJlYWtpbmcgY2hhbmdlOiBhZGQgY2xhc3MgdG8gZWxlbWVudFJlZiByYXRoZXIgdGhhbiBkcmFnIGltYWdlIHdoaWNoIGNvdWxkIGJlIGFub3RoZXIgZWxlbWVudFxuICAgIHRoaXMucmVuZGVyZXIuYWRkQ2xhc3MoIHRoaXMuZHJhZ0ltYWdlLCB0aGlzLmRuZERyYWdnaW5nQ2xhc3MgKTtcblxuICAgIC8vIHNldCBjdXN0b20gZHJhZ2ltYWdlIGlmIHByZXNlbnRcbiAgICAvLyBzZXQgZHJhZ2ltYWdlIGlmIGRyYWcgaXMgc3RhcnRlZCBmcm9tIGRuZEhhbmRsZVxuICAgIGlmKCB0eXBlb2YgdGhpcy5kbmREcmFnSW1hZ2VFbGVtZW50UmVmICE9PSBcInVuZGVmaW5lZFwiXG4gICAgICB8fCB0eXBlb2YgZXZlbnQuX2RuZFVzaW5nSGFuZGxlICE9PSBcInVuZGVmaW5lZFwiICkge1xuXG4gICAgICBzZXREcmFnSW1hZ2UoIGV2ZW50LCB0aGlzLmRyYWdJbWFnZSwgdGhpcy5kbmREcmFnSW1hZ2VPZmZzZXRGdW5jdGlvbiApO1xuICAgIH1cblxuICAgIC8vIGFkZCBkcmFnZ2luZyBzb3VyY2UgY3NzIGNsYXNzIG9uIGZpcnN0IGRyYWcgZXZlbnRcbiAgICBjb25zdCB1bnJlZ2lzdGVyID0gdGhpcy5yZW5kZXJlci5saXN0ZW4oIHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LCBcImRyYWdcIiwgKCkgPT4ge1xuXG4gICAgICB0aGlzLnJlbmRlcmVyLmFkZENsYXNzKCB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCwgdGhpcy5kbmREcmFnZ2luZ1NvdXJjZUNsYXNzICk7XG4gICAgICB1bnJlZ2lzdGVyKCk7XG4gICAgfSApO1xuXG4gICAgdGhpcy5kbmRTdGFydC5lbWl0KCBldmVudCApO1xuXG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBvbkRyYWcoIGV2ZW50OkRyYWdFdmVudCApIHtcblxuICAgIHRoaXMuZG5kRHJhZy5lbWl0KCBldmVudCApO1xuICB9XG5cbiAgQEhvc3RMaXN0ZW5lciggXCJkcmFnZW5kXCIsIFsgXCIkZXZlbnRcIiBdIClcbiAgb25EcmFnRW5kKCBldmVudDpEcmFnRXZlbnQgKSB7XG5cbiAgICAvLyBnZXQgZHJvcCBlZmZlY3QgZnJvbSBjdXN0b20gc3RvcmVkIHN0YXRlIGFzIGl0cyBub3QgcmVsaWFibGUgYWNyb3NzIGJyb3dzZXJzXG4gICAgY29uc3QgZHJvcEVmZmVjdCA9IGRuZFN0YXRlLmRyb3BFZmZlY3Q7XG5cbiAgICBsZXQgZHJvcEVmZmVjdEVtaXR0ZXI6RXZlbnRFbWl0dGVyPERyYWdFdmVudD47XG5cbiAgICBzd2l0Y2goIGRyb3BFZmZlY3QgKSB7XG5cbiAgICAgIGNhc2UgXCJjb3B5XCI6XG4gICAgICAgIGRyb3BFZmZlY3RFbWl0dGVyID0gdGhpcy5kbmRDb3BpZWQ7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIFwibGlua1wiOlxuICAgICAgICBkcm9wRWZmZWN0RW1pdHRlciA9IHRoaXMuZG5kTGlua2VkO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBcIm1vdmVcIjpcbiAgICAgICAgZHJvcEVmZmVjdEVtaXR0ZXIgPSB0aGlzLmRuZE1vdmVkO1xuICAgICAgICBicmVhaztcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgZHJvcEVmZmVjdEVtaXR0ZXIgPSB0aGlzLmRuZENhbmNlbGVkO1xuICAgICAgICBicmVhaztcbiAgICB9XG5cbiAgICBkcm9wRWZmZWN0RW1pdHRlci5lbWl0KCBldmVudCApO1xuICAgIHRoaXMuZG5kRW5kLmVtaXQoIGV2ZW50ICk7XG5cbiAgICAvLyByZXNldCBnbG9iYWwgc3RhdGVcbiAgICBlbmREcmFnKCk7XG5cbiAgICB0aGlzLmlzRHJhZ1N0YXJ0ZWQgPSBmYWxzZTtcblxuICAgIHRoaXMucmVuZGVyZXIucmVtb3ZlQ2xhc3MoIHRoaXMuZHJhZ0ltYWdlLCB0aGlzLmRuZERyYWdnaW5nQ2xhc3MgKTtcblxuICAgIC8vIElFOSBzcGVjaWFsIGhhbW1lcmluZ1xuICAgIHdpbmRvdy5zZXRUaW1lb3V0KCAoKSA9PiB7XG4gICAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZUNsYXNzKCB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCwgdGhpcy5kbmREcmFnZ2luZ1NvdXJjZUNsYXNzICk7XG4gICAgfSwgMCApO1xuXG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gIH1cblxuICByZWdpc3RlckRyYWdIYW5kbGUoIGhhbmRsZTpEbmRIYW5kbGVEaXJlY3RpdmUgfCB1bmRlZmluZWQgKSB7XG5cbiAgICB0aGlzLmRuZEhhbmRsZSA9IGhhbmRsZTtcbiAgfVxuXG4gIHJlZ2lzdGVyRHJhZ0ltYWdlKCBlbGVtZW50UmVmOkVsZW1lbnRSZWYgfCB1bmRlZmluZWQgKSB7XG5cbiAgICB0aGlzLmRuZERyYWdJbWFnZUVsZW1lbnRSZWYgPSBlbGVtZW50UmVmO1xuICB9XG5cbiAgcHJpdmF0ZSBkZXRlcm1pbmVEcmFnSW1hZ2UoKTpFbGVtZW50IHtcblxuICAgIC8vIGV2YWx1YXRlIGN1c3RvbSBkcmFnIGltYWdlIGV4aXN0ZW5jZVxuICAgIGlmKCB0eXBlb2YgdGhpcy5kbmREcmFnSW1hZ2VFbGVtZW50UmVmICE9PSBcInVuZGVmaW5lZFwiICkge1xuXG4gICAgICByZXR1cm4gdGhpcy5kbmREcmFnSW1hZ2VFbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQgYXMgRWxlbWVudDtcbiAgICB9XG4gICAgZWxzZSB7XG5cbiAgICAgIHJldHVybiB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudDtcbiAgICB9XG4gIH1cbn1cbiJdfQ==
|
|
@@ -0,0 +1,277 @@
|
|
|
1
|
+
import { ContentChild, Directive, EventEmitter, HostListener, Input, Output } from "@angular/core";
|
|
2
|
+
import { getDirectChildElement, getDropData, shouldPositionPlaceholderBeforeElement } from "./dnd-utils";
|
|
3
|
+
import { getDndType, getDropEffect, isExternalDrag, setDropEffect } from "./dnd-state";
|
|
4
|
+
import * as i0 from "@angular/core";
|
|
5
|
+
export class DndPlaceholderRefDirective {
|
|
6
|
+
constructor(elementRef) {
|
|
7
|
+
this.elementRef = elementRef;
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
DndPlaceholderRefDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: DndPlaceholderRefDirective, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Directive });
|
|
11
|
+
DndPlaceholderRefDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "13.1.1", type: DndPlaceholderRefDirective, selector: "[dndPlaceholderRef]", ngImport: i0 });
|
|
12
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: DndPlaceholderRefDirective, decorators: [{
|
|
13
|
+
type: Directive,
|
|
14
|
+
args: [{
|
|
15
|
+
selector: "[dndPlaceholderRef]"
|
|
16
|
+
}]
|
|
17
|
+
}], ctorParameters: function () { return [{ type: i0.ElementRef }]; } });
|
|
18
|
+
export class DndDropzoneDirective {
|
|
19
|
+
constructor(ngZone, elementRef, renderer) {
|
|
20
|
+
this.ngZone = ngZone;
|
|
21
|
+
this.elementRef = elementRef;
|
|
22
|
+
this.renderer = renderer;
|
|
23
|
+
this.dndDropzone = "";
|
|
24
|
+
this.dndEffectAllowed = "uninitialized";
|
|
25
|
+
this.dndAllowExternal = false;
|
|
26
|
+
this.dndHorizontal = false;
|
|
27
|
+
this.dndDragoverClass = "dndDragover";
|
|
28
|
+
this.dndDropzoneDisabledClass = "dndDropzoneDisabled";
|
|
29
|
+
this.dndDragover = new EventEmitter();
|
|
30
|
+
this.dndDrop = new EventEmitter();
|
|
31
|
+
this.placeholder = null;
|
|
32
|
+
this.disabled = false;
|
|
33
|
+
this.dragEnterEventHandler = (event) => this.onDragEnter(event);
|
|
34
|
+
this.dragOverEventHandler = (event) => this.onDragOver(event);
|
|
35
|
+
this.dragLeaveEventHandler = (event) => this.onDragLeave(event);
|
|
36
|
+
}
|
|
37
|
+
set dndDisableIf(value) {
|
|
38
|
+
this.disabled = !!value;
|
|
39
|
+
if (this.disabled) {
|
|
40
|
+
this.renderer.addClass(this.elementRef.nativeElement, this.dndDropzoneDisabledClass);
|
|
41
|
+
}
|
|
42
|
+
else {
|
|
43
|
+
this.renderer.removeClass(this.elementRef.nativeElement, this.dndDropzoneDisabledClass);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
set dndDisableDropIf(value) {
|
|
47
|
+
this.dndDisableIf = value;
|
|
48
|
+
}
|
|
49
|
+
ngAfterViewInit() {
|
|
50
|
+
this.placeholder = this.tryGetPlaceholder();
|
|
51
|
+
this.removePlaceholderFromDOM();
|
|
52
|
+
this.ngZone.runOutsideAngular(() => {
|
|
53
|
+
this.elementRef.nativeElement.addEventListener("dragenter", this.dragEnterEventHandler);
|
|
54
|
+
this.elementRef.nativeElement.addEventListener("dragover", this.dragOverEventHandler);
|
|
55
|
+
this.elementRef.nativeElement.addEventListener("dragleave", this.dragLeaveEventHandler);
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
ngOnDestroy() {
|
|
59
|
+
this.elementRef.nativeElement.removeEventListener("dragenter", this.dragEnterEventHandler);
|
|
60
|
+
this.elementRef.nativeElement.removeEventListener("dragover", this.dragOverEventHandler);
|
|
61
|
+
this.elementRef.nativeElement.removeEventListener("dragleave", this.dragLeaveEventHandler);
|
|
62
|
+
}
|
|
63
|
+
onDragEnter(event) {
|
|
64
|
+
// check if another dropzone is activated
|
|
65
|
+
if (event._dndDropzoneActive === true) {
|
|
66
|
+
this.cleanupDragoverState();
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
69
|
+
// set as active if the target element is inside this dropzone
|
|
70
|
+
if (typeof event._dndDropzoneActive === "undefined") {
|
|
71
|
+
const newTarget = document.elementFromPoint(event.clientX, event.clientY);
|
|
72
|
+
if (this.elementRef.nativeElement.contains(newTarget)) {
|
|
73
|
+
event._dndDropzoneActive = true;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
// check if this drag event is allowed to drop on this dropzone
|
|
77
|
+
const type = getDndType(event);
|
|
78
|
+
if (this.isDropAllowed(type) === false) {
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
// allow the dragenter
|
|
82
|
+
event.preventDefault();
|
|
83
|
+
}
|
|
84
|
+
onDragOver(event) {
|
|
85
|
+
// With nested dropzones, we want to ignore this event if a child dropzone
|
|
86
|
+
// has already handled a dragover. Historically, event.stopPropagation() was
|
|
87
|
+
// used to prevent this bubbling, but that prevents any dragovers outside the
|
|
88
|
+
// ngx-drag-drop component, and stops other use cases such as scrolling on drag.
|
|
89
|
+
// Instead, we can check if the event was already prevented by a child and bail early.
|
|
90
|
+
if (event.defaultPrevented) {
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
// check if this drag event is allowed to drop on this dropzone
|
|
94
|
+
const type = getDndType(event);
|
|
95
|
+
if (this.isDropAllowed(type) === false) {
|
|
96
|
+
return;
|
|
97
|
+
}
|
|
98
|
+
this.checkAndUpdatePlaceholderPosition(event);
|
|
99
|
+
const dropEffect = getDropEffect(event, this.dndEffectAllowed);
|
|
100
|
+
if (dropEffect === "none") {
|
|
101
|
+
this.cleanupDragoverState();
|
|
102
|
+
return;
|
|
103
|
+
}
|
|
104
|
+
// allow the dragover
|
|
105
|
+
event.preventDefault();
|
|
106
|
+
// set the drop effect
|
|
107
|
+
setDropEffect(event, dropEffect);
|
|
108
|
+
this.dndDragover.emit(event);
|
|
109
|
+
this.renderer.addClass(this.elementRef.nativeElement, this.dndDragoverClass);
|
|
110
|
+
}
|
|
111
|
+
onDrop(event) {
|
|
112
|
+
try {
|
|
113
|
+
// check if this drag event is allowed to drop on this dropzone
|
|
114
|
+
const type = getDndType(event);
|
|
115
|
+
if (this.isDropAllowed(type) === false) {
|
|
116
|
+
return;
|
|
117
|
+
}
|
|
118
|
+
const data = getDropData(event, isExternalDrag());
|
|
119
|
+
if (this.isDropAllowed(data.type) === false) {
|
|
120
|
+
return;
|
|
121
|
+
}
|
|
122
|
+
// signal custom drop handling
|
|
123
|
+
event.preventDefault();
|
|
124
|
+
const dropEffect = getDropEffect(event);
|
|
125
|
+
setDropEffect(event, dropEffect);
|
|
126
|
+
if (dropEffect === "none") {
|
|
127
|
+
return;
|
|
128
|
+
}
|
|
129
|
+
const dropIndex = this.getPlaceholderIndex();
|
|
130
|
+
// if for whatever reason the placeholder is not present in the DOM but it should be there
|
|
131
|
+
// we don't allow/emit the drop event since it breaks the contract
|
|
132
|
+
// seems to only happen if drag and drop is executed faster than the DOM updates
|
|
133
|
+
if (dropIndex === -1) {
|
|
134
|
+
return;
|
|
135
|
+
}
|
|
136
|
+
this.dndDrop.emit({
|
|
137
|
+
event: event,
|
|
138
|
+
dropEffect: dropEffect,
|
|
139
|
+
isExternal: isExternalDrag(),
|
|
140
|
+
data: data.data,
|
|
141
|
+
index: dropIndex,
|
|
142
|
+
type: type,
|
|
143
|
+
});
|
|
144
|
+
event.stopPropagation();
|
|
145
|
+
}
|
|
146
|
+
finally {
|
|
147
|
+
this.cleanupDragoverState();
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
onDragLeave(event) {
|
|
151
|
+
// check if still inside this dropzone and not yet handled by another dropzone
|
|
152
|
+
if (typeof event._dndDropzoneActive === "undefined") {
|
|
153
|
+
const newTarget = document.elementFromPoint(event.clientX, event.clientY);
|
|
154
|
+
if (this.elementRef.nativeElement.contains(newTarget)) {
|
|
155
|
+
event._dndDropzoneActive = true;
|
|
156
|
+
return;
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
this.cleanupDragoverState();
|
|
160
|
+
// cleanup drop effect when leaving dropzone
|
|
161
|
+
setDropEffect(event, "none");
|
|
162
|
+
}
|
|
163
|
+
isDropAllowed(type) {
|
|
164
|
+
// dropzone is disabled -> deny it
|
|
165
|
+
if (this.disabled === true) {
|
|
166
|
+
return false;
|
|
167
|
+
}
|
|
168
|
+
// if drag did not start from our directive
|
|
169
|
+
// and external drag sources are not allowed -> deny it
|
|
170
|
+
if (isExternalDrag() === true
|
|
171
|
+
&& this.dndAllowExternal === false) {
|
|
172
|
+
return false;
|
|
173
|
+
}
|
|
174
|
+
// no filtering by types -> allow it
|
|
175
|
+
if (!this.dndDropzone) {
|
|
176
|
+
return true;
|
|
177
|
+
}
|
|
178
|
+
// no type set -> allow it
|
|
179
|
+
if (!type) {
|
|
180
|
+
return true;
|
|
181
|
+
}
|
|
182
|
+
if (Array.isArray(this.dndDropzone) === false) {
|
|
183
|
+
throw new Error("dndDropzone: bound value to [dndDropzone] must be an array!");
|
|
184
|
+
}
|
|
185
|
+
// if dropzone contains type -> allow it
|
|
186
|
+
return this.dndDropzone.indexOf(type) !== -1;
|
|
187
|
+
}
|
|
188
|
+
tryGetPlaceholder() {
|
|
189
|
+
if (typeof this.dndPlaceholderRef !== "undefined") {
|
|
190
|
+
return this.dndPlaceholderRef.elementRef.nativeElement;
|
|
191
|
+
}
|
|
192
|
+
// TODO nasty workaround needed because if ng-container / template is used @ContentChild() or DI will fail because
|
|
193
|
+
// of wrong context see angular bug https://github.com/angular/angular/issues/13517
|
|
194
|
+
return this.elementRef.nativeElement.querySelector("[dndPlaceholderRef]");
|
|
195
|
+
}
|
|
196
|
+
removePlaceholderFromDOM() {
|
|
197
|
+
if (this.placeholder !== null
|
|
198
|
+
&& this.placeholder.parentNode !== null) {
|
|
199
|
+
this.placeholder.parentNode.removeChild(this.placeholder);
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
checkAndUpdatePlaceholderPosition(event) {
|
|
203
|
+
if (this.placeholder === null) {
|
|
204
|
+
return;
|
|
205
|
+
}
|
|
206
|
+
// make sure the placeholder is in the DOM
|
|
207
|
+
if (this.placeholder.parentNode !== this.elementRef.nativeElement) {
|
|
208
|
+
this.renderer.appendChild(this.elementRef.nativeElement, this.placeholder);
|
|
209
|
+
}
|
|
210
|
+
// update the position if the event originates from a child element of the dropzone
|
|
211
|
+
const directChild = getDirectChildElement(this.elementRef.nativeElement, event.target);
|
|
212
|
+
// early exit if no direct child or direct child is placeholder
|
|
213
|
+
if (directChild === null
|
|
214
|
+
|| directChild === this.placeholder) {
|
|
215
|
+
return;
|
|
216
|
+
}
|
|
217
|
+
const positionPlaceholderBeforeDirectChild = shouldPositionPlaceholderBeforeElement(event, directChild, this.dndHorizontal);
|
|
218
|
+
if (positionPlaceholderBeforeDirectChild) {
|
|
219
|
+
// do insert before only if necessary
|
|
220
|
+
if (directChild.previousSibling !== this.placeholder) {
|
|
221
|
+
this.renderer.insertBefore(this.elementRef.nativeElement, this.placeholder, directChild);
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
else {
|
|
225
|
+
// do insert after only if necessary
|
|
226
|
+
if (directChild.nextSibling !== this.placeholder) {
|
|
227
|
+
this.renderer.insertBefore(this.elementRef.nativeElement, this.placeholder, directChild.nextSibling);
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
getPlaceholderIndex() {
|
|
232
|
+
if (this.placeholder === null) {
|
|
233
|
+
return undefined;
|
|
234
|
+
}
|
|
235
|
+
const element = this.elementRef.nativeElement;
|
|
236
|
+
return Array.prototype.indexOf.call(element.children, this.placeholder);
|
|
237
|
+
}
|
|
238
|
+
cleanupDragoverState() {
|
|
239
|
+
this.renderer.removeClass(this.elementRef.nativeElement, this.dndDragoverClass);
|
|
240
|
+
this.removePlaceholderFromDOM();
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
DndDropzoneDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: DndDropzoneDirective, deps: [{ token: i0.NgZone }, { token: i0.ElementRef }, { token: i0.Renderer2 }], target: i0.ɵɵFactoryTarget.Directive });
|
|
244
|
+
DndDropzoneDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "13.1.1", type: DndDropzoneDirective, selector: "[dndDropzone]", inputs: { dndDropzone: "dndDropzone", dndEffectAllowed: "dndEffectAllowed", dndAllowExternal: "dndAllowExternal", dndHorizontal: "dndHorizontal", dndDragoverClass: "dndDragoverClass", dndDropzoneDisabledClass: "dndDropzoneDisabledClass", dndDisableIf: "dndDisableIf", dndDisableDropIf: "dndDisableDropIf" }, outputs: { dndDragover: "dndDragover", dndDrop: "dndDrop" }, host: { listeners: { "drop": "onDrop($event)" } }, queries: [{ propertyName: "dndPlaceholderRef", first: true, predicate: DndPlaceholderRefDirective, descendants: true }], ngImport: i0 });
|
|
245
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: DndDropzoneDirective, decorators: [{
|
|
246
|
+
type: Directive,
|
|
247
|
+
args: [{
|
|
248
|
+
selector: "[dndDropzone]"
|
|
249
|
+
}]
|
|
250
|
+
}], ctorParameters: function () { return [{ type: i0.NgZone }, { type: i0.ElementRef }, { type: i0.Renderer2 }]; }, propDecorators: { dndDropzone: [{
|
|
251
|
+
type: Input
|
|
252
|
+
}], dndEffectAllowed: [{
|
|
253
|
+
type: Input
|
|
254
|
+
}], dndAllowExternal: [{
|
|
255
|
+
type: Input
|
|
256
|
+
}], dndHorizontal: [{
|
|
257
|
+
type: Input
|
|
258
|
+
}], dndDragoverClass: [{
|
|
259
|
+
type: Input
|
|
260
|
+
}], dndDropzoneDisabledClass: [{
|
|
261
|
+
type: Input
|
|
262
|
+
}], dndDragover: [{
|
|
263
|
+
type: Output
|
|
264
|
+
}], dndDrop: [{
|
|
265
|
+
type: Output
|
|
266
|
+
}], dndPlaceholderRef: [{
|
|
267
|
+
type: ContentChild,
|
|
268
|
+
args: [DndPlaceholderRefDirective]
|
|
269
|
+
}], dndDisableIf: [{
|
|
270
|
+
type: Input
|
|
271
|
+
}], dndDisableDropIf: [{
|
|
272
|
+
type: Input
|
|
273
|
+
}], onDrop: [{
|
|
274
|
+
type: HostListener,
|
|
275
|
+
args: ["drop", ["$event"]]
|
|
276
|
+
}] } });
|
|
277
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG5kLWRyb3B6b25lLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2RuZC9zcmMvbGliL2RuZC1kcm9wem9uZS5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUVMLFlBQVksRUFDWixTQUFTLEVBRVQsWUFBWSxFQUNaLFlBQVksRUFDWixLQUFLLEVBR0wsTUFBTSxFQUVQLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFHTCxxQkFBcUIsRUFDckIsV0FBVyxFQUNYLHNDQUFzQyxFQUN2QyxNQUFNLGFBQWEsQ0FBQztBQUNyQixPQUFPLEVBQUUsVUFBVSxFQUFFLGFBQWEsRUFBRSxjQUFjLEVBQUUsYUFBYSxFQUFFLE1BQU0sYUFBYSxDQUFDOztBQWV2RixNQUFNLE9BQU8sMEJBQTBCO0lBRXJDLFlBQTZCLFVBQXFCO1FBQXJCLGVBQVUsR0FBVixVQUFVLENBQVc7SUFDbEQsQ0FBQzs7dUhBSFUsMEJBQTBCOzJHQUExQiwwQkFBMEI7MkZBQTFCLDBCQUEwQjtrQkFIdEMsU0FBUzttQkFBRTtvQkFDVixRQUFRLEVBQUUscUJBQXFCO2lCQUNoQzs7QUFVRCxNQUFNLE9BQU8sb0JBQW9CO0lBeUQvQixZQUFxQixNQUFhLEVBQ2IsVUFBcUIsRUFDckIsUUFBa0I7UUFGbEIsV0FBTSxHQUFOLE1BQU0sQ0FBTztRQUNiLGVBQVUsR0FBVixVQUFVLENBQVc7UUFDckIsYUFBUSxHQUFSLFFBQVEsQ0FBVTtRQXhEdkMsZ0JBQVcsR0FBa0IsRUFBRSxDQUFDO1FBR2hDLHFCQUFnQixHQUFpQixlQUFlLENBQUM7UUFHakQscUJBQWdCLEdBQVcsS0FBSyxDQUFDO1FBR2pDLGtCQUFhLEdBQVcsS0FBSyxDQUFDO1FBRzlCLHFCQUFnQixHQUFVLGFBQWEsQ0FBQztRQUd4Qyw2QkFBd0IsR0FBRyxxQkFBcUIsQ0FBQztRQUd4QyxnQkFBVyxHQUEyQixJQUFJLFlBQVksRUFB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Q2xDLENBQUM7O2lIQTNWVSxvQkFBb0I7cUdBQXBCLG9CQUFvQix3Z0JBMEJoQiwwQkFBMEI7MkZBMUI5QixvQkFBb0I7a0JBSGhDLFNBQVM7bUJBQUU7b0JBQ1YsUUFBUSxFQUFFLGVBQWU7aUJBQzFCOzhJQUlDLFdBQVc7c0JBRFYsS0FBSztnQkFJTixnQkFBZ0I7c0JBRGYsS0FBSztnQkFJTixnQkFBZ0I7c0JBRGYsS0FBSztnQkFJTixhQUFhO3NCQURaLEtBQUs7Z0JBSU4sZ0JBQWdCO3NCQURmLEtBQUs7Z0JBSU4sd0JBQXdCO3NCQUR2QixLQUFLO2dCQUlHLFdBQVc7c0JBRG5CLE1BQU07Z0JBSUUsT0FBTztzQkFEZixNQUFNO2dCQUlVLGlCQUFpQjtzQkFEakMsWUFBWTt1QkFBRSwwQkFBMEI7Z0JBWXJDLFlBQVk7c0JBRGYsS0FBSztnQkFnQkYsZ0JBQWdCO3NCQURuQixLQUFLO2dCQW9HTixNQUFNO3NCQURMLFlBQVk7dUJBQUUsTUFBTSxFQUFFLENBQUUsUUFBUSxDQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgQ29udGVudENoaWxkLFxuICBEaXJlY3RpdmUsXG4gIEVsZW1lbnRSZWYsXG4gIEV2ZW50RW1pdHRlcixcbiAgSG9zdExpc3RlbmVyLFxuICBJbnB1dCxcbiAgTmdab25lLFxuICBPbkRlc3Ryb3ksXG4gIE91dHB1dCxcbiAgUmVuZGVyZXIyXG59IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5pbXBvcnQge1xuICBEbmRFdmVudCxcbiAgRHJhZ0Ryb3BEYXRhLFxuICBnZXREaXJlY3RDaGlsZEVsZW1lbnQsXG4gIGdldERyb3BEYXRhLFxuICBzaG91bGRQb3NpdGlvblBsYWNlaG9sZGVyQmVmb3JlRWxlbWVudFxufSBmcm9tIFwiLi9kbmQtdXRpbHNcIjtcbmltcG9ydCB7IGdldERuZFR5cGUsIGdldERyb3BFZmZlY3QsIGlzRXh0ZXJuYWxEcmFnLCBzZXREcm9wRWZmZWN0IH0gZnJvbSBcIi4vZG5kLXN0YXRlXCI7XG5pbXBvcnQgeyBEcm9wRWZmZWN0LCBFZmZlY3RBbGxvd2VkIH0gZnJvbSBcIi4vZG5kLXR5cGVzXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRG5kRHJvcEV2ZW50IHtcbiAgZXZlbnQ6RHJhZ0V2ZW50O1xuICBkcm9wRWZmZWN0OkRyb3BFZmZlY3Q7XG4gIGlzRXh0ZXJuYWw6Ym9vbGVhbjtcbiAgZGF0YT86YW55O1xuICBpbmRleD86bnVtYmVyO1xuICB0eXBlPzphbnk7XG59XG5cbkBEaXJlY3RpdmUoIHtcbiAgc2VsZWN0b3I6IFwiW2RuZFBsYWNlaG9sZGVyUmVmXVwiXG59IClcbmV4cG9ydCBjbGFzcyBEbmRQbGFjZWhvbGRlclJlZkRpcmVjdGl2ZSB7XG5cbiAgY29uc3RydWN0b3IoIHB1YmxpYyByZWFkb25seSBlbGVtZW50UmVmOkVsZW1lbnRSZWYgKSB7XG4gIH1cbn1cblxuQERpcmVjdGl2ZSgge1xuICBzZWxlY3RvcjogXCJbZG5kRHJvcHpvbmVdXCJcbn0gKVxuZXhwb3J0IGNsYXNzIERuZERyb3B6b25lRGlyZWN0aXZlIGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95IHtcblxuICBASW5wdXQoKVxuICBkbmREcm9wem9uZT86c3RyaW5nW10gfCBcIlwiID0gXCJcIjtcblxuICBASW5wdXQoKVxuICBkbmRFZmZlY3RBbGxvd2VkOkVmZmVjdEFsbG93ZWQgPSBcInVuaW5pdGlhbGl6ZWRcIjtcblxuICBASW5wdXQoKVxuICBkbmRBbGxvd0V4dGVybmFsOmJvb2xlYW4gPSBmYWxzZTtcblxuICBASW5wdXQoKVxuICBkbmRIb3Jpem9udGFsOmJvb2xlYW4gPSBmYWxzZTtcblxuICBASW5wdXQoKVxuICBkbmREcmFnb3ZlckNsYXNzOnN0cmluZyA9IFwiZG5kRHJhZ292ZXJcIjtcblxuICBASW5wdXQoKVxuICBkbmREcm9wem9uZURpc2FibGVkQ2xhc3MgPSBcImRuZERyb3B6b25lRGlzYWJsZWRcIjtcblxuICBAT3V0cHV0KClcbiAgcmVhZG9ubHkgZG5kRHJhZ292ZXI6RXZlbnRFbWl0dGVyPERyYWdFdmVudD4gPSBuZXcgRXZlbnRFbWl0dGVyPERyYWdFdmVudD4oKTtcblxuICBAT3V0cHV0KClcbiAgcmVhZG9ubHkgZG5kRHJvcDpFdmVudEVtaXR0ZXI8RG5kRHJvcEV2ZW50PiA9IG5ldyBFdmVudEVtaXR0ZXI8RG5kRHJvcEV2ZW50PigpO1xuXG4gIEBDb250ZW50Q2hpbGQoIERuZFBsYWNlaG9sZGVyUmVmRGlyZWN0aXZlIClcbiAgcHJpdmF0ZSByZWFkb25seSBkbmRQbGFjZWhvbGRlclJlZj86RG5kUGxhY2Vob2xkZXJSZWZEaXJlY3RpdmU7XG5cbiAgcHJpdmF0ZSBwbGFjZWhvbGRlcjpFbGVtZW50IHwgbnVsbCA9IG51bGw7XG5cbiAgcHJpdmF0ZSBkaXNhYmxlZDpib29sZWFuID0gZmFsc2U7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBkcmFnRW50ZXJFdmVudEhhbmRsZXI6KCBldmVudDpEcmFnRXZlbnQgKSA9PiB2b2lkID0gKCBldmVudDpEcmFnRXZlbnQgKSA9PiB0aGlzLm9uRHJhZ0VudGVyKCBldmVudCApO1xuICBwcml2YXRlIHJlYWRvbmx5IGRyYWdPdmVyRXZlbnRIYW5kbGVyOiggZXZlbnQ6RHJhZ0V2ZW50ICkgPT4gdm9pZCA9ICggZXZlbnQ6RHJhZ0V2ZW50ICkgPT4gdGhpcy5vbkRyYWdPdmVyKCBldmVudCApO1xuICBwcml2YXRlIHJlYWRvbmx5IGRyYWdMZWF2ZUV2ZW50SGFuZGxlcjooIGV2ZW50OkRyYWdFdmVudCApID0+IHZvaWQgPSAoIGV2ZW50OkRyYWdFdmVudCApID0+IHRoaXMub25EcmFnTGVhdmUoIGV2ZW50ICk7XG5cbiAgQElucHV0KClcbiAgc2V0IGRuZERpc2FibGVJZiggdmFsdWU6Ym9vbGVhbiApIHtcblxuICAgIHRoaXMuZGlzYWJsZWQgPSAhIXZhbHVlO1xuXG4gICAgaWYoIHRoaXMuZGlzYWJsZWQgKSB7XG5cbiAgICAgIHRoaXMucmVuZGVyZXIuYWRkQ2xhc3MoIHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LCB0aGlzLmRuZERyb3B6b25lRGlzYWJsZWRDbGFzcyApO1xuICAgIH1cbiAgICBlbHNlIHtcblxuICAgICAgdGhpcy5yZW5kZXJlci5yZW1vdmVDbGFzcyggdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsIHRoaXMuZG5kRHJvcHpvbmVEaXNhYmxlZENsYXNzICk7XG4gICAgfVxuICB9XG5cbiAgQElucHV0KClcbiAgc2V0IGRuZERpc2FibGVEcm9wSWYoIHZhbHVlOmJvb2xlYW4gKSB7XG4gICAgdGhpcy5kbmREaXNhYmxlSWYgPSB2YWx1ZTtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKCBwcml2YXRlIG5nWm9uZTpOZ1pvbmUsXG4gICAgICAgICAgICAgICBwcml2YXRlIGVsZW1lbnRSZWY6RWxlbWVudFJlZixcbiAgICAgICAgICAgICAgIHByaXZhdGUgcmVuZGVyZXI6UmVuZGVyZXIyICkge1xuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCk6dm9pZCB7XG5cbiAgICB0aGlzLnBsYWNlaG9sZGVyID0gdGhpcy50cnlHZXRQbGFjZWhvbGRlcigpO1xuXG4gICAgdGhpcy5yZW1vdmVQbGFjZWhvbGRlckZyb21ET00oKTtcblxuICAgIHRoaXMubmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCAoKSA9PiB7XG4gICAgICB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCBcImRyYWdlbnRlclwiLCB0aGlzLmRyYWdFbnRlckV2ZW50SGFuZGxlciApO1xuICAgICAgdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lciggXCJkcmFnb3ZlclwiLCB0aGlzLmRyYWdPdmVyRXZlbnRIYW5kbGVyICk7XG4gICAgICB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCBcImRyYWdsZWF2ZVwiLCB0aGlzLmRyYWdMZWF2ZUV2ZW50SGFuZGxlciApO1xuICAgIH0gKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6dm9pZCB7XG4gICAgdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lciggXCJkcmFnZW50ZXJcIiwgdGhpcy5kcmFnRW50ZXJFdmVudEhhbmRsZXIgKTtcbiAgICB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCBcImRyYWdvdmVyXCIsIHRoaXMuZHJhZ092ZXJFdmVudEhhbmRsZXIgKTtcbiAgICB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCBcImRyYWdsZWF2ZVwiLCB0aGlzLmRyYWdMZWF2ZUV2ZW50SGFuZGxlciApO1xuICB9XG5cbiAgb25EcmFnRW50ZXIoIGV2ZW50OkRuZEV2ZW50ICkge1xuXG4gICAgLy8gY2hlY2sgaWYgYW5vdGhlciBkcm9wem9uZSBpcyBhY3RpdmF0ZWRcbiAgICBpZiggZXZlbnQuX2RuZERyb3B6b25lQWN0aXZlID09PSB0cnVlICkge1xuXG4gICAgICB0aGlzLmNsZWFudXBEcmFnb3ZlclN0YXRlKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gc2V0IGFzIGFjdGl2ZSBpZiB0aGUgdGFyZ2V0IGVsZW1lbnQgaXMgaW5zaWRlIHRoaXMgZHJvcHpvbmVcbiAgICBpZiggdHlwZW9mIGV2ZW50Ll9kbmREcm9wem9uZUFjdGl2ZSA9PT0gXCJ1bmRlZmluZWRcIiApIHtcblxuICAgICAgY29uc3QgbmV3VGFyZ2V0ID0gZG9jdW1lbnQuZWxlbWVudEZyb21Qb2ludCggZXZlbnQuY2xpZW50WCwgZXZlbnQuY2xpZW50WSApO1xuXG4gICAgICBpZiggdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuY29udGFpbnMoIG5ld1RhcmdldCApICkge1xuXG4gICAgICAgIGV2ZW50Ll9kbmREcm9wem9uZUFjdGl2ZSA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gY2hlY2sgaWYgdGhpcyBkcmFnIGV2ZW50IGlzIGFsbG93ZWQgdG8gZHJvcCBvbiB0aGlzIGRyb3B6b25lXG4gICAgY29uc3QgdHlwZSA9IGdldERuZFR5cGUoIGV2ZW50ICk7XG4gICAgaWYoIHRoaXMuaXNEcm9wQWxsb3dlZCggdHlwZSApID09PSBmYWxzZSApIHtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIGFsbG93IHRoZSBkcmFnZW50ZXJcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICB9XG5cbiAgb25EcmFnT3ZlciggZXZlbnQ6RHJhZ0V2ZW50ICkge1xuICAgIC8vIFdpdGggbmVzdGVkIGRyb3B6b25lcywgd2Ugd2FudCB0byBpZ25vcmUgdGhpcyBldmVudCBpZiBhIGNoaWxkIGRyb3B6b25lXG4gICAgLy8gaGFzIGFscmVhZHkgaGFuZGxlZCBhIGRyYWdvdmVyLiAgSGlzdG9yaWNhbGx5LCBldmVudC5zdG9wUHJvcGFnYXRpb24oKSB3YXNcbiAgICAvLyB1c2VkIHRvIHByZXZlbnQgdGhpcyBidWJibGluZywgYnV0IHRoYXQgcHJldmVudHMgYW55IGRyYWdvdmVycyBvdXRzaWRlIHRoZVxuICAgIC8vIG5neC1kcmFnLWRyb3AgY29tcG9uZW50LCBhbmQgc3RvcHMgb3RoZXIgdXNlIGNhc2VzIHN1Y2ggYXMgc2Nyb2xsaW5nIG9uIGRyYWcuXG4gICAgLy8gSW5zdGVhZCwgd2UgY2FuIGNoZWNrIGlmIHRoZSBldmVudCB3YXMgYWxyZWFkeSBwcmV2ZW50ZWQgYnkgYSBjaGlsZCBhbmQgYmFpbCBlYXJseS5cbiAgICBpZiggZXZlbnQuZGVmYXVsdFByZXZlbnRlZCApIHtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIGNoZWNrIGlmIHRoaXMgZHJhZyBldmVudCBpcyBhbGxvd2VkIHRvIGRyb3Agb24gdGhpcyBkcm9wem9uZVxuICAgIGNvbnN0IHR5cGUgPSBnZXREbmRUeXBlKCBldmVudCApO1xuICAgIGlmKCB0aGlzLmlzRHJvcEFsbG93ZWQoIHR5cGUgKSA9PT0gZmFsc2UgKSB7XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmNoZWNrQW5kVXBkYXRlUGxhY2Vob2xkZXJQb3NpdGlvbiggZXZlbnQgKTtcblxuICAgIGNvbnN0IGRyb3BFZmZlY3QgPSBnZXREcm9wRWZmZWN0KCBldmVudCwgdGhpcy5kbmRFZmZlY3RBbGxvd2VkICk7XG5cbiAgICBpZiggZHJvcEVmZmVjdCA9PT0gXCJub25lXCIgKSB7XG5cbiAgICAgIHRoaXMuY2xlYW51cERyYWdvdmVyU3RhdGUoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBhbGxvdyB0aGUgZHJhZ292ZXJcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgLy8gc2V0IHRoZSBkcm9wIGVmZmVjdFxuICAgIHNldERyb3BFZmZlY3QoIGV2ZW50LCBkcm9wRWZmZWN0ICk7XG5cbiAgICB0aGlzLmRuZERyYWdvdmVyLmVtaXQoIGV2ZW50ICk7XG5cbiAgICB0aGlzLnJlbmRlcmVyLmFkZENsYXNzKCB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCwgdGhpcy5kbmREcmFnb3ZlckNsYXNzICk7XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCBcImRyb3BcIiwgWyBcIiRldmVudFwiIF0gKVxuICBvbkRyb3AoIGV2ZW50OkRyYWdFdmVudCApIHtcblxuICAgIHRyeSB7XG5cbiAgICAgIC8vIGNoZWNrIGlmIHRoaXMgZHJhZyBldmVudCBpcyBhbGxvd2VkIHRvIGRyb3Agb24gdGhpcyBkcm9wem9uZVxuICAgICAgY29uc3QgdHlwZSA9IGdldERuZFR5cGUoIGV2ZW50ICk7XG4gICAgICBpZiggdGhpcy5pc0Ryb3BBbGxvd2VkKCB0eXBlICkgPT09IGZhbHNlICkge1xuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZGF0YTpEcmFnRHJvcERhdGEgPSBnZXREcm9wRGF0YSggZXZlbnQsIGlzRXh0ZXJuYWxEcmFnKCkgKTtcblxuICAgICAgaWYoIHRoaXMuaXNEcm9wQWxsb3dlZCggZGF0YS50eXBlICkgPT09IGZhbHNlICkge1xuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gc2lnbmFsIGN1c3RvbSBkcm9wIGhhbmRsaW5nXG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgICBjb25zdCBkcm9wRWZmZWN0ID0gZ2V0RHJvcEVmZmVjdCggZXZlbnQgKTtcblxuICAgICAgc2V0RHJvcEVmZmVjdCggZXZlbnQsIGRyb3BFZmZlY3QgKTtcblxuICAgICAgaWYoIGRyb3BFZmZlY3QgPT09IFwibm9uZVwiICkge1xuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZHJvcEluZGV4ID0gdGhpcy5nZXRQbGFjZWhvbGRlckluZGV4KCk7XG5cbiAgICAgIC8vIGlmIGZvciB3aGF0ZXZlciByZWFzb24gdGhlIHBsYWNlaG9sZGVyIGlzIG5vdCBwcmVzZW50IGluIHRoZSBET00gYnV0IGl0IHNob3VsZCBiZSB0aGVyZVxuICAgICAgLy8gd2UgZG9uJ3QgYWxsb3cvZW1pdCB0aGUgZHJvcCBldmVudCBzaW5jZSBpdCBicmVha3MgdGhlIGNvbnRyYWN0XG4gICAgICAvLyBzZWVtcyB0byBvbmx5IGhhcHBlbiBpZiBkcmFnIGFuZCBkcm9wIGlzIGV4ZWN1dGVkIGZhc3RlciB0aGFuIHRoZSBET00gdXBkYXRlc1xuICAgICAgaWYoIGRyb3BJbmRleCA9PT0gLTEgKSB7XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmRuZERyb3AuZW1pdCgge1xuICAgICAgICBldmVudDogZXZlbnQsXG4gICAgICAgIGRyb3BFZmZlY3Q6IGRyb3BFZmZlY3QsXG4gICAgICAgIGlzRXh0ZXJuYWw6IGlzRXh0ZXJuYWxEcmFnKCksXG4gICAgICAgIGRhdGE6IGRhdGEuZGF0YSxcbiAgICAgICAgaW5kZXg6IGRyb3BJbmRleCxcbiAgICAgICAgdHlwZTogdHlwZSxcbiAgICAgIH0gKTtcblxuICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgICB9XG4gICAgZmluYWxseSB7XG5cbiAgICAgIHRoaXMuY2xlYW51cERyYWdvdmVyU3RhdGUoKTtcbiAgICB9XG4gIH1cblxuICBvbkRyYWdMZWF2ZSggZXZlbnQ6RG5kRXZlbnQgKSB7XG5cbiAgICAvLyBjaGVjayBpZiBzdGlsbCBpbnNpZGUgdGhpcyBkcm9wem9uZSBhbmQgbm90IHlldCBoYW5kbGVkIGJ5IGFub3RoZXIgZHJvcHpvbmVcbiAgICBpZiggdHlwZW9mIGV2ZW50Ll9kbmREcm9wem9uZUFjdGl2ZSA9PT0gXCJ1bmRlZmluZWRcIiApIHtcblxuICAgICAgY29uc3QgbmV3VGFyZ2V0ID0gZG9jdW1lbnQuZWxlbWVudEZyb21Qb2ludCggZXZlbnQuY2xpZW50WCwgZXZlbnQuY2xpZW50WSApO1xuXG4gICAgICBpZiggdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuY29udGFpbnMoIG5ld1RhcmdldCApICkge1xuXG4gICAgICAgIGV2ZW50Ll9kbmREcm9wem9uZUFjdGl2ZSA9IHRydWU7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmNsZWFudXBEcmFnb3ZlclN0YXRlKCk7XG5cbiAgICAvLyBjbGVhbnVwIGRyb3AgZWZmZWN0IHdoZW4gbGVhdmluZyBkcm9wem9uZVxuICAgIHNldERyb3BFZmZlY3QoIGV2ZW50LCBcIm5vbmVcIiApO1xuICB9XG5cbiAgcHJpdmF0ZSBpc0Ryb3BBbGxvd2VkKCB0eXBlPzpzdHJpbmcgKTpib29sZWFuIHtcblxuICAgIC8vIGRyb3B6b25lIGlzIGRpc2FibGVkIC0+IGRlbnkgaXRcbiAgICBpZiggdGhpcy5kaXNhYmxlZCA9PT0gdHJ1ZSApIHtcblxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8vIGlmIGRyYWcgZGlkIG5vdCBzdGFydCBmcm9tIG91ciBkaXJlY3RpdmVcbiAgICAvLyBhbmQgZXh0ZXJuYWwgZHJhZyBzb3VyY2VzIGFyZSBub3QgYWxsb3dlZCAtPiBkZW55IGl0XG4gICAgaWYoIGlzRXh0ZXJuYWxEcmFnKCkgPT09IHRydWVcbiAgICAgICYmIHRoaXMuZG5kQWxsb3dFeHRlcm5hbCA9PT0gZmFsc2UgKSB7XG5cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBubyBmaWx0ZXJpbmcgYnkgdHlwZXMgLT4gYWxsb3cgaXRcbiAgICBpZiggIXRoaXMuZG5kRHJvcHpvbmUgKSB7XG5cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8vIG5vIHR5cGUgc2V0IC0+IGFsbG93IGl0XG4gICAgaWYoICF0eXBlICkge1xuXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiggQXJyYXkuaXNBcnJheSggdGhpcy5kbmREcm9wem9uZSApID09PSBmYWxzZSApIHtcblxuICAgICAgdGhyb3cgbmV3IEVycm9yKCBcImRuZERyb3B6b25lOiBib3VuZCB2YWx1ZSB0byBbZG5kRHJvcHpvbmVdIG11c3QgYmUgYW4gYXJyYXkhXCIgKTtcbiAgICB9XG5cbiAgICAvLyBpZiBkcm9wem9uZSBjb250YWlucyB0eXBlIC0+IGFsbG93IGl0XG4gICAgcmV0dXJuIHRoaXMuZG5kRHJvcHpvbmUuaW5kZXhPZiggdHlwZSApICE9PSAtMTtcbiAgfVxuXG4gIHByaXZhdGUgdHJ5R2V0UGxhY2Vob2xkZXIoKTpFbGVtZW50IHwgbnVsbCB7XG5cbiAgICBpZiggdHlwZW9mIHRoaXMuZG5kUGxhY2Vob2xkZXJSZWYgIT09IFwidW5kZWZpbmVkXCIgKSB7XG5cbiAgICAgIHJldHVybiB0aGlzLmRuZFBsYWNlaG9sZGVyUmVmLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCBhcyBFbGVtZW50O1xuICAgIH1cblxuICAgIC8vIFRPRE8gbmFzdHkgd29ya2Fyb3VuZCBuZWVkZWQgYmVjYXVzZSBpZiBuZy1jb250YWluZXIgLyB0ZW1wbGF0ZSBpcyB1c2VkIEBDb250ZW50Q2hpbGQoKSBvciBESSB3aWxsIGZhaWwgYmVjYXVzZVxuICAgIC8vIG9mIHdyb25nIGNvbnRleHQgc2VlIGFuZ3VsYXIgYnVnIGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL2FuZ3VsYXIvaXNzdWVzLzEzNTE3XG4gICAgcmV0dXJuIHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoIFwiW2RuZFBsYWNlaG9sZGVyUmVmXVwiICk7XG4gIH1cblxuICBwcml2YXRlIHJlbW92ZVBsYWNlaG9sZGVyRnJvbURPTSgpIHtcblxuICAgIGlmKCB0aGlzLnBsYWNlaG9sZGVyICE9PSBudWxsXG4gICAgICAmJiB0aGlzLnBsYWNlaG9sZGVyLnBhcmVudE5vZGUgIT09IG51bGwgKSB7XG4gICAgICB0aGlzLnBsYWNlaG9sZGVyLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoIHRoaXMucGxhY2Vob2xkZXIgKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGNoZWNrQW5kVXBkYXRlUGxhY2Vob2xkZXJQb3NpdGlvbiggZXZlbnQ6RHJhZ0V2ZW50ICk6dm9pZCB7XG5cbiAgICBpZiggdGhpcy5wbGFjZWhvbGRlciA9PT0gbnVsbCApIHtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIG1ha2Ugc3VyZSB0aGUgcGxhY2Vob2xkZXIgaXMgaW4gdGhlIERPTVxuICAgIGlmKCB0aGlzLnBsYWNlaG9sZGVyLnBhcmVudE5vZGUgIT09IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50ICkge1xuXG4gICAgICB0aGlzLnJlbmRlcmVyLmFwcGVuZENoaWxkKCB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCwgdGhpcy5wbGFjZWhvbGRlciApO1xuICAgIH1cblxuICAgIC8vIHVwZGF0ZSB0aGUgcG9zaXRpb24gaWYgdGhlIGV2ZW50IG9yaWdpbmF0ZXMgZnJvbSBhIGNoaWxkIGVsZW1lbnQgb2YgdGhlIGRyb3B6b25lXG4gICAgY29uc3QgZGlyZWN0Q2hpbGQgPSBnZXREaXJlY3RDaGlsZEVsZW1lbnQoIHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LCBldmVudC50YXJnZXQgYXMgRWxlbWVudCApO1xuXG4gICAgLy8gZWFybHkgZXhpdCBpZiBubyBkaXJlY3QgY2hpbGQgb3IgZGlyZWN0IGNoaWxkIGlzIHBsYWNlaG9sZGVyXG4gICAgaWYoIGRpcmVjdENoaWxkID09PSBudWxsXG4gICAgICB8fCBkaXJlY3RDaGlsZCA9PT0gdGhpcy5wbGFjZWhvbGRlciApIHtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHBvc2l0aW9uUGxhY2Vob2xkZXJCZWZvcmVEaXJlY3RDaGlsZCA9IHNob3VsZFBvc2l0aW9uUGxhY2Vob2xkZXJCZWZvcmVFbGVtZW50KCBldmVudCwgZGlyZWN0Q2hpbGQsIHRoaXMuZG5kSG9yaXpvbnRhbCApO1xuXG4gICAgaWYoIHBvc2l0aW9uUGxhY2Vob2xkZXJCZWZvcmVEaXJlY3RDaGlsZCApIHtcblxuICAgICAgLy8gZG8gaW5zZXJ0IGJlZm9yZSBvbmx5IGlmIG5lY2Vzc2FyeVxuICAgICAgaWYoIGRpcmVjdENoaWxkLnByZXZpb3VzU2libGluZyAhPT0gdGhpcy5wbGFjZWhvbGRlciApIHtcblxuICAgICAgICB0aGlzLnJlbmRlcmVyLmluc2VydEJlZm9yZSggdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsIHRoaXMucGxhY2Vob2xkZXIsIGRpcmVjdENoaWxkICk7XG4gICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuXG4gICAgICAvLyBkbyBpbnNlcnQgYWZ0ZXIgb25seSBpZiBuZWNlc3NhcnlcbiAgICAgIGlmKCBkaXJlY3RDaGlsZC5uZXh0U2libGluZyAhPT0gdGhpcy5wbGFjZWhvbGRlciApIHtcblxuICAgICAgICB0aGlzLnJlbmRlcmVyLmluc2VydEJlZm9yZSggdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsIHRoaXMucGxhY2Vob2xkZXIsIGRpcmVjdENoaWxkLm5leHRTaWJsaW5nICk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBnZXRQbGFjZWhvbGRlckluZGV4KCk6bnVtYmVyIHwgdW5kZWZpbmVkIHtcblxuICAgIGlmKCB0aGlzLnBsYWNlaG9sZGVyID09PSBudWxsICkge1xuXG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCBhcyBIVE1MRWxlbWVudDtcblxuICAgIHJldHVybiBBcnJheS5wcm90b3R5cGUuaW5kZXhPZi5jYWxsKCBlbGVtZW50LmNoaWxkcmVuLCB0aGlzLnBsYWNlaG9sZGVyICk7XG4gIH1cblxuICBwcml2YXRlIGNsZWFudXBEcmFnb3ZlclN0YXRlKCkge1xuXG4gICAgdGhpcy5yZW5kZXJlci5yZW1vdmVDbGFzcyggdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsIHRoaXMuZG5kRHJhZ292ZXJDbGFzcyApO1xuXG4gICAgdGhpcy5yZW1vdmVQbGFjZWhvbGRlckZyb21ET00oKTtcbiAgfVxufVxuIl19
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { Directive, HostBinding, HostListener } from "@angular/core";
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
import * as i1 from "./dnd-draggable.directive";
|
|
4
|
+
export class DndHandleDirective {
|
|
5
|
+
constructor(parent) {
|
|
6
|
+
this.draggable = true;
|
|
7
|
+
parent.registerDragHandle(this);
|
|
8
|
+
}
|
|
9
|
+
onDragEvent(event) {
|
|
10
|
+
event._dndUsingHandle = true;
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
DndHandleDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: DndHandleDirective, deps: [{ token: i1.DndDraggableDirective }], target: i0.ɵɵFactoryTarget.Directive });
|
|
14
|
+
DndHandleDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "13.1.1", type: DndHandleDirective, selector: "[dndHandle]", host: { listeners: { "dragstart": "onDragEvent($event)", "dragend": "onDragEvent($event)" }, properties: { "attr.draggable": "this.draggable" } }, ngImport: i0 });
|
|
15
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: DndHandleDirective, decorators: [{
|
|
16
|
+
type: Directive,
|
|
17
|
+
args: [{
|
|
18
|
+
selector: "[dndHandle]"
|
|
19
|
+
}]
|
|
20
|
+
}], ctorParameters: function () { return [{ type: i1.DndDraggableDirective }]; }, propDecorators: { draggable: [{
|
|
21
|
+
type: HostBinding,
|
|
22
|
+
args: ["attr.draggable"]
|
|
23
|
+
}], onDragEvent: [{
|
|
24
|
+
type: HostListener,
|
|
25
|
+
args: ["dragstart", ["$event"]]
|
|
26
|
+
}, {
|
|
27
|
+
type: HostListener,
|
|
28
|
+
args: ["dragend", ["$event"]]
|
|
29
|
+
}] } });
|
|
30
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG5kLWhhbmRsZS5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9kbmQvc3JjL2xpYi9kbmQtaGFuZGxlLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSxZQUFZLEVBQUUsTUFBTSxlQUFlLENBQUM7OztBQU9yRSxNQUFNLE9BQU8sa0JBQWtCO0lBSzdCLFlBQWEsTUFBNEI7UUFGekMsY0FBUyxHQUFHLElBQUksQ0FBQztRQUlmLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBRSxJQUFJLENBQUUsQ0FBQztJQUNwQyxDQUFDO0lBSUQsV0FBVyxDQUFFLEtBQWM7UUFFekIsS0FBSyxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUM7SUFDL0IsQ0FBQzs7K0dBZlUsa0JBQWtCO21HQUFsQixrQkFBa0I7MkZBQWxCLGtCQUFrQjtrQkFIOUIsU0FBUzttQkFBRTtvQkFDVixRQUFRLEVBQUUsYUFBYTtpQkFDeEI7NEdBSUMsU0FBUztzQkFEUixXQUFXO3VCQUFFLGdCQUFnQjtnQkFVOUIsV0FBVztzQkFGVixZQUFZO3VCQUFFLFdBQVcsRUFBRSxDQUFFLFFBQVEsQ0FBRTs7c0JBQ3ZDLFlBQVk7dUJBQUUsU0FBUyxFQUFFLENBQUUsUUFBUSxDQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGlyZWN0aXZlLCBIb3N0QmluZGluZywgSG9zdExpc3RlbmVyIH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCB7IERuZEV2ZW50IH0gZnJvbSBcIi4vZG5kLXV0aWxzXCI7XG5pbXBvcnQgeyBEbmREcmFnZ2FibGVEaXJlY3RpdmUgfSBmcm9tIFwiLi9kbmQtZHJhZ2dhYmxlLmRpcmVjdGl2ZVwiO1xuXG5ARGlyZWN0aXZlKCB7XG4gIHNlbGVjdG9yOiBcIltkbmRIYW5kbGVdXCJcbn0gKVxuZXhwb3J0IGNsYXNzIERuZEhhbmRsZURpcmVjdGl2ZSB7XG5cbiAgQEhvc3RCaW5kaW5nKCBcImF0dHIuZHJhZ2dhYmxlXCIgKVxuICBkcmFnZ2FibGUgPSB0cnVlO1xuXG4gIGNvbnN0cnVjdG9yKCBwYXJlbnQ6RG5kRHJhZ2dhYmxlRGlyZWN0aXZlICkge1xuXG4gICAgcGFyZW50LnJlZ2lzdGVyRHJhZ0hhbmRsZSggdGhpcyApO1xuICB9XG5cbiAgQEhvc3RMaXN0ZW5lciggXCJkcmFnc3RhcnRcIiwgWyBcIiRldmVudFwiIF0gKVxuICBASG9zdExpc3RlbmVyKCBcImRyYWdlbmRcIiwgWyBcIiRldmVudFwiIF0gKVxuICBvbkRyYWdFdmVudCggZXZlbnQ6RG5kRXZlbnQgKSB7XG5cbiAgICBldmVudC5fZG5kVXNpbmdIYW5kbGUgPSB0cnVlO1xuICB9XG59XG4iXX0=
|