Compare commits
63 Commits
78249811ab
...
develop
Author | SHA1 | Date | |
---|---|---|---|
|
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 | ||
|
2137f3f07e | ||
a46e8040b2 | |||
|
2ca9730735 | ||
3d2ca8fb9f | |||
6810da8b79 | |||
|
4866a6f22d | ||
84a1004977 | |||
39c619a837 | |||
|
758613aa12 | ||
6914a61bc4 | |||
9f43287433 | |||
|
10df983ae3 |
12
package-lock.json
generated
12
package-lock.json
generated
@@ -1,12 +1,12 @@
|
|||||||
{
|
{
|
||||||
"name": "farmmaps-lib-app",
|
"name": "farmmaps-lib-app",
|
||||||
"version": "4.14.0",
|
"version": "4.18.0",
|
||||||
"lockfileVersion": 3,
|
"lockfileVersion": 3,
|
||||||
"requires": true,
|
"requires": true,
|
||||||
"packages": {
|
"packages": {
|
||||||
"": {
|
"": {
|
||||||
"name": "farmmaps-lib-app",
|
"name": "farmmaps-lib-app",
|
||||||
"version": "4.14.0",
|
"version": "4.18.0",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@angular-eslint/eslint-plugin": "^18.2.0",
|
"@angular-eslint/eslint-plugin": "^18.2.0",
|
||||||
"@angular/animations": "18.2.3",
|
"@angular/animations": "18.2.3",
|
||||||
@@ -90,7 +90,7 @@
|
|||||||
},
|
},
|
||||||
"dist/common": {
|
"dist/common": {
|
||||||
"name": "@farmmaps/common",
|
"name": "@farmmaps/common",
|
||||||
"version": "4.14.0-prerelease.2538",
|
"version": "4.18.0-prerelease.2575",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"tslib": "^2.3.0"
|
"tslib": "^2.3.0"
|
||||||
},
|
},
|
||||||
@@ -115,7 +115,7 @@
|
|||||||
},
|
},
|
||||||
"dist/common-map": {
|
"dist/common-map": {
|
||||||
"name": "@farmmaps/common-map",
|
"name": "@farmmaps/common-map",
|
||||||
"version": "4.14.0-prerelease.2538",
|
"version": "4.18.0-prerelease.2575",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"tslib": "^2.0.0"
|
"tslib": "^2.0.0"
|
||||||
},
|
},
|
||||||
@@ -130,7 +130,7 @@
|
|||||||
},
|
},
|
||||||
"dist/common-map3d": {
|
"dist/common-map3d": {
|
||||||
"name": "@farmmaps/common-map3d",
|
"name": "@farmmaps/common-map3d",
|
||||||
"version": "4.14.0-prerelease.2538",
|
"version": "4.18.0-prerelease.2575",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"tslib": "^2.0.0"
|
"tslib": "^2.0.0"
|
||||||
},
|
},
|
||||||
@@ -143,7 +143,7 @@
|
|||||||
},
|
},
|
||||||
"dist/ng-openlayers": {
|
"dist/ng-openlayers": {
|
||||||
"name": "@farmmaps/ng-openlayers",
|
"name": "@farmmaps/ng-openlayers",
|
||||||
"version": "4.14.0-prerelease.2538",
|
"version": "4.18.0-prerelease.2575",
|
||||||
"license": "MPL-2.0",
|
"license": "MPL-2.0",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"tslib": "^2.3.0"
|
"tslib": "^2.3.0"
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "farmmaps-lib-app",
|
"name": "farmmaps-lib-app",
|
||||||
"version": "4.14.0",
|
"version": "4.18.0",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"ng": "ng",
|
"ng": "ng",
|
||||||
"start": "ng serve",
|
"start": "ng serve",
|
||||||
|
@@ -10,7 +10,7 @@
|
|||||||
<li class="nav-item py-0">
|
<li class="nav-item py-0">
|
||||||
<span><i class="fal fa-layer-group" aria-hidden="true"></i> <span i18n>Base maps</span></span>
|
<span><i class="fal fa-layer-group" aria-hidden="true"></i> <span i18n>Base maps</span></span>
|
||||||
<div class="mb-4">
|
<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>
|
</div>
|
||||||
</li>
|
</li>
|
||||||
<li class="nav-item py-0">
|
<li class="nav-item py-0">
|
||||||
@@ -20,12 +20,17 @@
|
|||||||
</div>
|
</div>
|
||||||
</li>
|
</li>
|
||||||
<li class="nav-item py-0" *ngIf="selectedItemLayer$ | async as selectedItemLayer">
|
<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">
|
<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>
|
<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>
|
</div>
|
||||||
</li>
|
</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>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@@ -4,7 +4,7 @@ import { Store } from '@ngrx/store';
|
|||||||
import * as mapReducers from '../../reducers/map.reducer';
|
import * as mapReducers from '../../reducers/map.reducer';
|
||||||
import * as mapActions from '../../actions/map.actions';
|
import * as mapActions from '../../actions/map.actions';
|
||||||
import {createEmpty,extend } from 'ol/extent';
|
import {createEmpty,extend } from 'ol/extent';
|
||||||
import { Observable } from 'rxjs';
|
import { filter, map, Observable } from 'rxjs';
|
||||||
|
|
||||||
@Component({
|
@Component({
|
||||||
selector: 'fm-map-layer-switcher',
|
selector: 'fm-map-layer-switcher',
|
||||||
@@ -17,7 +17,8 @@ export class LayerSwitcher implements OnInit,OnChanges{
|
|||||||
public overlayLayers: Observable<Array<IItemLayer>>;
|
public overlayLayers: Observable<Array<IItemLayer>>;
|
||||||
public selectedOverlayLayer: Observable<IItemLayer>;
|
public selectedOverlayLayer: Observable<IItemLayer>;
|
||||||
public selectedItemLayer$: 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>;
|
public selectedBaseLayer: Observable<IItemLayer>;
|
||||||
|
|
||||||
constructor( private store: Store<mapReducers.State>) {
|
constructor( private store: Store<mapReducers.State>) {
|
||||||
@@ -26,7 +27,8 @@ export class LayerSwitcher implements OnInit,OnChanges{
|
|||||||
ngOnInit() {
|
ngOnInit() {
|
||||||
this.overlayLayers = this.store.select(mapReducers.selectGetOverlayLayers);
|
this.overlayLayers = this.store.select(mapReducers.selectGetOverlayLayers);
|
||||||
this.selectedOverlayLayer = this.store.select(mapReducers.selectGetSelectedOverlayLayer);
|
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.selectedBaseLayer = this.store.select(mapReducers.selectGetSelectedBaseLayer);
|
||||||
this.selectedItemLayer$ = this.store.select(mapReducers.selectGetSelectedItemLayer)
|
this.selectedItemLayer$ = this.store.select(mapReducers.selectGetSelectedItemLayer)
|
||||||
this.showLayerSwitcher = this.store.select(mapReducers.selectGetShowLayerSwitcher);
|
this.showLayerSwitcher = this.store.select(mapReducers.selectGetShowLayerSwitcher);
|
||||||
@@ -83,3 +85,4 @@ export class LayerSwitcher implements OnInit,OnChanges{
|
|||||||
event.preventDefault();
|
event.preventDefault();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@@ -52,11 +52,20 @@ aol-map { position:absolute;width:100%;height:calc( 100vh );}
|
|||||||
pointer-events: none;
|
pointer-events: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@media screen and (max-width: 768px) {
|
||||||
|
.control-container {
|
||||||
|
margin-left: 1em;
|
||||||
|
margin-right: 1em;
|
||||||
|
pointer-events: all;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
.control-container {
|
@media screen and (min-width: 768px) {
|
||||||
float:right;
|
.control-container {
|
||||||
margin-right: 1em;
|
float: right;
|
||||||
pointer-events: all;
|
margin-right: 1em;
|
||||||
|
pointer-events: all;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.fullscreen .viewport-container {
|
.fullscreen .viewport-container {
|
||||||
|
@@ -1,39 +1,39 @@
|
|||||||
import { Component, OnInit, OnDestroy, HostListener, ViewChild, AfterViewInit,NgZone,ElementRef } from '@angular/core';
|
import { Component, OnInit, OnDestroy, HostListener, ViewChild, AfterViewInit, NgZone, ElementRef } from '@angular/core';
|
||||||
import { Location } from '@angular/common';
|
import { Location } from '@angular/common';
|
||||||
import { Observable, Subject, Subscription, from,of ,EMPTY } from 'rxjs';
|
import { Observable, Subject, Subscription, from, of, EMPTY } from 'rxjs';
|
||||||
import { withLatestFrom, switchMap,skip } from 'rxjs/operators';
|
import { withLatestFrom, switchMap, skip } from 'rxjs/operators';
|
||||||
import { Router, ActivatedRoute, ParamMap } from '@angular/router';
|
import { Router, ActivatedRoute, ParamMap } from '@angular/router';
|
||||||
import { Store } from '@ngrx/store';
|
import { Store } from '@ngrx/store';
|
||||||
import { DeviceService } from '@farmmaps/common';
|
import { DeviceService } from '@farmmaps/common';
|
||||||
import {getRenderPixel} from 'ol/render';
|
import { getRenderPixel } from 'ol/render';
|
||||||
|
|
||||||
// Map
|
// Map
|
||||||
import * as mapReducers from '../../reducers/map.reducer';
|
import * as mapReducers from '../../reducers/map.reducer';
|
||||||
import * as mapActions from '../../actions/map.actions';
|
import * as mapActions from '../../actions/map.actions';
|
||||||
import { IMapState} from '../../models/map.state';
|
import { IMapState } from '../../models/map.state';
|
||||||
import { IClickedFeature} from '../../models/clicked.feature';
|
import { IClickedFeature } from '../../models/clicked.feature';
|
||||||
import { IQuery } from '../../reducers/map.reducer'
|
import { IQuery } from '../../reducers/map.reducer'
|
||||||
import { ISelectedFeatures } from '../../models/selected.features';
|
import { ISelectedFeatures } from '../../models/selected.features';
|
||||||
import { IItemLayer } from '../../models/item.layer';
|
import { IItemLayer } from '../../models/item.layer';
|
||||||
import { IListItem, IQueryState } from '@farmmaps/common';
|
import { IListItem, IQueryState } from '@farmmaps/common';
|
||||||
import { IPeriodState } from '../../models/period.state';
|
import { IPeriodState } from '../../models/period.state';
|
||||||
import {IStyles} from '../../models/style.cache';
|
import { IStyles } from '../../models/style.cache';
|
||||||
import { IDroppedFile } from '../aol/file-drop-target/file-drop-target.component';
|
import { IDroppedFile } from '../aol/file-drop-target/file-drop-target.component';
|
||||||
import { StateSerializerService } from '@farmmaps/common';
|
import { StateSerializerService } from '@farmmaps/common';
|
||||||
import { GeolocationService} from '../../services/geolocation.service';
|
import { GeolocationService } from '../../services/geolocation.service';
|
||||||
import { GeolocatorService } from '@farmmaps/common';
|
import { GeolocatorService } from '@farmmaps/common';
|
||||||
import {DeviceOrientationService} from '../../services/device-orientation.service';
|
import { DeviceOrientationService } from '../../services/device-orientation.service';
|
||||||
|
|
||||||
// AppCommon
|
// AppCommon
|
||||||
import { ResumableFileUploadService, ItemTypeService } from '@farmmaps/common';
|
import { ResumableFileUploadService, ItemTypeService } from '@farmmaps/common';
|
||||||
import { IItemType, IItem } from '@farmmaps/common';
|
import { IItemType, IItem } from '@farmmaps/common';
|
||||||
import {commonReducers} from '@farmmaps/common';
|
import { commonReducers } from '@farmmaps/common';
|
||||||
import {commonActions} from '@farmmaps/common';
|
import { commonActions } from '@farmmaps/common';
|
||||||
|
|
||||||
import {Feature} from 'ol';
|
import { Feature } from 'ol';
|
||||||
import {Geometry,Point,Circle} from 'ol/geom';
|
import { Geometry, Point, Circle } from 'ol/geom';
|
||||||
import {Extent,createEmpty,extend } from 'ol/extent';
|
import { Extent, createEmpty, extend } from 'ol/extent';
|
||||||
import {transform} from 'ol/proj';
|
import { transform } from 'ol/proj';
|
||||||
import { tassign } from 'tassign';
|
import { tassign } from 'tassign';
|
||||||
import * as style from 'ol/style';
|
import * as style from 'ol/style';
|
||||||
|
|
||||||
@@ -44,7 +44,7 @@ import * as style from 'ol/style';
|
|||||||
styleUrls: ['./map.component.scss']
|
styleUrls: ['./map.component.scss']
|
||||||
})
|
})
|
||||||
|
|
||||||
export class MapComponent implements OnInit, OnDestroy,AfterViewInit {
|
export class MapComponent implements OnInit, OnDestroy, AfterViewInit {
|
||||||
title = 'Map';
|
title = 'Map';
|
||||||
public openedModalName$: Observable<string> = this.store.select(commonReducers.selectOpenedModalName);
|
public openedModalName$: Observable<string> = this.store.select(commonReducers.selectOpenedModalName);
|
||||||
public itemTypes$: Observable<{ [id: string]: IItemType }>;
|
public itemTypes$: Observable<{ [id: string]: IItemType }>;
|
||||||
@@ -54,44 +54,46 @@ export class MapComponent implements OnInit, OnDestroy,AfterViewInit {
|
|||||||
public selectedOverlayLayer$: Observable<IItemLayer> = this.store.select(mapReducers.selectGetSelectedOverlayLayer);
|
public selectedOverlayLayer$: Observable<IItemLayer> = this.store.select(mapReducers.selectGetSelectedOverlayLayer);
|
||||||
public selectedItemLayer$: Observable<IItemLayer> = this.store.select(mapReducers.selectGetSelectedItemLayer);
|
public selectedItemLayer$: Observable<IItemLayer> = this.store.select(mapReducers.selectGetSelectedItemLayer);
|
||||||
public baseLayers$: Observable<Array<IItemLayer>> = this.store.select(mapReducers.selectGetBaseLayers);
|
public baseLayers$: Observable<Array<IItemLayer>> = this.store.select(mapReducers.selectGetBaseLayers);
|
||||||
public selectedBaseLayer$: Observable<IItemLayer> = this.store.select(mapReducers.selectGetSelectedBaseLayer);
|
public selectedBaseLayer$: Observable<IItemLayer> = this.store.select(mapReducers.selectGetSelectedBaseLayer);
|
||||||
public projection$: Observable<string> = this.store.select(mapReducers.selectGetProjection);
|
public projection$: Observable<string> = this.store.select(mapReducers.selectGetProjection);
|
||||||
public selectedFeatures$: Subject<ISelectedFeatures> = new Subject<ISelectedFeatures>();
|
public selectedFeatures$: Subject<ISelectedFeatures> = new Subject<ISelectedFeatures>();
|
||||||
public droppedFile$: Subject<IDroppedFile> = new Subject<IDroppedFile>();
|
public droppedFile$: Subject<IDroppedFile> = new Subject<IDroppedFile>();
|
||||||
private paramSub: Subscription;
|
private paramSub: Subscription;
|
||||||
private itemTypeSub: Subscription;
|
private itemTypeSub: Subscription;
|
||||||
private stateSub: Subscription;
|
private stateSub: Subscription;
|
||||||
private queryStateSub: Subscription;
|
private queryStateSub: Subscription;
|
||||||
private querySub: Subscription;
|
private querySub: Subscription;
|
||||||
public parentCode$: Observable<string> =this.store.select(mapReducers.selectGetParentCode);
|
public parentCode$: Observable<string> = this.store.select(mapReducers.selectGetParentCode);
|
||||||
public panelVisible$: Observable<boolean> = this.store.select(mapReducers.selectGetPanelVisible);
|
public panelVisible$: Observable<boolean> = this.store.select(mapReducers.selectGetPanelVisible);
|
||||||
public panelCollapsed$: Observable<boolean> = this.store.select(mapReducers.selectGetPanelCollapsed);
|
public panelCollapsed$: Observable<boolean> = this.store.select(mapReducers.selectGetPanelCollapsed);
|
||||||
public panelExtraWide$: Observable<boolean> = this.store.select(mapReducers.selectGetPanelExtraWide);
|
public panelExtraWide$: Observable<boolean> = this.store.select(mapReducers.selectGetPanelExtraWide);
|
||||||
public selectedFeature$: Observable<Feature<Geometry>> = this.store.select(mapReducers.selectGetSelectedFeature);
|
public selectedFeature$: Observable<Feature<Geometry>> = this.store.select(mapReducers.selectGetSelectedFeature);
|
||||||
public clickedFeature: Subject<Feature<Geometry>> = new Subject<Feature<Geometry>>();
|
public clickedFeature: Subject<Feature<Geometry>> = new Subject<Feature<Geometry>>();
|
||||||
public selectedItem$: Observable<IItem> = this.store.select(mapReducers.selectGetSelectedItem);
|
public selectedItem$: Observable<IItem> = this.store.select(mapReducers.selectGetSelectedItem);
|
||||||
public parentItem$: Observable<IItem> =this.store.select(mapReducers.selectGetParentItem);
|
public parentItem$: Observable<IItem> = this.store.select(mapReducers.selectGetParentItem);
|
||||||
public queryState$: Observable<IQueryState> = this.store.select(mapReducers.selectGetQueryState);
|
public queryState$: Observable<IQueryState> = this.store.select(mapReducers.selectGetQueryState);
|
||||||
public state$:Observable<{mapState:IMapState,queryState:IQueryState}> = this.store.select(mapReducers.selectGetState);
|
public state$: Observable<{ mapState: IMapState, queryState: IQueryState }> = this.store.select(mapReducers.selectGetState);
|
||||||
public period$: Observable<IPeriodState> = this.store.select(mapReducers.selectGetPeriod);
|
public period$: Observable<IPeriodState> = this.store.select(mapReducers.selectGetPeriod);
|
||||||
public clearEnabled$: Observable<boolean> = this.store.select(mapReducers.selectGetClearEnabled);
|
public clearEnabled$: Observable<boolean> = this.store.select(mapReducers.selectGetClearEnabled);
|
||||||
public searchCollapsed$: Observable<boolean> = this.store.select(mapReducers.selectGetSearchCollapsed);
|
public searchCollapsed$: Observable<boolean> = this.store.select(mapReducers.selectGetSearchCollapsed);
|
||||||
public searchMinified$: Observable<boolean> = this.store.select(mapReducers.selectGetSearchMinified);
|
public searchMinified$: Observable<boolean> = this.store.select(mapReducers.selectGetSearchMinified);
|
||||||
public showDataLayerSlide$: Observable<boolean> = this.store.select(mapReducers.selectGetShowdataLayerSlide);
|
public showDataLayerSlide$: Observable<boolean> = this.store.select(mapReducers.selectGetShowdataLayerSlide);
|
||||||
public menuVisible$: Observable<boolean>;
|
public menuVisible$: Observable<boolean>;
|
||||||
public query$: Observable<IQuery> = this.store.select(mapReducers.selectGetQuery);
|
public query$: Observable<IQuery> = this.store.select(mapReducers.selectGetQuery);
|
||||||
public position$: Observable<GeolocationPosition> = this.geolocationService.getCurrentPosition();
|
public position$: Observable<GeolocationPosition> = this.geolocationService.getCurrentPosition();
|
||||||
public compassHeading$: Observable<number> = this.deviceorientationService.getCurrentCompassHeading();
|
public compassHeading$: Observable<number> = this.deviceorientationService.getCurrentCompassHeading();
|
||||||
public baseLayersCollapsed = true;
|
public baseLayersCollapsed = true;
|
||||||
public overlayLayersCollapsed = true;
|
public overlayLayersCollapsed = true;
|
||||||
public extent$: Observable<Extent> = this.store.select(mapReducers.selectGetExtent);
|
public extent$: Observable<Extent> = this.store.select(mapReducers.selectGetExtent);
|
||||||
public styles$:Observable<IStyles> = this.store.select(mapReducers.selectGetStyles);
|
public styles$: Observable<IStyles> = this.store.select(mapReducers.selectGetStyles);
|
||||||
public fullscreen$: Observable<boolean> = this.store.select(commonReducers.selectGetFullScreen);
|
public fullscreen$: Observable<boolean> = this.store.select(commonReducers.selectGetFullScreen);
|
||||||
private lastUrl = "";
|
private lastUrl = "";
|
||||||
private initialized = false;
|
private initialized = false;
|
||||||
public noContent = false;
|
public noContent = false;
|
||||||
public overrideSelectedItemLayer = false;
|
public overrideSelectedItemLayer = false;
|
||||||
public overrideOverlayLayers = false;
|
public overrideOverlayLayers = false;
|
||||||
|
public hideShowLayerValues = false;
|
||||||
|
public const
|
||||||
public dataLayerSlideValue = 50;
|
public dataLayerSlideValue = 50;
|
||||||
public dataLayerSlideEnabled = false;
|
public dataLayerSlideEnabled = false;
|
||||||
private visibleAreaBottom = 0;
|
private visibleAreaBottom = 0;
|
||||||
@@ -110,47 +112,48 @@ export class MapComponent implements OnInit, OnDestroy,AfterViewInit {
|
|||||||
private geolocationService: GeolocationService,
|
private geolocationService: GeolocationService,
|
||||||
private geolocaterService: GeolocatorService,
|
private geolocaterService: GeolocatorService,
|
||||||
private zone: NgZone,
|
private zone: NgZone,
|
||||||
private deviceorientationService:DeviceOrientationService,
|
private deviceorientationService: DeviceOrientationService,
|
||||||
public devicesService:DeviceService) {
|
public devicesService: DeviceService) {
|
||||||
if(route && route.snapshot && route.snapshot.data && route.snapshot.data["fm-map-map"]) {
|
if (route && route.snapshot && route.snapshot.data && route.snapshot.data["fm-map-map"]) {
|
||||||
const params = route.snapshot.data["fm-map-map"];
|
const params = route.snapshot.data["fm-map-map"];
|
||||||
this.overrideSelectedItemLayer = params["overrideSelectedItemlayer"] ? params["overrideSelectedItemlayer"] : false;
|
this.overrideSelectedItemLayer = params["overrideSelectedItemlayer"] ? params["overrideSelectedItemlayer"] : false;
|
||||||
this.overrideOverlayLayers = params["overrideOverlayLayers"] ? params["overrideOverlayLayers"] : 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) {
|
this.querySub = this.query$.pipe(skip(1), withLatestFrom(this.mapState$)).subscribe(([query, mapState]) => {
|
||||||
let newQueryState = tassign(mapReducers.initialQueryState);
|
if (query && query.querystate) {
|
||||||
//console.debug(`Do Query`);
|
let newQueryState = tassign(mapReducers.initialQueryState);
|
||||||
const urlparts=[];
|
//console.debug(`Do Query`);
|
||||||
if (query.querystate.itemCode && query.querystate.itemCode != "") {
|
const urlparts = [];
|
||||||
if(query.querystate.itemType && query.querystate.itemType!= "") {
|
if (query.querystate.itemCode && query.querystate.itemCode != "") {
|
||||||
const itemType = this.itemTypeService.itemTypes[query.querystate.itemType];
|
if (query.querystate.itemType && query.querystate.itemType != "") {
|
||||||
if (itemType && itemType.viewer && itemType.viewer == "edit_in_editor" && itemType.editor) {
|
const itemType = this.itemTypeService.itemTypes[query.querystate.itemType];
|
||||||
urlparts.push('/editor');
|
if (itemType && itemType.viewer && itemType.viewer == "edit_in_editor" && itemType.editor) {
|
||||||
urlparts.push(itemType.editor);
|
urlparts.push('/editor');
|
||||||
urlparts.push('item');
|
urlparts.push(itemType.editor);
|
||||||
urlparts.push(query.querystate.itemCode);
|
urlparts.push('item');
|
||||||
}
|
urlparts.push(query.querystate.itemCode);
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
newQueryState= query.querystate;
|
|
||||||
}
|
|
||||||
if(urlparts.length==0 ) {
|
|
||||||
newQueryState.itemCode = query.querystate.itemCode;
|
|
||||||
this.zone.run(() => {
|
|
||||||
this.replaceUrl(mapState,newQueryState,query.replace);
|
|
||||||
})
|
|
||||||
} else {
|
|
||||||
this.router.navigate(urlparts);
|
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
newQueryState = query.querystate;
|
||||||
}
|
}
|
||||||
});
|
if (urlparts.length == 0) {
|
||||||
this.store.dispatch(new mapActions.Init());
|
newQueryState.itemCode = query.querystate.itemCode;
|
||||||
// this.store.select(commonReducers.getRootItems).subscribe((l) => {
|
this.zone.run(() => {
|
||||||
// if(l && l.length>0) {
|
this.replaceUrl(mapState, newQueryState, query.replace);
|
||||||
// this.store.dispatch(new mapActions.Init());
|
})
|
||||||
// }
|
} else {
|
||||||
// });
|
this.router.navigate(urlparts);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
this.store.dispatch(new mapActions.Init());
|
||||||
|
// this.store.select(commonReducers.getRootItems).subscribe((l) => {
|
||||||
|
// if(l && l.length>0) {
|
||||||
|
// this.store.dispatch(new mapActions.Init());
|
||||||
|
// }
|
||||||
|
// });
|
||||||
}
|
}
|
||||||
|
|
||||||
@HostListener('document:keyup', ['$event'])
|
@HostListener('document:keyup', ['$event'])
|
||||||
@@ -161,19 +164,19 @@ export class MapComponent implements OnInit, OnDestroy,AfterViewInit {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
handlePanelResize(resizeTop:number) {
|
handlePanelResize(resizeTop: number) {
|
||||||
if(resizeTop==100 || !this.devicesService.IsMobile() ) {
|
if (resizeTop == 100 || !this.devicesService.IsMobile()) {
|
||||||
this.visibleAreaBottom=0;
|
this.visibleAreaBottom = 0;
|
||||||
} else {
|
} else {
|
||||||
this.visibleAreaBottom=100-resizeTop;
|
this.visibleAreaBottom = 100 - resizeTop;
|
||||||
if(this.visibleAreaBottom>60) {
|
if (this.visibleAreaBottom > 60) {
|
||||||
this.visibleAreaBottom=60;
|
this.visibleAreaBottom = 60;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bottom(panelVisible:boolean) {
|
bottom(panelVisible: boolean) {
|
||||||
if(panelVisible) {
|
if (panelVisible) {
|
||||||
return this.visibleAreaBottom + '%';
|
return this.visibleAreaBottom + '%';
|
||||||
} else {
|
} else {
|
||||||
return "0%";
|
return "0%";
|
||||||
@@ -181,7 +184,7 @@ export class MapComponent implements OnInit, OnDestroy,AfterViewInit {
|
|||||||
}
|
}
|
||||||
|
|
||||||
handleOpenModal(modalName: string) {
|
handleOpenModal(modalName: string) {
|
||||||
this.store.dispatch(new commonActions.OpenModal(modalName));
|
this.store.dispatch(new commonActions.OpenModal(modalName));
|
||||||
}
|
}
|
||||||
|
|
||||||
handleCloseModal() {
|
handleCloseModal() {
|
||||||
@@ -189,7 +192,7 @@ export class MapComponent implements OnInit, OnDestroy,AfterViewInit {
|
|||||||
}
|
}
|
||||||
|
|
||||||
handleFileDropped(droppedFile: IDroppedFile) {
|
handleFileDropped(droppedFile: IDroppedFile) {
|
||||||
this.uploadService.addFiles(droppedFile.files, droppedFile.event, { parentCode:droppedFile.parentCode, geometry:droppedFile.geometry });
|
this.uploadService.addFiles(droppedFile.files, droppedFile.event, { parentCode: droppedFile.parentCode, geometry: droppedFile.geometry });
|
||||||
}
|
}
|
||||||
|
|
||||||
handleFeatureClick(feature: Feature<Geometry>) {
|
handleFeatureClick(feature: Feature<Geometry>) {
|
||||||
@@ -205,26 +208,26 @@ export class MapComponent implements OnInit, OnDestroy,AfterViewInit {
|
|||||||
this.store.dispatch(new mapActions.DoQuery(queryState));
|
this.store.dispatch(new mapActions.DoQuery(queryState));
|
||||||
}
|
}
|
||||||
|
|
||||||
handleSidepaneloutletActivate(component:any) {
|
handleSidepaneloutletActivate(component: any) {
|
||||||
if(component && component.hasOwnProperty('clickedFeature')) {
|
if (component && component.hasOwnProperty('clickedFeature')) {
|
||||||
(component as IClickedFeature).clickedFeature = this.clickedFeature;
|
(component as IClickedFeature).clickedFeature = this.clickedFeature;
|
||||||
}
|
}
|
||||||
if(component && component.hasOwnProperty('extrawide')) {
|
if (component && component.hasOwnProperty('extrawide')) {
|
||||||
this.store.dispatch(new mapActions.SetPanelExtraWide(true));
|
this.store.dispatch(new mapActions.SetPanelExtraWide(true));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
handleSidepaneloutletDeactivate(component:any) {
|
handleSidepaneloutletDeactivate(component: any) {
|
||||||
if(component && component.hasOwnProperty('clickedFeature')) {
|
if (component && component.hasOwnProperty('clickedFeature')) {
|
||||||
(component as IClickedFeature).clickedFeature = null;
|
(component as IClickedFeature).clickedFeature = null;
|
||||||
}
|
}
|
||||||
if(component && component.hasOwnProperty('extrawide')) {
|
if (component && component.hasOwnProperty('extrawide')) {
|
||||||
this.store.dispatch(new mapActions.SetPanelExtraWide(false));
|
this.store.dispatch(new mapActions.SetPanelExtraWide(false));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
handlePrerender(event:any) {
|
handlePrerender(event: any) {
|
||||||
if(!this.dataLayerSlideEnabled) return;
|
if (!this.dataLayerSlideEnabled) return;
|
||||||
const ctx = event.context;
|
const ctx = event.context;
|
||||||
const mapSize = this.map.instance.getSize();
|
const mapSize = this.map.instance.getSize();
|
||||||
const width = mapSize[0] * (this.dataLayerSlideValue / 100);
|
const width = mapSize[0] * (this.dataLayerSlideValue / 100);
|
||||||
@@ -243,72 +246,74 @@ export class MapComponent implements OnInit, OnDestroy,AfterViewInit {
|
|||||||
ctx.clip();
|
ctx.clip();
|
||||||
}
|
}
|
||||||
|
|
||||||
handleSlideChange(event:any) {
|
handleSlideChange(event: any) {
|
||||||
this.dataLayerSlideValue = event.target.value;
|
this.dataLayerSlideValue = event.target.value;
|
||||||
this.map.instance.render();
|
this.map.instance.render();
|
||||||
}
|
}
|
||||||
|
|
||||||
ngOnInit() {
|
ngOnInit() {
|
||||||
this.initialized = false;
|
this.initialized = false;
|
||||||
//console.debug("Init");
|
//console.debug("Init");
|
||||||
this.store.dispatch(new mapActions.Clear());
|
this.store.dispatch(new mapActions.Clear());
|
||||||
this.selectedFeatures$.next({x:0,y:0,features:[]});
|
this.selectedFeatures$.next({ x: 0, y: 0, features: [] });
|
||||||
this.selectedFeatures$.next(null);
|
this.selectedFeatures$.next(null);
|
||||||
}
|
}
|
||||||
|
|
||||||
initCustomStyles() {
|
initCustomStyles() {
|
||||||
this.store.dispatch(new mapActions.SetStyle('vnd.farmmaps.itemtype.layer',new style.Style({
|
this.store.dispatch(new mapActions.SetStyle('vnd.farmmaps.itemtype.layer', new style.Style({
|
||||||
stroke: new style.Stroke({
|
stroke: new style.Stroke({
|
||||||
color: 'red',
|
color: 'red',
|
||||||
lineDash: [ 5,5],
|
lineDash: [5, 5],
|
||||||
width: 1
|
width: 1
|
||||||
}),
|
}),
|
||||||
geometry:(feature) =>feature.getGeometry()
|
geometry: (feature) => feature.getGeometry()
|
||||||
})));
|
})));
|
||||||
this.store.dispatch(new mapActions.SetStyle('vnd.farmmaps.itemtype.layer_selected',new style.Style({
|
this.store.dispatch(new mapActions.SetStyle('vnd.farmmaps.itemtype.layer_selected', new style.Style({
|
||||||
stroke: new style.Stroke({
|
stroke: new style.Stroke({
|
||||||
color: 'red',
|
color: 'red',
|
||||||
lineDash: [ 5,5],
|
lineDash: [5, 5],
|
||||||
width: 3
|
width: 3
|
||||||
}),
|
}),
|
||||||
geometry:(feature) =>feature.getGeometry()
|
geometry: (feature) => feature.getGeometry()
|
||||||
})));
|
})));
|
||||||
}
|
}
|
||||||
|
|
||||||
round(value:number,decimals:number):number {
|
round(value: number, decimals: number): number {
|
||||||
const d = Math.pow(10, decimals);
|
const d = Math.pow(10, decimals);
|
||||||
return Math.round((value + Number.EPSILON)*d)/d;
|
return Math.round((value + Number.EPSILON) * d) / d;
|
||||||
}
|
}
|
||||||
|
|
||||||
getMapStateFromUrl(params:ParamMap):IMapState {
|
getMapStateFromUrl(params: ParamMap): IMapState {
|
||||||
const hasUrlmapState = params.has("xCenter") && params.has("yCenter");
|
const hasUrlmapState = params.has("xCenter") && params.has("yCenter");
|
||||||
if (hasUrlmapState) {
|
if (hasUrlmapState) {
|
||||||
const xCenter = parseFloat(params.get("xCenter"));
|
const xCenter = parseFloat(params.get("xCenter"));
|
||||||
const yCenter = parseFloat(params.get("yCenter"));
|
const yCenter = parseFloat(params.get("yCenter"));
|
||||||
const zoom = parseFloat(params.get("zoom"));
|
const zoom = parseFloat(params.get("zoom"));
|
||||||
const rotation = parseFloat(params.get("rotation"));
|
const rotation = parseFloat(params.get("rotation"));
|
||||||
const baseLayer = params.get("baseLayer")?params.get("baseLayer"):"";
|
const baseLayer = params.get("baseLayer") ? params.get("baseLayer") : "";
|
||||||
const newMapState = {zoom: zoom, rotation: rotation, xCenter: xCenter, yCenter: yCenter, baseLayerCode: baseLayer };
|
const newMapState = { zoom: zoom, rotation: rotation, xCenter: xCenter, yCenter: yCenter, baseLayerCode: baseLayer };
|
||||||
return newMapState;
|
return newMapState;
|
||||||
} else {
|
} else {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
normalizeMapState(mapState:IMapState):IMapState {
|
normalizeMapState(mapState: IMapState): IMapState {
|
||||||
if(!mapState) return null;
|
if (!mapState) return null;
|
||||||
return {zoom: this.round(mapState.zoom,0),
|
return {
|
||||||
rotation: this.round(mapState.rotation,2),
|
zoom: this.round(mapState.zoom, 0),
|
||||||
xCenter: this.round(mapState.xCenter,5),
|
rotation: this.round(mapState.rotation, 2),
|
||||||
yCenter: this.round(mapState.yCenter,5),
|
xCenter: this.round(mapState.xCenter, 5),
|
||||||
baseLayerCode: mapState.baseLayerCode };
|
yCenter: this.round(mapState.yCenter, 5),
|
||||||
|
baseLayerCode: mapState.baseLayerCode
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
serializeMapState(mapState:IMapState):string {
|
serializeMapState(mapState: IMapState): string {
|
||||||
return JSON.stringify(this.normalizeMapState(mapState));
|
return JSON.stringify(this.normalizeMapState(mapState));
|
||||||
}
|
}
|
||||||
|
|
||||||
getQueryStateFromUrl(params:ParamMap):IQueryState {
|
getQueryStateFromUrl(params: ParamMap): IQueryState {
|
||||||
if (params.has("queryState")) {
|
if (params.has("queryState")) {
|
||||||
const queryState = params.get("queryState");
|
const queryState = params.get("queryState");
|
||||||
let newQueryState = tassign(mapReducers.initialQueryState);
|
let newQueryState = tassign(mapReducers.initialQueryState);
|
||||||
@@ -323,10 +328,10 @@ export class MapComponent implements OnInit, OnDestroy,AfterViewInit {
|
|||||||
|
|
||||||
ngAfterViewInit() {
|
ngAfterViewInit() {
|
||||||
//console.debug("View init");
|
//console.debug("View init");
|
||||||
this.noContent=true;
|
this.noContent = true;
|
||||||
this.route.children.forEach((entry) => {
|
this.route.children.forEach((entry) => {
|
||||||
if(entry.outlet=="primary") {
|
if (entry.outlet == "primary") {
|
||||||
this.noContent=false;
|
this.noContent = false;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -334,54 +339,54 @@ export class MapComponent implements OnInit, OnDestroy,AfterViewInit {
|
|||||||
|
|
||||||
// url to state
|
// url to state
|
||||||
|
|
||||||
const urlMapState = this.getMapStateFromUrl(this.route.snapshot.paramMap);
|
const urlMapState = this.getMapStateFromUrl(this.route.snapshot.paramMap);
|
||||||
const urlQueryState = this.getQueryStateFromUrl(this.route.snapshot.paramMap);
|
const urlQueryState = this.getQueryStateFromUrl(this.route.snapshot.paramMap);
|
||||||
if(urlQueryState && urlMapState && this.noContent) {
|
if (urlQueryState && urlMapState && this.noContent) {
|
||||||
this.store.dispatch(new mapActions.SetState(urlMapState,urlQueryState));
|
this.store.dispatch(new mapActions.SetState(urlMapState, urlQueryState));
|
||||||
window.localStorage.setItem("FarmMapsCommonMap_mapState",this.serializeMapState(urlMapState));
|
window.localStorage.setItem("FarmMapsCommonMap_mapState", this.serializeMapState(urlMapState));
|
||||||
} else if(urlQueryState && this.noContent) {
|
} else if (urlQueryState && this.noContent) {
|
||||||
this.store.dispatch(new mapActions.SetQueryState(urlQueryState));
|
this.store.dispatch(new mapActions.SetQueryState(urlQueryState));
|
||||||
} else {
|
} else {
|
||||||
this.store.dispatch(new mapActions.SetReplaceUrl(true));
|
this.store.dispatch(new mapActions.SetReplaceUrl(true));
|
||||||
}
|
}
|
||||||
|
|
||||||
this.paramSub = this.route.paramMap.pipe(withLatestFrom(this.state$),switchMap(([params,state]) => {
|
this.paramSub = this.route.paramMap.pipe(withLatestFrom(this.state$), switchMap(([params, state]) => {
|
||||||
if(this.initialized && this.noContent) {
|
if (this.initialized && this.noContent) {
|
||||||
const urlQueryState = this.getQueryStateFromUrl(params);
|
const urlQueryState = this.getQueryStateFromUrl(params);
|
||||||
if( this.serializeService.serialize(state.queryState) != this.serializeService.serialize(urlQueryState)) {
|
if (this.serializeService.serialize(state.queryState) != this.serializeService.serialize(urlQueryState)) {
|
||||||
return of(new mapActions.SetState(state.mapState,urlQueryState));
|
return of(new mapActions.SetState(state.mapState, urlQueryState));
|
||||||
}
|
|
||||||
}
|
|
||||||
return EMPTY;
|
|
||||||
})).subscribe((action) => {
|
|
||||||
if(action) {
|
|
||||||
this.zone.run(() => {
|
|
||||||
//console.debug("Url to state");
|
|
||||||
this.store.dispatch(action);
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
});
|
}
|
||||||
|
return EMPTY;
|
||||||
|
})).subscribe((action) => {
|
||||||
|
if (action) {
|
||||||
|
this.zone.run(() => {
|
||||||
|
//console.debug("Url to state");
|
||||||
|
this.store.dispatch(action);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
// state to url
|
// state to url
|
||||||
|
|
||||||
this.stateSub = this.state$.pipe(switchMap((state) => {
|
this.stateSub = this.state$.pipe(switchMap((state) => {
|
||||||
const newUrl = this.serializeMapState(state.mapState) + "_" + this.serializeService.serialize(state.queryState);
|
const newUrl = this.serializeMapState(state.mapState) + "_" + this.serializeService.serialize(state.queryState);
|
||||||
if(this.lastUrl!=newUrl) {
|
if (this.lastUrl != newUrl) {
|
||||||
this.lastUrl=newUrl;
|
this.lastUrl = newUrl;
|
||||||
return of(state);
|
return of(state);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
return of(null);
|
return of(null);
|
||||||
}
|
}
|
||||||
})).subscribe((newUrlState: any) => {
|
})).subscribe((newUrlState: any) => {
|
||||||
if(newUrlState) {
|
if (newUrlState) {
|
||||||
//console.debug(`State to url`);
|
//console.debug(`State to url`);
|
||||||
this.replaceUrl(newUrlState.mapState,newUrlState.queryState,newUrlState.replaceUrl);
|
this.replaceUrl(newUrlState.mapState, newUrlState.queryState, newUrlState.replaceUrl);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
this.initialized = true;
|
this.initialized = true;
|
||||||
this.showDataLayerSlide$.subscribe((v) => {
|
this.showDataLayerSlide$.subscribe((v) => {
|
||||||
this.dataLayerSlideEnabled=v;
|
this.dataLayerSlideEnabled = v;
|
||||||
this.map.instance.render();
|
this.map.instance.render();
|
||||||
});
|
});
|
||||||
this.store.select(mapReducers.selectGetViewEnabled).subscribe((v) => {
|
this.store.select(mapReducers.selectGetViewEnabled).subscribe((v) => {
|
||||||
@@ -401,7 +406,7 @@ export class MapComponent implements OnInit, OnDestroy,AfterViewInit {
|
|||||||
this.store.dispatch(new commonActions.ToggleMenu());
|
this.store.dispatch(new commonActions.ToggleMenu());
|
||||||
}
|
}
|
||||||
|
|
||||||
handleToggleBaseLayers(event:MouseEvent) {
|
handleToggleBaseLayers(event: MouseEvent) {
|
||||||
this.baseLayersCollapsed = !this.baseLayersCollapsed;
|
this.baseLayersCollapsed = !this.baseLayersCollapsed;
|
||||||
event.preventDefault();
|
event.preventDefault();
|
||||||
}
|
}
|
||||||
@@ -418,30 +423,30 @@ export class MapComponent implements OnInit, OnDestroy,AfterViewInit {
|
|||||||
}
|
}
|
||||||
|
|
||||||
replaceUrl(mapState: IMapState, queryState: IQueryState, replace = true) {
|
replaceUrl(mapState: IMapState, queryState: IQueryState, replace = true) {
|
||||||
if(this.noContent) {
|
if (this.noContent) {
|
||||||
const newMapState = this.serializeMapState(mapState);
|
const newMapState = this.serializeMapState(mapState);
|
||||||
const newQueryState = this.serializeService.serialize(queryState);
|
const newQueryState = this.serializeService.serialize(queryState);
|
||||||
const currentMapState = this.serializeMapState(this.getMapStateFromUrl(this.route.snapshot.paramMap));
|
const currentMapState = this.serializeMapState(this.getMapStateFromUrl(this.route.snapshot.paramMap));
|
||||||
const urlQueryState = this.getQueryStateFromUrl(this.route.snapshot.paramMap);
|
const urlQueryState = this.getQueryStateFromUrl(this.route.snapshot.paramMap);
|
||||||
const currentQueryState = urlQueryState==null?"":this.serializeService.serialize(urlQueryState);
|
const currentQueryState = urlQueryState == null ? "" : this.serializeService.serialize(urlQueryState);
|
||||||
if(mapState.baseLayerCode!="" && ((newMapState!= currentMapState) || (newQueryState!=currentQueryState))) {
|
if (mapState.baseLayerCode != "" && ((newMapState != currentMapState) || (newQueryState != currentQueryState))) {
|
||||||
const parts =["."];
|
const parts = ["."];
|
||||||
parts.push(mapState.xCenter.toFixed(5));
|
parts.push(mapState.xCenter.toFixed(5));
|
||||||
parts.push(mapState.yCenter.toFixed(5));
|
parts.push(mapState.yCenter.toFixed(5));
|
||||||
parts.push( mapState.zoom.toFixed(0));
|
parts.push(mapState.zoom.toFixed(0));
|
||||||
parts.push( mapState.rotation.toFixed(2));
|
parts.push(mapState.rotation.toFixed(2));
|
||||||
parts.push(mapState.baseLayerCode);
|
parts.push(mapState.baseLayerCode);
|
||||||
parts.push( this.serializeService.serialize(queryState));
|
parts.push(this.serializeService.serialize(queryState));
|
||||||
|
|
||||||
//console.debug("Replace url",parts);
|
//console.debug("Replace url",parts);
|
||||||
this.router.navigate(parts, { replaceUrl: replace,relativeTo:this.route.parent });
|
this.router.navigate(parts, { replaceUrl: replace, relativeTo: this.route.parent });
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
handleOnMoveEnd(event) {
|
handleOnMoveEnd(event) {
|
||||||
if(this.initialized && this.viewEnabled) {
|
if (this.initialized && this.viewEnabled) {
|
||||||
this.zone.run(() =>{
|
this.zone.run(() => {
|
||||||
//console.debug("Move end");
|
//console.debug("Move end");
|
||||||
const map = event.map;
|
const map = event.map;
|
||||||
const view = map.getView();
|
const view = map.getView();
|
||||||
@@ -466,16 +471,18 @@ export class MapComponent implements OnInit, OnDestroy,AfterViewInit {
|
|||||||
|
|
||||||
handleOnMouseDown(event: MouseEvent) {
|
handleOnMouseDown(event: MouseEvent) {
|
||||||
event.stopPropagation();
|
event.stopPropagation();
|
||||||
this.zone.run(() =>{
|
this.zone.run(() => {
|
||||||
this.store.dispatch(new commonActions.CloseAll());
|
this.store.dispatch(new commonActions.CloseAll());
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
handleShowLayerValues(event: MouseEvent) {
|
handleShowLayerValues(event: MouseEvent) {
|
||||||
event.stopPropagation();
|
if (!this.hideShowLayerValues) {
|
||||||
this.zone.run(() =>{
|
event.stopPropagation();
|
||||||
this.store.dispatch(new mapActions.ToggleLayerValuesEnabled());
|
this.zone.run(() => {
|
||||||
});
|
this.store.dispatch(new mapActions.ToggleLayerValuesEnabled());
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
handleOnDownload(event) {
|
handleOnDownload(event) {
|
||||||
@@ -491,15 +498,15 @@ export class MapComponent implements OnInit, OnDestroy,AfterViewInit {
|
|||||||
}
|
}
|
||||||
|
|
||||||
handleOnToggleVisibility(itemLayer: IItemLayer) {
|
handleOnToggleVisibility(itemLayer: IItemLayer) {
|
||||||
this.store.dispatch(new mapActions.SetVisibility(itemLayer,!itemLayer.visible));
|
this.store.dispatch(new mapActions.SetVisibility(itemLayer, !itemLayer.visible));
|
||||||
}
|
}
|
||||||
|
|
||||||
handleOnSetOpacity(event:{ layer: IItemLayer,opacity:number }) {
|
handleOnSetOpacity(event: { layer: IItemLayer, opacity: number }) {
|
||||||
this.store.dispatch(new mapActions.SetOpacity(event.layer, event.opacity));
|
this.store.dispatch(new mapActions.SetOpacity(event.layer, event.opacity));
|
||||||
}
|
}
|
||||||
|
|
||||||
handleZoomToExtent(itemLayer: IItemLayer) {
|
handleZoomToExtent(itemLayer: IItemLayer) {
|
||||||
const extent = createEmpty();
|
const extent = createEmpty();
|
||||||
extend(extent, itemLayer.layer.getExtent());
|
extend(extent, itemLayer.layer.getExtent());
|
||||||
if (extent) {
|
if (extent) {
|
||||||
this.store.dispatch(new mapActions.SetExtent(extent));
|
this.store.dispatch(new mapActions.SetExtent(extent));
|
||||||
@@ -514,21 +521,21 @@ export class MapComponent implements OnInit, OnDestroy,AfterViewInit {
|
|||||||
this.store.dispatch(new mapActions.SelectOverlayLayer(itemLayer));
|
this.store.dispatch(new mapActions.SelectOverlayLayer(itemLayer));
|
||||||
}
|
}
|
||||||
|
|
||||||
handlePeriodChange(period:IPeriodState) {
|
handlePeriodChange(period: IPeriodState) {
|
||||||
this.store.dispatch(new mapActions.SetPeriod(period));
|
this.store.dispatch(new mapActions.SetPeriod(period));
|
||||||
}
|
}
|
||||||
|
|
||||||
handleCitySearch(location:string) {
|
handleCitySearch(location: string) {
|
||||||
this.geolocaterService.geocode(location).subscribe(locations => {
|
this.geolocaterService.geocode(location).subscribe(locations => {
|
||||||
if( locations.length > 0) {
|
if (locations.length > 0) {
|
||||||
const point = new Point([locations[0].coordinates.lon,locations[0].coordinates.lat]);
|
const point = new Point([locations[0].coordinates.lon, locations[0].coordinates.lat]);
|
||||||
point.transform('EPSG:4326', 'EPSG:3857');
|
point.transform('EPSG:4326', 'EPSG:3857');
|
||||||
const circle = new Circle(point.getCoordinates(),5000);//
|
const circle = new Circle(point.getCoordinates(), 5000);//
|
||||||
const extent = createEmpty();
|
const extent = createEmpty();
|
||||||
extend(extent, circle.getExtent());
|
extend(extent, circle.getExtent());
|
||||||
this.store.dispatch(new mapActions.SetExtent(extent))
|
this.store.dispatch(new mapActions.SetExtent(extent))
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
ngOnDestroy() {
|
ngOnDestroy() {
|
||||||
|
@@ -25,7 +25,7 @@ export class SelectedItemCropfieldComponent extends AbstractSelectedItemComponen
|
|||||||
public items: Observable<IListItem[]>;
|
public items: Observable<IListItem[]>;
|
||||||
|
|
||||||
constructor(store: Store<mapReducers.State | commonReducers.State>, itemTypeService: ItemTypeService, location: Location, router: Router, private itemService$: ItemService,private folderService$: FolderService) {
|
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 {
|
areaInHa(item:IItem):number {
|
||||||
|
@@ -7,28 +7,31 @@
|
|||||||
<h2 *ngIf="parentOfItemType('vnd.farmmaps.itemtype.cropfield')">{{parentItem.name}}</h2>
|
<h2 *ngIf="parentOfItemType('vnd.farmmaps.itemtype.cropfield')">{{parentItem.name}}</h2>
|
||||||
<h1>{{item.name}}</h1>
|
<h1>{{item.name}}</h1>
|
||||||
</div>
|
</div>
|
||||||
<div class="legend-container" *ngIf="item?.data.layers;let layers">
|
<ng-container *ngIf="item?.data.layers;let layers">
|
||||||
<div class="card menu-card">
|
<div class="legend-container">
|
||||||
<div *ngIf="layers.length>1">
|
<div class="card menu-card">
|
||||||
<select (change)="onLayerChanged($event.target.value)">
|
<div *ngIf="layers.length>1">
|
||||||
<option *ngFor="let l of layers;" [value]="l.index" [selected]="itemLayer.layerIndex == l.index">{{l.name}}</option>
|
<select (change)="onLayerChanged($event.target.value)">
|
||||||
</select>
|
<option *ngFor="let l of layers;" [value]="l.index" [selected]="itemLayer.layerIndex == l.index">{{l.name}}</option>
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
<fm-map-layer-legend [showTitle]="layers.length == 1"
|
||||||
|
[layer]="layer(layers,itemLayer.layerIndex)" [histogramenabled]="true"></fm-map-layer-legend>
|
||||||
</div>
|
</div>
|
||||||
<fm-map-layer-legend [showTitle]="layers.length == 1"
|
|
||||||
[layer]="layer(layers,itemLayer.layerIndex)" [histogramenabled]="true"></fm-map-layer-legend>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
<div class="card menu-card">
|
||||||
<div class="card menu-card">
|
<ul class="p-0 mt-2">
|
||||||
<ul class="p-0 mt-2">
|
<li *ngIf="item.isEditable"><a href="#" class="ms-1 me-1" (click)="handleOnEdit(item)"><i class="fal fa-pencil" aria-hidden="true" i18n-title title="Edit"></i> <span i18n>Edit</span></a></li>
|
||||||
<li *ngIf="item.isEditable"><a href="#" class="ms-1 me-1" (click)="handleOnEdit(item)"><i class="fal fa-pencil" aria-hidden="true" i18n-title title="Edit"></i> <span i18n>Edit</span></a></li>
|
<ng-container *ngIf="itemTypeService.isLayer(item)">
|
||||||
<ng-container *ngIf="itemTypeService.isLayer(item)">
|
<li *ngIf="!getItemLayer(item,itemLayer.layerIndex)"><a href="#" (click)="handleAddAsLayer(item,itemLayer.layerIndex)"><i class="fas fa-layer-plus" 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)="handleAddAsLayer(item,itemLayer.layerIndex)"><i class="fas fa-layer-plus" 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>
|
||||||
<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>
|
||||||
</ng-container>
|
<li><fm-item-link class="text-primary p-0" [itemCode]="item.code" pathSuffix="data" [showText]="true"></fm-item-link></li>
|
||||||
<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>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
<fm-map-zoom-to-show-alert [layer]="itemLayer?.layer"></fm-map-zoom-to-show-alert>
|
<fm-map-zoom-to-show-alert [layer]="itemLayer?.layer"></fm-map-zoom-to-show-alert>
|
||||||
|
</ng-container>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@@ -1,12 +1,13 @@
|
|||||||
import { Component, Injectable } from '@angular/core';
|
|
||||||
import { Location } from '@angular/common';
|
import { Location } from '@angular/common';
|
||||||
import { Store } from '@ngrx/store';
|
import { Component, Injectable, OnDestroy } from '@angular/core';
|
||||||
import * as mapReducers from '../../reducers/map.reducer';
|
|
||||||
import { commonReducers, ItemTypeService, ItemService, FolderService } from '@farmmaps/common';
|
|
||||||
import { Router } from '@angular/router';
|
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 { ForItemType } from '../for-item/for-itemtype.decorator';
|
||||||
import { AbstractSelectedItemComponent } from '../selected-item/selected-item.component';
|
import { AbstractSelectedItemComponent } from '../selected-item/selected-item.component';
|
||||||
import * as mapActions from '../../actions/map.actions';
|
|
||||||
|
|
||||||
|
|
||||||
@ForItemType("vnd.farmmaps.itemtype.geotiff.processed")
|
@ForItemType("vnd.farmmaps.itemtype.geotiff.processed")
|
||||||
@@ -16,10 +17,15 @@ import * as mapActions from '../../actions/map.actions';
|
|||||||
templateUrl: './selected-item-geotiff.component.html',
|
templateUrl: './selected-item-geotiff.component.html',
|
||||||
styleUrls: ['./selected-item-geotiff.component.scss']
|
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) {
|
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,location,router);
|
super(store, itemTypeService,itemService,location,router);
|
||||||
|
}
|
||||||
|
|
||||||
|
ngOnDestroy(): void {
|
||||||
|
if (this.sub) this.sub.unsubscribe();
|
||||||
}
|
}
|
||||||
|
|
||||||
onLayerChanged(layerIndex: number) {
|
onLayerChanged(layerIndex: number) {
|
||||||
@@ -29,4 +35,13 @@ export class SelectedItemGeotiffComponent extends AbstractSelectedItemComponent
|
|||||||
layer(layers:any,layerIndex:number) {
|
layer(layers:any,layerIndex:number) {
|
||||||
return layers.find(l => l.index == layerIndex);
|
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,25 +7,28 @@
|
|||||||
<h2 *ngIf="parentOfItemType('vnd.farmmaps.itemtype.cropfield')">{{parentItem.name}}</h2>
|
<h2 *ngIf="parentOfItemType('vnd.farmmaps.itemtype.cropfield')">{{parentItem.name}}</h2>
|
||||||
<h1>{{item.name}}</h1>
|
<h1>{{item.name}}</h1>
|
||||||
</div>
|
</div>
|
||||||
<div class="legend-container" *ngIf="item?.data.layers;let layers">
|
<ng-container *ngIf="item?.data.layers;let layers">
|
||||||
<div class="card menu-card">
|
<div class="legend-container">
|
||||||
<div *ngIf="layers.length>1">
|
<div class="card menu-card">
|
||||||
<select (change)="onLayerChanged($event.target.value)">
|
<div *ngIf="layers.length>1">
|
||||||
<option *ngFor="let l of layers;" [value]="l.index" [selected]="itemLayer.layerIndex == l.index">{{l.name}}</option>
|
<select (change)="onLayerChanged($event.target.value)">
|
||||||
</select>
|
<option *ngFor="let l of layers;" [value]="l.index" [selected]="itemLayer.layerIndex == l.index">{{l.name}}</option>
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
<fm-map-layer-legend [showTitle]="layers.length==1" [layer]="layer(layers,itemLayer.layerIndex)" [histogramenabled]="true"></fm-map-layer-legend>
|
||||||
</div>
|
</div>
|
||||||
<fm-map-layer-legend [showTitle]="layers.length==1" [layer]="layer(layers,itemLayer.layerIndex)" [histogramenabled]="true"></fm-map-layer-legend>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
<div class="card menu-card">
|
||||||
<div class="card menu-card">
|
<ul class="p-0 mt-2">
|
||||||
<ul class="p-0 mt-2">
|
<li *ngIf="item.isEditable"><a href="#" class="mt-1 me-1" (click)="handleOnEdit(item)" ><i class="fal fa-pencil" aria-hidden="true" i18n-title title="Edit"></i> <span i18n>Edit</span></a></li>
|
||||||
<li *ngIf="item.isEditable"><a href="#" class="mt-1 me-1" (click)="handleOnEdit(item)" ><i class="fal fa-pencil" aria-hidden="true" i18n-title title="Edit"></i> <span i18n>Edit</span></a></li>
|
<ng-container *ngIf="itemTypeService.isLayer(item)">
|
||||||
<ng-container *ngIf="itemTypeService.isLayer(item)">
|
<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)="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>
|
||||||
<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>
|
||||||
</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>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
|
</ng-container>
|
||||||
<fm-map-zoom-to-show-alert [layer]="itemLayer?.layer"></fm-map-zoom-to-show-alert>
|
<fm-map-zoom-to-show-alert [layer]="itemLayer?.layer"></fm-map-zoom-to-show-alert>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@@ -1,14 +1,13 @@
|
|||||||
import { Component, Input, Injectable, OnInit } from '@angular/core';
|
|
||||||
import { Location } from '@angular/common';
|
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 { 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 * 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 { ForItemType } from '../for-item/for-itemtype.decorator';
|
||||||
import { AbstractSelectedItemComponent } from '../selected-item/selected-item.component';
|
import { AbstractSelectedItemComponent } from '../selected-item/selected-item.component';
|
||||||
import { Observable } from 'rxjs';
|
import { Subscription } from 'rxjs';
|
||||||
|
|
||||||
|
|
||||||
@ForItemType("vnd.farmmaps.itemtype.shape.processed")
|
@ForItemType("vnd.farmmaps.itemtype.shape.processed")
|
||||||
@@ -18,12 +17,17 @@ import { Observable } from 'rxjs';
|
|||||||
templateUrl: './selected-item-shape.component.html',
|
templateUrl: './selected-item-shape.component.html',
|
||||||
styleUrls: ['./selected-item-shape.component.scss']
|
styleUrls: ['./selected-item-shape.component.scss']
|
||||||
})
|
})
|
||||||
export class SelectedItemShapeComponent extends AbstractSelectedItemComponent {
|
export class SelectedItemShapeComponent extends AbstractSelectedItemComponent implements OnDestroy {
|
||||||
|
|
||||||
constructor(store: Store<mapReducers.State | commonReducers.State>, itemTypeService: ItemTypeService, location: Location, router: Router, private itemService$: ItemService,private folderService$: FolderService) {
|
|
||||||
super(store, itemTypeService,location,router);
|
|
||||||
}
|
|
||||||
public selectedLayer = 0;
|
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) {
|
onLayerChanged(layerIndex: number) {
|
||||||
this.store.dispatch(new mapActions.SetLayerIndex(layerIndex));
|
this.store.dispatch(new mapActions.SetLayerIndex(layerIndex));
|
||||||
@@ -32,4 +36,13 @@ export class SelectedItemShapeComponent extends AbstractSelectedItemComponent {
|
|||||||
layer(layers:any,layerIndex:number) {
|
layer(layers:any,layerIndex:number) {
|
||||||
return layers.find(l => l.index == layerIndex);
|
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,44 +7,46 @@
|
|||||||
<h2 *ngIf="parentOfItemType('vnd.farmmaps.itemtype.cropfield')">{{parentItem.name}}</h2>
|
<h2 *ngIf="parentOfItemType('vnd.farmmaps.itemtype.cropfield')">{{parentItem.name}}</h2>
|
||||||
<h1>{{item.name}}</h1>
|
<h1>{{item.name}}</h1>
|
||||||
</div>
|
</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">
|
||||||
|
<div>
|
||||||
|
<button *ngIf="temporalService.hasPrevious(itemLayer)" type="button" class="btn btn-link p-0" (click)="handlePreviousTemporal($event)">
|
||||||
|
<i class="fal fa-arrow-circle-left" aria-hidden="true" i18n-title title="Previous"></i> {{ temporalService.previousDate(itemLayer) }}
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<button *ngIf="temporalService.hasNext(itemLayer)" type="button" class="btn btn-link p-0" (click)="handleNextTemporal($event)">
|
||||||
|
{{ temporalService.nextDate(itemLayer)}} <i class="fal fa-arrow-circle-right" aria-hidden="true" i18n-title title="Next"></i>
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<fm-map-zoom-to-show-alert [layer]="currentItemLayer()?.layer"></fm-map-zoom-to-show-alert>
|
||||||
|
</div>
|
||||||
|
<div class="card menu-card pt-2">
|
||||||
|
<div *ngIf="layers.length>1">
|
||||||
|
<select (change)="onLayerChanged($event.target.value)">
|
||||||
|
<option *ngFor="let l of layers;" [value]="l.index" [selected]="itemLayer.layerIndex == l.index">{{l.name}}</option>
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
<fm-map-layer-legend [showTitle]="layers.length == 1"
|
||||||
|
[layer]="layer(layers,itemLayer.layerIndex)" [histogramenabled]="true"></fm-map-layer-legend>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
<div class="card menu-card">
|
<div class="card menu-card">
|
||||||
<h5><span i18n>Date</span>: {{temporalService.selectedDate(itemLayer)}}</h5>
|
<ul class="p-0 mt-2">
|
||||||
<div class="d-flex justify-content-between">
|
<li *ngIf="item.isEditable"><a href="#" class="mt-1 me-1" (click)="handleOnEdit(item)"><i class="fal fa-pencil" aria-hidden="true" i18n-title title="Edit"></i> <span i18n>Edit</span></a></li>
|
||||||
<div>
|
<ng-container *ngIf="itemTypeService.isLayer(item)">
|
||||||
<button *ngIf="temporalService.hasPrevious(itemLayer)" type="button" class="btn btn-link p-0" (click)="handlePreviousTemporal($event)">
|
<li *ngIf="!getItemLayer(item,itemLayer.layerIndex)"><a href="#" (click)="handleAddAsLayer(item,itemLayer.layerIndex)"><i class="fas fa-layer-plus" aria-hidden="true" i18n-title title="Add as layer"></i> <span i18n>Add as overlay</span></a></li>
|
||||||
<i class="fal fa-arrow-circle-left" aria-hidden="true" i18n-title title="Previous"></i> {{ temporalService.previousDate(itemLayer) }}
|
<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>
|
||||||
</button>
|
</ng-container>
|
||||||
</div>
|
<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>
|
||||||
<div>
|
<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>
|
||||||
<button *ngIf="temporalService.hasNext(itemLayer)" type="button" class="btn btn-link p-0" (click)="handleNextTemporal($event)">
|
</ul>
|
||||||
{{ temporalService.nextDate(itemLayer)}} <i class="fal fa-arrow-circle-right" aria-hidden="true" i18n-title title="Next"></i>
|
|
||||||
</button>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<fm-map-zoom-to-show-alert [layer]="currentItemLayer()?.layer"></fm-map-zoom-to-show-alert>
|
|
||||||
</div>
|
</div>
|
||||||
<div class="card menu-card pt-2">
|
</ng-container>
|
||||||
<div *ngIf="layers.length>1">
|
|
||||||
<select (change)="onLayerChanged($event.target.value)">
|
|
||||||
<option *ngFor="let l of layers;" [value]="l.index" [selected]="itemLayer.layerIndex == l.index">{{l.name}}</option>
|
|
||||||
</select>
|
|
||||||
</div>
|
|
||||||
<fm-map-layer-legend [showTitle]="layers.length == 1"
|
|
||||||
[layer]="layer(layers,itemLayer.layerIndex)" [histogramenabled]="true"></fm-map-layer-legend>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="card menu-card">
|
|
||||||
<ul class="p-0 mt-2">
|
|
||||||
<li *ngIf="item.isEditable"><a href="#" class="mt-1 me-1" (click)="handleOnEdit(item)"><i class="fal fa-pencil" aria-hidden="true" i18n-title title="Edit"></i> <span i18n>Edit</span></a></li>
|
|
||||||
<ng-container *ngIf="itemTypeService.isLayer(item)">
|
|
||||||
<li *ngIf="!getItemLayer(item,itemLayer.layerIndex)"><a href="#" (click)="handleAddAsLayer(item,itemLayer.layerIndex)"><i class="fas fa-layer-plus" 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)="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>
|
|
||||||
</ul>
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@@ -1,15 +1,15 @@
|
|||||||
import { Component, Injectable } from '@angular/core';
|
|
||||||
import { Location } from '@angular/common';
|
import { Location } from '@angular/common';
|
||||||
import { Store } from '@ngrx/store';
|
import { Component, Injectable, OnDestroy } from '@angular/core';
|
||||||
import * as mapReducers from '../../reducers/map.reducer';
|
|
||||||
import { commonReducers, ItemTypeService, IItem, ItemService, IItemLinkType, IUrlType } from '@farmmaps/common';
|
|
||||||
import { Router } from '@angular/router';
|
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 { ForItemType } from '../for-item/for-itemtype.decorator';
|
||||||
import { AbstractSelectedItemComponent } from '../selected-item/selected-item.component';
|
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")
|
@ForItemType("vnd.farmmaps.itemtype.temporal")
|
||||||
@Injectable()
|
@Injectable()
|
||||||
@@ -18,10 +18,15 @@ import {TemporalService} from '../../services/temporal.service';
|
|||||||
templateUrl: './selected-item-temporal.component.html',
|
templateUrl: './selected-item-temporal.component.html',
|
||||||
styleUrls: ['./selected-item-temporal.component.scss']
|
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) {
|
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) {
|
onLayerChanged(layerIndex: number) {
|
||||||
@@ -32,8 +37,6 @@ export class SelectedItemTemporalComponent extends AbstractSelectedItemComponent
|
|||||||
return (this.itemLayer as ITemporalItemLayer)?.selectedItemLayer
|
return (this.itemLayer as ITemporalItemLayer)?.selectedItemLayer
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
handleNextTemporal(event:MouseEvent) {
|
handleNextTemporal(event:MouseEvent) {
|
||||||
this.store.dispatch(new mapActions.NextTemporal());
|
this.store.dispatch(new mapActions.NextTemporal());
|
||||||
event.preventDefault();
|
event.preventDefault();
|
||||||
@@ -61,14 +64,12 @@ export class SelectedItemTemporalComponent extends AbstractSelectedItemComponent
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
download(item:IItem,event:MouseEvent) {
|
download(event:MouseEvent,item:IItem,layers:any,layerIndex:number) {
|
||||||
event.stopPropagation();
|
event.stopPropagation();
|
||||||
event.preventDefault();
|
event.preventDefault();
|
||||||
const itemLink : IItemLinkType = {itemcode:item.code,pathsuffix:"download", validminutes:10}
|
const itemLink : IItemLinkType = {itemcode:item.code,query:`layer=${this.layer(layers,layerIndex).name}`,pathsuffix:"download", validminutes:10}
|
||||||
console.log('download1', itemLink)
|
this.sub = this.itemService.getItemLink(itemLink).subscribe((itemLinkUrl:IUrlType) => {
|
||||||
const foo = this.itemService.getItemLink(itemLink).subscribe((itemLinkUrl:IUrlType) => {
|
window.location.href = itemLinkUrl.url;
|
||||||
console.log('download2', itemLinkUrl)
|
|
||||||
window.location.href =itemLinkUrl.url
|
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -2,7 +2,7 @@ import {Component, Injectable, Input, Directive} from '@angular/core';
|
|||||||
import {Location} from '@angular/common';
|
import {Location} from '@angular/common';
|
||||||
import {Store} from '@ngrx/store';
|
import {Store} from '@ngrx/store';
|
||||||
import * as mapReducers from '../../reducers/map.reducer';
|
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 * as mapActions from '../../actions/map.actions';
|
||||||
import {Router} from '@angular/router';
|
import {Router} from '@angular/router';
|
||||||
import { IItemLayer } from '../../models/item.layer';
|
import { IItemLayer } from '../../models/item.layer';
|
||||||
@@ -15,7 +15,7 @@ export abstract class AbstractSelectedItemComponent {
|
|||||||
@Input() parentItem: IItem;
|
@Input() parentItem: IItem;
|
||||||
@Input() itemLayer: IItemLayer;
|
@Input() itemLayer: IItemLayer;
|
||||||
@Input() overlayLayers: Array<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) {
|
handleOnView(item: IItem) {
|
||||||
@@ -37,6 +37,11 @@ export abstract class AbstractSelectedItemComponent {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
handleOnDelete(item: IItem) {
|
||||||
|
this.itemService.deleteItem(item.code);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
handleAddAsLayer(item: IItem,layerIndex = -1) {
|
handleAddAsLayer(item: IItem,layerIndex = -1) {
|
||||||
this.store.dispatch(new mapActions.AddLayer(item,layerIndex));
|
this.store.dispatch(new mapActions.AddLayer(item,layerIndex));
|
||||||
return false;
|
return false;
|
||||||
@@ -76,8 +81,8 @@ export abstract class AbstractSelectedItemComponent {
|
|||||||
})
|
})
|
||||||
export class SelectedItemComponent extends AbstractSelectedItemComponent {
|
export class SelectedItemComponent extends AbstractSelectedItemComponent {
|
||||||
|
|
||||||
constructor(store: Store<mapReducers.State | commonReducers.State>, itemTypeService: ItemTypeService, location: Location, router: Router, public config:AppConfig) {
|
constructor(store: Store<mapReducers.State | commonReducers.State>, itemTypeService: ItemTypeService, itemService: ItemService, location: Location, router: Router, public config:AppConfig) {
|
||||||
super(store, itemTypeService,location,router);
|
super(store, itemTypeService,itemService,location,router);
|
||||||
}
|
}
|
||||||
|
|
||||||
getThumbnailUrl(item:IItem):string {
|
getThumbnailUrl(item:IItem):string {
|
||||||
|
@@ -637,6 +637,8 @@ export const selectGetExtent = createSelector(selectMapState, getExtent);
|
|||||||
export const selectGetViewExtent = createSelector(selectMapState, getViewExtent);
|
export const selectGetViewExtent = createSelector(selectMapState, getViewExtent);
|
||||||
export const selectGetOverlayLayers = createSelector(selectMapState, getOverlayLayers);
|
export const selectGetOverlayLayers = createSelector(selectMapState, getOverlayLayers);
|
||||||
export const selectGetBaseLayers = createSelector(selectMapState, getBaseLayers);
|
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 selectGetProjection = createSelector(selectMapState, getProjection);
|
||||||
export const selectGetSelectedBaseLayer = createSelector(selectMapState, getSelectedBaseLayer);
|
export const selectGetSelectedBaseLayer = createSelector(selectMapState, getSelectedBaseLayer);
|
||||||
export const selectGetSelectedOverlayLayer = createSelector(selectMapState, getSelectedOverlayLayer);
|
export const selectGetSelectedOverlayLayer = createSelector(selectMapState, getSelectedOverlayLayer);
|
||||||
|
@@ -85,6 +85,9 @@ export const SETUNREADNOTIFICATIONS = '[AppCommon] SetUnreadNotifications';
|
|||||||
|
|
||||||
export const SWITCHLANGUAGE = '[AppCommon] SwitchLanguage';
|
export const SWITCHLANGUAGE = '[AppCommon] SwitchLanguage';
|
||||||
|
|
||||||
|
export const SETSETTINGMENUBACKGROUNDCOLOR = '[AppCommon] SetSettingMenuBackgroundColor';
|
||||||
|
|
||||||
|
|
||||||
export class InitUser implements Action {
|
export class InitUser implements Action {
|
||||||
readonly type = INITUSER;
|
readonly type = INITUSER;
|
||||||
|
|
||||||
@@ -379,6 +382,11 @@ export class SwitchLanguage implements Action {
|
|||||||
constructor(public locale:string) { }
|
constructor(public locale:string) { }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export class SetSettingMenuBackgroundColor implements Action {
|
||||||
|
readonly type = SETSETTINGMENUBACKGROUNDCOLOR;
|
||||||
|
|
||||||
|
constructor(public color:string) { }
|
||||||
|
}
|
||||||
|
|
||||||
export type Actions = OpenModal
|
export type Actions = OpenModal
|
||||||
| InitRoot
|
| InitRoot
|
||||||
@@ -427,6 +435,7 @@ export type Actions = OpenModal
|
|||||||
| ToggleSettingMenu
|
| ToggleSettingMenu
|
||||||
| NotificationEvent
|
| NotificationEvent
|
||||||
| SetUnreadNotifications
|
| SetUnreadNotifications
|
||||||
| SwitchLanguage;
|
| SwitchLanguage
|
||||||
|
| SetSettingMenuBackgroundColor;
|
||||||
|
|
||||||
|
|
||||||
|
@@ -33,7 +33,7 @@
|
|||||||
<fm-resumable-file-upload></fm-resumable-file-upload>
|
<fm-resumable-file-upload></fm-resumable-file-upload>
|
||||||
</ng-container>
|
</ng-container>
|
||||||
<div class="user-menu apponly">
|
<div class="user-menu apponly">
|
||||||
<fm-setting-menu [user]="user|async" [showMenu]="settingMenuVisible|async"></fm-setting-menu>
|
<fm-setting-menu [user]="user|async" [showMenu]="settingMenuVisible|async" [backgroundColor]="settingMenuBackgroundColor|async"></fm-setting-menu>
|
||||||
<fm-help-menu [user]="user|async" [showMenu]="helpMenuVisible|async"></fm-help-menu>
|
<fm-help-menu [user]="user|async" [showMenu]="helpMenuVisible|async"></fm-help-menu>
|
||||||
<fm-notification-menu [user]="user|async" [unread]="unreadNotifications|async" [showMenu]="notificationMenuVisible|async"></fm-notification-menu>
|
<fm-notification-menu [user]="user|async" [unread]="unreadNotifications|async" [showMenu]="notificationMenuVisible|async"></fm-notification-menu>
|
||||||
<fm-app-menu [user]="user|async" [showMenu]="appMenuVisible|async"></fm-app-menu>
|
<fm-app-menu [user]="user|async" [showMenu]="appMenuVisible|async"></fm-app-menu>
|
||||||
|
@@ -50,6 +50,7 @@ export class AppComponent implements OnInit, OnDestroy {
|
|||||||
public unreadNotifications: Observable<number> = this.store$.select(appReducers.SelectgetUnreadNotifications);
|
public unreadNotifications: Observable<number> = this.store$.select(appReducers.SelectgetUnreadNotifications);
|
||||||
public user: Observable<IUser> = this.store$.select(appReducers.SelectGetUser);
|
public user: Observable<IUser> = this.store$.select(appReducers.SelectGetUser);
|
||||||
public isPageMode: Observable<boolean> = this.store$.select(appReducers.SelectGetIsPageMode);
|
public isPageMode: Observable<boolean> = this.store$.select(appReducers.SelectGetIsPageMode);
|
||||||
|
public settingMenuBackgroundColor: Observable<string> = this.store$.select(appReducers.SelectGetSettingMenuBackgroundColor);
|
||||||
@Input() showUploadProgress = true;
|
@Input() showUploadProgress = true;
|
||||||
|
|
||||||
constructor(
|
constructor(
|
||||||
|
@@ -1,5 +1,5 @@
|
|||||||
<div>
|
<div>
|
||||||
<div (click)="toggle($event)" class="rounded-circle menu-button hidden" [ngClass]="{'hidden':!user || noContent}">
|
<div (click)="toggle($event)" class="rounded-circle menu-button hidden" [style.background-color]="backgroundColor" [ngClass]="{'hidden':!user || noContent}">
|
||||||
<span i18n-title title="Settings"><i class="fas fa-gear" aria-hidden="true"></i></span>
|
<span i18n-title title="Settings"><i class="fas fa-gear" aria-hidden="true"></i></span>
|
||||||
<div class="menu hidden" [ngClass]="{'hidden':!showMenu}">
|
<div class="menu hidden" [ngClass]="{'hidden':!showMenu}">
|
||||||
<router-outlet name="setting-menu" (activate)="activateRoute()" (deactivate)="deActivateRoute()"></router-outlet>
|
<router-outlet name="setting-menu" (activate)="activateRoute()" (deactivate)="deActivateRoute()"></router-outlet>
|
||||||
|
@@ -15,6 +15,7 @@ export class SettingMenuComponent implements OnInit {
|
|||||||
|
|
||||||
@Input() user:IUser;
|
@Input() user:IUser;
|
||||||
@Input() showMenu:boolean;
|
@Input() showMenu:boolean;
|
||||||
|
@Input() backgroundColor:string;
|
||||||
public noContent = true;
|
public noContent = true;
|
||||||
|
|
||||||
constructor(private store: Store<appReducers.State>) { }
|
constructor(private store: Store<appReducers.State>) { }
|
||||||
|
@@ -1,18 +1,18 @@
|
|||||||
import { Inject, Injectable, LOCALE_ID } from '@angular/core';
|
import { Injectable, Inject, LOCALE_ID } from '@angular/core';
|
||||||
import { Router } from '@angular/router';
|
import { Router } from '@angular/router';
|
||||||
import { Actions, createEffect, ofType } from '@ngrx/effects';
|
import { OAuthService,UserInfo } from 'angular-oauth2-oidc';
|
||||||
import { Store } from '@ngrx/store';
|
import { Store } from '@ngrx/store';
|
||||||
import { OAuthService, UserInfo } from 'angular-oauth2-oidc';
|
import { Actions,ofType,createEffect } from '@ngrx/effects';
|
||||||
import { from, of, zip } from 'rxjs';
|
import { of,from,zip } from 'rxjs';
|
||||||
import { catchError, first, map, mergeMap, switchMap, withLatestFrom } from 'rxjs/operators';
|
import { withLatestFrom,mergeMap,switchMap,map,catchError,first} from 'rxjs/operators';
|
||||||
import * as appCommonActions from '../actions/app-common.actions';
|
import * as appCommonActions from '../actions/app-common.actions';
|
||||||
|
import * as appCommonReducers from '../reducers/app-common.reducer';
|
||||||
|
import { ItemService } from '../services/item.service';
|
||||||
|
import { FolderService } from '../services/folder.service';
|
||||||
|
import { UserService } from '../services/user.service';
|
||||||
import { IItemTypes } from '../models/item.types';
|
import { IItemTypes } from '../models/item.types';
|
||||||
import { IListItem } from '../models/list.item';
|
import { IListItem } from '../models/list.item';
|
||||||
import * as appCommonReducers from '../reducers/app-common.reducer';
|
import {StateSerializerService} from '../services/state-serializer.service';
|
||||||
import { FolderService } from '../services/folder.service';
|
|
||||||
import { ItemService } from '../services/item.service';
|
|
||||||
import { StateSerializerService } from '../services/state-serializer.service';
|
|
||||||
import { UserService } from '../services/user.service';
|
|
||||||
|
|
||||||
@Injectable()
|
@Injectable()
|
||||||
export class AppCommonEffects {
|
export class AppCommonEffects {
|
||||||
@@ -63,9 +63,9 @@ export class AppCommonEffects {
|
|||||||
ofType(appCommonActions.SWITCHLANGUAGE),
|
ofType(appCommonActions.SWITCHLANGUAGE),
|
||||||
switchMap((action) => {
|
switchMap((action) => {
|
||||||
const a = action as appCommonActions.SwitchLanguage;
|
const a = action as appCommonActions.SwitchLanguage;
|
||||||
if (this.router$.url.includes(`/${this.locale}/`)) {
|
if (location.href.includes(`/${this.locale}/`)) {
|
||||||
const newUrl = this.router$.url.replace(`/${this.locale}/`, `/${a.locale}/`);
|
const newPath = location.href.replace(`/${this.locale}/`, `/${a.locale}/`);
|
||||||
this.router$.navigateByUrl(newUrl);
|
location.replace(newPath);
|
||||||
}
|
}
|
||||||
return of(undefined);
|
return of(undefined);
|
||||||
})),{ dispatch:false});
|
})),{ dispatch:false});
|
||||||
|
@@ -26,6 +26,7 @@ export class Item implements IItem {
|
|||||||
public data?:any;
|
public data?:any;
|
||||||
public isEditable?:boolean;
|
public isEditable?:boolean;
|
||||||
public owner?: string;
|
public owner?: string;
|
||||||
|
public fullPath?: string;
|
||||||
|
|
||||||
constructor() {
|
constructor() {
|
||||||
}
|
}
|
||||||
|
@@ -29,7 +29,8 @@ export interface State {
|
|||||||
settingMenuVisible: boolean,
|
settingMenuVisible: boolean,
|
||||||
unreadNotifications: number,
|
unreadNotifications: number,
|
||||||
isOnline: boolean,
|
isOnline: boolean,
|
||||||
isPageMode:boolean
|
isPageMode:boolean,
|
||||||
|
settingMenuBackgroundColor:string
|
||||||
}
|
}
|
||||||
|
|
||||||
export const initialState: State = {
|
export const initialState: State = {
|
||||||
@@ -51,7 +52,8 @@ export const initialState: State = {
|
|||||||
settingMenuVisible: false,
|
settingMenuVisible: false,
|
||||||
unreadNotifications: 0,
|
unreadNotifications: 0,
|
||||||
isOnline: true,
|
isOnline: true,
|
||||||
isPageMode: true
|
isPageMode: true,
|
||||||
|
settingMenuBackgroundColor:'rgb(128, 128, 128)'
|
||||||
}
|
}
|
||||||
|
|
||||||
export function reducer(state = initialState, action: appCommonActions.Actions ): State {
|
export function reducer(state = initialState, action: appCommonActions.Actions ): State {
|
||||||
@@ -187,6 +189,10 @@ export function reducer(state = initialState, action: appCommonActions.Actions )
|
|||||||
const a = action as appCommonActions.SetUnreadNotifications;
|
const a = action as appCommonActions.SetUnreadNotifications;
|
||||||
return tassign(state,{unreadNotifications:a.unread});
|
return tassign(state,{unreadNotifications:a.unread});
|
||||||
}
|
}
|
||||||
|
case appCommonActions.SETSETTINGMENUBACKGROUNDCOLOR: {
|
||||||
|
const a = action as appCommonActions.SetSettingMenuBackgroundColor;
|
||||||
|
return tassign(state,{settingMenuBackgroundColor:a.color});
|
||||||
|
}
|
||||||
default: {
|
default: {
|
||||||
return state;
|
return state;
|
||||||
}
|
}
|
||||||
@@ -212,6 +218,7 @@ export const getSettingMenuVisible = (state: State) => state.settingMenuVisible;
|
|||||||
export const getUnreadNotifications = (state: State) => state.unreadNotifications;
|
export const getUnreadNotifications = (state: State) => state.unreadNotifications;
|
||||||
export const getIsOnline = (state: State) => state.isOnline;
|
export const getIsOnline = (state: State) => state.isOnline;
|
||||||
export const getIsPageMode = (state: State) => state.isPageMode;
|
export const getIsPageMode = (state: State) => state.isPageMode;
|
||||||
|
export const getSettingMenuBackgroundColor = (state: State) => state.settingMenuBackgroundColor;
|
||||||
|
|
||||||
export const selectAppCommonState = createFeatureSelector<State>(MODULE_NAME);
|
export const selectAppCommonState = createFeatureSelector<State>(MODULE_NAME);
|
||||||
|
|
||||||
@@ -238,5 +245,4 @@ export const SelectgetUnreadNotifications = createSelector(selectAppCommonState,
|
|||||||
|
|
||||||
export const SelectGetIsOnline = createSelector(selectAppCommonState,getIsOnline);
|
export const SelectGetIsOnline = createSelector(selectAppCommonState,getIsOnline);
|
||||||
export const SelectGetIsPageMode = createSelector(selectAppCommonState,getIsPageMode);
|
export const SelectGetIsPageMode = createSelector(selectAppCommonState,getIsPageMode);
|
||||||
|
export const SelectGetSettingMenuBackgroundColor= createSelector(selectAppCommonState,getSettingMenuBackgroundColor);
|
||||||
|
|
||||||
|
@@ -52,4 +52,20 @@ export class AdminService {
|
|||||||
postItemTask(item: IItem, task: IItemTask): Observable<IItemTask> {
|
postItemTask(item: IItem, task: IItemTask): Observable<IItemTask> {
|
||||||
return this.httpClient.post<IItemTask>(`${this.ApiEndpoint()}/api/v1/admin/${item.code}/tasks`, task);
|
return this.httpClient.post<IItemTask>(`${this.ApiEndpoint()}/api/v1/admin/${item.code}/tasks`, task);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
getFileStorageOverview(): Observable<any> {
|
||||||
|
return this.httpClient.get<any>(`${this.ApiEndpoint()}/api/v1/admin/filestorage/folderinfo/overview`);
|
||||||
|
}
|
||||||
|
|
||||||
|
getFileStorageInfo(user: string): Observable<any> {
|
||||||
|
return this.httpClient.get<any>(`${this.ApiEndpoint()}/api/v1/admin/filestorage/folderinfo/${user}`);
|
||||||
|
}
|
||||||
|
|
||||||
|
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,
|
getItemList(itemType?: string, dataFilter?: any, level?: number, atItemLocationItemCode?: string,
|
||||||
indexed?: boolean, validToday?: boolean,tags?:string,crs?:string, startDate?: Date, endDate?: Date,
|
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();
|
let params = new HttpParams();
|
||||||
if(itemType) params = params.append("it", itemType);
|
if(itemType) params = params.append("it", itemType);
|
||||||
if(dataFilter) params = params.append("df", JSON.stringify(dataFilter));
|
if(dataFilter) params = params.append("df", JSON.stringify(dataFilter));
|
||||||
@@ -96,6 +97,7 @@ export class ItemService {
|
|||||||
if(take) params = params.append("take", take);
|
if(take) params = params.append("take", take);
|
||||||
if(exactMatchStartOrEndDate !== undefined) params = params.append("exactMatchStartOrEndDate", exactMatchStartOrEndDate);
|
if(exactMatchStartOrEndDate !== undefined) params = params.append("exactMatchStartOrEndDate", exactMatchStartOrEndDate);
|
||||||
if(owner) params = params.append("owner", owner);
|
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 });
|
return this.httpClient.get<IItem[]>(`${this.ApiEndpoint()}/api/v1/items/`, { params: params });
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user