ngx-fabric-wrapper 14.0.0 → 16.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/esm2022/lib/fabric.component.mjs +194 -0
- package/esm2022/lib/fabric.directive.mjs +316 -0
- package/esm2022/lib/fabric.interfaces.mjs +108 -0
- package/{esm2020 → esm2022}/lib/fabric.module.mjs +5 -5
- package/{fesm2020 → fesm2022}/ngx-fabric-wrapper.mjs +180 -123
- package/fesm2022/ngx-fabric-wrapper.mjs.map +1 -0
- package/lib/fabric.component.d.ts +1 -1
- package/lib/fabric.directive.d.ts +1 -1
- package/lib/fabric.interfaces.d.ts +2 -2
- package/package.json +5 -11
- package/esm2020/lib/fabric.component.mjs +0 -193
- package/esm2020/lib/fabric.directive.mjs +0 -310
- package/esm2020/lib/fabric.interfaces.mjs +0 -58
- package/fesm2015/ngx-fabric-wrapper.mjs +0 -580
- package/fesm2015/ngx-fabric-wrapper.mjs.map +0 -1
- package/fesm2020/ngx-fabric-wrapper.mjs.map +0 -1
- /package/{esm2020 → esm2022}/ngx-fabric-wrapper.mjs +0 -0
- /package/{esm2020 → esm2022}/public-api.mjs +0 -0
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
import { Component, Input, Output, EventEmitter, ViewChild, HostBinding, ViewEncapsulation } from '@angular/core';
|
|
2
|
+
import { FabricDirective } from './fabric.directive';
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
import * as i1 from "./fabric.directive";
|
|
5
|
+
export class FabricComponent {
|
|
6
|
+
json = null;
|
|
7
|
+
set data(data) {
|
|
8
|
+
this.setJSON(data);
|
|
9
|
+
}
|
|
10
|
+
zoom = null;
|
|
11
|
+
width = null;
|
|
12
|
+
height = null;
|
|
13
|
+
disabled = false;
|
|
14
|
+
config;
|
|
15
|
+
useFabricClass = true;
|
|
16
|
+
dataLoaded = new EventEmitter();
|
|
17
|
+
drop = new EventEmitter();
|
|
18
|
+
dragover = new EventEmitter();
|
|
19
|
+
dragenter = new EventEmitter();
|
|
20
|
+
dragleave = new EventEmitter();
|
|
21
|
+
mouseup = new EventEmitter();
|
|
22
|
+
mousedown = new EventEmitter();
|
|
23
|
+
mouseover = new EventEmitter();
|
|
24
|
+
mouseout = new EventEmitter();
|
|
25
|
+
mousemove = new EventEmitter();
|
|
26
|
+
mousewheel = new EventEmitter();
|
|
27
|
+
mousedblclick = new EventEmitter();
|
|
28
|
+
mouseupBefore = new EventEmitter();
|
|
29
|
+
mousedownBefore = new EventEmitter();
|
|
30
|
+
mousemoveBefore = new EventEmitter();
|
|
31
|
+
mouseUp = new EventEmitter();
|
|
32
|
+
mouseDown = new EventEmitter();
|
|
33
|
+
mouseOver = new EventEmitter();
|
|
34
|
+
mouseOut = new EventEmitter();
|
|
35
|
+
mouseMove = new EventEmitter();
|
|
36
|
+
mouseWheel = new EventEmitter();
|
|
37
|
+
mouseDblclick = new EventEmitter();
|
|
38
|
+
mouseUpBefore = new EventEmitter();
|
|
39
|
+
mouseDownBefore = new EventEmitter();
|
|
40
|
+
mouseMoveBefore = new EventEmitter();
|
|
41
|
+
pathCreated = new EventEmitter();
|
|
42
|
+
alterRender = new EventEmitter();
|
|
43
|
+
objectAdded = new EventEmitter();
|
|
44
|
+
objectMoved = new EventEmitter();
|
|
45
|
+
objectScaled = new EventEmitter();
|
|
46
|
+
objectSkewed = new EventEmitter();
|
|
47
|
+
objectRotated = new EventEmitter();
|
|
48
|
+
objectRemoved = new EventEmitter();
|
|
49
|
+
objectModified = new EventEmitter();
|
|
50
|
+
objectSelected = new EventEmitter();
|
|
51
|
+
objectMoving = new EventEmitter();
|
|
52
|
+
objectScaling = new EventEmitter();
|
|
53
|
+
objectSkewing = new EventEmitter();
|
|
54
|
+
objectRotating = new EventEmitter();
|
|
55
|
+
selectionCleared = new EventEmitter();
|
|
56
|
+
selectionCreated = new EventEmitter();
|
|
57
|
+
selectionUpdated = new EventEmitter();
|
|
58
|
+
beforeTransform = new EventEmitter();
|
|
59
|
+
beforeSelectionCleared = new EventEmitter();
|
|
60
|
+
directiveRef;
|
|
61
|
+
constructor() { }
|
|
62
|
+
ngAfterViewInit() {
|
|
63
|
+
if (this.json != null) {
|
|
64
|
+
this.setJSON(this.json, true);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
setJSON(json, force) {
|
|
68
|
+
if (force || json !== this.json) {
|
|
69
|
+
if (this.directiveRef) {
|
|
70
|
+
this.directiveRef.loadFromJSON(json, () => {
|
|
71
|
+
if (this.directiveRef && this.directiveRef.fabric()) {
|
|
72
|
+
this.dataLoaded.emit(this.directiveRef.fabric());
|
|
73
|
+
}
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
this.json = json;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.4", ngImport: i0, type: FabricComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
80
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.0.4", type: FabricComponent, selector: "fabric", inputs: { data: "data", zoom: "zoom", width: "width", height: "height", disabled: "disabled", config: "config", useFabricClass: "useFabricClass" }, outputs: { dataLoaded: "dataLoaded", drop: "drop", dragover: "dragover", dragenter: "dragenter", dragleave: "dragleave", mouseup: "mouseup", mousedown: "mousedown", mouseover: "mouseover", mouseout: "mouseout", mousemove: "mousemove", mousewheel: "mousewheel", mousedblclick: "mousedblclick", mouseupBefore: "mouseupBefore", mousedownBefore: "mousedownBefore", mousemoveBefore: "mousemoveBefore", mouseUp: "mouseUp", mouseDown: "mouseDown", mouseOver: "mouseOver", mouseOut: "mouseOut", mouseMove: "mouseMove", mouseWheel: "mouseWheel", mouseDblclick: "mouseDblclick", mouseUpBefore: "mouseUpBefore", mouseDownBefore: "mouseDownBefore", mouseMoveBefore: "mouseMoveBefore", pathCreated: "pathCreated", alterRender: "alterRender", objectAdded: "objectAdded", objectMoved: "objectMoved", objectScaled: "objectScaled", objectSkewed: "objectSkewed", objectRotated: "objectRotated", objectRemoved: "objectRemoved", objectModified: "objectModified", objectSelected: "objectSelected", objectMoving: "objectMoving", objectScaling: "objectScaling", objectSkewing: "objectSkewing", objectRotating: "objectRotating", selectionCleared: "selectionCleared", selectionCreated: "selectionCreated", selectionUpdated: "selectionUpdated", beforeTransform: "beforeTransform", beforeSelectionCleared: "beforeSelectionCleared" }, host: { properties: { "class.fabric": "this.useFabricClass" } }, viewQueries: [{ propertyName: "directiveRef", first: true, predicate: FabricDirective, descendants: true, static: true }], exportAs: ["ngxFabric"], ngImport: i0, template: "<canvas [fabric]=\"config\" [zoom]=\"zoom\" [width]=\"width\" [height]=\"height\" [disabled]=\"disabled\" (drop)=\"drop.emit($event)\" (dragover)=\"dragover.emit($event)\" (dragenter)=\"dragenter.emit($event)\" (dragleave)=\"dragleave.emit($event)\" (mouseup)=\"mouseup.emit($event)\" (mousedown)=\"mousedown.emit($event)\" (mouseover)=\"mouseover.emit($event)\" (mouseout)=\"mouseout.emit($event)\" (mousemove)=\"mousemove.emit($event)\" (mousewheel)=\"mousewheel.emit($event)\" (mousedblclick)=\"mousedblclick.emit($event)\" (mouseupBefore)=\"mouseupBefore.emit($event)\" (mousedownBefore)=\"mousedownBefore.emit($event)\" (mousemoveBefore)=\"mousemoveBefore.emit($event)\" (mouseUp)=\"mouseUp.emit($event)\" (mouseDown)=\"mouseDown.emit($event)\" (mouseOver)=\"mouseOver.emit($event)\" (mouseOut)=\"mouseOut.emit($event)\" (mouseMove)=\"mouseMove.emit($event)\" (mouseWheel)=\"mouseWheel.emit($event)\" (mouseDblclick)=\"mouseDblclick.emit($event)\" (mouseUpBefore)=\"mouseUpBefore.emit($event)\" (mouseDownBefore)=\"mouseDownBefore.emit($event)\" (mouseMoveBefore)=\"mouseMoveBefore.emit($event)\" (pathCreated)=\"pathCreated.emit($event)\" (alterRender)=\"alterRender.emit($event)\" (objectAdded)=\"objectAdded.emit($event)\" (objectMoved)=\"objectMoved.emit($event)\" (objectScaled)=\"objectScaled.emit($event)\" (objectSkewed)=\"objectSkewed.emit($event)\" (objectRotated)=\"objectRotated.emit($event)\" (objectRemoved)=\"objectRemoved.emit($event)\" (objectModified)=\"objectModified.emit($event)\" (objectSelected)=\"objectSelected.emit($event)\" (objectMoving)=\"objectMoving.emit($event)\" (objectScaling)=\"objectScaling.emit($event)\" (objectSkewing)=\"objectSkewing.emit($event)\" (objectRotating)=\"objectRotating.emit($event)\" (selectionCleared)=\"selectionCleared.emit($event)\" (selectionCreated)=\"selectionCreated.emit($event)\" (selectionUpdated)=\"selectionUpdated.emit($event)\" (beforeTransform)=\"beforeTransform.emit($event)\" (beforeSelectionCleared)=\"beforeSelectionCleared.emit($event)\">\n</canvas>\n", styles: ["fabric.flex{display:flex;flex-direction:column;min-width:0;min-height:0}fabric.fabric{width:100%;height:100%}\n"], dependencies: [{ kind: "directive", type: i1.FabricDirective, selector: "[fabric]", inputs: ["zoom", "width", "height", "disabled", "fabric"], outputs: ["drop", "dragover", "dragenter", "dragleave", "mouseup", "mousedown", "mouseover", "mouseout", "mousemove", "mousewheel", "mousedblclick", "mouseupBefore", "mousedownBefore", "mousemoveBefore", "mouseUp", "mouseDown", "mouseOver", "mouseOut", "mouseMove", "mouseWheel", "mouseDblclick", "mouseUpBefore", "mouseDownBefore", "mouseMoveBefore", "pathCreated", "alterRender", "objectAdded", "objectMoved", "objectScaled", "objectSkewed", "objectRotated", "objectRemoved", "objectModified", "objectSelected", "objectMoving", "objectScaling", "objectSkewing", "objectRotating", "selectionCleared", "selectionCreated", "selectionUpdated", "beforeTransform", "beforeSelectionCleared"], exportAs: ["ngxFabric"] }], encapsulation: i0.ViewEncapsulation.None });
|
|
81
|
+
}
|
|
82
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.4", ngImport: i0, type: FabricComponent, decorators: [{
|
|
83
|
+
type: Component,
|
|
84
|
+
args: [{ selector: 'fabric', exportAs: 'ngxFabric', encapsulation: ViewEncapsulation.None, template: "<canvas [fabric]=\"config\" [zoom]=\"zoom\" [width]=\"width\" [height]=\"height\" [disabled]=\"disabled\" (drop)=\"drop.emit($event)\" (dragover)=\"dragover.emit($event)\" (dragenter)=\"dragenter.emit($event)\" (dragleave)=\"dragleave.emit($event)\" (mouseup)=\"mouseup.emit($event)\" (mousedown)=\"mousedown.emit($event)\" (mouseover)=\"mouseover.emit($event)\" (mouseout)=\"mouseout.emit($event)\" (mousemove)=\"mousemove.emit($event)\" (mousewheel)=\"mousewheel.emit($event)\" (mousedblclick)=\"mousedblclick.emit($event)\" (mouseupBefore)=\"mouseupBefore.emit($event)\" (mousedownBefore)=\"mousedownBefore.emit($event)\" (mousemoveBefore)=\"mousemoveBefore.emit($event)\" (mouseUp)=\"mouseUp.emit($event)\" (mouseDown)=\"mouseDown.emit($event)\" (mouseOver)=\"mouseOver.emit($event)\" (mouseOut)=\"mouseOut.emit($event)\" (mouseMove)=\"mouseMove.emit($event)\" (mouseWheel)=\"mouseWheel.emit($event)\" (mouseDblclick)=\"mouseDblclick.emit($event)\" (mouseUpBefore)=\"mouseUpBefore.emit($event)\" (mouseDownBefore)=\"mouseDownBefore.emit($event)\" (mouseMoveBefore)=\"mouseMoveBefore.emit($event)\" (pathCreated)=\"pathCreated.emit($event)\" (alterRender)=\"alterRender.emit($event)\" (objectAdded)=\"objectAdded.emit($event)\" (objectMoved)=\"objectMoved.emit($event)\" (objectScaled)=\"objectScaled.emit($event)\" (objectSkewed)=\"objectSkewed.emit($event)\" (objectRotated)=\"objectRotated.emit($event)\" (objectRemoved)=\"objectRemoved.emit($event)\" (objectModified)=\"objectModified.emit($event)\" (objectSelected)=\"objectSelected.emit($event)\" (objectMoving)=\"objectMoving.emit($event)\" (objectScaling)=\"objectScaling.emit($event)\" (objectSkewing)=\"objectSkewing.emit($event)\" (objectRotating)=\"objectRotating.emit($event)\" (selectionCleared)=\"selectionCleared.emit($event)\" (selectionCreated)=\"selectionCreated.emit($event)\" (selectionUpdated)=\"selectionUpdated.emit($event)\" (beforeTransform)=\"beforeTransform.emit($event)\" (beforeSelectionCleared)=\"beforeSelectionCleared.emit($event)\">\n</canvas>\n", styles: ["fabric.flex{display:flex;flex-direction:column;min-width:0;min-height:0}fabric.fabric{width:100%;height:100%}\n"] }]
|
|
85
|
+
}], ctorParameters: () => [], propDecorators: { data: [{
|
|
86
|
+
type: Input
|
|
87
|
+
}], zoom: [{
|
|
88
|
+
type: Input
|
|
89
|
+
}], width: [{
|
|
90
|
+
type: Input
|
|
91
|
+
}], height: [{
|
|
92
|
+
type: Input
|
|
93
|
+
}], disabled: [{
|
|
94
|
+
type: Input
|
|
95
|
+
}], config: [{
|
|
96
|
+
type: Input
|
|
97
|
+
}], useFabricClass: [{
|
|
98
|
+
type: HostBinding,
|
|
99
|
+
args: ['class.fabric']
|
|
100
|
+
}, {
|
|
101
|
+
type: Input
|
|
102
|
+
}], dataLoaded: [{
|
|
103
|
+
type: Output
|
|
104
|
+
}], drop: [{
|
|
105
|
+
type: Output
|
|
106
|
+
}], dragover: [{
|
|
107
|
+
type: Output
|
|
108
|
+
}], dragenter: [{
|
|
109
|
+
type: Output
|
|
110
|
+
}], dragleave: [{
|
|
111
|
+
type: Output
|
|
112
|
+
}], mouseup: [{
|
|
113
|
+
type: Output
|
|
114
|
+
}], mousedown: [{
|
|
115
|
+
type: Output
|
|
116
|
+
}], mouseover: [{
|
|
117
|
+
type: Output
|
|
118
|
+
}], mouseout: [{
|
|
119
|
+
type: Output
|
|
120
|
+
}], mousemove: [{
|
|
121
|
+
type: Output
|
|
122
|
+
}], mousewheel: [{
|
|
123
|
+
type: Output
|
|
124
|
+
}], mousedblclick: [{
|
|
125
|
+
type: Output
|
|
126
|
+
}], mouseupBefore: [{
|
|
127
|
+
type: Output
|
|
128
|
+
}], mousedownBefore: [{
|
|
129
|
+
type: Output
|
|
130
|
+
}], mousemoveBefore: [{
|
|
131
|
+
type: Output
|
|
132
|
+
}], mouseUp: [{
|
|
133
|
+
type: Output
|
|
134
|
+
}], mouseDown: [{
|
|
135
|
+
type: Output
|
|
136
|
+
}], mouseOver: [{
|
|
137
|
+
type: Output
|
|
138
|
+
}], mouseOut: [{
|
|
139
|
+
type: Output
|
|
140
|
+
}], mouseMove: [{
|
|
141
|
+
type: Output
|
|
142
|
+
}], mouseWheel: [{
|
|
143
|
+
type: Output
|
|
144
|
+
}], mouseDblclick: [{
|
|
145
|
+
type: Output
|
|
146
|
+
}], mouseUpBefore: [{
|
|
147
|
+
type: Output
|
|
148
|
+
}], mouseDownBefore: [{
|
|
149
|
+
type: Output
|
|
150
|
+
}], mouseMoveBefore: [{
|
|
151
|
+
type: Output
|
|
152
|
+
}], pathCreated: [{
|
|
153
|
+
type: Output
|
|
154
|
+
}], alterRender: [{
|
|
155
|
+
type: Output
|
|
156
|
+
}], objectAdded: [{
|
|
157
|
+
type: Output
|
|
158
|
+
}], objectMoved: [{
|
|
159
|
+
type: Output
|
|
160
|
+
}], objectScaled: [{
|
|
161
|
+
type: Output
|
|
162
|
+
}], objectSkewed: [{
|
|
163
|
+
type: Output
|
|
164
|
+
}], objectRotated: [{
|
|
165
|
+
type: Output
|
|
166
|
+
}], objectRemoved: [{
|
|
167
|
+
type: Output
|
|
168
|
+
}], objectModified: [{
|
|
169
|
+
type: Output
|
|
170
|
+
}], objectSelected: [{
|
|
171
|
+
type: Output
|
|
172
|
+
}], objectMoving: [{
|
|
173
|
+
type: Output
|
|
174
|
+
}], objectScaling: [{
|
|
175
|
+
type: Output
|
|
176
|
+
}], objectSkewing: [{
|
|
177
|
+
type: Output
|
|
178
|
+
}], objectRotating: [{
|
|
179
|
+
type: Output
|
|
180
|
+
}], selectionCleared: [{
|
|
181
|
+
type: Output
|
|
182
|
+
}], selectionCreated: [{
|
|
183
|
+
type: Output
|
|
184
|
+
}], selectionUpdated: [{
|
|
185
|
+
type: Output
|
|
186
|
+
}], beforeTransform: [{
|
|
187
|
+
type: Output
|
|
188
|
+
}], beforeSelectionCleared: [{
|
|
189
|
+
type: Output
|
|
190
|
+
}], directiveRef: [{
|
|
191
|
+
type: ViewChild,
|
|
192
|
+
args: [FabricDirective, { static: true }]
|
|
193
|
+
}] } });
|
|
194
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmFicmljLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2xpYi9zcmMvbGliL2ZhYnJpYy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9wcm9qZWN0cy9saWIvc3JjL2xpYi9mYWJyaWMuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFDRCxLQUFLLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFDMUMsU0FBUyxFQUFFLFdBQVcsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUVuRSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7OztBQVdyRCxNQUFNLE9BQU8sZUFBZTtJQUNsQixJQUFJLEdBQVEsSUFBSSxDQUFDO0lBRXpCLElBQ0ksSUFBSSxDQUFDLElBQVk7UUFDbkIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNyQixDQUFDO0lBRVEsSUFBSSxHQUFrQixJQUFJLENBQUM7SUFFM0IsS0FBSyxHQUFrQixJQUFJLENBQUM7SUFDNUIsTUFBTSxHQUFrQixJQUFJLENBQUM7SUFFN0IsUUFBUSxHQUFZLEtBQUssQ0FBQztJQUUxQixNQUFNLENBQXlCO0lBRy9CLGNBQWMsR0FBWSxJQUFJLENBQUM7SUFFOUIsVUFBVSxHQUFHLElBQUksWUFBWSxFQUFPLENBQUM7SUFFckMsSUFBSSxHQUFHLElBQUksWUFBWSxFQUFPLENBQUM7SUFDL0IsUUFBUSxHQUFHLElBQUksWUFBWSxFQUFPLENBQUM7SUFDbkMsU0FBUyxHQUFHLElBQUksWUFBWSxFQUFPLENBQUM7SUFDcEMsU0FBUyxHQUFHLElBQUksWUFBWSxFQUFPLENBQUM7SUFFcEMsT0FBTyxHQUFHLElBQUksWUFBWSxFQUFPLENBQUM7SUFDbEMsU0FBUyxHQUFHLElBQUksWUFBWSxFQUFPLENBQUM7SUFDcEMsU0FBUyxHQUFHLElBQUksWUFBWSxFQUFPLENBQUM7SUFDcEMsUUFBUSxHQUFHLElBQUksWUFBWSxFQUFPLENBQUM7SUFDbkMsU0FBUyxHQUFHLElBQUksWUFBWSxFQUFPLENBQUM7SUFDcEMsVUFBVSxHQUFHLElBQUksWUFBWSxFQUFPLENBQUM7SUFDckMsYUFBYSxHQUFHLElBQUksWUFBWSxFQUFPLENBQUM7SUFDeEMsYUFBYSxHQUFHLElBQUksWUFBWSxFQUFPLENBQUM7SUFDeEMsZUFBZSxHQUFHLElBQUksWUFBWSxFQUFPLENBQUM7SUFDMUMsZUFBZSxHQUFHLElBQUksWUFBWSxFQUFPLENBQUM7SUFFMUMsT0FBTyxHQUFHLElBQUksWUFBWSxFQUFPLENBQUM7SUFDbEMsU0FBUyxHQUFHLElBQUksWUFBWSxFQUFPLENBQUM7SUFDcEMsU0FBUyxHQUFHLElBQUksWUFBWSxFQUFPLENBQUM7SUFDcEMsUUFBUSxHQUFHLElBQUksWUFBWSxFQUFPLENBQUM7SUFDbkMsU0FBUyxHQUFHLElBQUksWUFBWSxFQUFPLENBQUM7SUFDcEMsVUFBVSxHQUFHLElBQUksWUFBWSxFQUFPLENBQUM7SUFDckMsYUFBYSxHQUFHLElBQUksWUFBWSxFQUFPLENBQUM7SUFDeEMsYUFBYSxHQUFHLElBQUksWUFBWSxFQUFPLENBQUM7SUFDeEMsZUFBZSxHQUFHLElBQUksWUFBWSxFQUFPLENBQUM7SUFDMUMsZUFBZSxHQUFHLElBQUksWUFBWSxFQUFPLENBQUM7SUFFMUMsV0FBVyxHQUFHLElBQUksWUFBWSxFQUFPLENBQUM7SUFDdEMsV0FBVyxHQUFHLElBQUksWUFBWSxFQUFPLENBQUM7SUFFdEMsV0FBVyxHQUFHLElBQUksWUFBWSxFQUFPLENBQUM7SUFDdEMsV0FBVyxHQUFHLElBQUksWUFBWSxFQUFPLENBQUM7SUFDdEMsWUFBWSxHQUFHLElBQUksWUFBWSxFQUFPLENBQUM7SUFDdkMsWUFBWSxHQUFHLElBQUksWUFBWSxFQUFPLENBQUM7SUFDdkMsYUFBYSxHQUFHLElBQUksWUFBWSxFQUFPLENBQUM7SUFDeEMsYUFBYSxHQUFHLElBQUks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TUFBTTtnQkFDRyxlQUFlO3NCQUF4QixNQUFNO2dCQUNHLGVBQWU7c0JBQXhCLE1BQU07Z0JBRUcsV0FBVztzQkFBcEIsTUFBTTtnQkFDRyxXQUFXO3NCQUFwQixNQUFNO2dCQUVHLFdBQVc7c0JBQXBCLE1BQU07Z0JBQ0csV0FBVztzQkFBcEIsTUFBTTtnQkFDRyxZQUFZO3NCQUFyQixNQUFNO2dCQUNHLFlBQVk7c0JBQXJCLE1BQU07Z0JBQ0csYUFBYTtzQkFBdEIsTUFBTTtnQkFDRyxhQUFhO3NCQUF0QixNQUFNO2dCQUNHLGNBQWM7c0JBQXZCLE1BQU07Z0JBQ0csY0FBYztzQkFBdkIsTUFBTTtnQkFDRyxZQUFZO3NCQUFyQixNQUFNO2dCQUNHLGFBQWE7c0JBQXRCLE1BQU07Z0JBQ0csYUFBYTtzQkFBdEIsTUFBTTtnQkFDRyxjQUFjO3NCQUF2QixNQUFNO2dCQUVHLGdCQUFnQjtzQkFBekIsTUFBTTtnQkFDRyxnQkFBZ0I7c0JBQXpCLE1BQU07Z0JBQ0csZ0JBQWdCO3NCQUF6QixNQUFNO2dCQUVHLGVBQWU7c0JBQXhCLE1BQU07Z0JBQ0csc0JBQXNCO3NCQUEvQixNQUFNO2dCQUV1QyxZQUFZO3NCQUF6RCxTQUFTO3VCQUFDLGVBQWUsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsXG4gIEFmdGVyVmlld0luaXQsIElucHV0LCBPdXRwdXQsIEV2ZW50RW1pdHRlcixcbiAgVmlld0NoaWxkLCBIb3N0QmluZGluZywgVmlld0VuY2Fwc3VsYXRpb24gfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgRmFicmljRGlyZWN0aXZlIH0gZnJvbSAnLi9mYWJyaWMuZGlyZWN0aXZlJztcblxuaW1wb3J0IHsgRmFicmljQ29uZmlnSW50ZXJmYWNlIH0gZnJvbSAnLi9mYWJyaWMuaW50ZXJmYWNlcyc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2ZhYnJpYycsXG4gIGV4cG9ydEFzOiAnbmd4RmFicmljJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2ZhYnJpYy5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWyAnLi9mYWJyaWMuY29tcG9uZW50LmNzcycgXSxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZVxufSlcbmV4cG9ydCBjbGFzcyBGYWJyaWNDb21wb25lbnQgaW1wbGVtZW50cyBBZnRlclZpZXdJbml0IHtcbiAgcHJpdmF0ZSBqc29uOiBhbnkgPSBudWxsO1xuXG4gIEBJbnB1dCgpXG4gIHNldCBkYXRhKGRhdGE6IHN0cmluZykge1xuICAgIHRoaXMuc2V0SlNPTihkYXRhKTtcbiAgfVxuXG4gIEBJbnB1dCgpIHpvb206IG51bWJlciB8IG51bGwgPSBudWxsO1xuXG4gIEBJbnB1dCgpIHdpZHRoOiBudW1iZXIgfCBudWxsID0gbnVsbDtcbiAgQElucHV0KCkgaGVpZ2h0OiBudW1iZXIgfCBudWxsID0gbnVsbDtcblxuICBASW5wdXQoKSBkaXNhYmxlZDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIEBJbnB1dCgpIGNvbmZpZz86IEZhYnJpY0NvbmZpZ0ludGVyZmFjZTtcblxuICBASG9zdEJpbmRpbmcoJ2NsYXNzLmZhYnJpYycpXG4gIEBJbnB1dCgpIHVzZUZhYnJpY0NsYXNzOiBib29sZWFuID0gdHJ1ZTtcblxuICBAT3V0cHV0KCkgZGF0YUxvYWRlZCA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuXG4gIEBPdXRwdXQoKSBkcm9wID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gIEBPdXRwdXQoKSBkcmFnb3ZlciA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICBAT3V0cHV0KCkgZHJhZ2VudGVyID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gIEBPdXRwdXQoKSBkcmFnbGVhdmUgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcblxuICBAT3V0cHV0KCkgbW91c2V1cCA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICBAT3V0cHV0KCkgbW91c2Vkb3duID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gIEBPdXRwdXQoKSBtb3VzZW92ZXIgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgQE91dHB1dCgpIG1vdXNlb3V0ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gIEBPdXRwdXQoKSBtb3VzZW1vdmUgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgQE91dHB1dCgpIG1vdXNld2hlZWwgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgQE91dHB1dCgpIG1vdXNlZGJsY2xpY2sgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgQE91dHB1dCgpIG1vdXNldXBCZWZvcmUgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgQE91dHB1dCgpIG1vdXNlZG93bkJlZm9yZSA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICBAT3V0cHV0KCkgbW91c2Vtb3ZlQmVmb3JlID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG5cbiAgQE91dHB1dCgpIG1vdXNlVXAgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgQE91dHB1dCgpIG1vdXNlRG93biA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICBAT3V0cHV0KCkgbW91c2VPdmVyID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gIEBPdXRwdXQoKSBtb3VzZU91dCA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICBAT3V0cHV0KCkgbW91c2VNb3ZlID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gIEBPdXRwdXQoKSBtb3VzZVdoZWVsID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gIEBPdXRwdXQoKSBtb3VzZURibGNsaWNrID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gIEBPdXRwdXQoKSBtb3VzZVVwQmVmb3JlID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gIEBPdXRwdXQoKSBtb3VzZURvd25CZWZvcmUgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgQE91dHB1dCgpIG1vdXNlTW92ZUJlZm9yZSA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuXG4gIEBPdXRwdXQoKSBwYXRoQ3JlYXRlZCA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICBAT3V0cHV0KCkgYWx0ZXJSZW5kZXIgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcblxuICBAT3V0cHV0KCkgb2JqZWN0QWRkZWQgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgQE91dHB1dCgpIG9iamVjdE1vdmVkID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gIEBPdXRwdXQoKSBvYmplY3RTY2FsZWQgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgQE91dHB1dCgpIG9iamVjdFNrZXdlZCA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICBAT3V0cHV0KCkgb2JqZWN0Um90YXRlZCA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICBAT3V0cHV0KCkgb2JqZWN0UmVtb3ZlZCA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICBAT3V0cHV0KCkgb2JqZWN0TW9kaWZpZWQgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgQE91dHB1dCgpIG9iamVjdFNlbGVjdGVkID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gIEBPdXRwdXQoKSBvYmplY3RNb3ZpbmcgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgQE91dHB1dCgpIG9iamVjdFNjYWxpbmcgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgQE91dHB1dCgpIG9iamVjdFNrZXdpbmcgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgQE91dHB1dCgpIG9iamVjdFJvdGF0aW5nID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG5cbiAgQE91dHB1dCgpIHNlbGVjdGlvbkNsZWFyZWQgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgQE91dHB1dCgpIHNlbGVjdGlvbkNyZWF0ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgQE91dHB1dCgpIHNlbGVjdGlvblVwZGF0ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcblxuICBAT3V0cHV0KCkgYmVmb3JlVHJhbnNmb3JtID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gIEBPdXRwdXQoKSBiZWZvcmVTZWxlY3Rpb25DbGVhcmVkID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG5cbiAgQFZpZXdDaGlsZChGYWJyaWNEaXJlY3RpdmUsIHsgc3RhdGljOiB0cnVlIH0pIGRpcmVjdGl2ZVJlZj86IEZhYnJpY0RpcmVjdGl2ZTtcblxuICBjb25zdHJ1Y3RvcigpIHt9XG5cbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmpzb24gIT0gbnVsbCkge1xuICAgICAgdGhpcy5zZXRKU09OKHRoaXMuanNvbiwgdHJ1ZSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzZXRKU09OKGpzb246IHN0cmluZywgZm9yY2U/OiBib29sZWFuKTogdm9pZCB7XG4gICAgaWYgKGZvcmNlIHx8IGpzb24gIT09IHRoaXMuanNvbikge1xuICAgICAgaWYgKHRoaXMuZGlyZWN0aXZlUmVmKSB7XG4gICAgICAgIHRoaXMuZGlyZWN0aXZlUmVmLmxvYWRGcm9tSlNPTihqc29uLCAoKSA9PiB7XG4gICAgICAgICAgaWYgKHRoaXMuZGlyZWN0aXZlUmVmICYmIHRoaXMuZGlyZWN0aXZlUmVmLmZhYnJpYygpKSB7XG4gICAgICAgICAgICB0aGlzLmRhdGFMb2FkZWQuZW1pdCh0aGlzLmRpcmVjdGl2ZVJlZi5mYWJyaWMoKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5qc29uID0ganNvbjtcbiAgICB9XG4gIH1cbn1cbiIsIjxjYW52YXMgW2ZhYnJpY109XCJjb25maWdcIiBbem9vbV09XCJ6b29tXCIgW3dpZHRoXT1cIndpZHRoXCIgW2hlaWdodF09XCJoZWlnaHRcIiBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIiAoZHJvcCk9XCJkcm9wLmVtaXQoJGV2ZW50KVwiIChkcmFnb3Zlcik9XCJkcmFnb3Zlci5lbWl0KCRldmVudClcIiAoZHJhZ2VudGVyKT1cImRyYWdlbnRlci5lbWl0KCRldmVudClcIiAoZHJhZ2xlYXZlKT1cImRyYWdsZWF2ZS5lbWl0KCRldmVudClcIiAobW91c2V1cCk9XCJtb3VzZXVwLmVtaXQoJGV2ZW50KVwiIChtb3VzZWRvd24pPVwibW91c2Vkb3duLmVtaXQoJGV2ZW50KVwiIChtb3VzZW92ZXIpPVwibW91c2VvdmVyLmVtaXQoJGV2ZW50KVwiIChtb3VzZW91dCk9XCJtb3VzZW91dC5lbWl0KCRldmVudClcIiAobW91c2Vtb3ZlKT1cIm1vdXNlbW92ZS5lbWl0KCRldmVudClcIiAobW91c2V3aGVlbCk9XCJtb3VzZXdoZWVsLmVtaXQoJGV2ZW50KVwiIChtb3VzZWRibGNsaWNrKT1cIm1vdXNlZGJsY2xpY2suZW1pdCgkZXZlbnQpXCIgKG1vdXNldXBCZWZvcmUpPVwibW91c2V1cEJlZm9yZS5lbWl0KCRldmVudClcIiAobW91c2Vkb3duQmVmb3JlKT1cIm1vdXNlZG93bkJlZm9yZS5lbWl0KCRldmVudClcIiAobW91c2Vtb3ZlQmVmb3JlKT1cIm1vdXNlbW92ZUJlZm9yZS5lbWl0KCRldmVudClcIiAobW91c2VVcCk9XCJtb3VzZVVwLmVtaXQoJGV2ZW50KVwiIChtb3VzZURvd24pPVwibW91c2VEb3duLmVtaXQoJGV2ZW50KVwiIChtb3VzZU92ZXIpPVwibW91c2VPdmVyLmVtaXQoJGV2ZW50KVwiIChtb3VzZU91dCk9XCJtb3VzZU91dC5lbWl0KCRldmVudClcIiAobW91c2VNb3ZlKT1cIm1vdXNlTW92ZS5lbWl0KCRldmVudClcIiAobW91c2VXaGVlbCk9XCJtb3VzZVdoZWVsLmVtaXQoJGV2ZW50KVwiIChtb3VzZURibGNsaWNrKT1cIm1vdXNlRGJsY2xpY2suZW1pdCgkZXZlbnQpXCIgKG1vdXNlVXBCZWZvcmUpPVwibW91c2VVcEJlZm9yZS5lbWl0KCRldmVudClcIiAobW91c2VEb3duQmVmb3JlKT1cIm1vdXNlRG93bkJlZm9yZS5lbWl0KCRldmVudClcIiAobW91c2VNb3ZlQmVmb3JlKT1cIm1vdXNlTW92ZUJlZm9yZS5lbWl0KCRldmVudClcIiAocGF0aENyZWF0ZWQpPVwicGF0aENyZWF0ZWQuZW1pdCgkZXZlbnQpXCIgKGFsdGVyUmVuZGVyKT1cImFsdGVyUmVuZGVyLmVtaXQoJGV2ZW50KVwiIChvYmplY3RBZGRlZCk9XCJvYmplY3RBZGRlZC5lbWl0KCRldmVudClcIiAob2JqZWN0TW92ZWQpPVwib2JqZWN0TW92ZWQuZW1pdCgkZXZlbnQpXCIgKG9iamVjdFNjYWxlZCk9XCJvYmplY3RTY2FsZWQuZW1pdCgkZXZlbnQpXCIgKG9iamVjdFNrZXdlZCk9XCJvYmplY3RTa2V3ZWQuZW1pdCgkZXZlbnQpXCIgKG9iamVjdFJvdGF0ZWQpPVwib2JqZWN0Um90YXRlZC5lbWl0KCRldmVudClcIiAob2JqZWN0UmVtb3ZlZCk9XCJvYmplY3RSZW1vdmVkLmVtaXQoJGV2ZW50KVwiIChvYmplY3RNb2RpZmllZCk9XCJvYmplY3RNb2RpZmllZC5lbWl0KCRldmVudClcIiAob2JqZWN0U2VsZWN0ZWQpPVwib2JqZWN0U2VsZWN0ZWQuZW1pdCgkZXZlbnQpXCIgKG9iamVjdE1vdmluZyk9XCJvYmplY3RNb3ZpbmcuZW1pdCgkZXZlbnQpXCIgKG9iamVjdFNjYWxpbmcpPVwib2JqZWN0U2NhbGluZy5lbWl0KCRldmVudClcIiAob2JqZWN0U2tld2luZyk9XCJvYmplY3RTa2V3aW5nLmVtaXQoJGV2ZW50KVwiIChvYmplY3RSb3RhdGluZyk9XCJvYmplY3RSb3RhdGluZy5lbWl0KCRldmVudClcIiAoc2VsZWN0aW9uQ2xlYXJlZCk9XCJzZWxlY3Rpb25DbGVhcmVkLmVtaXQoJGV2ZW50KVwiIChzZWxlY3Rpb25DcmVhdGVkKT1cInNlbGVjdGlvbkNyZWF0ZWQuZW1pdCgkZXZlbnQpXCIgKHNlbGVjdGlvblVwZGF0ZWQpPVwic2VsZWN0aW9uVXBkYXRlZC5lbWl0KCRldmVudClcIiAoYmVmb3JlVHJhbnNmb3JtKT1cImJlZm9yZVRyYW5zZm9ybS5lbWl0KCRldmVudClcIiAoYmVmb3JlU2VsZWN0aW9uQ2xlYXJlZCk9XCJiZWZvcmVTZWxlY3Rpb25DbGVhcmVkLmVtaXQoJGV2ZW50KVwiPlxuPC9jYW52YXM+XG4iXX0=
|
|
@@ -0,0 +1,316 @@
|
|
|
1
|
+
import { fabric } from 'fabric';
|
|
2
|
+
import ResizeObserver from 'resize-observer-polyfill';
|
|
3
|
+
import { Directive, Optional, Inject, Input, Output, EventEmitter } from '@angular/core';
|
|
4
|
+
import { FABRIC_CONFIG, FabricConfig, FabricEvents } from './fabric.interfaces';
|
|
5
|
+
import * as i0 from "@angular/core";
|
|
6
|
+
export class FabricDirective {
|
|
7
|
+
zone;
|
|
8
|
+
elementRef;
|
|
9
|
+
differs;
|
|
10
|
+
defaults;
|
|
11
|
+
instance = null;
|
|
12
|
+
ro = null;
|
|
13
|
+
objectsJSON = null;
|
|
14
|
+
initialZoom = null;
|
|
15
|
+
initialWidth = null;
|
|
16
|
+
initialHeight = null;
|
|
17
|
+
configDiff = null;
|
|
18
|
+
set zoom(zoom) {
|
|
19
|
+
this.setZoom(zoom);
|
|
20
|
+
}
|
|
21
|
+
set width(width) {
|
|
22
|
+
this.setWidth(width);
|
|
23
|
+
}
|
|
24
|
+
set height(height) {
|
|
25
|
+
this.setHeight(height);
|
|
26
|
+
}
|
|
27
|
+
disabled = false;
|
|
28
|
+
config;
|
|
29
|
+
drop = new EventEmitter();
|
|
30
|
+
dragover = new EventEmitter();
|
|
31
|
+
dragenter = new EventEmitter();
|
|
32
|
+
dragleave = new EventEmitter();
|
|
33
|
+
mouseup = new EventEmitter();
|
|
34
|
+
mousedown = new EventEmitter();
|
|
35
|
+
mouseover = new EventEmitter();
|
|
36
|
+
mouseout = new EventEmitter();
|
|
37
|
+
mousemove = new EventEmitter();
|
|
38
|
+
mousewheel = new EventEmitter();
|
|
39
|
+
mousedblclick = new EventEmitter();
|
|
40
|
+
mouseupBefore = new EventEmitter();
|
|
41
|
+
mousedownBefore = new EventEmitter();
|
|
42
|
+
mousemoveBefore = new EventEmitter();
|
|
43
|
+
mouseUp = new EventEmitter();
|
|
44
|
+
mouseDown = new EventEmitter();
|
|
45
|
+
mouseOver = new EventEmitter();
|
|
46
|
+
mouseOut = new EventEmitter();
|
|
47
|
+
mouseMove = new EventEmitter();
|
|
48
|
+
mouseWheel = new EventEmitter();
|
|
49
|
+
mouseDblclick = new EventEmitter();
|
|
50
|
+
mouseUpBefore = new EventEmitter();
|
|
51
|
+
mouseDownBefore = new EventEmitter();
|
|
52
|
+
mouseMoveBefore = new EventEmitter();
|
|
53
|
+
pathCreated = new EventEmitter();
|
|
54
|
+
alterRender = new EventEmitter();
|
|
55
|
+
objectAdded = new EventEmitter();
|
|
56
|
+
objectMoved = new EventEmitter();
|
|
57
|
+
objectScaled = new EventEmitter();
|
|
58
|
+
objectSkewed = new EventEmitter();
|
|
59
|
+
objectRotated = new EventEmitter();
|
|
60
|
+
objectRemoved = new EventEmitter();
|
|
61
|
+
objectModified = new EventEmitter();
|
|
62
|
+
objectSelected = new EventEmitter();
|
|
63
|
+
objectMoving = new EventEmitter();
|
|
64
|
+
objectScaling = new EventEmitter();
|
|
65
|
+
objectSkewing = new EventEmitter();
|
|
66
|
+
objectRotating = new EventEmitter();
|
|
67
|
+
selectionCleared = new EventEmitter();
|
|
68
|
+
selectionCreated = new EventEmitter();
|
|
69
|
+
selectionUpdated = new EventEmitter();
|
|
70
|
+
beforeTransform = new EventEmitter();
|
|
71
|
+
beforeSelectionCleared = new EventEmitter();
|
|
72
|
+
constructor(zone, elementRef, differs, defaults) {
|
|
73
|
+
this.zone = zone;
|
|
74
|
+
this.elementRef = elementRef;
|
|
75
|
+
this.differs = differs;
|
|
76
|
+
this.defaults = defaults;
|
|
77
|
+
}
|
|
78
|
+
ngOnInit() {
|
|
79
|
+
const params = new FabricConfig(this.defaults);
|
|
80
|
+
params.assign(this.config); // Custom configuration
|
|
81
|
+
Object.keys(params).forEach(key => params[key] === undefined && delete params[key]);
|
|
82
|
+
this.zone.runOutsideAngular(() => {
|
|
83
|
+
if (!this.disabled) {
|
|
84
|
+
this.instance = new fabric.Canvas(this.elementRef.nativeElement, params);
|
|
85
|
+
}
|
|
86
|
+
else {
|
|
87
|
+
this.instance = new fabric.StaticCanvas(this.elementRef.nativeElement, params);
|
|
88
|
+
}
|
|
89
|
+
if (this.initialZoom) {
|
|
90
|
+
this.setZoom(this.initialZoom);
|
|
91
|
+
}
|
|
92
|
+
if (this.initialWidth) {
|
|
93
|
+
this.setWidth(this.initialWidth);
|
|
94
|
+
}
|
|
95
|
+
if (this.initialHeight) {
|
|
96
|
+
this.setHeight(this.initialHeight);
|
|
97
|
+
}
|
|
98
|
+
if (this.objectsJSON !== null) {
|
|
99
|
+
this.loadFromJSON(this.objectsJSON);
|
|
100
|
+
}
|
|
101
|
+
});
|
|
102
|
+
// Add native Fabric event handling
|
|
103
|
+
FabricEvents.forEach((eventName) => {
|
|
104
|
+
const fabricEvent = eventName.replace(/([A-Z])/g, (c) => `:${c.toLowerCase()}`);
|
|
105
|
+
if (this.instance) {
|
|
106
|
+
this.instance.on(fabricEvent, (event) => {
|
|
107
|
+
this.zone.run(() => {
|
|
108
|
+
if (this[eventName].observers.length) {
|
|
109
|
+
this[eventName].emit(event);
|
|
110
|
+
}
|
|
111
|
+
});
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
});
|
|
115
|
+
if (!this.configDiff) {
|
|
116
|
+
this.configDiff = this.differs.find(this.config || {}).create();
|
|
117
|
+
this.configDiff.diff(this.config || {});
|
|
118
|
+
}
|
|
119
|
+
this.zone.runOutsideAngular(() => {
|
|
120
|
+
this.ro = new ResizeObserver((entries, observer) => {
|
|
121
|
+
const element = this.elementRef.nativeElement.parentElement.parentElement;
|
|
122
|
+
if (!this.initialWidth) {
|
|
123
|
+
this.setWidth(element.offsetWidth);
|
|
124
|
+
}
|
|
125
|
+
if (!this.initialHeight) {
|
|
126
|
+
this.setHeight(element.offsetHeight);
|
|
127
|
+
}
|
|
128
|
+
});
|
|
129
|
+
this.ro.observe(this.elementRef.nativeElement.parentElement.parentElement);
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
ngOnDestroy() {
|
|
133
|
+
if (this.ro) {
|
|
134
|
+
this.ro.disconnect();
|
|
135
|
+
}
|
|
136
|
+
if (this.instance) {
|
|
137
|
+
this.objectsJSON = this.instance.toObject();
|
|
138
|
+
this.instance.dispose();
|
|
139
|
+
delete this.instance;
|
|
140
|
+
this.instance = null;
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
ngDoCheck() {
|
|
144
|
+
if (this.configDiff) {
|
|
145
|
+
const changes = this.configDiff.diff(this.config || {});
|
|
146
|
+
if (changes) {
|
|
147
|
+
this.ngOnDestroy();
|
|
148
|
+
this.ngOnInit();
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
ngOnChanges(changes) {
|
|
153
|
+
if (this.instance && changes['disabled']) {
|
|
154
|
+
if (changes['disabled'].currentValue !== changes['disabled'].previousValue) {
|
|
155
|
+
this.ngOnDestroy();
|
|
156
|
+
this.ngOnInit();
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
fabric() {
|
|
161
|
+
return this.instance;
|
|
162
|
+
}
|
|
163
|
+
clear() {
|
|
164
|
+
if (this.instance) {
|
|
165
|
+
this.instance.clear();
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
render() {
|
|
169
|
+
if (this.instance) {
|
|
170
|
+
this.instance.renderAll();
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
setZoom(zoom) {
|
|
174
|
+
this.initialZoom = zoom;
|
|
175
|
+
if (this.instance) {
|
|
176
|
+
this.instance.setZoom(zoom);
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
setWidth(width) {
|
|
180
|
+
this.initialWidth = width;
|
|
181
|
+
if (this.instance) {
|
|
182
|
+
this.instance.setWidth(width);
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
setHeight(height) {
|
|
186
|
+
this.initialHeight = height;
|
|
187
|
+
if (this.instance) {
|
|
188
|
+
this.instance.setHeight(height);
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
loadFromJSON(json, callback, reviverOpt) {
|
|
192
|
+
if (this.instance) {
|
|
193
|
+
this.instance.loadFromJSON(json, () => {
|
|
194
|
+
let renderAll = true;
|
|
195
|
+
if (callback) {
|
|
196
|
+
renderAll = callback();
|
|
197
|
+
}
|
|
198
|
+
if (renderAll && this.instance) {
|
|
199
|
+
this.instance.renderAll();
|
|
200
|
+
}
|
|
201
|
+
}, reviverOpt);
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.4", ngImport: i0, type: FabricDirective, deps: [{ token: i0.NgZone }, { token: i0.ElementRef }, { token: i0.KeyValueDiffers }, { token: FABRIC_CONFIG, optional: true }], target: i0.ɵɵFactoryTarget.Directive });
|
|
205
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "17.0.4", type: FabricDirective, selector: "[fabric]", inputs: { zoom: "zoom", width: "width", height: "height", disabled: "disabled", config: ["fabric", "config"] }, outputs: { drop: "drop", dragover: "dragover", dragenter: "dragenter", dragleave: "dragleave", mouseup: "mouseup", mousedown: "mousedown", mouseover: "mouseover", mouseout: "mouseout", mousemove: "mousemove", mousewheel: "mousewheel", mousedblclick: "mousedblclick", mouseupBefore: "mouseupBefore", mousedownBefore: "mousedownBefore", mousemoveBefore: "mousemoveBefore", mouseUp: "mouseUp", mouseDown: "mouseDown", mouseOver: "mouseOver", mouseOut: "mouseOut", mouseMove: "mouseMove", mouseWheel: "mouseWheel", mouseDblclick: "mouseDblclick", mouseUpBefore: "mouseUpBefore", mouseDownBefore: "mouseDownBefore", mouseMoveBefore: "mouseMoveBefore", pathCreated: "pathCreated", alterRender: "alterRender", objectAdded: "objectAdded", objectMoved: "objectMoved", objectScaled: "objectScaled", objectSkewed: "objectSkewed", objectRotated: "objectRotated", objectRemoved: "objectRemoved", objectModified: "objectModified", objectSelected: "objectSelected", objectMoving: "objectMoving", objectScaling: "objectScaling", objectSkewing: "objectSkewing", objectRotating: "objectRotating", selectionCleared: "selectionCleared", selectionCreated: "selectionCreated", selectionUpdated: "selectionUpdated", beforeTransform: "beforeTransform", beforeSelectionCleared: "beforeSelectionCleared" }, exportAs: ["ngxFabric"], usesOnChanges: true, ngImport: i0 });
|
|
206
|
+
}
|
|
207
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.4", ngImport: i0, type: FabricDirective, decorators: [{
|
|
208
|
+
type: Directive,
|
|
209
|
+
args: [{
|
|
210
|
+
selector: '[fabric]',
|
|
211
|
+
exportAs: 'ngxFabric'
|
|
212
|
+
}]
|
|
213
|
+
}], ctorParameters: () => [{ type: i0.NgZone }, { type: i0.ElementRef }, { type: i0.KeyValueDiffers }, { type: undefined, decorators: [{
|
|
214
|
+
type: Optional
|
|
215
|
+
}, {
|
|
216
|
+
type: Inject,
|
|
217
|
+
args: [FABRIC_CONFIG]
|
|
218
|
+
}] }], propDecorators: { zoom: [{
|
|
219
|
+
type: Input
|
|
220
|
+
}], width: [{
|
|
221
|
+
type: Input
|
|
222
|
+
}], height: [{
|
|
223
|
+
type: Input
|
|
224
|
+
}], disabled: [{
|
|
225
|
+
type: Input
|
|
226
|
+
}], config: [{
|
|
227
|
+
type: Input,
|
|
228
|
+
args: ['fabric']
|
|
229
|
+
}], drop: [{
|
|
230
|
+
type: Output
|
|
231
|
+
}], dragover: [{
|
|
232
|
+
type: Output
|
|
233
|
+
}], dragenter: [{
|
|
234
|
+
type: Output
|
|
235
|
+
}], dragleave: [{
|
|
236
|
+
type: Output
|
|
237
|
+
}], mouseup: [{
|
|
238
|
+
type: Output
|
|
239
|
+
}], mousedown: [{
|
|
240
|
+
type: Output
|
|
241
|
+
}], mouseover: [{
|
|
242
|
+
type: Output
|
|
243
|
+
}], mouseout: [{
|
|
244
|
+
type: Output
|
|
245
|
+
}], mousemove: [{
|
|
246
|
+
type: Output
|
|
247
|
+
}], mousewheel: [{
|
|
248
|
+
type: Output
|
|
249
|
+
}], mousedblclick: [{
|
|
250
|
+
type: Output
|
|
251
|
+
}], mouseupBefore: [{
|
|
252
|
+
type: Output
|
|
253
|
+
}], mousedownBefore: [{
|
|
254
|
+
type: Output
|
|
255
|
+
}], mousemoveBefore: [{
|
|
256
|
+
type: Output
|
|
257
|
+
}], mouseUp: [{
|
|
258
|
+
type: Output
|
|
259
|
+
}], mouseDown: [{
|
|
260
|
+
type: Output
|
|
261
|
+
}], mouseOver: [{
|
|
262
|
+
type: Output
|
|
263
|
+
}], mouseOut: [{
|
|
264
|
+
type: Output
|
|
265
|
+
}], mouseMove: [{
|
|
266
|
+
type: Output
|
|
267
|
+
}], mouseWheel: [{
|
|
268
|
+
type: Output
|
|
269
|
+
}], mouseDblclick: [{
|
|
270
|
+
type: Output
|
|
271
|
+
}], mouseUpBefore: [{
|
|
272
|
+
type: Output
|
|
273
|
+
}], mouseDownBefore: [{
|
|
274
|
+
type: Output
|
|
275
|
+
}], mouseMoveBefore: [{
|
|
276
|
+
type: Output
|
|
277
|
+
}], pathCreated: [{
|
|
278
|
+
type: Output
|
|
279
|
+
}], alterRender: [{
|
|
280
|
+
type: Output
|
|
281
|
+
}], objectAdded: [{
|
|
282
|
+
type: Output
|
|
283
|
+
}], objectMoved: [{
|
|
284
|
+
type: Output
|
|
285
|
+
}], objectScaled: [{
|
|
286
|
+
type: Output
|
|
287
|
+
}], objectSkewed: [{
|
|
288
|
+
type: Output
|
|
289
|
+
}], objectRotated: [{
|
|
290
|
+
type: Output
|
|
291
|
+
}], objectRemoved: [{
|
|
292
|
+
type: Output
|
|
293
|
+
}], objectModified: [{
|
|
294
|
+
type: Output
|
|
295
|
+
}], objectSelected: [{
|
|
296
|
+
type: Output
|
|
297
|
+
}], objectMoving: [{
|
|
298
|
+
type: Output
|
|
299
|
+
}], objectScaling: [{
|
|
300
|
+
type: Output
|
|
301
|
+
}], objectSkewing: [{
|
|
302
|
+
type: Output
|
|
303
|
+
}], objectRotating: [{
|
|
304
|
+
type: Output
|
|
305
|
+
}], selectionCleared: [{
|
|
306
|
+
type: Output
|
|
307
|
+
}], selectionCreated: [{
|
|
308
|
+
type: Output
|
|
309
|
+
}], selectionUpdated: [{
|
|
310
|
+
type: Output
|
|
311
|
+
}], beforeTransform: [{
|
|
312
|
+
type: Output
|
|
313
|
+
}], beforeSelectionCleared: [{
|
|
314
|
+
type: Output
|
|
315
|
+
}] } });
|
|
316
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmFicmljLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2xpYi9zcmMvbGliL2ZhYnJpYy5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLFFBQVEsQ0FBQztBQUVoQyxPQUFPLGNBQWMsTUFBTSwwQkFBMEIsQ0FBQztBQUV0RCxPQUFPLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBRWxDLEtBQUssRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUNxQixNQUFNLGVBQWUsQ0FBQztBQUV4RSxPQUFPLEVBQUUsYUFBYSxFQUFFLFlBQVksRUFDckIsWUFBWSxFQUFFLE1BQU0scUJBQXFCLENBQUM7O0FBTXpELE1BQU0sT0FBTyxlQUFlO0lBaUZOO0lBQ1Y7SUFBZ0M7SUFDRztJQWxGckMsUUFBUSxHQUErQyxJQUFJLENBQUM7SUFFNUQsRUFBRSxHQUEwQixJQUFJLENBQUM7SUFFakMsV0FBVyxHQUFrQixJQUFJLENBQUM7SUFFbEMsV0FBVyxHQUFrQixJQUFJLENBQUM7SUFDbEMsWUFBWSxHQUFrQixJQUFJLENBQUM7SUFDbkMsYUFBYSxHQUFrQixJQUFJLENBQUM7SUFFcEMsVUFBVSxHQUF1QyxJQUFJLENBQUM7SUFFOUQsSUFDSSxJQUFJLENBQUMsSUFBWTtRQUNuQixJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3JCLENBQUM7SUFFRCxJQUNJLEtBQUssQ0FBQyxLQUFhO1FBQ3JCLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDdkIsQ0FBQztJQUNELElBQ0ksTUFBTSxDQUFDLE1BQWM7UUFDdkIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUN6QixDQUFDO0lBRVEsUUFBUSxHQUFZLEtBQUssQ0FBQztJQUVsQixNQUFNLENBQXlCO0lBRXRDLElBQUksR0FBRyxJQUFJLFlBQVksRUFBTyxDQUFDO0lBQy9CLFFBQVEsR0FBRyxJQUFJLFlBQVksRUFBTyxDQUFDO0lBQ25DLFNBQVMsR0FBRyxJQUFJLFlBQVksRUFBTyxDQUFDO0lBQ3BDLFNBQVMsR0FBRyxJQUFJLFlBQVksRUFBTyxDQUFDO0lBRXBDLE9BQU8sR0FBRyxJQUFJLFlBQVksRUFBTyxDQUFDO0lBQ2xDLFNBQVMsR0FBRyxJQUFJLFlBQVksRUFBTyxDQUFDO0lBQ3BDLFNBQVMsR0FBRyxJQUFJLFlBQVksRUFBTyxDQUFDO0lBQ3BDLFFBQVEsR0FBRyxJQUFJLFlBQVksRUFBTyxDQUFDO0lBQ25DLFNBQVMsR0FBRyxJQUFJLFlBQVksRUFBTyxDQUFDO0lBQ3BDLFVBQVUsR0FBRyxJQUFJLFlBQVksRUFBTyxDQUFDO0lBQ3JDLGFBQWEsR0FBRyxJQUFJLFlBQVksRUFBTyxDQUFDO0lBQ3hDLGFBQWEsR0FBRyxJQUFJLFlBQVksRUFBTyxDQUFDO0lBQ3hDLGVBQWUsR0FBRyxJQUFJLFlBQVksRUFBTyxDQUFDO0lBQzFDLGVBQWUsR0FBRyxJQUFJLFlBQVksRUFBTyxDQUFDO0lBRTFDLE9BQU8sR0FBRyxJQUFJLFlBQVksRUFBTyxDQUFDO0lBQ2xDLFNBQVMsR0FBRyxJQUFJLFlBQVksRUFBTyxDQUFDO0lBQ3BDLFNBQVMsR0FBRyxJQUFJLFlBQVksRUFBTyxDQUFDO0lBQ3BDLFFBQVEsR0FBRyxJQUFJLFlBQVksRUFBTyxDQUFDO0lBQ25DLFNBQVMsR0FBRyxJQUFJLFlBQVksRUFBTyxDQUFDO0lBQ3BDLFVBQVUsR0FBRyxJQUFJLFlBQVksRUFBTyxDQUFDO0lBQ3JDLGFBQWEsR0FBRyxJQUFJLFlBQVksRUFBTyxDQUFDO0lBQ3hDLGFBQWEsR0FBRyxJQUFJLFlBQVksRUFBTyxDQUFDO0lBQ3hDLGVBQWUsR0FBRyxJQUFJLFlBQVksRUFBTyxDQUFDO0lBQzFDLGVBQWUsR0FBRyxJQUFJLFlBQVksRUFBTyxDQUFDO0lBRTFDLFdBQVcsR0FBRyxJQUFJLFlBQVksRUFBTyxDQUFDO0lBQ3RDLFdBQVcsR0FB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O2dCQUNHLGVBQWU7c0JBQXhCLE1BQU07Z0JBQ0csZUFBZTtzQkFBeEIsTUFBTTtnQkFFRyxPQUFPO3NCQUFoQixNQUFNO2dCQUNHLFNBQVM7c0JBQWxCLE1BQU07Z0JBQ0csU0FBUztzQkFBbEIsTUFBTTtnQkFDRyxRQUFRO3NCQUFqQixNQUFNO2dCQUNHLFNBQVM7c0JBQWxCLE1BQU07Z0JBQ0csVUFBVTtzQkFBbkIsTUFBTTtnQkFDRyxhQUFhO3NCQUF0QixNQUFNO2dCQUNHLGFBQWE7c0JBQXRCLE1BQU07Z0JBQ0csZUFBZTtzQkFBeEIsTUFBTTtnQkFDRyxlQUFlO3NCQUF4QixNQUFNO2dCQUVHLFdBQVc7c0JBQXBCLE1BQU07Z0JBQ0csV0FBVztzQkFBcEIsTUFBTTtnQkFFRyxXQUFXO3NCQUFwQixNQUFNO2dCQUNHLFdBQVc7c0JBQXBCLE1BQU07Z0JBQ0csWUFBWTtzQkFBckIsTUFBTTtnQkFDRyxZQUFZO3NCQUFyQixNQUFNO2dCQUNHLGFBQWE7c0JBQXRCLE1BQU07Z0JBQ0csYUFBYTtzQkFBdEIsTUFBTTtnQkFDRyxjQUFjO3NCQUF2QixNQUFNO2dCQUNHLGNBQWM7c0JBQXZCLE1BQU07Z0JBQ0csWUFBWTtzQkFBckIsTUFBTTtnQkFDRyxhQUFhO3NCQUF0QixNQUFNO2dCQUNHLGFBQWE7c0JBQXRCLE1BQU07Z0JBQ0csY0FBYztzQkFBdkIsTUFBTTtnQkFFRyxnQkFBZ0I7c0JBQXpCLE1BQU07Z0JBQ0csZ0JBQWdCO3NCQUF6QixNQUFNO2dCQUNHLGdCQUFnQjtzQkFBekIsTUFBTTtnQkFFRyxlQUFlO3NCQUF4QixNQUFNO2dCQUNHLHNCQUFzQjtzQkFBL0IsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGZhYnJpYyB9IGZyb20gJ2ZhYnJpYyc7XG5cbmltcG9ydCBSZXNpemVPYnNlcnZlciBmcm9tICdyZXNpemUtb2JzZXJ2ZXItcG9seWZpbGwnO1xuXG5pbXBvcnQgeyBEaXJlY3RpdmUsIE9wdGlvbmFsLCBJbmplY3QsXG4gIE9uSW5pdCwgT25EZXN0cm95LCBEb0NoZWNrLCBPbkNoYW5nZXMsXG4gIElucHV0LCBPdXRwdXQsIEV2ZW50RW1pdHRlciwgTmdab25lLCBFbGVtZW50UmVmLFxuICBLZXlWYWx1ZURpZmZlciwgS2V5VmFsdWVEaWZmZXJzLCBTaW1wbGVDaGFuZ2VzIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IEZBQlJJQ19DT05GSUcsIEZhYnJpY0NvbmZpZywgRmFicmljQ29uZmlnSW50ZXJmYWNlLFxuICBGYWJyaWNFdmVudCwgRmFicmljRXZlbnRzIH0gZnJvbSAnLi9mYWJyaWMuaW50ZXJmYWNlcyc7XG5cbkBEaXJlY3RpdmUoe1xuICBzZWxlY3RvcjogJ1tmYWJyaWNdJyxcbiAgZXhwb3J0QXM6ICduZ3hGYWJyaWMnXG59KVxuZXhwb3J0IGNsYXNzIEZhYnJpY0RpcmVjdGl2ZSBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95LCBEb0NoZWNrLCBPbkNoYW5nZXMge1xuICBwcml2YXRlIGluc3RhbmNlOiBmYWJyaWMuQ2FudmFzIHwgZmFicmljLlN0YXRpY0NhbnZhcyB8IG51bGwgPSBudWxsO1xuXG4gIHByaXZhdGUgcm86IFJlc2l6ZU9ic2VydmVyIHwgbnVsbCA9IG51bGw7XG5cbiAgcHJpdmF0ZSBvYmplY3RzSlNPTjogb2JqZWN0IHwgbnVsbCA9IG51bGw7XG5cbiAgcHJpdmF0ZSBpbml0aWFsWm9vbTogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgaW5pdGlhbFdpZHRoOiBudW1iZXIgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBpbml0aWFsSGVpZ2h0OiBudW1iZXIgfCBudWxsID0gbnVsbDtcblxuICBwcml2YXRlIGNvbmZpZ0RpZmY6IEtleVZhbHVlRGlmZmVyPHN0cmluZywgYW55PiB8IG51bGwgPSBudWxsO1xuXG4gIEBJbnB1dCgpXG4gIHNldCB6b29tKHpvb206IG51bWJlcikge1xuICAgIHRoaXMuc2V0Wm9vbSh6b29tKTtcbiAgfVxuXG4gIEBJbnB1dCgpXG4gIHNldCB3aWR0aCh3aWR0aDogbnVtYmVyKSB7XG4gICAgdGhpcy5zZXRXaWR0aCh3aWR0aCk7XG4gIH1cbiAgQElucHV0KClcbiAgc2V0IGhlaWdodChoZWlnaHQ6IG51bWJlcikge1xuICAgIHRoaXMuc2V0SGVpZ2h0KGhlaWdodCk7XG4gIH1cblxuICBASW5wdXQoKSBkaXNhYmxlZDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIEBJbnB1dCgnZmFicmljJykgY29uZmlnPzogRmFicmljQ29uZmlnSW50ZXJmYWNlO1xuXG4gIEBPdXRwdXQoKSBkcm9wID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gIEBPdXRwdXQoKSBkcmFnb3ZlciA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICBAT3V0cHV0KCkgZHJhZ2VudGVyID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gIEBPdXRwdXQoKSBkcmFnbGVhdmUgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcblxuICBAT3V0cHV0KCkgbW91c2V1cCA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICBAT3V0cHV0KCkgbW91c2Vkb3duID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gIEBPdXRwdXQoKSBtb3VzZW92ZXIgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgQE91dHB1dCgpIG1vdXNlb3V0ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gIEBPdXRwdXQoKSBtb3VzZW1vdmUgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgQE91dHB1dCgpIG1vdXNld2hlZWwgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgQE91dHB1dCgpIG1vdXNlZGJsY2xpY2sgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgQE91dHB1dCgpIG1vdXNldXBCZWZvcmUgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgQE91dHB1dCgpIG1vdXNlZG93bkJlZm9yZSA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICBAT3V0cHV0KCkgbW91c2Vtb3ZlQmVmb3JlID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG5cbiAgQE91dHB1dCgpIG1vdXNlVXAgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgQE91dHB1dCgpIG1vdXNlRG93biA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICBAT3V0cHV0KCkgbW91c2VPdmVyID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gIEBPdXRwdXQoKSBtb3VzZU91dCA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICBAT3V0cHV0KCkgbW91c2VNb3ZlID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gIEBPdXRwdXQoKSBtb3VzZVdoZWVsID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gIEBPdXRwdXQoKSBtb3VzZURibGNsaWNrID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gIEBPdXRwdXQoKSBtb3VzZVVwQmVmb3JlID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gIEBPdXRwdXQoKSBtb3VzZURvd25CZWZvcmUgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgQE91dHB1dCgpIG1vdXNlTW92ZUJlZm9yZSA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuXG4gIEBPdXRwdXQoKSBwYXRoQ3JlYXRlZCA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICBAT3V0cHV0KCkgYWx0ZXJSZW5kZXIgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcblxuICBAT3V0cHV0KCkgb2JqZWN0QWRkZWQgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgQE91dHB1dCgpIG9iamVjdE1vdmVkID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gIEBPdXRwdXQoKSBvYmplY3RTY2FsZWQgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgQE91dHB1dCgpIG9iamVjdFNrZXdlZCA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICBAT3V0cHV0KCkgb2JqZWN0Um90YXRlZCA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICBAT3V0cHV0KCkgb2JqZWN0UmVtb3ZlZCA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICBAT3V0cHV0KCkgb2JqZWN0TW9kaWZpZWQgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgQE91dHB1dCgpIG9iamVjdFNlbGVjdGVkID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gIEBPdXRwdXQoKSBvYmplY3RNb3ZpbmcgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgQE91dHB1dCgpIG9iamVjdFNjYWxpbmcgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgQE91dHB1dCgpIG9iamVjdFNrZXdpbmcgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgQE91dHB1dCgpIG9iamVjdFJvdGF0aW5nID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG5cbiAgQE91dHB1dCgpIHNlbGVjdGlvbkNsZWFyZWQgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgQE91dHB1dCgpIHNlbGVjdGlvbkNyZWF0ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgQE91dHB1dCgpIHNlbGVjdGlvblVwZGF0ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcblxuICBAT3V0cHV0KCkgYmVmb3JlVHJhbnNmb3JtID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gIEBPdXRwdXQoKSBiZWZvcmVTZWxlY3Rpb25DbGVhcmVkID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSB6b25lOiBOZ1pvbmUsXG4gICAgcHJpdmF0ZSBlbGVtZW50UmVmOiBFbGVtZW50UmVmLCBwcml2YXRlIGRpZmZlcnM6IEtleVZhbHVlRGlmZmVycyxcbiAgICBAT3B0aW9uYWwoKSBASW5qZWN0KEZBQlJJQ19DT05GSUcpIHByaXZhdGUgZGVmYXVsdHM6IEZhYnJpY0NvbmZpZ0ludGVyZmFjZSkge31cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICBjb25zdCBwYXJhbXMgPSBuZXcgRmFicmljQ29uZmlnKHRoaXMuZGVmYXVsdHMpO1xuXG4gICAgcGFyYW1zLmFzc2lnbih0aGlzLmNvbmZpZyk7IC8vIEN1c3RvbSBjb25maWd1cmF0aW9uXG5cbiAgICBPYmplY3Qua2V5cyhwYXJhbXMpLmZvckVhY2goa2V5ID0+IHBhcmFtc1trZXldID09PSB1bmRlZmluZWQgJiYgZGVsZXRlIHBhcmFtc1trZXldKVxuXG4gICAgdGhpcy56b25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgIGlmICghdGhpcy5kaXNhYmxlZCkge1xuICAgICAgICB0aGlzLmluc3RhbmNlID0gbmV3IGZhYnJpYy5DYW52YXModGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsIHBhcmFtcyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmluc3RhbmNlID0gbmV3IGZhYnJpYy5TdGF0aWNDYW52YXModGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsIHBhcmFtcyk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLmluaXRpYWxab29tKSB7XG4gICAgICAgIHRoaXMuc2V0Wm9vbSh0aGlzLmluaXRpYWxab29tKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuaW5pdGlhbFdpZHRoKSB7XG4gICAgICAgIHRoaXMuc2V0V2lkdGgodGhpcy5pbml0aWFsV2lkdGgpO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5pbml0aWFsSGVpZ2h0KSB7XG4gICAgICAgIHRoaXMuc2V0SGVpZ2h0KHRoaXMuaW5pdGlhbEhlaWdodCk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLm9iamVjdHNKU09OICE9PSBudWxsKSB7XG4gICAgICAgIHRoaXMubG9hZEZyb21KU09OKHRoaXMub2JqZWN0c0pTT04pO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gQWRkIG5hdGl2ZSBGYWJyaWMgZXZlbnQgaGFuZGxpbmdcbiAgICBGYWJyaWNFdmVudHMuZm9yRWFjaCgoZXZlbnROYW1lOiBGYWJyaWNFdmVudCkgPT4ge1xuICAgICAgY29uc3QgZmFicmljRXZlbnQgPSBldmVudE5hbWUucmVwbGFjZSgvKFtBLVpdKS9nLCAoYykgPT4gYDoke2MudG9Mb3dlckNhc2UoKX1gKTtcblxuICAgICAgaWYgKHRoaXMuaW5zdGFuY2UpIHtcbiAgICAgICAgdGhpcy5pbnN0YW5jZS5vbihmYWJyaWNFdmVudCwgKGV2ZW50OiBhbnkpID0+IHtcbiAgICAgICAgICB0aGlzLnpvbmUucnVuKCgpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzW2V2ZW50TmFtZV0ub2JzZXJ2ZXJzLmxlbmd0aCkge1xuICAgICAgICAgICAgICB0aGlzW2V2ZW50TmFtZV0uZW1pdChldmVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgaWYgKCF0aGlzLmNvbmZpZ0RpZmYpIHtcbiAgICAgIHRoaXMuY29uZmlnRGlmZiA9IHRoaXMuZGlmZmVycy5maW5kKHRoaXMuY29uZmlnIHx8IHt9KS5jcmVhdGUoKTtcblxuICAgICAgdGhpcy5jb25maWdEaWZmLmRpZmYodGhpcy5jb25maWcgfHwge30pO1xuICAgIH1cblxuICAgIHRoaXMuem9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICB0aGlzLnJvID0gbmV3IFJlc2l6ZU9ic2VydmVyKChlbnRyaWVzLCBvYnNlcnZlcikgPT4ge1xuICAgICAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50O1xuXG4gICAgICAgIGlmICghdGhpcy5pbml0aWFsV2lkdGgpIHtcbiAgICAgICAgICB0aGlzLnNldFdpZHRoKGVsZW1lbnQub2Zmc2V0V2lkdGgpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0aGlzLmluaXRpYWxIZWlnaHQpIHtcbiAgICAgICAgICB0aGlzLnNldEhlaWdodChlbGVtZW50Lm9mZnNldEhlaWdodCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLnJvLm9ic2VydmUodGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50KTtcbiAgICB9KTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnJvKSB7XG4gICAgICB0aGlzLnJvLmRpc2Nvbm5lY3QoKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5pbnN0YW5jZSkge1xuICAgICAgdGhpcy5vYmplY3RzSlNPTiA9IHRoaXMuaW5zdGFuY2UudG9PYmplY3QoKTtcblxuICAgICAgdGhpcy5pbnN0YW5jZS5kaXNwb3NlKCk7XG5cbiAgICAgIGRlbGV0ZSB0aGlzLmluc3RhbmNlO1xuXG4gICAgICB0aGlzLmluc3RhbmNlID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICBuZ0RvQ2hlY2soKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuY29uZmlnRGlmZikge1xuICAgICAgY29uc3QgY2hhbmdlcyA9IHRoaXMuY29uZmlnRGlmZi5kaWZmKHRoaXMuY29uZmlnIHx8IHt9KTtcblxuICAgICAgaWYgKGNoYW5nZXMpIHtcbiAgICAgICAgdGhpcy5uZ09uRGVzdHJveSgpO1xuXG4gICAgICAgIHRoaXMubmdPbkluaXQoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaW5zdGFuY2UgJiYgY2hhbmdlc1snZGlzYWJsZWQnXSkge1xuICAgICAgaWYgKGNoYW5nZXNbJ2Rpc2FibGVkJ10uY3VycmVudFZhbHVlICE9PSBjaGFuZ2VzWydkaXNhYmxlZCddLnByZXZpb3VzVmFsdWUpIHtcbiAgICAgICAgdGhpcy5uZ09uRGVzdHJveSgpO1xuXG4gICAgICAgIHRoaXMubmdPbkluaXQoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZmFicmljKCk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMuaW5zdGFuY2U7XG4gIH1cblxuICBwdWJsaWMgY2xlYXIoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaW5zdGFuY2UpIHtcbiAgICAgIHRoaXMuaW5zdGFuY2UuY2xlYXIoKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgcmVuZGVyKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmluc3RhbmNlKSB7XG4gICAgICB0aGlzLmluc3RhbmNlLnJlbmRlckFsbCgpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBzZXRab29tKHpvb206IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuaW5pdGlhbFpvb20gPSB6b29tO1xuXG4gICAgaWYgKHRoaXMuaW5zdGFuY2UpIHtcbiAgICAgIHRoaXMuaW5zdGFuY2Uuc2V0Wm9vbSh6b29tKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgc2V0V2lkdGgod2lkdGg6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuaW5pdGlhbFdpZHRoID0gd2lkdGg7XG5cbiAgICBpZiAodGhpcy5pbnN0YW5jZSkge1xuICAgICAgdGhpcy5pbnN0YW5jZS5zZXRXaWR0aCh3aWR0aCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHNldEhlaWdodChoZWlnaHQ6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuaW5pdGlhbEhlaWdodCA9IGhlaWdodDtcblxuICAgIGlmICh0aGlzLmluc3RhbmNlKSB7XG4gICAgICB0aGlzLmluc3RhbmNlLnNldEhlaWdodChoZWlnaHQpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBsb2FkRnJvbUpTT04oanNvbjogYW55LCBjYWxsYmFjaz86IEZ1bmN0aW9uLCByZXZpdmVyT3B0PzogYW55KTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaW5zdGFuY2UpIHtcbiAgICAgIHRoaXMuaW5zdGFuY2UubG9hZEZyb21KU09OKGpzb24sICgpID0+IHtcbiAgICAgICAgbGV0IHJlbmRlckFsbCA9IHRydWU7XG5cbiAgICAgICAgaWYgKGNhbGxiYWNrKSB7XG4gICAgICAgICAgcmVuZGVyQWxsID0gY2FsbGJhY2soKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChyZW5kZXJBbGwgJiYgdGhpcy5pbnN0YW5jZSkge1xuICAgICAgICAgIHRoaXMuaW5zdGFuY2UucmVuZGVyQWxsKCk7XG4gICAgICAgIH1cbiAgICAgIH0sIHJldml2ZXJPcHQpO1xuICAgIH1cbiAgfVxufVxuIl19
|