From 6fd69d7999fd044bc73bd075179eea9996edf1e6 Mon Sep 17 00:00:00 2001 From: Peter Bastiani Date: Tue, 2 Sep 2025 09:32:00 +0200 Subject: [PATCH] AW-6981 Support for backup and restore (current) features --- .../src/fm-map/actions/map.actions.ts | 16 ++++++++- .../src/fm-map/reducers/map.reducer.ts | 33 +++++++++++++++---- 2 files changed, 42 insertions(+), 7 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 82bebc2..3b96fe7 100644 --- a/projects/common-map/src/fm-map/actions/map.actions.ts +++ b/projects/common-map/src/fm-map/actions/map.actions.ts @@ -59,6 +59,8 @@ export const TOGGLESHOWDATALAYERSLIDE = '[Map] ToggleShowDataLayerSlide' export const SETVIEWSTATE = '[Map] SetViewState' export const CLEARFEATURES = '[Map] ClearFeatures'; export const SETPANELEXTRAWIDE = '[Map] SetPanelExtraWide'; +export const BACKUPFEATURES = '[Map] BackupFeatures'; +export const RESTOREFEATURES = '[Map] RestoreFeatures'; export class Clear implements Action { readonly type = CLEAR; @@ -347,6 +349,16 @@ export class SetPanelExtraWide implements Action { constructor(public panelExtraWide:boolean) {} } +export class BackupFeatures implements Action { + readonly type = BACKUPFEATURES; + constructor() {} +} + +export class RestoreFeatures implements Action { + readonly type = RESTOREFEATURES; + constructor() {} +} + export type Actions = SetMapState | Init | Clear @@ -395,5 +407,7 @@ export type Actions = SetMapState | ToggleShowDataLayerSlide | SetViewState | ClearFeatures - | SetPanelExtraWide; + | SetPanelExtraWide + | BackupFeatures + | RestoreFeatures; 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 acf1cf0..0495621 100644 --- a/projects/common-map/src/fm-map/reducers/map.reducer.ts +++ b/projects/common-map/src/fm-map/reducers/map.reducer.ts @@ -9,6 +9,7 @@ import { ILayervalue } from '../models/layer.value'; import * as mapActions from '../actions/map.actions'; import {commonActions} from '@farmmaps/common'; import { createSelector, createFeatureSelector } from '@ngrx/store'; +import * as _ from 'lodash'; import {Feature} from 'ol'; import {Geometry} from 'ol/geom'; @@ -47,6 +48,7 @@ export interface State { query:IQuery, parentCode: string, features: Array>, + featuresBackup: Array>, panelVisible: boolean, panelCollapsed: boolean, panelExtraWide: boolean, @@ -93,6 +95,7 @@ export const initialState: State = { query: null, parentCode: null, features: [], + featuresBackup: [], panelVisible: false, panelCollapsed: false, panelExtraWide: false, @@ -156,13 +159,15 @@ export function reducer(state = initialState, action: mapActions.Actions | commo const a = action as mapActions.StartSearchSuccess; return tassign(state, { features: a.features, + featuresBackup: [], inSearch:false }); } case mapActions.SETFEATURES: { const a = action as mapActions.SetFeatures; return tassign(state, { - features: a.features + features: a.features, + featuresBackup: [] }); } case mapActions.SELECTFEATURE: { @@ -180,6 +185,7 @@ export function reducer(state = initialState, action: mapActions.Actions | commo selectedItemLayer: null, showDataLayerSlide: false, features:[], + featuresBackup: [], inSearch:inSearch }); } @@ -296,6 +302,7 @@ export function reducer(state = initialState, action: mapActions.Actions | commo return tassign(state, { selectedItem: null, features:[], + featuresBackup: [], selectedItemLayer:null, searchCollapsed: !panelVisible, panelVisible: panelVisible, @@ -332,7 +339,8 @@ export function reducer(state = initialState, action: mapActions.Actions | commo extent: a.feature.getGeometry().getExtent(), searchCollapsed: false, clearEnabled:true, - features:features + features:features, + featuresBackup:[] }); } case mapActions.UPDATEFEATURESUCCESS: { @@ -346,7 +354,7 @@ export function reducer(state = initialState, action: mapActions.Actions | commo features.push(state.features[i]); } } - return tassign(state, { features: features }); + return tassign(state, { features: features, featuresBackup: [] }); } case mapActions.EXPANDSEARCH: { return tassign(state, { searchCollapsed: false }); @@ -391,7 +399,7 @@ export function reducer(state = initialState, action: mapActions.Actions | commo return tassign(state, {overlayLayers: [], selectedOverlayLayer: null}); } case mapActions.CLEARFEATURES: { - return tassign(state, {features: [], selectedFeature: null}); + return tassign(state, {features: [], featuresBackup: [], selectedFeature: null}); } case mapActions.SETVISIBILITY: { const a = action as mapActions.SetVisibility; @@ -509,6 +517,7 @@ export function reducer(state = initialState, action: mapActions.Actions | commo searchCollapsed: true, searchMinified: false, features: [], + featuresBackup: [], query:initialState.query, showLayerSwitcher: false, extent: null, @@ -556,7 +565,8 @@ export function reducer(state = initialState, action: mapActions.Actions | commo selectedItem: null, selectedItemLayer: null, showDataLayerSlide: false, - features:[] + features:[], + featuresBackup:[] }); } if(state.features.length>0) { @@ -569,7 +579,7 @@ export function reducer(state = initialState, action: mapActions.Actions | commo if(index>=0) { const newFeatures = state.features.slice(0); newFeatures.splice(index,1); - return tassign(state,{features:newFeatures}); + return tassign(state,{features:newFeatures, featuresBackup:[]}); } } return state; @@ -578,6 +588,17 @@ export function reducer(state = initialState, action: mapActions.Actions | commo const a= action as mapActions.SetPanelExtraWide; return tassign(state,{panelExtraWide:a.panelExtraWide}); } + case mapActions.BACKUPFEATURES: { + return tassign(state, { + featuresBackup: _.cloneDeep(state.features) + }); + } + case mapActions.RESTOREFEATURES: { + return tassign(state, { + features: _.cloneDeep(state.featuresBackup), + featuresBackup: [] + }); + } default: { return state; }