adb-shared 6.2.21 → 6.2.25

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.
@@ -10,10 +10,10 @@ import * as Leaflet from 'leaflet';
10
10
  import Leaflet__default from 'leaflet';
11
11
  import '@geoman-io/leaflet-geoman-free';
12
12
  import { Subscription, combineLatest, map, debounceTime } from 'rxjs';
13
- import * as i3 from '@angular/router';
13
+ import * as i1$2 from '@angular/router';
14
14
  import { RouterModule } from '@angular/router';
15
15
  import { finalize } from 'rxjs/operators';
16
- import * as i3$1 from '@angular/common/http';
16
+ import * as i3 from '@angular/common/http';
17
17
  import * as i5 from 'adb-shared';
18
18
  import { AdbDatePickerModule, AdbPipesModule, AdbFilterSectionModule, AdbPickerModule } from 'adb-shared';
19
19
  import { addYears, startOfYear, endOfYear, startOfDay, endOfDay, parseISO } from 'date-fns';
@@ -101,7 +101,8 @@ class AdbMapUtils {
101
101
  scrollWheelZoom: options.scrollZoom ?? true,
102
102
  zoomControl: options.zoom ?? true,
103
103
  dragging: options.zoom ?? true,
104
- minZoom: -1
104
+ minZoom: -1,
105
+ zoomDelta: 1
105
106
  });
106
107
  map.setView([62, 17], 5);
107
108
  Leaflet.control.scale().addTo(map);
@@ -129,7 +130,7 @@ class PolygonDrawerInput {
129
130
  mapId = "" + Math.floor(Math.random() * Date.now());
130
131
  map;
131
132
  polygonDraw = false;
132
- shapeLayer = null;
133
+ shapeLayer;
133
134
  geoJson;
134
135
  ngAfterViewInit() {
135
136
  this.map = AdbMapUtils.createMap(this.mapId, {
@@ -155,18 +156,25 @@ class PolygonDrawerInput {
155
156
  snapMiddle: false
156
157
  });
157
158
  this.map.on("pm:create", (e) => {
158
- if (e.shape !== "Polygon")
159
+ if (e.shape !== 'Polygon' && e.shape !== 'Circle')
159
160
  return;
160
161
  this.polygonDraw = false;
161
162
  this.map.pm.disableDraw();
162
163
  this.clearShape();
163
- this.shapeLayer = Leaflet__default.geoJSON(e.layer.toGeoJSON(), {
164
- interactive: false
165
- });
166
- this.map.addLayer(this.shapeLayer);
164
+ this.shapeLayer = e.layer;
165
+ if (this.shapeLayer instanceof Leaflet__default.Path) {
166
+ this.shapeLayer.setStyle({ fillOpacity: 0.5 });
167
+ }
168
+ this.shapeLayer.interactive = false;
167
169
  this.map.fitBounds(this.shapeLayer.getBounds());
168
- this.onChange(e.layer.toGeoJSON());
169
- this.map.removeLayer(e.layer);
170
+ const geo = this.shapeLayer.toGeoJSON();
171
+ if (this.shapeLayer instanceof Leaflet__default.Circle) {
172
+ geo.properties = {
173
+ ...geo.properties,
174
+ radius: Math.ceil(this.shapeLayer.getRadius())
175
+ };
176
+ }
177
+ this.onChange(geo);
170
178
  });
171
179
  }
172
180
  renderInitialShape() {
@@ -194,6 +202,13 @@ class PolygonDrawerInput {
194
202
  snappable: false
195
203
  });
196
204
  }
205
+ onDrawCircle() {
206
+ this.polygonDraw = true;
207
+ this.map.pm.enableDraw("Circle", {
208
+ allowSelfIntersection: false,
209
+ snappable: false
210
+ });
211
+ }
197
212
  onUndoStep() {
198
213
  const draw = this.map.pm.Draw?.Polygon;
199
214
  draw?._removeLastVertex();
@@ -225,7 +240,7 @@ class PolygonDrawerInput {
225
240
  useExisting: forwardRef(() => PolygonDrawerInput),
226
241
  multi: true
227
242
  }
228
- ], ngImport: i0, template: "<div class=\"mb-1 d-flex gap-1 flex-wrap align-items-start\">\r\n <button class=\"btn btn-secondary\" type=\"button\" (click)=\"onDrawPolygon()\" title=\"Polygon\">\r\n <span class=\"fas fa-draw-polygon\"></span> {{'OBSERVATION.DRAW'|translate}}\r\n </button>\r\n @if (polygonDraw) {\r\n <button class=\"btn btn-secondary\" type=\"button\" (click)=\"onDeleteShape()\" title=\"Ta bort\">\r\n <span class=\"fas fa-times\"></span>\r\n </button>\r\n <button class=\"btn btn-secondary\" type=\"button\" (click)=\"onUndoStep()\" title=\"\u00C5ngra\">\r\n <span class=\"fas fa-undo\"></span>\r\n </button>\r\n }\r\n</div>\r\n<div [id]=\"mapId\" class=\"border\" style=\"height:20rem\"></div>", dependencies: [{ kind: "pipe", type: i1.TranslatePipe, name: "translate" }] });
243
+ ], ngImport: i0, template: "<div class=\"mb-1 d-flex gap-1 flex-wrap align-items-start\">\r\n <button class=\"btn btn-secondary\" type=\"button\" [disabled]=\"shapeLayer\" (click)=\"onDrawPolygon()\" title=\"Polygon\">\r\n <span class=\"fas fa-draw-polygon\"></span> {{'OBSERVATION.DRAW'|translate}}\r\n </button>\r\n <button class=\"btn btn-secondary\" type=\"button\" [disabled]=\"shapeLayer\" (click)=\"onDrawCircle()\" title=\"Circle\">\r\n <span class=\"fas fa-draw-circle\"></span> {{'OBSERVATION.DRAW_CIRCLE'|translate}}\r\n </button>\r\n @if (shapeLayer) {\r\n <button class=\"btn btn-secondary\" type=\"button\" (click)=\"onDeleteShape()\" title=\"Ta bort\">\r\n <span class=\"fas fa-times\"></span>\r\n </button>\r\n }\r\n @if (polygonDraw) {\r\n <button class=\"btn btn-secondary\" type=\"button\" (click)=\"onUndoStep()\" title=\"\u00C5ngra\">\r\n <span class=\"fas fa-undo\"></span>\r\n </button>\r\n }\r\n</div>\r\n<div [id]=\"mapId\" class=\"border\" style=\"height:20rem\"></div>", dependencies: [{ kind: "pipe", type: i1.TranslatePipe, name: "translate" }] });
229
244
  }
230
245
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: PolygonDrawerInput, decorators: [{
231
246
  type: Component,
@@ -235,7 +250,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImpor
235
250
  useExisting: forwardRef(() => PolygonDrawerInput),
236
251
  multi: true
237
252
  }
238
- ], template: "<div class=\"mb-1 d-flex gap-1 flex-wrap align-items-start\">\r\n <button class=\"btn btn-secondary\" type=\"button\" (click)=\"onDrawPolygon()\" title=\"Polygon\">\r\n <span class=\"fas fa-draw-polygon\"></span> {{'OBSERVATION.DRAW'|translate}}\r\n </button>\r\n @if (polygonDraw) {\r\n <button class=\"btn btn-secondary\" type=\"button\" (click)=\"onDeleteShape()\" title=\"Ta bort\">\r\n <span class=\"fas fa-times\"></span>\r\n </button>\r\n <button class=\"btn btn-secondary\" type=\"button\" (click)=\"onUndoStep()\" title=\"\u00C5ngra\">\r\n <span class=\"fas fa-undo\"></span>\r\n </button>\r\n }\r\n</div>\r\n<div [id]=\"mapId\" class=\"border\" style=\"height:20rem\"></div>" }]
253
+ ], template: "<div class=\"mb-1 d-flex gap-1 flex-wrap align-items-start\">\r\n <button class=\"btn btn-secondary\" type=\"button\" [disabled]=\"shapeLayer\" (click)=\"onDrawPolygon()\" title=\"Polygon\">\r\n <span class=\"fas fa-draw-polygon\"></span> {{'OBSERVATION.DRAW'|translate}}\r\n </button>\r\n <button class=\"btn btn-secondary\" type=\"button\" [disabled]=\"shapeLayer\" (click)=\"onDrawCircle()\" title=\"Circle\">\r\n <span class=\"fas fa-draw-circle\"></span> {{'OBSERVATION.DRAW_CIRCLE'|translate}}\r\n </button>\r\n @if (shapeLayer) {\r\n <button class=\"btn btn-secondary\" type=\"button\" (click)=\"onDeleteShape()\" title=\"Ta bort\">\r\n <span class=\"fas fa-times\"></span>\r\n </button>\r\n }\r\n @if (polygonDraw) {\r\n <button class=\"btn btn-secondary\" type=\"button\" (click)=\"onUndoStep()\" title=\"\u00C5ngra\">\r\n <span class=\"fas fa-undo\"></span>\r\n </button>\r\n }\r\n</div>\r\n<div [id]=\"mapId\" class=\"border\" style=\"height:20rem\"></div>" }]
239
254
  }] });
240
255
 
241
256
  var AdbMapFilterType;
@@ -265,8 +280,10 @@ class AdbMapConfigService {
265
280
  taxaListsApi;
266
281
  filters;
267
282
  observationPage;
283
+ dynamic;
268
284
  constructor(config) {
269
285
  this.log = config.log ?? false;
286
+ this.dynamic = config.dynamic ?? false;
270
287
  this.artfaktaTaxonLists = config.artfaktaTaxonLists ?? 'https://artfakta.se/metadata/listor';
271
288
  this.taxaListsApi = config.api + '/taxalists';
272
289
  this.observationFeatures = config.api + '/observation-features';
@@ -277,7 +294,7 @@ class AdbMapConfigService {
277
294
  showArea: this.hasFilter(AdbMapFilterType.Area, config.filters),
278
295
  showOwnArea: this.hasFilter(AdbMapFilterType.OwnArea, config.filters),
279
296
  showTaxaLists: this.hasFilter(AdbMapFilterType.TaxaLists, config.filters),
280
- showDatasets: this.hasFilter(AdbMapFilterType.Datasources, config.filters),
297
+ showDatasets: this.hasFilter(AdbMapFilterType.Datasources, config.filters)
281
298
  };
282
299
  }
283
300
  hasFilter(f, filters) {
@@ -411,6 +428,9 @@ class AdbObsMapComponent {
411
428
  });
412
429
  this.map.whenReady(() => {
413
430
  this.mapReady.set(true);
431
+ if (this.config.dynamic) {
432
+ this.attachUserListeners();
433
+ }
414
434
  });
415
435
  }
416
436
  // Loads data only after:
@@ -440,7 +460,30 @@ class AdbObsMapComponent {
440
460
  this.tryLoad();
441
461
  }));
442
462
  }
463
+ attachUserListeners() {
464
+ const container = this.map.getContainer();
465
+ const zoomIn = container.querySelector('.leaflet-control-zoom-in');
466
+ const zoomOut = container.querySelector('.leaflet-control-zoom-out');
467
+ zoomIn?.addEventListener('click', () => { this.onUserInputRoute(); });
468
+ zoomOut?.addEventListener('click', () => { this.onUserInputRoute(); });
469
+ this.map.on('dragend', () => {
470
+ this.onUserInputRoute();
471
+ });
472
+ }
473
+ onUserInputRoute() {
474
+ const bounds = this.map.getBounds();
475
+ const bbox = this.getMapBoundsToBbox(bounds).join(',');
476
+ this.router.navigate([], {
477
+ relativeTo: this.activatedRoute,
478
+ queryParams: { bbox },
479
+ queryParamsHandling: 'merge'
480
+ });
481
+ }
443
482
  loadFeature(qParams) {
483
+ if (this.siteLayer) {
484
+ this.map.removeLayer(this.siteLayer);
485
+ this.siteLayer = undefined;
486
+ }
444
487
  this.mapLoading.set(true);
445
488
  this.error = null;
446
489
  const url = this.config.observationFeatures;
@@ -476,37 +519,42 @@ class AdbObsMapComponent {
476
519
  },
477
520
  pointToLayer: (feature, latlng) => {
478
521
  const marker = Leaflet.marker(latlng, {
522
+ interactive: this.config.dynamic,
479
523
  icon: Leaflet.divIcon({
480
524
  className: '',
481
525
  html: '<div class="adb-map-marker"></div>',
482
526
  iconAnchor: [3, 3]
483
527
  })
484
528
  });
485
- // if (feature.properties && feature.properties['Occurrence.OccurrenceId']) {
486
- // marker.on('click', () => {
487
- // window.location.href = this.config.observationPage + '/' + feature.properties['Occurrence.OccurrenceId'];
488
- // });
489
- // }
529
+ if (feature.properties && feature.properties['Occurrence.OccurrenceId']) {
530
+ marker.on('click', () => {
531
+ window.location.href = this.config.observationPage + '/' + feature.properties['Occurrence.OccurrenceId'];
532
+ });
533
+ }
490
534
  return marker;
491
535
  }, onEachFeature: (feature, layer) => {
492
536
  if (feature.geometry.type === "Polygon" ||
493
537
  feature.geometry.type === "MultiPolygon") {
494
- layer.setStyle({ interactive: false });
495
- // if (feature.properties.ObservationsCount > 0) {
496
- // layer.on('click', () => {
497
- // const boundBox = JSON.stringify(this.getMapBoundsToBbox(layer.getBounds()));
498
- // this.router.navigate([], { queryParams: { bbox: boundBox }, queryParamsHandling: 'merge' });
499
- // });
500
- // layer.on('mouseover', () => {
501
- // layer.setStyle({ className: 'svg cursor-pointer' });
502
- // });
503
- // layer.on('mouseout', () => {
504
- // layer.setStyle({ className: 'svg' });
505
- // });
506
- // }
507
- // if (feature.properties.FeatureType) { //area
508
- // layer.setStyle({ interactive: false });
509
- // }
538
+ if (feature.properties.ObservationsCount > 0) {
539
+ if (this.config.dynamic) {
540
+ layer.on('click', () => {
541
+ const boundBox = JSON.stringify(this.getMapBoundsToBbox(layer.getBounds()));
542
+ this.router.navigate([], { queryParams: { bbox: boundBox }, queryParamsHandling: 'merge' });
543
+ });
544
+ layer.on('mouseover', () => {
545
+ layer.setStyle({ className: 'svg cursor-pointer' });
546
+ });
547
+ layer.on('mouseout', () => {
548
+ layer.setStyle({ className: 'svg' });
549
+ });
550
+ }
551
+ }
552
+ if (!this.config.dynamic) {
553
+ layer.setStyle({ interactive: false });
554
+ }
555
+ else if (feature.properties.FeatureType) { //area
556
+ layer.setStyle({ interactive: false });
557
+ }
510
558
  }
511
559
  }
512
560
  });
@@ -536,18 +584,23 @@ class AdbObsMapComponent {
536
584
  return 'map-heat-high';
537
585
  }
538
586
  getMapBoundsToBbox(bounds) {
539
- return [bounds.getNorthWest().lat, bounds.getNorthWest().lng, bounds.getSouthEast().lat, bounds.getSouthEast().lng];
587
+ return [
588
+ bounds.getWest(),
589
+ bounds.getSouth(),
590
+ bounds.getEast(),
591
+ bounds.getNorth()
592
+ ];
540
593
  }
541
594
  ngOnDestroy() {
542
595
  this.subscriptions.unsubscribe();
543
596
  }
544
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: AdbObsMapComponent, deps: [{ token: i3.ActivatedRoute }, { token: AdbMapConfigService }, { token: i3.Router }, { token: i3$1.HttpClient }], target: i0.ɵɵFactoryTarget.Component });
545
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.0", type: AdbObsMapComponent, isStandalone: false, selector: "adb-obs-map", ngImport: i0, template: "<!-- @if(hasBox&&!mapLoading()){\r\n<div class=\"mb-1 d-flex justify-content-between flex-wrap\">\r\n <a [routerLink]=\"[]\" [queryParams]=\"{bbox:null,z:null}\" queryParamsHandling=\"merge\" class=\"d-flex gap-1 align-items-baseline\">\r\n <span class=\"fas fa-chevron-left\"></span>\r\n Tillbaka upp\r\n </a>\r\n</div>\r\n} -->\r\n@if(error){\r\n<div class=\"alert alert-danger\">\r\n {{'ERROR.SERVER_ERROR'|translate}}\r\n</div>\r\n}\r\n<div [class.loading]=\"mapLoading()\">\r\n <div [id]=\"mapId\" class=\"mb-1 map-container\"></div>\r\n</div>\r\n<div class=\"mb-1 d-flex gap-3 justify-content-between flex-wrap\">\r\n @if (!mapLoading()&&count) {\r\n <div class=\"d-flex align-items-center gap-1\">\r\n <div class=\"legend map-heat-low\"></div>\r\n &lt;10\r\n </div>\r\n <div class=\"d-flex align-items-center gap-1\">\r\n <div class=\"legend map-heat-medium\"></div>\r\n 10 - 500\r\n </div>\r\n <div class=\"d-flex align-items-center gap-1\">\r\n <div class=\"legend map-heat-high\"></div>\r\n &gt;500\r\n </div>\r\n <div class=\"ms-auto\">\r\n {{count|adbSpacing}} {{'OBSERVATION.OBSERVATIONS'|translate}}\r\n </div>\r\n }\r\n</div>", dependencies: [{ kind: "pipe", type: i1.TranslatePipe, name: "translate" }, { kind: "pipe", type: i5.NumberSpacingPipe, name: "adbSpacing" }] });
597
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: AdbObsMapComponent, deps: [{ token: i1$2.ActivatedRoute }, { token: AdbMapConfigService }, { token: i1$2.Router }, { token: i3.HttpClient }], target: i0.ɵɵFactoryTarget.Component });
598
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.0", type: AdbObsMapComponent, isStandalone: false, selector: "adb-obs-map", ngImport: i0, template: "@if(hasBox&&!mapLoading()){\r\n<div class=\"mb-1 d-flex justify-content-between flex-wrap\">\r\n <a [routerLink]=\"[]\" [queryParams]=\"{bbox:null,z:null}\" queryParamsHandling=\"merge\" class=\"d-flex gap-1 align-items-baseline\">\r\n <span class=\"fas fa-chevron-left\"></span>\r\n Tillbaka upp\r\n </a>\r\n</div>\r\n}\r\n@if(error){\r\n<div class=\"alert alert-danger\">\r\n {{'ERROR.SERVER_ERROR'|translate}}\r\n</div>\r\n}\r\n<div [class.loading]=\"mapLoading()\">\r\n <div [id]=\"mapId\" class=\"mb-1 map-container\"></div>\r\n</div>\r\n<div class=\"mb-1 d-flex gap-3 justify-content-between flex-wrap\">\r\n @if (!mapLoading()&&count) {\r\n <div class=\"d-flex align-items-center gap-1\">\r\n <div class=\"legend map-heat-low\"></div>\r\n &lt;10\r\n </div>\r\n <div class=\"d-flex align-items-center gap-1\">\r\n <div class=\"legend map-heat-medium\"></div>\r\n 10 - 500\r\n </div>\r\n <div class=\"d-flex align-items-center gap-1\">\r\n <div class=\"legend map-heat-high\"></div>\r\n &gt;500\r\n </div>\r\n <div class=\"ms-auto\">\r\n {{count|adbSpacing}} {{'OBSERVATION.OBSERVATIONS'|translate}}\r\n </div>\r\n }\r\n</div>", dependencies: [{ kind: "directive", type: i1$2.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }, { kind: "pipe", type: i5.NumberSpacingPipe, name: "adbSpacing" }] });
546
599
  }
547
600
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: AdbObsMapComponent, decorators: [{
548
601
  type: Component,
549
- args: [{ selector: 'adb-obs-map', standalone: false, template: "<!-- @if(hasBox&&!mapLoading()){\r\n<div class=\"mb-1 d-flex justify-content-between flex-wrap\">\r\n <a [routerLink]=\"[]\" [queryParams]=\"{bbox:null,z:null}\" queryParamsHandling=\"merge\" class=\"d-flex gap-1 align-items-baseline\">\r\n <span class=\"fas fa-chevron-left\"></span>\r\n Tillbaka upp\r\n </a>\r\n</div>\r\n} -->\r\n@if(error){\r\n<div class=\"alert alert-danger\">\r\n {{'ERROR.SERVER_ERROR'|translate}}\r\n</div>\r\n}\r\n<div [class.loading]=\"mapLoading()\">\r\n <div [id]=\"mapId\" class=\"mb-1 map-container\"></div>\r\n</div>\r\n<div class=\"mb-1 d-flex gap-3 justify-content-between flex-wrap\">\r\n @if (!mapLoading()&&count) {\r\n <div class=\"d-flex align-items-center gap-1\">\r\n <div class=\"legend map-heat-low\"></div>\r\n &lt;10\r\n </div>\r\n <div class=\"d-flex align-items-center gap-1\">\r\n <div class=\"legend map-heat-medium\"></div>\r\n 10 - 500\r\n </div>\r\n <div class=\"d-flex align-items-center gap-1\">\r\n <div class=\"legend map-heat-high\"></div>\r\n &gt;500\r\n </div>\r\n <div class=\"ms-auto\">\r\n {{count|adbSpacing}} {{'OBSERVATION.OBSERVATIONS'|translate}}\r\n </div>\r\n }\r\n</div>" }]
550
- }], ctorParameters: () => [{ type: i3.ActivatedRoute }, { type: AdbMapConfigService }, { type: i3.Router }, { type: i3$1.HttpClient }] });
602
+ args: [{ selector: 'adb-obs-map', standalone: false, template: "@if(hasBox&&!mapLoading()){\r\n<div class=\"mb-1 d-flex justify-content-between flex-wrap\">\r\n <a [routerLink]=\"[]\" [queryParams]=\"{bbox:null,z:null}\" queryParamsHandling=\"merge\" class=\"d-flex gap-1 align-items-baseline\">\r\n <span class=\"fas fa-chevron-left\"></span>\r\n Tillbaka upp\r\n </a>\r\n</div>\r\n}\r\n@if(error){\r\n<div class=\"alert alert-danger\">\r\n {{'ERROR.SERVER_ERROR'|translate}}\r\n</div>\r\n}\r\n<div [class.loading]=\"mapLoading()\">\r\n <div [id]=\"mapId\" class=\"mb-1 map-container\"></div>\r\n</div>\r\n<div class=\"mb-1 d-flex gap-3 justify-content-between flex-wrap\">\r\n @if (!mapLoading()&&count) {\r\n <div class=\"d-flex align-items-center gap-1\">\r\n <div class=\"legend map-heat-low\"></div>\r\n &lt;10\r\n </div>\r\n <div class=\"d-flex align-items-center gap-1\">\r\n <div class=\"legend map-heat-medium\"></div>\r\n 10 - 500\r\n </div>\r\n <div class=\"d-flex align-items-center gap-1\">\r\n <div class=\"legend map-heat-high\"></div>\r\n &gt;500\r\n </div>\r\n <div class=\"ms-auto\">\r\n {{count|adbSpacing}} {{'OBSERVATION.OBSERVATIONS'|translate}}\r\n </div>\r\n }\r\n</div>" }]
603
+ }], ctorParameters: () => [{ type: i1$2.ActivatedRoute }, { type: AdbMapConfigService }, { type: i1$2.Router }, { type: i3.HttpClient }] });
551
604
 
552
605
  const DateTypes = {
553
606
  THIS_YEAR: '1',
@@ -734,13 +787,13 @@ class AdbMapFilters {
734
787
  ngOnDestroy() {
735
788
  this.subscriptions.unsubscribe();
736
789
  }
737
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: AdbMapFilters, deps: [{ token: i0.ChangeDetectorRef }, { token: AdbMapConfigService }, { token: i3$1.HttpClient }, { token: i3.Router }, { token: i3.ActivatedRoute }], target: i0.ɵɵFactoryTarget.Component });
738
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.0", type: AdbMapFilters, isStandalone: false, selector: "adb-map-filters", inputs: { inline: "inline" }, ngImport: i0, template: "@if(form){\r\n<form [formGroup]=\"form\" class=\"form mb-3\" (ngSubmit)=\"onSubmit()\">\r\n <div class=\"mb-3\">\r\n <adb-filter-section titleResource=\"TAXON.TAXA\" [expanded]=\"true\">\r\n @if(filters.showTaxon&&!hasTaxonInUrlParameter){\r\n <div class=\"mb-3\">\r\n <label for=\"species\">{{'TAXON.TAXON'|translate}}</label>\r\n <adb-taxon-picker formControlName=\"taxonId\" id=\"species\"></adb-taxon-picker>\r\n </div>\r\n }\r\n </adb-filter-section>\r\n @if(filters.showTime){\r\n <adb-filter-section [count]=\"periodCount\" titleResource=\"OBSERVATION.PERIOD\">\r\n <div class=\"mb-1\">\r\n <select class=\"form-select\" formControlName=\"period\" id=\"period\">\r\n <option value=\"1\">{{thisYear|date:'yyyy'}}</option>\r\n <option value=\"2\">{{lastYear|date:'yyyy'}}</option>\r\n <option value=\"3\">{{'OBSERVATION.ALL_YEAR'|translate}}</option>\r\n <option value=\"4\">{{'OBSERVATION.LAST_5_YEAR'|translate}}</option>\r\n <option value=\"5\">{{'OBSERVATION.LAST_25_YEAR'|translate}}</option>\r\n <option value=\"6\">{{'OBSERVATION.CUSTOMIZED'|translate}}</option>\r\n </select>\r\n </div>\r\n @if (form.value?.period==='6') {\r\n <div class=\"mb-2\">\r\n <label for=\"startAt\">{{'FROM' |translate}}</label>\r\n <input adbDatepicker type=\"text\" class=\"form-control datepicker\" id=\"startAt\" formControlName=\"startAt\" [settings]=\"dateStartConfig\">\r\n </div>\r\n <div class=\"mb-2\">\r\n <label for=\"endAt\">{{'TO' |translate}}</label>\r\n <input adbDatepicker type=\"text\" class=\"form-control datepicker\" id=\"endAt\" formControlName=\"endAt\" [settings]=\"dateEndConfig\">\r\n </div>\r\n }\r\n </adb-filter-section>\r\n }\r\n @if(filters.showArea){\r\n <adb-filter-section [count]=\"areaCount\" titleResource=\"GEOGRAPHY\" [lazy]=\"true\">\r\n <ng-template>\r\n @if(filters.showOwnArea){\r\n <div role=\"tablist\" aria-label=\"{{'AREA'|translate}}\" class=\"d-flex gap-2 justify-content-end\">\r\n <button class=\"btn btn-link p-0\" [class.text-dark]=\"!hasOwnArea\" (click)=\"hasOwnArea=false\" role=\"tab\" id=\"tab-select\" aria-selected=\"{{!hasOwnArea}}\" aria-controls=\"panel-select\">\r\n {{'CHOOSE'|translate}}\r\n </button>\r\n <button class=\"btn btn-link p-0\" [class.text-dark]=\"hasOwnArea\" (click)=\"hasOwnArea=true\" role=\"tab\" id=\"tab-draw\" aria-selected=\"false\" aria-controls=\"panel-draw\">\r\n {{'OWN_AREA'|translate}}\r\n </button>\r\n </div>\r\n }\r\n <div class=\"mb-2\">\r\n @if(hasOwnArea&&filters.showOwnArea){\r\n <div class=\"pt-1\" role=\"tabpanel\" id=\"area-draw\" aria-labelledby=\"tab-draw\">\r\n <div>\r\n <adb-polygon-drawer formControlName=\"geo\"></adb-polygon-drawer>\r\n </div>\r\n </div>\r\n }@else{\r\n <div role=\"tabpanel\" id=\"area-select\" aria-labelledby=\"tab-select\">\r\n <div formArrayName=\"areas\">\r\n <div class=\"d-flex align-items-end mb-1\">\r\n <label>{{'AREAS'|translate}}</label>\r\n <button class=\"ms-auto text-dark btn btn-sm btn-secondary\" attr.aria-label=\"{{'OBSERVATION.ADD_AREA'|translate}}\" title=\"{{'OBSERVATION.ADD_AREA'|translate}}\" type=\"button\" (click)=\"addArea()\">\r\n <span class=\"fas fa-plus\"></span>\r\n </button>\r\n </div>\r\n @for (ctrl of areasArray.controls; track ctrl; let i = $index; let last = $last) {\r\n <div class=\"d-flex mb-2\">\r\n <adb-area-picker id=\"area-{{i}}\" [formControlName]=\"i\"></adb-area-picker>\r\n @if(areasArray.length>1){\r\n <button class=\"btn btn-secondary ms-1\" attr.aria-label=\"{{'DELETE'|translate}}\" title=\"{{'DELETE'|translate}}\" type=\"button\" (click)=\"removeArea(i)\">\r\n <span class=\"fas fa-trash\"></span>\r\n </button>\r\n }\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n </ng-template>\r\n </adb-filter-section>\r\n }\r\n @if(form.get('taxonId')){\r\n @if(filters.showTaxaLists){\r\n <adb-filter-section [count]=\"taxonListCount\" titleResource=\"LISTS.NATURE_CONSERVATION_LISTS\">\r\n <div class=\"mb-3\">\r\n <app-treeview formControlName=\"list\" [nodes]=\"taxaLists\"></app-treeview>\r\n </div>\r\n {{'LISTS.READ_MORE'|translate}}\r\n <a [href]=\"artfakta\">{{'LISTS.LIST_CONTENT'|translate}}</a>\r\n </adb-filter-section>\r\n }\r\n @if(filters.showDatasets){\r\n <adb-filter-section [count]=\"dataSetCount\" titleResource=\"DATASET.DATASETS\">\r\n @if (form.get('ds')) {\r\n <div formArrayName=\"ds\">\r\n @for (item of dsControls; track item; let i = $index) {\r\n <div [formGroupName]=\"i\" class=\"form-check\">\r\n <input type=\"checkbox\" formControlName=\"selected\" [id]=\"'ds-' + item.value.id\" class=\"form-check-input\">\r\n <label [for]=\"'ds-' + item.value.id\" class=\"form-check-label\">{{ 'PROVIDERS.'+item.value.id |translate }}</label>\r\n </div>\r\n }\r\n </div>\r\n }\r\n </adb-filter-section>\r\n }\r\n }\r\n </div>\r\n <div class=\"d-flex justify-content-end gap-2\">\r\n @if (inline) {\r\n <a class=\"btn btn-secondary\" [routerLink]=\"[]\">\r\n {{'CANCEL'|translate}}\r\n </a>\r\n }\r\n <button type=\"submit\" class=\"btn btn-primary\" [disabled]=\"form.invalid||form.pristine\">{{'FILTER'|translate}}</button>\r\n </div>\r\n</form>\r\n}", dependencies: [{ kind: "directive", type: i4.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i4.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i4.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i4.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i4.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i4.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],[formArray],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i3.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "directive", type: i4.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i4.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i4.FormGroupName, selector: "[formGroupName]", inputs: ["formGroupName"] }, { kind: "directive", type: i4.FormArrayName, selector: "[formArrayName]", inputs: ["formArrayName"] }, { kind: "directive", type: i5.AdbDatePickerDirective, selector: "input[adbDatepicker]", inputs: ["format", "toLeft", "settings"], outputs: ["adbBlur"] }, { kind: "component", type: i5.FilterSectionComponent, selector: "adb-filter-section", inputs: ["titleResource", "helpResource", "count", "expanded", "lazy"] }, { kind: "component", type: i5.AdbAreaPickerComponent, selector: "adb-area-picker", inputs: ["placeholder", "useObject", "prefill"] }, { kind: "component", type: i5.AdbTaxonPickerComponent, selector: "adb-taxon-picker", inputs: ["placeholder", "useObject", "prefill"] }, { kind: "component", type: PolygonDrawerInput, selector: "adb-polygon-drawer" }, { kind: "component", type: TreeviewComponent, selector: "app-treeview", inputs: ["nodes"] }, { kind: "pipe", type: i1$1.DatePipe, name: "date" }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }] });
790
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: AdbMapFilters, deps: [{ token: i0.ChangeDetectorRef }, { token: AdbMapConfigService }, { token: i3.HttpClient }, { token: i1$2.Router }, { token: i1$2.ActivatedRoute }], target: i0.ɵɵFactoryTarget.Component });
791
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.0", type: AdbMapFilters, isStandalone: false, selector: "adb-map-filters", inputs: { inline: "inline" }, ngImport: i0, template: "@if(form){\r\n<form [formGroup]=\"form\" class=\"form mb-3\" (ngSubmit)=\"onSubmit()\">\r\n <div class=\"mb-3\">\r\n <adb-filter-section titleResource=\"TAXON.TAXA\" [expanded]=\"true\">\r\n @if(filters.showTaxon&&!hasTaxonInUrlParameter){\r\n <div class=\"mb-3\">\r\n <label for=\"species\">{{'TAXON.TAXON'|translate}}</label>\r\n <adb-taxon-picker formControlName=\"taxonId\" id=\"species\"></adb-taxon-picker>\r\n </div>\r\n }\r\n </adb-filter-section>\r\n @if(filters.showTime){\r\n <adb-filter-section [count]=\"periodCount\" titleResource=\"OBSERVATION.PERIOD\">\r\n <div class=\"mb-1\">\r\n <select class=\"form-select\" formControlName=\"period\" id=\"period\">\r\n <option value=\"1\">{{thisYear|date:'yyyy'}}</option>\r\n <option value=\"2\">{{lastYear|date:'yyyy'}}</option>\r\n <option value=\"3\">{{'OBSERVATION.ALL_YEAR'|translate}}</option>\r\n <option value=\"4\">{{'OBSERVATION.LAST_5_YEAR'|translate}}</option>\r\n <option value=\"5\">{{'OBSERVATION.LAST_25_YEAR'|translate}}</option>\r\n <option value=\"6\">{{'OBSERVATION.CUSTOMIZED'|translate}}</option>\r\n </select>\r\n </div>\r\n @if (form.value?.period==='6') {\r\n <div class=\"mb-2\">\r\n <label for=\"startAt\">{{'FROM' |translate}}</label>\r\n <input adbDatepicker type=\"text\" class=\"form-control datepicker\" id=\"startAt\" formControlName=\"startAt\" [settings]=\"dateStartConfig\">\r\n </div>\r\n <div class=\"mb-2\">\r\n <label for=\"endAt\">{{'TO' |translate}}</label>\r\n <input adbDatepicker type=\"text\" class=\"form-control datepicker\" id=\"endAt\" formControlName=\"endAt\" [settings]=\"dateEndConfig\">\r\n </div>\r\n }\r\n </adb-filter-section>\r\n }\r\n @if(filters.showArea){\r\n <adb-filter-section [count]=\"areaCount\" titleResource=\"GEOGRAPHY\" [lazy]=\"true\">\r\n <ng-template>\r\n @if(filters.showOwnArea){\r\n <div role=\"tablist\" aria-label=\"{{'AREA'|translate}}\" class=\"d-flex gap-2 justify-content-end\">\r\n <button class=\"btn btn-link p-0\" [class.text-dark]=\"!hasOwnArea\" (click)=\"hasOwnArea=false\" role=\"tab\" id=\"tab-select\" aria-selected=\"{{!hasOwnArea}}\" aria-controls=\"panel-select\">\r\n {{'CHOOSE'|translate}}\r\n </button>\r\n <button class=\"btn btn-link p-0\" [class.text-dark]=\"hasOwnArea\" (click)=\"hasOwnArea=true\" role=\"tab\" id=\"tab-draw\" aria-selected=\"false\" aria-controls=\"panel-draw\">\r\n {{'OWN_AREA'|translate}}\r\n </button>\r\n </div>\r\n }\r\n <div class=\"mb-2\">\r\n @if(hasOwnArea&&filters.showOwnArea){\r\n <div class=\"pt-1\" role=\"tabpanel\" id=\"area-draw\" aria-labelledby=\"tab-draw\">\r\n <div>\r\n <adb-polygon-drawer formControlName=\"geo\"></adb-polygon-drawer>\r\n </div>\r\n </div>\r\n }@else{\r\n <div role=\"tabpanel\" id=\"area-select\" aria-labelledby=\"tab-select\">\r\n <div formArrayName=\"areas\">\r\n <div class=\"d-flex align-items-end mb-1\">\r\n <label>{{'AREAS'|translate}}</label>\r\n <button class=\"ms-auto text-dark btn btn-sm btn-secondary\" attr.aria-label=\"{{'OBSERVATION.ADD_AREA'|translate}}\" title=\"{{'OBSERVATION.ADD_AREA'|translate}}\" type=\"button\" (click)=\"addArea()\">\r\n <span class=\"fas fa-plus\"></span>\r\n </button>\r\n </div>\r\n @for (ctrl of areasArray.controls; track ctrl; let i = $index; let last = $last) {\r\n <div class=\"d-flex mb-2\">\r\n <adb-area-picker id=\"area-{{i}}\" [formControlName]=\"i\"></adb-area-picker>\r\n @if(areasArray.length>1){\r\n <button class=\"btn btn-secondary ms-1\" attr.aria-label=\"{{'DELETE'|translate}}\" title=\"{{'DELETE'|translate}}\" type=\"button\" (click)=\"removeArea(i)\">\r\n <span class=\"fas fa-trash\"></span>\r\n </button>\r\n }\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n </ng-template>\r\n </adb-filter-section>\r\n }\r\n @if(form.get('taxonId')){\r\n @if(filters.showTaxaLists){\r\n <adb-filter-section [count]=\"taxonListCount\" titleResource=\"LISTS.NATURE_CONSERVATION_LISTS\">\r\n <div class=\"mb-3\">\r\n <app-treeview formControlName=\"list\" [nodes]=\"taxaLists\"></app-treeview>\r\n </div>\r\n {{'LISTS.READ_MORE'|translate}}\r\n <a [href]=\"artfakta\">{{'LISTS.LIST_CONTENT'|translate}}</a>\r\n </adb-filter-section>\r\n }\r\n @if(filters.showDatasets){\r\n <adb-filter-section [count]=\"dataSetCount\" titleResource=\"DATASET.DATASETS\">\r\n @if (form.get('ds')) {\r\n <div formArrayName=\"ds\">\r\n @for (item of dsControls; track item; let i = $index) {\r\n <div [formGroupName]=\"i\" class=\"form-check\">\r\n <input type=\"checkbox\" formControlName=\"selected\" [id]=\"'ds-' + item.value.id\" class=\"form-check-input\">\r\n <label [for]=\"'ds-' + item.value.id\" class=\"form-check-label\">{{ 'PROVIDERS.'+item.value.id |translate }}</label>\r\n </div>\r\n }\r\n </div>\r\n }\r\n </adb-filter-section>\r\n }\r\n }\r\n </div>\r\n <div class=\"d-flex justify-content-end gap-2\">\r\n @if (inline) {\r\n <a class=\"btn btn-secondary\" [routerLink]=\"[]\">\r\n {{'CANCEL'|translate}}\r\n </a>\r\n }\r\n <button type=\"submit\" class=\"btn btn-primary\" [disabled]=\"form.invalid||form.pristine\">{{'FILTER'|translate}}</button>\r\n </div>\r\n</form>\r\n}", dependencies: [{ kind: "directive", type: i4.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i4.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i4.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i4.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i4.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i4.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],[formArray],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1$2.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "directive", type: i4.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i4.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i4.FormGroupName, selector: "[formGroupName]", inputs: ["formGroupName"] }, { kind: "directive", type: i4.FormArrayName, selector: "[formArrayName]", inputs: ["formArrayName"] }, { kind: "directive", type: i5.AdbDatePickerDirective, selector: "input[adbDatepicker]", inputs: ["format", "toLeft", "settings"], outputs: ["adbBlur"] }, { kind: "component", type: i5.FilterSectionComponent, selector: "adb-filter-section", inputs: ["titleResource", "helpResource", "count", "expanded", "lazy"] }, { kind: "component", type: i5.AdbAreaPickerComponent, selector: "adb-area-picker", inputs: ["placeholder", "useObject", "prefill"] }, { kind: "component", type: i5.AdbTaxonPickerComponent, selector: "adb-taxon-picker", inputs: ["placeholder", "useObject", "prefill"] }, { kind: "component", type: PolygonDrawerInput, selector: "adb-polygon-drawer" }, { kind: "component", type: TreeviewComponent, selector: "app-treeview", inputs: ["nodes"] }, { kind: "pipe", type: i1$1.DatePipe, name: "date" }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }] });
739
792
  }
740
793
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: AdbMapFilters, decorators: [{
741
794
  type: Component,
742
795
  args: [{ selector: 'adb-map-filters', standalone: false, template: "@if(form){\r\n<form [formGroup]=\"form\" class=\"form mb-3\" (ngSubmit)=\"onSubmit()\">\r\n <div class=\"mb-3\">\r\n <adb-filter-section titleResource=\"TAXON.TAXA\" [expanded]=\"true\">\r\n @if(filters.showTaxon&&!hasTaxonInUrlParameter){\r\n <div class=\"mb-3\">\r\n <label for=\"species\">{{'TAXON.TAXON'|translate}}</label>\r\n <adb-taxon-picker formControlName=\"taxonId\" id=\"species\"></adb-taxon-picker>\r\n </div>\r\n }\r\n </adb-filter-section>\r\n @if(filters.showTime){\r\n <adb-filter-section [count]=\"periodCount\" titleResource=\"OBSERVATION.PERIOD\">\r\n <div class=\"mb-1\">\r\n <select class=\"form-select\" formControlName=\"period\" id=\"period\">\r\n <option value=\"1\">{{thisYear|date:'yyyy'}}</option>\r\n <option value=\"2\">{{lastYear|date:'yyyy'}}</option>\r\n <option value=\"3\">{{'OBSERVATION.ALL_YEAR'|translate}}</option>\r\n <option value=\"4\">{{'OBSERVATION.LAST_5_YEAR'|translate}}</option>\r\n <option value=\"5\">{{'OBSERVATION.LAST_25_YEAR'|translate}}</option>\r\n <option value=\"6\">{{'OBSERVATION.CUSTOMIZED'|translate}}</option>\r\n </select>\r\n </div>\r\n @if (form.value?.period==='6') {\r\n <div class=\"mb-2\">\r\n <label for=\"startAt\">{{'FROM' |translate}}</label>\r\n <input adbDatepicker type=\"text\" class=\"form-control datepicker\" id=\"startAt\" formControlName=\"startAt\" [settings]=\"dateStartConfig\">\r\n </div>\r\n <div class=\"mb-2\">\r\n <label for=\"endAt\">{{'TO' |translate}}</label>\r\n <input adbDatepicker type=\"text\" class=\"form-control datepicker\" id=\"endAt\" formControlName=\"endAt\" [settings]=\"dateEndConfig\">\r\n </div>\r\n }\r\n </adb-filter-section>\r\n }\r\n @if(filters.showArea){\r\n <adb-filter-section [count]=\"areaCount\" titleResource=\"GEOGRAPHY\" [lazy]=\"true\">\r\n <ng-template>\r\n @if(filters.showOwnArea){\r\n <div role=\"tablist\" aria-label=\"{{'AREA'|translate}}\" class=\"d-flex gap-2 justify-content-end\">\r\n <button class=\"btn btn-link p-0\" [class.text-dark]=\"!hasOwnArea\" (click)=\"hasOwnArea=false\" role=\"tab\" id=\"tab-select\" aria-selected=\"{{!hasOwnArea}}\" aria-controls=\"panel-select\">\r\n {{'CHOOSE'|translate}}\r\n </button>\r\n <button class=\"btn btn-link p-0\" [class.text-dark]=\"hasOwnArea\" (click)=\"hasOwnArea=true\" role=\"tab\" id=\"tab-draw\" aria-selected=\"false\" aria-controls=\"panel-draw\">\r\n {{'OWN_AREA'|translate}}\r\n </button>\r\n </div>\r\n }\r\n <div class=\"mb-2\">\r\n @if(hasOwnArea&&filters.showOwnArea){\r\n <div class=\"pt-1\" role=\"tabpanel\" id=\"area-draw\" aria-labelledby=\"tab-draw\">\r\n <div>\r\n <adb-polygon-drawer formControlName=\"geo\"></adb-polygon-drawer>\r\n </div>\r\n </div>\r\n }@else{\r\n <div role=\"tabpanel\" id=\"area-select\" aria-labelledby=\"tab-select\">\r\n <div formArrayName=\"areas\">\r\n <div class=\"d-flex align-items-end mb-1\">\r\n <label>{{'AREAS'|translate}}</label>\r\n <button class=\"ms-auto text-dark btn btn-sm btn-secondary\" attr.aria-label=\"{{'OBSERVATION.ADD_AREA'|translate}}\" title=\"{{'OBSERVATION.ADD_AREA'|translate}}\" type=\"button\" (click)=\"addArea()\">\r\n <span class=\"fas fa-plus\"></span>\r\n </button>\r\n </div>\r\n @for (ctrl of areasArray.controls; track ctrl; let i = $index; let last = $last) {\r\n <div class=\"d-flex mb-2\">\r\n <adb-area-picker id=\"area-{{i}}\" [formControlName]=\"i\"></adb-area-picker>\r\n @if(areasArray.length>1){\r\n <button class=\"btn btn-secondary ms-1\" attr.aria-label=\"{{'DELETE'|translate}}\" title=\"{{'DELETE'|translate}}\" type=\"button\" (click)=\"removeArea(i)\">\r\n <span class=\"fas fa-trash\"></span>\r\n </button>\r\n }\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n </ng-template>\r\n </adb-filter-section>\r\n }\r\n @if(form.get('taxonId')){\r\n @if(filters.showTaxaLists){\r\n <adb-filter-section [count]=\"taxonListCount\" titleResource=\"LISTS.NATURE_CONSERVATION_LISTS\">\r\n <div class=\"mb-3\">\r\n <app-treeview formControlName=\"list\" [nodes]=\"taxaLists\"></app-treeview>\r\n </div>\r\n {{'LISTS.READ_MORE'|translate}}\r\n <a [href]=\"artfakta\">{{'LISTS.LIST_CONTENT'|translate}}</a>\r\n </adb-filter-section>\r\n }\r\n @if(filters.showDatasets){\r\n <adb-filter-section [count]=\"dataSetCount\" titleResource=\"DATASET.DATASETS\">\r\n @if (form.get('ds')) {\r\n <div formArrayName=\"ds\">\r\n @for (item of dsControls; track item; let i = $index) {\r\n <div [formGroupName]=\"i\" class=\"form-check\">\r\n <input type=\"checkbox\" formControlName=\"selected\" [id]=\"'ds-' + item.value.id\" class=\"form-check-input\">\r\n <label [for]=\"'ds-' + item.value.id\" class=\"form-check-label\">{{ 'PROVIDERS.'+item.value.id |translate }}</label>\r\n </div>\r\n }\r\n </div>\r\n }\r\n </adb-filter-section>\r\n }\r\n }\r\n </div>\r\n <div class=\"d-flex justify-content-end gap-2\">\r\n @if (inline) {\r\n <a class=\"btn btn-secondary\" [routerLink]=\"[]\">\r\n {{'CANCEL'|translate}}\r\n </a>\r\n }\r\n <button type=\"submit\" class=\"btn btn-primary\" [disabled]=\"form.invalid||form.pristine\">{{'FILTER'|translate}}</button>\r\n </div>\r\n</form>\r\n}" }]
743
- }], ctorParameters: () => [{ type: i0.ChangeDetectorRef }, { type: AdbMapConfigService }, { type: i3$1.HttpClient }, { type: i3.Router }, { type: i3.ActivatedRoute }], propDecorators: { inline: [{
796
+ }], ctorParameters: () => [{ type: i0.ChangeDetectorRef }, { type: AdbMapConfigService }, { type: i3.HttpClient }, { type: i1$2.Router }, { type: i1$2.ActivatedRoute }], propDecorators: { inline: [{
744
797
  type: Input
745
798
  }] } });
746
799
 
@@ -821,4 +874,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImpor
821
874
  */
822
875
 
823
876
  export { ADB_MAP_CONFIG, AdbMapConfigService, AdbMapFilterType, AdbMapFilters, AdbMapModule, AdbMapUtils, AdbObsMapComponent, PolygonDrawerInput, VisibleFilters };
824
- //# sourceMappingURL=adb-shared-src-map.mjs.map
877
+ //# sourceMappingURL=adb-shared-map.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adb-shared-map.mjs","sources":["../../../projects/adb-shared/map/src/mapUtils.ts","../../../projects/adb-shared/map/src/components/polygon-drawer.component.ts","../../../projects/adb-shared/map/src/components/polygon-drawer.component.html","../../../projects/adb-shared/map/src/config.ts","../../../projects/adb-shared/map/src/components/treeview.ts","../../../projects/adb-shared/map/src/components/treeview.html","../../../projects/adb-shared/map/src/components/observations-map.ts","../../../projects/adb-shared/map/src/components/observations-map.html","../../../projects/adb-shared/map/src/constants.ts","../../../projects/adb-shared/map/src/components/map-filter.ts","../../../projects/adb-shared/map/src/components/map-filter.html","../../../projects/adb-shared/map/src/adb-map.module.ts","../../../projects/adb-shared/map/src/adb-shared-map.ts"],"sourcesContent":["import { MapOptions } from \"./models\";\r\nimport * as Leaflet from 'leaflet';\r\n\r\nexport class AdbMapUtils {\r\n static readonly INITIAL_CENTER_LAT = 62;\r\n static readonly INITIAL_CENTER_LNG = 17;\r\n static OverlayMaps = {\r\n 'Altitude': new Leaflet.TileLayer.WMS(\"https://maps.sgu.se/lmv/hojdmodell/v1.1?SERVICE=WMS\",\r\n { layers: \"terrangskuggning\", format: \"image/png\", transparent: true, opacity: 0.3, maxZoom: 16, version: \"1.3.0\" }),\r\n 'Fjällkarta': new Leaflet.TileLayer.WMS(\r\n 'api/maps/mountain',\r\n {\r\n minZoom: 6,\r\n maxZoom: 18,\r\n maxNativeZoom: 14,\r\n attribution: '© <a href=\"https://www.lantmateriet.se/\">Fjällkart</a>',\r\n wms: true\r\n }),\r\n 'Kommuner': new Leaflet.TileLayer.WMS(\r\n 'https://sosgeo.artdata.slu.se/geoserver/GeoRegion/wms?',\r\n {\r\n layers: 'GeoRegion:Municipality',\r\n version: '1.1.0',\r\n transparent: true,\r\n format: 'image/png'\r\n }\r\n ),\r\n 'Län': new Leaflet.TileLayer.WMS(\r\n 'https://sosgeo.artdata.slu.se/geoserver/GeoRegion/wms?',\r\n {\r\n layers: 'GeoRegion:County',\r\n version: '1.1.0',\r\n transparent: true,\r\n format: 'image/png'\r\n }\r\n )\r\n , 'Ortnamn': new Leaflet.TileLayer.WMS(\r\n \"https://maps.sgu.se/lmv/topowebb-skikt/v1.1?SERVICE=WMS\",\r\n {\r\n layers: \"text\",\r\n format: \"image/png\",\r\n transparent: true,\r\n version: \"1.3.0\",\r\n }\r\n ),\r\n 'Ekonomisk zon': new Leaflet.TileLayer.WMS(\r\n \"https://sosgeo.artdata.slu.se/geoserver/it.geosolutions/wms?\",\r\n {\r\n layers: \"it.geosolutions:Ekonomiska_zonens_yttre_avgränsningslinjer_linje\",\r\n format: \"image/png\",\r\n transparent: true,\r\n version: \"1.1.0\"\r\n }\r\n )\r\n };\r\n\r\n static Providers: MapProvider[] = [\r\n {\r\n name: 'Open Streetmap',\r\n id: 3,\r\n url: 'https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png',\r\n minZoom: 0,\r\n maxZoom: 18,\r\n params: {\r\n maxNativeZoom: 18,\r\n attribution: '© <a href=\"https://www.openstreetmap.org/copyright\">OpenStreetMap</a> contributors'\r\n },\r\n wms: false\r\n },\r\n {\r\n name: 'Sveriges gränser',\r\n id: 7,\r\n url: 'https://sosgeo.artdata.slu.se/geoserver/it.geosolutions/wms',\r\n minZoom: 6,\r\n maxZoom: 18,\r\n params: {\r\n maxNativeZoom: 14,\r\n attribution: '© <a href=\"https://www.lantmateriet.se/\">Sveriges gränser</a>',\r\n layers: 'it.geosolutions:Sverige_epsg5845', styles: 'municipality_name_yellow',\r\n epsg: 5845 \r\n },\r\n wms: true\r\n }\r\n ]\r\n\r\n //NOTE: Will be move\r\n static redListMapper2 = {\r\n 'VU': '228',\r\n 'EN': '229',\r\n 'CR': '230',\r\n 'RE': '231',\r\n 'DD': '232',\r\n 'NT': '233'\r\n }\r\n\r\n static createMap(\r\n elementId: string,\r\n options: MapOptions = {}\r\n ): Leaflet.Map {\r\n\r\n const map = Leaflet.map(elementId, {\r\n zoomAnimation: false,\r\n fadeAnimation: false,\r\n markerZoomAnimation: false,\r\n inertia: false,\r\n scrollWheelZoom: options.scrollZoom ?? true,\r\n zoomControl: options.zoom ?? true,\r\n dragging: options.zoom ?? true,\r\n minZoom: -1,\r\n zoomDelta: 1\r\n });\r\n\r\n map.setView([62, 17], 5);\r\n\r\n Leaflet.control.scale().addTo(map);\r\n\r\n if (options.providers !== false) {\r\n this.addProviders(map);\r\n }\r\n\r\n return map;\r\n }\r\n\r\n private static addProviders(map: Leaflet.Map): void {\r\n const backgroundMaps: Record<string, Leaflet.Layer> = {};\r\n\r\n for (const value of Object.values(AdbMapUtils.Providers)) {\r\n backgroundMaps[value.name] = value.wms\r\n ? Leaflet.tileLayer.wms(value.url, value.params)\r\n : Leaflet.tileLayer(value.url, value.params);\r\n }\r\n if (backgroundMaps['Open Streetmap']) {\r\n map.addLayer(backgroundMaps['Open Streetmap']);\r\n }\r\n Leaflet.control.layers(backgroundMaps, AdbMapUtils.OverlayMaps).addTo(map);\r\n }\r\n}\r\n\r\ninterface MapProvider {\r\n name: string;\r\n id: number;\r\n url: string;\r\n minZoom: number;\r\n maxZoom: number;\r\n wms: boolean;\r\n params?: any;\r\n}","import {\r\n Component,\r\n forwardRef,\r\n OnDestroy,\r\n OnInit,\r\n AfterViewInit\r\n} from \"@angular/core\";\r\nimport {\r\n ControlValueAccessor,\r\n NG_VALUE_ACCESSOR\r\n} from \"@angular/forms\";\r\nimport Leaflet from \"leaflet\";\r\nimport \"@geoman-io/leaflet-geoman-free\";\r\nimport { Subscription } from \"rxjs\";\r\nimport { AdbMapUtils } from \"../mapUtils\";\r\n\r\n@Component({\r\n selector: \"adb-polygon-drawer\",\r\n templateUrl: \"polygon-drawer.component.html\",\r\n standalone: false,\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => PolygonDrawerInput),\r\n multi: true\r\n }\r\n ]\r\n})\r\nexport class PolygonDrawerInput\r\n implements ControlValueAccessor, OnInit, AfterViewInit, OnDestroy {\r\n\r\n private subscriptions = new Subscription();\r\n\r\n mapId = \"\" + Math.floor(Math.random() * Date.now());\r\n map!: Leaflet.Map;\r\n\r\n polygonDraw = false;\r\n shapeLayer: any;\r\n geoJson: any;\r\n\r\n ngAfterViewInit(): void {\r\n this.map = AdbMapUtils.createMap(this.mapId, {\r\n zoom: true,\r\n scrollZoom: true,\r\n providers: true\r\n });\r\n\r\n this.map.whenReady(() => {\r\n this.initDraw();\r\n this.renderInitialShape();\r\n });\r\n }\r\n\r\n ngOnInit(): void { }\r\n\r\n ngOnDestroy(): void {\r\n this.subscriptions.unsubscribe();\r\n }\r\n\r\n private initDraw(): void {\r\n this.map.pm.removeControls();\r\n this.map.pm.enableDraw('Polygon', {\r\n tooltips: false,\r\n finishOn: 'snap',\r\n snapDistance: 30, \r\n snapMiddle: false\r\n });\r\n this.map.on(\"pm:create\", (e: any) => {\r\n if (e.shape !== 'Polygon' && e.shape !== 'Circle') return;\r\n this.polygonDraw = false;\r\n this.map.pm.disableDraw();\r\n\r\n this.clearShape();\r\n this.shapeLayer = e.layer;\r\n\r\n if (this.shapeLayer instanceof Leaflet.Path) {\r\n this.shapeLayer.setStyle({ fillOpacity: 0.5 });\r\n }\r\n this.shapeLayer.interactive = false;\r\n this.map.fitBounds(this.shapeLayer.getBounds());\r\n\r\n const geo = this.shapeLayer.toGeoJSON();\r\n\r\n if (this.shapeLayer instanceof Leaflet.Circle) {\r\n geo.properties = {\r\n ...geo.properties,\r\n radius: Math.ceil(this.shapeLayer.getRadius())\r\n };\r\n }\r\n\r\n this.onChange(geo);\r\n });\r\n }\r\n\r\n private renderInitialShape(): void {\r\n if (this.geoJson?.type === \"Feature\") {\r\n this.shapeLayer = Leaflet.geoJSON(this.geoJson, {\r\n interactive: false\r\n });\r\n this.map.addLayer(this.shapeLayer);\r\n this.map.fitBounds(this.shapeLayer.getBounds());\r\n } else {\r\n this.map.setView(\r\n [AdbMapUtils.INITIAL_CENTER_LAT, AdbMapUtils.INITIAL_CENTER_LNG],\r\n 5\r\n );\r\n }\r\n }\r\n\r\n private clearShape(): void {\r\n if (this.shapeLayer) {\r\n this.map.removeLayer(this.shapeLayer);\r\n this.shapeLayer = null;\r\n }\r\n }\r\n\r\n onDrawPolygon(): void {\r\n this.polygonDraw = true;\r\n\r\n this.map.pm.enableDraw(\"Polygon\", {\r\n allowSelfIntersection: false,\r\n snappable: false\r\n });\r\n }\r\n\r\n onDrawCircle(): void {\r\n this.polygonDraw = true;\r\n\r\n this.map.pm.enableDraw(\"Circle\", {\r\n allowSelfIntersection: false,\r\n snappable: false\r\n });\r\n }\r\n\r\n onUndoStep(): void {\r\n const draw = (this.map.pm as any).Draw?.Polygon;\r\n draw?._removeLastVertex();\r\n }\r\n\r\n onDeleteShape(): void {\r\n this.clearShape();\r\n this.map.pm.disableDraw();\r\n this.polygonDraw = false;\r\n this.onChange(null);\r\n this.map.setView([62, 17], 5);\r\n }\r\n\r\n // ControlValueAccessor\r\n onChange: any = () => { };\r\n onTouched: any = () => { };\r\n\r\n writeValue(geoJson: any): void {\r\n this.geoJson = geoJson;\r\n }\r\n\r\n registerOnChange(fn: any): void {\r\n this.onChange = fn;\r\n }\r\n\r\n registerOnTouched(fn: any): void {\r\n this.onTouched = fn;\r\n }\r\n\r\n setDisabledState?(isDisabled: boolean): void { }\r\n}\r\n","<div class=\"mb-1 d-flex gap-1 flex-wrap align-items-start\">\r\n <button class=\"btn btn-secondary\" type=\"button\" [disabled]=\"shapeLayer\" (click)=\"onDrawPolygon()\" title=\"Polygon\">\r\n <span class=\"fas fa-draw-polygon\"></span> {{'OBSERVATION.DRAW'|translate}}\r\n </button>\r\n <button class=\"btn btn-secondary\" type=\"button\" [disabled]=\"shapeLayer\" (click)=\"onDrawCircle()\" title=\"Circle\">\r\n <span class=\"fas fa-draw-circle\"></span> {{'OBSERVATION.DRAW_CIRCLE'|translate}}\r\n </button>\r\n @if (shapeLayer) {\r\n <button class=\"btn btn-secondary\" type=\"button\" (click)=\"onDeleteShape()\" title=\"Ta bort\">\r\n <span class=\"fas fa-times\"></span>\r\n </button>\r\n }\r\n @if (polygonDraw) {\r\n <button class=\"btn btn-secondary\" type=\"button\" (click)=\"onUndoStep()\" title=\"Ångra\">\r\n <span class=\"fas fa-undo\"></span>\r\n </button>\r\n }\r\n</div>\r\n<div [id]=\"mapId\" class=\"border\" style=\"height:20rem\"></div>","import { Inject, Injectable } from \"@angular/core\";\r\nimport { InjectionToken } from \"@angular/core\";\r\nexport interface AdbMapConfig {\r\n api: string,\r\n artfaktaTaxonLists: string,\r\n observationPage?: string;\r\n dynamic?: boolean;\r\n filters?: AdbMapFilterType[],\r\n log?: boolean\r\n}\r\n\r\nexport enum AdbMapFilterType {\r\n Taxon = 'taxon',\r\n Area = 'area',\r\n OwnArea = 'ownArea',\r\n Time = 'time',\r\n RedList = 'redlist',\r\n RiskList = 'risklist',\r\n TaxaLists = 'taxonLists',\r\n Datasources = 'datasources'\r\n}\r\n\r\nexport class VisibleFilters {\r\n showTaxon: boolean;\r\n showTime: boolean;\r\n showArea: boolean;\r\n showOwnArea: boolean;\r\n showTaxaLists: boolean;\r\n showDatasets: boolean;\r\n}\r\n\r\nexport const ADB_MAP_CONFIG = new InjectionToken<AdbMapConfig>('ADB_MAP_CONFIG');\r\n\r\n@Injectable()\r\nexport class AdbMapConfigService {\r\n readonly log: boolean;\r\n readonly artfaktaTaxonLists: string;\r\n readonly observationFeatures: string;\r\n readonly taxaListsApi: string;\r\n readonly filters: VisibleFilters;\r\n readonly observationPage: string;\r\n readonly dynamic: boolean;\r\n\r\n constructor(@Inject(ADB_MAP_CONFIG) config: AdbMapConfig) {\r\n this.log = config.log ?? false;\r\n this.dynamic = config.dynamic ?? false;\r\n this.artfaktaTaxonLists = config.artfaktaTaxonLists ?? 'https://artfakta.se/metadata/listor';\r\n this.taxaListsApi = config.api + '/taxalists';\r\n this.observationFeatures = config.api + '/observation-features';\r\n this.observationPage = config.observationPage ?? 'https://mobil.artportalen.se/observationer';\r\n this.filters = {\r\n showTaxon: this.hasFilter(AdbMapFilterType.Taxon, config.filters),\r\n showTime: this.hasFilter(AdbMapFilterType.Time, config.filters),\r\n showArea: this.hasFilter(AdbMapFilterType.Area, config.filters),\r\n showOwnArea: this.hasFilter(AdbMapFilterType.OwnArea, config.filters),\r\n showTaxaLists: this.hasFilter(AdbMapFilterType.TaxaLists, config.filters),\r\n showDatasets: this.hasFilter(AdbMapFilterType.Datasources, config.filters)\r\n };\r\n }\r\n\r\n private hasFilter(f: AdbMapFilterType, filters: AdbMapFilterType[]): boolean {\r\n return filters?.includes(f) ?? true;\r\n }\r\n}","import { Component, Input, forwardRef } from '@angular/core';\r\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\r\n\r\n@Component({\r\n selector: 'app-treeview',\r\n templateUrl: './treeview.html',\r\n standalone:false,\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => TreeviewComponent),\r\n multi: true\r\n }\r\n ]\r\n})\r\nexport class TreeviewComponent implements ControlValueAccessor {\r\n @Input() nodes: ListItem[] = [];\r\n\r\n private selectedIds: number[] = [];\r\n private onChange: (value: number[]) => void = () => {};\r\n private onTouched: () => void = () => {};\r\n\r\n writeValue(ids: number[] | null): void {\r\n this.selectedIds = ids ?? [];\r\n this.applySelection(this.nodes);\r\n }\r\n\r\n registerOnChange(fn: (value: number[]) => void): void {\r\n this.onChange = fn;\r\n }\r\n\r\n registerOnTouched(fn: () => void): void {\r\n this.onTouched = fn;\r\n }\r\n\r\n setDisabledState(isDisabled: boolean): void {\r\n this.setReadOnly(this.nodes, isDisabled);\r\n }\r\n\r\n onLeafToggle(node: ListItem): void {\r\n if (node._readOnly) return;\r\n\r\n node._selected = !node._selected;\r\n\r\n this.selectedIds = TreeviewComponent.collectSelectedLeafIds(this.nodes);\r\n this.onChange(this.selectedIds);\r\n this.onTouched();\r\n }\r\n\r\n private applySelection(nodes: ListItem[]): void {\r\n for (const node of nodes) {\r\n if (node.children?.length) {\r\n this.applySelection(node.children);\r\n } else {\r\n node._selected = this.selectedIds.includes(node.id);\r\n }\r\n }\r\n }\r\n\r\n private setReadOnly(nodes: ListItem[], readOnly: boolean): void {\r\n for (const node of nodes) {\r\n node._readOnly = readOnly;\r\n if (node.children?.length) {\r\n this.setReadOnly(node.children, readOnly);\r\n }\r\n }\r\n }\r\n\r\n private static collectSelectedLeafIds(nodes: ListItem[]): number[] {\r\n const ids: number[] = [];\r\n\r\n for (const node of nodes) {\r\n if (node.children?.length) {\r\n ids.push(...this.collectSelectedLeafIds(node.children));\r\n } else if (node._selected) {\r\n ids.push(node.id);\r\n }\r\n }\r\n\r\n return ids;\r\n }\r\n}\r\n\r\n interface ListItem {\r\n id: number;\r\n name?: string;\r\n children?: ListItem[];\r\n\r\n _selected?: boolean;\r\n _readOnly?: boolean;\r\n}\r\n\r\n","<ng-container *ngTemplateOutlet=\"nodeTpl; context: { $implicit: nodes }\">\r\n</ng-container>\r\n<ng-template #nodeTpl let-nodes>\r\n @for (node of nodes; track node) {\r\n <div class=\"ms-3\">\r\n @if(!node.children || node.children.length === 0){\r\n <div class=\"d-flex align-items-center gap-2\">\r\n <input id=\"{{node.id}}\" type=\"checkbox\" class=\"form-check-input m-0\" [checked]=\"node._selected\" [disabled]=\"node._readOnly\" (change)=\"onLeafToggle(node)\" />\r\n <label for=\"{{node.id}}\">{{ node.name }}</label>\r\n </div>\r\n }\r\n @else {\r\n {{ node.name }}\r\n <div>\r\n <ng-container *ngTemplateOutlet=\"nodeTpl; context: { $implicit: node.children }\">\r\n </ng-container>\r\n </div>\r\n }\r\n </div>\r\n}\r\n</ng-template>","import { AfterViewInit, Component, effect, OnDestroy, OnInit, signal } from \"@angular/core\";\r\nimport * as Leaflet from 'leaflet';\r\nimport { finalize } from 'rxjs/operators';\r\nimport { ActivatedRoute, ParamMap, Params, Router } from \"@angular/router\";\r\nimport { Subscription } from \"rxjs\";\r\nimport { HttpClient, HttpResponse } from \"@angular/common/http\";\r\nimport { GeoJson } from \"../models\";\r\nimport { AdbMapConfigService } from \"../config\";\r\nimport { AdbMapUtils } from \"../mapUtils\";\r\n@Component({\r\n selector: 'adb-obs-map',\r\n templateUrl: 'observations-map.html',\r\n standalone: false\r\n})\r\nexport class AdbObsMapComponent implements AfterViewInit, OnInit, OnDestroy {\r\n private subscriptions = new Subscription();\r\n error: null;\r\n mapLoading = signal(false);\r\n siteLayer: Leaflet.FeatureGroup;\r\n hasBox: boolean;\r\n count: any;\r\n mapId = '' + Math.floor(Math.random() * Date.now());\r\n map = Leaflet.map;\r\n //Lock start\r\n mapReady = signal(false);\r\n hasQueryParams = false;\r\n hasUrlParams = false;\r\n queryParams: Params;\r\n urlParams: ParamMap;\r\n //Lock end\r\n\r\n constructor(\r\n private activatedRoute: ActivatedRoute,\r\n private config: AdbMapConfigService,\r\n private router: Router,\r\n private http: HttpClient) {\r\n effect(() => {\r\n // This will re-run whenever mapReady() changes\r\n if (this.mapReady() && this.hasQueryParams && this.hasUrlParams) {\r\n this.tryLoad();\r\n }\r\n });\r\n }\r\n\r\n ngAfterViewInit(): void {\r\n this.map = AdbMapUtils.createMap(this.mapId, {\r\n zoom: true,\r\n scrollZoom: false,\r\n providers: true\r\n });\r\n\r\n this.map.whenReady(() => {\r\n this.mapReady.set(true);\r\n if (this.config.dynamic) {\r\n this.attachUserListeners()\r\n }\r\n });\r\n }\r\n\r\n // Loads data only after:\r\n // - the Leaflet map is ready\r\n // - Angular has emitted query params (may be empty)\r\n // - Angular has emitted route params (may be empty)\r\n private tryLoad(): void {\r\n if (!this.mapReady() || !this.hasQueryParams || !this.hasUrlParams) {\r\n return;\r\n }\r\n const params: Params = { ...this.queryParams };\r\n this.hasBox = params['bbox'] ? true : false;\r\n if (this.urlParams.has('taxonId')) {\r\n params['taxonId'] = this.urlParams.get('taxonId');\r\n }\r\n this.loadFeature(params);\r\n }\r\n\r\n ngOnInit(): void {\r\n this.subscriptions.add(\r\n this.activatedRoute.queryParams.subscribe(q => {\r\n this.queryParams = q ?? {};\r\n this.hasQueryParams = true;\r\n this.tryLoad();\r\n })\r\n );\r\n this.subscriptions.add(\r\n this.activatedRoute.paramMap.subscribe(p => {\r\n this.urlParams = p;\r\n this.hasUrlParams = true;\r\n this.tryLoad();\r\n })\r\n );\r\n }\r\n\r\n private attachUserListeners() {\r\n const container = this.map.getContainer();\r\n const zoomIn = container.querySelector('.leaflet-control-zoom-in');\r\n const zoomOut = container.querySelector('.leaflet-control-zoom-out');\r\n zoomIn?.addEventListener('click', () => { this.onUserInputRoute() });\r\n zoomOut?.addEventListener('click', () => { this.onUserInputRoute() });\r\n this.map.on('dragend', () => {\r\n this.onUserInputRoute();\r\n });\r\n }\r\n\r\n private onUserInputRoute() {\r\n const bounds = this.map.getBounds();\r\n const bbox = this.getMapBoundsToBbox(bounds).join(',');\r\n\r\n this.router.navigate([], {\r\n relativeTo: this.activatedRoute,\r\n queryParams: { bbox },\r\n queryParamsHandling: 'merge'\r\n });\r\n }\r\n\r\n\r\n private loadFeature(qParams: Params): void {\r\n if (this.siteLayer) {\r\n this.map.removeLayer(this.siteLayer);\r\n this.siteLayer = undefined;\r\n }\r\n this.mapLoading.set(true);\r\n this.error = null;\r\n const url = this.config.observationFeatures;\r\n this.subscriptions.add(this.http.get<GeoJson>(url, { observe: 'response', params: qParams }).\r\n pipe(\r\n finalize(() => {\r\n this.mapLoading.set(false);\r\n })\r\n ).\r\n subscribe({\r\n next: (response: HttpResponse<GeoJson>) => {\r\n if (!response.body) {\r\n throw new Error('No GeoJson body');\r\n }\r\n const geo = response.body;\r\n geo.properties = { count: response.headers.get('X-Observations-TotalCount') };\r\n this.buildMap(geo);\r\n }, error: err => {\r\n this.error = err;\r\n }\r\n }));\r\n }\r\n\r\n private buildMap(geojson: GeoJson): void {\r\n if (this.siteLayer) {\r\n this.map.removeLayer(this.siteLayer);\r\n }\r\n this.count = geojson?.properties?.count;\r\n this.siteLayer = Leaflet.geoJson(geojson, {\r\n style: (feature) => {\r\n return {\r\n className: `svg ${this.getPolygonClassName(feature.properties)}`, // Leaflet applies this class to the SVG path\r\n weight: 1,\r\n fillOpacity: 0.8,\r\n };\r\n },\r\n pointToLayer: (feature, latlng) => {\r\n const marker = Leaflet.marker(latlng, {\r\n interactive: this.config.dynamic,\r\n icon: Leaflet.divIcon({\r\n className: '',\r\n html: '<div class=\"adb-map-marker\"></div>',\r\n iconAnchor: [3, 3]\r\n })\r\n });\r\n if (feature.properties && feature.properties['Occurrence.OccurrenceId']) {\r\n marker.on('click', () => {\r\n window.location.href = this.config.observationPage + '/' + feature.properties['Occurrence.OccurrenceId'];\r\n });\r\n }\r\n return marker;\r\n }, onEachFeature: (feature, layer) => {\r\n if (feature.geometry.type === \"Polygon\" ||\r\n feature.geometry.type === \"MultiPolygon\") {\r\n if (feature.properties.ObservationsCount > 0) {\r\n if (this.config.dynamic) {\r\n layer.on('click', () => {\r\n const boundBox = JSON.stringify(this.getMapBoundsToBbox(layer.getBounds()));\r\n this.router.navigate([], { queryParams: { bbox: boundBox }, queryParamsHandling: 'merge' });\r\n });\r\n layer.on('mouseover', () => {\r\n layer.setStyle({ className: 'svg cursor-pointer' });\r\n });\r\n layer.on('mouseout', () => {\r\n layer.setStyle({ className: 'svg' });\r\n });\r\n }\r\n }\r\n if (!this.config.dynamic) {\r\n layer.setStyle({ interactive: false });\r\n } else if (feature.properties.FeatureType) { //area\r\n layer.setStyle({ interactive: false });\r\n }\r\n }\r\n }\r\n });\r\n const circleLayer = Leaflet.featureGroup();\r\n circleLayer.addTo(this.siteLayer);\r\n this.map.addLayer(this.siteLayer);\r\n if (geojson.bbox) {\r\n const [minLon, minLat, maxLon, maxLat] = geojson.bbox;\r\n const bounds = Leaflet.latLngBounds([[minLat, minLon], [maxLat, maxLon]]);\r\n if (bounds.isValid()) {\r\n // Safari sometimes needs extra time after layer adds\r\n setTimeout(() => {\r\n this.map.invalidateSize({ animate: false });\r\n this.map.fitBounds(bounds, { animate: false });\r\n }, 50); // 30–50ms works best in Safari\r\n }\r\n }\r\n }\r\n\r\n private getPolygonClassName(props: any): string {\r\n if (props.FeatureType) {\r\n return 'map-area';\r\n }\r\n if (props.ObservationsCount < 10) return 'map-heat-low';\r\n if (props.ObservationsCount < 500) return 'map-heat-small';\r\n return 'map-heat-high';\r\n }\r\n\r\n private getMapBoundsToBbox(bounds: Leaflet.LatLngBounds): number[] {\r\n return [\r\n bounds.getWest(),\r\n bounds.getSouth(),\r\n bounds.getEast(),\r\n bounds.getNorth()\r\n ];\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.subscriptions.unsubscribe();\r\n }\r\n}","@if(hasBox&&!mapLoading()){\r\n<div class=\"mb-1 d-flex justify-content-between flex-wrap\">\r\n <a [routerLink]=\"[]\" [queryParams]=\"{bbox:null,z:null}\" queryParamsHandling=\"merge\" class=\"d-flex gap-1 align-items-baseline\">\r\n <span class=\"fas fa-chevron-left\"></span>\r\n Tillbaka upp\r\n </a>\r\n</div>\r\n}\r\n@if(error){\r\n<div class=\"alert alert-danger\">\r\n {{'ERROR.SERVER_ERROR'|translate}}\r\n</div>\r\n}\r\n<div [class.loading]=\"mapLoading()\">\r\n <div [id]=\"mapId\" class=\"mb-1 map-container\"></div>\r\n</div>\r\n<div class=\"mb-1 d-flex gap-3 justify-content-between flex-wrap\">\r\n @if (!mapLoading()&&count) {\r\n <div class=\"d-flex align-items-center gap-1\">\r\n <div class=\"legend map-heat-low\"></div>\r\n &lt;10\r\n </div>\r\n <div class=\"d-flex align-items-center gap-1\">\r\n <div class=\"legend map-heat-medium\"></div>\r\n 10 - 500\r\n </div>\r\n <div class=\"d-flex align-items-center gap-1\">\r\n <div class=\"legend map-heat-high\"></div>\r\n &gt;500\r\n </div>\r\n <div class=\"ms-auto\">\r\n {{count|adbSpacing}} {{'OBSERVATION.OBSERVATIONS'|translate}}\r\n </div>\r\n }\r\n</div>","export const DateTypes = {\r\n THIS_YEAR: '1',\r\n LAST_YEAR: '2',\r\n ALL_YEAR: '3',\r\n LAST_5_YEAR: '4',\r\n LAST_25_YEAR: '5',\r\n CUSTOM: '6',\r\n}","import { ChangeDetectorRef, Component, Input, OnDestroy, OnInit } from \"@angular/core\";\r\nimport { FormArray, FormControl, FormGroup, Validators } from \"@angular/forms\";\r\nimport { ActivatedRoute, ParamMap, Params, Router } from \"@angular/router\";\r\nimport { addYears, endOfDay, endOfYear, parseISO, startOfDay, startOfYear } from \"date-fns\";\r\nimport { combineLatest, debounceTime, map, Subscription } from \"rxjs\";\r\nimport { AdbMapConfigService, VisibleFilters } from \"../config\";\r\nimport { HttpClient } from \"@angular/common/http\";\r\nimport { GeoJsonFeature } from \"../models\";\r\nimport { DateTypes } from \"../constants\";\r\n\r\n@Component({\r\n selector: 'adb-map-filters',\r\n templateUrl: 'map-filter.html',\r\n standalone: false\r\n})\r\nexport class AdbMapFilters implements OnInit, OnDestroy {\r\n @Input() inline = false;\r\n static datasets = ['1', '3', '5', '6', '4', '8'];\r\n \r\n subscriptions = new Subscription();\r\n form: FormGroup;\r\n thisYear = new Date();\r\n lastYear = addYears(new Date(), -1);\r\n queryParamsMap: ParamMap;\r\n hasOwnArea: boolean;\r\n geo: GeoJsonFeature;\r\n area: { areaType: string; featureId: string; };\r\n areasArray: FormArray<any>;\r\n dataSetCount: number;\r\n taxonListCount: number;\r\n riskListCount: number;\r\n redListCount: number;\r\n areaCount: number;\r\n periodCount: number;\r\n listsError: any;\r\n filters: VisibleFilters;\r\n taxaLists: any[];\r\n hasTaxonInUrlParameter: any;\r\n dsControls: any;\r\n dateStartConfig: { maxDate: Date; };\r\n dateEndConfig: { minDate: Date; maxDate: Date; };\r\n artfakta: string;\r\n\r\n constructor(\r\n private cdr: ChangeDetectorRef,\r\n private config: AdbMapConfigService,\r\n private http: HttpClient,\r\n private router: Router,\r\n private activatedRoute: ActivatedRoute) {\r\n this.filters = config.filters;\r\n this.artfakta = this.config.artfaktaTaxonLists;\r\n }\r\n\r\n ngOnInit(): void {\r\n const lists$ = this.http.get<any[]>(this.config.taxaListsApi, { params: { limit: -1 } });\r\n const combined$ = combineLatest([this.activatedRoute.paramMap, this.activatedRoute.queryParamMap, lists$])\r\n .pipe(map(results => ({ params: results[0], qParams: results[1], lists: results[2] })), debounceTime(0));\r\n this.subscriptions.add(combined$.subscribe(result => {\r\n this.form = this.createForm(result.params, result.qParams, result.lists);\r\n this.cdr.markForCheck();\r\n }));\r\n }\r\n\r\n removeArea(index: number): void {\r\n (this.form.get('areas') as FormArray).removeAt(index);\r\n this.form.markAsDirty();\r\n }\r\n\r\n addArea(): void {\r\n const areas = this.form.get('areas') as FormArray;\r\n areas.push(new FormControl(null));\r\n this.form.updateValueAndValidity();\r\n this.form.markAsDirty();\r\n }\r\n\r\n onSubmit(): void {\r\n const data = this.form.value;\r\n let params = {} as any;\r\n params.p = data.period ?? null;\r\n if (data.period === DateTypes.THIS_YEAR) {\r\n params.startAt = startOfYear(this.thisYear).toISOString();\r\n params.endAt = null;\r\n } else if (data.period === DateTypes.LAST_YEAR) {\r\n params.startAt = startOfYear(this.lastYear).toISOString();\r\n params.endAt = endOfYear(this.lastYear).toISOString();\r\n } else if (data.period === DateTypes.ALL_YEAR) {\r\n params.startAt = null;\r\n params.endAt = null;\r\n params.p = null;\r\n } else if (data.period === DateTypes.LAST_5_YEAR) {\r\n params.startAt = startOfYear(addYears(new Date(), -5)).toISOString();\r\n params.endAt = null;\r\n } else if (data.period === DateTypes.LAST_25_YEAR) {\r\n params.startAt = startOfYear(addYears(new Date(), -25)).toISOString();\r\n params.endAt = null;\r\n } else if (data.period === DateTypes.CUSTOM) {\r\n params.startAt = startOfDay(data.startAt).toISOString();\r\n params.endAt = endOfDay(data.endAt).toISOString();\r\n }\r\n if (this.hasOwnArea && data.geo) {\r\n params.geo = JSON.stringify(data.geo.geometry?.coordinates[0]);\r\n }\r\n const cleaned = data.areas?.filter(v => v != null && v !== '');\r\n if (cleaned.length > 0) {\r\n params.area = cleaned;\r\n }\r\n if (this.activatedRoute.snapshot.paramMap.has('taxonId')) {\r\n params.taxonId = this.activatedRoute.snapshot.paramMap.get('taxonId')\r\n } else {\r\n params.taxonId = data.taxonId ?? null;\r\n }\r\n if (data.list?.length > 0) {\r\n params.list = data.list;\r\n }\r\n if (data.ds?.length > 0) {\r\n const selected = data.ds.filter(f => f.selected).map(m => m.id);\r\n params.ds = selected.length ? selected : null;\r\n }\r\n this.router.navigate([], { queryParams: params, relativeTo: this.activatedRoute })\r\n }\r\n\r\n private createForm(params: Params, qMap: ParamMap, lists: any[]): FormGroup {\r\n this.hasTaxonInUrlParameter = params['taxonId'];\r\n this.hasOwnArea = qMap.has('geo') && this.filters.showOwnArea;\r\n const areas = qMap.getAll('area').filter(a => a != null && a.trim() !== '' && a.includes('-'));\r\n const form: FormGroup = new FormGroup({\r\n period: new FormControl(qMap.has('p') ? qMap.get('p') : '3'),\r\n areas: new FormArray(\r\n (Array.isArray(areas) && areas.length ? areas : [null]).map(a => new FormControl(a))\r\n ),\r\n geo: new FormControl(qMap.has('geo') ? {\r\n type: 'Feature',\r\n geometry: { type: 'Polygon', coordinates: [JSON.parse(qMap.get('geo'))] }\r\n } : null)\r\n });\r\n this.areasArray = form.get('areas') as FormArray;\r\n this.periodCount = qMap.has('p') && qMap.get('p') !== '3' ? 1 : 0;\r\n this.areaCount = areas?.length;\r\n if (!this.hasTaxonInUrlParameter) {\r\n form.addControl('taxonId', new FormControl(qMap.get('taxonId') ?? null));\r\n const selectedTaxonList = qMap.has('list') ? qMap.getAll('list').map(val => Number(val)).filter(val => !isNaN(val)) : null;\r\n this.taxaLists = lists;\r\n this.taxonListCount = selectedTaxonList?.length;\r\n form.addControl('list', new FormControl(selectedTaxonList))\r\n let datasets = qMap.has('ds') ? (Array.isArray(qMap.getAll('ds')) ? qMap.getAll('ds') : [qMap.get('ds')]) : null;\r\n this.dataSetCount = datasets?.length;\r\n form.addControl('ds', new FormArray(\r\n AdbMapFilters.datasets.map(id => new FormGroup({\r\n id: new FormControl(id),\r\n selected: new FormControl(datasets?.includes(id))\r\n }))\r\n ));\r\n this.dsControls = (form.get('ds') as FormArray).controls;\r\n }\r\n this.updateCustomDate(form, qMap.get('p'), qMap);\r\n this.subscriptions.add(form.get('period').valueChanges.subscribe(period => {\r\n this.updateCustomDate(form, period, qMap);\r\n }));\r\n return form;\r\n }\r\n\r\n private updateCustomDate(form: FormGroup, period: string, qMap: ParamMap): void {\r\n if (form.contains('startAt')) {\r\n form.removeControl('startAt');\r\n }\r\n if (form.contains('endAt')) {\r\n form.removeControl('endAt');\r\n }\r\n if (period === DateTypes.CUSTOM) {\r\n let start = qMap.has('startAt') ? parseISO(qMap.get('startAt')) : null;\r\n let end = qMap.has('endAt') ? parseISO(qMap.get('endAt')) : null;\r\n if (qMap.get('p') !== DateTypes.CUSTOM) {\r\n start = new Date();\r\n end = new Date();\r\n }\r\n this.dateStartConfig = { maxDate: end ?? new Date() };\r\n this.dateEndConfig = { minDate: start ?? null, maxDate: new Date() };\r\n const startControl = new FormControl(start, Validators.required);\r\n const endControl = new FormControl(end, Validators.required);\r\n form.addControl('startAt', startControl);\r\n form.addControl('endAt', endControl);\r\n this.subscriptions.add(\r\n startControl.valueChanges.subscribe(startAt => {\r\n this.dateEndConfig = { minDate: startAt ?? null, maxDate: new Date() };\r\n })\r\n );\r\n this.subscriptions.add(\r\n endControl.valueChanges.subscribe(endAt => {\r\n this.dateStartConfig = { maxDate: endAt ?? new Date() };\r\n })\r\n );\r\n }\r\n }\r\n\r\n\r\n ngOnDestroy(): void {\r\n this.subscriptions.unsubscribe();\r\n }\r\n}","@if(form){\r\n<form [formGroup]=\"form\" class=\"form mb-3\" (ngSubmit)=\"onSubmit()\">\r\n <div class=\"mb-3\">\r\n <adb-filter-section titleResource=\"TAXON.TAXA\" [expanded]=\"true\">\r\n @if(filters.showTaxon&&!hasTaxonInUrlParameter){\r\n <div class=\"mb-3\">\r\n <label for=\"species\">{{'TAXON.TAXON'|translate}}</label>\r\n <adb-taxon-picker formControlName=\"taxonId\" id=\"species\"></adb-taxon-picker>\r\n </div>\r\n }\r\n </adb-filter-section>\r\n @if(filters.showTime){\r\n <adb-filter-section [count]=\"periodCount\" titleResource=\"OBSERVATION.PERIOD\">\r\n <div class=\"mb-1\">\r\n <select class=\"form-select\" formControlName=\"period\" id=\"period\">\r\n <option value=\"1\">{{thisYear|date:'yyyy'}}</option>\r\n <option value=\"2\">{{lastYear|date:'yyyy'}}</option>\r\n <option value=\"3\">{{'OBSERVATION.ALL_YEAR'|translate}}</option>\r\n <option value=\"4\">{{'OBSERVATION.LAST_5_YEAR'|translate}}</option>\r\n <option value=\"5\">{{'OBSERVATION.LAST_25_YEAR'|translate}}</option>\r\n <option value=\"6\">{{'OBSERVATION.CUSTOMIZED'|translate}}</option>\r\n </select>\r\n </div>\r\n @if (form.value?.period==='6') {\r\n <div class=\"mb-2\">\r\n <label for=\"startAt\">{{'FROM' |translate}}</label>\r\n <input adbDatepicker type=\"text\" class=\"form-control datepicker\" id=\"startAt\" formControlName=\"startAt\" [settings]=\"dateStartConfig\">\r\n </div>\r\n <div class=\"mb-2\">\r\n <label for=\"endAt\">{{'TO' |translate}}</label>\r\n <input adbDatepicker type=\"text\" class=\"form-control datepicker\" id=\"endAt\" formControlName=\"endAt\" [settings]=\"dateEndConfig\">\r\n </div>\r\n }\r\n </adb-filter-section>\r\n }\r\n @if(filters.showArea){\r\n <adb-filter-section [count]=\"areaCount\" titleResource=\"GEOGRAPHY\" [lazy]=\"true\">\r\n <ng-template>\r\n @if(filters.showOwnArea){\r\n <div role=\"tablist\" aria-label=\"{{'AREA'|translate}}\" class=\"d-flex gap-2 justify-content-end\">\r\n <button class=\"btn btn-link p-0\" [class.text-dark]=\"!hasOwnArea\" (click)=\"hasOwnArea=false\" role=\"tab\" id=\"tab-select\" aria-selected=\"{{!hasOwnArea}}\" aria-controls=\"panel-select\">\r\n {{'CHOOSE'|translate}}\r\n </button>\r\n <button class=\"btn btn-link p-0\" [class.text-dark]=\"hasOwnArea\" (click)=\"hasOwnArea=true\" role=\"tab\" id=\"tab-draw\" aria-selected=\"false\" aria-controls=\"panel-draw\">\r\n {{'OWN_AREA'|translate}}\r\n </button>\r\n </div>\r\n }\r\n <div class=\"mb-2\">\r\n @if(hasOwnArea&&filters.showOwnArea){\r\n <div class=\"pt-1\" role=\"tabpanel\" id=\"area-draw\" aria-labelledby=\"tab-draw\">\r\n <div>\r\n <adb-polygon-drawer formControlName=\"geo\"></adb-polygon-drawer>\r\n </div>\r\n </div>\r\n }@else{\r\n <div role=\"tabpanel\" id=\"area-select\" aria-labelledby=\"tab-select\">\r\n <div formArrayName=\"areas\">\r\n <div class=\"d-flex align-items-end mb-1\">\r\n <label>{{'AREAS'|translate}}</label>\r\n <button class=\"ms-auto text-dark btn btn-sm btn-secondary\" attr.aria-label=\"{{'OBSERVATION.ADD_AREA'|translate}}\" title=\"{{'OBSERVATION.ADD_AREA'|translate}}\" type=\"button\" (click)=\"addArea()\">\r\n <span class=\"fas fa-plus\"></span>\r\n </button>\r\n </div>\r\n @for (ctrl of areasArray.controls; track ctrl; let i = $index; let last = $last) {\r\n <div class=\"d-flex mb-2\">\r\n <adb-area-picker id=\"area-{{i}}\" [formControlName]=\"i\"></adb-area-picker>\r\n @if(areasArray.length>1){\r\n <button class=\"btn btn-secondary ms-1\" attr.aria-label=\"{{'DELETE'|translate}}\" title=\"{{'DELETE'|translate}}\" type=\"button\" (click)=\"removeArea(i)\">\r\n <span class=\"fas fa-trash\"></span>\r\n </button>\r\n }\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n </ng-template>\r\n </adb-filter-section>\r\n }\r\n @if(form.get('taxonId')){\r\n @if(filters.showTaxaLists){\r\n <adb-filter-section [count]=\"taxonListCount\" titleResource=\"LISTS.NATURE_CONSERVATION_LISTS\">\r\n <div class=\"mb-3\">\r\n <app-treeview formControlName=\"list\" [nodes]=\"taxaLists\"></app-treeview>\r\n </div>\r\n {{'LISTS.READ_MORE'|translate}}\r\n <a [href]=\"artfakta\">{{'LISTS.LIST_CONTENT'|translate}}</a>\r\n </adb-filter-section>\r\n }\r\n @if(filters.showDatasets){\r\n <adb-filter-section [count]=\"dataSetCount\" titleResource=\"DATASET.DATASETS\">\r\n @if (form.get('ds')) {\r\n <div formArrayName=\"ds\">\r\n @for (item of dsControls; track item; let i = $index) {\r\n <div [formGroupName]=\"i\" class=\"form-check\">\r\n <input type=\"checkbox\" formControlName=\"selected\" [id]=\"'ds-' + item.value.id\" class=\"form-check-input\">\r\n <label [for]=\"'ds-' + item.value.id\" class=\"form-check-label\">{{ 'PROVIDERS.'+item.value.id |translate }}</label>\r\n </div>\r\n }\r\n </div>\r\n }\r\n </adb-filter-section>\r\n }\r\n }\r\n </div>\r\n <div class=\"d-flex justify-content-end gap-2\">\r\n @if (inline) {\r\n <a class=\"btn btn-secondary\" [routerLink]=\"[]\">\r\n {{'CANCEL'|translate}}\r\n </a>\r\n }\r\n <button type=\"submit\" class=\"btn btn-primary\" [disabled]=\"form.invalid||form.pristine\">{{'FILTER'|translate}}</button>\r\n </div>\r\n</form>\r\n}","import { CommonModule } from \"@angular/common\";\r\nimport { ModuleWithProviders, NgModule } from \"@angular/core\";\r\nimport { FormsModule, ReactiveFormsModule } from \"@angular/forms\";\r\nimport { TranslateModule } from \"@ngx-translate/core\";\r\nimport { PolygonDrawerInput } from \"./components/polygon-drawer.component\";\r\nimport { RouterModule } from \"@angular/router\";\r\nimport { ADB_MAP_CONFIG, AdbMapConfig, AdbMapConfigService } from \"./config\";\r\nimport { TreeviewComponent } from \"./components/treeview\";\r\nimport { AdbObsMapComponent } from \"./components/observations-map\";\r\nimport { AdbMapFilters } from \"./components/map-filter\";\r\nimport { AdbDatePickerModule } from 'adb-shared';\r\nimport { AdbPipesModule } from 'adb-shared';\r\nimport { AdbFilterSectionModule } from 'adb-shared';\r\nimport { AdbPickerModule } from 'adb-shared';\r\n\r\n@NgModule({\r\n imports: [\r\n CommonModule,\r\n FormsModule,\r\n RouterModule,\r\n ReactiveFormsModule,\r\n AdbDatePickerModule,\r\n TranslateModule.forChild(),\r\n AdbPipesModule,\r\n AdbFilterSectionModule,\r\n AdbPickerModule\r\n ],\r\n declarations: [\r\n AdbObsMapComponent,\r\n PolygonDrawerInput,\r\n AdbMapFilters,\r\n TreeviewComponent,\r\n // Stats,\r\n // AdbGeojsonPolygonDirective\r\n ],\r\n exports: [\r\n AdbObsMapComponent,\r\n PolygonDrawerInput,\r\n AdbMapFilters,\r\n // Stats,\r\n // AdbGeojsonPolygonDirective\r\n ],\r\n providers: [\r\n AdbMapConfigService\r\n ]\r\n})\r\nexport class AdbMapModule {\r\n static forRoot(config?: AdbMapConfig): ModuleWithProviders<AdbMapModule> {\r\n return {\r\n ngModule: AdbMapModule,\r\n providers: [\r\n {\r\n provide: ADB_MAP_CONFIG,\r\n useValue: config\r\n }\r\n ]\r\n };\r\n }\r\n}","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["Leaflet","i1","i2.AdbMapConfigService","i4","i1.AdbMapConfigService","i2","i3","i6.PolygonDrawerInput","i7.TreeviewComponent","i8","i9"],"mappings":"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"}