@c8y/ngx-components 1019.0.3 → 1019.2.4

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.
@@ -25,9 +25,9 @@ export class LocationComponent {
25
25
  this.canEdit = true;
26
26
  this.config = { realtime: false, follow: true, zoomLevel: 12 };
27
27
  this.addressSearchTerm = '';
28
- this.hideMapquestBasedFeature = false;
28
+ this.hideAddressSearchFeature = false;
29
29
  this.destroy$ = new Subject();
30
- this.mapQuestUrl = 'https://www.mapquestapi.com/geocoding/v1/address?key=ioPe5dmW6eDgABdJZ4mFIIL51F3tiwXW&format=json&location={searchTerm}';
30
+ this.mapNominatimUrl = 'https://nominatim.openstreetmap.org/search?format=json&q={searchTerm}';
31
31
  }
32
32
  ngOnInit() {
33
33
  this.activatedRoute.url.pipe(takeUntil(this.destroy$)).subscribe(() => {
@@ -38,10 +38,10 @@ export class LocationComponent {
38
38
  const { contextData } = this.contextRouteService.getContextData(this.activatedRoute);
39
39
  this.position = contextData;
40
40
  this.canEdit = await this.permissions.canEdit([Permissions.ROLE_INVENTORY_ADMIN, Permissions.ROLE_INVENTORY_CREATE], contextData);
41
- const hasCustomSetting = !isUndefined(this.optionsService.mapQuestUrl);
42
- this.hideMapquestBasedFeature = hasCustomSetting && !this.optionsService.mapQuestUrl;
41
+ const hasCustomSetting = !isUndefined(this.optionsService.mapNominatimUrl);
42
+ this.hideAddressSearchFeature = hasCustomSetting && !this.optionsService.mapNominatimUrl;
43
43
  if (hasCustomSetting) {
44
- this.mapQuestUrl = this.optionsService.mapQuestUrl;
44
+ this.mapNominatimUrl = this.optionsService.mapNominatimUrl;
45
45
  }
46
46
  this.map.refresh();
47
47
  }
@@ -88,16 +88,23 @@ export class LocationComponent {
88
88
  this.position = position;
89
89
  }
90
90
  async searchAddress(searchTerm) {
91
- const fetchResponse = await fetch(this.mapQuestUrl.replace('{searchTerm}', searchTerm));
91
+ const fetchResponse = await fetch(this.mapNominatimUrl.replace('{searchTerm}', searchTerm));
92
92
  if (fetchResponse.status !== 200) {
93
93
  this.alertService.danger(gettext('Failed to search for address.'));
94
94
  return;
95
95
  }
96
96
  const data = await fetchResponse.json();
97
- const { latLng } = data.results[0].locations[0];
98
- this.position.c8y_Position.lat = latLng.lat;
99
- this.position.c8y_Position.lng = latLng.lng;
97
+ const latLng = data[0];
98
+ if (!latLng) {
99
+ this.alertService.warning(gettext('Address could not be found.'));
100
+ return;
101
+ }
102
+ this.position.c8y_Position.lat = Number(latLng.lat);
103
+ this.position.c8y_Position.lng = Number(latLng.lon);
100
104
  this.updateMarkerPosition();
105
+ if (latLng.licence) {
106
+ this.map.map.attributionControl.addAttribution(latLng.licence);
107
+ }
101
108
  }
102
109
  updateMarkerPosition() {
103
110
  this.map.refreshMarkers();
@@ -123,13 +130,13 @@ export class LocationComponent {
123
130
  }
124
131
  }
125
132
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: LocationComponent, deps: [{ token: i1.ContextRouteService }, { token: i2.ActivatedRoute }, { token: i3.InventoryService }, { token: i1.Permissions }, { token: i1.OptionsService }, { token: i1.AlertService }], target: i0.ɵɵFactoryTarget.Component }); }
126
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: LocationComponent, selector: "c8y-location", viewQueries: [{ propertyName: "map", first: true, predicate: MapComponent, descendants: true }], ngImport: i0, template: "<c8y-action-bar-item placement=\"right\">\n <button\n class=\"btn btn-link c8y-realtime\"\n title=\"{{ 'Toggle realtime' | translate }}\"\n type=\"button\"\n (click)=\"toggleRealtime()\"\n >\n <span\n class=\"c8y-pulse\"\n [ngClass]=\"{ active: config.realtime, inactive: !config.realtime }\"\n ></span>\n <span translate>Realtime</span>\n </button>\n</c8y-action-bar-item>\n<c8y-action-bar-item placement=\"right\">\n <button\n class=\"btn btn-clean\"\n title=\"{{ 'Center`verb`' | translate }}\"\n (click)=\"centerMap()\"\n >\n <i [c8yIcon]=\"'target1'\"></i>\n <span translate>Center`verb`</span>\n </button>\n</c8y-action-bar-item>\n\n<div class=\"card card--grid content-fullpage d-grid grid__col--8-4--md\">\n <div\n class=\"bg-white p-relative\"\n style=\"min-height: 30vh\"\n >\n <c8y-map\n [assets]=\"[position]\"\n [config]=\"config\"\n (onRealtimeUpdate)=\"positionChanged($event)\"\n ></c8y-map>\n </div>\n\n <form\n class=\"d-flex d-col bg-inherit content-fullpage bg-gray-white\"\n #positionForm=\"ngForm\"\n (ngSubmit)=\"save()\"\n >\n <div class=\"card-header large-padding separator sticky-top\">\n <span\n class=\"card-title\"\n translate\n >\n Device location\n </span>\n </div>\n <div class=\"inner-scroll\">\n <div\n class=\"m-16\"\n *ngIf=\"!isEdit\"\n >\n <div class=\"p-b-40\">\n <div\n class=\"text-bold\"\n translate\n >\n Latitude (\u00B0)\n </div>\n {{ position.c8y_Position.lat }}\n </div>\n <div class=\"p-b-40\">\n <div\n class=\"text-bold\"\n translate\n >\n Longitude (\u00B0)\n </div>\n {{ position.c8y_Position.lng }}\n </div>\n <div class=\"p-b-40\">\n <div\n class=\"text-bold\"\n translate\n >\n Altitude (m)\n </div>\n {{ position.c8y_Position.alt }}\n </div>\n </div>\n <div\n class=\"m-16\"\n *ngIf=\"isEdit\"\n >\n <c8y-form-group>\n <label\n for=\"lat\"\n translate\n >\n Latitude (\u00B0)\n </label>\n\n <input\n class=\"form-control\"\n [title]=\"'Latitude (\u00B0)' | translate\"\n id=\"lat\"\n name=\"lat\"\n type=\"number\"\n required\n min=\"-90\"\n max=\"90\"\n (blur)=\"updateMarkerPosition()\"\n [(ngModel)]=\"position.c8y_Position.lat\"\n />\n <c8y-messages>\n <c8y-message\n name=\"min\"\n [text]=\"'The minimum latitude value is -90\u00B0.' | translate\"\n ></c8y-message>\n <c8y-message\n name=\"max\"\n [text]=\"'The maximum latitude value is 90\u00B0.' | translate\"\n ></c8y-message>\n </c8y-messages>\n </c8y-form-group>\n <c8y-form-group>\n <label\n for=\"lat\"\n translate\n >\n Longitude (\u00B0)\n </label>\n\n <input\n class=\"form-control\"\n [title]=\"'Longitude (\u00B0)' | translate\"\n id=\"lng\"\n name=\"lng\"\n type=\"number\"\n required\n min=\"-180\"\n max=\"180\"\n (blur)=\"updateMarkerPosition()\"\n [(ngModel)]=\"position.c8y_Position.lng\"\n />\n <c8y-messages>\n <c8y-message\n name=\"min\"\n [text]=\"'The minimum longitude value is -180\u00B0.' | translate\"\n ></c8y-message>\n <c8y-message\n name=\"max\"\n [text]=\"'The maximum longitude value is 180\u00B0.' | translate\"\n ></c8y-message>\n </c8y-messages>\n </c8y-form-group>\n <c8y-form-group>\n <label\n for=\"alt\"\n translate\n >\n Altitude (m)\n </label>\n\n <input\n class=\"form-control\"\n [title]=\"'Altitude (m)' | translate\"\n id=\"alt\"\n name=\"alt\"\n type=\"number\"\n [(ngModel)]=\"position.c8y_Position.alt\"\n />\n </c8y-form-group>\n </div>\n\n <form\n class=\"card-block bg-level-1\"\n #addressSearch=\"ngForm\"\n novalidate\n (submit)=\"searchAddress(addressSearchTerm)\"\n *ngIf=\"isEdit && !hideMapquestBasedFeature\"\n >\n <div class=\"form-group\">\n <label\n for=\"searchAddress\"\n translate\n >\n Find lat/long by address\n </label>\n <div class=\"input-group input-group-search\">\n <input\n class=\"form-control\"\n id=\"searchAddress\"\n name=\"addressSearchTerm\"\n type=\"text\"\n [placeholder]=\"'e.g. Speditionstra\u00DFe 13, D\u00FCsseldorf`LOCALIZE`' | translate\"\n [(ngModel)]=\"addressSearchTerm\"\n />\n <span class=\"input-group-btn\">\n <button\n class=\"btn btn-dot\"\n [title]=\"'Search' | translate\"\n type=\"submit\"\n >\n <i\n class=\"dlt-c8y-icon-search\"\n c8y-icon=\"search\"\n ></i>\n </button>\n </span>\n </div>\n </div>\n </form>\n </div>\n <div class=\"card-footer separator\">\n <button\n class=\"btn btn-default\"\n [title]=\"'Edit location' | translate\"\n type=\"button\"\n *ngIf=\"canEdit && !isEdit\"\n (click)=\"edit()\"\n translate\n >\n Edit location\n </button>\n <button\n class=\"btn btn-default\"\n [title]=\"'Cancel' | translate\"\n type=\"button\"\n (click)=\"cancel()\"\n *ngIf=\"isEdit\"\n translate\n >\n Cancel\n </button>\n <button\n class=\"btn btn-primary\"\n [title]=\"'Save' | translate\"\n type=\"submit\"\n *ngIf=\"isEdit\"\n translate\n [disabled]=\"!positionForm.valid\"\n >\n Save\n </button>\n </div>\n </form>\n</div>\n", dependencies: [{ kind: "component", type: i4.MapComponent, selector: "c8y-map", inputs: ["config", "assets"], outputs: ["onMove", "onMoveEnd", "onZoomStart", "onZoomEnd", "onRealtimeUpdate", "onInit"] }, { kind: "component", type: i1.ActionBarItemComponent, selector: "c8y-action-bar-item", inputs: ["placement", "priority", "itemClass", "injector", "groupId", "inGroupPriority"] }, { kind: "directive", type: i1.IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "directive", type: i1.C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "directive", type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.MinValidationDirective, selector: "[min]", inputs: ["min"] }, { kind: "directive", type: i1.MaxValidationDirective, selector: "[max]", inputs: ["max"] }, { kind: "directive", type: i6.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i6.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: i6.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i6.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i6.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i6.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i6.MinValidator, selector: "input[type=number][min][formControlName],input[type=number][min][formControl],input[type=number][min][ngModel]", inputs: ["min"] }, { kind: "directive", type: i6.MaxValidator, selector: "input[type=number][max][formControlName],input[type=number][max][formControl],input[type=number][max][ngModel]", inputs: ["max"] }, { kind: "directive", type: i6.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i6.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: i1.FormGroupComponent, selector: "c8y-form-group", inputs: ["hasError", "hasWarning", "hasSuccess", "novalidation", "status"] }, { kind: "directive", type: i1.MessageDirective, selector: "c8y-message", inputs: ["name", "text"] }, { kind: "component", type: i1.MessagesComponent, selector: "c8y-messages", inputs: ["show", "defaults"] }, { kind: "directive", type: i1.RequiredInputPlaceholderDirective, selector: "input[required], input[formControlName]" }, { kind: "pipe", type: i1.C8yTranslatePipe, name: "translate" }] }); }
133
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: LocationComponent, selector: "c8y-location", viewQueries: [{ propertyName: "map", first: true, predicate: MapComponent, descendants: true }], ngImport: i0, template: "<c8y-action-bar-item placement=\"right\">\n <button\n class=\"btn btn-link c8y-realtime\"\n title=\"{{ 'Toggle realtime' | translate }}\"\n type=\"button\"\n (click)=\"toggleRealtime()\"\n >\n <span\n class=\"c8y-pulse\"\n [ngClass]=\"{ active: config.realtime, inactive: !config.realtime }\"\n ></span>\n <span translate>Realtime</span>\n </button>\n</c8y-action-bar-item>\n<c8y-action-bar-item placement=\"right\">\n <button\n class=\"btn btn-clean\"\n title=\"{{ 'Center`verb`' | translate }}\"\n (click)=\"centerMap()\"\n >\n <i [c8yIcon]=\"'target1'\"></i>\n <span translate>Center`verb`</span>\n </button>\n</c8y-action-bar-item>\n\n<div class=\"card card--grid content-fullpage d-grid grid__col--8-4--md\">\n <div\n class=\"bg-white p-relative\"\n style=\"min-height: 30vh\"\n >\n <c8y-map\n [assets]=\"[position]\"\n [config]=\"config\"\n (onRealtimeUpdate)=\"positionChanged($event)\"\n ></c8y-map>\n </div>\n\n <form\n class=\"d-flex d-col bg-inherit content-fullpage bg-gray-white\"\n #positionForm=\"ngForm\"\n (ngSubmit)=\"save()\"\n >\n <div class=\"card-header large-padding separator sticky-top\">\n <span\n class=\"card-title\"\n translate\n >\n Device location\n </span>\n </div>\n <div class=\"inner-scroll\">\n <div\n class=\"m-16\"\n *ngIf=\"!isEdit\"\n >\n <div class=\"p-b-40\">\n <div\n class=\"text-bold\"\n translate\n >\n Latitude (\u00B0)\n </div>\n {{ position.c8y_Position.lat }}\n </div>\n <div class=\"p-b-40\">\n <div\n class=\"text-bold\"\n translate\n >\n Longitude (\u00B0)\n </div>\n {{ position.c8y_Position.lng }}\n </div>\n <div class=\"p-b-40\">\n <div\n class=\"text-bold\"\n translate\n >\n Altitude (m)\n </div>\n {{ position.c8y_Position.alt }}\n </div>\n </div>\n <div\n class=\"m-16\"\n *ngIf=\"isEdit\"\n >\n <c8y-form-group>\n <label\n for=\"lat\"\n translate\n >\n Latitude (\u00B0)\n </label>\n\n <input\n class=\"form-control\"\n [title]=\"'Latitude (\u00B0)' | translate\"\n id=\"lat\"\n name=\"lat\"\n type=\"number\"\n required\n min=\"-90\"\n max=\"90\"\n (blur)=\"updateMarkerPosition()\"\n [(ngModel)]=\"position.c8y_Position.lat\"\n />\n <c8y-messages>\n <c8y-message\n name=\"min\"\n [text]=\"'The minimum latitude value is -90\u00B0.' | translate\"\n ></c8y-message>\n <c8y-message\n name=\"max\"\n [text]=\"'The maximum latitude value is 90\u00B0.' | translate\"\n ></c8y-message>\n </c8y-messages>\n </c8y-form-group>\n <c8y-form-group>\n <label\n for=\"lat\"\n translate\n >\n Longitude (\u00B0)\n </label>\n\n <input\n class=\"form-control\"\n [title]=\"'Longitude (\u00B0)' | translate\"\n id=\"lng\"\n name=\"lng\"\n type=\"number\"\n required\n min=\"-180\"\n max=\"180\"\n (blur)=\"updateMarkerPosition()\"\n [(ngModel)]=\"position.c8y_Position.lng\"\n />\n <c8y-messages>\n <c8y-message\n name=\"min\"\n [text]=\"'The minimum longitude value is -180\u00B0.' | translate\"\n ></c8y-message>\n <c8y-message\n name=\"max\"\n [text]=\"'The maximum longitude value is 180\u00B0.' | translate\"\n ></c8y-message>\n </c8y-messages>\n </c8y-form-group>\n <c8y-form-group>\n <label\n for=\"alt\"\n translate\n >\n Altitude (m)\n </label>\n\n <input\n class=\"form-control\"\n [title]=\"'Altitude (m)' | translate\"\n id=\"alt\"\n name=\"alt\"\n type=\"number\"\n [(ngModel)]=\"position.c8y_Position.alt\"\n />\n </c8y-form-group>\n </div>\n\n <form\n class=\"card-block bg-level-1\"\n #addressSearch=\"ngForm\"\n novalidate\n (submit)=\"searchAddress(addressSearchTerm)\"\n *ngIf=\"isEdit && !hideAddressSearchFeature\"\n >\n <div class=\"form-group\">\n <label\n for=\"searchAddress\"\n translate\n >\n Find lat/long by address\n </label>\n <div class=\"input-group input-group-search\">\n <input\n class=\"form-control\"\n id=\"searchAddress\"\n name=\"addressSearchTerm\"\n type=\"text\"\n [placeholder]=\"'e.g. Speditionstra\u00DFe 13, D\u00FCsseldorf`LOCALIZE`' | translate\"\n [(ngModel)]=\"addressSearchTerm\"\n />\n <span class=\"input-group-btn\">\n <button\n class=\"btn btn-dot\"\n [title]=\"'Search' | translate\"\n type=\"submit\"\n >\n <i\n class=\"dlt-c8y-icon-search\"\n c8y-icon=\"search\"\n ></i>\n </button>\n </span>\n </div>\n </div>\n </form>\n </div>\n <div class=\"card-footer separator\">\n <button\n class=\"btn btn-default\"\n [title]=\"'Edit location' | translate\"\n type=\"button\"\n *ngIf=\"canEdit && !isEdit\"\n (click)=\"edit()\"\n translate\n >\n Edit location\n </button>\n <button\n class=\"btn btn-default\"\n [title]=\"'Cancel' | translate\"\n type=\"button\"\n (click)=\"cancel()\"\n *ngIf=\"isEdit\"\n translate\n >\n Cancel\n </button>\n <button\n class=\"btn btn-primary\"\n [title]=\"'Save' | translate\"\n type=\"submit\"\n *ngIf=\"isEdit\"\n translate\n [disabled]=\"!positionForm.valid\"\n >\n Save\n </button>\n </div>\n </form>\n</div>\n", dependencies: [{ kind: "component", type: i4.MapComponent, selector: "c8y-map", inputs: ["config", "assets"], outputs: ["onMove", "onMoveEnd", "onZoomStart", "onZoomEnd", "onRealtimeUpdate", "onInit"] }, { kind: "component", type: i1.ActionBarItemComponent, selector: "c8y-action-bar-item", inputs: ["placement", "priority", "itemClass", "injector", "groupId", "inGroupPriority"] }, { kind: "directive", type: i1.IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "directive", type: i1.C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "directive", type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.MinValidationDirective, selector: "[min]", inputs: ["min"] }, { kind: "directive", type: i1.MaxValidationDirective, selector: "[max]", inputs: ["max"] }, { kind: "directive", type: i6.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i6.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: i6.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i6.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i6.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i6.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i6.MinValidator, selector: "input[type=number][min][formControlName],input[type=number][min][formControl],input[type=number][min][ngModel]", inputs: ["min"] }, { kind: "directive", type: i6.MaxValidator, selector: "input[type=number][max][formControlName],input[type=number][max][formControl],input[type=number][max][ngModel]", inputs: ["max"] }, { kind: "directive", type: i6.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i6.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: i1.FormGroupComponent, selector: "c8y-form-group", inputs: ["hasError", "hasWarning", "hasSuccess", "novalidation", "status"] }, { kind: "directive", type: i1.MessageDirective, selector: "c8y-message", inputs: ["name", "text"] }, { kind: "component", type: i1.MessagesComponent, selector: "c8y-messages", inputs: ["show", "defaults"] }, { kind: "directive", type: i1.RequiredInputPlaceholderDirective, selector: "input[required], input[formControlName]" }, { kind: "pipe", type: i1.C8yTranslatePipe, name: "translate" }] }); }
127
134
  }
128
135
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: LocationComponent, decorators: [{
129
136
  type: Component,
130
- args: [{ selector: 'c8y-location', template: "<c8y-action-bar-item placement=\"right\">\n <button\n class=\"btn btn-link c8y-realtime\"\n title=\"{{ 'Toggle realtime' | translate }}\"\n type=\"button\"\n (click)=\"toggleRealtime()\"\n >\n <span\n class=\"c8y-pulse\"\n [ngClass]=\"{ active: config.realtime, inactive: !config.realtime }\"\n ></span>\n <span translate>Realtime</span>\n </button>\n</c8y-action-bar-item>\n<c8y-action-bar-item placement=\"right\">\n <button\n class=\"btn btn-clean\"\n title=\"{{ 'Center`verb`' | translate }}\"\n (click)=\"centerMap()\"\n >\n <i [c8yIcon]=\"'target1'\"></i>\n <span translate>Center`verb`</span>\n </button>\n</c8y-action-bar-item>\n\n<div class=\"card card--grid content-fullpage d-grid grid__col--8-4--md\">\n <div\n class=\"bg-white p-relative\"\n style=\"min-height: 30vh\"\n >\n <c8y-map\n [assets]=\"[position]\"\n [config]=\"config\"\n (onRealtimeUpdate)=\"positionChanged($event)\"\n ></c8y-map>\n </div>\n\n <form\n class=\"d-flex d-col bg-inherit content-fullpage bg-gray-white\"\n #positionForm=\"ngForm\"\n (ngSubmit)=\"save()\"\n >\n <div class=\"card-header large-padding separator sticky-top\">\n <span\n class=\"card-title\"\n translate\n >\n Device location\n </span>\n </div>\n <div class=\"inner-scroll\">\n <div\n class=\"m-16\"\n *ngIf=\"!isEdit\"\n >\n <div class=\"p-b-40\">\n <div\n class=\"text-bold\"\n translate\n >\n Latitude (\u00B0)\n </div>\n {{ position.c8y_Position.lat }}\n </div>\n <div class=\"p-b-40\">\n <div\n class=\"text-bold\"\n translate\n >\n Longitude (\u00B0)\n </div>\n {{ position.c8y_Position.lng }}\n </div>\n <div class=\"p-b-40\">\n <div\n class=\"text-bold\"\n translate\n >\n Altitude (m)\n </div>\n {{ position.c8y_Position.alt }}\n </div>\n </div>\n <div\n class=\"m-16\"\n *ngIf=\"isEdit\"\n >\n <c8y-form-group>\n <label\n for=\"lat\"\n translate\n >\n Latitude (\u00B0)\n </label>\n\n <input\n class=\"form-control\"\n [title]=\"'Latitude (\u00B0)' | translate\"\n id=\"lat\"\n name=\"lat\"\n type=\"number\"\n required\n min=\"-90\"\n max=\"90\"\n (blur)=\"updateMarkerPosition()\"\n [(ngModel)]=\"position.c8y_Position.lat\"\n />\n <c8y-messages>\n <c8y-message\n name=\"min\"\n [text]=\"'The minimum latitude value is -90\u00B0.' | translate\"\n ></c8y-message>\n <c8y-message\n name=\"max\"\n [text]=\"'The maximum latitude value is 90\u00B0.' | translate\"\n ></c8y-message>\n </c8y-messages>\n </c8y-form-group>\n <c8y-form-group>\n <label\n for=\"lat\"\n translate\n >\n Longitude (\u00B0)\n </label>\n\n <input\n class=\"form-control\"\n [title]=\"'Longitude (\u00B0)' | translate\"\n id=\"lng\"\n name=\"lng\"\n type=\"number\"\n required\n min=\"-180\"\n max=\"180\"\n (blur)=\"updateMarkerPosition()\"\n [(ngModel)]=\"position.c8y_Position.lng\"\n />\n <c8y-messages>\n <c8y-message\n name=\"min\"\n [text]=\"'The minimum longitude value is -180\u00B0.' | translate\"\n ></c8y-message>\n <c8y-message\n name=\"max\"\n [text]=\"'The maximum longitude value is 180\u00B0.' | translate\"\n ></c8y-message>\n </c8y-messages>\n </c8y-form-group>\n <c8y-form-group>\n <label\n for=\"alt\"\n translate\n >\n Altitude (m)\n </label>\n\n <input\n class=\"form-control\"\n [title]=\"'Altitude (m)' | translate\"\n id=\"alt\"\n name=\"alt\"\n type=\"number\"\n [(ngModel)]=\"position.c8y_Position.alt\"\n />\n </c8y-form-group>\n </div>\n\n <form\n class=\"card-block bg-level-1\"\n #addressSearch=\"ngForm\"\n novalidate\n (submit)=\"searchAddress(addressSearchTerm)\"\n *ngIf=\"isEdit && !hideMapquestBasedFeature\"\n >\n <div class=\"form-group\">\n <label\n for=\"searchAddress\"\n translate\n >\n Find lat/long by address\n </label>\n <div class=\"input-group input-group-search\">\n <input\n class=\"form-control\"\n id=\"searchAddress\"\n name=\"addressSearchTerm\"\n type=\"text\"\n [placeholder]=\"'e.g. Speditionstra\u00DFe 13, D\u00FCsseldorf`LOCALIZE`' | translate\"\n [(ngModel)]=\"addressSearchTerm\"\n />\n <span class=\"input-group-btn\">\n <button\n class=\"btn btn-dot\"\n [title]=\"'Search' | translate\"\n type=\"submit\"\n >\n <i\n class=\"dlt-c8y-icon-search\"\n c8y-icon=\"search\"\n ></i>\n </button>\n </span>\n </div>\n </div>\n </form>\n </div>\n <div class=\"card-footer separator\">\n <button\n class=\"btn btn-default\"\n [title]=\"'Edit location' | translate\"\n type=\"button\"\n *ngIf=\"canEdit && !isEdit\"\n (click)=\"edit()\"\n translate\n >\n Edit location\n </button>\n <button\n class=\"btn btn-default\"\n [title]=\"'Cancel' | translate\"\n type=\"button\"\n (click)=\"cancel()\"\n *ngIf=\"isEdit\"\n translate\n >\n Cancel\n </button>\n <button\n class=\"btn btn-primary\"\n [title]=\"'Save' | translate\"\n type=\"submit\"\n *ngIf=\"isEdit\"\n translate\n [disabled]=\"!positionForm.valid\"\n >\n Save\n </button>\n </div>\n </form>\n</div>\n" }]
137
+ args: [{ selector: 'c8y-location', template: "<c8y-action-bar-item placement=\"right\">\n <button\n class=\"btn btn-link c8y-realtime\"\n title=\"{{ 'Toggle realtime' | translate }}\"\n type=\"button\"\n (click)=\"toggleRealtime()\"\n >\n <span\n class=\"c8y-pulse\"\n [ngClass]=\"{ active: config.realtime, inactive: !config.realtime }\"\n ></span>\n <span translate>Realtime</span>\n </button>\n</c8y-action-bar-item>\n<c8y-action-bar-item placement=\"right\">\n <button\n class=\"btn btn-clean\"\n title=\"{{ 'Center`verb`' | translate }}\"\n (click)=\"centerMap()\"\n >\n <i [c8yIcon]=\"'target1'\"></i>\n <span translate>Center`verb`</span>\n </button>\n</c8y-action-bar-item>\n\n<div class=\"card card--grid content-fullpage d-grid grid__col--8-4--md\">\n <div\n class=\"bg-white p-relative\"\n style=\"min-height: 30vh\"\n >\n <c8y-map\n [assets]=\"[position]\"\n [config]=\"config\"\n (onRealtimeUpdate)=\"positionChanged($event)\"\n ></c8y-map>\n </div>\n\n <form\n class=\"d-flex d-col bg-inherit content-fullpage bg-gray-white\"\n #positionForm=\"ngForm\"\n (ngSubmit)=\"save()\"\n >\n <div class=\"card-header large-padding separator sticky-top\">\n <span\n class=\"card-title\"\n translate\n >\n Device location\n </span>\n </div>\n <div class=\"inner-scroll\">\n <div\n class=\"m-16\"\n *ngIf=\"!isEdit\"\n >\n <div class=\"p-b-40\">\n <div\n class=\"text-bold\"\n translate\n >\n Latitude (\u00B0)\n </div>\n {{ position.c8y_Position.lat }}\n </div>\n <div class=\"p-b-40\">\n <div\n class=\"text-bold\"\n translate\n >\n Longitude (\u00B0)\n </div>\n {{ position.c8y_Position.lng }}\n </div>\n <div class=\"p-b-40\">\n <div\n class=\"text-bold\"\n translate\n >\n Altitude (m)\n </div>\n {{ position.c8y_Position.alt }}\n </div>\n </div>\n <div\n class=\"m-16\"\n *ngIf=\"isEdit\"\n >\n <c8y-form-group>\n <label\n for=\"lat\"\n translate\n >\n Latitude (\u00B0)\n </label>\n\n <input\n class=\"form-control\"\n [title]=\"'Latitude (\u00B0)' | translate\"\n id=\"lat\"\n name=\"lat\"\n type=\"number\"\n required\n min=\"-90\"\n max=\"90\"\n (blur)=\"updateMarkerPosition()\"\n [(ngModel)]=\"position.c8y_Position.lat\"\n />\n <c8y-messages>\n <c8y-message\n name=\"min\"\n [text]=\"'The minimum latitude value is -90\u00B0.' | translate\"\n ></c8y-message>\n <c8y-message\n name=\"max\"\n [text]=\"'The maximum latitude value is 90\u00B0.' | translate\"\n ></c8y-message>\n </c8y-messages>\n </c8y-form-group>\n <c8y-form-group>\n <label\n for=\"lat\"\n translate\n >\n Longitude (\u00B0)\n </label>\n\n <input\n class=\"form-control\"\n [title]=\"'Longitude (\u00B0)' | translate\"\n id=\"lng\"\n name=\"lng\"\n type=\"number\"\n required\n min=\"-180\"\n max=\"180\"\n (blur)=\"updateMarkerPosition()\"\n [(ngModel)]=\"position.c8y_Position.lng\"\n />\n <c8y-messages>\n <c8y-message\n name=\"min\"\n [text]=\"'The minimum longitude value is -180\u00B0.' | translate\"\n ></c8y-message>\n <c8y-message\n name=\"max\"\n [text]=\"'The maximum longitude value is 180\u00B0.' | translate\"\n ></c8y-message>\n </c8y-messages>\n </c8y-form-group>\n <c8y-form-group>\n <label\n for=\"alt\"\n translate\n >\n Altitude (m)\n </label>\n\n <input\n class=\"form-control\"\n [title]=\"'Altitude (m)' | translate\"\n id=\"alt\"\n name=\"alt\"\n type=\"number\"\n [(ngModel)]=\"position.c8y_Position.alt\"\n />\n </c8y-form-group>\n </div>\n\n <form\n class=\"card-block bg-level-1\"\n #addressSearch=\"ngForm\"\n novalidate\n (submit)=\"searchAddress(addressSearchTerm)\"\n *ngIf=\"isEdit && !hideAddressSearchFeature\"\n >\n <div class=\"form-group\">\n <label\n for=\"searchAddress\"\n translate\n >\n Find lat/long by address\n </label>\n <div class=\"input-group input-group-search\">\n <input\n class=\"form-control\"\n id=\"searchAddress\"\n name=\"addressSearchTerm\"\n type=\"text\"\n [placeholder]=\"'e.g. Speditionstra\u00DFe 13, D\u00FCsseldorf`LOCALIZE`' | translate\"\n [(ngModel)]=\"addressSearchTerm\"\n />\n <span class=\"input-group-btn\">\n <button\n class=\"btn btn-dot\"\n [title]=\"'Search' | translate\"\n type=\"submit\"\n >\n <i\n class=\"dlt-c8y-icon-search\"\n c8y-icon=\"search\"\n ></i>\n </button>\n </span>\n </div>\n </div>\n </form>\n </div>\n <div class=\"card-footer separator\">\n <button\n class=\"btn btn-default\"\n [title]=\"'Edit location' | translate\"\n type=\"button\"\n *ngIf=\"canEdit && !isEdit\"\n (click)=\"edit()\"\n translate\n >\n Edit location\n </button>\n <button\n class=\"btn btn-default\"\n [title]=\"'Cancel' | translate\"\n type=\"button\"\n (click)=\"cancel()\"\n *ngIf=\"isEdit\"\n translate\n >\n Cancel\n </button>\n <button\n class=\"btn btn-primary\"\n [title]=\"'Save' | translate\"\n type=\"submit\"\n *ngIf=\"isEdit\"\n translate\n [disabled]=\"!positionForm.valid\"\n >\n Save\n </button>\n </div>\n </form>\n</div>\n" }]
131
138
  }], ctorParameters: function () { return [{ type: i1.ContextRouteService }, { type: i2.ActivatedRoute }, { type: i3.InventoryService }, { type: i1.Permissions }, { type: i1.OptionsService }, { type: i1.AlertService }]; }, propDecorators: { map: [{
132
139
  type: ViewChild,
133
140
  args: [MapComponent]
134
141
  }] } });
135
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9jYXRpb24uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vbG9jYXRpb24vbG9jYXRpb24uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vbG9jYXRpb24vbG9jYXRpb24uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBcUIsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3hFLE9BQU8sRUFBRSxZQUFZLEVBQW9DLE1BQU0seUJBQXlCLENBQUM7QUFDekYsT0FBTyxFQUNMLFlBQVksRUFDWixtQkFBbUIsRUFDbkIsY0FBYyxFQUNkLFdBQVcsRUFDWCxPQUFPLEVBQ1IsTUFBTSxxQkFBcUIsQ0FBQztBQUM3QixPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDakQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQy9DLE9BQU8sRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ25ELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMzQyxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDOzs7Ozs7OztBQU0vQixNQUFNLE9BQU8saUJBQWlCO0lBZ0I1QixZQUNVLG1CQUF3QyxFQUN4QyxjQUE4QixFQUM5QixnQkFBa0MsRUFDbEMsV0FBd0IsRUFDeEIsY0FBOEIsRUFDOUIsWUFBMEI7UUFMMUIsd0JBQW1CLEdBQW5CLG1CQUFtQixDQUFxQjtRQUN4QyxtQkFBYyxHQUFkLGNBQWMsQ0FBZ0I7UUFDOUIscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFrQjtRQUNsQyxnQkFBVyxHQUFYLFdBQVcsQ0FBYTtRQUN4QixtQkFBYyxHQUFkLGNBQWMsQ0FBZ0I7UUFDOUIsaUJBQVksR0FBWixZQUFZLENBQWM7UUFuQnBDLFdBQU0sR0FBRyxLQUFLLENBQUM7UUFDZixZ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UzsrQkFDRSxjQUFjO3dQQWlCeEIsR0FBRztzQkFERixTQUFTO3VCQUFDLFlBQVkiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIE9uRGVzdHJveSwgT25Jbml0LCBWaWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE1hcENvbXBvbmVudCwgTWFwQ29uZmlnLCBQb3NpdGlvbk1hbmFnZWRPYmplY3QgfSBmcm9tICdAYzh5L25neC1jb21wb25lbnRzL21hcCc7XG5pbXBvcnQge1xuICBBbGVydFNlcnZpY2UsXG4gIENvbnRleHRSb3V0ZVNlcnZpY2UsXG4gIE9wdGlvbnNTZXJ2aWNlLFxuICBQZXJtaXNzaW9ucyxcbiAgZ2V0dGV4dFxufSBmcm9tICdAYzh5L25neC1jb21wb25lbnRzJztcbmltcG9ydCB7IEFjdGl2YXRlZFJvdXRlIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7IEludmVudG9yeVNlcnZpY2UgfSBmcm9tICdAYzh5L2NsaWVudCc7XG5pbXBvcnQgeyBpc1VuZGVmaW5lZCwgY2xvbmVEZWVwIH0gZnJvbSAnbG9kYXNoLWVzJztcbmltcG9ydCB7IHRha2VVbnRpbCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IFN1YmplY3QgfSBmcm9tICdyeGpzJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYzh5LWxvY2F0aW9uJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2xvY2F0aW9uLmNvbXBvbmVudC5odG1sJ1xufSlcbmV4cG9ydCBjbGFzcyBMb2NhdGlvbkNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcbiAgcG9zaXRpb246IFBvc2l0aW9uTWFuYWdlZE9iamVjdDtcbiAgb3JpZ2luYWxQb3NpdGlvbjogUG9zaXRpb25NYW5hZ2VkT2JqZWN0O1xuICBpc0VkaXQgPSBmYWxzZTtcbiAgY2FuRWRpdCA9IHRydWU7XG4gIGNvbmZpZzogTWFwQ29uZmlnID0geyByZWFsdGltZTogZmFsc2UsIGZvbGxvdzogdHJ1ZSwgem9vbUxldmVsOiAxMiB9O1xuICBhZGRyZXNzU2VhcmNoVGVybSA9ICcnO1xuICBoaWRlTWFwcXVlc3RCYXNlZEZlYXR1cmUgPSBmYWxzZTtcblxuICBwcml2YXRlIGRlc3Ryb3kkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcbiAgcHJpdmF0ZSBtYXBRdWVzdFVybCA9XG4gICAgJ2h0dHBzOi8vd3d3Lm1hcHF1ZXN0YXBpLmNvbS9nZW9jb2RpbmcvdjEvYWRkcmVzcz9rZXk9aW9QZTVkbVc2ZURnQUJkSlo0bUZJSUw1MUYzdGl3WFcmZm9ybWF0PWpzb24mbG9jYXRpb249e3NlYXJjaFRlcm19JztcblxuICBAVmlld0NoaWxkKE1hcENvbXBvbmVudClcbiAgbWFwOiBNYXBDb21wb25lbnQ7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBjb250ZXh0Um91dGVTZXJ2aWNlOiBDb250ZXh0Um91dGVTZXJ2aWNlLFxuICAgIHByaXZhdGUgYWN0aXZhdGVkUm91dGU6IEFjdGl2YXRlZFJvdXRlLFxuICAgIHByaXZhdGUgaW52ZW50b3J5U2VydmljZTogSW52ZW50b3J5U2VydmljZSxcbiAgICBwcml2YXRlIHBlcm1pc3Npb25zOiBQZXJtaXNzaW9ucyxcbiAgICBwcml2YXRlIG9wdGlvbnNTZXJ2aWNlOiBPcHRpb25zU2VydmljZSxcbiAgICBwcml2YXRlIGFsZXJ0U2VydmljZTogQWxlcnRTZXJ2aWNlXG4gICkge31cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmFjdGl2YXRlZFJvdXRlLnVybC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIHRoaXMudXBkYXRlTWFwKCk7XG4gICAgfSk7XG4gIH1cblxuICBhc3luYyB1cGRhdGVNYXAoKSB7XG4gICAgY29uc3QgeyBjb250ZXh0RGF0YSB9ID0gdGhpcy5jb250ZXh0Um91dGVTZXJ2aWNlLmdldENvbnRleHREYXRhKHRoaXMuYWN0aXZhdGVkUm91dGUpO1xuICAgIHRoaXMucG9zaXRpb24gPSBjb250ZXh0RGF0YSBhcyBQb3NpdGlvbk1hbmFnZWRPYmplY3Q7XG4gICAgdGhpcy5jYW5FZGl0ID0gYXdhaXQgdGhpcy5wZXJtaXNzaW9ucy5jYW5FZGl0KFxuICAgICAgW1Blcm1pc3Npb25zLlJPTEVfSU5WRU5UT1JZX0FETUlOLCBQZXJtaXNzaW9ucy5ST0xFX0lOVkVOVE9SWV9DUkVBVEVdLFxuICAgICAgY29udGV4dERhdGFcbiAgICApO1xuXG4gICAgY29uc3QgaGFzQ3VzdG9tU2V0dGluZyA9ICFpc1VuZGVmaW5lZCh0aGlzLm9wdGlvbnNTZXJ2aWNlLm1hcFF1ZXN0VXJsKTtcbiAgICB0aGlzLmhpZGVNYXBxdWVzdEJhc2VkRmVhdHVyZSA9IGhhc0N1c3RvbVNldHRpbmcgJiYgIXRoaXMub3B0aW9uc1NlcnZpY2UubWFwUXVlc3RVcmw7XG5cbiAgICBpZiAoaGFzQ3VzdG9tU2V0dGluZykge1xuICAgICAgdGhpcy5tYXBRdWVzdFVybCA9IHRoaXMub3B0aW9uc1NlcnZpY2UubWFwUXVlc3RVcmw7XG4gICAgfVxuXG4gICAgdGhpcy5tYXAucmVmcmVzaCgpO1xuICB9XG5cbiAgdG9nZ2xlUmVhbHRpbWUoKSB7XG4gICAgdGhpcy5jb25maWcgPSB7IC4uLnRoaXMuY29uZmlnLCByZWFsdGltZTogIXRoaXMuY29uZmlnLnJlYWx0aW1lIH07XG4gIH1cblxuICBkaXNhYmxlUmVhbHRpbWUoKSB7XG4gICAgdGhpcy5jb25maWcgPSB7IC4uLnRoaXMuY29uZmlnLCByZWFsdGltZTogZmFsc2UgfTtcbiAgfVxuXG4gIGNlbnRlck1hcCgpIHtcbiAgICB0aGlzLmNvbmZpZyA9IHtcbiAgICAgIC4uLnRoaXMuY29uZmlnLFxuICAgICAgY2VudGVyOiBbdGhpcy5wb3NpdGlvbi5jOHlfUG9zaXRpb24ubGF0LCB0aGlzLnBvc2l0aW9uLmM4eV9Qb3NpdGlvbi5sbmddXG4gICAgfTtcbiAgfVxuXG4gIGVkaXQoKSB7XG4gICAgdGhpcy5vcmlnaW5hbFBvc2l0aW9uID0gY2xvbmVEZWVwKHRoaXMucG9zaXRpb24pO1xuICAgIHRoaXMuZW5hYmxlTWFya2VyRHJhZ2dpbmcoKTtcbiAgICB0aGlzLmRpc2FibGVSZWFsdGltZSgpO1xuICAgIHRoaXMuaXNFZGl0ID0gdHJ1ZTtcbiAgfVxuXG4gIGNhbmNlbCgpIHtcbiAgICB0aGlzLnBvc2l0aW9uID0gdGhpcy5vcmlnaW5hbFBvc2l0aW9uO1xuICAgIHRoaXMuaXNFZGl0ID0gZmFsc2U7XG4gICAgdGhpcy5tYXAubWFya2Vyc1swXT8uZHJhZ2dpbmcuZGlzYWJsZSgpO1xuICAgIHRoaXMuY2VudGVyTWFwKCk7XG4gIH1cblxuICBhc3luYyBzYXZlKCkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB7IGRhdGEgfSA9IGF3YWl0IHRoaXMuaW52ZW50b3J5U2VydmljZS51cGRhdGUoe1xuICAgICAgICBpZDogdGhpcy5wb3NpdGlvbi5pZCxcbiAgICAgICAgYzh5X1Bvc2l0aW9uOiB0aGlzLnBvc2l0aW9uLmM4eV9Qb3NpdGlvblxuICAgICAgfSk7XG4gICAgICB0aGlzLnBvc2l0aW9uID0gZGF0YSBhcyBQb3NpdGlvbk1hbmFnZWRPYmplY3Q7XG4gICAgfSBjYXRjaCAoZXgpIHtcbiAgICAgIHRoaXMuYWxlcnRTZXJ2aWNlLmFkZFNlcnZlckZhaWx1cmUoZXgpO1xuICAgIH1cbiAgICB0aGlzLm1hcC5tYXJrZXJzWzBdPy5kcmFnZ2luZy5kaXNhYmxlKCk7XG4gICAgdGhpcy5jZW50ZXJNYXAoKTtcbiAgICB0aGlzLmlzRWRpdCA9IGZhbHNlO1xuICB9XG5cbiAgcG9zaXRpb25DaGFuZ2VkKHBvc2l0aW9uOiBQb3NpdGlvbk1hbmFnZWRPYmplY3QpIHtcbiAgICB0aGlzLnBvc2l0aW9uID0gcG9zaXRpb247XG4gIH1cblxuICBhc3luYyBzZWFyY2hBZGRyZXNzKHNlYXJjaFRlcm06IHN0cmluZykge1xuICAgIGNvbnN0IGZldGNoUmVzcG9uc2UgPSBhd2FpdCBmZXRjaCh0aGlzLm1hcFF1ZXN0VXJsLnJlcGxhY2UoJ3tzZWFyY2hUZXJtfScsIHNlYXJjaFRlcm0pKTtcbiAgICBpZiAoZmV0Y2hSZXNwb25zZS5zdGF0dXMgIT09IDIwMCkge1xuICAgICAgdGhpcy5hbGVydFNlcnZpY2UuZGFuZ2VyKGdldHRleHQoJ0ZhaWxlZCB0byBzZWFyY2ggZm9yIGFkZHJlc3MuJykpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBkYXRhID0gYXdhaXQgZmV0Y2hSZXNwb25zZS5qc29uKCk7XG4gICAgY29uc3QgeyBsYXRMbmcgfSA9IGRhdGEucmVzdWx0c1swXS5sb2NhdGlvbnNbMF07XG4gICAgdGhpcy5wb3NpdGlvbi5jOHlfUG9zaXRpb24ubGF0ID0gbGF0TG5nLmxhdDtcbiAgICB0aGlzLnBvc2l0aW9uLmM4eV9Qb3NpdGlvbi5sbmcgPSBsYXRMbmcubG5nO1xuICAgIHRoaXMudXBkYXRlTWFya2VyUG9zaXRpb24oKTtcbiAgfVxuXG4gIHVwZGF0ZU1hcmtlclBvc2l0aW9uKCkge1xuICAgIHRoaXMubWFwLnJlZnJlc2hNYXJrZXJzKCk7XG4gICAgdGhpcy5lbmFibGVNYXJrZXJEcmFnZ2luZygpO1xuICAgIHRoaXMuY2VudGVyTWFwKCk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLmRlc3Ryb3kkLm5leHQoKTtcbiAgfVxuXG4gIHByaXZhdGUgZW5hYmxlTWFya2VyRHJhZ2dpbmcoKSB7XG4gICAgY29uc3QgbWFya2VyID0gdGhpcy5tYXAubWFya2Vyc1swXTtcbiAgICBpZiAobWFya2VyKSB7XG4gICAgICBtYXJrZXIuZHJhZ2dpbmcuZW5hYmxlKCk7XG4gICAgICBtYXJrZXIub24oJ2RyYWdlbmQnLCAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGxhdGxuZyA9IG1hcmtlci5nZXRMYXRMbmcoKTtcbiAgICAgICAgdGhpcy5wb3NpdGlvbi5jOHlfUG9zaXRpb24gPSB7XG4gICAgICAgICAgLi4udGhpcy5wb3NpdGlvbi5jOHlfUG9zaXRpb24sXG4gICAgICAgICAgbGF0OiBsYXRsbmcubGF0LFxuICAgICAgICAgIGxuZzogbGF0bG5nLmxuZ1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLmNlbnRlck1hcCgpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG59XG4iLCI8Yzh5LWFjdGlvbi1iYXItaXRlbSBwbGFjZW1lbnQ9XCJyaWdodFwiPlxuICA8YnV0dG9uXG4gICAgY2xhc3M9XCJidG4gYnRuLWxpbmsgYzh5LXJlYWx0aW1lXCJcbiAgICB0aXRsZT1cInt7ICdUb2dnbGUgcmVhbHRpbWUnIHwgdHJhbnNsYXRlIH19XCJcbiAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAoY2xpY2spPVwidG9nZ2xlUmVhbHRpbWUoKVwiXG4gID5cbiAgICA8c3BhblxuICAgICAgY2xhc3M9XCJjOHktcHVsc2VcIlxuICAgICAgW25nQ2xhc3NdPVwieyBhY3RpdmU6IGNvbmZpZy5yZWFsdGltZSwgaW5hY3RpdmU6ICFjb25maWcucmVhbHRpbWUgfVwiXG4gICAgPjwvc3Bhbj5cbiAgICA8c3BhbiB0cmFuc2xhdGU+UmVhbHRpbWU8L3NwYW4+XG4gIDwvYnV0dG9uPlxuPC9jOHktYWN0aW9uLWJhci1pdGVtPlxuPGM4eS1hY3Rpb24tYmFyLWl0ZW0gcGxhY2VtZW50PVwicmlnaHRcIj5cbiAgPGJ1dHRvblxuICAgIGNsYXNzPVwiYnRuIGJ0bi1jbGVhblwiXG4gICAgdGl0bGU9XCJ7eyAnQ2VudGVyYHZlcmJgJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgKGNsaWNrKT1cImNlbnRlck1hcCgpXCJcbiAgPlxuICAgIDxpIFtjOHlJY29uXT1cIid0YXJnZXQxJ1wiPjwvaT5cbiAgICA8c3BhbiB0cmFuc2xhdGU+Q2VudGVyYHZlcmJgPC9zcGFuPlxuICA8L2J1dHRvbj5cbjwvYzh5LWFjdGlvbi1iYXItaXRlbT5cblxuPGRpdiBjbGFzcz1cImNhcmQgY2FyZC0tZ3JpZCBjb250ZW50LWZ1bGxwYWdlIGQtZ3JpZCBncmlkX19jb2wtLTgtNC0tbWRcIj5cbiAgPGRpdlxuICAgIGNsYXNzPVwiYmctd2hpdGUgcC1yZWxhdGl2ZVwiXG4gICAgc3R5bGU9XCJtaW4taGVpZ2h0OiAzMHZoXCJcbiAgPlxuICAgIDxjOHktbWFwXG4gICAgICBbYXNzZXRzXT1cIltwb3NpdGlvbl1cIlxuICAgICAgW2NvbmZpZ109XCJjb25maWdcIlxuICAgICAgKG9uUmVhbHRpbWVVcGRhdGUpPVwicG9zaXRpb25DaGFuZ2VkKCRldmVudClcIlxuICAgID48L2M4eS1tYXA+XG4gIDwvZGl2PlxuXG4gIDxmb3JtXG4gICAgY2xhc3M9XCJkLWZsZXggZC1jb2wgYmctaW5oZXJpdCBjb250ZW50LWZ1bGxwYWdlIGJnLWdyYXktd2hpdGVcIlxuICAgICNwb3NpdGlvbkZvcm09XCJuZ0Zvcm1cIlxuICAgIChuZ1N1Ym1pdCk9XCJzYXZlKClcIlxuICA+XG4gICAgPGRpdiBjbGFzcz1cImNhcmQtaGVhZGVyIGxhcmdlLXBhZGRpbmcgc2VwYXJhdG9yIHN0aWNreS10b3BcIj5cbiAgICAgIDxzcGFuXG4gICAgICAgIGNsYXNzPVwiY2FyZC10aXRsZVwiXG4gICAgICAgIHRyYW5zbGF0ZVxuICAgICAgPlxuICAgICAgICBEZXZpY2UgbG9jYXRpb25cbiAgICAgIDwvc3Bhbj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwiaW5uZXItc2Nyb2xsXCI+XG4gICAgICA8ZGl2XG4gICAgICAgIGNsYXNzPVwibS0xNlwiXG4gICAgICAgICpuZ0lmPVwiIWlzRWRpdFwiXG4gICAgICA+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJwLWItNDBcIj5cbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICBjbGFzcz1cInRleHQtYm9sZFwiXG4gICAgICAgICAgICB0cmFuc2xhdGVcbiAgICAgICAgICA+XG4gICAgICAgICAgICBMYXRpdHVkZSAowrApXG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAge3sgcG9zaXRpb24uYzh5X1Bvc2l0aW9uLmxhdCB9fVxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInAtYi00MFwiPlxuICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgIGNsYXNzPVwidGV4dC1ib2xkXCJcbiAgICAgICAgICAgIHRyYW5zbGF0ZVxuICAgICAgICAgID5cbiAgICAgICAgICAgIExvbmdpdHVkZSAowrApXG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAge3sgcG9zaXRpb24uYzh5X1Bvc2l0aW9uLmxuZyB9fVxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInAtYi00MFwiPlxuICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgIGNsYXNzPVwidGV4dC1ib2xkXCJcbiAgICAgICAgICAgIHRyYW5zbGF0ZVxuICAgICAgICAgID5cbiAgICAgICAgICAgIEFsdGl0dWRlIChtKVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIHt7IHBvc2l0aW9uLmM4eV9Qb3NpdGlvbi5hbHQgfX1cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXZcbiAgICAgICAgY2xhc3M9XCJtLTE2XCJcbiAgICAgICAgKm5nSWY9XCJpc0VkaXRcIlxuICAgICAgPlxuICAgICAgICA8Yzh5LWZvcm0tZ3JvdXA+XG4gICAgICAgICAgPGxhYmVsXG4gICAgICAgICAgICBmb3I9XCJsYXRcIlxuICAgICAgICAgICAgdHJhbnNsYXRlXG4gICAgICAgICAgPlxuICAgICAgICAgICAgTGF0aXR1ZGUgKMKwKVxuICAgICAgICAgIDwvbGFiZWw+XG5cbiAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sXCJcbiAgICAgICAgICAgIFt0aXRsZV09XCInTGF0aXR1ZGUgKMKwKScgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgaWQ9XCJsYXRcIlxuICAgICAgICAgICAgbmFtZT1cImxhdFwiXG4gICAgICAgICAgICB0eXBlPVwibnVtYmVyXCJcbiAgICAgICAgICAgIHJlcXVpcmVkXG4gICAgICAgICAgICBtaW49XCItOTBcIlxuICAgICAgICAgICAgbWF4PVwiOTBcIlxuICAgICAgICAgICAgKGJsdXIpPVwidXBkYXRlTWFya2VyUG9zaXRpb24oKVwiXG4gICAgICAgICAgICBbKG5nTW9kZWwpXT1cInBvc2l0aW9uLmM4eV9Qb3NpdGlvbi5sYXRcIlxuICAgICAgICAgIC8+XG4gICAgICAgICAgPGM4eS1tZXNzYWdlcz5cbiAgICAgICAgICAgIDxjOHktbWVzc2FnZVxuICAgICAgICAgICAgICBuYW1lPVwibWluXCJcbiAgICAgICAgICAgICAgW3RleHRdPVwiJ1RoZSBtaW5pbXVtIGxhdGl0dWRlIHZhbHVlIGlzIC05MMKwLicgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgPjwvYzh5LW1lc3NhZ2U+XG4gICAgICAgICAgICA8Yzh5LW1lc3NhZ2VcbiAgICAgICAgICAgICAgbmFtZT1cIm1heFwiXG4gICAgICAgICAgICAgIFt0ZXh0XT1cIidUaGUgbWF4aW11bSBsYXRpdHVkZSB2YWx1ZSBpcyA5MMKwLicgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgPjwvYzh5LW1lc3NhZ2U+XG4gICAgICAgICAgPC9jOHktbWVzc2FnZXM+XG4gICAgICAgIDwvYzh5LWZvcm0tZ3JvdXA+XG4gICAgICAgIDxjOHktZm9ybS1ncm91cD5cbiAgICAgICAgICA8bGFiZWxcbiAgICAgICAgICAgIGZvcj1cImxhdFwiXG4gICAgICAgICAgICB0cmFuc2xhdGVcbiAgICAgICAgICA+XG4gICAgICAgICAgICBMb25naXR1ZGUgKMKwKVxuICAgICAgICAgIDwvbGFiZWw+XG5cbiAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sXCJcbiAgICAgICAgICAgIFt0aXRsZV09XCInTG9uZ2l0dWRlICjCsCknIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgIGlkPVwibG5nXCJcbiAgICAgICAgICAgIG5hbWU9XCJsbmdcIlxuICAgICAgICAgICAgdHlwZT1cIm51bWJlclwiXG4gICAgICAgICAgICByZXF1aXJlZFxuICAgICAgICAgICAgbWluPVwiLTE4MFwiXG4gICAgICAgICAgICBtYXg9XCIxODBcIlxuICAgICAgICAgICAgKGJsdXIpPVwidXBkYXRlTWFya2VyUG9zaXRpb24oKVwiXG4gICAgICAgICAgICBbKG5nTW9kZWwpXT1cInBvc2l0aW9uLmM4eV9Qb3NpdGlvbi5sbmdcIlxuICAgICAgICAgIC8+XG4gICAgICAgICAgPGM4eS1tZXNzYWdlcz5cbiAgICAgICAgICAgIDxjOHktbWVzc2FnZVxuICAgICAgICAgICAgICBuYW1lPVwibWluXCJcbiAgICAgICAgICAgICAgW3RleHRdPVwiJ1RoZSBtaW5pbXVtIGxvbmdpdHVkZSB2YWx1ZSBpcyAtMTgwwrAuJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICA+PC9jOHktbWVzc2FnZT5cbiAgICAgICAgICAgIDxjOHktbWVzc2FnZVxuICAgICAgICAgICAgICBuYW1lPVwibWF4XCJcbiAgICAgICAgICAgICAgW3RleHRdPVwiJ1RoZSBtYXhpbXVtIGxvbmdpdHVkZSB2YWx1ZSBpcyAxODDCsC4nIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgID48L2M4eS1tZXNzYWdlPlxuICAgICAgICAgIDwvYzh5LW1lc3NhZ2VzPlxuICAgICAgICA8L2M4eS1mb3JtLWdyb3VwPlxuICAgICAgICA8Yzh5LWZvcm0tZ3JvdXA+XG4gICAgICAgICAgPGxhYmVsXG4gICAgICAgICAgICBmb3I9XCJhbHRcIlxuICAgICAgICAgICAgdHJhbnNsYXRlXG4gICAgICAgICAgPlxuICAgICAgICAgICAgQWx0aXR1ZGUgKG0pXG4gICAgICAgICAgPC9sYWJlbD5cblxuICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIlxuICAgICAgICAgICAgW3RpdGxlXT1cIidBbHRpdHVkZSAobSknIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgIGlkPVwiYWx0XCJcbiAgICAgICAgICAgIG5hbWU9XCJhbHRcIlxuICAgICAgICAgICAgdHlwZT1cIm51bWJlclwiXG4gICAgICAgICAgICBbKG5nTW9kZWwpXT1cInBvc2l0aW9uLmM4eV9Qb3NpdGlvbi5hbHRcIlxuICAgICAgICAgIC8+XG4gICAgICAgIDwvYzh5LWZvcm0tZ3JvdXA+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGZvcm1cbiAgICAgICAgY2xhc3M9XCJjYXJkLWJsb2NrIGJnLWxldmVsLTFcIlxuICAgICAgICAjYWRkcmVzc1NlYXJjaD1cIm5nRm9ybVwiXG4gICAgICAgIG5vdmFsaWRhdGVcbiAgICAgICAgKHN1Ym1pdCk9XCJzZWFyY2hBZGRyZXNzKGFkZHJlc3NTZWFyY2hUZXJtKVwiXG4gICAgICAgICpuZ0lmPVwiaXNFZGl0ICYmICFoaWRlTWFwcXVlc3RCYXNlZEZlYXR1cmVcIlxuICAgICAgPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cFwiPlxuICAgICAgICAgIDxsYWJlbFxuICAgICAgICAgICAgZm9yPVwic2VhcmNoQWRkcmVzc1wiXG4gICAgICAgICAgICB0cmFuc2xhdGVcbiAgICAgICAgICA+XG4gICAgICAgICAgICBGaW5kIGxhdC9sb25nIGJ5IGFkZHJlc3NcbiAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnB1dC1ncm91cCBpbnB1dC1ncm91cC1zZWFyY2hcIj5cbiAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICBjbGFzcz1cImZvcm0tY29udHJvbFwiXG4gICAgICAgICAgICAgIGlkPVwic2VhcmNoQWRkcmVzc1wiXG4gICAgICAgICAgICAgIG5hbWU9XCJhZGRyZXNzU2VhcmNoVGVybVwiXG4gICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cIidlLmcuIFNwZWRpdGlvbnN0cmHDn2UgMTMsIETDvHNzZWxkb3JmYExPQ0FMSVpFYCcgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cImFkZHJlc3NTZWFyY2hUZXJtXCJcbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImlucHV0LWdyb3VwLWJ0blwiPlxuICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJidG4gYnRuLWRvdFwiXG4gICAgICAgICAgICAgICAgW3RpdGxlXT1cIidTZWFyY2gnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICB0eXBlPVwic3VibWl0XCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxpXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImRsdC1jOHktaWNvbi1zZWFyY2hcIlxuICAgICAgICAgICAgICAgICAgYzh5LWljb249XCJzZWFyY2hcIlxuICAgICAgICAgICAgICAgID48L2k+XG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZm9ybT5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwiY2FyZC1mb290ZXIgc2VwYXJhdG9yXCI+XG4gICAgICA8YnV0dG9uXG4gICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1kZWZhdWx0XCJcbiAgICAgICAgW3RpdGxlXT1cIidFZGl0IGxvY2F0aW9uJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAqbmdJZj1cImNhbkVkaXQgJiYgIWlzRWRpdFwiXG4gICAgICAgIChjbGljayk9XCJlZGl0KClcIlxuICAgICAgICB0cmFuc2xhdGVcbiAgICAgID5cbiAgICAgICAgRWRpdCBsb2NhdGlvblxuICAgICAgPC9idXR0b24+XG4gICAgICA8YnV0dG9uXG4gICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1kZWZhdWx0XCJcbiAgICAgICAgW3RpdGxlXT1cIidDYW5jZWwnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgIChjbGljayk9XCJjYW5jZWwoKVwiXG4gICAgICAgICpuZ0lmPVwiaXNFZGl0XCJcbiAgICAgICAgdHJhbnNsYXRlXG4gICAgICA+XG4gICAgICAgIENhbmNlbFxuICAgICAgPC9idXR0b24+XG4gICAgICA8YnV0dG9uXG4gICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5XCJcbiAgICAgICAgW3RpdGxlXT1cIidTYXZlJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgIHR5cGU9XCJzdWJtaXRcIlxuICAgICAgICAqbmdJZj1cImlzRWRpdFwiXG4gICAgICAgIHRyYW5zbGF0ZVxuICAgICAgICBbZGlzYWJsZWRdPVwiIXBvc2l0aW9uRm9ybS52YWxpZFwiXG4gICAgICA+XG4gICAgICAgIFNhdmVcbiAgICAgIDwvYnV0dG9uPlxuICAgIDwvZGl2PlxuICA8L2Zvcm0+XG48L2Rpdj5cbiJdfQ==
142
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9jYXRpb24uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vbG9jYXRpb24vbG9jYXRpb24uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vbG9jYXRpb24vbG9jYXRpb24uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBcUIsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3hFLE9BQU8sRUFBRSxZQUFZLEVBQW9DLE1BQU0seUJBQXlCLENBQUM7QUFDekYsT0FBTyxFQUNMLFlBQVksRUFDWixtQkFBbUIsRUFDbkIsY0FBYyxFQUNkLFdBQVcsRUFDWCxPQUFPLEVBQ1IsTUFBTSxxQkFBcUIsQ0FBQztBQUM3QixPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDakQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQy9DLE9BQU8sRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ25ELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMzQyxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDOzs7Ozs7OztBQU0vQixNQUFNLE9BQU8saUJBQWlCO0lBZTVCLFlBQ1UsbUJBQXdDLEVBQ3hDLGNBQThCLEVBQzlCLGdCQUFrQyxFQUNsQyxXQUF3QixFQUN4QixjQUE4QixFQUM5QixZQUEwQjtRQUwxQix3QkFBbUIsR0FBbkIsbUJBQW1CLENBQXFCO1FBQ3hDLG1CQUFjLEdBQWQsY0FBYyxDQUFnQjtRQUM5QixxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQWtCO1FBQ2xDLGdCQUFXLEdBQVgsV0FBVyxDQUFhO1FBQ3hCLG1CQUFjLEdBQWQsY0FBYyxDQUFnQjtRQUM5QixpQkFBWSxHQUFaLFlBQVksQ0FBYztRQWxCcEMsV0FBTSxHQUFHLEtBQUssQ0FBQztRQUNmLFlB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QUFFLE1BQU0sQ0FBQyxHQUFHO29CQUNmLEdBQUcsRUFBRSxNQUFNLENBQUMsR0FBRztpQkFDaEIsQ0FBQztnQkFDRixJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDbkIsQ0FBQyxDQUFDLENBQUM7U0FDSjtJQUNILENBQUM7K0dBN0lVLGlCQUFpQjttR0FBakIsaUJBQWlCLHlGQVlqQixZQUFZLGdEQy9CekIsczhNQWlQQTs7NEZEOU5hLGlCQUFpQjtrQkFKN0IsU0FBUzsrQkFDRSxjQUFjO3dQQWdCeEIsR0FBRztzQkFERixTQUFTO3VCQUFDLFlBQVkiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIE9uRGVzdHJveSwgT25Jbml0LCBWaWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE1hcENvbXBvbmVudCwgTWFwQ29uZmlnLCBQb3NpdGlvbk1hbmFnZWRPYmplY3QgfSBmcm9tICdAYzh5L25neC1jb21wb25lbnRzL21hcCc7XG5pbXBvcnQge1xuICBBbGVydFNlcnZpY2UsXG4gIENvbnRleHRSb3V0ZVNlcnZpY2UsXG4gIE9wdGlvbnNTZXJ2aWNlLFxuICBQZXJtaXNzaW9ucyxcbiAgZ2V0dGV4dFxufSBmcm9tICdAYzh5L25neC1jb21wb25lbnRzJztcbmltcG9ydCB7IEFjdGl2YXRlZFJvdXRlIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7IEludmVudG9yeVNlcnZpY2UgfSBmcm9tICdAYzh5L2NsaWVudCc7XG5pbXBvcnQgeyBpc1VuZGVmaW5lZCwgY2xvbmVEZWVwIH0gZnJvbSAnbG9kYXNoLWVzJztcbmltcG9ydCB7IHRha2VVbnRpbCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IFN1YmplY3QgfSBmcm9tICdyeGpzJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYzh5LWxvY2F0aW9uJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2xvY2F0aW9uLmNvbXBvbmVudC5odG1sJ1xufSlcbmV4cG9ydCBjbGFzcyBMb2NhdGlvbkNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcbiAgcG9zaXRpb246IFBvc2l0aW9uTWFuYWdlZE9iamVjdDtcbiAgb3JpZ2luYWxQb3NpdGlvbjogUG9zaXRpb25NYW5hZ2VkT2JqZWN0O1xuICBpc0VkaXQgPSBmYWxzZTtcbiAgY2FuRWRpdCA9IHRydWU7XG4gIGNvbmZpZzogTWFwQ29uZmlnID0geyByZWFsdGltZTogZmFsc2UsIGZvbGxvdzogdHJ1ZSwgem9vbUxldmVsOiAxMiB9O1xuICBhZGRyZXNzU2VhcmNoVGVybSA9ICcnO1xuICBoaWRlQWRkcmVzc1NlYXJjaEZlYXR1cmUgPSBmYWxzZTtcblxuICBwcml2YXRlIGRlc3Ryb3kkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcbiAgcHJpdmF0ZSBtYXBOb21pbmF0aW1VcmwgPSAnaHR0cHM6Ly9ub21pbmF0aW0ub3BlbnN0cmVldG1hcC5vcmcvc2VhcmNoP2Zvcm1hdD1qc29uJnE9e3NlYXJjaFRlcm19JztcblxuICBAVmlld0NoaWxkKE1hcENvbXBvbmVudClcbiAgbWFwOiBNYXBDb21wb25lbnQ7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBjb250ZXh0Um91dGVTZXJ2aWNlOiBDb250ZXh0Um91dGVTZXJ2aWNlLFxuICAgIHByaXZhdGUgYWN0aXZhdGVkUm91dGU6IEFjdGl2YXRlZFJvdXRlLFxuICAgIHByaXZhdGUgaW52ZW50b3J5U2VydmljZTogSW52ZW50b3J5U2VydmljZSxcbiAgICBwcml2YXRlIHBlcm1pc3Npb25zOiBQZXJtaXNzaW9ucyxcbiAgICBwcml2YXRlIG9wdGlvbnNTZXJ2aWNlOiBPcHRpb25zU2VydmljZSxcbiAgICBwcml2YXRlIGFsZXJ0U2VydmljZTogQWxlcnRTZXJ2aWNlXG4gICkge31cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmFjdGl2YXRlZFJvdXRlLnVybC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIHRoaXMudXBkYXRlTWFwKCk7XG4gICAgfSk7XG4gIH1cblxuICBhc3luYyB1cGRhdGVNYXAoKSB7XG4gICAgY29uc3QgeyBjb250ZXh0RGF0YSB9ID0gdGhpcy5jb250ZXh0Um91dGVTZXJ2aWNlLmdldENvbnRleHREYXRhKHRoaXMuYWN0aXZhdGVkUm91dGUpO1xuICAgIHRoaXMucG9zaXRpb24gPSBjb250ZXh0RGF0YSBhcyBQb3NpdGlvbk1hbmFnZWRPYmplY3Q7XG4gICAgdGhpcy5jYW5FZGl0ID0gYXdhaXQgdGhpcy5wZXJtaXNzaW9ucy5jYW5FZGl0KFxuICAgICAgW1Blcm1pc3Npb25zLlJPTEVfSU5WRU5UT1JZX0FETUlOLCBQZXJtaXNzaW9ucy5ST0xFX0lOVkVOVE9SWV9DUkVBVEVdLFxuICAgICAgY29udGV4dERhdGFcbiAgICApO1xuXG4gICAgY29uc3QgaGFzQ3VzdG9tU2V0dGluZyA9ICFpc1VuZGVmaW5lZCh0aGlzLm9wdGlvbnNTZXJ2aWNlLm1hcE5vbWluYXRpbVVybCk7XG4gICAgdGhpcy5oaWRlQWRkcmVzc1NlYXJjaEZlYXR1cmUgPSBoYXNDdXN0b21TZXR0aW5nICYmICF0aGlzLm9wdGlvbnNTZXJ2aWNlLm1hcE5vbWluYXRpbVVybDtcblxuICAgIGlmIChoYXNDdXN0b21TZXR0aW5nKSB7XG4gICAgICB0aGlzLm1hcE5vbWluYXRpbVVybCA9IHRoaXMub3B0aW9uc1NlcnZpY2UubWFwTm9taW5hdGltVXJsO1xuICAgIH1cblxuICAgIHRoaXMubWFwLnJlZnJlc2goKTtcbiAgfVxuXG4gIHRvZ2dsZVJlYWx0aW1lKCkge1xuICAgIHRoaXMuY29uZmlnID0geyAuLi50aGlzLmNvbmZpZywgcmVhbHRpbWU6ICF0aGlzLmNvbmZpZy5yZWFsdGltZSB9O1xuICB9XG5cbiAgZGlzYWJsZVJlYWx0aW1lKCkge1xuICAgIHRoaXMuY29uZmlnID0geyAuLi50aGlzLmNvbmZpZywgcmVhbHRpbWU6IGZhbHNlIH07XG4gIH1cblxuICBjZW50ZXJNYXAoKSB7XG4gICAgdGhpcy5jb25maWcgPSB7XG4gICAgICAuLi50aGlzLmNvbmZpZyxcbiAgICAgIGNlbnRlcjogW3RoaXMucG9zaXRpb24uYzh5X1Bvc2l0aW9uLmxhdCwgdGhpcy5wb3NpdGlvbi5jOHlfUG9zaXRpb24ubG5nXVxuICAgIH07XG4gIH1cblxuICBlZGl0KCkge1xuICAgIHRoaXMub3JpZ2luYWxQb3NpdGlvbiA9IGNsb25lRGVlcCh0aGlzLnBvc2l0aW9uKTtcbiAgICB0aGlzLmVuYWJsZU1hcmtlckRyYWdnaW5nKCk7XG4gICAgdGhpcy5kaXNhYmxlUmVhbHRpbWUoKTtcbiAgICB0aGlzLmlzRWRpdCA9IHRydWU7XG4gIH1cblxuICBjYW5jZWwoKSB7XG4gICAgdGhpcy5wb3NpdGlvbiA9IHRoaXMub3JpZ2luYWxQb3NpdGlvbjtcbiAgICB0aGlzLmlzRWRpdCA9IGZhbHNlO1xuICAgIHRoaXMubWFwLm1hcmtlcnNbMF0/LmRyYWdnaW5nLmRpc2FibGUoKTtcbiAgICB0aGlzLmNlbnRlck1hcCgpO1xuICB9XG5cbiAgYXN5bmMgc2F2ZSgpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgeyBkYXRhIH0gPSBhd2FpdCB0aGlzLmludmVudG9yeVNlcnZpY2UudXBkYXRlKHtcbiAgICAgICAgaWQ6IHRoaXMucG9zaXRpb24uaWQsXG4gICAgICAgIGM4eV9Qb3NpdGlvbjogdGhpcy5wb3NpdGlvbi5jOHlfUG9zaXRpb25cbiAgICAgIH0pO1xuICAgICAgdGhpcy5wb3NpdGlvbiA9IGRhdGEgYXMgUG9zaXRpb25NYW5hZ2VkT2JqZWN0O1xuICAgIH0gY2F0Y2ggKGV4KSB7XG4gICAgICB0aGlzLmFsZXJ0U2VydmljZS5hZGRTZXJ2ZXJGYWlsdXJlKGV4KTtcbiAgICB9XG4gICAgdGhpcy5tYXAubWFya2Vyc1swXT8uZHJhZ2dpbmcuZGlzYWJsZSgpO1xuICAgIHRoaXMuY2VudGVyTWFwKCk7XG4gICAgdGhpcy5pc0VkaXQgPSBmYWxzZTtcbiAgfVxuXG4gIHBvc2l0aW9uQ2hhbmdlZChwb3NpdGlvbjogUG9zaXRpb25NYW5hZ2VkT2JqZWN0KSB7XG4gICAgdGhpcy5wb3NpdGlvbiA9IHBvc2l0aW9uO1xuICB9XG5cbiAgYXN5bmMgc2VhcmNoQWRkcmVzcyhzZWFyY2hUZXJtOiBzdHJpbmcpIHtcbiAgICBjb25zdCBmZXRjaFJlc3BvbnNlID0gYXdhaXQgZmV0Y2godGhpcy5tYXBOb21pbmF0aW1VcmwucmVwbGFjZSgne3NlYXJjaFRlcm19Jywgc2VhcmNoVGVybSkpO1xuICAgIGlmIChmZXRjaFJlc3BvbnNlLnN0YXR1cyAhPT0gMjAwKSB7XG4gICAgICB0aGlzLmFsZXJ0U2VydmljZS5kYW5nZXIoZ2V0dGV4dCgnRmFpbGVkIHRvIHNlYXJjaCBmb3IgYWRkcmVzcy4nKSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGRhdGE6IEFycmF5PHsgbGF0OiBzdHJpbmcgfCBudW1iZXI7IGxvbjogc3RyaW5nIHwgbnVtYmVyOyBsaWNlbmNlPzogc3RyaW5nIH0+ID1cbiAgICAgIGF3YWl0IGZldGNoUmVzcG9uc2UuanNvbigpO1xuICAgIGNvbnN0IGxhdExuZyA9IGRhdGFbMF07XG4gICAgaWYgKCFsYXRMbmcpIHtcbiAgICAgIHRoaXMuYWxlcnRTZXJ2aWNlLndhcm5pbmcoZ2V0dGV4dCgnQWRkcmVzcyBjb3VsZCBub3QgYmUgZm91bmQuJykpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnBvc2l0aW9uLmM4eV9Qb3NpdGlvbi5sYXQgPSBOdW1iZXIobGF0TG5nLmxhdCk7XG4gICAgdGhpcy5wb3NpdGlvbi5jOHlfUG9zaXRpb24ubG5nID0gTnVtYmVyKGxhdExuZy5sb24pO1xuICAgIHRoaXMudXBkYXRlTWFya2VyUG9zaXRpb24oKTtcbiAgICBpZiAobGF0TG5nLmxpY2VuY2UpIHtcbiAgICAgIHRoaXMubWFwLm1hcC5hdHRyaWJ1dGlvbkNvbnRyb2wuYWRkQXR0cmlidXRpb24obGF0TG5nLmxpY2VuY2UpO1xuICAgIH1cbiAgfVxuXG4gIHVwZGF0ZU1hcmtlclBvc2l0aW9uKCkge1xuICAgIHRoaXMubWFwLnJlZnJlc2hNYXJrZXJzKCk7XG4gICAgdGhpcy5lbmFibGVNYXJrZXJEcmFnZ2luZygpO1xuICAgIHRoaXMuY2VudGVyTWFwKCk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLmRlc3Ryb3kkLm5leHQoKTtcbiAgfVxuXG4gIHByaXZhdGUgZW5hYmxlTWFya2VyRHJhZ2dpbmcoKSB7XG4gICAgY29uc3QgbWFya2VyID0gdGhpcy5tYXAubWFya2Vyc1swXTtcbiAgICBpZiAobWFya2VyKSB7XG4gICAgICBtYXJrZXIuZHJhZ2dpbmcuZW5hYmxlKCk7XG4gICAgICBtYXJrZXIub24oJ2RyYWdlbmQnLCAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGxhdGxuZyA9IG1hcmtlci5nZXRMYXRMbmcoKTtcbiAgICAgICAgdGhpcy5wb3NpdGlvbi5jOHlfUG9zaXRpb24gPSB7XG4gICAgICAgICAgLi4udGhpcy5wb3NpdGlvbi5jOHlfUG9zaXRpb24sXG4gICAgICAgICAgbGF0OiBsYXRsbmcubGF0LFxuICAgICAgICAgIGxuZzogbGF0bG5nLmxuZ1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLmNlbnRlck1hcCgpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG59XG4iLCI8Yzh5LWFjdGlvbi1iYXItaXRlbSBwbGFjZW1lbnQ9XCJyaWdodFwiPlxuICA8YnV0dG9uXG4gICAgY2xhc3M9XCJidG4gYnRuLWxpbmsgYzh5LXJlYWx0aW1lXCJcbiAgICB0aXRsZT1cInt7ICdUb2dnbGUgcmVhbHRpbWUnIHwgdHJhbnNsYXRlIH19XCJcbiAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAoY2xpY2spPVwidG9nZ2xlUmVhbHRpbWUoKVwiXG4gID5cbiAgICA8c3BhblxuICAgICAgY2xhc3M9XCJjOHktcHVsc2VcIlxuICAgICAgW25nQ2xhc3NdPVwieyBhY3RpdmU6IGNvbmZpZy5yZWFsdGltZSwgaW5hY3RpdmU6ICFjb25maWcucmVhbHRpbWUgfVwiXG4gICAgPjwvc3Bhbj5cbiAgICA8c3BhbiB0cmFuc2xhdGU+UmVhbHRpbWU8L3NwYW4+XG4gIDwvYnV0dG9uPlxuPC9jOHktYWN0aW9uLWJhci1pdGVtPlxuPGM4eS1hY3Rpb24tYmFyLWl0ZW0gcGxhY2VtZW50PVwicmlnaHRcIj5cbiAgPGJ1dHRvblxuICAgIGNsYXNzPVwiYnRuIGJ0bi1jbGVhblwiXG4gICAgdGl0bGU9XCJ7eyAnQ2VudGVyYHZlcmJgJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgKGNsaWNrKT1cImNlbnRlck1hcCgpXCJcbiAgPlxuICAgIDxpIFtjOHlJY29uXT1cIid0YXJnZXQxJ1wiPjwvaT5cbiAgICA8c3BhbiB0cmFuc2xhdGU+Q2VudGVyYHZlcmJgPC9zcGFuPlxuICA8L2J1dHRvbj5cbjwvYzh5LWFjdGlvbi1iYXItaXRlbT5cblxuPGRpdiBjbGFzcz1cImNhcmQgY2FyZC0tZ3JpZCBjb250ZW50LWZ1bGxwYWdlIGQtZ3JpZCBncmlkX19jb2wtLTgtNC0tbWRcIj5cbiAgPGRpdlxuICAgIGNsYXNzPVwiYmctd2hpdGUgcC1yZWxhdGl2ZVwiXG4gICAgc3R5bGU9XCJtaW4taGVpZ2h0OiAzMHZoXCJcbiAgPlxuICAgIDxjOHktbWFwXG4gICAgICBbYXNzZXRzXT1cIltwb3NpdGlvbl1cIlxuICAgICAgW2NvbmZpZ109XCJjb25maWdcIlxuICAgICAgKG9uUmVhbHRpbWVVcGRhdGUpPVwicG9zaXRpb25DaGFuZ2VkKCRldmVudClcIlxuICAgID48L2M4eS1tYXA+XG4gIDwvZGl2PlxuXG4gIDxmb3JtXG4gICAgY2xhc3M9XCJkLWZsZXggZC1jb2wgYmctaW5oZXJpdCBjb250ZW50LWZ1bGxwYWdlIGJnLWdyYXktd2hpdGVcIlxuICAgICNwb3NpdGlvbkZvcm09XCJuZ0Zvcm1cIlxuICAgIChuZ1N1Ym1pdCk9XCJzYXZlKClcIlxuICA+XG4gICAgPGRpdiBjbGFzcz1cImNhcmQtaGVhZGVyIGxhcmdlLXBhZGRpbmcgc2VwYXJhdG9yIHN0aWNreS10b3BcIj5cbiAgICAgIDxzcGFuXG4gICAgICAgIGNsYXNzPVwiY2FyZC10aXRsZVwiXG4gICAgICAgIHRyYW5zbGF0ZVxuICAgICAgPlxuICAgICAgICBEZXZpY2UgbG9jYXRpb25cbiAgICAgIDwvc3Bhbj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwiaW5uZXItc2Nyb2xsXCI+XG4gICAgICA8ZGl2XG4gICAgICAgIGNsYXNzPVwibS0xNlwiXG4gICAgICAgICpuZ0lmPVwiIWlzRWRpdFwiXG4gICAgICA+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJwLWItNDBcIj5cbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICBjbGFzcz1cInRleHQtYm9sZFwiXG4gICAgICAgICAgICB0cmFuc2xhdGVcbiAgICAgICAgICA+XG4gICAgICAgICAgICBMYXRpdHVkZSAowrApXG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAge3sgcG9zaXRpb24uYzh5X1Bvc2l0aW9uLmxhdCB9fVxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInAtYi00MFwiPlxuICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgIGNsYXNzPVwidGV4dC1ib2xkXCJcbiAgICAgICAgICAgIHRyYW5zbGF0ZVxuICAgICAgICAgID5cbiAgICAgICAgICAgIExvbmdpdHVkZSAowrApXG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAge3sgcG9zaXRpb24uYzh5X1Bvc2l0aW9uLmxuZyB9fVxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInAtYi00MFwiPlxuICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgIGNsYXNzPVwidGV4dC1ib2xkXCJcbiAgICAgICAgICAgIHRyYW5zbGF0ZVxuICAgICAgICAgID5cbiAgICAgICAgICAgIEFsdGl0dWRlIChtKVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIHt7IHBvc2l0aW9uLmM4eV9Qb3NpdGlvbi5hbHQgfX1cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXZcbiAgICAgICAgY2xhc3M9XCJtLTE2XCJcbiAgICAgICAgKm5nSWY9XCJpc0VkaXRcIlxuICAgICAgPlxuICAgICAgICA8Yzh5LWZvcm0tZ3JvdXA+XG4gICAgICAgICAgPGxhYmVsXG4gICAgICAgICAgICBmb3I9XCJsYXRcIlxuICAgICAgICAgICAgdHJhbnNsYXRlXG4gICAgICAgICAgPlxuICAgICAgICAgICAgTGF0aXR1ZGUgKMKwKVxuICAgICAgICAgIDwvbGFiZWw+XG5cbiAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sXCJcbiAgICAgICAgICAgIFt0aXRsZV09XCInTGF0aXR1ZGUgKMKwKScgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgaWQ9XCJsYXRcIlxuICAgICAgICAgICAgbmFtZT1cImxhdFwiXG4gICAgICAgICAgICB0eXBlPVwibnVtYmVyXCJcbiAgICAgICAgICAgIHJlcXVpcmVkXG4gICAgICAgICAgICBtaW49XCItOTBcIlxuICAgICAgICAgICAgbWF4PVwiOTBcIlxuICAgICAgICAgICAgKGJsdXIpPVwidXBkYXRlTWFya2VyUG9zaXRpb24oKVwiXG4gICAgICAgICAgICBbKG5nTW9kZWwpXT1cInBvc2l0aW9uLmM4eV9Qb3NpdGlvbi5sYXRcIlxuICAgICAgICAgIC8+XG4gICAgICAgICAgPGM4eS1tZXNzYWdlcz5cbiAgICAgICAgICAgIDxjOHktbWVzc2FnZVxuICAgICAgICAgICAgICBuYW1lPVwibWluXCJcbiAgICAgICAgICAgICAgW3RleHRdPVwiJ1RoZSBtaW5pbXVtIGxhdGl0dWRlIHZhbHVlIGlzIC05MMKwLicgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgPjwvYzh5LW1lc3NhZ2U+XG4gICAgICAgICAgICA8Yzh5LW1lc3NhZ2VcbiAgICAgICAgICAgICAgbmFtZT1cIm1heFwiXG4gICAgICAgICAgICAgIFt0ZXh0XT1cIidUaGUgbWF4aW11bSBsYXRpdHVkZSB2YWx1ZSBpcyA5MMKwLicgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgPjwvYzh5LW1lc3NhZ2U+XG4gICAgICAgICAgPC9jOHktbWVzc2FnZXM+XG4gICAgICAgIDwvYzh5LWZvcm0tZ3JvdXA+XG4gICAgICAgIDxjOHktZm9ybS1ncm91cD5cbiAgICAgICAgICA8bGFiZWxcbiAgICAgICAgICAgIGZvcj1cImxhdFwiXG4gICAgICAgICAgICB0cmFuc2xhdGVcbiAgICAgICAgICA+XG4gICAgICAgICAgICBMb25naXR1ZGUgKMKwKVxuICAgICAgICAgIDwvbGFiZWw+XG5cbiAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sXCJcbiAgICAgICAgICAgIFt0aXRsZV09XCInTG9uZ2l0dWRlICjCsCknIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgIGlkPVwibG5nXCJcbiAgICAgICAgICAgIG5hbWU9XCJsbmdcIlxuICAgICAgICAgICAgdHlwZT1cIm51bWJlclwiXG4gICAgICAgICAgICByZXF1aXJlZFxuICAgICAgICAgICAgbWluPVwiLTE4MFwiXG4gICAgICAgICAgICBtYXg9XCIxODBcIlxuICAgICAgICAgICAgKGJsdXIpPVwidXBkYXRlTWFya2VyUG9zaXRpb24oKVwiXG4gICAgICAgICAgICBbKG5nTW9kZWwpXT1cInBvc2l0aW9uLmM4eV9Qb3NpdGlvbi5sbmdcIlxuICAgICAgICAgIC8+XG4gICAgICAgICAgPGM4eS1tZXNzYWdlcz5cbiAgICAgICAgICAgIDxjOHktbWVzc2FnZVxuICAgICAgICAgICAgICBuYW1lPVwibWluXCJcbiAgICAgICAgICAgICAgW3RleHRdPVwiJ1RoZSBtaW5pbXVtIGxvbmdpdHVkZSB2YWx1ZSBpcyAtMTgwwrAuJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICA+PC9jOHktbWVzc2FnZT5cbiAgICAgICAgICAgIDxjOHktbWVzc2FnZVxuICAgICAgICAgICAgICBuYW1lPVwibWF4XCJcbiAgICAgICAgICAgICAgW3RleHRdPVwiJ1RoZSBtYXhpbXVtIGxvbmdpdHVkZSB2YWx1ZSBpcyAxODDCsC4nIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgID48L2M4eS1tZXNzYWdlPlxuICAgICAgICAgIDwvYzh5LW1lc3NhZ2VzPlxuICAgICAgICA8L2M4eS1mb3JtLWdyb3VwPlxuICAgICAgICA8Yzh5LWZvcm0tZ3JvdXA+XG4gICAgICAgICAgPGxhYmVsXG4gICAgICAgICAgICBmb3I9XCJhbHRcIlxuICAgICAgICAgICAgdHJhbnNsYXRlXG4gICAgICAgICAgPlxuICAgICAgICAgICAgQWx0aXR1ZGUgKG0pXG4gICAgICAgICAgPC9sYWJlbD5cblxuICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIlxuICAgICAgICAgICAgW3RpdGxlXT1cIidBbHRpdHVkZSAobSknIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgIGlkPVwiYWx0XCJcbiAgICAgICAgICAgIG5hbWU9XCJhbHRcIlxuICAgICAgICAgICAgdHlwZT1cIm51bWJlclwiXG4gICAgICAgICAgICBbKG5nTW9kZWwpXT1cInBvc2l0aW9uLmM4eV9Qb3NpdGlvbi5hbHRcIlxuICAgICAgICAgIC8+XG4gICAgICAgIDwvYzh5LWZvcm0tZ3JvdXA+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGZvcm1cbiAgICAgICAgY2xhc3M9XCJjYXJkLWJsb2NrIGJnLWxldmVsLTFcIlxuICAgICAgICAjYWRkcmVzc1NlYXJjaD1cIm5nRm9ybVwiXG4gICAgICAgIG5vdmFsaWRhdGVcbiAgICAgICAgKHN1Ym1pdCk9XCJzZWFyY2hBZGRyZXNzKGFkZHJlc3NTZWFyY2hUZXJtKVwiXG4gICAgICAgICpuZ0lmPVwiaXNFZGl0ICYmICFoaWRlQWRkcmVzc1NlYXJjaEZlYXR1cmVcIlxuICAgICAgPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cFwiPlxuICAgICAgICAgIDxsYWJlbFxuICAgICAgICAgICAgZm9yPVwic2VhcmNoQWRkcmVzc1wiXG4gICAgICAgICAgICB0cmFuc2xhdGVcbiAgICAgICAgICA+XG4gICAgICAgICAgICBGaW5kIGxhdC9sb25nIGJ5IGFkZHJlc3NcbiAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnB1dC1ncm91cCBpbnB1dC1ncm91cC1zZWFyY2hcIj5cbiAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICBjbGFzcz1cImZvcm0tY29udHJvbFwiXG4gICAgICAgICAgICAgIGlkPVwic2VhcmNoQWRkcmVzc1wiXG4gICAgICAgICAgICAgIG5hbWU9XCJhZGRyZXNzU2VhcmNoVGVybVwiXG4gICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cIidlLmcuIFNwZWRpdGlvbnN0cmHDn2UgMTMsIETDvHNzZWxkb3JmYExPQ0FMSVpFYCcgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cImFkZHJlc3NTZWFyY2hUZXJtXCJcbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImlucHV0LWdyb3VwLWJ0blwiPlxuICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJidG4gYnRuLWRvdFwiXG4gICAgICAgICAgICAgICAgW3RpdGxlXT1cIidTZWFyY2gnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICB0eXBlPVwic3VibWl0XCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxpXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImRsdC1jOHktaWNvbi1zZWFyY2hcIlxuICAgICAgICAgICAgICAgICAgYzh5LWljb249XCJzZWFyY2hcIlxuICAgICAgICAgICAgICAgID48L2k+XG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZm9ybT5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwiY2FyZC1mb290ZXIgc2VwYXJhdG9yXCI+XG4gICAgICA8YnV0dG9uXG4gICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1kZWZhdWx0XCJcbiAgICAgICAgW3RpdGxlXT1cIidFZGl0IGxvY2F0aW9uJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAqbmdJZj1cImNhbkVkaXQgJiYgIWlzRWRpdFwiXG4gICAgICAgIChjbGljayk9XCJlZGl0KClcIlxuICAgICAgICB0cmFuc2xhdGVcbiAgICAgID5cbiAgICAgICAgRWRpdCBsb2NhdGlvblxuICAgICAgPC9idXR0b24+XG4gICAgICA8YnV0dG9uXG4gICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1kZWZhdWx0XCJcbiAgICAgICAgW3RpdGxlXT1cIidDYW5jZWwnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgIChjbGljayk9XCJjYW5jZWwoKVwiXG4gICAgICAgICpuZ0lmPVwiaXNFZGl0XCJcbiAgICAgICAgdHJhbnNsYXRlXG4gICAgICA+XG4gICAgICAgIENhbmNlbFxuICAgICAgPC9idXR0b24+XG4gICAgICA8YnV0dG9uXG4gICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5XCJcbiAgICAgICAgW3RpdGxlXT1cIidTYXZlJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgIHR5cGU9XCJzdWJtaXRcIlxuICAgICAgICAqbmdJZj1cImlzRWRpdFwiXG4gICAgICAgIHRyYW5zbGF0ZVxuICAgICAgICBbZGlzYWJsZWRdPVwiIXBvc2l0aW9uRm9ybS52YWxpZFwiXG4gICAgICA+XG4gICAgICAgIFNhdmVcbiAgICAgIDwvYnV0dG9uPlxuICAgIDwvZGl2PlxuICA8L2Zvcm0+XG48L2Rpdj5cbiJdfQ==
@@ -124,9 +124,9 @@ class LocationComponent {
124
124
  this.canEdit = true;
125
125
  this.config = { realtime: false, follow: true, zoomLevel: 12 };
126
126
  this.addressSearchTerm = '';
127
- this.hideMapquestBasedFeature = false;
127
+ this.hideAddressSearchFeature = false;
128
128
  this.destroy$ = new Subject();
129
- this.mapQuestUrl = 'https://www.mapquestapi.com/geocoding/v1/address?key=ioPe5dmW6eDgABdJZ4mFIIL51F3tiwXW&format=json&location={searchTerm}';
129
+ this.mapNominatimUrl = 'https://nominatim.openstreetmap.org/search?format=json&q={searchTerm}';
130
130
  }
131
131
  ngOnInit() {
132
132
  this.activatedRoute.url.pipe(takeUntil(this.destroy$)).subscribe(() => {
@@ -137,10 +137,10 @@ class LocationComponent {
137
137
  const { contextData } = this.contextRouteService.getContextData(this.activatedRoute);
138
138
  this.position = contextData;
139
139
  this.canEdit = await this.permissions.canEdit([Permissions.ROLE_INVENTORY_ADMIN, Permissions.ROLE_INVENTORY_CREATE], contextData);
140
- const hasCustomSetting = !isUndefined(this.optionsService.mapQuestUrl);
141
- this.hideMapquestBasedFeature = hasCustomSetting && !this.optionsService.mapQuestUrl;
140
+ const hasCustomSetting = !isUndefined(this.optionsService.mapNominatimUrl);
141
+ this.hideAddressSearchFeature = hasCustomSetting && !this.optionsService.mapNominatimUrl;
142
142
  if (hasCustomSetting) {
143
- this.mapQuestUrl = this.optionsService.mapQuestUrl;
143
+ this.mapNominatimUrl = this.optionsService.mapNominatimUrl;
144
144
  }
145
145
  this.map.refresh();
146
146
  }
@@ -187,16 +187,23 @@ class LocationComponent {
187
187
  this.position = position;
188
188
  }
189
189
  async searchAddress(searchTerm) {
190
- const fetchResponse = await fetch(this.mapQuestUrl.replace('{searchTerm}', searchTerm));
190
+ const fetchResponse = await fetch(this.mapNominatimUrl.replace('{searchTerm}', searchTerm));
191
191
  if (fetchResponse.status !== 200) {
192
192
  this.alertService.danger(gettext('Failed to search for address.'));
193
193
  return;
194
194
  }
195
195
  const data = await fetchResponse.json();
196
- const { latLng } = data.results[0].locations[0];
197
- this.position.c8y_Position.lat = latLng.lat;
198
- this.position.c8y_Position.lng = latLng.lng;
196
+ const latLng = data[0];
197
+ if (!latLng) {
198
+ this.alertService.warning(gettext('Address could not be found.'));
199
+ return;
200
+ }
201
+ this.position.c8y_Position.lat = Number(latLng.lat);
202
+ this.position.c8y_Position.lng = Number(latLng.lon);
199
203
  this.updateMarkerPosition();
204
+ if (latLng.licence) {
205
+ this.map.map.attributionControl.addAttribution(latLng.licence);
206
+ }
200
207
  }
201
208
  updateMarkerPosition() {
202
209
  this.map.refreshMarkers();
@@ -222,11 +229,11 @@ class LocationComponent {
222
229
  }
223
230
  }
224
231
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: LocationComponent, deps: [{ token: i1$1.ContextRouteService }, { token: i3.ActivatedRoute }, { token: i1.InventoryService }, { token: i1$1.Permissions }, { token: i1$1.OptionsService }, { token: i1$1.AlertService }], target: i0.ɵɵFactoryTarget.Component }); }
225
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: LocationComponent, selector: "c8y-location", viewQueries: [{ propertyName: "map", first: true, predicate: MapComponent, descendants: true }], ngImport: i0, template: "<c8y-action-bar-item placement=\"right\">\n <button\n class=\"btn btn-link c8y-realtime\"\n title=\"{{ 'Toggle realtime' | translate }}\"\n type=\"button\"\n (click)=\"toggleRealtime()\"\n >\n <span\n class=\"c8y-pulse\"\n [ngClass]=\"{ active: config.realtime, inactive: !config.realtime }\"\n ></span>\n <span translate>Realtime</span>\n </button>\n</c8y-action-bar-item>\n<c8y-action-bar-item placement=\"right\">\n <button\n class=\"btn btn-clean\"\n title=\"{{ 'Center`verb`' | translate }}\"\n (click)=\"centerMap()\"\n >\n <i [c8yIcon]=\"'target1'\"></i>\n <span translate>Center`verb`</span>\n </button>\n</c8y-action-bar-item>\n\n<div class=\"card card--grid content-fullpage d-grid grid__col--8-4--md\">\n <div\n class=\"bg-white p-relative\"\n style=\"min-height: 30vh\"\n >\n <c8y-map\n [assets]=\"[position]\"\n [config]=\"config\"\n (onRealtimeUpdate)=\"positionChanged($event)\"\n ></c8y-map>\n </div>\n\n <form\n class=\"d-flex d-col bg-inherit content-fullpage bg-gray-white\"\n #positionForm=\"ngForm\"\n (ngSubmit)=\"save()\"\n >\n <div class=\"card-header large-padding separator sticky-top\">\n <span\n class=\"card-title\"\n translate\n >\n Device location\n </span>\n </div>\n <div class=\"inner-scroll\">\n <div\n class=\"m-16\"\n *ngIf=\"!isEdit\"\n >\n <div class=\"p-b-40\">\n <div\n class=\"text-bold\"\n translate\n >\n Latitude (\u00B0)\n </div>\n {{ position.c8y_Position.lat }}\n </div>\n <div class=\"p-b-40\">\n <div\n class=\"text-bold\"\n translate\n >\n Longitude (\u00B0)\n </div>\n {{ position.c8y_Position.lng }}\n </div>\n <div class=\"p-b-40\">\n <div\n class=\"text-bold\"\n translate\n >\n Altitude (m)\n </div>\n {{ position.c8y_Position.alt }}\n </div>\n </div>\n <div\n class=\"m-16\"\n *ngIf=\"isEdit\"\n >\n <c8y-form-group>\n <label\n for=\"lat\"\n translate\n >\n Latitude (\u00B0)\n </label>\n\n <input\n class=\"form-control\"\n [title]=\"'Latitude (\u00B0)' | translate\"\n id=\"lat\"\n name=\"lat\"\n type=\"number\"\n required\n min=\"-90\"\n max=\"90\"\n (blur)=\"updateMarkerPosition()\"\n [(ngModel)]=\"position.c8y_Position.lat\"\n />\n <c8y-messages>\n <c8y-message\n name=\"min\"\n [text]=\"'The minimum latitude value is -90\u00B0.' | translate\"\n ></c8y-message>\n <c8y-message\n name=\"max\"\n [text]=\"'The maximum latitude value is 90\u00B0.' | translate\"\n ></c8y-message>\n </c8y-messages>\n </c8y-form-group>\n <c8y-form-group>\n <label\n for=\"lat\"\n translate\n >\n Longitude (\u00B0)\n </label>\n\n <input\n class=\"form-control\"\n [title]=\"'Longitude (\u00B0)' | translate\"\n id=\"lng\"\n name=\"lng\"\n type=\"number\"\n required\n min=\"-180\"\n max=\"180\"\n (blur)=\"updateMarkerPosition()\"\n [(ngModel)]=\"position.c8y_Position.lng\"\n />\n <c8y-messages>\n <c8y-message\n name=\"min\"\n [text]=\"'The minimum longitude value is -180\u00B0.' | translate\"\n ></c8y-message>\n <c8y-message\n name=\"max\"\n [text]=\"'The maximum longitude value is 180\u00B0.' | translate\"\n ></c8y-message>\n </c8y-messages>\n </c8y-form-group>\n <c8y-form-group>\n <label\n for=\"alt\"\n translate\n >\n Altitude (m)\n </label>\n\n <input\n class=\"form-control\"\n [title]=\"'Altitude (m)' | translate\"\n id=\"alt\"\n name=\"alt\"\n type=\"number\"\n [(ngModel)]=\"position.c8y_Position.alt\"\n />\n </c8y-form-group>\n </div>\n\n <form\n class=\"card-block bg-level-1\"\n #addressSearch=\"ngForm\"\n novalidate\n (submit)=\"searchAddress(addressSearchTerm)\"\n *ngIf=\"isEdit && !hideMapquestBasedFeature\"\n >\n <div class=\"form-group\">\n <label\n for=\"searchAddress\"\n translate\n >\n Find lat/long by address\n </label>\n <div class=\"input-group input-group-search\">\n <input\n class=\"form-control\"\n id=\"searchAddress\"\n name=\"addressSearchTerm\"\n type=\"text\"\n [placeholder]=\"'e.g. Speditionstra\u00DFe 13, D\u00FCsseldorf`LOCALIZE`' | translate\"\n [(ngModel)]=\"addressSearchTerm\"\n />\n <span class=\"input-group-btn\">\n <button\n class=\"btn btn-dot\"\n [title]=\"'Search' | translate\"\n type=\"submit\"\n >\n <i\n class=\"dlt-c8y-icon-search\"\n c8y-icon=\"search\"\n ></i>\n </button>\n </span>\n </div>\n </div>\n </form>\n </div>\n <div class=\"card-footer separator\">\n <button\n class=\"btn btn-default\"\n [title]=\"'Edit location' | translate\"\n type=\"button\"\n *ngIf=\"canEdit && !isEdit\"\n (click)=\"edit()\"\n translate\n >\n Edit location\n </button>\n <button\n class=\"btn btn-default\"\n [title]=\"'Cancel' | translate\"\n type=\"button\"\n (click)=\"cancel()\"\n *ngIf=\"isEdit\"\n translate\n >\n Cancel\n </button>\n <button\n class=\"btn btn-primary\"\n [title]=\"'Save' | translate\"\n type=\"submit\"\n *ngIf=\"isEdit\"\n translate\n [disabled]=\"!positionForm.valid\"\n >\n Save\n </button>\n </div>\n </form>\n</div>\n", dependencies: [{ kind: "component", type: i4$1.MapComponent, selector: "c8y-map", inputs: ["config", "assets"], outputs: ["onMove", "onMoveEnd", "onZoomStart", "onZoomEnd", "onRealtimeUpdate", "onInit"] }, { kind: "component", type: i1$1.ActionBarItemComponent, selector: "c8y-action-bar-item", inputs: ["placement", "priority", "itemClass", "injector", "groupId", "inGroupPriority"] }, { kind: "directive", type: i1$1.IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "directive", type: i1$1.C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "directive", type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1$1.MinValidationDirective, selector: "[min]", inputs: ["min"] }, { kind: "directive", type: i1$1.MaxValidationDirective, selector: "[max]", inputs: ["max"] }, { kind: "directive", type: i6.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i6.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: i6.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i6.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i6.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i6.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i6.MinValidator, selector: "input[type=number][min][formControlName],input[type=number][min][formControl],input[type=number][min][ngModel]", inputs: ["min"] }, { kind: "directive", type: i6.MaxValidator, selector: "input[type=number][max][formControlName],input[type=number][max][formControl],input[type=number][max][ngModel]", inputs: ["max"] }, { kind: "directive", type: i6.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i6.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: i1$1.FormGroupComponent, selector: "c8y-form-group", inputs: ["hasError", "hasWarning", "hasSuccess", "novalidation", "status"] }, { kind: "directive", type: i1$1.MessageDirective, selector: "c8y-message", inputs: ["name", "text"] }, { kind: "component", type: i1$1.MessagesComponent, selector: "c8y-messages", inputs: ["show", "defaults"] }, { kind: "directive", type: i1$1.RequiredInputPlaceholderDirective, selector: "input[required], input[formControlName]" }, { kind: "pipe", type: i1$1.C8yTranslatePipe, name: "translate" }] }); }
232
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: LocationComponent, selector: "c8y-location", viewQueries: [{ propertyName: "map", first: true, predicate: MapComponent, descendants: true }], ngImport: i0, template: "<c8y-action-bar-item placement=\"right\">\n <button\n class=\"btn btn-link c8y-realtime\"\n title=\"{{ 'Toggle realtime' | translate }}\"\n type=\"button\"\n (click)=\"toggleRealtime()\"\n >\n <span\n class=\"c8y-pulse\"\n [ngClass]=\"{ active: config.realtime, inactive: !config.realtime }\"\n ></span>\n <span translate>Realtime</span>\n </button>\n</c8y-action-bar-item>\n<c8y-action-bar-item placement=\"right\">\n <button\n class=\"btn btn-clean\"\n title=\"{{ 'Center`verb`' | translate }}\"\n (click)=\"centerMap()\"\n >\n <i [c8yIcon]=\"'target1'\"></i>\n <span translate>Center`verb`</span>\n </button>\n</c8y-action-bar-item>\n\n<div class=\"card card--grid content-fullpage d-grid grid__col--8-4--md\">\n <div\n class=\"bg-white p-relative\"\n style=\"min-height: 30vh\"\n >\n <c8y-map\n [assets]=\"[position]\"\n [config]=\"config\"\n (onRealtimeUpdate)=\"positionChanged($event)\"\n ></c8y-map>\n </div>\n\n <form\n class=\"d-flex d-col bg-inherit content-fullpage bg-gray-white\"\n #positionForm=\"ngForm\"\n (ngSubmit)=\"save()\"\n >\n <div class=\"card-header large-padding separator sticky-top\">\n <span\n class=\"card-title\"\n translate\n >\n Device location\n </span>\n </div>\n <div class=\"inner-scroll\">\n <div\n class=\"m-16\"\n *ngIf=\"!isEdit\"\n >\n <div class=\"p-b-40\">\n <div\n class=\"text-bold\"\n translate\n >\n Latitude (\u00B0)\n </div>\n {{ position.c8y_Position.lat }}\n </div>\n <div class=\"p-b-40\">\n <div\n class=\"text-bold\"\n translate\n >\n Longitude (\u00B0)\n </div>\n {{ position.c8y_Position.lng }}\n </div>\n <div class=\"p-b-40\">\n <div\n class=\"text-bold\"\n translate\n >\n Altitude (m)\n </div>\n {{ position.c8y_Position.alt }}\n </div>\n </div>\n <div\n class=\"m-16\"\n *ngIf=\"isEdit\"\n >\n <c8y-form-group>\n <label\n for=\"lat\"\n translate\n >\n Latitude (\u00B0)\n </label>\n\n <input\n class=\"form-control\"\n [title]=\"'Latitude (\u00B0)' | translate\"\n id=\"lat\"\n name=\"lat\"\n type=\"number\"\n required\n min=\"-90\"\n max=\"90\"\n (blur)=\"updateMarkerPosition()\"\n [(ngModel)]=\"position.c8y_Position.lat\"\n />\n <c8y-messages>\n <c8y-message\n name=\"min\"\n [text]=\"'The minimum latitude value is -90\u00B0.' | translate\"\n ></c8y-message>\n <c8y-message\n name=\"max\"\n [text]=\"'The maximum latitude value is 90\u00B0.' | translate\"\n ></c8y-message>\n </c8y-messages>\n </c8y-form-group>\n <c8y-form-group>\n <label\n for=\"lat\"\n translate\n >\n Longitude (\u00B0)\n </label>\n\n <input\n class=\"form-control\"\n [title]=\"'Longitude (\u00B0)' | translate\"\n id=\"lng\"\n name=\"lng\"\n type=\"number\"\n required\n min=\"-180\"\n max=\"180\"\n (blur)=\"updateMarkerPosition()\"\n [(ngModel)]=\"position.c8y_Position.lng\"\n />\n <c8y-messages>\n <c8y-message\n name=\"min\"\n [text]=\"'The minimum longitude value is -180\u00B0.' | translate\"\n ></c8y-message>\n <c8y-message\n name=\"max\"\n [text]=\"'The maximum longitude value is 180\u00B0.' | translate\"\n ></c8y-message>\n </c8y-messages>\n </c8y-form-group>\n <c8y-form-group>\n <label\n for=\"alt\"\n translate\n >\n Altitude (m)\n </label>\n\n <input\n class=\"form-control\"\n [title]=\"'Altitude (m)' | translate\"\n id=\"alt\"\n name=\"alt\"\n type=\"number\"\n [(ngModel)]=\"position.c8y_Position.alt\"\n />\n </c8y-form-group>\n </div>\n\n <form\n class=\"card-block bg-level-1\"\n #addressSearch=\"ngForm\"\n novalidate\n (submit)=\"searchAddress(addressSearchTerm)\"\n *ngIf=\"isEdit && !hideAddressSearchFeature\"\n >\n <div class=\"form-group\">\n <label\n for=\"searchAddress\"\n translate\n >\n Find lat/long by address\n </label>\n <div class=\"input-group input-group-search\">\n <input\n class=\"form-control\"\n id=\"searchAddress\"\n name=\"addressSearchTerm\"\n type=\"text\"\n [placeholder]=\"'e.g. Speditionstra\u00DFe 13, D\u00FCsseldorf`LOCALIZE`' | translate\"\n [(ngModel)]=\"addressSearchTerm\"\n />\n <span class=\"input-group-btn\">\n <button\n class=\"btn btn-dot\"\n [title]=\"'Search' | translate\"\n type=\"submit\"\n >\n <i\n class=\"dlt-c8y-icon-search\"\n c8y-icon=\"search\"\n ></i>\n </button>\n </span>\n </div>\n </div>\n </form>\n </div>\n <div class=\"card-footer separator\">\n <button\n class=\"btn btn-default\"\n [title]=\"'Edit location' | translate\"\n type=\"button\"\n *ngIf=\"canEdit && !isEdit\"\n (click)=\"edit()\"\n translate\n >\n Edit location\n </button>\n <button\n class=\"btn btn-default\"\n [title]=\"'Cancel' | translate\"\n type=\"button\"\n (click)=\"cancel()\"\n *ngIf=\"isEdit\"\n translate\n >\n Cancel\n </button>\n <button\n class=\"btn btn-primary\"\n [title]=\"'Save' | translate\"\n type=\"submit\"\n *ngIf=\"isEdit\"\n translate\n [disabled]=\"!positionForm.valid\"\n >\n Save\n </button>\n </div>\n </form>\n</div>\n", dependencies: [{ kind: "component", type: i4$1.MapComponent, selector: "c8y-map", inputs: ["config", "assets"], outputs: ["onMove", "onMoveEnd", "onZoomStart", "onZoomEnd", "onRealtimeUpdate", "onInit"] }, { kind: "component", type: i1$1.ActionBarItemComponent, selector: "c8y-action-bar-item", inputs: ["placement", "priority", "itemClass", "injector", "groupId", "inGroupPriority"] }, { kind: "directive", type: i1$1.IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "directive", type: i1$1.C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "directive", type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1$1.MinValidationDirective, selector: "[min]", inputs: ["min"] }, { kind: "directive", type: i1$1.MaxValidationDirective, selector: "[max]", inputs: ["max"] }, { kind: "directive", type: i6.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i6.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: i6.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i6.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i6.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i6.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i6.MinValidator, selector: "input[type=number][min][formControlName],input[type=number][min][formControl],input[type=number][min][ngModel]", inputs: ["min"] }, { kind: "directive", type: i6.MaxValidator, selector: "input[type=number][max][formControlName],input[type=number][max][formControl],input[type=number][max][ngModel]", inputs: ["max"] }, { kind: "directive", type: i6.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i6.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: i1$1.FormGroupComponent, selector: "c8y-form-group", inputs: ["hasError", "hasWarning", "hasSuccess", "novalidation", "status"] }, { kind: "directive", type: i1$1.MessageDirective, selector: "c8y-message", inputs: ["name", "text"] }, { kind: "component", type: i1$1.MessagesComponent, selector: "c8y-messages", inputs: ["show", "defaults"] }, { kind: "directive", type: i1$1.RequiredInputPlaceholderDirective, selector: "input[required], input[formControlName]" }, { kind: "pipe", type: i1$1.C8yTranslatePipe, name: "translate" }] }); }
226
233
  }
227
234
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: LocationComponent, decorators: [{
228
235
  type: Component,
229
- args: [{ selector: 'c8y-location', template: "<c8y-action-bar-item placement=\"right\">\n <button\n class=\"btn btn-link c8y-realtime\"\n title=\"{{ 'Toggle realtime' | translate }}\"\n type=\"button\"\n (click)=\"toggleRealtime()\"\n >\n <span\n class=\"c8y-pulse\"\n [ngClass]=\"{ active: config.realtime, inactive: !config.realtime }\"\n ></span>\n <span translate>Realtime</span>\n </button>\n</c8y-action-bar-item>\n<c8y-action-bar-item placement=\"right\">\n <button\n class=\"btn btn-clean\"\n title=\"{{ 'Center`verb`' | translate }}\"\n (click)=\"centerMap()\"\n >\n <i [c8yIcon]=\"'target1'\"></i>\n <span translate>Center`verb`</span>\n </button>\n</c8y-action-bar-item>\n\n<div class=\"card card--grid content-fullpage d-grid grid__col--8-4--md\">\n <div\n class=\"bg-white p-relative\"\n style=\"min-height: 30vh\"\n >\n <c8y-map\n [assets]=\"[position]\"\n [config]=\"config\"\n (onRealtimeUpdate)=\"positionChanged($event)\"\n ></c8y-map>\n </div>\n\n <form\n class=\"d-flex d-col bg-inherit content-fullpage bg-gray-white\"\n #positionForm=\"ngForm\"\n (ngSubmit)=\"save()\"\n >\n <div class=\"card-header large-padding separator sticky-top\">\n <span\n class=\"card-title\"\n translate\n >\n Device location\n </span>\n </div>\n <div class=\"inner-scroll\">\n <div\n class=\"m-16\"\n *ngIf=\"!isEdit\"\n >\n <div class=\"p-b-40\">\n <div\n class=\"text-bold\"\n translate\n >\n Latitude (\u00B0)\n </div>\n {{ position.c8y_Position.lat }}\n </div>\n <div class=\"p-b-40\">\n <div\n class=\"text-bold\"\n translate\n >\n Longitude (\u00B0)\n </div>\n {{ position.c8y_Position.lng }}\n </div>\n <div class=\"p-b-40\">\n <div\n class=\"text-bold\"\n translate\n >\n Altitude (m)\n </div>\n {{ position.c8y_Position.alt }}\n </div>\n </div>\n <div\n class=\"m-16\"\n *ngIf=\"isEdit\"\n >\n <c8y-form-group>\n <label\n for=\"lat\"\n translate\n >\n Latitude (\u00B0)\n </label>\n\n <input\n class=\"form-control\"\n [title]=\"'Latitude (\u00B0)' | translate\"\n id=\"lat\"\n name=\"lat\"\n type=\"number\"\n required\n min=\"-90\"\n max=\"90\"\n (blur)=\"updateMarkerPosition()\"\n [(ngModel)]=\"position.c8y_Position.lat\"\n />\n <c8y-messages>\n <c8y-message\n name=\"min\"\n [text]=\"'The minimum latitude value is -90\u00B0.' | translate\"\n ></c8y-message>\n <c8y-message\n name=\"max\"\n [text]=\"'The maximum latitude value is 90\u00B0.' | translate\"\n ></c8y-message>\n </c8y-messages>\n </c8y-form-group>\n <c8y-form-group>\n <label\n for=\"lat\"\n translate\n >\n Longitude (\u00B0)\n </label>\n\n <input\n class=\"form-control\"\n [title]=\"'Longitude (\u00B0)' | translate\"\n id=\"lng\"\n name=\"lng\"\n type=\"number\"\n required\n min=\"-180\"\n max=\"180\"\n (blur)=\"updateMarkerPosition()\"\n [(ngModel)]=\"position.c8y_Position.lng\"\n />\n <c8y-messages>\n <c8y-message\n name=\"min\"\n [text]=\"'The minimum longitude value is -180\u00B0.' | translate\"\n ></c8y-message>\n <c8y-message\n name=\"max\"\n [text]=\"'The maximum longitude value is 180\u00B0.' | translate\"\n ></c8y-message>\n </c8y-messages>\n </c8y-form-group>\n <c8y-form-group>\n <label\n for=\"alt\"\n translate\n >\n Altitude (m)\n </label>\n\n <input\n class=\"form-control\"\n [title]=\"'Altitude (m)' | translate\"\n id=\"alt\"\n name=\"alt\"\n type=\"number\"\n [(ngModel)]=\"position.c8y_Position.alt\"\n />\n </c8y-form-group>\n </div>\n\n <form\n class=\"card-block bg-level-1\"\n #addressSearch=\"ngForm\"\n novalidate\n (submit)=\"searchAddress(addressSearchTerm)\"\n *ngIf=\"isEdit && !hideMapquestBasedFeature\"\n >\n <div class=\"form-group\">\n <label\n for=\"searchAddress\"\n translate\n >\n Find lat/long by address\n </label>\n <div class=\"input-group input-group-search\">\n <input\n class=\"form-control\"\n id=\"searchAddress\"\n name=\"addressSearchTerm\"\n type=\"text\"\n [placeholder]=\"'e.g. Speditionstra\u00DFe 13, D\u00FCsseldorf`LOCALIZE`' | translate\"\n [(ngModel)]=\"addressSearchTerm\"\n />\n <span class=\"input-group-btn\">\n <button\n class=\"btn btn-dot\"\n [title]=\"'Search' | translate\"\n type=\"submit\"\n >\n <i\n class=\"dlt-c8y-icon-search\"\n c8y-icon=\"search\"\n ></i>\n </button>\n </span>\n </div>\n </div>\n </form>\n </div>\n <div class=\"card-footer separator\">\n <button\n class=\"btn btn-default\"\n [title]=\"'Edit location' | translate\"\n type=\"button\"\n *ngIf=\"canEdit && !isEdit\"\n (click)=\"edit()\"\n translate\n >\n Edit location\n </button>\n <button\n class=\"btn btn-default\"\n [title]=\"'Cancel' | translate\"\n type=\"button\"\n (click)=\"cancel()\"\n *ngIf=\"isEdit\"\n translate\n >\n Cancel\n </button>\n <button\n class=\"btn btn-primary\"\n [title]=\"'Save' | translate\"\n type=\"submit\"\n *ngIf=\"isEdit\"\n translate\n [disabled]=\"!positionForm.valid\"\n >\n Save\n </button>\n </div>\n </form>\n</div>\n" }]
236
+ args: [{ selector: 'c8y-location', template: "<c8y-action-bar-item placement=\"right\">\n <button\n class=\"btn btn-link c8y-realtime\"\n title=\"{{ 'Toggle realtime' | translate }}\"\n type=\"button\"\n (click)=\"toggleRealtime()\"\n >\n <span\n class=\"c8y-pulse\"\n [ngClass]=\"{ active: config.realtime, inactive: !config.realtime }\"\n ></span>\n <span translate>Realtime</span>\n </button>\n</c8y-action-bar-item>\n<c8y-action-bar-item placement=\"right\">\n <button\n class=\"btn btn-clean\"\n title=\"{{ 'Center`verb`' | translate }}\"\n (click)=\"centerMap()\"\n >\n <i [c8yIcon]=\"'target1'\"></i>\n <span translate>Center`verb`</span>\n </button>\n</c8y-action-bar-item>\n\n<div class=\"card card--grid content-fullpage d-grid grid__col--8-4--md\">\n <div\n class=\"bg-white p-relative\"\n style=\"min-height: 30vh\"\n >\n <c8y-map\n [assets]=\"[position]\"\n [config]=\"config\"\n (onRealtimeUpdate)=\"positionChanged($event)\"\n ></c8y-map>\n </div>\n\n <form\n class=\"d-flex d-col bg-inherit content-fullpage bg-gray-white\"\n #positionForm=\"ngForm\"\n (ngSubmit)=\"save()\"\n >\n <div class=\"card-header large-padding separator sticky-top\">\n <span\n class=\"card-title\"\n translate\n >\n Device location\n </span>\n </div>\n <div class=\"inner-scroll\">\n <div\n class=\"m-16\"\n *ngIf=\"!isEdit\"\n >\n <div class=\"p-b-40\">\n <div\n class=\"text-bold\"\n translate\n >\n Latitude (\u00B0)\n </div>\n {{ position.c8y_Position.lat }}\n </div>\n <div class=\"p-b-40\">\n <div\n class=\"text-bold\"\n translate\n >\n Longitude (\u00B0)\n </div>\n {{ position.c8y_Position.lng }}\n </div>\n <div class=\"p-b-40\">\n <div\n class=\"text-bold\"\n translate\n >\n Altitude (m)\n </div>\n {{ position.c8y_Position.alt }}\n </div>\n </div>\n <div\n class=\"m-16\"\n *ngIf=\"isEdit\"\n >\n <c8y-form-group>\n <label\n for=\"lat\"\n translate\n >\n Latitude (\u00B0)\n </label>\n\n <input\n class=\"form-control\"\n [title]=\"'Latitude (\u00B0)' | translate\"\n id=\"lat\"\n name=\"lat\"\n type=\"number\"\n required\n min=\"-90\"\n max=\"90\"\n (blur)=\"updateMarkerPosition()\"\n [(ngModel)]=\"position.c8y_Position.lat\"\n />\n <c8y-messages>\n <c8y-message\n name=\"min\"\n [text]=\"'The minimum latitude value is -90\u00B0.' | translate\"\n ></c8y-message>\n <c8y-message\n name=\"max\"\n [text]=\"'The maximum latitude value is 90\u00B0.' | translate\"\n ></c8y-message>\n </c8y-messages>\n </c8y-form-group>\n <c8y-form-group>\n <label\n for=\"lat\"\n translate\n >\n Longitude (\u00B0)\n </label>\n\n <input\n class=\"form-control\"\n [title]=\"'Longitude (\u00B0)' | translate\"\n id=\"lng\"\n name=\"lng\"\n type=\"number\"\n required\n min=\"-180\"\n max=\"180\"\n (blur)=\"updateMarkerPosition()\"\n [(ngModel)]=\"position.c8y_Position.lng\"\n />\n <c8y-messages>\n <c8y-message\n name=\"min\"\n [text]=\"'The minimum longitude value is -180\u00B0.' | translate\"\n ></c8y-message>\n <c8y-message\n name=\"max\"\n [text]=\"'The maximum longitude value is 180\u00B0.' | translate\"\n ></c8y-message>\n </c8y-messages>\n </c8y-form-group>\n <c8y-form-group>\n <label\n for=\"alt\"\n translate\n >\n Altitude (m)\n </label>\n\n <input\n class=\"form-control\"\n [title]=\"'Altitude (m)' | translate\"\n id=\"alt\"\n name=\"alt\"\n type=\"number\"\n [(ngModel)]=\"position.c8y_Position.alt\"\n />\n </c8y-form-group>\n </div>\n\n <form\n class=\"card-block bg-level-1\"\n #addressSearch=\"ngForm\"\n novalidate\n (submit)=\"searchAddress(addressSearchTerm)\"\n *ngIf=\"isEdit && !hideAddressSearchFeature\"\n >\n <div class=\"form-group\">\n <label\n for=\"searchAddress\"\n translate\n >\n Find lat/long by address\n </label>\n <div class=\"input-group input-group-search\">\n <input\n class=\"form-control\"\n id=\"searchAddress\"\n name=\"addressSearchTerm\"\n type=\"text\"\n [placeholder]=\"'e.g. Speditionstra\u00DFe 13, D\u00FCsseldorf`LOCALIZE`' | translate\"\n [(ngModel)]=\"addressSearchTerm\"\n />\n <span class=\"input-group-btn\">\n <button\n class=\"btn btn-dot\"\n [title]=\"'Search' | translate\"\n type=\"submit\"\n >\n <i\n class=\"dlt-c8y-icon-search\"\n c8y-icon=\"search\"\n ></i>\n </button>\n </span>\n </div>\n </div>\n </form>\n </div>\n <div class=\"card-footer separator\">\n <button\n class=\"btn btn-default\"\n [title]=\"'Edit location' | translate\"\n type=\"button\"\n *ngIf=\"canEdit && !isEdit\"\n (click)=\"edit()\"\n translate\n >\n Edit location\n </button>\n <button\n class=\"btn btn-default\"\n [title]=\"'Cancel' | translate\"\n type=\"button\"\n (click)=\"cancel()\"\n *ngIf=\"isEdit\"\n translate\n >\n Cancel\n </button>\n <button\n class=\"btn btn-primary\"\n [title]=\"'Save' | translate\"\n type=\"submit\"\n *ngIf=\"isEdit\"\n translate\n [disabled]=\"!positionForm.valid\"\n >\n Save\n </button>\n </div>\n </form>\n</div>\n" }]
230
237
  }], ctorParameters: function () { return [{ type: i1$1.ContextRouteService }, { type: i3.ActivatedRoute }, { type: i1.InventoryService }, { type: i1$1.Permissions }, { type: i1$1.OptionsService }, { type: i1$1.AlertService }]; }, propDecorators: { map: [{
231
238
  type: ViewChild,
232
239
  args: [MapComponent]
@@ -1 +1 @@
1
- {"version":3,"file":"c8y-ngx-components-location.mjs","sources":["../../location/add-location.component.ts","../../location/add-location.component.html","../../location/add-location.factory.ts","../../location/location-tab.factory.ts","../../location/location.component.ts","../../location/location.component.html","../../location/location.module.ts","../../location/c8y-ngx-components-location.ts"],"sourcesContent":["import { Component, Inject, OnInit, TemplateRef, ViewChild, ViewContainerRef } from '@angular/core';\nimport { IManagedObject, InventoryService } from '@c8y/client';\nimport { AlertService, ContextRouteService } from '@c8y/ngx-components';\nimport type { MapDefaultConfig } from '@c8y/devkit/options';\nimport { Router } from '@angular/router';\nimport { MAP_DEFAULT_CONFIG } from '@c8y/ngx-components/map';\nimport { Observable } from 'rxjs';\nimport { first } from 'rxjs/operators';\n\n@Component({\n selector: 'c8y-add-location',\n templateUrl: './add-location.component.html'\n})\nexport class AddLocationComponent implements OnInit {\n @ViewChild('templateCopy', { read: TemplateRef, static: true }) templateCopy;\n\n constructor(\n private inventoryService: InventoryService,\n private contextRouteService: ContextRouteService,\n @Inject(MAP_DEFAULT_CONFIG)\n private defaultConfig$: Observable<MapDefaultConfig>,\n private router: Router,\n private alertService: AlertService,\n private vcRef: ViewContainerRef\n ) {}\n\n ngOnInit() {\n this.vcRef.createEmbeddedView(this.templateCopy);\n }\n\n onClick(): void {\n this.defaultConfig$.pipe(first()).subscribe(async config => {\n const context = this.contextRouteService.activatedContextData;\n context.contextData.c8y_Position = {\n lat: config.center[0],\n lng: config.center[1]\n };\n try {\n await this.inventoryService.update(context.contextData as IManagedObject);\n } catch (ex) {\n this.alertService.addServerFailure(ex);\n }\n\n const route = this.contextRouteService.getContextRoute(context);\n this.contextRouteService.refreshContext();\n this.router.navigateByUrl(route + '/location');\n });\n }\n}\n","<ng-template #templateCopy>\n <button\n class=\"btn btn-link\"\n [title]=\"'Add location' | translate\"\n (click)=\"onClick()\"\n >\n <i c8yIcon=\"location-arrow\"></i>\n <span translate>Add location</span>\n </button>\n</ng-template>\n","import { Injectable } from '@angular/core';\nimport { ActivatedRoute } from '@angular/router';\nimport {\n ActionBarFactory,\n ActionBarItem,\n ContextRouteService,\n ViewContext\n} from '@c8y/ngx-components';\nimport { AddLocationComponent } from './add-location.component';\nimport { isUndefined } from 'lodash-es';\n\n@Injectable()\nexport class AddLocationFactory implements ActionBarFactory {\n private action: ActionBarItem = {\n component: AddLocationComponent,\n placement: 'more'\n };\n\n constructor(private contextRouteService: ContextRouteService) {}\n\n get(activatedRoute?: ActivatedRoute): ActionBarItem {\n const routeData = this.contextRouteService.getContextData(activatedRoute);\n if (!routeData) {\n return;\n }\n if (\n routeData.context === ViewContext.Device &&\n isUndefined(routeData.contextData.c8y_Position)\n ) {\n return this.action;\n }\n }\n}\n","import { Injectable } from '@angular/core';\nimport { ActivatedRoute } from '@angular/router';\nimport {\n ContextRouteService,\n Tab,\n ViewContext,\n ExtensionFactory,\n gettext\n} from '@c8y/ngx-components';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class LocationTabFactory implements ExtensionFactory<Tab> {\n constructor(private contextRouteService: ContextRouteService) {}\n\n get(activatedRoute: ActivatedRoute): Tab[] {\n const contextData = this.contextRouteService.getContextData(activatedRoute);\n const isDeviceOrGroupWithPosition =\n (contextData?.context === ViewContext.Device || contextData?.context === ViewContext.Group) &&\n contextData?.contextData.c8y_Position;\n if (isDeviceOrGroupWithPosition) {\n return [\n {\n label: gettext('Location'),\n icon: 'location-arrow',\n path: `${this.contextRouteService.getContextRoute(contextData)}/location`\n }\n ];\n }\n return [];\n }\n}\n","import { Component, OnDestroy, OnInit, ViewChild } from '@angular/core';\nimport { MapComponent, MapConfig, PositionManagedObject } from '@c8y/ngx-components/map';\nimport {\n AlertService,\n ContextRouteService,\n OptionsService,\n Permissions,\n gettext\n} from '@c8y/ngx-components';\nimport { ActivatedRoute } from '@angular/router';\nimport { InventoryService } from '@c8y/client';\nimport { isUndefined, cloneDeep } from 'lodash-es';\nimport { takeUntil } from 'rxjs/operators';\nimport { Subject } from 'rxjs';\n\n@Component({\n selector: 'c8y-location',\n templateUrl: './location.component.html'\n})\nexport class LocationComponent implements OnInit, OnDestroy {\n position: PositionManagedObject;\n originalPosition: PositionManagedObject;\n isEdit = false;\n canEdit = true;\n config: MapConfig = { realtime: false, follow: true, zoomLevel: 12 };\n addressSearchTerm = '';\n hideMapquestBasedFeature = false;\n\n private destroy$ = new Subject<void>();\n private mapQuestUrl =\n 'https://www.mapquestapi.com/geocoding/v1/address?key=ioPe5dmW6eDgABdJZ4mFIIL51F3tiwXW&format=json&location={searchTerm}';\n\n @ViewChild(MapComponent)\n map: MapComponent;\n\n constructor(\n private contextRouteService: ContextRouteService,\n private activatedRoute: ActivatedRoute,\n private inventoryService: InventoryService,\n private permissions: Permissions,\n private optionsService: OptionsService,\n private alertService: AlertService\n ) {}\n\n ngOnInit(): void {\n this.activatedRoute.url.pipe(takeUntil(this.destroy$)).subscribe(() => {\n this.updateMap();\n });\n }\n\n async updateMap() {\n const { contextData } = this.contextRouteService.getContextData(this.activatedRoute);\n this.position = contextData as PositionManagedObject;\n this.canEdit = await this.permissions.canEdit(\n [Permissions.ROLE_INVENTORY_ADMIN, Permissions.ROLE_INVENTORY_CREATE],\n contextData\n );\n\n const hasCustomSetting = !isUndefined(this.optionsService.mapQuestUrl);\n this.hideMapquestBasedFeature = hasCustomSetting && !this.optionsService.mapQuestUrl;\n\n if (hasCustomSetting) {\n this.mapQuestUrl = this.optionsService.mapQuestUrl;\n }\n\n this.map.refresh();\n }\n\n toggleRealtime() {\n this.config = { ...this.config, realtime: !this.config.realtime };\n }\n\n disableRealtime() {\n this.config = { ...this.config, realtime: false };\n }\n\n centerMap() {\n this.config = {\n ...this.config,\n center: [this.position.c8y_Position.lat, this.position.c8y_Position.lng]\n };\n }\n\n edit() {\n this.originalPosition = cloneDeep(this.position);\n this.enableMarkerDragging();\n this.disableRealtime();\n this.isEdit = true;\n }\n\n cancel() {\n this.position = this.originalPosition;\n this.isEdit = false;\n this.map.markers[0]?.dragging.disable();\n this.centerMap();\n }\n\n async save() {\n try {\n const { data } = await this.inventoryService.update({\n id: this.position.id,\n c8y_Position: this.position.c8y_Position\n });\n this.position = data as PositionManagedObject;\n } catch (ex) {\n this.alertService.addServerFailure(ex);\n }\n this.map.markers[0]?.dragging.disable();\n this.centerMap();\n this.isEdit = false;\n }\n\n positionChanged(position: PositionManagedObject) {\n this.position = position;\n }\n\n async searchAddress(searchTerm: string) {\n const fetchResponse = await fetch(this.mapQuestUrl.replace('{searchTerm}', searchTerm));\n if (fetchResponse.status !== 200) {\n this.alertService.danger(gettext('Failed to search for address.'));\n return;\n }\n const data = await fetchResponse.json();\n const { latLng } = data.results[0].locations[0];\n this.position.c8y_Position.lat = latLng.lat;\n this.position.c8y_Position.lng = latLng.lng;\n this.updateMarkerPosition();\n }\n\n updateMarkerPosition() {\n this.map.refreshMarkers();\n this.enableMarkerDragging();\n this.centerMap();\n }\n\n ngOnDestroy(): void {\n this.destroy$.next();\n }\n\n private enableMarkerDragging() {\n const marker = this.map.markers[0];\n if (marker) {\n marker.dragging.enable();\n marker.on('dragend', () => {\n const latlng = marker.getLatLng();\n this.position.c8y_Position = {\n ...this.position.c8y_Position,\n lat: latlng.lat,\n lng: latlng.lng\n };\n this.centerMap();\n });\n }\n }\n}\n","<c8y-action-bar-item placement=\"right\">\n <button\n class=\"btn btn-link c8y-realtime\"\n title=\"{{ 'Toggle realtime' | translate }}\"\n type=\"button\"\n (click)=\"toggleRealtime()\"\n >\n <span\n class=\"c8y-pulse\"\n [ngClass]=\"{ active: config.realtime, inactive: !config.realtime }\"\n ></span>\n <span translate>Realtime</span>\n </button>\n</c8y-action-bar-item>\n<c8y-action-bar-item placement=\"right\">\n <button\n class=\"btn btn-clean\"\n title=\"{{ 'Center`verb`' | translate }}\"\n (click)=\"centerMap()\"\n >\n <i [c8yIcon]=\"'target1'\"></i>\n <span translate>Center`verb`</span>\n </button>\n</c8y-action-bar-item>\n\n<div class=\"card card--grid content-fullpage d-grid grid__col--8-4--md\">\n <div\n class=\"bg-white p-relative\"\n style=\"min-height: 30vh\"\n >\n <c8y-map\n [assets]=\"[position]\"\n [config]=\"config\"\n (onRealtimeUpdate)=\"positionChanged($event)\"\n ></c8y-map>\n </div>\n\n <form\n class=\"d-flex d-col bg-inherit content-fullpage bg-gray-white\"\n #positionForm=\"ngForm\"\n (ngSubmit)=\"save()\"\n >\n <div class=\"card-header large-padding separator sticky-top\">\n <span\n class=\"card-title\"\n translate\n >\n Device location\n </span>\n </div>\n <div class=\"inner-scroll\">\n <div\n class=\"m-16\"\n *ngIf=\"!isEdit\"\n >\n <div class=\"p-b-40\">\n <div\n class=\"text-bold\"\n translate\n >\n Latitude (°)\n </div>\n {{ position.c8y_Position.lat }}\n </div>\n <div class=\"p-b-40\">\n <div\n class=\"text-bold\"\n translate\n >\n Longitude (°)\n </div>\n {{ position.c8y_Position.lng }}\n </div>\n <div class=\"p-b-40\">\n <div\n class=\"text-bold\"\n translate\n >\n Altitude (m)\n </div>\n {{ position.c8y_Position.alt }}\n </div>\n </div>\n <div\n class=\"m-16\"\n *ngIf=\"isEdit\"\n >\n <c8y-form-group>\n <label\n for=\"lat\"\n translate\n >\n Latitude (°)\n </label>\n\n <input\n class=\"form-control\"\n [title]=\"'Latitude (°)' | translate\"\n id=\"lat\"\n name=\"lat\"\n type=\"number\"\n required\n min=\"-90\"\n max=\"90\"\n (blur)=\"updateMarkerPosition()\"\n [(ngModel)]=\"position.c8y_Position.lat\"\n />\n <c8y-messages>\n <c8y-message\n name=\"min\"\n [text]=\"'The minimum latitude value is -90°.' | translate\"\n ></c8y-message>\n <c8y-message\n name=\"max\"\n [text]=\"'The maximum latitude value is 90°.' | translate\"\n ></c8y-message>\n </c8y-messages>\n </c8y-form-group>\n <c8y-form-group>\n <label\n for=\"lat\"\n translate\n >\n Longitude (°)\n </label>\n\n <input\n class=\"form-control\"\n [title]=\"'Longitude (°)' | translate\"\n id=\"lng\"\n name=\"lng\"\n type=\"number\"\n required\n min=\"-180\"\n max=\"180\"\n (blur)=\"updateMarkerPosition()\"\n [(ngModel)]=\"position.c8y_Position.lng\"\n />\n <c8y-messages>\n <c8y-message\n name=\"min\"\n [text]=\"'The minimum longitude value is -180°.' | translate\"\n ></c8y-message>\n <c8y-message\n name=\"max\"\n [text]=\"'The maximum longitude value is 180°.' | translate\"\n ></c8y-message>\n </c8y-messages>\n </c8y-form-group>\n <c8y-form-group>\n <label\n for=\"alt\"\n translate\n >\n Altitude (m)\n </label>\n\n <input\n class=\"form-control\"\n [title]=\"'Altitude (m)' | translate\"\n id=\"alt\"\n name=\"alt\"\n type=\"number\"\n [(ngModel)]=\"position.c8y_Position.alt\"\n />\n </c8y-form-group>\n </div>\n\n <form\n class=\"card-block bg-level-1\"\n #addressSearch=\"ngForm\"\n novalidate\n (submit)=\"searchAddress(addressSearchTerm)\"\n *ngIf=\"isEdit && !hideMapquestBasedFeature\"\n >\n <div class=\"form-group\">\n <label\n for=\"searchAddress\"\n translate\n >\n Find lat/long by address\n </label>\n <div class=\"input-group input-group-search\">\n <input\n class=\"form-control\"\n id=\"searchAddress\"\n name=\"addressSearchTerm\"\n type=\"text\"\n [placeholder]=\"'e.g. Speditionstraße 13, Düsseldorf`LOCALIZE`' | translate\"\n [(ngModel)]=\"addressSearchTerm\"\n />\n <span class=\"input-group-btn\">\n <button\n class=\"btn btn-dot\"\n [title]=\"'Search' | translate\"\n type=\"submit\"\n >\n <i\n class=\"dlt-c8y-icon-search\"\n c8y-icon=\"search\"\n ></i>\n </button>\n </span>\n </div>\n </div>\n </form>\n </div>\n <div class=\"card-footer separator\">\n <button\n class=\"btn btn-default\"\n [title]=\"'Edit location' | translate\"\n type=\"button\"\n *ngIf=\"canEdit && !isEdit\"\n (click)=\"edit()\"\n translate\n >\n Edit location\n </button>\n <button\n class=\"btn btn-default\"\n [title]=\"'Cancel' | translate\"\n type=\"button\"\n (click)=\"cancel()\"\n *ngIf=\"isEdit\"\n translate\n >\n Cancel\n </button>\n <button\n class=\"btn btn-primary\"\n [title]=\"'Save' | translate\"\n type=\"submit\"\n *ngIf=\"isEdit\"\n translate\n [disabled]=\"!positionForm.valid\"\n >\n Save\n </button>\n </div>\n </form>\n</div>\n","import { ModuleWithProviders, NgModule } from '@angular/core';\nimport { MapModule } from '@c8y/ngx-components/map';\nimport { ViewContext, hookRoute, hookTab, CoreModule, hookActionBar } from '@c8y/ngx-components';\nimport { LocationTabFactory } from './location-tab.factory';\nimport { LocationComponent } from './location.component';\nimport { AddLocationFactory } from './add-location.factory';\nimport { AddLocationComponent } from './add-location.component';\nimport { RouterModule } from '@angular/router';\nimport { LocationConfiguration } from './location.model';\n\n@NgModule({\n declarations: [LocationComponent, AddLocationComponent],\n imports: [MapModule, CoreModule, RouterModule],\n exports: [LocationComponent, AddLocationComponent]\n})\nexport class LocationModule {\n static config(\n config: LocationConfiguration = { addLocation: false }\n ): ModuleWithProviders<LocationModule> {\n return {\n ngModule: LocationModule,\n providers: [\n config.addLocation ? hookActionBar(AddLocationFactory) : undefined,\n hookTab(LocationTabFactory),\n hookRoute({\n path: 'location',\n component: LocationComponent,\n context: ViewContext.Device,\n tabs: []\n }),\n hookRoute({\n path: 'location',\n component: LocationComponent,\n context: ViewContext.Group,\n tabs: []\n })\n ].filter(Boolean)\n };\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i2","i1","i3","i4"],"mappings":"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"}
1
+ {"version":3,"file":"c8y-ngx-components-location.mjs","sources":["../../location/add-location.component.ts","../../location/add-location.component.html","../../location/add-location.factory.ts","../../location/location-tab.factory.ts","../../location/location.component.ts","../../location/location.component.html","../../location/location.module.ts","../../location/c8y-ngx-components-location.ts"],"sourcesContent":["import { Component, Inject, OnInit, TemplateRef, ViewChild, ViewContainerRef } from '@angular/core';\nimport { IManagedObject, InventoryService } from '@c8y/client';\nimport { AlertService, ContextRouteService } from '@c8y/ngx-components';\nimport type { MapDefaultConfig } from '@c8y/devkit/options';\nimport { Router } from '@angular/router';\nimport { MAP_DEFAULT_CONFIG } from '@c8y/ngx-components/map';\nimport { Observable } from 'rxjs';\nimport { first } from 'rxjs/operators';\n\n@Component({\n selector: 'c8y-add-location',\n templateUrl: './add-location.component.html'\n})\nexport class AddLocationComponent implements OnInit {\n @ViewChild('templateCopy', { read: TemplateRef, static: true }) templateCopy;\n\n constructor(\n private inventoryService: InventoryService,\n private contextRouteService: ContextRouteService,\n @Inject(MAP_DEFAULT_CONFIG)\n private defaultConfig$: Observable<MapDefaultConfig>,\n private router: Router,\n private alertService: AlertService,\n private vcRef: ViewContainerRef\n ) {}\n\n ngOnInit() {\n this.vcRef.createEmbeddedView(this.templateCopy);\n }\n\n onClick(): void {\n this.defaultConfig$.pipe(first()).subscribe(async config => {\n const context = this.contextRouteService.activatedContextData;\n context.contextData.c8y_Position = {\n lat: config.center[0],\n lng: config.center[1]\n };\n try {\n await this.inventoryService.update(context.contextData as IManagedObject);\n } catch (ex) {\n this.alertService.addServerFailure(ex);\n }\n\n const route = this.contextRouteService.getContextRoute(context);\n this.contextRouteService.refreshContext();\n this.router.navigateByUrl(route + '/location');\n });\n }\n}\n","<ng-template #templateCopy>\n <button\n class=\"btn btn-link\"\n [title]=\"'Add location' | translate\"\n (click)=\"onClick()\"\n >\n <i c8yIcon=\"location-arrow\"></i>\n <span translate>Add location</span>\n </button>\n</ng-template>\n","import { Injectable } from '@angular/core';\nimport { ActivatedRoute } from '@angular/router';\nimport {\n ActionBarFactory,\n ActionBarItem,\n ContextRouteService,\n ViewContext\n} from '@c8y/ngx-components';\nimport { AddLocationComponent } from './add-location.component';\nimport { isUndefined } from 'lodash-es';\n\n@Injectable()\nexport class AddLocationFactory implements ActionBarFactory {\n private action: ActionBarItem = {\n component: AddLocationComponent,\n placement: 'more'\n };\n\n constructor(private contextRouteService: ContextRouteService) {}\n\n get(activatedRoute?: ActivatedRoute): ActionBarItem {\n const routeData = this.contextRouteService.getContextData(activatedRoute);\n if (!routeData) {\n return;\n }\n if (\n routeData.context === ViewContext.Device &&\n isUndefined(routeData.contextData.c8y_Position)\n ) {\n return this.action;\n }\n }\n}\n","import { Injectable } from '@angular/core';\nimport { ActivatedRoute } from '@angular/router';\nimport {\n ContextRouteService,\n Tab,\n ViewContext,\n ExtensionFactory,\n gettext\n} from '@c8y/ngx-components';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class LocationTabFactory implements ExtensionFactory<Tab> {\n constructor(private contextRouteService: ContextRouteService) {}\n\n get(activatedRoute: ActivatedRoute): Tab[] {\n const contextData = this.contextRouteService.getContextData(activatedRoute);\n const isDeviceOrGroupWithPosition =\n (contextData?.context === ViewContext.Device || contextData?.context === ViewContext.Group) &&\n contextData?.contextData.c8y_Position;\n if (isDeviceOrGroupWithPosition) {\n return [\n {\n label: gettext('Location'),\n icon: 'location-arrow',\n path: `${this.contextRouteService.getContextRoute(contextData)}/location`\n }\n ];\n }\n return [];\n }\n}\n","import { Component, OnDestroy, OnInit, ViewChild } from '@angular/core';\nimport { MapComponent, MapConfig, PositionManagedObject } from '@c8y/ngx-components/map';\nimport {\n AlertService,\n ContextRouteService,\n OptionsService,\n Permissions,\n gettext\n} from '@c8y/ngx-components';\nimport { ActivatedRoute } from '@angular/router';\nimport { InventoryService } from '@c8y/client';\nimport { isUndefined, cloneDeep } from 'lodash-es';\nimport { takeUntil } from 'rxjs/operators';\nimport { Subject } from 'rxjs';\n\n@Component({\n selector: 'c8y-location',\n templateUrl: './location.component.html'\n})\nexport class LocationComponent implements OnInit, OnDestroy {\n position: PositionManagedObject;\n originalPosition: PositionManagedObject;\n isEdit = false;\n canEdit = true;\n config: MapConfig = { realtime: false, follow: true, zoomLevel: 12 };\n addressSearchTerm = '';\n hideAddressSearchFeature = false;\n\n private destroy$ = new Subject<void>();\n private mapNominatimUrl = 'https://nominatim.openstreetmap.org/search?format=json&q={searchTerm}';\n\n @ViewChild(MapComponent)\n map: MapComponent;\n\n constructor(\n private contextRouteService: ContextRouteService,\n private activatedRoute: ActivatedRoute,\n private inventoryService: InventoryService,\n private permissions: Permissions,\n private optionsService: OptionsService,\n private alertService: AlertService\n ) {}\n\n ngOnInit(): void {\n this.activatedRoute.url.pipe(takeUntil(this.destroy$)).subscribe(() => {\n this.updateMap();\n });\n }\n\n async updateMap() {\n const { contextData } = this.contextRouteService.getContextData(this.activatedRoute);\n this.position = contextData as PositionManagedObject;\n this.canEdit = await this.permissions.canEdit(\n [Permissions.ROLE_INVENTORY_ADMIN, Permissions.ROLE_INVENTORY_CREATE],\n contextData\n );\n\n const hasCustomSetting = !isUndefined(this.optionsService.mapNominatimUrl);\n this.hideAddressSearchFeature = hasCustomSetting && !this.optionsService.mapNominatimUrl;\n\n if (hasCustomSetting) {\n this.mapNominatimUrl = this.optionsService.mapNominatimUrl;\n }\n\n this.map.refresh();\n }\n\n toggleRealtime() {\n this.config = { ...this.config, realtime: !this.config.realtime };\n }\n\n disableRealtime() {\n this.config = { ...this.config, realtime: false };\n }\n\n centerMap() {\n this.config = {\n ...this.config,\n center: [this.position.c8y_Position.lat, this.position.c8y_Position.lng]\n };\n }\n\n edit() {\n this.originalPosition = cloneDeep(this.position);\n this.enableMarkerDragging();\n this.disableRealtime();\n this.isEdit = true;\n }\n\n cancel() {\n this.position = this.originalPosition;\n this.isEdit = false;\n this.map.markers[0]?.dragging.disable();\n this.centerMap();\n }\n\n async save() {\n try {\n const { data } = await this.inventoryService.update({\n id: this.position.id,\n c8y_Position: this.position.c8y_Position\n });\n this.position = data as PositionManagedObject;\n } catch (ex) {\n this.alertService.addServerFailure(ex);\n }\n this.map.markers[0]?.dragging.disable();\n this.centerMap();\n this.isEdit = false;\n }\n\n positionChanged(position: PositionManagedObject) {\n this.position = position;\n }\n\n async searchAddress(searchTerm: string) {\n const fetchResponse = await fetch(this.mapNominatimUrl.replace('{searchTerm}', searchTerm));\n if (fetchResponse.status !== 200) {\n this.alertService.danger(gettext('Failed to search for address.'));\n return;\n }\n const data: Array<{ lat: string | number; lon: string | number; licence?: string }> =\n await fetchResponse.json();\n const latLng = data[0];\n if (!latLng) {\n this.alertService.warning(gettext('Address could not be found.'));\n return;\n }\n this.position.c8y_Position.lat = Number(latLng.lat);\n this.position.c8y_Position.lng = Number(latLng.lon);\n this.updateMarkerPosition();\n if (latLng.licence) {\n this.map.map.attributionControl.addAttribution(latLng.licence);\n }\n }\n\n updateMarkerPosition() {\n this.map.refreshMarkers();\n this.enableMarkerDragging();\n this.centerMap();\n }\n\n ngOnDestroy(): void {\n this.destroy$.next();\n }\n\n private enableMarkerDragging() {\n const marker = this.map.markers[0];\n if (marker) {\n marker.dragging.enable();\n marker.on('dragend', () => {\n const latlng = marker.getLatLng();\n this.position.c8y_Position = {\n ...this.position.c8y_Position,\n lat: latlng.lat,\n lng: latlng.lng\n };\n this.centerMap();\n });\n }\n }\n}\n","<c8y-action-bar-item placement=\"right\">\n <button\n class=\"btn btn-link c8y-realtime\"\n title=\"{{ 'Toggle realtime' | translate }}\"\n type=\"button\"\n (click)=\"toggleRealtime()\"\n >\n <span\n class=\"c8y-pulse\"\n [ngClass]=\"{ active: config.realtime, inactive: !config.realtime }\"\n ></span>\n <span translate>Realtime</span>\n </button>\n</c8y-action-bar-item>\n<c8y-action-bar-item placement=\"right\">\n <button\n class=\"btn btn-clean\"\n title=\"{{ 'Center`verb`' | translate }}\"\n (click)=\"centerMap()\"\n >\n <i [c8yIcon]=\"'target1'\"></i>\n <span translate>Center`verb`</span>\n </button>\n</c8y-action-bar-item>\n\n<div class=\"card card--grid content-fullpage d-grid grid__col--8-4--md\">\n <div\n class=\"bg-white p-relative\"\n style=\"min-height: 30vh\"\n >\n <c8y-map\n [assets]=\"[position]\"\n [config]=\"config\"\n (onRealtimeUpdate)=\"positionChanged($event)\"\n ></c8y-map>\n </div>\n\n <form\n class=\"d-flex d-col bg-inherit content-fullpage bg-gray-white\"\n #positionForm=\"ngForm\"\n (ngSubmit)=\"save()\"\n >\n <div class=\"card-header large-padding separator sticky-top\">\n <span\n class=\"card-title\"\n translate\n >\n Device location\n </span>\n </div>\n <div class=\"inner-scroll\">\n <div\n class=\"m-16\"\n *ngIf=\"!isEdit\"\n >\n <div class=\"p-b-40\">\n <div\n class=\"text-bold\"\n translate\n >\n Latitude (°)\n </div>\n {{ position.c8y_Position.lat }}\n </div>\n <div class=\"p-b-40\">\n <div\n class=\"text-bold\"\n translate\n >\n Longitude (°)\n </div>\n {{ position.c8y_Position.lng }}\n </div>\n <div class=\"p-b-40\">\n <div\n class=\"text-bold\"\n translate\n >\n Altitude (m)\n </div>\n {{ position.c8y_Position.alt }}\n </div>\n </div>\n <div\n class=\"m-16\"\n *ngIf=\"isEdit\"\n >\n <c8y-form-group>\n <label\n for=\"lat\"\n translate\n >\n Latitude (°)\n </label>\n\n <input\n class=\"form-control\"\n [title]=\"'Latitude (°)' | translate\"\n id=\"lat\"\n name=\"lat\"\n type=\"number\"\n required\n min=\"-90\"\n max=\"90\"\n (blur)=\"updateMarkerPosition()\"\n [(ngModel)]=\"position.c8y_Position.lat\"\n />\n <c8y-messages>\n <c8y-message\n name=\"min\"\n [text]=\"'The minimum latitude value is -90°.' | translate\"\n ></c8y-message>\n <c8y-message\n name=\"max\"\n [text]=\"'The maximum latitude value is 90°.' | translate\"\n ></c8y-message>\n </c8y-messages>\n </c8y-form-group>\n <c8y-form-group>\n <label\n for=\"lat\"\n translate\n >\n Longitude (°)\n </label>\n\n <input\n class=\"form-control\"\n [title]=\"'Longitude (°)' | translate\"\n id=\"lng\"\n name=\"lng\"\n type=\"number\"\n required\n min=\"-180\"\n max=\"180\"\n (blur)=\"updateMarkerPosition()\"\n [(ngModel)]=\"position.c8y_Position.lng\"\n />\n <c8y-messages>\n <c8y-message\n name=\"min\"\n [text]=\"'The minimum longitude value is -180°.' | translate\"\n ></c8y-message>\n <c8y-message\n name=\"max\"\n [text]=\"'The maximum longitude value is 180°.' | translate\"\n ></c8y-message>\n </c8y-messages>\n </c8y-form-group>\n <c8y-form-group>\n <label\n for=\"alt\"\n translate\n >\n Altitude (m)\n </label>\n\n <input\n class=\"form-control\"\n [title]=\"'Altitude (m)' | translate\"\n id=\"alt\"\n name=\"alt\"\n type=\"number\"\n [(ngModel)]=\"position.c8y_Position.alt\"\n />\n </c8y-form-group>\n </div>\n\n <form\n class=\"card-block bg-level-1\"\n #addressSearch=\"ngForm\"\n novalidate\n (submit)=\"searchAddress(addressSearchTerm)\"\n *ngIf=\"isEdit && !hideAddressSearchFeature\"\n >\n <div class=\"form-group\">\n <label\n for=\"searchAddress\"\n translate\n >\n Find lat/long by address\n </label>\n <div class=\"input-group input-group-search\">\n <input\n class=\"form-control\"\n id=\"searchAddress\"\n name=\"addressSearchTerm\"\n type=\"text\"\n [placeholder]=\"'e.g. Speditionstraße 13, Düsseldorf`LOCALIZE`' | translate\"\n [(ngModel)]=\"addressSearchTerm\"\n />\n <span class=\"input-group-btn\">\n <button\n class=\"btn btn-dot\"\n [title]=\"'Search' | translate\"\n type=\"submit\"\n >\n <i\n class=\"dlt-c8y-icon-search\"\n c8y-icon=\"search\"\n ></i>\n </button>\n </span>\n </div>\n </div>\n </form>\n </div>\n <div class=\"card-footer separator\">\n <button\n class=\"btn btn-default\"\n [title]=\"'Edit location' | translate\"\n type=\"button\"\n *ngIf=\"canEdit && !isEdit\"\n (click)=\"edit()\"\n translate\n >\n Edit location\n </button>\n <button\n class=\"btn btn-default\"\n [title]=\"'Cancel' | translate\"\n type=\"button\"\n (click)=\"cancel()\"\n *ngIf=\"isEdit\"\n translate\n >\n Cancel\n </button>\n <button\n class=\"btn btn-primary\"\n [title]=\"'Save' | translate\"\n type=\"submit\"\n *ngIf=\"isEdit\"\n translate\n [disabled]=\"!positionForm.valid\"\n >\n Save\n </button>\n </div>\n </form>\n</div>\n","import { ModuleWithProviders, NgModule } from '@angular/core';\nimport { MapModule } from '@c8y/ngx-components/map';\nimport { ViewContext, hookRoute, hookTab, CoreModule, hookActionBar } from '@c8y/ngx-components';\nimport { LocationTabFactory } from './location-tab.factory';\nimport { LocationComponent } from './location.component';\nimport { AddLocationFactory } from './add-location.factory';\nimport { AddLocationComponent } from './add-location.component';\nimport { RouterModule } from '@angular/router';\nimport { LocationConfiguration } from './location.model';\n\n@NgModule({\n declarations: [LocationComponent, AddLocationComponent],\n imports: [MapModule, CoreModule, RouterModule],\n exports: [LocationComponent, AddLocationComponent]\n})\nexport class LocationModule {\n static config(\n config: LocationConfiguration = { addLocation: false }\n ): ModuleWithProviders<LocationModule> {\n return {\n ngModule: LocationModule,\n providers: [\n config.addLocation ? hookActionBar(AddLocationFactory) : undefined,\n hookTab(LocationTabFactory),\n hookRoute({\n path: 'location',\n component: LocationComponent,\n context: ViewContext.Device,\n tabs: []\n }),\n hookRoute({\n path: 'location',\n component: LocationComponent,\n context: ViewContext.Group,\n tabs: []\n })\n ].filter(Boolean)\n };\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i2","i1","i3","i4"],"mappings":"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"}