From 519e5c903249fd51d049604a4a4029fa0a7f7ebf Mon Sep 17 00:00:00 2001 From: Willem Dantuma Date: Wed, 21 Jul 2021 11:17:15 +0200 Subject: [PATCH 01/12] Make zoom-to padding configurable per route --- package-lock.json | 54 +++++++++---------- package.json | 6 +-- .../zoom-to-extent.component.ts | 17 +++++- 3 files changed, 45 insertions(+), 32 deletions(-) diff --git a/package-lock.json b/package-lock.json index 4faf6b0..23b404e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1657,9 +1657,9 @@ "dev": true }, "postcss": { - "version": "7.0.35", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", - "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "version": "7.0.36", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", + "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", "dev": true, "requires": { "chalk": "^2.4.2", @@ -4079,25 +4079,25 @@ "dev": true }, "@farmmaps/common": { - "version": "1.0.1", - "resolved": "https://repository.akkerweb.nl/repository/npm-group/@farmmaps/common/-/common-1.0.1.tgz", - "integrity": "sha512-ZVj+/0dVSNT1TtU+ExBFyak/Hfl8hKl5RnBWux6+v7GyHJYyaYDotbSPhszoNm6Mrz7Lt0pifCja1vUKL8w5sQ==", + "version": "1.1.1-prerelease.2020", + "resolved": "https://repository.akkerweb.nl/repository/npm-group/@farmmaps/common/-/common-1.1.1-prerelease.2020.tgz", + "integrity": "sha512-CTY27FyQoA49VJAja3PIpdRkWo2oLSxoFbVdGU3Oz3dPA3KqyMqplsiAfobrqWwsZ4SjA2r25O+92wuqA8aehA==", "requires": { "tslib": "^2.0.0" } }, "@farmmaps/common-map": { - "version": "1.0.1", - "resolved": "https://repository.akkerweb.nl/repository/npm-group/@farmmaps/common-map/-/common-map-1.0.1.tgz", - "integrity": "sha512-yWBM/F0RLvb6hG0QEREBamYOeaPUjIYUw2tazlQoXzVtGeNm/8S0p+3l6Uw6U3z35Zk7/Ptaeb7nXsK6dOGgWg==", + "version": "1.1.1-prerelease.2020", + "resolved": "https://repository.akkerweb.nl/repository/npm-group/@farmmaps/common-map/-/common-map-1.1.1-prerelease.2020.tgz", + "integrity": "sha512-X2HBpdd4BrYFxo2pkGSK2xFIwSgBVaEzZLAmaoQ44k2loAhCIhp2aWHw88WNGxzVHeUQFToM+1aKza/zTx0VVw==", "requires": { "tslib": "^2.0.0" } }, "@farmmaps/common-map3d": { - "version": "1.0.1", - "resolved": "https://repository.akkerweb.nl/repository/npm-group/@farmmaps/common-map3d/-/common-map3d-1.0.1.tgz", - "integrity": "sha512-7aD/d1s35l8QwUPn4Z4LwxoRE4qhW+1KBAxcXEorIoc4pFTR04Mx+WoYJgTYXaOjAayPjTUM7K+bpR6d0uCqMA==", + "version": "1.1.1-prerelease.2020", + "resolved": "https://repository.akkerweb.nl/repository/npm-group/@farmmaps/common-map3d/-/common-map3d-1.1.1-prerelease.2020.tgz", + "integrity": "sha512-sFw1aHFFlVjuJD6Fddo3PMMyoNXal8n0aDRDQaWXkv+CvM5HME9Fo3QnfjvKhd96fbek93C20gTCUPzUhHBK4g==", "requires": { "tslib": "^2.0.0" } @@ -9897,9 +9897,9 @@ } }, "lodash": { - "version": "4.17.20", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", - "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==", + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", "dev": true }, "lodash.memoize": { @@ -11633,9 +11633,9 @@ "dev": true }, "postcss": { - "version": "7.0.32", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.32.tgz", - "integrity": "sha512-03eXong5NLnNCD05xscnGKGDZ98CyzoqPSMjOe6SuoQY7Z2hIj0Ld1g/O/UQRuOle2aRtiIRDg9tDcTGAkLfKw==", + "version": "7.0.36", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", + "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", "dev": true, "requires": { "chalk": "^2.4.2", @@ -14717,9 +14717,9 @@ } }, "url-parse": { - "version": "1.4.7", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.4.7.tgz", - "integrity": "sha512-d3uaVyzDB9tQoSXFvuSUNFibTd9zxd2bkVrDRvF5TmvWWQwqE4lgYJ5m+x1DbecWkw+LK4RNl2CU1hHuOKPVlg==", + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.1.tgz", + "integrity": "sha512-HOfCOUJt7iSYzEx/UqgtwKRMC6EU91NFhsCHMv9oM03VJcVo2Qrp8T8kI9D7amFf1cu+/3CEhgb3rF9zL7k85Q==", "requires": { "querystringify": "^2.1.1", "requires-port": "^1.0.0" @@ -15303,9 +15303,9 @@ "dev": true }, "ws": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.1.tgz", - "integrity": "sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA==", + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.2.tgz", + "integrity": "sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw==", "requires": { "async-limiter": "~1.0.0" } @@ -15342,9 +15342,9 @@ } }, "y18n": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", - "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", "dev": true }, "yallist": { diff --git a/package.json b/package.json index 7be3772..2764cfb 100644 --- a/package.json +++ b/package.json @@ -19,9 +19,9 @@ "@angular/platform-browser": "~11.2.14", "@angular/platform-browser-dynamic": "~11.2.14", "@angular/router": "~11.2.14", - "@farmmaps/common": "~1.0", - "@farmmaps/common-map": "~1.0", - "@farmmaps/common-map3d": "~1.0", + "@farmmaps/common": "1.1.1-prerelease.2020", + "@farmmaps/common-map": "1.1.1-prerelease.2020", + "@farmmaps/common-map3d": "1.1.1-prerelease.2020", "@microsoft/signalr": "^3.1.16", "@ng-bootstrap/ng-bootstrap": "^9.0", "@ngrx/effects": "^11.0", diff --git a/projects/common-map/src/fm-map/components/aol/zoom-to-extent/zoom-to-extent.component.ts b/projects/common-map/src/fm-map/components/aol/zoom-to-extent/zoom-to-extent.component.ts index 5be8b08..714d2bd 100644 --- a/projects/common-map/src/fm-map/components/aol/zoom-to-extent/zoom-to-extent.component.ts +++ b/projects/common-map/src/fm-map/components/aol/zoom-to-extent/zoom-to-extent.component.ts @@ -1,4 +1,5 @@ import { Component, Host, Input, OnInit, OnChanges, SimpleChanges, forwardRef } from '@angular/core'; +import { ActivatedRoute } from '@angular/router'; import { ViewComponent, MapComponent } from 'ngx-openlayers'; @@ -9,12 +10,24 @@ import { ViewComponent, MapComponent } from 'ngx-openlayers'; export class ZoomToExtentComponent implements OnChanges { view: ViewComponent; map: MapComponent; + paddingTop: number = 0; + paddingLeft: number = 0; + paddingBottom: number = 0; + paddingRight: number = 0; + @Input() extent: number[]; @Input() animate: boolean = false; - constructor(@Host() view: ViewComponent, @Host() map: MapComponent) { + constructor(@Host() view: ViewComponent, @Host() map: MapComponent,route: ActivatedRoute ) { this.view = view; this.map = map; + if(route && route.snapshot && route.snapshot.data && route.snapshot.data["fm-map-zoom-to-extent"]) { + let params = route.snapshot.data["fm-map-zoom-to-extent"]; + this.paddingTop = params["padding-top"] ? params["padding-top"] : 0; + this.paddingBottom = params["padding-bottom"] ? params["padding-bottom"] : 0; + this.paddingLeft = params["padding-left"] ? params["padding-left"] : 0; + this.paddingRight = params["padding-right"] ? params["padding-right"] : 0; + } } ngOnChanges(changes: SimpleChanges) { @@ -31,7 +44,7 @@ export class ZoomToExtentComponent implements OnChanges { bottom = 5 * rem; left = 23 * rem; } - options.padding = [top, right, bottom, left]; + options.padding = [top + (this.paddingTop*rem), right+ (this.paddingRight*rem), bottom + (this.paddingBottom*rem), left+ (this.paddingLeft*rem)]; if (this.animate) options["duration"] = 1000; this.view.instance.fit(this.extent, options); } From 3fcf80c1a005a251607b8f24e3fad1952a5b3fba Mon Sep 17 00:00:00 2001 From: Willem Dantuma Date: Mon, 26 Jul 2021 21:53:55 +0200 Subject: [PATCH 02/12] Add override route parameters --- .../src/fm-map/components/map/map.component.html | 4 ++-- .../common-map/src/fm-map/components/map/map.component.ts | 7 +++++++ 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/projects/common-map/src/fm-map/components/map/map.component.html b/projects/common-map/src/fm-map/components/map/map.component.html index 73f3750..4d32049 100644 --- a/projects/common-map/src/fm-map/components/map/map.component.html +++ b/projects/common-map/src/fm-map/components/map/map.component.html @@ -33,8 +33,8 @@ - - + + diff --git a/projects/common-map/src/fm-map/components/map/map.component.ts b/projects/common-map/src/fm-map/components/map/map.component.ts index c17ba87..214447b 100644 --- a/projects/common-map/src/fm-map/components/map/map.component.ts +++ b/projects/common-map/src/fm-map/components/map/map.component.ts @@ -84,6 +84,8 @@ export class MapComponent implements OnInit, OnDestroy,AfterViewInit { private lastUrl = ""; private initialized: boolean = false; public noContent: boolean = false; + public overrideSelectedItemLayer: boolean = false; + public overrideOverlayLayers: boolean = false; @ViewChild('map') map; @ViewChild('contentDiv') contentDiv: ElementRef; @@ -99,6 +101,11 @@ export class MapComponent implements OnInit, OnDestroy,AfterViewInit { private zone: NgZone, private deviceorientationService:DeviceOrientationService, public devicesService:DeviceService) { + if(route && route.snapshot && route.snapshot.data && route.snapshot.data["fm-map-map"]) { + let params = route.snapshot.data["fm-map-map"]; + this.overrideSelectedItemLayer = params["overrideSelectedItemlayer"] ? params["overrideSelectedItemlayer"] : false; + this.overrideOverlayLayers = params["overrideOverlayLayers"] ? params["overrideOverlayLayers"] : false; + } this.querySub = this.query$.pipe(skip(1), withLatestFrom(this.mapState$)).subscribe(([queryState,mapState]) =>{ if(queryState) { let newQueryState = tassign(mapReducers.initialQueryState); From 5c549c58519d4aa3f60c5ebfea5836b501a1eb1e Mon Sep 17 00:00:00 2001 From: Willem Dantuma Date: Tue, 27 Jul 2021 08:51:56 +0200 Subject: [PATCH 03/12] Use route parameters here also --- .../common-map/src/fm-map/effects/map.effects.ts | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/projects/common-map/src/fm-map/effects/map.effects.ts b/projects/common-map/src/fm-map/effects/map.effects.ts index edf501e..abf6ba0 100644 --- a/projects/common-map/src/fm-map/effects/map.effects.ts +++ b/projects/common-map/src/fm-map/effects/map.effects.ts @@ -1,4 +1,5 @@ import { Injectable } from '@angular/core'; +import { ActivatedRoute } from '@angular/router'; import { Store, Action } from '@ngrx/store'; import { Effect, Actions,ofType } from '@ngrx/effects'; @@ -34,6 +35,8 @@ import { TemporalItemLayer } from '../models/item.layer' export class MapEffects { private _geojsonFormat: GeoJSON; private _wktFormat: WKT; + public _overrideSelectedItemLayer: boolean = false; + public _overrideOverlayLayers: boolean = false; private toPointFeature(updateEvent:commonActions.DeviceUpdateEvent): Feature { var f = this._wktFormat.readFeature(updateEvent.attributes["geometry"],{ @@ -138,7 +141,7 @@ export class MapEffects { let actions =[]; actions.push(new commonActions.SetMenuVisible(false)); let extent = createEmpty(); - if (!action.query.bboxFilter) { + if (!action.query.bboxFilter && !this._overrideSelectedItemLayer) { if (extent) { for (let f of action.features) { extend(extent, (f as Feature).getGeometry().getExtent()); @@ -386,8 +389,13 @@ export class MapEffects { } })); - constructor(private actions$: Actions, private store$: Store, private folderService$: FolderService, private itemService$: ItemService,private featureIconService$:FeatureIconService,private itemTypeService$:ItemTypeService) { + constructor(private actions$: Actions, private store$: Store, private folderService$: FolderService, private itemService$: ItemService,private featureIconService$:FeatureIconService,private itemTypeService$:ItemTypeService, private route: ActivatedRoute) { this._geojsonFormat = new GeoJSON(); this._wktFormat = new WKT(); - } + if(route && route.snapshot && route.snapshot.data && route.snapshot.data["fm-map-map"]) { + let params = route.snapshot.data["fm-map-map"]; + this._overrideSelectedItemLayer = params["overrideSelectedItemlayer"] ? params["overrideSelectedItemlayer"] : false; + this._overrideOverlayLayers = params["overrideOverlayLayers"] ? params["overrideOverlayLayers"] : false; + } + } } From 122c49d516de8bf323395595dae079e435c95f39 Mon Sep 17 00:00:00 2001 From: Willem Dantuma Date: Tue, 27 Jul 2021 09:16:58 +0200 Subject: [PATCH 04/12] Move the check here --- .../src/fm-map/effects/map.effects.ts | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/projects/common-map/src/fm-map/effects/map.effects.ts b/projects/common-map/src/fm-map/effects/map.effects.ts index abf6ba0..75ebba4 100644 --- a/projects/common-map/src/fm-map/effects/map.effects.ts +++ b/projects/common-map/src/fm-map/effects/map.effects.ts @@ -211,13 +211,17 @@ export class MapEffects { selectItemSuccess$: Observable = this.actions$.pipe( ofType(mapActions.SELECTITEMSUCCESS), switchMap((action:mapActions.SelectItemSuccess) => { - return this.itemService$.getFeature(action.item.code, "EPSG:3857").pipe( - map((feature: any) => { - let f = this._geojsonFormat.readFeature(feature); - f.setId(action.item.code); - return new mapActions.AddFeatureSuccess(f ); - }), - catchError(error => of(new commonActions.Fail(error)))); + if(!this._overrideSelectedItemLayer) { + return this.itemService$.getFeature(action.item.code, "EPSG:3857").pipe( + map((feature: any) => { + let f = this._geojsonFormat.readFeature(feature); + f.setId(action.item.code); + return new mapActions.AddFeatureSuccess(f ); + }), + catchError(error => of(new commonActions.Fail(error)))); + } else { + return EMPTY; + } } )); From 76c431b9c28979a22209723db14f183b20800c67 Mon Sep 17 00:00:00 2001 From: Willem Dantuma Date: Tue, 27 Jul 2021 09:31:14 +0200 Subject: [PATCH 05/12] Use latest snapshot --- .../src/fm-map/effects/map.effects.ts | 20 +++++++++---------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/projects/common-map/src/fm-map/effects/map.effects.ts b/projects/common-map/src/fm-map/effects/map.effects.ts index 75ebba4..c635a83 100644 --- a/projects/common-map/src/fm-map/effects/map.effects.ts +++ b/projects/common-map/src/fm-map/effects/map.effects.ts @@ -35,8 +35,6 @@ import { TemporalItemLayer } from '../models/item.layer' export class MapEffects { private _geojsonFormat: GeoJSON; private _wktFormat: WKT; - public _overrideSelectedItemLayer: boolean = false; - public _overrideOverlayLayers: boolean = false; private toPointFeature(updateEvent:commonActions.DeviceUpdateEvent): Feature { var f = this._wktFormat.readFeature(updateEvent.attributes["geometry"],{ @@ -141,7 +139,7 @@ export class MapEffects { let actions =[]; actions.push(new commonActions.SetMenuVisible(false)); let extent = createEmpty(); - if (!action.query.bboxFilter && !this._overrideSelectedItemLayer) { + if (!action.query.bboxFilter) { if (extent) { for (let f of action.features) { extend(extent, (f as Feature).getGeometry().getExtent()); @@ -211,7 +209,12 @@ export class MapEffects { selectItemSuccess$: Observable = this.actions$.pipe( ofType(mapActions.SELECTITEMSUCCESS), switchMap((action:mapActions.SelectItemSuccess) => { - if(!this._overrideSelectedItemLayer) { + let overrideSelectedItemLayer = false; + if(this.route$ && this.route$.snapshot && this.route$.snapshot.data && this.route$.snapshot.data["fm-map-map"]) { + let params = this.route$.snapshot.data["fm-map-map"]; + overrideSelectedItemLayer = params["overrideSelectedItemlayer"] ? params["overrideSelectedItemlayer"] : false; + } + if(!overrideSelectedItemLayer) { return this.itemService$.getFeature(action.item.code, "EPSG:3857").pipe( map((feature: any) => { let f = this._geojsonFormat.readFeature(feature); @@ -393,13 +396,8 @@ export class MapEffects { } })); - constructor(private actions$: Actions, private store$: Store, private folderService$: FolderService, private itemService$: ItemService,private featureIconService$:FeatureIconService,private itemTypeService$:ItemTypeService, private route: ActivatedRoute) { + constructor(private actions$: Actions, private store$: Store, private folderService$: FolderService, private itemService$: ItemService,private featureIconService$:FeatureIconService,private itemTypeService$:ItemTypeService, private route$: ActivatedRoute) { this._geojsonFormat = new GeoJSON(); - this._wktFormat = new WKT(); - if(route && route.snapshot && route.snapshot.data && route.snapshot.data["fm-map-map"]) { - let params = route.snapshot.data["fm-map-map"]; - this._overrideSelectedItemLayer = params["overrideSelectedItemlayer"] ? params["overrideSelectedItemlayer"] : false; - this._overrideOverlayLayers = params["overrideOverlayLayers"] ? params["overrideOverlayLayers"] : false; - } + this._wktFormat = new WKT(); } } From 28e75d5a0dfdf0ee09947656f7a05264eee63f6a Mon Sep 17 00:00:00 2001 From: Willem Dantuma Date: Tue, 27 Jul 2021 16:26:57 +0200 Subject: [PATCH 06/12] Replace @Effect() with createEffect --- .../src/fm-map/effects/map.effects.ts | 143 +++++++++--------- .../src/fm/effects/app-common.effects.ts | 83 ++++------ src/app/app.module.ts | 9 +- 3 files changed, 111 insertions(+), 124 deletions(-) diff --git a/projects/common-map/src/fm-map/effects/map.effects.ts b/projects/common-map/src/fm-map/effects/map.effects.ts index c635a83..3858d54 100644 --- a/projects/common-map/src/fm-map/effects/map.effects.ts +++ b/projects/common-map/src/fm-map/effects/map.effects.ts @@ -1,11 +1,12 @@ import { Injectable } from '@angular/core'; -import { ActivatedRoute } from '@angular/router'; -import { Store, Action } from '@ngrx/store'; -import { Effect, Actions,ofType } from '@ngrx/effects'; +import { Store, Action,createFeatureSelector } from '@ngrx/store'; +import { ROUTER_NAVIGATED, RouterReducerState } from '@ngrx/router-store'; +import * as fromRouter from '@ngrx/router-store'; +import { createEffect, Actions,ofType } from '@ngrx/effects'; -import { EMPTY, Observable , of,merge} from 'rxjs'; -import { withLatestFrom, switchMap, map, catchError, mergeMap,tap } from 'rxjs/operators'; +import { EMPTY, Observable , of} from 'rxjs'; +import { withLatestFrom, switchMap, map, catchError, mergeMap } from 'rxjs/operators'; import {GeoJSON,WKT} from 'ol/format'; import {Feature} from 'ol'; @@ -30,11 +31,24 @@ import * as style from 'ol/style'; import { ItemTypeService,IQueryState } from '@farmmaps/common'; import { TemporalItemLayer } from '../models/item.layer' +export const getRouterState = createFeatureSelector('router'); + +export const { + selectCurrentRoute, // select the current route + selectQueryParams, // select the current route query params + selectQueryParam, // factory function to select a query param + selectRouteParams, // select the current route params + selectRouteParam, // factory function to select a route param + selectRouteData, // select the current route data + selectUrl, // select the current url +} = fromRouter.getSelectors(getRouterState); + @Injectable() export class MapEffects { private _geojsonFormat: GeoJSON; private _wktFormat: WKT; + private overrideSelectedItemLayer private toPointFeature(updateEvent:commonActions.DeviceUpdateEvent): Feature { var f = this._wktFormat.readFeature(updateEvent.attributes["geometry"],{ @@ -47,8 +61,7 @@ export class MapEffects { return f; } - @Effect() - init$: Observable = this.actions$.pipe( + init$ = createEffect(() => this.actions$.pipe( ofType(mapActions.INIT), withLatestFrom(this.store$.select(commonReducers.selectGetRootItems)), switchMap(([action, rootItems]) => { @@ -88,25 +101,23 @@ export class MapEffects { return actions; } - )); + ))); - @Effect() - initBaseLayers$: Observable = this.actions$.pipe( + initBaseLayers$ = createEffect(() => this.actions$.pipe( ofType(mapActions.INIT), withLatestFrom(this.store$.select(mapReducers.selectGetProjection)), - map(([action, projection]) => new mapActions.LoadBaseLayers(projection))); + map(([action, projection]) => new mapActions.LoadBaseLayers(projection))) + ); - @Effect() - loadBaseLayers$: Observable = this.actions$.pipe( + loadBaseLayers$ = createEffect(() => this.actions$.pipe( ofType(mapActions.LOADBASELAYERS), switchMap((action: mapActions.LoadBaseLayers) => { return this.itemService$.getItemList("vnd.farmmaps.itemtype.layer", { "isBaseLayer": true }).pipe( map((items: IItem[]) => new mapActions.LoadBaseLayersSuccess(items)), catchError(error => of(new commonActions.Fail(error)))); - })); + }))); - @Effect() - startSearch$: Observable = this.actions$.pipe( + startSearch$ = createEffect(() => this.actions$.pipe( ofType(mapActions.STARTSEARCH), switchMap((action) => { let a = action as mapActions.StartSearch; @@ -129,11 +140,10 @@ export class MapEffects { return []; } return newAction; - })); + }))); - @Effect() - zoomToExtent$: Observable = this.actions$.pipe( + zoomToExtent$ = createEffect(() => this.actions$.pipe( ofType(mapActions.STARTSEARCHSUCCESS), mergeMap((action: mapActions.StartSearchSuccess) => { let actions =[]; @@ -150,10 +160,9 @@ export class MapEffects { } } return actions; - })); + }))); - @Effect() - zoomToExtent2$: Observable = this.actions$.pipe( + zoomToExtent2$ = createEffect(() => this.actions$.pipe( ofType(mapActions.SETFEATURES), switchMap((action: mapActions.SetFeatures) => { let extent = createEmpty(); @@ -164,17 +173,15 @@ export class MapEffects { if(action.features.length>0) return of(new mapActions.SetExtent(extent)); } return EMPTY; - })); + }))); - @Effect() - hideMenu$: Observable = this.actions$.pipe( + hideMenu$ = createEffect(() => this.actions$.pipe( ofType(mapActions.STARTSEARCHSUCCESS), mergeMap((action: mapActions.StartSearchSuccess) => { return of(new commonActions.SetMenuVisible(false)); - })); + }))); - @Effect() - selectItem$: Observable = this.actions$.pipe( + selectItem$ = createEffect(() => this.actions$.pipe( ofType(mapActions.SELECTITEM), withLatestFrom(this.store$.select(mapReducers.selectGetSelectedItem)), switchMap(([action, selectedItem]) => { @@ -195,26 +202,19 @@ export class MapEffects { return []; } } - )); + ))); - @Effect() - selectItemSuccessSetLayer$: Observable = this.actions$.pipe( + selectItemSuccessSetLayer$ = createEffect(() => this.actions$.pipe( ofType(mapActions.SELECTITEMSUCCESS), map((action:mapActions.SelectItemSuccess) => new mapActions.SetSelectedItemLayer(action.item) ) - ); + )); - @Effect() - selectItemSuccess$: Observable = this.actions$.pipe( + selectItemSuccess$ = createEffect(() => this.actions$.pipe( ofType(mapActions.SELECTITEMSUCCESS), - switchMap((action:mapActions.SelectItemSuccess) => { - let overrideSelectedItemLayer = false; - if(this.route$ && this.route$.snapshot && this.route$.snapshot.data && this.route$.snapshot.data["fm-map-map"]) { - let params = this.route$.snapshot.data["fm-map-map"]; - overrideSelectedItemLayer = params["overrideSelectedItemlayer"] ? params["overrideSelectedItemlayer"] : false; - } - if(!overrideSelectedItemLayer) { + switchMap((action:mapActions.SelectItemSuccess) => { + if(!this.overrideSelectedItemLayer) { return this.itemService$.getFeature(action.item.code, "EPSG:3857").pipe( map((feature: any) => { let f = this._geojsonFormat.readFeature(feature); @@ -226,10 +226,9 @@ export class MapEffects { return EMPTY; } } - )); + ))); - @Effect() - selectItemSuccessTemporal$: Observable = this.actions$.pipe( + selectItemSuccessTemporal$ = createEffect(() => this.actions$.pipe( ofType(mapActions.SELECTITEMSUCCESS), switchMap((action:mapActions.SelectItemSuccess) => { if(action.item.itemType == "vnd.farmmaps.itemtype.temporal") { @@ -244,16 +243,14 @@ export class MapEffects { return []; } } - )); + ))); - @Effect() - uploadedItemClick$: Observable = this.actions$.pipe( + uploadedItemClick$ = createEffect(() => this.actions$.pipe( ofType(commonActions.UPLOADEDFILECLICK), switchMap((action: commonActions.UploadedFileClick) => of(new mapActions.DoQuery(tassign(mapReducers.initialState.query, {itemCode:action.itemCode}))) - )); + ))); - @Effect() - featureUpdate$: Observable = this.actions$.pipe( + featureUpdate$ = createEffect(() => this.actions$.pipe( ofType(commonActions.DEVICEUPDATEEVENT), withLatestFrom(this.store$.select(mapReducers.selectGetFeatures)), mergeMap(([action, features]) => { @@ -270,10 +267,9 @@ export class MapEffects { } else { return []; } - })); + }))); - @Effect() - itemUpdate$: Observable = this.actions$.pipe( + itemUpdate$ = createEffect(() => this.actions$.pipe( ofType(commonActions.ITEMCHANGEDEVENT), withLatestFrom(this.store$.select(mapReducers.selectGetSelectedItem)), mergeMap(([action, selectedItem]) => { @@ -292,7 +288,7 @@ export class MapEffects { } else { return []; } - })); + }))); getActionFromQueryState(queryState:IQueryState, inSearch:boolean):Observable|[] { if(!inSearch && (queryState.itemType || queryState.parentCode || queryState.itemCode || queryState.query || queryState.tags)) { @@ -309,8 +305,7 @@ export class MapEffects { return of(newAction); } - @Effect() - getLayerValue$: Observable = this.actions$.pipe( + getLayerValue$ = createEffect(() => this.actions$.pipe( ofType(mapActions.GETLAYERVALUE), mergeMap((action:mapActions.GetLayerValue) => { var l = action.itemLayer.item.data["layers"][action.itemLayer.layerIndex]; @@ -334,19 +329,17 @@ export class MapEffects { return a; })) } - )); + ))); - @Effect() - updateLayerValuesOnLayerAddedOrRemoved$: Observable = this.actions$.pipe( + updateLayerValuesOnLayerAddedOrRemoved$ = createEffect(() => this.actions$.pipe( ofType(mapActions.ADDLAYER,mapActions.REMOVELAYER,mapActions.SELECTITEM,mapActions.NEXTTEMPORAL,mapActions.PREVIOUSTEMPORAL,mapActions.TOGGLELAYERVALUESENABLED), withLatestFrom(this.store$.select(mapReducers.selectGetLayerValuesX)), withLatestFrom(this.store$.select(mapReducers.selectGetLayerValuesY)), map(([[action,x],y]) => new mapActions.SetLayerValuesLocation(x,y)) - ); + )); - @Effect() - getLayerValues$: Observable = this.actions$.pipe( + getLayerValues$ = createEffect(() => this.actions$.pipe( ofType(mapActions.SETLAYERVALUESLOCATION), withLatestFrom(this.store$.select(mapReducers.selectGetSelectedItemLayer)), withLatestFrom(this.store$.select(mapReducers.selectGetLayerValuesEnabled)), @@ -372,20 +365,18 @@ export class MapEffects { }); } return actions; - })); + }))); - @Effect() - setState$: Observable = this.actions$.pipe( + setState$ = createEffect(() => this.actions$.pipe( ofType(mapActions.SETSTATE), withLatestFrom(this.store$.select(mapReducers.selectGetInSearch)), switchMap(([action,inSearch]) => { let a = action as mapActions.SetState; return this.getActionFromQueryState(a.queryState,inSearch); - })); + }))); - @Effect() - escape$:Observable = this.actions$.pipe( + escape$ = createEffect(() => this.actions$.pipe( ofType(commonActions.ESCAPE), switchMap((action) => { let a = action as commonActions.Escape; @@ -394,9 +385,21 @@ export class MapEffects { } else { return EMPTY; } - })); + }))); - constructor(private actions$: Actions, private store$: Store, private folderService$: FolderService, private itemService$: ItemService,private featureIconService$:FeatureIconService,private itemTypeService$:ItemTypeService, private route$: ActivatedRoute) { + setOverride$ = createEffect(() => this.actions$.pipe( + ofType(ROUTER_NAVIGATED), + switchMap(() => this.store$.select(selectRouteData as any)), + switchMap((data: any) => { + if(data && data["fm-map-map"]) { + let params = data["fm-map-map"]; + this.overrideSelectedItemLayer = params["overrideSelectedItemlayer"] ? params["overrideSelectedItemlayer"] : false; + } + return []; + }) + )); + + constructor(private actions$: Actions, private store$: Store, private folderService$: FolderService, private itemService$: ItemService,private featureIconService$:FeatureIconService,private itemTypeService$:ItemTypeService) { this._geojsonFormat = new GeoJSON(); this._wktFormat = new WKT(); } diff --git a/projects/common/src/fm/effects/app-common.effects.ts b/projects/common/src/fm/effects/app-common.effects.ts index 9daab8f..a3ae339 100644 --- a/projects/common/src/fm/effects/app-common.effects.ts +++ b/projects/common/src/fm/effects/app-common.effects.ts @@ -1,9 +1,9 @@ import { Injectable } from '@angular/core'; import { Router } from '@angular/router'; import { OAuthService,UserInfo } from 'angular-oauth2-oidc'; -import { Store, Action } from '@ngrx/store'; -import { Effect, Actions,ofType } from '@ngrx/effects'; -import { Observable , defer , of,from,zip } from 'rxjs'; +import { Store } from '@ngrx/store'; +import { Actions,ofType,createEffect } from '@ngrx/effects'; +import { of,from,zip } from 'rxjs'; import { withLatestFrom,mergeMap,switchMap,map,catchError,first} from 'rxjs/operators'; import * as appCommonActions from '../actions/app-common.actions'; import * as appCommonReducers from '../reducers/app-common.reducer'; @@ -12,43 +12,37 @@ import { FolderService } from '../services/folder.service'; import { UserService } from '../services/user.service'; import { IItemTypes } from '../models/item.types'; import { IListItem } from '../models/list.item'; -import { IUser } from '../models/user'; -import {IQueryState} from '../models/query.state'; import {StateSerializerService} from '../services/state-serializer.service'; @Injectable() export class AppCommonEffects { - @Effect({ dispatch: false }) - login$: Observable = this.actions$.pipe( + login$ = createEffect(() => this.actions$.pipe( ofType(appCommonActions.LOGIN), withLatestFrom(this.store$.select(appCommonReducers.selectGetInitialized)), mergeMap(([action, initialized]) => { var a = (action as appCommonActions.Login); this.oauthService$.initCodeFlow(a.url,{"prompt":"login"}); return []; - })); + })),{dispatch:false}); - @Effect({ dispatch: false }) - logout$: Observable = this.actions$.pipe( + logout$ = createEffect(() => this.actions$.pipe( ofType(appCommonActions.LOGOUT), mergeMap((action) => { this.oauthService$.revokeTokenAndLogout(); return []; - })); + })),{dispatch:false}); - @Effect() - loadItemTypes$: Observable = this.actions$.pipe( + loadItemTypes$ = createEffect(() => this.actions$.pipe( ofType(appCommonActions.LOADITEMTYPES), switchMap((action) => { return this.itemService$.getItemTypes().pipe( map((itemTypes: IItemTypes) => new appCommonActions.LoadItemTypesSuccess(itemTypes)), catchError(error => of(new appCommonActions.Fail(error)))) } - )); + ))); - @Effect() - initUser$: Observable = this.actions$.pipe( + initUser$ = createEffect(() => this.actions$.pipe( ofType(appCommonActions.INITUSER), first(), switchMap((action) => { @@ -56,11 +50,10 @@ export class AppCommonEffects { switchMap(([user,userInfo]) => {return of(new appCommonActions.InitUserSuccess(user,userInfo as UserInfo))} ), catchError(error => of(new appCommonActions.Fail(error)))) } - )); + ))); - @Effect() - initUserPackages$:Observable = this.actions$.pipe( + initUserPackages$ = createEffect(() => this.actions$.pipe( ofType(appCommonActions.INITUSERPACKAGES), switchMap(() => { return this.itemService$.getItemList('vnd.farmmaps.itemtype.package').pipe( @@ -68,10 +61,9 @@ export class AppCommonEffects { catchError(error => of(new appCommonActions.Fail(error))) ) }) - ); + )); - @Effect() - userPackagesChanged$:Observable = this.actions$.pipe( + userPackagesChanged$ = createEffect(() => this.actions$.pipe( ofType(appCommonActions.ITEMCHANGEDEVENT), switchMap((action) => { let a = action as appCommonActions.ItemChangedEvent; @@ -80,10 +72,9 @@ export class AppCommonEffects { else return []; }) - ); + )); - @Effect() - initUserSettingsRoot$:Observable = this.actions$.pipe( + initUserSettingsRoot$ = createEffect(() => this.actions$.pipe( ofType(appCommonActions.INITUSERSETTINGSROOT), withLatestFrom(this.store$.select(appCommonReducers.SelectGetUser)), switchMap(([, user]) => { @@ -92,10 +83,9 @@ export class AppCommonEffects { catchError(error => of(new appCommonActions.Fail(error))) ) }) - ); + )); - @Effect() - initUserSettingsRootChanged$:Observable = this.actions$.pipe( + initUserSettingsRootChanged$ = createEffect(() => this.actions$.pipe( ofType(appCommonActions.ITEMCHANGEDEVENT), switchMap((action) => { let a = action as appCommonActions.ItemChangedEvent; @@ -104,38 +94,34 @@ export class AppCommonEffects { else return []; }) - ); + )); - @Effect() - initUserSuccess$: Observable = this.actions$.pipe( + initUserSuccess$ = createEffect(() => this.actions$.pipe( ofType(appCommonActions.INITUSERSUCCESS), switchMap(() => { return [new appCommonActions.InitRoot(),new appCommonActions.InitUserPackages(),new appCommonActions.InitUserSettingsRoot()]; } - )); + ))); - @Effect() - initRoot$: Observable = this.actions$.pipe( + initRoot$ = createEffect(() => this.actions$.pipe( ofType(appCommonActions.INITROOT), switchMap(() => { return this.folderService$.getMyRoots().pipe( map((folders: IListItem[]) => new appCommonActions.InitRootSuccess(folders)), catchError(error => of(new appCommonActions.Fail(error)))) } - )); + ))); - @Effect() - deleteItems$: Observable = this.actions$.pipe( + deleteItems$ = createEffect(() => this.actions$.pipe( ofType(appCommonActions.DELETEITEMS), switchMap((action:appCommonActions.DeleteItems) => { return this.itemService$.deleteItems(action.itemCodes).pipe( map((deletedItemCodes: string[]) => new appCommonActions.DeleteItemsSuccess(deletedItemCodes)), catchError(error => of(new appCommonActions.Fail(error)))) } - )); + ))); - @Effect() - editItem$: Observable = this.actions$.pipe( + editItem$ = createEffect(() => this.actions$.pipe( ofType(appCommonActions.EDITITEM), withLatestFrom(this.store$.select(appCommonReducers.selectGetItemTypes)), switchMap(([action, itemtypes]) => { @@ -148,10 +134,9 @@ export class AppCommonEffects { this.router$.navigate(['/editor',editor,'item', a.item.code]) return []; } - )); + ))); - @Effect() - viewItem$: Observable = this.actions$.pipe( + viewItem$ = createEffect(() => this.actions$.pipe( ofType(appCommonActions.VIEWITEM), withLatestFrom(this.store$.select(appCommonReducers.selectGetItemTypes)), switchMap(([action, itemtypes]) => { @@ -181,20 +166,18 @@ export class AppCommonEffects { } return []; } - )); + ))); - @Effect({ dispatch: false }) - fail$: Observable = this.actions$.pipe( + fail$ = createEffect(() => this.actions$.pipe( ofType(appCommonActions.FAIL), map((action) => { let failAction = action as appCommonActions.Fail; console.debug(failAction.payload) return null; - })); + })),{dispatch:false}); - @Effect({ dispatch: false }) - online$: Observable = this.actions$.pipe( + online$ = createEffect(() => this.actions$.pipe( ofType(appCommonActions.ONLINE), switchMap((action) => { console.debug("Online: Check token"); @@ -206,7 +189,7 @@ export class AppCommonEffects { } } return of(undefined); - })); + })),{dispatch:false}); diff --git a/src/app/app.module.ts b/src/app/app.module.ts index 354f3e5..55d62bb 100644 --- a/src/app/app.module.ts +++ b/src/app/app.module.ts @@ -13,7 +13,7 @@ import {AppRootComponent} from './app.component'; import {StoreModule, ActionReducer,MetaReducer} from '@ngrx/store'; import {EffectsModule, EffectSources} from '@ngrx/effects'; -import { StoreRouterConnectingModule} from '@ngrx/router-store'; +import { StoreRouterConnectingModule,routerReducer} from '@ngrx/router-store'; import {AppRoutingModule} from './app-routing.module'; import { LogoComponent } from './logo/logo.component'; @@ -76,13 +76,14 @@ export const metaReducers: MetaReducer[] = [debug]; AppCommonModule, AppCommonServiceModule.forRoot(), BrowserModule, - StoreModule.forRoot({},{metaReducers,runtimeChecks: { // TODO fix this should all be true + StoreModule.forRoot({router:routerReducer},{metaReducers,runtimeChecks: { // TODO fix this should all be true strictStateImmutability: false, strictActionImmutability: false, strictStateSerializability: false, strictActionSerializability: false - }}), - EffectsModule.forRoot([]) + }}), + StoreRouterConnectingModule.forRoot({stateKey:"router"}), + EffectsModule.forRoot([]), ], providers: [ AuthConfigFactory, From 1b000c6112765c7d934124d9dd18e34551237ac5 Mon Sep 17 00:00:00 2001 From: Willem Dantuma Date: Wed, 28 Jul 2021 17:12:54 +0200 Subject: [PATCH 07/12] Fix initialization error --- projects/common-map/src/fm-map/effects/map.effects.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/projects/common-map/src/fm-map/effects/map.effects.ts b/projects/common-map/src/fm-map/effects/map.effects.ts index 3858d54..6f78d82 100644 --- a/projects/common-map/src/fm-map/effects/map.effects.ts +++ b/projects/common-map/src/fm-map/effects/map.effects.ts @@ -48,7 +48,7 @@ export const { export class MapEffects { private _geojsonFormat: GeoJSON; private _wktFormat: WKT; - private overrideSelectedItemLayer + private overrideSelectedItemLayer: boolean = false; private toPointFeature(updateEvent:commonActions.DeviceUpdateEvent): Feature { var f = this._wktFormat.readFeature(updateEvent.attributes["geometry"],{ @@ -394,6 +394,8 @@ export class MapEffects { if(data && data["fm-map-map"]) { let params = data["fm-map-map"]; this.overrideSelectedItemLayer = params["overrideSelectedItemlayer"] ? params["overrideSelectedItemlayer"] : false; + } else { + this.overrideSelectedItemLayer = false; } return []; }) From 52e3117771cbfd4bf45907348d82bc72e60840f5 Mon Sep 17 00:00:00 2001 From: Willem Dantuma Date: Thu, 29 Jul 2021 08:21:25 +0200 Subject: [PATCH 08/12] Implement ItemDeleteEvent handling --- .../src/fm-map/reducers/map.reducer.ts | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/projects/common-map/src/fm-map/reducers/map.reducer.ts b/projects/common-map/src/fm-map/reducers/map.reducer.ts index 5da6bb3..35c50ac 100644 --- a/projects/common-map/src/fm-map/reducers/map.reducer.ts +++ b/projects/common-map/src/fm-map/reducers/map.reducer.ts @@ -507,6 +507,30 @@ export function reducer(state = initialState, action: mapActions.Actions | commo v.push(a.layervalue); return tassign(state,{layerValues:v}); } + case commonActions.ITEMDELETEDEVENT:{ + let a= action as commonActions.ItemDeletedEvent; + if(state.selectedItem && state.selectedItem.code == a.itemCode) { + return tassign(state,{ + selectedItem: null, + selectedItemLayer: null, + features:[] + }); + } + if(state.features.length>0) { + var index = -1; + for (var i = 0; i < state.features.length; i++) { + if (state.features[i].getId() == a.itemCode ) { + index=i; + } + } + if(index>=0) { + let newFeatures = state.features.slice(0); + newFeatures.splice(index,1); + return tassign(state,{features:newFeatures}); + } + } + return state; + } default: { return state; } From 610408d17cfc327fafa5e0003e0e054a4bdcf5e0 Mon Sep 17 00:00:00 2001 From: Willem Dantuma Date: Thu, 29 Jul 2021 12:52:26 +0200 Subject: [PATCH 09/12] Add optional replace parameter --- .../src/fm-map/actions/map.actions.ts | 2 +- .../fm-map/components/map/map.component.ts | 21 ++++++++++--------- .../src/fm-map/effects/map.effects.ts | 2 +- .../src/fm-map/reducers/map.reducer.ts | 15 +++++++++++-- 4 files changed, 26 insertions(+), 14 deletions(-) diff --git a/projects/common-map/src/fm-map/actions/map.actions.ts b/projects/common-map/src/fm-map/actions/map.actions.ts index 0b085ba..1141da6 100644 --- a/projects/common-map/src/fm-map/actions/map.actions.ts +++ b/projects/common-map/src/fm-map/actions/map.actions.ts @@ -257,7 +257,7 @@ export class ZoomToExtent implements Action { export class DoQuery implements Action { readonly type = DOQUERY; - constructor(public query:IQueryState) { } + constructor(public query:IQueryState,public replace:boolean = false) { } } export class SetStyle implements Action { diff --git a/projects/common-map/src/fm-map/components/map/map.component.ts b/projects/common-map/src/fm-map/components/map/map.component.ts index 214447b..433c0f7 100644 --- a/projects/common-map/src/fm-map/components/map/map.component.ts +++ b/projects/common-map/src/fm-map/components/map/map.component.ts @@ -11,6 +11,7 @@ import { DeviceService } from '@farmmaps/common'; import * as mapReducers from '../../reducers/map.reducer'; import * as mapActions from '../../actions/map.actions'; import { IMapState} from '../../models/map.state'; +import { IQuery } from '../../reducers/map.reducer' import { ISelectedFeatures } from '../../models/selected.features'; import { IItemLayer } from '../../models/item.layer'; import { IListItem, IQueryState } from '@farmmaps/common'; @@ -73,7 +74,7 @@ export class MapComponent implements OnInit, OnDestroy,AfterViewInit { public searchCollapsed$: Observable = this.store.select(mapReducers.selectGetSearchCollapsed); public searchMinified$: Observable = this.store.select(mapReducers.selectGetSearchMinified); public menuVisible$: Observable; - public query$: Observable = this.store.select(mapReducers.selectGetQuery); + public query$: Observable = this.store.select(mapReducers.selectGetQuery); public position$: Observable = this.geolocationService.getCurrentPosition(); public compassHeading$: Observable = this.deviceorientationService.getCurrentCompassHeading(); public baseLayersCollapsed:boolean = true; @@ -106,28 +107,28 @@ export class MapComponent implements OnInit, OnDestroy,AfterViewInit { this.overrideSelectedItemLayer = params["overrideSelectedItemlayer"] ? params["overrideSelectedItemlayer"] : false; this.overrideOverlayLayers = params["overrideOverlayLayers"] ? params["overrideOverlayLayers"] : false; } - this.querySub = this.query$.pipe(skip(1), withLatestFrom(this.mapState$)).subscribe(([queryState,mapState]) =>{ - if(queryState) { + this.querySub = this.query$.pipe(skip(1), withLatestFrom(this.mapState$)).subscribe(([query,mapState]) =>{ + if(query.querystate) { let newQueryState = tassign(mapReducers.initialQueryState); console.debug(`Do Query`); let urlparts=[]; - if (queryState.itemCode && queryState.itemCode != "") { - if(queryState.itemType && queryState.itemType!= "") { - let itemType = this.itemTypeService.itemTypes[queryState.itemType]; + if (query.querystate.itemCode && query.querystate.itemCode != "") { + if(query.querystate.itemType && query.querystate.itemType!= "") { + let itemType = this.itemTypeService.itemTypes[query.querystate.itemType]; if (itemType && itemType.viewer && itemType.viewer == "edit_in_editor" && itemType.editor) { urlparts.push('/editor'); urlparts.push(itemType.editor); urlparts.push('item'); - urlparts.push(queryState.itemCode); + urlparts.push(query.querystate.itemCode); } } } else { - newQueryState= queryState; + newQueryState= query.querystate; } if(urlparts.length==0 ) { - newQueryState.itemCode = queryState.itemCode; + newQueryState.itemCode = query.querystate.itemCode; this.zone.run(() => { - this.replaceUrl(mapState,newQueryState,false); + this.replaceUrl(mapState,newQueryState,query.replace); }) } else { this.router.navigate(urlparts); diff --git a/projects/common-map/src/fm-map/effects/map.effects.ts b/projects/common-map/src/fm-map/effects/map.effects.ts index 6f78d82..9e1ed4a 100644 --- a/projects/common-map/src/fm-map/effects/map.effects.ts +++ b/projects/common-map/src/fm-map/effects/map.effects.ts @@ -247,7 +247,7 @@ export class MapEffects { uploadedItemClick$ = createEffect(() => this.actions$.pipe( ofType(commonActions.UPLOADEDFILECLICK), - switchMap((action: commonActions.UploadedFileClick) => of(new mapActions.DoQuery(tassign(mapReducers.initialState.query, {itemCode:action.itemCode}))) + switchMap((action: commonActions.UploadedFileClick) => of(new mapActions.DoQuery(tassign(mapReducers.initialState.query.querystate, {itemCode:action.itemCode}))) ))); featureUpdate$ = createEffect(() => this.actions$.pipe( diff --git a/projects/common-map/src/fm-map/reducers/map.reducer.ts b/projects/common-map/src/fm-map/reducers/map.reducer.ts index 35c50ac..3455ec9 100644 --- a/projects/common-map/src/fm-map/reducers/map.reducer.ts +++ b/projects/common-map/src/fm-map/reducers/map.reducer.ts @@ -33,12 +33,17 @@ export const initialQueryState: IQueryState = { bbox: [] }; +export interface IQuery { + querystate: IQueryState, + replace: boolean +} + export interface State { period:IPeriodState, mapState: IMapState, viewExtent: number[], queryState: IQueryState, - query:IQueryState, + query:IQuery, parentCode: string, features: Array, panelVisible: boolean, @@ -297,8 +302,14 @@ export function reducer(state = initialState, action: mapActions.Actions | commo case mapActions.DOQUERY: { let a = action as mapActions.DoQuery; return tassign(state, { - query: tassign(a.query, { bbox: a.query.bboxFilter ? state.viewExtent : [] })}); + query: tassign(state.query, + { + querystate: tassign(a.query, { bbox: a.query.bboxFilter ? state.viewExtent : [] }), + replace:a.replace + }) + }) } + case mapActions.ADDFEATURESUCCESS: { let a = action as mapActions.AddFeatureSuccess; let features = state.features.slice(); From bd125b6f72984a0c52b3cd0b4c21fceaf8ff279c Mon Sep 17 00:00:00 2001 From: Willem Dantuma Date: Thu, 29 Jul 2021 13:24:59 +0200 Subject: [PATCH 10/12] Fix check --- projects/common-map/src/fm-map/components/map/map.component.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/projects/common-map/src/fm-map/components/map/map.component.ts b/projects/common-map/src/fm-map/components/map/map.component.ts index 433c0f7..a5cb95e 100644 --- a/projects/common-map/src/fm-map/components/map/map.component.ts +++ b/projects/common-map/src/fm-map/components/map/map.component.ts @@ -108,7 +108,7 @@ export class MapComponent implements OnInit, OnDestroy,AfterViewInit { this.overrideOverlayLayers = params["overrideOverlayLayers"] ? params["overrideOverlayLayers"] : false; } this.querySub = this.query$.pipe(skip(1), withLatestFrom(this.mapState$)).subscribe(([query,mapState]) =>{ - if(query.querystate) { + if(query && query.querystate) { let newQueryState = tassign(mapReducers.initialQueryState); console.debug(`Do Query`); let urlparts=[]; From 2da4f8868338189689635d8d200997402c2b35c2 Mon Sep 17 00:00:00 2001 From: Willem Dantuma Date: Thu, 29 Jul 2021 16:36:18 +0200 Subject: [PATCH 11/12] Fix AW-2617 --- package-lock.json | 53 +++++-------------- package.json | 6 +-- .../fm-map/components/map/map.component.scss | 1 + .../side-panel/side-panel.component.scss | 1 + 4 files changed, 17 insertions(+), 44 deletions(-) diff --git a/package-lock.json b/package-lock.json index 23b404e..8c8b186 100644 --- a/package-lock.json +++ b/package-lock.json @@ -705,7 +705,6 @@ "requires": { "boolbase": "^1.0.0", "css-what": "^4.0.0", - "domhandler": "^4.0.0", "domutils": "^2.4.3", "nth-check": "^2.0.0" } @@ -789,7 +788,6 @@ "dev": true, "requires": { "domelementtype": "^2.0.1", - "domhandler": "^4.2.0", "entities": "^2.0.0" } }, @@ -806,8 +804,7 @@ "dev": true, "requires": { "dom-serializer": "^1.0.1", - "domelementtype": "^2.2.0", - "domhandler": "^4.2.0" + "domelementtype": "^2.2.0" } }, "enhanced-resolve": { @@ -1920,11 +1917,9 @@ }, "svgo": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-2.3.0.tgz", - "integrity": "sha512-fz4IKjNO6HDPgIQxu4IxwtubtbSfGEAJUq/IXyTPIkGhWck/faiiwfkvsB8LnBkKLvSoyNNIY6d13lZprJMc9Q==", + "resolved": "", "dev": true, "requires": { - "@trysound/sax": "0.1.1", "chalk": "^4.1.0", "commander": "^7.1.0", "css-select": "^3.1.2", @@ -4079,25 +4074,25 @@ "dev": true }, "@farmmaps/common": { - "version": "1.1.1-prerelease.2020", - "resolved": "https://repository.akkerweb.nl/repository/npm-group/@farmmaps/common/-/common-1.1.1-prerelease.2020.tgz", - "integrity": "sha512-CTY27FyQoA49VJAja3PIpdRkWo2oLSxoFbVdGU3Oz3dPA3KqyMqplsiAfobrqWwsZ4SjA2r25O+92wuqA8aehA==", + "version": "1.1.1-prerelease.2030", + "resolved": "https://repository.akkerweb.nl/repository/npm-group/@farmmaps/common/-/common-1.1.1-prerelease.2030.tgz", + "integrity": "sha512-m0QVFx7qWkKHJMIHsGBEYwmOMqa9Ud9D8Wjb/0/+mJE/YQ2mVr++ndQ19PHFHjfPkifnibHovnuajWf27paBXg==", "requires": { "tslib": "^2.0.0" } }, "@farmmaps/common-map": { - "version": "1.1.1-prerelease.2020", - "resolved": "https://repository.akkerweb.nl/repository/npm-group/@farmmaps/common-map/-/common-map-1.1.1-prerelease.2020.tgz", - "integrity": "sha512-X2HBpdd4BrYFxo2pkGSK2xFIwSgBVaEzZLAmaoQ44k2loAhCIhp2aWHw88WNGxzVHeUQFToM+1aKza/zTx0VVw==", + "version": "1.1.1-prerelease.2030", + "resolved": "https://repository.akkerweb.nl/repository/npm-group/@farmmaps/common-map/-/common-map-1.1.1-prerelease.2030.tgz", + "integrity": "sha512-TiaAxN7EAtMdquIiFEY/2XWUDHxDRVCVkjzX8Z0xlwxM5KIy1PFR+TEGa4qnYnRzFX0ZrdZef0Uf6rIKPVAc2g==", "requires": { "tslib": "^2.0.0" } }, "@farmmaps/common-map3d": { - "version": "1.1.1-prerelease.2020", - "resolved": "https://repository.akkerweb.nl/repository/npm-group/@farmmaps/common-map3d/-/common-map3d-1.1.1-prerelease.2020.tgz", - "integrity": "sha512-sFw1aHFFlVjuJD6Fddo3PMMyoNXal8n0aDRDQaWXkv+CvM5HME9Fo3QnfjvKhd96fbek93C20gTCUPzUhHBK4g==", + "version": "1.1.1-prerelease.2030", + "resolved": "https://repository.akkerweb.nl/repository/npm-group/@farmmaps/common-map3d/-/common-map3d-1.1.1-prerelease.2030.tgz", + "integrity": "sha512-igMJAeyCs4Vm1FVUSqZHZAztIqUgYY4+Cl5PW6fcUiqVVyQfU50uZYTVPkVhLYxfoJbvP7TSRnPjIqa9yEB8ZQ==", "requires": { "tslib": "^2.0.0" } @@ -4588,12 +4583,6 @@ "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", "dev": true }, - "@trysound/sax": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.1.1.tgz", - "integrity": "sha512-Z6DoceYb/1xSg5+e+ZlPZ9v0N16ZvZ+wYMraFue4HYrE4ttONKtsvruIRf6t9TBR0YvSOfi1hUU0fJfBLCDYow==", - "dev": true - }, "@types/color-name": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", @@ -7186,23 +7175,6 @@ "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==", "dev": true }, - "domhandler": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.2.0.tgz", - "integrity": "sha512-zk7sgt970kzPks2Bf+dwT/PLzghLnsivb9CcxkvR8Mzr66Olr0Ofd8neSbglHJHaHa2MadfoSdNlKYAaafmWfA==", - "dev": true, - "requires": { - "domelementtype": "^2.2.0" - }, - "dependencies": { - "domelementtype": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz", - "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==", - "dev": true - } - } - }, "domutils": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", @@ -8827,8 +8799,7 @@ }, "ini": { "version": "1.3.5", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", - "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", + "resolved": "", "dev": true }, "injection-js": { diff --git a/package.json b/package.json index 2764cfb..4e66aed 100644 --- a/package.json +++ b/package.json @@ -19,9 +19,9 @@ "@angular/platform-browser": "~11.2.14", "@angular/platform-browser-dynamic": "~11.2.14", "@angular/router": "~11.2.14", - "@farmmaps/common": "1.1.1-prerelease.2020", - "@farmmaps/common-map": "1.1.1-prerelease.2020", - "@farmmaps/common-map3d": "1.1.1-prerelease.2020", + "@farmmaps/common": "1.1.1-prerelease.2030", + "@farmmaps/common-map": "1.1.1-prerelease.2030", + "@farmmaps/common-map3d": "1.1.1-prerelease.2030", "@microsoft/signalr": "^3.1.16", "@ng-bootstrap/ng-bootstrap": "^9.0", "@ngrx/effects": "^11.0", diff --git a/projects/common-map/src/fm-map/components/map/map.component.scss b/projects/common-map/src/fm-map/components/map/map.component.scss index 90f387a..6d4579d 100644 --- a/projects/common-map/src/fm-map/components/map/map.component.scss +++ b/projects/common-map/src/fm-map/components/map/map.component.scss @@ -61,6 +61,7 @@ aol-map { position:absolute;width:100%;height:calc(100vh + 4rem);} top:0em; bottom: 7.1em; width: 100%; + pointer-events: none; } .fullscreen .side-panel-container { diff --git a/projects/common/src/fm/components/side-panel/side-panel.component.scss b/projects/common/src/fm/components/side-panel/side-panel.component.scss index 16c57db..b86df63 100644 --- a/projects/common/src/fm/components/side-panel/side-panel.component.scss +++ b/projects/common/src/fm/components/side-panel/side-panel.component.scss @@ -7,6 +7,7 @@ transition: left 0.2s, top 0.2s; background-color: white; box-shadow: 0 0 20px rgba(0, 0, 0, 0.3); + pointer-events: all; } .side-panel.resizing { From f880623337a44c103be351ce3f34bbb47eea5f4f Mon Sep 17 00:00:00 2001 From: Willem Dantuma Date: Fri, 30 Jul 2021 14:06:31 +0200 Subject: [PATCH 12/12] Fix AW-2620 --- package-lock.json | 53 ++++++++++++++----- package.json | 6 +-- .../src/fm-map/effects/map.effects.ts | 2 +- 3 files changed, 45 insertions(+), 16 deletions(-) diff --git a/package-lock.json b/package-lock.json index 8c8b186..750f6b4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -705,6 +705,7 @@ "requires": { "boolbase": "^1.0.0", "css-what": "^4.0.0", + "domhandler": "^4.0.0", "domutils": "^2.4.3", "nth-check": "^2.0.0" } @@ -788,6 +789,7 @@ "dev": true, "requires": { "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", "entities": "^2.0.0" } }, @@ -804,7 +806,8 @@ "dev": true, "requires": { "dom-serializer": "^1.0.1", - "domelementtype": "^2.2.0" + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" } }, "enhanced-resolve": { @@ -1917,9 +1920,11 @@ }, "svgo": { "version": "2.3.0", - "resolved": "", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-2.3.0.tgz", + "integrity": "sha512-fz4IKjNO6HDPgIQxu4IxwtubtbSfGEAJUq/IXyTPIkGhWck/faiiwfkvsB8LnBkKLvSoyNNIY6d13lZprJMc9Q==", "dev": true, "requires": { + "@trysound/sax": "0.1.1", "chalk": "^4.1.0", "commander": "^7.1.0", "css-select": "^3.1.2", @@ -4074,25 +4079,25 @@ "dev": true }, "@farmmaps/common": { - "version": "1.1.1-prerelease.2030", - "resolved": "https://repository.akkerweb.nl/repository/npm-group/@farmmaps/common/-/common-1.1.1-prerelease.2030.tgz", - "integrity": "sha512-m0QVFx7qWkKHJMIHsGBEYwmOMqa9Ud9D8Wjb/0/+mJE/YQ2mVr++ndQ19PHFHjfPkifnibHovnuajWf27paBXg==", + "version": "1.1.1-prerelease.2031", + "resolved": "https://repository.akkerweb.nl/repository/npm-group/@farmmaps/common/-/common-1.1.1-prerelease.2031.tgz", + "integrity": "sha512-lSmTd2D1/PqzaXBjjY4X6UTYA5joZndXyZpUkFNm/Z0TTFmzFKmiIyGRA9AHX4StdQXC7QsCNfalYN31tnwtuQ==", "requires": { "tslib": "^2.0.0" } }, "@farmmaps/common-map": { - "version": "1.1.1-prerelease.2030", - "resolved": "https://repository.akkerweb.nl/repository/npm-group/@farmmaps/common-map/-/common-map-1.1.1-prerelease.2030.tgz", - "integrity": "sha512-TiaAxN7EAtMdquIiFEY/2XWUDHxDRVCVkjzX8Z0xlwxM5KIy1PFR+TEGa4qnYnRzFX0ZrdZef0Uf6rIKPVAc2g==", + "version": "1.1.1-prerelease.2031", + "resolved": "https://repository.akkerweb.nl/repository/npm-group/@farmmaps/common-map/-/common-map-1.1.1-prerelease.2031.tgz", + "integrity": "sha512-BQ2bvNohPth0+oxoSoh+WWLJ/mP2CGW4Qf4xqgC3tgfW+UZfD0dBPl7IT2piuvOuUQzlSVloinCJ4ciZGyZRXg==", "requires": { "tslib": "^2.0.0" } }, "@farmmaps/common-map3d": { - "version": "1.1.1-prerelease.2030", - "resolved": "https://repository.akkerweb.nl/repository/npm-group/@farmmaps/common-map3d/-/common-map3d-1.1.1-prerelease.2030.tgz", - "integrity": "sha512-igMJAeyCs4Vm1FVUSqZHZAztIqUgYY4+Cl5PW6fcUiqVVyQfU50uZYTVPkVhLYxfoJbvP7TSRnPjIqa9yEB8ZQ==", + "version": "1.1.1-prerelease.2031", + "resolved": "https://repository.akkerweb.nl/repository/npm-group/@farmmaps/common-map3d/-/common-map3d-1.1.1-prerelease.2031.tgz", + "integrity": "sha512-2M5wv5sFwlVwPGlN1b1AGM3Dh/DJFS7+L3b6e6ir2+ASoyy7xhZ67IWS2du8B7y7/xVsgxCJcJp1EJezbSCMAA==", "requires": { "tslib": "^2.0.0" } @@ -4583,6 +4588,12 @@ "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", "dev": true }, + "@trysound/sax": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.1.1.tgz", + "integrity": "sha512-Z6DoceYb/1xSg5+e+ZlPZ9v0N16ZvZ+wYMraFue4HYrE4ttONKtsvruIRf6t9TBR0YvSOfi1hUU0fJfBLCDYow==", + "dev": true + }, "@types/color-name": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", @@ -7175,6 +7186,23 @@ "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==", "dev": true }, + "domhandler": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.2.0.tgz", + "integrity": "sha512-zk7sgt970kzPks2Bf+dwT/PLzghLnsivb9CcxkvR8Mzr66Olr0Ofd8neSbglHJHaHa2MadfoSdNlKYAaafmWfA==", + "dev": true, + "requires": { + "domelementtype": "^2.2.0" + }, + "dependencies": { + "domelementtype": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz", + "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==", + "dev": true + } + } + }, "domutils": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", @@ -8799,7 +8827,8 @@ }, "ini": { "version": "1.3.5", - "resolved": "", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", + "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", "dev": true }, "injection-js": { diff --git a/package.json b/package.json index 4e66aed..03332bc 100644 --- a/package.json +++ b/package.json @@ -19,9 +19,9 @@ "@angular/platform-browser": "~11.2.14", "@angular/platform-browser-dynamic": "~11.2.14", "@angular/router": "~11.2.14", - "@farmmaps/common": "1.1.1-prerelease.2030", - "@farmmaps/common-map": "1.1.1-prerelease.2030", - "@farmmaps/common-map3d": "1.1.1-prerelease.2030", + "@farmmaps/common": "1.1.1-prerelease.2031", + "@farmmaps/common-map": "1.1.1-prerelease.2031", + "@farmmaps/common-map3d": "1.1.1-prerelease.2031", "@microsoft/signalr": "^3.1.16", "@ng-bootstrap/ng-bootstrap": "^9.0", "@ngrx/effects": "^11.0", diff --git a/projects/common-map/src/fm-map/effects/map.effects.ts b/projects/common-map/src/fm-map/effects/map.effects.ts index 9e1ed4a..5d0d03f 100644 --- a/projects/common-map/src/fm-map/effects/map.effects.ts +++ b/projects/common-map/src/fm-map/effects/map.effects.ts @@ -332,7 +332,7 @@ export class MapEffects { ))); updateLayerValuesOnLayerAddedOrRemoved$ = createEffect(() => this.actions$.pipe( - ofType(mapActions.ADDLAYER,mapActions.REMOVELAYER,mapActions.SELECTITEM,mapActions.NEXTTEMPORAL,mapActions.PREVIOUSTEMPORAL,mapActions.TOGGLELAYERVALUESENABLED), + ofType(mapActions.ADDLAYER,mapActions.REMOVELAYER,mapActions.SELECTITEMSUCCESS,mapActions.SELECTTEMPORALITEMSSUCCESS, mapActions.NEXTTEMPORAL,mapActions.PREVIOUSTEMPORAL,mapActions.TOGGLELAYERVALUESENABLED,mapActions.SETLAYERINDEX,mapActions.SETSELECTEDITEMLAYER), withLatestFrom(this.store$.select(mapReducers.selectGetLayerValuesX)), withLatestFrom(this.store$.select(mapReducers.selectGetLayerValuesY)), map(([[action,x],y]) => new mapActions.SetLayerValuesLocation(x,y))