Compare commits
	
		
			61 Commits
		
	
	
		
			80ef4ed6fe
			...
			develop
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
						 | 
					9b86927e2c | ||
| 
						 | 
					e224b80995 | ||
| 
						 | 
					88f3d9ef1a | ||
| 6737029a61 | |||
| 
						 | 
					d4786564bd | ||
| 6fd69d7999 | |||
| 
						 | 
					4ec75b3d5a | ||
| 04e3f1e71f | |||
| 
						 | 
					df77631299 | ||
| a8d0f05c81 | |||
| 
						 | 
					c79637be77 | ||
| 
						 | 
					b5e11da9a8 | ||
| 
						 | 
					9d45c25a95 | ||
| 
						 | 
					2ffce50c47 | ||
| 
						 | 
					f50ff878e0 | ||
| 09c74448a8 | |||
| 205b73b30e | |||
| 
						 | 
					313cc59fe7 | ||
| c3fb42c65f | |||
| 
						 | 
					6b73fb0d55 | ||
| ea641caf38 | |||
| ac15b2018d | |||
| 
						 | 
					fe73f615ad | ||
| 
						 | 
					3e1b3ee78e | ||
| 
						 | 
					58391b7828 | ||
| 
						 | 
					b2b2a1e8be | ||
| 
						 | 
					0d96a1be4f | ||
| d599430cb0 | |||
| 
						 | 
					e17911b339 | ||
| 
						 | 
					9d6cbffb3d | ||
| 
						 | 
					a11eb81e73 | ||
| 
						 | 
					4fc3ad933c | ||
| 
						 | 
					e6d90c9e61 | ||
| 250b3841fe | |||
| 51291cd86f | |||
| 
						 | 
					e9e3b719a4 | ||
| 
						 | 
					1c0ad57b0a | ||
| 
						 | 
					8684ba25c8 | ||
| 78ca3044cf | |||
| 2e55b5a70e | |||
| 
						 | 
					af0a3dca2d | ||
| f039898c26 | |||
| 
						 | 
					ab19b1c2ce | ||
| a2641f8ea5 | |||
| 
						 | 
					d6841c8f83 | ||
| 187b24ab97 | |||
| b80ddf7854 | |||
| 
						 | 
					79bc3d9082 | ||
| 1c92ad4c28 | |||
| 
						 | 
					61e6de0052 | ||
| fb25b92349 | |||
| 
						 | 
					e78f2893ae | ||
| 51170b45e9 | |||
| 
						 | 
					7365bea145 | ||
| dc096065b4 | |||
| 
						 | 
					b9850311ea | ||
| ee9c050db3 | |||
| 
						 | 
					95200d9920 | ||
| 
						 | 
					ee1ce21cca | ||
| 
						 | 
					467f7447bf | ||
| 
						 | 
					1df4496058 | 
							
								
								
									
										12
									
								
								package-lock.json
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										12
									
								
								package-lock.json
									
									
									
										generated
									
									
									
								
							@@ -1,12 +1,12 @@
 | 
			
		||||
{
 | 
			
		||||
  "name": "farmmaps-lib-app",
 | 
			
		||||
  "version": "4.14.0",
 | 
			
		||||
  "version": "4.19.0",
 | 
			
		||||
  "lockfileVersion": 3,
 | 
			
		||||
  "requires": true,
 | 
			
		||||
  "packages": {
 | 
			
		||||
    "": {
 | 
			
		||||
      "name": "farmmaps-lib-app",
 | 
			
		||||
      "version": "4.14.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.14.0-prerelease.2544",
 | 
			
		||||
      "version": "4.19.0-prerelease.2582",
 | 
			
		||||
      "dependencies": {
 | 
			
		||||
        "tslib": "^2.3.0"
 | 
			
		||||
      },
 | 
			
		||||
@@ -115,7 +115,7 @@
 | 
			
		||||
    },
 | 
			
		||||
    "dist/common-map": {
 | 
			
		||||
      "name": "@farmmaps/common-map",
 | 
			
		||||
      "version": "4.14.0-prerelease.2544",
 | 
			
		||||
      "version": "4.19.0-prerelease.2582",
 | 
			
		||||
      "dependencies": {
 | 
			
		||||
        "tslib": "^2.0.0"
 | 
			
		||||
      },
 | 
			
		||||
@@ -130,7 +130,7 @@
 | 
			
		||||
    },
 | 
			
		||||
    "dist/common-map3d": {
 | 
			
		||||
      "name": "@farmmaps/common-map3d",
 | 
			
		||||
      "version": "4.14.0-prerelease.2544",
 | 
			
		||||
      "version": "4.19.0-prerelease.2582",
 | 
			
		||||
      "dependencies": {
 | 
			
		||||
        "tslib": "^2.0.0"
 | 
			
		||||
      },
 | 
			
		||||
@@ -143,7 +143,7 @@
 | 
			
		||||
    },
 | 
			
		||||
    "dist/ng-openlayers": {
 | 
			
		||||
      "name": "@farmmaps/ng-openlayers",
 | 
			
		||||
      "version": "4.14.0-prerelease.2544",
 | 
			
		||||
      "version": "4.19.0-prerelease.2582",
 | 
			
		||||
      "license": "MPL-2.0",
 | 
			
		||||
      "dependencies": {
 | 
			
		||||
        "tslib": "^2.3.0"
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
{
 | 
			
		||||
  "name": "farmmaps-lib-app",
 | 
			
		||||
  "version": "4.14.0",
 | 
			
		||||
  "version": "4.19.0",
 | 
			
		||||
  "scripts":   {
 | 
			
		||||
    "ng": "ng",
 | 
			
		||||
    "start": "ng serve",
 | 
			
		||||
 
 | 
			
		||||
@@ -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;
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -36,6 +36,7 @@ import { RotationResetComponent } from './components/aol/rotation-reset/rotation
 | 
			
		||||
import { ZoomToExtentComponent } from './components/aol/zoom-to-extent/zoom-to-extent.component';
 | 
			
		||||
import { FeatureListContainerComponent } from './components/feature-list-container/feature-list-container.component';
 | 
			
		||||
import { FeatureListCropfieldComponent } from './components/feature-list-cropfield/feature-list-cropfield.component';
 | 
			
		||||
import { FeatureListObservationComponent } from './components/feature-list-observation/feature-list-observation.component';
 | 
			
		||||
import { FeatureListCroppingschemeComponent } from './components/feature-list-croppingscheme/feature-list-croppingscheme.component';
 | 
			
		||||
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';
 | 
			
		||||
@@ -105,7 +106,7 @@ const metaReducers: Array<MetaReducer<any, any>> = [LocalStorageSync];
 | 
			
		||||
 | 
			
		||||
export {
 | 
			
		||||
  AbstractFeatureListComponent,
 | 
			
		||||
  AbstractFeatureListFeatureComponent, AbstractItemListComponent, AbstractItemListItemComponent, AbstractItemWidgetComponent, AbstractSelectedItemComponent, DeviceOrientationService, FeatureIconService, FeatureListComponent, FeatureListContainerComponent, FeatureListCropfieldComponent, FeatureListCroppingschemeComponent, FeatureListFeatureComponent, FeatureListFeatureContainerComponent, FeatureListFeatureCropfieldComponent, 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,
 | 
			
		||||
@@ -142,6 +143,7 @@ export {
 | 
			
		||||
        FeatureListContainerComponent,
 | 
			
		||||
        FeatureListCroppingschemeComponent,
 | 
			
		||||
        FeatureListCropfieldComponent,
 | 
			
		||||
        FeatureListObservationComponent,
 | 
			
		||||
        FeatureListFeatureContainerComponent,
 | 
			
		||||
        FeatureListFeatureComponent,
 | 
			
		||||
        FeatureListFeatureCroppingschemeComponent,
 | 
			
		||||
@@ -201,6 +203,7 @@ export {
 | 
			
		||||
        FeatureListContainerComponent,
 | 
			
		||||
        FeatureListCroppingschemeComponent,
 | 
			
		||||
        FeatureListCropfieldComponent,
 | 
			
		||||
        FeatureListObservationComponent,
 | 
			
		||||
        FeatureListFeatureContainerComponent,
 | 
			
		||||
        ZoomToExtentComponent,
 | 
			
		||||
        ifZoomToShowDirective,
 | 
			
		||||
@@ -214,6 +217,7 @@ export {
 | 
			
		||||
        TemporalService,
 | 
			
		||||
        { provide: AbstractFeatureListComponent, useClass: FeatureListCroppingschemeComponent, multi: true },
 | 
			
		||||
        { provide: AbstractFeatureListComponent, useClass: FeatureListCropfieldComponent, multi: true },
 | 
			
		||||
        { provide: AbstractFeatureListComponent, useClass: FeatureListObservationComponent, multi: true },        
 | 
			
		||||
        { provide: AbstractFeatureListFeatureComponent, useClass: FeatureListFeatureComponent, multi: true },
 | 
			
		||||
        { provide: AbstractFeatureListFeatureComponent, useClass: FeatureListFeatureCroppingschemeComponent, multi: true },
 | 
			
		||||
        { provide: AbstractFeatureListFeatureComponent, useClass: FeatureListFeatureCropfieldComponent, multi: true },       
 | 
			
		||||
 
 | 
			
		||||
@@ -0,0 +1,14 @@
 | 
			
		||||
<div class="card border-0">
 | 
			
		||||
  <div class="card-body" *ngIf="(schemeItem|async);let schemeItem">
 | 
			
		||||
    <fm-back-button></fm-back-button>
 | 
			
		||||
    <h4 i18n>Farm</h4>
 | 
			
		||||
    <h3>{{schemeItem.name}}</h3>
 | 
			
		||||
    <div *ngIf="features;let features">
 | 
			
		||||
        <div class="cropfields">
 | 
			
		||||
          <div class="row m-0 ps-3 pe-3" *ngFor="let feature of features" [ngClass]="{'selected':isFeatureSelected(feature)}" (click)="handleFeatureClick(feature)" (mouseenter)="handleFeatureMouseEnter(feature)" (mouseleave)="handleFeatureMouseLeave(feature)">
 | 
			
		||||
          <fm-map-feature-list-feature-container [feature]="feature"></fm-map-feature-list-feature-container>
 | 
			
		||||
        </div>
 | 
			
		||||
      </div>
 | 
			
		||||
    </div>
 | 
			
		||||
  </div>
 | 
			
		||||
</div>
 | 
			
		||||
@@ -0,0 +1,20 @@
 | 
			
		||||
fm-map-feature-list-feature-container {
 | 
			
		||||
  width:100%;
 | 
			
		||||
  pointer-events:none;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.row {
 | 
			
		||||
  border-bottom: 1px solid var(--bs-gray-500);
 | 
			
		||||
  user-select: none;
 | 
			
		||||
  padding-left:1.5rem;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.row.selected {
 | 
			
		||||
  background-color: var(--bs-gray-100);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.cropfields {
 | 
			
		||||
  border-top: 1px solid var(--bs-gray-500);
 | 
			
		||||
  margin-left: -1.25rem;
 | 
			
		||||
  margin-right: -1.25rem;
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,30 @@
 | 
			
		||||
import { Component, Injectable,AfterViewInit, OnInit,SimpleChanges, ChangeDetectorRef} from '@angular/core';
 | 
			
		||||
import { Location } from '@angular/common';
 | 
			
		||||
import { AbstractFeatureListComponent } from '../feature-list/feature-list.component';
 | 
			
		||||
import {ForItemType } from '../for-item/for-itemtype.decorator';
 | 
			
		||||
import {ForChild } from '../for-item/for-child.decorator';
 | 
			
		||||
import { Store } from '@ngrx/store';
 | 
			
		||||
import * as mapReducers from '../../reducers/map.reducer';
 | 
			
		||||
import { commonReducers, ItemTypeService, IItem,ItemService } from '@farmmaps/common';
 | 
			
		||||
import { Observable } from 'rxjs';
 | 
			
		||||
 | 
			
		||||
@ForChild()
 | 
			
		||||
@ForItemType("vnd.farmmaps.itemtype.observation")
 | 
			
		||||
@Injectable()
 | 
			
		||||
@Component({
 | 
			
		||||
  selector: 'fm-map-feature-list-observation',
 | 
			
		||||
    templateUrl: './feature-list-observation.component.html',
 | 
			
		||||
    styleUrls: ['./feature-list-observation.component.scss']
 | 
			
		||||
})
 | 
			
		||||
export class FeatureListObservationComponent extends AbstractFeatureListComponent implements OnInit {
 | 
			
		||||
 | 
			
		||||
  constructor(store: Store<mapReducers.State | commonReducers.State>, itemTypeService: ItemTypeService, location: Location, private itemService: ItemService) {
 | 
			
		||||
    super(store, itemTypeService,location);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  public schemeItem: Observable<IItem>
 | 
			
		||||
 | 
			
		||||
  ngOnInit() {
 | 
			
		||||
    this.schemeItem = this.itemService.getItem(this.queryState.parentCode);
 | 
			
		||||
  } 
 | 
			
		||||
}
 | 
			
		||||
@@ -10,7 +10,7 @@
 | 
			
		||||
        <li class="nav-item py-0">
 | 
			
		||||
          <span><i class="fal fa-layer-group" aria-hidden="true"></i> <span i18n>Base maps</span></span>
 | 
			
		||||
          <div  class="mb-4">
 | 
			
		||||
            <fm-map-layer-list [baseLayers]="true" [itemLayers]="baseLayers|async" [selectedLayer]="selectedBaseLayer|async" (onSelectLayer)="handleSelectBaseLayer($event)"></fm-map-layer-list>
 | 
			
		||||
            <fm-map-layer-list [baseLayers]="true" [itemLayers]="baseMaps|async" [selectedLayer]="selectedBaseLayer|async" (onSelectLayer)="handleSelectBaseLayer($event)"></fm-map-layer-list>
 | 
			
		||||
          </div>
 | 
			
		||||
        </li>
 | 
			
		||||
        <li class="nav-item py-0">
 | 
			
		||||
@@ -20,12 +20,17 @@
 | 
			
		||||
          </div>
 | 
			
		||||
        </li>
 | 
			
		||||
        <li class="nav-item py-0" *ngIf="selectedItemLayer$ | async as selectedItemLayer">
 | 
			
		||||
          <span><i class="fal fa-layer-group" aria-hidden="true"></i> <span i18n>Data</span><span class="slideButton"><a href="#" title="Compare" class="btn btn-light btn-sm" (click)="handleToggleShowDatalayerSlide($event)"><i class="fal fa-sliders-h-square"></i></a></span></span>
 | 
			
		||||
          <span><i class="fal fa-layer-group" aria-hidden="true"></i> <span i18n>Overlay slider</span><span class="slideButton"><a href="#" title="Compare" class="btn btn-light btn-sm" (click)="handleToggleShowDatalayerSlide($event)"><i class="fal fa-sliders-h-square"></i></a></span></span>
 | 
			
		||||
          <div class="mb-4">
 | 
			
		||||
            <fm-map-layer-list [dataLayers]="true" [itemLayers]="[selectedItemLayer]" [selectedLayer]="selectedItemLayer" (onToggleVisibility)="handleOnToggleVisibility($event)" (onSetOpacity)="handleOnSetOpacity($event)" (onZoomToExtent)="handleZoomToExtent($event)" (onSelectLayer)="handleSelectOverlayLayer($event)"></fm-map-layer-list>
 | 
			
		||||
          </div>
 | 
			
		||||
        </li>
 | 
			
		||||
 | 
			
		||||
        <li class="nav-item py-0">
 | 
			
		||||
          <span><i class="fal fa-layer-group" aria-hidden="true"></i> <span i18n>Aerial photos</span></span>
 | 
			
		||||
          <div  class="mb-4">
 | 
			
		||||
            <fm-map-layer-list [baseLayers]="true" [itemLayers]="aerialMaps|async" [selectedLayer]="selectedBaseLayer|async" (onSelectLayer)="handleSelectBaseLayer($event)"></fm-map-layer-list>
 | 
			
		||||
          </div>
 | 
			
		||||
        </li>
 | 
			
		||||
      </ul>
 | 
			
		||||
  </div>
 | 
			
		||||
  </div>
 | 
			
		||||
 
 | 
			
		||||
@@ -4,7 +4,7 @@ import { Store } from '@ngrx/store';
 | 
			
		||||
import * as mapReducers from '../../reducers/map.reducer';
 | 
			
		||||
import * as mapActions from '../../actions/map.actions';
 | 
			
		||||
import {createEmpty,extend } from 'ol/extent';
 | 
			
		||||
import { Observable } from 'rxjs';
 | 
			
		||||
import { filter, map, Observable } from 'rxjs';
 | 
			
		||||
 | 
			
		||||
@Component({
 | 
			
		||||
  selector: 'fm-map-layer-switcher',
 | 
			
		||||
@@ -17,7 +17,8 @@ export class LayerSwitcher  implements OnInit,OnChanges{
 | 
			
		||||
  public overlayLayers: Observable<Array<IItemLayer>>;
 | 
			
		||||
  public selectedOverlayLayer: Observable<IItemLayer>;
 | 
			
		||||
  public selectedItemLayer$: Observable<IItemLayer>;
 | 
			
		||||
  public baseLayers: Observable<Array<IItemLayer>>;
 | 
			
		||||
  public baseMaps: Observable<Array<IItemLayer>>;
 | 
			
		||||
  public aerialMaps: Observable<Array<IItemLayer>>;
 | 
			
		||||
  public selectedBaseLayer: Observable<IItemLayer>;
 | 
			
		||||
 | 
			
		||||
  constructor( private store: Store<mapReducers.State>) {
 | 
			
		||||
@@ -26,7 +27,8 @@ export class LayerSwitcher  implements OnInit,OnChanges{
 | 
			
		||||
  ngOnInit() { 
 | 
			
		||||
    this.overlayLayers = this.store.select(mapReducers.selectGetOverlayLayers);
 | 
			
		||||
    this.selectedOverlayLayer = this.store.select(mapReducers.selectGetSelectedOverlayLayer);
 | 
			
		||||
    this.baseLayers = this.store.select(mapReducers.selectGetBaseLayers);
 | 
			
		||||
    this.baseMaps = this.store.select(mapReducers.selectGetBaseMaps);
 | 
			
		||||
    this.aerialMaps = this.store.select(mapReducers.selectGetArealMaps);
 | 
			
		||||
    this.selectedBaseLayer = this.store.select(mapReducers.selectGetSelectedBaseLayer);
 | 
			
		||||
    this.selectedItemLayer$ = this.store.select(mapReducers.selectGetSelectedItemLayer)
 | 
			
		||||
    this.showLayerSwitcher = this.store.select(mapReducers.selectGetShowLayerSwitcher);
 | 
			
		||||
@@ -83,3 +85,4 @@ export class LayerSwitcher  implements OnInit,OnChanges{
 | 
			
		||||
    event.preventDefault();
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -52,12 +52,21 @@ aol-map { position:absolute;width:100%;height:calc( 100vh );}
 | 
			
		||||
  pointer-events: none;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@media screen and (max-width: 768px) {
 | 
			
		||||
  .control-container {
 | 
			
		||||
    margin-left: 1em;
 | 
			
		||||
    margin-right: 1em;
 | 
			
		||||
    pointer-events: all;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@media screen and (min-width: 768px) {
 | 
			
		||||
  .control-container {    
 | 
			
		||||
    float: right;
 | 
			
		||||
    margin-right: 1em;
 | 
			
		||||
    pointer-events: all;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.fullscreen .viewport-container {
 | 
			
		||||
  margin-bottom: 1em;
 | 
			
		||||
 
 | 
			
		||||
@@ -92,6 +92,8 @@ export class MapComponent implements OnInit, OnDestroy,AfterViewInit {
 | 
			
		||||
  public noContent = false;
 | 
			
		||||
  public overrideSelectedItemLayer = false;
 | 
			
		||||
  public overrideOverlayLayers = false;
 | 
			
		||||
  public hideShowLayerValues = false;
 | 
			
		||||
  public const
 | 
			
		||||
  public dataLayerSlideValue = 50;
 | 
			
		||||
  public dataLayerSlideEnabled = false;
 | 
			
		||||
  private visibleAreaBottom = 0;
 | 
			
		||||
@@ -116,6 +118,7 @@ export class MapComponent implements OnInit, OnDestroy,AfterViewInit {
 | 
			
		||||
      const params = route.snapshot.data["fm-map-map"];
 | 
			
		||||
      this.overrideSelectedItemLayer = params["overrideSelectedItemlayer"] ? params["overrideSelectedItemlayer"] : false;
 | 
			
		||||
      this.overrideOverlayLayers = params["overrideOverlayLayers"] ? params["overrideOverlayLayers"] : false;
 | 
			
		||||
      this.hideShowLayerValues = params["hideShowLayerValues"] ? params["hideShowLayerValues"] : false;
 | 
			
		||||
    }
 | 
			
		||||
    this.querySub = this.query$.pipe(skip(1), withLatestFrom(this.mapState$)).subscribe(([query, mapState]) => {
 | 
			
		||||
      if (query && query.querystate) {
 | 
			
		||||
@@ -297,11 +300,13 @@ export class MapComponent implements OnInit, OnDestroy,AfterViewInit {
 | 
			
		||||
 | 
			
		||||
  normalizeMapState(mapState: IMapState): IMapState {
 | 
			
		||||
    if (!mapState) return null;
 | 
			
		||||
    return {zoom: this.round(mapState.zoom,0),
 | 
			
		||||
    return {
 | 
			
		||||
      zoom: this.round(mapState.zoom, 0),
 | 
			
		||||
      rotation: this.round(mapState.rotation, 2),
 | 
			
		||||
      xCenter: this.round(mapState.xCenter, 5),
 | 
			
		||||
      yCenter: this.round(mapState.yCenter, 5),
 | 
			
		||||
      baseLayerCode: mapState.baseLayerCode };
 | 
			
		||||
      baseLayerCode: mapState.baseLayerCode
 | 
			
		||||
    };
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  serializeMapState(mapState: IMapState): string {
 | 
			
		||||
@@ -472,11 +477,13 @@ export class MapComponent implements OnInit, OnDestroy,AfterViewInit {
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  handleShowLayerValues(event: MouseEvent) {
 | 
			
		||||
    if (!this.hideShowLayerValues) {
 | 
			
		||||
      event.stopPropagation();
 | 
			
		||||
      this.zone.run(() => {
 | 
			
		||||
        this.store.dispatch(new mapActions.ToggleLayerValuesEnabled());
 | 
			
		||||
      });
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  handleOnDownload(event) {
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -25,7 +25,7 @@ export class SelectedItemCropfieldComponent extends AbstractSelectedItemComponen
 | 
			
		||||
  public items: Observable<IListItem[]>;
 | 
			
		||||
 | 
			
		||||
  constructor(store: Store<mapReducers.State | commonReducers.State>, itemTypeService: ItemTypeService, location: Location, router: Router, private itemService$: ItemService,private folderService$: FolderService) {
 | 
			
		||||
    super(store, itemTypeService,location,router);
 | 
			
		||||
    super(store, itemTypeService, itemService$, location,router);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  areaInHa(item:IItem):number {
 | 
			
		||||
 
 | 
			
		||||
@@ -7,7 +7,8 @@
 | 
			
		||||
        <h2 *ngIf="parentOfItemType('vnd.farmmaps.itemtype.cropfield')">{{parentItem.name}}</h2>
 | 
			
		||||
        <h1>{{item.name}}</h1>
 | 
			
		||||
      </div>
 | 
			
		||||
      <div class="legend-container" *ngIf="item?.data.layers;let layers">
 | 
			
		||||
      <ng-container *ngIf="item?.data.layers;let layers">
 | 
			
		||||
        <div class="legend-container">
 | 
			
		||||
          <div class="card menu-card">
 | 
			
		||||
            <div *ngIf="layers.length>1">
 | 
			
		||||
              <select (change)="onLayerChanged($event.target.value)">
 | 
			
		||||
@@ -26,9 +27,11 @@
 | 
			
		||||
              <li *ngIf="getItemLayer(item,itemLayer.layerIndex)"><a  href="#" (click)="handleRemoveLayer(item,itemLayer.layerIndex)"><i class="fas fa-layer-minus" aria-hidden="true" i18n-title title="Remove overlay"></i> <span i18n>Remove overlay</span></a></li>
 | 
			
		||||
            </ng-container>
 | 
			
		||||
            <li><fm-item-link class="text-primary p-0" [itemCode]="item.code" pathSuffix="data" [showText]="true"></fm-item-link></li>
 | 
			
		||||
            <li><a href="#" (click)="download($event,item,layers,itemLayer.layerIndex)"><i class="fal fa-download" aria-hidden="true" i18n-title title="Download"></i> <span i18n>Download</span></a></li>
 | 
			
		||||
          </ul>
 | 
			
		||||
        </div>
 | 
			
		||||
        <fm-map-zoom-to-show-alert [layer]="itemLayer?.layer"></fm-map-zoom-to-show-alert>
 | 
			
		||||
      </ng-container>
 | 
			
		||||
    </div>
 | 
			
		||||
  </div>
 | 
			
		||||
</div>
 | 
			
		||||
 
 | 
			
		||||
@@ -1,12 +1,13 @@
 | 
			
		||||
import { Component, Injectable } from '@angular/core';
 | 
			
		||||
import { Location } from '@angular/common';
 | 
			
		||||
import { Store } from '@ngrx/store';
 | 
			
		||||
import * as mapReducers from '../../reducers/map.reducer';
 | 
			
		||||
import { commonReducers, ItemTypeService, ItemService, FolderService } from '@farmmaps/common';
 | 
			
		||||
import { Component, Injectable, OnDestroy } from '@angular/core';
 | 
			
		||||
import { Router } from '@angular/router';
 | 
			
		||||
import { commonReducers, FolderService, IItem, IItemLinkType, ItemService, ItemTypeService, IUrlType } from '@farmmaps/common';
 | 
			
		||||
import { Store } from '@ngrx/store';
 | 
			
		||||
import { Subscription } from 'rxjs';
 | 
			
		||||
import * as mapActions from '../../actions/map.actions';
 | 
			
		||||
import * as mapReducers from '../../reducers/map.reducer';
 | 
			
		||||
import { ForItemType } from '../for-item/for-itemtype.decorator';
 | 
			
		||||
import { AbstractSelectedItemComponent } from '../selected-item/selected-item.component';
 | 
			
		||||
import * as mapActions from '../../actions/map.actions';
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ForItemType("vnd.farmmaps.itemtype.geotiff.processed")
 | 
			
		||||
@@ -16,10 +17,15 @@ import * as mapActions from '../../actions/map.actions';
 | 
			
		||||
  templateUrl: './selected-item-geotiff.component.html',
 | 
			
		||||
  styleUrls: ['./selected-item-geotiff.component.scss']
 | 
			
		||||
})
 | 
			
		||||
export class SelectedItemGeotiffComponent extends AbstractSelectedItemComponent {
 | 
			
		||||
export class SelectedItemGeotiffComponent extends AbstractSelectedItemComponent implements OnDestroy {
 | 
			
		||||
  sub: Subscription;
 | 
			
		||||
 | 
			
		||||
  constructor(store: Store<mapReducers.State | commonReducers.State>, itemTypeService: ItemTypeService, location: Location, router: Router, private itemService$: ItemService,private folderService$: FolderService) {
 | 
			
		||||
    super(store, itemTypeService,location,router);
 | 
			
		||||
  constructor(store: Store<mapReducers.State | commonReducers.State>, public itemService: ItemService, itemTypeService: ItemTypeService, location: Location, router: Router, private itemService$: ItemService,private folderService$: FolderService) {
 | 
			
		||||
    super(store, itemTypeService,itemService,location,router);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  ngOnDestroy(): void {
 | 
			
		||||
    if (this.sub) this.sub.unsubscribe();
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  onLayerChanged(layerIndex: number) {
 | 
			
		||||
@@ -29,4 +35,13 @@ export class SelectedItemGeotiffComponent extends AbstractSelectedItemComponent
 | 
			
		||||
  layer(layers:any,layerIndex:number) {
 | 
			
		||||
    return layers.find(l => l.index == layerIndex);
 | 
			
		||||
  }
 | 
			
		||||
  
 | 
			
		||||
  download(event:MouseEvent,item:IItem,layers:any,layerIndex:number) {
 | 
			
		||||
    event.stopPropagation();
 | 
			
		||||
    event.preventDefault();
 | 
			
		||||
    const itemLink : IItemLinkType = {itemcode:item.code,query:`layer=${this.layer(layers,layerIndex).name}`,pathsuffix:"download", validminutes:10}
 | 
			
		||||
    this.sub = this.itemService.getItemLink(itemLink).subscribe((itemLinkUrl:IUrlType) => {  
 | 
			
		||||
        window.location.href = itemLinkUrl.url;     
 | 
			
		||||
    })
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -7,7 +7,8 @@
 | 
			
		||||
        <h2 *ngIf="parentOfItemType('vnd.farmmaps.itemtype.cropfield')">{{parentItem.name}}</h2>
 | 
			
		||||
        <h1>{{item.name}}</h1>
 | 
			
		||||
      </div>
 | 
			
		||||
      <div class="legend-container" *ngIf="item?.data.layers;let layers">
 | 
			
		||||
      <ng-container *ngIf="item?.data.layers;let layers">
 | 
			
		||||
        <div class="legend-container">
 | 
			
		||||
          <div class="card menu-card">
 | 
			
		||||
            <div *ngIf="layers.length>1">
 | 
			
		||||
              <select (change)="onLayerChanged($event.target.value)">
 | 
			
		||||
@@ -24,8 +25,10 @@
 | 
			
		||||
              <li *ngIf="!getItemLayer(item,itemLayer.layerIndex)"><a   href="#" (click)="handleAddAsLayer(item,itemLayer.layerIndex)" ><i class="fas fa-layer-olus" aria-hidden="true" i18n-title title="Add as layer"></i> <span i18n>Add as overlay</span></a></li>
 | 
			
		||||
              <li *ngIf="getItemLayer(item,itemLayer.layerIndex)"><a  href="#" (click)="handleRemoveLayer(item,itemLayer.layerIndex)" ><i class="fas fa-layer-minus" aria-hidden="true" i18n-title title="Remove overlay"></i> <span i18n>Remove overlay</span></a></li>
 | 
			
		||||
            </ng-container>
 | 
			
		||||
            <li><a href="#" (click)="download($event,item,layers,itemLayer.layerIndex)"><i class="fal fa-download" aria-hidden="true" i18n-title title="Download"></i> <span i18n>Download</span></a></li>
 | 
			
		||||
          </ul>
 | 
			
		||||
        </div>
 | 
			
		||||
      </ng-container>
 | 
			
		||||
      <fm-map-zoom-to-show-alert [layer]="itemLayer?.layer"></fm-map-zoom-to-show-alert>
 | 
			
		||||
    </div>
 | 
			
		||||
  </div>
 | 
			
		||||
 
 | 
			
		||||
@@ -1,14 +1,13 @@
 | 
			
		||||
import { Component, Input, Injectable, OnInit } from '@angular/core';
 | 
			
		||||
import { Location } from '@angular/common';
 | 
			
		||||
import { Feature } from 'ol';
 | 
			
		||||
import { Component, Injectable, OnDestroy } from '@angular/core';
 | 
			
		||||
import { Router } from '@angular/router';
 | 
			
		||||
import { commonReducers, FolderService, IItem, IItemLinkType, ItemService, ItemTypeService, IUrlType } from '@farmmaps/common';
 | 
			
		||||
import { Store } from '@ngrx/store';
 | 
			
		||||
import * as mapReducers from '../../reducers/map.reducer';
 | 
			
		||||
import { commonReducers, ItemTypeService, IItem, Item, ItemService, FolderService, IListItem} from '@farmmaps/common';
 | 
			
		||||
import * as mapActions from '../../actions/map.actions';
 | 
			
		||||
import { Router, ActivatedRoute, ParamMap, Event } from '@angular/router';
 | 
			
		||||
import * as mapReducers from '../../reducers/map.reducer';
 | 
			
		||||
import { ForItemType } from '../for-item/for-itemtype.decorator';
 | 
			
		||||
import { AbstractSelectedItemComponent } from '../selected-item/selected-item.component';
 | 
			
		||||
import { Observable } from 'rxjs';
 | 
			
		||||
import { Subscription } from 'rxjs';
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ForItemType("vnd.farmmaps.itemtype.shape.processed")
 | 
			
		||||
@@ -18,12 +17,17 @@ import { Observable } from 'rxjs';
 | 
			
		||||
  templateUrl: './selected-item-shape.component.html',
 | 
			
		||||
  styleUrls: ['./selected-item-shape.component.scss']
 | 
			
		||||
})
 | 
			
		||||
export class SelectedItemShapeComponent extends AbstractSelectedItemComponent {
 | 
			
		||||
 | 
			
		||||
  constructor(store: Store<mapReducers.State | commonReducers.State>, itemTypeService: ItemTypeService, location: Location, router: Router, private itemService$: ItemService,private folderService$: FolderService) {
 | 
			
		||||
    super(store, itemTypeService,location,router);
 | 
			
		||||
  }
 | 
			
		||||
export class SelectedItemShapeComponent extends AbstractSelectedItemComponent implements OnDestroy {
 | 
			
		||||
  public selectedLayer = 0;
 | 
			
		||||
  sub: Subscription;
 | 
			
		||||
 | 
			
		||||
  constructor(store: Store<mapReducers.State | commonReducers.State>, public itemService: ItemService, itemTypeService: ItemTypeService, location: Location, router: Router, private itemService$: ItemService,private folderService$: FolderService) {
 | 
			
		||||
    super(store, itemTypeService,itemService,location,router);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  ngOnDestroy(): void {
 | 
			
		||||
    if (this.sub) this.sub.unsubscribe();
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  onLayerChanged(layerIndex: number) {
 | 
			
		||||
    this.store.dispatch(new mapActions.SetLayerIndex(layerIndex));
 | 
			
		||||
@@ -32,4 +36,13 @@ export class SelectedItemShapeComponent extends AbstractSelectedItemComponent {
 | 
			
		||||
  layer(layers:any,layerIndex:number) {
 | 
			
		||||
    return layers.find(l => l.index == layerIndex);
 | 
			
		||||
  }
 | 
			
		||||
    
 | 
			
		||||
  download(event:MouseEvent,item:IItem,layers:any,layerIndex:number) {
 | 
			
		||||
    event.stopPropagation();
 | 
			
		||||
    event.preventDefault();
 | 
			
		||||
    const itemLink : IItemLinkType = {itemcode:item.code,query:`layer=${this.layer(layers,layerIndex).name}`,pathsuffix:"download", validminutes:10}
 | 
			
		||||
    this.sub = this.itemService.getItemLink(itemLink).subscribe((itemLinkUrl:IUrlType) => {  
 | 
			
		||||
        window.location.href = itemLinkUrl.url;     
 | 
			
		||||
    })
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -7,7 +7,8 @@
 | 
			
		||||
        <h2 *ngIf="parentOfItemType('vnd.farmmaps.itemtype.cropfield')">{{parentItem.name}}</h2>
 | 
			
		||||
        <h1>{{item.name}}</h1>
 | 
			
		||||
      </div>
 | 
			
		||||
      <div class="legend-container" *ngIf="item?.data.layers;let layers">
 | 
			
		||||
      <ng-container *ngIf="item?.data.layers;let layers">
 | 
			
		||||
        <div class="legend-container">
 | 
			
		||||
          <div class="card menu-card">
 | 
			
		||||
            <h5><span i18n>Date</span>: {{temporalService.selectedDate(itemLayer)}}</h5>
 | 
			
		||||
            <div class="d-flex justify-content-between">
 | 
			
		||||
@@ -42,9 +43,10 @@
 | 
			
		||||
              <li *ngIf="getItemLayer(item,itemLayer.layerIndex)"><a  href="#" (click)="handleRemoveLayer(item,itemLayer.layerIndex)"><i class="fas fa-layer-minus" aria-hidden="true" i18n-title title="Remove overlay"></i> <span i18n>Remove overlay</span></a></li>
 | 
			
		||||
            </ng-container>
 | 
			
		||||
            <li><a href="#" (click)="handleGoToChart(item)"><i class="fal fa-line-chart" aria-hidden="true" i18m-title title="Show chart"></i> <span i18n>Show chart</span></a></li>
 | 
			
		||||
          <li><a href="#" (click)="download(item,$event)"><i class="fal fa-download" aria-hidden="true" i18n-title title="Download"></i> <span i18n>Download</span></a></li>
 | 
			
		||||
            <li><a href="#" (click)="download($event,item,layers,itemLayer.layerIndex)"><i class="fal fa-download" aria-hidden="true" i18n-title title="Download"></i> <span i18n>Download</span></a></li>
 | 
			
		||||
          </ul>
 | 
			
		||||
        </div>
 | 
			
		||||
      </ng-container>
 | 
			
		||||
    </div>
 | 
			
		||||
  </div>
 | 
			
		||||
</div>
 | 
			
		||||
 
 | 
			
		||||
@@ -1,15 +1,15 @@
 | 
			
		||||
import { Component, Injectable } from '@angular/core';
 | 
			
		||||
import { Location } from '@angular/common';
 | 
			
		||||
import { Store } from '@ngrx/store';
 | 
			
		||||
import * as mapReducers from '../../reducers/map.reducer';
 | 
			
		||||
import { commonReducers, ItemTypeService, IItem, ItemService, IItemLinkType, IUrlType } from '@farmmaps/common';
 | 
			
		||||
import { Component, Injectable, OnDestroy } from '@angular/core';
 | 
			
		||||
import { Router } from '@angular/router';
 | 
			
		||||
import { commonReducers, IItem, IItemLinkType, ItemService, ItemTypeService, IUrlType } from '@farmmaps/common';
 | 
			
		||||
import { Store } from '@ngrx/store';
 | 
			
		||||
import { Subscription } from 'rxjs';
 | 
			
		||||
import * as mapActions from '../../actions/map.actions';
 | 
			
		||||
import { IItemLayer, ITemporalItemLayer } from '../../models/item.layer';
 | 
			
		||||
import * as mapReducers from '../../reducers/map.reducer';
 | 
			
		||||
import { TemporalService } from '../../services/temporal.service';
 | 
			
		||||
import { ForItemType } from '../for-item/for-itemtype.decorator';
 | 
			
		||||
import { AbstractSelectedItemComponent } from '../selected-item/selected-item.component';
 | 
			
		||||
import { ITemporalItemLayer} from '../../models/item.layer';
 | 
			
		||||
import * as mapActions from '../../actions/map.actions';
 | 
			
		||||
import { IItemLayer } from '../../models/item.layer';
 | 
			
		||||
import {TemporalService} from '../../services/temporal.service';
 | 
			
		||||
 | 
			
		||||
@ForItemType("vnd.farmmaps.itemtype.temporal")
 | 
			
		||||
@Injectable()
 | 
			
		||||
@@ -18,10 +18,15 @@ import {TemporalService} from '../../services/temporal.service';
 | 
			
		||||
  templateUrl: './selected-item-temporal.component.html',
 | 
			
		||||
  styleUrls: ['./selected-item-temporal.component.scss']
 | 
			
		||||
})
 | 
			
		||||
export class SelectedItemTemporalComponent extends AbstractSelectedItemComponent {
 | 
			
		||||
export class SelectedItemTemporalComponent extends AbstractSelectedItemComponent implements OnDestroy {
 | 
			
		||||
  sub: Subscription;
 | 
			
		||||
 | 
			
		||||
  constructor(store: Store<mapReducers.State | commonReducers.State>, public itemService: ItemService, itemTypeService: ItemTypeService, location: Location, router: Router,public temporalService:TemporalService) {
 | 
			
		||||
    super(store, itemTypeService,location,router);
 | 
			
		||||
    super(store, itemTypeService,itemService,location,router);
 | 
			
		||||
  }
 | 
			
		||||
  
 | 
			
		||||
  ngOnDestroy(): void {
 | 
			
		||||
    if (this.sub) this.sub.unsubscribe();
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  onLayerChanged(layerIndex: number) {
 | 
			
		||||
@@ -32,8 +37,6 @@ export class SelectedItemTemporalComponent extends AbstractSelectedItemComponent
 | 
			
		||||
    return  (this.itemLayer as ITemporalItemLayer)?.selectedItemLayer
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  
 | 
			
		||||
 | 
			
		||||
  handleNextTemporal(event:MouseEvent) {
 | 
			
		||||
    this.store.dispatch(new mapActions.NextTemporal());
 | 
			
		||||
    event.preventDefault();    
 | 
			
		||||
@@ -61,14 +64,12 @@ export class SelectedItemTemporalComponent extends AbstractSelectedItemComponent
 | 
			
		||||
    return false;
 | 
			
		||||
  }
 | 
			
		||||
  
 | 
			
		||||
  download(item:IItem,event:MouseEvent) {
 | 
			
		||||
  download(event:MouseEvent,item:IItem,layers:any,layerIndex:number) {
 | 
			
		||||
    event.stopPropagation();
 | 
			
		||||
    event.preventDefault();
 | 
			
		||||
    const itemLink : IItemLinkType = {itemcode:item.code,pathsuffix:"download", validminutes:10}
 | 
			
		||||
    console.log('download1', itemLink)
 | 
			
		||||
    const foo = this.itemService.getItemLink(itemLink).subscribe((itemLinkUrl:IUrlType) => {  
 | 
			
		||||
      console.log('download2', itemLinkUrl)
 | 
			
		||||
       window.location.href =itemLinkUrl.url        
 | 
			
		||||
    const itemLink : IItemLinkType = {itemcode:item.code,query:`layer=${this.layer(layers,layerIndex).name}`,pathsuffix:"download", validminutes:10}
 | 
			
		||||
    this.sub = this.itemService.getItemLink(itemLink).subscribe((itemLinkUrl:IUrlType) => {  
 | 
			
		||||
       window.location.href = itemLinkUrl.url;       
 | 
			
		||||
    })
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -2,7 +2,7 @@ import {Component, Injectable, Input, Directive} from '@angular/core';
 | 
			
		||||
import {Location} from '@angular/common';
 | 
			
		||||
import {Store} from '@ngrx/store';
 | 
			
		||||
import * as mapReducers from '../../reducers/map.reducer';
 | 
			
		||||
import {AppConfig, commonReducers, IItem, ItemTypeService} from '@farmmaps/common';
 | 
			
		||||
import {AppConfig, commonReducers, IItem, ItemService, ItemTypeService} from '@farmmaps/common';
 | 
			
		||||
import * as mapActions from '../../actions/map.actions';
 | 
			
		||||
import {Router} from '@angular/router';
 | 
			
		||||
import { IItemLayer } from '../../models/item.layer';
 | 
			
		||||
@@ -15,7 +15,7 @@ export abstract class AbstractSelectedItemComponent {
 | 
			
		||||
  @Input() parentItem: IItem;
 | 
			
		||||
  @Input() itemLayer: IItemLayer;
 | 
			
		||||
  @Input() overlayLayers: Array<IItemLayer>;
 | 
			
		||||
  constructor(public store: Store<mapReducers.State | commonReducers.State>, public itemTypeService: ItemTypeService, private location: Location, public router: Router) {
 | 
			
		||||
  constructor(public store: Store<mapReducers.State | commonReducers.State>, public itemTypeService: ItemTypeService, public itemService: ItemService, private location: Location, public router: Router) {
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  handleOnView(item: IItem) {
 | 
			
		||||
@@ -37,6 +37,11 @@ export abstract class AbstractSelectedItemComponent {
 | 
			
		||||
    return false;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  handleOnDelete(item: IItem) {
 | 
			
		||||
    this.itemService.deleteItem(item.code);
 | 
			
		||||
    return false;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  handleAddAsLayer(item: IItem,layerIndex = -1) {
 | 
			
		||||
    this.store.dispatch(new mapActions.AddLayer(item,layerIndex));
 | 
			
		||||
    return false;
 | 
			
		||||
@@ -76,8 +81,8 @@ export abstract class AbstractSelectedItemComponent {
 | 
			
		||||
})
 | 
			
		||||
export class SelectedItemComponent extends AbstractSelectedItemComponent {
 | 
			
		||||
 | 
			
		||||
  constructor(store: Store<mapReducers.State | commonReducers.State>, itemTypeService: ItemTypeService, location: Location, router: Router, public config:AppConfig) {
 | 
			
		||||
    super(store, itemTypeService,location,router);
 | 
			
		||||
  constructor(store: Store<mapReducers.State | commonReducers.State>, itemTypeService: ItemTypeService, itemService: ItemService, location: Location, router: Router, public config:AppConfig) {
 | 
			
		||||
    super(store, itemTypeService,itemService,location,router);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  getThumbnailUrl(item:IItem):string {
 | 
			
		||||
 
 | 
			
		||||
@@ -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<Feature<Geometry>>,
 | 
			
		||||
  featuresBackup: Array<Feature<Geometry>>,
 | 
			
		||||
  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;
 | 
			
		||||
    }
 | 
			
		||||
@@ -637,6 +658,8 @@ export const selectGetExtent = createSelector(selectMapState, getExtent);
 | 
			
		||||
export const selectGetViewExtent = createSelector(selectMapState, getViewExtent);
 | 
			
		||||
export const selectGetOverlayLayers = createSelector(selectMapState, getOverlayLayers);
 | 
			
		||||
export const selectGetBaseLayers = createSelector(selectMapState, getBaseLayers);
 | 
			
		||||
export const selectGetBaseMaps = createSelector(selectGetBaseLayers, (layers) => layers.filter(layer => layer.item.data.category === "baseMap"));
 | 
			
		||||
export const selectGetArealMaps = createSelector(selectGetBaseLayers, (layers) => layers.filter(layer => layer.item.data.category === "aerialPhoto").sort((a, b) => a.item.dataDate <= b.item.dataDate ? 1 : -1));
 | 
			
		||||
export const selectGetProjection = createSelector(selectMapState, getProjection);
 | 
			
		||||
export const selectGetSelectedBaseLayer = createSelector(selectMapState, getSelectedBaseLayer);
 | 
			
		||||
export const selectGetSelectedOverlayLayer = createSelector(selectMapState, getSelectedOverlayLayer);
 | 
			
		||||
 
 | 
			
		||||
@@ -26,6 +26,7 @@ export class Item implements IItem {
 | 
			
		||||
  public data?:any;
 | 
			
		||||
  public isEditable?:boolean;
 | 
			
		||||
  public owner?: string;
 | 
			
		||||
  public fullPath?: string;
 | 
			
		||||
 | 
			
		||||
  constructor() {  
 | 
			
		||||
  }
 | 
			
		||||
 
 | 
			
		||||
@@ -53,15 +53,19 @@ export class AdminService {
 | 
			
		||||
    return this.httpClient.post<IItemTask>(`${this.ApiEndpoint()}/api/v1/admin/${item.code}/tasks`, task);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  getAnalyseFolderOverview(): Observable<any> {
 | 
			
		||||
    return this.httpClient.get<any>(`${this.ApiEndpoint()}/api/v1/admin/analysefolder/folderinfo/overview`);
 | 
			
		||||
  getFileStorageOverview(): Observable<any> {
 | 
			
		||||
    return this.httpClient.get<any>(`${this.ApiEndpoint()}/api/v1/admin/filestorage/folderinfo/overview`);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  getAnalyseFolderInfo(user: string): Observable<any> {
 | 
			
		||||
    return this.httpClient.get<any>(`${this.ApiEndpoint()}/api/v1/admin/analysefolder/folderinfo/${user}`);
 | 
			
		||||
  getFileStorageInfo(user: string): Observable<any> {
 | 
			
		||||
    return this.httpClient.get<any>(`${this.ApiEndpoint()}/api/v1/admin/filestorage/folderinfo/${user}`);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  getAnalyseFolderLog(): Observable<any> {
 | 
			
		||||
    return this.httpClient.get<any>(`${this.ApiEndpoint()}/api/v1/admin/analysefolder/folderinfo/log`);
 | 
			
		||||
  getFileStorageLog(): Observable<any> {
 | 
			
		||||
    return this.httpClient.get<any>(`${this.ApiEndpoint()}/api/v1/admin/filestorage/folderinfo/log`);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  validateEmail(user: IUser) {
 | 
			
		||||
    return this.httpClient.post(`${this.ApiEndpoint()}/api/v1/admin/user/${user.code}/validateemail`, user);
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -79,7 +79,8 @@ export class ItemService {
 | 
			
		||||
 | 
			
		||||
  getItemList(itemType?: string, dataFilter?: any, level?: number, atItemLocationItemCode?: string,
 | 
			
		||||
    indexed?: boolean, validToday?: boolean,tags?:string,crs?:string, startDate?: Date, endDate?: Date,
 | 
			
		||||
    skip?: number, take?: number, sourceTask?: string, exactMatchStartOrEndDate?: boolean, owner?:string): Observable<IItem[]> {
 | 
			
		||||
    skip?: number, take?: number, sourceTask?: string, exactMatchStartOrEndDate?: boolean, owner?:string,
 | 
			
		||||
    includeFullpath?: boolean): Observable<IItem[]> {
 | 
			
		||||
    let params = new HttpParams();
 | 
			
		||||
    if(itemType)  params = params.append("it", itemType);
 | 
			
		||||
    if(dataFilter) params = params.append("df", JSON.stringify(dataFilter));
 | 
			
		||||
@@ -96,6 +97,7 @@ export class ItemService {
 | 
			
		||||
    if(take) params = params.append("take", take);
 | 
			
		||||
    if(exactMatchStartOrEndDate !== undefined) params = params.append("exactMatchStartOrEndDate", exactMatchStartOrEndDate);
 | 
			
		||||
    if(owner) params = params.append("owner", owner);
 | 
			
		||||
    if(includeFullpath) params = params.append("includeFullpath",includeFullpath?"true":"false");
 | 
			
		||||
    return this.httpClient.get<IItem[]>(`${this.ApiEndpoint()}/api/v1/items/`, { params: params });
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
@@ -114,7 +116,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<IItem[]> {
 | 
			
		||||
                   exactMatchStartOrEndDate?: boolean, owner?:string, indexed?: boolean,
 | 
			
		||||
                  atItemLocationItemCode?: string): Observable<IItem[]> {
 | 
			
		||||
    let params = new HttpParams();
 | 
			
		||||
    if(itemType != null) {
 | 
			
		||||
      params = params.append("it", itemType);
 | 
			
		||||
@@ -132,6 +135,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<IItem[]>(`${this.ApiEndpoint()}/api/v1/items/${parentcode}/children`, { params: params });
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user