ngx-drag-drop 2.0.0-rc.7 → 13.0.1
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 -44
- package/esm2020/lib/dnd-draggable.directive.mjs +195 -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 +731 -0
- package/fesm2015/ngx-drag-drop.mjs.map +1 -0
- package/{fesm2015/ngx-drag-drop.js → fesm2020/ngx-drag-drop.mjs} +209 -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
|
@@ -28,15 +28,6 @@ This has `dropzones` though :+1:
|
|
|
28
28
|
The idea is that the directive does not handle lists internally so the `dndDropzone` can be general purpose.
|
|
29
29
|
|
|
30
30
|
|
|
31
|
-
**Upcoming version release**
|
|
32
|
-
|
|
33
|
-
Currently the next version including some performance optimizations is pending. See the [CHANGELOG](https://github.com/reppners/ngx-drag-drop/blob/master/CHANGELOG.md) for details.
|
|
34
|
-
|
|
35
|
-
You can try it out by installing the `next` version.
|
|
36
|
-
|
|
37
|
-
`npm install ngx-drag-drop@next --save`
|
|
38
|
-
|
|
39
|
-
|
|
40
31
|
## Usage
|
|
41
32
|
|
|
42
33
|
`app.component.html`
|
|
@@ -327,8 +318,8 @@ https://github.com/timruffles/mobile-drag-drop
|
|
|
327
318
|
### Firefox
|
|
328
319
|
|
|
329
320
|
* Beware that Firefox does not support dragging on `<button>` elements.
|
|
330
|
-
* `<button [dndDraggable]>` and `<button [dndHandler]>` won't work.
|
|
331
|
-
* 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
|
|
332
323
|
|
|
333
324
|
|
|
334
325
|
## Why?
|
|
@@ -338,36 +329,3 @@ HTML Drag-And-Drop API implementations are not behaving the same way across brow
|
|
|
338
329
|
The directives contained in this module enable declarative drag and drop that "just works" across browsers in a consistent way.
|
|
339
330
|
|
|
340
331
|
Credits go to the author and contributors of [angular-drag-drop-lists](https://github.com/marceljuenemann/angular-drag-and-drop-lists).
|
|
341
|
-
|
|
342
|
-
## Maintenance
|
|
343
|
-
|
|
344
|
-
This project was generated with [Angular CLI](https://github.com/angular/angular-cli).
|
|
345
|
-
|
|
346
|
-
For the library build it uses [ng-packagr](https://github.com/dherges/ng-packagr).
|
|
347
|
-
|
|
348
|
-
#### Edit Library
|
|
349
|
-
|
|
350
|
-
* edit lib code
|
|
351
|
-
* run `npm start` (currently needs to be re-run on every lib code change)
|
|
352
|
-
|
|
353
|
-
#### Release Library
|
|
354
|
-
|
|
355
|
-
* assure correct version is set in `package.json`
|
|
356
|
-
* build library with `npm run build:lib`
|
|
357
|
-
* publish library with `npm run publish:stable` (use `npm run publish:next` for pre-releases)
|
|
358
|
-
|
|
359
|
-
#### Release Docs
|
|
360
|
-
|
|
361
|
-
* build docs site with `npm run build:docs`
|
|
362
|
-
* commit and push changes in `docs` to `master`
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
---
|
|
366
|
-
|
|
367
|
-
<p align="center">
|
|
368
|
-
Made with :heart: &
|
|
369
|
-
<a href="https://www.jetbrains.com/?from=ngx-drag-drop">
|
|
370
|
-
<img align="center" alt="jetbrains" src="jetbrains.svg" width="120px" />
|
|
371
|
-
</a>
|
|
372
|
-
& :coffee:
|
|
373
|
-
</p>
|
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
import { Directive, EventEmitter, forwardRef, HostBinding, HostListener, Inject, 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.3.11", ngImport: i0, type: DndDragImageRefDirective, deps: [{ token: forwardRef(() => DndDraggableDirective) }, { token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Directive });
|
|
11
|
+
DndDragImageRefDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "13.3.11", type: DndDragImageRefDirective, selector: "[dndDragImageRef]", ngImport: i0 });
|
|
12
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: DndDragImageRefDirective, decorators: [{
|
|
13
|
+
type: Directive,
|
|
14
|
+
args: [{
|
|
15
|
+
selector: "[dndDragImageRef]"
|
|
16
|
+
}]
|
|
17
|
+
}], ctorParameters: function () { return [{ type: DndDraggableDirective, decorators: [{
|
|
18
|
+
type: Inject,
|
|
19
|
+
args: [forwardRef(() => DndDraggableDirective)]
|
|
20
|
+
}] }, { type: i0.ElementRef }]; } });
|
|
21
|
+
export class DndDraggableDirective {
|
|
22
|
+
constructor(elementRef, renderer, ngZone) {
|
|
23
|
+
this.elementRef = elementRef;
|
|
24
|
+
this.renderer = renderer;
|
|
25
|
+
this.ngZone = ngZone;
|
|
26
|
+
this.dndEffectAllowed = "copy";
|
|
27
|
+
this.dndDraggingClass = "dndDragging";
|
|
28
|
+
this.dndDraggingSourceClass = "dndDraggingSource";
|
|
29
|
+
this.dndDraggableDisabledClass = "dndDraggableDisabled";
|
|
30
|
+
this.dndDragImageOffsetFunction = calculateDragImageOffset;
|
|
31
|
+
this.dndStart = new EventEmitter();
|
|
32
|
+
this.dndDrag = new EventEmitter();
|
|
33
|
+
this.dndEnd = new EventEmitter();
|
|
34
|
+
this.dndMoved = new EventEmitter();
|
|
35
|
+
this.dndCopied = new EventEmitter();
|
|
36
|
+
this.dndLinked = new EventEmitter();
|
|
37
|
+
this.dndCanceled = new EventEmitter();
|
|
38
|
+
this.draggable = true;
|
|
39
|
+
this.isDragStarted = false;
|
|
40
|
+
this.dragEventHandler = (event) => this.onDrag(event);
|
|
41
|
+
}
|
|
42
|
+
set dndDisableIf(value) {
|
|
43
|
+
this.draggable = !value;
|
|
44
|
+
if (this.draggable) {
|
|
45
|
+
this.renderer.removeClass(this.elementRef.nativeElement, this.dndDraggableDisabledClass);
|
|
46
|
+
}
|
|
47
|
+
else {
|
|
48
|
+
this.renderer.addClass(this.elementRef.nativeElement, this.dndDraggableDisabledClass);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
set dndDisableDragIf(value) {
|
|
52
|
+
this.dndDisableIf = value;
|
|
53
|
+
}
|
|
54
|
+
ngAfterViewInit() {
|
|
55
|
+
this.ngZone.runOutsideAngular(() => {
|
|
56
|
+
this.elementRef.nativeElement.addEventListener("drag", this.dragEventHandler);
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
ngOnDestroy() {
|
|
60
|
+
this.elementRef.nativeElement.removeEventListener("drag", this.dragEventHandler);
|
|
61
|
+
if (this.isDragStarted === true) {
|
|
62
|
+
endDrag();
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
onDragStart(event) {
|
|
66
|
+
if (this.draggable === false) {
|
|
67
|
+
return false;
|
|
68
|
+
}
|
|
69
|
+
// check if there is dnd handle and if the dnd handle was used to start the drag
|
|
70
|
+
if (typeof this.dndHandle !== "undefined"
|
|
71
|
+
&& typeof event._dndUsingHandle === "undefined") {
|
|
72
|
+
return false;
|
|
73
|
+
}
|
|
74
|
+
// initialize global state
|
|
75
|
+
startDrag(event, this.dndEffectAllowed, this.dndType);
|
|
76
|
+
this.isDragStarted = true;
|
|
77
|
+
setDragData(event, { data: this.dndDraggable, type: this.dndType }, dndState.effectAllowed);
|
|
78
|
+
this.dragImage = this.determineDragImage();
|
|
79
|
+
// set dragging css class prior to setDragImage so styles are applied before
|
|
80
|
+
// TODO breaking change: add class to elementRef rather than drag image which could be another element
|
|
81
|
+
this.renderer.addClass(this.dragImage, this.dndDraggingClass);
|
|
82
|
+
// set custom dragimage if present
|
|
83
|
+
// set dragimage if drag is started from dndHandle
|
|
84
|
+
if (typeof this.dndDragImageElementRef !== "undefined"
|
|
85
|
+
|| typeof event._dndUsingHandle !== "undefined") {
|
|
86
|
+
setDragImage(event, this.dragImage, this.dndDragImageOffsetFunction);
|
|
87
|
+
}
|
|
88
|
+
// add dragging source css class on first drag event
|
|
89
|
+
const unregister = this.renderer.listen(this.elementRef.nativeElement, "drag", () => {
|
|
90
|
+
this.renderer.addClass(this.elementRef.nativeElement, this.dndDraggingSourceClass);
|
|
91
|
+
unregister();
|
|
92
|
+
});
|
|
93
|
+
this.dndStart.emit(event);
|
|
94
|
+
event.stopPropagation();
|
|
95
|
+
return true;
|
|
96
|
+
}
|
|
97
|
+
onDrag(event) {
|
|
98
|
+
this.dndDrag.emit(event);
|
|
99
|
+
}
|
|
100
|
+
onDragEnd(event) {
|
|
101
|
+
// get drop effect from custom stored state as its not reliable across browsers
|
|
102
|
+
const dropEffect = dndState.dropEffect;
|
|
103
|
+
let dropEffectEmitter;
|
|
104
|
+
switch (dropEffect) {
|
|
105
|
+
case "copy":
|
|
106
|
+
dropEffectEmitter = this.dndCopied;
|
|
107
|
+
break;
|
|
108
|
+
case "link":
|
|
109
|
+
dropEffectEmitter = this.dndLinked;
|
|
110
|
+
break;
|
|
111
|
+
case "move":
|
|
112
|
+
dropEffectEmitter = this.dndMoved;
|
|
113
|
+
break;
|
|
114
|
+
default:
|
|
115
|
+
dropEffectEmitter = this.dndCanceled;
|
|
116
|
+
break;
|
|
117
|
+
}
|
|
118
|
+
dropEffectEmitter.emit(event);
|
|
119
|
+
this.dndEnd.emit(event);
|
|
120
|
+
// reset global state
|
|
121
|
+
endDrag();
|
|
122
|
+
this.isDragStarted = false;
|
|
123
|
+
this.renderer.removeClass(this.dragImage, this.dndDraggingClass);
|
|
124
|
+
// IE9 special hammering
|
|
125
|
+
window.setTimeout(() => {
|
|
126
|
+
this.renderer.removeClass(this.elementRef.nativeElement, this.dndDraggingSourceClass);
|
|
127
|
+
}, 0);
|
|
128
|
+
event.stopPropagation();
|
|
129
|
+
}
|
|
130
|
+
registerDragHandle(handle) {
|
|
131
|
+
this.dndHandle = handle;
|
|
132
|
+
}
|
|
133
|
+
registerDragImage(elementRef) {
|
|
134
|
+
this.dndDragImageElementRef = elementRef;
|
|
135
|
+
}
|
|
136
|
+
determineDragImage() {
|
|
137
|
+
// evaluate custom drag image existence
|
|
138
|
+
if (typeof this.dndDragImageElementRef !== "undefined") {
|
|
139
|
+
return this.dndDragImageElementRef.nativeElement;
|
|
140
|
+
}
|
|
141
|
+
else {
|
|
142
|
+
return this.elementRef.nativeElement;
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
DndDraggableDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: DndDraggableDirective, deps: [{ token: i0.ElementRef }, { token: i0.Renderer2 }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Directive });
|
|
147
|
+
DndDraggableDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "13.3.11", 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 });
|
|
148
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: DndDraggableDirective, decorators: [{
|
|
149
|
+
type: Directive,
|
|
150
|
+
args: [{
|
|
151
|
+
selector: "[dndDraggable]"
|
|
152
|
+
}]
|
|
153
|
+
}], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.Renderer2 }, { type: i0.NgZone }]; }, propDecorators: { dndDraggable: [{
|
|
154
|
+
type: Input
|
|
155
|
+
}], dndEffectAllowed: [{
|
|
156
|
+
type: Input
|
|
157
|
+
}], dndType: [{
|
|
158
|
+
type: Input
|
|
159
|
+
}], dndDraggingClass: [{
|
|
160
|
+
type: Input
|
|
161
|
+
}], dndDraggingSourceClass: [{
|
|
162
|
+
type: Input
|
|
163
|
+
}], dndDraggableDisabledClass: [{
|
|
164
|
+
type: Input
|
|
165
|
+
}], dndDragImageOffsetFunction: [{
|
|
166
|
+
type: Input
|
|
167
|
+
}], dndStart: [{
|
|
168
|
+
type: Output
|
|
169
|
+
}], dndDrag: [{
|
|
170
|
+
type: Output
|
|
171
|
+
}], dndEnd: [{
|
|
172
|
+
type: Output
|
|
173
|
+
}], dndMoved: [{
|
|
174
|
+
type: Output
|
|
175
|
+
}], dndCopied: [{
|
|
176
|
+
type: Output
|
|
177
|
+
}], dndLinked: [{
|
|
178
|
+
type: Output
|
|
179
|
+
}], dndCanceled: [{
|
|
180
|
+
type: Output
|
|
181
|
+
}], draggable: [{
|
|
182
|
+
type: HostBinding,
|
|
183
|
+
args: ["attr.draggable"]
|
|
184
|
+
}], dndDisableIf: [{
|
|
185
|
+
type: Input
|
|
186
|
+
}], dndDisableDragIf: [{
|
|
187
|
+
type: Input
|
|
188
|
+
}], onDragStart: [{
|
|
189
|
+
type: HostListener,
|
|
190
|
+
args: ["dragstart", ["$event"]]
|
|
191
|
+
}], onDragEnd: [{
|
|
192
|
+
type: HostListener,
|
|
193
|
+
args: ["dragend", ["$event"]]
|
|
194
|
+
}] } });
|
|
195
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG5kLWRyYWdnYWJsZS5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9kbmQvc3JjL2xpYi9kbmQtZHJhZ2dhYmxlLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBRUwsU0FBUyxFQUVULFlBQVksRUFDWixVQUFVLEVBQ1YsV0FBVyxFQUNYLFlBQVksRUFDWixNQUFNLEVBQ04sS0FBSyxFQUdMLE1BQU0sRUFFUCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsd0JBQXdCLEVBQXdDLFdBQVcsRUFBRSxZQUFZLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFFeEgsT0FBTyxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sYUFBYSxDQUFDOztBQU0zRCxNQUFNLE9BQU8sd0JBQXdCO0lBRW5DLFlBQTZELE1BQTZCLEVBQUUsVUFBcUI7UUFDL0csTUFBTSxDQUFDLGlCQUFpQixDQUFFLFVBQVUsQ0FBRSxDQUFDO0lBQ3pDLENBQUM7O3NIQUpVLHdCQUF3QixrQkFFZixVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMscUJBQXFCLENBQUM7MEdBRmhELHdCQUF3Qjs0RkFBeEIsd0JBQXdCO2tCQUhwQyxTQUFTO21CQUFFO29CQUNWLFFBQVEsRUFBRSxtQkFBbUI7aUJBQzlCOzBEQUdzRSxxQkFBcUI7MEJBQTdFLE1BQU07MkJBQUMsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLHFCQUFxQixDQUFDOztBQVE3RCxNQUFNLE9BQU8scUJBQXFCO0lBNkVoQyxZQUFxQixVQUFxQixFQUNyQixRQUFrQixFQUNsQixNQUFhO1FBRmIsZUFBVSxHQUFWLFVBQVUsQ0FBVztRQUNyQixhQUFRLEdBQVIsUUFBUSxDQUFVO1FBQ2xCLFdBQU0sR0FBTixNQUFNLENBQU87UUF6RWxDLHFCQUFnQixHQUFpQixNQUFNLENBQUM7UUFNeEMscUJBQWdCLEdBQUcsYUFB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QUMsYUFBYSxDQUFDO1NBQ3RDO0lBQ0gsQ0FBQzs7bUhBdk5VLHFCQUFxQjt1R0FBckIscUJBQXFCOzRGQUFyQixxQkFBcUI7a0JBSGpDLFNBQVM7bUJBQUU7b0JBQ1YsUUFBUSxFQUFFLGdCQUFnQjtpQkFDM0I7OElBSUMsWUFBWTtzQkFEWCxLQUFLO2dCQUlOLGdCQUFnQjtzQkFEZixLQUFLO2dCQUlOLE9BQU87c0JBRE4sS0FBSztnQkFJTixnQkFBZ0I7c0JBRGYsS0FBSztnQkFJTixzQkFBc0I7c0JBRHJCLEtBQUs7Z0JBSU4seUJBQXlCO3NCQUR4QixLQUFLO2dCQUlOLDBCQUEwQjtzQkFEekIsS0FBSztnQkFJRyxRQUFRO3NCQURoQixNQUFNO2dCQUlFLE9BQU87c0JBRGYsTUFBTTtnQkFJRSxNQUFNO3NCQURkLE1BQU07Z0JBSUUsUUFBUTtzQkFEaEIsTUFBTTtnQkFJRSxTQUFTO3NCQURqQixNQUFNO2dCQUlFLFNBQVM7c0JBRGpCLE1BQU07Z0JBSUUsV0FBVztzQkFEbkIsTUFBTTtnQkFJUCxTQUFTO3NCQURSLFdBQVc7dUJBQUUsZ0JBQWdCO2dCQWMxQixZQUFZO3NCQURmLEtBQUs7Z0JBZ0JGLGdCQUFnQjtzQkFEbkIsS0FBSztnQkF3Qk4sV0FBVztzQkFEVixZQUFZO3VCQUFFLFdBQVcsRUFBRSxDQUFFLFFBQVEsQ0FBRTtnQkF1RHhDLFNBQVM7c0JBRFIsWUFBWTt1QkFBRSxTQUFTLEVBQUUsQ0FBRSxRQUFRLENBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBBZnRlclZpZXdJbml0LFxuICBEaXJlY3RpdmUsXG4gIEVsZW1lbnRSZWYsXG4gIEV2ZW50RW1pdHRlcixcbiAgZm9yd2FyZFJlZixcbiAgSG9zdEJpbmRpbmcsXG4gIEhvc3RMaXN0ZW5lcixcbiAgSW5qZWN0LFxuICBJbnB1dCxcbiAgTmdab25lLFxuICBPbkRlc3Ryb3ksXG4gIE91dHB1dCxcbiAgUmVuZGVyZXIyXG59IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5pbXBvcnQgeyBjYWxjdWxhdGVEcmFnSW1hZ2VPZmZzZXQsIERuZERyYWdJbWFnZU9mZnNldEZ1bmN0aW9uLCBEbmRFdmVudCwgc2V0RHJhZ0RhdGEsIHNldERyYWdJbWFnZSB9IGZyb20gXCIuL2RuZC11dGlsc1wiO1xuaW1wb3J0IHsgRG5kSGFuZGxlRGlyZWN0aXZlIH0gZnJvbSBcIi4vZG5kLWhhbmRsZS5kaXJlY3RpdmVcIjtcbmltcG9ydCB7IGRuZFN0YXRlLCBlbmREcmFnLCBzdGFydERyYWcgfSBmcm9tIFwiLi9kbmQtc3RhdGVcIjtcbmltcG9ydCB7IEVmZmVjdEFsbG93ZWQgfSBmcm9tIFwiLi9kbmQtdHlwZXNcIjtcblxuQERpcmVjdGl2ZSgge1xuICBzZWxlY3RvcjogXCJbZG5kRHJhZ0ltYWdlUmVmXVwiXG59IClcbmV4cG9ydCBjbGFzcyBEbmREcmFnSW1hZ2VSZWZEaXJlY3RpdmUge1xuXG4gIGNvbnN0cnVjdG9yKEBJbmplY3QoZm9yd2FyZFJlZigoKSA9PiBEbmREcmFnZ2FibGVEaXJlY3RpdmUpKSBwYXJlbnQ6IERuZERyYWdnYWJsZURpcmVjdGl2ZSwgZWxlbWVudFJlZjpFbGVtZW50UmVmICkge1xuICAgIHBhcmVudC5yZWdpc3RlckRyYWdJbWFnZSggZWxlbWVudFJlZiApO1xuICB9XG59XG5cbkBEaXJlY3RpdmUoIHtcbiAgc2VsZWN0b3I6IFwiW2RuZERyYWdnYWJsZV1cIlxufSApXG5leHBvcnQgY2xhc3MgRG5kRHJhZ2dhYmxlRGlyZWN0aXZlIGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95IHtcblxuICBASW5wdXQoKVxuICBkbmREcmFnZ2FibGU6YW55O1xuXG4gIEBJbnB1dCgpXG4gIGRuZEVmZmVjdEFsbG93ZWQ6RWZmZWN0QWxsb3dlZCA9IFwiY29weVwiO1xuXG4gIEBJbnB1dCgpXG4gIGRuZFR5cGU/OnN0cmluZztcblxuICBASW5wdXQoKVxuICBkbmREcmFnZ2luZ0NsYXNzID0gXCJkbmREcmFnZ2luZ1wiO1xuXG4gIEBJbnB1dCgpXG4gIGRuZERyYWdnaW5nU291cmNlQ2xhc3MgPSBcImRuZERyYWdnaW5nU291cmNlXCI7XG5cbiAgQElucHV0KClcbiAgZG5kRHJhZ2dhYmxlRGlzYWJsZWRDbGFzcyA9IFwiZG5kRHJhZ2dhYmxlRGlzYWJsZWRcIjtcblxuICBASW5wdXQoKVxuICBkbmREcmFnSW1hZ2VPZmZzZXRGdW5jdGlvbjpEbmREcmFnSW1hZ2VPZmZzZXRGdW5jdGlvbiA9IGNhbGN1bGF0ZURyYWdJbWFnZU9mZnNldDtcblxuICBAT3V0cHV0KClcbiAgcmVhZG9ubHkgZG5kU3RhcnQ6RXZlbnRFbWl0dGVyPERyYWdFdmVudD4gPSBuZXcgRXZlbnRFbWl0dGVyPERyYWdFdmVudD4oKTtcblxuICBAT3V0cHV0KClcbiAgcmVhZG9ubHkgZG5kRHJhZzpFdmVudEVtaXR0ZXI8RHJhZ0V2ZW50PiA9IG5ldyBFdmVudEVtaXR0ZXI8RHJhZ0V2ZW50PigpO1xuXG4gIEBPdXRwdXQoKVxuICByZWFkb25seSBkbmRFbmQ6RXZlbnRFbWl0dGVyPERyYWdFdmVudD4gPSBuZXcgRXZlbnRFbWl0dGVyPERyYWdFdmVudD4oKTtcblxuICBAT3V0cHV0KClcbiAgcmVhZG9ubHkgZG5kTW92ZWQ6RXZlbnRFbWl0dGVyPERyYWdFdmVudD4gPSBuZXcgRXZlbnRFbWl0dGVyPERyYWdFdmVudD4oKTtcblxuICBAT3V0cHV0KClcbiAgcmVhZG9ubHkgZG5kQ29waWVkOkV2ZW50RW1pdHRlcjxEcmFnRXZlbnQ+ID0gbmV3IEV2ZW50RW1pdHRlcjxEcmFnRXZlbnQ+KCk7XG5cbiAgQE91dHB1dCgpXG4gIHJlYWRvbmx5IGRuZExpbmtlZDpFdmVudEVtaXR0ZXI8RHJhZ0V2ZW50PiA9IG5ldyBFdmVudEVtaXR0ZXI8RHJhZ0V2ZW50PigpO1xuXG4gIEBPdXRwdXQoKVxuICByZWFkb25seSBkbmRDYW5jZWxlZDpFdmVudEVtaXR0ZXI8RHJhZ0V2ZW50PiA9IG5ldyBFdmVudEVtaXR0ZXI8RHJhZ0V2ZW50PigpO1xuXG4gIEBIb3N0QmluZGluZyggXCJhdHRyLmRyYWdnYWJsZVwiIClcbiAgZHJhZ2dhYmxlID0gdHJ1ZTtcblxuICBwcml2YXRlIGRuZEhhbmRsZT86RG5kSGFuZGxlRGlyZWN0aXZlO1xuXG4gIHByaXZhdGUgZG5kRHJhZ0ltYWdlRWxlbWVudFJlZj86RWxlbWVudFJlZjtcblxuICBwcml2YXRlIGRyYWdJbWFnZTpFbGVtZW50IHwgdW5kZWZpbmVkO1xuXG4gIHByaXZhdGUgaXNEcmFnU3RhcnRlZDpib29sZWFuID0gZmFsc2U7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBkcmFnRXZlbnRIYW5kbGVyOiggZXZlbnQ6RHJhZ0V2ZW50ICkgPT4gdm9pZCA9ICggZXZlbnQ6RHJhZ0V2ZW50ICkgPT4gdGhpcy5vbkRyYWcoIGV2ZW50ICk7XG5cbiAgQElucHV0KClcbiAgc2V0IGRuZERpc2FibGVJZiggdmFsdWU6Ym9vbGVhbiApIHtcblxuICAgIHRoaXMuZHJhZ2dhYmxlID0gIXZhbHVlO1xuXG4gICAgaWYoIHRoaXMuZHJhZ2dhYmxlICkge1xuXG4gICAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZUNsYXNzKCB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCwgdGhpcy5kbmREcmFnZ2FibGVEaXNhYmxlZENsYXNzICk7XG4gICAgfVxuICAgIGVsc2Uge1xuXG4gICAgICB0aGlzLnJlbmRlcmVyLmFkZENsYXNzKCB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCwgdGhpcy5kbmREcmFnZ2FibGVEaXNhYmxlZENsYXNzICk7XG4gICAgfVxuICB9XG5cbiAgQElucHV0KClcbiAgc2V0IGRuZERpc2FibGVEcmFnSWYoIHZhbHVlOmJvb2xlYW4gKSB7XG4gICAgdGhpcy5kbmREaXNhYmxlSWYgPSB2YWx1ZTtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKCBwcml2YXRlIGVsZW1lbnRSZWY6RWxlbWVudFJlZixcbiAgICAgICAgICAgICAgIHByaXZhdGUgcmVuZGVyZXI6UmVuZGVyZXIyLFxuICAgICAgICAgICAgICAgcHJpdmF0ZSBuZ1pvbmU6Tmdab25lICkge1xuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCk6dm9pZCB7XG4gICAgdGhpcy5uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoICgpID0+IHtcbiAgICAgIHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoIFwiZHJhZ1wiLCB0aGlzLmRyYWdFdmVudEhhbmRsZXIgKTtcbiAgICB9ICk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOnZvaWQge1xuICAgIHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoIFwiZHJhZ1wiLCB0aGlzLmRyYWdFdmVudEhhbmRsZXIgKTtcbiAgICBpZih0aGlzLmlzRHJhZ1N0YXJ0ZWQgPT09IHRydWUpIHtcbiAgICAgIGVuZERyYWcoKVxuICAgIH1cbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoIFwiZHJhZ3N0YXJ0XCIsIFsgXCIkZXZlbnRcIiBdIClcbiAgb25EcmFnU3RhcnQoIGV2ZW50OkRuZEV2ZW50ICk6IGJvb2xlYW4ge1xuXG4gICAgaWYoIHRoaXMuZHJhZ2dhYmxlID09PSBmYWxzZSApIHtcblxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8vIGNoZWNrIGlmIHRoZXJlIGlzIGRuZCBoYW5kbGUgYW5kIGlmIHRoZSBkbmQgaGFuZGxlIHdhcyB1c2VkIHRvIHN0YXJ0IHRoZSBkcmFnXG4gICAgaWYoIHR5cGVvZiB0aGlzLmRuZEhhbmRsZSAhPT0gXCJ1bmRlZmluZWRcIlxuICAgICAgJiYgdHlwZW9mIGV2ZW50Ll9kbmRVc2luZ0hhbmRsZSA9PT0gXCJ1bmRlZmluZWRcIiApIHtcblxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8vIGluaXRpYWxpemUgZ2xvYmFsIHN0YXRlXG4gICAgc3RhcnREcmFnKCBldmVudCwgdGhpcy5kbmRFZmZlY3RBbGxvd2VkLCB0aGlzLmRuZFR5cGUgKTtcblxuICAgIHRoaXMuaXNEcmFnU3RhcnRlZCA9IHRydWU7XG5cbiAgICBzZXREcmFnRGF0YSggZXZlbnQsIHtkYXRhOiB0aGlzLmRuZERyYWdnYWJsZSwgdHlwZTogdGhpcy5kbmRUeXBlfSwgZG5kU3RhdGUuZWZmZWN0QWxsb3dlZCEgKTtcblxuICAgIHRoaXMuZHJhZ0ltYWdlID0gdGhpcy5kZXRlcm1pbmVEcmFnSW1hZ2UoKTtcblxuICAgIC8vIHNldCBkcmFnZ2luZyBjc3MgY2xhc3MgcHJpb3IgdG8gc2V0RHJhZ0ltYWdlIHNvIHN0eWxlcyBhcmUgYXBwbGllZCBiZWZvcmVcbiAgICAvLyBUT0RPIGJyZWFraW5nIGNoYW5nZTogYWRkIGNsYXNzIHRvIGVsZW1lbnRSZWYgcmF0aGVyIHRoYW4gZHJhZyBpbWFnZSB3aGljaCBjb3VsZCBiZSBhbm90aGVyIGVsZW1lbnRcbiAgICB0aGlzLnJlbmRlcmVyLmFkZENsYXNzKCB0aGlzLmRyYWdJbWFnZSwgdGhpcy5kbmREcmFnZ2luZ0NsYXNzICk7XG5cbiAgICAvLyBzZXQgY3VzdG9tIGRyYWdpbWFnZSBpZiBwcmVzZW50XG4gICAgLy8gc2V0IGRyYWdpbWFnZSBpZiBkcmFnIGlzIHN0YXJ0ZWQgZnJvbSBkbmRIYW5kbGVcbiAgICBpZiggdHlwZW9mIHRoaXMuZG5kRHJhZ0ltYWdlRWxlbWVudFJlZiAhPT0gXCJ1bmRlZmluZWRcIlxuICAgICAgfHwgdHlwZW9mIGV2ZW50Ll9kbmRVc2luZ0hhbmRsZSAhPT0gXCJ1bmRlZmluZWRcIiApIHtcblxuICAgICAgc2V0RHJhZ0ltYWdlKCBldmVudCwgdGhpcy5kcmFnSW1hZ2UsIHRoaXMuZG5kRHJhZ0ltYWdlT2Zmc2V0RnVuY3Rpb24gKTtcbiAgICB9XG5cbiAgICAvLyBhZGQgZHJhZ2dpbmcgc291cmNlIGNzcyBjbGFzcyBvbiBmaXJzdCBkcmFnIGV2ZW50XG4gICAgY29uc3QgdW5yZWdpc3RlciA9IHRoaXMucmVuZGVyZXIubGlzdGVuKCB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCwgXCJkcmFnXCIsICgpID0+IHtcblxuICAgICAgdGhpcy5yZW5kZXJlci5hZGRDbGFzcyggdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsIHRoaXMuZG5kRHJhZ2dpbmdTb3VyY2VDbGFzcyApO1xuICAgICAgdW5yZWdpc3RlcigpO1xuICAgIH0gKTtcblxuICAgIHRoaXMuZG5kU3RhcnQuZW1pdCggZXZlbnQgKTtcblxuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgb25EcmFnKCBldmVudDpEcmFnRXZlbnQgKSB7XG5cbiAgICB0aGlzLmRuZERyYWcuZW1pdCggZXZlbnQgKTtcbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoIFwiZHJhZ2VuZFwiLCBbIFwiJGV2ZW50XCIgXSApXG4gIG9uRHJhZ0VuZCggZXZlbnQ6RHJhZ0V2ZW50ICkge1xuXG4gICAgLy8gZ2V0IGRyb3AgZWZmZWN0IGZyb20gY3VzdG9tIHN0b3JlZCBzdGF0ZSBhcyBpdHMgbm90IHJlbGlhYmxlIGFjcm9zcyBicm93c2Vyc1xuICAgIGNvbnN0IGRyb3BFZmZlY3QgPSBkbmRTdGF0ZS5kcm9wRWZmZWN0O1xuXG4gICAgbGV0IGRyb3BFZmZlY3RFbWl0dGVyOkV2ZW50RW1pdHRlcjxEcmFnRXZlbnQ+O1xuXG4gICAgc3dpdGNoKCBkcm9wRWZmZWN0ICkge1xuXG4gICAgICBjYXNlIFwiY29weVwiOlxuICAgICAgICBkcm9wRWZmZWN0RW1pdHRlciA9IHRoaXMuZG5kQ29waWVkO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBcImxpbmtcIjpcbiAgICAgICAgZHJvcEVmZmVjdEVtaXR0ZXIgPSB0aGlzLmRuZExpbmtlZDtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgXCJtb3ZlXCI6XG4gICAgICAgIGRyb3BFZmZlY3RFbWl0dGVyID0gdGhpcy5kbmRNb3ZlZDtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGRyb3BFZmZlY3RFbWl0dGVyID0gdGhpcy5kbmRDYW5jZWxlZDtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgZHJvcEVmZmVjdEVtaXR0ZXIuZW1pdCggZXZlbnQgKTtcbiAgICB0aGlzLmRuZEVuZC5lbWl0KCBldmVudCApO1xuXG4gICAgLy8gcmVzZXQgZ2xvYmFsIHN0YXRlXG4gICAgZW5kRHJhZygpO1xuXG4gICAgdGhpcy5pc0RyYWdTdGFydGVkID0gZmFsc2U7XG5cbiAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZUNsYXNzKCB0aGlzLmRyYWdJbWFnZSwgdGhpcy5kbmREcmFnZ2luZ0NsYXNzICk7XG5cbiAgICAvLyBJRTkgc3BlY2lhbCBoYW1tZXJpbmdcbiAgICB3aW5kb3cuc2V0VGltZW91dCggKCkgPT4ge1xuICAgICAgdGhpcy5yZW5kZXJlci5yZW1vdmVDbGFzcyggdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsIHRoaXMuZG5kRHJhZ2dpbmdTb3VyY2VDbGFzcyApO1xuICAgIH0sIDAgKTtcblxuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICB9XG5cbiAgcmVnaXN0ZXJEcmFnSGFuZGxlKCBoYW5kbGU6RG5kSGFuZGxlRGlyZWN0aXZlIHwgdW5kZWZpbmVkICkge1xuXG4gICAgdGhpcy5kbmRIYW5kbGUgPSBoYW5kbGU7XG4gIH1cblxuICByZWdpc3RlckRyYWdJbWFnZSggZWxlbWVudFJlZjpFbGVtZW50UmVmIHwgdW5kZWZpbmVkICkge1xuXG4gICAgdGhpcy5kbmREcmFnSW1hZ2VFbGVtZW50UmVmID0gZWxlbWVudFJlZjtcbiAgfVxuXG4gIHByaXZhdGUgZGV0ZXJtaW5lRHJhZ0ltYWdlKCk6RWxlbWVudCB7XG5cbiAgICAvLyBldmFsdWF0ZSBjdXN0b20gZHJhZyBpbWFnZSBleGlzdGVuY2VcbiAgICBpZiggdHlwZW9mIHRoaXMuZG5kRHJhZ0ltYWdlRWxlbWVudFJlZiAhPT0gXCJ1bmRlZmluZWRcIiApIHtcblxuICAgICAgcmV0dXJuIHRoaXMuZG5kRHJhZ0ltYWdlRWxlbWVudFJlZi5uYXRpdmVFbGVtZW50IGFzIEVsZW1lbnQ7XG4gICAgfVxuICAgIGVsc2Uge1xuXG4gICAgICByZXR1cm4gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7XG4gICAgfVxuICB9XG59XG4iXX0=
|
|
@@ -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.3.11", ngImport: i0, type: DndPlaceholderRefDirective, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Directive });
|
|
11
|
+
DndPlaceholderRefDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "13.3.11", type: DndPlaceholderRefDirective, selector: "[dndPlaceholderRef]", ngImport: i0 });
|
|
12
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.11", 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.3.11", 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.3.11", 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.3.11", 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG5kLWRyb3B6b25lLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2RuZC9zcmMvbGliL2RuZC1kcm9wem9uZS5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUVMLFlBQVksRUFDWixTQUFTLEVBRVQsWUFBWSxFQUNaLFlBQVksRUFDWixLQUFLLEVBR0wsTUFBTSxFQUVQLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFHTCxxQkFBcUIsRUFDckIsV0FBVyxFQUNYLHNDQUFzQyxFQUN2QyxNQUFNLGFBQWEsQ0FBQztBQUNyQixPQUFPLEVBQUUsVUFBVSxFQUFFLGFBQWEsRUFBRSxjQUFjLEVBQUUsYUFBYSxFQUFFLE1BQU0sYUFBYSxDQUFDOztBQWV2RixNQUFNLE9BQU8sMEJBQTBCO0lBRXJDLFlBQTZCLFVBQXFCO1FBQXJCLGVBQVUsR0FBVixVQUFVLENBQVc7SUFDbEQsQ0FBQzs7d0hBSFUsMEJBQTBCOzRHQUExQiwwQkFBMEI7NEZBQTFCLDBCQUEwQjtrQkFIdEMsU0FBUzttQkFBRTtvQkFDVixRQUFRLEVBQUUscUJBQXFCO2lCQUNoQzs7QUFVRCxNQUFNLE9BQU8sb0JBQW9CO0lBeUQvQixZQUFxQixNQUFhLEVBQ2IsVUFBcUIsRUFDckIsUUFBa0I7UUFGbEIsV0FBTSxHQUFOLE1BQU0sQ0FBTztRQUNiLGVBQVUsR0FBVixVQUFVLENBQVc7UUFDckIsYUFBUSxHQUFSLFFBQVEsQ0FBVTtRQXhEdkMsZ0JBQVcsR0FBa0IsRUFBRSxDQUFDO1FBR2hDLHFCQUFnQixHQUFpQixlQUFlLENBQUM7UUFHakQscUJBQWdCLEdBQVcsS0FBSyxDQUFDO1FBR2pDLGtCQUFhLEdBQVcsS0FBSyxDQUFDO1FBRzlCLHFCQUFnQixHQUFVLGFBQWEsQ0FBQztRQUd4Qyw2QkFBd0IsR0FBRyxxQkFBcUIsQ0FBQztRQUd4QyxnQkFBVyxHQUEyQixJQUFJLFlBQVksRUFB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Q2xDLENBQUM7O2tIQTNWVSxvQkFBb0I7c0dBQXBCLG9CQUFvQix3Z0JBMEJoQiwwQkFBMEI7NEZBMUI5QixvQkFBb0I7a0JBSGhDLFNBQVM7bUJBQUU7b0JBQ1YsUUFBUSxFQUFFLGVBQWU7aUJBQzFCOzhJQUlDLFdBQVc7c0JBRFYsS0FBSztnQkFJTixnQkFBZ0I7c0JBRGYsS0FBSztnQkFJTixnQkFBZ0I7c0JBRGYsS0FBSztnQkFJTixhQUFhO3NCQURaLEtBQUs7Z0JBSU4sZ0JBQWdCO3NCQURmLEtBQUs7Z0JBSU4sd0JBQXdCO3NCQUR2QixLQUFLO2dCQUlHLFdBQVc7c0JBRG5CLE1BQU07Z0JBSUUsT0FBTztzQkFEZixNQUFNO2dCQUlVLGlCQUFpQjtzQkFEakMsWUFBWTt1QkFBRSwwQkFBMEI7Z0JBWXJDLFlBQVk7c0JBRGYsS0FBSztnQkFnQkYsZ0JBQWdCO3NCQURuQixLQUFLO2dCQW9HTixNQUFNO3NCQURMLFlBQVk7dUJBQUUsTUFBTSxFQUFFLENBQUUsUUFBUSxDQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgQ29udGVudENoaWxkLFxuICBEaXJlY3RpdmUsXG4gIEVsZW1lbnRSZWYsXG4gIEV2ZW50RW1pdHRlcixcbiAgSG9zdExpc3RlbmVyLFxuICBJbnB1dCxcbiAgTmdab25lLFxuICBPbkRlc3Ryb3ksXG4gIE91dHB1dCxcbiAgUmVuZGVyZXIyXG59IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5pbXBvcnQge1xuICBEbmRFdmVudCxcbiAgRHJhZ0Ryb3BEYXRhLFxuICBnZXREaXJlY3RDaGlsZEVsZW1lbnQsXG4gIGdldERyb3BEYXRhLFxuICBzaG91bGRQb3NpdGlvblBsYWNlaG9sZGVyQmVmb3JlRWxlbWVudFxufSBmcm9tIFwiLi9kbmQtdXRpbHNcIjtcbmltcG9ydCB7IGdldERuZFR5cGUsIGdldERyb3BFZmZlY3QsIGlzRXh0ZXJuYWxEcmFnLCBzZXREcm9wRWZmZWN0IH0gZnJvbSBcIi4vZG5kLXN0YXRlXCI7XG5pbXBvcnQgeyBEcm9wRWZmZWN0LCBFZmZlY3RBbGxvd2VkIH0gZnJvbSBcIi4vZG5kLXR5cGVzXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRG5kRHJvcEV2ZW50IHtcbiAgZXZlbnQ6RHJhZ0V2ZW50O1xuICBkcm9wRWZmZWN0OkRyb3BFZmZlY3Q7XG4gIGlzRXh0ZXJuYWw6Ym9vbGVhbjtcbiAgZGF0YT86YW55O1xuICBpbmRleD86bnVtYmVyO1xuICB0eXBlPzphbnk7XG59XG5cbkBEaXJlY3RpdmUoIHtcbiAgc2VsZWN0b3I6IFwiW2RuZFBsYWNlaG9sZGVyUmVmXVwiXG59IClcbmV4cG9ydCBjbGFzcyBEbmRQbGFjZWhvbGRlclJlZkRpcmVjdGl2ZSB7XG5cbiAgY29uc3RydWN0b3IoIHB1YmxpYyByZWFkb25seSBlbGVtZW50UmVmOkVsZW1lbnRSZWYgKSB7XG4gIH1cbn1cblxuQERpcmVjdGl2ZSgge1xuICBzZWxlY3RvcjogXCJbZG5kRHJvcHpvbmVdXCJcbn0gKVxuZXhwb3J0IGNsYXNzIERuZERyb3B6b25lRGlyZWN0aXZlIGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95IHtcblxuICBASW5wdXQoKVxuICBkbmREcm9wem9uZT86c3RyaW5nW10gfCBcIlwiID0gXCJcIjtcblxuICBASW5wdXQoKVxuICBkbmRFZmZlY3RBbGxvd2VkOkVmZmVjdEFsbG93ZWQgPSBcInVuaW5pdGlhbGl6ZWRcIjtcblxuICBASW5wdXQoKVxuICBkbmRBbGxvd0V4dGVybmFsOmJvb2xlYW4gPSBmYWxzZTtcblxuICBASW5wdXQoKVxuICBkbmRIb3Jpem9udGFsOmJvb2xlYW4gPSBmYWxzZTtcblxuICBASW5wdXQoKVxuICBkbmREcmFnb3ZlckNsYXNzOnN0cmluZyA9IFwiZG5kRHJhZ292ZXJcIjtcblxuICBASW5wdXQoKVxuICBkbmREcm9wem9uZURpc2FibGVkQ2xhc3MgPSBcImRuZERyb3B6b25lRGlzYWJsZWRcIjtcblxuICBAT3V0cHV0KClcbiAgcmVhZG9ubHkgZG5kRHJhZ292ZXI6RXZlbnRFbWl0dGVyPERyYWdFdmVudD4gPSBuZXcgRXZlbnRFbWl0dGVyPERyYWdFdmVudD4oKTtcblxuICBAT3V0cHV0KClcbiAgcmVhZG9ubHkgZG5kRHJvcDpFdmVudEVtaXR0ZXI8RG5kRHJvcEV2ZW50PiA9IG5ldyBFdmVudEVtaXR0ZXI8RG5kRHJvcEV2ZW50PigpO1xuXG4gIEBDb250ZW50Q2hpbGQoIERuZFBsYWNlaG9sZGVyUmVmRGlyZWN0aXZlIClcbiAgcHJpdmF0ZSByZWFkb25seSBkbmRQbGFjZWhvbGRlclJlZj86RG5kUGxhY2Vob2xkZXJSZWZEaXJlY3RpdmU7XG5cbiAgcHJpdmF0ZSBwbGFjZWhvbGRlcjpFbGVtZW50IHwgbnVsbCA9IG51bGw7XG5cbiAgcHJpdmF0ZSBkaXNhYmxlZDpib29sZWFuID0gZmFsc2U7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBkcmFnRW50ZXJFdmVudEhhbmRsZXI6KCBldmVudDpEcmFnRXZlbnQgKSA9PiB2b2lkID0gKCBldmVudDpEcmFnRXZlbnQgKSA9PiB0aGlzLm9uRHJhZ0VudGVyKCBldmVudCApO1xuICBwcml2YXRlIHJlYWRvbmx5IGRyYWdPdmVyRXZlbnRIYW5kbGVyOiggZXZlbnQ6RHJhZ0V2ZW50ICkgPT4gdm9pZCA9ICggZXZlbnQ6RHJhZ0V2ZW50ICkgPT4gdGhpcy5vbkRyYWdPdmVyKCBldmVudCApO1xuICBwcml2YXRlIHJlYWRvbmx5IGRyYWdMZWF2ZUV2ZW50SGFuZGxlcjooIGV2ZW50OkRyYWdFdmVudCApID0+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.3.11", ngImport: i0, type: DndHandleDirective, deps: [{ token: i1.DndDraggableDirective }], target: i0.ɵɵFactoryTarget.Directive });
|
|
14
|
+
DndHandleDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "13.3.11", 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.3.11", 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG5kLWhhbmRsZS5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9kbmQvc3JjL2xpYi9kbmQtaGFuZGxlLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSxZQUFZLEVBQUUsTUFBTSxlQUFlLENBQUM7OztBQU9yRSxNQUFNLE9BQU8sa0JBQWtCO0lBSzdCLFlBQWEsTUFBNEI7UUFGekMsY0FBUyxHQUFHLElBQUksQ0FBQztRQUlmLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBRSxJQUFJLENBQUUsQ0FBQztJQUNwQyxDQUFDO0lBSUQsV0FBVyxDQUFFLEtBQWM7UUFFekIsS0FBSyxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUM7SUFDL0IsQ0FBQzs7Z0hBZlUsa0JBQWtCO29HQUFsQixrQkFBa0I7NEZBQWxCLGtCQUFrQjtrQkFIOUIsU0FBUzttQkFBRTtvQkFDVixRQUFRLEVBQUUsYUFBYTtpQkFDeEI7NEdBSUMsU0FBUztzQkFEUixXQUFXO3VCQUFFLGdCQUFnQjtnQkFVOUIsV0FBVztzQkFGVixZQUFZO3VCQUFFLFdBQVcsRUFBRSxDQUFFLFFBQVEsQ0FBRTs7c0JBQ3ZDLFlBQVk7dUJBQUUsU0FBUyxFQUFFLENBQUUsUUFBUSxDQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGlyZWN0aXZlLCBIb3N0QmluZGluZywgSG9zdExpc3RlbmVyIH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCB7IERuZEV2ZW50IH0gZnJvbSBcIi4vZG5kLXV0aWxzXCI7XG5pbXBvcnQgeyBEbmREcmFnZ2FibGVEaXJlY3RpdmUgfSBmcm9tIFwiLi9kbmQtZHJhZ2dhYmxlLmRpcmVjdGl2ZVwiO1xuXG5ARGlyZWN0aXZlKCB7XG4gIHNlbGVjdG9yOiBcIltkbmRIYW5kbGVdXCJcbn0gKVxuZXhwb3J0IGNsYXNzIERuZEhhbmRsZURpcmVjdGl2ZSB7XG5cbiAgQEhvc3RCaW5kaW5nKCBcImF0dHIuZHJhZ2dhYmxlXCIgKVxuICBkcmFnZ2FibGUgPSB0cnVlO1xuXG4gIGNvbnN0cnVjdG9yKCBwYXJlbnQ6RG5kRHJhZ2dhYmxlRGlyZWN0aXZlICkge1xuXG4gICAgcGFyZW50LnJlZ2lzdGVyRHJhZ0hhbmRsZSggdGhpcyApO1xuICB9XG5cbiAgQEhvc3RMaXN0ZW5lciggXCJkcmFnc3RhcnRcIiwgWyBcIiRldmVudFwiIF0gKVxuICBASG9zdExpc3RlbmVyKCBcImRyYWdlbmRcIiwgWyBcIiRldmVudFwiIF0gKVxuICBvbkRyYWdFdmVudCggZXZlbnQ6RG5kRXZlbnQgKSB7XG5cbiAgICBldmVudC5fZG5kVXNpbmdIYW5kbGUgPSB0cnVlO1xuICB9XG59XG4iXX0=
|