@tft/interact 14.0.0 → 15.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/{esm2020 → esm2022}/index.mjs +5 -5
- package/{esm2020 → esm2022}/lib/directives/account-for-scale.directive.mjs +26 -26
- package/{esm2020 → esm2022}/lib/directives/apply-scale.directive.mjs +28 -28
- package/esm2022/lib/directives/auto-scroll.directive.mjs +56 -0
- package/{esm2020 → esm2022}/lib/directives/drag-preview.directive.mjs +20 -20
- package/{esm2020 → esm2022}/lib/directives/drag-root.directive.mjs +32 -32
- package/{esm2020 → esm2022}/lib/directives/draggable.directive.mjs +320 -320
- package/{esm2020 → esm2022}/lib/directives/dropzone.directive.mjs +114 -114
- package/{esm2020 → esm2022}/lib/directives/gesturable.directive.mjs +82 -82
- package/{esm2020 → esm2022}/lib/directives/index.mjs +9 -9
- package/esm2022/lib/directives/resizable.directive.mjs +228 -0
- package/{esm2020 → esm2022}/lib/interact.module.mjs +66 -66
- package/{esm2020 → esm2022}/lib/models/index.mjs +1 -1
- package/{esm2020 → esm2022}/lib/models/interact.mjs +27 -27
- package/{esm2020 → esm2022}/lib/pipes/array-of-n.pipe.mjs +22 -22
- package/{esm2020 → esm2022}/lib/pipes/index.mjs +1 -1
- package/{esm2020 → esm2022}/lib/services/interact.service.mjs +197 -197
- package/{esm2020 → esm2022}/lib/utils/helpers.mjs +34 -34
- package/{esm2020 → esm2022}/lib/utils/index.mjs +1 -1
- package/{esm2020 → esm2022}/tft-interact.mjs +4 -4
- package/{fesm2020 → fesm2022}/tft-interact.mjs +1155 -1155
- package/{fesm2020 → fesm2022}/tft-interact.mjs.map +1 -1
- package/index.d.ts +5 -5
- package/lib/directives/account-for-scale.directive.d.ts +15 -15
- package/lib/directives/apply-scale.directive.d.ts +11 -11
- package/lib/directives/auto-scroll.directive.d.ts +34 -34
- package/lib/directives/drag-preview.directive.d.ts +10 -10
- package/lib/directives/drag-root.directive.d.ts +15 -15
- package/lib/directives/draggable.directive.d.ts +76 -76
- package/lib/directives/dropzone.directive.d.ts +40 -40
- package/lib/directives/gesturable.directive.d.ts +27 -27
- package/lib/directives/index.d.ts +9 -9
- package/lib/directives/resizable.directive.d.ts +61 -61
- package/lib/interact.module.d.ts +20 -20
- package/lib/models/index.d.ts +1 -1
- package/lib/models/interact.d.ts +140 -140
- package/lib/pipes/array-of-n.pipe.d.ts +12 -12
- package/lib/pipes/index.d.ts +1 -1
- package/lib/services/interact.service.d.ts +83 -83
- package/lib/utils/helpers.d.ts +12 -12
- package/lib/utils/index.d.ts +1 -1
- package/package.json +7 -15
- package/tft-interact-15.0.0.tgz +0 -0
- package/esm2020/lib/directives/auto-scroll.directive.mjs +0 -56
- package/esm2020/lib/directives/resizable.directive.mjs +0 -228
- package/fesm2015/tft-interact.mjs +0 -1203
- package/fesm2015/tft-interact.mjs.map +0 -1
- package/tft-interact-14.0.0.tgz +0 -0
|
@@ -1,197 +1,197 @@
|
|
|
1
|
-
import { Injectable, RendererFactory2, NgZone, Inject, Optional } from '@angular/core';
|
|
2
|
-
import { BehaviorSubject, combineLatest } from 'rxjs';
|
|
3
|
-
import { tap, map, shareReplay } from 'rxjs/operators';
|
|
4
|
-
import { defaultPosition, defaultSize, defaultDelta, DEFAULT_REGISTRY_ID, INTERACT_ROOT_CONFIG } from '../models';
|
|
5
|
-
import * as i0 from "@angular/core";
|
|
6
|
-
export class InteractService {
|
|
7
|
-
constructor(rendererFactory, ngZone, rootConfig) {
|
|
8
|
-
this.rendererFactory = rendererFactory;
|
|
9
|
-
this.ngZone = ngZone;
|
|
10
|
-
this.rootConfig = rootConfig;
|
|
11
|
-
this._interactableIndex = 0;
|
|
12
|
-
this._dropzoneIndex = 0;
|
|
13
|
-
// TODO: consider using Map here
|
|
14
|
-
this.dragRegistrySystem = {};
|
|
15
|
-
this.cssUnit = 'px';
|
|
16
|
-
this.renderer = this.rendererFactory.createRenderer(null, null);
|
|
17
|
-
this.cssUnit = rootConfig?.cssDimensionUnit || 'px';
|
|
18
|
-
}
|
|
19
|
-
addDeltaToPosition(delta, position) {
|
|
20
|
-
return {
|
|
21
|
-
x: delta.deltaX + position.x,
|
|
22
|
-
y: delta.deltaY + position.y,
|
|
23
|
-
targetElement: position.targetElement || delta.targetElement
|
|
24
|
-
};
|
|
25
|
-
}
|
|
26
|
-
addRegistryToSystem(customRegistryId = null) {
|
|
27
|
-
const registryId = customRegistryId || this.createDropzoneId(this._dropzoneIndex++);
|
|
28
|
-
this.dragRegistrySystem[registryId] = {};
|
|
29
|
-
return registryId;
|
|
30
|
-
}
|
|
31
|
-
addDraggableToRegistry(customRegistryId = null, interactableId = null) {
|
|
32
|
-
const registryId = customRegistryId || DEFAULT_REGISTRY_ID;
|
|
33
|
-
// if we pass an id to createInteractableId then it is used when creating the interactable
|
|
34
|
-
// and returned, otherwise a new id is created for the draggable.
|
|
35
|
-
const key = this.createInteractableId(interactableId);
|
|
36
|
-
if (!Object.prototype.hasOwnProperty.call(this.dragRegistrySystem, registryId)) {
|
|
37
|
-
this.dragRegistrySystem[registryId] = {};
|
|
38
|
-
}
|
|
39
|
-
this.dragRegistrySystem[registryId][key] = this.createInteractableState(defaultPosition, defaultSize, defaultDelta);
|
|
40
|
-
return key;
|
|
41
|
-
}
|
|
42
|
-
destroyInteractable(interactableId, registryId = DEFAULT_REGISTRY_ID) {
|
|
43
|
-
const interactableSystem = this.dragRegistrySystem[registryId][interactableId];
|
|
44
|
-
if (interactableSystem) {
|
|
45
|
-
// unsubscribe from all the subscriptions if they're subscriptions
|
|
46
|
-
for (const propName in interactableSystem) {
|
|
47
|
-
const prop = interactableSystem[propName];
|
|
48
|
-
if (prop.unsubscribe && typeof prop.unsubscribe === 'function') {
|
|
49
|
-
prop.unsubscribe();
|
|
50
|
-
}
|
|
51
|
-
;
|
|
52
|
-
}
|
|
53
|
-
delete this.dragRegistrySystem[registryId][interactableId];
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
subscribeToInteractable(interactableId, registryId = DEFAULT_REGISTRY_ID) {
|
|
57
|
-
return this.dragRegistrySystem[registryId][interactableId];
|
|
58
|
-
}
|
|
59
|
-
createInteractableState(initialPosition, initialSize, initialDelta) {
|
|
60
|
-
const deltas$ = new BehaviorSubject(initialDelta);
|
|
61
|
-
// tracks the size of the element
|
|
62
|
-
const size$ = new BehaviorSubject({ ...initialSize, ...initialDelta });
|
|
63
|
-
// Stream of positions as they change
|
|
64
|
-
const position$ = new BehaviorSubject(initialPosition);
|
|
65
|
-
// All draggable data mapped together
|
|
66
|
-
const interactable$ = combineLatest([
|
|
67
|
-
size$.pipe(
|
|
68
|
-
// startWith({...initialSize, ...initialDelta}),
|
|
69
|
-
shareReplay(1),
|
|
70
|
-
// filter(resizeEvent => !!resizeEvent.targetElement),
|
|
71
|
-
tap(({ deltaX, deltaY, width, height, targetElement }) => {
|
|
72
|
-
this.ngZone.runOutsideAngular(() => {
|
|
73
|
-
this.setElementSize(width, height, targetElement);
|
|
74
|
-
});
|
|
75
|
-
// only reposition if necessary i.e when resizing left or up
|
|
76
|
-
if (deltaX || deltaY) {
|
|
77
|
-
deltas$.next({ deltaX, deltaY, targetElement });
|
|
78
|
-
}
|
|
79
|
-
})),
|
|
80
|
-
deltas$.pipe(shareReplay(1), tap((delta) => {
|
|
81
|
-
const position = position$.value;
|
|
82
|
-
const newPosition = this.addDeltaToPosition(delta, position);
|
|
83
|
-
position$.next(newPosition);
|
|
84
|
-
})),
|
|
85
|
-
position$.pipe(shareReplay(1), tap(position => {
|
|
86
|
-
this.ngZone.runOutsideAngular(() => {
|
|
87
|
-
this.setElementTransform(position.x, position.y, position);
|
|
88
|
-
});
|
|
89
|
-
}))
|
|
90
|
-
]).pipe(shareReplay(1), map(([size, deltas, position]) => {
|
|
91
|
-
return {
|
|
92
|
-
x: position.x,
|
|
93
|
-
y: position.y,
|
|
94
|
-
deltaX: deltas.deltaX,
|
|
95
|
-
deltaY: deltas.deltaY,
|
|
96
|
-
width: size.width,
|
|
97
|
-
height: size.height,
|
|
98
|
-
targetElement: size.targetElement || position.targetElement || deltas.targetElement
|
|
99
|
-
};
|
|
100
|
-
}));
|
|
101
|
-
// TODO: update system to handle only returning interactable$
|
|
102
|
-
return {
|
|
103
|
-
deltas$,
|
|
104
|
-
position$,
|
|
105
|
-
size$,
|
|
106
|
-
interactable$
|
|
107
|
-
};
|
|
108
|
-
}
|
|
109
|
-
createInteractableId(customInteractableId = null) {
|
|
110
|
-
return customInteractableId || `interactable${this._interactableIndex++}`;
|
|
111
|
-
}
|
|
112
|
-
createDropzoneId(index) {
|
|
113
|
-
return `dropzone${index}`;
|
|
114
|
-
}
|
|
115
|
-
getInteractableState(interactableId, registryId = DEFAULT_REGISTRY_ID) {
|
|
116
|
-
return this.dragRegistrySystem[registryId][interactableId].interactable$;
|
|
117
|
-
}
|
|
118
|
-
updateDeltas(interactId, registryId, { deltaX, deltaY }, targetElement) {
|
|
119
|
-
if (!this.interactableExistOnRegistry(interactId, registryId))
|
|
120
|
-
return;
|
|
121
|
-
this.dragRegistrySystem[registryId][interactId].deltas$.next({ deltaX, deltaY, targetElement });
|
|
122
|
-
}
|
|
123
|
-
updatePosition(interactId, registryId, { x, y }, targetElement) {
|
|
124
|
-
if (!this.interactableExistOnRegistry(interactId, registryId))
|
|
125
|
-
return;
|
|
126
|
-
this.dragRegistrySystem[registryId][interactId].position$.next({ x, y, targetElement });
|
|
127
|
-
}
|
|
128
|
-
updateSize(interactId, registryId, { deltaX, deltaY, width, height }, targetElement) {
|
|
129
|
-
if (!this.interactableExistOnRegistry(interactId, registryId))
|
|
130
|
-
return;
|
|
131
|
-
this.dragRegistrySystem[registryId][interactId].size$.next({ deltaX, deltaY, width, height, targetElement });
|
|
132
|
-
}
|
|
133
|
-
interactableExistOnRegistry(interactId, registryId = DEFAULT_REGISTRY_ID) {
|
|
134
|
-
// eslint-disable-next-line no-prototype-builtins
|
|
135
|
-
return this.dragRegistrySystem.hasOwnProperty(registryId) && this.dragRegistrySystem[registryId].hasOwnProperty(interactId);
|
|
136
|
-
}
|
|
137
|
-
/**
|
|
138
|
-
* Uses renderer to set width and height of angular component
|
|
139
|
-
* @param width the desired width of component
|
|
140
|
-
* @param height the desired height of component
|
|
141
|
-
* @param target the element to transform
|
|
142
|
-
*/
|
|
143
|
-
setElementSize(width, height, target) {
|
|
144
|
-
if (!target)
|
|
145
|
-
return;
|
|
146
|
-
this.renderer.setStyle(target, 'width', `${width}${this.cssUnit}`);
|
|
147
|
-
this.renderer.setStyle(target, 'height', `${height}${this.cssUnit}`);
|
|
148
|
-
}
|
|
149
|
-
/**
|
|
150
|
-
* Uses renderer to set position of angular component
|
|
151
|
-
* @param x position on x axis
|
|
152
|
-
* @param y position on y axis
|
|
153
|
-
* @param target the element to transform
|
|
154
|
-
*/
|
|
155
|
-
setElementTransform(x, y, position) {
|
|
156
|
-
if (!position?.targetElement)
|
|
157
|
-
return;
|
|
158
|
-
this.renderer.setStyle(position.targetElement, 'left', `${x}${this.cssUnit}`);
|
|
159
|
-
this.renderer.setStyle(position.targetElement, 'top', `${y}${this.cssUnit}`);
|
|
160
|
-
}
|
|
161
|
-
/**
|
|
162
|
-
* Generates a translate string for the x and y arguments passed to
|
|
163
|
-
* be passed to css transform
|
|
164
|
-
* @param x the position along the x axis
|
|
165
|
-
* @param y the position along the y axis
|
|
166
|
-
*/
|
|
167
|
-
createTransformString(x, y) {
|
|
168
|
-
return `translate3d(${x}${this.cssUnit}, ${y}${this.cssUnit}, 0)`;
|
|
169
|
-
}
|
|
170
|
-
calculatePositionInElement(zoneElement, dragElement, scale) {
|
|
171
|
-
// TODO: this calculation may not cover a lot of scenarios, keep an eye out for possible improvements
|
|
172
|
-
const zoneRect = zoneElement.getBoundingClientRect();
|
|
173
|
-
const dragRect = dragElement.getBoundingClientRect();
|
|
174
|
-
const position = scale
|
|
175
|
-
? {
|
|
176
|
-
x: (dragRect.left - zoneRect.left) / scale || 1,
|
|
177
|
-
y: (dragRect.top - zoneRect.top) / scale || 1
|
|
178
|
-
} : {
|
|
179
|
-
x: dragRect.left - zoneRect.left,
|
|
180
|
-
y: dragRect.top - zoneRect.top
|
|
181
|
-
};
|
|
182
|
-
// console.log({ y:position.y, drt:dragRect.top, zrt: zoneRect.top})
|
|
183
|
-
return position;
|
|
184
|
-
}
|
|
185
|
-
}
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
189
|
-
type: Injectable,
|
|
190
|
-
args: [{ providedIn: 'root' }]
|
|
191
|
-
}], ctorParameters:
|
|
192
|
-
type: Optional
|
|
193
|
-
}, {
|
|
194
|
-
type: Inject,
|
|
195
|
-
args: [INTERACT_ROOT_CONFIG]
|
|
196
|
-
}] }]
|
|
197
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW50ZXJhY3Quc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvaW50ZXJhY3Qvc3JjL2xpYi9zZXJ2aWNlcy9pbnRlcmFjdC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxVQUFVLEVBQWEsZ0JBQWdCLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbEcsT0FBTyxFQUFFLGVBQWUsRUFBYyxhQUFhLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDbEUsT0FBTyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDdkQsT0FBTyxFQUVMLGVBQWUsRUFBRSxXQUFXLEVBQUUsWUFBWSxFQUFFLG1CQUFtQixFQUFvQyxvQkFBb0IsRUFDeEgsTUFBTSxXQUFXLENBQUM7O0FBS25CLE1BQU0sT0FBTyxlQUFlO0lBUzFCLFlBQ1UsZUFBaUMsRUFDakMsTUFBYyxFQUMyQixVQUFVO1FBRm5ELG9CQUFlLEdBQWYsZUFBZSxDQUFrQjtRQUNqQyxXQUFNLEdBQU4sTUFBTSxDQUFRO1FBQzJCLGVBQVUsR0FBVixVQUFVLENBQUE7UUFWckQsdUJBQWtCLEdBQUcsQ0FBQyxDQUFDO1FBQ3ZCLG1CQUFjLEdBQUcsQ0FBQyxDQUFDO1FBRzNCLGdDQUFnQztRQUN2Qix1QkFBa0IsR0FBNEMsRUFBRyxDQUFDO1FBQ25FLFlBQU8sR0FBRyxJQUFJLENBQUE7UUFNcEIsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDaEUsSUFBSSxDQUFDLE9BQU8sR0FBRyxVQUFVLEVBQUUsZ0JBQWdCLElBQUksSUFBSSxDQUFDO0lBQ3RELENBQUM7SUFFRCxrQkFBa0IsQ0FBQyxLQUFZLEVBQUUsUUFBa0I7UUFDakQs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LHFCQUFxQixFQUFFLENBQUM7UUFDckQsTUFBTSxRQUFRLEdBQUcsS0FBSztZQUNwQixDQUFDLENBQUM7Z0JBQ0YsQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLElBQUksR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDLEdBQUcsS0FBSyxJQUFLLENBQUM7Z0JBQ2hELENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxHQUFHLEdBQUcsUUFBUSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEtBQUssSUFBSSxDQUFDO2FBQzVDLENBQUMsQ0FBQyxDQUFDO1lBQ0YsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxJQUFJLEdBQUcsUUFBUSxDQUFDLElBQUk7WUFDaEMsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxHQUFHLEdBQUcsUUFBUSxDQUFDLEdBQUc7U0FDakMsQ0FBQztRQUNGLG9FQUFvRTtRQUNwRSxPQUFPLFFBQVEsQ0FBQztJQUNsQixDQUFDOzs0R0ExTVUsZUFBZSx3RUFZSixvQkFBb0I7Z0hBWi9CLGVBQWUsY0FESCxNQUFNOzJGQUNsQixlQUFlO2tCQUQzQixVQUFVO21CQUFDLEVBQUMsVUFBVSxFQUFFLE1BQU0sRUFBQzs7MEJBYTNCLFFBQVE7OzBCQUFJLE1BQU07MkJBQUMsb0JBQW9CIiwic291cmNlc0NvbnRlbnQiOlsiXG5pbXBvcnQgeyBJbmplY3RhYmxlLCBSZW5kZXJlcjIsIFJlbmRlcmVyRmFjdG9yeTIsIE5nWm9uZSwgSW5qZWN0LCBPcHRpb25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBPYnNlcnZhYmxlLCBjb21iaW5lTGF0ZXN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyB0YXAsIG1hcCwgc2hhcmVSZXBsYXkgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQge1xuICBUZnRDb29yZHMsIERlbHRhLCBTaXplLCBQb3NpdGlvbiwgSW50ZXJhY3RhYmxlUmVnaXN0cnksXG4gIGRlZmF1bHRQb3NpdGlvbiwgZGVmYXVsdFNpemUsIGRlZmF1bHREZWx0YSwgREVGQVVMVF9SRUdJU1RSWV9JRCwgVGZ0RHJhZ0VsZW1lbnQsIFRmdFJlc2l6ZUVsZW1lbnQsIElOVEVSQUNUX1JPT1RfQ09ORklHLCBJbnRlcmFjdFJvb3RDb25maWdcbn0gZnJvbSAnLi4vbW9kZWxzJztcblxuXG5cbkBJbmplY3RhYmxlKHtwcm92aWRlZEluOiAncm9vdCd9KVxuZXhwb3J0IGNsYXNzIEludGVyYWN0U2VydmljZSB7XG5cbiAgcHJpdmF0ZSBfaW50ZXJhY3RhYmxlSW5kZXggPSAwO1xuICBwcml2YXRlIF9kcm9wem9uZUluZGV4ID0gMDtcbiAgcHJpdmF0ZSByZW5kZXJlcjogUmVuZGVyZXIyO1xuXG4gIC8vIFRPRE86IGNvbnNpZGVyIHVzaW5nIE1hcCBoZXJlXG4gIHJlYWRvbmx5IGRyYWdSZWdpc3RyeVN5c3RlbTogeyBba2V5OiBzdHJpbmddOiBJbnRlcmFjdGFibGVSZWdpc3RyeSB9ID0geyB9O1xuICBwcml2YXRlIGNzc1VuaXQgPSAncHgnXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVuZGVyZXJGYWN0b3J5OiBSZW5kZXJlckZhY3RvcnkyLFxuICAgIHByaXZhdGUgbmdab25lOiBOZ1pvbmUsXG4gICAgQE9wdGlvbmFsKCkgQEluamVjdChJTlRFUkFDVF9ST09UX0NPTkZJRykgcHVibGljIHJvb3RDb25maWdcbiAgKSB7XG4gICAgdGhpcy5yZW5kZXJlciA9IHRoaXMucmVuZGVyZXJGYWN0b3J5LmNyZWF0ZVJlbmRlcmVyKG51bGwsIG51bGwpO1xuICAgIHRoaXMuY3NzVW5pdCA9IHJvb3RDb25maWc/LmNzc0RpbWVuc2lvblVuaXQgfHwgJ3B4JztcbiAgfVxuXG4gIGFkZERlbHRhVG9Qb3NpdGlvbihkZWx0YTogRGVsdGEsIHBvc2l0aW9uOiBQb3NpdGlvbikge1xuICAgIHJldHVybiB7XG4gICAgICB4OiBkZWx0YS5kZWx0YVggKyBwb3NpdGlvbi54LFxuICAgICAgeTogZGVsdGEuZGVsdGFZICsgcG9zaXRpb24ueSxcbiAgICAgIHRhcmdldEVsZW1lbnQ6IHBvc2l0aW9uLnRhcmdldEVsZW1lbnQgfHwgZGVsdGEudGFyZ2V0RWxlbWVudFxuICAgIH1cbiAgfVxuXG4gIGFkZFJlZ2lzdHJ5VG9TeXN0ZW0oY3VzdG9tUmVnaXN0cnlJZDogc3RyaW5nIHwgbnVsbCA9IG51bGwpIHtcbiAgICBjb25zdCByZWdpc3RyeUlkID0gY3VzdG9tUmVnaXN0cnlJZCB8fCB0aGlzLmNyZWF0ZURyb3B6b25lSWQodGhpcy5fZHJvcHpvbmVJbmRleCsrKTtcbiAgICB0aGlzLmRyYWdSZWdpc3RyeVN5c3RlbVtyZWdpc3RyeUlkXSA9IHt9O1xuICAgIHJldHVybiByZWdpc3RyeUlkO1xuICB9XG5cbiAgYWRkRHJhZ2dhYmxlVG9SZWdpc3RyeShjdXN0b21SZWdpc3RyeUlkID0gbnVsbCwgaW50ZXJhY3RhYmxlSWQ6IHN0cmluZyB8IG51bGwgPSBudWxsICkge1xuICAgIGNvbnN0IHJlZ2lzdHJ5SWQgPSBjdXN0b21SZWdpc3RyeUlkIHx8IERFRkFVTFRfUkVHSVNUUllfSUQ7XG4gICAgLy8gaWYgd2UgcGFzcyBhbiBpZCB0byBjcmVhdGVJbnRlcmFjdGFibGVJZCB0aGVuIGl0IGlzIHVzZWQgd2hlbiBjcmVhdGluZyB0aGUgaW50ZXJhY3RhYmxlXG4gICAgLy8gYW5kIHJldHVybmVkLCBvdGhlcndpc2UgYSBuZXcgaWQgaXMgY3JlYXRlZCBmb3IgdGhlIGRyYWdnYWJsZS5cbiAgICBjb25zdCBrZXkgPSB0aGlzLmNyZWF0ZUludGVyYWN0YWJsZUlkKGludGVyYWN0YWJsZUlkICk7XG4gICAgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodGhpcy5kcmFnUmVnaXN0cnlTeXN0ZW0sIHJlZ2lzdHJ5SWQpKSB7XG4gICAgICB0aGlzLmRyYWdSZWdpc3RyeVN5c3RlbVtyZWdpc3RyeUlkXSA9IHt9O1xuICAgIH1cbiAgICB0aGlzLmRyYWdSZWdpc3RyeVN5c3RlbVtyZWdpc3RyeUlkXVtrZXldID0gdGhpcy5jcmVhdGVJbnRlcmFjdGFibGVTdGF0ZShkZWZhdWx0UG9zaXRpb24sIGRlZmF1bHRTaXplLCBkZWZhdWx0RGVsdGEpO1xuICAgIHJldHVybiBrZXlcbiAgfVxuXG4gIGRlc3Ryb3lJbnRlcmFjdGFibGUoaW50ZXJhY3RhYmxlSWQ6IHN0cmluZywgcmVnaXN0cnlJZCA9IERFRkFVTFRfUkVHSVNUUllfSUQpIHtcbiAgICBjb25zdCBpbnRlcmFjdGFibGVTeXN0ZW0gPXRoaXMuZHJhZ1JlZ2lzdHJ5U3lzdGVtW3JlZ2lzdHJ5SWRdW2ludGVyYWN0YWJsZUlkXTtcbiAgICBpZihpbnRlcmFjdGFibGVTeXN0ZW0pIHtcbiAgICAgIC8vIHVuc3Vic2NyaWJlIGZyb20gYWxsIHRoZSBzdWJzY3JpcHRpb25zIGlmIHRoZXkncmUgc3Vic2NyaXB0aW9uc1xuICAgICAgZm9yIChjb25zdCBwcm9wTmFtZSBpbiBpbnRlcmFjdGFibGVTeXN0ZW0pICB7XG4gICAgICAgIGNvbnN0IHByb3AgPSBpbnRlcmFjdGFibGVTeXN0ZW1bcHJvcE5hbWVdO1xuICAgICAgICBpZiAocHJvcC51bnN1YnNjcmliZSAmJiB0eXBlb2YgcHJvcC51bnN1YnNjcmliZSA9PT0gJ2Z1bmN0aW9uJyApIHtcbiAgICAgICAgICBwcm9wLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBkZWxldGUgdGhpcy5kcmFnUmVnaXN0cnlTeXN0ZW1bcmVnaXN0cnlJZF1baW50ZXJhY3RhYmxlSWRdO1xuICAgIH1cbiAgfVxuXG4gIHN1YnNjcmliZVRvSW50ZXJhY3RhYmxlKGludGVyYWN0YWJsZUlkOiBzdHJpbmcsIHJlZ2lzdHJ5SWQgPSBERUZBVUxUX1JFR0lTVFJZX0lEKSB7XG4gICAgcmV0dXJuIHRoaXMuZHJhZ1JlZ2lzdHJ5U3lzdGVtW3JlZ2lzdHJ5SWRdW2ludGVyYWN0YWJsZUlkXTtcbiAgfVxuXG4gIGNyZWF0ZUludGVyYWN0YWJsZVN0YXRlKGluaXRpYWxQb3NpdGlvbjogUG9zaXRpb24sIGluaXRpYWxTaXplOiBTaXplLCBpbml0aWFsRGVsdGE6IERlbHRhICkge1xuXG4gICAgY29uc3QgZGVsdGFzJCA9IG5ldyBCZWhhdmlvclN1YmplY3QoaW5pdGlhbERlbHRhKTtcbiAgICAvLyB0cmFja3MgdGhlIHNpemUgb2YgdGhlIGVsZW1lbnRcbiAgICBjb25zdCBzaXplJCA9IG5ldyBCZWhhdmlvclN1YmplY3Qoey4uLmluaXRpYWxTaXplLCAuLi5pbml0aWFsRGVsdGF9KTtcbiAgICAvLyBTdHJlYW0gb2YgcG9zaXRpb25zIGFzIHRoZXkgY2hhbmdlXG4gICAgY29uc3QgcG9zaXRpb24kID0gbmV3IEJlaGF2aW9yU3ViamVjdChpbml0aWFsUG9zaXRpb24pO1xuXG4gICAgLy8gQWxsIGRyYWdnYWJsZSBkYXRhIG1hcHBlZCB0b2dldGhlclxuICAgIGNvbnN0IGludGVyYWN0YWJsZSQ6IE9ic2VydmFibGU8VGZ0Q29vcmRzPiA9IGNvbWJpbmVMYXRlc3QoW1xuICAgICAgc2l6ZSQucGlwZShcbiAgICAgICAgLy8gc3RhcnRXaXRoKHsuLi5pbml0aWFsU2l6ZSwgLi4uaW5pdGlhbERlbHRhfSksXG4gICAgICAgIHNoYXJlUmVwbGF5KDEpLFxuICAgICAgICAvLyBmaWx0ZXIocmVzaXplRXZlbnQgPT4gISFyZXNpemVFdmVudC50YXJnZXRFbGVtZW50KSxcbiAgICAgICAgdGFwKCh7ZGVsdGFYLCBkZWx0YVksIHdpZHRoLCBoZWlnaHQsIHRhcmdldEVsZW1lbnR9KSA9PiB7XG4gICAgICAgICAgdGhpcy5uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5zZXRFbGVtZW50U2l6ZSh3aWR0aCwgaGVpZ2h0LCB0YXJnZXRFbGVtZW50KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICAvLyBvbmx5IHJlcG9zaXRpb24gaWYgbmVjZXNzYXJ5IGkuZSB3aGVuIHJlc2l6aW5nIGxlZnQgb3IgdXBcbiAgICAgICAgICBpZihkZWx0YVggfHwgZGVsdGFZKSB7XG4gICAgICAgICAgICBkZWx0YXMkLm5leHQoe2RlbHRhWCwgZGVsdGFZLCB0YXJnZXRFbGVtZW50fSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgKSxcbiAgICAgIGRlbHRhcyQucGlwZShcbiAgICAgICAgc2hhcmVSZXBsYXkoMSksXG4gICAgICAgIHRhcCgoZGVsdGEpID0+IHtcbiAgICAgICAgICBjb25zdCBwb3NpdGlvbiA9IHBvc2l0aW9uJC52YWx1ZTtcbiAgICAgICAgICBjb25zdCBuZXdQb3NpdGlvbiA9IHRoaXMuYWRkRGVsdGFUb1Bvc2l0aW9uKGRlbHRhLCBwb3NpdGlvbik7XG4gICAgICAgICAgcG9zaXRpb24kLm5leHQobmV3UG9zaXRpb24pO1xuICAgICAgICB9KVxuICAgICAgKSxcbiAgICAgIHBvc2l0aW9uJC5waXBlKFxuICAgICAgICBzaGFyZVJlcGxheSgxKSxcbiAgICAgICAgdGFwKCBwb3NpdGlvbiA9PiB7XG4gICAgICAgICAgdGhpcy5uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5zZXRFbGVtZW50VHJhbnNmb3JtKHBvc2l0aW9uLngsIHBvc2l0aW9uLnksIHBvc2l0aW9uKTtcbiAgICAgICAgICB9KVxuICAgICAgICB9KVxuICAgICAgKVxuICAgICAgXSkucGlwZShcbiAgICAgIHNoYXJlUmVwbGF5KDEpLFxuICAgICAgbWFwKCAoW3NpemUsIGRlbHRhcywgcG9zaXRpb25dKTogVGZ0Q29vcmRzPT4ge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHg6IHBvc2l0aW9uLngsXG4gICAgICAgICAgeTogcG9zaXRpb24ueSxcbiAgICAgICAgICBkZWx0YVg6IGRlbHRhcy5kZWx0YVgsXG4gICAgICAgICAgZGVsdGFZOiBkZWx0YXMuZGVsdGFZLFxuICAgICAgICAgIHdpZHRoOiBzaXplLndpZHRoLFxuICAgICAgICAgIGhlaWdodDogc2l6ZS5oZWlnaHQsXG4gICAgICAgICAgdGFyZ2V0RWxlbWVudDogc2l6ZS50YXJnZXRFbGVtZW50IHx8IHBvc2l0aW9uLnRhcmdldEVsZW1lbnQgfHwgZGVsdGFzLnRhcmdldEVsZW1lbnRcbiAgICAgICAgfVxuICAgICAgfSksXG4gICAgKVxuICAgIC8vIFRPRE86IHVwZGF0ZSBzeXN0ZW0gdG8gaGFuZGxlIG9ubHkgcmV0dXJuaW5nIGludGVyYWN0YWJsZSRcbiAgICByZXR1cm4ge1xuICAgICAgZGVsdGFzJCxcbiAgICAgIHBvc2l0aW9uJCxcbiAgICAgIHNpemUkLFxuICAgICAgaW50ZXJhY3RhYmxlJFxuICAgIH1cbiAgfVxuXG4gIGNyZWF0ZUludGVyYWN0YWJsZUlkKGN1c3RvbUludGVyYWN0YWJsZUlkOiBzdHJpbmcgfCBudWxsID0gbnVsbCkge1xuICAgIHJldHVybiBjdXN0b21JbnRlcmFjdGFibGVJZCB8fCBgaW50ZXJhY3RhYmxlJHt0aGlzLl9pbnRlcmFjdGFibGVJbmRleCsrfWBcbiAgfVxuXG4gIGNyZWF0ZURyb3B6b25lSWQoaW5kZXg6IG51bWJlcikge1xuICAgIHJldHVybiBgZHJvcHpvbmUke2luZGV4fWBcbiAgfVxuXG4gIGdldEludGVyYWN0YWJsZVN0YXRlKCBpbnRlcmFjdGFibGVJZDogc3RyaW5nLCByZWdpc3RyeUlkID0gREVGQVVMVF9SRUdJU1RSWV9JRCkge1xuICAgIHJldHVybiB0aGlzLmRyYWdSZWdpc3RyeVN5c3RlbVtyZWdpc3RyeUlkXVtpbnRlcmFjdGFibGVJZF0uaW50ZXJhY3RhYmxlJDtcbiAgfVxuXG4gIHVwZGF0ZURlbHRhcyhpbnRlcmFjdElkOiBzdHJpbmcsIHJlZ2lzdHJ5SWQ6IHN0cmluZywgeyBkZWx0YVgsIGRlbHRhWSB9LCB0YXJnZXRFbGVtZW50KSB7XG4gICAgaWYgKCF0aGlzLmludGVyYWN0YWJsZUV4aXN0T25SZWdpc3RyeShpbnRlcmFjdElkLCByZWdpc3RyeUlkKSkgcmV0dXJuO1xuICAgIHRoaXMuZHJhZ1JlZ2lzdHJ5U3lzdGVtW3JlZ2lzdHJ5SWRdW2ludGVyYWN0SWRdLmRlbHRhcyQubmV4dCh7IGRlbHRhWCwgZGVsdGFZLCB0YXJnZXRFbGVtZW50IH0pXG4gIH1cblxuICB1cGRhdGVQb3NpdGlvbihpbnRlcmFjdElkOiBzdHJpbmcsIHJlZ2lzdHJ5SWQ6IHN0cmluZywgeyB4LCB5IH06IHt4OiBudW1iZXI7IHk6IG51bWJlcjt9LCB0YXJnZXRFbGVtZW50KSB7XG4gICAgaWYgKCF0aGlzLmludGVyYWN0YWJsZUV4aXN0T25SZWdpc3RyeShpbnRlcmFjdElkLCByZWdpc3RyeUlkKSkgcmV0dXJuO1xuICAgIHRoaXMuZHJhZ1JlZ2lzdHJ5U3lzdGVtW3JlZ2lzdHJ5SWRdW2ludGVyYWN0SWRdLnBvc2l0aW9uJC5uZXh0KHsgeCwgeSwgdGFyZ2V0RWxlbWVudCB9KVxuICB9XG5cbiAgdXBkYXRlU2l6ZShpbnRlcmFjdElkOiBzdHJpbmcsIHJlZ2lzdHJ5SWQ6IHN0cmluZywgeyBkZWx0YVgsIGRlbHRhWSwgd2lkdGgsIGhlaWdodCB9LCB0YXJnZXRFbGVtZW50KSB7XG4gICAgaWYgKCF0aGlzLmludGVyYWN0YWJsZUV4aXN0T25SZWdpc3RyeShpbnRlcmFjdElkLCByZWdpc3RyeUlkKSkgcmV0dXJuXG4gICAgdGhpcy5kcmFnUmVnaXN0cnlTeXN0ZW1bcmVnaXN0cnlJZF1baW50ZXJhY3RJZF0uc2l6ZSQubmV4dCh7ZGVsdGFYLCBkZWx0YVksIHdpZHRoLCBoZWlnaHQsIHRhcmdldEVsZW1lbnR9KTtcbiAgfVxuXG4gIGludGVyYWN0YWJsZUV4aXN0T25SZWdpc3RyeShpbnRlcmFjdElkOiBzdHJpbmcsIHJlZ2lzdHJ5SWQgPSBERUZBVUxUX1JFR0lTVFJZX0lEKSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXByb3RvdHlwZS1idWlsdGluc1xuICAgIHJldHVybiB0aGlzLmRyYWdSZWdpc3RyeVN5c3RlbS5oYXNPd25Qcm9wZXJ0eShyZWdpc3RyeUlkKSAmJiB0aGlzLmRyYWdSZWdpc3RyeVN5c3RlbVtyZWdpc3RyeUlkXS5oYXNPd25Qcm9wZXJ0eShpbnRlcmFjdElkKTtcbiAgfVxuICAvKipcbiAgICogVXNlcyByZW5kZXJlciB0byBzZXQgd2lkdGggYW5kIGhlaWdodCBvZiBhbmd1bGFyIGNvbXBvbmVudFxuICAgKiBAcGFyYW0gd2lkdGggdGhlIGRlc2lyZWQgd2lkdGggb2YgY29tcG9uZW50XG4gICAqIEBwYXJhbSBoZWlnaHQgdGhlIGRlc2lyZWQgaGVpZ2h0IG9mIGNvbXBvbmVudFxuICAgKiBAcGFyYW0gdGFyZ2V0IHRoZSBlbGVtZW50IHRvIHRyYW5zZm9ybVxuICAgKi9cbiAgc2V0RWxlbWVudFNpemUod2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIsIHRhcmdldDogVGZ0UmVzaXplRWxlbWVudCkge1xuICAgIGlmKCF0YXJnZXQpIHJldHVybjtcbiAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRhcmdldCwgJ3dpZHRoJywgYCR7d2lkdGh9JHt0aGlzLmNzc1VuaXR9YCk7XG4gICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0YXJnZXQsICdoZWlnaHQnLCBgJHtoZWlnaHR9JHt0aGlzLmNzc1VuaXR9YCk7XG4gIH1cbiAgLyoqXG4gICAqIFVzZXMgcmVuZGVyZXIgdG8gc2V0IHBvc2l0aW9uIG9mIGFuZ3VsYXIgY29tcG9uZW50XG4gICAqIEBwYXJhbSB4IHBvc2l0aW9uIG9uIHggYXhpc1xuICAgKiBAcGFyYW0geSBwb3NpdGlvbiBvbiB5IGF4aXNcbiAgICogQHBhcmFtIHRhcmdldCB0aGUgZWxlbWVudCB0byB0cmFuc2Zvcm1cbiAgICovXG4gIHNldEVsZW1lbnRUcmFuc2Zvcm0oeDogbnVtYmVyLCB5OiBudW1iZXIsIHBvc2l0aW9uOiBQb3NpdGlvbiApIHtcbiAgICBpZighcG9zaXRpb24/LnRhcmdldEVsZW1lbnQpIHJldHVybjtcbiAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHBvc2l0aW9uLnRhcmdldEVsZW1lbnQsICdsZWZ0JywgYCR7eH0ke3RoaXMuY3NzVW5pdH1gKTtcbiAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHBvc2l0aW9uLnRhcmdldEVsZW1lbnQsICd0b3AnLCBgJHt5fSR7dGhpcy5jc3NVbml0fWApO1xuICB9XG4gIC8qKlxuICAgKiBHZW5lcmF0ZXMgYSB0cmFuc2xhdGUgc3RyaW5nIGZvciB0aGUgeCBhbmQgeSBhcmd1bWVudHMgcGFzc2VkIHRvXG4gICAqIGJlIHBhc3NlZCB0byBjc3MgdHJhbnNmb3JtXG4gICAqIEBwYXJhbSB4IHRoZSBwb3NpdGlvbiBhbG9uZyB0aGUgeCBheGlzXG4gICAqIEBwYXJhbSB5IHRoZSBwb3NpdGlvbiBhbG9uZyB0aGUgeSBheGlzXG4gICAqL1xuICBjcmVhdGVUcmFuc2Zvcm1TdHJpbmcoeDogbnVtYmVyLCB5OiBudW1iZXIpIHtcbiAgICByZXR1cm4gYHRyYW5zbGF0ZTNkKCR7eH0ke3RoaXMuY3NzVW5pdH0sICR7eX0ke3RoaXMuY3NzVW5pdH0sIDApYFxuICB9XG5cbiAgY2FsY3VsYXRlUG9zaXRpb25JbkVsZW1lbnQoem9uZUVsZW1lbnQ6IEludGVyYWN0LkVsZW1lbnQsIGRyYWdFbGVtZW50OiBUZnREcmFnRWxlbWVudCwgc2NhbGU/OiBudW1iZXIpIHtcbiAgICAvLyBUT0RPOiB0aGlzIGNhbGN1bGF0aW9uIG1heSBub3QgY292ZXIgYSBsb3Qgb2Ygc2NlbmFyaW9zLCBrZWVwIGFuIGV5ZSBvdXQgZm9yIHBvc3NpYmxlIGltcHJvdmVtZW50c1xuICAgIGNvbnN0IHpvbmVSZWN0ID0gem9uZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgY29uc3QgZHJhZ1JlY3QgPSBkcmFnRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBjb25zdCBwb3NpdGlvbiA9IHNjYWxlXG4gICAgICA/IHtcbiAgICAgIHg6IChkcmFnUmVjdC5sZWZ0IC0gem9uZVJlY3QubGVmdCkgLyBzY2FsZSAgfHwgMSxcbiAgICAgIHk6IChkcmFnUmVjdC50b3AgLSB6b25lUmVjdC50b3ApIC8gc2NhbGUgfHwgMVxuICAgICAgfSA6IHtcbiAgICAgICAgeDogZHJhZ1JlY3QubGVmdCAtIHpvbmVSZWN0LmxlZnQsXG4gICAgICAgIHk6IGRyYWdSZWN0LnRvcCAtIHpvbmVSZWN0LnRvcFxuICAgIH07XG4gICAgLy8gY29uc29sZS5sb2coeyB5OnBvc2l0aW9uLnksIGRydDpkcmFnUmVjdC50b3AsIHpydDogem9uZVJlY3QudG9wfSlcbiAgICByZXR1cm4gcG9zaXRpb247XG4gIH1cbn1cbiJdfQ==
|
|
1
|
+
import { Injectable, RendererFactory2, NgZone, Inject, Optional } from '@angular/core';
|
|
2
|
+
import { BehaviorSubject, combineLatest } from 'rxjs';
|
|
3
|
+
import { tap, map, shareReplay } from 'rxjs/operators';
|
|
4
|
+
import { defaultPosition, defaultSize, defaultDelta, DEFAULT_REGISTRY_ID, INTERACT_ROOT_CONFIG } from '../models';
|
|
5
|
+
import * as i0 from "@angular/core";
|
|
6
|
+
export class InteractService {
|
|
7
|
+
constructor(rendererFactory, ngZone, rootConfig) {
|
|
8
|
+
this.rendererFactory = rendererFactory;
|
|
9
|
+
this.ngZone = ngZone;
|
|
10
|
+
this.rootConfig = rootConfig;
|
|
11
|
+
this._interactableIndex = 0;
|
|
12
|
+
this._dropzoneIndex = 0;
|
|
13
|
+
// TODO: consider using Map here
|
|
14
|
+
this.dragRegistrySystem = {};
|
|
15
|
+
this.cssUnit = 'px';
|
|
16
|
+
this.renderer = this.rendererFactory.createRenderer(null, null);
|
|
17
|
+
this.cssUnit = rootConfig?.cssDimensionUnit || 'px';
|
|
18
|
+
}
|
|
19
|
+
addDeltaToPosition(delta, position) {
|
|
20
|
+
return {
|
|
21
|
+
x: delta.deltaX + position.x,
|
|
22
|
+
y: delta.deltaY + position.y,
|
|
23
|
+
targetElement: position.targetElement || delta.targetElement
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
addRegistryToSystem(customRegistryId = null) {
|
|
27
|
+
const registryId = customRegistryId || this.createDropzoneId(this._dropzoneIndex++);
|
|
28
|
+
this.dragRegistrySystem[registryId] = {};
|
|
29
|
+
return registryId;
|
|
30
|
+
}
|
|
31
|
+
addDraggableToRegistry(customRegistryId = null, interactableId = null) {
|
|
32
|
+
const registryId = customRegistryId || DEFAULT_REGISTRY_ID;
|
|
33
|
+
// if we pass an id to createInteractableId then it is used when creating the interactable
|
|
34
|
+
// and returned, otherwise a new id is created for the draggable.
|
|
35
|
+
const key = this.createInteractableId(interactableId);
|
|
36
|
+
if (!Object.prototype.hasOwnProperty.call(this.dragRegistrySystem, registryId)) {
|
|
37
|
+
this.dragRegistrySystem[registryId] = {};
|
|
38
|
+
}
|
|
39
|
+
this.dragRegistrySystem[registryId][key] = this.createInteractableState(defaultPosition, defaultSize, defaultDelta);
|
|
40
|
+
return key;
|
|
41
|
+
}
|
|
42
|
+
destroyInteractable(interactableId, registryId = DEFAULT_REGISTRY_ID) {
|
|
43
|
+
const interactableSystem = this.dragRegistrySystem[registryId][interactableId];
|
|
44
|
+
if (interactableSystem) {
|
|
45
|
+
// unsubscribe from all the subscriptions if they're subscriptions
|
|
46
|
+
for (const propName in interactableSystem) {
|
|
47
|
+
const prop = interactableSystem[propName];
|
|
48
|
+
if (prop.unsubscribe && typeof prop.unsubscribe === 'function') {
|
|
49
|
+
prop.unsubscribe();
|
|
50
|
+
}
|
|
51
|
+
;
|
|
52
|
+
}
|
|
53
|
+
delete this.dragRegistrySystem[registryId][interactableId];
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
subscribeToInteractable(interactableId, registryId = DEFAULT_REGISTRY_ID) {
|
|
57
|
+
return this.dragRegistrySystem[registryId][interactableId];
|
|
58
|
+
}
|
|
59
|
+
createInteractableState(initialPosition, initialSize, initialDelta) {
|
|
60
|
+
const deltas$ = new BehaviorSubject(initialDelta);
|
|
61
|
+
// tracks the size of the element
|
|
62
|
+
const size$ = new BehaviorSubject({ ...initialSize, ...initialDelta });
|
|
63
|
+
// Stream of positions as they change
|
|
64
|
+
const position$ = new BehaviorSubject(initialPosition);
|
|
65
|
+
// All draggable data mapped together
|
|
66
|
+
const interactable$ = combineLatest([
|
|
67
|
+
size$.pipe(
|
|
68
|
+
// startWith({...initialSize, ...initialDelta}),
|
|
69
|
+
shareReplay(1),
|
|
70
|
+
// filter(resizeEvent => !!resizeEvent.targetElement),
|
|
71
|
+
tap(({ deltaX, deltaY, width, height, targetElement }) => {
|
|
72
|
+
this.ngZone.runOutsideAngular(() => {
|
|
73
|
+
this.setElementSize(width, height, targetElement);
|
|
74
|
+
});
|
|
75
|
+
// only reposition if necessary i.e when resizing left or up
|
|
76
|
+
if (deltaX || deltaY) {
|
|
77
|
+
deltas$.next({ deltaX, deltaY, targetElement });
|
|
78
|
+
}
|
|
79
|
+
})),
|
|
80
|
+
deltas$.pipe(shareReplay(1), tap((delta) => {
|
|
81
|
+
const position = position$.value;
|
|
82
|
+
const newPosition = this.addDeltaToPosition(delta, position);
|
|
83
|
+
position$.next(newPosition);
|
|
84
|
+
})),
|
|
85
|
+
position$.pipe(shareReplay(1), tap(position => {
|
|
86
|
+
this.ngZone.runOutsideAngular(() => {
|
|
87
|
+
this.setElementTransform(position.x, position.y, position);
|
|
88
|
+
});
|
|
89
|
+
}))
|
|
90
|
+
]).pipe(shareReplay(1), map(([size, deltas, position]) => {
|
|
91
|
+
return {
|
|
92
|
+
x: position.x,
|
|
93
|
+
y: position.y,
|
|
94
|
+
deltaX: deltas.deltaX,
|
|
95
|
+
deltaY: deltas.deltaY,
|
|
96
|
+
width: size.width,
|
|
97
|
+
height: size.height,
|
|
98
|
+
targetElement: size.targetElement || position.targetElement || deltas.targetElement
|
|
99
|
+
};
|
|
100
|
+
}));
|
|
101
|
+
// TODO: update system to handle only returning interactable$
|
|
102
|
+
return {
|
|
103
|
+
deltas$,
|
|
104
|
+
position$,
|
|
105
|
+
size$,
|
|
106
|
+
interactable$
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
createInteractableId(customInteractableId = null) {
|
|
110
|
+
return customInteractableId || `interactable${this._interactableIndex++}`;
|
|
111
|
+
}
|
|
112
|
+
createDropzoneId(index) {
|
|
113
|
+
return `dropzone${index}`;
|
|
114
|
+
}
|
|
115
|
+
getInteractableState(interactableId, registryId = DEFAULT_REGISTRY_ID) {
|
|
116
|
+
return this.dragRegistrySystem[registryId][interactableId].interactable$;
|
|
117
|
+
}
|
|
118
|
+
updateDeltas(interactId, registryId, { deltaX, deltaY }, targetElement) {
|
|
119
|
+
if (!this.interactableExistOnRegistry(interactId, registryId))
|
|
120
|
+
return;
|
|
121
|
+
this.dragRegistrySystem[registryId][interactId].deltas$.next({ deltaX, deltaY, targetElement });
|
|
122
|
+
}
|
|
123
|
+
updatePosition(interactId, registryId, { x, y }, targetElement) {
|
|
124
|
+
if (!this.interactableExistOnRegistry(interactId, registryId))
|
|
125
|
+
return;
|
|
126
|
+
this.dragRegistrySystem[registryId][interactId].position$.next({ x, y, targetElement });
|
|
127
|
+
}
|
|
128
|
+
updateSize(interactId, registryId, { deltaX, deltaY, width, height }, targetElement) {
|
|
129
|
+
if (!this.interactableExistOnRegistry(interactId, registryId))
|
|
130
|
+
return;
|
|
131
|
+
this.dragRegistrySystem[registryId][interactId].size$.next({ deltaX, deltaY, width, height, targetElement });
|
|
132
|
+
}
|
|
133
|
+
interactableExistOnRegistry(interactId, registryId = DEFAULT_REGISTRY_ID) {
|
|
134
|
+
// eslint-disable-next-line no-prototype-builtins
|
|
135
|
+
return this.dragRegistrySystem.hasOwnProperty(registryId) && this.dragRegistrySystem[registryId].hasOwnProperty(interactId);
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Uses renderer to set width and height of angular component
|
|
139
|
+
* @param width the desired width of component
|
|
140
|
+
* @param height the desired height of component
|
|
141
|
+
* @param target the element to transform
|
|
142
|
+
*/
|
|
143
|
+
setElementSize(width, height, target) {
|
|
144
|
+
if (!target)
|
|
145
|
+
return;
|
|
146
|
+
this.renderer.setStyle(target, 'width', `${width}${this.cssUnit}`);
|
|
147
|
+
this.renderer.setStyle(target, 'height', `${height}${this.cssUnit}`);
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Uses renderer to set position of angular component
|
|
151
|
+
* @param x position on x axis
|
|
152
|
+
* @param y position on y axis
|
|
153
|
+
* @param target the element to transform
|
|
154
|
+
*/
|
|
155
|
+
setElementTransform(x, y, position) {
|
|
156
|
+
if (!position?.targetElement)
|
|
157
|
+
return;
|
|
158
|
+
this.renderer.setStyle(position.targetElement, 'left', `${x}${this.cssUnit}`);
|
|
159
|
+
this.renderer.setStyle(position.targetElement, 'top', `${y}${this.cssUnit}`);
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Generates a translate string for the x and y arguments passed to
|
|
163
|
+
* be passed to css transform
|
|
164
|
+
* @param x the position along the x axis
|
|
165
|
+
* @param y the position along the y axis
|
|
166
|
+
*/
|
|
167
|
+
createTransformString(x, y) {
|
|
168
|
+
return `translate3d(${x}${this.cssUnit}, ${y}${this.cssUnit}, 0)`;
|
|
169
|
+
}
|
|
170
|
+
calculatePositionInElement(zoneElement, dragElement, scale) {
|
|
171
|
+
// TODO: this calculation may not cover a lot of scenarios, keep an eye out for possible improvements
|
|
172
|
+
const zoneRect = zoneElement.getBoundingClientRect();
|
|
173
|
+
const dragRect = dragElement.getBoundingClientRect();
|
|
174
|
+
const position = scale
|
|
175
|
+
? {
|
|
176
|
+
x: (dragRect.left - zoneRect.left) / scale || 1,
|
|
177
|
+
y: (dragRect.top - zoneRect.top) / scale || 1
|
|
178
|
+
} : {
|
|
179
|
+
x: dragRect.left - zoneRect.left,
|
|
180
|
+
y: dragRect.top - zoneRect.top
|
|
181
|
+
};
|
|
182
|
+
// console.log({ y:position.y, drt:dragRect.top, zrt: zoneRect.top})
|
|
183
|
+
return position;
|
|
184
|
+
}
|
|
185
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.9", ngImport: i0, type: InteractService, deps: [{ token: i0.RendererFactory2 }, { token: i0.NgZone }, { token: INTERACT_ROOT_CONFIG, optional: true }], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
186
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.0.9", ngImport: i0, type: InteractService, providedIn: 'root' }); }
|
|
187
|
+
}
|
|
188
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.9", ngImport: i0, type: InteractService, decorators: [{
|
|
189
|
+
type: Injectable,
|
|
190
|
+
args: [{ providedIn: 'root' }]
|
|
191
|
+
}], ctorParameters: () => [{ type: i0.RendererFactory2 }, { type: i0.NgZone }, { type: undefined, decorators: [{
|
|
192
|
+
type: Optional
|
|
193
|
+
}, {
|
|
194
|
+
type: Inject,
|
|
195
|
+
args: [INTERACT_ROOT_CONFIG]
|
|
196
|
+
}] }] });
|
|
197
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW50ZXJhY3Quc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvaW50ZXJhY3Qvc3JjL2xpYi9zZXJ2aWNlcy9pbnRlcmFjdC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxVQUFVLEVBQWEsZ0JBQWdCLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbEcsT0FBTyxFQUFFLGVBQWUsRUFBYyxhQUFhLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDbEUsT0FBTyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDdkQsT0FBTyxFQUVMLGVBQWUsRUFBRSxXQUFXLEVBQUUsWUFBWSxFQUFFLG1CQUFtQixFQUFvQyxvQkFBb0IsRUFDeEgsTUFBTSxXQUFXLENBQUM7O0FBS25CLE1BQU0sT0FBTyxlQUFlO0lBUzFCLFlBQ1UsZUFBaUMsRUFDakMsTUFBYyxFQUMyQixVQUFVO1FBRm5ELG9CQUFlLEdBQWYsZUFBZSxDQUFrQjtRQUNqQyxXQUFNLEdBQU4sTUFBTSxDQUFRO1FBQzJCLGVBQVUsR0FBVixVQUFVLENBQUE7UUFWckQsdUJBQWtCLEdBQUcsQ0FBQyxDQUFDO1FBQ3ZCLG1CQUFjLEdBQUcsQ0FBQyxDQUFDO1FBRzNCLGdDQUFnQztRQUN2Qix1QkFBa0IsR0FBNEMsRUFBRyxDQUFDO1FBQ25FLFlBQU8sR0FBRyxJQUFJLENBQUE7UUFNcEIsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDaEUsSUFBSSxDQUFDLE9BQU8sR0FBRyxVQUFVLEVBQUUsZ0JBQWdCLElBQUksSUFBSSxDQUFDO0lBQ3RELENBQUM7SUFFRCxrQkFBa0IsQ0FBQyxLQUFZLEVBQUUsUUFBa0I7UUFDakQs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LHFCQUFxQixFQUFFLENBQUM7UUFDckQsTUFBTSxRQUFRLEdBQUcsS0FBSztZQUNwQixDQUFDLENBQUM7Z0JBQ0YsQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLElBQUksR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDLEdBQUcsS0FBSyxJQUFLLENBQUM7Z0JBQ2hELENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxHQUFHLEdBQUcsUUFBUSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEtBQUssSUFBSSxDQUFDO2FBQzVDLENBQUMsQ0FBQyxDQUFDO1lBQ0YsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxJQUFJLEdBQUcsUUFBUSxDQUFDLElBQUk7WUFDaEMsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxHQUFHLEdBQUcsUUFBUSxDQUFDLEdBQUc7U0FDakMsQ0FBQztRQUNGLG9FQUFvRTtRQUNwRSxPQUFPLFFBQVEsQ0FBQztJQUNsQixDQUFDOzhHQTFNVSxlQUFlLHdFQVlKLG9CQUFvQjtrSEFaL0IsZUFBZSxjQURILE1BQU07OzJGQUNsQixlQUFlO2tCQUQzQixVQUFVO21CQUFDLEVBQUMsVUFBVSxFQUFFLE1BQU0sRUFBQzs7MEJBYTNCLFFBQVE7OzBCQUFJLE1BQU07MkJBQUMsb0JBQW9CIiwic291cmNlc0NvbnRlbnQiOlsiXG5pbXBvcnQgeyBJbmplY3RhYmxlLCBSZW5kZXJlcjIsIFJlbmRlcmVyRmFjdG9yeTIsIE5nWm9uZSwgSW5qZWN0LCBPcHRpb25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBPYnNlcnZhYmxlLCBjb21iaW5lTGF0ZXN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyB0YXAsIG1hcCwgc2hhcmVSZXBsYXkgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQge1xuICBUZnRDb29yZHMsIERlbHRhLCBTaXplLCBQb3NpdGlvbiwgSW50ZXJhY3RhYmxlUmVnaXN0cnksXG4gIGRlZmF1bHRQb3NpdGlvbiwgZGVmYXVsdFNpemUsIGRlZmF1bHREZWx0YSwgREVGQVVMVF9SRUdJU1RSWV9JRCwgVGZ0RHJhZ0VsZW1lbnQsIFRmdFJlc2l6ZUVsZW1lbnQsIElOVEVSQUNUX1JPT1RfQ09ORklHLCBJbnRlcmFjdFJvb3RDb25maWdcbn0gZnJvbSAnLi4vbW9kZWxzJztcblxuXG5cbkBJbmplY3RhYmxlKHtwcm92aWRlZEluOiAncm9vdCd9KVxuZXhwb3J0IGNsYXNzIEludGVyYWN0U2VydmljZSB7XG5cbiAgcHJpdmF0ZSBfaW50ZXJhY3RhYmxlSW5kZXggPSAwO1xuICBwcml2YXRlIF9kcm9wem9uZUluZGV4ID0gMDtcbiAgcHJpdmF0ZSByZW5kZXJlcjogUmVuZGVyZXIyO1xuXG4gIC8vIFRPRE86IGNvbnNpZGVyIHVzaW5nIE1hcCBoZXJlXG4gIHJlYWRvbmx5IGRyYWdSZWdpc3RyeVN5c3RlbTogeyBba2V5OiBzdHJpbmddOiBJbnRlcmFjdGFibGVSZWdpc3RyeSB9ID0geyB9O1xuICBwcml2YXRlIGNzc1VuaXQgPSAncHgnXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVuZGVyZXJGYWN0b3J5OiBSZW5kZXJlckZhY3RvcnkyLFxuICAgIHByaXZhdGUgbmdab25lOiBOZ1pvbmUsXG4gICAgQE9wdGlvbmFsKCkgQEluamVjdChJTlRFUkFDVF9ST09UX0NPTkZJRykgcHVibGljIHJvb3RDb25maWdcbiAgKSB7XG4gICAgdGhpcy5yZW5kZXJlciA9IHRoaXMucmVuZGVyZXJGYWN0b3J5LmNyZWF0ZVJlbmRlcmVyKG51bGwsIG51bGwpO1xuICAgIHRoaXMuY3NzVW5pdCA9IHJvb3RDb25maWc/LmNzc0RpbWVuc2lvblVuaXQgfHwgJ3B4JztcbiAgfVxuXG4gIGFkZERlbHRhVG9Qb3NpdGlvbihkZWx0YTogRGVsdGEsIHBvc2l0aW9uOiBQb3NpdGlvbikge1xuICAgIHJldHVybiB7XG4gICAgICB4OiBkZWx0YS5kZWx0YVggKyBwb3NpdGlvbi54LFxuICAgICAgeTogZGVsdGEuZGVsdGFZICsgcG9zaXRpb24ueSxcbiAgICAgIHRhcmdldEVsZW1lbnQ6IHBvc2l0aW9uLnRhcmdldEVsZW1lbnQgfHwgZGVsdGEudGFyZ2V0RWxlbWVudFxuICAgIH1cbiAgfVxuXG4gIGFkZFJlZ2lzdHJ5VG9TeXN0ZW0oY3VzdG9tUmVnaXN0cnlJZDogc3RyaW5nIHwgbnVsbCA9IG51bGwpIHtcbiAgICBjb25zdCByZWdpc3RyeUlkID0gY3VzdG9tUmVnaXN0cnlJZCB8fCB0aGlzLmNyZWF0ZURyb3B6b25lSWQodGhpcy5fZHJvcHpvbmVJbmRleCsrKTtcbiAgICB0aGlzLmRyYWdSZWdpc3RyeVN5c3RlbVtyZWdpc3RyeUlkXSA9IHt9O1xuICAgIHJldHVybiByZWdpc3RyeUlkO1xuICB9XG5cbiAgYWRkRHJhZ2dhYmxlVG9SZWdpc3RyeShjdXN0b21SZWdpc3RyeUlkID0gbnVsbCwgaW50ZXJhY3RhYmxlSWQ6IHN0cmluZyB8IG51bGwgPSBudWxsICkge1xuICAgIGNvbnN0IHJlZ2lzdHJ5SWQgPSBjdXN0b21SZWdpc3RyeUlkIHx8IERFRkFVTFRfUkVHSVNUUllfSUQ7XG4gICAgLy8gaWYgd2UgcGFzcyBhbiBpZCB0byBjcmVhdGVJbnRlcmFjdGFibGVJZCB0aGVuIGl0IGlzIHVzZWQgd2hlbiBjcmVhdGluZyB0aGUgaW50ZXJhY3RhYmxlXG4gICAgLy8gYW5kIHJldHVybmVkLCBvdGhlcndpc2UgYSBuZXcgaWQgaXMgY3JlYXRlZCBmb3IgdGhlIGRyYWdnYWJsZS5cbiAgICBjb25zdCBrZXkgPSB0aGlzLmNyZWF0ZUludGVyYWN0YWJsZUlkKGludGVyYWN0YWJsZUlkICk7XG4gICAgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodGhpcy5kcmFnUmVnaXN0cnlTeXN0ZW0sIHJlZ2lzdHJ5SWQpKSB7XG4gICAgICB0aGlzLmRyYWdSZWdpc3RyeVN5c3RlbVtyZWdpc3RyeUlkXSA9IHt9O1xuICAgIH1cbiAgICB0aGlzLmRyYWdSZWdpc3RyeVN5c3RlbVtyZWdpc3RyeUlkXVtrZXldID0gdGhpcy5jcmVhdGVJbnRlcmFjdGFibGVTdGF0ZShkZWZhdWx0UG9zaXRpb24sIGRlZmF1bHRTaXplLCBkZWZhdWx0RGVsdGEpO1xuICAgIHJldHVybiBrZXlcbiAgfVxuXG4gIGRlc3Ryb3lJbnRlcmFjdGFibGUoaW50ZXJhY3RhYmxlSWQ6IHN0cmluZywgcmVnaXN0cnlJZCA9IERFRkFVTFRfUkVHSVNUUllfSUQpIHtcbiAgICBjb25zdCBpbnRlcmFjdGFibGVTeXN0ZW0gPXRoaXMuZHJhZ1JlZ2lzdHJ5U3lzdGVtW3JlZ2lzdHJ5SWRdW2ludGVyYWN0YWJsZUlkXTtcbiAgICBpZihpbnRlcmFjdGFibGVTeXN0ZW0pIHtcbiAgICAgIC8vIHVuc3Vic2NyaWJlIGZyb20gYWxsIHRoZSBzdWJzY3JpcHRpb25zIGlmIHRoZXkncmUgc3Vic2NyaXB0aW9uc1xuICAgICAgZm9yIChjb25zdCBwcm9wTmFtZSBpbiBpbnRlcmFjdGFibGVTeXN0ZW0pICB7XG4gICAgICAgIGNvbnN0IHByb3AgPSBpbnRlcmFjdGFibGVTeXN0ZW1bcHJvcE5hbWVdO1xuICAgICAgICBpZiAocHJvcC51bnN1YnNjcmliZSAmJiB0eXBlb2YgcHJvcC51bnN1YnNjcmliZSA9PT0gJ2Z1bmN0aW9uJyApIHtcbiAgICAgICAgICBwcm9wLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBkZWxldGUgdGhpcy5kcmFnUmVnaXN0cnlTeXN0ZW1bcmVnaXN0cnlJZF1baW50ZXJhY3RhYmxlSWRdO1xuICAgIH1cbiAgfVxuXG4gIHN1YnNjcmliZVRvSW50ZXJhY3RhYmxlKGludGVyYWN0YWJsZUlkOiBzdHJpbmcsIHJlZ2lzdHJ5SWQgPSBERUZBVUxUX1JFR0lTVFJZX0lEKSB7XG4gICAgcmV0dXJuIHRoaXMuZHJhZ1JlZ2lzdHJ5U3lzdGVtW3JlZ2lzdHJ5SWRdW2ludGVyYWN0YWJsZUlkXTtcbiAgfVxuXG4gIGNyZWF0ZUludGVyYWN0YWJsZVN0YXRlKGluaXRpYWxQb3NpdGlvbjogUG9zaXRpb24sIGluaXRpYWxTaXplOiBTaXplLCBpbml0aWFsRGVsdGE6IERlbHRhICkge1xuXG4gICAgY29uc3QgZGVsdGFzJCA9IG5ldyBCZWhhdmlvclN1YmplY3QoaW5pdGlhbERlbHRhKTtcbiAgICAvLyB0cmFja3MgdGhlIHNpemUgb2YgdGhlIGVsZW1lbnRcbiAgICBjb25zdCBzaXplJCA9IG5ldyBCZWhhdmlvclN1YmplY3Qoey4uLmluaXRpYWxTaXplLCAuLi5pbml0aWFsRGVsdGF9KTtcbiAgICAvLyBTdHJlYW0gb2YgcG9zaXRpb25zIGFzIHRoZXkgY2hhbmdlXG4gICAgY29uc3QgcG9zaXRpb24kID0gbmV3IEJlaGF2aW9yU3ViamVjdChpbml0aWFsUG9zaXRpb24pO1xuXG4gICAgLy8gQWxsIGRyYWdnYWJsZSBkYXRhIG1hcHBlZCB0b2dldGhlclxuICAgIGNvbnN0IGludGVyYWN0YWJsZSQ6IE9ic2VydmFibGU8VGZ0Q29vcmRzPiA9IGNvbWJpbmVMYXRlc3QoW1xuICAgICAgc2l6ZSQucGlwZShcbiAgICAgICAgLy8gc3RhcnRXaXRoKHsuLi5pbml0aWFsU2l6ZSwgLi4uaW5pdGlhbERlbHRhfSksXG4gICAgICAgIHNoYXJlUmVwbGF5KDEpLFxuICAgICAgICAvLyBmaWx0ZXIocmVzaXplRXZlbnQgPT4gISFyZXNpemVFdmVudC50YXJnZXRFbGVtZW50KSxcbiAgICAgICAgdGFwKCh7ZGVsdGFYLCBkZWx0YVksIHdpZHRoLCBoZWlnaHQsIHRhcmdldEVsZW1lbnR9KSA9PiB7XG4gICAgICAgICAgdGhpcy5uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5zZXRFbGVtZW50U2l6ZSh3aWR0aCwgaGVpZ2h0LCB0YXJnZXRFbGVtZW50KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICAvLyBvbmx5IHJlcG9zaXRpb24gaWYgbmVjZXNzYXJ5IGkuZSB3aGVuIHJlc2l6aW5nIGxlZnQgb3IgdXBcbiAgICAgICAgICBpZihkZWx0YVggfHwgZGVsdGFZKSB7XG4gICAgICAgICAgICBkZWx0YXMkLm5leHQoe2RlbHRhWCwgZGVsdGFZLCB0YXJnZXRFbGVtZW50fSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgKSxcbiAgICAgIGRlbHRhcyQucGlwZShcbiAgICAgICAgc2hhcmVSZXBsYXkoMSksXG4gICAgICAgIHRhcCgoZGVsdGEpID0+IHtcbiAgICAgICAgICBjb25zdCBwb3NpdGlvbiA9IHBvc2l0aW9uJC52YWx1ZTtcbiAgICAgICAgICBjb25zdCBuZXdQb3NpdGlvbiA9IHRoaXMuYWRkRGVsdGFUb1Bvc2l0aW9uKGRlbHRhLCBwb3NpdGlvbik7XG4gICAgICAgICAgcG9zaXRpb24kLm5leHQobmV3UG9zaXRpb24pO1xuICAgICAgICB9KVxuICAgICAgKSxcbiAgICAgIHBvc2l0aW9uJC5waXBlKFxuICAgICAgICBzaGFyZVJlcGxheSgxKSxcbiAgICAgICAgdGFwKCBwb3NpdGlvbiA9PiB7XG4gICAgICAgICAgdGhpcy5uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5zZXRFbGVtZW50VHJhbnNmb3JtKHBvc2l0aW9uLngsIHBvc2l0aW9uLnksIHBvc2l0aW9uKTtcbiAgICAgICAgICB9KVxuICAgICAgICB9KVxuICAgICAgKVxuICAgICAgXSkucGlwZShcbiAgICAgIHNoYXJlUmVwbGF5KDEpLFxuICAgICAgbWFwKCAoW3NpemUsIGRlbHRhcywgcG9zaXRpb25dKTogVGZ0Q29vcmRzPT4ge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHg6IHBvc2l0aW9uLngsXG4gICAgICAgICAgeTogcG9zaXRpb24ueSxcbiAgICAgICAgICBkZWx0YVg6IGRlbHRhcy5kZWx0YVgsXG4gICAgICAgICAgZGVsdGFZOiBkZWx0YXMuZGVsdGFZLFxuICAgICAgICAgIHdpZHRoOiBzaXplLndpZHRoLFxuICAgICAgICAgIGhlaWdodDogc2l6ZS5oZWlnaHQsXG4gICAgICAgICAgdGFyZ2V0RWxlbWVudDogc2l6ZS50YXJnZXRFbGVtZW50IHx8IHBvc2l0aW9uLnRhcmdldEVsZW1lbnQgfHwgZGVsdGFzLnRhcmdldEVsZW1lbnRcbiAgICAgICAgfVxuICAgICAgfSksXG4gICAgKVxuICAgIC8vIFRPRE86IHVwZGF0ZSBzeXN0ZW0gdG8gaGFuZGxlIG9ubHkgcmV0dXJuaW5nIGludGVyYWN0YWJsZSRcbiAgICByZXR1cm4ge1xuICAgICAgZGVsdGFzJCxcbiAgICAgIHBvc2l0aW9uJCxcbiAgICAgIHNpemUkLFxuICAgICAgaW50ZXJhY3RhYmxlJFxuICAgIH1cbiAgfVxuXG4gIGNyZWF0ZUludGVyYWN0YWJsZUlkKGN1c3RvbUludGVyYWN0YWJsZUlkOiBzdHJpbmcgfCBudWxsID0gbnVsbCkge1xuICAgIHJldHVybiBjdXN0b21JbnRlcmFjdGFibGVJZCB8fCBgaW50ZXJhY3RhYmxlJHt0aGlzLl9pbnRlcmFjdGFibGVJbmRleCsrfWBcbiAgfVxuXG4gIGNyZWF0ZURyb3B6b25lSWQoaW5kZXg6IG51bWJlcikge1xuICAgIHJldHVybiBgZHJvcHpvbmUke2luZGV4fWBcbiAgfVxuXG4gIGdldEludGVyYWN0YWJsZVN0YXRlKCBpbnRlcmFjdGFibGVJZDogc3RyaW5nLCByZWdpc3RyeUlkID0gREVGQVVMVF9SRUdJU1RSWV9JRCkge1xuICAgIHJldHVybiB0aGlzLmRyYWdSZWdpc3RyeVN5c3RlbVtyZWdpc3RyeUlkXVtpbnRlcmFjdGFibGVJZF0uaW50ZXJhY3RhYmxlJDtcbiAgfVxuXG4gIHVwZGF0ZURlbHRhcyhpbnRlcmFjdElkOiBzdHJpbmcsIHJlZ2lzdHJ5SWQ6IHN0cmluZywgeyBkZWx0YVgsIGRlbHRhWSB9LCB0YXJnZXRFbGVtZW50KSB7XG4gICAgaWYgKCF0aGlzLmludGVyYWN0YWJsZUV4aXN0T25SZWdpc3RyeShpbnRlcmFjdElkLCByZWdpc3RyeUlkKSkgcmV0dXJuO1xuICAgIHRoaXMuZHJhZ1JlZ2lzdHJ5U3lzdGVtW3JlZ2lzdHJ5SWRdW2ludGVyYWN0SWRdLmRlbHRhcyQubmV4dCh7IGRlbHRhWCwgZGVsdGFZLCB0YXJnZXRFbGVtZW50IH0pXG4gIH1cblxuICB1cGRhdGVQb3NpdGlvbihpbnRlcmFjdElkOiBzdHJpbmcsIHJlZ2lzdHJ5SWQ6IHN0cmluZywgeyB4LCB5IH06IHt4OiBudW1iZXI7IHk6IG51bWJlcjt9LCB0YXJnZXRFbGVtZW50KSB7XG4gICAgaWYgKCF0aGlzLmludGVyYWN0YWJsZUV4aXN0T25SZWdpc3RyeShpbnRlcmFjdElkLCByZWdpc3RyeUlkKSkgcmV0dXJuO1xuICAgIHRoaXMuZHJhZ1JlZ2lzdHJ5U3lzdGVtW3JlZ2lzdHJ5SWRdW2ludGVyYWN0SWRdLnBvc2l0aW9uJC5uZXh0KHsgeCwgeSwgdGFyZ2V0RWxlbWVudCB9KVxuICB9XG5cbiAgdXBkYXRlU2l6ZShpbnRlcmFjdElkOiBzdHJpbmcsIHJlZ2lzdHJ5SWQ6IHN0cmluZywgeyBkZWx0YVgsIGRlbHRhWSwgd2lkdGgsIGhlaWdodCB9LCB0YXJnZXRFbGVtZW50KSB7XG4gICAgaWYgKCF0aGlzLmludGVyYWN0YWJsZUV4aXN0T25SZWdpc3RyeShpbnRlcmFjdElkLCByZWdpc3RyeUlkKSkgcmV0dXJuXG4gICAgdGhpcy5kcmFnUmVnaXN0cnlTeXN0ZW1bcmVnaXN0cnlJZF1baW50ZXJhY3RJZF0uc2l6ZSQubmV4dCh7ZGVsdGFYLCBkZWx0YVksIHdpZHRoLCBoZWlnaHQsIHRhcmdldEVsZW1lbnR9KTtcbiAgfVxuXG4gIGludGVyYWN0YWJsZUV4aXN0T25SZWdpc3RyeShpbnRlcmFjdElkOiBzdHJpbmcsIHJlZ2lzdHJ5SWQgPSBERUZBVUxUX1JFR0lTVFJZX0lEKSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXByb3RvdHlwZS1idWlsdGluc1xuICAgIHJldHVybiB0aGlzLmRyYWdSZWdpc3RyeVN5c3RlbS5oYXNPd25Qcm9wZXJ0eShyZWdpc3RyeUlkKSAmJiB0aGlzLmRyYWdSZWdpc3RyeVN5c3RlbVtyZWdpc3RyeUlkXS5oYXNPd25Qcm9wZXJ0eShpbnRlcmFjdElkKTtcbiAgfVxuICAvKipcbiAgICogVXNlcyByZW5kZXJlciB0byBzZXQgd2lkdGggYW5kIGhlaWdodCBvZiBhbmd1bGFyIGNvbXBvbmVudFxuICAgKiBAcGFyYW0gd2lkdGggdGhlIGRlc2lyZWQgd2lkdGggb2YgY29tcG9uZW50XG4gICAqIEBwYXJhbSBoZWlnaHQgdGhlIGRlc2lyZWQgaGVpZ2h0IG9mIGNvbXBvbmVudFxuICAgKiBAcGFyYW0gdGFyZ2V0IHRoZSBlbGVtZW50IHRvIHRyYW5zZm9ybVxuICAgKi9cbiAgc2V0RWxlbWVudFNpemUod2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIsIHRhcmdldDogVGZ0UmVzaXplRWxlbWVudCkge1xuICAgIGlmKCF0YXJnZXQpIHJldHVybjtcbiAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRhcmdldCwgJ3dpZHRoJywgYCR7d2lkdGh9JHt0aGlzLmNzc1VuaXR9YCk7XG4gICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0YXJnZXQsICdoZWlnaHQnLCBgJHtoZWlnaHR9JHt0aGlzLmNzc1VuaXR9YCk7XG4gIH1cbiAgLyoqXG4gICAqIFVzZXMgcmVuZGVyZXIgdG8gc2V0IHBvc2l0aW9uIG9mIGFuZ3VsYXIgY29tcG9uZW50XG4gICAqIEBwYXJhbSB4IHBvc2l0aW9uIG9uIHggYXhpc1xuICAgKiBAcGFyYW0geSBwb3NpdGlvbiBvbiB5IGF4aXNcbiAgICogQHBhcmFtIHRhcmdldCB0aGUgZWxlbWVudCB0byB0cmFuc2Zvcm1cbiAgICovXG4gIHNldEVsZW1lbnRUcmFuc2Zvcm0oeDogbnVtYmVyLCB5OiBudW1iZXIsIHBvc2l0aW9uOiBQb3NpdGlvbiApIHtcbiAgICBpZighcG9zaXRpb24/LnRhcmdldEVsZW1lbnQpIHJldHVybjtcbiAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHBvc2l0aW9uLnRhcmdldEVsZW1lbnQsICdsZWZ0JywgYCR7eH0ke3RoaXMuY3NzVW5pdH1gKTtcbiAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHBvc2l0aW9uLnRhcmdldEVsZW1lbnQsICd0b3AnLCBgJHt5fSR7dGhpcy5jc3NVbml0fWApO1xuICB9XG4gIC8qKlxuICAgKiBHZW5lcmF0ZXMgYSB0cmFuc2xhdGUgc3RyaW5nIGZvciB0aGUgeCBhbmQgeSBhcmd1bWVudHMgcGFzc2VkIHRvXG4gICAqIGJlIHBhc3NlZCB0byBjc3MgdHJhbnNmb3JtXG4gICAqIEBwYXJhbSB4IHRoZSBwb3NpdGlvbiBhbG9uZyB0aGUgeCBheGlzXG4gICAqIEBwYXJhbSB5IHRoZSBwb3NpdGlvbiBhbG9uZyB0aGUgeSBheGlzXG4gICAqL1xuICBjcmVhdGVUcmFuc2Zvcm1TdHJpbmcoeDogbnVtYmVyLCB5OiBudW1iZXIpIHtcbiAgICByZXR1cm4gYHRyYW5zbGF0ZTNkKCR7eH0ke3RoaXMuY3NzVW5pdH0sICR7eX0ke3RoaXMuY3NzVW5pdH0sIDApYFxuICB9XG5cbiAgY2FsY3VsYXRlUG9zaXRpb25JbkVsZW1lbnQoem9uZUVsZW1lbnQ6IEludGVyYWN0LkVsZW1lbnQsIGRyYWdFbGVtZW50OiBUZnREcmFnRWxlbWVudCwgc2NhbGU/OiBudW1iZXIpIHtcbiAgICAvLyBUT0RPOiB0aGlzIGNhbGN1bGF0aW9uIG1heSBub3QgY292ZXIgYSBsb3Qgb2Ygc2NlbmFyaW9zLCBrZWVwIGFuIGV5ZSBvdXQgZm9yIHBvc3NpYmxlIGltcHJvdmVtZW50c1xuICAgIGNvbnN0IHpvbmVSZWN0ID0gem9uZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgY29uc3QgZHJhZ1JlY3QgPSBkcmFnRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBjb25zdCBwb3NpdGlvbiA9IHNjYWxlXG4gICAgICA/IHtcbiAgICAgIHg6IChkcmFnUmVjdC5sZWZ0IC0gem9uZVJlY3QubGVmdCkgLyBzY2FsZSAgfHwgMSxcbiAgICAgIHk6IChkcmFnUmVjdC50b3AgLSB6b25lUmVjdC50b3ApIC8gc2NhbGUgfHwgMVxuICAgICAgfSA6IHtcbiAgICAgICAgeDogZHJhZ1JlY3QubGVmdCAtIHpvbmVSZWN0LmxlZnQsXG4gICAgICAgIHk6IGRyYWdSZWN0LnRvcCAtIHpvbmVSZWN0LnRvcFxuICAgIH07XG4gICAgLy8gY29uc29sZS5sb2coeyB5OnBvc2l0aW9uLnksIGRydDpkcmFnUmVjdC50b3AsIHpydDogem9uZVJlY3QudG9wfSlcbiAgICByZXR1cm4gcG9zaXRpb247XG4gIH1cbn1cbiJdfQ==
|
|
@@ -1,35 +1,35 @@
|
|
|
1
|
-
/** Gets the closest ancestor of an element that matches a selector. */
|
|
2
|
-
export function getClosestMatchingAncestor(element, selector) {
|
|
3
|
-
let currentElement = element.parentElement;
|
|
4
|
-
while (currentElement) {
|
|
5
|
-
// IE doesn't support `matches` so we have to fall back to `msMatchesSelector`.
|
|
6
|
-
if (currentElement.matches ? currentElement.matches(selector) :
|
|
7
|
-
currentElement.msMatchesSelector(selector)) {
|
|
8
|
-
return currentElement;
|
|
9
|
-
}
|
|
10
|
-
currentElement = currentElement.parentElement;
|
|
11
|
-
}
|
|
12
|
-
return null;
|
|
13
|
-
}
|
|
14
|
-
/**
|
|
15
|
-
* Create a copy of the HTML Element
|
|
16
|
-
*/
|
|
17
|
-
export function cloneElement(element) {
|
|
18
|
-
const clone = element.cloneNode(true);
|
|
19
|
-
clone.removeAttribute('id');
|
|
20
|
-
return clone;
|
|
21
|
-
}
|
|
22
|
-
/**
|
|
23
|
-
* Gets the root HTML element of an embedded view.
|
|
24
|
-
* If the root is not an HTML element it gets wrapped in one.
|
|
25
|
-
*/
|
|
26
|
-
export function getRootNode(viewRef, _document) {
|
|
27
|
-
const rootNodes = viewRef.rootNodes;
|
|
28
|
-
if (rootNodes.length === 1 && rootNodes[0].nodeType === _document.ELEMENT_NODE) {
|
|
29
|
-
return rootNodes[0];
|
|
30
|
-
}
|
|
31
|
-
const wrapper = _document.createElement('div');
|
|
32
|
-
rootNodes.forEach(node => wrapper.appendChild(node));
|
|
33
|
-
return wrapper;
|
|
34
|
-
}
|
|
1
|
+
/** Gets the closest ancestor of an element that matches a selector. */
|
|
2
|
+
export function getClosestMatchingAncestor(element, selector) {
|
|
3
|
+
let currentElement = element.parentElement;
|
|
4
|
+
while (currentElement) {
|
|
5
|
+
// IE doesn't support `matches` so we have to fall back to `msMatchesSelector`.
|
|
6
|
+
if (currentElement.matches ? currentElement.matches(selector) :
|
|
7
|
+
currentElement.msMatchesSelector(selector)) {
|
|
8
|
+
return currentElement;
|
|
9
|
+
}
|
|
10
|
+
currentElement = currentElement.parentElement;
|
|
11
|
+
}
|
|
12
|
+
return null;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Create a copy of the HTML Element
|
|
16
|
+
*/
|
|
17
|
+
export function cloneElement(element) {
|
|
18
|
+
const clone = element.cloneNode(true);
|
|
19
|
+
clone.removeAttribute('id');
|
|
20
|
+
return clone;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Gets the root HTML element of an embedded view.
|
|
24
|
+
* If the root is not an HTML element it gets wrapped in one.
|
|
25
|
+
*/
|
|
26
|
+
export function getRootNode(viewRef, _document) {
|
|
27
|
+
const rootNodes = viewRef.rootNodes;
|
|
28
|
+
if (rootNodes.length === 1 && rootNodes[0].nodeType === _document.ELEMENT_NODE) {
|
|
29
|
+
return rootNodes[0];
|
|
30
|
+
}
|
|
31
|
+
const wrapper = _document.createElement('div');
|
|
32
|
+
rootNodes.forEach(node => wrapper.appendChild(node));
|
|
33
|
+
return wrapper;
|
|
34
|
+
}
|
|
35
35
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGVscGVycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvaW50ZXJhY3Qvc3JjL2xpYi91dGlscy9oZWxwZXJzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQU1BLHVFQUF1RTtBQUN2RSxNQUFNLFVBQVUsMEJBQTBCLENBQUMsT0FBb0IsRUFBRSxRQUFnQjtJQUMvRSxJQUFJLGNBQWMsR0FBRyxPQUFPLENBQUMsYUFBbUMsQ0FBQztJQUVqRSxPQUFPLGNBQWMsRUFBRTtRQUNyQiwrRUFBK0U7UUFDL0UsSUFBSSxjQUFjLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7WUFDMUQsY0FBNEIsQ0FBQyxpQkFBaUIsQ0FBQyxRQUFRLENBQUMsRUFBRTtZQUM3RCxPQUFPLGNBQWMsQ0FBQztTQUN2QjtRQUVELGNBQWMsR0FBRyxjQUFjLENBQUMsYUFBYSxDQUFDO0tBQy9DO0lBRUQsT0FBTyxJQUFJLENBQUM7QUFDZCxDQUFDO0FBR0Q7O0dBRUc7QUFDSCxNQUFNLFVBQVUsWUFBWSxDQUFDLE9BQW9CO0lBRS9DLE1BQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFnQixDQUFDO0lBQ3JELEtBQUssQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDNUIsT0FBTyxLQUFLLENBQUM7QUFDZixDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsTUFBTSxVQUFVLFdBQVcsQ0FBQyxPQUE2QixFQUFFLFNBQW1CO0lBQzVFLE1BQU0sU0FBUyxHQUFXLE9BQU8sQ0FBQyxTQUFTLENBQUM7SUFFNUMsSUFBSSxTQUFTLENBQUMsTUFBTSxLQUFLLENBQUMsSUFBSSxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxLQUFLLFNBQVMsQ0FBQyxZQUFZLEVBQUU7UUFDOUUsT0FBTyxTQUFTLENBQUMsQ0FBQyxDQUFnQixDQUFDO0tBQ3BDO0lBRUQsTUFBTSxPQUFPLEdBQUcsU0FBUyxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUMvQyxTQUFTLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQ3JELE9BQU8sT0FBTyxDQUFDO0FBQ2pCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBFbWJlZGRlZFZpZXdSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW50ZXJmYWNlIElFRWxlbWVudCBleHRlbmRzIEhUTUxFbGVtZW50IHtcbiAgbXNNYXRjaGVzU2VsZWN0b3I6IChzZWxlY3Rvcjogc3RyaW5nKSA9PiBib29sZWFuOyAvL1xufVxuXG4vKiogR2V0cyB0aGUgY2xvc2VzdCBhbmNlc3RvciBvZiBhbiBlbGVtZW50IHRoYXQgbWF0Y2hlcyBhIHNlbGVjdG9yLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldENsb3Nlc3RNYXRjaGluZ0FuY2VzdG9yKGVsZW1lbnQ6IEhUTUxFbGVtZW50LCBzZWxlY3Rvcjogc3RyaW5nKSB7XG4gIGxldCBjdXJyZW50RWxlbWVudCA9IGVsZW1lbnQucGFyZW50RWxlbWVudCBhcyBIVE1MRWxlbWVudCB8IG51bGw7XG5cbiAgd2hpbGUgKGN1cnJlbnRFbGVtZW50KSB7XG4gICAgLy8gSUUgZG9lc24ndCBzdXBwb3J0IGBtYXRjaGVzYCBzbyB3ZSBoYXZlIHRvIGZhbGwgYmFjayB0byBgbXNNYXRjaGVzU2VsZWN0b3JgLlxuICAgIGlmIChjdXJyZW50RWxlbWVudC5tYXRjaGVzID8gY3VycmVudEVsZW1lbnQubWF0Y2hlcyhzZWxlY3RvcikgOlxuICAgICAgICAoY3VycmVudEVsZW1lbnQgYXMgSUVFbGVtZW50KS5tc01hdGNoZXNTZWxlY3RvcihzZWxlY3RvcikpIHtcbiAgICAgIHJldHVybiBjdXJyZW50RWxlbWVudDtcbiAgICB9XG5cbiAgICBjdXJyZW50RWxlbWVudCA9IGN1cnJlbnRFbGVtZW50LnBhcmVudEVsZW1lbnQ7XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxuXG4vKipcbiAqIENyZWF0ZSBhIGNvcHkgb2YgdGhlIEhUTUwgRWxlbWVudFxuICovXG5leHBvcnQgZnVuY3Rpb24gY2xvbmVFbGVtZW50KGVsZW1lbnQ6IEhUTUxFbGVtZW50KSB7XG5cbiAgY29uc3QgY2xvbmUgPSBlbGVtZW50LmNsb25lTm9kZSh0cnVlKSBhcyBIVE1MRWxlbWVudDtcbiAgY2xvbmUucmVtb3ZlQXR0cmlidXRlKCdpZCcpO1xuICByZXR1cm4gY2xvbmU7XG59XG5cbi8qKlxuICogR2V0cyB0aGUgcm9vdCBIVE1MIGVsZW1lbnQgb2YgYW4gZW1iZWRkZWQgdmlldy5cbiAqIElmIHRoZSByb290IGlzIG5vdCBhbiBIVE1MIGVsZW1lbnQgaXQgZ2V0cyB3cmFwcGVkIGluIG9uZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFJvb3ROb2RlKHZpZXdSZWY6IEVtYmVkZGVkVmlld1JlZjxhbnk+LCBfZG9jdW1lbnQ6IERvY3VtZW50KTogSFRNTEVsZW1lbnQge1xuICBjb25zdCByb290Tm9kZXM6IE5vZGVbXSA9IHZpZXdSZWYucm9vdE5vZGVzO1xuXG4gIGlmIChyb290Tm9kZXMubGVuZ3RoID09PSAxICYmIHJvb3ROb2Rlc1swXS5ub2RlVHlwZSA9PT0gX2RvY3VtZW50LkVMRU1FTlRfTk9ERSkge1xuICAgIHJldHVybiByb290Tm9kZXNbMF0gYXMgSFRNTEVsZW1lbnQ7XG4gIH1cblxuICBjb25zdCB3cmFwcGVyID0gX2RvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICByb290Tm9kZXMuZm9yRWFjaChub2RlID0+IHdyYXBwZXIuYXBwZW5kQ2hpbGQobm9kZSkpO1xuICByZXR1cm4gd3JhcHBlcjtcbn1cbiJdfQ==
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export * from './helpers';
|
|
1
|
+
export * from './helpers';
|
|
2
2
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9saWJzL2ludGVyYWN0L3NyYy9saWIvdXRpbHMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyxXQUFXLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tICcuL2hlbHBlcnMnO1xuIl19
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Generated bundle index. Do not edit.
|
|
3
|
-
*/
|
|
4
|
-
export * from './index';
|
|
1
|
+
/**
|
|
2
|
+
* Generated bundle index. Do not edit.
|
|
3
|
+
*/
|
|
4
|
+
export * from './index';
|
|
5
5
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGZ0LWludGVyYWN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vbGlicy9pbnRlcmFjdC9zcmMvdGZ0LWludGVyYWN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBRUgsY0FBYyxTQUFTLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEdlbmVyYXRlZCBidW5kbGUgaW5kZXguIERvIG5vdCBlZGl0LlxuICovXG5cbmV4cG9ydCAqIGZyb20gJy4vaW5kZXgnO1xuIl19
|