@guajiritos/map 0.0.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md ADDED
@@ -0,0 +1,144 @@
1
+ # Guajiritos Map
2
+
3
+ `Guajiritos Map` es una librería para Angular que permite la configuración de un mapa de `Leaflet` para su posterior uso de distintas formas.
4
+
5
+ ## Instalación
6
+
7
+ Con `npm`
8
+
9
+ ```sh
10
+ npm i @guajiritos/map --save
11
+ ```
12
+
13
+ Con `yarn`
14
+
15
+ ```sh
16
+ yarn add @guajiritos/map
17
+ ```
18
+
19
+ ## Nota
20
+
21
+ Para el uso correcto de esta librería es necesario tener instalado previamente `@ngular/material`, `leaflet` y `@types/leaflet`. En caso de no tener instalado las librerías anteriormente descritas el uso de la librería `@guajiritos/map` derivaría en errores para su aplicación.
22
+
23
+ ## Importación
24
+
25
+ Importar la librería como se muestra a continuación.
26
+
27
+ ```ts
28
+ import {GuajiritosMap} from "@guajiritos/map";
29
+ ```
30
+
31
+ Luego añadirla a la sección imports.
32
+
33
+ ```ts
34
+ imports: [
35
+ ...
36
+ GuajiritosMap,
37
+ ]
38
+ ```
39
+
40
+ ## Estilos
41
+
42
+ Para usar correctamente los estilos del mapa debe poner en su archivo `angular.json` la línea de código `"./node_modules/leaflet/dist/leaflet.css",` como se muestra a continuación
43
+
44
+ ```json
45
+ {
46
+ ...
47
+ "projects": {
48
+ "angular-leaflet-app": {
49
+ ...
50
+ "architect": {
51
+ "build": {
52
+ ...
53
+ "options": {
54
+ ...
55
+ "styles": [
56
+ "./node_modules/leaflet/dist/leaflet.css",
57
+ "src/styles.css"
58
+ ],
59
+ ...
60
+ }
61
+ ...
62
+ }
63
+ ...
64
+ }
65
+ }
66
+ }
67
+ }
68
+ ```
69
+
70
+ Para que los marcadores de leaflet puedan ser vistos en el mapa debe agregar al archivo `angular.json` los siguientes etilos como se muestra a continuación
71
+
72
+ ```json
73
+ {
74
+ ...
75
+ "projects": {
76
+ "angular-leaflet-example": {
77
+ ...
78
+ "architect": {
79
+ "build": {
80
+ ...
81
+ "options": {
82
+ ...
83
+ "assets": [
84
+ "src/favicon.ico",
85
+ "src/assets",
86
+ {
87
+ "glob": "**/*",
88
+ "input": "node_modules/leaflet/dist/images/",
89
+ "output": "./assets"
90
+ }
91
+ ],
92
+ ...
93
+ }
94
+ ...
95
+ }
96
+ ...
97
+ }
98
+ }
99
+ }
100
+ }
101
+ ```
102
+
103
+ ## Uso
104
+
105
+ En nuestro archivo HTML debemos agregar la etiqueta `guajiritos-multi-chips` como se muestra a continuación.
106
+
107
+ ```html
108
+
109
+ <guajiritos-map latLabel="Latitud" latPlaceholder="Latitud" lngLabel="Longitud" lngPlaceholder="Longitud"
110
+ [appearance]="appearance" [color]="color" [readonly]="false" [options]="options" [circle]="circle"
111
+ [icon]="icon" [markers]="markers()" [formControl]="form" (markerDragend)="markerDragEnd($event)">
112
+ </guajiritos-map>
113
+ ```
114
+
115
+ Cada una de las propiedades descritas en el ejemplo anterior son de uso requerido o no en dependencia de las necesidades de cada usuario. A continuación se explica cada una de ellas.
116
+
117
+ ```text
118
+ latLabel: Representa el label que se va a mostrar cuando se visualice el input de la latitud.
119
+
120
+ latPlaceholder: Representa el placeholder que se va a mostrar cuando se visualice el input de la latitud.
121
+
122
+ lngLabel: Representa el label que se va a mostrar cuando se visualice el input de la longitud.
123
+
124
+ lngPlaceholder: Representa el placeholder que se va a mostrar cuando se visualice el input de la longitud.
125
+
126
+ appearance: Representa la apariencia del componente. Por defecto toma el valor "outline".
127
+
128
+ color: Representa el color del componente. Por defecto su valor es "accent".
129
+
130
+ readonly: Convierte en solo lectura los inputs de latitud y longitud cuando sea necesario. Por defecto su valor es "false".
131
+
132
+ options: Representa las opciones iniciales del mapa que va ser mostrado.
133
+
134
+ circle: Utilizado para dibujar un círculo en el mapa.
135
+
136
+ icon: Valor para representar el ícono de los marcadores que serán dibujados sobre el mapa.
137
+
138
+ markers: Listado de marcadores que serán dibujados en el mapa. Éste listado debe estar representado en forma de arreglo de marcadores.
139
+
140
+ formControlName o formControl: Representa el FormControl al que se hace referencia en el formulario donde la librería es usada.
141
+
142
+ markerDragEnd: Evento que se lanza cuando el marcador es movido de una posición a otra.
143
+ ```
144
+
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Generated bundle index. Do not edit.
3
+ */
4
+ export * from './public-api';
5
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3VhamlyaXRvcy1tYXAuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9wcm9qZWN0cy9ndWFqaXJpdG9zLW1hcC9zcmMvZ3VhamlyaXRvcy1tYXAudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFFSCxjQUFjLGNBQWMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogR2VuZXJhdGVkIGJ1bmRsZSBpbmRleC4gRG8gbm90IGVkaXQuXG4gKi9cblxuZXhwb3J0ICogZnJvbSAnLi9wdWJsaWMtYXBpJztcbiJdfQ==
@@ -0,0 +1,300 @@
1
+ import { Component, EventEmitter, forwardRef, Input, Output } from "@angular/core";
2
+ import { NgIf } from "@angular/common";
3
+ import * as L from "leaflet";
4
+ import { icon, LatLng, layerGroup, Marker } from "leaflet";
5
+ import { MatInputModule } from "@angular/material/input";
6
+ import { NG_VALUE_ACCESSOR, ReactiveFormsModule, UntypedFormControl, UntypedFormGroup } from "@angular/forms";
7
+ import { BrowserAnimationsModule } from "@angular/platform-browser/animations";
8
+ import { Subject, takeUntil } from "rxjs";
9
+ import { MatIconModule } from "@angular/material/icon";
10
+ import * as i0 from "@angular/core";
11
+ import * as i1 from "@angular/common";
12
+ import * as i2 from "@angular/material/input";
13
+ import * as i3 from "@angular/material/form-field";
14
+ import * as i4 from "@angular/forms";
15
+ import * as i5 from "@angular/material/icon";
16
+ export const DEFAULT_MAP_OPTION = {
17
+ center: [23.130257185291036, -82.35626220703126],
18
+ draggable: true,
19
+ zoom: 8,
20
+ updateWithClick: false,
21
+ updateWithDoubleClick: false,
22
+ zoomControl: false,
23
+ borderRadius: '8px',
24
+ scrollWheelZoom: false,
25
+ scrollable: false
26
+ };
27
+ export class GuajiritosMap {
28
+ constructor() {
29
+ this._map = null;
30
+ this._layerGroup = new L.LayerGroup();
31
+ this._markersList = [];
32
+ this.form = new UntypedFormGroup({
33
+ latitude: new UntypedFormControl({ value: null, disabled: false }),
34
+ longitude: new UntypedFormControl({ value: null, disabled: false })
35
+ });
36
+ this.latLabel = '';
37
+ this.latPlaceholder = '';
38
+ this.lngLabel = '';
39
+ this.lngPlaceholder = '';
40
+ this.appearance = 'outline';
41
+ this.color = 'accent';
42
+ this.readonly = false;
43
+ /**
44
+ * Default map options
45
+ */
46
+ this.options = {};
47
+ /**
48
+ * Add a circle on the map
49
+ */
50
+ this.circle = {
51
+ center: {
52
+ lat: 23.130257185291036,
53
+ lng: -82.35626220703126
54
+ },
55
+ radius: 100
56
+ };
57
+ /**
58
+ * Default marker icon
59
+ */
60
+ this.icon = {
61
+ iconSize: [25, 41],
62
+ iconAnchor: [13, 41],
63
+ iconUrl: 'marker-icon.png'
64
+ };
65
+ /**
66
+ * Se lanza cada vez que cambia un marcador
67
+ */
68
+ this.markerDragend = new EventEmitter();
69
+ }
70
+ static { this._observableSubject$ = new Subject(); }
71
+ /**
72
+ * List of markers
73
+ * @param markers - Markers array
74
+ */
75
+ set markers(markers) {
76
+ if (markers && markers.length > 0) {
77
+ this._markersList = markers;
78
+ setTimeout(() => {
79
+ this._layerGroup?.clearLayers();
80
+ markers.forEach((m) => {
81
+ this._addMarker(m);
82
+ });
83
+ this.changeCenter(this._createMarker(markers[0]));
84
+ }, 100);
85
+ }
86
+ }
87
+ /**
88
+ * Form initialization
89
+ * @param data - Initial data
90
+ */
91
+ _initForm(data) {
92
+ this.form.patchValue({
93
+ latitude: data?.latitude,
94
+ longitude: data?.longitude,
95
+ });
96
+ }
97
+ /**
98
+ * Main properties of the map
99
+ * @private
100
+ */
101
+ _initMap() {
102
+ this._map = L.map('map', {
103
+ center: this.options?.center ?? DEFAULT_MAP_OPTION.center,
104
+ dragging: this.options?.draggable ?? DEFAULT_MAP_OPTION.draggable,
105
+ zoom: this.options?.zoom ?? DEFAULT_MAP_OPTION.zoom,
106
+ zoomControl: this.options?.zoomControl || DEFAULT_MAP_OPTION.zoomControl,
107
+ scrollWheelZoom: this.options?.scrollWheelZoom || DEFAULT_MAP_OPTION.scrollWheelZoom,
108
+ maxZoom: 18,
109
+ minZoom: 3,
110
+ });
111
+ this._layerGroup = layerGroup().addTo(this._map);
112
+ L.tileLayer('http://{s}.tile.openstreetmap.fr/hot/{z}/{x}/{y}.png').addTo(this._map);
113
+ }
114
+ /**
115
+ * Add marker to map
116
+ * @param center - center of the circle
117
+ * @param radius - radius of the circle in meters
118
+ * @private
119
+ */
120
+ _addCircle(center, radius) {
121
+ if (this._map && center) {
122
+ L.circleMarker([center?.lat, center?.lng], { radius }).addTo(this._map);
123
+ }
124
+ }
125
+ /**
126
+ * Add marker to map
127
+ * @param marker - Point of the map
128
+ */
129
+ _addMarker(marker) {
130
+ if (this._map && marker) {
131
+ const markerAdd = L.marker({
132
+ lat: marker?.lat,
133
+ lng: marker?.lng
134
+ }, {
135
+ draggable: marker?.draggable ?? true,
136
+ autoPan: true
137
+ }).setIcon(icon({
138
+ iconSize: this.icon?.iconSize,
139
+ iconAnchor: this.icon?.iconAnchor,
140
+ iconUrl: this.icon?.iconUrl
141
+ })).addTo(this._layerGroup);
142
+ markerAdd.on('dragend', () => {
143
+ this.changeCenter(markerAdd);
144
+ this.markerDragend.emit(markerAdd.getLatLng());
145
+ });
146
+ }
147
+ }
148
+ /**
149
+ * Add a marker on the map
150
+ * @param marker - Point of the map
151
+ * @private
152
+ */
153
+ _createMarker(marker) {
154
+ const markerCreate = new Marker(new LatLng(marker?.lat, marker?.lng), {
155
+ draggable: marker?.draggable ?? true,
156
+ autoPan: true
157
+ }).setIcon(icon({
158
+ iconSize: this.icon?.iconSize,
159
+ iconAnchor: this.icon?.iconAnchor,
160
+ iconUrl: this.icon?.iconUrl
161
+ }));
162
+ markerCreate.on('dragend', () => {
163
+ this.changeCenter(markerCreate);
164
+ this.markerDragend.emit(markerCreate.getLatLng());
165
+ });
166
+ return markerCreate;
167
+ }
168
+ /**
169
+ * Get latitude and longitude values if maker map is only one
170
+ * @private
171
+ */
172
+ _getLatLng() {
173
+ if (this._markersList?.length === 1) {
174
+ this.form.patchValue({
175
+ latitude: this._markersList?.[0]?.lat,
176
+ longitude: this._markersList?.[0]?.lng
177
+ });
178
+ }
179
+ }
180
+ _latLngChangeCenter(marker) {
181
+ this._map?.setView({
182
+ lat: marker?.latitude,
183
+ lng: marker?.longitude
184
+ });
185
+ this._markersList[0].lat = parseFloat(marker?.latitude);
186
+ this._markersList[0].lng = parseFloat(marker?.longitude);
187
+ this._layerGroup?.clearLayers();
188
+ const markerAdd = L.marker({
189
+ lat: this._markersList?.[0]?.lat,
190
+ lng: this._markersList?.[0]?.lng,
191
+ }, {
192
+ draggable: marker?.draggable ?? true,
193
+ autoPan: true
194
+ }).addTo(this._layerGroup);
195
+ markerAdd.on('dragend', () => {
196
+ this.changeCenter(markerAdd);
197
+ this.markerDragend.emit(markerAdd.getLatLng());
198
+ });
199
+ }
200
+ /**
201
+ * Make visible/hide latitude and longitude inputs
202
+ * @public
203
+ */
204
+ hideLatLng() {
205
+ return this._markersList?.length === 1;
206
+ }
207
+ /**
208
+ * Put the map center on marker position
209
+ * @param marker - Point of the map
210
+ * @public
211
+ */
212
+ changeCenter(marker) {
213
+ this._map?.setView(marker?.getLatLng());
214
+ }
215
+ propagateChange(_) {
216
+ }
217
+ ;
218
+ registerOnChange(fn) {
219
+ this.propagateChange = fn;
220
+ }
221
+ registerOnTouched() {
222
+ }
223
+ setDisabledState(isDisabled) {
224
+ if (isDisabled) {
225
+ this.form.disable();
226
+ }
227
+ else {
228
+ this.form.enable();
229
+ }
230
+ }
231
+ writeValue(form) {
232
+ if (form) {
233
+ this._initForm(form);
234
+ }
235
+ }
236
+ ngOnInit() {
237
+ this._getLatLng();
238
+ this.form.valueChanges
239
+ .pipe(takeUntil(GuajiritosMap._observableSubject$.asObservable()))
240
+ .subscribe(() => {
241
+ this.propagateChange(this.form.value);
242
+ this._latLngChangeCenter(this.form.value);
243
+ });
244
+ }
245
+ ngAfterViewInit() {
246
+ this._initMap();
247
+ if (this.circle) {
248
+ this._addCircle(this.circle?.center, this.circle?.radius);
249
+ }
250
+ }
251
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.8", ngImport: i0, type: GuajiritosMap, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
252
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.8", type: GuajiritosMap, isStandalone: true, selector: "guajiritos-map", inputs: { latLabel: "latLabel", latPlaceholder: "latPlaceholder", lngLabel: "lngLabel", lngPlaceholder: "lngPlaceholder", appearance: "appearance", color: "color", readonly: "readonly", options: "options", circle: "circle", icon: "icon", markers: "markers" }, outputs: { markerDragend: "markerDragend" }, providers: [
253
+ {
254
+ provide: NG_VALUE_ACCESSOR,
255
+ useExisting: forwardRef(() => GuajiritosMap),
256
+ multi: true
257
+ }
258
+ ], ngImport: i0, template: "<div class=\"latLngInput\" [formGroup]=\"form\" *ngIf=\"hideLatLng()\">\n <mat-form-field [appearance]=\"appearance\" [color]=\"color\" class='w-100'>\n <mat-label>{{latLabel}}</mat-label>\n <mat-icon matSuffix class=\"material-icons-outlined\" [color]=\"color\">place</mat-icon>\n <input matInput [placeholder]=\"latPlaceholder\" [readonly]=\"readonly\" formControlName=\"latitude\">\n </mat-form-field>\n \n <mat-form-field [appearance]=\"appearance\" [color]=\"color\" class='w-100'>\n <mat-label>{{lngLabel}}</mat-label>\n <mat-icon matSuffix class=\"material-icons-outlined\" [color]=\"color\">place</mat-icon>\n <input matInput [placeholder]=\"lngPlaceholder\" [readonly]=\"readonly\" formControlName=\"longitude\">\n </mat-form-field>\n</div>\n\n<div id=\"map\" class=\"map\"></div>\n", styles: [".latLngInput{display:flex;flex-direction:row;gap:1rem}.map{min-height:400px;max-width:100%}\n"], dependencies: [{ kind: "ngmodule", type: BrowserAnimationsModule }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i2.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i3.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i3.MatLabel, selector: "mat-label" }, { kind: "directive", type: i3.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i4.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i4.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i4.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i5.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }] }); }
259
+ }
260
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.8", ngImport: i0, type: GuajiritosMap, decorators: [{
261
+ type: Component,
262
+ args: [{ selector: 'guajiritos-map', standalone: true, imports: [
263
+ BrowserAnimationsModule,
264
+ MatInputModule,
265
+ ReactiveFormsModule,
266
+ NgIf,
267
+ MatIconModule
268
+ ], providers: [
269
+ {
270
+ provide: NG_VALUE_ACCESSOR,
271
+ useExisting: forwardRef(() => GuajiritosMap),
272
+ multi: true
273
+ }
274
+ ], template: "<div class=\"latLngInput\" [formGroup]=\"form\" *ngIf=\"hideLatLng()\">\n <mat-form-field [appearance]=\"appearance\" [color]=\"color\" class='w-100'>\n <mat-label>{{latLabel}}</mat-label>\n <mat-icon matSuffix class=\"material-icons-outlined\" [color]=\"color\">place</mat-icon>\n <input matInput [placeholder]=\"latPlaceholder\" [readonly]=\"readonly\" formControlName=\"latitude\">\n </mat-form-field>\n \n <mat-form-field [appearance]=\"appearance\" [color]=\"color\" class='w-100'>\n <mat-label>{{lngLabel}}</mat-label>\n <mat-icon matSuffix class=\"material-icons-outlined\" [color]=\"color\">place</mat-icon>\n <input matInput [placeholder]=\"lngPlaceholder\" [readonly]=\"readonly\" formControlName=\"longitude\">\n </mat-form-field>\n</div>\n\n<div id=\"map\" class=\"map\"></div>\n", styles: [".latLngInput{display:flex;flex-direction:row;gap:1rem}.map{min-height:400px;max-width:100%}\n"] }]
275
+ }], ctorParameters: function () { return []; }, propDecorators: { latLabel: [{
276
+ type: Input
277
+ }], latPlaceholder: [{
278
+ type: Input
279
+ }], lngLabel: [{
280
+ type: Input
281
+ }], lngPlaceholder: [{
282
+ type: Input
283
+ }], appearance: [{
284
+ type: Input
285
+ }], color: [{
286
+ type: Input
287
+ }], readonly: [{
288
+ type: Input
289
+ }], options: [{
290
+ type: Input
291
+ }], circle: [{
292
+ type: Input
293
+ }], icon: [{
294
+ type: Input
295
+ }], markers: [{
296
+ type: Input
297
+ }], markerDragend: [{
298
+ type: Output
299
+ }] } });
300
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFwLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2d1YWppcml0b3MtbWFwL3NyYy9saWIvbWFwLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uL3Byb2plY3RzL2d1YWppcml0b3MtbWFwL3NyYy9saWIvbWFwLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBZ0IsU0FBUyxFQUFFLFlBQVksRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFVLE1BQU0sRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUN4RyxPQUFPLEVBQWUsSUFBSSxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFDbkQsT0FBTyxLQUFLLENBQUMsTUFBTSxTQUFTLENBQUM7QUFDN0IsT0FBTyxFQUFDLElBQUksRUFBRSxNQUFNLEVBQW9CLFVBQVUsRUFBbUIsTUFBTSxFQUFDLE1BQU0sU0FBUyxDQUFDO0FBQzVGLE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSx5QkFBeUIsQ0FBQztBQUN2RCxPQUFPLEVBRUwsaUJBQWlCLEVBQ2pCLG1CQUFtQixFQUNuQixrQkFBa0IsRUFDbEIsZ0JBQWdCLEVBQ2pCLE1BQU0sZ0JBQWdCLENBQUM7QUFHeEIsT0FBTyxFQUFDLHVCQUF1QixFQUFDLE1BQU0sc0NBQXNDLENBQUM7QUFDN0UsT0FBTyxFQUFDLE9BQU8sRUFBRSxTQUFTLEVBQUMsTUFBTSxNQUFNLENBQUM7QUFDeEMsT0FBTyxFQUFDLGFBQWEsRUFBQyxNQUFNLHdCQUF3QixDQUFDOzs7Ozs7O0FBZ0RyRCxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBYztJQUMzQyxNQUFNLEVBQUUsQ0FBQyxrQkFBa0IsRUFBRSxDQUFDLGlCQUFpQixDQUFDO0lBQ2hELFNBQVMsRUFBRSxJQUFJO0lBQ2YsSUFBSSxFQUFFLENBQUM7SUFDUCxlQUFlLEVBQUUsS0FBSztJQUN0QixxQkFBcUIsRUFBRSxLQUFLO0lBQzVCLFdB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OzBFQWdCUSxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLGNBQWM7c0JBQXRCLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxjQUFjO3NCQUF0QixLQUFLO2dCQUNHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0csS0FBSztzQkFBYixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBSUcsT0FBTztzQkFBZixLQUFLO2dCQUlHLE1BQU07c0JBQWQsS0FBSztnQkFVRyxJQUFJO3NCQUFaLEtBQUs7Z0JBVU8sT0FBTztzQkFBbkIsS0FBSztnQkFnQkksYUFBYTtzQkFBdEIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7QWZ0ZXJWaWV3SW5pdCwgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIGZvcndhcmRSZWYsIElucHV0LCBPbkluaXQsIE91dHB1dH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCB7Q29tbW9uTW9kdWxlLCBOZ0lmfSBmcm9tIFwiQGFuZ3VsYXIvY29tbW9uXCI7XG5pbXBvcnQgKiBhcyBMIGZyb20gXCJsZWFmbGV0XCI7XG5pbXBvcnQge2ljb24sIExhdExuZywgTGF0TG5nRXhwcmVzc2lvbiwgbGF5ZXJHcm91cCwgTGF5ZXJHcm91cCwgTWFwLCBNYXJrZXJ9IGZyb20gXCJsZWFmbGV0XCI7XG5pbXBvcnQge01hdElucHV0TW9kdWxlfSBmcm9tIFwiQGFuZ3VsYXIvbWF0ZXJpYWwvaW5wdXRcIjtcbmltcG9ydCB7XG4gIENvbnRyb2xWYWx1ZUFjY2Vzc29yLFxuICBOR19WQUxVRV9BQ0NFU1NPUixcbiAgUmVhY3RpdmVGb3Jtc01vZHVsZSxcbiAgVW50eXBlZEZvcm1Db250cm9sLFxuICBVbnR5cGVkRm9ybUdyb3VwXG59IGZyb20gXCJAYW5ndWxhci9mb3Jtc1wiO1xuaW1wb3J0IHtNYXRGb3JtRmllbGRBcHBlYXJhbmNlfSBmcm9tIFwiQGFuZ3VsYXIvbWF0ZXJpYWwvZm9ybS1maWVsZFwiO1xuaW1wb3J0IHtUaGVtZVBhbGV0dGV9IGZyb20gXCJAYW5ndWxhci9tYXRlcmlhbC9jb3JlXCI7XG5pbXBvcnQge0Jyb3dzZXJBbmltYXRpb25zTW9kdWxlfSBmcm9tIFwiQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3Nlci9hbmltYXRpb25zXCI7XG5pbXBvcnQge1N1YmplY3QsIHRha2VVbnRpbH0gZnJvbSBcInJ4anNcIjtcbmltcG9ydCB7TWF0SWNvbk1vZHVsZX0gZnJvbSBcIkBhbmd1bGFyL21hdGVyaWFsL2ljb25cIjtcblxuLyoqXG4gKiBNYXAgb3B0aW9ucyBpbnRlcmZhY2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBNYXBPcHRpb24ge1xuICBjZW50ZXI/OiBbbnVtYmVyLCBudW1iZXJdLFxuICBkcmFnZ2FibGU/OiBib29sZWFuLFxuICB1cGRhdGVXaXRoQ2xpY2s/OiBib29sZWFuLFxuICB1cGRhdGVXaXRoRG91YmxlQ2xpY2s/OiBib29sZWFuLFxuICB6b29tPzogbnVtYmVyLFxuICBib3JkZXJSYWRpdXM/OiBzdHJpbmcsXG4gIHNjcm9sbGFibGU/OiBib29sZWFuLFxuICB6b29tQ29udHJvbD86IGJvb2xlYW4sXG4gIHNjcm9sbFdoZWVsWm9vbT86IGJvb2xlYW4sXG59XG5cbi8qKlxuICogTWFya2VyIGludGVyZmFjZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIE1hcmtlck1hcCB7XG4gIGxhdDogbnVtYmVyO1xuICBsbmc6IG51bWJlcjtcbiAgZHJhZ2dhYmxlPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBJY29uIGludGVyZmFjZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEljb24ge1xuICBpY29uU2l6ZTogW251bWJlciwgbnVtYmVyXTtcbiAgaWNvbkFuY2hvcjogW251bWJlciwgbnVtYmVyXTtcbiAgaWNvblVybDogc3RyaW5nO1xuICBpY29uUmV0aW5hVXJsPzogc3RyaW5nLFxuICBzaGFkb3dVcmw/OiBzdHJpbmcsXG4gIHBvcHVwQW5jaG9yPzogW251bWJlciwgbnVtYmVyXSxcbiAgdG9vbHRpcEFuY2hvcj86IFtudW1iZXIsIG51bWJlcl0sXG4gIHNoYWRvd1NpemU/OiBbbnVtYmVyLCBudW1iZXJdLFxufVxuXG4vKipcbiAqIENpcmNsZSBtYXAgaW50ZXJmYWNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2lyY2xlTWFwIHtcbiAgY2VudGVyOiBNYXJrZXJNYXA7XG4gIHJhZGl1czogbnVtYmVyO1xufVxuXG5leHBvcnQgY29uc3QgREVGQVVMVF9NQVBfT1BUSU9OOiBNYXBPcHRpb24gPSB7XG4gIGNlbnRlcjogWzIzLjEzMDI1NzE4NTI5MTAzNiwgLTgyLjM1NjI2MjIwNzAzMTI2XSxcbiAgZHJhZ2dhYmxlOiB0cnVlLFxuICB6b29tOiA4LFxuICB1cGRhdGVXaXRoQ2xpY2s6IGZhbHNlLFxuICB1cGRhdGVXaXRoRG91YmxlQ2xpY2s6IGZhbHNlLFxuICB6b29tQ29udHJvbDogZmFsc2UsXG4gIGJvcmRlclJhZGl1czogJzhweCcsXG4gIHNjcm9sbFdoZWVsWm9vbTogZmFsc2UsXG4gIHNjcm9sbGFibGU6IGZhbHNlXG59O1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdndWFqaXJpdG9zLW1hcCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9tYXAuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9tYXAuY29tcG9uZW50LnNjc3MnXSxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW1xuICAgIEJyb3dzZXJBbmltYXRpb25zTW9kdWxlLFxuICAgIE1hdElucHV0TW9kdWxlLFxuICAgIFJlYWN0aXZlRm9ybXNNb2R1bGUsXG4gICAgTmdJZixcbiAgICBNYXRJY29uTW9kdWxlXG4gIF0sXG4gIHByb3ZpZGVyczogW1xuICAgIHtcbiAgICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gR3VhamlyaXRvc01hcCksXG4gICAgICBtdWx0aTogdHJ1ZVxuICAgIH1cbiAgXVxufSlcbmV4cG9ydCBjbGFzcyBHdWFqaXJpdG9zTWFwIGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCwgT25Jbml0LCBDb250cm9sVmFsdWVBY2Nlc3NvciB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICB9XG4gIFxuICBwcml2YXRlIHN0YXRpYyBfb2JzZXJ2YWJsZVN1YmplY3QkOiBTdWJqZWN0PHZvaWQ+ID0gbmV3IFN1YmplY3QoKTtcbiAgcHJpdmF0ZSBfbWFwOiBNYXAgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBfbGF5ZXJHcm91cDogTGF5ZXJHcm91cCA9IG5ldyBMLkxheWVyR3JvdXAoKTtcbiAgcHJpdmF0ZSBfbWFya2Vyc0xpc3Q6IE1hcmtlck1hcFtdID0gW107XG4gIFxuICBwdWJsaWMgZm9ybTogVW50eXBlZEZvcm1Hcm91cCA9IG5ldyBVbnR5cGVkRm9ybUdyb3VwKHtcbiAgICBsYXRpdHVkZTogbmV3IFVudHlwZWRGb3JtQ29udHJvbCh7dmFsdWU6IG51bGwsIGRpc2FibGVkOiBmYWxzZX0pLFxuICAgIGxvbmdpdHVkZTogbmV3IFVudHlwZWRGb3JtQ29udHJvbCh7dmFsdWU6IG51bGwsIGRpc2FibGVkOiBmYWxzZX0pXG4gIH0pO1xuICBcbiAgQElucHV0KCkgbGF0TGFiZWw6IHN0cmluZyA9ICcnO1xuICBASW5wdXQoKSBsYXRQbGFjZWhvbGRlcjogc3RyaW5nID0gJyc7XG4gIEBJbnB1dCgpIGxuZ0xhYmVsOiBzdHJpbmcgPSAnJztcbiAgQElucHV0KCkgbG5nUGxhY2Vob2xkZXI6IHN0cmluZyA9ICcnO1xuICBASW5wdXQoKSBhcHBlYXJhbmNlOiBNYXRGb3JtRmllbGRBcHBlYXJhbmNlID0gJ291dGxpbmUnO1xuICBASW5wdXQoKSBjb2xvcjogVGhlbWVQYWxldHRlID0gJ2FjY2VudCc7XG4gIEBJbnB1dCgpIHJlYWRvbmx5OiBib29sZWFuID0gZmFsc2U7XG4gIC8qKlxuICAgKiBEZWZhdWx0IG1hcCBvcHRpb25zXG4gICAqL1xuICBASW5wdXQoKSBvcHRpb25zOiBNYXBPcHRpb24gPSB7fTtcbiAgLyoqXG4gICAqIEFkZCBhIGNpcmNsZSBvbiB0aGUgbWFwXG4gICAqL1xuICBASW5wdXQoKSBjaXJjbGU6IENpcmNsZU1hcCA9IHtcbiAgICBjZW50ZXI6IHtcbiAgICAgIGxhdDogMjMuMTMwMjU3MTg1MjkxMDM2LFxuICAgICAgbG5nOiAtODIuMzU2MjYyMjA3MDMxMjZcbiAgICB9LFxuICAgIHJhZGl1czogMTAwXG4gIH07XG4gIC8qKlxuICAgKiBEZWZhdWx0IG1hcmtlciBpY29uXG4gICAqL1xuICBASW5wdXQoKSBpY29uOiBJY29uID0ge1xuICAgIGljb25TaXplOiBbMjUsIDQxXSxcbiAgICBpY29uQW5jaG9yOiBbMTMsIDQxXSxcbiAgICBpY29uVXJsOiAnbWFya2VyLWljb24ucG5nJ1xuICB9O1xuICBcbiAgLyoqXG4gICAqIExpc3Qgb2YgbWFya2Vyc1xuICAgKiBAcGFyYW0gbWFya2VycyAtIE1hcmtlcnMgYXJyYXlcbiAgICovXG4gIEBJbnB1dCgpIHNldCBtYXJrZXJzKG1hcmtlcnM6IE1hcmtlck1hcFtdKSB7XG4gICAgaWYgKG1hcmtlcnMgJiYgbWFya2Vycy5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLl9tYXJrZXJzTGlzdCA9IG1hcmtlcnM7XG4gICAgICBzZXRUaW1lb3V0KCgpOiB2b2lkID0+IHtcbiAgICAgICAgdGhpcy5fbGF5ZXJHcm91cD8uY2xlYXJMYXllcnMoKTtcbiAgICAgICAgbWFya2Vycy5mb3JFYWNoKChtOiBhbnkpOiB2b2lkID0+IHtcbiAgICAgICAgICB0aGlzLl9hZGRNYXJrZXIobSk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmNoYW5nZUNlbnRlcih0aGlzLl9jcmVhdGVNYXJrZXIobWFya2Vyc1swXSkpO1xuICAgICAgfSwgMTAwKTtcbiAgICB9XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBTZSBsYW56YSBjYWRhIHZleiBxdWUgY2FtYmlhIHVuIG1hcmNhZG9yXG4gICAqL1xuICBAT3V0cHV0KCkgbWFya2VyRHJhZ2VuZDogRXZlbnRFbWl0dGVyPExhdExuZz4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIFxuICAvKipcbiAgICogRm9ybSBpbml0aWFsaXphdGlvblxuICAgKiBAcGFyYW0gZGF0YSAtIEluaXRpYWwgZGF0YVxuICAgKi9cbiAgcHJpdmF0ZSBfaW5pdEZvcm0oZGF0YTogYW55KTogdm9pZCB7XG4gICAgdGhpcy5mb3JtLnBhdGNoVmFsdWUoe1xuICAgICAgbGF0aXR1ZGU6IGRhdGE/LmxhdGl0dWRlLFxuICAgICAgbG9uZ2l0dWRlOiBkYXRhPy5sb25naXR1ZGUsXG4gICAgfSk7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBNYWluIHByb3BlcnRpZXMgb2YgdGhlIG1hcFxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSBfaW5pdE1hcCgpOiB2b2lkIHtcbiAgICB0aGlzLl9tYXAgPSBMLm1hcCgnbWFwJywge1xuICAgICAgY2VudGVyOiB0aGlzLm9wdGlvbnM/LmNlbnRlciBhcyBMYXRMbmdFeHByZXNzaW9uID8/IERFRkFVTFRfTUFQX09QVElPTi5jZW50ZXIsXG4gICAgICBkcmFnZ2luZzogdGhpcy5vcHRpb25zPy5kcmFnZ2FibGUgPz8gREVGQVVMVF9NQVBfT1BUSU9OLmRyYWdnYWJsZSxcbiAgICAgIHpvb206IHRoaXMub3B0aW9ucz8uem9vbSA/PyBERUZBVUxUX01BUF9PUFRJT04uem9vbSxcbiAgICAgIHpvb21Db250cm9sOiB0aGlzLm9wdGlvbnM/Lnpvb21Db250cm9sIHx8IERFRkFVTFRfTUFQX09QVElPTi56b29tQ29udHJvbCxcbiAgICAgIHNjcm9sbFdoZWVsWm9vbTogdGhpcy5vcHRpb25zPy5zY3JvbGxXaGVlbFpvb20gfHwgREVGQVVMVF9NQVBfT1BUSU9OLnNjcm9sbFdoZWVsWm9vbSxcbiAgICAgIG1heFpvb206IDE4LFxuICAgICAgbWluWm9vbTogMyxcbiAgICB9KTtcbiAgICBcbiAgICB0aGlzLl9sYXllckdyb3VwID0gbGF5ZXJHcm91cCgpLmFkZFRvKHRoaXMuX21hcCk7XG4gICAgXG4gICAgTC50aWxlTGF5ZXIoJ2h0dHA6Ly97c30udGlsZS5vcGVuc3RyZWV0bWFwLmZyL2hvdC97en0ve3h9L3t5fS5wbmcnKS5hZGRUbyh0aGlzLl9tYXApO1xuICB9XG4gIFxuICAvKipcbiAgICogQWRkIG1hcmtlciB0byBtYXBcbiAgICogQHBhcmFtIGNlbnRlciAtIGNlbnRlciBvZiB0aGUgY2lyY2xlXG4gICAqIEBwYXJhbSByYWRpdXMgLSByYWRpdXMgb2YgdGhlIGNpcmNsZSBpbiBtZXRlcnNcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgX2FkZENpcmNsZShjZW50ZXI6IE1hcmtlck1hcCwgcmFkaXVzOiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fbWFwICYmIGNlbnRlcikge1xuICAgICAgTC5jaXJjbGVNYXJrZXIoW2NlbnRlcj8ubGF0LCBjZW50ZXI/LmxuZ10sIHtyYWRpdXN9KS5hZGRUbyh0aGlzLl9tYXApO1xuICAgIH1cbiAgfVxuICBcbiAgLyoqXG4gICAqIEFkZCBtYXJrZXIgdG8gbWFwXG4gICAqIEBwYXJhbSBtYXJrZXIgLSBQb2ludCBvZiB0aGUgbWFwXG4gICAqL1xuICBwcml2YXRlIF9hZGRNYXJrZXIobWFya2VyOiBNYXJrZXJNYXApOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fbWFwICYmIG1hcmtlcikge1xuICAgICAgY29uc3QgbWFya2VyQWRkID0gTC5tYXJrZXIoe1xuICAgICAgICBsYXQ6IG1hcmtlcj8ubGF0LFxuICAgICAgICBsbmc6IG1hcmtlcj8ubG5nXG4gICAgICB9LCB7XG4gICAgICAgIGRyYWdnYWJsZTogbWFya2VyPy5kcmFnZ2FibGUgPz8gdHJ1ZSxcbiAgICAgICAgYXV0b1BhbjogdHJ1ZVxuICAgICAgfSkuc2V0SWNvbihcbiAgICAgICAgaWNvbih7XG4gICAgICAgICAgaWNvblNpemU6IHRoaXMuaWNvbj8uaWNvblNpemUsXG4gICAgICAgICAgaWNvbkFuY2hvcjogdGhpcy5pY29uPy5pY29uQW5jaG9yLFxuICAgICAgICAgIGljb25Vcmw6IHRoaXMuaWNvbj8uaWNvblVybFxuICAgICAgICB9KVxuICAgICAgKS5hZGRUbyh0aGlzLl9sYXllckdyb3VwKTtcbiAgICAgIFxuICAgICAgbWFya2VyQWRkLm9uKCdkcmFnZW5kJywgKCk6IHZvaWQgPT4ge1xuICAgICAgICB0aGlzLmNoYW5nZUNlbnRlcihtYXJrZXJBZGQpO1xuICAgICAgICB0aGlzLm1hcmtlckRyYWdlbmQuZW1pdChtYXJrZXJBZGQuZ2V0TGF0TG5nKCkpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIFxuICAvKipcbiAgICogQWRkIGEgbWFya2VyIG9uIHRoZSBtYXBcbiAgICogQHBhcmFtIG1hcmtlciAtIFBvaW50IG9mIHRoZSBtYXBcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgX2NyZWF0ZU1hcmtlcihtYXJrZXI6IE1hcmtlck1hcCk6IE1hcmtlciB7XG4gICAgY29uc3QgbWFya2VyQ3JlYXRlOiBNYXJrZXI8TGF0TG5nPiA9IG5ldyBNYXJrZXIobmV3IExhdExuZyhcbiAgICAgIG1hcmtlcj8ubGF0LFxuICAgICAgbWFya2VyPy5sbmdcbiAgICApLCB7XG4gICAgICBkcmFnZ2FibGU6IG1hcmtlcj8uZHJhZ2dhYmxlID8/IHRydWUsXG4gICAgICBhdXRvUGFuOiB0cnVlXG4gICAgfSkuc2V0SWNvbihcbiAgICAgIGljb24oe1xuICAgICAgICBpY29uU2l6ZTogdGhpcy5pY29uPy5pY29uU2l6ZSxcbiAgICAgICAgaWNvbkFuY2hvcjogdGhpcy5pY29uPy5pY29uQW5jaG9yLFxuICAgICAgICBpY29uVXJsOiB0aGlzLmljb24/Lmljb25VcmxcbiAgICAgIH0pXG4gICAgKTtcbiAgICBcbiAgICBtYXJrZXJDcmVhdGUub24oJ2RyYWdlbmQnLCAoKTogdm9pZCA9PiB7XG4gICAgICB0aGlzLmNoYW5nZUNlbnRlcihtYXJrZXJDcmVhdGUpO1xuICAgICAgdGhpcy5tYXJrZXJEcmFnZW5kLmVtaXQobWFya2VyQ3JlYXRlLmdldExhdExuZygpKTtcbiAgICB9KTtcbiAgICBcbiAgICByZXR1cm4gbWFya2VyQ3JlYXRlO1xuICB9XG4gIFxuICAvKipcbiAgICogR2V0IGxhdGl0dWRlIGFuZCBsb25naXR1ZGUgdmFsdWVzIGlmIG1ha2VyIG1hcCBpcyBvbmx5IG9uZVxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSBfZ2V0TGF0TG5nKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLl9tYXJrZXJzTGlzdD8ubGVuZ3RoID09PSAxKSB7XG4gICAgICB0aGlzLmZvcm0ucGF0Y2hWYWx1ZSh7XG4gICAgICAgIGxhdGl0dWRlOiB0aGlzLl9tYXJrZXJzTGlzdD8uWzBdPy5sYXQsXG4gICAgICAgIGxvbmdpdHVkZTogdGhpcy5fbWFya2Vyc0xpc3Q/LlswXT8ubG5nXG4gICAgICB9KVxuICAgIH1cbiAgfVxuICBcbiAgcHJpdmF0ZSBfbGF0TG5nQ2hhbmdlQ2VudGVyKG1hcmtlcjogYW55KSB7XG4gICAgdGhpcy5fbWFwPy5zZXRWaWV3KHtcbiAgICAgIGxhdDogbWFya2VyPy5sYXRpdHVkZSxcbiAgICAgIGxuZzogbWFya2VyPy5sb25naXR1ZGVcbiAgICB9KTtcbiAgICBcbiAgICB0aGlzLl9tYXJrZXJzTGlzdFswXS5sYXQgPSBwYXJzZUZsb2F0KG1hcmtlcj8ubGF0aXR1ZGUpO1xuICAgIHRoaXMuX21hcmtlcnNMaXN0WzBdLmxuZyA9IHBhcnNlRmxvYXQobWFya2VyPy5sb25naXR1ZGUpO1xuICAgIFxuICAgIHRoaXMuX2xheWVyR3JvdXA/LmNsZWFyTGF5ZXJzKCk7XG4gICAgXG4gICAgY29uc3QgbWFya2VyQWRkID0gTC5tYXJrZXIoe1xuICAgICAgbGF0OiB0aGlzLl9tYXJrZXJzTGlzdD8uWzBdPy5sYXQsXG4gICAgICBsbmc6IHRoaXMuX21hcmtlcnNMaXN0Py5bMF0/LmxuZyxcbiAgICB9LCB7XG4gICAgICBkcmFnZ2FibGU6IG1hcmtlcj8uZHJhZ2dhYmxlID8/IHRydWUsXG4gICAgICBhdXRvUGFuOiB0cnVlXG4gICAgfSkuYWRkVG8odGhpcy5fbGF5ZXJHcm91cCk7XG4gICAgXG4gICAgbWFya2VyQWRkLm9uKCdkcmFnZW5kJywgKCk6IHZvaWQgPT4ge1xuICAgICAgdGhpcy5jaGFuZ2VDZW50ZXIobWFya2VyQWRkKTtcbiAgICAgIHRoaXMubWFya2VyRHJhZ2VuZC5lbWl0KG1hcmtlckFkZC5nZXRMYXRMbmcoKSk7XG4gICAgfSk7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBNYWtlIHZpc2libGUvaGlkZSBsYXRpdHVkZSBhbmQgbG9uZ2l0dWRlIGlucHV0c1xuICAgKiBAcHVibGljXG4gICAqL1xuICBwdWJsaWMgaGlkZUxhdExuZygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fbWFya2Vyc0xpc3Q/Lmxlbmd0aCA9PT0gMTtcbiAgfVxuICBcbiAgLyoqXG4gICAqIFB1dCB0aGUgbWFwIGNlbnRlciBvbiBtYXJrZXIgcG9zaXRpb25cbiAgICogQHBhcmFtIG1hcmtlciAtIFBvaW50IG9mIHRoZSBtYXBcbiAgICogQHB1YmxpY1xuICAgKi9cbiAgcHVibGljIGNoYW5nZUNlbnRlcihtYXJrZXI6IE1hcmtlcik6IHZvaWQge1xuICAgIHRoaXMuX21hcD8uc2V0VmlldyhtYXJrZXI/LmdldExhdExuZygpKTtcbiAgfVxuICBcbiAgcHJvcGFnYXRlQ2hhbmdlKF86IGFueSk6IHZvaWQge1xuICB9O1xuICBcbiAgcmVnaXN0ZXJPbkNoYW5nZShmbjogYW55KTogdm9pZCB7XG4gICAgdGhpcy5wcm9wYWdhdGVDaGFuZ2UgPSBmbjtcbiAgfVxuICBcbiAgcmVnaXN0ZXJPblRvdWNoZWQoKTogdm9pZCB7XG4gIH1cbiAgXG4gIHNldERpc2FibGVkU3RhdGUoaXNEaXNhYmxlZDogYm9vbGVhbik6IHZvaWQge1xuICAgIGlmIChpc0Rpc2FibGVkKSB7XG4gICAgICB0aGlzLmZvcm0uZGlzYWJsZSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmZvcm0uZW5hYmxlKCk7XG4gICAgfVxuICB9XG4gIFxuICB3cml0ZVZhbHVlKGZvcm06IGFueSk6IHZvaWQge1xuICAgIGlmIChmb3JtKSB7XG4gICAgICB0aGlzLl9pbml0Rm9ybShmb3JtKTtcbiAgICB9XG4gIH1cbiAgXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuX2dldExhdExuZygpO1xuICAgIFxuICAgIHRoaXMuZm9ybS52YWx1ZUNoYW5nZXNcbiAgICAgIC5waXBlKHRha2VVbnRpbChHdWFqaXJpdG9zTWFwLl9vYnNlcnZhYmxlU3ViamVjdCQuYXNPYnNlcnZhYmxlKCkpKVxuICAgICAgLnN1YnNjcmliZSgoKTogdm9pZCA9PiB7XG4gICAgICAgIHRoaXMucHJvcGFnYXRlQ2hhbmdlKHRoaXMuZm9ybS52YWx1ZSk7XG4gICAgICAgIHRoaXMuX2xhdExuZ0NoYW5nZUNlbnRlcih0aGlzLmZvcm0udmFsdWUpO1xuICAgICAgfSlcbiAgfVxuICBcbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgIHRoaXMuX2luaXRNYXAoKTtcbiAgICBcbiAgICBpZiAodGhpcy5jaXJjbGUpIHtcbiAgICAgIHRoaXMuX2FkZENpcmNsZSh0aGlzLmNpcmNsZT8uY2VudGVyLCB0aGlzLmNpcmNsZT8ucmFkaXVzKTtcbiAgICB9XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJsYXRMbmdJbnB1dFwiIFtmb3JtR3JvdXBdPVwiZm9ybVwiICpuZ0lmPVwiaGlkZUxhdExuZygpXCI+XG4gIDxtYXQtZm9ybS1maWVsZCBbYXBwZWFyYW5jZV09XCJhcHBlYXJhbmNlXCIgW2NvbG9yXT1cImNvbG9yXCIgY2xhc3M9J3ctMTAwJz5cbiAgICA8bWF0LWxhYmVsPnt7bGF0TGFiZWx9fTwvbWF0LWxhYmVsPlxuICAgIDxtYXQtaWNvbiBtYXRTdWZmaXggY2xhc3M9XCJtYXRlcmlhbC1pY29ucy1vdXRsaW5lZFwiIFtjb2xvcl09XCJjb2xvclwiPnBsYWNlPC9tYXQtaWNvbj5cbiAgICA8aW5wdXQgbWF0SW5wdXQgW3BsYWNlaG9sZGVyXT1cImxhdFBsYWNlaG9sZGVyXCIgW3JlYWRvbmx5XT1cInJlYWRvbmx5XCIgZm9ybUNvbnRyb2xOYW1lPVwibGF0aXR1ZGVcIj5cbiAgPC9tYXQtZm9ybS1maWVsZD5cbiAgXG4gIDxtYXQtZm9ybS1maWVsZCBbYXBwZWFyYW5jZV09XCJhcHBlYXJhbmNlXCIgW2NvbG9yXT1cImNvbG9yXCIgY2xhc3M9J3ctMTAwJz5cbiAgICA8bWF0LWxhYmVsPnt7bG5nTGFiZWx9fTwvbWF0LWxhYmVsPlxuICAgIDxtYXQtaWNvbiBtYXRTdWZmaXggY2xhc3M9XCJtYXRlcmlhbC1pY29ucy1vdXRsaW5lZFwiIFtjb2xvcl09XCJjb2xvclwiPnBsYWNlPC9tYXQtaWNvbj5cbiAgICA8aW5wdXQgbWF0SW5wdXQgW3BsYWNlaG9sZGVyXT1cImxuZ1BsYWNlaG9sZGVyXCIgW3JlYWRvbmx5XT1cInJlYWRvbmx5XCIgZm9ybUNvbnRyb2xOYW1lPVwibG9uZ2l0dWRlXCI+XG4gIDwvbWF0LWZvcm0tZmllbGQ+XG48L2Rpdj5cblxuPGRpdiBpZD1cIm1hcFwiIGNsYXNzPVwibWFwXCI+PC9kaXY+XG4iXX0=
@@ -0,0 +1,5 @@
1
+ /*
2
+ * Public API Surface of guajiritos-map
3
+ */
4
+ export * from './lib/map.component';
5
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljLWFwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Byb2plY3RzL2d1YWppcml0b3MtbWFwL3NyYy9wdWJsaWMtYXBpLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBRUgsY0FBYyxxQkFBcUIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBQdWJsaWMgQVBJIFN1cmZhY2Ugb2YgZ3VhamlyaXRvcy1tYXBcbiAqL1xuXG5leHBvcnQgKiBmcm9tICcuL2xpYi9tYXAuY29tcG9uZW50JztcbiJdfQ==
@@ -0,0 +1,311 @@
1
+ import * as i0 from '@angular/core';
2
+ import { EventEmitter, forwardRef, Component, Input, Output } from '@angular/core';
3
+ import * as i1 from '@angular/common';
4
+ import { NgIf } from '@angular/common';
5
+ import * as L from 'leaflet';
6
+ import { layerGroup, icon, Marker, LatLng } from 'leaflet';
7
+ import * as i2 from '@angular/material/input';
8
+ import { MatInputModule } from '@angular/material/input';
9
+ import * as i4 from '@angular/forms';
10
+ import { UntypedFormGroup, UntypedFormControl, NG_VALUE_ACCESSOR, ReactiveFormsModule } from '@angular/forms';
11
+ import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
12
+ import { Subject, takeUntil } from 'rxjs';
13
+ import * as i5 from '@angular/material/icon';
14
+ import { MatIconModule } from '@angular/material/icon';
15
+ import * as i3 from '@angular/material/form-field';
16
+
17
+ const DEFAULT_MAP_OPTION = {
18
+ center: [23.130257185291036, -82.35626220703126],
19
+ draggable: true,
20
+ zoom: 8,
21
+ updateWithClick: false,
22
+ updateWithDoubleClick: false,
23
+ zoomControl: false,
24
+ borderRadius: '8px',
25
+ scrollWheelZoom: false,
26
+ scrollable: false
27
+ };
28
+ class GuajiritosMap {
29
+ constructor() {
30
+ this._map = null;
31
+ this._layerGroup = new L.LayerGroup();
32
+ this._markersList = [];
33
+ this.form = new UntypedFormGroup({
34
+ latitude: new UntypedFormControl({ value: null, disabled: false }),
35
+ longitude: new UntypedFormControl({ value: null, disabled: false })
36
+ });
37
+ this.latLabel = '';
38
+ this.latPlaceholder = '';
39
+ this.lngLabel = '';
40
+ this.lngPlaceholder = '';
41
+ this.appearance = 'outline';
42
+ this.color = 'accent';
43
+ this.readonly = false;
44
+ /**
45
+ * Default map options
46
+ */
47
+ this.options = {};
48
+ /**
49
+ * Add a circle on the map
50
+ */
51
+ this.circle = {
52
+ center: {
53
+ lat: 23.130257185291036,
54
+ lng: -82.35626220703126
55
+ },
56
+ radius: 100
57
+ };
58
+ /**
59
+ * Default marker icon
60
+ */
61
+ this.icon = {
62
+ iconSize: [25, 41],
63
+ iconAnchor: [13, 41],
64
+ iconUrl: 'marker-icon.png'
65
+ };
66
+ /**
67
+ * Se lanza cada vez que cambia un marcador
68
+ */
69
+ this.markerDragend = new EventEmitter();
70
+ }
71
+ static { this._observableSubject$ = new Subject(); }
72
+ /**
73
+ * List of markers
74
+ * @param markers - Markers array
75
+ */
76
+ set markers(markers) {
77
+ if (markers && markers.length > 0) {
78
+ this._markersList = markers;
79
+ setTimeout(() => {
80
+ this._layerGroup?.clearLayers();
81
+ markers.forEach((m) => {
82
+ this._addMarker(m);
83
+ });
84
+ this.changeCenter(this._createMarker(markers[0]));
85
+ }, 100);
86
+ }
87
+ }
88
+ /**
89
+ * Form initialization
90
+ * @param data - Initial data
91
+ */
92
+ _initForm(data) {
93
+ this.form.patchValue({
94
+ latitude: data?.latitude,
95
+ longitude: data?.longitude,
96
+ });
97
+ }
98
+ /**
99
+ * Main properties of the map
100
+ * @private
101
+ */
102
+ _initMap() {
103
+ this._map = L.map('map', {
104
+ center: this.options?.center ?? DEFAULT_MAP_OPTION.center,
105
+ dragging: this.options?.draggable ?? DEFAULT_MAP_OPTION.draggable,
106
+ zoom: this.options?.zoom ?? DEFAULT_MAP_OPTION.zoom,
107
+ zoomControl: this.options?.zoomControl || DEFAULT_MAP_OPTION.zoomControl,
108
+ scrollWheelZoom: this.options?.scrollWheelZoom || DEFAULT_MAP_OPTION.scrollWheelZoom,
109
+ maxZoom: 18,
110
+ minZoom: 3,
111
+ });
112
+ this._layerGroup = layerGroup().addTo(this._map);
113
+ L.tileLayer('http://{s}.tile.openstreetmap.fr/hot/{z}/{x}/{y}.png').addTo(this._map);
114
+ }
115
+ /**
116
+ * Add marker to map
117
+ * @param center - center of the circle
118
+ * @param radius - radius of the circle in meters
119
+ * @private
120
+ */
121
+ _addCircle(center, radius) {
122
+ if (this._map && center) {
123
+ L.circleMarker([center?.lat, center?.lng], { radius }).addTo(this._map);
124
+ }
125
+ }
126
+ /**
127
+ * Add marker to map
128
+ * @param marker - Point of the map
129
+ */
130
+ _addMarker(marker) {
131
+ if (this._map && marker) {
132
+ const markerAdd = L.marker({
133
+ lat: marker?.lat,
134
+ lng: marker?.lng
135
+ }, {
136
+ draggable: marker?.draggable ?? true,
137
+ autoPan: true
138
+ }).setIcon(icon({
139
+ iconSize: this.icon?.iconSize,
140
+ iconAnchor: this.icon?.iconAnchor,
141
+ iconUrl: this.icon?.iconUrl
142
+ })).addTo(this._layerGroup);
143
+ markerAdd.on('dragend', () => {
144
+ this.changeCenter(markerAdd);
145
+ this.markerDragend.emit(markerAdd.getLatLng());
146
+ });
147
+ }
148
+ }
149
+ /**
150
+ * Add a marker on the map
151
+ * @param marker - Point of the map
152
+ * @private
153
+ */
154
+ _createMarker(marker) {
155
+ const markerCreate = new Marker(new LatLng(marker?.lat, marker?.lng), {
156
+ draggable: marker?.draggable ?? true,
157
+ autoPan: true
158
+ }).setIcon(icon({
159
+ iconSize: this.icon?.iconSize,
160
+ iconAnchor: this.icon?.iconAnchor,
161
+ iconUrl: this.icon?.iconUrl
162
+ }));
163
+ markerCreate.on('dragend', () => {
164
+ this.changeCenter(markerCreate);
165
+ this.markerDragend.emit(markerCreate.getLatLng());
166
+ });
167
+ return markerCreate;
168
+ }
169
+ /**
170
+ * Get latitude and longitude values if maker map is only one
171
+ * @private
172
+ */
173
+ _getLatLng() {
174
+ if (this._markersList?.length === 1) {
175
+ this.form.patchValue({
176
+ latitude: this._markersList?.[0]?.lat,
177
+ longitude: this._markersList?.[0]?.lng
178
+ });
179
+ }
180
+ }
181
+ _latLngChangeCenter(marker) {
182
+ this._map?.setView({
183
+ lat: marker?.latitude,
184
+ lng: marker?.longitude
185
+ });
186
+ this._markersList[0].lat = parseFloat(marker?.latitude);
187
+ this._markersList[0].lng = parseFloat(marker?.longitude);
188
+ this._layerGroup?.clearLayers();
189
+ const markerAdd = L.marker({
190
+ lat: this._markersList?.[0]?.lat,
191
+ lng: this._markersList?.[0]?.lng,
192
+ }, {
193
+ draggable: marker?.draggable ?? true,
194
+ autoPan: true
195
+ }).addTo(this._layerGroup);
196
+ markerAdd.on('dragend', () => {
197
+ this.changeCenter(markerAdd);
198
+ this.markerDragend.emit(markerAdd.getLatLng());
199
+ });
200
+ }
201
+ /**
202
+ * Make visible/hide latitude and longitude inputs
203
+ * @public
204
+ */
205
+ hideLatLng() {
206
+ return this._markersList?.length === 1;
207
+ }
208
+ /**
209
+ * Put the map center on marker position
210
+ * @param marker - Point of the map
211
+ * @public
212
+ */
213
+ changeCenter(marker) {
214
+ this._map?.setView(marker?.getLatLng());
215
+ }
216
+ propagateChange(_) {
217
+ }
218
+ ;
219
+ registerOnChange(fn) {
220
+ this.propagateChange = fn;
221
+ }
222
+ registerOnTouched() {
223
+ }
224
+ setDisabledState(isDisabled) {
225
+ if (isDisabled) {
226
+ this.form.disable();
227
+ }
228
+ else {
229
+ this.form.enable();
230
+ }
231
+ }
232
+ writeValue(form) {
233
+ if (form) {
234
+ this._initForm(form);
235
+ }
236
+ }
237
+ ngOnInit() {
238
+ this._getLatLng();
239
+ this.form.valueChanges
240
+ .pipe(takeUntil(GuajiritosMap._observableSubject$.asObservable()))
241
+ .subscribe(() => {
242
+ this.propagateChange(this.form.value);
243
+ this._latLngChangeCenter(this.form.value);
244
+ });
245
+ }
246
+ ngAfterViewInit() {
247
+ this._initMap();
248
+ if (this.circle) {
249
+ this._addCircle(this.circle?.center, this.circle?.radius);
250
+ }
251
+ }
252
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.8", ngImport: i0, type: GuajiritosMap, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
253
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.8", type: GuajiritosMap, isStandalone: true, selector: "guajiritos-map", inputs: { latLabel: "latLabel", latPlaceholder: "latPlaceholder", lngLabel: "lngLabel", lngPlaceholder: "lngPlaceholder", appearance: "appearance", color: "color", readonly: "readonly", options: "options", circle: "circle", icon: "icon", markers: "markers" }, outputs: { markerDragend: "markerDragend" }, providers: [
254
+ {
255
+ provide: NG_VALUE_ACCESSOR,
256
+ useExisting: forwardRef(() => GuajiritosMap),
257
+ multi: true
258
+ }
259
+ ], ngImport: i0, template: "<div class=\"latLngInput\" [formGroup]=\"form\" *ngIf=\"hideLatLng()\">\n <mat-form-field [appearance]=\"appearance\" [color]=\"color\" class='w-100'>\n <mat-label>{{latLabel}}</mat-label>\n <mat-icon matSuffix class=\"material-icons-outlined\" [color]=\"color\">place</mat-icon>\n <input matInput [placeholder]=\"latPlaceholder\" [readonly]=\"readonly\" formControlName=\"latitude\">\n </mat-form-field>\n \n <mat-form-field [appearance]=\"appearance\" [color]=\"color\" class='w-100'>\n <mat-label>{{lngLabel}}</mat-label>\n <mat-icon matSuffix class=\"material-icons-outlined\" [color]=\"color\">place</mat-icon>\n <input matInput [placeholder]=\"lngPlaceholder\" [readonly]=\"readonly\" formControlName=\"longitude\">\n </mat-form-field>\n</div>\n\n<div id=\"map\" class=\"map\"></div>\n", styles: [".latLngInput{display:flex;flex-direction:row;gap:1rem}.map{min-height:400px;max-width:100%}\n"], dependencies: [{ kind: "ngmodule", type: BrowserAnimationsModule }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i2.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i3.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i3.MatLabel, selector: "mat-label" }, { kind: "directive", type: i3.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i4.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i4.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i4.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i5.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }] }); }
260
+ }
261
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.8", ngImport: i0, type: GuajiritosMap, decorators: [{
262
+ type: Component,
263
+ args: [{ selector: 'guajiritos-map', standalone: true, imports: [
264
+ BrowserAnimationsModule,
265
+ MatInputModule,
266
+ ReactiveFormsModule,
267
+ NgIf,
268
+ MatIconModule
269
+ ], providers: [
270
+ {
271
+ provide: NG_VALUE_ACCESSOR,
272
+ useExisting: forwardRef(() => GuajiritosMap),
273
+ multi: true
274
+ }
275
+ ], template: "<div class=\"latLngInput\" [formGroup]=\"form\" *ngIf=\"hideLatLng()\">\n <mat-form-field [appearance]=\"appearance\" [color]=\"color\" class='w-100'>\n <mat-label>{{latLabel}}</mat-label>\n <mat-icon matSuffix class=\"material-icons-outlined\" [color]=\"color\">place</mat-icon>\n <input matInput [placeholder]=\"latPlaceholder\" [readonly]=\"readonly\" formControlName=\"latitude\">\n </mat-form-field>\n \n <mat-form-field [appearance]=\"appearance\" [color]=\"color\" class='w-100'>\n <mat-label>{{lngLabel}}</mat-label>\n <mat-icon matSuffix class=\"material-icons-outlined\" [color]=\"color\">place</mat-icon>\n <input matInput [placeholder]=\"lngPlaceholder\" [readonly]=\"readonly\" formControlName=\"longitude\">\n </mat-form-field>\n</div>\n\n<div id=\"map\" class=\"map\"></div>\n", styles: [".latLngInput{display:flex;flex-direction:row;gap:1rem}.map{min-height:400px;max-width:100%}\n"] }]
276
+ }], ctorParameters: function () { return []; }, propDecorators: { latLabel: [{
277
+ type: Input
278
+ }], latPlaceholder: [{
279
+ type: Input
280
+ }], lngLabel: [{
281
+ type: Input
282
+ }], lngPlaceholder: [{
283
+ type: Input
284
+ }], appearance: [{
285
+ type: Input
286
+ }], color: [{
287
+ type: Input
288
+ }], readonly: [{
289
+ type: Input
290
+ }], options: [{
291
+ type: Input
292
+ }], circle: [{
293
+ type: Input
294
+ }], icon: [{
295
+ type: Input
296
+ }], markers: [{
297
+ type: Input
298
+ }], markerDragend: [{
299
+ type: Output
300
+ }] } });
301
+
302
+ /*
303
+ * Public API Surface of guajiritos-map
304
+ */
305
+
306
+ /**
307
+ * Generated bundle index. Do not edit.
308
+ */
309
+
310
+ export { DEFAULT_MAP_OPTION, GuajiritosMap };
311
+ //# sourceMappingURL=guajiritos-map.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"guajiritos-map.mjs","sources":["../../../projects/guajiritos-map/src/lib/map.component.ts","../../../projects/guajiritos-map/src/lib/map.component.html","../../../projects/guajiritos-map/src/public-api.ts","../../../projects/guajiritos-map/src/guajiritos-map.ts"],"sourcesContent":["import {AfterViewInit, Component, EventEmitter, forwardRef, Input, OnInit, Output} from \"@angular/core\";\nimport {CommonModule, NgIf} from \"@angular/common\";\nimport * as L from \"leaflet\";\nimport {icon, LatLng, LatLngExpression, layerGroup, LayerGroup, Map, Marker} from \"leaflet\";\nimport {MatInputModule} from \"@angular/material/input\";\nimport {\n ControlValueAccessor,\n NG_VALUE_ACCESSOR,\n ReactiveFormsModule,\n UntypedFormControl,\n UntypedFormGroup\n} from \"@angular/forms\";\nimport {MatFormFieldAppearance} from \"@angular/material/form-field\";\nimport {ThemePalette} from \"@angular/material/core\";\nimport {BrowserAnimationsModule} from \"@angular/platform-browser/animations\";\nimport {Subject, takeUntil} from \"rxjs\";\nimport {MatIconModule} from \"@angular/material/icon\";\n\n/**\n * Map options interface\n */\nexport interface MapOption {\n center?: [number, number],\n draggable?: boolean,\n updateWithClick?: boolean,\n updateWithDoubleClick?: boolean,\n zoom?: number,\n borderRadius?: string,\n scrollable?: boolean,\n zoomControl?: boolean,\n scrollWheelZoom?: boolean,\n}\n\n/**\n * Marker interface\n */\nexport interface MarkerMap {\n lat: number;\n lng: number;\n draggable?: boolean;\n}\n\n/**\n * Icon interface\n */\nexport interface Icon {\n iconSize: [number, number];\n iconAnchor: [number, number];\n iconUrl: string;\n iconRetinaUrl?: string,\n shadowUrl?: string,\n popupAnchor?: [number, number],\n tooltipAnchor?: [number, number],\n shadowSize?: [number, number],\n}\n\n/**\n * Circle map interface\n */\nexport interface CircleMap {\n center: MarkerMap;\n radius: number;\n}\n\nexport const DEFAULT_MAP_OPTION: MapOption = {\n center: [23.130257185291036, -82.35626220703126],\n draggable: true,\n zoom: 8,\n updateWithClick: false,\n updateWithDoubleClick: false,\n zoomControl: false,\n borderRadius: '8px',\n scrollWheelZoom: false,\n scrollable: false\n};\n\n@Component({\n selector: 'guajiritos-map',\n templateUrl: './map.component.html',\n styleUrls: ['./map.component.scss'],\n standalone: true,\n imports: [\n BrowserAnimationsModule,\n MatInputModule,\n ReactiveFormsModule,\n NgIf,\n MatIconModule\n ],\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => GuajiritosMap),\n multi: true\n }\n ]\n})\nexport class GuajiritosMap implements AfterViewInit, OnInit, ControlValueAccessor {\n constructor() {\n }\n \n private static _observableSubject$: Subject<void> = new Subject();\n private _map: Map | null = null;\n private _layerGroup: LayerGroup = new L.LayerGroup();\n private _markersList: MarkerMap[] = [];\n \n public form: UntypedFormGroup = new UntypedFormGroup({\n latitude: new UntypedFormControl({value: null, disabled: false}),\n longitude: new UntypedFormControl({value: null, disabled: false})\n });\n \n @Input() latLabel: string = '';\n @Input() latPlaceholder: string = '';\n @Input() lngLabel: string = '';\n @Input() lngPlaceholder: string = '';\n @Input() appearance: MatFormFieldAppearance = 'outline';\n @Input() color: ThemePalette = 'accent';\n @Input() readonly: boolean = false;\n /**\n * Default map options\n */\n @Input() options: MapOption = {};\n /**\n * Add a circle on the map\n */\n @Input() circle: CircleMap = {\n center: {\n lat: 23.130257185291036,\n lng: -82.35626220703126\n },\n radius: 100\n };\n /**\n * Default marker icon\n */\n @Input() icon: Icon = {\n iconSize: [25, 41],\n iconAnchor: [13, 41],\n iconUrl: 'marker-icon.png'\n };\n \n /**\n * List of markers\n * @param markers - Markers array\n */\n @Input() set markers(markers: MarkerMap[]) {\n if (markers && markers.length > 0) {\n this._markersList = markers;\n setTimeout((): void => {\n this._layerGroup?.clearLayers();\n markers.forEach((m: any): void => {\n this._addMarker(m);\n });\n this.changeCenter(this._createMarker(markers[0]));\n }, 100);\n }\n }\n \n /**\n * Se lanza cada vez que cambia un marcador\n */\n @Output() markerDragend: EventEmitter<LatLng> = new EventEmitter();\n \n /**\n * Form initialization\n * @param data - Initial data\n */\n private _initForm(data: any): void {\n this.form.patchValue({\n latitude: data?.latitude,\n longitude: data?.longitude,\n });\n }\n \n /**\n * Main properties of the map\n * @private\n */\n private _initMap(): void {\n this._map = L.map('map', {\n center: this.options?.center as LatLngExpression ?? DEFAULT_MAP_OPTION.center,\n dragging: this.options?.draggable ?? DEFAULT_MAP_OPTION.draggable,\n zoom: this.options?.zoom ?? DEFAULT_MAP_OPTION.zoom,\n zoomControl: this.options?.zoomControl || DEFAULT_MAP_OPTION.zoomControl,\n scrollWheelZoom: this.options?.scrollWheelZoom || DEFAULT_MAP_OPTION.scrollWheelZoom,\n maxZoom: 18,\n minZoom: 3,\n });\n \n this._layerGroup = layerGroup().addTo(this._map);\n \n L.tileLayer('http://{s}.tile.openstreetmap.fr/hot/{z}/{x}/{y}.png').addTo(this._map);\n }\n \n /**\n * Add marker to map\n * @param center - center of the circle\n * @param radius - radius of the circle in meters\n * @private\n */\n private _addCircle(center: MarkerMap, radius: number): void {\n if (this._map && center) {\n L.circleMarker([center?.lat, center?.lng], {radius}).addTo(this._map);\n }\n }\n \n /**\n * Add marker to map\n * @param marker - Point of the map\n */\n private _addMarker(marker: MarkerMap): void {\n if (this._map && marker) {\n const markerAdd = L.marker({\n lat: marker?.lat,\n lng: marker?.lng\n }, {\n draggable: marker?.draggable ?? true,\n autoPan: true\n }).setIcon(\n icon({\n iconSize: this.icon?.iconSize,\n iconAnchor: this.icon?.iconAnchor,\n iconUrl: this.icon?.iconUrl\n })\n ).addTo(this._layerGroup);\n \n markerAdd.on('dragend', (): void => {\n this.changeCenter(markerAdd);\n this.markerDragend.emit(markerAdd.getLatLng());\n });\n }\n }\n \n /**\n * Add a marker on the map\n * @param marker - Point of the map\n * @private\n */\n private _createMarker(marker: MarkerMap): Marker {\n const markerCreate: Marker<LatLng> = new Marker(new LatLng(\n marker?.lat,\n marker?.lng\n ), {\n draggable: marker?.draggable ?? true,\n autoPan: true\n }).setIcon(\n icon({\n iconSize: this.icon?.iconSize,\n iconAnchor: this.icon?.iconAnchor,\n iconUrl: this.icon?.iconUrl\n })\n );\n \n markerCreate.on('dragend', (): void => {\n this.changeCenter(markerCreate);\n this.markerDragend.emit(markerCreate.getLatLng());\n });\n \n return markerCreate;\n }\n \n /**\n * Get latitude and longitude values if maker map is only one\n * @private\n */\n private _getLatLng(): void {\n if (this._markersList?.length === 1) {\n this.form.patchValue({\n latitude: this._markersList?.[0]?.lat,\n longitude: this._markersList?.[0]?.lng\n })\n }\n }\n \n private _latLngChangeCenter(marker: any) {\n this._map?.setView({\n lat: marker?.latitude,\n lng: marker?.longitude\n });\n \n this._markersList[0].lat = parseFloat(marker?.latitude);\n this._markersList[0].lng = parseFloat(marker?.longitude);\n \n this._layerGroup?.clearLayers();\n \n const markerAdd = L.marker({\n lat: this._markersList?.[0]?.lat,\n lng: this._markersList?.[0]?.lng,\n }, {\n draggable: marker?.draggable ?? true,\n autoPan: true\n }).addTo(this._layerGroup);\n \n markerAdd.on('dragend', (): void => {\n this.changeCenter(markerAdd);\n this.markerDragend.emit(markerAdd.getLatLng());\n });\n }\n \n /**\n * Make visible/hide latitude and longitude inputs\n * @public\n */\n public hideLatLng(): boolean {\n return this._markersList?.length === 1;\n }\n \n /**\n * Put the map center on marker position\n * @param marker - Point of the map\n * @public\n */\n public changeCenter(marker: Marker): void {\n this._map?.setView(marker?.getLatLng());\n }\n \n propagateChange(_: any): void {\n };\n \n registerOnChange(fn: any): void {\n this.propagateChange = fn;\n }\n \n registerOnTouched(): void {\n }\n \n setDisabledState(isDisabled: boolean): void {\n if (isDisabled) {\n this.form.disable();\n } else {\n this.form.enable();\n }\n }\n \n writeValue(form: any): void {\n if (form) {\n this._initForm(form);\n }\n }\n \n ngOnInit(): void {\n this._getLatLng();\n \n this.form.valueChanges\n .pipe(takeUntil(GuajiritosMap._observableSubject$.asObservable()))\n .subscribe((): void => {\n this.propagateChange(this.form.value);\n this._latLngChangeCenter(this.form.value);\n })\n }\n \n ngAfterViewInit(): void {\n this._initMap();\n \n if (this.circle) {\n this._addCircle(this.circle?.center, this.circle?.radius);\n }\n }\n}\n","<div class=\"latLngInput\" [formGroup]=\"form\" *ngIf=\"hideLatLng()\">\n <mat-form-field [appearance]=\"appearance\" [color]=\"color\" class='w-100'>\n <mat-label>{{latLabel}}</mat-label>\n <mat-icon matSuffix class=\"material-icons-outlined\" [color]=\"color\">place</mat-icon>\n <input matInput [placeholder]=\"latPlaceholder\" [readonly]=\"readonly\" formControlName=\"latitude\">\n </mat-form-field>\n \n <mat-form-field [appearance]=\"appearance\" [color]=\"color\" class='w-100'>\n <mat-label>{{lngLabel}}</mat-label>\n <mat-icon matSuffix class=\"material-icons-outlined\" [color]=\"color\">place</mat-icon>\n <input matInput [placeholder]=\"lngPlaceholder\" [readonly]=\"readonly\" formControlName=\"longitude\">\n </mat-form-field>\n</div>\n\n<div id=\"map\" class=\"map\"></div>\n","/*\n * Public API Surface of guajiritos-map\n */\n\nexport * from './lib/map.component';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
package/index.d.ts ADDED
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Generated bundle index. Do not edit.
3
+ */
4
+ /// <amd-module name="@guajiritos/map" />
5
+ export * from './public-api';
@@ -0,0 +1,139 @@
1
+ import { AfterViewInit, EventEmitter, OnInit } from "@angular/core";
2
+ import { LatLng, Marker } from "leaflet";
3
+ import { ControlValueAccessor, UntypedFormGroup } from "@angular/forms";
4
+ import { MatFormFieldAppearance } from "@angular/material/form-field";
5
+ import { ThemePalette } from "@angular/material/core";
6
+ import * as i0 from "@angular/core";
7
+ /**
8
+ * Map options interface
9
+ */
10
+ export interface MapOption {
11
+ center?: [number, number];
12
+ draggable?: boolean;
13
+ updateWithClick?: boolean;
14
+ updateWithDoubleClick?: boolean;
15
+ zoom?: number;
16
+ borderRadius?: string;
17
+ scrollable?: boolean;
18
+ zoomControl?: boolean;
19
+ scrollWheelZoom?: boolean;
20
+ }
21
+ /**
22
+ * Marker interface
23
+ */
24
+ export interface MarkerMap {
25
+ lat: number;
26
+ lng: number;
27
+ draggable?: boolean;
28
+ }
29
+ /**
30
+ * Icon interface
31
+ */
32
+ export interface Icon {
33
+ iconSize: [number, number];
34
+ iconAnchor: [number, number];
35
+ iconUrl: string;
36
+ iconRetinaUrl?: string;
37
+ shadowUrl?: string;
38
+ popupAnchor?: [number, number];
39
+ tooltipAnchor?: [number, number];
40
+ shadowSize?: [number, number];
41
+ }
42
+ /**
43
+ * Circle map interface
44
+ */
45
+ export interface CircleMap {
46
+ center: MarkerMap;
47
+ radius: number;
48
+ }
49
+ export declare const DEFAULT_MAP_OPTION: MapOption;
50
+ export declare class GuajiritosMap implements AfterViewInit, OnInit, ControlValueAccessor {
51
+ constructor();
52
+ private static _observableSubject$;
53
+ private _map;
54
+ private _layerGroup;
55
+ private _markersList;
56
+ form: UntypedFormGroup;
57
+ latLabel: string;
58
+ latPlaceholder: string;
59
+ lngLabel: string;
60
+ lngPlaceholder: string;
61
+ appearance: MatFormFieldAppearance;
62
+ color: ThemePalette;
63
+ readonly: boolean;
64
+ /**
65
+ * Default map options
66
+ */
67
+ options: MapOption;
68
+ /**
69
+ * Add a circle on the map
70
+ */
71
+ circle: CircleMap;
72
+ /**
73
+ * Default marker icon
74
+ */
75
+ icon: Icon;
76
+ /**
77
+ * List of markers
78
+ * @param markers - Markers array
79
+ */
80
+ set markers(markers: MarkerMap[]);
81
+ /**
82
+ * Se lanza cada vez que cambia un marcador
83
+ */
84
+ markerDragend: EventEmitter<LatLng>;
85
+ /**
86
+ * Form initialization
87
+ * @param data - Initial data
88
+ */
89
+ private _initForm;
90
+ /**
91
+ * Main properties of the map
92
+ * @private
93
+ */
94
+ private _initMap;
95
+ /**
96
+ * Add marker to map
97
+ * @param center - center of the circle
98
+ * @param radius - radius of the circle in meters
99
+ * @private
100
+ */
101
+ private _addCircle;
102
+ /**
103
+ * Add marker to map
104
+ * @param marker - Point of the map
105
+ */
106
+ private _addMarker;
107
+ /**
108
+ * Add a marker on the map
109
+ * @param marker - Point of the map
110
+ * @private
111
+ */
112
+ private _createMarker;
113
+ /**
114
+ * Get latitude and longitude values if maker map is only one
115
+ * @private
116
+ */
117
+ private _getLatLng;
118
+ private _latLngChangeCenter;
119
+ /**
120
+ * Make visible/hide latitude and longitude inputs
121
+ * @public
122
+ */
123
+ hideLatLng(): boolean;
124
+ /**
125
+ * Put the map center on marker position
126
+ * @param marker - Point of the map
127
+ * @public
128
+ */
129
+ changeCenter(marker: Marker): void;
130
+ propagateChange(_: any): void;
131
+ registerOnChange(fn: any): void;
132
+ registerOnTouched(): void;
133
+ setDisabledState(isDisabled: boolean): void;
134
+ writeValue(form: any): void;
135
+ ngOnInit(): void;
136
+ ngAfterViewInit(): void;
137
+ static ɵfac: i0.ɵɵFactoryDeclaration<GuajiritosMap, never>;
138
+ static ɵcmp: i0.ɵɵComponentDeclaration<GuajiritosMap, "guajiritos-map", never, { "latLabel": { "alias": "latLabel"; "required": false; }; "latPlaceholder": { "alias": "latPlaceholder"; "required": false; }; "lngLabel": { "alias": "lngLabel"; "required": false; }; "lngPlaceholder": { "alias": "lngPlaceholder"; "required": false; }; "appearance": { "alias": "appearance"; "required": false; }; "color": { "alias": "color"; "required": false; }; "readonly": { "alias": "readonly"; "required": false; }; "options": { "alias": "options"; "required": false; }; "circle": { "alias": "circle"; "required": false; }; "icon": { "alias": "icon"; "required": false; }; "markers": { "alias": "markers"; "required": false; }; }, { "markerDragend": "markerDragend"; }, never, never, true, never>;
139
+ }
package/package.json ADDED
@@ -0,0 +1,28 @@
1
+ {
2
+ "name": "@guajiritos/map",
3
+ "version": "0.0.6",
4
+ "peerDependencies": {
5
+ "@angular/cdk": "^16.0.0 || >16.0.0",
6
+ "@angular/common": "^16.0.0 || >16.0.0",
7
+ "@angular/core": "^16.0.0 || >16.0.0",
8
+ "@angular/material": "^16.0.0 || >16.0.0",
9
+ "leaflet": "^1.9.0 || >1.9.0"
10
+ },
11
+ "dependencies": {
12
+ "tslib": "^2.3.0 || >2.3.0"
13
+ },
14
+ "sideEffects": false,
15
+ "module": "fesm2022/guajiritos-map.mjs",
16
+ "typings": "index.d.ts",
17
+ "exports": {
18
+ "./package.json": {
19
+ "default": "./package.json"
20
+ },
21
+ ".": {
22
+ "types": "./index.d.ts",
23
+ "esm2022": "./esm2022/guajiritos-map.mjs",
24
+ "esm": "./esm2022/guajiritos-map.mjs",
25
+ "default": "./fesm2022/guajiritos-map.mjs"
26
+ }
27
+ }
28
+ }
@@ -0,0 +1 @@
1
+ export * from './lib/map.component';