Some fixes

This commit is contained in:
Willem Dantuma 2019-11-01 15:57:50 +01:00
parent 173be180ce
commit ca6331e053
30 changed files with 707 additions and 91 deletions

View File

@ -19,12 +19,28 @@
"polyfills": "src/polyfills.ts", "polyfills": "src/polyfills.ts",
"tsConfig": "src/tsconfig.app.json", "tsConfig": "src/tsconfig.app.json",
"assets": [ "assets": [
"src/favicon.ico", {
"src/assets", "glob": "**/*",
"input":"src/assets/images",
"output":"/images"
},
{
"glob": "silent-refresh.html",
"input":"src/assets",
"output":"/"
},
{
"glob": "favicon.ico",
"input":"src/assets",
"output":"/"
},
"src/configuration.json" "src/configuration.json"
], ],
"styles": [ "styles": [
"src/styles.css" "src/styles.css",
"node_modules/bootstrap/dist/css/bootstrap.min.css",
"node_modules/font-awesome/css/font-awesome.min.css",
"fonts/FMIconFont/style.css"
], ],
"scripts": [], "scripts": [],
"es5BrowserSupport": true "es5BrowserSupport": true

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -0,0 +1,32 @@
/* font converted using font-converter.net. thank you! */
.fm {
display: inline-block;
font-style: normal;
font-variant-ligatures: normal;
font-variant-caps: normal;
font-variant-numeric: normal;
font-variant-east-asian: normal;
font-weight: normal;
font-stretch: normal;
font-size: inherit;
line-height: 1;
font-family: FarmMaps;
text-rendering: auto;
}
.fm-farm:before {
content: "a";
}
.fm-potato:before {
content: "b";
}
@font-face {
font-family: "FarmMaps";
src: url("./FMIconFont.woff") format("woff"), /* Modern Browsers */
url("./FMIconFont.woff2") format("woff2"); /* Modern Browsers */
font-weight: normal;
font-style: normal;
}

109
package-lock.json generated
View File

@ -679,6 +679,27 @@
} }
} }
}, },
"@farmmaps/common-map": {
"version": "file:dist/common-map",
"requires": {
"@farmmaps/common": "0.0.1-prerelease.43",
"ngx-openlayers": "1.0.0-next.9",
"ol": "^5.3.3",
"tslib": "^1.9.0"
},
"dependencies": {
"@farmmaps/common": {
"version": "0.0.1-prerelease.43",
"resolved": "https://repository.akkerweb.nl/repository/npm-group/@farmmaps/common/-/common-0.0.1-prerelease.43.tgz",
"integrity": "sha512-tV42SIpXAremVLolUEW0ESdYRdyllunbIZgHB3ObsqPJMrI0vgnkIr8LdtSaaYokAGXA3L8n6q3Zi78/hiBgQg==",
"requires": {
"angular-oauth2-oidc": "^5.0.2",
"ngx-uploadx": "^3.1.3",
"tslib": "^1.9.0"
}
}
}
},
"@ng-bootstrap/ng-bootstrap": { "@ng-bootstrap/ng-bootstrap": {
"version": "4.2.1", "version": "4.2.1",
"resolved": "https://registry.npmjs.org/@ng-bootstrap/ng-bootstrap/-/ng-bootstrap-4.2.1.tgz", "resolved": "https://registry.npmjs.org/@ng-bootstrap/ng-bootstrap/-/ng-bootstrap-4.2.1.tgz",
@ -1108,6 +1129,15 @@
"integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=", "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=",
"dev": true "dev": true
}, },
"angular-oauth2-oidc": {
"version": "5.0.2",
"resolved": "https://registry.npmjs.org/angular-oauth2-oidc/-/angular-oauth2-oidc-5.0.2.tgz",
"integrity": "sha512-jtOv4IWEjSFfBHVE4seWGWT/ZfWJ95QJ1JaFhVVGJEF64ibGuPwV3ztwTOUl98QHi/Yg4PXXDAisb31JnIbxBw==",
"requires": {
"jsrsasign": "^8.0.12",
"tslib": "^1.9.0"
}
},
"ansi-align": { "ansi-align": {
"version": "2.0.0", "version": "2.0.0",
"resolved": "https://repository.akkerweb.nl/repository/npm-group/ansi-align/-/ansi-align-2.0.0.tgz", "resolved": "https://repository.akkerweb.nl/repository/npm-group/ansi-align/-/ansi-align-2.0.0.tgz",
@ -3768,6 +3798,11 @@
} }
} }
}, },
"font-awesome": {
"version": "4.7.0",
"resolved": "https://registry.npmjs.org/font-awesome/-/font-awesome-4.7.0.tgz",
"integrity": "sha1-j6jPBBGhoxr9B7BtKQK7n8gVoTM="
},
"for-in": { "for-in": {
"version": "1.0.2", "version": "1.0.2",
"resolved": "https://repository.akkerweb.nl/repository/npm-group/for-in/-/for-in-1.0.2.tgz", "resolved": "https://repository.akkerweb.nl/repository/npm-group/for-in/-/for-in-1.0.2.tgz",
@ -4917,8 +4952,7 @@
"ieee754": { "ieee754": {
"version": "1.1.13", "version": "1.1.13",
"resolved": "https://repository.akkerweb.nl/repository/npm-group/ieee754/-/ieee754-1.1.13.tgz", "resolved": "https://repository.akkerweb.nl/repository/npm-group/ieee754/-/ieee754-1.1.13.tgz",
"integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==", "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg=="
"dev": true
}, },
"iferr": { "iferr": {
"version": "0.1.5", "version": "0.1.5",
@ -5911,6 +5945,11 @@
"verror": "1.10.0" "verror": "1.10.0"
} }
}, },
"jsrsasign": {
"version": "8.0.12",
"resolved": "https://registry.npmjs.org/jsrsasign/-/jsrsasign-8.0.12.tgz",
"integrity": "sha1-Iqu5ZW00owuVMENnIINeicLlwxY="
},
"jszip": { "jszip": {
"version": "3.2.1", "version": "3.2.1",
"resolved": "https://repository.akkerweb.nl/repository/npm-group/jszip/-/jszip-3.2.1.tgz", "resolved": "https://repository.akkerweb.nl/repository/npm-group/jszip/-/jszip-3.2.1.tgz",
@ -6917,6 +6956,22 @@
"deepmerge": "^3.2.0" "deepmerge": "^3.2.0"
} }
}, },
"ngx-openlayers": {
"version": "1.0.0-next.9",
"resolved": "https://registry.npmjs.org/ngx-openlayers/-/ngx-openlayers-1.0.0-next.9.tgz",
"integrity": "sha512-14UFxJX9oeOXtq+HJCJyXn0sBmYmCqj2AnFtetKk1FsDe8EUMFGIRju8UOFegCr2oEu5JsuRjALcfW7lCe+teg==",
"requires": {
"tslib": "^1.9.0"
}
},
"ngx-uploadx": {
"version": "3.3.2",
"resolved": "https://registry.npmjs.org/ngx-uploadx/-/ngx-uploadx-3.3.2.tgz",
"integrity": "sha512-gRdXXq2cRU9HE6dj65qay9GV8NRC7n8y5LtMzJWqsfu2k3CHMQxo2TqZwA9/l/PqJ76RoO7sTPy1OenFQ+krkQ==",
"requires": {
"tslib": "^1.9.0"
}
},
"nice-try": { "nice-try": {
"version": "1.0.5", "version": "1.0.5",
"resolved": "https://repository.akkerweb.nl/repository/npm-group/nice-try/-/nice-try-1.0.5.tgz", "resolved": "https://repository.akkerweb.nl/repository/npm-group/nice-try/-/nice-try-1.0.5.tgz",
@ -7277,6 +7332,16 @@
"integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==",
"dev": true "dev": true
}, },
"ol": {
"version": "5.3.3",
"resolved": "https://registry.npmjs.org/ol/-/ol-5.3.3.tgz",
"integrity": "sha512-7eU4x8YMduNcED1D5wI+AMWDRe7/1HmGfsbV+kFFROI9RNABU/6n4osj6Q3trZbxxKnK2DSRIjIRGwRHT/Z+Ww==",
"requires": {
"pbf": "3.1.0",
"pixelworks": "1.1.0",
"rbush": "2.0.2"
}
},
"on-finished": { "on-finished": {
"version": "2.3.0", "version": "2.3.0",
"resolved": "https://repository.akkerweb.nl/repository/npm-group/on-finished/-/on-finished-2.3.0.tgz", "resolved": "https://repository.akkerweb.nl/repository/npm-group/on-finished/-/on-finished-2.3.0.tgz",
@ -7749,6 +7814,15 @@
"pify": "^3.0.0" "pify": "^3.0.0"
} }
}, },
"pbf": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/pbf/-/pbf-3.1.0.tgz",
"integrity": "sha512-/hYJmIsTmh7fMkHAWWXJ5b8IKLWdjdlAFb3IHkRBn1XUhIYBChVGfVwmHEAV3UfXTxsP/AKfYTXTS/dCPxJd5w==",
"requires": {
"ieee754": "^1.1.6",
"resolve-protobuf-schema": "^2.0.0"
}
},
"pbkdf2": { "pbkdf2": {
"version": "3.0.17", "version": "3.0.17",
"resolved": "https://repository.akkerweb.nl/repository/npm-group/pbkdf2/-/pbkdf2-3.0.17.tgz", "resolved": "https://repository.akkerweb.nl/repository/npm-group/pbkdf2/-/pbkdf2-3.0.17.tgz",
@ -7788,6 +7862,11 @@
"pinkie": "^2.0.0" "pinkie": "^2.0.0"
} }
}, },
"pixelworks": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/pixelworks/-/pixelworks-1.1.0.tgz",
"integrity": "sha1-Hwla1I3Ki/ihyCWOAJIDGkTyLKU="
},
"pkg-dir": { "pkg-dir": {
"version": "2.0.0", "version": "2.0.0",
"resolved": "https://repository.akkerweb.nl/repository/npm-group/pkg-dir/-/pkg-dir-2.0.0.tgz", "resolved": "https://repository.akkerweb.nl/repository/npm-group/pkg-dir/-/pkg-dir-2.0.0.tgz",
@ -7946,6 +8025,11 @@
"retry": "^0.10.0" "retry": "^0.10.0"
} }
}, },
"protocol-buffers-schema": {
"version": "3.3.2",
"resolved": "https://registry.npmjs.org/protocol-buffers-schema/-/protocol-buffers-schema-3.3.2.tgz",
"integrity": "sha512-Xdayp8sB/mU+sUV4G7ws8xtYMGdQnxbeIfLjyO9TZZRJdztBGhlmbI5x1qcY4TG5hBkIKGnc28i7nXxaugu88w=="
},
"protoduck": { "protoduck": {
"version": "5.0.1", "version": "5.0.1",
"resolved": "https://repository.akkerweb.nl/repository/npm-group/protoduck/-/protoduck-5.0.1.tgz", "resolved": "https://repository.akkerweb.nl/repository/npm-group/protoduck/-/protoduck-5.0.1.tgz",
@ -8175,6 +8259,11 @@
"resolved": "https://repository.akkerweb.nl/repository/npm-group/querystringify/-/querystringify-2.1.1.tgz", "resolved": "https://repository.akkerweb.nl/repository/npm-group/querystringify/-/querystringify-2.1.1.tgz",
"integrity": "sha512-w7fLxIRCRT7U8Qu53jQnJyPkYZIaR4n5151KMfcJlO/A9397Wxb1amJvROTK6TOnp7PfoAmg/qXiNHI+08jRfA==" "integrity": "sha512-w7fLxIRCRT7U8Qu53jQnJyPkYZIaR4n5151KMfcJlO/A9397Wxb1amJvROTK6TOnp7PfoAmg/qXiNHI+08jRfA=="
}, },
"quickselect": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/quickselect/-/quickselect-1.1.1.tgz",
"integrity": "sha512-qN0Gqdw4c4KGPsBOQafj6yj/PA6c/L63f6CaZ/DCF/xF4Esu3jVmKLUDYxghFx8Kb/O7y9tI7x2RjTSXwdK1iQ=="
},
"randombytes": { "randombytes": {
"version": "2.1.0", "version": "2.1.0",
"resolved": "https://repository.akkerweb.nl/repository/npm-group/randombytes/-/randombytes-2.1.0.tgz", "resolved": "https://repository.akkerweb.nl/repository/npm-group/randombytes/-/randombytes-2.1.0.tgz",
@ -8230,6 +8319,14 @@
"schema-utils": "^1.0.0" "schema-utils": "^1.0.0"
} }
}, },
"rbush": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/rbush/-/rbush-2.0.2.tgz",
"integrity": "sha512-XBOuALcTm+O/H8G90b6pzu6nX6v2zCKiFG4BJho8a+bY6AER6t8uQUZdi5bomQc0AprCWhEGa7ncAbbRap0bRA==",
"requires": {
"quickselect": "^1.0.1"
}
},
"rc": { "rc": {
"version": "1.2.8", "version": "1.2.8",
"resolved": "https://repository.akkerweb.nl/repository/npm-group/rc/-/rc-1.2.8.tgz", "resolved": "https://repository.akkerweb.nl/repository/npm-group/rc/-/rc-1.2.8.tgz",
@ -8541,6 +8638,14 @@
"integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=",
"dev": true "dev": true
}, },
"resolve-protobuf-schema": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/resolve-protobuf-schema/-/resolve-protobuf-schema-2.1.0.tgz",
"integrity": "sha512-kI5ffTiZWmJaS/huM8wZfEMer1eRd7oJQhDuxeCLe3t7N7mX3z94CN0xPxBQxFYQTSNz9T0i+v6inKqSdK8xrQ==",
"requires": {
"protocol-buffers-schema": "^3.3.1"
}
},
"resolve-url": { "resolve-url": {
"version": "0.2.1", "version": "0.2.1",
"resolved": "https://repository.akkerweb.nl/repository/npm-group/resolve-url/-/resolve-url-0.2.1.tgz", "resolved": "https://repository.akkerweb.nl/repository/npm-group/resolve-url/-/resolve-url-0.2.1.tgz",

View File

@ -21,11 +21,13 @@
"@angular/router": "~7.2.0", "@angular/router": "~7.2.0",
"@aspnet/signalr": "^1.1.4", "@aspnet/signalr": "^1.1.4",
"@farmmaps/common": "file:dist/common", "@farmmaps/common": "file:dist/common",
"@farmmaps/common-map": "file:dist/common-map",
"@ng-bootstrap/ng-bootstrap": "^4.2.1", "@ng-bootstrap/ng-bootstrap": "^4.2.1",
"@ngrx/effects": "^7.2.0", "@ngrx/effects": "^7.2.0",
"@ngrx/router-store": "^7.2.0", "@ngrx/router-store": "^7.2.0",
"@ngrx/store": "^7.2.0", "@ngrx/store": "^7.2.0",
"bootstrap": "^4.3.1", "bootstrap": "^4.3.1",
"font-awesome": "^4.7.0",
"core-js": "^2.5.4", "core-js": "^2.5.4",
"ngrx-store-localstorage": "^8.0.0", "ngrx-store-localstorage": "^8.0.0",
"resumablejs": "^1.1.0", "resumablejs": "^1.1.0",

View File

@ -1,19 +0,0 @@
import { Component, OnInit } from '@angular/core';
@Component({
selector: 'lib-common-map',
template: `
<p>
common-map works!
</p>
`,
styles: []
})
export class CommonMapComponent implements OnInit {
constructor() { }
ngOnInit() {
}
}

View File

@ -1,4 +1,4 @@
import { NgModule } from '@angular/core'; import { NgModule ,ModuleWithProviders} from '@angular/core';
import { CommonModule } from '@angular/common'; import { CommonModule } from '@angular/common';
import { FormsModule, ReactiveFormsModule } from '@angular/forms'; import { FormsModule, ReactiveFormsModule } from '@angular/forms';
@ -62,6 +62,7 @@ import { WidgetStatusComponent } from './components/widget-status/widget-status.
import { ItemListItemShadowComponent } from './components/item-list-item-shadow/item-list-item-shadow.component'; import { ItemListItemShadowComponent } from './components/item-list-item-shadow/item-list-item-shadow.component';
import { ItemListItemBofekComponent } from './components/item-list-item-bofek/item-list-item-bofek.component'; import { ItemListItemBofekComponent } from './components/item-list-item-bofek/item-list-item-bofek.component';
export { export {
mapEffects, mapEffects,
mapReducer, mapReducer,
@ -171,48 +172,26 @@ export {
// Switch2D3DComponent // Switch2D3DComponent
], ],
entryComponents: [ entryComponents: [
// FeatureListComponent, FeatureListComponent,
// FeatureListCroppingschemeComponent, FeatureListCroppingschemeComponent,
// FeatureListCropfieldComponent, FeatureListCropfieldComponent,
// FeatureListFeatureComponent, FeatureListFeatureComponent,
// FeatureListFeatureCroppingschemeComponent, FeatureListFeatureCroppingschemeComponent,
// FeatureListFeatureCropfieldComponent, FeatureListFeatureCropfieldComponent,
// SelectedItemComponent, SelectedItemComponent,
// SelectedItemCropfieldComponent, SelectedItemCropfieldComponent,
// SelectedItemGeotiffComponent, SelectedItemGeotiffComponent,
// SelectedItemShapeComponent, SelectedItemShapeComponent,
// ItemListComponent, ItemListComponent,
// ItemListItemComponent, ItemListItemComponent,
// ItemWidgetWeatherComponent, ItemWidgetWeatherComponent,
// ItemListItemTemporalComponent, ItemListItemTemporalComponent,
// ItemListItemHeightComponent, ItemListItemHeightComponent,
// ItemListItemTipstarComponent, ItemListItemTipstarComponent,
// ItemListItemWatBalComponent, ItemListItemWatBalComponent,
// ItemListItemShadowComponent, ItemListItemShadowComponent,
// ItemListItemBofekComponent, ItemListItemBofekComponent,
], ],
// providers: [
// StateSerializerService,
// GeolocationService,
// { provide: AbstractFeatureListComponent, useClass: FeatureListCroppingschemeComponent, multi: true },
// { provide: AbstractFeatureListComponent, useClass: FeatureListCropfieldComponent, multi: true },
// { provide: AbstractFeatureListFeatureComponent, useClass: FeatureListFeatureComponent, multi: true },
// { provide: AbstractFeatureListFeatureComponent, useClass: FeatureListFeatureCroppingschemeComponent, multi: true },
// { provide: AbstractFeatureListFeatureComponent, useClass: FeatureListFeatureCropfieldComponent, multi: true },
// { provide: AbstractSelectedItemComponent, useClass: SelectedItemComponent, multi: true },
// { provide: AbstractSelectedItemComponent, useClass: SelectedItemCropfieldComponent, multi: true },
// { provide: AbstractSelectedItemComponent, useClass: SelectedItemGeotiffComponent, multi: true },
// { provide: AbstractSelectedItemComponent, useClass: SelectedItemShapeComponent, multi: true },
// { provide: AbstractItemListItemComponent, useClass: ItemListItemComponent, multi: true },
// { provide: AbstractItemWidgetComponent, useClass: ItemWidgetWeatherComponent, multi: true },
// { provide: AbstractItemListItemComponent, useClass: ItemListItemTemporalComponent, multi: true },
// { provide: AbstractItemListItemComponent, useClass: ItemListItemHeightComponent, multi: true },
// { provide: AbstractItemListItemComponent, useClass: ItemListItemTipstarComponent, multi: true },
// { provide: AbstractItemListItemComponent, useClass: ItemListItemWatBalComponent, multi: true },
// { provide: AbstractItemListItemComponent, useClass: ItemListItemShadowComponent, multi: true },
// { provide: AbstractItemListItemComponent, useClass: ItemListItemBofekComponent, multi: true },
// { provide: AbstractItemListComponent, useClass: ItemListComponent, multi: true }
// ],
exports: [ exports: [
ItemVectorSourceComponent, ItemVectorSourceComponent,
ItemFeaturesSourceComponent, ItemFeaturesSourceComponent,
@ -256,4 +235,33 @@ export {
ZoomToExtentComponent ZoomToExtentComponent
] ]
}) })
export class CommonMapModule { }
export class AppCommonMapModule {
static forRoot(): ModuleWithProviders {
return {
ngModule: AppCommonMapModule,
providers: [
StateSerializerService,
GeolocationService,
{ provide: AbstractFeatureListComponent, useClass: FeatureListCroppingschemeComponent, multi: true },
{ provide: AbstractFeatureListComponent, useClass: FeatureListCropfieldComponent, multi: true },
{ provide: AbstractFeatureListFeatureComponent, useClass: FeatureListFeatureComponent, multi: true },
{ provide: AbstractFeatureListFeatureComponent, useClass: FeatureListFeatureCroppingschemeComponent, multi: true },
{ provide: AbstractFeatureListFeatureComponent, useClass: FeatureListFeatureCropfieldComponent, multi: true },
{ provide: AbstractSelectedItemComponent, useClass: SelectedItemComponent, multi: true },
{ provide: AbstractSelectedItemComponent, useClass: SelectedItemCropfieldComponent, multi: true },
{ provide: AbstractSelectedItemComponent, useClass: SelectedItemGeotiffComponent, multi: true },
{ provide: AbstractSelectedItemComponent, useClass: SelectedItemShapeComponent, multi: true },
{ provide: AbstractItemListItemComponent, useClass: ItemListItemComponent, multi: true },
{ provide: AbstractItemWidgetComponent, useClass: ItemWidgetWeatherComponent, multi: true },
{ provide: AbstractItemListItemComponent, useClass: ItemListItemTemporalComponent, multi: true },
{ provide: AbstractItemListItemComponent, useClass: ItemListItemHeightComponent, multi: true },
{ provide: AbstractItemListItemComponent, useClass: ItemListItemTipstarComponent, multi: true },
{ provide: AbstractItemListItemComponent, useClass: ItemListItemWatBalComponent, multi: true },
{ provide: AbstractItemListItemComponent, useClass: ItemListItemShadowComponent, multi: true },
{ provide: AbstractItemListItemComponent, useClass: ItemListItemBofekComponent, multi: true },
{ provide: AbstractItemListComponent, useClass: ItemListComponent, multi: true }
]
};
}
}

View File

@ -30,7 +30,7 @@ export class GpsLocation implements OnInit,OnChanges{
} }
recalcLocationTolerance() { recalcLocationTolerance() {
this.locTolerancePixels = this.locationTolerance / this.resolution; this.locTolerancePixels = this.resolution >0? this.locationTolerance / this.resolution:0;
} }
ngOnInit() { ngOnInit() {

View File

@ -34,7 +34,7 @@ export class ItemLayersComponent extends LayerGroupComponent implements OnChange
constructor(private itemService: ItemService, @Host() private map: MapComponent, public appConfig: AppConfig) { constructor(private itemService: ItemService, @Host() private map: MapComponent, public appConfig: AppConfig) {
super(map); super(map);
this._apiEndPoint = "";//appConfig.getConfig("apiEndPoint"); this._apiEndPoint = appConfig.getConfig("apiEndPoint");
} }
private styleCache = {} private styleCache = {}

View File

@ -2,7 +2,7 @@ import { Component, Input, Injectable} from '@angular/core';
import { Feature } from 'ol'; import { Feature } from 'ol';
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 } from '@farmmaps/common'; 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';
@ -16,7 +16,7 @@ import { ForItemType } from '../for-item/for-itemtype.decorator';
}) })
export class FeatureListFeatureCropfieldComponent extends AbstractFeatureListFeatureComponent { export class FeatureListFeatureCropfieldComponent extends AbstractFeatureListFeatureComponent {
constructor(store: Store<mapReducers.State | commonReducers.State>, itemTypeService: ItemTypeService) { constructor(store: Store<mapReducers.State | commonReducers.State>, itemTypeService: ItemTypeService,config:AppConfig) {
super(store, itemTypeService); super(store, itemTypeService,config);
} }
} }

View File

@ -2,7 +2,7 @@ import { Component, Input, Injectable} from '@angular/core';
import { Feature } from 'ol'; import { Feature } from 'ol';
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 } from '@farmmaps/common'; 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';
@ -16,7 +16,7 @@ import { ForItemType } from '../for-item/for-itemtype.decorator';
}) })
export class FeatureListFeatureCroppingschemeComponent extends AbstractFeatureListFeatureComponent { export class FeatureListFeatureCroppingschemeComponent extends AbstractFeatureListFeatureComponent {
constructor(store: Store<mapReducers.State | commonReducers.State>, itemTypeService: ItemTypeService) { constructor(store: Store<mapReducers.State | commonReducers.State>, itemTypeService: ItemTypeService,config:AppConfig) {
super(store, itemTypeService); super(store, itemTypeService,config);
} }
} }

View File

@ -1,6 +1,6 @@
<div *ngIf="feature;let feature" class="row m-0"> <div *ngIf="feature;let feature" class="row m-0">
<div class="col-3 m-0 p-2 thumbnail"> <div class="col-3 m-0 p-2 thumbnail">
<img *ngIf="feature.get('thumbnail')" [src]="'/api/v1/items/'+feature.get('code')+'/thumbnail'" /> <img *ngIf="feature.get('thumbnail')" [src]="config.getConfig('apiEndPoint') + '/api/v1/items/'+feature.get('code')+'/thumbnail'" />
<div *ngIf="!feature.get('thumbnail')" [style.background-color]="itemTypeService.getColor(feature.get('itemType'))"> <div *ngIf="!feature.get('thumbnail')" [style.background-color]="itemTypeService.getColor(feature.get('itemType'))">
<i [ngClass]="itemTypeService.getIcon(feature.get('itemType'))"></i> <i [ngClass]="itemTypeService.getIcon(feature.get('itemType'))"></i>
</div> </div>

View File

@ -2,7 +2,7 @@ import { Component, Input, Injectable} from '@angular/core';
import { Feature } from 'ol'; import { Feature } from 'ol';
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 } from '@farmmaps/common'; import { commonReducers,ItemTypeService,AppConfig } from '@farmmaps/common';
@ -10,7 +10,7 @@ import { commonReducers,ItemTypeService } from '@farmmaps/common';
export abstract class AbstractFeatureListFeatureComponent { export abstract class AbstractFeatureListFeatureComponent {
@Input() feature: Feature @Input() feature: Feature
constructor(public store: Store<mapReducers.State | commonReducers.State>, public itemTypeService: ItemTypeService) { constructor(public store: Store<mapReducers.State | commonReducers.State>, public itemTypeService: ItemTypeService,public config:AppConfig) {
} }
} }
@ -22,7 +22,7 @@ export abstract class AbstractFeatureListFeatureComponent {
}) })
export class FeatureListFeatureComponent extends AbstractFeatureListFeatureComponent { export class FeatureListFeatureComponent extends AbstractFeatureListFeatureComponent {
constructor(store: Store<mapReducers.State | commonReducers.State>, itemTypeService: ItemTypeService) { constructor(store: Store<mapReducers.State | commonReducers.State>, itemTypeService: ItemTypeService, config:AppConfig) {
super(store, itemTypeService); super(store, itemTypeService,config);
} }
} }

View File

@ -225,7 +225,7 @@ export class MapComponent implements OnInit, OnDestroy,AfterViewInit {
replaceUrl(mapState: IMapState, queryState: IQueryState, replace: boolean = true) { replaceUrl(mapState: IMapState, queryState: IQueryState, replace: boolean = true) {
//console.log(`Replace url :${mapState.baseLayerCode}`) //console.log(`Replace url :${mapState.baseLayerCode}`)
this.router.navigate([".", mapState.xCenter.toFixed(5), mapState.yCenter.toFixed(5), mapState.zoom, mapState.rotation.toFixed(2), mapState.baseLayerCode, this.serializeService.serialize(queryState)], { replaceUrl: replace,relativeTo:this.route.parent.parent }); this.router.navigate([".", mapState.xCenter.toFixed(5), mapState.yCenter.toFixed(5), mapState.zoom, mapState.rotation.toFixed(2), mapState.baseLayerCode, this.serializeService.serialize(queryState)], { replaceUrl: replace,relativeTo:this.route.parent });
} }
handleOnMoveEnd(event) { handleOnMoveEnd(event) {
@ -251,8 +251,6 @@ export class MapComponent implements OnInit, OnDestroy,AfterViewInit {
this.store.dispatch(new mapActions.CollapseSearch()); this.store.dispatch(new mapActions.CollapseSearch());
} }
handleOnDownload(event) { handleOnDownload(event) {
} }

View File

@ -0,0 +1,297 @@
import { Component, OnInit, OnDestroy, HostListener, Inject, ViewChild, AfterViewInit } from '@angular/core';
import { Location } from '@angular/common';
import { Observable, Subject, Subscription,combineLatest, from } from 'rxjs';
import { debounce, withLatestFrom, first, combineAll } from 'rxjs/operators';
import { Router, ActivatedRoute, ParamMap, Event } from '@angular/router';
import { Store } from '@ngrx/store';
//import { proj,Map } from 'openlayers';
// Map
import * as mapReducers from './reducers/map.reducer';
import * as mapActions from './actions/map.actions';
import { IMapState,ISelectedFeatures,IItemLayer, ItemLayer,IQueryState,IPeriodState } from './models';
import { IDroppedFile } from './components/aol/file-drop-target/file-drop-target.component';
import { IMetaData } from './components/meta-data-modal/meta-data-modal.component';
import { StateSerializerService } from './services/state-serializer.service';
import { GeolocationService} from './services/geolocation.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 {Extent,createEmpty,extend } from 'ol/extent';
import {transform} from 'ol/proj';
import { query } from '@angular/animations';
import { tassign } from 'tassign';
@Component({
selector: 'map',
templateUrl: './map.component.html',
styleUrls: ['./map.component.scss']
})
export class MapComponent implements OnInit, OnDestroy,AfterViewInit {
title: string = 'Map';
public openedModalName: Observable<string>;
public itemTypes: Observable<{ [id: string]: IItemType }>;
public mapState: Observable<IMapState>;
public features: Observable<Array<Feature>>;
public overlayLayers: Observable<Array<IItemLayer>>;
public selectedOverlayLayer: Observable<IItemLayer>;
public selectedItemLayer: Observable<IItemLayer>;
public baseLayers: Observable<Array<IItemLayer>>;
public selectedBaseLayer: Observable<IItemLayer>;
public projection: Observable<string>;
public selectedFeatures: Subject<ISelectedFeatures> = new Subject<ISelectedFeatures>();
public droppedFile: Subject<IDroppedFile> = new Subject<IDroppedFile>();
private paramSub: Subscription;
private itemTypeSub: Subscription;
private mapStateSub: Subscription;
private queryStateSub: Subscription;
public parentCode: Observable<string>;
public panelVisible: Observable<boolean>;
public panelCollapsed: Observable<boolean>;
public selectedFeature: Observable<Feature>;
public selectedItem: Observable<IItem>;
public queryState: Observable<IQueryState>;
public period: Observable<IPeriodState>;
public clearEnabled: Observable<boolean>;
public searchCollapsed: Observable<boolean>;
public searchMinified: Observable<boolean>;
public menuVisible: Observable<boolean>;
public query: Observable<IQueryState>;
public position: Observable<Position>;
public baseLayersCollapsed:boolean = true;
public overlayLayersCollapsed: boolean = true;
public extent: Observable<Extent>;
@ViewChild('map') map;
constructor(private store: Store<mapReducers.State | commonReducers.State>, private route: ActivatedRoute, private router: Router, private uploadService: ResumableFileUploadService, private serializeService: StateSerializerService, public itemTypeService: ItemTypeService, private location: Location, private geolocationService: GeolocationService ) {
}
@HostListener('document:keyup', ['$event'])
escapeClose(event: KeyboardEvent) {
let x = event.keyCode;
if (x === 27) {
this.handleCloseModal()
}
}
handleOpenModal(modalName: string) {
this.store.dispatch(new commonActions.OpenModal(modalName));
}
handleCloseModal() {
this.store.dispatch(new commonActions.CloseModal());
}
handleFileDropped(droppedFile: IDroppedFile) {
this.uploadService.addFiles(droppedFile.files, droppedFile.event, { parentCode:droppedFile.parentCode, geometry:droppedFile.geometry });
}
handleFeaturesSelected(feature: Feature) {
if (feature) {
let newQuery = tassign(mapReducers.initialQueryState, { itemCode: feature.get('code') });
this.store.dispatch(new mapActions.DoQuery(newQuery));
}
}
handleSearch(queryState: IQueryState) {
this.store.dispatch(new mapActions.DoQuery(queryState));
}
ngOnInit() {
this.store.dispatch(new mapActions.Init());
this.selectedFeatures.next({x:0,y:0,features:[]});
this.mapState = this.store.select(mapReducers.selectGetMapState);
this.parentCode = this.store.select(mapReducers.selectGetParentCode);
this.features = this.store.select(mapReducers.selectGetFeatures);
this.overlayLayers = this.store.select(mapReducers.selectGetOverlayLayers);
this.selectedOverlayLayer = this.store.select(mapReducers.selectGetSelectedOverlayLayer);
this.baseLayers = this.store.select(mapReducers.selectGetBaseLayers);
this.projection = this.store.select(mapReducers.selectGetProjection);
this.selectedBaseLayer = this.store.select(mapReducers.selectGetSelectedBaseLayer);
this.panelVisible = this.store.select(mapReducers.selectGetPanelVisible);
this.panelCollapsed = this.store.select(mapReducers.selectGetPanelCollapsed);
this.selectedFeature = this.store.select(mapReducers.selectGetSelectedFeature);
this.selectedItem = this.store.select(mapReducers.selectGetSelectedItem);
this.queryState = this.store.select(mapReducers.selectGetQueryState);
this.clearEnabled = this.store.select(mapReducers.selectGetClearEnabled);
this.searchCollapsed = this.store.select(mapReducers.selectGetSearchCollapsed);
this.searchMinified = this.store.select(mapReducers.selectGetSearchMinified);
this.menuVisible = this.store.select(mapReducers.selectGetMenuVisible);
this.openedModalName = this.store.select(commonReducers.selectOpenedModalName);
this.query = this.store.select(mapReducers.selectGetQuery);
this.extent = this.store.select(mapReducers.selectGetExtent);
this.selectedFeatures.next(null);
this.selectedItemLayer = this.store.select(mapReducers.selectGetSelectedItemLayer);
this.period = this.store.select(mapReducers.selectGetPeriod);
this.position = this.geolocationService.getCurrentPosition();
this.mapState.pipe(withLatestFrom(this.queryState)).subscribe((state) => {
this.replaceUrl(state[0], state[1], true);
});
this.query.pipe(withLatestFrom(this.mapState)).subscribe((state) => {
this.replaceUrl(state[1], state[0],false);
});
}
private stateSetCount: number = 0;
private lastQueryState: string = this.serializeService.serialize(mapReducers.initialQueryState);
private lastMapState: string = "";
ngAfterViewInit() {
this.paramSub = this.route.paramMap.subscribe((params: ParamMap) => {
//console.log("Param sub");
var newMapState: IMapState = null;
var newQueryState: IQueryState = null;
var mapStateChanged = false;
var queryStateChanged = false;
if (params.has("xCenter") && params.has("yCenter")) {
let xCenter = parseFloat(params.get("xCenter"));
let yCenter = parseFloat(params.get("yCenter"));
let zoom = parseFloat(params.get("zoom"));
let rotation = parseFloat(params.get("rotation"));
let baseLayer = params.get("baseLayer");
newMapState = { xCenter: xCenter, yCenter: yCenter, zoom: zoom, rotation: rotation, baseLayerCode: baseLayer }
mapStateChanged = this.lastMapState != JSON.stringify(newMapState) && this.stateSetCount == 0;
this.lastMapState = JSON.stringify(newMapState);
//console.log(`Base layer: ${newMapState.baseLayerCode}`)
}
if (params.has("queryState")) {
let queryState = params.get("queryState");
newQueryState = tassign(mapReducers.initialQueryState);
if (queryState != "") {
newQueryState = this.serializeService.deserialize(queryState);
}
queryStateChanged = this.lastQueryState != queryState;
this.lastQueryState = queryState;
}
if (mapStateChanged && queryStateChanged) {
//console.log("Both states");
this.store.dispatch(new mapActions.SetState(newMapState, newQueryState));
} else if (mapStateChanged) {
//console.log("Map state");
this.store.dispatch(new mapActions.SetMapState(newMapState));
} else if (queryStateChanged) {
//console.log("Query state");
this.store.dispatch(new mapActions.SetQueryState(newQueryState));
}
this.stateSetCount += 1;
});
setTimeout(() => {
this.map.instance.updateSize();
}, 500);
}
handleSearchCollapse(event) {
this.store.dispatch(new mapActions.CollapseSearch());
}
handleSearchExpand(event) {
this.store.dispatch(new mapActions.ExpandSearch());
}
handleToggleMenu(event) {
this.store.dispatch(new mapActions.ToggleMenu());
}
handleToggleBaseLayers(event:MouseEvent) {
this.baseLayersCollapsed = !this.baseLayersCollapsed;
event.preventDefault();
}
handleToggleOverlayLayers(event: MouseEvent) {
this.overlayLayersCollapsed = !this.overlayLayersCollapsed;
event.preventDefault();
}
handlePredefinedQuery(event: MouseEvent, query: any) {
event.preventDefault();
var queryState = tassign(mapReducers.initialQueryState, query);
this.store.dispatch(new mapActions.DoQuery(queryState));
}
handleTrijntjeClick(event: MouseEvent, query: any) {
event.preventDefault();
var queryState = tassign(mapReducers.initialQueryState, query);
var mapState = JSON.parse(this.lastMapState);
this.router.navigate(["app","trijntje" , mapState.xCenter.toFixed(5), mapState.yCenter.toFixed(5), mapState.zoom, mapState.rotation.toFixed(2), mapState.baseLayerCode, this.serializeService.serialize(queryState)], { replaceUrl: false });
}
replaceUrl(mapState: IMapState, queryState: IQueryState, replace: boolean = true) {
//console.log(`Replace url :${mapState.baseLayerCode}`)
this.router.navigate([".", mapState.xCenter.toFixed(5), mapState.yCenter.toFixed(5), mapState.zoom, mapState.rotation.toFixed(2), mapState.baseLayerCode, this.serializeService.serialize(queryState)], { replaceUrl: replace,relativeTo:this.route.parent.parent });
}
handleOnMoveEnd(event) {
var map = event.map;
var view = map.getView();
var rotation = view.getRotation();
var zoom = view.getZoom();
var center = transform(view.getCenter(), view.getProjection(), "EPSG:4326");
var extent = view.calculateExtent(this.map.instance.getSize());
let mapState: IMapState = { xCenter: center[0], yCenter: center[1], zoom: zoom, rotation: rotation, baseLayerCode: null };
let state = { mapState: mapState, extent: extent };
let source = from([state]);
source.pipe(withLatestFrom(this.selectedBaseLayer), withLatestFrom(this.queryState)).subscribe(([[state, baselayer], queryState]) => {
if (mapState && baselayer && queryState) {
let newMapState = tassign(state.mapState, { baseLayerCode: baselayer.item.code });
this.replaceUrl(newMapState, tassign(queryState, { bbox: queryState.bboxFilter ? state.extent : queryState.bbox }));
this.store.dispatch(new mapActions.SetViewExtent(state.extent));
}
});
}
handleOnMouseDown(event: MouseEvent) {
this.store.dispatch(new mapActions.CollapseSearch());
}
handleOnDownload(event) {
}
handleClearSearch(event) {
this.store.dispatch(new commonActions.Escape(true, false));
}
handleOnDelete(itemLayer: IItemLayer) {
this.store.dispatch(new mapActions.RemoveLayer(itemLayer));
}
handleOnToggleVisibility(itemLayer: IItemLayer) {
this.store.dispatch(new mapActions.SetVisibility(itemLayer,!itemLayer.visible));
}
handleOnSetOpacity(event:{ layer: IItemLayer,opacity:number }) {
this.store.dispatch(new mapActions.SetOpacity(event.layer, event.opacity));
}
handleZoomToExtent(itemLayer: IItemLayer) {
var extent = createEmpty();
extend(extent, itemLayer.layer.getExtent());
if (extent) {
this.store.dispatch(new mapActions.SetExtent(extent));
}
}
handleSelectBaseLayer(itemLayer: IItemLayer) {
this.store.dispatch(new mapActions.SelectBaseLayer(itemLayer));
}
handleSelectOverlayLayer(itemLayer: IItemLayer) {
this.store.dispatch(new mapActions.SelectOverlayLayer(itemLayer));
}
ngOnDestroy() {
this.paramSub.unsubscribe();
if (this.itemTypeSub) this.itemTypeSub.unsubscribe();
if (this.mapStateSub) this.mapStateSub.unsubscribe();
if (this.queryStateSub) this.queryStateSub.unsubscribe(); }
}

View File

@ -15,7 +15,7 @@ export class ItemTypeService {
} }
getIcon(itemType: string) { getIcon(itemType: string) {
var icon = "fa-file-o"; var icon = "fa fa-file-o";
if (this.itemTypes[itemType]) icon = this.itemTypes[itemType].icon; if (this.itemTypes[itemType]) icon = this.itemTypes[itemType].icon;
return icon; return icon;
} }

View File

@ -1,13 +1,28 @@
import { NgModule } from '@angular/core'; import { NgModule } from '@angular/core';
import { RouterModule } from '@angular/router'; import { RouterModule } from '@angular/router';
import { AuthGuard } from '@farmmaps/common'; import { AuthGuard,FullScreenGuard } from '@farmmaps/common';
import { MapComponent} from '@farmmaps/common-map';
import { AppContentComponent} from './app-content.component'; import { AppContentComponent} from './app-content.component';
import { AppSidePanelTestComponent } from './app-side-panel-test.component'; import { AppSidePanelTestComponent } from './app-side-panel-test.component';
const routes = [ const routes = [
{ path: '', canLoad: [AuthGuard], component: AppContentComponent}, {
{ path: 'sidepanel', canLoad: [AuthGuard], component: AppSidePanelTestComponent} path: '',
redirectTo: 'map',
pathMatch: 'full'
},
{ path: 'sidepanel', canLoad: [AuthGuard], component: AppSidePanelTestComponent},
{ path: 'map', canActivateChild: [AuthGuard],canActivate:[FullScreenGuard], children: [
{
path: '',
component: MapComponent
},
{
path: ':xCenter/:yCenter/:zoom/:rotation/:baseLayer/:queryState',
component: MapComponent
}
]},
]; ];
@NgModule({ @NgModule({

View File

@ -0,0 +1,21 @@
@import "theme.scss";
$fa-font-path: "~font-awesome/fonts";
@import "~bootstrap/scss/bootstrap.scss";
@import "~font-awesome/scss/font-awesome.scss";
:host ::ng-deep .btn:focus {
box-shadow:none;
}
:host ::ng-deep .input-group > .form-control:focus {
z-index: auto;
}
:host ::ng-deep .form-control:focus {
box-shadow: none;
border-color: $input-border-color;
}

View File

@ -3,7 +3,7 @@ import { Component } from '@angular/core';
@Component({ @Component({
selector: 'app-root', selector: 'app-root',
templateUrl: './app.component.html', templateUrl: './app.component.html',
styleUrls: ['./app.component.css'] styleUrls: ['./app.component.scss']
}) })
export class AppComponent { export class AppComponent {
title = 'farmmaps-lib-app'; title = 'farmmaps-lib-app';

View File

@ -10,6 +10,7 @@ import { AppComponent } from './app.component';
import { AppContentComponent } from './app-content.component'; import { AppContentComponent } from './app-content.component';
import { AppSidePanelTestComponent } from './app-side-panel-test.component'; import { AppSidePanelTestComponent } from './app-side-panel-test.component';
import { AppCommonModule } from '@farmmaps/common'; import { AppCommonModule } from '@farmmaps/common';
import { AppCommonMapModule} from '@farmmaps/common-map';
import {StoreModule, Store} from '@ngrx/store'; import {StoreModule, Store} from '@ngrx/store';
import {EffectsModule, EffectSources} from '@ngrx/effects'; import {EffectsModule, EffectSources} from '@ngrx/effects';
@ -51,6 +52,7 @@ export function provideBootstrapEffects(effects: Type<any>[]) {
imports: [ imports: [
AppRoutingModule, AppRoutingModule,
AppCommonModule.forRoot() , AppCommonModule.forRoot() ,
AppCommonMapModule.forRoot(),
BrowserModule, BrowserModule,
StoreModule.forRoot({}), StoreModule.forRoot({}),
EffectsModule.forRoot([]) EffectsModule.forRoot([])

3
src/app/theme.scss Normal file
View File

@ -0,0 +1,3 @@
//$theme-colors: ( "primary": #a7ce39, "secondary": #ffc800 );
//$theme-colors: ( "primary": #a7ce39);

View File

Before

Width:  |  Height:  |  Size: 5.3 KiB

After

Width:  |  Height:  |  Size: 5.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

View File

@ -0,0 +1,7 @@
<html>
<body>
<script>
parent.postMessage(location.hash, location.origin);
</script>
</body>
</html>

View File

@ -1,8 +1,8 @@
{ {
"issuer": "http://accounts.awtest.nl", "issuer": "http://accounts.awtest.nl",
"clientId": "v1t", "clientId": "v1t",
"audience": "http://localhost:8083/,http://awtest.nl/,http://aan.awtest.nl", "audience": "http://farmmaps.awtest.nl/,http://awtest.nl/,http://aan.awtest.nl",
"requireHttps": false, "requireHttps": false,
"apiEndPoint": "http://localhost:8083" "apiEndPoint": "http://farmmaps.awtest.nl"
} }

View File

@ -7,7 +7,6 @@
<meta name="viewport" content="width=device-width, initial-scale=1"> <meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="icon" type="image/x-icon" href="favicon.ico"> <link rel="icon" type="image/x-icon" href="favicon.ico">
<link href="assets/bootstrap.min.css" rel="stylesheet">
</head> </head>
<body> <body>
<app-root></app-root> <app-root></app-root>