diff --git a/package-lock.json b/package-lock.json index b5c8923..31ef0ff 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "farmmaps-lib-app", - "version": "4.18.0", + "version": "4.19.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "farmmaps-lib-app", - "version": "4.18.0", + "version": "4.19.0", "dependencies": { "@angular-eslint/eslint-plugin": "^18.2.0", "@angular/animations": "18.2.3", @@ -90,7 +90,7 @@ }, "dist/common": { "name": "@farmmaps/common", - "version": "4.18.0-prerelease.2576", + "version": "4.19.0-prerelease.2584", "dependencies": { "tslib": "^2.3.0" }, @@ -115,7 +115,7 @@ }, "dist/common-map": { "name": "@farmmaps/common-map", - "version": "4.18.0-prerelease.2576", + "version": "4.19.0-prerelease.2584", "dependencies": { "tslib": "^2.0.0" }, @@ -130,7 +130,7 @@ }, "dist/common-map3d": { "name": "@farmmaps/common-map3d", - "version": "4.18.0-prerelease.2576", + "version": "4.19.0-prerelease.2584", "dependencies": { "tslib": "^2.0.0" }, @@ -143,7 +143,7 @@ }, "dist/ng-openlayers": { "name": "@farmmaps/ng-openlayers", - "version": "4.18.0-prerelease.2576", + "version": "4.19.0-prerelease.2584", "license": "MPL-2.0", "dependencies": { "tslib": "^2.3.0" diff --git a/package.json b/package.json index a3e277e..6fa3299 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "farmmaps-lib-app", - "version": "4.18.0", + "version": "4.19.0", "scripts": { "ng": "ng", "start": "ng serve", 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..521cadb 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; @@ -300,7 +302,7 @@ export class SetReplaceUrl implements Action { export class SetFeatures implements Action { readonly type = SETFEATURES; - constructor(public features: Array>) { } + constructor(public features: Array>, public zoomToExtent: boolean = true) { } } export class SetLayerValuesLocation implements Action { @@ -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/common-map.module.ts b/projects/common-map/src/fm-map/common-map.module.ts index 1074bf8..c364496 100644 --- a/projects/common-map/src/fm-map/common-map.module.ts +++ b/projects/common-map/src/fm-map/common-map.module.ts @@ -41,7 +41,6 @@ import { FeatureListCroppingschemeComponent } from './components/feature-list-cr import { FeatureListFeatureContainerComponent } from './components/feature-list-feature-container/feature-list-feature-container.component'; import { FeatureListFeatureCropfieldComponent } from './components/feature-list-feature-cropfield/feature-list-feature-cropfield.component'; import { FeatureListFeatureCroppingschemeComponent } from './components/feature-list-feature-croppingscheme/feature-list-feature-croppingscheme.component'; -import { FeatureListFeatureObservationComponent } from './components/feature-list-feature-observation/feature-list-feature-observation.component'; import { AbstractFeatureListFeatureComponent, FeatureListFeatureComponent } from './components/feature-list-feature/feature-list-feature.component'; import { AbstractFeatureListComponent, FeatureListComponent } from './components/feature-list/feature-list.component'; import { GeometryThumbnailComponent } from './components/feature-thumbnail/feature-thumbnail.component'; @@ -107,7 +106,7 @@ const metaReducers: Array> = [LocalStorageSync]; export { AbstractFeatureListComponent, - AbstractFeatureListFeatureComponent, AbstractItemListComponent, AbstractItemListItemComponent, AbstractItemWidgetComponent, AbstractSelectedItemComponent, DeviceOrientationService, FeatureIconService, FeatureListComponent, FeatureListContainerComponent, FeatureListCropfieldComponent, FeatureListObservationComponent, FeatureListCroppingschemeComponent, FeatureListFeatureComponent, FeatureListFeatureContainerComponent, FeatureListFeatureCropfieldComponent, FeatureListFeatureObservationComponent, FeatureListFeatureCroppingschemeComponent, FileDropTargetComponent, ForChild, + AbstractFeatureListFeatureComponent, AbstractItemListComponent, AbstractItemListItemComponent, AbstractItemWidgetComponent, AbstractSelectedItemComponent, DeviceOrientationService, FeatureIconService, FeatureListComponent, FeatureListContainerComponent, FeatureListCropfieldComponent, FeatureListObservationComponent, FeatureListCroppingschemeComponent, FeatureListFeatureComponent, FeatureListFeatureContainerComponent, FeatureListFeatureCropfieldComponent, FeatureListFeatureCroppingschemeComponent, FileDropTargetComponent, ForChild, ForItemType, ForPackage, ForSourceTask, GeolocationService, GeometryThumbnailComponent, GpsLocation, IClickedFeature, ifZoomToShowDirective, IItemLayer, IMapState, IPeriodState, ISelectedFeatures, ItemLayer, ItemLayersComponent, ItemListComponent, ItemListItemComponent, ItemListItemContainerComponent, ITemporalItemLayer, ItemVectorSourceComponent, ItemWidgetListComponent, LayerListComponent, LayerSwitcher, LayerVectorImageComponent, LegendComponent, mapActions, MapComponent, mapEffects, mapReducers, MapSearchComponent, MetaDataModalComponent, PanToLocation, RotationResetComponent, SelectedItemComponent, SelectedItemContainerComponent, SelectedItemCropfieldComponent, @@ -149,7 +148,6 @@ export { FeatureListFeatureComponent, FeatureListFeatureCroppingschemeComponent, FeatureListFeatureCropfieldComponent, - FeatureListFeatureObservationComponent, SelectedItemContainerComponent, SelectedItemComponent, SelectedItemCropfieldComponent, @@ -182,7 +180,6 @@ export { LayerSwitcher, FeatureListFeatureComponent, FeatureListFeatureCropfieldComponent, - FeatureListFeatureObservationComponent, FeatureListFeatureCroppingschemeComponent, SelectedItemContainerComponent, SelectedItemComponent, @@ -223,8 +220,7 @@ export { { provide: AbstractFeatureListComponent, useClass: FeatureListObservationComponent, multi: true }, { provide: AbstractFeatureListFeatureComponent, useClass: FeatureListFeatureComponent, multi: true }, { provide: AbstractFeatureListFeatureComponent, useClass: FeatureListFeatureCroppingschemeComponent, multi: true }, - { provide: AbstractFeatureListFeatureComponent, useClass: FeatureListFeatureCropfieldComponent, multi: true }, - { provide: AbstractFeatureListFeatureComponent, useClass: FeatureListFeatureObservationComponent, multi: true }, + { provide: AbstractFeatureListFeatureComponent, useClass: FeatureListFeatureCropfieldComponent, multi: true }, { provide: AbstractSelectedItemComponent, useClass: SelectedItemComponent, multi: true }, { provide: AbstractSelectedItemComponent, useClass: SelectedItemCropfieldComponent, multi: true }, { provide: AbstractSelectedItemComponent, useClass: SelectedItemGeotiffComponent, multi: true }, diff --git a/projects/common-map/src/fm-map/components/feature-list-feature-observation/feature-list-feature-observation.component.html b/projects/common-map/src/fm-map/components/feature-list-feature-observation/feature-list-feature-observation.component.html deleted file mode 100644 index edf13e5..0000000 --- a/projects/common-map/src/fm-map/components/feature-list-feature-observation/feature-list-feature-observation.component.html +++ /dev/null @@ -1,10 +0,0 @@ -
-
-
- -
-
-

{{feature.get('name')}}

-
-
-
\ No newline at end of file diff --git a/projects/common-map/src/fm-map/components/feature-list-feature-observation/feature-list-feature-observation.component.scss b/projects/common-map/src/fm-map/components/feature-list-feature-observation/feature-list-feature-observation.component.scss deleted file mode 100644 index 0af39a5..0000000 --- a/projects/common-map/src/fm-map/components/feature-list-feature-observation/feature-list-feature-observation.component.scss +++ /dev/null @@ -1,22 +0,0 @@ -.card-title { - font-size: 1rem; - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; -} - -.card-text { - overflow: hidden; - white-space: nowrap; - text-overflow: ellipsis; -} - -.col { - overflow: hidden; -} - -.thumbnail { - width: 4em; - height: 4em; -} - diff --git a/projects/common-map/src/fm-map/components/feature-list-feature-observation/feature-list-feature-observation.component.ts b/projects/common-map/src/fm-map/components/feature-list-feature-observation/feature-list-feature-observation.component.ts deleted file mode 100644 index 2c02cbb..0000000 --- a/projects/common-map/src/fm-map/components/feature-list-feature-observation/feature-list-feature-observation.component.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { Component, Injectable } from '@angular/core'; -import { AppConfig, commonReducers, ItemTypeService } from '@farmmaps/common'; -import { Store } from '@ngrx/store'; -import { Feature } from 'ol'; -import { Geometry } from 'ol/geom'; -import * as mapReducers from '../../reducers/map.reducer'; -import { AbstractFeatureListFeatureComponent } from '../feature-list-feature/feature-list-feature.component'; -import { ForItemType } from '../for-item/for-itemtype.decorator'; - -@ForItemType("vnd.farmmaps.itemtype.observation") -@Injectable() -@Component({ - selector: 'fm-map-feature-list-feature-observation', - templateUrl: './feature-list-feature-observation.component.html', - styleUrls: ['./feature-list-feature-observation.component.scss'] -}) -export class FeatureListFeatureObservationComponent extends AbstractFeatureListFeatureComponent { - - constructor(store: Store, itemTypeService: ItemTypeService,config:AppConfig) { - super(store, itemTypeService,config); - } - - getSource(feature: Feature): string { - let source = "/images/decease.png"; - var type = feature.get('type'); - source = '/images/' + type + '.png'; - return source; - } -} 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 474ecc1..b95221a 100644 --- a/projects/common-map/src/fm-map/effects/map.effects.ts +++ b/projects/common-map/src/fm-map/effects/map.effects.ts @@ -166,12 +166,14 @@ export class MapEffects { zoomToExtent2$ = createEffect(() => this.actions$.pipe( ofType(mapActions.SETFEATURES), switchMap((action: mapActions.SetFeatures) => { - const extent = createEmpty(); - if (extent) { - for (const f of action.features) { - extend(extent, (f as Feature).getGeometry().getExtent()); + if (action.zoomToExtent) { + const extent = createEmpty(); + if (extent) { + for (const f of action.features) { + extend(extent, (f as Feature).getGeometry().getExtent()); + } + if (action.features.length > 0) return of(new mapActions.SetExtent(extent)); } - if (action.features.length > 0) return of(new mapActions.SetExtent(extent)); } return EMPTY; }))); 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; } diff --git a/projects/common/src/fm/services/item.service.ts b/projects/common/src/fm/services/item.service.ts index 8d08465..1abfbfb 100644 --- a/projects/common/src/fm/services/item.service.ts +++ b/projects/common/src/fm/services/item.service.ts @@ -25,7 +25,8 @@ export class ItemService { return this.httpClient.get<{ [id: string]: IItemType }>(`${this.ApiEndpoint()}/api/v1/itemtypes/`); } - getFeatures(extent: number[], crs: string, searchText?: string, searchTags?:string,startDate?:Date,endDate?:Date,itemType?:string,parentCode?:string,dataFilter?:string,level?:number,indexed?:boolean): Observable { + getFeatures(extent: number[], crs: string, searchText?: string, searchTags?:string,startDate?:Date,endDate?:Date, + itemType?:string,parentCode?:string,dataFilter?:string,level?:number,indexed?:boolean,atItemLocationItemCode?: string): Observable { let params = new HttpParams(); params = params.append("crs", crs); if (extent) params =params.append("bbox", extent.join(",")); @@ -43,6 +44,7 @@ export class ItemService { if (parentCode) params = params.append("pc", parentCode); if (dataFilter) params = params.append("df", dataFilter); if (level) params = params.append("lvl", level.toString()); + if (atItemLocationItemCode) params = params.append("ail", atItemLocationItemCode); params = params.append("ind", indexed ?? true); return this.httpClient.get(`${this.ApiEndpoint()}/api/v1/items/features/`, {params:params}); } @@ -116,7 +118,8 @@ export class ItemService { getChildItemList(parentcode: string, itemType?: string, dataFilter?: any, level = 1, deep = true, startDate?: Date, endDate?: Date, skip?: number, take?: number, - exactMatchStartOrEndDate?: boolean, owner?:string, indexed?: boolean): Observable { + exactMatchStartOrEndDate?: boolean, owner?:string, indexed?: boolean, + atItemLocationItemCode?: string): Observable { let params = new HttpParams(); if(itemType != null) { params = params.append("it", itemType); @@ -134,6 +137,7 @@ export class ItemService { if(skip) params = params.append("skip", skip); if(take) params = params.append("take", take); if(indexed) params = params.append("ind",indexed?"true":"false"); + if(atItemLocationItemCode) params = params.append("ail",atItemLocationItemCode); return this.httpClient.get(`${this.ApiEndpoint()}/api/v1/items/${parentcode}/children`, { params: params }); }