Compare commits
64 Commits
3a42f9114e
...
master
Author | SHA1 | Date | |
---|---|---|---|
|
df0d13e5dd | ||
|
b347220dd4 | ||
|
edeadef96f | ||
|
267a299589 | ||
|
134220d75f | ||
|
80ef4ed6fe | ||
|
2137f3f07e | ||
a46e8040b2 | |||
|
2ca9730735 | ||
3d2ca8fb9f | |||
6810da8b79 | |||
|
4866a6f22d | ||
84a1004977 | |||
39c619a837 | |||
|
758613aa12 | ||
6914a61bc4 | |||
9f43287433 | |||
|
10df983ae3 | ||
78249811ab | |||
df14427d60 | |||
|
c7c131d437 | ||
b2fe8f3bd7 | |||
|
3027c69fa8 | ||
5995d205a4 | |||
|
fd479c92d8 | ||
e9880d6eb2 | |||
|
a4438d8a90 | ||
89061774de | |||
|
362e6c8534 | ||
64a0e58238 | |||
|
a3d4dfbd59 | ||
4c106ebff3 | |||
|
d21f304081 | ||
2bad3274fd | |||
|
5c8fd64521 | ||
72ba8eca81 | |||
|
f89f741265 | ||
50af55acb2 | |||
|
cc879b85e5 | ||
b4a0a4584d | |||
8ab1611f39 | |||
|
475c522039 | ||
068396ac9a | |||
|
4a30707ec6 | ||
852b1db895 | |||
|
fcbd68eca0 | ||
|
31d3e58062 | ||
0231421cef | |||
|
f2c133e9bd | ||
|
1274d96f1d | ||
35ccb4f4c5 | |||
|
47fbc5eab9 | ||
564d08b5b9 | |||
7e17a49dc6 | |||
|
3f286ee042 | ||
747499d009 | |||
|
c4f4a4f61e | ||
6b095b7f49 | |||
b2791eb80b | |||
|
4c93a9f766 | ||
93554bc7c4 | |||
d074cd81cf | |||
87547aafcc | |||
6ab5ba8a56 |
@@ -52,7 +52,7 @@ ng serve
|
|||||||
```
|
```
|
||||||
*Go*`
|
*Go*`
|
||||||
|
|
||||||
Point your browser to http://localhost:4200
|
Point your browser to http://localhost:4200
|
||||||
|
|
||||||
*ESLint*
|
*ESLint*
|
||||||
|
|
||||||
|
54
package-lock.json
generated
54
package-lock.json
generated
@@ -1,22 +1,22 @@
|
|||||||
{
|
{
|
||||||
"name": "farmmaps-lib-app",
|
"name": "farmmaps-lib-app",
|
||||||
"version": "4.12.0",
|
"version": "4.14.3",
|
||||||
"lockfileVersion": 3,
|
"lockfileVersion": 3,
|
||||||
"requires": true,
|
"requires": true,
|
||||||
"packages": {
|
"packages": {
|
||||||
"": {
|
"": {
|
||||||
"name": "farmmaps-lib-app",
|
"name": "farmmaps-lib-app",
|
||||||
"version": "4.12.0",
|
"version": "4.14.3",
|
||||||
"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",
|
||||||
"@angular/common": "^18.2.3",
|
"@angular/common": "18.2.3",
|
||||||
"@angular/compiler": "^18.2.3",
|
"@angular/compiler": "18.2.3",
|
||||||
"@angular/core": "^18.2.3",
|
"@angular/core": "18.2.3",
|
||||||
"@angular/forms": "^18.2.3",
|
"@angular/forms": "18.2.3",
|
||||||
"@angular/platform-browser": "^18.2.3",
|
"@angular/platform-browser": "18.2.3",
|
||||||
"@angular/platform-browser-dynamic": "^18.2.3",
|
"@angular/platform-browser-dynamic": "18.2.3",
|
||||||
"@angular/router": "^18.2.3",
|
"@angular/router": "18.2.3",
|
||||||
"@farmmaps/common": "file:dist/common",
|
"@farmmaps/common": "file:dist/common",
|
||||||
"@farmmaps/common-map": "file:dist/common-map",
|
"@farmmaps/common-map": "file:dist/common-map",
|
||||||
"@farmmaps/common-map3d": "file:dist/common-map3d",
|
"@farmmaps/common-map3d": "file:dist/common-map3d",
|
||||||
@@ -55,11 +55,11 @@
|
|||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@angular-builders/custom-webpack": "^18.0.0",
|
"@angular-builders/custom-webpack": "^18.0.0",
|
||||||
"@angular-devkit/build-angular": "^18.2.3",
|
"@angular-devkit/build-angular": "18.2.3",
|
||||||
"@angular/cli": "^18.2.3",
|
"@angular/cli": "18.2.3",
|
||||||
"@angular/compiler-cli": "^18.2.3",
|
"@angular/compiler-cli": "18.2.3",
|
||||||
"@angular/language-service": "^18.2.3",
|
"@angular/language-service": "18.2.3",
|
||||||
"@angular/localize": "^18.2.3",
|
"@angular/localize": "18.2.3",
|
||||||
"@types/arcgis-rest-api": "^10.4.5",
|
"@types/arcgis-rest-api": "^10.4.5",
|
||||||
"@types/jasmine": "~2.8.8",
|
"@types/jasmine": "~2.8.8",
|
||||||
"@types/jasminewd2": "^2.0.9",
|
"@types/jasminewd2": "^2.0.9",
|
||||||
@@ -90,14 +90,14 @@
|
|||||||
},
|
},
|
||||||
"dist/common": {
|
"dist/common": {
|
||||||
"name": "@farmmaps/common",
|
"name": "@farmmaps/common",
|
||||||
"version": "4.12.0-prerelease.2526",
|
"version": "4.14.2",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"tslib": "^2.3.0"
|
"tslib": "^2.3.0"
|
||||||
},
|
},
|
||||||
"peerDependencies": {
|
"peerDependencies": {
|
||||||
"@angular/common": "^18.2.3",
|
"@angular/common": "18.2.3",
|
||||||
"@angular/core": "^18.2.3",
|
"@angular/core": "18.2.3",
|
||||||
"@angular/forms": "^18.2.3",
|
"@angular/forms": "18.2.3",
|
||||||
"@microsoft/signalr": "^3.1.16",
|
"@microsoft/signalr": "^3.1.16",
|
||||||
"@ng-bootstrap/ng-bootstrap": "^17.0.1",
|
"@ng-bootstrap/ng-bootstrap": "^17.0.1",
|
||||||
"@ngrx/effects": "^18.0.2",
|
"@ngrx/effects": "^18.0.2",
|
||||||
@@ -115,12 +115,12 @@
|
|||||||
},
|
},
|
||||||
"dist/common-map": {
|
"dist/common-map": {
|
||||||
"name": "@farmmaps/common-map",
|
"name": "@farmmaps/common-map",
|
||||||
"version": "4.12.0-prerelease.2526",
|
"version": "4.14.2",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"tslib": "^2.0.0"
|
"tslib": "^2.0.0"
|
||||||
},
|
},
|
||||||
"peerDependencies": {
|
"peerDependencies": {
|
||||||
"@angular/core": "^18.2.3",
|
"@angular/core": "18.2.3",
|
||||||
"@ngrx/effects": "^18.0.2",
|
"@ngrx/effects": "^18.0.2",
|
||||||
"@ngrx/router-store": "^18.0.2",
|
"@ngrx/router-store": "^18.0.2",
|
||||||
"@ngrx/store": "^18.0.2",
|
"@ngrx/store": "^18.0.2",
|
||||||
@@ -130,27 +130,27 @@
|
|||||||
},
|
},
|
||||||
"dist/common-map3d": {
|
"dist/common-map3d": {
|
||||||
"name": "@farmmaps/common-map3d",
|
"name": "@farmmaps/common-map3d",
|
||||||
"version": "4.12.0-prerelease.2526",
|
"version": "4.14.2",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"tslib": "^2.0.0"
|
"tslib": "^2.0.0"
|
||||||
},
|
},
|
||||||
"peerDependencies": {
|
"peerDependencies": {
|
||||||
"@angular/common": "^18.2.3",
|
"@angular/common": "18.2.3",
|
||||||
"@angular/core": "^18.2.3",
|
"@angular/core": "18.2.3",
|
||||||
"cesium": "^1.97.0",
|
"cesium": "^1.97.0",
|
||||||
"ol-cesium": ">=2.13.0"
|
"ol-cesium": ">=2.13.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"dist/ng-openlayers": {
|
"dist/ng-openlayers": {
|
||||||
"name": "@farmmaps/ng-openlayers",
|
"name": "@farmmaps/ng-openlayers",
|
||||||
"version": "4.12.0-prerelease.2526",
|
"version": "4.14.2",
|
||||||
"license": "MPL-2.0",
|
"license": "MPL-2.0",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"tslib": "^2.3.0"
|
"tslib": "^2.3.0"
|
||||||
},
|
},
|
||||||
"peerDependencies": {
|
"peerDependencies": {
|
||||||
"@angular/common": "^18.2.3",
|
"@angular/common": "18.2.3",
|
||||||
"@angular/core": "^18.2.3",
|
"@angular/core": "18.2.3",
|
||||||
"ol": "^8.2.0"
|
"ol": "^8.2.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
28
package.json
28
package.json
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "farmmaps-lib-app",
|
"name": "farmmaps-lib-app",
|
||||||
"version": "4.12.0",
|
"version": "4.14.3",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"ng": "ng",
|
"ng": "ng",
|
||||||
"start": "ng serve",
|
"start": "ng serve",
|
||||||
@@ -12,14 +12,14 @@
|
|||||||
"private": true,
|
"private": true,
|
||||||
"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",
|
||||||
"@angular/common": "^18.2.3",
|
"@angular/common": "18.2.3",
|
||||||
"@angular/compiler": "^18.2.3",
|
"@angular/compiler": "18.2.3",
|
||||||
"@angular/core": "^18.2.3",
|
"@angular/core": "18.2.3",
|
||||||
"@angular/forms": "^18.2.3",
|
"@angular/forms": "18.2.3",
|
||||||
"@angular/platform-browser": "^18.2.3",
|
"@angular/platform-browser": "18.2.3",
|
||||||
"@angular/platform-browser-dynamic": "^18.2.3",
|
"@angular/platform-browser-dynamic": "18.2.3",
|
||||||
"@angular/router": "^18.2.3",
|
"@angular/router": "18.2.3",
|
||||||
"@farmmaps/common": "file:dist/common",
|
"@farmmaps/common": "file:dist/common",
|
||||||
"@farmmaps/common-map": "file:dist/common-map",
|
"@farmmaps/common-map": "file:dist/common-map",
|
||||||
"@farmmaps/common-map3d": "file:dist/common-map3d",
|
"@farmmaps/common-map3d": "file:dist/common-map3d",
|
||||||
@@ -62,11 +62,11 @@
|
|||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@angular-builders/custom-webpack": "^18.0.0",
|
"@angular-builders/custom-webpack": "^18.0.0",
|
||||||
"@angular-devkit/build-angular": "^18.2.3",
|
"@angular-devkit/build-angular": "18.2.3",
|
||||||
"@angular/cli": "^18.2.3",
|
"@angular/cli": "18.2.3",
|
||||||
"@angular/compiler-cli": "^18.2.3",
|
"@angular/compiler-cli": "18.2.3",
|
||||||
"@angular/language-service": "^18.2.3",
|
"@angular/language-service": "18.2.3",
|
||||||
"@angular/localize": "^18.2.3",
|
"@angular/localize": "18.2.3",
|
||||||
"@types/arcgis-rest-api": "^10.4.5",
|
"@types/arcgis-rest-api": "^10.4.5",
|
||||||
"@types/jasmine": "~2.8.8",
|
"@types/jasmine": "~2.8.8",
|
||||||
"@types/jasminewd2": "^2.0.9",
|
"@types/jasminewd2": "^2.0.9",
|
||||||
|
@@ -8,7 +8,7 @@
|
|||||||
"tslib": "^2.0.0"
|
"tslib": "^2.0.0"
|
||||||
},
|
},
|
||||||
"peerDependencies": {
|
"peerDependencies": {
|
||||||
"@angular/core": "^18.2.3",
|
"@angular/core": "18.2.3",
|
||||||
"ngrx-store-localstorage": "^18.0.0",
|
"ngrx-store-localstorage": "^18.0.0",
|
||||||
"@ngrx/effects": "^18.0.2",
|
"@ngrx/effects": "^18.0.2",
|
||||||
"@ngrx/router-store": "^18.0.2",
|
"@ngrx/router-store": "^18.0.2",
|
||||||
|
@@ -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,49 +54,51 @@ 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;
|
||||||
private viewEnabled = true;
|
private viewEnabled = true;
|
||||||
|
|
||||||
@ViewChild('map') map;
|
@ViewChild('map') map;
|
||||||
@ViewChild('contentDiv') contentDiv: ElementRef;
|
@ViewChild('contentDiv') contentDiv: ElementRef;
|
||||||
|
|
||||||
@@ -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,27 +164,27 @@ 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%";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
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,65 +328,65 @@ 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;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
this.initCustomStyles();
|
this.initCustomStyles();
|
||||||
|
|
||||||
// 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();
|
||||||
@@ -461,21 +466,23 @@ 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() {
|
||||||
|
@@ -42,6 +42,7 @@
|
|||||||
<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)="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)="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>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@@ -2,7 +2,7 @@ import { Component, Injectable } 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 { commonReducers, ItemTypeService, IItem } from '@farmmaps/common';
|
import { commonReducers, ItemTypeService, IItem, ItemService, IItemLinkType, IUrlType } from '@farmmaps/common';
|
||||||
import { Router } from '@angular/router';
|
import { Router } from '@angular/router';
|
||||||
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';
|
||||||
@@ -11,7 +11,6 @@ import * as mapActions from '../../actions/map.actions';
|
|||||||
import { IItemLayer } from '../../models/item.layer';
|
import { IItemLayer } from '../../models/item.layer';
|
||||||
import {TemporalService} from '../../services/temporal.service';
|
import {TemporalService} from '../../services/temporal.service';
|
||||||
|
|
||||||
|
|
||||||
@ForItemType("vnd.farmmaps.itemtype.temporal")
|
@ForItemType("vnd.farmmaps.itemtype.temporal")
|
||||||
@Injectable()
|
@Injectable()
|
||||||
@Component({
|
@Component({
|
||||||
@@ -21,7 +20,7 @@ import {TemporalService} from '../../services/temporal.service';
|
|||||||
})
|
})
|
||||||
export class SelectedItemTemporalComponent extends AbstractSelectedItemComponent {
|
export class SelectedItemTemporalComponent extends AbstractSelectedItemComponent {
|
||||||
|
|
||||||
constructor(store: Store<mapReducers.State | commonReducers.State>, 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,location,router);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -61,4 +60,15 @@ export class SelectedItemTemporalComponent extends AbstractSelectedItemComponent
|
|||||||
this.router.navigate(['/viewer', 'temporal', 'item', item.parentCode, new Date(Date.parse(item.dataDate)).getUTCFullYear()]);
|
this.router.navigate(['/viewer', 'temporal', 'item', item.parentCode, new Date(Date.parse(item.dataDate)).getUTCFullYear()]);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
download(item:IItem,event:MouseEvent) {
|
||||||
|
event.stopPropagation();
|
||||||
|
event.preventDefault();
|
||||||
|
const itemLink : IItemLinkType = {itemcode:item.code,pathsuffix:"download", validminutes:10}
|
||||||
|
console.log('download1', itemLink)
|
||||||
|
const foo = this.itemService.getItemLink(itemLink).subscribe((itemLinkUrl:IUrlType) => {
|
||||||
|
console.log('download2', itemLinkUrl)
|
||||||
|
window.location.href =itemLinkUrl.url
|
||||||
|
})
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@@ -8,8 +8,8 @@
|
|||||||
"tslib": "^2.0.0"
|
"tslib": "^2.0.0"
|
||||||
},
|
},
|
||||||
"peerDependencies": {
|
"peerDependencies": {
|
||||||
"@angular/common": "^18.2.3",
|
"@angular/common": "18.2.3",
|
||||||
"@angular/core": "^18.2.3",
|
"@angular/core": "18.2.3",
|
||||||
"cesium": "^1.97.0",
|
"cesium": "^1.97.0",
|
||||||
"ol-cesium": ">=2.13.0"
|
"ol-cesium": ">=2.13.0"
|
||||||
}
|
}
|
||||||
|
@@ -6,9 +6,9 @@
|
|||||||
},
|
},
|
||||||
"peerDependencies": {
|
"peerDependencies": {
|
||||||
"@ng-bootstrap/ng-bootstrap": "^17.0.1",
|
"@ng-bootstrap/ng-bootstrap": "^17.0.1",
|
||||||
"@angular/common": "^18.2.3",
|
"@angular/common": "18.2.3",
|
||||||
"@angular/core": "^18.2.3",
|
"@angular/core": "18.2.3",
|
||||||
"@angular/forms": "^18.2.3",
|
"@angular/forms": "18.2.3",
|
||||||
"@ngrx/effects": "^18.0.2",
|
"@ngrx/effects": "^18.0.2",
|
||||||
"@ngrx/router-store": "^18.0.2",
|
"@ngrx/router-store": "^18.0.2",
|
||||||
"@ngrx/store": "^18.0.2",
|
"@ngrx/store": "^18.0.2",
|
||||||
|
@@ -83,6 +83,11 @@ export const SETPAGEMODE = '[AppCommon] SetPageMode';
|
|||||||
|
|
||||||
export const SETUNREADNOTIFICATIONS = '[AppCommon] SetUnreadNotifications';
|
export const SETUNREADNOTIFICATIONS = '[AppCommon] SetUnreadNotifications';
|
||||||
|
|
||||||
|
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;
|
||||||
|
|
||||||
@@ -371,6 +376,17 @@ export class SetUnreadNotifications implements Action {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export class SwitchLanguage implements Action {
|
||||||
|
readonly type = SWITCHLANGUAGE;
|
||||||
|
|
||||||
|
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
|
||||||
@@ -418,6 +434,8 @@ export type Actions = OpenModal
|
|||||||
| ToggleHelpMenu
|
| ToggleHelpMenu
|
||||||
| ToggleSettingMenu
|
| ToggleSettingMenu
|
||||||
| NotificationEvent
|
| NotificationEvent
|
||||||
| SetUnreadNotifications;
|
| SetUnreadNotifications
|
||||||
|
| SwitchLanguage
|
||||||
|
| SetSettingMenuBackgroundColor;
|
||||||
|
|
||||||
|
|
||||||
|
@@ -13,6 +13,7 @@ import { SchemaService } from './services/schema.service';
|
|||||||
import { FolderService } from './services/folder.service';
|
import { FolderService } from './services/folder.service';
|
||||||
import { TimespanService } from './services/timespan.service';
|
import { TimespanService } from './services/timespan.service';
|
||||||
import { ItemService } from './services/item.service';
|
import { ItemService } from './services/item.service';
|
||||||
|
import { TaskService } from './services/task.service';
|
||||||
import { AdminService } from './services/admin.service';
|
import { AdminService } from './services/admin.service';
|
||||||
import { EventService } from './services/event.service';
|
import { EventService } from './services/event.service';
|
||||||
import { TypeaheadService } from './services/typeahead.service';
|
import { TypeaheadService } from './services/typeahead.service';
|
||||||
@@ -44,6 +45,7 @@ export {
|
|||||||
ItemTypeService,
|
ItemTypeService,
|
||||||
TimespanService,
|
TimespanService,
|
||||||
ItemService,
|
ItemService,
|
||||||
|
TaskService,
|
||||||
AdminService,
|
AdminService,
|
||||||
EventService,
|
EventService,
|
||||||
TypeaheadService,
|
TypeaheadService,
|
||||||
|
@@ -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(
|
||||||
|
@@ -11,7 +11,7 @@
|
|||||||
<i class="fal fa-image"></i>
|
<i class="fal fa-image"></i>
|
||||||
<div i18n>No image selected</div>
|
<div i18n>No image selected</div>
|
||||||
</div>
|
</div>
|
||||||
<image-cropper #imageCropper
|
<image-cropper #imageCropper output="base64"
|
||||||
[imageChangedEvent]="imageChangedEvent"
|
[imageChangedEvent]="imageChangedEvent"
|
||||||
[maintainAspectRatio]="true"
|
[maintainAspectRatio]="true"
|
||||||
[format]="imageType"
|
[format]="imageType"
|
||||||
|
@@ -4,6 +4,7 @@ div.resumable-file-upload {
|
|||||||
bottom: 0px;
|
bottom: 0px;
|
||||||
width: 300px;
|
width: 300px;
|
||||||
max-height: 250px;
|
max-height: 250px;
|
||||||
|
z-index: 1;
|
||||||
/*z-index:2000 !important;*/
|
/*z-index:2000 !important;*/
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -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,4 +1,4 @@
|
|||||||
import { Injectable } from '@angular/core';
|
import { Injectable, Inject, LOCALE_ID } from '@angular/core';
|
||||||
import { Router } from '@angular/router';
|
import { Router } from '@angular/router';
|
||||||
import { OAuthService,UserInfo } from 'angular-oauth2-oidc';
|
import { OAuthService,UserInfo } from 'angular-oauth2-oidc';
|
||||||
import { Store } from '@ngrx/store';
|
import { Store } from '@ngrx/store';
|
||||||
@@ -16,6 +16,7 @@ import {StateSerializerService} from '../services/state-serializer.service';
|
|||||||
|
|
||||||
@Injectable()
|
@Injectable()
|
||||||
export class AppCommonEffects {
|
export class AppCommonEffects {
|
||||||
|
locale: string;
|
||||||
|
|
||||||
login$ = createEffect(() => this.actions$.pipe(
|
login$ = createEffect(() => this.actions$.pipe(
|
||||||
ofType(appCommonActions.LOGIN),
|
ofType(appCommonActions.LOGIN),
|
||||||
@@ -47,11 +48,27 @@ export class AppCommonEffects {
|
|||||||
first(),
|
first(),
|
||||||
switchMap((action) => {
|
switchMap((action) => {
|
||||||
return zip(this.userService$.getCurrentUser(),from(this.oauthService$.loadUserProfile())).pipe(
|
return zip(this.userService$.getCurrentUser(),from(this.oauthService$.loadUserProfile())).pipe(
|
||||||
switchMap(([user,userInfo]) => {return of(new appCommonActions.InitUserSuccess(user,userInfo as UserInfo))} ),
|
switchMap(([user,userInfo]) => {
|
||||||
|
if (location.hostname === 'localhost' || user.language === undefined || user.language === this.locale)
|
||||||
|
{
|
||||||
|
return of(new appCommonActions.InitUserSuccess(user,userInfo as UserInfo))
|
||||||
|
}
|
||||||
|
return of(new appCommonActions.SwitchLanguage(user.language))
|
||||||
|
}),
|
||||||
catchError(error => of(new appCommonActions.Fail(error))))
|
catchError(error => of(new appCommonActions.Fail(error))))
|
||||||
}
|
}
|
||||||
)));
|
)));
|
||||||
|
|
||||||
|
switchLanguage$ = createEffect(() => this.actions$.pipe(
|
||||||
|
ofType(appCommonActions.SWITCHLANGUAGE),
|
||||||
|
switchMap((action) => {
|
||||||
|
const a = action as appCommonActions.SwitchLanguage;
|
||||||
|
if (location.href.includes(`/${this.locale}/`)) {
|
||||||
|
const newPath = location.href.replace(`/${this.locale}/`, `/${a.locale}/`);
|
||||||
|
location.replace(newPath);
|
||||||
|
}
|
||||||
|
return of(undefined);
|
||||||
|
})),{ dispatch:false});
|
||||||
|
|
||||||
initUserPackages$ = createEffect(() => this.actions$.pipe(
|
initUserPackages$ = createEffect(() => this.actions$.pipe(
|
||||||
ofType(appCommonActions.INITUSERPACKAGES),
|
ofType(appCommonActions.INITUSERPACKAGES),
|
||||||
@@ -208,7 +225,8 @@ export class AppCommonEffects {
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
constructor(private actions$: Actions, private store$: Store<appCommonReducers.State>, private oauthService$: OAuthService, private itemService$: ItemService, private folderService$:FolderService, private userService$: UserService, private router$: Router, private stateSerializerService$:StateSerializerService) {
|
constructor(private actions$: Actions, private store$: Store<appCommonReducers.State>, private oauthService$: OAuthService, private itemService$: ItemService, private folderService$:FolderService, private userService$: UserService, private router$: Router, private stateSerializerService$:StateSerializerService, @Inject(LOCALE_ID) locale: string) {
|
||||||
|
this.locale = locale;
|
||||||
store$.dispatch(new appCommonActions.LoadItemTypes());
|
store$.dispatch(new appCommonActions.LoadItemTypes());
|
||||||
}
|
}
|
||||||
}
|
}
|
@@ -1,6 +1,7 @@
|
|||||||
|
|
||||||
export interface IItemTask {
|
export interface IItemTask {
|
||||||
code?: string;
|
code?: string;
|
||||||
|
workflowCode?: string;
|
||||||
taskType?: string;
|
taskType?: string;
|
||||||
attributes?: any;
|
attributes?: any;
|
||||||
message?: string,
|
message?: string,
|
||||||
@@ -11,6 +12,7 @@ export interface IItemTask {
|
|||||||
|
|
||||||
export class ItemTask implements IItemTask {
|
export class ItemTask implements IItemTask {
|
||||||
public code?:string;
|
public code?:string;
|
||||||
|
public workflowCode?: string;
|
||||||
public taskType?: string;
|
public taskType?: string;
|
||||||
public attributes?: any;
|
public attributes?: any;
|
||||||
public message?: string;
|
public message?: string;
|
||||||
@@ -18,6 +20,6 @@ export class ItemTask implements IItemTask {
|
|||||||
public started?: Date;
|
public started?: Date;
|
||||||
public finished?: Date;
|
public finished?: Date;
|
||||||
|
|
||||||
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,16 @@ 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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
getAnalyseFolderOverview(): Observable<any> {
|
||||||
|
return this.httpClient.get<any>(`${this.ApiEndpoint()}/api/v1/admin/analysefolder/folderinfo/overview`);
|
||||||
|
}
|
||||||
|
|
||||||
|
getAnalyseFolderInfo(user: string): Observable<any> {
|
||||||
|
return this.httpClient.get<any>(`${this.ApiEndpoint()}/api/v1/admin/analysefolder/folderinfo/${user}`);
|
||||||
|
}
|
||||||
|
|
||||||
|
getAnalyseFolderLog(): Observable<any> {
|
||||||
|
return this.httpClient.get<any>(`${this.ApiEndpoint()}/api/v1/admin/analysefolder/folderinfo/log`);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@@ -1,14 +1,12 @@
|
|||||||
import { Injectable } from '@angular/core';
|
import {Injectable} from '@angular/core';
|
||||||
import { Observable } from 'rxjs';
|
import {Observable} from 'rxjs';
|
||||||
import { map } from 'rxjs/operators';
|
import {IItemType} from '../models/item.type';
|
||||||
import { IItemType } from '../models/item.type';
|
import {IItemLinkType} from '../models/itemlink.type';
|
||||||
import { IItemLinkType } from '../models/itemlink.type';
|
import {IItem} from '../models/item';
|
||||||
import { IUrlType } from '../models/url.type';
|
import {IJsonline} from '../models/json-line';
|
||||||
import { IItem } from '../models/item';
|
import {IItemTask} from '../models/itemTask';
|
||||||
import { IJsonline } from '../models/json-line';
|
import {HttpClient, HttpHeaders, HttpParams} from '@angular/common/http';
|
||||||
import { IItemTask } from '../models/itemTask';
|
import {AppConfig} from '../shared/app.config';
|
||||||
import { HttpClient, HttpParams, HttpHeaders } from "@angular/common/http";
|
|
||||||
import { AppConfig } from "../shared/app.config";
|
|
||||||
import {ItemTypeService} from './itemtype.service';
|
import {ItemTypeService} from './itemtype.service';
|
||||||
import {IListItem} from '../models/list.item';
|
import {IListItem} from '../models/list.item';
|
||||||
|
|
||||||
@@ -96,11 +94,11 @@ export class ItemService {
|
|||||||
if (sourceTask) params = params.append("sourceTask", sourceTask);
|
if (sourceTask) params = params.append("sourceTask", sourceTask);
|
||||||
if(skip) params = params.append("skip", skip);
|
if(skip) params = params.append("skip", skip);
|
||||||
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);
|
||||||
return this.httpClient.get<IItem[]>(`${this.ApiEndpoint()}/api/v1/items/`, { params: params });
|
return this.httpClient.get<IItem[]>(`${this.ApiEndpoint()}/api/v1/items/`, { params: params });
|
||||||
}
|
}
|
||||||
|
|
||||||
getItemListCount(itemType: string, startDate?: Date, endDate?: Date, sourceTask?: string,
|
getItemListCount(itemType: string, startDate?: Date, endDate?: Date, sourceTask?: string,
|
||||||
indexed?: boolean, exactMatchStartOrEndDate?: boolean, owner?:string): Observable<number> {
|
indexed?: boolean, exactMatchStartOrEndDate?: boolean, owner?:string): Observable<number> {
|
||||||
let params = new HttpParams();
|
let params = new HttpParams();
|
||||||
@@ -116,7 +114,7 @@ export class ItemService {
|
|||||||
|
|
||||||
getChildItemList(parentcode: string, itemType?: string, dataFilter?: any, level = 1, deep = true,
|
getChildItemList(parentcode: string, itemType?: string, dataFilter?: any, level = 1, deep = true,
|
||||||
startDate?: Date, endDate?: Date, skip?: number, take?: number,
|
startDate?: Date, endDate?: Date, skip?: number, take?: number,
|
||||||
exactMatchStartOrEndDate?: boolean, owner?:string): Observable<IItem[]> {
|
exactMatchStartOrEndDate?: boolean, owner?:string, indexed?: boolean): Observable<IItem[]> {
|
||||||
let params = new HttpParams();
|
let params = new HttpParams();
|
||||||
if(itemType != null) {
|
if(itemType != null) {
|
||||||
params = params.append("it", itemType);
|
params = params.append("it", itemType);
|
||||||
@@ -129,15 +127,17 @@ export class ItemService {
|
|||||||
if (startDate) params = params.append("sDate", startDate.toISOString());
|
if (startDate) params = params.append("sDate", startDate.toISOString());
|
||||||
if (endDate) params = params.append("eDate", endDate.toISOString());
|
if (endDate) params = params.append("eDate", endDate.toISOString());
|
||||||
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(skip) params = params.append("skip", skip);
|
if(skip) params = params.append("skip", skip);
|
||||||
if(take) params = params.append("take", take);
|
if(take) params = params.append("take", take);
|
||||||
|
if(indexed) params = params.append("ind",indexed?"true":"false");
|
||||||
return this.httpClient.get<IItem[]>(`${this.ApiEndpoint()}/api/v1/items/${parentcode}/children`, { params: params });
|
return this.httpClient.get<IItem[]>(`${this.ApiEndpoint()}/api/v1/items/${parentcode}/children`, { params: params });
|
||||||
}
|
}
|
||||||
|
|
||||||
getChildItemListCount(parentcode: string, itemType?: string,dataFilter?: any,
|
getChildItemListCount(parentcode: string, itemType?: string,dataFilter?: any,
|
||||||
startDate?: Date, endDate?: Date, exactMatchStartOrEndDate?: boolean, owner?:string): Observable<number> {
|
startDate?: Date, endDate?: Date, exactMatchStartOrEndDate?: boolean, owner?:string,
|
||||||
|
indexed?: boolean): Observable<number> {
|
||||||
let params = new HttpParams();
|
let params = new HttpParams();
|
||||||
if(itemType != null) {
|
if(itemType != null) {
|
||||||
params = params.append("it", itemType);
|
params = params.append("it", itemType);
|
||||||
@@ -149,6 +149,7 @@ export class ItemService {
|
|||||||
if (endDate) params = params.append("eDate", endDate.toISOString());
|
if (endDate) params = params.append("eDate", endDate.toISOString());
|
||||||
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(indexed) params = params.append("ind",indexed?"true":"false");
|
||||||
return this.httpClient.get<number>(`${this.ApiEndpoint()}/api/v1/items/${parentcode}/children/count`, { params: params });
|
return this.httpClient.get<number>(`${this.ApiEndpoint()}/api/v1/items/${parentcode}/children/count`, { params: params });
|
||||||
}
|
}
|
||||||
|
|
||||||
|
40
projects/common/src/fm/services/task.service.ts
Normal file
40
projects/common/src/fm/services/task.service.ts
Normal file
@@ -0,0 +1,40 @@
|
|||||||
|
import {Injectable} from '@angular/core';
|
||||||
|
import {HttpClient, HttpParams} from '@angular/common/http';
|
||||||
|
import {AppConfig} from '../shared/app.config';
|
||||||
|
|
||||||
|
@Injectable({
|
||||||
|
providedIn: 'root',
|
||||||
|
})
|
||||||
|
export class TaskService {
|
||||||
|
constructor(public httpClient: HttpClient, public appConfig: AppConfig) {
|
||||||
|
}
|
||||||
|
|
||||||
|
ApiEndpoint() {
|
||||||
|
return this.appConfig.getConfig("apiEndPoint");
|
||||||
|
}
|
||||||
|
|
||||||
|
getTask(taskCode: string) {
|
||||||
|
return this.httpClient.get<any>(`${this.appConfig.getConfig('apiEndPoint')}/api/v1/tasks/${taskCode}`)
|
||||||
|
}
|
||||||
|
|
||||||
|
getTasks(workflowCode: string, itemCode: string = null, taskType: string = null, skip = 0, take = 25) {
|
||||||
|
let params = new HttpParams();
|
||||||
|
|
||||||
|
if (workflowCode) {
|
||||||
|
params = params.append('workflowCode', workflowCode);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (itemCode) {
|
||||||
|
params = params.append('itemCode', itemCode);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (taskType) {
|
||||||
|
params = params.append('taskType', taskType);
|
||||||
|
}
|
||||||
|
|
||||||
|
params = params.append('skip', skip.toString());
|
||||||
|
params = params.append('take', take.toString());
|
||||||
|
return this.httpClient.get<any>(`${this.appConfig.getConfig('apiEndPoint')}/api/v1/tasks`,
|
||||||
|
{params: params})
|
||||||
|
}
|
||||||
|
}
|
@@ -31,8 +31,8 @@
|
|||||||
"tslib": "^2.3.0"
|
"tslib": "^2.3.0"
|
||||||
},
|
},
|
||||||
"peerDependencies": {
|
"peerDependencies": {
|
||||||
"@angular/common": "^18.2.3",
|
"@angular/common": "18.2.3",
|
||||||
"@angular/core": "^18.2.3",
|
"@angular/core": "18.2.3",
|
||||||
"ol": "^8.2.0"
|
"ol": "^8.2.0"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user