AW-6046 Angular improvement
All checks were successful
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good

This commit is contained in:
Peter Bastiani 2024-04-15 10:29:47 +02:00
parent ede75f63f5
commit 84a1a04b19
104 changed files with 592 additions and 796 deletions

View File

@ -18,5 +18,6 @@ module.exports = {
"@typescript-eslint" "@typescript-eslint"
], ],
"rules": { "rules": {
"@typescript-eslint/no-explicit-any": "off"
} }
} }

View File

@ -18,5 +18,6 @@ module.exports = {
"@typescript-eslint" "@typescript-eslint"
], ],
"rules": { "rules": {
"@typescript-eslint/no-explicit-any": "off"
} }
} }

View File

@ -1,13 +1,12 @@
import { Action } from '@ngrx/store'; import { Action } from '@ngrx/store';
import { IMapState } from '../models/map.state'; import { IItem, IQueryState } from '@farmmaps/common';
import { Feature } from 'ol';
import { Geometry } from 'ol/geom';
import { Style } from 'ol/style';
import { IItemLayer } from '../models/item.layer'; import { IItemLayer } from '../models/item.layer';
import { ILayervalue } from '../models/layer.value'; import { ILayervalue } from '../models/layer.value';
import { IQueryState } from '@farmmaps/common'; import { IMapState } from '../models/map.state';
import { IItem } from '@farmmaps/common';
import { Feature } from 'ol';
import { Style } from 'ol/style';
import { Geometry } from 'ol/geom';
import { IPeriodState } from '../models/period.state'; import { IPeriodState } from '../models/period.state';
export const SETSTATE = '[Map] SetState'; export const SETSTATE = '[Map] SetState';
@ -158,7 +157,7 @@ export class PreviousTemporal implements Action {
export class SelectTemporal implements Action { export class SelectTemporal implements Action {
readonly type = SELECTTEMPORAL; readonly type = SELECTTEMPORAL;
constructor(item:IItem) { } constructor() { }
} }
export class AddFeatureSuccess implements Action { export class AddFeatureSuccess implements Action {

View File

@ -1,7 +1,6 @@
import { NgModule } from '@angular/core'; import { NgModule } from '@angular/core';
import { RouterModule } from '@angular/router'; import { RouterModule } from '@angular/router';
import { MapComponent } from './components/map/map.component'; import { MapComponent } from './components/map/map.component';
import { AuthGuard } from '@farmmaps/common';
const routes = [ const routes = [
{ {

View File

@ -1,78 +1,78 @@
import { NgModule ,ModuleWithProviders} from '@angular/core';
import { CommonModule } from '@angular/common'; import { CommonModule } from '@angular/common';
import { NgModule } from '@angular/core';
import { FormsModule, ReactiveFormsModule } from '@angular/forms'; import { FormsModule, ReactiveFormsModule } from '@angular/forms';
//external modules //external modules
import { AngularOpenlayersModule } from 'ng-openlayers';
import { StoreModule, ActionReducer, MetaReducer } from '@ngrx/store';
import { EffectsModule } from '@ngrx/effects';
import { NgbModule } from "@ng-bootstrap/ng-bootstrap"; import { NgbModule } from "@ng-bootstrap/ng-bootstrap";
import { EffectsModule } from '@ngrx/effects';
import { ActionReducer, MetaReducer, StoreModule } from '@ngrx/store';
import { AngularOpenlayersModule } from 'ng-openlayers';
//common modules //common modules
import { AppCommonModule } from '@farmmaps/common'; import { AppCommonModule } from '@farmmaps/common';
import { MODULE_NAME } from './module-name';
import * as mapReducers from './reducers/map.reducer';
import * as mapActions from './actions/map.actions'; import * as mapActions from './actions/map.actions';
import * as mapEffects from './effects/map.effects'; import * as mapEffects from './effects/map.effects';
import { MODULE_NAME } from './module-name';
import * as mapReducers from './reducers/map.reducer';
import { IMapState} from './models/map.state';
import { ISelectedFeatures } from './models/selected.features';
import { IItemLayer,ItemLayer,ITemporalItemLayer,TemporalItemLayer } from './models/item.layer';
import { IClickedFeature } from './models/clicked.feature'; import { IClickedFeature } from './models/clicked.feature';
import { IItemLayer, ItemLayer, ITemporalItemLayer, TemporalItemLayer } from './models/item.layer';
import { IMapState } from './models/map.state';
import { IPeriodState } from './models/period.state'; import { IPeriodState } from './models/period.state';
import { ISelectedFeatures } from './models/selected.features';
// components // components
import { GpsLocation} from './components/aol/gps-location/gps-location.component'; import { MapRoutingModule } from './common-map-routing.module';
import {FeatureListFeatureCropfieldComponent } from './components/feature-list-feature-cropfield/feature-list-feature-cropfield.component';
import { FeatureListFeatureCroppingschemeComponent} from './components/feature-list-feature-croppingscheme/feature-list-feature-croppingscheme.component';
import { ItemWidgetListComponent} from './components/item-widget-list/item-widget-list.component';
import { AbstractItemListItemComponent, ItemListItemComponent, AbstractItemWidgetComponent } from './components/item-list-item/item-list-item.component';
import { ItemListItemContainerComponent } from './components/item-list-item-container/item-list-item-container.component';
import { AbstractItemListComponent,ItemListComponent} from './components/item-list/item-list.component';
import { AbstractSelectedItemComponent, SelectedItemComponent } from './components/selected-item/selected-item.component';
import { SelectedItemCropfieldComponent } from './components/selected-item-cropfield/selected-item-cropfield.component';
import { SelectedItemGeotiffComponent } from './components/selected-item-geotiff/selected-item-geotiff.component';
import { SelectedItemTemporalComponent} from './components/selected-item-temporal/selected-item-temporal.component';
import {SelectedItemShapeComponent } from './components/selected-item-shape/selected-item-shape.component';
import { SelectedItemContainerComponent } from './components/selected-item-container/selected-item-container.component';
import { AbstractFeatureListFeatureComponent, FeatureListFeatureComponent } from './components/feature-list-feature/feature-list-feature.component';
import {FeatureListFeatureContainerComponent } from './components/feature-list-feature-container/feature-list-feature-container.component';
import { FeatureListCroppingschemeComponent } from './components/feature-list-croppingscheme/feature-list-croppingscheme.component';
import {FeatureListCropfieldComponent } from './components/feature-list-cropfield/feature-list-cropfield.component';
import {FeatureListContainerComponent } from './components/feature-list-container/feature-list-container.component';
import { WidgetHostDirective} from './components/widget-host/widget-host.directive';
import { FeatureListComponent,AbstractFeatureListComponent} from './components/feature-list/feature-list.component';
import { FileDropTargetComponent } from './components/aol/file-drop-target/file-drop-target.component'; import { FileDropTargetComponent } from './components/aol/file-drop-target/file-drop-target.component';
import { ItemVectorSourceComponent } from './components/aol/item-vector-source/item-vector-source.component'; import { GpsLocation } from './components/aol/gps-location/gps-location.component';
import { ItemLayersComponent } from './components/aol/item-layers/item-layers.component'; import { ItemLayersComponent } from './components/aol/item-layers/item-layers.component';
import { ZoomToExtentComponent } from './components/aol/zoom-to-extent/zoom-to-extent.component'; import { ItemVectorSourceComponent } from './components/aol/item-vector-source/item-vector-source.component';
import { RotationResetComponent } from './components/aol/rotation-reset/rotation-reset.component';
import { LayerListComponent } from './components/aol/layer-list/layer-list.component'; import { LayerListComponent } from './components/aol/layer-list/layer-list.component';
import { LayerValuesComponent } from './components/aol/layer-values/layer-values.component';
import { LayerVectorImageComponent } from './components/aol/layer-vector-image/layer-vector-image.component';
import { PanToLocation } from './components/aol/pan-to-location/pan-to-location.component';
import { RotationResetComponent } from './components/aol/rotation-reset/rotation-reset.component';
import { ZoomToExtentComponent } from './components/aol/zoom-to-extent/zoom-to-extent.component';
import { FeatureListContainerComponent } from './components/feature-list-container/feature-list-container.component';
import { FeatureListCropfieldComponent } from './components/feature-list-cropfield/feature-list-cropfield.component';
import { FeatureListCroppingschemeComponent } from './components/feature-list-croppingscheme/feature-list-croppingscheme.component';
import { FeatureListFeatureContainerComponent } from './components/feature-list-feature-container/feature-list-feature-container.component';
import { FeatureListFeatureCropfieldComponent } from './components/feature-list-feature-cropfield/feature-list-feature-cropfield.component';
import { FeatureListFeatureCroppingschemeComponent } from './components/feature-list-feature-croppingscheme/feature-list-feature-croppingscheme.component';
import { AbstractFeatureListFeatureComponent, FeatureListFeatureComponent } from './components/feature-list-feature/feature-list-feature.component';
import { AbstractFeatureListComponent, FeatureListComponent } from './components/feature-list/feature-list.component';
import { GeometryThumbnailComponent } from './components/feature-thumbnail/feature-thumbnail.component';
import { ForChild } from './components/for-item/for-child.decorator';
import { ForItemType } from './components/for-item/for-itemtype.decorator';
import { ForPackage } from './components/for-item/for-package.decorator';
import { ForSourceTask } from './components/for-item/for-sourcetask.decorator';
import { ifZoomToShowDirective } from './components/if-zoom-to-show/if-zoom-to-show.directive';
import { ItemListItemContainerComponent } from './components/item-list-item-container/item-list-item-container.component';
import { AbstractItemListItemComponent, AbstractItemWidgetComponent, ItemListItemComponent } from './components/item-list-item/item-list-item.component';
import { AbstractItemListComponent, ItemListComponent } from './components/item-list/item-list.component';
import { ItemWidgetListComponent } from './components/item-widget-list/item-widget-list.component';
import { LayerSwitcher } from './components/layer-switcher/layer-switcher.component';
import { HistogramDetailsComponent } from './components/legend/histogram-details/histogram-details.component';
import { LegendComponent } from './components/legend/legend.component';
import { StatisticsDetailsComponent } from './components/legend/statistics-details/statistics-details.component';
import { MapSearchComponent } from './components/map-search/map-search.component';
import { MapComponent } from './components/map/map.component';
import { MetaDataModalComponent } from './components/meta-data-modal/meta-data-modal.component'; import { MetaDataModalComponent } from './components/meta-data-modal/meta-data-modal.component';
import { SelectPeriodModalComponent } from './components/select-period-modal/select-period-modal.component'; import { SelectPeriodModalComponent } from './components/select-period-modal/select-period-modal.component';
import { MapComponent } from './components/map/map.component'; import { SelectedItemContainerComponent } from './components/selected-item-container/selected-item-container.component';
import { MapSearchComponent } from './components/map-search/map-search.component'; import { SelectedItemCropfieldComponent } from './components/selected-item-cropfield/selected-item-cropfield.component';
import { MapRoutingModule } from './common-map-routing.module'; import { SelectedItemGeotiffComponent } from './components/selected-item-geotiff/selected-item-geotiff.component';
import { LegendComponent } from './components/legend/legend.component'; import { SelectedItemShapeComponent } from './components/selected-item-shape/selected-item-shape.component';
import { LayerVectorImageComponent } from './components/aol/layer-vector-image/layer-vector-image.component'; import { SelectedItemTemporalComponent } from './components/selected-item-temporal/selected-item-temporal.component';
import {FeatureIconService} from './services/feature-icon.service'; import { AbstractSelectedItemComponent, SelectedItemComponent } from './components/selected-item/selected-item.component';
import { GeolocationService } from './services/geolocation.service'; import { WidgetHostDirective } from './components/widget-host/widget-host.directive';
import {DeviceOrientationService} from './services/device-orientation.service';
import { TemporalService} from './services/temporal.service';
import { WidgetStatusComponent } from './components/widget-status/widget-status.component'; import { WidgetStatusComponent } from './components/widget-status/widget-status.component';
import { ForChild} from './components/for-item/for-child.decorator'; import { ZoomToShowAlert } from './components/zoom-to-show-alert/zoom-to-show-alert.component';
import {ForItemType } from './components/for-item/for-itemtype.decorator'; import { DeviceOrientationService } from './services/device-orientation.service';
import { ForSourceTask} from './components/for-item/for-sourcetask.decorator'; import { FeatureIconService } from './services/feature-icon.service';
import { ForPackage } from './components/for-item/for-package.decorator'; import { GeolocationService } from './services/geolocation.service';
import { PanToLocation} from './components/aol/pan-to-location/pan-to-location.component'; import { TemporalService } from './services/temporal.service';
import {LayerSwitcher} from './components/layer-switcher/layer-switcher.component';
import {HistogramDetailsComponent} from './components/legend/histogram-details/histogram-details.component';
import {StatisticsDetailsComponent} from './components/legend/statistics-details/statistics-details.component';
import { ifZoomToShowDirective} from './components/if-zoom-to-show/if-zoom-to-show.directive';
import { ZoomToShowAlert} from './components/zoom-to-show-alert/zoom-to-show-alert.component';
import { LayerValuesComponent } from './components/aol/layer-values/layer-values.component';
import { GeometryThumbnailComponent } from './components/feature-thumbnail/feature-thumbnail.component';
export function LocalStorageSync(reducer: ActionReducer<any>): ActionReducer<any> { export function LocalStorageSync(reducer: ActionReducer<any>): ActionReducer<any> {
const r = function(state, action) { const r = function(state, action) {
@ -104,70 +104,13 @@ export function LocalStorageSync(reducer: ActionReducer<any>): ActionReducer<any
const metaReducers: Array<MetaReducer<any, any>> = [LocalStorageSync]; const metaReducers: Array<MetaReducer<any, any>> = [LocalStorageSync];
export { export {
mapEffects,
mapReducers,
mapActions,
ZoomToExtentComponent,
ItemVectorSourceComponent,
ItemLayersComponent,
FileDropTargetComponent,
MapComponent,
MetaDataModalComponent,
RotationResetComponent,
MapSearchComponent,
SelectPeriodModalComponent,
LayerListComponent,
LegendComponent,
LayerVectorImageComponent,
FeatureListComponent,
WidgetHostDirective,
FeatureListContainerComponent,
FeatureListCroppingschemeComponent,
FeatureListCropfieldComponent,
FeatureListFeatureContainerComponent,
FeatureListFeatureComponent,
FeatureListFeatureCroppingschemeComponent,
FeatureListFeatureCropfieldComponent,
SelectedItemContainerComponent,
SelectedItemComponent,
SelectedItemCropfieldComponent,
SelectedItemGeotiffComponent,
SelectedItemTemporalComponent,
SelectedItemShapeComponent,
ItemListItemComponent,
ItemListItemContainerComponent,
ItemListComponent,
ItemWidgetListComponent,
WidgetStatusComponent,
GpsLocation,
PanToLocation,
LayerSwitcher,
AbstractFeatureListComponent, AbstractFeatureListComponent,
AbstractFeatureListFeatureComponent, AbstractFeatureListFeatureComponent, AbstractItemListComponent, AbstractItemListItemComponent, AbstractItemWidgetComponent, AbstractSelectedItemComponent, DeviceOrientationService, FeatureIconService, FeatureListComponent, FeatureListContainerComponent, FeatureListCropfieldComponent, FeatureListCroppingschemeComponent, FeatureListFeatureComponent, FeatureListFeatureContainerComponent, FeatureListFeatureCropfieldComponent, FeatureListFeatureCroppingschemeComponent, FileDropTargetComponent, ForChild,
AbstractSelectedItemComponent, ForItemType, ForPackage, ForSourceTask, GeolocationService, GeometryThumbnailComponent, GpsLocation, IClickedFeature, ifZoomToShowDirective, IItemLayer, IMapState, IPeriodState, ISelectedFeatures, ItemLayer, ItemLayersComponent, ItemListComponent, ItemListItemComponent,
AbstractItemWidgetComponent, ItemListItemContainerComponent, ITemporalItemLayer, ItemVectorSourceComponent, ItemWidgetListComponent, LayerListComponent, LayerSwitcher, LayerVectorImageComponent, LegendComponent, mapActions, MapComponent, mapEffects,
AbstractItemListItemComponent, mapReducers, MapSearchComponent, MetaDataModalComponent, PanToLocation, RotationResetComponent, SelectedItemComponent, SelectedItemContainerComponent, SelectedItemCropfieldComponent,
AbstractItemListComponent, SelectedItemGeotiffComponent, SelectedItemShapeComponent, SelectedItemTemporalComponent, SelectPeriodModalComponent, TemporalItemLayer, TemporalService, WidgetHostDirective, WidgetStatusComponent, ZoomToExtentComponent, ZoomToShowAlert
FeatureIconService, };
GeolocationService,
DeviceOrientationService,
TemporalService,
IMapState,
ISelectedFeatures,
IItemLayer,
ItemLayer,
IPeriodState,
ForChild,
ForItemType,
ForSourceTask,
ForPackage ,
ITemporalItemLayer,
TemporalItemLayer,
ifZoomToShowDirective,
ZoomToShowAlert,
IClickedFeature,
GeometryThumbnailComponent
}
@NgModule({ @NgModule({
imports: [ imports: [

View File

@ -1,10 +1,9 @@
import { Component, Input, OnDestroy, OnInit, EventEmitter, Output, Inject } from '@angular/core'; import { Component, EventEmitter, Input, OnDestroy, OnInit, Output } from '@angular/core';
import { MapComponent } from 'ng-openlayers'; import { MapComponent } from 'ng-openlayers';
import * as proj from 'ol/proj'; import { Feature } from 'ol';
import {Point,Geometry} from 'ol/geom';
import { GeoJSON } from 'ol/format'; import { GeoJSON } from 'ol/format';
import { Feature} from 'ol'; import { Geometry, Point } from 'ol/geom';
export interface IDroppedFile { export interface IDroppedFile {
files: any, files: any,
@ -28,7 +27,6 @@ export class FileDropTargetComponent implements OnInit, OnDestroy {
ngOnInit() { ngOnInit() {
this.element = this.map.instance.getViewport(); this.element = this.map.instance.getViewport();
const other = this;
this.element.addEventListener('drop', this.onDrop, false); this.element.addEventListener('drop', this.onDrop, false);
this.element.addEventListener('dragover', this.preventDefault, false); this.element.addEventListener('dragover', this.preventDefault, false);
this.element.addEventListener('dragenter', this.preventDefault, false); this.element.addEventListener('dragenter', this.preventDefault, false);

View File

@ -1,7 +1,7 @@
import { Component, OnInit, Input, ViewChild, ElementRef, OnChanges, SimpleChanges ,Host} from '@angular/core'; import { Component, ElementRef, Input, OnChanges, OnInit, SimpleChanges, ViewChild } from '@angular/core';
import { MapComponent } from 'ng-openlayers'; import { MapComponent } from 'ng-openlayers';
import Overlay from 'ol/Overlay'; import Overlay from 'ol/Overlay';
import { fromLonLat, toLonLat } from 'ol/proj'; import { fromLonLat } from 'ol/proj';
@Component({ @Component({

View File

@ -1,25 +1,21 @@
import { Component, Host, Input, Output, EventEmitter,OnDestroy, OnInit, OnChanges, SimpleChanges, forwardRef } from '@angular/core'; import { Component, EventEmitter, Input, OnChanges, OnDestroy, OnInit, Output, SimpleChanges, forwardRef } from '@angular/core';
import { AppConfig, IItem, ItemService } from '@farmmaps/common';
import { LayerGroupComponent, MapComponent } from 'ng-openlayers'; import { LayerGroupComponent, MapComponent } from 'ng-openlayers';
import { ItemService,IItem,AppConfig } from '@farmmaps/common';
import { IItemLayer, ITemporalItemLayer} from '../../../models/item.layer';
import { ILayerData} from '../../../models/layer.data';
import { IRenderoutputTiles,IRenderoutputImage,IGradientstop,ILayer,IHistogram,IColor} from '../../../models/color.map';
import {Extent} from 'ol/extent';
import Projection from 'ol/proj/Projection';
import * as proj from 'ol/proj';
import * as loadingstrategy from 'ol/loadingstrategy';
import * as style from 'ol/style';
import {Tile,Layer,Image} from 'ol/layer';
import {XYZ,ImageStatic,OSM,BingMaps,TileWMS,TileArcGISRest,TileJSON,Source} from 'ol/source';
import {Vector as VectorSource} from 'ol/source';
import { Vector as VectorLayer } from 'ol/layer';
import { VectorImage as VectorImageLayer } from 'ol/layer';
import VectorTileSource from 'ol/source/VectorTile';
import VectorTileLayer from 'ol/layer/VectorTile';
import {GeoJSON,MVT} from 'ol/format';
import { Geometry } from 'ol/geom';
import BaseLayer from 'ol/layer/Base';
import Feature from 'ol/Feature'; import Feature from 'ol/Feature';
import { Extent } from 'ol/extent';
import { GeoJSON, MVT } from 'ol/format';
import { Geometry } from 'ol/geom';
import { Image, Layer, Tile, VectorImage as VectorImageLayer, Vector as VectorLayer } from 'ol/layer';
import VectorTileLayer from 'ol/layer/VectorTile';
import * as loadingstrategy from 'ol/loadingstrategy';
import * as proj from 'ol/proj';
import Projection from 'ol/proj/Projection';
import { BingMaps, ImageStatic, OSM, Source, TileArcGISRest, TileJSON, TileWMS, Vector as VectorSource, XYZ } from 'ol/source';
import VectorTileSource from 'ol/source/VectorTile';
import * as style from 'ol/style';
import { IColor, IGradientstop, IHistogram, ILayer, IRenderoutputImage, IRenderoutputTiles } from '../../../models/color.map';
import { IItemLayer, ITemporalItemLayer } from '../../../models/item.layer';
import { ILayerData } from '../../../models/layer.data';
@Component({ @Component({
selector: 'fm-map-item-layers', selector: 'fm-map-item-layers',
@ -94,7 +90,7 @@ export class ItemLayersComponent extends LayerGroupComponent implements OnChange
return color; return color;
} }
getColor(item: IItem, layer: ILayer, feature): style.Style { getColor(item: IItem, layer: any, feature): style.Style {
const value = layer.indexKey ? feature.get(layer.indexKey) : feature.get(layer.name); const value = layer.indexKey ? feature.get(layer.indexKey) : feature.get(layer.name);
const key = item.code + "_" + value; const key = item.code + "_" + value;
if (!this.styleCache[key]) { if (!this.styleCache[key]) {
@ -153,7 +149,7 @@ export class ItemLayersComponent extends LayerGroupComponent implements OnChange
const data = item.data; const data = item.data;
const l:ILayer = (data && data.layers && data.layers.length > 0) ? data.layers[layerIndex] : null; const l:ILayer = (data && data.layers && data.layers.length > 0) ? data.layers[layerIndex] : null;
if (l && l.rendering && l.rendering.renderoutputType == "VectorTiles") { if (l && l.rendering && l.rendering.renderoutputType == "VectorTiles") {
var rt = l.rendering as IRenderoutputTiles; const rt = l.rendering as IRenderoutputTiles;
layer = new VectorTileLayer({ layer = new VectorTileLayer({
declutter: true, declutter: true,
source: new VectorTileSource({ source: new VectorTileSource({
@ -167,7 +163,7 @@ export class ItemLayersComponent extends LayerGroupComponent implements OnChange
} }
}) })
} else if (l && l.rendering && l.rendering.renderoutputType == "Tiles") { } else if (l && l.rendering && l.rendering.renderoutputType == "Tiles") {
var rt = l.rendering as IRenderoutputTiles; const rt = l.rendering as IRenderoutputTiles;
layer = new Tile({ layer = new Tile({
source: new XYZ({ source: new XYZ({
maxZoom: rt.maxzoom, maxZoom: rt.maxzoom,
@ -176,11 +172,12 @@ export class ItemLayersComponent extends LayerGroupComponent implements OnChange
}) })
}); });
} else { } else {
// eslint-disable-next-line @typescript-eslint/no-this-alias
const __this = this; const __this = this;
const format = new GeoJSON(); const format = new GeoJSON();
const source = new VectorSource({ const source = new VectorSource({
strategy: loadingstrategy.bbox, strategy: loadingstrategy.bbox,
loader: function (extent: Extent, resolution: number, projection: Projection) { loader: function (extent: Extent, _resolution: number, projection: Projection) {
const source = this as VectorSource<Feature<Geometry>>; const source = this as VectorSource<Feature<Geometry>>;
__this.itemService.getItemFeatures(item.code, extent, projection.getCode(), layerIndex).subscribe(function (data) { __this.itemService.getItemFeatures(item.code, extent, projection.getCode(), layerIndex).subscribe(function (data) {
const features = format.readFeatures(data).filter(feature => feature instanceof Feature) as Feature[]; const features = format.readFeatures(data).filter(feature => feature instanceof Feature) as Feature[];
@ -237,7 +234,6 @@ export class ItemLayersComponent extends LayerGroupComponent implements OnChange
createSelectionLayer(itemLayer:IItemLayer):Layer<Source> { createSelectionLayer(itemLayer:IItemLayer):Layer<Source> {
let layerIndex = -1; let layerIndex = -1;
const layer: Layer<Source> = null;
layerIndex = itemLayer.layerIndex != -1 ? itemLayer.layerIndex : itemLayer.item.data.layers[0].index; layerIndex = itemLayer.layerIndex != -1 ? itemLayer.layerIndex : itemLayer.item.data.layers[0].index;
const data = itemLayer.item.data; const data = itemLayer.item.data;
const l:ILayer = (data && data.layers && data.layers.length > 0) ? data.layers[layerIndex] : null; const l:ILayer = (data && data.layers && data.layers.length > 0) ? data.layers[layerIndex] : null;
@ -265,7 +261,8 @@ export class ItemLayersComponent extends LayerGroupComponent implements OnChange
return null; return null;
} }
createExternalLayer(item:IItem,itemLayer:IItemLayer):Layer<Source> { // eslint-disable-next-line @typescript-eslint/no-unused-vars
createExternalLayer(item:IItem,_itemLayer:IItemLayer):Layer<Source> {
const data = item.data as ILayerData; const data = item.data as ILayerData;
let layer: Layer<Source> = null; let layer: Layer<Source> = null;
switch (data.interfaceType) { switch (data.interfaceType) {
@ -319,7 +316,6 @@ export class ItemLayersComponent extends LayerGroupComponent implements OnChange
createLayer(itemLayer: IItemLayer): Layer<Source> { createLayer(itemLayer: IItemLayer): Layer<Source> {
let layer: Layer<Source> = null; let layer: Layer<Source> = null;
const layerIndex = -1;
if (itemLayer.item.itemType == 'vnd.farmmaps.itemtype.geotiff.processed') { if (itemLayer.item.itemType == 'vnd.farmmaps.itemtype.geotiff.processed') {
layer = this.createGeotiffLayer(itemLayer.item,itemLayer); layer = this.createGeotiffLayer(itemLayer.item,itemLayer);
} else if (itemLayer.item.itemType == 'vnd.farmmaps.itemtype.shape.processed') { } else if (itemLayer.item.itemType == 'vnd.farmmaps.itemtype.shape.processed') {
@ -379,10 +375,6 @@ export class ItemLayersComponent extends LayerGroupComponent implements OnChange
if(this.topLayerPrerenderEventhandlerInstalled && this.onPrerender.observers.length > 0 ) if(this.topLayerPrerenderEventhandlerInstalled && this.onPrerender.observers.length > 0 )
{ {
if(this.instance.getVisible()) { if(this.instance.getVisible()) {
const olLayers = this.instance.getLayers().getArray().forEach((l:any) => {
l.un('prerender',this.topLayerPrerenderEventhandler);
l.un('postrender',this.topLayerPostrenderEventhandler);
});
this.topLayerPrerenderEventhandlerInstalled = false; this.topLayerPrerenderEventhandlerInstalled = false;
} }
} }
@ -415,17 +407,15 @@ export class ItemLayersComponent extends LayerGroupComponent implements OnChange
updateLayers(itemLayers: IItemLayer[] | IItemLayer) { updateLayers(itemLayers: IItemLayer[] | IItemLayer) {
this.unInstallTopLayerPrerenderEventhandler(); this.unInstallTopLayerPrerenderEventhandler();
let dataLayer = false;
let ils:IItemLayer[] = []; let ils:IItemLayer[] = [];
if(Array.isArray(itemLayers)) { if(Array.isArray(itemLayers)) {
ils = itemLayers; ils = itemLayers;
} else { } else {
dataLayer=true;
ils=[itemLayers]; ils=[itemLayers];
} }
const newLayers: Layer<Source>[] = []; const newLayers: Layer<Source>[] = [];
if (ils) { if (ils) {
ils.forEach((itemLayer, index) => { ils.forEach((itemLayer) => {
if(itemLayer.item.itemType == 'vnd.farmmaps.itemtype.temporal') { if(itemLayer.item.itemType == 'vnd.farmmaps.itemtype.temporal') {
const il = itemLayer as ITemporalItemLayer; const il = itemLayer as ITemporalItemLayer;
const previousLayer = this.addOrUpdateOlLayer(il.previousItemLayer,newLayers.length); const previousLayer = this.addOrUpdateOlLayer(il.previousItemLayer,newLayers.length);

View File

@ -1,25 +1,22 @@
import { Component, Host, Input, Output, EventEmitter, OnInit, OnChanges, SimpleChanges, forwardRef, Inject, InjectionToken, OnDestroy, LOCALE_ID } from '@angular/core'; import { Component, EventEmitter, Host, Inject, Input, LOCALE_ID, OnChanges, OnDestroy, OnInit, Output, SimpleChanges, forwardRef } from '@angular/core';
import { LayerVectorComponent, SourceVectorComponent, MapComponent } from 'ng-openlayers'; import { FolderService, IItem, ItemService, ItemTypeService } from '@farmmaps/common';
import { ItemService, ItemTypeService, IItem, IItemType, FolderService } from '@farmmaps/common'; import { LayerVectorComponent, MapComponent, SourceVectorComponent } from 'ng-openlayers';
import { Feature } from 'ol'; import { formatNumber } from '@angular/common';
import { Point, Geometry } from 'ol/geom'; import { Feature, MapBrowserEvent } from 'ol';
import { MapBrowserEvent } from 'ol';
import { Types } from 'ol/MapBrowserEventType';
import * as style from 'ol/style';
import * as color from 'ol/color'; import * as color from 'ol/color';
import * as loadingstrategy from 'ol/loadingstrategy';
import * as condition from 'ol/events/condition';
import * as extent from 'ol/extent'; import * as extent from 'ol/extent';
import { Vector, Cluster, Source } from 'ol/source'; import { getCenter } from 'ol/extent';
import { Layer } from 'ol/layer';
import { GeoJSON } from 'ol/format'; import { GeoJSON } from 'ol/format';
import { Geometry, Point } from 'ol/geom';
import { Select } from 'ol/interaction'; import { Select } from 'ol/interaction';
import { Layer } from 'ol/layer';
import * as loadingstrategy from 'ol/loadingstrategy';
import { Source, Vector } from 'ol/source';
import * as style from 'ol/style';
import { Subscription } from 'rxjs';
import { IStyles } from '../../../models/style.cache'; import { IStyles } from '../../../models/style.cache';
import { FeatureIconService } from '../../../services/feature-icon.service'; import { FeatureIconService } from '../../../services/feature-icon.service';
import { Subscription } from 'rxjs';
import { getCenter } from 'ol/extent';
import { formatNumber } from '@angular/common';
@Component({ @Component({
selector: 'fm-map-item-source-vector', selector: 'fm-map-item-source-vector',
@ -30,10 +27,8 @@ import { formatNumber } from '@angular/common';
}) })
export class ItemVectorSourceComponent extends SourceVectorComponent implements OnInit, OnDestroy, OnChanges { export class ItemVectorSourceComponent extends SourceVectorComponent implements OnInit, OnDestroy, OnChanges {
instance: Vector<Feature<Geometry>>; instance: Vector<Feature<Geometry>>;
private _format: GeoJSON;
private _select: Select; private _select: Select;
private _hoverSelect: Select; private _hoverSelect: Select;
private _iconScale = 0.05;
@Input() features: Array<Feature<Geometry>>; @Input() features: Array<Feature<Geometry>>;
@Input() selectedFeature: Feature<Geometry>; @Input() selectedFeature: Feature<Geometry>;
@Input() selectedItem: IItem; @Input() selectedItem: IItem;
@ -46,7 +41,6 @@ export class ItemVectorSourceComponent extends SourceVectorComponent implements
constructor(@Host() private layer: LayerVectorComponent, private itemService: ItemService, private map: MapComponent, private itemTypeService: ItemTypeService, private featureIconService$: FeatureIconService, private folderService: FolderService, @Inject(LOCALE_ID) private locale: string) { constructor(@Host() private layer: LayerVectorComponent, private itemService: ItemService, private map: MapComponent, private itemTypeService: ItemTypeService, private featureIconService$: FeatureIconService, private folderService: FolderService, @Inject(LOCALE_ID) private locale: string) {
super(layer); super(layer);
this._format = new GeoJSON();
} }
geometry(feature: Feature<Geometry>) { geometry(feature: Feature<Geometry>) {
@ -204,6 +198,7 @@ export class ItemVectorSourceComponent extends SourceVectorComponent implements
if (changes["styles"]) { if (changes["styles"]) {
const styles = changes["styles"].currentValue; const styles = changes["styles"].currentValue;
for (const key in styles) { for (const key in styles) {
// eslint-disable-next-line no-prototype-builtins
if (styles.hasOwnProperty(key)) { if (styles.hasOwnProperty(key)) {
this.stylesCache[key] = styles[key]; this.stylesCache[key] = styles[key];
} }

View File

@ -1,17 +1,16 @@
import { Component, OnInit, Input, ViewChild, ElementRef, AfterViewInit } from '@angular/core'; import { AfterViewInit, Component, ElementRef, OnInit, ViewChild } from '@angular/core';
import { IItemLayer } from '../../../models/item.layer';
import { Store } from '@ngrx/store'; import { Store } from '@ngrx/store';
import * as mapReducers from '../../../reducers/map.reducer';
import * as mapActions from '../../../actions/map.actions';
import { MapComponent } from 'ng-openlayers'; import { MapComponent } from 'ng-openlayers';
import { ILayervalue } from '../../../models/layer.value'; import { ClipboardService } from 'ngx-clipboard';
import { Observable, interval, Subject } from 'rxjs';
import { debounce, throttle } from 'rxjs/operators';
import { toLonLat } from 'ol/proj';
import { toStringHDMS } from 'ol/coordinate'; import { toStringHDMS } from 'ol/coordinate';
import { ClipboardService } from 'ngx-clipboard' import { WKT } from 'ol/format';
import { GeoJSON, WKT } from 'ol/format';
import { Point } from 'ol/geom'; import { Point } from 'ol/geom';
import { toLonLat } from 'ol/proj';
import { Observable, Subject, interval } from 'rxjs';
import { throttle } from 'rxjs/operators';
import * as mapActions from '../../../actions/map.actions';
import { ILayervalue } from '../../../models/layer.value';
import * as mapReducers from '../../../reducers/map.reducer';
@Component({ @Component({
selector: 'fm-map-layer-values', selector: 'fm-map-layer-values',
@ -45,7 +44,7 @@ export class LayerValuesComponent implements OnInit, AfterViewInit {
this.map.instance.on('moveend', () => { this.map.instance.on('moveend', () => {
this.moveEndSubject.next({}); this.moveEndSubject.next({});
}); });
this.moveEndSubject.pipe(throttle(ev => interval(100))).subscribe(() => this.updateValuesLocation()); this.moveEndSubject.pipe(throttle(() => interval(100))).subscribe(() => this.updateValuesLocation());
} }
updateValuesLocation() { updateValuesLocation() {

View File

@ -1,8 +1,8 @@
import { Component, OnInit, Input, Host, OnChanges, SimpleChanges,ChangeDetectorRef } from '@angular/core'; import { ChangeDetectorRef, Component, Host, Input, OnChanges, OnInit } from '@angular/core';
import { MapComponent } from 'ng-openlayers'; import { MapComponent } from 'ng-openlayers';
import {IMapState} from '../../../models/map.state' import { View } from 'ol';
import {View} from 'ol';
import { fromLonLat } from 'ol/proj'; import { fromLonLat } from 'ol/proj';
import { IMapState } from '../../../models/map.state';
@Component({ @Component({
@ -29,7 +29,7 @@ export class PanToLocation implements OnInit,OnChanges{
}); });
} }
ngOnChanges(changes: SimpleChanges) { ngOnChanges() {
// if (changes.position && this.instance) { // if (changes.position && this.instance) {
// var p = changes.position.currentValue as Position; // var p = changes.position.currentValue as Position;
// this.instance.setPosition(fromLonLat([p.coords.longitude, p.coords.latitude])); // this.instance.setPosition(fromLonLat([p.coords.longitude, p.coords.latitude]));
@ -64,17 +64,17 @@ export class PanToLocation implements OnInit,OnChanges{
const newCenter = fromLonLat([this.position.coords.longitude,this.position.coords.latitude]); const newCenter = fromLonLat([this.position.coords.longitude,this.position.coords.latitude]);
const extent = [newCenter[0]-500,newCenter[1]-500,newCenter[0]+500,newCenter[1]+500]; const extent = [newCenter[0]-500,newCenter[1]-500,newCenter[0]+500,newCenter[1]+500];
const options = { padding: [0, 0, 0, 0],minResolution:1 }; const options = { padding: [0, 0, 0, 0],minResolution:1 };
const size = this.map.instance.getSize(); //const size = this.map.instance.getSize();
const rem = parseFloat(getComputedStyle(document.documentElement).fontSize); //const rem = parseFloat(getComputedStyle(document.documentElement).fontSize);
const threshold = 44 * rem; //const threshold = 44 * rem;
let left = 1 * rem; //let left = 1 * rem;
const right = 1 * rem; //const right = 1 * rem;
let bottom = Math.round(size[1] / 2); //let bottom = Math.round(size[1] / 2);
const top = 1 * rem; //const top = 1 * rem;
if (size[0] > threshold) { //if (size[0] > threshold) {
bottom = 1 * rem; // bottom = 1 * rem;
left = 23 * rem; // left = 23 * rem;
} //}
//options.padding = [top, right, bottom, left]; //options.padding = [top, right, bottom, left];
if (this.animate) options["duration"] = 2000; if (this.animate) options["duration"] = 2000;
view.fit(extent, options); view.fit(extent, options);

View File

@ -1,7 +1,7 @@
import { Component, Host, Input, OnInit, ChangeDetectorRef } from '@angular/core'; import { ChangeDetectorRef, Component, OnInit } from '@angular/core';
import { ViewComponent, MapComponent } from 'ng-openlayers'; import { MapComponent } from 'ng-openlayers';
import {View} from 'ol'; import { View } from 'ol';

View File

@ -1,6 +1,6 @@
import { Component, Host, Input, OnInit, OnChanges, SimpleChanges, forwardRef } from '@angular/core'; import { Component, Host, Input, OnChanges } from '@angular/core';
import { ActivatedRoute } from '@angular/router'; import { ActivatedRoute } from '@angular/router';
import { ViewComponent, MapComponent } from 'ng-openlayers'; import { MapComponent, ViewComponent } from 'ng-openlayers';
@Component({ @Component({
@ -30,7 +30,7 @@ export class ZoomToExtentComponent implements OnChanges {
} }
} }
ngOnChanges(changes: SimpleChanges) { ngOnChanges() {
if (this.extent) { if (this.extent) {
const options = { padding: [0, 0, 0, 0],minResolution:1 }; const options = { padding: [0, 0, 0, 0],minResolution:1 };
const size = this.map.instance.getSize(); const size = this.map.instance.getSize();

View File

@ -1,13 +1,13 @@
import { Component, Input, OnInit, ComponentFactoryResolver, ViewChild, SimpleChanges, ComponentFactory, Inject} from '@angular/core'; import { Component, ComponentFactory, ComponentFactoryResolver, Inject, Input, SimpleChanges, ViewChild } from '@angular/core';
import { Feature } from 'ol'; import { IQueryState } from '@farmmaps/common';
import { Geometry} from 'ol/geom';
import { FeatureListComponent,AbstractFeatureListComponent } from '../feature-list/feature-list.component';
import { WidgetHostDirective } from '../widget-host/widget-host.directive';
import {IQueryState,PackageService } from '@farmmaps/common';
import * as mapReducers from '../../reducers/map.reducer';
import * as mapActions from '../../actions/map.actions';
import { Store } from '@ngrx/store'; import { Store } from '@ngrx/store';
import { Feature } from 'ol';
import { Geometry } from 'ol/geom';
import { Observable } from 'rxjs'; import { Observable } from 'rxjs';
import * as mapActions from '../../actions/map.actions';
import * as mapReducers from '../../reducers/map.reducer';
import { AbstractFeatureListComponent, FeatureListComponent } from '../feature-list/feature-list.component';
import { WidgetHostDirective } from '../widget-host/widget-host.directive';
@Component({ @Component({
@ -17,7 +17,7 @@ import { Observable } from 'rxjs';
}) })
export class FeatureListContainerComponent { export class FeatureListContainerComponent {
constructor(private store: Store<mapReducers.State>,private componentFactoryResolver: ComponentFactoryResolver, @Inject(AbstractFeatureListComponent) public featureLists: AbstractFeatureListComponent[],private packageService:PackageService ) { constructor(private store: Store<mapReducers.State>,private componentFactoryResolver: ComponentFactoryResolver, @Inject(AbstractFeatureListComponent) public featureLists: AbstractFeatureListComponent[]) {
this.featureLists = [...this.featureLists].reverse(); this.featureLists = [...this.featureLists].reverse();
} }

View File

@ -5,7 +5,7 @@
<h3>{{schemeItem.name}}</h3> <h3>{{schemeItem.name}}</h3>
<div *ngIf="features;let features"> <div *ngIf="features;let features">
<div class="cropfields"> <div class="cropfields">
<div class="row m-0 ps-3 pe-3" *ngFor="let feature of features" [ngClass]="{'selected':isFeatureSelected(feature)}" (click)="handleFeatureClick(feature)" (mouseenter)="handleFeatureMouseEnter(feature)" (mouseleave)="handleFeatureMouseLeave(feature)"> <div class="row m-0 ps-3 pe-3" *ngFor="let feature of features" [ngClass]="{'selected':isFeatureSelected(feature)}" (click)="handleFeatureClick(feature)" (mouseenter)="handleFeatureMouseEnter(feature)" (mouseleave)="handleFeatureMouseLeave()">
<fm-map-feature-list-feature-container [feature]="feature"></fm-map-feature-list-feature-container> <fm-map-feature-list-feature-container [feature]="feature"></fm-map-feature-list-feature-container>
</div> </div>
</div> </div>

View File

@ -1,12 +1,12 @@
import { Component, Injectable,AfterViewInit, OnInit,SimpleChanges, ChangeDetectorRef} from '@angular/core';
import { Location } from '@angular/common'; import { Location } from '@angular/common';
import { AbstractFeatureListComponent } from '../feature-list/feature-list.component'; import { Component, Injectable, OnInit } from '@angular/core';
import {ForItemType } from '../for-item/for-itemtype.decorator'; import { IItem, ItemService, ItemTypeService, commonReducers } from '@farmmaps/common';
import {ForChild } from '../for-item/for-child.decorator';
import { Store } from '@ngrx/store'; import { Store } from '@ngrx/store';
import * as mapReducers from '../../reducers/map.reducer';
import { commonReducers, ItemTypeService, IItem,ItemService } from '@farmmaps/common';
import { Observable } from 'rxjs'; import { Observable } from 'rxjs';
import * as mapReducers from '../../reducers/map.reducer';
import { AbstractFeatureListComponent } from '../feature-list/feature-list.component';
import { ForChild } from '../for-item/for-child.decorator';
import { ForItemType } from '../for-item/for-itemtype.decorator';
@ForChild() @ForChild()
@ForItemType("vnd.farmmaps.itemtype.cropfield") @ForItemType("vnd.farmmaps.itemtype.cropfield")

View File

@ -4,7 +4,7 @@
<h3><i class="far fa-farm"></i>&nbsp;<span i18n>Farms</span></h3> <h3><i class="far fa-farm"></i>&nbsp;<span i18n>Farms</span></h3>
<div *ngIf="features;let features"> <div *ngIf="features;let features">
<div class="farms"> <div class="farms">
<div class="row m-0 ps-3 pe-3" *ngFor="let feature of features"[ngClass]="{'selected':isFeatureSelected(feature)}" (click)="handleFeatureClick(feature)" (mouseenter)="handleFeatureMouseEnter(feature)" (mouseleave)="handleFeatureMouseLeave(feature)"> <div class="row m-0 ps-3 pe-3" *ngFor="let feature of features"[ngClass]="{'selected':isFeatureSelected(feature)}" (click)="handleFeatureClick(feature)" (mouseenter)="handleFeatureMouseEnter(feature)" (mouseleave)="handleFeatureMouseLeave()">
<fm-map-feature-list-feature-container [feature]="feature"></fm-map-feature-list-feature-container> <fm-map-feature-list-feature-container [feature]="feature"></fm-map-feature-list-feature-container>
</div> </div>
</div> </div>

View File

@ -1,15 +1,14 @@
import { Component, Injectable } from '@angular/core';
import { Location } from '@angular/common'; import { Location } from '@angular/common';
import { Component, Injectable } from '@angular/core';
import { ItemTypeService, commonReducers } from '@farmmaps/common';
import { Action, Store } from '@ngrx/store';
import { Feature } from 'ol';
import { Geometry } from 'ol/geom';
import { tassign } from 'tassign';
import * as mapActions from '../../actions/map.actions';
import * as mapReducers from '../../reducers/map.reducer';
import { AbstractFeatureListComponent } from '../feature-list/feature-list.component'; import { AbstractFeatureListComponent } from '../feature-list/feature-list.component';
import { ForItemType } from '../for-item/for-itemtype.decorator'; import { ForItemType } from '../for-item/for-itemtype.decorator';
import { Store,Action } from '@ngrx/store';
import * as mapReducers from '../../reducers/map.reducer';
import { commonReducers, ItemTypeService } from '@farmmaps/common';
import * as mapActions from '../../actions/map.actions';
import { tassign } from 'tassign';
import { Router } from '@angular/router';
import { Feature } from 'ol';
import { Geometry} from 'ol/geom';
@ForItemType("vnd.farmmaps.itemtype.croppingscheme") @ForItemType("vnd.farmmaps.itemtype.croppingscheme")
@Injectable() @Injectable()
@ -20,7 +19,7 @@ import { Geometry} from 'ol/geom';
}) })
export class FeatureListCroppingschemeComponent extends AbstractFeatureListComponent { export class FeatureListCroppingschemeComponent extends AbstractFeatureListComponent {
constructor(store: Store<mapReducers.State | commonReducers.State>, itemTypeService: ItemTypeService, location: Location, private router: Router) { constructor(store: Store<mapReducers.State | commonReducers.State>, itemTypeService: ItemTypeService, location: Location) {
super(store, itemTypeService, location); super(store, itemTypeService, location);
} }

View File

@ -1,7 +1,7 @@
import { Component, Input, OnInit, ComponentFactoryResolver, ViewChild, SimpleChanges, ComponentFactory, Inject, Type} from '@angular/core'; import { Component, ComponentFactory, ComponentFactoryResolver, Inject, Input, SimpleChanges, ViewChild } from '@angular/core';
import { Feature } from 'ol'; import { Feature } from 'ol';
import { Geometry } from 'ol/geom'; import { Geometry } from 'ol/geom';
import { AbstractFeatureListFeatureComponent,FeatureListFeatureComponent } from '../feature-list-feature/feature-list-feature.component'; import { AbstractFeatureListFeatureComponent, FeatureListFeatureComponent } from '../feature-list-feature/feature-list-feature.component';
import { WidgetHostDirective } from '../widget-host/widget-host.directive'; import { WidgetHostDirective } from '../widget-host/widget-host.directive';

View File

@ -1,12 +1,12 @@
import { Component, Injectable,ViewChild,AfterViewInit} from '@angular/core'; import { Component, Injectable } from '@angular/core';
import { AppConfig, ItemTypeService, commonReducers } from '@farmmaps/common';
import { Store } from '@ngrx/store';
import { Feature } from 'ol'; import { Feature } from 'ol';
import { Geometry } from 'ol/geom'; import { Geometry } from 'ol/geom';
import { Store } from '@ngrx/store'; import { getArea } from 'ol/sphere';
import * as mapReducers from '../../reducers/map.reducer'; import * as mapReducers from '../../reducers/map.reducer';
import { commonReducers,ItemTypeService,AppConfig } from '@farmmaps/common';
import { AbstractFeatureListFeatureComponent } from '../feature-list-feature/feature-list-feature.component'; import { AbstractFeatureListFeatureComponent } from '../feature-list-feature/feature-list-feature.component';
import { ForItemType } from '../for-item/for-itemtype.decorator'; import { ForItemType } from '../for-item/for-itemtype.decorator';
import {getArea} from 'ol/sphere';

View File

@ -1,8 +1,7 @@
import { Component, Input, Injectable} from '@angular/core'; import { Component, Injectable } from '@angular/core';
import { Feature } from 'ol'; import { AppConfig, ItemTypeService, commonReducers } from '@farmmaps/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,AppConfig } from '@farmmaps/common';
import { AbstractFeatureListFeatureComponent } from '../feature-list-feature/feature-list-feature.component'; import { AbstractFeatureListFeatureComponent } from '../feature-list-feature/feature-list-feature.component';
import { ForItemType } from '../for-item/for-itemtype.decorator'; import { ForItemType } from '../for-item/for-itemtype.decorator';

View File

@ -1,6 +1,6 @@
<div *ngIf="features;let features"> <div *ngIf="features;let features">
<fm-back-button></fm-back-button> <fm-back-button></fm-back-button>
<div class="row m-0 ps-3 pe-3" *ngFor="let feature of features" [ngClass]="{'selected':isFeatureSelected(feature)}" (click)="handleFeatureClick(feature)" (mouseenter)="handleFeatureMouseEnter(feature)" (mouseleave)="handleFeatureMouseLeave(feature)"> <div class="row m-0 ps-3 pe-3" *ngFor="let feature of features" [ngClass]="{'selected':isFeatureSelected(feature)}" (click)="handleFeatureClick(feature)" (mouseenter)="handleFeatureMouseEnter(feature)" (mouseleave)="handleFeatureMouseLeave()">
<fm-map-feature-list-feature-container [feature]="feature"></fm-map-feature-list-feature-container> <fm-map-feature-list-feature-container [feature]="feature"></fm-map-feature-list-feature-container>
</div> </div>
</div> </div>

View File

@ -1,15 +1,12 @@
import { Component, Input, Injectable,Directive,SimpleChanges } from '@angular/core';
import { Location } from '@angular/common'; import { Location } from '@angular/common';
import { Component, Directive, Injectable, Input } from '@angular/core';
import { IQueryState, ItemTypeService, commonReducers } from '@farmmaps/common';
import { Action, Store } from '@ngrx/store';
import { Feature } from 'ol'; import { Feature } from 'ol';
import { Geometry} from 'ol/geom'; import { Geometry } from 'ol/geom';
import { Store,Action} from '@ngrx/store';
import * as mapReducers from '../../reducers/map.reducer';
import { commonReducers,ItemTypeService, IItem, Item } from '@farmmaps/common';
import * as mapActions from '../../actions/map.actions';
import { Observable, from } from 'rxjs';
import { withLatestFrom } from 'rxjs/operators';
import { tassign } from 'tassign'; import { tassign } from 'tassign';
import { IQueryState } from '@farmmaps/common'; import * as mapActions from '../../actions/map.actions';
import * as mapReducers from '../../reducers/map.reducer';
@Injectable() @Injectable()
@ -37,11 +34,11 @@ export abstract class AbstractFeatureListComponent {
return new mapActions.DoQuery(newQuery) return new mapActions.DoQuery(newQuery)
} }
handleFeatureMouseEnter(feature) { handleFeatureMouseEnter(feature:Feature<Geometry>) {
this.store.dispatch(new mapActions.SelectFeature(feature)); this.store.dispatch(new mapActions.SelectFeature(feature));
} }
handleFeatureMouseLeave(feature) { handleFeatureMouseLeave() {
this.store.dispatch(new mapActions.SelectFeature(null)); this.store.dispatch(new mapActions.SelectFeature(null));
} }

View File

@ -1,7 +1,7 @@
import { Component, Input, AfterViewInit, ViewChild } from '@angular/core'; import { AfterViewInit, Component, Input, ViewChild } from '@angular/core';
import { Feature} from 'ol'; import { Feature } from 'ol';
import { Geometry,Polygon,MultiPolygon } from 'ol/geom';
import * as extent from 'ol/extent'; import * as extent from 'ol/extent';
import { Geometry, Polygon } from 'ol/geom';
import * as render from 'ol/render'; import * as render from 'ol/render';
import * as style from 'ol/style'; import * as style from 'ol/style';

View File

@ -1,7 +1,7 @@
import { Directive, ViewContainerRef,TemplateRef,OnInit,Input, OnChanges } from '@angular/core'; import { Directive, Input, OnInit, TemplateRef, ViewContainerRef } from '@angular/core';
import { MapComponent } from 'ng-openlayers';
import { Layer } from 'ol/layer'; import { Layer } from 'ol/layer';
import { Source } from 'ol/source'; import { Source } from 'ol/source';
import { MapComponent } from 'ng-openlayers';
@Directive({ @Directive({
selector: '[fmMapIfZoomToShow]', selector: '[fmMapIfZoomToShow]',
@ -36,7 +36,7 @@ export class ifZoomToShowDirective implements OnInit {
} }
ngOnInit() { ngOnInit() {
this.map$.instance.on('moveend', (e) => { this.map$.instance.on('moveend', () => {
this.checkZoom(); this.checkZoom();
}); });
} }

View File

@ -1,7 +1,7 @@
import { Component, Input, OnInit, ComponentFactoryResolver, ViewChild, SimpleChanges, ComponentFactory, Inject, Type} from '@angular/core'; import { Component, ComponentFactory, ComponentFactoryResolver, Inject, Input, SimpleChanges, ViewChild } from '@angular/core';
import { AbstractItemListItemComponent,ItemListItemComponent } from '../item-list-item/item-list-item.component'; import { IListItem } from '@farmmaps/common';
import { AbstractItemListItemComponent, ItemListItemComponent } from '../item-list-item/item-list-item.component';
import { WidgetHostDirective } from '../widget-host/widget-host.directive'; import { WidgetHostDirective } from '../widget-host/widget-host.directive';
import { IItem, IListItem } from '@farmmaps/common';
@Component({ @Component({
@ -27,7 +27,6 @@ export class ItemListItemContainerComponent {
let selected = -1; let selected = -1;
let maxMatches =0; let maxMatches =0;
const showItem = true;
for (let i = 0; i < this.itemComponentList.length; i++) { for (let i = 0; i < this.itemComponentList.length; i++) {
let matches=0; let matches=0;
let criteria=0; let criteria=0;

View File

@ -1,8 +1,8 @@
import { Component, Input, Injectable, Inject, Optional,ComponentFactoryResolver, ViewContainerRef, QueryList, ComponentFactory, ViewChildren,AfterViewInit } from '@angular/core';
import { Location } from '@angular/common'; import { Location } from '@angular/common';
import { AfterViewInit, Component, ComponentFactory, ComponentFactoryResolver, Inject, Injectable, Input, Optional, QueryList, ViewChildren, ViewContainerRef } from '@angular/core';
import { IListItem, ItemTypeService, commonReducers } from '@farmmaps/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, Item,IListItem } from '@farmmaps/common';
import { AbstractItemWidgetComponent } from '../item-list-item/item-list-item.component'; import { AbstractItemWidgetComponent } from '../item-list-item/item-list-item.component';

View File

@ -1,10 +1,10 @@
import { Component, OnInit, OnChanges, SimpleChanges } from '@angular/core'; import { Component, OnChanges, OnInit } from '@angular/core';
import {IItemLayer} from '../../models/item.layer';
import { Store } from '@ngrx/store'; import { Store } from '@ngrx/store';
import * as mapReducers from '../../reducers/map.reducer'; import { createEmpty, extend } from 'ol/extent';
import * as mapActions from '../../actions/map.actions';
import {createEmpty,extend } from 'ol/extent';
import { Observable } from 'rxjs'; import { Observable } from 'rxjs';
import * as mapActions from '../../actions/map.actions';
import { IItemLayer } from '../../models/item.layer';
import * as mapReducers from '../../reducers/map.reducer';
@Component({ @Component({
selector: 'fm-map-layer-switcher', selector: 'fm-map-layer-switcher',
@ -32,11 +32,9 @@ export class LayerSwitcher implements OnInit,OnChanges{
this.showLayerSwitcher = this.store.select(mapReducers.selectGetShowLayerSwitcher); this.showLayerSwitcher = this.store.select(mapReducers.selectGetShowLayerSwitcher);
} }
ngOnChanges(changes: SimpleChanges) { ngOnChanges() {
} }
handleClick(event:Event) { handleClick(event:Event) {
event.stopPropagation(); event.stopPropagation();
this.store.dispatch(new mapActions.ShowLayerSwitcher(true)); this.store.dispatch(new mapActions.ShowLayerSwitcher(true));
@ -47,8 +45,6 @@ export class LayerSwitcher implements OnInit,OnChanges{
this.store.dispatch(new mapActions.ShowLayerSwitcher(false)); this.store.dispatch(new mapActions.ShowLayerSwitcher(false));
} }
handleOnToggleVisibility(itemLayer: IItemLayer) { handleOnToggleVisibility(itemLayer: IItemLayer) {
this.store.dispatch(new mapActions.SetVisibility(itemLayer,!itemLayer.visible)); this.store.dispatch(new mapActions.SetVisibility(itemLayer,!itemLayer.visible));
} }

View File

@ -1,5 +1,5 @@
import {Component, Input} from '@angular/core'; import { Component, Input } from '@angular/core';
import {IHistogram, ILayer} from '../../../models/color.map'; import { IHistogram } from '../../../models/color.map';
@Component({ @Component({
selector: 'fm-map-histogram-details', selector: 'fm-map-histogram-details',

View File

@ -1,5 +1,5 @@
import { Component, OnInit, Input,AfterViewInit } from '@angular/core'; import { AfterViewInit, Component, Input, OnInit } from '@angular/core';
import { IColorMap, IColor, IColorEntry,ILayer, IRenderer } from '../../models/color.map'; import { IColor, ILayer, IRenderer } from '../../models/color.map';
@Component({ @Component({

View File

@ -5,12 +5,12 @@
<div class="map-search collapsed" [ngClass]="{'collapsed':collapsedLocal,searchcollapsed:searchMinifiedLocal}" (click)="$event.stopPropagation()"> <div class="map-search collapsed" [ngClass]="{'collapsed':collapsedLocal,searchcollapsed:searchMinifiedLocal}" (click)="$event.stopPropagation()">
<div class="card p-2"> <div class="card p-2">
<form class="form" (ngSubmit)="handleSearch($event)"> <form class="form" (ngSubmit)="handleSearch()">
<div class="input-group"> <div class="input-group">
<button type="button" class="btn btn-outline-secondary" (click)="handleToggleMenu($event)"><i class="fal fa-bars" aria-hidden="true"></i></button> <button type="button" class="btn btn-outline-secondary" (click)="handleToggleMenu()"><i class="fal fa-bars" aria-hidden="true"></i></button>
<input #searchText class="form-control" type="text" (focus)="handleFocus($event)" [ngModel]="searchTextLocal" name="searchTextLocal" (ngModelChange)="handleChange($event)" [ngbTypeahead]="search" [resultTemplate]="rt" [inputFormatter]="formatter" (selectItem)="handleSelect($event)" placeholder="Search" i18n-placeholder /> <input #searchText class="form-control" type="text" (focus)="handleFocus()" [ngModel]="searchTextLocal" name="searchTextLocal" (ngModelChange)="handleChange($event)" [ngbTypeahead]="search" [resultTemplate]="rt" [inputFormatter]="formatter" (selectItem)="handleSelect($event)" placeholder="Search" i18n-placeholder />
<button type="submit" class="btn btn-outline-secondary" [disabled]="disabled"><i class="fal fa-search"></i></button> <button type="submit" class="btn btn-outline-secondary" [disabled]="disabled"><i class="fal fa-search"></i></button>
<button type="button" class="clear btn btn-outline-secondary" [disabled]="!clearEnabled" (click)="handleClearClick($event)"><i class="fas fa-times"></i></button> <button type="button" class="clear btn btn-outline-secondary" [disabled]="!clearEnabled" (click)="handleClearClick()"><i class="fas fa-times"></i></button>
</div> </div>
<div class="options"> <div class="options">
<div class="form-check"> <div class="form-check">

View File

@ -1,10 +1,9 @@
import { Component, Input, Output, OnInit, EventEmitter, SimpleChanges, OnChanges, ViewChild } from '@angular/core'; import { Component, EventEmitter, Input, Output, ViewChild } from '@angular/core';
import { Observable , of,merge,forkJoin } from 'rxjs'; import { IQueryState, TimespanService, TypeaheadService } from '@farmmaps/common';
import { debounceTime,distinctUntilChanged,tap,switchMap,catchError,map} from 'rxjs/operators'; import { Observable, forkJoin, of } from 'rxjs';
import { TypeaheadService, TimespanService } from '@farmmaps/common'; import { catchError, debounceTime, distinctUntilChanged, map, switchMap, tap } from 'rxjs/operators';
import { IQueryState } from '@farmmaps/common';
import { IPeriodState } from '../../models/period.state';
import { tassign } from 'tassign'; import { tassign } from 'tassign';
import { IPeriodState } from '../../models/period.state';
@Component({ @Component({
selector: 'fm-map-map-search', selector: 'fm-map-map-search',
@ -54,7 +53,6 @@ export class MapSearchComponent {
public searchMinifiedLocal = false; public searchMinifiedLocal = false;
public periodLocal: IPeriodState = { startDate:new Date(new Date(Date.now()).getFullYear(), new Date(Date.now()).getMonth() - 3, 1), endDate:new Date(Date.now())}; public periodLocal: IPeriodState = { startDate:new Date(new Date(Date.now()).getFullYear(), new Date(Date.now()).getMonth() - 3, 1), endDate:new Date(Date.now())};
public filterOptionsLocal: IQueryState; public filterOptionsLocal: IQueryState;
private extent: number[];
public searchTextLocal: any; public searchTextLocal: any;
public searchTextLocalOutput: string; public searchTextLocalOutput: string;
public dateFilter = true; public dateFilter = true;
@ -81,12 +79,12 @@ export class MapSearchComponent {
catchError(() => { catchError(() => {
this.searchFailed = true; this.searchFailed = true;
return of([]); return of([]);
}),map( (sa:string[]) => sa.map((s,i) => ({"name":s,"type":"tag"})))), }),map( (sa:string[]) => sa.map((s) => ({"name":s,"type":"tag"})))),
this.typeaheadService.getCityTypeaheadItems(term).pipe( this.typeaheadService.getCityTypeaheadItems(term).pipe(
catchError(() => { catchError(() => {
this.searchFailed = true; this.searchFailed = true;
return of([]); return of([]);
}),map( (sa:string[]) => sa.map((s,i) => ({"name":s,"type":"city"})))), }),map( (sa:string[]) => sa.map((s) => ({"name":s,"type":"city"})))),
).pipe(map(([a1,a2]) => [...a1, ...a2] ),map(a => a.sort((a, b) => (a.name.toUpperCase() > b.name.toUpperCase()) ? 1 : -1))) ).pipe(map(([a1,a2]) => [...a1, ...a2] ),map(a => a.sort((a, b) => (a.name.toUpperCase() > b.name.toUpperCase()) ? 1 : -1)))
), ),
tap(() => this.searching = false), tap(() => this.searching = false),
@ -94,7 +92,7 @@ export class MapSearchComponent {
formatter = (x: { name: string }) => x.name; formatter = (x: { name: string }) => x.name;
handleSearch(event) { handleSearch() {
this.filterOptionsLocal.tags = null; this.filterOptionsLocal.tags = null;
this.filterOptionsLocal.itemType = null; this.filterOptionsLocal.itemType = null;
this.filterOptionsLocal.itemCode = null; this.filterOptionsLocal.itemCode = null;
@ -168,11 +166,11 @@ export class MapSearchComponent {
} }
handleToggleMenu(event) { handleToggleMenu() {
this.onToggleMenu.emit({}); this.onToggleMenu.emit({});
} }
handleFocus(event) { handleFocus() {
this.onSearchExpand.emit({}); this.onSearchExpand.emit({});
} }
@ -187,7 +185,7 @@ export class MapSearchComponent {
this.disabled = true; this.disabled = true;
} }
handleClearClick(event) { handleClearClick() {
this.onClear.emit({}); this.onClear.emit({});
} }

View File

@ -61,7 +61,7 @@
<fm-map-file-drop-target [parentCode]="state.parentCode" (onFileDropped)="handleFileDropped($event)"></fm-map-file-drop-target> <fm-map-file-drop-target [parentCode]="state.parentCode" (onFileDropped)="handleFileDropped($event)"></fm-map-file-drop-target>
<div *ngIf="noContent"> <div *ngIf="noContent">
<fm-map-map-search #mapSearch [openedModalName]="state.openedModalName" (onOpenModal)="handleOpenModal($event)" (onCloseModal)="handleCloseModal()" [ngClass]="{'menuVisible':state.menuVisible}" (onToggleMenu)="handleToggleMenu($event)" (onSearchCollapse)="handleSearchCollapse($event)" (onSearchExpand)="handleSearchExpand($event)" [collapsed]="state.searchCollapsed" [searchMinified]="state.searchMinified" (onSearch)="handleSearch($event)" (onClear)="handleClearSearch($event)" [filterOptions]="state.queryState" [clearEnabled]="state.clearEnabled" [period]="state.period" (onPeriodChange)="handlePeriodChange($event)" (onCitySearch)="handleCitySearch($event)"></fm-map-map-search> <fm-map-map-search #mapSearch [openedModalName]="state.openedModalName" (onOpenModal)="handleOpenModal($event)" (onCloseModal)="handleCloseModal()" [ngClass]="{'menuVisible':state.menuVisible}" (onToggleMenu)="handleToggleMenu()" (onSearchCollapse)="handleSearchCollapse()" (onSearchExpand)="handleSearchExpand()" [collapsed]="state.searchCollapsed" [searchMinified]="state.searchMinified" (onSearch)="handleSearch($event)" (onClear)="handleClearSearch()" [filterOptions]="state.queryState" [clearEnabled]="state.clearEnabled" [period]="state.period" (onPeriodChange)="handlePeriodChange($event)" (onCitySearch)="handleCitySearch($event)"></fm-map-map-search>
</div> </div>
<div class="side-panel-container"> <div class="side-panel-container">

View File

@ -1,42 +1,29 @@
import { Component, OnInit, OnDestroy, HostListener, ViewChild, AfterViewInit,NgZone,ElementRef } from '@angular/core'; /* eslint-disable no-prototype-builtins */
import { Location } from '@angular/common'; import { AfterViewInit, Component, ElementRef, HostListener, NgZone, OnDestroy, OnInit, ViewChild } from '@angular/core';
import { Observable, Subject, Subscription, from,of ,EMPTY } from 'rxjs'; import { ActivatedRoute, ParamMap, Router } from '@angular/router';
import { withLatestFrom, switchMap,skip } from 'rxjs/operators'; import { DeviceService, GeolocatorService, IItem, IItemType, IQueryState, ItemTypeService, ResumableFileUploadService, StateSerializerService, commonActions, commonReducers } from '@farmmaps/common';
import { Router, ActivatedRoute, ParamMap } from '@angular/router';
import { Store } from '@ngrx/store'; import { Store } from '@ngrx/store';
import { DeviceService } from '@farmmaps/common'; import { Feature } from 'ol';
import {getRenderPixel} from 'ol/render'; import { Extent, createEmpty, extend } from 'ol/extent';
import { Circle, Geometry, Point } from 'ol/geom';
// Map import { transform } from 'ol/proj';
import * as mapReducers from '../../reducers/map.reducer'; import { getRenderPixel } from 'ol/render';
import * as mapActions from '../../actions/map.actions';
import { IMapState} from '../../models/map.state';
import { IClickedFeature} from '../../models/clicked.feature';
import { IQuery } from '../../reducers/map.reducer'
import { ISelectedFeatures } from '../../models/selected.features';
import { IItemLayer } from '../../models/item.layer';
import { IListItem, IQueryState } from '@farmmaps/common';
import { IPeriodState } from '../../models/period.state';
import {IStyles} from '../../models/style.cache';
import { IDroppedFile } from '../aol/file-drop-target/file-drop-target.component';
import { StateSerializerService } from '@farmmaps/common';
import { GeolocationService} from '../../services/geolocation.service';
import { GeolocatorService } from '@farmmaps/common';
import {DeviceOrientationService} from '../../services/device-orientation.service';
// AppCommon
import { ResumableFileUploadService, ItemTypeService } from '@farmmaps/common';
import { IItemType, IItem } from '@farmmaps/common';
import {commonReducers} from '@farmmaps/common';
import {commonActions} from '@farmmaps/common';
import {Feature} from 'ol';
import {Geometry,Point,Circle} from 'ol/geom';
import {Extent,createEmpty,extend } from 'ol/extent';
import {transform} from 'ol/proj';
import { tassign } from 'tassign';
import * as style from 'ol/style'; import * as style from 'ol/style';
import { EMPTY, Observable, Subject, Subscription, from, of } from 'rxjs';
import { skip, switchMap, withLatestFrom } from 'rxjs/operators';
import { tassign } from 'tassign';
import * as mapActions from '../../actions/map.actions';
import { IClickedFeature } from '../../models/clicked.feature';
import { IItemLayer } from '../../models/item.layer';
import { IMapState } from '../../models/map.state';
import { IPeriodState } from '../../models/period.state';
import { ISelectedFeatures } from '../../models/selected.features';
import { IStyles } from '../../models/style.cache';
import * as mapReducers from '../../reducers/map.reducer';
import { IQuery } from '../../reducers/map.reducer';
import { DeviceOrientationService } from '../../services/device-orientation.service';
import { GeolocationService } from '../../services/geolocation.service';
import { IDroppedFile } from '../aol/file-drop-target/file-drop-target.component';
@Component({ @Component({
selector: 'fm-map-map', selector: 'fm-map-map',
@ -106,7 +93,6 @@ export class MapComponent implements OnInit, OnDestroy,AfterViewInit {
private uploadService: ResumableFileUploadService, private uploadService: ResumableFileUploadService,
private serializeService: StateSerializerService, private serializeService: StateSerializerService,
public itemTypeService: ItemTypeService, public itemTypeService: ItemTypeService,
private location: Location,
private geolocationService: GeolocationService, private geolocationService: GeolocationService,
private geolocaterService: GeolocatorService, private geolocaterService: GeolocatorService,
private zone: NgZone, private zone: NgZone,
@ -389,15 +375,15 @@ export class MapComponent implements OnInit, OnDestroy,AfterViewInit {
}); });
} }
handleSearchCollapse(event) { handleSearchCollapse() {
this.store.dispatch(new mapActions.CollapseSearch()); this.store.dispatch(new mapActions.CollapseSearch());
} }
handleSearchExpand(event) { handleSearchExpand() {
this.store.dispatch(new mapActions.ExpandSearch()); this.store.dispatch(new mapActions.ExpandSearch());
} }
handleToggleMenu(event) { handleToggleMenu() {
this.store.dispatch(new commonActions.ToggleMenu()); this.store.dispatch(new commonActions.ToggleMenu());
} }
@ -478,11 +464,11 @@ export class MapComponent implements OnInit, OnDestroy,AfterViewInit {
}); });
} }
handleOnDownload(event) { handleOnDownload() {
} }
handleClearSearch(event) { handleClearSearch() {
this.store.dispatch(new mapActions.Clear()); this.store.dispatch(new mapActions.Clear());
} }

View File

@ -1,5 +1,5 @@
<ng-template #content let-c="close" let-d="dismiss"> <ng-template #content let-c="close" let-d="dismiss">
<form [formGroup]="metaDataForm" (ngSubmit)="handleMetaDataEntered($event)"> <form [formGroup]="metaDataForm" (ngSubmit)="handleMetaDataEntered()">
<div class="modal-header"> <div class="modal-header">
<h4 class="modal-title" i18n>Add metadata</h4> <h4 class="modal-title" i18n>Add metadata</h4>
<button type="button" class="close" aria-label="Close" (click)="d('Cross click'); onCloseModal.emit()"> <button type="button" class="close" aria-label="Close" (click)="d('Cross click'); onCloseModal.emit()">

View File

@ -1,8 +1,8 @@
import { Component, Output, ViewChild, EventEmitter, Input, ElementRef, HostListener } from '@angular/core'; import { Component, ElementRef, EventEmitter, Input, Output, ViewChild } from '@angular/core';
import { UntypedFormGroup,UntypedFormBuilder, Validators } from '@angular/forms'; import { UntypedFormBuilder, UntypedFormGroup, Validators } from '@angular/forms';
import { IListItem } from '@farmmaps/common'; import { IListItem } from '@farmmaps/common';
import { NgbModal, NgbModalRef } from "@ng-bootstrap/ng-bootstrap";
import { IDroppedFile } from '../aol/file-drop-target/file-drop-target.component'; import { IDroppedFile } from '../aol/file-drop-target/file-drop-target.component';
import {NgbModal, NgbModalRef} from "@ng-bootstrap/ng-bootstrap";
export interface IMetaData { export interface IMetaData {
droppedFile: IDroppedFile, droppedFile: IDroppedFile,
@ -37,7 +37,7 @@ export class MetaDataModalComponent {
public metaDataForm: UntypedFormGroup; public metaDataForm: UntypedFormGroup;
handleMetaDataEntered(event) { handleMetaDataEntered() {
if (this.metaDataForm.valid) { if (this.metaDataForm.valid) {
this.onAddFilesWithMetaData.emit({ droppedFile: this.droppedFile, attributes: { name: this.metaDataForm.value.name } }); this.onAddFilesWithMetaData.emit({ droppedFile: this.droppedFile, attributes: { name: this.metaDataForm.value.name } });
} }

View File

@ -1,7 +1,6 @@
import { Component, Output, ViewChild, EventEmitter, Input, ElementRef, HostListener } from '@angular/core'; import { Component, ElementRef, EventEmitter, Input, Output, ViewChild } from '@angular/core';
import { FormGroup, FormBuilder, Validators } from '@angular/forms';
import { NgbModal, NgbModalRef, NgbDateStruct, NgbCalendar, NgbDateAdapter } from "@ng-bootstrap/ng-bootstrap";
import { NgbDateNativeAdapter } from '@farmmaps/common'; import { NgbDateNativeAdapter } from '@farmmaps/common';
import { NgbDateStruct, NgbModal, NgbModalRef } from "@ng-bootstrap/ng-bootstrap";
const equals = (one: NgbDateStruct, two: NgbDateStruct) => const equals = (one: NgbDateStruct, two: NgbDateStruct) =>
@ -52,7 +51,7 @@ export class SelectPeriodModalComponent {
@Output() onCloseModal = new EventEmitter<any>(); @Output() onCloseModal = new EventEmitter<any>();
@Output() onSelect = new EventEmitter<{ startDate: Date, endDate: Date }>(); @Output() onSelect = new EventEmitter<{ startDate: Date, endDate: Date }>();
constructor(private modalService: NgbModal, private calendar: NgbCalendar) { } constructor(private modalService: NgbModal) { }
openModal() { openModal() {
//Timeout trick to avoid ExpressionChangedAfterItHasBeenCheckedError //Timeout trick to avoid ExpressionChangedAfterItHasBeenCheckedError

View File

@ -1,8 +1,8 @@
import { Component, Input, OnInit, ComponentFactoryResolver, ViewChild, SimpleChanges, ComponentFactory, Inject, Type} from '@angular/core'; import { Component, ComponentFactory, ComponentFactoryResolver, Inject, Input, SimpleChanges, ViewChild } from '@angular/core';
import { IItem } from '@farmmaps/common'; import { IItem } from '@farmmaps/common';
import { IItemLayer } from '../../models/item.layer';
import { AbstractSelectedItemComponent, SelectedItemComponent } from '../selected-item/selected-item.component'; import { AbstractSelectedItemComponent, SelectedItemComponent } from '../selected-item/selected-item.component';
import { WidgetHostDirective } from '../widget-host/widget-host.directive'; import { WidgetHostDirective } from '../widget-host/widget-host.directive';
import { IItemLayer } from '../../models/item.layer';
@Component({ @Component({
@ -28,7 +28,6 @@ export class SelectedItemContainerComponent {
let selected = -1; let selected = -1;
let maxMatches =0; let maxMatches =0;
const showItem = true;
for (let i = 0; i < this.selectedItemComponents.length; i++) { for (let i = 0; i < this.selectedItemComponents.length; i++) {
let matches=0; let matches=0;
let criteria=0; let criteria=0;

View File

@ -1,16 +1,15 @@
import { Component, Input, Injectable, OnInit } from '@angular/core';
import { Location } from '@angular/common'; import { Location } from '@angular/common';
import { Feature } from 'ol'; import { Component, Inject, Injectable, OnInit } from '@angular/core';
import { Router } from '@angular/router';
import { FolderService, IItem, IListItem, ItemService, ItemTypeService, commonReducers } from '@farmmaps/common';
import { Store } from '@ngrx/store'; import { Store } from '@ngrx/store';
import { GeoJSON } from 'ol/format';
import { getArea } from 'ol/sphere';
import { Observable, of } from 'rxjs';
import { combineLatest, switchMap } from 'rxjs/operators';
import * as mapReducers from '../../reducers/map.reducer'; import * as mapReducers from '../../reducers/map.reducer';
import { commonReducers, ItemTypeService, IItem, Item, ItemService, FolderService, IListItem} from '@farmmaps/common';
import { Router, ActivatedRoute, ParamMap, Event } 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';
import { Observable,of } from 'rxjs';
import {GeoJSON} from 'ol/format';
import {getArea} from 'ol/sphere';
import { withLatestFrom,switchMap,combineLatest } from 'rxjs/operators';
@ForItemType("vnd.farmmaps.itemtype.cropfield") @ForItemType("vnd.farmmaps.itemtype.cropfield")
@ -24,7 +23,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>, @Inject('itemTypeService') itemTypeService: ItemTypeService, location: Location, router: Router, @Inject('itemService$') private itemService$: ItemService,@Inject('folderService$') private folderService$: FolderService) {
super(store, itemTypeService,location,router); super(store, itemTypeService,location,router);
} }

View File

@ -1,12 +1,12 @@
import { Component, Injectable } from '@angular/core';
import { Location } from '@angular/common'; import { Location } from '@angular/common';
import { Store } from '@ngrx/store'; import { Component, Inject, Injectable } 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 { ItemTypeService, commonReducers } from '@farmmaps/common';
import { Store } from '@ngrx/store';
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")
@ -18,7 +18,7 @@ import * as mapActions from '../../actions/map.actions';
}) })
export class SelectedItemGeotiffComponent extends AbstractSelectedItemComponent { export class SelectedItemGeotiffComponent extends AbstractSelectedItemComponent {
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>, @Inject('itemTypeService') itemTypeService: ItemTypeService, location: Location, router: Router) {
super(store, itemTypeService,location,router); super(store, itemTypeService,location,router);
} }

View File

@ -1,14 +1,12 @@
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 } from '@angular/core';
import { Router } from '@angular/router';
import { ItemTypeService, commonReducers } 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';
@ForItemType("vnd.farmmaps.itemtype.shape.processed") @ForItemType("vnd.farmmaps.itemtype.shape.processed")
@ -20,7 +18,7 @@ import { Observable } from 'rxjs';
}) })
export class SelectedItemShapeComponent extends AbstractSelectedItemComponent { export class SelectedItemShapeComponent extends AbstractSelectedItemComponent {
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) {
super(store, itemTypeService,location,router); super(store, itemTypeService,location,router);
} }
public selectedLayer = 0; public selectedLayer = 0;

View File

@ -1,35 +1,34 @@
import { Injectable } from '@angular/core'; import { Injectable } from '@angular/core';
import { Store, Action, createFeatureSelector } from '@ngrx/store'; import { Actions, createEffect, ofType } from '@ngrx/effects';
import { ROUTER_NAVIGATED, RouterReducerState } from '@ngrx/router-store';
import * as fromRouter from '@ngrx/router-store'; import * as fromRouter from '@ngrx/router-store';
import { createEffect, Actions, ofType } from '@ngrx/effects'; import { ROUTER_NAVIGATED, RouterReducerState } from '@ngrx/router-store';
import { Action, Store, createFeatureSelector } from '@ngrx/store';
import { EMPTY, Observable, of } from 'rxjs'; import { EMPTY, Observable, of } from 'rxjs';
import { withLatestFrom, switchMap, map, catchError, mergeMap } from 'rxjs/operators'; import { catchError, map, mergeMap, switchMap, withLatestFrom } from 'rxjs/operators';
import { GeoJSON, WKT } from 'ol/format';
import { Feature } from 'ol'; import { Feature } from 'ol';
import { getCenter, createEmpty, extend } from 'ol/extent'; import { createEmpty, extend, getCenter } from 'ol/extent';
import { Point, Geometry } from 'ol/geom' import { GeoJSON, WKT } from 'ol/format';
import { Geometry, Point } from 'ol/geom';
import { commonReducers } from '@farmmaps/common';
import * as mapActions from '../actions/map.actions'; import * as mapActions from '../actions/map.actions';
import * as mapReducers from '../reducers/map.reducer'; import * as mapReducers from '../reducers/map.reducer';
import { commonReducers } from '@farmmaps/common';
import { commonActions } from '@farmmaps/common'; import { commonActions } from '@farmmaps/common';
import { IItem } from '@farmmaps/common'; import { IItem, ItemService } from '@farmmaps/common';
import { FolderService, ItemService } from '@farmmaps/common';
import { tassign } from 'tassign'; import { tassign } from 'tassign';
import { FeatureIconService } from '../services/feature-icon.service'; import { FeatureIconService } from '../services/feature-icon.service';
import * as style from 'ol/style'; import * as style from 'ol/style';
import { ItemTypeService, IQueryState } from '@farmmaps/common'; import { IQueryState } from '@farmmaps/common';
import { TemporalItemLayer } from '../models/item.layer' import { TemporalItemLayer } from '../models/item.layer';
export const getRouterState = createFeatureSelector<RouterReducerState>('router'); export const getRouterState = createFeatureSelector<RouterReducerState>('router');
@ -65,7 +64,7 @@ export class MapEffects {
init$ = createEffect(() => this.actions$.pipe( init$ = createEffect(() => this.actions$.pipe(
ofType(mapActions.INIT), ofType(mapActions.INIT),
withLatestFrom(this.store$.select(commonReducers.selectGetRootItems)), withLatestFrom(this.store$.select(commonReducers.selectGetRootItems)),
switchMap(([action, rootItems]) => { switchMap(([, rootItems]) => {
const actions = []; const actions = [];
for (const rootItem of rootItems) { for (const rootItem of rootItems) {
if (rootItem.itemType == "UPLOADS_FOLDER") actions.push(new mapActions.SetParent(rootItem.code)); if (rootItem.itemType == "UPLOADS_FOLDER") actions.push(new mapActions.SetParent(rootItem.code));
@ -107,12 +106,12 @@ export class MapEffects {
initBaseLayers$ = createEffect(() => this.actions$.pipe( initBaseLayers$ = createEffect(() => this.actions$.pipe(
ofType(mapActions.INIT), ofType(mapActions.INIT),
withLatestFrom(this.store$.select(mapReducers.selectGetProjection)), withLatestFrom(this.store$.select(mapReducers.selectGetProjection)),
map(([action, projection]) => new mapActions.LoadBaseLayers(projection))) map(([, projection]) => new mapActions.LoadBaseLayers(projection)))
); );
loadBaseLayers$ = createEffect(() => this.actions$.pipe( loadBaseLayers$ = createEffect(() => this.actions$.pipe(
ofType(mapActions.LOADBASELAYERS), ofType(mapActions.LOADBASELAYERS),
switchMap((action: mapActions.LoadBaseLayers) => { switchMap(() => {
return this.itemService$.getItemList("vnd.farmmaps.itemtype.layer", { "isBaseLayer": true }).pipe( return this.itemService$.getItemList("vnd.farmmaps.itemtype.layer", { "isBaseLayer": true }).pipe(
map((items: IItem[]) => new mapActions.LoadBaseLayersSuccess(items)), map((items: IItem[]) => new mapActions.LoadBaseLayersSuccess(items)),
catchError(error => of(new commonActions.Fail(error)))); catchError(error => of(new commonActions.Fail(error))));
@ -178,7 +177,7 @@ export class MapEffects {
hideMenu$ = createEffect(() => this.actions$.pipe( hideMenu$ = createEffect(() => this.actions$.pipe(
ofType(mapActions.STARTSEARCHSUCCESS), ofType(mapActions.STARTSEARCHSUCCESS),
mergeMap((action: mapActions.StartSearchSuccess) => { mergeMap(() => {
return of(new commonActions.SetMenuVisible(false)); return of(new commonActions.SetMenuVisible(false));
}))); })));
@ -336,7 +335,7 @@ export class MapEffects {
ofType(mapActions.ADDLAYER, mapActions.REMOVELAYER, mapActions.SELECTITEMSUCCESS, mapActions.SELECTTEMPORALITEMSSUCCESS, mapActions.NEXTTEMPORAL, mapActions.PREVIOUSTEMPORAL, mapActions.TOGGLELAYERVALUESENABLED, mapActions.SETLAYERINDEX, mapActions.SETSELECTEDITEMLAYER), ofType(mapActions.ADDLAYER, mapActions.REMOVELAYER, mapActions.SELECTITEMSUCCESS, mapActions.SELECTTEMPORALITEMSSUCCESS, mapActions.NEXTTEMPORAL, mapActions.PREVIOUSTEMPORAL, mapActions.TOGGLELAYERVALUESENABLED, mapActions.SETLAYERINDEX, mapActions.SETSELECTEDITEMLAYER),
withLatestFrom(this.store$.select(mapReducers.selectGetLayerValuesX)), withLatestFrom(this.store$.select(mapReducers.selectGetLayerValuesX)),
withLatestFrom(this.store$.select(mapReducers.selectGetLayerValuesY)), withLatestFrom(this.store$.select(mapReducers.selectGetLayerValuesY)),
map(([[action, x], y]) => new mapActions.SetLayerValuesLocation(x, y)) map(([[, x], y]) => new mapActions.SetLayerValuesLocation(x, y))
)); ));
@ -402,7 +401,7 @@ export class MapEffects {
}) })
)); ));
constructor(private actions$: Actions, private store$: Store<mapReducers.State>, private folderService$: FolderService, private itemService$: ItemService, private featureIconService$: FeatureIconService, private itemTypeService$: ItemTypeService) { constructor(private actions$: Actions, private store$: Store<mapReducers.State>, private itemService$: ItemService, private featureIconService$: FeatureIconService) {
this._geojsonFormat = new GeoJSON(); this._geojsonFormat = new GeoJSON();
this._wktFormat = new WKT(); this._wktFormat = new WKT();
} }

View File

@ -1,5 +1,5 @@
import { IItem,IListItem } from '@farmmaps/common'; import { IItem } from '@farmmaps/common';
import {Layer} from 'ol/layer'; import { Layer } from 'ol/layer';
import { Source } from 'ol/source'; import { Source } from 'ol/source';
export interface IItemLayer { export interface IItemLayer {

View File

@ -1,21 +1,15 @@
import { tassign } from 'tassign'; import { IItem, IQueryState, commonActions } from '@farmmaps/common';
import { IItem,Item } from '@farmmaps/common';
import { IItemLayer,ItemLayer,ITemporalItemLayer,TemporalItemLayer} from '../models/item.layer';
import { IMapState} from '../models/map.state';
import { IQueryState} from '@farmmaps/common';
import { IPeriodState } from '../models/period.state';
import { IStyles} from '../models/style.cache';
import { ILayervalue } from '../models/layer.value';
import * as mapActions from '../actions/map.actions';
import {commonActions} from '@farmmaps/common';
import { createSelector, createFeatureSelector } from '@ngrx/store';
import {Feature} from 'ol';
import {Geometry} from 'ol/geom';
import { ROUTER_NAVIGATION, RouterNavigationAction } from '@ngrx/router-store'; import { ROUTER_NAVIGATION, RouterNavigationAction } from '@ngrx/router-store';
import { createFeatureSelector, createSelector } from '@ngrx/store';
import { Feature } from 'ol';
import { Geometry } from 'ol/geom';
import { tassign } from 'tassign';
import * as mapActions from '../actions/map.actions';
import { IItemLayer, ITemporalItemLayer, ItemLayer, TemporalItemLayer } from '../models/item.layer';
import { ILayervalue } from '../models/layer.value';
import { IMapState } from '../models/map.state';
import { IPeriodState } from '../models/period.state';
import { IStyles } from '../models/style.cache';
import { MODULE_NAME } from '../module-name'; import { MODULE_NAME } from '../module-name';
const startDate:Date = new Date(new Date(Date.now()).getFullYear(), new Date(Date.now()).getMonth() - 3, 1); const startDate:Date = new Date(new Date(Date.now()).getFullYear(), new Date(Date.now()).getMonth() - 3, 1);
@ -125,7 +119,6 @@ export const initialState: State = {
export function reducer(state = initialState, action: mapActions.Actions | commonActions.Actions | RouterNavigationAction): State { export function reducer(state = initialState, action: mapActions.Actions | commonActions.Actions | RouterNavigationAction): State {
switch (action.type) { switch (action.type) {
case ROUTER_NAVIGATION: { case ROUTER_NAVIGATION: {
const a = action as RouterNavigationAction;
return tassign(state); return tassign(state);
} }
case mapActions.SETMAPSTATE: { case mapActions.SETMAPSTATE: {
@ -287,9 +280,6 @@ export function reducer(state = initialState, action: mapActions.Actions | commo
return state; return state;
} }
} }
case mapActions.SELECTTEMPORAL:{
//todo implement
}
case mapActions.STARTSEARCH: { case mapActions.STARTSEARCH: {
const a = action as mapActions.StartSearch; const a = action as mapActions.StartSearch;
const panelVisible = a.queryState.itemCode!=null ||a.queryState.itemType!=null||a.queryState.parentCode!=null || a.queryState.query != null || a.queryState.tags != null; const panelVisible = a.queryState.itemCode!=null ||a.queryState.itemType!=null||a.queryState.parentCode!=null || a.queryState.query != null || a.queryState.tags != null;
@ -338,8 +328,7 @@ export function reducer(state = initialState, action: mapActions.Actions | commo
case mapActions.UPDATEFEATURESUCCESS: { case mapActions.UPDATEFEATURESUCCESS: {
const a = action as mapActions.UpdateFeatureSuccess; const a = action as mapActions.UpdateFeatureSuccess;
const features: any[] = []; const features: any[] = [];
var index = -1; for (let i = 0; i < state.features.length; i++) {
for (var i = 0; i < state.features.length; i++) {
if (state.features[i].getId() == a.feature.getId()) { if (state.features[i].getId() == a.feature.getId()) {
features.push(a.feature); features.push(a.feature);
} else { } else {
@ -419,7 +408,7 @@ export function reducer(state = initialState, action: mapActions.Actions | commo
const a = action as mapActions.SetLayerIndex; const a = action as mapActions.SetLayerIndex;
if (a.itemLayer == null) { if (a.itemLayer == null) {
if(state.selectedItemLayer.item.itemType == "vnd.farmmaps.itemtype.temporal") { if(state.selectedItemLayer.item.itemType == "vnd.farmmaps.itemtype.temporal") {
var newItemlayer = tassign(state.selectedItemLayer,{layerIndex:a.layerIndex}); const newItemlayer = tassign(state.selectedItemLayer,{layerIndex:a.layerIndex});
const tl = newItemlayer as ITemporalItemLayer; const tl = newItemlayer as ITemporalItemLayer;
if(tl.previousItemLayer) { if(tl.previousItemLayer) {
const nl = new ItemLayer(tl.previousItemLayer.item); const nl = new ItemLayer(tl.previousItemLayer.item);
@ -443,6 +432,7 @@ export function reducer(state = initialState, action: mapActions.Actions | commo
tl.nextItemLayer = nl; tl.nextItemLayer = nl;
} }
} else { } else {
// eslint-disable-next-line no-var
var newItemlayer = new ItemLayer(state.selectedItemLayer.item); var newItemlayer = new ItemLayer(state.selectedItemLayer.item);
newItemlayer.layerIndex = a.layerIndex; newItemlayer.layerIndex = a.layerIndex;
@ -464,7 +454,7 @@ export function reducer(state = initialState, action: mapActions.Actions | commo
baseLayers.push(l); baseLayers.push(l);
} }
let selectedBaseLayer: IItemLayer = null; let selectedBaseLayer: IItemLayer = null;
var mapState = tassign(state.mapState); const mapState = tassign(state.mapState);
const sb = baseLayers.filter(layer => layer.item.code === mapState.baseLayerCode); const sb = baseLayers.filter(layer => layer.item.code === mapState.baseLayerCode);
const db = baseLayers.filter(layer => layer.item.data && layer.item.data.default === true); const db = baseLayers.filter(layer => layer.item.data && layer.item.data.default === true);
if (baseLayers.length > 0 && mapState.baseLayerCode != "" && sb.length>0) { if (baseLayers.length > 0 && mapState.baseLayerCode != "" && sb.length>0) {
@ -486,7 +476,7 @@ export function reducer(state = initialState, action: mapActions.Actions | commo
baseLayers.forEach((l) => l.visible = false); baseLayers.forEach((l) => l.visible = false);
const i = state.baseLayers.indexOf(a.itemLayer); const i = state.baseLayers.indexOf(a.itemLayer);
baseLayers[i].visible = true; baseLayers[i].visible = true;
var mapState = tassign(state.mapState); const mapState = tassign(state.mapState);
mapState.baseLayerCode = a.itemLayer.item.code; mapState.baseLayerCode = a.itemLayer.item.code;
return tassign(state, {mapState:mapState, baseLayers:baseLayers,selectedBaseLayer:a.itemLayer }); return tassign(state, {mapState:mapState, baseLayers:baseLayers,selectedBaseLayer:a.itemLayer });
} }
@ -560,8 +550,8 @@ export function reducer(state = initialState, action: mapActions.Actions | commo
}); });
} }
if(state.features.length>0) { if(state.features.length>0) {
var index = -1; let index = -1;
for (var i = 0; i < state.features.length; i++) { for (let i = 0; i < state.features.length; i++) {
if (state.features[i].getId() == a.itemCode ) { if (state.features[i].getId() == a.itemCode ) {
index=i; index=i;
} }

View File

@ -15,7 +15,6 @@ export class DeviceOrientationService {
// Calculate equation components // Calculate equation components
const cA = Math.cos(alphaRad); const cA = Math.cos(alphaRad);
const sA = Math.sin(alphaRad); const sA = Math.sin(alphaRad);
const cB = Math.cos(betaRad);
const sB = Math.sin(betaRad); const sB = Math.sin(betaRad);
const cG = Math.cos(gammaRad); const cG = Math.cos(gammaRad);
const sG = Math.sin(gammaRad); const sG = Math.sin(gammaRad);
@ -23,7 +22,6 @@ export class DeviceOrientationService {
// Calculate A, B, C rotation components // Calculate A, B, C rotation components
const rA = - cA * sG - sA * sB * cG; const rA = - cA * sG - sA * sB * cG;
const rB = - sA * sG + cA * sB * cG; const rB = - sA * sG + cA * sB * cG;
const rC = - cB * cG;
// Calculate compass heading // Calculate compass heading
let compassHeading = Math.atan(rA / rB); let compassHeading = Math.atan(rA / rB);

View File

@ -1,8 +1,4 @@
import { Injectable} from '@angular/core'; import { Injectable } from '@angular/core';
import { Feature } from 'ol';
import { Point } from 'ol/geom';
import * as extent from 'ol/extent';
@Injectable() @Injectable()
export class FeatureIconService { export class FeatureIconService {

View File

@ -1,5 +1,5 @@
import { Injectable } from '@angular/core'; import { Injectable } from '@angular/core';
import { Observer, Observable,BehaviorSubject } from 'rxjs'; import { BehaviorSubject, Observable } from 'rxjs';
/** /**
* GeolocationService class. * GeolocationService class.

View File

@ -1,7 +1,7 @@
import { Injectable} from '@angular/core'; import { DatePipe } from '@angular/common';
import {DatePipe} from '@angular/common'; import { Injectable } from '@angular/core';
import {TimespanService} from '@farmmaps/common'; import { TimespanService } from '@farmmaps/common';
import { IItemLayer, ITemporalItemLayer,TemporalItemLayer} from '../models/item.layer'; import { IItemLayer, ITemporalItemLayer } from '../models/item.layer';
@Injectable() @Injectable()

View File

@ -22,7 +22,9 @@
"node_modules/@angular/*" "node_modules/@angular/*"
] ]
} },
"noUnusedLocals": true,
"noUnusedParameters": true
}, },
"angularCompilerOptions": { "angularCompilerOptions": {
"skipTemplateCodegen": true, "skipTemplateCodegen": true,

View File

@ -22,7 +22,9 @@
"node_modules/@angular/*" "node_modules/@angular/*"
] ]
} },
"noUnusedLocals": true,
"noUnusedParameters": true
}, },
"angularCompilerOptions": { "angularCompilerOptions": {
"skipTemplateCodegen": true, "skipTemplateCodegen": true,

View File

@ -18,5 +18,6 @@ module.exports = {
"@typescript-eslint" "@typescript-eslint"
], ],
"rules": { "rules": {
"@typescript-eslint/no-explicit-any": "off"
} }
} }

View File

@ -1 +1 @@
<div *fmHasPackage="'vnd.farmmaps.itemtype.package.3d'" (click)="handleClick($event)" class="btn btn-outline-primary twotreed"><i class="fas fa-spinner fa-spin loading" [ngClass]="{'loading':loading}"></i>{{label}}</div> <div *fmHasPackage="'vnd.farmmaps.itemtype.package.3d'" (click)="handleClick()" class="btn btn-outline-primary twotreed"><i class="fas fa-spinner fa-spin loading" [ngClass]="{'loading':loading}"></i>{{label}}</div>

View File

@ -1,11 +1,11 @@
import { Component, OnInit,Input,Host } from '@angular/core'; import { Component, Input } from '@angular/core';
import { Interaction} from 'ol/interaction'; import { mapActions, mapReducers } from '@farmmaps/common-map';
import { Store } from '@ngrx/store';
import { MapComponent } from 'ng-openlayers'; import { MapComponent } from 'ng-openlayers';
import { Interaction } from 'ol/interaction';
import OLCesium from 'olcs/OLCesium'; import OLCesium from 'olcs/OLCesium';
import RasterSynchronizer from 'olcs/RasterSynchronizer'; import RasterSynchronizer from 'olcs/RasterSynchronizer';
import VectorSynchronizer from 'olcs/VectorSynchronizer'; import VectorSynchronizer from 'olcs/VectorSynchronizer';
import { mapReducers,mapActions } from '@farmmaps/common-map';
import { Store } from '@ngrx/store';
@Component({ @Component({
selector: 'fm-map3d-switch2d3d', selector: 'fm-map3d-switch2d3d',
@ -61,7 +61,7 @@ export class Switch2D3DComponent {
}); });
} }
handleClick(event) { handleClick() {
this.enable = !this.enable; this.enable = !this.enable;
if(this.enable) { if(this.enable) {
this.store.dispatch(new mapActions.SetViewState(false)); this.store.dispatch(new mapActions.SetViewState(false));

View File

@ -23,7 +23,9 @@
"node_modules/@angular/*" "node_modules/@angular/*"
] ]
} },
"noUnusedLocals": true,
"noUnusedParameters": true
}, },
"angularCompilerOptions": { "angularCompilerOptions": {
"skipTemplateCodegen": true, "skipTemplateCodegen": true,

View File

@ -23,7 +23,9 @@
"node_modules/@angular/*" "node_modules/@angular/*"
] ]
} },
"noUnusedLocals": true,
"noUnusedParameters": true
}, },
"angularCompilerOptions": { "angularCompilerOptions": {
"skipTemplateCodegen": true, "skipTemplateCodegen": true,

View File

@ -18,5 +18,6 @@ module.exports = {
"@typescript-eslint" "@typescript-eslint"
], ],
"rules": { "rules": {
"@typescript-eslint/no-explicit-any": "off"
} }
} }

View File

@ -1,12 +1,11 @@
import {NgModule} from '@angular/core'; import { NgModule } from '@angular/core';
import {RouterModule} from '@angular/router'; import { RouterModule } from '@angular/router';
import {AuthCallbackComponent} from './components/auth-callback/auth-callback.component'; import { AuthCallbackComponent } from './components/auth-callback/auth-callback.component';
import {AuthCallbackGuard} from './components/auth-callback/auth-callback.guard'; import { NotFoundComponent } from './components/not-found/not-found.component';
import {NavBarGuard} from './services/nav-bar-guard.service'; import { SessionClearedComponent } from './components/session-cleared/session-cleared.component';
import {FullScreenGuard} from './services/full-screen-guard.service'; import { FullScreenGuard } from './services/full-screen-guard.service';
import {SessionClearedComponent} from './components/session-cleared/session-cleared.component'; import { NavBarGuard } from './services/nav-bar-guard.service';
import {NotFoundComponent} from './components/not-found/not-found.component';
import { ProductionGuard } from './services/production-guard.service'; import { ProductionGuard } from './services/production-guard.service';

View File

@ -1,16 +1,16 @@
// angular modules // angular modules
import { NgModule, APP_INITIALIZER, ModuleWithProviders, Injector, Optional, SkipSelf,InjectionToken } from '@angular/core'; import { CommonModule } from '@angular/common';
import { CommonModule, DatePipe } from '@angular/common'; import { HttpClientModule } from '@angular/common/http';
import { HttpClientModule, HttpClient, HTTP_INTERCEPTORS } from '@angular/common/http'; import { InjectionToken, NgModule } from '@angular/core';
import { FormsModule } from '@angular/forms'; import { FormsModule } from '@angular/forms';
// external modules // external modules
import { OAuthModule, AuthConfig, OAuthService, OAuthStorage } from 'angular-oauth2-oidc';
import { StoreModule, Store } from '@ngrx/store';
import { EffectsModule } from '@ngrx/effects';
import { NgbModule } from '@ng-bootstrap/ng-bootstrap'; import { NgbModule } from '@ng-bootstrap/ng-bootstrap';
import { UploadxModule } from 'ngx-uploadx'; import { EffectsModule } from '@ngrx/effects';
import { StoreModule } from '@ngrx/store';
import { OAuthModule } from 'angular-oauth2-oidc';
import { ClipboardModule } from 'ngx-clipboard'; import { ClipboardModule } from 'ngx-clipboard';
import { UploadxModule } from 'ngx-uploadx';
// routing module // routing module
@ -19,111 +19,67 @@ import { AppCommonRoutingModule } from './common-routing.module';
import { MODULE_NAME } from './module-name'; import { MODULE_NAME } from './module-name';
//components //components
import { SafePipe } from './shared/safe.pipe';
import { AuthConfigFactory, IAuthconfigFactory } from './shared/authconfigFactory';
import { AppComponent } from './components/app/app.component';
import { AuthCallbackComponent } from './components/auth-callback/auth-callback.component';
import { SessionClearedComponent } from './components/session-cleared/session-cleared.component';
import { ResumableFileUploadComponent } from './components/resumable-file-upload/resumable-file-upload.component';
import { NotFoundComponent } from './components/not-found/not-found.component';
import { NotImplementedComponent } from './components/not-implemented/not-implemented.component';
import { SidePanelComponent } from './components/side-panel/side-panel.component';
import { TimespanComponent } from './components/timespan/timespan.component';
import { TagInputComponent } from './components/tag-input/tag-input.component';
import { MenuBackgroundComponent } from './components/menu-background/menu-background.component';
import { HasPackageDirective} from './components/has-package/has-package.directive';
import { PackageExistsDirective} from './components/package-exists/package-exists.directive';
import { HasClaimDirective } from './components/has-claim/has-claim.directive';
import { HasRoleDirective } from './components/has-role/has-role.directive';
import { UserMenuComponent} from './components/user-menu/user-menu.component';
import { ThumbnailComponent } from './components/thumbnail/thumbnail.component';
import { Alert } from './enumerations/alert.enum';
import { IEventMessage } from './models/event.message';
import { IItem, Item } from './models/item';
import { WeatherCurrentObservation } from './models/weatherCurrentObservation';
import { IItemType } from './models/item.type';
import { IItemLinkType} from './models/itemlink.type';
import {IUrlType} from './models/url.type';
import { IItemTypes } from './models/item.types';
import { IItemTask, ItemTask } from './models/itemTask';
import { IListItem } from './models/list.item';
import { ITypeaheadItem } from './models/typeahead.item'
import { IJsonline } from './models/json-line';
import { ISenMLItem } from './models/senml-item';
import { IPackage,IPackages } from './models/package';
import { IUser } from './models/user';
import { IQueryState } from './models/query.state';
import { IDataLayer } from './models/data.layer';
import { IColor,IGradientstop} from './models/gradient';
import * as commonActions from './actions/app-common.actions';
import * as commonReducers from './reducers/app-common.reducer';
import * as commonEffects from './effects/app-common.effects';
import { SecureOAuthStorage} from './shared/secureOAuthStorage';
import { GradientComponent } from './components/gradient/gradient.component';
import { GradientSelectComponent } from './components/gradient-select/gradient-select.component';
import { AppMenuComponent } from './components/app-menu/app-menu.component';
import { NotificationMenuComponent} from './components/notification-menu/notification-menu.component';
import { HelpMenuComponent} from './components/help-menu/help-menu.component';
import { BackButtonComponent } from './components/back-button/back-button.component';
import { EditImageModalComponent } from './components/edit-image-modal/edit-image-modal.component';
import { AvatarComponent } from './components/avatar/avatar.component';
import { ItemLinkComponent } from './components/item-link/item-link.component';
import { AvatarModule } from 'ngx-avatars'; import { AvatarModule } from 'ngx-avatars';
import { ImageCropperModule } from 'ngx-image-cropper'; import { ImageCropperModule } from 'ngx-image-cropper';
import * as commonActions from './actions/app-common.actions';
import { AppMenuComponent } from './components/app-menu/app-menu.component';
import { AppComponent } from './components/app/app.component';
import { AuthCallbackComponent } from './components/auth-callback/auth-callback.component';
import { AvatarComponent } from './components/avatar/avatar.component';
import { BackButtonComponent } from './components/back-button/back-button.component';
import { EditImageModalComponent } from './components/edit-image-modal/edit-image-modal.component';
import { GradientSelectComponent } from './components/gradient-select/gradient-select.component';
import { GradientComponent } from './components/gradient/gradient.component';
import { HasClaimDirective } from './components/has-claim/has-claim.directive';
import { HasPackageDirective } from './components/has-package/has-package.directive';
import { HasRoleDirective } from './components/has-role/has-role.directive';
import { HelpMenuComponent } from './components/help-menu/help-menu.component';
import { ItemLinkComponent } from './components/item-link/item-link.component';
import { MenuBackgroundComponent } from './components/menu-background/menu-background.component';
import { NotFoundComponent } from './components/not-found/not-found.component';
import { NotImplementedComponent } from './components/not-implemented/not-implemented.component';
import { NotificationMenuComponent } from './components/notification-menu/notification-menu.component';
import { PackageExistsDirective } from './components/package-exists/package-exists.directive';
import { ResumableFileUploadComponent } from './components/resumable-file-upload/resumable-file-upload.component';
import { SessionClearedComponent } from './components/session-cleared/session-cleared.component';
import { SidePanelComponent } from './components/side-panel/side-panel.component';
import { TagInputComponent } from './components/tag-input/tag-input.component';
import { ThumbnailComponent } from './components/thumbnail/thumbnail.component';
import { TimespanComponent } from './components/timespan/timespan.component';
import { UserMenuComponent } from './components/user-menu/user-menu.component';
import * as commonEffects from './effects/app-common.effects';
import { Alert } from './enumerations/alert.enum';
import { IDataLayer } from './models/data.layer';
import { IEventMessage } from './models/event.message';
import { IColor, IGradientstop } from './models/gradient';
import { IItem, Item } from './models/item';
import { IItemType } from './models/item.type';
import { IItemTypes } from './models/item.types';
import { IItemTask, ItemTask } from './models/itemTask';
import { IItemLinkType } from './models/itemlink.type';
import { IJsonline } from './models/json-line';
import { IListItem } from './models/list.item';
import { IPackage, IPackages } from './models/package';
import { IQueryState } from './models/query.state';
import { ISenMLItem } from './models/senml-item';
import { ITypeaheadItem } from './models/typeahead.item';
import { IUrlType } from './models/url.type';
import { IUser } from './models/user';
import { WeatherCurrentObservation } from './models/weatherCurrentObservation';
import * as commonReducers from './reducers/app-common.reducer';
import { AuthConfigFactory, IAuthconfigFactory } from './shared/authconfigFactory';
import { SafePipe } from './shared/safe.pipe';
import { SecureOAuthStorage } from './shared/secureOAuthStorage';
export const FM_COMMON_STARTPAGE = new InjectionToken<string>('fm-common-startpage'); export const FM_COMMON_STARTPAGE = new InjectionToken<string>('fm-common-startpage');
export { export {
SafePipe, Alert, AppComponent, AuthCallbackComponent, AuthConfigFactory, AvatarComponent, BackButtonComponent, EditImageModalComponent,
AuthCallbackComponent,
AppComponent,
SessionClearedComponent,
ResumableFileUploadComponent,
NotFoundComponent,
NotImplementedComponent,
SidePanelComponent,
TimespanComponent,
TagInputComponent,
UserMenuComponent,
ThumbnailComponent,
HasPackageDirective,
PackageExistsDirective,
HasClaimDirective,
HasRoleDirective,
Alert,
IEventMessage,
IItem,
Item,
IItemType,
IItemLinkType,
IUrlType,
IItemTypes,
IItemTask,
ItemTask,
IListItem,
ITypeaheadItem,
IUser,
IQueryState,
IPackage,
IPackages,
commonActions,
commonReducers,
IAuthconfigFactory,
AuthConfigFactory,
MenuBackgroundComponent,
SecureOAuthStorage,
WeatherCurrentObservation,
IJsonline,
ISenMLItem,
IDataLayer,
IColor,
IGradientstop,
BackButtonComponent,
AvatarComponent,
ItemLinkComponent,
EditImageModalComponent,
GradientComponent, GradientComponent,
GradientSelectComponent GradientSelectComponent, HasClaimDirective, HasPackageDirective, HasRoleDirective, IAuthconfigFactory, IColor, IDataLayer, IEventMessage, IGradientstop, IItem, IItemLinkType, IItemTask, IItemType, IItemTypes, IJsonline, IListItem, IPackage,
IPackages, IQueryState, ISenMLItem, ITypeaheadItem, IUrlType, IUser, Item, ItemLinkComponent, ItemTask, MenuBackgroundComponent, NotFoundComponent,
NotImplementedComponent, PackageExistsDirective, ResumableFileUploadComponent, SafePipe, SecureOAuthStorage, SessionClearedComponent, SidePanelComponent, TagInputComponent, ThumbnailComponent, TimespanComponent, UserMenuComponent, WeatherCurrentObservation, commonActions,
commonReducers
}; };
@NgModule({ @NgModule({

View File

@ -1,4 +1,4 @@
<div class="app fullscreen" (click)="handleClick($event)" [ngClass]="{'fullscreen' :(fullScreen|async),'pagemode':(isPageMode|async),'appmode':!(isPageMode|async)}"> <div class="app fullscreen" (click)="handleClick()" [ngClass]="{'fullscreen' :(fullScreen|async),'pagemode':(isPageMode|async),'appmode':!(isPageMode|async)}">
<nav class="navbar navbar-light navbar-expand bg-light navigation-clean"> <nav class="navbar navbar-light navbar-expand bg-light navigation-clean">
<div class="container-fluid p-3 justify-content-start"> <div class="container-fluid p-3 justify-content-start">
<div class="header-logo pageonly"><router-outlet name="header-logo"></router-outlet></div> <div class="header-logo pageonly"><router-outlet name="header-logo"></router-outlet></div>
@ -20,7 +20,7 @@
<div class="container-fluid"> <div class="container-fluid">
<div class="body"> <div class="body">
<div class="d-flex flex-row"> <div class="d-flex flex-row">
<div class="mt-2 mb-2 flex-grow-1 logo" (click)="handleHome($event)"><router-outlet name="side-panel-logo"></router-outlet></div> <div class="mt-2 mb-2 flex-grow-1 logo" (click)="handleHome()"><router-outlet name="side-panel-logo"></router-outlet></div>
<div class="mt-2 mb-2 ms-2"><button type="button" class="btn btn-outline-secondary" (click)="handleToggleMenu($event)"><i class="fal fa-times" aria-hidden="true"></i></button></div> <div class="mt-2 mb-2 ms-2"><button type="button" class="btn btn-outline-secondary" (click)="handleToggleMenu($event)"><i class="fal fa-times" aria-hidden="true"></i></button></div>
</div> </div>
<div class="d-flex flex-column cards"> <div class="d-flex flex-column cards">

View File

@ -1,21 +1,18 @@
import { Component, OnInit, OnDestroy, Inject, Optional, ViewEncapsulation, RendererFactory2, PLATFORM_ID, ChangeDetectionStrategy, HostListener, Input } from '@angular/core'; import { ChangeDetectionStrategy, Component, HostListener, Inject, Input, OnDestroy, OnInit, Optional, ViewEncapsulation } from '@angular/core';
import { Router, NavigationStart, NavigationEnd, RouteConfigLoadStart, RouteConfigLoadEnd, ActivatedRoute, PRIMARY_OUTLET } from '@angular/router'; import { NavigationEnd, NavigationStart, RouteConfigLoadEnd, RouteConfigLoadStart, Router } from '@angular/router';
import { Meta, Title, MetaDefinition } from '@angular/platform-browser'; import { DOCUMENT } from "@angular/common"; import { Action, Store } from '@ngrx/store';
import { Subscription, Observable } from 'rxjs'; import { OAuthErrorEvent, OAuthService } from 'angular-oauth2-oidc';
import { Observable, Subscription } from 'rxjs';
import { distinctUntilChanged } from 'rxjs/operators'; import { distinctUntilChanged } from 'rxjs/operators';
import { Store, Action } from '@ngrx/store';
import { IUser } from '../../models/user';
import { OAuthService, OAuthErrorEvent } from 'angular-oauth2-oidc';
import { FM_COMMON_STARTPAGE } from '../../common.module'; import { FM_COMMON_STARTPAGE } from '../../common.module';
import { IUser } from '../../models/user';
//AppCommon //AppCommon
import * as commonActions from '../../actions/app-common.actions';
import { IEventMessage } from '../../models/event.message'; import { IEventMessage } from '../../models/event.message';
import { IListItem } from '../../models/list.item'; import { IListItem } from '../../models/list.item';
import { EventService } from '../../services/event.service'; import { EventService } from '../../services/event.service';
import { ItemTypeService } from '../../services/itemtype.service';
import * as commonActions from '../../actions/app-common.actions';
import { HealthCheckService } from '../../services/healthcheck.service'; import { HealthCheckService } from '../../services/healthcheck.service';
import { AppConfig } from '../../shared/app.config';
import * as appReducers from '../../reducers/app-common.reducer'; import * as appReducers from '../../reducers/app-common.reducer';
@ -27,12 +24,6 @@ import * as appReducers from '../../reducers/app-common.reducer';
changeDetection: ChangeDetectionStrategy.OnPush changeDetection: ChangeDetectionStrategy.OnPush
}) })
export class AppComponent implements OnInit, OnDestroy { export class AppComponent implements OnInit, OnDestroy {
// This will go at the END of your title for example "Home - Angular Universal..." <-- after the dash (-)
private endPageTitle = 'Farmmaps';
// If no Title is provided, we'll use a default one before the dash(-)
private defaultPageTitle = 'Farmmaps';
private routerSub$: Subscription; private routerSub$: Subscription;
private eventSub$: Subscription; private eventSub$: Subscription;
@ -54,19 +45,12 @@ export class AppComponent implements OnInit, OnDestroy {
constructor( constructor(
@Optional() @Inject(FM_COMMON_STARTPAGE) public startPage: string, @Optional() @Inject(FM_COMMON_STARTPAGE) public startPage: string,
public router: Router, public router: Router,
private activatedRoute$: ActivatedRoute,
private title$: Title,
private meta$: Meta,
private store$: Store<appReducers.State>, private store$: Store<appReducers.State>,
private eventService$: EventService, private eventService$: EventService,
private healthCheckService$: HealthCheckService, private healthCheckService$: HealthCheckService,
private itemTypeService$: ItemTypeService, private oauthService$: OAuthService) {
private oauthService$: OAuthService,
private appConfig$: AppConfig
) {
} }
getActionFromEvent(event: IEventMessage): Action { getActionFromEvent(event: IEventMessage): Action {
let action: Action = null; let action: Action = null;
//console.debug(`${event.eventType} Event received`); //console.debug(`${event.eventType} Event received`);
@ -163,30 +147,28 @@ export class AppComponent implements OnInit, OnDestroy {
} }
private InstallRouteEventHandler() { private InstallRouteEventHandler() {
const other = this;
this.routerSub$ = this.router.events.subscribe(event => { this.routerSub$ = this.router.events.subscribe(event => {
if (event instanceof RouteConfigLoadStart) { if (event instanceof RouteConfigLoadStart) {
other.store$.dispatch(new commonActions.StartRouteLoading()); this.store$.dispatch(new commonActions.StartRouteLoading());
} }
if (event instanceof NavigationEnd && (event.url == "/" || event.url.startsWith("/content"))) { if (event instanceof NavigationEnd && (event.url == "/" || event.url.startsWith("/content"))) {
other.store$.dispatch(new commonActions.SetPageMode(true)); this.store$.dispatch(new commonActions.SetPageMode(true));
} else if (event instanceof NavigationEnd) { } else if (event instanceof NavigationEnd) {
other.store$.dispatch(new commonActions.SetPageMode(false)); this.store$.dispatch(new commonActions.SetPageMode(false));
} }
if (event instanceof RouteConfigLoadEnd) { if (event instanceof RouteConfigLoadEnd) {
other.store$.dispatch(new commonActions.EndRouteLoading()); this.store$.dispatch(new commonActions.EndRouteLoading());
} }
if (event instanceof NavigationStart) { if (event instanceof NavigationStart) {
other.store$.dispatch(new commonActions.SetMenuVisible(false)); this.store$.dispatch(new commonActions.SetMenuVisible(false));
} }
}); });
} }
private InstallEventServiceEventHandler() { private InstallEventServiceEventHandler() {
const other = this;
this.eventSub$ = this.eventService$.event.subscribe(event => { this.eventSub$ = this.eventService$.event.subscribe(event => {
const action = other.getActionFromEvent(event); const action = this.getActionFromEvent(event);
if (action) other.store$.dispatch(action); if (action) this.store$.dispatch(action);
}); });
} }
@ -201,7 +183,7 @@ export class AppComponent implements OnInit, OnDestroy {
}); });
} }
handleClick(event: MouseEvent) { handleClick() {
this.store$.dispatch(new commonActions.Escape(false, true)); this.store$.dispatch(new commonActions.Escape(false, true));
} }
@ -214,7 +196,7 @@ export class AppComponent implements OnInit, OnDestroy {
this.store$.dispatch(new commonActions.ToggleMenu()); this.store$.dispatch(new commonActions.ToggleMenu());
} }
handleHome(event: MouseEvent) { handleHome() {
this.router.navigate(['/']); this.router.navigate(['/']);
} }
} }

View File

@ -1,7 +1,6 @@
import { Component } from '@angular/core'; import { Component } from '@angular/core';
import { Router } from '@angular/router'; import { Router } from '@angular/router';
import { OAuthService } from 'angular-oauth2-oidc'; import { OAuthService } from 'angular-oauth2-oidc';
import { Location} from '@angular/common';
@Component({ @Component({
selector: 'fm-auth-callback', selector: 'fm-auth-callback',
@ -10,11 +9,11 @@ import { Location} from '@angular/common';
export class AuthCallbackComponent { export class AuthCallbackComponent {
constructor(private router$: Router,private oauthService$:OAuthService) { constructor(private router$: Router,private oauthService$:OAuthService) {
oauthService$.loadDiscoveryDocument().then(() => { this.oauthService$.loadDiscoveryDocument().then(() => {
oauthService$.tryLoginCodeFlow().then(() => { this.oauthService$.tryLoginCodeFlow().then(() => {
router$.navigateByUrl((oauthService$.state && oauthService$.state!="")?decodeURIComponent(oauthService$.state):""); this.router$.navigateByUrl((this.oauthService$.state && this.oauthService$.state!="")?decodeURIComponent(this.oauthService$.state):"");
}).catch(() => { }).catch(() => {
router$.navigateByUrl("/"); this.router$.navigateByUrl("/");
}); });
}) })
} }

View File

@ -1,8 +1,7 @@
import { Component, OnInit,ViewChild,ElementRef,EventEmitter, Output } from '@angular/core'; import { Component, ElementRef, EventEmitter, OnInit, Output, ViewChild } from '@angular/core';
import { HttpClient, HttpParams,HttpHeaders } from "@angular/common/http"; import { NgbModal } from "@ng-bootstrap/ng-bootstrap";
import {NgbModal} from "@ng-bootstrap/ng-bootstrap" import { ImageCroppedEvent, LoadedImage } from 'ngx-image-cropper';
import { ImageCroppedEvent,LoadedImage } from 'ngx-image-cropper'; import { ImageService } from '../../services/image.service';
import {ImageService } from '../../services/image.service';
@Component({ @Component({
selector: 'fm-edit-image-modal', selector: 'fm-edit-image-modal',
@ -47,7 +46,8 @@ export class EditImageModalComponent implements OnInit {
imageCropped(event: ImageCroppedEvent) { imageCropped(event: ImageCroppedEvent) {
this.croppedImage = event.base64; this.croppedImage = event.base64;
} }
imageLoaded(image: LoadedImage) { // eslint-disable-next-line @typescript-eslint/no-unused-vars
imageLoaded(_image: LoadedImage) {
this.isImageLoaded=true; this.isImageLoaded=true;
} }
cropperReady() { cropperReady() {

View File

@ -1,11 +1,8 @@
import { Directive, ViewContainerRef,TemplateRef,OnInit,Input,OnDestroy } from '@angular/core'; import { Directive, Input, OnInit, TemplateRef, ViewContainerRef } from '@angular/core';
import { Store} from '@ngrx/store'; import { Store } from '@ngrx/store';
import * as appCommonReducer from '../../reducers/app-common.reducer' import { Observable } from 'rxjs';
import { IPackages } from '../../models/package';
import { Observable, Subscription } from 'rxjs';
import { skip } from 'rxjs/operators';
import {OAuthService } from 'angular-oauth2-oidc';
import { IUser } from '../../models/user'; import { IUser } from '../../models/user';
import * as appCommonReducer from '../../reducers/app-common.reducer';
@Directive({ @Directive({
selector: '[fm-hasclaim]', selector: '[fm-hasclaim]',

View File

@ -34,8 +34,8 @@ export class HasPackageDirective implements OnDestroy, AfterViewInit {
constructor(private hostTemplateRef: TemplateRef<any>, private viewContainerRef: ViewContainerRef, constructor(private hostTemplateRef: TemplateRef<any>, private viewContainerRef: ViewContainerRef,
private store: Store<appCommonReducer.State>, private packageService: PackageService) { private store: Store<appCommonReducer.State>, private packageService: PackageService) {
this.thenTemplate = hostTemplateRef; this.thenTemplate = this.hostTemplateRef;
this.packSub = this.store.select(appCommonReducer.SelectGetValidUserPackages).subscribe((_) => { this.packSub = this.store.select(appCommonReducer.SelectGetValidUserPackages).subscribe(() => {
this.updateView(); this.updateView();
}); });
} }

View File

@ -1,7 +1,7 @@
import { Component, OnInit,Input } from '@angular/core'; import { Component, Input, OnInit } from '@angular/core';
import { Store, Action } from '@ngrx/store'; import { Store } from '@ngrx/store';
import * as appReducers from '../../reducers/app-common.reducer';
import * as commonActions from '../../actions/app-common.actions'; import * as commonActions from '../../actions/app-common.actions';
import * as appReducers from '../../reducers/app-common.reducer';
@Component({ @Component({
selector: 'fm-menu-background', selector: 'fm-menu-background',

View File

@ -34,8 +34,8 @@ export class PackageExistsDirective implements OnDestroy, AfterViewInit {
constructor(private hostTemplateRef: TemplateRef<any>, private viewContainerRef: ViewContainerRef, constructor(private hostTemplateRef: TemplateRef<any>, private viewContainerRef: ViewContainerRef,
private store: Store<appCommonReducer.State>, private packageService: PackageService) { private store: Store<appCommonReducer.State>, private packageService: PackageService) {
this.thenTemplate = hostTemplateRef; this.thenTemplate = this.hostTemplateRef;
this.packSub = this.store.select(appCommonReducer.SelectGetPackages).subscribe((_) => { this.packSub = this.store.select(appCommonReducer.SelectGetPackages).subscribe(() => {
this.updateView(); this.updateView();
}); });
} }

View File

@ -1,9 +1,9 @@
import { Component, Input,Output, HostListener, ChangeDetectorRef, OnDestroy, OnInit,EventEmitter } from '@angular/core'; import { ChangeDetectorRef, Component, HostListener, Input, OnDestroy, OnInit } from '@angular/core';
import { ResumableFileUploadService, File } from './resumable-file-upload.service';
import { Subscription } from 'rxjs';
import { Store } from '@ngrx/store'; import { Store } from '@ngrx/store';
import * as commonReducer from '../../reducers/app-common.reducer'; import { Subscription } from 'rxjs';
import * as commonActions from '../../actions/app-common.actions'; import * as commonActions from '../../actions/app-common.actions';
import * as commonReducer from '../../reducers/app-common.reducer';
import { File, ResumableFileUploadService } from './resumable-file-upload.service';
@Component({ @Component({
@ -29,7 +29,7 @@ export class ResumableFileUploadComponent implements OnInit, OnDestroy {
ngOnInit() { ngOnInit() {
this.uploadService.init(); this.uploadService.init();
this.refreshSub = this.uploadService.refresh.subscribe((e: any) => { this.refreshSub = this.uploadService.refresh.subscribe(() => {
this.cd.markForCheck(); this.cd.markForCheck();
}); });
} }

View File

@ -1,8 +1,7 @@
import { Injectable, OnDestroy } from '@angular/core'; import { Injectable, OnDestroy } from '@angular/core';
import { OAuthService } from 'angular-oauth2-oidc'; import { OAuthService } from 'angular-oauth2-oidc';
import { Subject , Subscription } from 'rxjs'; import { UploadState, UploadxOptions, UploadxService } from 'ngx-uploadx';
import { HttpClient } from "@angular/common/http"; import { Subject, Subscription } from 'rxjs';
import { UploadxService, UploadState,UploadxOptions} from 'ngx-uploadx';
import { AppConfig } from '../../shared/app.config'; import { AppConfig } from '../../shared/app.config';
@ -19,7 +18,7 @@ export class ResumableFileUploadService implements OnDestroy{
private _eventSub:Subscription; private _eventSub:Subscription;
private initialized = false; private initialized = false;
constructor(private httpClient: HttpClient,private oauthService: OAuthService,private uploadService: UploadxService,public appConfig: AppConfig) { constructor(private oauthService: OAuthService,private uploadService: UploadxService,public appConfig: AppConfig) {
} }
@ -41,11 +40,9 @@ export class ResumableFileUploadService implements OnDestroy{
updatetotalprogress() { updatetotalprogress() {
let totalProgress =0; let totalProgress =0;
let n=0;
for(let i =0;i<this.files.length;i++) { for(let i =0;i<this.files.length;i++) {
if(!this.files[i].error) { if(!this.files[i].error) {
totalProgress+=this.files[i].progress; totalProgress+=this.files[i].progress;
n++;
} }
} }
this.totalProgress=totalProgress/this.files.length; this.totalProgress=totalProgress/this.files.length;
@ -86,7 +83,7 @@ export class ResumableFileUploadService implements OnDestroy{
this.refresh.next({}); this.refresh.next({});
} }
addFiles = (files: any[], event: any, metadata:any) => { addFiles = (files: any[], _event: any, metadata:any) => {
for (const f of files) { for (const f of files) {
const options:UploadxOptions = {metadata:metadata}; const options:UploadxOptions = {metadata:metadata};
this.uploadService.handleFiles(f,options); this.uploadService.handleFiles(f,options);
@ -133,7 +130,6 @@ export class ResumableFileUploadService implements OnDestroy{
} }
export class File { export class File {
private file: any;
public fileName: string; public fileName: string;
public progress: number; public progress: number;
public identifier: string; public identifier: string;
@ -142,9 +138,7 @@ export class File {
public error: boolean; public error: boolean;
public errorMessage: string; public errorMessage: string;
constructor(state: UploadState) { constructor(state: UploadState) {
this.file = state;
this.fileName = state.file.name; this.fileName = state.file.name;
this.progress = state.progress?state.progress:0; this.progress = state.progress?state.progress:0;
this.identifier = state.uploadId; this.identifier = state.uploadId;

View File

@ -1,8 +1,8 @@
import { Component, Input } from '@angular/core'; import { Component } from '@angular/core';
import { Router, ActivatedRoute, ParamMap } from '@angular/router'; import { ActivatedRoute } from '@angular/router';
import { Store } from '@ngrx/store'; import { Store } from '@ngrx/store';
import * as appCommonReducers from '../../reducers/app-common.reducer';
import * as appCommonActions from '../../actions/app-common.actions'; import * as appCommonActions from '../../actions/app-common.actions';
import * as appCommonReducers from '../../reducers/app-common.reducer';

View File

@ -1,5 +1,5 @@
<div class="side-panel hidden" [ngClass]="{'hidden':!visible,'collapsed':collapsed,'resizeable':(resizeable && mobile),'resizing':resizing,'left':left,'extrawide':extrawide}" [ngStyle]="{'top':top}"> <div class="side-panel hidden" [ngClass]="{'hidden':!visible,'collapsed':collapsed,'resizeable':(resizeable && mobile),'resizing':resizing,'left':left,'extrawide':extrawide}" [ngStyle]="{'top':top}">
<div *ngIf="collapsable" class="arrow rounded-end p-2" (click)="handleToggleClick($event)"> <div *ngIf="collapsable" class="arrow rounded-end p-2" (click)="handleToggleClick()">
<i class="fal fa-chevron-left" aria-hidden="true"></i> <i class="fal fa-chevron-left" aria-hidden="true"></i>
</div> </div>
<div draggable="true" class="resizegrip" (dragstart)="handleStartGripDrag($event)" (touchstart)="handleStartGripDrag($event)" (dragend)="handleEndGripDrag()" (touchend)="handleEndGripDrag()" (drag)="handleGripDrag($event)" (touchmove)="handleGripDrag($event)"> <div draggable="true" class="resizegrip" (dragstart)="handleStartGripDrag($event)" (touchstart)="handleStartGripDrag($event)" (dragend)="handleEndGripDrag()" (touchend)="handleEndGripDrag()" (drag)="handleGripDrag($event)" (touchmove)="handleGripDrag($event)">

View File

@ -1,4 +1,4 @@
import { Component, Input,Output,ViewChild,EventEmitter, ElementRef,OnChanges,SimpleChanges,HostListener,ChangeDetectorRef, ViewEncapsulation } from '@angular/core'; import { Component, ElementRef, EventEmitter, HostListener, Input, OnChanges, Output, SimpleChanges, ViewChild } from '@angular/core';
@Component({ @Component({
selector: 'fm-side-panel', selector: 'fm-side-panel',
@ -22,7 +22,7 @@ export class SidePanelComponent implements OnChanges {
private resizeTop=50; private resizeTop=50;
public resizing=false; public resizing=false;
constructor(private element: ElementRef,private ref: ChangeDetectorRef) { constructor(private element: ElementRef) {
this.collapsable = false; this.collapsable = false;
this.setTop(); this.setTop();
} }
@ -46,7 +46,7 @@ export class SidePanelComponent implements OnChanges {
this.setTop(); this.setTop();
} }
handleToggleClick(event) { handleToggleClick() {
if (this.collapsable) { if (this.collapsable) {
this.collapsed = !this.collapsed; this.collapsed = !this.collapsed;
} }
@ -85,7 +85,7 @@ export class SidePanelComponent implements OnChanges {
} }
@HostListener('window:resize', ['$event']) @HostListener('window:resize', ['$event'])
handleResize(event) { handleResize() {
this.setTop(); this.setTop();
} }
} }

View File

@ -2,7 +2,7 @@
<span class="tag rounded bg-primary text-white" *ngFor="let tag of tags;"><span>{{tag}}</span> <i <span class="tag rounded bg-primary text-white" *ngFor="let tag of tags;"><span>{{tag}}</span> <i
(click)="handleDeleteTag(tag)" class="fal fa-times" aria-hidden="true"></i></span><input (click)="handleDeleteTag(tag)" class="fal fa-times" aria-hidden="true"></i></span><input
type="text" #tagInputElement type="text" #tagInputElement
(blur)="handleBlur($event, false)" (blur)="handleBlur(false)"
(keyup)="handleKeyUp($event)" (keyup)="handleKeyUp($event)"
[(ngModel)]="tag" [(ngModel)]="tag"
[ngbTypeahead]="findTag" [ngbTypeahead]="findTag"

View File

@ -65,7 +65,7 @@ export class TagInputComponent implements ControlValueAccessor {
this.propagateChange(tags); this.propagateChange(tags);
} }
handleBlur(event, keepFocus = true) { handleBlur(keepFocus = true) {
if (!this.typeahead.isPopupOpen()) { if (!this.typeahead.isPopupOpen()) {
this.addTag(this.tag, keepFocus); this.addTag(this.tag, keepFocus);
} else { } else {
@ -89,6 +89,7 @@ export class TagInputComponent implements ControlValueAccessor {
this.tag = ''; this.tag = '';
} }
// eslint-disable-next-line @typescript-eslint/no-unused-vars
propagateChange = (_: any) => { propagateChange = (_: any) => {
}; };

View File

@ -1,4 +1,4 @@
<div class="timespan p-1" (window:resize)="handleResize($event)"> <div class="timespan p-1" (window:resize)="handleResize()">
<div (click)="handleClick()">{{caption}}</div> <div (click)="handleClick()">{{caption}}</div>
<ng-template #popoverContent let-caption="popoverCaption">{{caption}}</ng-template> <ng-template #popoverContent let-caption="popoverCaption">{{caption}}</ng-template>
<div class="popover-anchor" [style.left.px] = "startPopoverLeft" [ngbPopover]="popoverContent" #popoverStart="ngbPopover">&nbsp;</div> <div class="popover-anchor" [style.left.px] = "startPopoverLeft" [ngbPopover]="popoverContent" #popoverStart="ngbPopover">&nbsp;</div>
@ -17,13 +17,13 @@
<option value="8">Year</option> <option value="8">Year</option>
</select> </select>
</div> --> </div> -->
<div class="timeline" (window:mousemove)="handleMouseMove($event)" (window:touchmove)="handleMouseMove($event)" (window:mouseup)="handleMouseUp($event)" (window:touchend)="handleMouseUp($event)" (wheel)="handleMouseWheel($event)" [style.height.px]="height"> <div class="timeline" (window:mousemove)="handleMouseMove($event)" (window:touchmove)="handleMouseMove($event)" (window:mouseup)="handleMouseUp()" (window:touchend)="handleMouseUp()" (wheel)="handleMouseWheel($event)" [style.height.px]="height">
<canvas #timeLine (mousedown)="handleViewPanMouseDown($event)" (touchstart)="handleViewPanMouseDown($event)" (mousemove)="handleCanvasMouseMove($event)" (mouseleave)="handleCanvasMouseLeave($event)"> <canvas #timeLine (mousedown)="handleViewPanMouseDown($event)" (touchstart)="handleViewPanMouseDown($event)" (mousemove)="handleCanvasMouseMove($event)" (mouseleave)="handleCanvasMouseLeave()">
</canvas> </canvas>
<div class="control-container" [style.margin-left.px]="marginLeft" [style.height.px]="lineHeight" > <div class="control-container" [style.margin-left.px]="marginLeft" [style.height.px]="lineHeight" >
<div class="leftGrip rounded-start" (mousedown)="handleLeftGripMouseDown($event)" (touchstart)="handleLeftGripMouseDown($event)" (mouseenter)="handleLeftGripMouseEnter($event)" (mouseleave)="handleLeftGripMouseLeave($event)"><i class="fal fa-ellipsis-v" aria-hidden="true"></i></div> <div class="leftGrip rounded-start" (mousedown)="handleLeftGripMouseDown($event)" (touchstart)="handleLeftGripMouseDown($event)" (mouseenter)="handleLeftGripMouseEnter()" (mouseleave)="handleLeftGripMouseLeave()"><i class="fal fa-ellipsis-v" aria-hidden="true"></i></div>
<div class="range" [style.width.px]="rangeWidth" (mousedown)="handleRangeGripMouseDown($event)" (touchstart)="handleRangeGripMouseDown($event)" (mouseenter)="handleRangeGripMouseEnter($event)"></div> <div class="range" [style.width.px]="rangeWidth" (mousedown)="handleRangeGripMouseDown($event)" (touchstart)="handleRangeGripMouseDown($event)" (mouseenter)="handleRangeGripMouseEnter()"></div>
<div class="rightGrip rounded-end" (mousedown)="handleRightGripMouseDown($event)" (touchstart)="handleRightGripMouseDown($event)" (mouseenter)="handleRightGripMouseEnter($event)" (mouseleave)="handleRightGripMouseLeave($event)"><i class="fal fa-ellipsis-v" aria-hidden="true"></i></div> <div class="rightGrip rounded-end" (mousedown)="handleRightGripMouseDown($event)" (touchstart)="handleRightGripMouseDown($event)" (mouseenter)="handleRightGripMouseEnter()" (mouseleave)="handleRightGripMouseLeave()"><i class="fal fa-ellipsis-v" aria-hidden="true"></i></div>
</div> </div>
</div> </div>
<!-- <div> <!-- <div>

View File

@ -1,6 +1,6 @@
import { Component, OnInit,Input,ViewChild,OnChanges,ChangeDetectorRef,Output, EventEmitter,SimpleChanges } from '@angular/core';
import { DatePipe } from '@angular/common'; import { DatePipe } from '@angular/common';
import {NgbPopover} from '@ng-bootstrap/ng-bootstrap'; import { ChangeDetectorRef, Component, EventEmitter, Input, OnChanges, OnInit, Output, ViewChild } from '@angular/core';
import { NgbPopover } from '@ng-bootstrap/ng-bootstrap';
export interface TimeSpan { export interface TimeSpan {
startDate:Date; startDate:Date;
@ -73,7 +73,8 @@ export class TimespanComponent implements OnInit, OnChanges {
canvas.width = this.elementWidth * this.ratio; canvas.width = this.elementWidth * this.ratio;
} }
getPosibleUnits(scale:number):number[] { // eslint-disable-next-line @typescript-eslint/no-unused-vars
getPosibleUnits(_scale:number):number[] {
const posibleUnits = []; const posibleUnits = [];
for(const u of [3,4,6,8]) { for(const u of [3,4,6,8]) {
if((this.unitScale <=u) ) if((this.unitScale <=u) )
@ -119,7 +120,6 @@ export class TimespanComponent implements OnInit, OnChanges {
} }
getStartEndCaption(date:Date,otherDate:Date,unitScale:number,suffix = false,extended=true):string { getStartEndCaption(date:Date,otherDate:Date,unitScale:number,suffix = false,extended=true):string {
const showSuffix = false;
otherDate=new Date(otherDate.getTime()-1); // fix year edge case otherDate=new Date(otherDate.getTime()-1); // fix year edge case
if(unitScale == 3) { if(unitScale == 3) {
let format="HH:00"; let format="HH:00";
@ -234,9 +234,6 @@ export class TimespanComponent implements OnInit, OnChanges {
} }
getNextTick(viewStartDate:Date, tick:number,step:number,unitScale:number):number { getNextTick(viewStartDate:Date, tick:number,step:number,unitScale:number):number {
const unitTextWidth = this.getUnitTextWidth(unitScale);
const dateOffset =this.getUnitDateOffset(viewStartDate,unitScale,tick);
const date = new Date(viewStartDate.getTime() + dateOffset);
let nextTick=tick+step+Math.trunc(step/2); let nextTick=tick+step+Math.trunc(step/2);
const nextDateOffset =this.getUnitDateOffset(viewStartDate,unitScale,nextTick); const nextDateOffset =this.getUnitDateOffset(viewStartDate,unitScale,nextTick);
const nextDate = new Date(viewStartDate.getTime() + nextDateOffset); const nextDate = new Date(viewStartDate.getTime() + nextDateOffset);
@ -347,7 +344,8 @@ export class TimespanComponent implements OnInit, OnChanges {
this.caption=this.getCaption(startDate,endDate,this.unitScale); this.caption=this.getCaption(startDate,endDate,this.unitScale);
} }
snapToUnit(date:Date,unitScale:number):Date { // eslint-disable-next-line @typescript-eslint/no-unused-vars
snapToUnit(date:Date,_unitScale:number):Date {
const d = new Date(date.getTime() + (this.unitScales[this.unitScale]/2)); const d = new Date(date.getTime() + (this.unitScales[this.unitScale]/2));
const offsetInMilliseconds =this.getUnitDateOffset(d,this.unitScale,0) const offsetInMilliseconds =this.getUnitDateOffset(d,this.unitScale,0)
return new Date(d.getTime()+offsetInMilliseconds); return new Date(d.getTime()+offsetInMilliseconds);
@ -417,14 +415,14 @@ export class TimespanComponent implements OnInit, OnChanges {
event.preventDefault(); event.preventDefault();
} }
handleRightGripMouseEnter(event:MouseEvent) { handleRightGripMouseEnter() {
this.mouseX=-1; this.mouseX=-1;
this.mouseY=-1; this.mouseY=-1;
this.redraw(); this.redraw();
if(!this.rangeGripMove && !this.leftGripMove && !this.rightGripMove) this.popoverEnd.open(this.endCaption); if(!this.rangeGripMove && !this.leftGripMove && !this.rightGripMove) this.popoverEnd.open(this.endCaption);
} }
handleRightGripMouseLeave(event:MouseEvent) { handleRightGripMouseLeave() {
if(!this.rightGripMove) this.popoverEnd.close(); if(!this.rightGripMove) this.popoverEnd.close();
} }
@ -435,18 +433,18 @@ export class TimespanComponent implements OnInit, OnChanges {
event.preventDefault(); event.preventDefault();
} }
handleLeftGripMouseEnter(event:MouseEvent|TouchEvent) { handleLeftGripMouseEnter() {
this.mouseX=-1; this.mouseX=-1;
this.mouseY=-1; this.mouseY=-1;
this.redraw(); this.redraw();
if(!this.rangeGripMove && !this.leftGripMove && !this.rightGripMove) this.popoverStart.open(this.startCaption); if(!this.rangeGripMove && !this.leftGripMove && !this.rightGripMove) this.popoverStart.open(this.startCaption);
} }
handleLeftGripMouseLeave(event:MouseEvent) { handleLeftGripMouseLeave() {
if(!this.leftGripMove) this.popoverStart.close(); if(!this.leftGripMove) this.popoverStart.close();
} }
handleRangeGripMouseEnter(event:MouseEvent) { handleRangeGripMouseEnter() {
this.mouseX=-1; this.mouseX=-1;
this.mouseY=-1; this.mouseY=-1;
this.redraw(); this.redraw();
@ -464,7 +462,7 @@ export class TimespanComponent implements OnInit, OnChanges {
event.preventDefault(); event.preventDefault();
} }
handleMouseUp(event:MouseEvent|TouchEvent) { handleMouseUp() {
//this.updateControl(event); //this.updateControl(event);
this.startDate = this.getStartDate(this.lastOffsetInPixels); this.startDate = this.getStartDate(this.lastOffsetInPixels);
this.endDate = this.getEndDate(this.lastOffsetInPixels); this.endDate = this.getEndDate(this.lastOffsetInPixels);
@ -498,7 +496,7 @@ export class TimespanComponent implements OnInit, OnChanges {
this.redraw(); this.redraw();
} }
handleCanvasMouseLeave(event:MouseEvent) { handleCanvasMouseLeave() {
this.mouseX = -1; this.mouseX = -1;
this.mouseY = -1; this.mouseY = -1;
this.redraw(); this.redraw();
@ -510,7 +508,6 @@ export class TimespanComponent implements OnInit, OnChanges {
return true; return true;
} else { } else {
nextScale*=1.1; nextScale*=1.1;
const canZoom=false;
const oneUnit = (this.getUnitDateOffset(this.viewMinDate,8,1)- this.getUnitDateOffset(this.viewMinDate,8,0)) / nextScale; const oneUnit = (this.getUnitDateOffset(this.viewMinDate,8,1)- this.getUnitDateOffset(this.viewMinDate,8,0)) / nextScale;
const unitTextWidth=this.getUnitTextWidth(8); const unitTextWidth=this.getUnitTextWidth(8);
const steps=this.getSteps(8); const steps=this.getSteps(8);
@ -565,7 +562,7 @@ export class TimespanComponent implements OnInit, OnChanges {
this.updateStyle(this.startDate,this.endDate); this.updateStyle(this.startDate,this.endDate);
} }
handleResize(event:any) { handleResize() {
if(this.initialized) { if(this.initialized) {
this.setCanvasSize(); this.setCanvasSize();
this.updateStyle(this.startDate,this.endDate); this.updateStyle(this.startDate,this.endDate);
@ -573,7 +570,7 @@ export class TimespanComponent implements OnInit, OnChanges {
} }
} }
ngOnChanges (changes: SimpleChanges) { ngOnChanges() {
if(this.initialized) { if(this.initialized) {
this.setCanvasSize(); this.setCanvasSize();
this.updateStyle(this.startDate,this.endDate); this.updateStyle(this.startDate,this.endDate);

View File

@ -20,7 +20,7 @@ export class AppCommonEffects {
login$ = createEffect(() => this.actions$.pipe( login$ = createEffect(() => this.actions$.pipe(
ofType(appCommonActions.LOGIN), ofType(appCommonActions.LOGIN),
withLatestFrom(this.store$.select(appCommonReducers.selectGetInitialized)), withLatestFrom(this.store$.select(appCommonReducers.selectGetInitialized)),
mergeMap(([action, initialized]) => { mergeMap(([action]) => {
const a = (action as appCommonActions.Login); const a = (action as appCommonActions.Login);
this.oauthService$.initCodeFlow(a.url,{"prompt":"login"}); this.oauthService$.initCodeFlow(a.url,{"prompt":"login"});
return []; return [];
@ -28,14 +28,14 @@ export class AppCommonEffects {
logout$ = createEffect(() => this.actions$.pipe( logout$ = createEffect(() => this.actions$.pipe(
ofType(appCommonActions.LOGOUT), ofType(appCommonActions.LOGOUT),
mergeMap((action) => { mergeMap(() => {
this.oauthService$.revokeTokenAndLogout(); this.oauthService$.revokeTokenAndLogout();
return []; return [];
})),{dispatch:false}); })),{dispatch:false});
loadItemTypes$ = createEffect(() => this.actions$.pipe( loadItemTypes$ = createEffect(() => this.actions$.pipe(
ofType(appCommonActions.LOADITEMTYPES), ofType(appCommonActions.LOADITEMTYPES),
switchMap((action) => { switchMap(() => {
return this.itemService$.getItemTypes().pipe( return this.itemService$.getItemTypes().pipe(
map((itemTypes: IItemTypes) => new appCommonActions.LoadItemTypesSuccess(itemTypes)), map((itemTypes: IItemTypes) => new appCommonActions.LoadItemTypesSuccess(itemTypes)),
catchError(error => of(new appCommonActions.Fail(error)))) catchError(error => of(new appCommonActions.Fail(error))))
@ -45,7 +45,7 @@ export class AppCommonEffects {
initUser$ = createEffect(() => this.actions$.pipe( initUser$ = createEffect(() => this.actions$.pipe(
ofType(appCommonActions.INITUSER), ofType(appCommonActions.INITUSER),
first(), first(),
switchMap((action) => { switchMap(() => {
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]) => {return of(new appCommonActions.InitUserSuccess(user,userInfo as UserInfo))} ),
catchError(error => of(new appCommonActions.Fail(error)))) catchError(error => of(new appCommonActions.Fail(error))))
@ -85,7 +85,7 @@ export class AppCommonEffects {
initUserSettingsRoot$ = createEffect(() => this.actions$.pipe( initUserSettingsRoot$ = createEffect(() => this.actions$.pipe(
ofType(appCommonActions.INITUSERSETTINGSROOT), ofType(appCommonActions.INITUSERSETTINGSROOT),
switchMap(_ => { switchMap(() => {
return this.folderService$.getFolder('my_settings').pipe( return this.folderService$.getFolder('my_settings').pipe(
switchMap((item) => of(new appCommonActions.InitUserSettingsRootSuccess(item))), switchMap((item) => of(new appCommonActions.InitUserSettingsRootSuccess(item))),
catchError(error => of(new appCommonActions.Fail(error))) catchError(error => of(new appCommonActions.Fail(error)))
@ -134,10 +134,10 @@ export class AppCommonEffects {
withLatestFrom(this.store$.select(appCommonReducers.selectGetItemTypes)), withLatestFrom(this.store$.select(appCommonReducers.selectGetItemTypes)),
switchMap(([action, itemtypes]) => { switchMap(([action, itemtypes]) => {
const a = action as appCommonActions.EditItem; const a = action as appCommonActions.EditItem;
var editor = "property"; let editor = "property";
if(a.item.itemType) { if(a.item.itemType) {
const itemType = itemtypes[a.item.itemType]; const itemType = itemtypes[a.item.itemType];
var editor = itemType && itemType.editor ? itemType.editor : editor; editor = itemType && itemType.editor ? itemType.editor : editor;
} }
this.router$.navigate(['/editor',editor,'item', a.item.code]) this.router$.navigate(['/editor',editor,'item', a.item.code])
return []; return [];
@ -179,15 +179,14 @@ export class AppCommonEffects {
fail$ = createEffect(() => this.actions$.pipe( fail$ = createEffect(() => this.actions$.pipe(
ofType(appCommonActions.FAIL), ofType(appCommonActions.FAIL),
map((action) => { map(() => {
const failAction = action as appCommonActions.Fail;
//console.debug(failAction.payload) //console.debug(failAction.payload)
return null; return null;
})),{dispatch:false}); })),{dispatch:false});
online$ = createEffect(() => this.actions$.pipe( online$ = createEffect(() => this.actions$.pipe(
ofType(appCommonActions.ONLINE), ofType(appCommonActions.ONLINE),
switchMap((action) => { switchMap(() => {
//console.debug("Online: Check token"); //console.debug("Online: Check token");
if(!this.oauthService$.hasValidAccessToken()) { if(!this.oauthService$.hasValidAccessToken()) {
//console.debug("No valid token, try to refresh"); //console.debug("No valid token, try to refresh");

View File

@ -1,14 +1,14 @@
import { createFeatureSelector, createSelector } from '@ngrx/store';
import { tassign } from 'tassign'; import { tassign } from 'tassign';
import { IItemTypes} from '../models/item.types';
import { IListItem } from '../models/list.item';
import { IUser } from '../models/user';
import { IPackage,IPackageMap,IPackages} from '../models/package';
import * as appCommonActions from '../actions/app-common.actions'; import * as appCommonActions from '../actions/app-common.actions';
import { createSelector, createFeatureSelector, ActionReducerMap } from '@ngrx/store'; import { IItemTypes } from '../models/item.types';
import { IListItem } from '../models/list.item';
import { IPackageMap, IPackages } from '../models/package';
import { IUser } from '../models/user';
import { MODULE_NAME } from '../module-name';
import { IItem } from '../models/item'; import { IItem } from '../models/item';
import {getValidPackages, isValidPackage} from '../services/package.service'; import { MODULE_NAME } from '../module-name';
import { getValidPackages } from '../services/package.service';
export interface State { export interface State {
openedModalName: string, openedModalName: string,

View File

@ -1,15 +1,14 @@
import { HttpClient, HttpParams } from "@angular/common/http";
import { Injectable } from '@angular/core'; import { Injectable } from '@angular/core';
import { Observable } from 'rxjs'; import { Observable } from 'rxjs';
import { IItem } from '../models/item'; import { IItem } from '../models/item';
import { HttpClient, HttpParams } from "@angular/common/http";
import { AppConfig } from "../shared/app.config"; import { AppConfig } from "../shared/app.config";
import {ItemTypeService} from './itemtype.service';
@Injectable({ @Injectable({
providedIn: 'root', providedIn: 'root',
}) })
export class AdminService { export class AdminService {
constructor(public httpClient: HttpClient, public appConfig: AppConfig,private itemTypeService:ItemTypeService) { constructor(public httpClient: HttpClient, public appConfig: AppConfig) {
} }
ApiEndpoint() { ApiEndpoint() {

View File

@ -1,21 +1,14 @@
import { Injectable } from '@angular/core'; import { Injectable } from '@angular/core';
import { Router, Route, ActivatedRouteSnapshot, RouterStateSnapshot, UrlSegment, UrlTree } from '@angular/router'; import { ActivatedRouteSnapshot, Route, RouterStateSnapshot, UrlSegment, UrlTree } from '@angular/router';
import { Store } from '@ngrx/store';
import { OAuthService } from 'angular-oauth2-oidc'; import { OAuthService } from 'angular-oauth2-oidc';
import { Observable } from 'rxjs'; import { Observable } from 'rxjs';
import * as appCommonReducer from '../reducers/app-common.reducer';
@Injectable({ @Injectable({
providedIn: 'root', providedIn: 'root',
}) })
export class AuthGuard { export class AuthGuard {
constructor(private oauthService: OAuthService, private router: Router, private store: Store<appCommonReducer.State>) { } constructor(private oauthService: OAuthService) { }
canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): boolean | UrlTree | Observable<boolean | UrlTree> | Promise<boolean | UrlTree> { canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): boolean | UrlTree | Observable<boolean | UrlTree> | Promise<boolean | UrlTree> {
//console.debug("AuthGuard->canActivate", route, state); //console.debug("AuthGuard->canActivate", route, state);
@ -31,7 +24,8 @@ export class AuthGuard {
return this.checkLogin(url, childRoute); return this.checkLogin(url, childRoute);
} }
canLoad(route: Route, segments: UrlSegment[]): boolean | UrlTree | Observable<boolean | UrlTree> | Promise<boolean | UrlTree> { // eslint-disable-next-line @typescript-eslint/no-unused-vars
canLoad(route: Route, _segments: UrlSegment[]): boolean | UrlTree | Observable<boolean | UrlTree> | Promise<boolean | UrlTree> {
//console.debug("AuthGuard->canLoad", route, segments); //console.debug("AuthGuard->canLoad", route, segments);
return this.checkLogin(route.path, null); return this.checkLogin(route.path, null);
} }

View File

@ -1,4 +1,4 @@
import { Component, Injectable } from '@angular/core'; import { Injectable } from '@angular/core';
import { NgbDateAdapter, NgbDateStruct } from '@ng-bootstrap/ng-bootstrap'; import { NgbDateAdapter, NgbDateStruct } from '@ng-bootstrap/ng-bootstrap';
@Injectable({ @Injectable({

View File

@ -1,15 +1,14 @@
import { HttpClient } from "@angular/common/http";
import { Injectable } from '@angular/core'; import { Injectable } from '@angular/core';
import { Observable, of } from 'rxjs'; import { Observable, of } from 'rxjs';
import { IItem } from '../models/item'; import { IItem } from '../models/item';
import { HttpClient } from "@angular/common/http";
import { AppConfig } from "../shared/app.config"; import { AppConfig } from "../shared/app.config";
import {ItemTypeService} from './itemtype.service';
@Injectable({ @Injectable({
providedIn: 'root', providedIn: 'root',
}) })
export class DownloadService { export class DownloadService {
constructor(public httpClient: HttpClient, public appConfig: AppConfig,private itemTypeService:ItemTypeService) { constructor(public httpClient: HttpClient, public appConfig: AppConfig) {
} }
ApiEndpoint() { ApiEndpoint() {

View File

@ -1,8 +1,8 @@
import { Injectable } from '@angular/core'; import { Injectable } from '@angular/core';
import { IEventMessage } from '../models/event.message'; import { HttpTransportType, HubConnection, HubConnectionBuilder, HubConnectionState, LogLevel } from '@microsoft/signalr';
import { Subject, timer } from 'rxjs';
import { OAuthService } from 'angular-oauth2-oidc'; import { OAuthService } from 'angular-oauth2-oidc';
import { HubConnection, HubConnectionBuilder, LogLevel ,HttpTransportType,HubConnectionState} from '@microsoft/signalr'; import { Subject } from 'rxjs';
import { IEventMessage } from '../models/event.message';
import { AppConfig } from "../shared/app.config"; import { AppConfig } from "../shared/app.config";
@ -17,7 +17,7 @@ export class EventService {
public authenticated = false; public authenticated = false;
constructor(private oauthService: OAuthService, private appConfig: AppConfig) { constructor(private oauthService: OAuthService, private appConfig: AppConfig) {
this._apiEndPoint = appConfig.getConfig("apiEndPoint"); this._apiEndPoint = this.appConfig.getConfig("apiEndPoint");
this._connection = new HubConnectionBuilder().withUrl(`${ this._apiEndPoint}/eventHub`, this._connection = new HubConnectionBuilder().withUrl(`${ this._apiEndPoint}/eventHub`,
{ transport: HttpTransportType.WebSockets, { transport: HttpTransportType.WebSockets,
// accessTokenFactory: () => { // accessTokenFactory: () => {
@ -28,7 +28,7 @@ export class EventService {
this._connection.on('event', eventMessage => { this._connection.on('event', eventMessage => {
this.event.next(eventMessage); this.event.next(eventMessage);
}); });
this._connection.onreconnected( event => { this._connection.onreconnected(() => {
this.Authenticate(); this.Authenticate();
}); });
this.Start(); this.Start();
@ -42,7 +42,6 @@ export class EventService {
} }
private Authenticate() { private Authenticate() {
const accessToken = this.oauthService.getAccessToken();
if (this.oauthService.hasValidAccessToken()) { if (this.oauthService.hasValidAccessToken()) {
this._connection.send('authenticate', this.oauthService.getAccessToken()); this._connection.send('authenticate', this.oauthService.getAccessToken());
this.authenticated=true; this.authenticated=true;

View File

@ -1,3 +1,4 @@
/* eslint-disable @typescript-eslint/no-unused-vars */
import { Injectable } from '@angular/core'; import { Injectable } from '@angular/core';
import { ActivatedRouteSnapshot, RouterStateSnapshot } from '@angular/router'; import { ActivatedRouteSnapshot, RouterStateSnapshot } from '@angular/router';
@ -12,7 +13,6 @@ import * as appCommonActions from '../actions/app-common.actions';
}) })
export class FullScreenGuard { export class FullScreenGuard {
private loginDispatched = false;
constructor(private store: Store<appCommonReducer.State> ) { } constructor(private store: Store<appCommonReducer.State> ) { }
setFullScreen():boolean { setFullScreen():boolean {
@ -20,11 +20,11 @@ export class FullScreenGuard {
return true; return true;
} }
canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): boolean { canActivate(_route: ActivatedRouteSnapshot, _state: RouterStateSnapshot): boolean {
return this.setFullScreen(); return this.setFullScreen();
} }
canActivateChild(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): boolean { canActivateChild(_route: ActivatedRouteSnapshot, _state: RouterStateSnapshot): boolean {
return this.setFullScreen(); return this.setFullScreen();
} }
} }

View File

@ -1,7 +1,6 @@
import { HttpClient } from "@angular/common/http";
import { Injectable } from '@angular/core'; import { Injectable } from '@angular/core';
import { Observable } from 'rxjs'; import { Observable } from 'rxjs';
import { IUser } from '../models/user';
import { HttpClient,HttpHeaders } from "@angular/common/http";
import { AppConfig } from "../shared/app.config"; import { AppConfig } from "../shared/app.config";
@Injectable({ @Injectable({

View File

@ -16,7 +16,7 @@ export class GradientService {
gd += `rgba(${gs.color.red},${gs.color.green},${gs.color.blue},${gs.color.alpha/255})`; gd += `rgba(${gs.color.red},${gs.color.green},${gs.color.blue},${gs.color.alpha/255})`;
gd +=` ${gs.relativestop*100}%` gd +=` ${gs.relativestop*100}%`
} }
gradient.forEach((gs) => { gradient.forEach(() => {
}); });
gd+=')"}'; gd+=')"}';

View File

@ -21,7 +21,7 @@ import { AppConfig } from "../shared/app.config";
check(interval:number): Observable<boolean> { check(interval:number): Observable<boolean> {
const retval = new BehaviorSubject<boolean>(true); const retval = new BehaviorSubject<boolean>(true);
setInterval(() => { setInterval(() => {
this.httpClient.get(`${this.ApiEndpoint()}/api/v1/healthcheck`).pipe(map(() => true),catchError((error) => of(false))).toPromise().then((status) => { this.httpClient.get(`${this.ApiEndpoint()}/api/v1/healthcheck`).pipe(map(() => true),catchError(() => of(false))).toPromise().then((status) => {
retval.next(status); retval.next(status);
}); });
},interval); },interval);

View File

@ -1,7 +1,5 @@
import { HttpClient } from "@angular/common/http";
import { Injectable } from '@angular/core'; import { Injectable } from '@angular/core';
import { Observable } from 'rxjs';
import { IUser } from '../models/user';
import { HttpClient,HttpHeaders } from "@angular/common/http";
import { AppConfig } from "../shared/app.config"; import { AppConfig } from "../shared/app.config";
@Injectable({ @Injectable({

View File

@ -1,16 +1,14 @@
import { HttpClient, HttpHeaders, HttpParams } from "@angular/common/http";
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 { IItemLinkType } from '../models/itemlink.type';
import { IUrlType } from '../models/url.type';
import { IItem } from '../models/item'; import { IItem } from '../models/item';
import { IJsonline } from '../models/json-line'; import { IItemType } from '../models/item.type';
import { IItemTask } from '../models/itemTask'; import { IItemTask } from '../models/itemTask';
import { HttpClient, HttpParams,HttpHeaders } from "@angular/common/http"; import { IItemLinkType } from '../models/itemlink.type';
import { IJsonline } from '../models/json-line';
import { IListItem } from '../models/list.item';
import { AppConfig } from "../shared/app.config"; import { AppConfig } from "../shared/app.config";
import {ItemTypeService} from './itemtype.service'; import { ItemTypeService } from './itemtype.service';
import {IListItem} from '../models/list.item';
@Injectable({ @Injectable({
providedIn: 'root', providedIn: 'root',

View File

@ -63,7 +63,7 @@ export class ItemTypeService {
this.itemTypes = itemTypes; this.itemTypes = itemTypes;
//return data; //return data;
}) })
.catch(error => this.itemTypes = null); .catch(() => this.itemTypes = null);
} else { } else {
return new Promise<void>((resolve) => {resolve()}); return new Promise<void>((resolve) => {resolve()});
} }

View File

@ -1,10 +1,11 @@
/* eslint-disable @typescript-eslint/no-unused-vars */
import { Injectable } from '@angular/core'; import { Injectable } from '@angular/core';
import { Route, ActivatedRouteSnapshot, RouterStateSnapshot } from '@angular/router'; import { ActivatedRouteSnapshot, RouterStateSnapshot } from '@angular/router';
import { Store } from '@ngrx/store'; import { Store } from '@ngrx/store';
import * as appCommonReducer from '../reducers/app-common.reducer'
import * as appCommonActions from '../actions/app-common.actions'; import * as appCommonActions from '../actions/app-common.actions';
import * as appCommonReducer from '../reducers/app-common.reducer';
@Injectable({ @Injectable({
@ -12,7 +13,6 @@ import * as appCommonActions from '../actions/app-common.actions';
}) })
export class NavBarGuard { export class NavBarGuard {
private loginDispatched = false;
constructor(private store: Store<appCommonReducer.State>) { } constructor(private store: Store<appCommonReducer.State>) { }
setNavBar():boolean { setNavBar():boolean {
@ -20,11 +20,11 @@ export class NavBarGuard {
return true; return true;
} }
canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): boolean { canActivate(_route: ActivatedRouteSnapshot, _state: RouterStateSnapshot): boolean {
return this.setNavBar(); return this.setNavBar();
} }
canActivateChild(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): boolean { canActivateChild(_route: ActivatedRouteSnapshot, _state: RouterStateSnapshot): boolean {
return this.setNavBar(); return this.setNavBar();
} }
} }

View File

@ -9,7 +9,8 @@ export class PackageGuard {
constructor(private packageService: PackageService) { } constructor(private packageService: PackageService) { }
canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): boolean { // eslint-disable-next-line @typescript-eslint/no-unused-vars
canActivate(route: ActivatedRouteSnapshot, _state: RouterStateSnapshot): boolean {
return route.data && route.data.package && this.hasPackageForRoute(route.data.package); return route.data && route.data.package && this.hasPackageForRoute(route.data.package);
} }

View File

@ -1,14 +1,14 @@
import {Injectable} from '@angular/core'; import { Injectable } from '@angular/core';
import {Store} from '@ngrx/store'; import { Store } from '@ngrx/store';
import { IPackage, IPackages } from '../models/package';
import * as appCommonReducer from '../reducers/app-common.reducer'; import * as appCommonReducer from '../reducers/app-common.reducer';
import {IPackage, IPackages} from '../models/package';
import {IItem} from '../models/item'; import { HttpClient } from '@angular/common/http';
import {IItemTask} from '../models/itemTask'; import { Observable, iif } from 'rxjs';
import {HttpClient} from '@angular/common/http'; import { switchMap } from 'rxjs/operators';
import {AppConfig} from '../shared/app.config'; import { IItem } from '../models/item';
import {Observable,iif,of} from 'rxjs'; import { IItemTask } from '../models/itemTask';
import {switchMap} from 'rxjs/operators'; import { AppConfig } from '../shared/app.config';
@Injectable({ @Injectable({
providedIn: 'root', providedIn: 'root',

View File

@ -31,10 +31,8 @@ export class SchemaService {
Observable<{schemaJson: any, schemaLayout: any}> { Observable<{schemaJson: any, schemaLayout: any}> {
return this.getSchema(schemaUrl).pipe( return this.getSchema(schemaUrl).pipe(
switchMap( switchMap(
schemaJson => this.getSchemaLayout(schemaUrl, locale) () => this.getSchemaLayout(schemaUrl, locale)
.pipe(catchError(err => { .pipe(catchError(() => of(undefined))),
return of(undefined);
})),
(schemaJson, schemaLayout) => { (schemaJson, schemaLayout) => {
return ({schemaJson, schemaLayout}); return ({schemaJson, schemaLayout});
} }

View File

@ -1,4 +1,4 @@
import { Injectable, Query } from '@angular/core'; import { Injectable } from '@angular/core';
import { IQueryState } from '../models/query.state'; import { IQueryState } from '../models/query.state';
@Injectable({ @Injectable({

View File

@ -1,7 +1,5 @@
import { Injectable } from '@angular/core';
import { DatePipe } from '@angular/common'; import { DatePipe } from '@angular/common';
import { Observable , Observer } from 'rxjs'; import { Injectable } from '@angular/core';
import { ITypeaheadItem } from '../models/typeahead.item';
@Injectable({ @Injectable({
providedIn: 'root', providedIn: 'root',
@ -14,7 +12,6 @@ export class TimespanService {
quarters: string[] = ['KW1', 'KW2', 'KW3', 'KW4']; quarters: string[] = ['KW1', 'KW2', 'KW3', 'KW4'];
getStartEndCaption(date: Date, otherDate: Date, unitScale: number, suffix = false, extended = true): string { getStartEndCaption(date: Date, otherDate: Date, unitScale: number, suffix = false, extended = true): string {
const showSuffix = false;
otherDate = new Date(otherDate.getTime() - 1); // fix year edge case otherDate = new Date(otherDate.getTime() - 1); // fix year edge case
if (unitScale == 3) { if (unitScale == 3) {
let format = "HH:00"; let format = "HH:00";

View File

@ -1,7 +1,7 @@
import { HttpClient } from "@angular/common/http";
import { Injectable } from '@angular/core'; import { Injectable } from '@angular/core';
import { Observable , Observer } from 'rxjs'; import { Observable } from 'rxjs';
import { ITypeaheadItem } from '../models/typeahead.item'; import { ITypeaheadItem } from '../models/typeahead.item';
import { HttpClient, HttpParams } from "@angular/common/http";
import { AppConfig } from "../shared/app.config"; import { AppConfig } from "../shared/app.config";
@Injectable({ @Injectable({

View File

@ -1,14 +1,14 @@
import {Injectable} from '@angular/core'; import { HttpClient } from '@angular/common/http';
import {HttpClient} from '@angular/common/http'; import { Injectable } from '@angular/core';
import {Observable} from 'rxjs';
import {GeoJSON} from 'ol/format';
import {map, switchMap} from 'rxjs/operators';
import {getCenter} from 'ol/extent';
import moment from 'moment'; import moment from 'moment';
import {AppConfig} from '../shared/app.config'; import { getCenter } from 'ol/extent';
import {WeatherCurrentObservation} from '../models/weatherCurrentObservation'; import { GeoJSON } from 'ol/format';
import {IItem} from '../models/item'; import { Observable } from 'rxjs';
import {HourlyWeatherData, WeatherData} from '../models/WeatherData'; import { map, switchMap } from 'rxjs/operators';
import { HourlyWeatherData, WeatherData } from '../models/WeatherData';
import { IItem } from '../models/item';
import { WeatherCurrentObservation } from '../models/weatherCurrentObservation';
import { AppConfig } from '../shared/app.config';
@Injectable({ @Injectable({
providedIn: 'root', providedIn: 'root',
@ -49,7 +49,7 @@ export class WeatherService {
return this.getWeatherRange(centroid, startDateString, endDateString); return this.getWeatherRange(centroid, startDateString, endDateString);
} }
public getDailyHistoricalObservations(centroid: number[], startDate: string, endDate: string): Observable<HourlyWeatherData[]> { public getDailyHistoricalObservations(centroid: number[], startDate: string): Observable<HourlyWeatherData[]> {
const endpoint = this.appConfig.getConfig('weatherApiEndPoint'); const endpoint = this.appConfig.getConfig('weatherApiEndPoint');
const apiKey = this.appConfig.getConfig('weatherApiKey'); const apiKey = this.appConfig.getConfig('weatherApiKey');

View File

@ -17,7 +17,7 @@ export class AccessTokenInterceptor implements HttpInterceptor {
private base: string; private base: string;
constructor(private injector: Injector, private appConfig: AppConfig, @Inject(DOCUMENT) private document: any) { constructor(private injector: Injector, private appConfig: AppConfig, @Inject(DOCUMENT) private document: any) {
this.base = document.location.href; this.base = this.document.location.href;
} }
hasAudience(url: string): boolean { hasAudience(url: string): boolean {

View File

@ -1,14 +1,11 @@
import { Injector } from '@angular/core'; import { OAuthService, OAuthStorage } from 'angular-oauth2-oidc';
import { Location} from '@angular/common'; import { ItemTypeService } from '../services/itemtype.service';
import { Router,UrlSerializer } from '@angular/router';
import { AuthConfig, OAuthService, OAuthErrorEvent, OAuthStorage } from 'angular-oauth2-oidc';
import { AppConfig } from "./app.config"; import { AppConfig } from "./app.config";
import {ItemTypeService} from '../services/itemtype.service';
import { IAuthconfigFactory } from './authconfigFactory'; import { IAuthconfigFactory } from './authconfigFactory';
export function appConfigFactory(injector:Injector, appConfig: AppConfig, oauthService: OAuthService, authconfigFactory:IAuthconfigFactory,authStorage:OAuthStorage,itemtypeService:ItemTypeService): () => Promise<any> { export function appConfigFactory(appConfig: AppConfig, oauthService: OAuthService, authconfigFactory:IAuthconfigFactory,authStorage:OAuthStorage,itemtypeService:ItemTypeService): () => Promise<any> {
return (): Promise<any> => { return (): Promise<any> => {
return new Promise<void>((resolve,reject) => { return new Promise<void>((resolve,reject) => {
appConfig.load().then(() => { appConfig.load().then(() => {

View File

@ -1,12 +1,11 @@
import {Inject, Injectable} from '@angular/core'; import { Location } from '@angular/common';
import { Location,PathLocationStrategy,LocationStrategy } from '@angular/common'; import { HttpClient, HttpXhrBackend } from '@angular/common/http';
import {HttpClient, HttpXhrBackend} from '@angular/common/http'; import { Injectable } from '@angular/core';
import {Observable} from 'rxjs';
@Injectable() @Injectable()
export class AppConfig { export class AppConfig {
private config: Object = null; private config: object = null;
private httpClient: HttpClient; private httpClient: HttpClient;
constructor(xhrBackend: HttpXhrBackend,private location:Location) { constructor(xhrBackend: HttpXhrBackend,private location:Location) {
@ -15,6 +14,7 @@ export class AppConfig {
} }
public getConfig(key: any) { public getConfig(key: any) {
// eslint-disable-next-line no-prototype-builtins
if (!this.config.hasOwnProperty(key)) { if (!this.config.hasOwnProperty(key)) {
console.error(`Config key ${key} not set`); console.error(`Config key ${key} not set`);
} }
@ -29,6 +29,6 @@ export class AppConfig {
this.config = data; this.config = data;
//return data; //return data;
}) })
.catch(error => this.config = null); .catch(() => this.config = null);
} }
} }

Some files were not shown because too many files have changed in this diff Show More