@theseam/ui-common 0.3.1 → 0.3.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/breadcrumbs/_breadcrumbs-theme.scss +3 -3
- package/breadcrumbs/breadcrumbs/breadcrumbs.component.scss +10 -10
- package/bundles/theseam-ui-common-form-field.umd.js +1 -1
- package/bundles/theseam-ui-common-form-field.umd.js.map +1 -1
- package/bundles/theseam-ui-common-google-maps.umd.js +2202 -0
- package/bundles/theseam-ui-common-google-maps.umd.js.map +1 -0
- package/bundles/theseam-ui-common-menu.umd.js +1 -0
- package/bundles/theseam-ui-common-menu.umd.js.map +1 -1
- package/bundles/theseam-ui-common-utils.umd.js +610 -136
- package/bundles/theseam-ui-common-utils.umd.js.map +1 -1
- package/esm2015/form-field/input.directive.js +2 -2
- package/esm2015/google-maps/google-maps/google-maps.component.js +261 -0
- package/esm2015/google-maps/google-maps-contextmenu.js +113 -0
- package/esm2015/google-maps/google-maps-controls.service.js +70 -0
- package/esm2015/google-maps/google-maps-feature-helpers.js +177 -0
- package/esm2015/google-maps/google-maps-places-autocomplete/google-maps-places-autocomplete.component.js +195 -0
- package/esm2015/google-maps/google-maps-places-autocomplete/google-maps-places-autocomplete.directive.js +163 -0
- package/esm2015/google-maps/google-maps-recenter-button-control/google-maps-recenter-button-control.component.js +57 -0
- package/esm2015/google-maps/google-maps-upload-button-control/google-maps-upload-button-control.component.js +119 -0
- package/esm2015/google-maps/google-maps.module.js +45 -0
- package/esm2015/google-maps/google-maps.service.js +344 -0
- package/esm2015/google-maps/map-control.component.js +65 -0
- package/esm2015/google-maps/map-controls-service.js +4 -0
- package/esm2015/google-maps/map-file-drop/map-file-drop.component.js +135 -0
- package/esm2015/google-maps/map-value-manager.service.js +46 -0
- package/esm2015/google-maps/public-api.js +14 -0
- package/esm2015/google-maps/theseam-ui-common-google-maps.js +6 -0
- package/esm2015/menu/menu-toggle.directive.js +2 -1
- package/esm2015/utils/geo-json/coerce-feature-collection.js +44 -0
- package/esm2015/utils/geo-json/geo-json-to-area.js +11 -0
- package/esm2015/utils/geo-json/is-feature-collection.validator.js +21 -0
- package/esm2015/utils/geo-json/is-only-geometry-types.js +23 -0
- package/esm2015/utils/geo-json/is-only-geometry-types.validator.js +32 -0
- package/esm2015/utils/geo-json/merge-polygons.js +35 -0
- package/esm2015/utils/geo-json/no-inner-rings.validator.js +63 -0
- package/esm2015/utils/geo-json/no-kinks.validator.js +39 -0
- package/esm2015/utils/geo-json/read-geo-file.js +99 -0
- package/esm2015/utils/geo-json/split-multi-polygons.js +29 -0
- package/esm2015/utils/is-null-or-undefined.js +1 -1
- package/esm2015/utils/public-api.js +11 -1
- package/fesm2015/theseam-ui-common-form-field.js +1 -1
- package/fesm2015/theseam-ui-common-form-field.js.map +1 -1
- package/fesm2015/theseam-ui-common-google-maps.js +1729 -0
- package/fesm2015/theseam-ui-common-google-maps.js.map +1 -0
- package/fesm2015/theseam-ui-common-menu.js +1 -0
- package/fesm2015/theseam-ui-common-menu.js.map +1 -1
- package/fesm2015/theseam-ui-common-utils.js +477 -94
- package/fesm2015/theseam-ui-common-utils.js.map +1 -1
- package/form-field/theseam-ui-common-form-field.metadata.json +1 -1
- package/framework/top-bar/_top-bar-theme.scss +5 -5
- package/google-maps/google-maps/google-maps.component.d.ts +89 -0
- package/google-maps/google-maps-contextmenu.d.ts +15 -0
- package/google-maps/google-maps-controls.service.d.ts +23 -0
- package/google-maps/google-maps-feature-helpers.d.ts +37 -0
- package/google-maps/google-maps-places-autocomplete/google-maps-places-autocomplete.component.d.ts +104 -0
- package/google-maps/google-maps-places-autocomplete/google-maps-places-autocomplete.directive.d.ts +80 -0
- package/google-maps/google-maps-recenter-button-control/google-maps-recenter-button-control.component.d.ts +21 -0
- package/google-maps/google-maps-upload-button-control/google-maps-upload-button-control.component.d.ts +34 -0
- package/google-maps/google-maps.module.d.ts +2 -0
- package/google-maps/google-maps.service.d.ts +53 -0
- package/google-maps/map-control.component.d.ts +20 -0
- package/google-maps/map-controls-service.d.ts +13 -0
- package/google-maps/map-file-drop/map-file-drop.component.d.ts +34 -0
- package/google-maps/map-value-manager.service.d.ts +18 -0
- package/google-maps/package.json +11 -0
- package/google-maps/public-api.d.ts +13 -0
- package/google-maps/theseam-ui-common-google-maps.d.ts +5 -0
- package/google-maps/theseam-ui-common-google-maps.metadata.json +1 -0
- package/package.json +17 -10
- package/utils/geo-json/coerce-feature-collection.d.ts +2 -0
- package/utils/geo-json/geo-json-to-area.d.ts +6 -0
- package/utils/geo-json/is-feature-collection.validator.d.ts +3 -0
- package/utils/geo-json/is-only-geometry-types.d.ts +5 -0
- package/utils/geo-json/is-only-geometry-types.validator.d.ts +4 -0
- package/utils/geo-json/merge-polygons.d.ts +9 -0
- package/utils/geo-json/no-inner-rings.validator.d.ts +10 -0
- package/utils/geo-json/no-kinks.validator.d.ts +3 -0
- package/utils/geo-json/read-geo-file.d.ts +7 -0
- package/utils/geo-json/split-multi-polygons.d.ts +8 -0
- package/utils/is-null-or-undefined.d.ts +1 -1
- package/utils/public-api.d.ts +10 -0
- package/utils/theseam-ui-common-utils.metadata.json +1 -1
|
@@ -0,0 +1,344 @@
|
|
|
1
|
+
import { __awaiter } from "tslib";
|
|
2
|
+
import { Injectable, NgZone, ViewContainerRef } from '@angular/core';
|
|
3
|
+
import { BehaviorSubject, from, Subject } from 'rxjs';
|
|
4
|
+
import { switchMap, takeUntil, tap } from 'rxjs/operators';
|
|
5
|
+
import { isNullOrUndefined, notNullOrUndefined } from '@theseam/ui-common/utils';
|
|
6
|
+
import { GoogleMapsContextMenu } from './google-maps-contextmenu';
|
|
7
|
+
import { addInnerFeatureCutoutToExteriorFeature, createDataFeatureFromPolygon, createFeatureChangeObservable, getBoundsWithAllFeatures, getFeatureCenter, getFeaturesCount, getPossibleExteriorFeature, isFeatureSelected, removeAllFeatures, setFeatureSelected, stripAppFeaturePropertiesFromJson, } from './google-maps-feature-helpers';
|
|
8
|
+
import { MapValueManagerService, MapValueSource } from './map-value-manager.service';
|
|
9
|
+
const DEFAULT_POLYGON_OPTIONS = {
|
|
10
|
+
clickable: true,
|
|
11
|
+
draggable: true,
|
|
12
|
+
editable: true,
|
|
13
|
+
// fillColor: 'rgba(60,150,60,1)',
|
|
14
|
+
// strokeColor: 'rgba(155,255,0,1)'
|
|
15
|
+
};
|
|
16
|
+
const DEFAULT_DRAWING_MANAGER_OPTIONS = () => ({
|
|
17
|
+
drawingControl: true,
|
|
18
|
+
drawingControlOptions: {
|
|
19
|
+
drawingModes: [
|
|
20
|
+
google.maps.drawing.OverlayType.POLYGON
|
|
21
|
+
]
|
|
22
|
+
},
|
|
23
|
+
polygonOptions: DEFAULT_POLYGON_OPTIONS,
|
|
24
|
+
drawingMode: null
|
|
25
|
+
});
|
|
26
|
+
const ɵ0 = DEFAULT_DRAWING_MANAGER_OPTIONS;
|
|
27
|
+
const FEATURE_STYLE_OPTIONS_DEFAULT = {
|
|
28
|
+
clickable: true,
|
|
29
|
+
visible: true,
|
|
30
|
+
// zIndex?: number;
|
|
31
|
+
// cursor?: string;
|
|
32
|
+
draggable: false,
|
|
33
|
+
editable: false,
|
|
34
|
+
fillColor: 'teal',
|
|
35
|
+
fillOpacity: 0.3,
|
|
36
|
+
strokeColor: 'blue',
|
|
37
|
+
strokeOpacity: 1,
|
|
38
|
+
strokeWeight: 2,
|
|
39
|
+
};
|
|
40
|
+
const FEATURE_STYLE_OPTIONS_SELECTED = Object.assign(Object.assign({}, FEATURE_STYLE_OPTIONS_DEFAULT), { draggable: true, editable: true, fillColor: 'green', fillOpacity: 0.7, strokeColor: 'limegreen', strokeOpacity: 1, strokeWeight: 2 });
|
|
41
|
+
export class GoogleMapsService {
|
|
42
|
+
constructor(_mapValueManager, _ngZone, _vcr) {
|
|
43
|
+
this._mapValueManager = _mapValueManager;
|
|
44
|
+
this._ngZone = _ngZone;
|
|
45
|
+
this._vcr = _vcr;
|
|
46
|
+
this._ngUnsubscribe = new Subject();
|
|
47
|
+
this._mapReadySubject = new BehaviorSubject(false);
|
|
48
|
+
this._featureContextMenu = null;
|
|
49
|
+
this._activeContextMenu = null;
|
|
50
|
+
this._allowDrawingHoleInPolygon = false;
|
|
51
|
+
this.mapReady$ = this._mapReadySubject.asObservable();
|
|
52
|
+
}
|
|
53
|
+
get mapReady() { return this._mapReadySubject.value; }
|
|
54
|
+
ngOnDestroy() {
|
|
55
|
+
this._ngUnsubscribe.next();
|
|
56
|
+
this._ngUnsubscribe.complete();
|
|
57
|
+
}
|
|
58
|
+
setMap(map) {
|
|
59
|
+
this.googleMap = map;
|
|
60
|
+
this._mapReadySubject.next(true);
|
|
61
|
+
this._initDrawingManager();
|
|
62
|
+
this._initFeatureStyling();
|
|
63
|
+
this._initFeatureChangeListeners();
|
|
64
|
+
}
|
|
65
|
+
setBaseLatLng(lat, lng) {
|
|
66
|
+
this._baseLatLng = { lat, lng };
|
|
67
|
+
}
|
|
68
|
+
// TODO: Refactor out of the service meant to just wrap the google maps api.
|
|
69
|
+
setFeatureContextMenu(menu) {
|
|
70
|
+
this._featureContextMenu = menu;
|
|
71
|
+
}
|
|
72
|
+
getDiv() {
|
|
73
|
+
this._assertInitialized();
|
|
74
|
+
return this.googleMap.getDiv();
|
|
75
|
+
}
|
|
76
|
+
fitBounds(bounds, padding) {
|
|
77
|
+
this._assertInitialized();
|
|
78
|
+
this.googleMap.fitBounds(bounds, padding);
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Iterates the map's features and removes any that are selected.
|
|
82
|
+
*/
|
|
83
|
+
deleteSelection() {
|
|
84
|
+
this._assertInitialized();
|
|
85
|
+
const mapData = this.googleMap.data;
|
|
86
|
+
mapData.forEach(f => {
|
|
87
|
+
if (isFeatureSelected(f)) {
|
|
88
|
+
mapData.remove(f);
|
|
89
|
+
}
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Stops the current drawing.
|
|
94
|
+
*/
|
|
95
|
+
stopDrawing() {
|
|
96
|
+
this._ngZone.runOutsideAngular(() => {
|
|
97
|
+
if (isNullOrUndefined(this._drawingManager) || this._drawingManager.getDrawingMode() === null) {
|
|
98
|
+
return;
|
|
99
|
+
}
|
|
100
|
+
// Listening for the completion event of the overlay currently being drawn
|
|
101
|
+
// and removing it. I haven't found a way to cancel the current drawing,
|
|
102
|
+
// without this hack that assumes our listeners will not run into a race
|
|
103
|
+
// condition.
|
|
104
|
+
const listener = google.maps.event.addListener(this._drawingManager, 'overlaycomplete', (event) => {
|
|
105
|
+
event.overlay.setMap(null);
|
|
106
|
+
listener.remove();
|
|
107
|
+
});
|
|
108
|
+
// To fake canceling the current drawing, without disabling the drawing
|
|
109
|
+
// mode, the drawin mode is being unset then immediately set back. When
|
|
110
|
+
// the mode is unset the 'overlaycomplete' event will fire, which will
|
|
111
|
+
// give a reference to the current overlay to remove, then it is set back
|
|
112
|
+
// to the mode the user was using. To the user is should just seem like
|
|
113
|
+
// the current drawing was canceled and they can start drawing again.
|
|
114
|
+
const mode = this._drawingManager.getDrawingMode();
|
|
115
|
+
this._drawingManager.setDrawingMode(null);
|
|
116
|
+
this._drawingManager.setDrawingMode(mode);
|
|
117
|
+
// 'overlaycomplete' should fire immediately, unless an overlay hadn't
|
|
118
|
+
// started drawing. This timeout will make sure the listener gets removed.
|
|
119
|
+
setTimeout(() => {
|
|
120
|
+
listener.remove();
|
|
121
|
+
});
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
_initDrawingManager() {
|
|
125
|
+
if (notNullOrUndefined(this._drawingManager)) {
|
|
126
|
+
throw Error(`DrawingManager is already initialized.`);
|
|
127
|
+
}
|
|
128
|
+
this._assertInitialized();
|
|
129
|
+
const options = DEFAULT_DRAWING_MANAGER_OPTIONS();
|
|
130
|
+
const drawingManager = new google.maps.drawing.DrawingManager(options);
|
|
131
|
+
drawingManager.setMap(this.googleMap);
|
|
132
|
+
this._drawingManager = drawingManager;
|
|
133
|
+
this._drawingManager.addListener('drawingmode_changed', event => {
|
|
134
|
+
var _a;
|
|
135
|
+
if (((_a = this._drawingManager) === null || _a === void 0 ? void 0 : _a.getDrawingMode()) !== null) {
|
|
136
|
+
this._assertInitialized();
|
|
137
|
+
this.googleMap.data.forEach(f => {
|
|
138
|
+
if (isFeatureSelected(f)) {
|
|
139
|
+
setFeatureSelected(f, false);
|
|
140
|
+
}
|
|
141
|
+
});
|
|
142
|
+
}
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
addControl(element, position) {
|
|
146
|
+
this._assertInitialized();
|
|
147
|
+
this.googleMap.controls[position].push(element);
|
|
148
|
+
}
|
|
149
|
+
setData(data) {
|
|
150
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
151
|
+
this._assertInitialized();
|
|
152
|
+
removeAllFeatures(this.googleMap.data);
|
|
153
|
+
this.googleMap.data.addGeoJson(data);
|
|
154
|
+
this.googleMap.fitBounds(getBoundsWithAllFeatures(this.googleMap.data));
|
|
155
|
+
});
|
|
156
|
+
}
|
|
157
|
+
// TODO: Refactor out of the service meant to just wrap the google maps api.
|
|
158
|
+
reCenterOnFeatures() {
|
|
159
|
+
this._assertInitialized();
|
|
160
|
+
if (getFeaturesCount(this.googleMap.data) === 0) {
|
|
161
|
+
if (!this._baseLatLng) {
|
|
162
|
+
return;
|
|
163
|
+
}
|
|
164
|
+
this.googleMap.panTo(this._baseLatLng);
|
|
165
|
+
return;
|
|
166
|
+
}
|
|
167
|
+
this.googleMap.fitBounds(getBoundsWithAllFeatures(this.googleMap.data));
|
|
168
|
+
// TODO: Fix to pan to center. Currently fitBounds results in the expected
|
|
169
|
+
// result, but pantToBounds animates.
|
|
170
|
+
// this.googleMap.panToBounds(getBoundsWithAllFeatures(this.googleMap.data))
|
|
171
|
+
}
|
|
172
|
+
allowDrawingHoleInPolygon(allow) {
|
|
173
|
+
this._allowDrawingHoleInPolygon = allow;
|
|
174
|
+
}
|
|
175
|
+
setFileInputHandler(handler) {
|
|
176
|
+
this._fileInputHandler;
|
|
177
|
+
}
|
|
178
|
+
getFileInputHandler() {
|
|
179
|
+
return this._fileInputHandler;
|
|
180
|
+
}
|
|
181
|
+
_initFeatureStyling() {
|
|
182
|
+
this._assertInitialized();
|
|
183
|
+
// Disable any selection when clicking the map.
|
|
184
|
+
//
|
|
185
|
+
// TODO: There may be a better way to do this that would be more accurate or
|
|
186
|
+
// additional events that should be listened to, such as the disabling
|
|
187
|
+
// selection when the map looses focus.
|
|
188
|
+
this.googleMap.addListener('click', (even) => {
|
|
189
|
+
this._assertInitialized();
|
|
190
|
+
this.googleMap.data.forEach(f => setFeatureSelected(f, false));
|
|
191
|
+
});
|
|
192
|
+
// Determine what the style of the features are.
|
|
193
|
+
this.googleMap.data.setStyle((feature) => {
|
|
194
|
+
if (isFeatureSelected(feature)) {
|
|
195
|
+
return FEATURE_STYLE_OPTIONS_SELECTED;
|
|
196
|
+
}
|
|
197
|
+
return FEATURE_STYLE_OPTIONS_DEFAULT;
|
|
198
|
+
});
|
|
199
|
+
// Select a feature when clicked.
|
|
200
|
+
this.googleMap.data.addListener('click', (event) => {
|
|
201
|
+
this._assertInitialized();
|
|
202
|
+
setFeatureSelected(event.feature, true);
|
|
203
|
+
this.googleMap.data.forEach(f => {
|
|
204
|
+
if (f !== event.feature && isFeatureSelected(f)) {
|
|
205
|
+
setFeatureSelected(f, false);
|
|
206
|
+
}
|
|
207
|
+
});
|
|
208
|
+
});
|
|
209
|
+
// Set a style on hovered features that can be selected.
|
|
210
|
+
this.googleMap.data.addListener('mouseover', (event) => {
|
|
211
|
+
this._assertInitialized();
|
|
212
|
+
this.googleMap.data.revertStyle();
|
|
213
|
+
if (!this.isDrawing() && !isFeatureSelected(event.feature)) {
|
|
214
|
+
this.googleMap.data.overrideStyle(event.feature, { strokeWeight: 4 });
|
|
215
|
+
}
|
|
216
|
+
});
|
|
217
|
+
// Remove any hover styles when mouse moves away.
|
|
218
|
+
this.googleMap.data.addListener('mouseout', (event) => {
|
|
219
|
+
this._assertInitialized();
|
|
220
|
+
this.googleMap.data.revertStyle();
|
|
221
|
+
});
|
|
222
|
+
}
|
|
223
|
+
_initFeatureChangeListeners() {
|
|
224
|
+
this._assertInitialized();
|
|
225
|
+
createFeatureChangeObservable(this.googleMap.data, this._ngZone).pipe(switchMap(() => from(this.getGeoJson()).pipe(tap(geoJson => this._mapValueManager.setValue(geoJson, MapValueSource.FeatureChange)))), takeUntil(this._ngUnsubscribe)).subscribe();
|
|
226
|
+
this.googleMap.data.addListener('contextmenu', (event) => {
|
|
227
|
+
if (!isFeatureSelected(event.feature)) {
|
|
228
|
+
return;
|
|
229
|
+
}
|
|
230
|
+
this._openContextMenuForFeature(event.feature, event.latLng);
|
|
231
|
+
});
|
|
232
|
+
if (notNullOrUndefined(this._drawingManager)) {
|
|
233
|
+
google.maps.event.addListener(this._drawingManager, 'polygoncomplete', (polygon) => {
|
|
234
|
+
var _a;
|
|
235
|
+
// The DrawingManager doesn't seem to have a way to access the overlays,
|
|
236
|
+
// so if the map is not set then it shouldn'y be considered a successful
|
|
237
|
+
// completion. I am canceling the active drawing by disabling drawing
|
|
238
|
+
// mode and setting the map null in the 'overlaycomplete' event, which
|
|
239
|
+
// fires before the 'polygoncomplete' event.
|
|
240
|
+
if (isNullOrUndefined(polygon.getMap())) {
|
|
241
|
+
return;
|
|
242
|
+
}
|
|
243
|
+
this._assertInitialized();
|
|
244
|
+
// Create a map feature of the drawn polygon.
|
|
245
|
+
const feature = createDataFeatureFromPolygon(polygon);
|
|
246
|
+
// Remove the drawn polygon.
|
|
247
|
+
polygon.setMap(null);
|
|
248
|
+
// Stop drawing.
|
|
249
|
+
(_a = this._drawingManager) === null || _a === void 0 ? void 0 : _a.setDrawingMode(null);
|
|
250
|
+
// Check if the feature should be used as a cutout to an existing
|
|
251
|
+
// feature or added as it's own feature.
|
|
252
|
+
const exteriorPolygonFeature = this._allowDrawingHoleInPolygon
|
|
253
|
+
? getPossibleExteriorFeature(this.googleMap.data, feature)
|
|
254
|
+
: undefined;
|
|
255
|
+
if (exteriorPolygonFeature) {
|
|
256
|
+
addInnerFeatureCutoutToExteriorFeature(exteriorPolygonFeature, feature);
|
|
257
|
+
setFeatureSelected(exteriorPolygonFeature, true);
|
|
258
|
+
}
|
|
259
|
+
else {
|
|
260
|
+
this.googleMap.data.add(feature);
|
|
261
|
+
setFeatureSelected(feature, true);
|
|
262
|
+
}
|
|
263
|
+
});
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
isDrawing() {
|
|
267
|
+
if (isNullOrUndefined(this._drawingManager)) {
|
|
268
|
+
return true;
|
|
269
|
+
}
|
|
270
|
+
return this._drawingManager.getDrawingMode() !== null;
|
|
271
|
+
}
|
|
272
|
+
// TODO: Refactor out of the service meant to just wrap the google maps api.
|
|
273
|
+
hasSelectedFeature() {
|
|
274
|
+
this._assertInitialized();
|
|
275
|
+
let isSelected = false;
|
|
276
|
+
this.googleMap.data.forEach(f => {
|
|
277
|
+
if (isFeatureSelected(f)) {
|
|
278
|
+
isSelected = true;
|
|
279
|
+
}
|
|
280
|
+
});
|
|
281
|
+
return isSelected;
|
|
282
|
+
}
|
|
283
|
+
// TODO: Refactor out of the service meant to just wrap the google maps api.
|
|
284
|
+
getSelectedFeature() {
|
|
285
|
+
this._assertInitialized();
|
|
286
|
+
let feature = null;
|
|
287
|
+
this.googleMap.data.forEach(f => {
|
|
288
|
+
if (isFeatureSelected(f)) {
|
|
289
|
+
feature = f;
|
|
290
|
+
}
|
|
291
|
+
});
|
|
292
|
+
return feature;
|
|
293
|
+
}
|
|
294
|
+
// TODO: Refactor out of the service meant to just wrap the google maps api.
|
|
295
|
+
openContextMenu() {
|
|
296
|
+
const feature = this.getSelectedFeature();
|
|
297
|
+
if (feature) {
|
|
298
|
+
this._openContextMenuForFeature(feature);
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
// TODO: Refactor out of the service meant to just wrap the google maps api.
|
|
302
|
+
_openContextMenuForFeature(feature, position) {
|
|
303
|
+
if (this._activeContextMenu) {
|
|
304
|
+
this._activeContextMenu.close();
|
|
305
|
+
this._activeContextMenu = null;
|
|
306
|
+
}
|
|
307
|
+
this._assertInitialized();
|
|
308
|
+
let _position = position;
|
|
309
|
+
if (!_position) {
|
|
310
|
+
_position = getFeatureCenter(feature);
|
|
311
|
+
}
|
|
312
|
+
if (this._featureContextMenu) {
|
|
313
|
+
this._activeContextMenu = new GoogleMapsContextMenu(this.googleMap, this._featureContextMenu, _position, this._vcr, this._ngZone, this.googleMap.data, feature);
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
getGeoJson(removeAppProperties = true) {
|
|
317
|
+
return new Promise((resolve, reject) => {
|
|
318
|
+
this._assertInitialized();
|
|
319
|
+
this.googleMap.data.toGeoJson(f => {
|
|
320
|
+
if (removeAppProperties) {
|
|
321
|
+
stripAppFeaturePropertiesFromJson(f);
|
|
322
|
+
}
|
|
323
|
+
resolve(f);
|
|
324
|
+
});
|
|
325
|
+
});
|
|
326
|
+
}
|
|
327
|
+
/** Asserts that the map has been initialized. */
|
|
328
|
+
_assertInitialized() {
|
|
329
|
+
if (!this.googleMap && (typeof ngDevMode === 'undefined' || ngDevMode)) {
|
|
330
|
+
throw Error('Cannot access Google Map information before the API has been initialized. ' +
|
|
331
|
+
'Please wait for the API to load before trying to interact with it.');
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
GoogleMapsService.decorators = [
|
|
336
|
+
{ type: Injectable }
|
|
337
|
+
];
|
|
338
|
+
GoogleMapsService.ctorParameters = () => [
|
|
339
|
+
{ type: MapValueManagerService },
|
|
340
|
+
{ type: NgZone },
|
|
341
|
+
{ type: ViewContainerRef }
|
|
342
|
+
];
|
|
343
|
+
export { ɵ0 };
|
|
344
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ29vZ2xlLW1hcHMuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL3VpLWNvbW1vbi9nb29nbGUtbWFwcy9nb29nbGUtbWFwcy5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBYSxnQkFBZ0IsRUFBRSxNQUFNLGVBQWUsQ0FBQTtBQUMvRSxPQUFPLEVBQUUsZUFBZSxFQUFFLElBQUksRUFBYyxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUE7QUFDakUsT0FBTyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUE7QUFHMUQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLGtCQUFrQixFQUFFLE1BQU0sMEJBQTBCLENBQUE7QUFFaEYsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sMkJBQTJCLENBQUE7QUFDakUsT0FBTyxFQUNMLHNDQUFzQyxFQUN0Qyw0QkFBNEIsRUFDNUIsNkJBQTZCLEVBQzdCLHdCQUF3QixFQUN4QixnQkFBZ0IsRUFDaEIsZ0JBQWdCLEVBQ2hCLDBCQUEwQixFQUMxQixpQkFBaUIsRUFDakIsaUJBQWlCLEVBQ2pCLGtCQUFrQixFQUNsQixpQ0FBaUMsR0FDbEMsTUFBTSwrQkFBK0IsQ0FBQTtBQUN0QyxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsY0FBYyxFQUFFLE1BQU0sNkJBQTZCLENBQUE7QUFJcEYsTUFBTSx1QkFBdUIsR0FBK0I7SUFDMUQsU0FBUyxFQUFFLElBQUk7SUFDZixTQUFTLEVBQUUsSUFBSTtJQUNmLFFBQVEsRUFBRSxJQUFJO0lBQ2Qsa0NBQWtDO0lBQ2xDLG1DQUFtQztDQUNwQyxDQUFBO0FBRUQsTUFBTSwrQkFBK0IsR0FBc0QsR0FBRyxFQUFFLENBQUMsQ0FBQztJQUNoRyxjQUFjLEVBQUUsSUFBSTtJQUNwQixxQkFBcUIsRUFBRTtRQUNyQixZQUFZLEVB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U0FDRjtJQUNILENBQUM7SUFFTSxVQUFVLENBQUMsc0JBQStCLElBQUk7UUFDbkQsT0FBTyxJQUFJLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsRUFBRTtZQUNyQyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQTtZQUN6QixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUU7Z0JBQ2hDLElBQUksbUJBQW1CLEVBQUU7b0JBQ3ZCLGlDQUFpQyxDQUFDLENBQUMsQ0FBQyxDQUFBO2lCQUNyQztnQkFDRCxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUE7WUFDWixDQUFDLENBQUMsQ0FBQTtRQUNKLENBQUMsQ0FBQyxDQUFBO0lBQ0osQ0FBQztJQUVELGlEQUFpRDtJQUN6QyxrQkFBa0I7UUFDeEIsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLElBQUksQ0FBQyxPQUFPLFNBQVMsS0FBSyxXQUFXLElBQUksU0FBUyxDQUFDLEVBQUU7WUFDdEUsTUFBTSxLQUFLLENBQ1QsNEVBQTRFO2dCQUMxRSxvRUFBb0UsQ0FDdkUsQ0FBQTtTQUNGO0lBQ0gsQ0FBQzs7O1lBdlhGLFVBQVU7OztZQW5ERixzQkFBc0I7WUFyQlYsTUFBTTtZQUFhLGdCQUFnQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUsIE5nWm9uZSwgT25EZXN0cm95LCBWaWV3Q29udGFpbmVyUmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSdcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgZnJvbSwgT2JzZXJ2YWJsZSwgU3ViamVjdCB9IGZyb20gJ3J4anMnXG5pbXBvcnQgeyBzd2l0Y2hNYXAsIHRha2VVbnRpbCwgdGFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnXG5cbmltcG9ydCB7IE1lbnVDb21wb25lbnQgfSBmcm9tICdAdGhlc2VhbS91aS1jb21tb24vbWVudSdcbmltcG9ydCB7IGlzTnVsbE9yVW5kZWZpbmVkLCBub3ROdWxsT3JVbmRlZmluZWQgfSBmcm9tICdAdGhlc2VhbS91aS1jb21tb24vdXRpbHMnXG5cbmltcG9ydCB7IEdvb2dsZU1hcHNDb250ZXh0TWVudSB9IGZyb20gJy4vZ29vZ2xlLW1hcHMtY29udGV4dG1lbnUnXG5pbXBvcnQge1xuICBhZGRJbm5lckZlYXR1cmVDdXRvdXRUb0V4dGVyaW9yRmVhdHVyZSxcbiAgY3JlYXRlRGF0YUZlYXR1cmVGcm9tUG9seWdvbixcbiAgY3JlYXRlRmVhdHVyZUNoYW5nZU9ic2VydmFibGUsXG4gIGdldEJvdW5kc1dpdGhBbGxGZWF0dXJlcyxcbiAgZ2V0RmVhdHVyZUNlbnRlcixcbiAgZ2V0RmVhdHVyZXNDb3VudCxcbiAgZ2V0UG9zc2libGVFeHRlcmlvckZlYXR1cmUsXG4gIGlzRmVhdHVyZVNlbGVjdGVkLFxuICByZW1vdmVBbGxGZWF0dXJlcyxcbiAgc2V0RmVhdHVyZVNlbGVjdGVkLFxuICBzdHJpcEFwcEZlYXR1cmVQcm9wZXJ0aWVzRnJvbUpzb24sXG59IGZyb20gJy4vZ29vZ2xlLW1hcHMtZmVhdHVyZS1oZWxwZXJzJ1xuaW1wb3J0IHsgTWFwVmFsdWVNYW5hZ2VyU2VydmljZSwgTWFwVmFsdWVTb3VyY2UgfSBmcm9tICcuL21hcC12YWx1ZS1tYW5hZ2VyLnNlcnZpY2UnXG5cbmRlY2xhcmUgY29uc3QgbmdEZXZNb2RlOiBib29sZWFuIHwgdW5kZWZpbmVkXG5cbmNvbnN0IERFRkFVTFRfUE9MWUdPTl9PUFRJT05TOiBnb29nbGUubWFwcy5Qb2x5Z29uT3B0aW9ucyA9IHtcbiAgY2xpY2thYmxlOiB0cnVlLFxuICBkcmFnZ2FibGU6IHRydWUsXG4gIGVkaXRhYmxlOiB0cnVlLFxuICAvLyBmaWxsQ29sb3I6ICdyZ2JhKDYwLDE1MCw2MCwxKScsXG4gIC8vIHN0cm9rZUNvbG9yOiAncmdiYSgxNTUsMjU1LDAsMSknXG59XG5cbmNvbnN0IERFRkFVTFRfRFJBV0lOR19NQU5BR0VSX09QVElPTlM6ICgoKSA9PiBnb29nbGUubWFwcy5kcmF3aW5nLkRyYXdpbmdNYW5hZ2VyT3B0aW9ucykgPSAoKSA9PiAoe1xuICBkcmF3aW5nQ29udHJvbDogdHJ1ZSxcbiAgZHJhd2luZ0NvbnRyb2xPcHRpb25zOiB7XG4gICAgZHJhd2luZ01vZGVzOiBbXG4gICAgICBnb29nbGUubWFwcy5kcmF3aW5nLk92ZXJsYXlUeXBlLlBPTFlHT05cbiAgICBdXG4gIH0sXG4gIHBvbHlnb25PcHRpb25zOiBERUZBVUxUX1BPTFlHT05fT1BUSU9OUyxcbiAgZHJhd2luZ01vZGU6IG51bGxcbn0pXG5cbmNvbnN0IEZFQVRVUkVfU1RZTEVfT1BUSU9OU19ERUZBVUxUOiBnb29nbGUubWFwcy5EYXRhLlN0eWxlT3B0aW9ucyA9IHtcbiAgY2xpY2thYmxlOiB0cnVlLFxuICB2aXNpYmxlOiB0cnVlLFxuICAvLyB6SW5kZXg/OiBudW1iZXI7XG5cbiAgLy8gY3Vyc29yPzogc3RyaW5nO1xuICBkcmFnZ2FibGU6IGZhbHNlLFxuICBlZGl0YWJsZTogZmFsc2UsXG4gIGZpbGxDb2xvcjogJ3RlYWwnLFxuICBmaWxsT3BhY2l0eTogMC4zLFxuICBzdHJva2VDb2xvcjogJ2JsdWUnLFxuICBzdHJva2VPcGFjaXR5OiAxLFxuICBzdHJva2VXZWlnaHQ6IDIsXG59XG5cbmNvbnN0IEZFQVRVUkVfU1RZTEVfT1BUSU9OU19TRUxFQ1RFRDogZ29vZ2xlLm1hcHMuRGF0YS5TdHlsZU9wdGlvbnMgPSB7XG4gIC4uLkZFQVRVUkVfU1RZTEVfT1BUSU9OU19ERUZBVUxULFxuICBkcmFnZ2FibGU6IHRydWUsXG4gIGVkaXRhYmxlOiB0cnVlLFxuICBmaWxsQ29sb3I6ICdncmVlbicsXG4gIGZpbGxPcGFjaXR5OiAwLjcsXG4gIHN0cm9rZUNvbG9yOiAnbGltZWdyZWVuJyxcbiAgc3Ryb2tlT3BhY2l0eTogMSxcbiAgc3Ryb2tlV2VpZ2h0OiAyLFxufVxuXG50eXBlIFdpdGhSZXF1aXJlZDxULCBLIGV4dGVuZHMga2V5b2YgVD4gPSBUICYgeyBbUCBpbiBLXS0/OiBUW1BdIH1cblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIEdvb2dsZU1hcHNTZXJ2aWNlIGltcGxlbWVudHMgT25EZXN0cm95IHtcbiAgcHJpdmF0ZSByZWFkb25seSBfbmdVbnN1YnNjcmliZSA9IG5ldyBTdWJqZWN0PHZvaWQ+KClcblxuICBwcml2YXRlIHJlYWRvbmx5IF9tYXBSZWFkeVN1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKVxuXG4gIHByaXZhdGUgX2RyYXdpbmdNYW5hZ2VyPzogZ29vZ2xlLm1hcHMuZHJhd2luZy5EcmF3aW5nTWFuYWdlclxuICBwcml2YXRlIF9mZWF0dXJlQ29udGV4dE1lbnU6IE1lbnVDb21wb25lbnQgfCBudWxsID0gbnVsbFxuICBwcml2YXRlIF9hY3RpdmVDb250ZXh0TWVudTogR29vZ2xlTWFwc0NvbnRleHRNZW51IHwgbnVsbCA9IG51bGxcbiAgcHJpdmF0ZSBfYmFzZUxhdExuZz86IGdvb2dsZS5tYXBzLkxhdExuZ0xpdGVyYWxcblxuICBwcml2YXRlIF9hbGxvd0RyYXdpbmdIb2xlSW5Qb2x5Z29uOiBib29sZWFuID0gZmFsc2VcblxuICAvLyBUT0RPOiBNb3ZlIHRvIGEgYmV0dGVyIHBsYWNlIHRoYW4gdGhlIG1hcCB3cmFwcGVyIHNlcnZpY2UuXG4gIHByaXZhdGUgX2ZpbGVJbnB1dEhhbmRsZXI6ICgoZmlsZTogRmlsZSkgPT4gdm9pZCkgfCB1bmRlZmluZWQgfCBudWxsXG5cbiAgcHVibGljIGdvb2dsZU1hcD86IGdvb2dsZS5tYXBzLk1hcFxuXG4gIHB1YmxpYyByZWFkb25seSBtYXBSZWFkeSQ6IE9ic2VydmFibGU8Ym9vbGVhbj5cblxuICBwdWJsaWMgZ2V0IG1hcFJlYWR5KCk6IGJvb2xlYW4geyByZXR1cm4gdGhpcy5fbWFwUmVhZHlTdWJqZWN0LnZhbHVlIH1cblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9tYXBWYWx1ZU1hbmFnZXI6IE1hcFZhbHVlTWFuYWdlclNlcnZpY2UsXG4gICAgcHJpdmF0ZSByZWFkb25seSBfbmdab25lOiBOZ1pvbmUsXG4gICAgcHJpdmF0ZSByZWFkb25seSBfdmNyOiBWaWV3Q29udGFpbmVyUmVmLFxuICApIHtcbiAgICB0aGlzLm1hcFJlYWR5JCA9IHRoaXMuX21hcFJlYWR5U3ViamVjdC5hc09ic2VydmFibGUoKVxuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5fbmdVbnN1YnNjcmliZS5uZXh0KClcbiAgICB0aGlzLl9uZ1Vuc3Vic2NyaWJlLmNvbXBsZXRlKClcbiAgfVxuXG4gIHB1YmxpYyBzZXRNYXAobWFwOiBnb29nbGUubWFwcy5NYXApOiB2b2lkIHtcbiAgICB0aGlzLmdvb2dsZU1hcCA9IG1hcFxuICAgIHRoaXMuX21hcFJlYWR5U3ViamVjdC5uZXh0KHRydWUpXG4gICAgdGhpcy5faW5pdERyYXdpbmdNYW5hZ2VyKClcbiAgICB0aGlzLl9pbml0RmVhdHVyZVN0eWxpbmcoKVxuICAgIHRoaXMuX2luaXRGZWF0dXJlQ2hhbmdlTGlzdGVuZXJzKClcbiAgfVxuXG4gIHB1YmxpYyBzZXRCYXNlTGF0TG5nKGxhdDogbnVtYmVyLCBsbmc6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuX2Jhc2VMYXRMbmcgPSB7IGxhdCwgbG5nIH1cbiAgfVxuXG4gIC8vIFRPRE86IFJlZmFjdG9yIG91dCBvZiB0aGUgc2VydmljZSBtZWFudCB0byBqdXN0IHdyYXAgdGhlIGdvb2dsZSBtYXBzIGFwaS5cbiAgcHVibGljIHNldEZlYXR1cmVDb250ZXh0TWVudShtZW51OiBNZW51Q29tcG9uZW50IHwgbnVsbCk6IHZvaWQge1xuICAgIHRoaXMuX2ZlYXR1cmVDb250ZXh0TWVudSA9IG1lbnVcbiAgfVxuXG4gIHB1YmxpYyBnZXREaXYoKTogSFRNTERpdkVsZW1lbnQge1xuICAgIHRoaXMuX2Fzc2VydEluaXRpYWxpemVkKClcbiAgICByZXR1cm4gdGhpcy5nb29nbGVNYXAuZ2V0RGl2KCkgYXMgSFRNTERpdkVsZW1lbnRcbiAgfVxuXG4gIHB1YmxpYyBmaXRCb3VuZHMoYm91bmRzOiBnb29nbGUubWFwcy5MYXRMbmdCb3VuZHMgfCBnb29nbGUubWFwcy5MYXRMbmdCb3VuZHNMaXRlcmFsLCBwYWRkaW5nPzogbnVtYmVyIHwgZ29vZ2xlLm1hcHMuUGFkZGluZyk6IHZvaWQge1xuICAgIHRoaXMuX2Fzc2VydEluaXRpYWxpemVkKClcbiAgICB0aGlzLmdvb2dsZU1hcC5maXRCb3VuZHMoYm91bmRzLCBwYWRkaW5nKVxuICB9XG5cbiAgLyoqXG4gICAqIEl0ZXJhdGVzIHRoZSBtYXAncyBmZWF0dXJlcyBhbmQgcmVtb3ZlcyBhbnkgdGhhdCBhcmUgc2VsZWN0ZWQuXG4gICAqL1xuICBwdWJsaWMgZGVsZXRlU2VsZWN0aW9uKCk6IHZvaWQge1xuICAgIHRoaXMuX2Fzc2VydEluaXRpYWxpemVkKClcbiAgICBjb25zdCBtYXBEYXRhID0gdGhpcy5nb29nbGVNYXAuZGF0YVxuICAgIG1hcERhdGEuZm9yRWFjaChmID0+IHtcbiAgICAgIGlmIChpc0ZlYXR1cmVTZWxlY3RlZChmKSkge1xuICAgICAgICBtYXBEYXRhLnJlbW92ZShmKVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogU3RvcHMgdGhlIGN1cnJlbnQgZHJhd2luZy5cbiAgICovXG4gIHB1YmxpYyBzdG9wRHJhd2luZygpOiB2b2lkIHtcbiAgICB0aGlzLl9uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgaWYgKGlzTnVsbE9yVW5kZWZpbmVkKHRoaXMuX2RyYXdpbmdNYW5hZ2VyKSB8fCB0aGlzLl9kcmF3aW5nTWFuYWdlci5nZXREcmF3aW5nTW9kZSgpID09PSBudWxsKSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICAvLyBMaXN0ZW5pbmcgZm9yIHRoZSBjb21wbGV0aW9uIGV2ZW50IG9mIHRoZSBvdmVybGF5IGN1cnJlbnRseSBiZWluZyBkcmF3blxuICAgICAgLy8gYW5kIHJlbW92aW5nIGl0LiBJIGhhdmVuJ3QgZm91bmQgYSB3YXkgdG8gY2FuY2VsIHRoZSBjdXJyZW50IGRyYXdpbmcsXG4gICAgICAvLyB3aXRob3V0IHRoaXMgaGFjayB0aGF0IGFzc3VtZXMgb3VyIGxpc3RlbmVycyB3aWxsIG5vdCBydW4gaW50byBhIHJhY2VcbiAgICAgIC8vIGNvbmRpdGlvbi5cbiAgICAgIGNvbnN0IGxpc3RlbmVyID0gZ29vZ2xlLm1hcHMuZXZlbnQuYWRkTGlzdGVuZXIoXG4gICAgICAgIHRoaXMuX2RyYXdpbmdNYW5hZ2VyLFxuICAgICAgICAnb3ZlcmxheWNvbXBsZXRlJyxcbiAgICAgICAgKGV2ZW50OiBnb29nbGUubWFwcy5kcmF3aW5nLk92ZXJsYXlDb21wbGV0ZUV2ZW50KSA9PiB7XG4gICAgICAgICAgZXZlbnQub3ZlcmxheS5zZXRNYXAobnVsbClcbiAgICAgICAgICBsaXN0ZW5lci5yZW1vdmUoKVxuICAgICAgICB9XG4gICAgICApXG5cbiAgICAgIC8vIFRvIGZha2UgY2FuY2VsaW5nIHRoZSBjdXJyZW50IGRyYXdpbmcsIHdpdGhvdXQgZGlzYWJsaW5nIHRoZSBkcmF3aW5nXG4gICAgICAvLyBtb2RlLCB0aGUgZHJhd2luIG1vZGUgaXMgYmVpbmcgdW5zZXQgdGhlbiBpbW1lZGlhdGVseSBzZXQgYmFjay4gV2hlblxuICAgICAgLy8gdGhlIG1vZGUgaXMgdW5zZXQgdGhlICdvdmVybGF5Y29tcGxldGUnIGV2ZW50IHdpbGwgZmlyZSwgd2hpY2ggd2lsbFxuICAgICAgLy8gZ2l2ZSBhIHJlZmVyZW5jZSB0byB0aGUgY3VycmVudCBvdmVybGF5IHRvIHJlbW92ZSwgdGhlbiBpdCBpcyBzZXQgYmFja1xuICAgICAgLy8gdG8gdGhlIG1vZGUgdGhlIHVzZXIgd2FzIHVzaW5nLiBUbyB0aGUgdXNlciBpcyBzaG91bGQganVzdCBzZWVtIGxpa2VcbiAgICAgIC8vIHRoZSBjdXJyZW50IGRyYXdpbmcgd2FzIGNhbmNlbGVkIGFuZCB0aGV5IGNhbiBzdGFydCBkcmF3aW5nIGFnYWluLlxuICAgICAgY29uc3QgbW9kZSA9IHRoaXMuX2RyYXdpbmdNYW5hZ2VyLmdldERyYXdpbmdNb2RlKClcbiAgICAgIHRoaXMuX2RyYXdpbmdNYW5hZ2VyLnNldERyYXdpbmdNb2RlKG51bGwpXG4gICAgICB0aGlzLl9kcmF3aW5nTWFuYWdlci5zZXREcmF3aW5nTW9kZShtb2RlKVxuXG4gICAgICAvLyAnb3ZlcmxheWNvbXBsZXRlJyBzaG91bGQgZmlyZSBpbW1lZGlhdGVseSwgdW5sZXNzIGFuIG92ZXJsYXkgaGFkbid0XG4gICAgICAvLyBzdGFydGVkIGRyYXdpbmcuIFRoaXMgdGltZW91dCB3aWxsIG1ha2Ugc3VyZSB0aGUgbGlzdGVuZXIgZ2V0cyByZW1vdmVkLlxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGxpc3RlbmVyLnJlbW92ZSgpXG4gICAgICB9KVxuXG4gICAgfSlcbiAgfVxuXG4gIHByaXZhdGUgX2luaXREcmF3aW5nTWFuYWdlcigpOiB2b2lkIHtcbiAgICBpZiAobm90TnVsbE9yVW5kZWZpbmVkKHRoaXMuX2RyYXdpbmdNYW5hZ2VyKSkge1xuICAgICAgdGhyb3cgRXJyb3IoYERyYXdpbmdNYW5hZ2VyIGlzIGFscmVhZHkgaW5pdGlhbGl6ZWQuYClcbiAgICB9XG5cbiAgICB0aGlzLl9hc3NlcnRJbml0aWFsaXplZCgpXG5cbiAgICBjb25zdCBvcHRpb25zID0gREVGQVVMVF9EUkFXSU5HX01BTkFHRVJfT1BUSU9OUygpXG5cbiAgICBjb25zdCBkcmF3aW5nTWFuYWdlciA9IG5ldyBnb29nbGUubWFwcy5kcmF3aW5nLkRyYXdpbmdNYW5hZ2VyKG9wdGlvbnMpXG4gICAgZHJhd2luZ01hbmFnZXIuc2V0TWFwKHRoaXMuZ29vZ2xlTWFwKVxuXG4gICAgdGhpcy5fZHJhd2luZ01hbmFnZXIgPSBkcmF3aW5nTWFuYWdlclxuXG4gICAgdGhpcy5fZHJhd2luZ01hbmFnZXIuYWRkTGlzdGVuZXIoJ2RyYXdpbmdtb2RlX2NoYW5nZWQnLCBldmVudCA9PiB7XG4gICAgICBpZiAodGhpcy5fZHJhd2luZ01hbmFnZXI/LmdldERyYXdpbmdNb2RlKCkgIT09IG51bGwpIHtcbiAgICAgICAgdGhpcy5fYXNzZXJ0SW5pdGlhbGl6ZWQoKVxuICAgICAgICB0aGlzLmdvb2dsZU1hcC5kYXRhLmZvckVhY2goZiA9PiB7XG4gICAgICAgICAgaWYgKGlzRmVhdHVyZVNlbGVjdGVkKGYpKSB7XG4gICAgICAgICAgICBzZXRGZWF0dXJlU2VsZWN0ZWQoZiwgZmFsc2UpXG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICBwdWJsaWMgYWRkQ29udHJvbChlbGVtZW50OiBIVE1MRWxlbWVudCwgcG9zaXRpb246IGdvb2dsZS5tYXBzLkNvbnRyb2xQb3NpdGlvbik6IHZvaWQge1xuICAgIHRoaXMuX2Fzc2VydEluaXRpYWxpemVkKClcbiAgICB0aGlzLmdvb2dsZU1hcC5jb250cm9sc1twb3NpdGlvbl0ucHVzaChlbGVtZW50KVxuICB9XG5cbiAgcHVibGljIGFzeW5jIHNldERhdGEoZGF0YTogYW55KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5fYXNzZXJ0SW5pdGlhbGl6ZWQoKVxuICAgIHJlbW92ZUFsbEZlYXR1cmVzKHRoaXMuZ29vZ2xlTWFwLmRhdGEpXG4gICAgdGhpcy5nb29nbGVNYXAuZGF0YS5hZGRHZW9Kc29uKGRhdGEpXG4gICAgdGhpcy5nb29nbGVNYXAuZml0Qm91bmRzKGdldEJvdW5kc1dpdGhBbGxGZWF0dXJlcyh0aGlzLmdvb2dsZU1hcC5kYXRhKSlcbiAgfVxuXG4gIC8vIFRPRE86IFJlZmFjdG9yIG91dCBvZiB0aGUgc2VydmljZSBtZWFudCB0byBqdXN0IHdyYXAgdGhlIGdvb2dsZSBtYXBzIGFwaS5cbiAgcHVibGljIHJlQ2VudGVyT25GZWF0dXJlcygpOiB2b2lkIHtcbiAgICB0aGlzLl9hc3NlcnRJbml0aWFsaXplZCgpXG4gICAgaWYgKGdldEZlYXR1cmVzQ291bnQodGhpcy5nb29nbGVNYXAuZGF0YSkgPT09IDApIHtcbiAgICAgIGlmICghdGhpcy5fYmFzZUxhdExuZykge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgdGhpcy5nb29nbGVNYXAucGFuVG8odGhpcy5fYmFzZUxhdExuZylcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICB0aGlzLmdvb2dsZU1hcC5maXRCb3VuZHMoZ2V0Qm91bmRzV2l0aEFsbEZlYXR1cmVzKHRoaXMuZ29vZ2xlTWFwLmRhdGEpKVxuXG4gICAgLy8gVE9ETzogRml4IHRvIHBhbiB0byBjZW50ZXIuIEN1cnJlbnRseSBmaXRCb3VuZHMgcmVzdWx0cyBpbiB0aGUgZXhwZWN0ZWRcbiAgICAvLyByZXN1bHQsIGJ1dCBwYW50VG9Cb3VuZHMgYW5pbWF0ZXMuXG4gICAgLy8gdGhpcy5nb29nbGVNYXAucGFuVG9Cb3VuZHMoZ2V0Qm91bmRzV2l0aEFsbEZlYXR1cmVzKHRoaXMuZ29vZ2xlTWFwLmRhdGEpKVxuICB9XG5cbiAgcHVibGljIGFsbG93RHJhd2luZ0hvbGVJblBvbHlnb24oYWxsb3c6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLl9hbGxvd0RyYXdpbmdIb2xlSW5Qb2x5Z29uID0gYWxsb3dcbiAgfVxuXG4gIHB1YmxpYyBzZXRGaWxlSW5wdXRIYW5kbGVyKGhhbmRsZXI6ICgoZmlsZTogRmlsZSkgPT4gdm9pZCkgfCB1bmRlZmluZWQgfCBudWxsKTogdm9pZCB7XG4gICAgdGhpcy5fZmlsZUlucHV0SGFuZGxlclxuICB9XG5cbiAgcHVibGljIGdldEZpbGVJbnB1dEhhbmRsZXIoKTogKChmaWxlOiBGaWxlKSA9PiB2b2lkKSB8IHVuZGVmaW5lZCB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLl9maWxlSW5wdXRIYW5kbGVyXG4gIH1cblxuICBwcml2YXRlIF9pbml0RmVhdHVyZVN0eWxpbmcoKTogdm9pZCB7XG4gICAgdGhpcy5fYXNzZXJ0SW5pdGlhbGl6ZWQoKVxuXG4gICAgLy8gRGlzYWJsZSBhbnkgc2VsZWN0aW9uIHdoZW4gY2xpY2tpbmcgdGhlIG1hcC5cbiAgICAvL1xuICAgIC8vIFRPRE86IFRoZXJlIG1heSBiZSBhIGJldHRlciB3YXkgdG8gZG8gdGhpcyB0aGF0IHdvdWxkIGJlIG1vcmUgYWNjdXJhdGUgb3JcbiAgICAvLyBhZGRpdGlvbmFsIGV2ZW50cyB0aGF0IHNob3VsZCBiZSBsaXN0ZW5lZCB0bywgc3VjaCBhcyB0aGUgZGlzYWJsaW5nXG4gICAgLy8gc2VsZWN0aW9uIHdoZW4gdGhlIG1hcCBsb29zZXMgZm9jdXMuXG4gICAgdGhpcy5nb29nbGVNYXAuYWRkTGlzdGVuZXIoJ2NsaWNrJywgKGV2ZW46IGdvb2dsZS5tYXBzLk1hcE1vdXNlRXZlbnQgfCBnb29nbGUubWFwcy5JY29uTW91c2VFdmVudCkgPT4ge1xuICAgICAgdGhpcy5fYXNzZXJ0SW5pdGlhbGl6ZWQoKVxuICAgICAgdGhpcy5nb29nbGVNYXAuZGF0YS5mb3JFYWNoKGYgPT4gc2V0RmVhdHVyZVNlbGVjdGVkKGYsIGZhbHNlKSlcbiAgICB9KVxuXG4gICAgLy8gRGV0ZXJtaW5lIHdoYXQgdGhlIHN0eWxlIG9mIHRoZSBmZWF0dXJlcyBhcmUuXG4gICAgdGhpcy5nb29nbGVNYXAuZGF0YS5zZXRTdHlsZSgoZmVhdHVyZSkgPT4ge1xuICAgICAgaWYgKGlzRmVhdHVyZVNlbGVjdGVkKGZlYXR1cmUpKSB7XG4gICAgICAgIHJldHVybiBGRUFUVVJFX1NUWUxFX09QVElPTlNfU0VMRUNURURcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIEZFQVRVUkVfU1RZTEVfT1BUSU9OU19ERUZBVUxUXG4gICAgfSlcblxuICAgIC8vIFNlbGVjdCBhIGZlYXR1cmUgd2hlbiBjbGlja2VkLlxuICAgIHRoaXMuZ29vZ2xlTWFwLmRhdGEuYWRkTGlzdGVuZXIoJ2NsaWNrJywgKGV2ZW50OiBnb29nbGUubWFwcy5EYXRhLk1vdXNlRXZlbnQpID0+IHtcbiAgICAgIHRoaXMuX2Fzc2VydEluaXRpYWxpemVkKClcblxuICAgICAgc2V0RmVhdHVyZVNlbGVjdGVkKGV2ZW50LmZlYXR1cmUsIHRydWUpXG4gICAgICB0aGlzLmdvb2dsZU1hcC5kYXRhLmZvckVhY2goZiA9PiB7XG4gICAgICAgIGlmIChmICE9PSBldmVudC5mZWF0dXJlICYmIGlzRmVhdHVyZVNlbGVjdGVkKGYpKSB7XG4gICAgICAgICAgc2V0RmVhdHVyZVNlbGVjdGVkKGYsIGZhbHNlKVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH0pXG5cbiAgICAvLyBTZXQgYSBzdHlsZSBvbiBob3ZlcmVkIGZlYXR1cmVzIHRoYXQgY2FuIGJlIHNlbGVjdGVkLlxuICAgIHRoaXMuZ29vZ2xlTWFwLmRhdGEuYWRkTGlzdGVuZXIoJ21vdXNlb3ZlcicsIChldmVudDogZ29vZ2xlLm1hcHMuRGF0YS5Nb3VzZUV2ZW50KSA9PiB7XG4gICAgICB0aGlzLl9hc3NlcnRJbml0aWFsaXplZCgpXG4gICAgICB0aGlzLmdvb2dsZU1hcC5kYXRhLnJldmVydFN0eWxlKClcbiAgICAgIGlmICghdGhpcy5pc0RyYXdpbmcoKSAmJiAhaXNGZWF0dXJlU2VsZWN0ZWQoZXZlbnQuZmVhdHVyZSkpIHtcbiAgICAgICAgdGhpcy5nb29nbGVNYXAuZGF0YS5vdmVycmlkZVN0eWxlKGV2ZW50LmZlYXR1cmUsIHsgc3Ryb2tlV2VpZ2h0OiA0IH0pXG4gICAgICB9XG4gICAgfSlcblxuICAgIC8vIFJlbW92ZSBhbnkgaG92ZXIgc3R5bGVzIHdoZW4gbW91c2UgbW92ZXMgYXdheS5cbiAgICB0aGlzLmdvb2dsZU1hcC5kYXRhLmFkZExpc3RlbmVyKCdtb3VzZW91dCcsIChldmVudDogZ29vZ2xlLm1hcHMuRGF0YS5Nb3VzZUV2ZW50KSA9PiB7XG4gICAgICB0aGlzLl9hc3NlcnRJbml0aWFsaXplZCgpXG4gICAgICB0aGlzLmdvb2dsZU1hcC5kYXRhLnJldmVydFN0eWxlKClcbiAgICB9KVxuICB9XG5cbiAgcHJpdmF0ZSBfaW5pdEZlYXR1cmVDaGFuZ2VMaXN0ZW5lcnMoKTogdm9pZCB7XG4gICAgdGhpcy5fYXNzZXJ0SW5pdGlhbGl6ZWQoKVxuXG4gICAgY3JlYXRlRmVhdHVyZUNoYW5nZU9ic2VydmFibGUodGhpcy5nb29nbGVNYXAuZGF0YSwgdGhpcy5fbmdab25lKS5waXBlKFxuICAgICAgc3dpdGNoTWFwKCgpID0+IGZyb20odGhpcy5nZXRHZW9Kc29uKCkpLnBpcGUoXG4gICAgICAgIHRhcChnZW9Kc29uID0+IHRoaXMuX21hcFZhbHVlTWFuYWdlci5zZXRWYWx1ZShnZW9Kc29uLCBNYXBWYWx1ZVNvdXJjZS5GZWF0dXJlQ2hhbmdlKSksXG4gICAgICApKSxcbiAgICAgIHRha2VVbnRpbCh0aGlzLl9uZ1Vuc3Vic2NyaWJlKSxcbiAgICApLnN1YnNjcmliZSgpXG5cbiAgICB0aGlzLmdvb2dsZU1hcC5kYXRhLmFkZExpc3RlbmVyKCdjb250ZXh0bWVudScsIChldmVudDogZ29vZ2xlLm1hcHMuRGF0YS5Nb3VzZUV2ZW50KSA9PiB7XG4gICAgICBpZiAoIWlzRmVhdHVyZVNlbGVjdGVkKGV2ZW50LmZlYXR1cmUpKSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICB0aGlzLl9vcGVuQ29udGV4dE1lbnVGb3JGZWF0dXJlKGV2ZW50LmZlYXR1cmUsIGV2ZW50LmxhdExuZylcbiAgICB9KVxuXG4gICAgaWYgKG5vdE51bGxPclVuZGVmaW5lZCh0aGlzLl9kcmF3aW5nTWFuYWdlcikpIHtcbiAgICAgIGdvb2dsZS5tYXBzLmV2ZW50LmFkZExpc3RlbmVyKHRoaXMuX2RyYXdpbmdNYW5hZ2VyLCAncG9seWdvbmNvbXBsZXRlJywgKHBvbHlnb246IGdvb2dsZS5tYXBzLlBvbHlnb24pID0+IHtcbiAgICAgICAgLy8gVGhlIERyYXdpbmdNYW5hZ2VyIGRvZXNuJ3Qgc2VlbSB0byBoYXZlIGEgd2F5IHRvIGFjY2VzcyB0aGUgb3ZlcmxheXMsXG4gICAgICAgIC8vIHNvIGlmIHRoZSBtYXAgaXMgbm90IHNldCB0aGVuIGl0IHNob3VsZG4neSBiZSBjb25zaWRlcmVkIGEgc3VjY2Vzc2Z1bFxuICAgICAgICAvLyBjb21wbGV0aW9uLiBJIGFtIGNhbmNlbGluZyB0aGUgYWN0aXZlIGRyYXdpbmcgYnkgZGlzYWJsaW5nIGRyYXdpbmdcbiAgICAgICAgLy8gbW9kZSBhbmQgc2V0dGluZyB0aGUgbWFwIG51bGwgaW4gdGhlICdvdmVybGF5Y29tcGxldGUnIGV2ZW50LCB3aGljaFxuICAgICAgICAvLyBmaXJlcyBiZWZvcmUgdGhlICdwb2x5Z29uY29tcGxldGUnIGV2ZW50LlxuICAgICAgICBpZiAoaXNOdWxsT3JVbmRlZmluZWQocG9seWdvbi5nZXRNYXAoKSkpIHtcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2Fzc2VydEluaXRpYWxpemVkKClcblxuICAgICAgICAvLyBDcmVhdGUgYSBtYXAgZmVhdHVyZSBvZiB0aGUgZHJhd24gcG9seWdvbi5cbiAgICAgICAgY29uc3QgZmVhdHVyZSA9IGNyZWF0ZURhdGFGZWF0dXJlRnJvbVBvbHlnb24ocG9seWdvbilcbiAgICAgICAgLy8gUmVtb3ZlIHRoZSBkcmF3biBwb2x5Z29uLlxuICAgICAgICBwb2x5Z29uLnNldE1hcChudWxsKVxuXG4gICAgICAgIC8vIFN0b3AgZHJhd2luZy5cbiAgICAgICAgdGhpcy5fZHJhd2luZ01hbmFnZXI/LnNldERyYXdpbmdNb2RlKG51bGwpXG5cbiAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIGZlYXR1cmUgc2hvdWxkIGJlIHVzZWQgYXMgYSBjdXRvdXQgdG8gYW4gZXhpc3RpbmdcbiAgICAgICAgLy8gZmVhdHVyZSBvciBhZGRlZCBhcyBpdCdzIG93biBmZWF0dXJlLlxuICAgICAgICBjb25zdCBleHRlcmlvclBvbHlnb25GZWF0dXJlID0gdGhpcy5fYWxsb3dEcmF3aW5nSG9sZUluUG9seWdvblxuICAgICAgICAgID8gZ2V0UG9zc2libGVFeHRlcmlvckZlYXR1cmUodGhpcy5nb29nbGVNYXAuZGF0YSwgZmVhdHVyZSlcbiAgICAgICAgICA6IHVuZGVmaW5lZFxuICAgICAgICBpZiAoZXh0ZXJpb3JQb2x5Z29uRmVhdHVyZSkge1xuICAgICAgICAgIGFkZElubmVyRmVhdHVyZUN1dG91dFRvRXh0ZXJpb3JGZWF0dXJlKGV4dGVyaW9yUG9seWdvbkZlYXR1cmUsIGZlYXR1cmUpXG4gICAgICAgICAgc2V0RmVhdHVyZVNlbGVjdGVkKGV4dGVyaW9yUG9seWdvbkZlYXR1cmUsIHRydWUpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5nb29nbGVNYXAuZGF0YS5hZGQoZmVhdHVyZSlcbiAgICAgICAgICBzZXRGZWF0dXJlU2VsZWN0ZWQoZmVhdHVyZSwgdHJ1ZSlcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgaXNEcmF3aW5nKCk6IGJvb2xlYW4ge1xuICAgIGlmIChpc051bGxPclVuZGVmaW5lZCh0aGlzLl9kcmF3aW5nTWFuYWdlcikpIHtcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuX2RyYXdpbmdNYW5hZ2VyLmdldERyYXdpbmdNb2RlKCkgIT09IG51bGxcbiAgfVxuXG4gIC8vIFRPRE86IFJlZmFjdG9yIG91dCBvZiB0aGUgc2VydmljZSBtZWFudCB0byBqdXN0IHdyYXAgdGhlIGdvb2dsZSBtYXBzIGFwaS5cbiAgcHVibGljIGhhc1NlbGVjdGVkRmVhdHVyZSgpOiBib29sZWFuIHtcbiAgICB0aGlzLl9hc3NlcnRJbml0aWFsaXplZCgpXG4gICAgbGV0IGlzU2VsZWN0ZWQgPSBmYWxzZVxuICAgIHRoaXMuZ29vZ2xlTWFwLmRhdGEuZm9yRWFjaChmID0+IHtcbiAgICAgIGlmIChpc0ZlYXR1cmVTZWxlY3RlZChmKSkge1xuICAgICAgICBpc1NlbGVjdGVkID0gdHJ1ZVxuICAgICAgfVxuICAgIH0pXG4gICAgcmV0dXJuIGlzU2VsZWN0ZWRcbiAgfVxuXG4gIC8vIFRPRE86IFJlZmFjdG9yIG91dCBvZiB0aGUgc2VydmljZSBtZWFudCB0byBqdXN0IHdyYXAgdGhlIGdvb2dsZSBtYXBzIGFwaS5cbiAgcHVibGljIGdldFNlbGVjdGVkRmVhdHVyZSgpOiBnb29nbGUubWFwcy5EYXRhLkZlYXR1cmUgfCBudWxsIHtcbiAgICB0aGlzLl9hc3NlcnRJbml0aWFsaXplZCgpXG4gICAgbGV0IGZlYXR1cmU6IGdvb2dsZS5tYXBzLkRhdGEuRmVhdHVyZSB8IG51bGwgPSBudWxsXG4gICAgdGhpcy5nb29nbGVNYXAuZGF0YS5mb3JFYWNoKGYgPT4ge1xuICAgICAgaWYgKGlzRmVhdHVyZVNlbGVjdGVkKGYpKSB7XG4gICAgICAgIGZlYXR1cmUgPSBmXG4gICAgICB9XG4gICAgfSlcbiAgICByZXR1cm4gZmVhdHVyZVxuICB9XG5cbiAgLy8gVE9ETzogUmVmYWN0b3Igb3V0IG9mIHRoZSBzZXJ2aWNlIG1lYW50IHRvIGp1c3Qgd3JhcCB0aGUgZ29vZ2xlIG1hcHMgYXBpLlxuICBwdWJsaWMgb3BlbkNvbnRleHRNZW51KCk6IHZvaWQge1xuICAgIGNvbnN0IGZlYXR1cmUgPSB0aGlzLmdldFNlbGVjdGVkRmVhdHVyZSgpXG4gICAgaWYgKGZlYXR1cmUpIHtcbiAgICAgIHRoaXMuX29wZW5Db250ZXh0TWVudUZvckZlYXR1cmUoZmVhdHVyZSlcbiAgICB9XG4gIH1cblxuICAvLyBUT0RPOiBSZWZhY3RvciBvdXQgb2YgdGhlIHNlcnZpY2UgbWVhbnQgdG8ganVzdCB3cmFwIHRoZSBnb29nbGUgbWFwcyBhcGkuXG4gIHByaXZhdGUgX29wZW5Db250ZXh0TWVudUZvckZlYXR1cmUoZmVhdHVyZTogZ29vZ2xlLm1hcHMuRGF0YS5GZWF0dXJlLCBwb3NpdGlvbj86IGdvb2dsZS5tYXBzLkxhdExuZykge1xuICAgIGlmICh0aGlzLl9hY3RpdmVDb250ZXh0TWVudSkge1xuICAgICAgdGhpcy5fYWN0aXZlQ29udGV4dE1lbnUuY2xvc2UoKVxuICAgICAgdGhpcy5fYWN0aXZlQ29udGV4dE1lbnUgPSBudWxsXG4gICAgfVxuXG4gICAgdGhpcy5fYXNzZXJ0SW5pdGlhbGl6ZWQoKVxuXG4gICAgbGV0IF9wb3NpdGlvbiA9IHBvc2l0aW9uXG4gICAgaWYgKCFfcG9zaXRpb24pIHtcbiAgICAgIF9wb3NpdGlvbiA9IGdldEZlYXR1cmVDZW50ZXIoZmVhdHVyZSlcbiAgICB9XG4gICAgaWYgKHRoaXMuX2ZlYXR1cmVDb250ZXh0TWVudSkge1xuICAgICAgdGhpcy5fYWN0aXZlQ29udGV4dE1lbnUgPSBuZXcgR29vZ2xlTWFwc0NvbnRleHRNZW51KFxuICAgICAgICB0aGlzLmdvb2dsZU1hcCxcbiAgICAgICAgdGhpcy5fZmVhdHVyZUNvbnRleHRNZW51LFxuICAgICAgICBfcG9zaXRpb24sXG4gICAgICAgIHRoaXMuX3ZjcixcbiAgICAgICAgdGhpcy5fbmdab25lLFxuICAgICAgICB0aGlzLmdvb2dsZU1hcC5kYXRhLFxuICAgICAgICBmZWF0dXJlLFxuICAgICAgKVxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBnZXRHZW9Kc29uKHJlbW92ZUFwcFByb3BlcnRpZXM6IGJvb2xlYW4gPSB0cnVlKTogUHJvbWlzZTxvYmplY3Q+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdGhpcy5fYXNzZXJ0SW5pdGlhbGl6ZWQoKVxuICAgICAgdGhpcy5nb29nbGVNYXAuZGF0YS50b0dlb0pzb24oZiA9PiB7XG4gICAgICAgIGlmIChyZW1vdmVBcHBQcm9wZXJ0aWVzKSB7XG4gICAgICAgICAgc3RyaXBBcHBGZWF0dXJlUHJvcGVydGllc0Zyb21Kc29uKGYpXG4gICAgICAgIH1cbiAgICAgICAgcmVzb2x2ZShmKVxuICAgICAgfSlcbiAgICB9KVxuICB9XG5cbiAgLyoqIEFzc2VydHMgdGhhdCB0aGUgbWFwIGhhcyBiZWVuIGluaXRpYWxpemVkLiAqL1xuICBwcml2YXRlIF9hc3NlcnRJbml0aWFsaXplZCgpOiBhc3NlcnRzIHRoaXMgaXMgV2l0aFJlcXVpcmVkPEdvb2dsZU1hcHNTZXJ2aWNlLCAnZ29vZ2xlTWFwJz4ge1xuICAgIGlmICghdGhpcy5nb29nbGVNYXAgJiYgKHR5cGVvZiBuZ0Rldk1vZGUgPT09ICd1bmRlZmluZWQnIHx8IG5nRGV2TW9kZSkpIHtcbiAgICAgIHRocm93IEVycm9yKFxuICAgICAgICAnQ2Fubm90IGFjY2VzcyBHb29nbGUgTWFwIGluZm9ybWF0aW9uIGJlZm9yZSB0aGUgQVBJIGhhcyBiZWVuIGluaXRpYWxpemVkLiAnICtcbiAgICAgICAgICAnUGxlYXNlIHdhaXQgZm9yIHRoZSBBUEkgdG8gbG9hZCBiZWZvcmUgdHJ5aW5nIHRvIGludGVyYWN0IHdpdGggaXQuJyxcbiAgICAgIClcbiAgICB9XG4gIH1cbn1cbiJdfQ==
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { ChangeDetectionStrategy, Component, Inject, Input, } from '@angular/core';
|
|
2
|
+
import { Subject } from 'rxjs';
|
|
3
|
+
import { takeUntil, tap } from 'rxjs/operators';
|
|
4
|
+
import { GoogleMapsControlsService } from './google-maps-controls.service';
|
|
5
|
+
import { GoogleMapsService } from './google-maps.service';
|
|
6
|
+
import { MAP_CONTROLS_SERVICE } from './map-controls-service';
|
|
7
|
+
export class TheSeamMapsControlComponent {
|
|
8
|
+
constructor(_googleMaps, _googleMapsControls) {
|
|
9
|
+
this._googleMaps = _googleMaps;
|
|
10
|
+
this._googleMapsControls = _googleMapsControls;
|
|
11
|
+
this._ngUnsubscribe = new Subject();
|
|
12
|
+
}
|
|
13
|
+
set def(value) {
|
|
14
|
+
if (value !== this._def) {
|
|
15
|
+
this._remove();
|
|
16
|
+
this._def = value;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
/** @ignore */
|
|
20
|
+
ngOnInit() {
|
|
21
|
+
this._googleMaps.mapReady$.pipe(tap(ready => {
|
|
22
|
+
if (ready) {
|
|
23
|
+
this._add();
|
|
24
|
+
}
|
|
25
|
+
else {
|
|
26
|
+
this._remove();
|
|
27
|
+
}
|
|
28
|
+
}), takeUntil(this._ngUnsubscribe)).subscribe();
|
|
29
|
+
}
|
|
30
|
+
/** @ignore */
|
|
31
|
+
ngOnDestroy() {
|
|
32
|
+
this._remove();
|
|
33
|
+
this._ngUnsubscribe.next();
|
|
34
|
+
this._ngUnsubscribe.complete();
|
|
35
|
+
}
|
|
36
|
+
_add() {
|
|
37
|
+
if (this._controlRef) {
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
if (this._def === null || this._def === undefined) {
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
this._controlRef = this._googleMapsControls.add(this._def);
|
|
44
|
+
}
|
|
45
|
+
_remove() {
|
|
46
|
+
var _a;
|
|
47
|
+
(_a = this._controlRef) === null || _a === void 0 ? void 0 : _a.destroy();
|
|
48
|
+
this._controlRef = undefined;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
TheSeamMapsControlComponent.decorators = [
|
|
52
|
+
{ type: Component, args: [{
|
|
53
|
+
selector: 'seam-map-control',
|
|
54
|
+
template: '',
|
|
55
|
+
changeDetection: ChangeDetectionStrategy.OnPush
|
|
56
|
+
},] }
|
|
57
|
+
];
|
|
58
|
+
TheSeamMapsControlComponent.ctorParameters = () => [
|
|
59
|
+
{ type: GoogleMapsService },
|
|
60
|
+
{ type: GoogleMapsControlsService, decorators: [{ type: Inject, args: [MAP_CONTROLS_SERVICE,] }] }
|
|
61
|
+
];
|
|
62
|
+
TheSeamMapsControlComponent.propDecorators = {
|
|
63
|
+
def: [{ type: Input }]
|
|
64
|
+
};
|
|
65
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFwLWNvbnRyb2wuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvdWktY29tbW9uL2dvb2dsZS1tYXBzL21hcC1jb250cm9sLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQ0wsdUJBQXVCLEVBQ3ZCLFNBQVMsRUFDVCxNQUFNLEVBQ04sS0FBSyxHQUVOLE1BQU0sZUFBZSxDQUFBO0FBQ3RCLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUE7QUFDOUIsT0FBTyxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQTtBQUUvQyxPQUFPLEVBQUUseUJBQXlCLEVBQWlCLE1BQU0sZ0NBQWdDLENBQUE7QUFDekYsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sdUJBQXVCLENBQUE7QUFDekQsT0FBTyxFQUFjLG9CQUFvQixFQUFFLE1BQU0sd0JBQXdCLENBQUE7QUFPekUsTUFBTSxPQUFPLDJCQUEyQjtJQWN0QyxZQUNtQixXQUE4QixFQUNBLG1CQUE4QztRQUQ1RSxnQkFBVyxHQUFYLFdBQVcsQ0FBbUI7UUFDQSx3QkFBbUIsR0FBbkIsbUJBQW1CLENBQTJCO1FBZjlFLG1CQUFjLEdBQUcsSUFBSSxPQUFPLEVBQVEsQ0FBQTtJQWdCakQsQ0FBQztJQVpMLElBQ0ksR0FBRyxDQUFDLEtBQW9DO1FBQzFDLElBQUksS0FBSyxLQUFLLElBQUksQ0FBQyxJQUFJLEVBQUU7WUFDdkIsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFBO1lBQ2QsSUFBSSxDQUFDLElBQUksR0FBRyxLQUFLLENBQUE7U0FDbEI7SUFDSCxDQUFDO0lBUUQsY0FBYztJQUNkLFFBQVE7UUFDTixJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQzdCLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUNWLElBQUksS0FBSyxFQUFFO2dCQUNULElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQTthQUNaO2lCQUFNO2dCQUNMLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQTthQUNmO1FBQ0gsQ0FBQyxDQUFDLEVBQ0YsU0FBUyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FDL0IsQ0FBQyxTQUFTLEVBQUUsQ0FBQTtJQUNmLENBQUM7SUFFRCxjQUFjO0lBQ2QsV0FBVztRQUNULElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQTtRQUVkLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLENBQUE7UUFDMUIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxRQUFRLEVBQUUsQ0FBQTtJQUNoQyxDQUFDO0lBRU8sSUFBSTtRQUNWLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRTtZQUNwQixPQUFNO1NBQ1A7UUFFRCxJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssSUFBSSxJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssU0FBUyxFQUFFO1lBQ2pELE9BQU07U0FDUDtRQUVELElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUE7SUFDNUQsQ0FBQztJQUVPLE9BQU87O1FBQ2IsTUFBQSxJQUFJLENBQUMsV0FBVywwQ0FBRSxPQUFPLEVBQUUsQ0FBQTtRQUMzQixJQUFJLENBQUMsV0FBVyxHQUFHLFNBQVMsQ0FBQTtJQUM5QixDQUFDOzs7WUE3REYsU0FBUyxTQUFDO2dCQUNULFFBQVEsRUFBRSxrQkFBa0I7Z0JBQzVCLFFBQVEsRUFBRSxFQUFFO2dCQUNaLGVBQWUsRUFBRSx1QkFBdUIsQ0FBQyxNQUFNO2FBQ2hEOzs7WUFQUSxpQkFBaUI7WUFEakIseUJBQXlCLHVCQXlCN0IsTUFBTSxTQUFDLG9CQUFvQjs7O2tCQVg3QixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgT25Jbml0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSdcbmltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDb21wb25lbnQsXG4gIEluamVjdCxcbiAgSW5wdXQsXG4gIE9uRGVzdHJveSxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSdcbmltcG9ydCB7IFN1YmplY3QgfSBmcm9tICdyeGpzJ1xuaW1wb3J0IHsgdGFrZVVudGlsLCB0YXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycydcblxuaW1wb3J0IHsgR29vZ2xlTWFwc0NvbnRyb2xzU2VydmljZSwgTWFwQ29udHJvbFJlZiB9IGZyb20gJy4vZ29vZ2xlLW1hcHMtY29udHJvbHMuc2VydmljZSdcbmltcG9ydCB7IEdvb2dsZU1hcHNTZXJ2aWNlIH0gZnJvbSAnLi9nb29nbGUtbWFwcy5zZXJ2aWNlJ1xuaW1wb3J0IHsgTWFwQ29udHJvbCwgTUFQX0NPTlRST0xTX1NFUlZJQ0UgfSBmcm9tICcuL21hcC1jb250cm9scy1zZXJ2aWNlJ1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdzZWFtLW1hcC1jb250cm9sJyxcbiAgdGVtcGxhdGU6ICcnLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaFxufSlcbmV4cG9ydCBjbGFzcyBUaGVTZWFtTWFwc0NvbnRyb2xDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG4gIHByaXZhdGUgcmVhZG9ubHkgX25nVW5zdWJzY3JpYmUgPSBuZXcgU3ViamVjdDx2b2lkPigpXG5cbiAgcHJpdmF0ZSBfY29udHJvbFJlZj86IE1hcENvbnRyb2xSZWZcblxuICBASW5wdXQoKVxuICBzZXQgZGVmKHZhbHVlOiBNYXBDb250cm9sIHwgbnVsbCB8IHVuZGVmaW5lZCkge1xuICAgIGlmICh2YWx1ZSAhPT0gdGhpcy5fZGVmKSB7XG4gICAgICB0aGlzLl9yZW1vdmUoKVxuICAgICAgdGhpcy5fZGVmID0gdmFsdWVcbiAgICB9XG4gIH1cbiAgX2RlZjogTWFwQ29udHJvbCB8IG51bGwgfCB1bmRlZmluZWRcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9nb29nbGVNYXBzOiBHb29nbGVNYXBzU2VydmljZSxcbiAgICBASW5qZWN0KE1BUF9DT05UUk9MU19TRVJWSUNFKSBwcml2YXRlIHJlYWRvbmx5IF9nb29nbGVNYXBzQ29udHJvbHM6IEdvb2dsZU1hcHNDb250cm9sc1NlcnZpY2UsXG4gICkgeyB9XG5cbiAgLyoqIEBpZ25vcmUgKi9cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5fZ29vZ2xlTWFwcy5tYXBSZWFkeSQucGlwZShcbiAgICAgIHRhcChyZWFkeSA9PiB7XG4gICAgICAgIGlmIChyZWFkeSkge1xuICAgICAgICAgIHRoaXMuX2FkZCgpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5fcmVtb3ZlKClcbiAgICAgICAgfVxuICAgICAgfSksXG4gICAgICB0YWtlVW50aWwodGhpcy5fbmdVbnN1YnNjcmliZSlcbiAgICApLnN1YnNjcmliZSgpXG4gIH1cblxuICAvKiogQGlnbm9yZSAqL1xuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLl9yZW1vdmUoKVxuXG4gICAgdGhpcy5fbmdVbnN1YnNjcmliZS5uZXh0KClcbiAgICB0aGlzLl9uZ1Vuc3Vic2NyaWJlLmNvbXBsZXRlKClcbiAgfVxuXG4gIHByaXZhdGUgX2FkZCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fY29udHJvbFJlZikge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX2RlZiA9PT0gbnVsbCB8fCB0aGlzLl9kZWYgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgdGhpcy5fY29udHJvbFJlZiA9IHRoaXMuX2dvb2dsZU1hcHNDb250cm9scy5hZGQodGhpcy5fZGVmKVxuICB9XG5cbiAgcHJpdmF0ZSBfcmVtb3ZlKCk6IHZvaWQge1xuICAgIHRoaXMuX2NvbnRyb2xSZWY/LmRlc3Ryb3koKVxuICAgIHRoaXMuX2NvbnRyb2xSZWYgPSB1bmRlZmluZWRcbiAgfVxufVxuIl19
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { InjectionToken } from '@angular/core';
|
|
2
|
+
export const MAP_CONTROLS_SERVICE = new InjectionToken('MAP_CONTROLS_SERVICE');
|
|
3
|
+
export const MAP_CONTROL_DATA = new InjectionToken('MAP_CONTROL_DATA');
|
|
4
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFwLWNvbnRyb2xzLXNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy91aS1jb21tb24vZ29vZ2xlLW1hcHMvbWFwLWNvbnRyb2xzLXNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGVBQWUsQ0FBQTtBQWM5QyxNQUFNLENBQUMsTUFBTSxvQkFBb0IsR0FBRyxJQUFJLGNBQWMsQ0FBcUIsc0JBQXNCLENBQUMsQ0FBQTtBQUVsRyxNQUFNLENBQUMsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLGNBQWMsQ0FBTSxrQkFBa0IsQ0FBQyxDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0aW9uVG9rZW4gfSBmcm9tICdAYW5ndWxhci9jb3JlJ1xuXG5pbXBvcnQgeyBDb21wb25lbnRUeXBlIH0gZnJvbSAnQHRoZXNlYW0vdWktY29tbW9uL21vZGVscydcblxuZXhwb3J0IGludGVyZmFjZSBNYXBDb250cm9sPFREYXRhID0gYW55PiB7XG4gIGNvbXBvbmVudDogQ29tcG9uZW50VHlwZTxhbnk+XG4gIGRhdGE/OiBURGF0YVxuICBwb3NpdGlvbj86IGdvb2dsZS5tYXBzLkNvbnRyb2xQb3NpdGlvblxufVxuXG5leHBvcnQgaW50ZXJmYWNlIE1hcENvbnRyb2xzU2VydmljZSB7XG4gIGFkZChjb250cm9sOiBNYXBDb250cm9sKTogdm9pZFxufVxuXG5leHBvcnQgY29uc3QgTUFQX0NPTlRST0xTX1NFUlZJQ0UgPSBuZXcgSW5qZWN0aW9uVG9rZW48TWFwQ29udHJvbHNTZXJ2aWNlPignTUFQX0NPTlRST0xTX1NFUlZJQ0UnKVxuXG5leHBvcnQgY29uc3QgTUFQX0NPTlRST0xfREFUQSA9IG5ldyBJbmplY3Rpb25Ub2tlbjxhbnk+KCdNQVBfQ09OVFJPTF9EQVRBJylcbiJdfQ==
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
import { ChangeDetectionStrategy, Component, ElementRef, NgZone, Renderer2, } from '@angular/core';
|
|
2
|
+
import { Subject } from 'rxjs';
|
|
3
|
+
import { takeUntil, tap } from 'rxjs/operators';
|
|
4
|
+
import { readGeoFile } from '@theseam/ui-common/utils';
|
|
5
|
+
import { GoogleMapsService } from '../google-maps.service';
|
|
6
|
+
import { MapValueManagerService, MapValueSource } from '../map-value-manager.service';
|
|
7
|
+
/**
|
|
8
|
+
*
|
|
9
|
+
*/
|
|
10
|
+
export class TheSeamMapFileDropComponent {
|
|
11
|
+
constructor(_elementRef, _ngZone, _googleMaps, _mapValueManager, _renderer) {
|
|
12
|
+
this._elementRef = _elementRef;
|
|
13
|
+
this._ngZone = _ngZone;
|
|
14
|
+
this._googleMaps = _googleMaps;
|
|
15
|
+
this._mapValueManager = _mapValueManager;
|
|
16
|
+
this._renderer = _renderer;
|
|
17
|
+
this._ngUnsubscribe = new Subject();
|
|
18
|
+
this._listeners = [];
|
|
19
|
+
this._globalDragInProgress = false;
|
|
20
|
+
this._handleDragOverEvent = (event) => {
|
|
21
|
+
if (!this._dropAllowed()) {
|
|
22
|
+
return;
|
|
23
|
+
}
|
|
24
|
+
if (!this._isSupportedDataTransferTypes(event.dataTransfer)) {
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
event.preventDefault();
|
|
28
|
+
event.dataTransfer.dropEffect = 'copy';
|
|
29
|
+
};
|
|
30
|
+
this._handleDropEvent = (event) => {
|
|
31
|
+
if (!this._dropAllowed()) {
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
event.preventDefault();
|
|
35
|
+
event.stopPropagation();
|
|
36
|
+
this._renderer.setStyle(this._elementRef.nativeElement, 'display', 'none');
|
|
37
|
+
// TODO: Show error if multiple files?
|
|
38
|
+
if (!this._isSupportedDataTransfer(event.dataTransfer)) {
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
const item = event.dataTransfer.items[0];
|
|
42
|
+
const file = item.getAsFile();
|
|
43
|
+
readGeoFile(file).then(json => {
|
|
44
|
+
this._mapValueManager.setValue(json, MapValueSource.Input);
|
|
45
|
+
});
|
|
46
|
+
};
|
|
47
|
+
this._handleDragEnterEvent = (event) => {
|
|
48
|
+
if (!this._dropAllowed()) {
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
if (!this._isSupportedDataTransferTypes(event.dataTransfer)) {
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
this._renderer.setStyle(this._elementRef.nativeElement, 'display', 'block');
|
|
55
|
+
};
|
|
56
|
+
this._handleDragLeaveEvent = (event) => {
|
|
57
|
+
if (!this._dropAllowed()) {
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
this._renderer.setStyle(this._elementRef.nativeElement, 'display', 'none');
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
/** @ignore */
|
|
64
|
+
ngOnInit() {
|
|
65
|
+
this._googleMaps.mapReady$.pipe(tap(ready => {
|
|
66
|
+
if (ready) {
|
|
67
|
+
this._enableFileDrop();
|
|
68
|
+
}
|
|
69
|
+
else {
|
|
70
|
+
this._disableFileDrop();
|
|
71
|
+
}
|
|
72
|
+
}), takeUntil(this._ngUnsubscribe)).subscribe();
|
|
73
|
+
}
|
|
74
|
+
/** @ignore */
|
|
75
|
+
ngOnDestroy() {
|
|
76
|
+
this._disableFileDrop();
|
|
77
|
+
this._ngUnsubscribe.next();
|
|
78
|
+
this._ngUnsubscribe.complete();
|
|
79
|
+
}
|
|
80
|
+
_enableFileDrop() {
|
|
81
|
+
const divElement = this._googleMaps.getDiv();
|
|
82
|
+
if (this._mapDiv === divElement) {
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
85
|
+
if (this._mapDiv !== undefined) {
|
|
86
|
+
// Disable file drop on previous map div.
|
|
87
|
+
this._disableFileDrop();
|
|
88
|
+
}
|
|
89
|
+
this._mapDiv = divElement;
|
|
90
|
+
this._ngZone.runOutsideAngular(() => {
|
|
91
|
+
this._listeners.push(this._renderer.listen('document', 'dragstart', (event) => {
|
|
92
|
+
this._globalDragInProgress = true;
|
|
93
|
+
}));
|
|
94
|
+
this._listeners.push(this._renderer.listen('document', 'dragend', (event) => {
|
|
95
|
+
this._globalDragInProgress = false;
|
|
96
|
+
}));
|
|
97
|
+
this._listeners.push(this._renderer.listen(divElement, 'dragover', this._handleDragOverEvent));
|
|
98
|
+
this._listeners.push(this._renderer.listen(this._elementRef.nativeElement, 'dragover', this._handleDragOverEvent));
|
|
99
|
+
this._listeners.push(this._renderer.listen(this._elementRef.nativeElement, 'drop', this._handleDropEvent));
|
|
100
|
+
this._listeners.push(this._renderer.listen(divElement, 'dragenter', this._handleDragEnterEvent));
|
|
101
|
+
this._listeners.push(this._renderer.listen(this._elementRef.nativeElement, 'dragleave', this._handleDragLeaveEvent));
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
_disableFileDrop() {
|
|
105
|
+
if (this._listeners.length > 0) {
|
|
106
|
+
this._listeners.forEach(l => l());
|
|
107
|
+
this._listeners = [];
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
_dropAllowed() {
|
|
111
|
+
return !this._globalDragInProgress;
|
|
112
|
+
}
|
|
113
|
+
_isSupportedDataTransfer(dataTransfer) {
|
|
114
|
+
return dataTransfer.files.length === 1 && dataTransfer.types[0] === 'Files';
|
|
115
|
+
}
|
|
116
|
+
_isSupportedDataTransferTypes(dataTransfer) {
|
|
117
|
+
return dataTransfer.types[0] === 'Files';
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
TheSeamMapFileDropComponent.decorators = [
|
|
121
|
+
{ type: Component, args: [{
|
|
122
|
+
selector: 'seam-map-file-drop',
|
|
123
|
+
template: "",
|
|
124
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
125
|
+
styles: [":host{display:none;position:absolute;top:0;left:0;width:100%;height:100%;z-index:9999!important;background-color:#1e1e1eb3}\n"]
|
|
126
|
+
},] }
|
|
127
|
+
];
|
|
128
|
+
TheSeamMapFileDropComponent.ctorParameters = () => [
|
|
129
|
+
{ type: ElementRef },
|
|
130
|
+
{ type: NgZone },
|
|
131
|
+
{ type: GoogleMapsService },
|
|
132
|
+
{ type: MapValueManagerService },
|
|
133
|
+
{ type: Renderer2 }
|
|
134
|
+
];
|
|
135
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFwLWZpbGUtZHJvcC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy91aS1jb21tb24vZ29vZ2xlLW1hcHMvbWFwLWZpbGUtZHJvcC9tYXAtZmlsZS1kcm9wLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsdUJBQXVCLEVBQ3ZCLFNBQVMsRUFDVCxVQUFVLEVBQ1YsTUFBTSxFQUdOLFNBQVMsR0FDVixNQUFNLGVBQWUsQ0FBQTtBQUN0QixPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFBO0FBQzlCLE9BQU8sRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUE7QUFFL0MsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDBCQUEwQixDQUFBO0FBRXRELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHdCQUF3QixDQUFBO0FBQzFELE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxjQUFjLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQTtBQUVyRjs7R0FFRztBQU9ILE1BQU0sT0FBTywyQkFBMkI7SUFhdEMsWUFDbUIsV0FBdUIsRUFDdkIsT0FBZSxFQUNmLFdBQThCLEVBQzlCLGdCQUF3QyxFQUN4QyxTQUFvQjtRQUpwQixnQkFBVyxHQUFYLFdBQVcsQ0FBWTtRQUN2QixZQUFPLEdBQVAsT0FBTyxDQUFRO1FBQ2YsZ0JBQVcsR0FBWCxXQUFXLENBQW1CO1FBQzlCLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBd0I7UUFDeEMsY0FBUyxHQUFULFNBQVMsQ0FBVztRQWhCdEIsbUJBQWMsR0FBRyxJQUFJLE9BQU8sRUFBUSxDQUFBO1FBTzdDLGVBQVUsR0FBb0IsRUFBRSxDQUFBO1FBRWhDLDBCQUFxQixHQUFZLEtBQUssQ0FBQTtRQW9FN0IseUJBQW9CLEdBQUcsQ0FBQyxLQUFVLEVBQUUsRUFBRTtZQUNyRCxJQUFJLENBQUMsSUFBSSxD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QUFFLHVCQUF1QixDQUFDLE1BQU07O2FBQ2hEOzs7WUF0QkMsVUFBVTtZQUNWLE1BQU07WUFVQyxpQkFBaUI7WUFDakIsc0JBQXNCO1lBUjdCLFNBQVMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ29tcG9uZW50LFxuICBFbGVtZW50UmVmLFxuICBOZ1pvbmUsXG4gIE9uRGVzdHJveSxcbiAgT25Jbml0LFxuICBSZW5kZXJlcjIsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnXG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSAncnhqcydcbmltcG9ydCB7IHRha2VVbnRpbCwgdGFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnXG5cbmltcG9ydCB7IHJlYWRHZW9GaWxlIH0gZnJvbSAnQHRoZXNlYW0vdWktY29tbW9uL3V0aWxzJ1xuXG5pbXBvcnQgeyBHb29nbGVNYXBzU2VydmljZSB9IGZyb20gJy4uL2dvb2dsZS1tYXBzLnNlcnZpY2UnXG5pbXBvcnQgeyBNYXBWYWx1ZU1hbmFnZXJTZXJ2aWNlLCBNYXBWYWx1ZVNvdXJjZSB9IGZyb20gJy4uL21hcC12YWx1ZS1tYW5hZ2VyLnNlcnZpY2UnXG5cbi8qKlxuICpcbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnc2VhbS1tYXAtZmlsZS1kcm9wJyxcbiAgdGVtcGxhdGVVcmw6ICcuL21hcC1maWxlLWRyb3AuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9tYXAtZmlsZS1kcm9wLmNvbXBvbmVudC5zY3NzJ10sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoXG59KVxuZXhwb3J0IGNsYXNzIFRoZVNlYW1NYXBGaWxlRHJvcENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcblxuICBwcml2YXRlIHJlYWRvbmx5IF9uZ1Vuc3Vic2NyaWJlID0gbmV3IFN1YmplY3Q8dm9pZD4oKVxuXG4gIC8qKlxuICAgKiBNYXAgZWxlbWVudCBkcmFnIGV2ZW50cyBhZGRlZCB0by5cbiAgICovXG4gIHByaXZhdGUgX21hcERpdjogSFRNTERpdkVsZW1lbnQgfCB1bmRlZmluZWRcblxuICBwcml2YXRlIF9saXN0ZW5lcnM6ICgoKSA9PiB2b2lkKVtdICA9IFtdXG5cbiAgcHJpdmF0ZSBfZ2xvYmFsRHJhZ0luUHJvZ3Jlc3M6IGJvb2xlYW4gPSBmYWxzZVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2VsZW1lbnRSZWY6IEVsZW1lbnRSZWYsXG4gICAgcHJpdmF0ZSByZWFkb25seSBfbmdab25lOiBOZ1pvbmUsXG4gICAgcHJpdmF0ZSByZWFkb25seSBfZ29vZ2xlTWFwczogR29vZ2xlTWFwc1NlcnZpY2UsXG4gICAgcHJpdmF0ZSByZWFkb25seSBfbWFwVmFsdWVNYW5hZ2VyOiBNYXBWYWx1ZU1hbmFnZXJTZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX3JlbmRlcmVyOiBSZW5kZXJlcjJcbiAgKSB7IH1cblxuICAvKiogQGlnbm9yZSAqL1xuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLl9nb29nbGVNYXBzLm1hcFJlYWR5JC5waXBlKFxuICAgICAgdGFwKHJlYWR5ID0+IHtcbiAgICAgICAgaWYgKHJlYWR5KSB7XG4gICAgICAgICAgdGhpcy5fZW5hYmxlRmlsZURyb3AoKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuX2Rpc2FibGVGaWxlRHJvcCgpXG4gICAgICAgIH1cbiAgICAgIH0pLFxuICAgICAgdGFrZVVudGlsKHRoaXMuX25nVW5zdWJzY3JpYmUpXG4gICAgKS5zdWJzY3JpYmUoKVxuICB9XG5cbiAgLyoqIEBpZ25vcmUgKi9cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgdGhpcy5fZGlzYWJsZUZpbGVEcm9wKClcblxuICAgIHRoaXMuX25nVW5zdWJzY3JpYmUubmV4dCgpXG4gICAgdGhpcy5fbmdVbnN1YnNjcmliZS5jb21wbGV0ZSgpXG4gIH1cblxuICBwcml2YXRlIF9lbmFibGVGaWxlRHJvcCgpOiB2b2lkIHtcbiAgICBjb25zdCBkaXZFbGVtZW50ID0gdGhpcy5fZ29vZ2xlTWFwcy5nZXREaXYoKVxuICAgIGlmICh0aGlzLl9tYXBEaXYgPT09IGRpdkVsZW1lbnQpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmICh0aGlzLl9tYXBEaXYgIT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gRGlzYWJsZSBmaWxlIGRyb3Agb24gcHJldmlvdXMgbWFwIGRpdi5cbiAgICAgIHRoaXMuX2Rpc2FibGVGaWxlRHJvcCgpXG4gICAgfVxuXG4gICAgdGhpcy5fbWFwRGl2ID0gZGl2RWxlbWVudFxuICAgIHRoaXMuX25nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICB0aGlzLl9saXN0ZW5lcnMucHVzaCh0aGlzLl9yZW5kZXJlci5saXN0ZW4oJ2RvY3VtZW50JywgJ2RyYWdzdGFydCcsIChldmVudDogRXZlbnQpID0+IHtcbiAgICAgICAgdGhpcy5fZ2xvYmFsRHJhZ0luUHJvZ3Jlc3MgPSB0cnVlXG4gICAgICB9KSlcblxuICAgICAgdGhpcy5fbGlzdGVuZXJzLnB1c2godGhpcy5fcmVuZGVyZXIubGlzdGVuKCdkb2N1bWVudCcsICdkcmFnZW5kJywgKGV2ZW50OiBFdmVudCkgPT4ge1xuICAgICAgICB0aGlzLl9nbG9iYWxEcmFnSW5Qcm9ncmVzcyA9IGZhbHNlXG4gICAgICB9KSlcblxuICAgICAgdGhpcy5fbGlzdGVuZXJzLnB1c2godGhpcy5fcmVuZGVyZXIubGlzdGVuKGRpdkVsZW1lbnQsICdkcmFnb3ZlcicsIHRoaXMuX2hhbmRsZURyYWdPdmVyRXZlbnQpKVxuICAgICAgdGhpcy5fbGlzdGVuZXJzLnB1c2godGhpcy5fcmVuZGVyZXIubGlzdGVuKHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudCwgJ2RyYWdvdmVyJywgdGhpcy5faGFuZGxlRHJhZ092ZXJFdmVudCkpXG4gICAgICB0aGlzLl9saXN0ZW5lcnMucHVzaCh0aGlzLl9yZW5kZXJlci5saXN0ZW4odGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LCAnZHJvcCcsIHRoaXMuX2hhbmRsZURyb3BFdmVudCkpXG4gICAgICB0aGlzLl9saXN0ZW5lcnMucHVzaCh0aGlzLl9yZW5kZXJlci5saXN0ZW4oZGl2RWxlbWVudCwgJ2RyYWdlbnRlcicsIHRoaXMuX2hhbmRsZURyYWdFbnRlckV2ZW50KSlcbiAgICAgIHRoaXMuX2xpc3RlbmVycy5wdXNoKHRoaXMuX3JlbmRlcmVyLmxpc3Rlbih0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsICdkcmFnbGVhdmUnLCB0aGlzLl9oYW5kbGVEcmFnTGVhdmVFdmVudCkpXG4gICAgfSlcbiAgfVxuXG4gIHByaXZhdGUgX2Rpc2FibGVGaWxlRHJvcCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fbGlzdGVuZXJzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMuX2xpc3RlbmVycy5mb3JFYWNoKGwgPT4gbCgpKVxuICAgICAgdGhpcy5fbGlzdGVuZXJzID0gW11cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHJlYWRvbmx5IF9oYW5kbGVEcmFnT3ZlckV2ZW50ID0gKGV2ZW50OiBhbnkpID0+IHtcbiAgICBpZiAoIXRoaXMuX2Ryb3BBbGxvd2VkKCkpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmICghdGhpcy5faXNTdXBwb3J0ZWREYXRhVHJhbnNmZXJUeXBlcyhldmVudC5kYXRhVHJhbnNmZXIpKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpXG4gICAgZXZlbnQuZGF0YVRyYW5zZmVyLmRyb3BFZmZlY3QgPSAnY29weSdcbiAgfVxuXG4gIHByaXZhdGUgcmVhZG9ubHkgX2hhbmRsZURyb3BFdmVudCA9IChldmVudDogYW55KSA9PiB7XG4gICAgaWYgKCF0aGlzLl9kcm9wQWxsb3dlZCgpKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpXG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcbiAgICB0aGlzLl9yZW5kZXJlci5zZXRTdHlsZSh0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsICdkaXNwbGF5JywgJ25vbmUnKVxuXG4gICAgLy8gVE9ETzogU2hvdyBlcnJvciBpZiBtdWx0aXBsZSBmaWxlcz9cbiAgICBpZiAoIXRoaXMuX2lzU3VwcG9ydGVkRGF0YVRyYW5zZmVyKGV2ZW50LmRhdGFUcmFuc2ZlcikpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IGl0ZW0gPSBldmVudC5kYXRhVHJhbnNmZXIuaXRlbXNbMF1cbiAgICBjb25zdCBmaWxlID0gaXRlbS5nZXRBc0ZpbGUoKVxuICAgIHJlYWRHZW9GaWxlKGZpbGUpLnRoZW4oanNvbiA9PiB7XG4gICAgICB0aGlzLl9tYXBWYWx1ZU1hbmFnZXIuc2V0VmFsdWUoanNvbiwgTWFwVmFsdWVTb3VyY2UuSW5wdXQpXG4gICAgfSlcbiAgfVxuXG4gIHByaXZhdGUgcmVhZG9ubHkgX2hhbmRsZURyYWdFbnRlckV2ZW50ID0gKGV2ZW50OiBhbnkpID0+IHtcbiAgICBpZiAoIXRoaXMuX2Ryb3BBbGxvd2VkKCkpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmICghdGhpcy5faXNTdXBwb3J0ZWREYXRhVHJhbnNmZXJUeXBlcyhldmVudC5kYXRhVHJhbnNmZXIpKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICB0aGlzLl9yZW5kZXJlci5zZXRTdHlsZSh0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsICdkaXNwbGF5JywgJ2Jsb2NrJylcbiAgfVxuXG4gIHByaXZhdGUgcmVhZG9ubHkgX2hhbmRsZURyYWdMZWF2ZUV2ZW50ID0gKGV2ZW50OiBhbnkpID0+IHtcbiAgICBpZiAoIXRoaXMuX2Ryb3BBbGxvd2VkKCkpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHRoaXMuX3JlbmRlcmVyLnNldFN0eWxlKHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudCwgJ2Rpc3BsYXknLCAnbm9uZScpXG4gIH1cblxuICBwcml2YXRlIF9kcm9wQWxsb3dlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gIXRoaXMuX2dsb2JhbERyYWdJblByb2dyZXNzXG4gIH1cblxuICBwcml2YXRlIF9pc1N1cHBvcnRlZERhdGFUcmFuc2ZlcihkYXRhVHJhbnNmZXI6IERhdGFUcmFuc2Zlcik6IGJvb2xlYW4ge1xuICAgIHJldHVybiBkYXRhVHJhbnNmZXIuZmlsZXMubGVuZ3RoID09PSAxICYmIGRhdGFUcmFuc2Zlci50eXBlc1swXSA9PT0gJ0ZpbGVzJ1xuICB9XG5cbiAgcHJpdmF0ZSBfaXNTdXBwb3J0ZWREYXRhVHJhbnNmZXJUeXBlcyhkYXRhVHJhbnNmZXI6IERhdGFUcmFuc2Zlcik6IGJvb2xlYW4ge1xuICAgIHJldHVybiBkYXRhVHJhbnNmZXIudHlwZXNbMF0gPT09ICdGaWxlcydcbiAgfVxuXG59XG4iXX0=
|