@theseam/ui-common 0.2.17 → 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 -0
- package/breadcrumbs/breadcrumbs/breadcrumbs.component.scss +10 -0
- package/breadcrumbs/styles/_utilities.scss +3 -0
- package/breadcrumbs/styles/_variables.scss +1 -0
- package/breadcrumbs/theseam-ui-common-breadcrumbs.metadata.json +1 -1
- package/bundles/theseam-ui-common-breadcrumbs.umd.js +2 -1
- package/bundles/theseam-ui-common-breadcrumbs.umd.js.map +1 -1
- 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-framework.umd.js +18 -15
- package/bundles/theseam-ui-common-framework.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-scrollbar.umd.js +1 -1
- package/bundles/theseam-ui-common-scrollbar.umd.js.map +1 -1
- package/bundles/theseam-ui-common-tel-input.umd.js +59 -7
- package/bundles/theseam-ui-common-tel-input.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/bundles/theseam-ui-common-viewers.umd.js +269 -4
- package/bundles/theseam-ui-common-viewers.umd.js.map +1 -1
- package/bundles/theseam-ui-common-widget.umd.js +1 -1
- package/esm2015/breadcrumbs/breadcrumbs/breadcrumbs.component.js +4 -3
- package/esm2015/form-field/input.directive.js +2 -2
- package/esm2015/framework/base-layout/base-layout.component.js +3 -3
- package/esm2015/framework/top-bar/top-bar-menu-button/top-bar-menu-button.component.js +5 -5
- package/esm2015/framework/top-bar/top-bar-title/top-bar-title.component.js +4 -3
- package/esm2015/framework/top-bar/top-bar.component.js +10 -8
- 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/scrollbar/overlay-scrollbar.directive.js +2 -2
- package/esm2015/tel-input/tel-input/tel-input.component.js +10 -2
- package/esm2015/tel-input/tel-input.directive.js +50 -5
- 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/esm2015/viewers/html-template-viewer/html-template-viewer.component.js +219 -0
- package/esm2015/viewers/html-template-viewer/html-template-viewer.module.js +23 -0
- package/esm2015/viewers/html-template-viewer/index.js +3 -0
- package/esm2015/viewers/public-api.js +2 -1
- package/esm2015/widget/widget/widget.component.js +1 -1
- package/fesm2015/theseam-ui-common-breadcrumbs.js +3 -2
- package/fesm2015/theseam-ui-common-breadcrumbs.js.map +1 -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-framework.js +15 -12
- package/fesm2015/theseam-ui-common-framework.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-scrollbar.js +1 -1
- package/fesm2015/theseam-ui-common-scrollbar.js.map +1 -1
- package/fesm2015/theseam-ui-common-tel-input.js +58 -6
- package/fesm2015/theseam-ui-common-tel-input.js.map +1 -1
- package/fesm2015/theseam-ui-common-utils.js +477 -94
- package/fesm2015/theseam-ui-common-utils.js.map +1 -1
- package/fesm2015/theseam-ui-common-viewers.js +237 -2
- package/fesm2015/theseam-ui-common-viewers.js.map +1 -1
- package/fesm2015/theseam-ui-common-widget.js +1 -1
- package/form-field/theseam-ui-common-form-field.metadata.json +1 -1
- package/framework/base-layout/base-layout.component.scss +14 -0
- package/framework/base-layout/styles/_variables.scss +14 -0
- package/framework/theseam-ui-common-framework.metadata.json +1 -1
- package/framework/top-bar/_top-bar-theme.scss +5 -0
- package/framework/top-bar/styles/_utilities.scss +3 -0
- package/framework/top-bar/styles/_variables.scss +18 -0
- package/framework/top-bar/top-bar-menu-button/top-bar-menu-button.component.d.ts +3 -1
- package/framework/top-bar/top-bar-menu-button/top-bar-menu-button.component.scss +15 -0
- package/framework/top-bar/top-bar-title/top-bar-title.component.scss +6 -0
- package/framework/top-bar/top-bar.component.d.ts +3 -0
- package/framework/top-bar/top-bar.component.scss +39 -0
- 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/tel-input/tel-input.directive.d.ts +7 -3
- package/tel-input/theseam-ui-common-tel-input.metadata.json +1 -1
- 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
- package/viewers/html-template-viewer/html-template-viewer.component.d.ts +67 -0
- package/viewers/html-template-viewer/html-template-viewer.module.d.ts +2 -0
- package/viewers/html-template-viewer/index.d.ts +2 -0
- package/viewers/public-api.d.ts +1 -0
- package/viewers/theseam-ui-common-viewers.metadata.json +1 -1
- package/widget/styles/_variables.scss +2 -0
- package/widget/theseam-ui-common-widget.metadata.json +1 -1
- package/widget/widget/widget.component.scss +2 -0
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
import { coerceBooleanProperty } from '@angular/cdk/coercion';
|
|
2
|
+
import { Observable } from 'rxjs';
|
|
3
|
+
import { notNullOrUndefined } from '@theseam/ui-common/utils';
|
|
4
|
+
import booleanContains from '@turf/boolean-contains';
|
|
5
|
+
import { multiPolygon as turfjsMultiPolygon, polygon as turfjsPolygon, } from '@turf/helpers';
|
|
6
|
+
export var AppFeaturePropertyName;
|
|
7
|
+
(function (AppFeaturePropertyName) {
|
|
8
|
+
AppFeaturePropertyName["IsSelected"] = "__app__isSelected";
|
|
9
|
+
})(AppFeaturePropertyName || (AppFeaturePropertyName = {}));
|
|
10
|
+
export function isAppFeatureProperty(propertyName) {
|
|
11
|
+
return Object.values(AppFeaturePropertyName)
|
|
12
|
+
.findIndex(value => value === propertyName) !== -1;
|
|
13
|
+
}
|
|
14
|
+
export function isFeatureSelected(feature) {
|
|
15
|
+
const isSelected = feature.getProperty(AppFeaturePropertyName.IsSelected);
|
|
16
|
+
return coerceBooleanProperty(isSelected);
|
|
17
|
+
}
|
|
18
|
+
export function setFeatureSelected(feature, isSelected) {
|
|
19
|
+
feature.setProperty(AppFeaturePropertyName.IsSelected, isSelected);
|
|
20
|
+
}
|
|
21
|
+
// TODO: Check performance of cloning a google.maps.Data instance, so the
|
|
22
|
+
// properties can be removed with the google maps api, instead of on the
|
|
23
|
+
// resulting json.
|
|
24
|
+
export function stripAppFeaturePropertiesFromJson(json) {
|
|
25
|
+
if (notNullOrUndefined(json) && Array.isArray(json === null || json === void 0 ? void 0 : json.features)) {
|
|
26
|
+
for (const feature of json.features) {
|
|
27
|
+
if (notNullOrUndefined(feature === null || feature === void 0 ? void 0 : feature.properties)) {
|
|
28
|
+
for (const k of Object.keys(feature.properties)) {
|
|
29
|
+
if (isAppFeatureProperty(k)) {
|
|
30
|
+
feature.properties[k] = undefined;
|
|
31
|
+
delete feature.properties[k];
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Searches for a Feature in Data that contains the provided Feature and can use
|
|
40
|
+
* it as a cutout area.
|
|
41
|
+
*/
|
|
42
|
+
export function getPossibleExteriorFeature(data, feature) {
|
|
43
|
+
let exteriorPolygonFeature;
|
|
44
|
+
data.forEach(f => {
|
|
45
|
+
if (f !== feature && (f.getGeometry().getType() === 'Polygon' && featureContains(f, feature))) {
|
|
46
|
+
exteriorPolygonFeature = f;
|
|
47
|
+
}
|
|
48
|
+
});
|
|
49
|
+
return exteriorPolygonFeature;
|
|
50
|
+
}
|
|
51
|
+
export function addInnerFeatureCutoutToExteriorFeature(exteriorFeature, innerFeature) {
|
|
52
|
+
// NOTE: Other geometries may support cutouts, but our map shapes editor only
|
|
53
|
+
// supports polygons currently, so we will need to handle other geometry types
|
|
54
|
+
// here if we start allowing users to draw shapes other than polygon.
|
|
55
|
+
if (exteriorFeature.getGeometry().getType() !== 'Polygon' || innerFeature.getGeometry().getType() !== 'Polygon') {
|
|
56
|
+
throw Error(`Inner cutout is only supported by Polygon gemoetry.`);
|
|
57
|
+
}
|
|
58
|
+
const featurePolygon = innerFeature.getGeometry();
|
|
59
|
+
const exteriorPolygon = exteriorFeature.getGeometry();
|
|
60
|
+
exteriorFeature.setGeometry(new google.maps.Data.Polygon([
|
|
61
|
+
...exteriorPolygon.getArray(),
|
|
62
|
+
featurePolygon.getAt(0).getArray().reverse()
|
|
63
|
+
]));
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Google maps paths don't always start and stop at the exact same position, so
|
|
67
|
+
* this will fix that for turfjs.
|
|
68
|
+
*/
|
|
69
|
+
export function fixPathDifferentStartingAndEndingPoint(coordinates) {
|
|
70
|
+
if (coordinates.length <= 1) {
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
const start = coordinates[0];
|
|
74
|
+
const end = coordinates[coordinates.length - 1];
|
|
75
|
+
if (start[0] === end[0] && start[1] === end[1]) {
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
coordinates.push(coordinates[0]);
|
|
79
|
+
}
|
|
80
|
+
export function polygonCoordinates(polygon) {
|
|
81
|
+
return polygon.getArray().map(linRing => {
|
|
82
|
+
const coords = linRing.getArray().map(x => [x.lng(), x.lat()]);
|
|
83
|
+
fixPathDifferentStartingAndEndingPoint(coords);
|
|
84
|
+
return coords;
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
export function multiPolygonCoordinates(multiPolygon) {
|
|
88
|
+
return multiPolygon.getArray().map(x => polygonCoordinates(x));
|
|
89
|
+
}
|
|
90
|
+
export function toTurfJsPolygon(polygon) {
|
|
91
|
+
return turfjsPolygon(polygonCoordinates(polygon));
|
|
92
|
+
}
|
|
93
|
+
export function toTurfJsMultiPolygon(multiPolygon) {
|
|
94
|
+
return turfjsMultiPolygon(multiPolygonCoordinates(multiPolygon));
|
|
95
|
+
}
|
|
96
|
+
export function toTurfJsFeature(googleFeature) {
|
|
97
|
+
if (googleFeature.getGeometry().getType() === 'Polygon') {
|
|
98
|
+
return toTurfJsPolygon(googleFeature.getGeometry());
|
|
99
|
+
}
|
|
100
|
+
else if (googleFeature.getGeometry().getType() === 'MultiPolygon') {
|
|
101
|
+
return toTurfJsMultiPolygon(googleFeature.getGeometry());
|
|
102
|
+
}
|
|
103
|
+
throw Error(`Unexpected geometry.`);
|
|
104
|
+
}
|
|
105
|
+
export function featureContains(featureA, featureB) {
|
|
106
|
+
const polygonA = toTurfJsFeature(featureA);
|
|
107
|
+
const polygonB = toTurfJsFeature(featureB);
|
|
108
|
+
return booleanContains(polygonA, polygonB);
|
|
109
|
+
}
|
|
110
|
+
export function createDataFeatureFromPolygon(polygon) {
|
|
111
|
+
const arr = polygon.getPath().getArray();
|
|
112
|
+
return new google.maps.Data.Feature({
|
|
113
|
+
geometry: new google.maps.Data.Polygon([arr])
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
export function getBoundsWithAllFeatures(data) {
|
|
117
|
+
const bounds = new google.maps.LatLngBounds();
|
|
118
|
+
data.forEach(feature => {
|
|
119
|
+
const geometry = feature.getGeometry();
|
|
120
|
+
geometry.forEachLatLng(latLng => {
|
|
121
|
+
bounds.extend(latLng);
|
|
122
|
+
});
|
|
123
|
+
});
|
|
124
|
+
return bounds;
|
|
125
|
+
}
|
|
126
|
+
export function getFeatureBounds(feature) {
|
|
127
|
+
const bounds = new google.maps.LatLngBounds();
|
|
128
|
+
const geometry = feature.getGeometry();
|
|
129
|
+
geometry.forEachLatLng(latLng => {
|
|
130
|
+
bounds.extend(latLng);
|
|
131
|
+
});
|
|
132
|
+
return bounds;
|
|
133
|
+
}
|
|
134
|
+
export function getFeatureCenter(feature) {
|
|
135
|
+
return getFeatureBounds(feature).getCenter();
|
|
136
|
+
}
|
|
137
|
+
export function removeAllFeatures(data) {
|
|
138
|
+
data.forEach(f => data.remove(f));
|
|
139
|
+
}
|
|
140
|
+
export function getFeaturesCount(data) {
|
|
141
|
+
let count = 0;
|
|
142
|
+
data.forEach(() => count++);
|
|
143
|
+
return count;
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* NOTE: Original events are not emitted, because filtering may omit events.
|
|
147
|
+
*/
|
|
148
|
+
export function createFeatureChangeObservable(data, ngZone) {
|
|
149
|
+
return new Observable(subscriber => {
|
|
150
|
+
const listeners = [];
|
|
151
|
+
ngZone.runOutsideAngular(() => {
|
|
152
|
+
listeners.push(data.addListener('setgeometry', (event) => {
|
|
153
|
+
ngZone.run(() => { subscriber.next(undefined); });
|
|
154
|
+
}));
|
|
155
|
+
listeners.push(data.addListener('addfeature', (event) => {
|
|
156
|
+
ngZone.run(() => { subscriber.next(undefined); });
|
|
157
|
+
}));
|
|
158
|
+
listeners.push(data.addListener('removefeature', (event) => {
|
|
159
|
+
ngZone.run(() => { subscriber.next(undefined); });
|
|
160
|
+
}));
|
|
161
|
+
listeners.push(data.addListener('setproperty', (event) => {
|
|
162
|
+
if (!isAppFeatureProperty(event.name)) {
|
|
163
|
+
ngZone.run(() => { subscriber.next(undefined); });
|
|
164
|
+
}
|
|
165
|
+
}));
|
|
166
|
+
listeners.push(data.addListener('removeproperty', (event) => {
|
|
167
|
+
if (!isAppFeatureProperty(event.name)) {
|
|
168
|
+
ngZone.run(() => { subscriber.next(undefined); });
|
|
169
|
+
}
|
|
170
|
+
}));
|
|
171
|
+
});
|
|
172
|
+
return () => {
|
|
173
|
+
listeners.forEach(google.maps.event.removeListener);
|
|
174
|
+
};
|
|
175
|
+
});
|
|
176
|
+
}
|
|
177
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ29vZ2xlLW1hcHMtZmVhdHVyZS1oZWxwZXJzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvdWktY29tbW9uL2dvb2dsZS1tYXBzL2dvb2dsZS1tYXBzLWZlYXR1cmUtaGVscGVycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQTtBQUU3RCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sTUFBTSxDQUFBO0FBRWpDLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDBCQUEwQixDQUFBO0FBQzdELE9BQU8sZUFBZSxNQUFNLHdCQUF3QixDQUFBO0FBQ3BELE9BQU8sRUFDTCxZQUFZLElBQUksa0JBQWtCLEVBQ2xDLE9BQU8sSUFBSSxhQUFhLEdBQ3pCLE1BQU0sZUFBZSxDQUFBO0FBRXRCLE1BQU0sQ0FBTixJQUFZLHNCQUVYO0FBRkQsV0FBWSxzQkFBc0I7SUFDaEMsMERBQWdDLENBQUE7QUFDbEMsQ0FBQyxFQUZXLHNCQUFzQixLQUF0QixzQkFBc0IsUUFFakM7QUFFRCxNQUFNLFVBQVUsb0JBQW9CLENBQUMsWUFBb0I7SUFDdkQsT0FBTyxNQUFNLENBQUMsTUFBTSxDQUFDLHNCQUFzQixDQUFDO1NBQ3pDLFNBQVMsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLEtBQUssS0FBSyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQTtBQUN0RCxDQUFDO0FBRUQsTUFBTSxVQUFVLGlCQUFpQixDQUFDLE9BQWlDO0lBQ2pFLE1BQU0sVUFBVSxHQUFHLE9BQU8sQ0FBQyxXQUFXLENBQUMsc0JBQXNCLENBQUMsVUFBVSxDQUFDLENBQUE7SUFDekUsT0FBTyxxQkFBcUIsQ0FBQyxVQUFVLENBQUMsQ0FBQTtBQUMxQyxDQUFDO0FBRUQsTUFBTSxVQUFVLGtCQUFrQixDQUFDLE9BQWlDLEVBQUUsVUFBbUI7SUFDdkYsT0FBTyxDQUFDLFdBQVcs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QyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUU7b0JBQ3JDLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQSxDQUFDLENBQUMsQ0FBQyxDQUFBO2lCQUNqRDtZQUNILENBQUMsQ0FBQyxDQUFDLENBQUE7UUFDTCxDQUFDLENBQUMsQ0FBQTtRQUVGLE9BQU8sR0FBRyxFQUFFO1lBQ1YsU0FBUyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsQ0FBQTtRQUNyRCxDQUFDLENBQUE7SUFDSCxDQUFDLENBQUMsQ0FBQTtBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBjb2VyY2VCb29sZWFuUHJvcGVydHkgfSBmcm9tICdAYW5ndWxhci9jZGsvY29lcmNpb24nXG5pbXBvcnQgeyBOZ1pvbmUgfSBmcm9tICdAYW5ndWxhci9jb3JlJ1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnXG5cbmltcG9ydCB7IG5vdE51bGxPclVuZGVmaW5lZCB9IGZyb20gJ0B0aGVzZWFtL3VpLWNvbW1vbi91dGlscydcbmltcG9ydCBib29sZWFuQ29udGFpbnMgZnJvbSAnQHR1cmYvYm9vbGVhbi1jb250YWlucydcbmltcG9ydCB7XG4gIG11bHRpUG9seWdvbiBhcyB0dXJmanNNdWx0aVBvbHlnb24sXG4gIHBvbHlnb24gYXMgdHVyZmpzUG9seWdvbixcbn0gZnJvbSAnQHR1cmYvaGVscGVycydcblxuZXhwb3J0IGVudW0gQXBwRmVhdHVyZVByb3BlcnR5TmFtZSB7XG4gIElzU2VsZWN0ZWQgPSBgX19hcHBfX2lzU2VsZWN0ZWRgXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0FwcEZlYXR1cmVQcm9wZXJ0eShwcm9wZXJ0eU5hbWU6IHN0cmluZyk6IHByb3BlcnR5TmFtZSBpcyBBcHBGZWF0dXJlUHJvcGVydHlOYW1lIHtcbiAgcmV0dXJuIE9iamVjdC52YWx1ZXMoQXBwRmVhdHVyZVByb3BlcnR5TmFtZSlcbiAgICAuZmluZEluZGV4KHZhbHVlID0+IHZhbHVlID09PSBwcm9wZXJ0eU5hbWUpICE9PSAtMVxufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNGZWF0dXJlU2VsZWN0ZWQoZmVhdHVyZTogZ29vZ2xlLm1hcHMuRGF0YS5GZWF0dXJlKTogYm9vbGVhbiB7XG4gIGNvbnN0IGlzU2VsZWN0ZWQgPSBmZWF0dXJlLmdldFByb3BlcnR5KEFwcEZlYXR1cmVQcm9wZXJ0eU5hbWUuSXNTZWxlY3RlZClcbiAgcmV0dXJuIGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eShpc1NlbGVjdGVkKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gc2V0RmVhdHVyZVNlbGVjdGVkKGZlYXR1cmU6IGdvb2dsZS5tYXBzLkRhdGEuRmVhdHVyZSwgaXNTZWxlY3RlZDogYm9vbGVhbik6IHZvaWQge1xuICBmZWF0dXJlLnNldFByb3BlcnR5KEFwcEZlYXR1cmVQcm9wZXJ0eU5hbWUuSXNTZWxlY3RlZCwgaXNTZWxlY3RlZClcbn1cblxuLy8gVE9ETzogQ2hlY2sgcGVyZm9ybWFuY2Ugb2YgY2xvbmluZyBhIGdvb2dsZS5tYXBzLkRhdGEgaW5zdGFuY2UsIHNvIHRoZVxuLy8gcHJvcGVydGllcyBjYW4gYmUgcmVtb3ZlZCB3aXRoIHRoZSBnb29nbGUgbWFwcyBhcGksIGluc3RlYWQgb2Ygb24gdGhlXG4vLyByZXN1bHRpbmcganNvbi5cbmV4cG9ydCBmdW5jdGlvbiBzdHJpcEFwcEZlYXR1cmVQcm9wZXJ0aWVzRnJvbUpzb24oanNvbjogYW55KSB7XG4gIGlmIChub3ROdWxsT3JVbmRlZmluZWQoanNvbikgJiYgQXJyYXkuaXNBcnJheShqc29uPy5mZWF0dXJlcykpIHtcbiAgICBmb3IgKGNvbnN0IGZlYXR1cmUgb2YganNvbi5mZWF0dXJlcykge1xuICAgICAgaWYgKG5vdE51bGxPclVuZGVmaW5lZChmZWF0dXJlPy5wcm9wZXJ0aWVzKSkge1xuICAgICAgICBmb3IgKGNvbnN0IGsgb2YgT2JqZWN0LmtleXMoZmVhdHVyZS5wcm9wZXJ0aWVzKSkge1xuICAgICAgICAgIGlmIChpc0FwcEZlYXR1cmVQcm9wZXJ0eShrKSkge1xuICAgICAgICAgICAgZmVhdHVyZS5wcm9wZXJ0aWVzW2tdID0gdW5kZWZpbmVkXG4gICAgICAgICAgICBkZWxldGUgZmVhdHVyZS5wcm9wZXJ0aWVzW2tdXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogU2VhcmNoZXMgZm9yIGEgRmVhdHVyZSBpbiBEYXRhIHRoYXQgY29udGFpbnMgdGhlIHByb3ZpZGVkIEZlYXR1cmUgYW5kIGNhbiB1c2VcbiAqIGl0IGFzIGEgY3V0b3V0IGFyZWEuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRQb3NzaWJsZUV4dGVyaW9yRmVhdHVyZShcbiAgZGF0YTogZ29vZ2xlLm1hcHMuRGF0YSxcbiAgZmVhdHVyZTogZ29vZ2xlLm1hcHMuRGF0YS5GZWF0dXJlXG4pOiBnb29nbGUubWFwcy5EYXRhLkZlYXR1cmUgfCB1bmRlZmluZWQge1xuICBsZXQgZXh0ZXJpb3JQb2x5Z29uRmVhdHVyZTogZ29vZ2xlLm1hcHMuRGF0YS5GZWF0dXJlIHwgdW5kZWZpbmVkXG4gIGRhdGEuZm9yRWFjaChmID0+IHtcbiAgICBpZiAoZiAhPT0gZmVhdHVyZSAmJiAoZi5nZXRHZW9tZXRyeSgpLmdldFR5cGUoKSA9PT0gJ1BvbHlnb24nICYmIGZlYXR1cmVDb250YWlucyhmLCBmZWF0dXJlKSkpIHtcbiAgICAgIGV4dGVyaW9yUG9seWdvbkZlYXR1cmUgPSBmXG4gICAgfVxuICB9KVxuICByZXR1cm4gZXh0ZXJpb3JQb2x5Z29uRmVhdHVyZVxufVxuXG5leHBvcnQgZnVuY3Rpb24gYWRkSW5uZXJGZWF0dXJlQ3V0b3V0VG9FeHRlcmlvckZlYXR1cmUoXG4gIGV4dGVyaW9yRmVhdHVyZTogZ29vZ2xlLm1hcHMuRGF0YS5GZWF0dXJlLFxuICBpbm5lckZlYXR1cmU6IGdvb2dsZS5tYXBzLkRhdGEuRmVhdHVyZVxuKTogdm9pZCB7XG4gIC8vIE5PVEU6IE90aGVyIGdlb21ldHJpZXMgbWF5IHN1cHBvcnQgY3V0b3V0cywgYnV0IG91ciBtYXAgc2hhcGVzIGVkaXRvciBvbmx5XG4gIC8vIHN1cHBvcnRzIHBvbHlnb25zIGN1cnJlbnRseSwgc28gd2Ugd2lsbCBuZWVkIHRvIGhhbmRsZSBvdGhlciBnZW9tZXRyeSB0eXBlc1xuICAvLyBoZXJlIGlmIHdlIHN0YXJ0IGFsbG93aW5nIHVzZXJzIHRvIGRyYXcgc2hhcGVzIG90aGVyIHRoYW4gcG9seWdvbi5cbiAgaWYgKGV4dGVyaW9yRmVhdHVyZS5nZXRHZW9tZXRyeSgpLmdldFR5cGUoKSAhPT0gJ1BvbHlnb24nIHx8IGlubmVyRmVhdHVyZS5nZXRHZW9tZXRyeSgpLmdldFR5cGUoKSAhPT0gJ1BvbHlnb24nKSB7XG4gICAgdGhyb3cgRXJyb3IoYElubmVyIGN1dG91dCBpcyBvbmx5IHN1cHBvcnRlZCBieSBQb2x5Z29uIGdlbW9ldHJ5LmApXG4gIH1cblxuICBjb25zdCBmZWF0dXJlUG9seWdvbiA9IGlubmVyRmVhdHVyZS5nZXRHZW9tZXRyeSgpIGFzIGdvb2dsZS5tYXBzLkRhdGEuUG9seWdvblxuICBjb25zdCBleHRlcmlvclBvbHlnb24gPSBleHRlcmlvckZlYXR1cmUuZ2V0R2VvbWV0cnkoKSBhcyBnb29nbGUubWFwcy5EYXRhLlBvbHlnb25cbiAgZXh0ZXJpb3JGZWF0dXJlLnNldEdlb21ldHJ5KG5ldyBnb29nbGUubWFwcy5EYXRhLlBvbHlnb24oW1xuICAgIC4uLmV4dGVyaW9yUG9seWdvbi5nZXRBcnJheSgpLFxuICAgIGZlYXR1cmVQb2x5Z29uLmdldEF0KDApLmdldEFycmF5KCkucmV2ZXJzZSgpXG4gIF0pKVxufVxuXG4vKipcbiAqIEdvb2dsZSBtYXBzIHBhdGhzIGRvbid0IGFsd2F5cyBzdGFydCBhbmQgc3RvcCBhdCB0aGUgZXhhY3Qgc2FtZSBwb3NpdGlvbiwgc29cbiAqIHRoaXMgd2lsbCBmaXggdGhhdCBmb3IgdHVyZmpzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZml4UGF0aERpZmZlcmVudFN0YXJ0aW5nQW5kRW5kaW5nUG9pbnQoY29vcmRpbmF0ZXM6IG51bWJlcltdW10pOiB2b2lkIHtcbiAgaWYgKGNvb3JkaW5hdGVzLmxlbmd0aCA8PSAxKSB7XG4gICAgcmV0dXJuXG4gIH1cblxuICBjb25zdCBzdGFydCA9IGNvb3JkaW5hdGVzWzBdXG4gIGNvbnN0IGVuZCA9IGNvb3JkaW5hdGVzW2Nvb3JkaW5hdGVzLmxlbmd0aCAtIDFdXG4gIGlmIChzdGFydFswXSA9PT0gZW5kWzBdICYmIHN0YXJ0WzFdID09PSBlbmRbMV0pIHtcbiAgICByZXR1cm5cbiAgfVxuXG4gIGNvb3JkaW5hdGVzLnB1c2goY29vcmRpbmF0ZXNbMF0pXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwb2x5Z29uQ29vcmRpbmF0ZXMocG9seWdvbjogZ29vZ2xlLm1hcHMuRGF0YS5Qb2x5Z29uKTogbnVtYmVyW11bXVtdIHtcbiAgcmV0dXJuIHBvbHlnb24uZ2V0QXJyYXkoKS5tYXAobGluUmluZyA9PiB7XG4gICAgY29uc3QgY29vcmRzID0gbGluUmluZy5nZXRBcnJheSgpLm1hcCh4ID0+IFsgeC5sbmcoKSwgeC5sYXQoKSBdKVxuICAgIGZpeFBhdGhEaWZmZXJlbnRTdGFydGluZ0FuZEVuZGluZ1BvaW50KGNvb3JkcylcbiAgICByZXR1cm4gY29vcmRzXG4gIH0pXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBtdWx0aVBvbHlnb25Db29yZGluYXRlcyhtdWx0aVBvbHlnb246IGdvb2dsZS5tYXBzLkRhdGEuTXVsdGlQb2x5Z29uKTogbnVtYmVyW11bXVtdW10ge1xuICByZXR1cm4gbXVsdGlQb2x5Z29uLmdldEFycmF5KCkubWFwKHggPT4gcG9seWdvbkNvb3JkaW5hdGVzKHgpKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gdG9UdXJmSnNQb2x5Z29uKHBvbHlnb246IGdvb2dsZS5tYXBzLkRhdGEuUG9seWdvbikge1xuICByZXR1cm4gdHVyZmpzUG9seWdvbihwb2x5Z29uQ29vcmRpbmF0ZXMocG9seWdvbikpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0b1R1cmZKc011bHRpUG9seWdvbihtdWx0aVBvbHlnb246IGdvb2dsZS5tYXBzLkRhdGEuTXVsdGlQb2x5Z29uKSB7XG4gIHJldHVybiB0dXJmanNNdWx0aVBvbHlnb24obXVsdGlQb2x5Z29uQ29vcmRpbmF0ZXMobXVsdGlQb2x5Z29uKSlcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRvVHVyZkpzRmVhdHVyZShnb29nbGVGZWF0dXJlOiBnb29nbGUubWFwcy5EYXRhLkZlYXR1cmUpIHtcbiAgaWYgKGdvb2dsZUZlYXR1cmUuZ2V0R2VvbWV0cnkoKS5nZXRUeXBlKCkgPT09ICdQb2x5Z29uJykge1xuICAgIHJldHVybiB0b1R1cmZKc1BvbHlnb24oZ29vZ2xlRmVhdHVyZS5nZXRHZW9tZXRyeSgpIGFzIGdvb2dsZS5tYXBzLkRhdGEuUG9seWdvbilcbiAgfSBlbHNlIGlmIChnb29nbGVGZWF0dXJlLmdldEdlb21ldHJ5KCkuZ2V0VHlwZSgpID09PSAnTXVsdGlQb2x5Z29uJykge1xuICAgIHJldHVybiB0b1R1cmZKc011bHRpUG9seWdvbihnb29nbGVGZWF0dXJlLmdldEdlb21ldHJ5KCkgYXMgZ29vZ2xlLm1hcHMuRGF0YS5NdWx0aVBvbHlnb24pXG4gIH1cblxuICB0aHJvdyBFcnJvcihgVW5leHBlY3RlZCBnZW9tZXRyeS5gKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZmVhdHVyZUNvbnRhaW5zKGZlYXR1cmVBOiBnb29nbGUubWFwcy5EYXRhLkZlYXR1cmUsIGZlYXR1cmVCOiBnb29nbGUubWFwcy5EYXRhLkZlYXR1cmUpOiBib29sZWFuIHtcbiAgY29uc3QgcG9seWdvbkEgPSB0b1R1cmZKc0ZlYXR1cmUoZmVhdHVyZUEpXG4gIGNvbnN0IHBvbHlnb25CID0gdG9UdXJmSnNGZWF0dXJlKGZlYXR1cmVCKVxuICByZXR1cm4gYm9vbGVhbkNvbnRhaW5zKHBvbHlnb25BLCBwb2x5Z29uQilcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZURhdGFGZWF0dXJlRnJvbVBvbHlnb24ocG9seWdvbjogZ29vZ2xlLm1hcHMuUG9seWdvbik6IGdvb2dsZS5tYXBzLkRhdGEuRmVhdHVyZSB7XG4gIGNvbnN0IGFyciA9IHBvbHlnb24uZ2V0UGF0aCgpLmdldEFycmF5KClcbiAgcmV0dXJuIG5ldyBnb29nbGUubWFwcy5EYXRhLkZlYXR1cmUoe1xuICAgIGdlb21ldHJ5OiBuZXcgZ29vZ2xlLm1hcHMuRGF0YS5Qb2x5Z29uKFsgYXJyIF0pXG4gIH0pXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRCb3VuZHNXaXRoQWxsRmVhdHVyZXMoZGF0YTogZ29vZ2xlLm1hcHMuRGF0YSk6IGdvb2dsZS5tYXBzLkxhdExuZ0JvdW5kcyB7XG4gIGNvbnN0IGJvdW5kcyA9IG5ldyBnb29nbGUubWFwcy5MYXRMbmdCb3VuZHMoKVxuXG4gIGRhdGEuZm9yRWFjaChmZWF0dXJlID0+IHtcbiAgICBjb25zdCBnZW9tZXRyeSA9IGZlYXR1cmUuZ2V0R2VvbWV0cnkoKVxuICAgIGdlb21ldHJ5LmZvckVhY2hMYXRMbmcobGF0TG5nID0+IHtcbiAgICAgIGJvdW5kcy5leHRlbmQobGF0TG5nKVxuICAgIH0pXG4gIH0pXG5cbiAgcmV0dXJuIGJvdW5kc1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RmVhdHVyZUJvdW5kcyhmZWF0dXJlOiBnb29nbGUubWFwcy5EYXRhLkZlYXR1cmUpOiBnb29nbGUubWFwcy5MYXRMbmdCb3VuZHMge1xuICBjb25zdCBib3VuZHMgPSBuZXcgZ29vZ2xlLm1hcHMuTGF0TG5nQm91bmRzKClcblxuICBjb25zdCBnZW9tZXRyeSA9IGZlYXR1cmUuZ2V0R2VvbWV0cnkoKVxuICBnZW9tZXRyeS5mb3JFYWNoTGF0TG5nKGxhdExuZyA9PiB7XG4gICAgYm91bmRzLmV4dGVuZChsYXRMbmcpXG4gIH0pXG5cbiAgcmV0dXJuIGJvdW5kc1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RmVhdHVyZUNlbnRlcihmZWF0dXJlOiBnb29nbGUubWFwcy5EYXRhLkZlYXR1cmUpOiBnb29nbGUubWFwcy5MYXRMbmcge1xuICByZXR1cm4gZ2V0RmVhdHVyZUJvdW5kcyhmZWF0dXJlKS5nZXRDZW50ZXIoKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVtb3ZlQWxsRmVhdHVyZXMoZGF0YTogZ29vZ2xlLm1hcHMuRGF0YSk6IHZvaWQge1xuICBkYXRhLmZvckVhY2goZiA9PiBkYXRhLnJlbW92ZShmKSlcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEZlYXR1cmVzQ291bnQoZGF0YTogZ29vZ2xlLm1hcHMuRGF0YSk6IG51bWJlciB7XG4gIGxldCBjb3VudCA9IDBcbiAgZGF0YS5mb3JFYWNoKCgpID0+IGNvdW50KyspXG4gIHJldHVybiBjb3VudFxufVxuXG4vKipcbiAqIE5PVEU6IE9yaWdpbmFsIGV2ZW50cyBhcmUgbm90IGVtaXR0ZWQsIGJlY2F1c2UgZmlsdGVyaW5nIG1heSBvbWl0IGV2ZW50cy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUZlYXR1cmVDaGFuZ2VPYnNlcnZhYmxlKGRhdGE6IGdvb2dsZS5tYXBzLkRhdGEsIG5nWm9uZTogTmdab25lKTogT2JzZXJ2YWJsZTx2b2lkPiB7XG4gIHJldHVybiBuZXcgT2JzZXJ2YWJsZTx2b2lkPihzdWJzY3JpYmVyID0+IHtcbiAgICBjb25zdCBsaXN0ZW5lcnM6IGdvb2dsZS5tYXBzLk1hcHNFdmVudExpc3RlbmVyW10gPSBbXVxuXG4gICAgbmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgIGxpc3RlbmVycy5wdXNoKGRhdGEuYWRkTGlzdGVuZXIoJ3NldGdlb21ldHJ5JywgKGV2ZW50OiBnb29nbGUubWFwcy5EYXRhLlNldEdlb21ldHJ5RXZlbnQpID0+IHtcbiAgICAgICAgbmdab25lLnJ1bigoKSA9PiB7IHN1YnNjcmliZXIubmV4dCh1bmRlZmluZWQpIH0pXG4gICAgICB9KSlcblxuICAgICAgbGlzdGVuZXJzLnB1c2goZGF0YS5hZGRMaXN0ZW5lcignYWRkZmVhdHVyZScsIChldmVudDogZ29vZ2xlLm1hcHMuRGF0YS5BZGRGZWF0dXJlRXZlbnQpID0+IHtcbiAgICAgICAgbmdab25lLnJ1bigoKSA9PiB7IHN1YnNjcmliZXIubmV4dCh1bmRlZmluZWQpIH0pXG4gICAgICB9KSlcblxuICAgICAgbGlzdGVuZXJzLnB1c2goZGF0YS5hZGRMaXN0ZW5lcigncmVtb3ZlZmVhdHVyZScsIChldmVudDogZ29vZ2xlLm1hcHMuRGF0YS5SZW1vdmVGZWF0dXJlRXZlbnQpID0+IHtcbiAgICAgICAgbmdab25lLnJ1bigoKSA9PiB7IHN1YnNjcmliZXIubmV4dCh1bmRlZmluZWQpIH0pXG4gICAgICB9KSlcblxuICAgICAgbGlzdGVuZXJzLnB1c2goZGF0YS5hZGRMaXN0ZW5lcignc2V0cHJvcGVydHknLCAoZXZlbnQ6IGdvb2dsZS5tYXBzLkRhdGEuU2V0UHJvcGVydHlFdmVudCkgPT4ge1xuICAgICAgICBpZiAoIWlzQXBwRmVhdHVyZVByb3BlcnR5KGV2ZW50Lm5hbWUpKSB7XG4gICAgICAgICAgbmdab25lLnJ1bigoKSA9PiB7IHN1YnNjcmliZXIubmV4dCh1bmRlZmluZWQpIH0pXG4gICAgICAgIH1cbiAgICAgIH0pKVxuXG4gICAgICBsaXN0ZW5lcnMucHVzaChkYXRhLmFkZExpc3RlbmVyKCdyZW1vdmVwcm9wZXJ0eScsIChldmVudDogZ29vZ2xlLm1hcHMuRGF0YS5SZW1vdmVQcm9wZXJ0eUV2ZW50KSA9PiB7XG4gICAgICAgIGlmICghaXNBcHBGZWF0dXJlUHJvcGVydHkoZXZlbnQubmFtZSkpIHtcbiAgICAgICAgICBuZ1pvbmUucnVuKCgpID0+IHsgc3Vic2NyaWJlci5uZXh0KHVuZGVmaW5lZCkgfSlcbiAgICAgICAgfVxuICAgICAgfSkpXG4gICAgfSlcblxuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBsaXN0ZW5lcnMuZm9yRWFjaChnb29nbGUubWFwcy5ldmVudC5yZW1vdmVMaXN0ZW5lcilcbiAgICB9XG4gIH0pXG59XG4iXX0=
|
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
import { __decorate } from "tslib";
|
|
2
|
+
import { coerceNumberProperty } from '@angular/cdk/coercion';
|
|
3
|
+
import { ChangeDetectionStrategy, Component, ElementRef, HostBinding, HostListener, Input, Output, ViewChild, } from '@angular/core';
|
|
4
|
+
import { interval, Observable, Subject } from 'rxjs';
|
|
5
|
+
import { filter, mapTo, startWith, switchMap, take, takeUntil } from 'rxjs/operators';
|
|
6
|
+
import { faSearchLocation } from '@fortawesome/free-solid-svg-icons';
|
|
7
|
+
import { InputBoolean } from '@theseam/ui-common/core';
|
|
8
|
+
import { InputDirective } from '@theseam/ui-common/form-field';
|
|
9
|
+
import { SEAM_GOOGLE_PLACES_AUTOCOMPLETE_DEFAULT_OPTIONS, TheSeamGoogleMapsPlacesAutocompleteDirective } from './google-maps-places-autocomplete.directive';
|
|
10
|
+
/**
|
|
11
|
+
*
|
|
12
|
+
*/
|
|
13
|
+
export class TheSeamGoogleMapsPlacesAutoCompleteComponent {
|
|
14
|
+
constructor(_elementRef) {
|
|
15
|
+
this._elementRef = _elementRef;
|
|
16
|
+
this._ngUnsubscribe = new Subject();
|
|
17
|
+
this._autoCompleteReadySubject = new Subject();
|
|
18
|
+
this._placeChangedPending = [];
|
|
19
|
+
this.label = 'Search by address, place or name';
|
|
20
|
+
this.icon = faSearchLocation;
|
|
21
|
+
this.disabled = false;
|
|
22
|
+
this.placeholder = 'Enter address, place or name';
|
|
23
|
+
this.autocorrect = 'off';
|
|
24
|
+
this.autocapitalize = 'off';
|
|
25
|
+
this._tabIndex = -1;
|
|
26
|
+
this._options = SEAM_GOOGLE_PLACES_AUTOCOMPLETE_DEFAULT_OPTIONS;
|
|
27
|
+
this.placeChanged = this._autoCompleteReadySubject.pipe(startWith(undefined), switchMap(() => this._createPlaceChangedObservable()));
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Set the tab index to `-1` to allow the root element of the
|
|
31
|
+
* component to receive `focus` event from javascript, but not get focused by
|
|
32
|
+
* keyboard navigation.
|
|
33
|
+
*/
|
|
34
|
+
set tabIndex(value) { this._tabIndex = coerceNumberProperty(value); }
|
|
35
|
+
get tabIndex() { return this._tabIndex; }
|
|
36
|
+
set options(value) {
|
|
37
|
+
this._options = value || SEAM_GOOGLE_PLACES_AUTOCOMPLETE_DEFAULT_OPTIONS;
|
|
38
|
+
}
|
|
39
|
+
set __autocompleteDirective(value) {
|
|
40
|
+
this._autoCompleteDirective = value;
|
|
41
|
+
this._untilAutoCompleteReady().pipe(takeUntil(this._ngUnsubscribe)).subscribe(() => {
|
|
42
|
+
this.autoComplete = this._autoCompleteDirective.autoComplete;
|
|
43
|
+
this._placeChangedPending.forEach(pending => pending.observable.subscribe(pending.subscriber));
|
|
44
|
+
this._placeChangedPending = [];
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
get _attrTabIndex() { return this.disabled ? -1 : (this.tabIndex || 0); }
|
|
48
|
+
_onClick(event) {
|
|
49
|
+
this._inputDirective.focus();
|
|
50
|
+
}
|
|
51
|
+
_onFocus() {
|
|
52
|
+
var _a;
|
|
53
|
+
(_a = this._inputDirective) === null || _a === void 0 ? void 0 : _a.focus();
|
|
54
|
+
}
|
|
55
|
+
ngOnInit() { }
|
|
56
|
+
/** @ignore */
|
|
57
|
+
ngOnDestroy() {
|
|
58
|
+
this._ngUnsubscribe.next();
|
|
59
|
+
this._ngUnsubscribe.complete();
|
|
60
|
+
}
|
|
61
|
+
_untilAutoCompleteReady() {
|
|
62
|
+
return interval(500).pipe(filter(() => !!this._autoCompleteDirective.autoComplete), take(1), mapTo(undefined));
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Returns the bounds to which predictions are biased.
|
|
66
|
+
*/
|
|
67
|
+
getBounds() {
|
|
68
|
+
this._assertInitialized();
|
|
69
|
+
return this.autoComplete.getBounds();
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Returns the fields to be included for the Place in the details response
|
|
73
|
+
* when the details are successfully retrieved. For a list of fields see
|
|
74
|
+
* [PlaceResult](https://developers.google.com/maps/documentation/javascript/reference/places-service#PlaceResult).
|
|
75
|
+
*/
|
|
76
|
+
getFields() {
|
|
77
|
+
this._assertInitialized();
|
|
78
|
+
return this.autoComplete.getFields();
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Returns the details of the Place selected by user if the details were
|
|
82
|
+
* successfully retrieved. Otherwise returns a stub Place object, with the
|
|
83
|
+
* name property set to the current value of the input field.
|
|
84
|
+
*/
|
|
85
|
+
getPlace() {
|
|
86
|
+
this._assertInitialized();
|
|
87
|
+
return this.autoComplete.getPlace();
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Sets the preferred area within which to return Place results. Results are
|
|
91
|
+
* biased towards, but not restricted to, this area.
|
|
92
|
+
*/
|
|
93
|
+
setBounds(bounds) {
|
|
94
|
+
this._assertInitialized();
|
|
95
|
+
// tslint:disable-next-line: no-non-null-assertion
|
|
96
|
+
return this.autoComplete.setBounds(bounds);
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Sets the component restrictions. Component restrictions are used to
|
|
100
|
+
* restrict predictions to only those within the parent component. For
|
|
101
|
+
* example, the country.
|
|
102
|
+
*/
|
|
103
|
+
setComponentRestrictions(restrictions) {
|
|
104
|
+
this._assertInitialized();
|
|
105
|
+
// tslint:disable-next-line: no-non-null-assertion
|
|
106
|
+
return this.autoComplete.setComponentRestrictions(restrictions);
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Sets the fields to be included for the Place in the details response when
|
|
110
|
+
* the details are successfully retrieved. For a list of fields see
|
|
111
|
+
* [PlaceResult](https://developers.google.com/maps/documentation/javascript/reference/places-service#PlaceResult).
|
|
112
|
+
*/
|
|
113
|
+
setFields(fields) {
|
|
114
|
+
this._assertInitialized();
|
|
115
|
+
// tslint:disable-next-line: no-non-null-assertion
|
|
116
|
+
return this.autoComplete.setFields(fields);
|
|
117
|
+
}
|
|
118
|
+
/** */
|
|
119
|
+
setOptions(options) {
|
|
120
|
+
this._assertInitialized();
|
|
121
|
+
// tslint:disable-next-line: no-non-null-assertion
|
|
122
|
+
return this.autoComplete.setOptions(options);
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Sets the types of predictions to be returned. For supported types, see the
|
|
126
|
+
* [developer's guide](https://developers.google.com/maps/documentation/javascript/places-autocomplete#constrain-place-types).
|
|
127
|
+
* If no types are specified, all types will be returned.
|
|
128
|
+
*/
|
|
129
|
+
setTypes(types) {
|
|
130
|
+
this._assertInitialized();
|
|
131
|
+
// tslint:disable-next-line: no-non-null-assertion
|
|
132
|
+
return this.autoComplete.setTypes(types);
|
|
133
|
+
}
|
|
134
|
+
/** Focuses the input. */
|
|
135
|
+
focus() {
|
|
136
|
+
this._elementRef.nativeElement.focus();
|
|
137
|
+
}
|
|
138
|
+
/** Unfocuses the input. */
|
|
139
|
+
blur() {
|
|
140
|
+
this._elementRef.nativeElement.blur();
|
|
141
|
+
}
|
|
142
|
+
getHostElement() {
|
|
143
|
+
return this._elementRef.nativeElement;
|
|
144
|
+
}
|
|
145
|
+
_createPlaceChangedObservable() {
|
|
146
|
+
const observable = new Observable(subscriber => {
|
|
147
|
+
if (!this.autoComplete) {
|
|
148
|
+
this._placeChangedPending.push({ observable, subscriber });
|
|
149
|
+
return undefined;
|
|
150
|
+
}
|
|
151
|
+
const sub = this._autoCompleteDirective.placeChanged.subscribe(subscriber);
|
|
152
|
+
return () => sub.unsubscribe();
|
|
153
|
+
});
|
|
154
|
+
return observable;
|
|
155
|
+
}
|
|
156
|
+
/** Asserts that the map has been initialized. */
|
|
157
|
+
_assertInitialized() {
|
|
158
|
+
if (!this.autoComplete && (typeof ngDevMode === 'undefined' || ngDevMode)) {
|
|
159
|
+
throw Error('Cannot access Google Map Places information before the API has been initialized. ' +
|
|
160
|
+
'Please wait for the API to load before trying to interact with it.');
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
TheSeamGoogleMapsPlacesAutoCompleteComponent.decorators = [
|
|
165
|
+
{ type: Component, args: [{
|
|
166
|
+
selector: 'seam-google-maps-places-autocomplete',
|
|
167
|
+
template: "<div *ngIf=\"icon\" class=\"search-container--icon-wrapper\">\r\n <seam-icon [icon]=\"icon\" class=\"text-muted\" size=\"lg\"></seam-icon>\r\n</div>\r\n<label *ngIf=\"label || placeholder\" [attr.for]=\"inp.id\" class=\"sr-only\">{{ label || placeholder }}</label>\r\n<input #inp=\"seamInput\"\r\n seamInput\r\n seamGoogleMapsPlacesAutocomplete\r\n [disabled]=\"disabled\"\r\n [attr.placeholder]=\"placeholder\"\r\n [attr.autocorrect]=\"autocorrect\"\r\n [attr.autocapitalize]=\"autocapitalize\"\r\n [options]=\"_options\"\r\n/>\r\n",
|
|
168
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
169
|
+
exportAs: 'seamGoogleMapsPlacesAutoComplete',
|
|
170
|
+
styles: [":host{position:relative;width:100%}:host>input{padding-left:40px}:host .search-container--icon-wrapper{position:absolute;top:6px;left:10px;bottom:0px}:host .search-container--icon-wrapper ::ng-deep .svg-inline--fa{vertical-align:middle}\n"]
|
|
171
|
+
},] }
|
|
172
|
+
];
|
|
173
|
+
TheSeamGoogleMapsPlacesAutoCompleteComponent.ctorParameters = () => [
|
|
174
|
+
{ type: ElementRef }
|
|
175
|
+
];
|
|
176
|
+
TheSeamGoogleMapsPlacesAutoCompleteComponent.propDecorators = {
|
|
177
|
+
label: [{ type: Input }],
|
|
178
|
+
icon: [{ type: Input }],
|
|
179
|
+
disabled: [{ type: Input }],
|
|
180
|
+
placeholder: [{ type: Input }],
|
|
181
|
+
autocorrect: [{ type: Input }],
|
|
182
|
+
autocapitalize: [{ type: Input }],
|
|
183
|
+
tabIndex: [{ type: Input }],
|
|
184
|
+
options: [{ type: Input }],
|
|
185
|
+
placeChanged: [{ type: Output }],
|
|
186
|
+
_inputDirective: [{ type: ViewChild, args: ['inp', { read: InputDirective, static: true },] }],
|
|
187
|
+
__autocompleteDirective: [{ type: ViewChild, args: [TheSeamGoogleMapsPlacesAutocompleteDirective, { static: true },] }],
|
|
188
|
+
_attrTabIndex: [{ type: HostBinding, args: ['attr.tabindex',] }],
|
|
189
|
+
_onClick: [{ type: HostListener, args: ['click', ['event'],] }],
|
|
190
|
+
_onFocus: [{ type: HostListener, args: ['focus', ['$event'],] }]
|
|
191
|
+
};
|
|
192
|
+
__decorate([
|
|
193
|
+
InputBoolean()
|
|
194
|
+
], TheSeamGoogleMapsPlacesAutoCompleteComponent.prototype, "disabled", void 0);
|
|
195
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ29vZ2xlLW1hcHMtcGxhY2VzLWF1dG9jb21wbGV0ZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy91aS1jb21tb24vZ29vZ2xlLW1hcHMvZ29vZ2xlLW1hcHMtcGxhY2VzLWF1dG9jb21wbGV0ZS9nb29nbGUtbWFwcy1wbGFjZXMtYXV0b2NvbXBsZXRlLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFnQixvQkFBb0IsRUFBRSxNQUFNLHVCQUF1QixDQUFBO0FBQzFFLE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsU0FBUyxFQUNULFVBQVUsRUFDVixXQUFXLEVBQ1gsWUFBWSxFQUNaLEtBQUssRUFHTCxNQUFNLEVBQ04sU0FBUyxHQUNWLE1BQU0sZUFBZSxDQUFBO0FBQ3RCLE9BQU8sRUFBRSxRQUFRLEVBQUUsVUFBVSxFQUFNLE9BQU8sRUFBYyxNQUFNLE1BQU0sQ0FBQTtBQUNwRSxPQUFPLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQTtBQUVyRixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQTtBQUNwRSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0seUJBQXlCLENBQUE7QUFDdEQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLCtCQUErQixDQUFBO0FBRzlELE9BQU8sRUFBRSwrQ0FBK0MsRUFBRSw0Q0FBNEMsRUFBRSxNQUFNLDZDQUE2QyxDQUFBO0FBSzNKOztHQUVHO0FBUUgsTUFBTSxPQUFPLDRDQUE0QztJQTJFdkQsWUFDbUIsV0FBdUI7UUFBdkIsZ0JBQVcsR0FBWCxXQUFXLENBQVk7UUF6RXpCLG1CQUFjLEdBQUcsSUFBSSxPQUFPLEVBQVEsQ0FBQTtRQUNwQyw4QkFBeUIsR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFB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QWUsRUFBRSx1QkFBdUIsQ0FBQyxNQUFNO2dCQUMvQyxRQUFRLEVBQUUsa0NBQWtDOzthQUM3Qzs7O1lBL0JDLFVBQVU7OztvQkEwQ1QsS0FBSzttQkFFTCxLQUFLO3VCQUVMLEtBQUs7MEJBRUwsS0FBSzswQkFFTCxLQUFLOzZCQUVMLEtBQUs7dUJBT0osS0FBSztzQkFLTixLQUFLOzJCQWVMLE1BQU07OEJBRU4sU0FBUyxTQUFDLEtBQUssRUFBRSxFQUFFLElBQUksRUFBRSxjQUFjLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTtzQ0FFdkQsU0FBUyxTQUFDLDRDQUE0QyxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTs0QkFXeEUsV0FBVyxTQUFDLGVBQWU7dUJBRzNCLFlBQVksU0FBQyxPQUFPLEVBQUUsQ0FBRSxPQUFPLENBQUU7dUJBS2pDLFlBQVksU0FBQyxPQUFPLEVBQUUsQ0FBRSxRQUFRLENBQUU7O0FBeERWO0lBQWYsWUFBWSxFQUFFOzhFQUErQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEJvb2xlYW5JbnB1dCwgY29lcmNlTnVtYmVyUHJvcGVydHkgfSBmcm9tICdAYW5ndWxhci9jZGsvY29lcmNpb24nXHJcbmltcG9ydCB7XHJcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXHJcbiAgQ29tcG9uZW50LFxyXG4gIEVsZW1lbnRSZWYsXHJcbiAgSG9zdEJpbmRpbmcsXHJcbiAgSG9zdExpc3RlbmVyLFxyXG4gIElucHV0LFxyXG4gIE9uRGVzdHJveSxcclxuICBPbkluaXQsXHJcbiAgT3V0cHV0LFxyXG4gIFZpZXdDaGlsZCxcclxufSBmcm9tICdAYW5ndWxhci9jb3JlJ1xyXG5pbXBvcnQgeyBpbnRlcnZhbCwgT2JzZXJ2YWJsZSwgb2YsIFN1YmplY3QsIFN1YnNjcmliZXIgfSBmcm9tICdyeGpzJ1xyXG5pbXBvcnQgeyBmaWx0ZXIsIG1hcFRvLCBzdGFydFdpdGgsIHN3aXRjaE1hcCwgdGFrZSwgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnXHJcblxyXG5pbXBvcnQgeyBmYVNlYXJjaExvY2F0aW9uIH0gZnJvbSAnQGZvcnRhd2Vzb21lL2ZyZWUtc29saWQtc3ZnLWljb25zJ1xyXG5pbXBvcnQgeyBJbnB1dEJvb2xlYW4gfSBmcm9tICdAdGhlc2VhbS91aS1jb21tb24vY29yZSdcclxuaW1wb3J0IHsgSW5wdXREaXJlY3RpdmUgfSBmcm9tICdAdGhlc2VhbS91aS1jb21tb24vZm9ybS1maWVsZCdcclxuaW1wb3J0IHsgU2VhbUljb24gfSBmcm9tICdAdGhlc2VhbS91aS1jb21tb24vaWNvbidcclxuXHJcbmltcG9ydCB7IFNFQU1fR09PR0xFX1BMQUNFU19BVVRPQ09NUExFVEVfREVGQVVMVF9PUFRJT05TLCBUaGVTZWFtR29vZ2xlTWFwc1BsYWNlc0F1dG9jb21wbGV0ZURpcmVjdGl2ZSB9IGZyb20gJy4vZ29vZ2xlLW1hcHMtcGxhY2VzLWF1dG9jb21wbGV0ZS5kaXJlY3RpdmUnXHJcblxyXG5kZWNsYXJlIGNvbnN0IG5nRGV2TW9kZTogYm9vbGVhbiB8IHVuZGVmaW5lZFxyXG50eXBlIFdpdGhSZXF1aXJlZDxULCBLIGV4dGVuZHMga2V5b2YgVD4gPSBUICYgeyBbUCBpbiBLXS0/OiBUW1BdIH1cclxuXHJcbi8qKlxyXG4gKlxyXG4gKi9cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdzZWFtLWdvb2dsZS1tYXBzLXBsYWNlcy1hdXRvY29tcGxldGUnLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9nb29nbGUtbWFwcy1wbGFjZXMtYXV0b2NvbXBsZXRlLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9nb29nbGUtbWFwcy1wbGFjZXMtYXV0b2NvbXBsZXRlLmNvbXBvbmVudC5zY3NzJ10sXHJcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXHJcbiAgZXhwb3J0QXM6ICdzZWFtR29vZ2xlTWFwc1BsYWNlc0F1dG9Db21wbGV0ZSdcclxufSlcclxuZXhwb3J0IGNsYXNzIFRoZVNlYW1Hb29nbGVNYXBzUGxhY2VzQXV0b0NvbXBsZXRlQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xyXG4gIHN0YXRpYyBuZ0FjY2VwdElucHV0VHlwZV9kaXNhYmxlZDogQm9vbGVhbklucHV0XHJcblxyXG4gIHByaXZhdGUgcmVhZG9ubHkgX25nVW5zdWJzY3JpYmUgPSBuZXcgU3ViamVjdDx2b2lkPigpXHJcbiAgcHJpdmF0ZSByZWFkb25seSBfYXV0b0NvbXBsZXRlUmVhZHlTdWJqZWN0ID0gbmV3IFN1YmplY3QoKVxyXG5cclxuICBwcml2YXRlIF9wbGFjZUNoYW5nZWRQZW5kaW5nOiB7IG9ic2VydmFibGU6IE9ic2VydmFibGU8YW55Piwgc3Vic2NyaWJlcjogU3Vic2NyaWJlcjxhbnk+IH1bXSA9IFtdXHJcblxyXG4gIHB1YmxpYyBhdXRvQ29tcGxldGU/OiBnb29nbGUubWFwcy5wbGFjZXMuQXV0b2NvbXBsZXRlXHJcblxyXG4gIEBJbnB1dCgpIGxhYmVsOiBzdHJpbmcgfCB1bmRlZmluZWQgfCBudWxsID0gJ1NlYXJjaCBieSBhZGRyZXNzLCBwbGFjZSBvciBuYW1lJ1xyXG5cclxuICBASW5wdXQoKSBpY29uOiBTZWFtSWNvbiB8IHVuZGVmaW5lZCB8IG51bGwgPSBmYVNlYXJjaExvY2F0aW9uXHJcblxyXG4gIEBJbnB1dCgpIEBJbnB1dEJvb2xlYW4oKSBkaXNhYmxlZDogQm9vbGVhbklucHV0ID0gZmFsc2VcclxuXHJcbiAgQElucHV0KCkgcGxhY2Vob2xkZXI6IHN0cmluZyB8IHVuZGVmaW5lZCB8IG51bGwgPSAnRW50ZXIgYWRkcmVzcywgcGxhY2Ugb3IgbmFtZSdcclxuXHJcbiAgQElucHV0KCkgYXV0b2NvcnJlY3Q6ICdvZmYnIHwgJ29uJyB8IHVuZGVmaW5lZCB8IG51bGwgPSAnb2ZmJ1xyXG5cclxuICBASW5wdXQoKSBhdXRvY2FwaXRhbGl6ZTogJ29mZicgfCAnb24nIHwgdW5kZWZpbmVkIHwgbnVsbCA9ICdvZmYnXHJcblxyXG4gIC8qKlxyXG4gICAqIFNldCB0aGUgdGFiIGluZGV4IHRvIGAtMWAgdG8gYWxsb3cgdGhlIHJvb3QgZWxlbWVudCBvZiB0aGVcclxuICAgKiBjb21wb25lbnQgdG8gcmVjZWl2ZSBgZm9jdXNgIGV2ZW50IGZyb20gamF2YXNjcmlwdCwgYnV0IG5vdCBnZXQgZm9jdXNlZCBieVxyXG4gICAqIGtleWJvYXJkIG5hdmlnYXRpb24uXHJcbiAgICovXHJcbiAgIEBJbnB1dCgpXHJcbiAgIHNldCB0YWJJbmRleCh2YWx1ZTogbnVtYmVyKSB7IHRoaXMuX3RhYkluZGV4ID0gY29lcmNlTnVtYmVyUHJvcGVydHkodmFsdWUpIH1cclxuICAgZ2V0IHRhYkluZGV4KCk6IG51bWJlciB7IHJldHVybiB0aGlzLl90YWJJbmRleCB9XHJcbiAgIHByaXZhdGUgX3RhYkluZGV4ID0gLTFcclxuXHJcbiAgQElucHV0KClcclxuICBzZXQgb3B0aW9ucyh2YWx1ZTogZ29vZ2xlLm1hcHMucGxhY2VzLkF1dG9jb21wbGV0ZU9wdGlvbnMgfCB1bmRlZmluZWQgfCBudWxsKSB7XHJcbiAgICB0aGlzLl9vcHRpb25zID0gdmFsdWUgfHwgU0VBTV9HT09HTEVfUExBQ0VTX0FVVE9DT01QTEVURV9ERUZBVUxUX09QVElPTlNcclxuICB9XHJcbiAgX29wdGlvbnM6IGdvb2dsZS5tYXBzLnBsYWNlcy5BdXRvY29tcGxldGVPcHRpb25zID0gU0VBTV9HT09HTEVfUExBQ0VTX0FVVE9DT01QTEVURV9ERUZBVUxUX09QVElPTlNcclxuXHJcbiAgLyoqXHJcbiAgICogVGhpcyBldmVudCBpcyBmaXJlZCB3aGVuIGEgUGxhY2VSZXN1bHQgaXMgbWFkZSBhdmFpbGFibGUgZm9yIGEgUGxhY2UgdGhlXHJcbiAgICogdXNlciBoYXMgc2VsZWN0ZWQuIElmIHRoZSB1c2VyIGVudGVycyB0aGUgbmFtZSBvZiBhIFBsYWNlIHRoYXQgd2FzIG5vdFxyXG4gICAqIHN1Z2dlc3RlZCBieSB0aGUgY29udHJvbCBhbmQgcHJlc3NlcyB0aGUgRW50ZXIga2V5LCBvciBpZiBhIFBsYWNlIERldGFpbHNcclxuICAgKiByZXF1ZXN0IGZhaWxzLCB0aGUgUGxhY2VSZXN1bHQgY29udGFpbnMgdGhlIHVzZXIgaW5wdXQgaW4gdGhlIG5hbWVcclxuICAgKiBwcm9wZXJ0eSwgd2l0aCBubyBvdGhlciBwcm9wZXJ0aWVzIGRlZmluZWQuXHJcbiAgICpcclxuICAgKiBTZWU6IGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL21hcHMvZG9jdW1lbnRhdGlvbi9qYXZhc2NyaXB0L3JlZmVyZW5jZS9wbGFjZXMtd2lkZ2V0I0F1dG9jb21wbGV0ZS5wbGFjZV9jaGFuZ2VkXHJcbiAgICovXHJcbiAgQE91dHB1dCgpIHJlYWRvbmx5IHBsYWNlQ2hhbmdlZDogT2JzZXJ2YWJsZTx2b2lkPlxyXG5cclxuICBAVmlld0NoaWxkKCdpbnAnLCB7IHJlYWQ6IElucHV0RGlyZWN0aXZlLCBzdGF0aWM6IHRydWUgfSkgX2lucHV0RGlyZWN0aXZlITogSW5wdXREaXJlY3RpdmVcclxuXHJcbiAgQFZpZXdDaGlsZChUaGVTZWFtR29vZ2xlTWFwc1BsYWNlc0F1dG9jb21wbGV0ZURpcmVjdGl2ZSwgeyBzdGF0aWM6IHRydWUgfSlcclxuICBzZXQgX19hdXRvY29tcGxldGVEaXJlY3RpdmUodmFsdWU6IFRoZVNlYW1Hb29nbGVNYXBzUGxhY2VzQXV0b2NvbXBsZXRlRGlyZWN0aXZlKSB7XHJcbiAgICB0aGlzLl9hdXRvQ29tcGxldGVEaXJlY3RpdmUgPSB2YWx1ZVxyXG4gICAgdGhpcy5fdW50aWxBdXRvQ29tcGxldGVSZWFkeSgpLnBpcGUodGFrZVVudGlsKHRoaXMuX25nVW5zdWJzY3JpYmUpKS5zdWJzY3JpYmUoKCkgPT4ge1xyXG4gICAgICB0aGlzLmF1dG9Db21wbGV0ZSA9IHRoaXMuX2F1dG9Db21wbGV0ZURpcmVjdGl2ZS5hdXRvQ29tcGxldGVcclxuICAgICAgdGhpcy5fcGxhY2VDaGFuZ2VkUGVuZGluZy5mb3JFYWNoKHBlbmRpbmcgPT4gcGVuZGluZy5vYnNlcnZhYmxlLnN1YnNjcmliZShwZW5kaW5nLnN1YnNjcmliZXIpKVxyXG4gICAgICB0aGlzLl9wbGFjZUNoYW5nZWRQZW5kaW5nID0gW11cclxuICAgIH0pXHJcbiAgfVxyXG4gIF9hdXRvQ29tcGxldGVEaXJlY3RpdmUhOiBUaGVTZWFtR29vZ2xlTWFwc1BsYWNlc0F1dG9jb21wbGV0ZURpcmVjdGl2ZVxyXG5cclxuICBASG9zdEJpbmRpbmcoJ2F0dHIudGFiaW5kZXgnKVxyXG4gIGdldCBfYXR0clRhYkluZGV4KCkgeyByZXR1cm4gdGhpcy5kaXNhYmxlZCA/IC0xIDogKHRoaXMudGFiSW5kZXggfHwgMCkgfVxyXG5cclxuICBASG9zdExpc3RlbmVyKCdjbGljaycsIFsgJ2V2ZW50JyBdKVxyXG4gIF9vbkNsaWNrKGV2ZW50OiBNb3VzZUV2ZW50KSB7XHJcbiAgICB0aGlzLl9pbnB1dERpcmVjdGl2ZS5mb2N1cygpXHJcbiAgfVxyXG5cclxuICBASG9zdExpc3RlbmVyKCdmb2N1cycsIFsgJyRldmVudCcgXSlcclxuICBfb25Gb2N1cygpIHtcclxuICAgIHRoaXMuX2lucHV0RGlyZWN0aXZlPy5mb2N1cygpXHJcbiAgfVxyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2VsZW1lbnRSZWY6IEVsZW1lbnRSZWYsXHJcbiAgKSB7XHJcbiAgICB0aGlzLnBsYWNlQ2hhbmdlZCA9IHRoaXMuX2F1dG9Db21wbGV0ZVJlYWR5U3ViamVjdC5waXBlKFxyXG4gICAgICBzdGFydFdpdGgodW5kZWZpbmVkKSxcclxuICAgICAgc3dpdGNoTWFwKCgpID0+IHRoaXMuX2NyZWF0ZVBsYWNlQ2hhbmdlZE9ic2VydmFibGU8YW55PigpKVxyXG4gICAgKVxyXG4gIH1cclxuXHJcbiAgbmdPbkluaXQoKSB7IH1cclxuXHJcbiAgLyoqIEBpZ25vcmUgKi9cclxuICBuZ09uRGVzdHJveSgpIHtcclxuICAgIHRoaXMuX25nVW5zdWJzY3JpYmUubmV4dCgpXHJcbiAgICB0aGlzLl9uZ1Vuc3Vic2NyaWJlLmNvbXBsZXRlKClcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX3VudGlsQXV0b0NvbXBsZXRlUmVhZHkoKTogT2JzZXJ2YWJsZTx2b2lkPiB7XHJcbiAgICByZXR1cm4gaW50ZXJ2YWwoNTAwKS5waXBlKFxyXG4gICAgICBmaWx0ZXIoKCkgPT4gISF0aGlzLl9hdXRvQ29tcGxldGVEaXJlY3RpdmUuYXV0b0NvbXBsZXRlKSxcclxuICAgICAgdGFrZSgxKSxcclxuICAgICAgbWFwVG8odW5kZWZpbmVkKSxcclxuICAgIClcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJldHVybnMgdGhlIGJvdW5kcyB0byB3aGljaCBwcmVkaWN0aW9ucyBhcmUgYmlhc2VkLlxyXG4gICAqL1xyXG4gICBwdWJsaWMgZ2V0Qm91bmRzKCk6IGdvb2dsZS5tYXBzLkxhdExuZ0JvdW5kcyB8IHVuZGVmaW5lZCB7XHJcbiAgICB0aGlzLl9hc3NlcnRJbml0aWFsaXplZCgpXHJcbiAgICByZXR1cm4gdGhpcy5hdXRvQ29tcGxldGUuZ2V0Qm91bmRzKClcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJldHVybnMgdGhlIGZpZWxkcyB0byBiZSBpbmNsdWRlZCBmb3IgdGhlIFBsYWNlIGluIHRoZSBkZXRhaWxzIHJlc3BvbnNlXHJcbiAgICogd2hlbiB0aGUgZGV0YWlscyBhcmUgc3VjY2Vzc2Z1bGx5IHJldHJpZXZlZC4gRm9yIGEgbGlzdCBvZiBmaWVsZHMgc2VlXHJcbiAgICogW1BsYWNlUmVzdWx0XShodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9tYXBzL2RvY3VtZW50YXRpb24vamF2YXNjcmlwdC9yZWZlcmVuY2UvcGxhY2VzLXNlcnZpY2UjUGxhY2VSZXN1bHQpLlxyXG4gICAqL1xyXG4gIHB1YmxpYyBnZXRGaWVsZHMoKTogc3RyaW5nW10gfCB1bmRlZmluZWQge1xyXG4gICAgdGhpcy5fYXNzZXJ0SW5pdGlhbGl6ZWQoKVxyXG4gICAgcmV0dXJuICh0aGlzLmF1dG9Db21wbGV0ZSBhcyBhbnkpLmdldEZpZWxkcygpXHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZXR1cm5zIHRoZSBkZXRhaWxzIG9mIHRoZSBQbGFjZSBzZWxlY3RlZCBieSB1c2VyIGlmIHRoZSBkZXRhaWxzIHdlcmVcclxuICAgKiBzdWNjZXNzZnVsbHkgcmV0cmlldmVkLiBPdGhlcndpc2UgcmV0dXJucyBhIHN0dWIgUGxhY2Ugb2JqZWN0LCB3aXRoIHRoZVxyXG4gICAqIG5hbWUgcHJvcGVydHkgc2V0IHRvIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBpbnB1dCBmaWVsZC5cclxuICAgKi9cclxuICAgcHVibGljIGdldFBsYWNlKCk6IGdvb2dsZS5tYXBzLnBsYWNlcy5QbGFjZVJlc3VsdCB7XHJcbiAgICB0aGlzLl9hc3NlcnRJbml0aWFsaXplZCgpXHJcbiAgICByZXR1cm4gdGhpcy5hdXRvQ29tcGxldGUuZ2V0UGxhY2UoKVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU2V0cyB0aGUgcHJlZmVycmVkIGFyZWEgd2l0aGluIHdoaWNoIHRvIHJldHVybiBQbGFjZSByZXN1bHRzLiBSZXN1bHRzIGFyZVxyXG4gICAqIGJpYXNlZCB0b3dhcmRzLCBidXQgbm90IHJlc3RyaWN0ZWQgdG8sIHRoaXMgYXJlYS5cclxuICAgKi9cclxuICBwdWJsaWMgc2V0Qm91bmRzKGJvdW5kcz86IGdvb2dsZS5tYXBzLkxhdExuZ0JvdW5kcyB8IGdvb2dsZS5tYXBzLkxhdExuZ0JvdW5kc0xpdGVyYWwpOiB2b2lkIHtcclxuICAgIHRoaXMuX2Fzc2VydEluaXRpYWxpemVkKClcclxuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tbm9uLW51bGwtYXNzZXJ0aW9uXHJcbiAgICByZXR1cm4gdGhpcy5hdXRvQ29tcGxldGUuc2V0Qm91bmRzKGJvdW5kcyEpXHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTZXRzIHRoZSBjb21wb25lbnQgcmVzdHJpY3Rpb25zLiBDb21wb25lbnQgcmVzdHJpY3Rpb25zIGFyZSB1c2VkIHRvXHJcbiAgICogcmVzdHJpY3QgcHJlZGljdGlvbnMgdG8gb25seSB0aG9zZSB3aXRoaW4gdGhlIHBhcmVudCBjb21wb25lbnQuIEZvclxyXG4gICAqIGV4YW1wbGUsIHRoZSBjb3VudHJ5LlxyXG4gICAqL1xyXG4gIHB1YmxpYyBzZXRDb21wb25lbnRSZXN0cmljdGlvbnMocmVzdHJpY3Rpb25zPzogZ29vZ2xlLm1hcHMucGxhY2VzLkNvbXBvbmVudFJlc3RyaWN0aW9ucyk6IHZvaWQge1xyXG4gICAgdGhpcy5fYXNzZXJ0SW5pdGlhbGl6ZWQoKVxyXG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby1ub24tbnVsbC1hc3NlcnRpb25cclxuICAgIHJldHVybiB0aGlzLmF1dG9Db21wbGV0ZS5zZXRDb21wb25lbnRSZXN0cmljdGlvbnMocmVzdHJpY3Rpb25zISlcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNldHMgdGhlIGZpZWxkcyB0byBiZSBpbmNsdWRlZCBmb3IgdGhlIFBsYWNlIGluIHRoZSBkZXRhaWxzIHJlc3BvbnNlIHdoZW5cclxuICAgKiB0aGUgZGV0YWlscyBhcmUgc3VjY2Vzc2Z1bGx5IHJldHJpZXZlZC4gRm9yIGEgbGlzdCBvZiBmaWVsZHMgc2VlXHJcbiAgICogW1BsYWNlUmVzdWx0XShodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9tYXBzL2RvY3VtZW50YXRpb24vamF2YXNjcmlwdC9yZWZlcmVuY2UvcGxhY2VzLXNlcnZpY2UjUGxhY2VSZXN1bHQpLlxyXG4gICAqL1xyXG4gIHB1YmxpYyBzZXRGaWVsZHMoZmllbGRzPzogc3RyaW5nW10pOiB2b2lkIHtcclxuICAgIHRoaXMuX2Fzc2VydEluaXRpYWxpemVkKClcclxuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tbm9uLW51bGwtYXNzZXJ0aW9uXHJcbiAgICByZXR1cm4gdGhpcy5hdXRvQ29tcGxldGUuc2V0RmllbGRzKGZpZWxkcyEpXHJcbiAgfVxyXG5cclxuICAvKiogKi9cclxuICBwdWJsaWMgc2V0T3B0aW9ucyhvcHRpb25zPzogZ29vZ2xlLm1hcHMucGxhY2VzLkF1dG9jb21wbGV0ZU9wdGlvbnMpOiB2b2lkIHtcclxuICAgIHRoaXMuX2Fzc2VydEluaXRpYWxpemVkKClcclxuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tbm9uLW51bGwtYXNzZXJ0aW9uXHJcbiAgICByZXR1cm4gdGhpcy5hdXRvQ29tcGxldGUuc2V0T3B0aW9ucyhvcHRpb25zISlcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNldHMgdGhlIHR5cGVzIG9mIHByZWRpY3Rpb25zIHRvIGJlIHJldHVybmVkLiBGb3Igc3VwcG9ydGVkIHR5cGVzLCBzZWUgdGhlXHJcbiAgICogW2RldmVsb3BlcidzIGd1aWRlXShodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9tYXBzL2RvY3VtZW50YXRpb24vamF2YXNjcmlwdC9wbGFjZXMtYXV0b2NvbXBsZXRlI2NvbnN0cmFpbi1wbGFjZS10eXBlcykuXHJcbiAgICogSWYgbm8gdHlwZXMgYXJlIHNwZWNpZmllZCwgYWxsIHR5cGVzIHdpbGwgYmUgcmV0dXJuZWQuXHJcbiAgICovXHJcbiAgcHVibGljIHNldFR5cGVzKHR5cGVzPzogc3RyaW5nW10pOiB2b2lkIHtcclxuICAgIHRoaXMuX2Fzc2VydEluaXRpYWxpemVkKClcclxuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tbm9uLW51bGwtYXNzZXJ0aW9uXHJcbiAgICByZXR1cm4gdGhpcy5hdXRvQ29tcGxldGUuc2V0VHlwZXModHlwZXMhKVxyXG4gIH1cclxuXHJcbiAgLyoqIEZvY3VzZXMgdGhlIGlucHV0LiAqL1xyXG4gIHB1YmxpYyBmb2N1cygpOiB2b2lkIHtcclxuICAgIHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5mb2N1cygpXHJcbiAgfVxyXG5cclxuICAvKiogVW5mb2N1c2VzIHRoZSBpbnB1dC4gKi9cclxuICBwdWJsaWMgYmx1cigpOiB2b2lkIHtcclxuICAgIHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5ibHVyKClcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXRIb3N0RWxlbWVudCgpOiBIVE1MSW5wdXRFbGVtZW50IHtcclxuICAgIHJldHVybiB0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnRcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2NyZWF0ZVBsYWNlQ2hhbmdlZE9ic2VydmFibGU8VD4oKTogT2JzZXJ2YWJsZTxUPiB7XHJcbiAgICBjb25zdCBvYnNlcnZhYmxlID0gbmV3IE9ic2VydmFibGU8VD4oc3Vic2NyaWJlciA9PiB7XHJcbiAgICAgIGlmICghdGhpcy5hdXRvQ29tcGxldGUpIHtcclxuICAgICAgICB0aGlzLl9wbGFjZUNoYW5nZWRQZW5kaW5nLnB1c2goeyBvYnNlcnZhYmxlLCBzdWJzY3JpYmVyIH0pXHJcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZFxyXG4gICAgICB9XHJcblxyXG4gICAgICBjb25zdCBzdWIgPSB0aGlzLl9hdXRvQ29tcGxldGVEaXJlY3RpdmUucGxhY2VDaGFuZ2VkLnN1YnNjcmliZShzdWJzY3JpYmVyKVxyXG5cclxuICAgICAgcmV0dXJuICgpID0+IHN1Yi51bnN1YnNjcmliZSgpXHJcbiAgICB9KVxyXG4gICAgcmV0dXJuIG9ic2VydmFibGVcclxuICB9XHJcblxyXG4gIC8qKiBBc3NlcnRzIHRoYXQgdGhlIG1hcCBoYXMgYmVlbiBpbml0aWFsaXplZC4gKi9cclxuICBwcml2YXRlIF9hc3NlcnRJbml0aWFsaXplZCgpOiBhc3NlcnRzIHRoaXMgaXMgV2l0aFJlcXVpcmVkPFRoZVNlYW1Hb29nbGVNYXBzUGxhY2VzQXV0b0NvbXBsZXRlQ29tcG9uZW50LCAnYXV0b0NvbXBsZXRlJz4ge1xyXG4gICAgaWYgKCF0aGlzLmF1dG9Db21wbGV0ZSAmJiAodHlwZW9mIG5nRGV2TW9kZSA9PT0gJ3VuZGVmaW5lZCcgfHwgbmdEZXZNb2RlKSkge1xyXG4gICAgICB0aHJvdyBFcnJvcihcclxuICAgICAgICAnQ2Fubm90IGFjY2VzcyBHb29nbGUgTWFwIFBsYWNlcyBpbmZvcm1hdGlvbiBiZWZvcmUgdGhlIEFQSSBoYXMgYmVlbiBpbml0aWFsaXplZC4gJyArXHJcbiAgICAgICAgICAnUGxlYXNlIHdhaXQgZm9yIHRoZSBBUEkgdG8gbG9hZCBiZWZvcmUgdHJ5aW5nIHRvIGludGVyYWN0IHdpdGggaXQuJyxcclxuICAgICAgKVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbn1cclxuIl19
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
import { Directive, ElementRef, HostBinding, Input, NgZone, Output } from '@angular/core';
|
|
2
|
+
import { interval, Observable, Subject } from 'rxjs';
|
|
3
|
+
import { filter, mapTo, startWith, switchMap, take, takeUntil } from 'rxjs/operators';
|
|
4
|
+
export const SEAM_GOOGLE_PLACES_AUTOCOMPLETE_DEFAULT_OPTIONS = {
|
|
5
|
+
componentRestrictions: { country: 'US' }
|
|
6
|
+
};
|
|
7
|
+
export class TheSeamGoogleMapsPlacesAutocompleteDirective {
|
|
8
|
+
constructor(_elementRef, _ngZone) {
|
|
9
|
+
this._elementRef = _elementRef;
|
|
10
|
+
this._ngZone = _ngZone;
|
|
11
|
+
this._autoCompleteReadySubject = new Subject();
|
|
12
|
+
this._ngUnsubscribe = new Subject();
|
|
13
|
+
this._placeChangedPending = [];
|
|
14
|
+
this._listeners = [];
|
|
15
|
+
this._options = SEAM_GOOGLE_PLACES_AUTOCOMPLETE_DEFAULT_OPTIONS;
|
|
16
|
+
this._attrType = 'text';
|
|
17
|
+
this.placeChanged = this._autoCompleteReadySubject.pipe(startWith(undefined), switchMap(() => this._createPlaceChangedObservable()));
|
|
18
|
+
}
|
|
19
|
+
set options(value) {
|
|
20
|
+
this._options = value || SEAM_GOOGLE_PLACES_AUTOCOMPLETE_DEFAULT_OPTIONS;
|
|
21
|
+
}
|
|
22
|
+
ngOnInit() {
|
|
23
|
+
this._ngZone.runOutsideAngular(() => {
|
|
24
|
+
this._untilGoogleMapsApiLoaded().pipe(takeUntil(this._ngUnsubscribe)).subscribe(() => {
|
|
25
|
+
this.autoComplete = new google.maps.places.Autocomplete(this.getHostElement(), this._options);
|
|
26
|
+
this._placeChangedPending.forEach(pending => pending.observable.subscribe(pending.subscriber));
|
|
27
|
+
this._autoCompleteReadySubject.next();
|
|
28
|
+
});
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
ngOnDestroy() {
|
|
32
|
+
this._listeners.forEach(l => l.remove());
|
|
33
|
+
this._listeners = [];
|
|
34
|
+
this._ngUnsubscribe.next();
|
|
35
|
+
this._ngUnsubscribe.complete();
|
|
36
|
+
}
|
|
37
|
+
ngOnChanges(changes) {
|
|
38
|
+
if (this.autoComplete && changes['options']) {
|
|
39
|
+
this.autoComplete.setOptions(this._options);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
_untilGoogleMapsApiLoaded() {
|
|
43
|
+
return interval(500).pipe(filter(() => !!(window.google && window.google.maps && window.google.maps.version)), take(1), mapTo(undefined));
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Returns the bounds to which predictions are biased.
|
|
47
|
+
*/
|
|
48
|
+
getBounds() {
|
|
49
|
+
this._assertInitialized();
|
|
50
|
+
return this.autoComplete.getBounds();
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Returns the fields to be included for the Place in the details response
|
|
54
|
+
* when the details are successfully retrieved. For a list of fields see
|
|
55
|
+
* [PlaceResult](https://developers.google.com/maps/documentation/javascript/reference/places-service#PlaceResult).
|
|
56
|
+
*/
|
|
57
|
+
getFields() {
|
|
58
|
+
this._assertInitialized();
|
|
59
|
+
return this.autoComplete.getFields();
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Returns the details of the Place selected by user if the details were
|
|
63
|
+
* successfully retrieved. Otherwise returns a stub Place object, with the
|
|
64
|
+
* name property set to the current value of the input field.
|
|
65
|
+
*/
|
|
66
|
+
getPlace() {
|
|
67
|
+
this._assertInitialized();
|
|
68
|
+
return this.autoComplete.getPlace();
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Sets the preferred area within which to return Place results. Results are
|
|
72
|
+
* biased towards, but not restricted to, this area.
|
|
73
|
+
*/
|
|
74
|
+
setBounds(bounds) {
|
|
75
|
+
this._assertInitialized();
|
|
76
|
+
// tslint:disable-next-line: no-non-null-assertion
|
|
77
|
+
return this.autoComplete.setBounds(bounds);
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Sets the component restrictions. Component restrictions are used to
|
|
81
|
+
* restrict predictions to only those within the parent component. For
|
|
82
|
+
* example, the country.
|
|
83
|
+
*/
|
|
84
|
+
setComponentRestrictions(restrictions) {
|
|
85
|
+
this._assertInitialized();
|
|
86
|
+
// tslint:disable-next-line: no-non-null-assertion
|
|
87
|
+
return this.autoComplete.setComponentRestrictions(restrictions);
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Sets the fields to be included for the Place in the details response when
|
|
91
|
+
* the details are successfully retrieved. For a list of fields see
|
|
92
|
+
* [PlaceResult](https://developers.google.com/maps/documentation/javascript/reference/places-service#PlaceResult).
|
|
93
|
+
*/
|
|
94
|
+
setFields(fields) {
|
|
95
|
+
this._assertInitialized();
|
|
96
|
+
// tslint:disable-next-line: no-non-null-assertion
|
|
97
|
+
return this.autoComplete.setFields(fields);
|
|
98
|
+
}
|
|
99
|
+
/** */
|
|
100
|
+
setOptions(options) {
|
|
101
|
+
this._assertInitialized();
|
|
102
|
+
// tslint:disable-next-line: no-non-null-assertion
|
|
103
|
+
return this.autoComplete.setOptions(options);
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Sets the types of predictions to be returned. For supported types, see the
|
|
107
|
+
* [developer's guide](https://developers.google.com/maps/documentation/javascript/places-autocomplete#constrain-place-types).
|
|
108
|
+
* If no types are specified, all types will be returned.
|
|
109
|
+
*/
|
|
110
|
+
setTypes(types) {
|
|
111
|
+
this._assertInitialized();
|
|
112
|
+
// tslint:disable-next-line: no-non-null-assertion
|
|
113
|
+
return this.autoComplete.setTypes(types);
|
|
114
|
+
}
|
|
115
|
+
/** Focuses the input. */
|
|
116
|
+
focus() {
|
|
117
|
+
this._elementRef.nativeElement.focus();
|
|
118
|
+
}
|
|
119
|
+
/** Unfocuses the input. */
|
|
120
|
+
blur() {
|
|
121
|
+
this._elementRef.nativeElement.blur();
|
|
122
|
+
}
|
|
123
|
+
getHostElement() {
|
|
124
|
+
return this._elementRef.nativeElement;
|
|
125
|
+
}
|
|
126
|
+
_createPlaceChangedObservable() {
|
|
127
|
+
const observable = new Observable(subscriber => {
|
|
128
|
+
if (!this.autoComplete) {
|
|
129
|
+
this._placeChangedPending.push({ observable, subscriber });
|
|
130
|
+
return undefined;
|
|
131
|
+
}
|
|
132
|
+
const listener = this.autoComplete.addListener('place_changed', (event) => {
|
|
133
|
+
this._ngZone.run(() => subscriber.next(event));
|
|
134
|
+
});
|
|
135
|
+
this._listeners.push(listener);
|
|
136
|
+
return () => listener.remove();
|
|
137
|
+
});
|
|
138
|
+
return observable;
|
|
139
|
+
}
|
|
140
|
+
/** Asserts that the map has been initialized. */
|
|
141
|
+
_assertInitialized() {
|
|
142
|
+
if (!this.autoComplete && (typeof ngDevMode === 'undefined' || ngDevMode)) {
|
|
143
|
+
throw Error('Cannot access Google Map Places information before the API has been initialized. ' +
|
|
144
|
+
'Please wait for the API to load before trying to interact with it.');
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
TheSeamGoogleMapsPlacesAutocompleteDirective.decorators = [
|
|
149
|
+
{ type: Directive, args: [{
|
|
150
|
+
selector: 'input[seamGoogleMapsPlacesAutocomplete]',
|
|
151
|
+
exportAs: 'seamGoogleMapsPlacesAutocomplete'
|
|
152
|
+
},] }
|
|
153
|
+
];
|
|
154
|
+
TheSeamGoogleMapsPlacesAutocompleteDirective.ctorParameters = () => [
|
|
155
|
+
{ type: ElementRef },
|
|
156
|
+
{ type: NgZone }
|
|
157
|
+
];
|
|
158
|
+
TheSeamGoogleMapsPlacesAutocompleteDirective.propDecorators = {
|
|
159
|
+
options: [{ type: Input }],
|
|
160
|
+
placeChanged: [{ type: Output }],
|
|
161
|
+
_attrType: [{ type: HostBinding, args: ['attr.type',] }]
|
|
162
|
+
};
|
|
163
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ29vZ2xlLW1hcHMtcGxhY2VzLWF1dG9jb21wbGV0ZS5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy91aS1jb21tb24vZ29vZ2xlLW1hcHMvZ29vZ2xlLW1hcHMtcGxhY2VzLWF1dG9jb21wbGV0ZS9nb29nbGUtbWFwcy1wbGFjZXMtYXV0b2NvbXBsZXRlLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxXQUFXLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBZ0MsTUFBTSxFQUFpQixNQUFNLGVBQWUsQ0FBQTtBQUN0SSxPQUFPLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBRSxPQUFPLEVBQWMsTUFBTSxNQUFNLENBQUE7QUFDaEUsT0FBTyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUE7QUFLckYsTUFBTSxDQUFDLE1BQU0sK0NBQStDLEdBQTJDO0lBQ3JHLHFCQUFxQixFQUFFLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRTtDQUN6QyxDQUFBO0FBTUQsTUFBTSxPQUFPLDRDQUE0QztJQTRCdkQsWUFDbUIsV0FBeUMsRUFDekMsT0FBZTtRQURmLGdCQUFXLEdBQVgsV0FBVyxDQUE4QjtRQUN6QyxZQUFPLEdBQVAsT0FBTyxDQUFRO1FBN0JqQiw4QkFBeUIsR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFBO1FBQ3pDLG1CQUFjLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQTtRQUV2Qyx5QkFBb0IsR0FBbUUsRUFBRSxDQUFBO1FBQ3pGLGVBQVUsR0FBb0MsRUFBRSxDQUFBO1FBUWhELGFBQVEsR0FBMkMsK0NBQStDLENBQUE7UUFhaEYsY0FBUyxHQUFHLE1BQU0sQ0FBQTtRQU0xQyxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUks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SSxVQUFVLENBQUMsRUFBRTtZQUNoRCxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRTtnQkFDdEIsSUFBSSxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsQ0FBQyxDQUFBO2dCQUMxRCxPQUFPLFNBQVMsQ0FBQTthQUNqQjtZQUNELE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFDLGVBQWUsRUFBRSxDQUFDLEtBQVEsRUFBRSxFQUFFO2dCQUMzRSxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUE7WUFDaEQsQ0FBQyxDQUFDLENBQUE7WUFDRixJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQTtZQUU5QixPQUFPLEdBQUcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQTtRQUNoQyxDQUFDLENBQUMsQ0FBQTtRQUNGLE9BQU8sVUFBVSxDQUFBO0lBQ25CLENBQUM7SUFFRCxpREFBaUQ7SUFDekMsa0JBQWtCO1FBQ3hCLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxJQUFJLENBQUMsT0FBTyxTQUFTLEtBQUssV0FBVyxJQUFJLFNBQVMsQ0FBQyxFQUFFO1lBQ3pFLE1BQU0sS0FBSyxDQUNULG1GQUFtRjtnQkFDakYsb0VBQW9FLENBQ3ZFLENBQUE7U0FDRjtJQUNILENBQUM7OztZQWhNRixTQUFTLFNBQUM7Z0JBQ1QsUUFBUSxFQUFFLHlDQUF5QztnQkFDbkQsUUFBUSxFQUFFLGtDQUFrQzthQUM3Qzs7O1lBZG1CLFVBQVU7WUFBc0IsTUFBTTs7O3NCQXdCdkQsS0FBSzsyQkFlTCxNQUFNO3dCQUVOLFdBQVcsU0FBQyxXQUFXIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGlyZWN0aXZlLCBFbGVtZW50UmVmLCBIb3N0QmluZGluZywgSW5wdXQsIE5nWm9uZSwgT25DaGFuZ2VzLCBPbkRlc3Ryb3ksIE9uSW5pdCwgT3V0cHV0LCBTaW1wbGVDaGFuZ2VzIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSdcclxuaW1wb3J0IHsgaW50ZXJ2YWwsIE9ic2VydmFibGUsIFN1YmplY3QsIFN1YnNjcmliZXIgfSBmcm9tICdyeGpzJ1xyXG5pbXBvcnQgeyBmaWx0ZXIsIG1hcFRvLCBzdGFydFdpdGgsIHN3aXRjaE1hcCwgdGFrZSwgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnXHJcblxyXG5kZWNsYXJlIGNvbnN0IG5nRGV2TW9kZTogYm9vbGVhbiB8IHVuZGVmaW5lZFxyXG50eXBlIFdpdGhSZXF1aXJlZDxULCBLIGV4dGVuZHMga2V5b2YgVD4gPSBUICYgeyBbUCBpbiBLXS0/OiBUW1BdIH1cclxuXHJcbmV4cG9ydCBjb25zdCBTRUFNX0dPT0dMRV9QTEFDRVNfQVVUT0NPTVBMRVRFX0RFRkFVTFRfT1BUSU9OUzogZ29vZ2xlLm1hcHMucGxhY2VzLkF1dG9jb21wbGV0ZU9wdGlvbnMgPSB7XHJcbiAgY29tcG9uZW50UmVzdHJpY3Rpb25zOiB7IGNvdW50cnk6ICdVUycgfVxyXG59XHJcblxyXG5ARGlyZWN0aXZlKHtcclxuICBzZWxlY3RvcjogJ2lucHV0W3NlYW1Hb29nbGVNYXBzUGxhY2VzQXV0b2NvbXBsZXRlXScsXHJcbiAgZXhwb3J0QXM6ICdzZWFtR29vZ2xlTWFwc1BsYWNlc0F1dG9jb21wbGV0ZSdcclxufSlcclxuZXhwb3J0IGNsYXNzIFRoZVNlYW1Hb29nbGVNYXBzUGxhY2VzQXV0b2NvbXBsZXRlRGlyZWN0aXZlIGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3ksIE9uQ2hhbmdlcyB7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBfYXV0b0NvbXBsZXRlUmVhZHlTdWJqZWN0ID0gbmV3IFN1YmplY3QoKVxyXG4gIHByaXZhdGUgcmVhZG9ubHkgX25nVW5zdWJzY3JpYmUgPSBuZXcgU3ViamVjdCgpXHJcblxyXG4gIHByaXZhdGUgX3BsYWNlQ2hhbmdlZFBlbmRpbmc6IHsgb2JzZXJ2YWJsZTogT2JzZXJ2YWJsZTxhbnk+LCBzdWJzY3JpYmVyOiBTdWJzY3JpYmVyPGFueT4gfVtdID0gW11cclxuICBwcml2YXRlIF9saXN0ZW5lcnM6IGdvb2dsZS5tYXBzLk1hcHNFdmVudExpc3RlbmVyW10gPSBbXVxyXG5cclxuICBwdWJsaWMgYXV0b0NvbXBsZXRlPzogZ29vZ2xlLm1hcHMucGxhY2VzLkF1dG9jb21wbGV0ZVxyXG5cclxuICBASW5wdXQoKVxyXG4gIHNldCBvcHRpb25zKHZhbHVlOiBnb29nbGUubWFwcy5wbGFjZXMuQXV0b2NvbXBsZXRlT3B0aW9ucyB8IHVuZGVmaW5lZCB8IG51bGwpIHtcclxuICAgIHRoaXMuX29wdGlvbnMgPSB2YWx1ZSB8fCBTRUFNX0dPT0dMRV9QTEFDRVNfQVVUT0NPTVBMRVRFX0RFRkFVTFRfT1BUSU9OU1xyXG4gIH1cclxuICBwcml2YXRlIF9vcHRpb25zOiBnb29nbGUubWFwcy5wbGFjZXMuQXV0b2NvbXBsZXRlT3B0aW9ucyA9IFNFQU1fR09PR0xFX1BMQUNFU19BVVRPQ09NUExFVEVfREVGQVVMVF9PUFRJT05TXHJcblxyXG4gIC8qKlxyXG4gICAqIFRoaXMgZXZlbnQgaXMgZmlyZWQgd2hlbiBhIFBsYWNlUmVzdWx0IGlzIG1hZGUgYXZhaWxhYmxlIGZvciBhIFBsYWNlIHRoZVxyXG4gICAqIHVzZXIgaGFzIHNlbGVjdGVkLiBJZiB0aGUgdXNlciBlbnRlcnMgdGhlIG5hbWUgb2YgYSBQbGFjZSB0aGF0IHdhcyBub3RcclxuICAgKiBzdWdnZXN0ZWQgYnkgdGhlIGNvbnRyb2wgYW5kIHByZXNzZXMgdGhlIEVudGVyIGtleSwgb3IgaWYgYSBQbGFjZSBEZXRhaWxzXHJcbiAgICogcmVxdWVzdCBmYWlscywgdGhlIFBsYWNlUmVzdWx0IGNvbnRhaW5zIHRoZSB1c2VyIGlucHV0IGluIHRoZSBuYW1lXHJcbiAgICogcHJvcGVydHksIHdpdGggbm8gb3RoZXIgcHJvcGVydGllcyBkZWZpbmVkLlxyXG4gICAqXHJcbiAgICogU2VlOiBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9tYXBzL2RvY3VtZW50YXRpb24vamF2YXNjcmlwdC9yZWZlcmVuY2UvcGxhY2VzLXdpZGdldCNBdXRvY29tcGxldGUucGxhY2VfY2hhbmdlZFxyXG4gICAqL1xyXG4gIEBPdXRwdXQoKSByZWFkb25seSBwbGFjZUNoYW5nZWQ6IE9ic2VydmFibGU8YW55PlxyXG5cclxuICBASG9zdEJpbmRpbmcoJ2F0dHIudHlwZScpIF9hdHRyVHlwZSA9ICd0ZXh0J1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2VsZW1lbnRSZWY6IEVsZW1lbnRSZWY8SFRNTElucHV0RWxlbWVudD4sXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9uZ1pvbmU6IE5nWm9uZSxcclxuICApIHtcclxuICAgIHRoaXMucGxhY2VDaGFuZ2VkID0gdGhpcy5fYXV0b0NvbXBsZXRlUmVhZHlTdWJqZWN0LnBpcGUoXHJcbiAgICAgIHN0YXJ0V2l0aCh1bmRlZmluZWQpLFxyXG4gICAgICBzd2l0Y2hNYXAoKCkgPT4gdGhpcy5fY3JlYXRlUGxhY2VDaGFuZ2VkT2JzZXJ2YWJsZTxhbnk+KCkpXHJcbiAgICApXHJcbiAgfVxyXG5cclxuICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIHRoaXMuX25nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XHJcbiAgICAgIHRoaXMuX3VudGlsR29vZ2xlTWFwc0FwaUxvYWRlZCgpLnBpcGUodGFrZVVudGlsKHRoaXMuX25nVW5zdWJzY3JpYmUpKS5zdWJzY3JpYmUoKCkgPT4ge1xyXG4gICAgICAgIHRoaXMuYXV0b0NvbXBsZXRlID0gbmV3IGdvb2dsZS5tYXBzLnBsYWNlcy5BdXRvY29tcGxldGUodGhpcy5nZXRIb3N0RWxlbWVudCgpLCB0aGlzLl9vcHRpb25zKVxyXG5cclxuICAgICAgICB0aGlzLl9wbGFjZUNoYW5nZWRQZW5kaW5nLmZvckVhY2gocGVuZGluZyA9PiBwZW5kaW5nLm9ic2VydmFibGUuc3Vic2NyaWJlKHBlbmRpbmcuc3Vic2NyaWJlcikpXHJcblxyXG4gICAgICAgIHRoaXMuX2F1dG9Db21wbGV0ZVJlYWR5U3ViamVjdC5uZXh0KClcclxuICAgICAgfSlcclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgIHRoaXMuX2xpc3RlbmVycy5mb3JFYWNoKGwgPT4gbC5yZW1vdmUoKSlcclxuICAgIHRoaXMuX2xpc3RlbmVycyA9IFtdXHJcblxyXG4gICAgdGhpcy5fbmdVbnN1YnNjcmliZS5uZXh0KClcclxuICAgIHRoaXMuX25nVW5zdWJzY3JpYmUuY29tcGxldGUoKVxyXG4gIH1cclxuXHJcbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuYXV0b0NvbXBsZXRlICYmIGNoYW5nZXNbJ29wdGlvbnMnXSkge1xyXG4gICAgICB0aGlzLmF1dG9Db21wbGV0ZS5zZXRPcHRpb25zKHRoaXMuX29wdGlvbnMpXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF91bnRpbEdvb2dsZU1hcHNBcGlMb2FkZWQoKTogT2JzZXJ2YWJsZTx2b2lkPiB7XHJcbiAgICByZXR1cm4gaW50ZXJ2YWwoNTAwKS5waXBlKFxyXG4gICAgICBmaWx0ZXIoKCkgPT4gISEod2luZG93Lmdvb2dsZSAmJiB3aW5kb3cuZ29vZ2xlLm1hcHMgJiYgd2luZG93Lmdvb2dsZS5tYXBzLnZlcnNpb24pKSxcclxuICAgICAgdGFrZSgxKSxcclxuICAgICAgbWFwVG8odW5kZWZpbmVkKSxcclxuICAgIClcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJldHVybnMgdGhlIGJvdW5kcyB0byB3aGljaCBwcmVkaWN0aW9ucyBhcmUgYmlhc2VkLlxyXG4gICAqL1xyXG4gIHB1YmxpYyBnZXRCb3VuZHMoKTogZ29vZ2xlLm1hcHMuTGF0TG5nQm91bmRzIHwgdW5kZWZpbmVkIHtcclxuICAgIHRoaXMuX2Fzc2VydEluaXRpYWxpemVkKClcclxuICAgIHJldHVybiB0aGlzLmF1dG9Db21wbGV0ZS5nZXRCb3VuZHMoKVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmV0dXJucyB0aGUgZmllbGRzIHRvIGJlIGluY2x1ZGVkIGZvciB0aGUgUGxhY2UgaW4gdGhlIGRldGFpbHMgcmVzcG9uc2VcclxuICAgKiB3aGVuIHRoZSBkZXRhaWxzIGFyZSBzdWNjZXNzZnVsbHkgcmV0cmlldmVkLiBGb3IgYSBsaXN0IG9mIGZpZWxkcyBzZWVcclxuICAgKiBbUGxhY2VSZXN1bHRdKGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL21hcHMvZG9jdW1lbnRhdGlvbi9qYXZhc2NyaXB0L3JlZmVyZW5jZS9wbGFjZXMtc2VydmljZSNQbGFjZVJlc3VsdCkuXHJcbiAgICovXHJcbiAgcHVibGljIGdldEZpZWxkcygpOiBzdHJpbmdbXSB8IHVuZGVmaW5lZCB7XHJcbiAgICB0aGlzLl9hc3NlcnRJbml0aWFsaXplZCgpXHJcbiAgICByZXR1cm4gKHRoaXMuYXV0b0NvbXBsZXRlIGFzIGFueSkuZ2V0RmllbGRzKClcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJldHVybnMgdGhlIGRldGFpbHMgb2YgdGhlIFBsYWNlIHNlbGVjdGVkIGJ5IHVzZXIgaWYgdGhlIGRldGFpbHMgd2VyZVxyXG4gICAqIHN1Y2Nlc3NmdWxseSByZXRyaWV2ZWQuIE90aGVyd2lzZSByZXR1cm5zIGEgc3R1YiBQbGFjZSBvYmplY3QsIHdpdGggdGhlXHJcbiAgICogbmFtZSBwcm9wZXJ0eSBzZXQgdG8gdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIGlucHV0IGZpZWxkLlxyXG4gICAqL1xyXG4gIHB1YmxpYyBnZXRQbGFjZSgpOiBnb29nbGUubWFwcy5wbGFjZXMuUGxhY2VSZXN1bHQge1xyXG4gICAgdGhpcy5fYXNzZXJ0SW5pdGlhbGl6ZWQoKVxyXG4gICAgcmV0dXJuIHRoaXMuYXV0b0NvbXBsZXRlLmdldFBsYWNlKClcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNldHMgdGhlIHByZWZlcnJlZCBhcmVhIHdpdGhpbiB3aGljaCB0byByZXR1cm4gUGxhY2UgcmVzdWx0cy4gUmVzdWx0cyBhcmVcclxuICAgKiBiaWFzZWQgdG93YXJkcywgYnV0IG5vdCByZXN0cmljdGVkIHRvLCB0aGlzIGFyZWEuXHJcbiAgICovXHJcbiAgcHVibGljIHNldEJvdW5kcyhib3VuZHM/OiBnb29nbGUubWFwcy5MYXRMbmdCb3VuZHMgfCBnb29nbGUubWFwcy5MYXRMbmdCb3VuZHNMaXRlcmFsKTogdm9pZCB7XHJcbiAgICB0aGlzLl9hc3NlcnRJbml0aWFsaXplZCgpXHJcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLW5vbi1udWxsLWFzc2VydGlvblxyXG4gICAgcmV0dXJuIHRoaXMuYXV0b0NvbXBsZXRlLnNldEJvdW5kcyhib3VuZHMhKVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU2V0cyB0aGUgY29tcG9uZW50IHJlc3RyaWN0aW9ucy4gQ29tcG9uZW50IHJlc3RyaWN0aW9ucyBhcmUgdXNlZCB0b1xyXG4gICAqIHJlc3RyaWN0IHByZWRpY3Rpb25zIHRvIG9ubHkgdGhvc2Ugd2l0aGluIHRoZSBwYXJlbnQgY29tcG9uZW50LiBGb3JcclxuICAgKiBleGFtcGxlLCB0aGUgY291bnRyeS5cclxuICAgKi9cclxuICBwdWJsaWMgc2V0Q29tcG9uZW50UmVzdHJpY3Rpb25zKHJlc3RyaWN0aW9ucz86IGdvb2dsZS5tYXBzLnBsYWNlcy5Db21wb25lbnRSZXN0cmljdGlvbnMpOiB2b2lkIHtcclxuICAgIHRoaXMuX2Fzc2VydEluaXRpYWxpemVkKClcclxuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tbm9uLW51bGwtYXNzZXJ0aW9uXHJcbiAgICByZXR1cm4gdGhpcy5hdXRvQ29tcGxldGUuc2V0Q29tcG9uZW50UmVzdHJpY3Rpb25zKHJlc3RyaWN0aW9ucyEpXHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTZXRzIHRoZSBmaWVsZHMgdG8gYmUgaW5jbHVkZWQgZm9yIHRoZSBQbGFjZSBpbiB0aGUgZGV0YWlscyByZXNwb25zZSB3aGVuXHJcbiAgICogdGhlIGRldGFpbHMgYXJlIHN1Y2Nlc3NmdWxseSByZXRyaWV2ZWQuIEZvciBhIGxpc3Qgb2YgZmllbGRzIHNlZVxyXG4gICAqIFtQbGFjZVJlc3VsdF0oaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vbWFwcy9kb2N1bWVudGF0aW9uL2phdmFzY3JpcHQvcmVmZXJlbmNlL3BsYWNlcy1zZXJ2aWNlI1BsYWNlUmVzdWx0KS5cclxuICAgKi9cclxuICBwdWJsaWMgc2V0RmllbGRzKGZpZWxkcz86IHN0cmluZ1tdKTogdm9pZCB7XHJcbiAgICB0aGlzLl9hc3NlcnRJbml0aWFsaXplZCgpXHJcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLW5vbi1udWxsLWFzc2VydGlvblxyXG4gICAgcmV0dXJuIHRoaXMuYXV0b0NvbXBsZXRlLnNldEZpZWxkcyhmaWVsZHMhKVxyXG4gIH1cclxuXHJcbiAgLyoqICovXHJcbiAgcHVibGljIHNldE9wdGlvbnMob3B0aW9ucz86IGdvb2dsZS5tYXBzLnBsYWNlcy5BdXRvY29tcGxldGVPcHRpb25zKTogdm9pZCB7XHJcbiAgICB0aGlzLl9hc3NlcnRJbml0aWFsaXplZCgpXHJcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLW5vbi1udWxsLWFzc2VydGlvblxyXG4gICAgcmV0dXJuIHRoaXMuYXV0b0NvbXBsZXRlLnNldE9wdGlvbnMob3B0aW9ucyEpXHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTZXRzIHRoZSB0eXBlcyBvZiBwcmVkaWN0aW9ucyB0byBiZSByZXR1cm5lZC4gRm9yIHN1cHBvcnRlZCB0eXBlcywgc2VlIHRoZVxyXG4gICAqIFtkZXZlbG9wZXIncyBndWlkZV0oaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vbWFwcy9kb2N1bWVudGF0aW9uL2phdmFzY3JpcHQvcGxhY2VzLWF1dG9jb21wbGV0ZSNjb25zdHJhaW4tcGxhY2UtdHlwZXMpLlxyXG4gICAqIElmIG5vIHR5cGVzIGFyZSBzcGVjaWZpZWQsIGFsbCB0eXBlcyB3aWxsIGJlIHJldHVybmVkLlxyXG4gICAqL1xyXG4gIHB1YmxpYyBzZXRUeXBlcyh0eXBlcz86IHN0cmluZ1tdKTogdm9pZCB7XHJcbiAgICB0aGlzLl9hc3NlcnRJbml0aWFsaXplZCgpXHJcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLW5vbi1udWxsLWFzc2VydGlvblxyXG4gICAgcmV0dXJuIHRoaXMuYXV0b0NvbXBsZXRlLnNldFR5cGVzKHR5cGVzISlcclxuICB9XHJcblxyXG4gIC8qKiBGb2N1c2VzIHRoZSBpbnB1dC4gKi9cclxuICBwdWJsaWMgZm9jdXMoKTogdm9pZCB7XHJcbiAgICB0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuZm9jdXMoKVxyXG4gIH1cclxuXHJcbiAgLyoqIFVuZm9jdXNlcyB0aGUgaW5wdXQuICovXHJcbiAgcHVibGljIGJsdXIoKTogdm9pZCB7XHJcbiAgICB0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuYmx1cigpXHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0SG9zdEVsZW1lbnQoKTogSFRNTElucHV0RWxlbWVudCB7XHJcbiAgICByZXR1cm4gdGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9jcmVhdGVQbGFjZUNoYW5nZWRPYnNlcnZhYmxlPFQ+KCk6IE9ic2VydmFibGU8VD4ge1xyXG4gICAgY29uc3Qgb2JzZXJ2YWJsZSA9IG5ldyBPYnNlcnZhYmxlPFQ+KHN1YnNjcmliZXIgPT4ge1xyXG4gICAgICBpZiAoIXRoaXMuYXV0b0NvbXBsZXRlKSB7XHJcbiAgICAgICAgdGhpcy5fcGxhY2VDaGFuZ2VkUGVuZGluZy5wdXNoKHsgb2JzZXJ2YWJsZSwgc3Vic2NyaWJlciB9KVxyXG4gICAgICAgIHJldHVybiB1bmRlZmluZWRcclxuICAgICAgfVxyXG4gICAgICBjb25zdCBsaXN0ZW5lciA9IHRoaXMuYXV0b0NvbXBsZXRlLmFkZExpc3RlbmVyKCdwbGFjZV9jaGFuZ2VkJywgKGV2ZW50OiBUKSA9PiB7XHJcbiAgICAgICAgdGhpcy5fbmdab25lLnJ1bigoKSA9PiBzdWJzY3JpYmVyLm5leHQoZXZlbnQpKVxyXG4gICAgICB9KVxyXG4gICAgICB0aGlzLl9saXN0ZW5lcnMucHVzaChsaXN0ZW5lcilcclxuXHJcbiAgICAgIHJldHVybiAoKSA9PiBsaXN0ZW5lci5yZW1vdmUoKVxyXG4gICAgfSlcclxuICAgIHJldHVybiBvYnNlcnZhYmxlXHJcbiAgfVxyXG5cclxuICAvKiogQXNzZXJ0cyB0aGF0IHRoZSBtYXAgaGFzIGJlZW4gaW5pdGlhbGl6ZWQuICovXHJcbiAgcHJpdmF0ZSBfYXNzZXJ0SW5pdGlhbGl6ZWQoKTogYXNzZXJ0cyB0aGlzIGlzIFdpdGhSZXF1aXJlZDxUaGVTZWFtR29vZ2xlTWFwc1BsYWNlc0F1dG9jb21wbGV0ZURpcmVjdGl2ZSwgJ2F1dG9Db21wbGV0ZSc+IHtcclxuICAgIGlmICghdGhpcy5hdXRvQ29tcGxldGUgJiYgKHR5cGVvZiBuZ0Rldk1vZGUgPT09ICd1bmRlZmluZWQnIHx8IG5nRGV2TW9kZSkpIHtcclxuICAgICAgdGhyb3cgRXJyb3IoXHJcbiAgICAgICAgJ0Nhbm5vdCBhY2Nlc3MgR29vZ2xlIE1hcCBQbGFjZXMgaW5mb3JtYXRpb24gYmVmb3JlIHRoZSBBUEkgaGFzIGJlZW4gaW5pdGlhbGl6ZWQuICcgK1xyXG4gICAgICAgICAgJ1BsZWFzZSB3YWl0IGZvciB0aGUgQVBJIHRvIGxvYWQgYmVmb3JlIHRyeWluZyB0byBpbnRlcmFjdCB3aXRoIGl0LicsXHJcbiAgICAgIClcclxuICAgIH1cclxuICB9XHJcbn1cclxuIl19
|