14 Commits

Author SHA1 Message Date
35ccb4f4c5 Merge branch 'develop'
All checks were successful
FarmMaps/FarmMapsLib/pipeline/head This commit looks good
2024-04-23 11:54:04 +02:00
jenkins
47fbc5eab9 [ci skip] Updated packages #62
Some checks reported errors
FarmMaps/FarmMapsLib/pipeline/head Something is wrong with the build of this commit
2024-03-20 12:00:40 +00:00
564d08b5b9 Fixed build
All checks were successful
FarmMaps/FarmMapsLib/pipeline/head This commit looks good
2024-03-20 11:59:14 +00:00
7e17a49dc6 Merge branch 'develop'
Some checks failed
FarmMaps/FarmMapsLib/pipeline/head There was a failure building this commit
# Conflicts:
#	package-lock.json
#	package.json
2024-03-19 16:04:26 +01:00
jenkins
3f286ee042 [ci skip] Updated packages #58
Some checks reported errors
FarmMaps/FarmMapsLib/pipeline/head Something is wrong with the build of this commit
2024-02-29 13:56:31 +00:00
747499d009 Merge branch 'develop'
All checks were successful
FarmMaps/FarmMapsLib/pipeline/head This commit looks good
# Conflicts:
#	package-lock.json
#	package.json
2024-02-29 14:54:59 +01:00
jenkins
c4f4a4f61e [ci skip] Changed by Jenkins: 57
Some checks reported errors
FarmMaps/FarmMapsLib/pipeline/head Something is wrong with the build of this commit
2024-01-24 17:19:55 +00:00
6b095b7f49 Trigger build
All checks were successful
FarmMaps/FarmMapsLib/pipeline/head This commit looks good
2024-01-24 17:18:09 +00:00
b2791eb80b Merge branch 'develop'
Some checks reported errors
FarmMaps/FarmMapsLib/pipeline/head Something is wrong with the build of this commit
# Conflicts:
#	README.md
#	package-lock.json
#	package.json
2024-01-24 18:13:28 +01:00
jenkins
4c93a9f766 [ci skip] Changed by Jenkins: 56
Some checks reported errors
FarmMaps/FarmMapsLib/pipeline/head Something is wrong with the build of this commit
2023-11-16 17:02:44 +00:00
93554bc7c4 Update README.md
All checks were successful
FarmMaps/FarmMapsLib/pipeline/head This commit looks good
2023-11-16 16:40:14 +00:00
d074cd81cf Merge branch 'develop'
Some checks reported errors
FarmMaps/FarmMapsLib/pipeline/head Something is wrong with the build of this commit
2023-11-16 17:37:13 +01:00
87547aafcc Update Jenkinsfile
Some checks failed
FarmMaps/FarmMapsLib/pipeline/head There was a failure building this commit
2023-10-20 12:20:24 +00:00
6ab5ba8a56 Update Jenkinsfile.develop 2023-10-20 12:20:13 +00:00
258 changed files with 19644 additions and 21259 deletions

View File

@@ -2,6 +2,7 @@
This is a sample FarmMaps client in Angular 7.x. This is a sample FarmMaps client in Angular 7.x.
## Quick start ## Quick start
Use one of the two options below to get started. Use one of the two options below to get started.

View File

@@ -129,7 +129,7 @@
"extract-i18n": { "extract-i18n": {
"builder": "@angular-devkit/build-angular:extract-i18n", "builder": "@angular-devkit/build-angular:extract-i18n",
"options": { "options": {
"buildTarget": "farmmaps-lib-app:build" "browserTarget": "farmmaps-lib-app:build"
} }
}, },
"test": { "test": {
@@ -209,8 +209,8 @@
"options": { "options": {
"tsConfig": "projects/common-map/tsconfig.lib.json", "tsConfig": "projects/common-map/tsconfig.lib.json",
"project": "projects/common-map/ng-package.json" "project": "projects/common-map/ng-package.json"
}, }
"configurations": { , "configurations": {
"production": { "production": {
"tsConfig": "projects/common-map/tsconfig.lib.prod.json" "tsConfig": "projects/common-map/tsconfig.lib.prod.json"
} }
@@ -253,72 +253,9 @@
} }
} }
} }
},
"ng-openlayers": {
"projectType": "library",
"root": "projects/ng-openlayers",
"sourceRoot": "projects/ng-openlayers/src",
"prefix": "ng-openlayers",
"architect": {
"build": {
"builder": "@angular-devkit/build-angular:ng-packagr",
"options": {
"tsConfig": "projects/ng-openlayers/tsconfig.lib.json",
"project": "projects/ng-openlayers/ng-package.json"
},
"configurations": {
"production": {
"tsConfig": "projects/ng-openlayers/tsconfig.lib.prod.json"
}
}
},
"test": {
"builder": "@angular-devkit/build-angular:karma",
"options": {
"main": "projects/ng-openlayers/src/test.ts",
"tsConfig": "projects/ng-openlayers/tsconfig.spec.json",
"karmaConfig": "projects/ng-openlayers/karma.conf.js"
}
},
"lint": {
"builder": "@angular-eslint/builder:lint",
"options": {
"lintFilePatterns": [
"projects/ng-openlayers/**/*.ts",
"projects/ng-openlayers/**/*.html"
]
}
}
}
} }
}, },
"cli": { "cli": {
"analytics": false "analytics": false
},
"schematics": {
"@schematics/angular:component": {
"type": "component"
},
"@schematics/angular:directive": {
"type": "directive"
},
"@schematics/angular:service": {
"type": "service"
},
"@schematics/angular:guard": {
"typeSeparator": "."
},
"@schematics/angular:interceptor": {
"typeSeparator": "."
},
"@schematics/angular:module": {
"typeSeparator": "."
},
"@schematics/angular:pipe": {
"typeSeparator": "."
},
"@schematics/angular:resolver": {
"typeSeparator": "."
}
} }
} }

View File

@@ -1,224 +0,0 @@
PS DFarmmapsFarmMapsLib ng update @angularcore@19 @angularcli@19
The installed Angular CLI version is outdated.
Installing a temporary Angular CLI versioned 19.2.19 to perform the update.
Using package manager npm
Collecting installed dependencies...
Found 68 dependencies.
Fetching dependency metadata from registry...
Updating package.json with dependency @angular-devkitbuild-angular @ 19.2.19 (was 18.2.3)...
Updating package.json with dependency @angularcli @ 19.2.19 (was 18.2.3)...
Updating package.json with dependency @angularcompiler-cli @ 19.2.18 (was 18.2.3)...
Updating package.json with dependency @angularlanguage-service @ 19.2.18 (was 18.2.3)...
Updating package.json with dependency @angularlocalize @ 19.2.18 (was 18.2.3)...
Updating package.json with dependency ng-packagr @ 19.2.2 (was 18.2.1)...
Updating package.json with dependency typescript @ 5.8.3 (was 5.4.4)...
Updating package.json with dependency @angularanimations @ 19.2.18 (was 18.2.3)...
Updating package.json with dependency @angularcommon @ 19.2.18 (was 18.2.3)...
Updating package.json with dependency @angularcompiler @ 19.2.18 (was 18.2.3)...
Updating package.json with dependency @angularcore @ 19.2.18 (was 18.2.3)...
Updating package.json with dependency @angularforms @ 19.2.18 (was 18.2.3)...
Updating package.json with dependency @angularplatform-browser @ 19.2.18 (was 18.2.3)...
Updating package.json with dependency @angularplatform-browser-dynamic @ 19.2.18 (was 18.2.3)...
Updating package.json with dependency @angularrouter @ 19.2.18 (was 18.2.3)...
Updating package.json with dependency zone.js @ 0.15.1 (was 0.14.10)...
UPDATE package.json (2923 bytes)
✔ Cleaning node modules directory
✔ Installing packages
Executing migrations of package '@angularcli'
Update '@angularssr' import paths to use the new 'node' entry point when 'CommonEngine' is detected.
Migration completed (No changes made).
Update the workspace configuration by replacing deprecated options in 'angular.json' for compatibility with the latest Angular CLI changes.
UPDATE angular.json (9341 bytes)
Migration completed (1 file modified).
Optional migrations of package '@angularcli'
This package has 1 optional migration that can be executed.
Optional migrations may be skipped and executed after the update process, if preferred.
Select the migrations that you'd like to run [use-application-builder] Migrate application projects to the new build system.
(httpsangular.devtoolsclibuild-system-migration)
Migrate application projects to the new build system.
Application projects that are using the '@angular-devkitbuild-angular' package's 'browser' andor 'browser-esbuild' builders will be migrated to use the new 'application' builder.
You can read more about this, including known issues and limitations, here httpsangular.devtoolsclibuild-system-migration
Cannot update project farmmaps-lib-app to use the application builder. Only @angular-devkitbuild-angularbrowser-esbuild and @angular-devkitbuild-angularbrowser can be automatically migrated.
UPDATE tsconfig.json (902 bytes)
Migration completed (1 file modified).
Executing migrations of package '@angularcore'
Updates non-standalone Directives, Component and Pipes to 'standalonefalse' and removes 'standalonetrue' from those who are standalone.
UPDATE srcappapp.component.ts (374 bytes)
UPDATE srcapplogologo.component.ts (349 bytes)
UPDATE srcappmenumenu.component.ts (750 bytes)
UPDATE srcappregisterdeviceregisterdevice.component.ts (334 bytes)
UPDATE projectscommonsrcfmcomponentsauth-callbackauth-callback.component.ts (731 bytes)
UPDATE projectscommonsrcfmcomponentssession-clearedsession-cleared.component.ts (755 bytes)
UPDATE projectscommonsrcfmcomponentsnot-foundnot-found.component.ts (315 bytes)
UPDATE projectscommonsrcfmcomponentsapp-menuapp-menu.component.ts (870 bytes)
UPDATE projectscommonsrcfmcomponentsappapp.component.ts (8994 bytes)
UPDATE projectscommonsrcfmcomponentsavataravatar.component.ts (1240 bytes)
UPDATE projectscommonsrcfmcomponentsback-buttonback-button.component.ts (712 bytes)
UPDATE projectscommonsrcfmcomponentsedit-image-modaledit-image-modal.component.ts (2388 bytes)
UPDATE projectscommonsrcfmcomponentsgradient-selectgradient-select.component.ts (1714 bytes)
UPDATE projectscommonsrcfmcomponentsgradientgradient.component.ts (1423 bytes)
UPDATE projectscommonsrcfmcomponentshas-claimhas-claim.directive.ts (1217 bytes)
UPDATE projectscommonsrcfmcomponentshas-packagehas-package.directive.ts (1889 bytes)
UPDATE projectscommonsrcfmcomponentshas-rolehas-role.directive.ts (1216 bytes)
UPDATE projectscommonsrcfmcomponentshelp-menuhelp-menu.component.ts (908 bytes)
UPDATE projectscommonsrcfmcomponentssetting-menusetting-menu.component.ts (958 bytes)
UPDATE projectscommonsrcfmcomponentsitem-linkitem-link.component.ts (1304 bytes)
UPDATE projectscommonsrcfmcomponentsmenu-backgroundmenu-background.component.ts (800 bytes)
UPDATE projectscommonsrcfmcomponentsnot-implementednot-implemented.component.ts (280 bytes)
UPDATE projectscommonsrcfmcomponentsnotification-menunotification-menu.component.ts (941 bytes)
UPDATE projectscommonsrcfmcomponentspackage-existspackage-exists.directive.ts (1898 bytes)
UPDATE projectscommonsrcfmcomponentsresumable-file-uploadresumable-file-upload.component.ts (1774 bytes)
UPDATE projectscommonsrcfmcomponentsside-panelside-panel.component.ts (2839 bytes)
UPDATE projectscommonsrcfmcomponentstag-inputtag-input.component.ts (2990 bytes)
UPDATE projectscommonsrcfmcomponentsthumbnailthumbnail.component.ts (2968 bytes)
UPDATE projectscommonsrcfmcomponentstimespantimespan.component.ts (22797 bytes)
UPDATE projectscommonsrcfmcomponentsuser-menuuser-menu.component.ts (1174 bytes)
UPDATE projectscommonsrcfmsharedsafe.pipe.ts (352 bytes)
UPDATE srcapptesttest.component.ts (784 bytes)
UPDATE srcapplandingpagelandingpage.component.ts (482 bytes)
UPDATE projectscommon-mapsrcfm-mapcomponentsaolfile-drop-targetfile-drop-target.component.ts (2615 bytes)
UPDATE projectscommon-mapsrcfm-mapcomponentsmapmap.component.ts (22343 bytes)
UPDATE projectscommon-mapsrcfm-mapcomponentsaolgps-locationgps-location.component.ts (2719 bytes)
UPDATE projectscommon-mapsrcfm-mapcomponentsaolitem-layersitem-layers.component.ts (20542 bytes)
UPDATE projectscommon-mapsrcfm-mapcomponentsaolitem-vector-sourceitem-vector-source.component.ts (9990 bytes)
UPDATE projectscommon-mapsrcfm-mapcomponentsaollayer-listlayer-list.component.ts (2070 bytes)
UPDATE projectscommon-mapsrcfm-mapcomponentsaollayer-valueslayer-values.component.ts (2528 bytes)
UPDATE projectscommon-mapsrcfm-mapcomponentsaollayer-vector-imagelayer-vector-image.component.ts (882 bytes)
UPDATE projectscommon-mapsrcfm-mapcomponentsaolpan-to-locationpan-to-location.component.ts (2836 bytes)
UPDATE projectscommon-mapsrcfm-mapcomponentsaolrotation-resetrotation-reset.component.ts (1054 bytes)
UPDATE projectscommon-mapsrcfm-mapcomponentsaolzoom-to-extentzoom-to-extent.component.ts (2064 bytes)
UPDATE projectscommon-mapsrcfm-mapcomponentsfeature-listfeature-list.component.ts (2505 bytes)
UPDATE projectscommon-mapsrcfm-mapcomponentswidget-hostwidget-host.directive.ts (236 bytes)
UPDATE projectscommon-mapsrcfm-mapcomponentsfeature-list-containerfeature-list-container.component.ts (4111 bytes)
UPDATE projectscommon-mapsrcfm-mapcomponentsfeature-list-cropfieldfeature-list-cropfield.component.ts (1336 bytes)
UPDATE projectscommon-mapsrcfm-mapcomponentsfeature-list-observationfeature-list-observation.component.ts (1346 bytes)
UPDATE projectscommon-mapsrcfm-mapcomponentsfeature-list-croppingschemefeature-list-croppingscheme.component.ts (1497 bytes)
UPDATE projectscommon-mapsrcfm-mapcomponentsfeature-list-featurefeature-list-feature.component.ts (1090 bytes)
UPDATE projectscommon-mapsrcfm-mapcomponentsfeature-list-feature-containerfeature-list-feature-container.component.ts (2433 bytes)
UPDATE projectscommon-mapsrcfm-mapcomponentsfeature-list-feature-cropfieldfeature-list-feature-cropfield.component.ts (1389 bytes)
UPDATE projectscommon-mapsrcfm-mapcomponentsfeature-list-feature-croppingschemefeature-list-feature-croppingscheme.component.ts (1026 bytes)
UPDATE projectscommon-mapsrcfm-mapcomponentsfeature-thumbnailfeature-thumbnail.component.ts (2709 bytes)
UPDATE projectscommon-mapsrcfm-mapcomponentsif-zoom-to-showif-zoom-to-show.directive.ts (1853 bytes)
UPDATE projectscommon-mapsrcfm-mapcomponentsitem-list-itemitem-list-item.component.ts (1476 bytes)
UPDATE projectscommon-mapsrcfm-mapcomponentsitem-list-item-containeritem-list-item-container.component.ts (2644 bytes)
UPDATE projectscommon-mapsrcfm-mapcomponentsitem-listitem-list.component.ts (1373 bytes)
UPDATE projectscommon-mapsrcfm-mapcomponentsitem-widget-listitem-widget-list.component.ts (1963 bytes)
UPDATE projectscommon-mapsrcfm-mapcomponentslayer-switcherlayer-switcher.component.ts (3132 bytes)
UPDATE projectscommon-mapsrcfm-mapcomponentslegendhistogram-detailshistogram-details.component.ts (784 bytes)
UPDATE projectscommon-mapsrcfm-mapcomponentslegendlegend.component.ts (2698 bytes)
UPDATE projectscommon-mapsrcfm-mapcomponentslegendstatistics-detailsstatistics-details.component.ts (848 bytes)
UPDATE projectscommon-mapsrcfm-mapcomponentsmap-searchmap-search.component.ts (7783 bytes)
UPDATE projectscommon-mapsrcfm-mapcomponentsmeta-data-modalmeta-data-modal.component.ts (2038 bytes)
UPDATE projectscommon-mapsrcfm-mapcomponentsselect-period-modalselect-period-modal.component.ts (3542 bytes)
UPDATE projectscommon-mapsrcfm-mapcomponentsselected-itemselected-item.component.ts (3209 bytes)
UPDATE projectscommon-mapsrcfm-mapcomponentsselected-item-containerselected-item-container.component.ts (3273 bytes)
UPDATE projectscommon-mapsrcfm-mapcomponentsselected-item-cropfieldselected-item-cropfield.component.ts (2748 bytes)
UPDATE projectscommon-mapsrcfm-mapcomponentsselected-item-geotiffselected-item-geotiff.component.ts (2102 bytes)
UPDATE projectscommon-mapsrcfm-mapcomponentsselected-item-shapeselected-item-shape.component.ts (2125 bytes)
UPDATE projectscommon-mapsrcfm-mapcomponentsselected-item-temporalselected-item-temporal.component.ts (3034 bytes)
UPDATE projectscommon-mapsrcfm-mapcomponentswidget-statuswidget-status.component.ts (516 bytes)
UPDATE projectscommon-mapsrcfm-mapcomponentszoom-to-show-alertzoom-to-show-alert.component.ts (570 bytes)
UPDATE projectscommon-map3dsrcfm-map3dcomponentsolcsswitch2d3dswitch2d3d.component.ts (2652 bytes)
UPDATE srcappadminadmin.component.ts (211 bytes)
UPDATE projectsng-openlayerssrclibmap.component.ts (5228 bytes)
UPDATE projectsng-openlayerssrcliblayerslayergroup.component.ts (734 bytes)
UPDATE projectsng-openlayerssrcliblayerslayervector.component.ts (1117 bytes)
UPDATE projectsng-openlayerssrclibsourcesvector.component.ts (1032 bytes)
UPDATE projectsng-openlayerssrclibfeature.component.ts (914 bytes)
UPDATE projectsng-openlayerssrclibview.component.ts (3777 bytes)
UPDATE projectsng-openlayerssrclibgraticule.component.ts (1428 bytes)
UPDATE projectsng-openlayerssrcliblayerslayerimage.component.ts (986 bytes)
UPDATE projectsng-openlayerssrcliblayerslayertile.component.ts (920 bytes)
UPDATE projectsng-openlayerssrcliblayerslayervectortile.component.ts (1334 bytes)
UPDATE projectsng-openlayerssrclibtilegrid.component.ts (976 bytes)
UPDATE projectsng-openlayerssrclibsourcesxyz.component.ts (2744 bytes)
UPDATE projectsng-openlayerssrclibsourcesosm.component.ts (1908 bytes)
UPDATE projectsng-openlayerssrclibsourcesbingmaps.component.ts (1184 bytes)
UPDATE projectsng-openlayerssrclibsourcescluster.component.ts (1444 bytes)
UPDATE projectsng-openlayerssrclibtilegridwmts.component.ts (714 bytes)
UPDATE projectsng-openlayerssrclibsourcestilewmts.component.ts (3079 bytes)
UPDATE projectsng-openlayerssrclibsourcesvectortile.component.ts (1842 bytes)
UPDATE projectsng-openlayerssrclibsourcestilewms.component.ts (1518 bytes)
UPDATE projectsng-openlayerssrclibsourcestilejson.component.ts (775 bytes)
UPDATE projectsng-openlayerssrclibsourcesgeojson.component.ts (1095 bytes)
UPDATE projectsng-openlayerssrclibsourcesimagestatic.component.ts (2471 bytes)
UPDATE projectsng-openlayerssrclibsourcesimagewms.component.ts (2109 bytes)
UPDATE projectsng-openlayerssrclibsourcesimagearcgisrest.component.ts (2059 bytes)
UPDATE projectsng-openlayerssrclibsourcesraster.component.ts (1768 bytes)
UPDATE projectsng-openlayerssrclibgeomgeometrycircle.component.ts (905 bytes)
UPDATE projectsng-openlayerssrclibgeomgeometrylinestring.component.ts (765 bytes)
UPDATE projectsng-openlayerssrclibgeomgeometrymultilinestring.component.ts (816 bytes)
UPDATE projectsng-openlayerssrclibgeomgeometrymultipoint.component.ts (765 bytes)
UPDATE projectsng-openlayerssrclibgeomgeometrymultipolygon.component.ts (841 bytes)
UPDATE projectsng-openlayerssrclibgeomgeometrypoint.component.ts (706 bytes)
UPDATE projectsng-openlayerssrclibgeomgeometrypolygon.component.ts (784 bytes)
UPDATE projectsng-openlayerssrclibcontent.component.ts (248 bytes)
UPDATE projectsng-openlayerssrcliboverlay.component.ts (1218 bytes)
UPDATE projectsng-openlayerssrclibcoordinate.component.ts (2457 bytes)
UPDATE projectsng-openlayerssrclibcollectioncoordinates.component.ts (3392 bytes)
UPDATE projectsng-openlayerssrclibstylesstyle.component.ts (1421 bytes)
UPDATE projectsng-openlayerssrclibstylescircle.component.ts (1621 bytes)
UPDATE projectsng-openlayerssrclibstylestext.component.ts (2204 bytes)
UPDATE projectsng-openlayerssrclibstylesstroke.component.ts (2972 bytes)
UPDATE projectsng-openlayerssrclibstylesicon.component.ts (2091 bytes)
UPDATE projectsng-openlayerssrclibstylesfill.component.ts (2201 bytes)
UPDATE projectsng-openlayerssrclibcontrolsdefault.component.ts (1189 bytes)
UPDATE projectsng-openlayerssrclibcontrolscontrol.component.ts (914 bytes)
UPDATE projectsng-openlayerssrclibcontrolsattribution.component.ts (898 bytes)
UPDATE projectsng-openlayerssrclibcontrolsfullscreen.component.ts (880 bytes)
UPDATE projectsng-openlayerssrclibcontrolsmouseposition.component.ts (1033 bytes)
UPDATE projectsng-openlayerssrclibcontrolsoverviewmap.component.ts (1292 bytes)
UPDATE projectsng-openlayerssrclibcontrolsrotate.component.ts (853 bytes)
UPDATE projectsng-openlayerssrclibcontrolsscaleline.component.ts (680 bytes)
UPDATE projectsng-openlayerssrclibcontrolszoom.component.ts (916 bytes)
UPDATE projectsng-openlayerssrclibcontrolszoomslider.component.ts (862 bytes)
UPDATE projectsng-openlayerssrclibcontrolszoomtoextent.component.ts (911 bytes)
UPDATE projectsng-openlayerssrclibformatsmvt.component.ts (667 bytes)
UPDATE projectsng-openlayerssrclibinteractionsdefault.component.ts (1075 bytes)
UPDATE projectsng-openlayerssrclibinteractionsdoubleclickzoom.component.ts (689 bytes)
UPDATE projectsng-openlayerssrclibinteractionsdraganddrop.component.ts (824 bytes)
UPDATE projectsng-openlayerssrclibinteractionsdragbox.component.ts (805 bytes)
UPDATE projectsng-openlayerssrclibinteractionsdragpan.component.ts (739 bytes)
UPDATE projectsng-openlayerssrclibinteractionsdragrotate.component.ts (720 bytes)
UPDATE projectsng-openlayerssrclibinteractionsdragrotateandzoom.component.ts (755 bytes)
UPDATE projectsng-openlayerssrclibinteractionsdragzoom.component.ts (769 bytes)
UPDATE projectsng-openlayerssrclibinteractionsmousewheelzoom.component.ts (719 bytes)
UPDATE projectsng-openlayerssrclibinteractionspinchzoom.component.ts (674 bytes)
UPDATE projectsng-openlayerssrclibinteractionsdraw.component.ts (2579 bytes)
UPDATE projectsng-openlayerssrclibinteractionskeyboardpan.component.ts (674 bytes)
UPDATE projectsng-openlayerssrclibinteractionskeyboardzoom.component.ts (673 bytes)
UPDATE projectsng-openlayerssrclibinteractionsselect.component.ts (2121 bytes)
UPDATE projectsng-openlayerssrclibinteractionsmodify.component.ts (2173 bytes)
UPDATE projectsng-openlayerssrclibinteractionstranslate.component.ts (2062 bytes)
UPDATE projectsng-openlayerssrclibattribution.component.ts (379 bytes)
UPDATE projectsng-openlayerssrclibattributions.component.ts (869 bytes)
UPDATE projectsng-openlayerssrclibsourcesutfgrid.component.ts (841 bytes)
Migration completed (150 files modified).
Updates ExperimentalPendingTasks to PendingTasks.
Migration completed (No changes made).
Adds `BootstrapContext` to `bootstrapApplication` calls in `main.server.ts` to support server rendering.
Migration completed (No changes made).
Optional migrations of package '@angularcore'
This package has 1 optional migration that can be executed.
Optional migrations may be skipped and executed after the update process, if preferred.
Select the migrations that you'd like to run [provide-initializer] Replaces `APP_INITIALIZER`, `ENVIRONMENT_INITIALIZER` & `PLATFORM_INITIALIZER` respectively with
`provideAppInitializer`, `provideEnvironmentInitializer` & `providePlatformInitializer`.
Replaces `APP_INITIALIZER`, `ENVIRONMENT_INITIALIZER` & `PLATFORM_INITIALIZER` respectively with `provideAppInitializer`, `provideEnvironmentInitializer` & `providePlatformInitializer`.
UPDATE projectscommonsrcfmcommon-service.module.ts (3960 bytes)
Migration completed (1 file modified).
PS DFarmmapsFarmMapsLib

28291
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@@ -1,6 +1,6 @@
{ {
"name": "farmmaps-lib-app", "name": "farmmaps-lib-app",
"version": "4.19.0", "version": "4.5.0",
"scripts": { "scripts": {
"ng": "ng", "ng": "ng",
"start": "ng serve", "start": "ng serve",
@@ -11,70 +11,66 @@
}, },
"private": true, "private": true,
"dependencies": { "dependencies": {
"@angular-eslint/eslint-plugin": "21.1.0", "@angular/animations": "^17.3.3",
"@angular/animations": "21.1.0", "@angular/common": "^17.3.3",
"@angular/common": "21.1.0", "@angular/compiler": "^17.3.3",
"@angular/compiler": "21.1.0", "@angular/core": "^17.3.3",
"@angular/core": "21.1.0", "@angular-eslint/eslint-plugin": "^15.2.1",
"@angular/forms": "21.1.0", "@angular/forms": "^17.3.3",
"@angular/platform-browser": "21.1.0", "@angular/platform-browser": "^17.3.3",
"@angular/platform-browser-dynamic": "21.1.0", "@angular/platform-browser-dynamic": "^17.3.3",
"@angular/router": "21.1.0", "@angular/router": "^17.3.3",
"@farmmaps/common": "file:dist/common", "@farmmaps/common": "file:dist/common",
"@farmmaps/common-map": "file:dist/common-map", "@farmmaps/common-map": "file:dist/common-map",
"@farmmaps/common-map3d": "file:dist/common-map3d", "@farmmaps/common-map3d": "file:dist/common-map3d",
"@farmmaps/ng-openlayers": "file:dist/ng-openlayers", "ng-openlayers": "17.1.3",
"@microsoft/signalr": "10.0.0", "@microsoft/signalr": "^3.1.16",
"@ng-bootstrap/ng-bootstrap": "^20.0.0", "@ng-bootstrap/ng-bootstrap": "^16.0.0",
"@ngrx/effects": "21.0.1", "@ngrx/effects": "^17",
"@ngrx/router-store": "21.0.1", "@ngrx/router-store": "^17",
"@ngrx/store": "21.0.1", "@ngrx/store": "^17",
"@popperjs/core": "^2.11.8", "@popperjs/core": "^2.11.6",
"angular-oauth2-oidc": "20.0.2", "angular-oauth2-oidc": "^13",
"assert": "^2.0.0", "assert": "^2.0.0",
"bootstrap": "5.3.8", "bootstrap": "^5.2.0",
"browserify-zlib": "^0.2.0", "browserify-zlib": "^0.2.0",
"buffer": "^6.0.3", "buffer": "^6.0.3",
"cesium": "^1.97.0", "cesium": "^1.97.0",
"core-js": "^2.6.12", "core-js": "^2.6.12",
"https-browserify": "^1.0.0", "https-browserify": "^1.0.0",
"moment": "^2.29.4", "moment": "^2.29.4",
"ngrx-store-localstorage": "20.1.0", "ngrx-store-localstorage": "17.0.0",
"ngx-avatars": "1.10.1", "ngx-avatars": "1.7.0",
"ngx-clipboard": "^16.0.0", "ngx-clipboard": "16.0.0",
"ngx-image-cropper": "9.1.6", "ngx-image-cropper": "^7.2.1",
"ngx-uploadx": "7.0.1", "ngx-uploadx": "^6.2.0",
"ol": "^8.2.0", "ol": "^8.2.0",
"olcs": "^2.13.1", "olcs": "^2.13.1",
"resumablejs": "^1.1.0", "resumablejs": "^1.1.0",
"rxjs": "7.8.1", "rxjs": "^7.8.1",
"stream": "^0.0.2", "stream": "^0.0.2",
"stream-http": "^3.2.0", "stream-http": "^3.2.0",
"tassign": "^1.0.0", "tassign": "^1.0.0",
"tslib": "^2.4.0", "tslib": "^2.4.0",
"url": "^0.11.0", "url": "^0.11.0",
"util": "^0.12.4", "util": "^0.12.4",
"zone.js": "~0.15.1" "zone.js": "~0.14.4"
},
"optionalDependencies": {
"@lmdb/lmdb-linux-x64": "^3.1.0",
"@rollup/rollup-linux-x64-gnu": "^4.21.2"
}, },
"devDependencies": { "devDependencies": {
"@angular-builders/custom-webpack": "^21.0.3", "@angular-builders/custom-webpack": "^17",
"@angular-devkit/build-angular": "21.1.0", "@angular-devkit/build-angular": "^17.3.3",
"@angular/cli": "21.1.0", "@angular/cli": "^17.3.3",
"@angular/compiler-cli": "21.1.0", "@angular/compiler-cli": "^17.3.3",
"@angular/language-service": "21.1.0", "@angular/language-service": "^17.3.3",
"@angular/localize": "21.1.0", "@angular/localize": "^17.3.3",
"@types/arcgis-rest-api": "^10.4.5", "@types/arcgis-rest-api": "^10.4.5",
"@types/jasmine": "~2.8.8", "@types/jasmine": "~2.8.8",
"@types/jasminewd2": "^2.0.9", "@types/jasminewd2": "^2.0.9",
"@types/node": "^22.5.4", "@types/node": "^12.20.15",
"@typescript-eslint/eslint-plugin": "^6.18.0", "@typescript-eslint/eslint-plugin": "^6.18.0",
"@typescript-eslint/eslint-plugin-tslint": "^6.18.0", "@typescript-eslint/eslint-plugin-tslint": "^6.18.0",
"@typescript-eslint/parser": "^6.18.0", "@typescript-eslint/parser": "^6.18.0",
"codelyzer": "^6.0.2", "codelyzer": "^0.0.28",
"eslint": "^8.35.0", "eslint": "^8.35.0",
"eslint-config-prettier": "^8.6.0", "eslint-config-prettier": "^8.6.0",
"eslint-plugin-import": "^2.27.5", "eslint-plugin-import": "^2.27.5",
@@ -85,18 +81,9 @@
"karma-coverage-istanbul-reporter": "^3.0.3", "karma-coverage-istanbul-reporter": "^3.0.3",
"karma-jasmine": "^5.1.0", "karma-jasmine": "^5.1.0",
"karma-jasmine-html-reporter": "^2.0.0", "karma-jasmine-html-reporter": "^2.0.0",
"ng-packagr": "^21.1.0", "ng-packagr": "^17.3.0",
"protractor": "~7.0.0", "protractor": "~7.0.0",
"ts-node": "^8.8.1", "ts-node": "^8.8.1",
"typescript": "~5.9.3" "typescript": "~5.4.4"
},
"overrides": {
"ngx-avatars": {
"@angular/common": "$@angular/common",
"@angular/core": "$@angular/core"
},
"ngx-uploadx": {
"@angular/core": "$@angular/core"
}
} }
} }

View File

@@ -11,277 +11,20 @@
"tslib": "^2.0.0" "tslib": "^2.0.0"
}, },
"peerDependencies": { "peerDependencies": {
"@angular/core": "21.1.0", "@angular/core": "^17.3.3",
"@farmmaps/common": "file:../../dist/common", "@ngrx/effects": "^17",
"@farmmaps/ng-openlayers": "file:../../dist/ng-openlayers", "@ngrx/router-store": "^17",
"@ngrx/effects": "21.0.1", "@ngrx/store": "^17",
"@ngrx/router-store": "21.0.1", "ng-openlayers": "17.1.3",
"@ngrx/store": "21.0.1", "ngrx-store-localstorage": "^17",
"ngrx-store-localstorage": "20.1.0", "ol": "^8.2.0",
"rxjs": "7.8.1",
"tassign": "^1.0.0" "tassign": "^1.0.0"
} }
}, },
"../../../../dist/common": {
"extraneous": true
},
"../../../../dist/ng-openlayers": {
"extraneous": true
},
"../../../dist/ng-openlayers": {
"extraneous": true
},
"../../dist/common": {
"name": "@farmmaps/common",
"version": "21.1.0",
"peer": true,
"dependencies": {
"tslib": "^2.3.0"
},
"peerDependencies": {
"@angular/common": "21.1.0",
"@angular/core": "21.1.0",
"@angular/forms": "21.1.0",
"@microsoft/signalr": "10.0.0",
"@ng-bootstrap/ng-bootstrap": "^20.0.0",
"@ngrx/effects": "21.0.1",
"@ngrx/router-store": "21.0.1",
"@ngrx/store": "21.0.1",
"angular-oauth2-oidc": "20.0.2",
"bootstrap": "^5.3.3",
"moment": "^2.29.4",
"ngx-avatars": "1.10.1",
"ngx-clipboard": "^16.0.0",
"ngx-image-cropper": "9.1.6",
"ngx-uploadx": "7.0.1",
"tassign": "^1.0.0"
}
},
"../../dist/libs/ng-openlayers": {
"version": "18.0.0",
"extraneous": true,
"license": "MPL-2.0",
"dependencies": {
"tslib": "^2.3.0"
},
"peerDependencies": {
"@angular/common": "^18.2.3",
"@angular/core": "^18.2.3",
"ol": "^8.2.0"
}
},
"../../dist/ng-openlayers": {
"name": "@farmmaps/ng-openlayers",
"version": "20.0.1",
"peer": true,
"dependencies": {
"tslib": "^2.3.0"
},
"peerDependencies": {
"@angular/common": ">=19.0.0 <=20.x.x",
"@angular/core": ">=19.0.0 <=20.x.x",
"ol": "~10.7.0"
}
},
"../ng-openlayers": {
"name": "@farmmaps/ng-openlayers",
"version": "20.0.1",
"extraneous": true,
"peerDependencies": {
"@angular/common": ">=19.0.0 <=20.x.x",
"@angular/core": ">=19.0.0 <=20.x.x",
"ol": "~10.7.0"
}
},
"dist/common": {
"extraneous": true
},
"dist/ng-openlayers": {
"extraneous": true
},
"node_modules/@angular/common": {
"version": "21.1.0",
"resolved": "https://registry.npmjs.org/@angular/common/-/common-21.1.0.tgz",
"integrity": "sha512-hL3Chp51TU9iBcIfkNtoBS1wuseP1gsyDW2IFtK5HUpAVhbso9B3fdCaDTFkU98A2unluo2YgzI6D/6IS6N+1g==",
"license": "MIT",
"peer": true,
"dependencies": {
"tslib": "^2.3.0"
},
"engines": {
"node": "^20.19.0 || ^22.12.0 || >=24.0.0"
},
"peerDependencies": {
"@angular/core": "21.1.0",
"rxjs": "^6.5.3 || ^7.4.0"
}
},
"node_modules/@angular/core": {
"version": "21.1.0",
"resolved": "https://registry.npmjs.org/@angular/core/-/core-21.1.0.tgz",
"integrity": "sha512-QTl9s8GYNN0pt1k3GE6UVlfe6zWtfdykhfchinKq2YJywQ6LBM4UcZgoc56YkgscmyrRFYrr4JYUJjlzTF57+A==",
"license": "MIT",
"peer": true,
"dependencies": {
"tslib": "^2.3.0"
},
"engines": {
"node": "^20.19.0 || ^22.12.0 || >=24.0.0"
},
"peerDependencies": {
"@angular/compiler": "21.1.0",
"rxjs": "^6.5.3 || ^7.4.0",
"zone.js": "~0.15.0 || ~0.16.0"
},
"peerDependenciesMeta": {
"@angular/compiler": {
"optional": true
},
"zone.js": {
"optional": true
}
}
},
"node_modules/@angular/platform-browser": {
"version": "21.1.0",
"resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-21.1.0.tgz",
"integrity": "sha512-Drkal25x+OuRQosAE/cL4uM5WDmgFehanCpsjQ1jGp6Rxoad6Q5Do1uQAE3qgMKHL1aqCPZ+uWzcVVG+Bn1ddg==",
"license": "MIT",
"peer": true,
"dependencies": {
"tslib": "^2.3.0"
},
"engines": {
"node": "^20.19.0 || ^22.12.0 || >=24.0.0"
},
"peerDependencies": {
"@angular/animations": "21.1.0",
"@angular/common": "21.1.0",
"@angular/core": "21.1.0"
},
"peerDependenciesMeta": {
"@angular/animations": {
"optional": true
}
}
},
"node_modules/@angular/router": {
"version": "21.1.0",
"resolved": "https://registry.npmjs.org/@angular/router/-/router-21.1.0.tgz",
"integrity": "sha512-Sneu0ePuH+bf8ZslRX3iQk1iLziindLskdTeHV1ZCrXdT0ZScsZyI/gjxQKBtsIU9692D2DnFQRLGnzTBYVGVw==",
"license": "MIT",
"peer": true,
"dependencies": {
"tslib": "^2.3.0"
},
"engines": {
"node": "^20.19.0 || ^22.12.0 || >=24.0.0"
},
"peerDependencies": {
"@angular/common": "21.1.0",
"@angular/core": "21.1.0",
"@angular/platform-browser": "21.1.0",
"rxjs": "^6.5.3 || ^7.4.0"
}
},
"node_modules/@farmmaps/common": {
"resolved": "../../dist/common",
"link": true
},
"node_modules/@farmmaps/ng-openlayers": {
"resolved": "../../dist/ng-openlayers",
"link": true
},
"node_modules/@ngrx/effects": {
"version": "21.0.1",
"resolved": "https://registry.npmjs.org/@ngrx/effects/-/effects-21.0.1.tgz",
"integrity": "sha512-hSdpToAiSYa5FJ/CAygQHpnCaF2S1HO7q/57ob3XvNTWmkofa0VqI/IIe4W57bojh2YOWCJ91SCn3kAjymaV3g==",
"license": "MIT",
"peer": true,
"dependencies": {
"tslib": "^2.0.0"
},
"peerDependencies": {
"@angular/core": "^21.0.0",
"@ngrx/store": "21.0.1",
"rxjs": "^6.5.3 || ^7.5.0"
}
},
"node_modules/@ngrx/router-store": {
"version": "21.0.1",
"resolved": "https://registry.npmjs.org/@ngrx/router-store/-/router-store-21.0.1.tgz",
"integrity": "sha512-hacH8ciwCRMLg7p7bThslYn564GOyS5LPf9c8cX4FTyOH+iJM32eJd2Lt64cA62vN6ruofV/IM2vB09nCkxHzg==",
"license": "MIT",
"peer": true,
"dependencies": {
"tslib": "^2.0.0"
},
"peerDependencies": {
"@angular/common": "^21.0.0",
"@angular/core": "^21.0.0",
"@angular/router": "^21.0.0",
"@ngrx/store": "21.0.1",
"rxjs": "^6.5.3 || ^7.5.0"
}
},
"node_modules/@ngrx/store": {
"version": "21.0.1",
"resolved": "https://registry.npmjs.org/@ngrx/store/-/store-21.0.1.tgz",
"integrity": "sha512-2hGnw/c5o8nmKzyx7TrUUM7FXjE2zqjX0EF+wLbw9Oy/L+VdCmx+ZI1BFjuAR4B8PKEWHG2KSbOM13SMNkpZiA==",
"license": "MIT",
"peer": true,
"dependencies": {
"tslib": "^2.0.0"
},
"peerDependencies": {
"@angular/core": "^21.0.0",
"rxjs": "^6.5.3 || ^7.5.0"
}
},
"node_modules/deepmerge": {
"version": "4.3.1",
"resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz",
"integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==",
"peer": true,
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/ngrx-store-localstorage": {
"version": "20.1.0",
"resolved": "https://registry.npmjs.org/ngrx-store-localstorage/-/ngrx-store-localstorage-20.1.0.tgz",
"integrity": "sha512-/5+i5qTxZdE8Q5qdSmj7+9JvriAnHwW7RsXzh1rrQ/UHA9vf12q6mJ6wYTTehUO4Qcl2t/K5MRkooN2eG2ZEvw==",
"license": "MIT",
"peer": true,
"dependencies": {
"deepmerge": "^4.2.2",
"tslib": "^2.3.0"
},
"peerDependencies": {
"@angular/common": ">=20.0.0",
"@angular/core": ">=20.0.0",
"@ngrx/store": ">=20.0.0"
}
},
"node_modules/rxjs": {
"version": "7.8.1",
"resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz",
"integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==",
"peer": true,
"dependencies": {
"tslib": "^2.1.0"
}
},
"node_modules/tassign": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/tassign/-/tassign-1.0.0.tgz",
"integrity": "sha512-k0Ti9f+A1R0BRdArEbiUHldd+A40kZ5qsiNSNk4czx61wkAoSZYjqkaQs0jC63AfgPdCXVPstDq2ZW5ZLRTCgw==",
"peer": true
},
"node_modules/tslib": { "node_modules/tslib": {
"version": "2.7.0", "version": "2.0.1",
"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.7.0.tgz", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.1.tgz",
"integrity": "sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==" "integrity": "sha512-SgIkNheinmEBgx1IUNirK0TUD4X9yjjBRTqqjggWCU3pUEqIk3/Uwl3yRixYKT6WjQuGiwDv4NomL3wqRCj+CQ=="
} }
} }
} }

View File

@@ -8,14 +8,13 @@
"tslib": "^2.0.0" "tslib": "^2.0.0"
}, },
"peerDependencies": { "peerDependencies": {
"@angular/core": "21.1.0", "@angular/core": "^17.3.3",
"@farmmaps/common": "file:../../dist/common", "ngrx-store-localstorage": "^17",
"@farmmaps/ng-openlayers": "file:../../dist/ng-openlayers", "@ngrx/effects": "^17",
"ngrx-store-localstorage": "20.1.0", "@ngrx/router-store": "^17",
"@ngrx/effects": "21.0.1", "@ngrx/store": "^17",
"@ngrx/router-store": "21.0.1",
"@ngrx/store": "21.0.1",
"tassign": "^1.0.0", "tassign": "^1.0.0",
"rxjs": "7.8.1" "ng-openlayers": "17.1.3",
"ol": "^8.2.0"
} }
} }

View File

@@ -59,8 +59,6 @@ export const TOGGLESHOWDATALAYERSLIDE = '[Map] ToggleShowDataLayerSlide'
export const SETVIEWSTATE = '[Map] SetViewState' export const SETVIEWSTATE = '[Map] SetViewState'
export const CLEARFEATURES = '[Map] ClearFeatures'; export const CLEARFEATURES = '[Map] ClearFeatures';
export const SETPANELEXTRAWIDE = '[Map] SetPanelExtraWide'; export const SETPANELEXTRAWIDE = '[Map] SetPanelExtraWide';
export const BACKUPFEATURES = '[Map] BackupFeatures';
export const RESTOREFEATURES = '[Map] RestoreFeatures';
export class Clear implements Action { export class Clear implements Action {
readonly type = CLEAR; readonly type = CLEAR;
@@ -302,7 +300,7 @@ export class SetReplaceUrl implements Action {
export class SetFeatures implements Action { export class SetFeatures implements Action {
readonly type = SETFEATURES; readonly type = SETFEATURES;
constructor(public features: Array<Feature<Geometry>>, public zoomToExtent: boolean = true) { } constructor(public features: Array<Feature<Geometry>>) { }
} }
export class SetLayerValuesLocation implements Action { export class SetLayerValuesLocation implements Action {
@@ -349,16 +347,6 @@ export class SetPanelExtraWide implements Action {
constructor(public panelExtraWide:boolean) {} constructor(public panelExtraWide:boolean) {}
} }
export class BackupFeatures implements Action {
readonly type = BACKUPFEATURES;
constructor() {}
}
export class RestoreFeatures implements Action {
readonly type = RESTOREFEATURES;
constructor() {}
}
export type Actions = SetMapState export type Actions = SetMapState
| Init | Init
| Clear | Clear
@@ -407,7 +395,5 @@ export type Actions = SetMapState
| ToggleShowDataLayerSlide | ToggleShowDataLayerSlide
| SetViewState | SetViewState
| ClearFeatures | ClearFeatures
| SetPanelExtraWide | SetPanelExtraWide;
| BackupFeatures
| RestoreFeatures;

View File

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

View File

@@ -1,5 +1,5 @@
import { Component, Input, OnDestroy, OnInit, EventEmitter, Output, Inject } from '@angular/core'; import { Component, Input, OnDestroy, OnInit, EventEmitter, Output, Inject } from '@angular/core';
import { MapComponent } from '@farmmaps/ng-openlayers'; import { MapComponent } from 'ng-openlayers';
import * as proj from 'ol/proj'; import * as proj from 'ol/proj';
import {Point,Geometry} from 'ol/geom'; import {Point,Geometry} from 'ol/geom';
@@ -15,8 +15,7 @@ export interface IDroppedFile {
@Component({ @Component({
selector: 'fm-map-file-drop-target', selector: 'fm-map-file-drop-target',
template: '', template: ''
standalone: false
}) })
export class FileDropTargetComponent implements OnInit, OnDestroy { export class FileDropTargetComponent implements OnInit, OnDestroy {
element: Element; element: Element;

View File

@@ -1,5 +1,5 @@
import { Component, OnInit, Input, ViewChild, ElementRef, OnChanges, SimpleChanges ,Host} from '@angular/core'; import { Component, OnInit, Input, ViewChild, ElementRef, OnChanges, SimpleChanges ,Host} from '@angular/core';
import { MapComponent } from '@farmmaps/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, toLonLat } from 'ol/proj';
@@ -7,8 +7,7 @@ import { fromLonLat, toLonLat } from 'ol/proj';
@Component({ @Component({
selector: 'fm-map-gps-location', selector: 'fm-map-gps-location',
templateUrl: './gps-location.component.html', templateUrl: './gps-location.component.html',
styleUrls: ['./gps-location.component.scss'], styleUrls: ['./gps-location.component.scss']
standalone: false
}) })
export class GpsLocation implements OnInit,OnChanges{ export class GpsLocation implements OnInit,OnChanges{

View File

@@ -1,5 +1,5 @@
import { Component, Host, Input, Output, EventEmitter,OnDestroy, OnInit, OnChanges, SimpleChanges, forwardRef } from '@angular/core'; import { Component, Host, Input, Output, EventEmitter,OnDestroy, OnInit, OnChanges, SimpleChanges, forwardRef } from '@angular/core';
import { LayerGroupComponent, MapComponent } from '@farmmaps/ng-openlayers'; import { LayerGroupComponent, MapComponent } from 'ng-openlayers';
import { ItemService,IItem,AppConfig } from '@farmmaps/common'; import { ItemService,IItem,AppConfig } from '@farmmaps/common';
import { IItemLayer, ITemporalItemLayer} from '../../../models/item.layer'; import { IItemLayer, ITemporalItemLayer} from '../../../models/item.layer';
import { ILayerData} from '../../../models/layer.data'; import { ILayerData} from '../../../models/layer.data';
@@ -26,8 +26,7 @@ import Feature from 'ol/Feature';
template: `<ng-content></ng-content>`, template: `<ng-content></ng-content>`,
providers: [ providers: [
{ provide: LayerGroupComponent, useExisting: forwardRef(() => ItemLayersComponent) } { provide: LayerGroupComponent, useExisting: forwardRef(() => ItemLayersComponent) }
], ]
standalone: false
}) })
export class ItemLayersComponent extends LayerGroupComponent implements OnChanges, OnInit,OnDestroy { export class ItemLayersComponent extends LayerGroupComponent implements OnChanges, OnInit,OnDestroy {

View File

@@ -1,5 +1,5 @@
import { Component, Host, Input, Output, EventEmitter, OnInit, OnChanges, SimpleChanges, forwardRef, Inject, InjectionToken, OnDestroy, LOCALE_ID } from '@angular/core'; import { Component, Host, Input, Output, EventEmitter, OnInit, OnChanges, SimpleChanges, forwardRef, Inject, InjectionToken, OnDestroy, LOCALE_ID } from '@angular/core';
import { LayerVectorComponent, SourceVectorComponent, MapComponent } from '@farmmaps/ng-openlayers'; import { LayerVectorComponent, SourceVectorComponent, MapComponent } from 'ng-openlayers';
import { ItemService, ItemTypeService, IItem, IItemType, FolderService } from '@farmmaps/common'; import { ItemService, ItemTypeService, IItem, IItemType, FolderService } from '@farmmaps/common';
import { Feature } from 'ol'; import { Feature } from 'ol';
@@ -26,8 +26,7 @@ import { formatNumber } from '@angular/common';
template: `<ng-content></ng-content>`, template: `<ng-content></ng-content>`,
providers: [ providers: [
{ provide: SourceVectorComponent, useExisting: forwardRef(() => ItemVectorSourceComponent) } { provide: SourceVectorComponent, useExisting: forwardRef(() => ItemVectorSourceComponent) }
], ]
standalone: false
}) })
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>>;

View File

@@ -1,50 +1,31 @@
<div> <div>
@if (itemLayers.length > 0) { <div class="layerlist" *ngIf="itemLayers.length > 0;else noLayers">
<div class="layerlist">
<div class="list-group"> <div class="list-group">
@for (itemLayer of itemLayers; track itemLayer) { <div *ngFor="let itemLayer of itemLayers" class="list-group-item list-group-item-action p-2 text-truncate" [ngClass]="{'active' : selectedLayer==itemLayer}">
<div class="list-group-item list-group-item-action p-2 text-truncate" [ngClass]="{'active' : selectedLayer==itemLayer}">
<div (click)="handleSelectLayer($event,itemLayer)" [title]="itemLayer.item.name">{{itemLayer.item.name}}</div> <div (click)="handleSelectLayer($event,itemLayer)" [title]="itemLayer.item.name">{{itemLayer.item.name}}</div>
@if (selectedLayer==itemLayer && !baseLayers) { <div class="mt-1" *ngIf="selectedLayer==itemLayer && !baseLayers">
<div class="mt-1">
<span class="btn-group"> <span class="btn-group">
<a title="Toggle visibility"href="#" class="btn btn-light btn-sm" (click)="handleToggleVisibility($event,itemLayer)"><i class="fa" aria-hidden="true" [ngClass]="{'fa-eye':!itemLayer.visible,'fa-eye-slash':itemLayer.visible}"></i></a> <a title="Toggle visibility"href="#" class="btn btn-light btn-sm" (click)="handleToggleVisibility($event,itemLayer)"><i class="fa" aria-hidden="true" [ngClass]="{'fa-eye':!itemLayer.visible,'fa-eye-slash':itemLayer.visible}"></i></a>
@if (itemLayer.visible) { <a title="Transparency 25%" *ngIf="itemLayer.visible" href="#" class="btn btn-light btn-sm" (click)="handleSetOpacity($event,itemLayer,0.25)">25%</a>
<a title="Transparency 25%" href="#" class="btn btn-light btn-sm" (click)="handleSetOpacity($event,itemLayer,0.25)">25%</a> <a title="Transparency 50%" *ngIf="itemLayer.visible" href="#" class="btn btn-light btn-sm" (click)="handleSetOpacity($event,itemLayer,0.5)">50%</a>
} <a title="Transparency 75%" *ngIf="itemLayer.visible" href="#" class="btn btn-light btn-sm" (click)="handleSetOpacity($event,itemLayer,0.75)">75%</a>
@if (itemLayer.visible) { <a title="No transparency" *ngIf="itemLayer.visible" href="#" class="btn btn-light btn-sm" (click)="handleSetOpacity($event,itemLayer,1)">100%</a>
<a title="Transparency 50%" href="#" class="btn btn-light btn-sm" (click)="handleSetOpacity($event,itemLayer,0.5)">50%</a>
}
@if (itemLayer.visible) {
<a title="Transparency 75%" href="#" class="btn btn-light btn-sm" (click)="handleSetOpacity($event,itemLayer,0.75)">75%</a>
}
@if (itemLayer.visible) {
<a title="No transparency" href="#" class="btn btn-light btn-sm" (click)="handleSetOpacity($event,itemLayer,1)">100%</a>
}
</span> </span>
<a href="#" title="Zoom to extent" class="btn btn-light btn-sm" (click)="handleZoomToExtent($event,itemLayer)"><i class="far fa-search-plus" aria-hidden="true"></i></a> <a href="#" title="Zoom to extent" class="btn btn-light btn-sm" (click)="handleZoomToExtent($event,itemLayer)"><i class="far fa-search-plus" aria-hidden="true"></i></a>
@if (firstLayer(itemLayer)) { <span *ngIf="firstLayer(itemLayer)"><a href="#" title="Toggle legend" class="btn btn-light btn-sm" (click)="itemLayer.legendVisible=toggleLegend($event,itemLayer.legendVisible)"><i class="far fa-chart-bar" aria-hidden="true"></i></a></span>
<span><a href="#" title="Toggle legend" class="btn btn-light btn-sm" (click)="itemLayer.legendVisible=toggleLegend($event,itemLayer.legendVisible)"><i class="far fa-chart-bar" aria-hidden="true"></i></a></span> <span *ngIf="!dataLayers" class="float-end"><a href="#" title="Remove overlay" class="btn btn-light btn-sm" (click)="handleDelete($event,itemLayer)"><i class="fas fa-layer-minus" aria-hidden="true"></i></a></span>
}
@if (!dataLayers) {
<span class="float-end"><a href="#" title="Remove overlay" class="btn btn-light btn-sm" (click)="handleDelete($event,itemLayer)"><i class="fas fa-layer-minus" aria-hidden="true"></i></a></span>
}
</div> </div>
} <div *ngIf="itemLayer.legendVisible">
@if (itemLayer.legendVisible) {
<div>
<div class="card legend"> <div class="card legend">
<fm-map-layer-legend [layer]="firstLayer(itemLayer)" (click)="handleLegendClick($event,itemLayer);" [histogramenabled]="true"></fm-map-layer-legend> <fm-map-layer-legend [layer]="firstLayer(itemLayer)" (click)="handleLegendClick($event,itemLayer);" [histogramenabled]="true"></fm-map-layer-legend>
</div> </div>
</div> </div>
}
</div>
}
</div> </div>
</div> </div>
} @else { </div>
</div>
<ng-template #noLayers>
<div class="list-group"> <div class="list-group">
<div class="list-group-item" i18n>No layers</div> <div class="list-group-item" i18n>No layers</div>
</div> </div>
} </ng-template>
</div>

View File

@@ -4,8 +4,7 @@ import { IItemLayer } from '../../../models/item.layer';
@Component({ @Component({
selector: 'fm-map-layer-list', selector: 'fm-map-layer-list',
templateUrl: './layer-list.component.html', templateUrl: './layer-list.component.html',
styleUrls: ['./layer-list.component.scss'], styleUrls: ['./layer-list.component.scss']
standalone: false
}) })
export class LayerListComponent { export class LayerListComponent {

View File

@@ -1,27 +1,18 @@
<div #layerValues class="layer-values"> <div #layerValues class="layer-values">
@if (enabled$ | async) { <div class="cross" *ngIf="enabled$ | async">
<div class="cross" >
<div class="pointer"></div> <div class="pointer"></div>
@if ((layerValues$ | async ); as layers) { <div class="values-container border border-dark rounded p-2" *ngIf="(layerValues$ | async ) as layers">
<div class="values-container border border-dark rounded p-2">
<div class="lonlat pb-2 "><span class="font-weight-bold">{{lonlat$}}</span><i class="ms-2 fal fa-copy" (click)="copyToClipboard()"></i> </div> <div class="lonlat pb-2 "><span class="font-weight-bold">{{lonlat$}}</span><i class="ms-2 fal fa-copy" (click)="copyToClipboard()"></i> </div>
@if (layers.length>0 ) { <ul class="value-list p-0 mb-0" *ngIf="layers.length>0 ;else no_data">
<ul class="value-list p-0 mb-0"> <li class="border-top pt-1 pb-1 value" *ngFor="let layerValue of layers">
@for (layerValue of layers; track layerValue) {
<li class="border-top pt-1 pb-1 value">
<div>{{layerValue.layerName}}</div> <div>{{layerValue.layerName}}</div>
<div>{{layerValue.date|date}}</div> <div>{{layerValue.date|date}}</div>
<div>@if (layerValue.quantity) { <div><span *ngIf="layerValue.quantity"><span class="me-1">{{layerValue.quantity}}</span> </span><span class="me-1 font-weight-bold">{{getScaledValue(layerValue)}}</span><span>{{layerValue.unit}}</span></div>
<span><span class="me-1">{{layerValue.quantity}}</span> </span>
}<span class="me-1 font-weight-bold">{{getScaledValue(layerValue)}}</span><span>{{layerValue.unit}}</span></div>
</li> </li>
}
</ul> </ul>
} @else { <ng-template #no_data>
<div i18n class="border-top pt-1 pb-1">No data at location</div> <div i18n class="border-top pt-1 pb-1">No data at location</div>
} </ng-template>
</div> </div>
}
</div> </div>
}
</div> </div>

View File

@@ -3,7 +3,7 @@ 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 mapReducers from '../../../reducers/map.reducer';
import * as mapActions from '../../../actions/map.actions'; import * as mapActions from '../../../actions/map.actions';
import { MapComponent } from '@farmmaps/ng-openlayers'; import { MapComponent } from 'ng-openlayers';
import { ILayervalue } from '../../../models/layer.value'; import { ILayervalue } from '../../../models/layer.value';
import { Observable, interval, Subject } from 'rxjs'; import { Observable, interval, Subject } from 'rxjs';
import { debounce, throttle } from 'rxjs/operators'; import { debounce, throttle } from 'rxjs/operators';
@@ -16,8 +16,7 @@ import { Point } from 'ol/geom';
@Component({ @Component({
selector: 'fm-map-layer-values', selector: 'fm-map-layer-values',
templateUrl: './layer-values.component.html', templateUrl: './layer-values.component.html',
styleUrls: ['./layer-values.component.scss'], styleUrls: ['./layer-values.component.scss']
standalone: false
}) })
export class LayerValuesComponent implements OnInit, AfterViewInit { export class LayerValuesComponent implements OnInit, AfterViewInit {

View File

@@ -1,5 +1,5 @@
import { Component, OnDestroy, OnInit, Input, OnChanges, SimpleChanges } from '@angular/core'; import { Component, OnDestroy, OnInit, Input, OnChanges, SimpleChanges } from '@angular/core';
import { LayerVectorComponent, MapComponent } from '@farmmaps/ng-openlayers'; import { LayerVectorComponent, MapComponent } from 'ng-openlayers';
import RenderType from 'ol/layer/Vector'; import RenderType from 'ol/layer/Vector';
import { Vector as VectorSource } from 'ol/source'; import { Vector as VectorSource } from 'ol/source';
import { Geometry } from 'ol/geom'; import { Geometry } from 'ol/geom';
@@ -10,7 +10,6 @@ import Feature from 'ol/Feature';
template: ` template: `
<ng-content></ng-content> <ng-content></ng-content>
`, `,
standalone: false
}) })
export class LayerVectorImageComponent extends LayerVectorComponent implements OnInit, OnDestroy, OnChanges { export class LayerVectorImageComponent extends LayerVectorComponent implements OnInit, OnDestroy, OnChanges {
//public source: Vector; //public source: Vector;

View File

@@ -1,5 +1,5 @@
import { Component, OnInit, Input, Host, OnChanges, SimpleChanges,ChangeDetectorRef } from '@angular/core'; import { Component, OnInit, Input, Host, OnChanges, SimpleChanges,ChangeDetectorRef } from '@angular/core';
import { MapComponent } from '@farmmaps/ng-openlayers'; import { MapComponent } from 'ng-openlayers';
import {IMapState} from '../../../models/map.state' import {IMapState} from '../../../models/map.state'
import {View} from 'ol'; import {View} from 'ol';
import { fromLonLat } from 'ol/proj'; import { fromLonLat } from 'ol/proj';
@@ -8,8 +8,7 @@ import { fromLonLat } from 'ol/proj';
@Component({ @Component({
selector: 'fm-map-pan-to-location', selector: 'fm-map-pan-to-location',
templateUrl: './pan-to-location.component.html', templateUrl: './pan-to-location.component.html',
styleUrls: ['./pan-to-location.component.scss'], styleUrls: ['./pan-to-location.component.scss']
standalone: false
}) })
export class PanToLocation implements OnInit,OnChanges{ export class PanToLocation implements OnInit,OnChanges{

View File

@@ -1,5 +1,5 @@
import { Component, Host, Input, OnInit, ChangeDetectorRef } from '@angular/core'; import { Component, Host, Input, OnInit, ChangeDetectorRef } from '@angular/core';
import { ViewComponent, MapComponent } from '@farmmaps/ng-openlayers'; import { ViewComponent, MapComponent } from 'ng-openlayers';
import {View} from 'ol'; import {View} from 'ol';
@@ -8,8 +8,7 @@ import {View} from 'ol';
@Component({ @Component({
selector: 'fm-map-rotation-reset', selector: 'fm-map-rotation-reset',
templateUrl: './rotation-reset.component.html', templateUrl: './rotation-reset.component.html',
styleUrls: ['./rotation-reset.component.scss'], styleUrls: ['./rotation-reset.component.scss']
standalone: false
}) })
export class RotationResetComponent implements OnInit { export class RotationResetComponent implements OnInit {
view: View; view: View;

View File

@@ -1,12 +1,11 @@
import { Component, Host, Input, OnInit, OnChanges, SimpleChanges, forwardRef } from '@angular/core'; import { Component, Host, Input, OnInit, OnChanges, SimpleChanges, forwardRef } from '@angular/core';
import { ActivatedRoute } from '@angular/router'; import { ActivatedRoute } from '@angular/router';
import { ViewComponent, MapComponent } from '@farmmaps/ng-openlayers'; import { ViewComponent, MapComponent } from 'ng-openlayers';
@Component({ @Component({
selector: 'fm-map-zoom-to-extent', selector: 'fm-map-zoom-to-extent',
template: `<ng-content></ng-content>`, template: `<ng-content></ng-content>`
standalone: false
}) })
export class ZoomToExtentComponent implements OnChanges { export class ZoomToExtentComponent implements OnChanges {
view: ViewComponent; view: ViewComponent;

View File

@@ -13,8 +13,7 @@ import { Observable } from 'rxjs';
@Component({ @Component({
selector: 'fm-map-feature-list-container', selector: 'fm-map-feature-list-container',
templateUrl: './feature-list-container.component.html', templateUrl: './feature-list-container.component.html',
styleUrls: ['./feature-list-container.component.scss'], styleUrls: ['./feature-list-container.component.scss']
standalone: false
}) })
export class FeatureListContainerComponent { export class FeatureListContainerComponent {

View File

@@ -1,20 +1,14 @@
<div class="card border-0"> <div class="card border-0">
@if ((schemeItem|async); as schemeItem) { <div class="card-body" *ngIf="(schemeItem|async);let schemeItem">
<div class="card-body">
<fm-back-button></fm-back-button> <fm-back-button></fm-back-button>
<h4 i18n>Farm</h4> <h4 i18n>Farm</h4>
<h3>{{schemeItem.name}}</h3> <h3>{{schemeItem.name}}</h3>
@if (features; as features) { <div *ngIf="features;let features">
<div>
<div class="cropfields"> <div class="cropfields">
@for (feature of features; track 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(feature)">
<div class="row m-0 ps-3 pe-3" [ngClass]="{'selected':isFeatureSelected(feature)}" (click)="handleFeatureClick(feature)" (mouseenter)="handleFeatureMouseEnter(feature)" (mouseleave)="handleFeatureMouseLeave(feature)">
<fm-map-feature-list-feature-container [feature]="feature"></fm-map-feature-list-feature-container> <fm-map-feature-list-feature-container [feature]="feature"></fm-map-feature-list-feature-container>
</div> </div>
}
</div> </div>
</div> </div>
}
</div> </div>
}
</div> </div>

View File

@@ -14,8 +14,7 @@ import { Observable } from 'rxjs';
@Component({ @Component({
selector: 'fm-map-feature-list-cropfield', selector: 'fm-map-feature-list-cropfield',
templateUrl: './feature-list-cropfield.component.html', templateUrl: './feature-list-cropfield.component.html',
styleUrls: ['./feature-list-cropfield.component.scss'], styleUrls: ['./feature-list-cropfield.component.scss']
standalone: false
}) })
export class FeatureListCropfieldComponent extends AbstractFeatureListComponent implements OnInit { export class FeatureListCropfieldComponent extends AbstractFeatureListComponent implements OnInit {

View File

@@ -2,16 +2,12 @@
<div class="card-body"> <div class="card-body">
<fm-back-button></fm-back-button> <fm-back-button></fm-back-button>
<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>
@if (features; as features) { <div *ngIf="features;let features">
<div>
<div class="farms"> <div class="farms">
@for (feature of features; track 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(feature)">
<div class="row m-0 ps-3 pe-3"[ngClass]="{'selected':isFeatureSelected(feature)}" (click)="handleFeatureClick(feature)" (mouseenter)="handleFeatureMouseEnter(feature)" (mouseleave)="handleFeatureMouseLeave(feature)">
<fm-map-feature-list-feature-container [feature]="feature"></fm-map-feature-list-feature-container> <fm-map-feature-list-feature-container [feature]="feature"></fm-map-feature-list-feature-container>
</div> </div>
}
</div> </div>
</div> </div>
}
</div> </div>
</div> </div>

View File

@@ -16,8 +16,7 @@ import { Geometry} from 'ol/geom';
@Component({ @Component({
selector: 'fm-map-feature-list-croppingscheme', selector: 'fm-map-feature-list-croppingscheme',
templateUrl: './feature-list-croppingscheme.component.html', templateUrl: './feature-list-croppingscheme.component.html',
styleUrls: ['./feature-list-croppingscheme.component.scss'], styleUrls: ['./feature-list-croppingscheme.component.scss']
standalone: false
}) })
export class FeatureListCroppingschemeComponent extends AbstractFeatureListComponent { export class FeatureListCroppingschemeComponent extends AbstractFeatureListComponent {

View File

@@ -11,8 +11,7 @@ import { WidgetHostDirective } from '../widget-host/widget-host.directive';
<div> <div>
<ng-template fm-map-widget-host></ng-template> <ng-template fm-map-widget-host></ng-template>
</div> </div>
`, `
standalone: false
}) })
export class FeatureListFeatureContainerComponent { export class FeatureListFeatureContainerComponent {

View File

@@ -1,5 +1,4 @@
@if (feature; as feature) { <div *ngIf="feature;let feature" class="d-flex m-0">
<div class="d-flex m-0">
<div class="p-2"> <div class="p-2">
<div class="thumbnail"> <div class="thumbnail">
<fm-map-feature-thumbnail [feature]="feature"></fm-map-feature-thumbnail> <fm-map-feature-thumbnail [feature]="feature"></fm-map-feature-thumbnail>
@@ -13,4 +12,3 @@
<span>{{feature.get('dataenddate')|date}}</span> </div> <span>{{feature.get('dataenddate')|date}}</span> </div>
</div> </div>
</div> </div>
}

View File

@@ -15,8 +15,7 @@ import {getArea} from 'ol/sphere';
@Component({ @Component({
selector: 'fm-map-feature-list-feature-cropfield', selector: 'fm-map-feature-list-feature-cropfield',
templateUrl: './feature-list-feature-cropfield.component.html', templateUrl: './feature-list-feature-cropfield.component.html',
styleUrls: ['./feature-list-feature-cropfield.component.scss'], styleUrls: ['./feature-list-feature-cropfield.component.scss']
standalone: false
}) })
export class FeatureListFeatureCropfieldComponent extends AbstractFeatureListFeatureComponent { export class FeatureListFeatureCropfieldComponent extends AbstractFeatureListFeatureComponent {

View File

@@ -1,8 +1,6 @@
@if (feature; as feature) { <div *ngIf="feature;let feature" class="row m-0">
<div class="row m-0">
<div class="col p-2"> <div class="col p-2">
<h1 class="card-title" title="{{feature.get('name')}}">{{feature.get('name')}}</h1> <h1 class="card-title" title="{{feature.get('name')}}">{{feature.get('name')}}</h1>
<div class="card-text">{{feature.get('datadate')|date:'shortDate'}}</div> <div class="card-text">{{feature.get('datadate')|date:'shortDate'}}</div>
</div> </div>
</div> </div>
}

View File

@@ -12,8 +12,7 @@ import { ForItemType } from '../for-item/for-itemtype.decorator';
@Component({ @Component({
selector: 'fm-map-feature-list-feature-croppingscheme', selector: 'fm-map-feature-list-feature-croppingscheme',
templateUrl: './feature-list-feature-croppingscheme.component.html', templateUrl: './feature-list-feature-croppingscheme.component.html',
styleUrls: ['./feature-list-feature-croppingscheme.component.scss'], styleUrls: ['./feature-list-feature-croppingscheme.component.scss']
standalone: false
}) })
export class FeatureListFeatureCroppingschemeComponent extends AbstractFeatureListFeatureComponent { export class FeatureListFeatureCroppingschemeComponent extends AbstractFeatureListFeatureComponent {

View File

@@ -1,18 +1,12 @@
@if (feature; as feature) { <div *ngIf="feature;let feature" class="row m-0">
<div class="row m-0">
<div class="col-3 w-25 m-0 p-2 thumbnail"> <div class="col-3 w-25 m-0 p-2 thumbnail">
@if (feature.get('thumbnail')) { <img *ngIf="feature.get('thumbnail')" [src]="config.getConfig('apiEndPoint') + '/api/v1/items/'+feature.get('code')+'/thumbnail'" />
<img [src]="config.getConfig('apiEndPoint') + '/api/v1/items/'+feature.get('code')+'/thumbnail'" /> <div *ngIf="!feature.get('thumbnail')" [style.background-color]="itemTypeService.getColor(feature.get('itemType'))">
}
@if (!feature.get('thumbnail')) {
<div [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>
}
</div> </div>
<div class="col p-2"> <div class="col p-2">
<h1 class="card-title" title="{{feature.get('name')}}"><i [ngClass]="itemTypeService.getIcon(feature.get('itemType'))" [style.color]="itemTypeService.getColor(feature.get('itemType'))"></i>&nbsp;{{feature.get('name')}}</h1> <h1 class="card-title" title="{{feature.get('name')}}"><i [ngClass]="itemTypeService.getIcon(feature.get('itemType'))" [style.color]="itemTypeService.getColor(feature.get('itemType'))"></i>&nbsp;{{feature.get('name')}}</h1>
<div class="card-text">{{feature.get('datadate')|date:'shortDate'}}</div> <div class="card-text">{{feature.get('datadate')|date:'shortDate'}}</div>
</div> </div>
</div> </div>
}

View File

@@ -20,8 +20,7 @@ export abstract class AbstractFeatureListFeatureComponent {
@Component({ @Component({
selector: 'fm-map-feature-list-feature', selector: 'fm-map-feature-list-feature',
templateUrl: './feature-list-feature.component.html', templateUrl: './feature-list-feature.component.html',
styleUrls: ['./feature-list-feature.component.scss'], styleUrls: ['./feature-list-feature.component.scss']
standalone: false
}) })
export class FeatureListFeatureComponent extends AbstractFeatureListFeatureComponent { export class FeatureListFeatureComponent extends AbstractFeatureListFeatureComponent {

View File

@@ -1,20 +0,0 @@
<div class="card border-0">
@if ((schemeItem|async); as schemeItem) {
<div class="card-body">
<fm-back-button></fm-back-button>
<h4 i18n>Farm</h4>
<h3>{{schemeItem.name}}</h3>
@if (features; as features) {
<div>
<div class="cropfields">
@for (feature of features; track feature) {
<div class="row m-0 ps-3 pe-3" [ngClass]="{'selected':isFeatureSelected(feature)}" (click)="handleFeatureClick(feature)" (mouseenter)="handleFeatureMouseEnter(feature)" (mouseleave)="handleFeatureMouseLeave(feature)">
<fm-map-feature-list-feature-container [feature]="feature"></fm-map-feature-list-feature-container>
</div>
}
</div>
</div>
}
</div>
}
</div>

View File

@@ -1,20 +0,0 @@
fm-map-feature-list-feature-container {
width:100%;
pointer-events:none;
}
.row {
border-bottom: 1px solid var(--bs-gray-500);
user-select: none;
padding-left:1.5rem;
}
.row.selected {
background-color: var(--bs-gray-100);
}
.cropfields {
border-top: 1px solid var(--bs-gray-500);
margin-left: -1.25rem;
margin-right: -1.25rem;
}

View File

@@ -1,31 +0,0 @@
import { Component, Injectable,AfterViewInit, OnInit,SimpleChanges, ChangeDetectorRef} from '@angular/core';
import { Location } from '@angular/common';
import { AbstractFeatureListComponent } from '../feature-list/feature-list.component';
import {ForItemType } from '../for-item/for-itemtype.decorator';
import {ForChild } from '../for-item/for-child.decorator';
import { Store } from '@ngrx/store';
import * as mapReducers from '../../reducers/map.reducer';
import { commonReducers, ItemTypeService, IItem,ItemService } from '@farmmaps/common';
import { Observable } from 'rxjs';
@ForChild()
@ForItemType("vnd.farmmaps.itemtype.observation")
@Injectable()
@Component({
selector: 'fm-map-feature-list-observation',
templateUrl: './feature-list-observation.component.html',
styleUrls: ['./feature-list-observation.component.scss'],
standalone: false
})
export class FeatureListObservationComponent extends AbstractFeatureListComponent implements OnInit {
constructor(store: Store<mapReducers.State | commonReducers.State>, itemTypeService: ItemTypeService, location: Location, private itemService: ItemService) {
super(store, itemTypeService,location);
}
public schemeItem: Observable<IItem>
ngOnInit() {
this.schemeItem = this.itemService.getItem(this.queryState.parentCode);
}
}

View File

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

View File

@@ -60,8 +60,7 @@ export abstract class AbstractFeatureListComponent {
@Component({ @Component({
selector: 'fm-map-feature-list', selector: 'fm-map-feature-list',
templateUrl: './feature-list.component.html', templateUrl: './feature-list.component.html',
styleUrls: ['./feature-list.component.scss'], styleUrls: ['./feature-list.component.scss']
standalone: false
}) })
export class FeatureListComponent extends AbstractFeatureListComponent { export class FeatureListComponent extends AbstractFeatureListComponent {

View File

@@ -8,8 +8,7 @@ import * as style from 'ol/style';
@Component({ @Component({
selector: 'fm-map-feature-thumbnail', selector: 'fm-map-feature-thumbnail',
templateUrl: './feature-thumbnail.component.html', templateUrl: './feature-thumbnail.component.html',
styleUrls: ['./feature-thumbnail.component.scss'], styleUrls: ['./feature-thumbnail.component.scss']
standalone: false
}) })
export class GeometryThumbnailComponent implements AfterViewInit { export class GeometryThumbnailComponent implements AfterViewInit {

View File

@@ -1,11 +1,10 @@
import { Directive, ViewContainerRef,TemplateRef,OnInit,Input, OnChanges } from '@angular/core'; import { Directive, ViewContainerRef,TemplateRef,OnInit,Input, OnChanges } from '@angular/core';
import { Layer } from 'ol/layer'; import { Layer } from 'ol/layer';
import { Source } from 'ol/source'; import { Source } from 'ol/source';
import { MapComponent } from '@farmmaps/ng-openlayers'; import { MapComponent } from 'ng-openlayers';
@Directive({ @Directive({
selector: '[fmMapIfZoomToShow]', selector: '[fmMapIfZoomToShow]',
standalone: false
}) })
export class ifZoomToShowDirective implements OnInit { export class ifZoomToShowDirective implements OnInit {
@Input() @Input()

View File

@@ -10,8 +10,7 @@ import { IItem, IListItem } from '@farmmaps/common';
<div style="height:100%"> <div style="height:100%">
<ng-template fm-map-widget-host></ng-template> <ng-template fm-map-widget-host></ng-template>
</div> </div>
`, `
standalone: false
}) })
export class ItemListItemContainerComponent { export class ItemListItemContainerComponent {

View File

@@ -1,6 +1,4 @@
@if (item; as item) { <div *ngIf="item;let item" class="widget" [style.background-color]="itemTypeService.getColor(item.itemType)">
<div class="widget" [style.background-color]="itemTypeService.getColor(item.itemType)">
<div class="align-middle icon" [ngClass]="itemTypeService.getIcon(item.itemType)"></div> <div class="align-middle icon" [ngClass]="itemTypeService.getIcon(item.itemType)"></div>
<div class="title">{{item.name}}</div> <div class="title">{{item.name}}</div>
</div> </div>
}

View File

@@ -43,8 +43,7 @@ export abstract class AbstractItemWidgetComponent {
@Component({ @Component({
selector: 'fm-map-item-list-item', selector: 'fm-map-item-list-item',
templateUrl: './item-list-item.component.html', templateUrl: './item-list-item.component.html',
styleUrls: ['./item-list-item.component.scss'], styleUrls: ['./item-list-item.component.scss']
standalone: false
}) })
export class ItemListItemComponent extends AbstractItemListItemComponent { export class ItemListItemComponent extends AbstractItemListItemComponent {

View File

@@ -1,11 +1,7 @@
@if (items; as items) { <div *ngIf="items;let items" class="widget-container pt-0">
<div class="widget-container pt-0"> <div class="widget" *ngFor="let item of items" (click)="handleItemClick(item)">
@for (item of items; track item) {
<div class="widget" (click)="handleItemClick(item)">
<div class="content"> <div class="content">
<fm-map-item-list-item-container [item]="item" class="item-container"></fm-map-item-list-item-container> <fm-map-item-list-item-container [item]="item" class="item-container"></fm-map-item-list-item-container>
</div> </div>
</div> </div>
}
</div> </div>
}

View File

@@ -30,8 +30,7 @@ export abstract class AbstractItemListComponent {
@Component({ @Component({
selector: 'fm-map-item-list', selector: 'fm-map-item-list',
templateUrl: './item-list.component.html', templateUrl: './item-list.component.html',
styleUrls: ['./item-list.component.scss'], styleUrls: ['./item-list.component.scss']
standalone: false
}) })
export class ItemListComponent extends AbstractItemListComponent { export class ItemListComponent extends AbstractItemListComponent {

View File

@@ -1,11 +1,7 @@
@if (widgets; as widgets) { <div *ngIf="widgets;let widgets" class="widget-container pt-0">
<div class="widget-container pt-0"> <div class="widget" *ngFor="let widget of widgets">
@for (widget of widgets; track widget) {
<div class="widget">
<div class="content"> <div class="content">
<ng-template #widgetTemplate></ng-template> <ng-template #widgetTemplate></ng-template>
</div> </div>
</div> </div>
}
</div> </div>
}

View File

@@ -10,8 +10,7 @@ import { AbstractItemWidgetComponent } from '../item-list-item/item-list-item.co
@Component({ @Component({
selector: 'fm-map-item-widget-list', selector: 'fm-map-item-widget-list',
templateUrl: './item-widget-list.component.html', templateUrl: './item-widget-list.component.html',
styleUrls: ['./item-widget-list.component.scss'], styleUrls: ['./item-widget-list.component.scss']
standalone: false
}) })
export class ItemWidgetListComponent implements AfterViewInit { export class ItemWidgetListComponent implements AfterViewInit {

View File

@@ -10,7 +10,7 @@
<li class="nav-item py-0"> <li class="nav-item py-0">
<span><i class="fal fa-layer-group" aria-hidden="true"></i>&nbsp;<span i18n>Base maps</span></span> <span><i class="fal fa-layer-group" aria-hidden="true"></i>&nbsp;<span i18n>Base maps</span></span>
<div class="mb-4"> <div class="mb-4">
<fm-map-layer-list [baseLayers]="true" [itemLayers]="baseMaps|async" [selectedLayer]="selectedBaseLayer|async" (onSelectLayer)="handleSelectBaseLayer($event)"></fm-map-layer-list> <fm-map-layer-list [baseLayers]="true" [itemLayers]="baseLayers|async" [selectedLayer]="selectedBaseLayer|async" (onSelectLayer)="handleSelectBaseLayer($event)"></fm-map-layer-list>
</div> </div>
</li> </li>
<li class="nav-item py-0"> <li class="nav-item py-0">
@@ -19,20 +19,13 @@
<fm-map-layer-list [itemLayers]="overlayLayers|async" [selectedLayer]="selectedOverlayLayer|async" (onDelete)="handleOnDelete($event)" (onToggleVisibility)="handleOnToggleVisibility($event)" (onSetOpacity)="handleOnSetOpacity($event)" (onZoomToExtent)="handleZoomToExtent($event)" (onSelectLayer)="handleSelectOverlayLayer($event)"></fm-map-layer-list> <fm-map-layer-list [itemLayers]="overlayLayers|async" [selectedLayer]="selectedOverlayLayer|async" (onDelete)="handleOnDelete($event)" (onToggleVisibility)="handleOnToggleVisibility($event)" (onSetOpacity)="handleOnSetOpacity($event)" (onZoomToExtent)="handleZoomToExtent($event)" (onSelectLayer)="handleSelectOverlayLayer($event)"></fm-map-layer-list>
</div> </div>
</li> </li>
@if (selectedItemLayer$ | async; as selectedItemLayer) { <li class="nav-item py-0" *ngIf="selectedItemLayer$ | async as selectedItemLayer">
<li class="nav-item py-0"> <span><i class="fal fa-layer-group" aria-hidden="true"></i>&nbsp;<span i18n>Data</span><span class="slideButton"><a href="#" title="Compare" class="btn btn-light btn-sm" (click)="handleToggleShowDatalayerSlide($event)"><i class="fal fa-sliders-h-square"></i></a></span></span>
<span><i class="fal fa-layer-group" aria-hidden="true"></i>&nbsp;<span i18n>Overlay slider</span><span class="slideButton"><a href="#" title="Compare" class="btn btn-light btn-sm" (click)="handleToggleShowDatalayerSlide($event)"><i class="fal fa-sliders-h-square"></i></a></span></span>
<div class="mb-4"> <div class="mb-4">
<fm-map-layer-list [dataLayers]="true" [itemLayers]="[selectedItemLayer]" [selectedLayer]="selectedItemLayer" (onToggleVisibility)="handleOnToggleVisibility($event)" (onSetOpacity)="handleOnSetOpacity($event)" (onZoomToExtent)="handleZoomToExtent($event)" (onSelectLayer)="handleSelectOverlayLayer($event)"></fm-map-layer-list> <fm-map-layer-list [dataLayers]="true" [itemLayers]="[selectedItemLayer]" [selectedLayer]="selectedItemLayer" (onToggleVisibility)="handleOnToggleVisibility($event)" (onSetOpacity)="handleOnSetOpacity($event)" (onZoomToExtent)="handleZoomToExtent($event)" (onSelectLayer)="handleSelectOverlayLayer($event)"></fm-map-layer-list>
</div> </div>
</li> </li>
}
<li class="nav-item py-0">
<span><i class="fal fa-layer-group" aria-hidden="true"></i>&nbsp;<span i18n>Aerial photos</span></span>
<div class="mb-4">
<fm-map-layer-list [baseLayers]="true" [itemLayers]="aerialMaps|async" [selectedLayer]="selectedBaseLayer|async" (onSelectLayer)="handleSelectBaseLayer($event)"></fm-map-layer-list>
</div>
</li>
</ul> </ul>
</div> </div>
</div> </div>

View File

@@ -4,13 +4,12 @@ import { Store } from '@ngrx/store';
import * as mapReducers from '../../reducers/map.reducer'; import * as mapReducers from '../../reducers/map.reducer';
import * as mapActions from '../../actions/map.actions'; import * as mapActions from '../../actions/map.actions';
import {createEmpty,extend } from 'ol/extent'; import {createEmpty,extend } from 'ol/extent';
import { filter, map, Observable } from 'rxjs'; import { Observable } from 'rxjs';
@Component({ @Component({
selector: 'fm-map-layer-switcher', selector: 'fm-map-layer-switcher',
templateUrl: './layer-switcher.component.html', templateUrl: './layer-switcher.component.html',
styleUrls: ['./layer-switcher.component.scss'], styleUrls: ['./layer-switcher.component.scss']
standalone: false
}) })
export class LayerSwitcher implements OnInit,OnChanges{ export class LayerSwitcher implements OnInit,OnChanges{
@@ -18,8 +17,7 @@ export class LayerSwitcher implements OnInit,OnChanges{
public overlayLayers: Observable<Array<IItemLayer>>; public overlayLayers: Observable<Array<IItemLayer>>;
public selectedOverlayLayer: Observable<IItemLayer>; public selectedOverlayLayer: Observable<IItemLayer>;
public selectedItemLayer$: Observable<IItemLayer>; public selectedItemLayer$: Observable<IItemLayer>;
public baseMaps: Observable<Array<IItemLayer>>; public baseLayers: Observable<Array<IItemLayer>>;
public aerialMaps: Observable<Array<IItemLayer>>;
public selectedBaseLayer: Observable<IItemLayer>; public selectedBaseLayer: Observable<IItemLayer>;
constructor( private store: Store<mapReducers.State>) { constructor( private store: Store<mapReducers.State>) {
@@ -28,8 +26,7 @@ export class LayerSwitcher implements OnInit,OnChanges{
ngOnInit() { ngOnInit() {
this.overlayLayers = this.store.select(mapReducers.selectGetOverlayLayers); this.overlayLayers = this.store.select(mapReducers.selectGetOverlayLayers);
this.selectedOverlayLayer = this.store.select(mapReducers.selectGetSelectedOverlayLayer); this.selectedOverlayLayer = this.store.select(mapReducers.selectGetSelectedOverlayLayer);
this.baseMaps = this.store.select(mapReducers.selectGetBaseMaps); this.baseLayers = this.store.select(mapReducers.selectGetBaseLayers);
this.aerialMaps = this.store.select(mapReducers.selectGetArealMaps);
this.selectedBaseLayer = this.store.select(mapReducers.selectGetSelectedBaseLayer); this.selectedBaseLayer = this.store.select(mapReducers.selectGetSelectedBaseLayer);
this.selectedItemLayer$ = this.store.select(mapReducers.selectGetSelectedItemLayer) this.selectedItemLayer$ = this.store.select(mapReducers.selectGetSelectedItemLayer)
this.showLayerSwitcher = this.store.select(mapReducers.selectGetShowLayerSwitcher); this.showLayerSwitcher = this.store.select(mapReducers.selectGetShowLayerSwitcher);
@@ -86,4 +83,3 @@ export class LayerSwitcher implements OnInit,OnChanges{
event.preventDefault(); event.preventDefault();
} }
} }

View File

@@ -8,8 +8,8 @@
<div class="col-8 nopadding" ><span i18n>Max</span>:</div> <div class="col-8 nopadding" ><span i18n>Max</span>:</div>
<div class="col-4 pull-left nopadding">{{ getScaledValue(histogram.max)| number:'1.0-2'}}</div> <div class="col-4 pull-left nopadding">{{ getScaledValue(histogram.max)| number:'1.0-2'}}</div>
@if (showConfidenceInterval()) { <ng-container *ngIf="showConfidenceInterval()">
<div class="col-8 nopadding"><span i18n>Confidence interval</span>:</div> <div class="col-8 nopadding"><span i18n>Confidence interval</span>:</div>
<div class="col-4 pull-left nopadding">{{ getScaledValue(histogram.confidence * 100)| number:'1.0-0'}}%</div> <div class="col-4 pull-left nopadding">{{ getScaledValue(histogram.confidence * 100)| number:'1.0-0'}}%</div>
} </ng-container>
</div> </div>

View File

@@ -7,8 +7,7 @@ import {IHistogram, ILayer} from '../../../models/color.map';
styles: ['.nopadding{\n' + styles: ['.nopadding{\n' +
' padding: 0 !important;\n' + ' padding: 0 !important;\n' +
' margin: 0 !important;\n' + ' margin: 0 !important;\n' +
'}'], '}']
standalone: false
}) })
export class HistogramDetailsComponent { export class HistogramDetailsComponent {

View File

@@ -1,66 +1,46 @@
@if (showLegend()) { <table class="container" *ngIf="showLegend()">
<table class="container">
<tr> <tr>
<td colspan="3"> <td colspan="3">
<div class="title"> <div class="title">
@if (showTitle) { <h4 *ngIf="showTitle">{{layer.name}}</h4>
<h4>{{layer.name}}</h4> <b *ngIf="layer.unit">({{layer.unit}})</b>
}
@if (layer.unit) {
<b>({{layer.unit}})</b>
}
</div> </div>
</td> </td>
<td> <td>
<a i18n-title title="more info"><i class="fal fa-info-circle text-primary" (click)="hideHistogramDetails = !hideHistogramDetails"></i></a> <a i18n-title title="more info"><i class="fal fa-info-circle text-primary" (click)="hideHistogramDetails = !hideHistogramDetails"></i></a>
</td> </td>
<td colspan="2"> <td colspan="2">
@if (histogramenabled) { <div class="title" *ngIf="histogramenabled">
<div class="title">
<h4>{{histogram}}</h4> <h4>{{histogram}}</h4>
@if (histogramunit) { <b *ngIf="histogramunit">({{histogramunit}})</b>
<b>({{histogramunit}})</b>
}
</div> </div>
}
</td> </td>
</tr> </tr>
@for (entry of layer.renderer.colorMap.entries; track entry; let i = $index) { <tr *ngFor="let entry of layer.renderer.colorMap.entries; let i = index ">
<tr>
<td class="legend-items"><span [style.background-color]="getAlphaHex(entry.color)" [style.border-color]="getHex(entry.color)"class="color"></span></td> <td class="legend-items"><span [style.background-color]="getAlphaHex(entry.color)" [style.border-color]="getHex(entry.color)"class="color"></span></td>
<td class="legend-items-text">@if (!entry.label) { <td class="legend-items-text"><span *ngIf="!entry.label">{{getScaledValue(entry.value,layer.scale) | number:'1.0-2'}} {{legendunit}}</span><span *ngIf="entry.label">{{entry.label}}</span></td>
<span>{{getScaledValue(entry.value,layer.scale) | number:'1.0-2'}} {{legendunit}}</span>
}@if (entry.label) {
<span>{{entry.label}}</span>
}</td>
<td class="histogram-items"> <td class="histogram-items">
@if (showHistogram()) { <div *ngIf="showHistogram()">
<div>
<span class="bar" [style.background-color]="getHex(entry.color)" [style.width]="getPart(layer.renderer, i)"> <span class="bar" [style.background-color]="getHex(entry.color)" [style.width]="getPart(layer.renderer, i)">
</span> </span>
@if (getPercentage(layer.renderer,i); as percentage) { <span *ngIf="getPercentage(layer.renderer,i) as percentage" class="bar-label">{{percentage | number:'1.0-2'}} %</span>
<span class="bar-label">{{percentage | number:'1.0-2'}} %</span>
}
</div> </div>
}
</td> </td>
</tr> </tr>
} <tr *ngIf="showHistogram()">
@if (showHistogram()) {
<tr>
<td colspan="4" class="pb-1 pt-1"> <td colspan="4" class="pb-1 pt-1">
<div class="info" [ngbCollapse]="hideHistogramDetails"> <div class="info" [ngbCollapse]="hideHistogramDetails">
@if (bandContainsStatistics()) { <ng-container *ngIf="bandContainsStatistics(); else histogram">
<fm-map-statistics-details [statistics]="layer.renderer.band.statistics" [scale]="layer.scale"></fm-map-statistics-details> <fm-map-statistics-details [statistics]="layer.renderer.band.statistics" [scale]="layer.scale"></fm-map-statistics-details>
} @else { </ng-container>
<ng-template #histogram>
<fm-map-histogram-details [histogram]="layer.renderer.band.histogram" [scale]="layer.scale"></fm-map-histogram-details> <fm-map-histogram-details [histogram]="layer.renderer.band.histogram" [scale]="layer.scale"></fm-map-histogram-details>
} </ng-template>
</div> </div>
</td> </td>
</tr> </tr>
}
</table> </table>
}

View File

@@ -5,8 +5,7 @@ import { IColorMap, IColor, IColorEntry,ILayer, IRenderer } from '../../models/c
@Component({ @Component({
selector: 'fm-map-layer-legend', selector: 'fm-map-layer-legend',
templateUrl: './legend.component.html', templateUrl: './legend.component.html',
styleUrls: ['./legend.component.scss'], styleUrls: ['./legend.component.scss']
standalone: false
}) })
export class LegendComponent implements OnInit,AfterViewInit { export class LegendComponent implements OnInit,AfterViewInit {

View File

@@ -29,8 +29,8 @@
<div class="col-4 pull-left nopadding">{{getSquaredScaledValue(statistics.variance)| number:'1.0-2'}}</div> <div class="col-4 pull-left nopadding">{{getSquaredScaledValue(statistics.variance)| number:'1.0-2'}}</div>
<div class="col-8 nopadding"><span i18n>Coefficient of variation</span>:</div> <div class="col-8 nopadding"><span i18n>Coefficient of variation</span>:</div>
<div class="col-4 pull-left nopadding">{{statistics.variationCoefficient | number:'1.0-2'}}</div> <div class="col-4 pull-left nopadding">{{statistics.variationCoefficient | number:'1.0-2'}}</div>
@if (statistics.confidenceIntervalLow !== undefined) { <ng-container *ngIf="statistics.confidenceIntervalLow !== undefined">
<div class="col-8 nopadding">90% <span i18n>Confidence interval</span>:</div> <div class="col-8 nopadding">90% <span i18n>Confidence interval</span>:</div>
<div class="col-4 pull-left nopadding">{{getScaledValue(statistics.confidenceIntervalLow) | number:'1.0-2'}} - {{getScaledValue(statistics.confidenceIntervalHigh) | number:'1.0-2'}}</div> <div class="col-4 pull-left nopadding">{{getScaledValue(statistics.confidenceIntervalLow) | number:'1.0-2'}} - {{getScaledValue(statistics.confidenceIntervalHigh) | number:'1.0-2'}}</div>
} </ng-container>
</div> </div>

View File

@@ -7,8 +7,7 @@ import { IStatistics } from '../../../models/color.map';
styles: ['.nopadding{\n' + styles: ['.nopadding{\n' +
' padding: 0 !important;\n' + ' padding: 0 !important;\n' +
' margin: 0 !important;\n' + ' margin: 0 !important;\n' +
'}'], '}']
standalone: false
}) })
export class StatisticsDetailsComponent { export class StatisticsDetailsComponent {

View File

@@ -14,7 +14,7 @@ div.map-search {
} }
.disabled { .disabled {
color: adjust(#000000,80%); color:lighten(#000000,80%);
} }
:host ::ng-deep ngb-typeahead-window.dropdown-menu { :host ::ng-deep ngb-typeahead-window.dropdown-menu {

View File

@@ -9,8 +9,7 @@ import { tassign } from 'tassign';
@Component({ @Component({
selector: 'fm-map-map-search', selector: 'fm-map-map-search',
templateUrl: './map-search.component.html', templateUrl: './map-search.component.html',
styleUrls: ['./map-search.component.scss'], styleUrls: ['./map-search.component.scss']
standalone: false
}) })
export class MapSearchComponent { export class MapSearchComponent {

View File

@@ -1,4 +1,4 @@
@if ({ <ng-container *ngIf="{
mapState:mapState$|async, mapState:mapState$|async,
extent:extent$|async, extent:extent$|async,
baseLayers:baseLayers$|async, baseLayers:baseLayers$|async,
@@ -22,25 +22,23 @@
styles:styles$|async, styles:styles$|async,
selectedFeature:selectedFeature$|async, selectedFeature:selectedFeature$|async,
fullscreen:fullscreen$|async, fullscreen:fullscreen$|async,
showDataLayerSlide:showDataLayerSlide$|async, showDataLayerSlide:showDataLayerSlide$|async
menuVisible:menuVisible$|async } as state">
}; as state) {
<aol-map #map (moveEnd)="handleOnMoveEnd($event)" (click)="handleOnMouseDown($event)" (dblClick)="handleShowLayerValues($event)" [ngClass]="{'panel-visible':state.panelVisible,'fullscreen':state.fullscreen }" class="map"> <aol-map #map (moveEnd)="handleOnMoveEnd($event)" (click)="handleOnMouseDown($event)" (dblClick)="handleShowLayerValues($event)" [ngClass]="{'panel-visible':state.panelVisible,'fullscreen':state.fullscreen }" class="map">
<div> <div>
</div> </div>
<aol-view [zoom]="state.mapState.zoom" [rotation]="state.mapState.rotation"> <aol-view [zoom]="state.mapState.zoom" [rotation]="state.mapState.rotation">
<aol-coordinate [x]="state.mapState.xCenter" [y]="state.mapState.yCenter" [srid]="'EPSG:4326'"></aol-coordinate> <aol-coordinate [x]="state.mapState.xCenter" [y]="state.mapState.yCenter" [srid]="'EPSG:4326'"></aol-coordinate>
<fm-map-zoom-to-extent [extent]="state.extent" [animate]="true"></fm-map-zoom-to-extent> <fm-map-zoom-to-extent [extent]="state.extent" [animate]="true"></fm-map-zoom-to-extent>
</aol-view> </aol-view>
<aol-interaction-default></aol-interaction-default> <aol-interaction-default></aol-interaction-default>
<aol-interaction-dragrotateandzoom></aol-interaction-dragrotateandzoom> <aol-interaction-dragrotateandzoom></aol-interaction-dragrotateandzoom>
<fm-map-item-layers [itemLayers]="state.baseLayers"></fm-map-item-layers> <fm-map-item-layers [itemLayers]="state.baseLayers"></fm-map-item-layers>
@if (!overrideOverlayLayers) { <fm-map-item-layers *ngIf="!overrideOverlayLayers" [itemLayers]="state.overlayLayers"></fm-map-item-layers>
<fm-map-item-layers [itemLayers]="state.overlayLayers"></fm-map-item-layers> <fm-map-item-layers *ngIf="!overrideSelectedItemLayer" [itemLayer]="state.selectedItemLayer" (onPrerender)="handlePrerender($event)"></fm-map-item-layers>
}
@if (!overrideSelectedItemLayer) {
<fm-map-item-layers [itemLayer]="state.selectedItemLayer" (onPrerender)="handlePrerender($event)"></fm-map-item-layers>
}
<aol-layer-vector> <aol-layer-vector>
<fm-map-item-source-vector [styles]="state.styles" [features]="state.features" (onFeatureSelected)="handleFeatureClick($event)" (onFeatureHover)="handleFeatureHover($event)" [selectedFeature]="state.selectedFeature" [selectedItem]="state.selectedItem"></fm-map-item-source-vector> <fm-map-item-source-vector [styles]="state.styles" [features]="state.features" (onFeatureSelected)="handleFeatureClick($event)" (onFeatureHover)="handleFeatureHover($event)" [selectedFeature]="state.selectedFeature" [selectedItem]="state.selectedItem"></fm-map-item-source-vector>
</aol-layer-vector> </aol-layer-vector>
@@ -61,49 +59,37 @@
</div> </div>
</div> </div>
<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>
@if (noContent) {
<div> <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($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>
</div> </div>
}
<div class="side-panel-container"> <div class="side-panel-container">
<fm-side-panel [resizeable]="true" (onResize)="handlePanelResize($event)" [visible]="state.panelVisible && noContent" [collapsed]="state.panelCollapsed" [collapsable]="false" [extrawide]="state.panelExtraWide"> <fm-side-panel [resizeable]="true" (onResize)="handlePanelResize($event)" [visible]="state.panelVisible && noContent" [collapsed]="state.panelCollapsed" [collapsable]="false" [extrawide]="state.panelExtraWide">
@if (noContent) { <div class="panel-wrapper" *ngIf="noContent">
<div class="panel-wrapper"> <div class="panel-top bg-secondary" *ngIf="!(state.searchMinified)">
@if (!(state.searchMinified)) {
<div class="panel-top bg-secondary">
</div> </div>
}
<div class="panel-bottom"> <div class="panel-bottom">
@if (!(state.selectedItem)) {
<div> <div *ngIf="!(state.selectedItem)">
<fm-map-feature-list-container [features]="state.features" [selectedFeature]="state.selectedFeature" [queryState]="state.queryState" [clickedFeature]="clickedFeature"></fm-map-feature-list-container> <fm-map-feature-list-container [features]="state.features" [selectedFeature]="state.selectedFeature" [queryState]="state.queryState" [clickedFeature]="clickedFeature"></fm-map-feature-list-container>
</div> </div>
}
@if (state.selectedItem; as item) { <div *ngIf="state.selectedItem;let item">
<div>
<fm-map-selected-item-container [item]="item" [parentItem]="state.parentItem" [itemLayer]="state.selectedItemLayer" [overlayLayers]="state.overlayLayers"></fm-map-selected-item-container> <fm-map-selected-item-container [item]="item" [parentItem]="state.parentItem" [itemLayer]="state.selectedItemLayer" [overlayLayers]="state.overlayLayers"></fm-map-selected-item-container>
</div> </div>
} <div *ngIf="state.features.length == 0" class="no-results m-2">
@if (state.features.length == 0) { <div *ngIf="state.queryState.query">Cannot find <span>{{state.queryState?.query}}</span></div>
<div class="no-results m-2"> <div *ngIf="state.queryState?.tags">Cannot find tag <span>{{state.queryState?.tags}}</span></div>
@if (state.queryState.query) { </div>
<div>Cannot find <span>{{state.queryState?.query}}</span></div>
}
@if (state.queryState?.tags) {
<div>Cannot find tag <span>{{state.queryState?.tags}}</span></div>
}
</div>
}
</div> </div>
</div> </div>
}
</fm-side-panel> </fm-side-panel>
<fm-side-panel [resizeable]="true" [visible]="!noContent" [extrawide]="state.panelExtraWide"> <fm-side-panel [resizeable]="true" [visible]="!noContent" [extrawide]="state.panelExtraWide">
<router-outlet (activate)="handleSidepaneloutletActivate($event)" (deactivate)="handleSidepaneloutletDeactivate($event)"></router-outlet> <router-outlet (activate)="handleSidepaneloutletActivate($event)" (deactivate)="handleSidepaneloutletDeactivate($event)"></router-outlet>
</fm-side-panel> </fm-side-panel>
</div> </div>
</aol-map> </aol-map>
} </ng-container>

View File

@@ -52,21 +52,12 @@ aol-map { position:absolute;width:100%;height:calc( 100vh );}
pointer-events: none; pointer-events: none;
} }
@media screen and (max-width: 768px) {
.control-container {
margin-left: 1em;
margin-right: 1em;
pointer-events: all;
}
}
@media screen and (min-width: 768px) {
.control-container { .control-container {
float:right; float:right;
margin-right: 1em; margin-right: 1em;
pointer-events: all; pointer-events: all;
} }
}
.fullscreen .viewport-container { .fullscreen .viewport-container {
margin-bottom: 1em; margin-bottom: 1em;

View File

@@ -41,8 +41,7 @@ import * as style from 'ol/style';
@Component({ @Component({
selector: 'fm-map-map', selector: 'fm-map-map',
templateUrl: './map.component.html', templateUrl: './map.component.html',
styleUrls: ['./map.component.scss'], styleUrls: ['./map.component.scss']
standalone: false
}) })
export class MapComponent implements OnInit, OnDestroy,AfterViewInit { export class MapComponent implements OnInit, OnDestroy,AfterViewInit {
@@ -93,8 +92,6 @@ export class MapComponent implements OnInit, OnDestroy, AfterViewInit {
public noContent = false; public noContent = false;
public overrideSelectedItemLayer = false; public overrideSelectedItemLayer = false;
public overrideOverlayLayers = false; public overrideOverlayLayers = false;
public hideShowLayerValues = false;
public const
public dataLayerSlideValue = 50; public dataLayerSlideValue = 50;
public dataLayerSlideEnabled = false; public dataLayerSlideEnabled = false;
private visibleAreaBottom = 0; private visibleAreaBottom = 0;
@@ -119,7 +116,6 @@ export class MapComponent implements OnInit, OnDestroy, AfterViewInit {
const params = route.snapshot.data["fm-map-map"]; const params = route.snapshot.data["fm-map-map"];
this.overrideSelectedItemLayer = params["overrideSelectedItemlayer"] ? params["overrideSelectedItemlayer"] : false; this.overrideSelectedItemLayer = params["overrideSelectedItemlayer"] ? params["overrideSelectedItemlayer"] : false;
this.overrideOverlayLayers = params["overrideOverlayLayers"] ? params["overrideOverlayLayers"] : false; this.overrideOverlayLayers = params["overrideOverlayLayers"] ? params["overrideOverlayLayers"] : false;
this.hideShowLayerValues = params["hideShowLayerValues"] ? params["hideShowLayerValues"] : false;
} }
this.querySub = this.query$.pipe(skip(1), withLatestFrom(this.mapState$)).subscribe(([query,mapState]) =>{ this.querySub = this.query$.pipe(skip(1), withLatestFrom(this.mapState$)).subscribe(([query,mapState]) =>{
if(query && query.querystate) { if(query && query.querystate) {
@@ -301,13 +297,11 @@ export class MapComponent implements OnInit, OnDestroy, AfterViewInit {
normalizeMapState(mapState:IMapState):IMapState { normalizeMapState(mapState:IMapState):IMapState {
if(!mapState) return null; if(!mapState) return null;
return { return {zoom: this.round(mapState.zoom,0),
zoom: this.round(mapState.zoom, 0),
rotation: this.round(mapState.rotation,2), rotation: this.round(mapState.rotation,2),
xCenter: this.round(mapState.xCenter,5), xCenter: this.round(mapState.xCenter,5),
yCenter: this.round(mapState.yCenter,5), yCenter: this.round(mapState.yCenter,5),
baseLayerCode: mapState.baseLayerCode baseLayerCode: mapState.baseLayerCode };
};
} }
serializeMapState(mapState:IMapState):string { serializeMapState(mapState:IMapState):string {
@@ -478,13 +472,11 @@ export class MapComponent implements OnInit, OnDestroy, AfterViewInit {
} }
handleShowLayerValues(event: MouseEvent) { handleShowLayerValues(event: MouseEvent) {
if (!this.hideShowLayerValues) {
event.stopPropagation(); event.stopPropagation();
this.zone.run(() =>{ this.zone.run(() =>{
this.store.dispatch(new mapActions.ToggleLayerValuesEnabled()); this.store.dispatch(new mapActions.ToggleLayerValuesEnabled());
}); });
} }
}
handleOnDownload(event) { handleOnDownload(event) {

View File

@@ -11,8 +11,7 @@ export interface IMetaData {
@Component({ @Component({
selector: 'fm-map-meta-data-modal', selector: 'fm-map-meta-data-modal',
templateUrl: 'meta-data-modal.component.html', templateUrl: 'meta-data-modal.component.html'
standalone: false
}) })
export class MetaDataModalComponent { export class MetaDataModalComponent {

View File

@@ -18,8 +18,7 @@ const after = (one: NgbDateStruct, two: NgbDateStruct) =>
@Component({ @Component({
selector: 'fm-map-select-period-modal', selector: 'fm-map-select-period-modal',
templateUrl: 'select-period-modal.component.html', templateUrl: 'select-period-modal.component.html',
styleUrls: ['select-period-modal.component.scss'], styleUrls: ['select-period-modal.component.scss']
standalone: false
}) })
export class SelectPeriodModalComponent { export class SelectPeriodModalComponent {

View File

@@ -8,8 +8,7 @@ import { IItemLayer } from '../../models/item.layer';
@Component({ @Component({
selector: 'fm-map-selected-item-container', selector: 'fm-map-selected-item-container',
templateUrl: './selected-item-container.component.html', templateUrl: './selected-item-container.component.html',
styleUrls: ['./selected-item-container.component.scss'], styleUrls: ['./selected-item-container.component.scss']
standalone: false
}) })
export class SelectedItemContainerComponent { export class SelectedItemContainerComponent {

View File

@@ -1,6 +1,5 @@
<div class="spacer"></div> <div class="spacer"></div>
@if (item; as item) { <div *ngIf="item;let item">
<div>
<div class="card border-0"> <div class="card border-0">
<div class="card-body"> <div class="card-body">
<fm-back-button></fm-back-button> <fm-back-button></fm-back-button>
@@ -10,9 +9,7 @@
<div class="card-text"><span>{{areaInHa(item)| number:'1.2-2'}} ha</span>&nbsp;<span>{{item.data.cropTypeName}}</span></div> <div class="card-text"><span>{{areaInHa(item)| number:'1.2-2'}} ha</span>&nbsp;<span>{{item.data.cropTypeName}}</span></div>
<div class="card-text"><span>{{item.data.startDate|date}}</span> - <span>{{item.data.endDate|date}}</span> </div> <div class="card-text"><span>{{item.data.startDate|date}}</span> - <span>{{item.data.endDate|date}}</span> </div>
<ul class="p-0 mt-2"> <ul class="p-0 mt-2">
@if (item.isEditable) { <li *ngIf="item.isEditable"><a href="#" (click)="handleOnEdit(item)"><i class="fal fa-pencil" aria-hidden="true" i18n-title title="Edit"></i>&nbsp;<span i18n>Edit</span></a></li>
<li><a href="#" (click)="handleOnEdit(item)"><i class="fal fa-pencil" aria-hidden="true" i18n-title title="Edit"></i>&nbsp;<span i18n>Edit</span></a></li>
}
</ul> </ul>
</div> </div>
</div> </div>
@@ -20,4 +17,3 @@
<fm-map-item-widget-list [item]="item"></fm-map-item-widget-list> <fm-map-item-widget-list [item]="item"></fm-map-item-widget-list>
</div> </div>
</div> </div>
}

View File

@@ -18,15 +18,14 @@ import { withLatestFrom,switchMap,combineLatest } from 'rxjs/operators';
@Component({ @Component({
selector: 'fm-map-selected-item-cropfield', selector: 'fm-map-selected-item-cropfield',
templateUrl: './selected-item-cropfield.component.html', templateUrl: './selected-item-cropfield.component.html',
styleUrls: ['./selected-item-cropfield.component.scss'], styleUrls: ['./selected-item-cropfield.component.scss']
standalone: false
}) })
export class SelectedItemCropfieldComponent extends AbstractSelectedItemComponent implements OnInit{ export class SelectedItemCropfieldComponent extends AbstractSelectedItemComponent implements OnInit{
public items: Observable<IListItem[]>; public items: Observable<IListItem[]>;
constructor(store: Store<mapReducers.State | commonReducers.State>, itemTypeService: ItemTypeService, location: Location, router: Router, private itemService$: ItemService,private folderService$: FolderService) { constructor(store: Store<mapReducers.State | commonReducers.State>, itemTypeService: ItemTypeService, location: Location, router: Router, private itemService$: ItemService,private folderService$: FolderService) {
super(store, itemTypeService, itemService$, location,router); super(store, itemTypeService,location,router);
} }
areaInHa(item:IItem):number { areaInHa(item:IItem):number {

View File

@@ -1,51 +1,34 @@
<div class="spacer"></div> <div class="spacer"></div>
@if (item; as item) { <div *ngIf="item;let item">
<div>
<div class="card border-0"> <div class="card border-0">
<div class="card-body"> <div class="card-body">
<fm-back-button></fm-back-button> <fm-back-button></fm-back-button>
<div class="card menu-card"> <div class="card menu-card">
@if (parentOfItemType('vnd.farmmaps.itemtype.cropfield')) { <h2 *ngIf="parentOfItemType('vnd.farmmaps.itemtype.cropfield')">{{parentItem.name}}</h2>
<h2>{{parentItem.name}}</h2>
}
<h1>{{item.name}}</h1> <h1>{{item.name}}</h1>
</div> </div>
@if (item?.data.layers; as layers) { <div class="legend-container" *ngIf="item?.data.layers;let layers">
<div class="legend-container">
<div class="card menu-card"> <div class="card menu-card">
@if (layers.length>1) { <div *ngIf="layers.length>1">
<div>
<select (change)="onLayerChanged($event.target.value)"> <select (change)="onLayerChanged($event.target.value)">
@for (l of layers; track l) { <option *ngFor="let l of layers;" [value]="l.index" [selected]="itemLayer.layerIndex == l.index">{{l.name}}</option>
<option [value]="l.index" [selected]="itemLayer.layerIndex == l.index">{{l.name}}</option>
}
</select> </select>
</div> </div>
}
<fm-map-layer-legend [showTitle]="layers.length == 1" <fm-map-layer-legend [showTitle]="layers.length == 1"
[layer]="layer(layers,itemLayer.layerIndex)" [histogramenabled]="true"></fm-map-layer-legend> [layer]="layer(layers,itemLayer.layerIndex)" [histogramenabled]="true"></fm-map-layer-legend>
</div> </div>
</div> </div>
<div class="card menu-card"> <div class="card menu-card">
<ul class="p-0 mt-2"> <ul class="p-0 mt-2">
@if (item.isEditable) { <li *ngIf="item.isEditable"><a href="#" class="ms-1 me-1" (click)="handleOnEdit(item)"><i class="fal fa-pencil" aria-hidden="true" i18n-title title="Edit"></i>&nbsp;<span i18n>Edit</span></a></li>
<li><a href="#" class="ms-1 me-1" (click)="handleOnEdit(item)"><i class="fal fa-pencil" aria-hidden="true" i18n-title title="Edit"></i>&nbsp;<span i18n>Edit</span></a></li> <ng-container *ngIf="itemTypeService.isLayer(item)">
} <li *ngIf="!getItemLayer(item,itemLayer.layerIndex)"><a href="#" (click)="handleAddAsLayer(item,itemLayer.layerIndex)"><i class="fas fa-layer-plus" aria-hidden="true" i18n-title title="Add as layer"></i>&nbsp;<span i18n>Add as overlay</span></a></li>
@if (itemTypeService.isLayer(item)) { <li *ngIf="getItemLayer(item,itemLayer.layerIndex)"><a href="#" (click)="handleRemoveLayer(item,itemLayer.layerIndex)"><i class="fas fa-layer-minus" aria-hidden="true" i18n-title title="Remove overlay"></i>&nbsp;<span i18n>Remove overlay</span></a></li>
@if (!getItemLayer(item,itemLayer.layerIndex)) { </ng-container>
<li><a href="#" (click)="handleAddAsLayer(item,itemLayer.layerIndex)"><i class="fas fa-layer-plus" aria-hidden="true" i18n-title title="Add as layer"></i>&nbsp;<span i18n>Add as overlay</span></a></li>
}
@if (getItemLayer(item,itemLayer.layerIndex)) {
<li><a href="#" (click)="handleRemoveLayer(item,itemLayer.layerIndex)"><i class="fas fa-layer-minus" aria-hidden="true" i18n-title title="Remove overlay"></i>&nbsp;<span i18n>Remove overlay</span></a></li>
}
}
<li><fm-item-link class="text-primary p-0" [itemCode]="item.code" pathSuffix="data" [showText]="true"></fm-item-link></li> <li><fm-item-link class="text-primary p-0" [itemCode]="item.code" pathSuffix="data" [showText]="true"></fm-item-link></li>
<li><a href="#" (click)="download($event,item,layers,itemLayer.layerIndex)"><i class="fal fa-download" aria-hidden="true" i18n-title title="Download"></i>&nbsp;<span i18n>Download</span></a></li>
</ul> </ul>
</div> </div>
<fm-map-zoom-to-show-alert [layer]="itemLayer?.layer"></fm-map-zoom-to-show-alert> <fm-map-zoom-to-show-alert [layer]="itemLayer?.layer"></fm-map-zoom-to-show-alert>
}
</div> </div>
</div> </div>
</div> </div>
}

View File

@@ -1,13 +1,12 @@
import { Component, Injectable } from '@angular/core';
import { Location } from '@angular/common'; import { Location } from '@angular/common';
import { Component, Injectable, OnDestroy } from '@angular/core';
import { Router } from '@angular/router';
import { commonReducers, FolderService, IItem, IItemLinkType, ItemService, ItemTypeService, IUrlType } from '@farmmaps/common';
import { Store } from '@ngrx/store'; import { Store } from '@ngrx/store';
import { Subscription } from 'rxjs';
import * as mapActions from '../../actions/map.actions';
import * as mapReducers from '../../reducers/map.reducer'; import * as mapReducers from '../../reducers/map.reducer';
import { commonReducers, ItemTypeService, ItemService, FolderService } from '@farmmaps/common';
import { Router } from '@angular/router';
import { ForItemType } from '../for-item/for-itemtype.decorator'; import { ForItemType } from '../for-item/for-itemtype.decorator';
import { AbstractSelectedItemComponent } from '../selected-item/selected-item.component'; import { AbstractSelectedItemComponent } from '../selected-item/selected-item.component';
import * as mapActions from '../../actions/map.actions';
@ForItemType("vnd.farmmaps.itemtype.geotiff.processed") @ForItemType("vnd.farmmaps.itemtype.geotiff.processed")
@@ -15,18 +14,12 @@ import { AbstractSelectedItemComponent } from '../selected-item/selected-item.co
@Component({ @Component({
selector: 'fm-map-selected-item-geotiff', selector: 'fm-map-selected-item-geotiff',
templateUrl: './selected-item-geotiff.component.html', templateUrl: './selected-item-geotiff.component.html',
styleUrls: ['./selected-item-geotiff.component.scss'], styleUrls: ['./selected-item-geotiff.component.scss']
standalone: false
}) })
export class SelectedItemGeotiffComponent extends AbstractSelectedItemComponent implements OnDestroy { export class SelectedItemGeotiffComponent extends AbstractSelectedItemComponent {
sub: Subscription;
constructor(store: Store<mapReducers.State | commonReducers.State>, public itemService: ItemService, itemTypeService: ItemTypeService, location: Location, router: Router, private itemService$: ItemService,private folderService$: FolderService) { constructor(store: Store<mapReducers.State | commonReducers.State>, itemTypeService: ItemTypeService, location: Location, router: Router, private itemService$: ItemService,private folderService$: FolderService) {
super(store, itemTypeService,itemService,location,router); super(store, itemTypeService,location,router);
}
ngOnDestroy(): void {
if (this.sub) this.sub.unsubscribe();
} }
onLayerChanged(layerIndex: number) { onLayerChanged(layerIndex: number) {
@@ -36,13 +29,4 @@ export class SelectedItemGeotiffComponent extends AbstractSelectedItemComponent
layer(layers:any,layerIndex:number) { layer(layers:any,layerIndex:number) {
return layers.find(l => l.index == layerIndex); return layers.find(l => l.index == layerIndex);
} }
download(event:MouseEvent,item:IItem,layers:any,layerIndex:number) {
event.stopPropagation();
event.preventDefault();
const itemLink : IItemLinkType = {itemcode:item.code,query:`layer=${this.layer(layers,layerIndex).name}`,pathsuffix:"download", validminutes:10}
this.sub = this.itemService.getItemLink(itemLink).subscribe((itemLinkUrl:IUrlType) => {
window.location.href = itemLinkUrl.url;
})
}
} }

View File

@@ -1,49 +1,32 @@
<div class="spacer"></div> <div class="spacer"></div>
@if (item; as item) { <div *ngIf="item;let item">
<div>
<div class="card border-0"> <div class="card border-0">
<div class="card-body"> <div class="card-body">
<fm-back-button></fm-back-button> <fm-back-button></fm-back-button>
<div class="card menu-card"> <div class="card menu-card">
@if (parentOfItemType('vnd.farmmaps.itemtype.cropfield')) { <h2 *ngIf="parentOfItemType('vnd.farmmaps.itemtype.cropfield')">{{parentItem.name}}</h2>
<h2>{{parentItem.name}}</h2>
}
<h1>{{item.name}}</h1> <h1>{{item.name}}</h1>
</div> </div>
@if (item?.data.layers; as layers) { <div class="legend-container" *ngIf="item?.data.layers;let layers">
<div class="legend-container">
<div class="card menu-card"> <div class="card menu-card">
@if (layers.length>1) { <div *ngIf="layers.length>1">
<div>
<select (change)="onLayerChanged($event.target.value)"> <select (change)="onLayerChanged($event.target.value)">
@for (l of layers; track l) { <option *ngFor="let l of layers;" [value]="l.index" [selected]="itemLayer.layerIndex == l.index">{{l.name}}</option>
<option [value]="l.index" [selected]="itemLayer.layerIndex == l.index">{{l.name}}</option>
}
</select> </select>
</div> </div>
}
<fm-map-layer-legend [showTitle]="layers.length==1" [layer]="layer(layers,itemLayer.layerIndex)" [histogramenabled]="true"></fm-map-layer-legend> <fm-map-layer-legend [showTitle]="layers.length==1" [layer]="layer(layers,itemLayer.layerIndex)" [histogramenabled]="true"></fm-map-layer-legend>
</div> </div>
</div> </div>
<div class="card menu-card"> <div class="card menu-card">
<ul class="p-0 mt-2"> <ul class="p-0 mt-2">
@if (item.isEditable) { <li *ngIf="item.isEditable"><a href="#" class="mt-1 me-1" (click)="handleOnEdit(item)" ><i class="fal fa-pencil" aria-hidden="true" i18n-title title="Edit"></i>&nbsp;<span i18n>Edit</span></a></li>
<li><a href="#" class="mt-1 me-1" (click)="handleOnEdit(item)" ><i class="fal fa-pencil" aria-hidden="true" i18n-title title="Edit"></i>&nbsp;<span i18n>Edit</span></a></li> <ng-container *ngIf="itemTypeService.isLayer(item)">
} <li *ngIf="!getItemLayer(item,itemLayer.layerIndex)"><a href="#" (click)="handleAddAsLayer(item,itemLayer.layerIndex)" ><i class="fas fa-layer-olus" aria-hidden="true" i18n-title title="Add as layer"></i>&nbsp;<span i18n>Add as overlay</span></a></li>
@if (itemTypeService.isLayer(item)) { <li *ngIf="getItemLayer(item,itemLayer.layerIndex)"><a href="#" (click)="handleRemoveLayer(item,itemLayer.layerIndex)" ><i class="fas fa-layer-minus" aria-hidden="true" i18n-title title="Remove overlay"></i>&nbsp;<span i18n>Remove overlay</span></a></li>
@if (!getItemLayer(item,itemLayer.layerIndex)) { </ng-container>
<li><a href="#" (click)="handleAddAsLayer(item,itemLayer.layerIndex)" ><i class="fas fa-layer-olus" aria-hidden="true" i18n-title title="Add as layer"></i>&nbsp;<span i18n>Add as overlay</span></a></li>
}
@if (getItemLayer(item,itemLayer.layerIndex)) {
<li><a href="#" (click)="handleRemoveLayer(item,itemLayer.layerIndex)" ><i class="fas fa-layer-minus" aria-hidden="true" i18n-title title="Remove overlay"></i>&nbsp;<span i18n>Remove overlay</span></a></li>
}
}
<li><a href="#" (click)="download($event,item,layers,itemLayer.layerIndex)"><i class="fal fa-download" aria-hidden="true" i18n-title title="Download"></i>&nbsp;<span i18n>Download</span></a></li>
</ul> </ul>
</div> </div>
}
<fm-map-zoom-to-show-alert [layer]="itemLayer?.layer"></fm-map-zoom-to-show-alert> <fm-map-zoom-to-show-alert [layer]="itemLayer?.layer"></fm-map-zoom-to-show-alert>
</div> </div>
</div> </div>
</div> </div>
}

View File

@@ -1,13 +1,14 @@
import { Component, Input, Injectable, OnInit } from '@angular/core';
import { Location } from '@angular/common'; import { Location } from '@angular/common';
import { Component, Injectable, OnDestroy } from '@angular/core'; import { Feature } from 'ol';
import { Router } from '@angular/router';
import { commonReducers, FolderService, IItem, IItemLinkType, ItemService, ItemTypeService, IUrlType } from '@farmmaps/common';
import { Store } from '@ngrx/store'; import { Store } from '@ngrx/store';
import * as mapActions from '../../actions/map.actions';
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 * as mapActions from '../../actions/map.actions';
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 { Subscription } from 'rxjs'; import { Observable } from 'rxjs';
@ForItemType("vnd.farmmaps.itemtype.shape.processed") @ForItemType("vnd.farmmaps.itemtype.shape.processed")
@@ -15,20 +16,14 @@ import { Subscription } from 'rxjs';
@Component({ @Component({
selector: 'fm-map-selected-item-shape', selector: 'fm-map-selected-item-shape',
templateUrl: './selected-item-shape.component.html', templateUrl: './selected-item-shape.component.html',
styleUrls: ['./selected-item-shape.component.scss'], styleUrls: ['./selected-item-shape.component.scss']
standalone: false
}) })
export class SelectedItemShapeComponent extends AbstractSelectedItemComponent implements OnDestroy { export class SelectedItemShapeComponent extends AbstractSelectedItemComponent {
constructor(store: Store<mapReducers.State | commonReducers.State>, itemTypeService: ItemTypeService, location: Location, router: Router, private itemService$: ItemService,private folderService$: FolderService) {
super(store, itemTypeService,location,router);
}
public selectedLayer = 0; public selectedLayer = 0;
sub: Subscription;
constructor(store: Store<mapReducers.State | commonReducers.State>, public itemService: ItemService, itemTypeService: ItemTypeService, location: Location, router: Router, private itemService$: ItemService,private folderService$: FolderService) {
super(store, itemTypeService,itemService,location,router);
}
ngOnDestroy(): void {
if (this.sub) this.sub.unsubscribe();
}
onLayerChanged(layerIndex: number) { onLayerChanged(layerIndex: number) {
this.store.dispatch(new mapActions.SetLayerIndex(layerIndex)); this.store.dispatch(new mapActions.SetLayerIndex(layerIndex));
@@ -37,13 +32,4 @@ export class SelectedItemShapeComponent extends AbstractSelectedItemComponent im
layer(layers:any,layerIndex:number) { layer(layers:any,layerIndex:number) {
return layers.find(l => l.index == layerIndex); return layers.find(l => l.index == layerIndex);
} }
download(event:MouseEvent,item:IItem,layers:any,layerIndex:number) {
event.stopPropagation();
event.preventDefault();
const itemLink : IItemLinkType = {itemcode:item.code,query:`layer=${this.layer(layers,layerIndex).name}`,pathsuffix:"download", validminutes:10}
this.sub = this.itemService.getItemLink(itemLink).subscribe((itemLinkUrl:IUrlType) => {
window.location.href = itemLinkUrl.url;
})
}
} }

View File

@@ -1,70 +1,49 @@
<div class="spacer"></div> <div class="spacer"></div>
@if (selectedItem(); as item) { <div *ngIf="selectedItem();let item">
<div>
<div class="card border-0"> <div class="card border-0">
<div class="card-body"> <div class="card-body">
<fm-back-button></fm-back-button> <fm-back-button></fm-back-button>
<div class="card menu-card"> <div class="card menu-card">
@if (parentOfItemType('vnd.farmmaps.itemtype.cropfield')) { <h2 *ngIf="parentOfItemType('vnd.farmmaps.itemtype.cropfield')">{{parentItem.name}}</h2>
<h2>{{parentItem.name}}</h2>
}
<h1>{{item.name}}</h1> <h1>{{item.name}}</h1>
</div> </div>
@if (item?.data.layers; as layers) { <div class="legend-container" *ngIf="item?.data.layers;let layers">
<div class="legend-container">
<div class="card menu-card"> <div class="card menu-card">
<h5><span i18n>Date</span>: {{temporalService.selectedDate(itemLayer)}}</h5> <h5><span i18n>Date</span>: {{temporalService.selectedDate(itemLayer)}}</h5>
<div class="d-flex justify-content-between"> <div class="d-flex justify-content-between">
<div> <div>
@if (temporalService.hasPrevious(itemLayer)) { <button *ngIf="temporalService.hasPrevious(itemLayer)" type="button" class="btn btn-link p-0" (click)="handlePreviousTemporal($event)">
<button type="button" class="btn btn-link p-0" (click)="handlePreviousTemporal($event)">
<i class="fal fa-arrow-circle-left" aria-hidden="true" i18n-title title="Previous"></i>&nbsp;{{ temporalService.previousDate(itemLayer) }} <i class="fal fa-arrow-circle-left" aria-hidden="true" i18n-title title="Previous"></i>&nbsp;{{ temporalService.previousDate(itemLayer) }}
</button> </button>
}
</div> </div>
<div> <div>
@if (temporalService.hasNext(itemLayer)) { <button *ngIf="temporalService.hasNext(itemLayer)" type="button" class="btn btn-link p-0" (click)="handleNextTemporal($event)">
<button type="button" class="btn btn-link p-0" (click)="handleNextTemporal($event)">
{{ temporalService.nextDate(itemLayer)}}&nbsp;<i class="fal fa-arrow-circle-right" aria-hidden="true" i18n-title title="Next"></i> {{ temporalService.nextDate(itemLayer)}}&nbsp;<i class="fal fa-arrow-circle-right" aria-hidden="true" i18n-title title="Next"></i>
</button> </button>
}
</div> </div>
</div> </div>
<fm-map-zoom-to-show-alert [layer]="currentItemLayer()?.layer"></fm-map-zoom-to-show-alert> <fm-map-zoom-to-show-alert [layer]="currentItemLayer()?.layer"></fm-map-zoom-to-show-alert>
</div> </div>
<div class="card menu-card pt-2"> <div class="card menu-card pt-2">
@if (layers.length>1) { <div *ngIf="layers.length>1">
<div>
<select (change)="onLayerChanged($event.target.value)"> <select (change)="onLayerChanged($event.target.value)">
@for (l of layers; track l) { <option *ngFor="let l of layers;" [value]="l.index" [selected]="itemLayer.layerIndex == l.index">{{l.name}}</option>
<option [value]="l.index" [selected]="itemLayer.layerIndex == l.index">{{l.name}}</option>
}
</select> </select>
</div> </div>
}
<fm-map-layer-legend [showTitle]="layers.length == 1" <fm-map-layer-legend [showTitle]="layers.length == 1"
[layer]="layer(layers,itemLayer.layerIndex)" [histogramenabled]="true"></fm-map-layer-legend> [layer]="layer(layers,itemLayer.layerIndex)" [histogramenabled]="true"></fm-map-layer-legend>
</div> </div>
</div> </div>
<div class="card menu-card"> <div class="card menu-card">
<ul class="p-0 mt-2"> <ul class="p-0 mt-2">
@if (item.isEditable) { <li *ngIf="item.isEditable"><a href="#" class="mt-1 me-1" (click)="handleOnEdit(item)"><i class="fal fa-pencil" aria-hidden="true" i18n-title title="Edit"></i>&nbsp;<span i18n>Edit</span></a></li>
<li><a href="#" class="mt-1 me-1" (click)="handleOnEdit(item)"><i class="fal fa-pencil" aria-hidden="true" i18n-title title="Edit"></i>&nbsp;<span i18n>Edit</span></a></li> <ng-container *ngIf="itemTypeService.isLayer(item)">
} <li *ngIf="!getItemLayer(item,itemLayer.layerIndex)"><a href="#" (click)="handleAddAsLayer(item,itemLayer.layerIndex)"><i class="fas fa-layer-plus" aria-hidden="true" i18n-title title="Add as layer"></i>&nbsp;<span i18n>Add as overlay</span></a></li>
@if (itemTypeService.isLayer(item)) { <li *ngIf="getItemLayer(item,itemLayer.layerIndex)"><a href="#" (click)="handleRemoveLayer(item,itemLayer.layerIndex)"><i class="fas fa-layer-minus" aria-hidden="true" i18n-title title="Remove overlay"></i>&nbsp;<span i18n>Remove overlay</span></a></li>
@if (!getItemLayer(item,itemLayer.layerIndex)) { </ng-container>
<li><a href="#" (click)="handleAddAsLayer(item,itemLayer.layerIndex)"><i class="fas fa-layer-plus" aria-hidden="true" i18n-title title="Add as layer"></i>&nbsp;<span i18n>Add as overlay</span></a></li>
}
@if (getItemLayer(item,itemLayer.layerIndex)) {
<li><a href="#" (click)="handleRemoveLayer(item,itemLayer.layerIndex)"><i class="fas fa-layer-minus" aria-hidden="true" i18n-title title="Remove overlay"></i>&nbsp;<span i18n>Remove overlay</span></a></li>
}
}
<li><a href="#" (click)="handleGoToChart(item)"><i class="fal fa-line-chart" aria-hidden="true" i18m-title title="Show chart"></i>&nbsp;<span i18n>Show chart</span></a></li> <li><a href="#" (click)="handleGoToChart(item)"><i class="fal fa-line-chart" aria-hidden="true" i18m-title title="Show chart"></i>&nbsp;<span i18n>Show chart</span></a></li>
<li><a href="#" (click)="download($event,item,layers,itemLayer.layerIndex)"><i class="fal fa-download" aria-hidden="true" i18n-title title="Download"></i>&nbsp;<span i18n>Download</span></a></li>
</ul> </ul>
</div> </div>
}
</div> </div>
</div> </div>
</div> </div>
}

View File

@@ -1,33 +1,28 @@
import { Component, Injectable } from '@angular/core';
import { Location } from '@angular/common'; import { Location } from '@angular/common';
import { Component, Injectable, OnDestroy } from '@angular/core';
import { Router } from '@angular/router';
import { commonReducers, IItem, IItemLinkType, ItemService, ItemTypeService, IUrlType } from '@farmmaps/common';
import { Store } from '@ngrx/store'; import { Store } from '@ngrx/store';
import { Subscription } from 'rxjs';
import * as mapActions from '../../actions/map.actions';
import { IItemLayer, ITemporalItemLayer } from '../../models/item.layer';
import * as mapReducers from '../../reducers/map.reducer'; import * as mapReducers from '../../reducers/map.reducer';
import { TemporalService } from '../../services/temporal.service'; import { commonReducers, ItemTypeService, IItem } from '@farmmaps/common';
import { Router } from '@angular/router';
import { ForItemType } from '../for-item/for-itemtype.decorator'; import { ForItemType } from '../for-item/for-itemtype.decorator';
import { AbstractSelectedItemComponent } from '../selected-item/selected-item.component'; import { AbstractSelectedItemComponent } from '../selected-item/selected-item.component';
import { ITemporalItemLayer} from '../../models/item.layer';
import * as mapActions from '../../actions/map.actions';
import { IItemLayer } from '../../models/item.layer';
import {TemporalService} from '../../services/temporal.service';
@ForItemType("vnd.farmmaps.itemtype.temporal") @ForItemType("vnd.farmmaps.itemtype.temporal")
@Injectable() @Injectable()
@Component({ @Component({
selector: 'fm-map-selected-item-temporal', selector: 'fm-map-selected-item-temporal',
templateUrl: './selected-item-temporal.component.html', templateUrl: './selected-item-temporal.component.html',
styleUrls: ['./selected-item-temporal.component.scss'], styleUrls: ['./selected-item-temporal.component.scss']
standalone: false
}) })
export class SelectedItemTemporalComponent extends AbstractSelectedItemComponent implements OnDestroy { export class SelectedItemTemporalComponent extends AbstractSelectedItemComponent {
sub: Subscription;
constructor(store: Store<mapReducers.State | commonReducers.State>, public itemService: ItemService, itemTypeService: ItemTypeService, location: Location, router: Router,public temporalService:TemporalService) { constructor(store: Store<mapReducers.State | commonReducers.State>, itemTypeService: ItemTypeService, location: Location, router: Router,public temporalService:TemporalService) {
super(store, itemTypeService,itemService,location,router); super(store, itemTypeService,location,router);
}
ngOnDestroy(): void {
if (this.sub) this.sub.unsubscribe();
} }
onLayerChanged(layerIndex: number) { onLayerChanged(layerIndex: number) {
@@ -38,6 +33,8 @@ export class SelectedItemTemporalComponent extends AbstractSelectedItemComponent
return (this.itemLayer as ITemporalItemLayer)?.selectedItemLayer return (this.itemLayer as ITemporalItemLayer)?.selectedItemLayer
} }
handleNextTemporal(event:MouseEvent) { handleNextTemporal(event:MouseEvent) {
this.store.dispatch(new mapActions.NextTemporal()); this.store.dispatch(new mapActions.NextTemporal());
event.preventDefault(); event.preventDefault();
@@ -64,13 +61,4 @@ export class SelectedItemTemporalComponent extends AbstractSelectedItemComponent
this.router.navigate(['/viewer', 'temporal', 'item', item.parentCode, new Date(Date.parse(item.dataDate)).getUTCFullYear()]); this.router.navigate(['/viewer', 'temporal', 'item', item.parentCode, new Date(Date.parse(item.dataDate)).getUTCFullYear()]);
return false; return false;
} }
download(event:MouseEvent,item:IItem,layers:any,layerIndex:number) {
event.stopPropagation();
event.preventDefault();
const itemLink : IItemLinkType = {itemcode:item.code,query:`layer=${this.layer(layers,layerIndex).name}`,pathsuffix:"download", validminutes:10}
this.sub = this.itemService.getItemLink(itemLink).subscribe((itemLinkUrl:IUrlType) => {
window.location.href = itemLinkUrl.url;
})
}
} }

View File

@@ -1,5 +1,4 @@
@if (item; as item) { <div *ngIf="item;let item">
<div>
<div class="card border-0"> <div class="card border-0">
<fm-thumbnail [item]="item" [edit]="item.isEditable"></fm-thumbnail> <fm-thumbnail [item]="item" [edit]="item.isEditable"></fm-thumbnail>
</div> </div>
@@ -9,23 +8,14 @@
<h1 class="card-title">{{item.name}}</h1> <h1 class="card-title">{{item.name}}</h1>
<div class="card menu-card"> <div class="card menu-card">
<ul class="p-0 mt-2"> <ul class="p-0 mt-2">
@if (itemTypeService.hasViewer(item)) { <li *ngIf="itemTypeService.hasViewer(item)"><a href="#" (click)="handleOnView(item)" class="btn btn-outline-secondary"><i class="fal fa-eye" aria-hidden="true" title="View"></i>&nbsp;<span i18n>View</span></a></li>
<li><a href="#" (click)="handleOnView(item)" class="btn btn-outline-secondary"><i class="fal fa-eye" aria-hidden="true" title="View"></i>&nbsp;<span i18n>View</span></a></li> <li *ngIf="item.isEditable"><a href="#" (click)="handleOnEdit(item)"><i class="fal fa-pencil" aria-hidden="true" title="Edit"></i> <span i18n>Edit</span></a></li>
} <ng-container *ngIf="itemTypeService.isLayer(item)">
@if (item.isEditable) { <li *ngIf="!getItemLayer(item)"><a href="#" (click)="handleAddAsLayer(item)"><i class="fas fa-layer-plus" aria-hidden="true" i18n-title title="Add as layer"></i>&nbsp;<span i18n>Add as overlay</span></a></li>
<li><a href="#" (click)="handleOnEdit(item)"><i class="fal fa-pencil" aria-hidden="true" title="Edit"></i> <span i18n>Edit</span></a></li> <li *ngIf="getItemLayer(item)"><a href="#" (click)="handleRemoveLayer(item)"><i class="fas fa-layer-minus" aria-hidden="true" i18n-title title="Remove overlay"></i>&nbsp;<span i18n>Remove overlay</span></a></li>
} </ng-container>
@if (itemTypeService.isLayer(item)) {
@if (!getItemLayer(item)) {
<li><a href="#" (click)="handleAddAsLayer(item)"><i class="fas fa-layer-plus" aria-hidden="true" i18n-title title="Add as layer"></i>&nbsp;<span i18n>Add as overlay</span></a></li>
}
@if (getItemLayer(item)) {
<li ><a href="#" (click)="handleRemoveLayer(item)"><i class="fas fa-layer-minus" aria-hidden="true" i18n-title title="Remove overlay"></i>&nbsp;<span i18n>Remove overlay</span></a></li>
}
}
</ul> </ul>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
}

View File

@@ -2,7 +2,7 @@ import {Component, Injectable, Input, Directive} from '@angular/core';
import {Location} from '@angular/common'; import {Location} from '@angular/common';
import {Store} from '@ngrx/store'; import {Store} from '@ngrx/store';
import * as mapReducers from '../../reducers/map.reducer'; import * as mapReducers from '../../reducers/map.reducer';
import {AppConfig, commonReducers, IItem, ItemService, ItemTypeService} from '@farmmaps/common'; import {AppConfig, commonReducers, IItem, ItemTypeService} from '@farmmaps/common';
import * as mapActions from '../../actions/map.actions'; import * as mapActions from '../../actions/map.actions';
import {Router} from '@angular/router'; import {Router} from '@angular/router';
import { IItemLayer } from '../../models/item.layer'; import { IItemLayer } from '../../models/item.layer';
@@ -15,7 +15,7 @@ export abstract class AbstractSelectedItemComponent {
@Input() parentItem: IItem; @Input() parentItem: IItem;
@Input() itemLayer: IItemLayer; @Input() itemLayer: IItemLayer;
@Input() overlayLayers: Array<IItemLayer>; @Input() overlayLayers: Array<IItemLayer>;
constructor(public store: Store<mapReducers.State | commonReducers.State>, public itemTypeService: ItemTypeService, public itemService: ItemService, private location: Location, public router: Router) { constructor(public store: Store<mapReducers.State | commonReducers.State>, public itemTypeService: ItemTypeService, private location: Location, public router: Router) {
} }
handleOnView(item: IItem) { handleOnView(item: IItem) {
@@ -37,11 +37,6 @@ export abstract class AbstractSelectedItemComponent {
return false; return false;
} }
handleOnDelete(item: IItem) {
this.itemService.deleteItem(item.code);
return false;
}
handleAddAsLayer(item: IItem,layerIndex = -1) { handleAddAsLayer(item: IItem,layerIndex = -1) {
this.store.dispatch(new mapActions.AddLayer(item,layerIndex)); this.store.dispatch(new mapActions.AddLayer(item,layerIndex));
return false; return false;
@@ -77,13 +72,12 @@ export abstract class AbstractSelectedItemComponent {
@Component({ @Component({
selector: 'fm-map-selected-item', selector: 'fm-map-selected-item',
templateUrl: './selected-item.component.html', templateUrl: './selected-item.component.html',
styleUrls: ['./selected-item.component.scss'], styleUrls: ['./selected-item.component.scss']
standalone: false
}) })
export class SelectedItemComponent extends AbstractSelectedItemComponent { export class SelectedItemComponent extends AbstractSelectedItemComponent {
constructor(store: Store<mapReducers.State | commonReducers.State>, itemTypeService: ItemTypeService, itemService: ItemService, location: Location, router: Router, public config:AppConfig) { constructor(store: Store<mapReducers.State | commonReducers.State>, itemTypeService: ItemTypeService, location: Location, router: Router, public config:AppConfig) {
super(store, itemTypeService,itemService,location,router); super(store, itemTypeService,location,router);
} }
getThumbnailUrl(item:IItem):string { getThumbnailUrl(item:IItem):string {

View File

@@ -2,7 +2,6 @@ import { Directive, ViewContainerRef } from '@angular/core';
@Directive({ @Directive({
selector: '[fm-map-widget-host]', selector: '[fm-map-widget-host]',
standalone: false
}) })
export class WidgetHostDirective { export class WidgetHostDirective {
constructor(public viewContainerRef: ViewContainerRef) { } constructor(public viewContainerRef: ViewContainerRef) { }

View File

@@ -1,16 +1,6 @@
<div> <div [ngSwitch]="stage">
@switch (stage) { <h6 *ngSwitchCase="StageEnum.DevelopmentPreAlpha" style="color:darkred" [ngbTooltip]="info"><b><span i18n>Stage:Pre-alpha</span></b></h6>
@case (StageEnum.DevelopmentPreAlpha) { <h6 *ngSwitchCase="StageEnum.DevelopmentAlpha" style="color:red" [ngbTooltip]="info"><b><span i18n>Stage:Alpha</span></b></h6>
<h6 style="color:darkred" [ngbTooltip]="info"><b><span i18n>Stage:Pre-alpha</span></b></h6> <h6 *ngSwitchCase="StageEnum.DevelopmentBeta" style="color:orange" [ngbTooltip]="info" ><b><span i18n>Stage:Beta</span></b></h6>
} <h6 *ngSwitchCase="StageEnum.ReleaseCandidate" style="color:green" [ngbTooltip]="info" ><b><span i18n>Stage:RC</span></b></h6>
@case (StageEnum.DevelopmentAlpha) {
<h6 style="color:red" [ngbTooltip]="info"><b><span i18n>Stage:Alpha</span></b></h6>
}
@case (StageEnum.DevelopmentBeta) {
<h6 style="color:orange" [ngbTooltip]="info" ><b><span i18n>Stage:Beta</span></b></h6>
}
@case (StageEnum.ReleaseCandidate) {
<h6 style="color:green" [ngbTooltip]="info" ><b><span i18n>Stage:RC</span></b></h6>
}
}
</div> </div>

View File

@@ -3,8 +3,7 @@ import { Component, OnInit, Input } from '@angular/core';
@Component({ @Component({
selector: 'fm-map-widget-status', selector: 'fm-map-widget-status',
templateUrl: './widget-status.component.html', templateUrl: './widget-status.component.html',
styleUrls: ['./widget-status.component.css'], styleUrls: ['./widget-status.component.css']
standalone: false
}) })
export class WidgetStatusComponent implements OnInit { export class WidgetStatusComponent implements OnInit {
@Input() stage: Stage; @Input() stage: Stage;

View File

@@ -4,8 +4,7 @@ import { Source } from 'ol/source';
@Component({ @Component({
selector: 'fm-map-zoom-to-show-alert', selector: 'fm-map-zoom-to-show-alert',
template: '<div *fmMapIfZoomToShow="layer$" class="alert alert-info"><i class="fas fa-search-plus" aria-hidden="true" i18n-title title="Add as layer"></i>&nbsp;<span i18n>Zoom in to show layer</span></div>', template: '<div *fmMapIfZoomToShow="layer$" class="alert alert-info"><i class="fas fa-search-plus" aria-hidden="true" i18n-title title="Add as layer"></i>&nbsp;<span i18n>Zoom in to show layer</span></div>'
standalone: false
}) })
export class ZoomToShowAlert { export class ZoomToShowAlert {
public layer$: Layer<Source>; public layer$: Layer<Source>;

View File

@@ -166,7 +166,6 @@ export class MapEffects {
zoomToExtent2$ = createEffect(() => this.actions$.pipe( zoomToExtent2$ = createEffect(() => this.actions$.pipe(
ofType(mapActions.SETFEATURES), ofType(mapActions.SETFEATURES),
switchMap((action: mapActions.SetFeatures) => { switchMap((action: mapActions.SetFeatures) => {
if (action.zoomToExtent) {
const extent = createEmpty(); const extent = createEmpty();
if (extent) { if (extent) {
for (const f of action.features) { for (const f of action.features) {
@@ -174,7 +173,6 @@ export class MapEffects {
} }
if (action.features.length > 0) return of(new mapActions.SetExtent(extent)); if (action.features.length > 0) return of(new mapActions.SetExtent(extent));
} }
}
return EMPTY; return EMPTY;
}))); })));

View File

@@ -9,7 +9,6 @@ import { ILayervalue } from '../models/layer.value';
import * as mapActions from '../actions/map.actions'; import * as mapActions from '../actions/map.actions';
import {commonActions} from '@farmmaps/common'; import {commonActions} from '@farmmaps/common';
import { createSelector, createFeatureSelector } from '@ngrx/store'; import { createSelector, createFeatureSelector } from '@ngrx/store';
import * as _ from 'lodash';
import {Feature} from 'ol'; import {Feature} from 'ol';
import {Geometry} from 'ol/geom'; import {Geometry} from 'ol/geom';
@@ -48,7 +47,6 @@ export interface State {
query:IQuery, query:IQuery,
parentCode: string, parentCode: string,
features: Array<Feature<Geometry>>, features: Array<Feature<Geometry>>,
featuresBackup: Array<Feature<Geometry>>,
panelVisible: boolean, panelVisible: boolean,
panelCollapsed: boolean, panelCollapsed: boolean,
panelExtraWide: boolean, panelExtraWide: boolean,
@@ -95,7 +93,6 @@ export const initialState: State = {
query: null, query: null,
parentCode: null, parentCode: null,
features: [], features: [],
featuresBackup: [],
panelVisible: false, panelVisible: false,
panelCollapsed: false, panelCollapsed: false,
panelExtraWide: false, panelExtraWide: false,
@@ -159,15 +156,13 @@ export function reducer(state = initialState, action: mapActions.Actions | commo
const a = action as mapActions.StartSearchSuccess; const a = action as mapActions.StartSearchSuccess;
return tassign(state, { return tassign(state, {
features: a.features, features: a.features,
featuresBackup: [],
inSearch:false inSearch:false
}); });
} }
case mapActions.SETFEATURES: { case mapActions.SETFEATURES: {
const a = action as mapActions.SetFeatures; const a = action as mapActions.SetFeatures;
return tassign(state, { return tassign(state, {
features: a.features, features: a.features
featuresBackup: []
}); });
} }
case mapActions.SELECTFEATURE: { case mapActions.SELECTFEATURE: {
@@ -185,7 +180,6 @@ export function reducer(state = initialState, action: mapActions.Actions | commo
selectedItemLayer: null, selectedItemLayer: null,
showDataLayerSlide: false, showDataLayerSlide: false,
features:[], features:[],
featuresBackup: [],
inSearch:inSearch inSearch:inSearch
}); });
} }
@@ -302,7 +296,6 @@ export function reducer(state = initialState, action: mapActions.Actions | commo
return tassign(state, { return tassign(state, {
selectedItem: null, selectedItem: null,
features:[], features:[],
featuresBackup: [],
selectedItemLayer:null, selectedItemLayer:null,
searchCollapsed: !panelVisible, searchCollapsed: !panelVisible,
panelVisible: panelVisible, panelVisible: panelVisible,
@@ -339,8 +332,7 @@ export function reducer(state = initialState, action: mapActions.Actions | commo
extent: a.feature.getGeometry().getExtent(), extent: a.feature.getGeometry().getExtent(),
searchCollapsed: false, searchCollapsed: false,
clearEnabled:true, clearEnabled:true,
features:features, features:features
featuresBackup:[]
}); });
} }
case mapActions.UPDATEFEATURESUCCESS: { case mapActions.UPDATEFEATURESUCCESS: {
@@ -354,7 +346,7 @@ export function reducer(state = initialState, action: mapActions.Actions | commo
features.push(state.features[i]); features.push(state.features[i]);
} }
} }
return tassign(state, { features: features, featuresBackup: [] }); return tassign(state, { features: features });
} }
case mapActions.EXPANDSEARCH: { case mapActions.EXPANDSEARCH: {
return tassign(state, { searchCollapsed: false }); return tassign(state, { searchCollapsed: false });
@@ -399,7 +391,7 @@ export function reducer(state = initialState, action: mapActions.Actions | commo
return tassign(state, {overlayLayers: [], selectedOverlayLayer: null}); return tassign(state, {overlayLayers: [], selectedOverlayLayer: null});
} }
case mapActions.CLEARFEATURES: { case mapActions.CLEARFEATURES: {
return tassign(state, {features: [], featuresBackup: [], selectedFeature: null}); return tassign(state, {features: [], selectedFeature: null});
} }
case mapActions.SETVISIBILITY: { case mapActions.SETVISIBILITY: {
const a = action as mapActions.SetVisibility; const a = action as mapActions.SetVisibility;
@@ -517,7 +509,6 @@ export function reducer(state = initialState, action: mapActions.Actions | commo
searchCollapsed: true, searchCollapsed: true,
searchMinified: false, searchMinified: false,
features: [], features: [],
featuresBackup: [],
query:initialState.query, query:initialState.query,
showLayerSwitcher: false, showLayerSwitcher: false,
extent: null, extent: null,
@@ -565,8 +556,7 @@ export function reducer(state = initialState, action: mapActions.Actions | commo
selectedItem: null, selectedItem: null,
selectedItemLayer: null, selectedItemLayer: null,
showDataLayerSlide: false, showDataLayerSlide: false,
features:[], features:[]
featuresBackup:[]
}); });
} }
if(state.features.length>0) { if(state.features.length>0) {
@@ -579,7 +569,7 @@ export function reducer(state = initialState, action: mapActions.Actions | commo
if(index>=0) { if(index>=0) {
const newFeatures = state.features.slice(0); const newFeatures = state.features.slice(0);
newFeatures.splice(index,1); newFeatures.splice(index,1);
return tassign(state,{features:newFeatures, featuresBackup:[]}); return tassign(state,{features:newFeatures});
} }
} }
return state; return state;
@@ -588,17 +578,6 @@ export function reducer(state = initialState, action: mapActions.Actions | commo
const a= action as mapActions.SetPanelExtraWide; const a= action as mapActions.SetPanelExtraWide;
return tassign(state,{panelExtraWide:a.panelExtraWide}); return tassign(state,{panelExtraWide:a.panelExtraWide});
} }
case mapActions.BACKUPFEATURES: {
return tassign(state, {
featuresBackup: _.cloneDeep(state.features)
});
}
case mapActions.RESTOREFEATURES: {
return tassign(state, {
features: _.cloneDeep(state.featuresBackup),
featuresBackup: []
});
}
default: { default: {
return state; return state;
} }
@@ -658,8 +637,6 @@ export const selectGetExtent = createSelector(selectMapState, getExtent);
export const selectGetViewExtent = createSelector(selectMapState, getViewExtent); export const selectGetViewExtent = createSelector(selectMapState, getViewExtent);
export const selectGetOverlayLayers = createSelector(selectMapState, getOverlayLayers); export const selectGetOverlayLayers = createSelector(selectMapState, getOverlayLayers);
export const selectGetBaseLayers = createSelector(selectMapState, getBaseLayers); export const selectGetBaseLayers = createSelector(selectMapState, getBaseLayers);
export const selectGetBaseMaps = createSelector(selectGetBaseLayers, (layers) => layers.filter(layer => layer.item.data.category === "baseMap"));
export const selectGetArealMaps = createSelector(selectGetBaseLayers, (layers) => layers.filter(layer => layer.item.data.category === "aerialPhoto").sort((a, b) => a.item.dataDate <= b.item.dataDate ? 1 : -1));
export const selectGetProjection = createSelector(selectMapState, getProjection); export const selectGetProjection = createSelector(selectMapState, getProjection);
export const selectGetSelectedBaseLayer = createSelector(selectMapState, getSelectedBaseLayer); export const selectGetSelectedBaseLayer = createSelector(selectMapState, getSelectedBaseLayer);
export const selectGetSelectedOverlayLayer = createSelector(selectMapState, getSelectedOverlayLayer); export const selectGetSelectedOverlayLayer = createSelector(selectMapState, getSelectedOverlayLayer);

View File

@@ -3,7 +3,7 @@
"compilerOptions": { "compilerOptions": {
"outDir": "../../out-tsc/lib", "outDir": "../../out-tsc/lib",
"module": "es2015", "module": "es2015",
"moduleResolution": "bundler", "moduleResolution": "node",
"declaration": true, "declaration": true,
"sourceMap": true, "sourceMap": true,
"inlineSources": true, "inlineSources": true,
@@ -12,9 +12,15 @@
"importHelpers": true, "importHelpers": true,
"esModuleInterop": true, "esModuleInterop": true,
"types": [], "types": [],
"lib": [
"dom",
"es2018"
],
"paths": { "paths": {
"@angular/*": [ "@angular/*": [
"node_modules/@angular/*" "node_modules/@angular/*"
] ]
} }
}, },

View File

@@ -3,7 +3,7 @@
"compilerOptions": { "compilerOptions": {
"outDir": "../../out-tsc/lib", "outDir": "../../out-tsc/lib",
"module": "es2015", "module": "es2015",
"moduleResolution": "bundler", "moduleResolution": "node",
"declaration": true, "declaration": true,
"sourceMap": true, "sourceMap": true,
"inlineSources": true, "inlineSources": true,
@@ -12,9 +12,15 @@
"importHelpers": true, "importHelpers": true,
"esModuleInterop": true, "esModuleInterop": true,
"types": [], "types": [],
"lib": [
"dom",
"es2018"
],
"paths": { "paths": {
"@angular/*": [ "@angular/*": [
"node_modules/@angular/*" "node_modules/@angular/*"
] ]
} }
}, },

View File

@@ -11,561 +11,17 @@
"tslib": "^2.0.0" "tslib": "^2.0.0"
}, },
"peerDependencies": { "peerDependencies": {
"@angular/common": "21.1.0", "@angular/common": "^17.3.3",
"@angular/core": "21.1.0", "@angular/core": "^17.3.3",
"cesium": "^1.97.0", "cesium": ">=1.82.1",
"ng-openlayers": "17.1.3",
"ol-cesium": ">=2.13.0" "ol-cesium": ">=2.13.0"
} }
}, },
"../../dist/libs/ng-openlayers": {
"version": "18.0.0",
"extraneous": true,
"license": "MPL-2.0",
"dependencies": {
"tslib": "^2.3.0"
},
"peerDependencies": {
"@angular/common": "^18.2.3",
"@angular/core": "^18.2.3",
"ol": "^8.2.0"
}
},
"dist/ng-openlayers": {
"extraneous": true
},
"node_modules/@angular/common": {
"version": "21.1.0",
"resolved": "https://registry.npmjs.org/@angular/common/-/common-21.1.0.tgz",
"integrity": "sha512-hL3Chp51TU9iBcIfkNtoBS1wuseP1gsyDW2IFtK5HUpAVhbso9B3fdCaDTFkU98A2unluo2YgzI6D/6IS6N+1g==",
"license": "MIT",
"peer": true,
"dependencies": {
"tslib": "^2.3.0"
},
"engines": {
"node": "^20.19.0 || ^22.12.0 || >=24.0.0"
},
"peerDependencies": {
"@angular/core": "21.1.0",
"rxjs": "^6.5.3 || ^7.4.0"
}
},
"node_modules/@angular/core": {
"version": "21.1.0",
"resolved": "https://registry.npmjs.org/@angular/core/-/core-21.1.0.tgz",
"integrity": "sha512-QTl9s8GYNN0pt1k3GE6UVlfe6zWtfdykhfchinKq2YJywQ6LBM4UcZgoc56YkgscmyrRFYrr4JYUJjlzTF57+A==",
"license": "MIT",
"peer": true,
"dependencies": {
"tslib": "^2.3.0"
},
"engines": {
"node": "^20.19.0 || ^22.12.0 || >=24.0.0"
},
"peerDependencies": {
"@angular/compiler": "21.1.0",
"rxjs": "^6.5.3 || ^7.4.0",
"zone.js": "~0.15.0 || ~0.16.0"
},
"peerDependenciesMeta": {
"@angular/compiler": {
"optional": true
},
"zone.js": {
"optional": true
}
}
},
"node_modules/@cesium/engine": {
"version": "11.0.0",
"resolved": "https://registry.npmjs.org/@cesium/engine/-/engine-11.0.0.tgz",
"integrity": "sha512-0z3mJNNly407h3/bAvGoGnjA0ygprkVz32z9x1VNmPXf9AuybKu7Q4wRrChUhC/qsNj3L45kP6KqyDuHSe2bhw==",
"peer": true,
"dependencies": {
"@tweenjs/tween.js": "^25.0.0",
"@zip.js/zip.js": "^2.7.34",
"autolinker": "^4.0.0",
"bitmap-sdf": "^1.0.3",
"dompurify": "^3.0.2",
"draco3d": "^1.5.1",
"earcut": "^3.0.0",
"grapheme-splitter": "^1.0.4",
"jsep": "^1.3.8",
"kdbush": "^4.0.1",
"ktx-parse": "^0.7.0",
"lerc": "^2.0.0",
"mersenne-twister": "^1.1.0",
"meshoptimizer": "^0.21.0",
"pako": "^2.0.4",
"protobufjs": "^7.1.0",
"rbush": "^4.0.0",
"topojson-client": "^3.1.0",
"urijs": "^1.19.7"
},
"engines": {
"node": ">=14.0.0"
}
},
"node_modules/@cesium/widgets": {
"version": "8.0.0",
"resolved": "https://registry.npmjs.org/@cesium/widgets/-/widgets-8.0.0.tgz",
"integrity": "sha512-Rnid5BbLBZjwFdbr3lgOwK3fhql/BeEbf5l9ZZE+Zc7V8Fb6wgKM8QmrL+bbJ+BtuiELp+SkNxcF97Ktifxb4g==",
"peer": true,
"dependencies": {
"@cesium/engine": "^11.0.0",
"nosleep.js": "^0.12.0"
},
"engines": {
"node": ">=14.0.0"
}
},
"node_modules/@petamoriken/float16": {
"version": "3.8.7",
"resolved": "https://registry.npmjs.org/@petamoriken/float16/-/float16-3.8.7.tgz",
"integrity": "sha512-/Ri4xDDpe12NT6Ex/DRgHzLlobiQXEW/hmG08w1wj/YU7hLemk97c+zHQFp0iZQ9r7YqgLEXZR2sls4HxBf9NA==",
"peer": true
},
"node_modules/@protobufjs/aspromise": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz",
"integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==",
"peer": true
},
"node_modules/@protobufjs/base64": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz",
"integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==",
"peer": true
},
"node_modules/@protobufjs/codegen": {
"version": "2.0.4",
"resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz",
"integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==",
"peer": true
},
"node_modules/@protobufjs/eventemitter": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz",
"integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==",
"peer": true
},
"node_modules/@protobufjs/fetch": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz",
"integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==",
"peer": true,
"dependencies": {
"@protobufjs/aspromise": "^1.1.1",
"@protobufjs/inquire": "^1.1.0"
}
},
"node_modules/@protobufjs/float": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz",
"integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==",
"peer": true
},
"node_modules/@protobufjs/inquire": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz",
"integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==",
"peer": true
},
"node_modules/@protobufjs/path": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz",
"integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==",
"peer": true
},
"node_modules/@protobufjs/pool": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz",
"integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==",
"peer": true
},
"node_modules/@protobufjs/utf8": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz",
"integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==",
"peer": true
},
"node_modules/@tweenjs/tween.js": {
"version": "25.0.0",
"resolved": "https://registry.npmjs.org/@tweenjs/tween.js/-/tween.js-25.0.0.tgz",
"integrity": "sha512-XKLA6syeBUaPzx4j3qwMqzzq+V4uo72BnlbOjmuljLrRqdsd3qnzvZZoxvMHZ23ndsRS4aufU6JOZYpCbU6T1A==",
"peer": true
},
"node_modules/@types/node": {
"version": "22.5.4",
"resolved": "https://registry.npmjs.org/@types/node/-/node-22.5.4.tgz",
"integrity": "sha512-FDuKUJQm/ju9fT/SeX/6+gBzoPzlVCzfzmGkwKvRHQVxi4BntVbyIwf6a4Xn62mrvndLiml6z/UBXIdEVjQLXg==",
"peer": true,
"dependencies": {
"undici-types": "~6.19.2"
}
},
"node_modules/@types/rbush": {
"version": "3.0.4",
"resolved": "https://registry.npmjs.org/@types/rbush/-/rbush-3.0.4.tgz",
"integrity": "sha512-knSt9cCW8jj1ZSFcFeBZaX++OucmfPxxHiRwTahZfJlnQsek7O0bazTJHWD2RVj9LEoejUYF2de3/stf+QXcXw==",
"peer": true
},
"node_modules/@zip.js/zip.js": {
"version": "2.7.52",
"resolved": "https://registry.npmjs.org/@zip.js/zip.js/-/zip.js-2.7.52.tgz",
"integrity": "sha512-+5g7FQswvrCHwYKNMd/KFxZSObctLSsQOgqBSi0LzwHo3li9Eh1w5cF5ndjQw9Zbr3ajVnd2+XyiX85gAetx1Q==",
"peer": true,
"engines": {
"bun": ">=0.7.0",
"deno": ">=1.0.0",
"node": ">=16.5.0"
}
},
"node_modules/autolinker": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/autolinker/-/autolinker-4.0.0.tgz",
"integrity": "sha512-fl5Kh6BmEEZx+IWBfEirnRUU5+cOiV0OK7PEt0RBKvJMJ8GaRseIOeDU3FKf4j3CE5HVefcjHmhYPOcaVt0bZw==",
"peer": true,
"dependencies": {
"tslib": "^2.3.0"
}
},
"node_modules/bitmap-sdf": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/bitmap-sdf/-/bitmap-sdf-1.0.4.tgz",
"integrity": "sha512-1G3U4n5JE6RAiALMxu0p1XmeZkTeCwGKykzsLTCqVzfSDaN6S7fKnkIkfejogz+iwqBWc0UYAIKnKHNN7pSfDg==",
"peer": true
},
"node_modules/cesium": {
"version": "1.121.1",
"resolved": "https://registry.npmjs.org/cesium/-/cesium-1.121.1.tgz",
"integrity": "sha512-WpdaGFd8qCOHiE9khV0sWWjCMXAX1U9Aou8MzMC/F0Akp6YqcOk4HLk4LLhZKeOjO/Bh27iTIW2mxEZ5+dtCxg==",
"peer": true,
"dependencies": {
"@cesium/engine": "^11.0.0",
"@cesium/widgets": "^8.0.0"
},
"engines": {
"node": ">=18.18.0"
}
},
"node_modules/color-name": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/color-name/-/color-name-2.0.0.tgz",
"integrity": "sha512-SbtvAMWvASO5TE2QP07jHBMXKafgdZz8Vrsrn96fiL+O92/FN/PLARzUW5sKt013fjAprK2d2iCn2hk2Xb5oow==",
"peer": true,
"engines": {
"node": ">=12.20"
}
},
"node_modules/color-parse": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/color-parse/-/color-parse-2.0.2.tgz",
"integrity": "sha512-eCtOz5w5ttWIUcaKLiktF+DxZO1R9KLNY/xhbV6CkhM7sR3GhVghmt6X6yOnzeaM24po+Z9/S1apbXMwA3Iepw==",
"peer": true,
"dependencies": {
"color-name": "^2.0.0"
}
},
"node_modules/color-rgba": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/color-rgba/-/color-rgba-3.0.0.tgz",
"integrity": "sha512-PPwZYkEY3M2THEHHV6Y95sGUie77S7X8v+h1r6LSAPF3/LL2xJ8duUXSrkic31Nzc4odPwHgUbiX/XuTYzQHQg==",
"peer": true,
"dependencies": {
"color-parse": "^2.0.0",
"color-space": "^2.0.0"
}
},
"node_modules/color-space": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/color-space/-/color-space-2.0.1.tgz",
"integrity": "sha512-nKqUYlo0vZATVOFHY810BSYjmCARrG7e5R3UE3CQlyjJTvv5kSSmPG1kzm/oDyyqjehM+lW1RnEt9It9GNa5JA==",
"peer": true
},
"node_modules/commander": {
"version": "2.20.3",
"resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
"integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
"peer": true
},
"node_modules/dompurify": {
"version": "3.1.6",
"resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.1.6.tgz",
"integrity": "sha512-cTOAhc36AalkjtBpfG6O8JimdTMWNXjiePT2xQH/ppBGi/4uIpmj8eKyIkMJErXWARyINV/sB38yf8JCLF5pbQ==",
"peer": true
},
"node_modules/draco3d": {
"version": "1.5.7",
"resolved": "https://registry.npmjs.org/draco3d/-/draco3d-1.5.7.tgz",
"integrity": "sha512-m6WCKt/erDXcw+70IJXnG7M3awwQPAsZvJGX5zY7beBqpELw6RDGkYVU0W43AFxye4pDZ5i2Lbyc/NNGqwjUVQ==",
"peer": true
},
"node_modules/earcut": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/earcut/-/earcut-3.0.0.tgz",
"integrity": "sha512-41Fs7Q/PLq1SDbqjsgcY7GA42T0jvaCNGXgGtsNdvg+Yv8eIu06bxv4/PoREkZ9nMDNwnUSG9OFB9+yv8eKhDg==",
"peer": true
},
"node_modules/geotiff": {
"version": "2.1.3",
"resolved": "https://registry.npmjs.org/geotiff/-/geotiff-2.1.3.tgz",
"integrity": "sha512-PT6uoF5a1+kbC3tHmZSUsLHBp2QJlHasxxxxPW47QIY1VBKpFB+FcDvX+MxER6UzgLQZ0xDzJ9s48B9JbOCTqA==",
"peer": true,
"dependencies": {
"@petamoriken/float16": "^3.4.7",
"lerc": "^3.0.0",
"pako": "^2.0.4",
"parse-headers": "^2.0.2",
"quick-lru": "^6.1.1",
"web-worker": "^1.2.0",
"xml-utils": "^1.0.2",
"zstddec": "^0.1.0"
},
"engines": {
"node": ">=10.19"
}
},
"node_modules/geotiff/node_modules/lerc": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/lerc/-/lerc-3.0.0.tgz",
"integrity": "sha512-Rm4J/WaHhRa93nCN2mwWDZFoRVF18G1f47C+kvQWyHGEZxFpTUi73p7lMVSAndyxGt6lJ2/CFbOcf9ra5p8aww==",
"peer": true
},
"node_modules/grapheme-splitter": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz",
"integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==",
"peer": true
},
"node_modules/jsep": {
"version": "1.3.9",
"resolved": "https://registry.npmjs.org/jsep/-/jsep-1.3.9.tgz",
"integrity": "sha512-i1rBX5N7VPl0eYb6+mHNp52sEuaS2Wi8CDYx1X5sn9naevL78+265XJqy1qENEk7mRKwS06NHpUqiBwR7qeodw==",
"peer": true,
"engines": {
"node": ">= 10.16.0"
}
},
"node_modules/kdbush": {
"version": "4.0.2",
"resolved": "https://registry.npmjs.org/kdbush/-/kdbush-4.0.2.tgz",
"integrity": "sha512-WbCVYJ27Sz8zi9Q7Q0xHC+05iwkm3Znipc2XTlrnJbsHMYktW4hPhXUE8Ys1engBrvffoSCqbil1JQAa7clRpA==",
"peer": true
},
"node_modules/ktx-parse": {
"version": "0.7.1",
"resolved": "https://registry.npmjs.org/ktx-parse/-/ktx-parse-0.7.1.tgz",
"integrity": "sha512-FeA3g56ksdFNwjXJJsc1CCc7co+AJYDp6ipIp878zZ2bU8kWROatLYf39TQEd4/XRSUvBXovQ8gaVKWPXsCLEQ==",
"peer": true
},
"node_modules/lerc": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/lerc/-/lerc-2.0.0.tgz",
"integrity": "sha512-7qo1Mq8ZNmaR4USHHm615nEW2lPeeWJ3bTyoqFbd35DLx0LUH7C6ptt5FDCTAlbIzs3+WKrk5SkJvw8AFDE2hg==",
"peer": true
},
"node_modules/long": {
"version": "5.2.3",
"resolved": "https://registry.npmjs.org/long/-/long-5.2.3.tgz",
"integrity": "sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==",
"peer": true
},
"node_modules/mersenne-twister": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/mersenne-twister/-/mersenne-twister-1.1.0.tgz",
"integrity": "sha512-mUYWsMKNrm4lfygPkL3OfGzOPTR2DBlTkBNHM//F6hGp8cLThY897crAlk3/Jo17LEOOjQUrNAx6DvgO77QJkA==",
"peer": true
},
"node_modules/meshoptimizer": {
"version": "0.21.0",
"resolved": "https://registry.npmjs.org/meshoptimizer/-/meshoptimizer-0.21.0.tgz",
"integrity": "sha512-WabtlpnK/GgD0GMwYd1fBTfYHf4MIcQPEg6dt7y4GuDcY51RzLSkSNE8ZogD7U3Vs2/fIf4z89TOLpA80EOnhg==",
"peer": true
},
"node_modules/nosleep.js": {
"version": "0.12.0",
"resolved": "https://registry.npmjs.org/nosleep.js/-/nosleep.js-0.12.0.tgz",
"integrity": "sha512-9d1HbpKLh3sdWlhXMhU6MMH+wQzKkrgfRkYV0EBdvt99YJfj0ilCJrWRDYG2130Tm4GXbEoTCx5b34JSaP+HhA==",
"peer": true
},
"node_modules/ol": {
"version": "10.1.0",
"resolved": "https://registry.npmjs.org/ol/-/ol-10.1.0.tgz",
"integrity": "sha512-/efepydpzhFoeczA9KAN5t7G0WpFhP46ZXEfSl6JbZ7ipQZ2axpkYB2qt0qcOUlPFYMt7/XQFApH652KB08tTg==",
"peer": true,
"dependencies": {
"@types/rbush": "^3.0.3",
"color-rgba": "^3.0.0",
"color-space": "^2.0.1",
"earcut": "^3.0.0",
"geotiff": "^2.0.7",
"pbf": "4.0.1",
"rbush": "^4.0.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/openlayers"
}
},
"node_modules/ol-cesium": {
"version": "2.17.0",
"resolved": "https://registry.npmjs.org/ol-cesium/-/ol-cesium-2.17.0.tgz",
"integrity": "sha512-XaMXjQYuq2eMPAgAx2e1wjN4I4QwfmPC+9YgU4xoMCj/MBj8oDQusyloQ4TaovypqbZg+0jJDDSZc7BhXckBwA==",
"peer": true,
"peerDependencies": {
"cesium": ">= 1.62.0",
"ol": ">= 6.0.1 || 7 || 8"
}
},
"node_modules/pako": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/pako/-/pako-2.1.0.tgz",
"integrity": "sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug==",
"peer": true
},
"node_modules/parse-headers": {
"version": "2.0.5",
"resolved": "https://registry.npmjs.org/parse-headers/-/parse-headers-2.0.5.tgz",
"integrity": "sha512-ft3iAoLOB/MlwbNXgzy43SWGP6sQki2jQvAyBg/zDFAgr9bfNWZIUj42Kw2eJIl8kEi4PbgE6U1Zau/HwI75HA==",
"peer": true
},
"node_modules/pbf": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/pbf/-/pbf-4.0.1.tgz",
"integrity": "sha512-SuLdBvS42z33m8ejRbInMapQe8n0D3vN/Xd5fmWM3tufNgRQFBpaW2YVJxQZV4iPNqb0vEFvssMEo5w9c6BTIA==",
"peer": true,
"dependencies": {
"resolve-protobuf-schema": "^2.1.0"
},
"bin": {
"pbf": "bin/pbf"
}
},
"node_modules/protobufjs": {
"version": "7.4.0",
"resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.4.0.tgz",
"integrity": "sha512-mRUWCc3KUU4w1jU8sGxICXH/gNS94DvI1gxqDvBzhj1JpcsimQkYiOJfwsPUykUI5ZaspFbSgmBLER8IrQ3tqw==",
"hasInstallScript": true,
"peer": true,
"dependencies": {
"@protobufjs/aspromise": "^1.1.2",
"@protobufjs/base64": "^1.1.2",
"@protobufjs/codegen": "^2.0.4",
"@protobufjs/eventemitter": "^1.1.0",
"@protobufjs/fetch": "^1.1.0",
"@protobufjs/float": "^1.0.2",
"@protobufjs/inquire": "^1.1.0",
"@protobufjs/path": "^1.1.2",
"@protobufjs/pool": "^1.1.0",
"@protobufjs/utf8": "^1.1.0",
"@types/node": ">=13.7.0",
"long": "^5.0.0"
},
"engines": {
"node": ">=12.0.0"
}
},
"node_modules/protocol-buffers-schema": {
"version": "3.6.0",
"resolved": "https://registry.npmjs.org/protocol-buffers-schema/-/protocol-buffers-schema-3.6.0.tgz",
"integrity": "sha512-TdDRD+/QNdrCGCE7v8340QyuXd4kIWIgapsE2+n/SaGiSSbomYl4TjHlvIoCWRpE7wFt02EpB35VVA2ImcBVqw==",
"peer": true
},
"node_modules/quick-lru": {
"version": "6.1.2",
"resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-6.1.2.tgz",
"integrity": "sha512-AAFUA5O1d83pIHEhJwWCq/RQcRukCkn/NSm2QsTEMle5f2hP0ChI2+3Xb051PZCkLryI/Ir1MVKviT2FIloaTQ==",
"peer": true,
"engines": {
"node": ">=12"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/quickselect": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/quickselect/-/quickselect-3.0.0.tgz",
"integrity": "sha512-XdjUArbK4Bm5fLLvlm5KpTFOiOThgfWWI4axAZDWg4E/0mKdZyI9tNEfds27qCi1ze/vwTR16kvmmGhRra3c2g==",
"peer": true
},
"node_modules/rbush": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/rbush/-/rbush-4.0.1.tgz",
"integrity": "sha512-IP0UpfeWQujYC8Jg162rMNc01Rf0gWMMAb2Uxus/Q0qOFw4lCcq6ZnQEZwUoJqWyUGJ9th7JjwI4yIWo+uvoAQ==",
"peer": true,
"dependencies": {
"quickselect": "^3.0.0"
}
},
"node_modules/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==",
"peer": true,
"dependencies": {
"protocol-buffers-schema": "^3.3.1"
}
},
"node_modules/rxjs": {
"version": "7.8.2",
"resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz",
"integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==",
"license": "Apache-2.0",
"peer": true,
"dependencies": {
"tslib": "^2.1.0"
}
},
"node_modules/topojson-client": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/topojson-client/-/topojson-client-3.1.0.tgz",
"integrity": "sha512-605uxS6bcYxGXw9qi62XyrV6Q3xwbndjachmNxu8HWTtVPxZfEJN9fd/SZS1Q54Sn2y0TMyMxFj/cJINqGHrKw==",
"peer": true,
"dependencies": {
"commander": "2"
},
"bin": {
"topo2geo": "bin/topo2geo",
"topomerge": "bin/topomerge",
"topoquantize": "bin/topoquantize"
}
},
"node_modules/tslib": { "node_modules/tslib": {
"version": "2.5.0", "version": "2.5.0",
"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz",
"integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==" "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg=="
},
"node_modules/undici-types": {
"version": "6.19.8",
"resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz",
"integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==",
"peer": true
},
"node_modules/urijs": {
"version": "1.19.11",
"resolved": "https://registry.npmjs.org/urijs/-/urijs-1.19.11.tgz",
"integrity": "sha512-HXgFDgDommxn5/bIv0cnQZsPhHDA90NPHD6+c/v21U5+Sx5hoP8+dP9IZXBU1gIfvdRfhG8cel9QNPeionfcCQ==",
"peer": true
},
"node_modules/web-worker": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/web-worker/-/web-worker-1.3.0.tgz",
"integrity": "sha512-BSR9wyRsy/KOValMgd5kMyr3JzpdeoR9KVId8u5GVlTTAtNChlsE4yTxeY7zMdNSyOmoKBv8NH2qeRY9Tg+IaA==",
"peer": true
},
"node_modules/xml-utils": {
"version": "1.10.1",
"resolved": "https://registry.npmjs.org/xml-utils/-/xml-utils-1.10.1.tgz",
"integrity": "sha512-Dn6vJ1Z9v1tepSjvnCpwk5QqwIPcEFKdgnjqfYOABv1ngSofuAhtlugcUC3ehS1OHdgDWSG6C5mvj+Qm15udTQ==",
"peer": true
},
"node_modules/zstddec": {
"version": "0.1.0",
"resolved": "https://registry.npmjs.org/zstddec/-/zstddec-0.1.0.tgz",
"integrity": "sha512-w2NTI8+3l3eeltKAdK8QpiLo/flRAr2p8AGeakfMZOXBxOg9HIu4LVDxBi81sYgVhFhdJjv1OrB5ssI8uFPoLg==",
"peer": true
} }
} }
} }

View File

@@ -4,13 +4,14 @@
"publishConfig": { "publishConfig": {
"registry": "https://repository.akkerweb.nl/repository/npm-hosted/" "registry": "https://repository.akkerweb.nl/repository/npm-hosted/"
}, },
"peerDependencies": {
"@angular/common": "^17.3.3",
"@angular/core": "^17.3.3",
"ng-openlayers": "17.1.3",
"cesium": ">=1.82.1",
"ol-cesium": ">=2.13.0"
},
"dependencies": { "dependencies": {
"tslib": "^2.0.0" "tslib": "^2.0.0"
},
"peerDependencies": {
"@angular/common": "21.1.0",
"@angular/core": "21.1.0",
"cesium": "^1.97.0",
"ol-cesium": ">=2.13.0"
} }
} }

View File

@@ -1,15 +1,14 @@
import { NgModule } from '@angular/core'; import { NgModule } from '@angular/core';
import { Switch2D3DComponent } from './components/olcs/switch2d3d/switch2d3d.component';
import { AppCommonModule} from '@farmmaps/common'; import { AppCommonModule} from '@farmmaps/common';
import { AppCommonMapModule} from '@farmmaps/common-map'; import { AppCommonMapModule} from '@farmmaps/common-map';
import { AngularOpenlayersModule } from '@farmmaps/ng-openlayers';
import { Switch2D3DComponent } from './components/olcs/switch2d3d/switch2d3d.component';
@NgModule({ @NgModule({
declarations: [Switch2D3DComponent], declarations: [Switch2D3DComponent],
imports: [ imports: [
AppCommonModule, AppCommonModule,
AppCommonMapModule, AppCommonMapModule
AngularOpenlayersModule,
], ],
exports: [Switch2D3DComponent] exports: [Switch2D3DComponent]
}) })

View File

@@ -1,6 +1,6 @@
import { Component, OnInit,Input,Host } from '@angular/core'; import { Component, OnInit,Input,Host } from '@angular/core';
import { Interaction} from 'ol/interaction'; import { Interaction} from 'ol/interaction';
import { MapComponent } from '@farmmaps/ng-openlayers'; import { MapComponent } from 'ng-openlayers';
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';
@@ -10,8 +10,7 @@ import { Store } from '@ngrx/store';
@Component({ @Component({
selector: 'fm-map3d-switch2d3d', selector: 'fm-map3d-switch2d3d',
templateUrl: './switch2d3d.component.html', templateUrl: './switch2d3d.component.html',
styleUrls: ['./switch2d3d.component.scss'], styleUrls: ['./switch2d3d.component.scss']
standalone: false
}) })
export class Switch2D3DComponent { export class Switch2D3DComponent {
@@ -50,11 +49,7 @@ export class Switch2D3DComponent {
this.interactions=[]; this.interactions=[];
this.map.instance.getInteractions().forEach((i) => { this.map.instance.getInteractions().forEach((i) => {
if(i.getActive()) { if(i.getActive()) {
// AW-6241 TODO How to fix? this.interactions.push(i);
// error TS2345: Argument of type 'import("C:/Project/Farmmaps/FarmMapsLib/node_modules/ol/interaction/Interaction").default'
// is not assignable to parameter of type 'import("C:/Project/Farmmaps/FarmMapsLib/projects/common-map3d/node_modules/ol/interaction/Interaction").default'.
// Line below commented out
// this.interactions.push(i);
i.setActive(false); i.setActive(false);
} }
}); });

View File

@@ -4,7 +4,7 @@
"outDir": "../../out-tsc/lib", "outDir": "../../out-tsc/lib",
"target": "es2015", "target": "es2015",
"module": "es2015", "module": "es2015",
"moduleResolution": "bundler", "moduleResolution": "node",
"declaration": true, "declaration": true,
"sourceMap": true, "sourceMap": true,
"inlineSources": true, "inlineSources": true,
@@ -13,9 +13,15 @@
"importHelpers": true, "importHelpers": true,
"esModuleInterop": true, "esModuleInterop": true,
"types": [], "types": [],
"lib": [
"dom",
"es2018"
],
"paths": { "paths": {
"@angular/*": [ "@angular/*": [
"node_modules/@angular/*" "node_modules/@angular/*"
] ]
} }
}, },

View File

@@ -4,7 +4,7 @@
"outDir": "../../out-tsc/lib", "outDir": "../../out-tsc/lib",
"target": "es2015", "target": "es2015",
"module": "es2015", "module": "es2015",
"moduleResolution": "bundler", "moduleResolution": "node",
"declaration": true, "declaration": true,
"sourceMap": true, "sourceMap": true,
"inlineSources": true, "inlineSources": true,
@@ -13,9 +13,15 @@
"importHelpers": true, "importHelpers": true,
"esModuleInterop": true, "esModuleInterop": true,
"types": [], "types": [],
"lib": [
"dom",
"es2018"
],
"paths": { "paths": {
"@angular/*": [ "@angular/*": [
"node_modules/@angular/*" "node_modules/@angular/*"
] ]
} }
}, },

File diff suppressed because it is too large Load Diff

View File

@@ -1,42 +1,25 @@
{ {
"name": "@farmmaps/common", "name": "@farmmaps/common",
"version": "21.1.0", "version": "2.0.0",
"publishConfig": { "publishConfig": {
"registry": "https://repository.akkerweb.nl/repository/npm-hosted/" "registry": "https://repository.akkerweb.nl/repository/npm-hosted/"
}, },
"peerDependencies": { "peerDependencies": {
"@ng-bootstrap/ng-bootstrap": "^20.0.0", "@ng-bootstrap/ng-bootstrap": "^16.0.0",
"@angular/common": "21.1.0", "@angular/common": "^17.3.3",
"@angular/core": "21.1.0", "@angular/core": "^17.3.3",
"@angular/forms": "21.1.0", "@angular/forms": "^17.3.3",
"@ngrx/effects": "21.0.1", "@ngrx/effects": "^17",
"@ngrx/router-store": "21.0.1", "@ngrx/router-store": "^17",
"@ngrx/store": "21.0.1", "@ngrx/store": "^17",
"tassign": "^1.0.0", "tassign": "^1.0.0",
"bootstrap": "^5.3.3", "bootstrap": "^5.2.0",
"@microsoft/signalr": "10.0.0", "@microsoft/signalr": "^3.1.16",
"ngx-uploadx": "7.0.1", "ngx-uploadx": "^6.2.0",
"angular-oauth2-oidc": "20.0.2", "angular-oauth2-oidc": "^13",
"moment": "^2.29.4", "moment": "^2.29.4",
"ngx-avatars": "1.10.1", "ngx-avatars": "1.7.0",
"ngx-image-cropper": "9.1.6", "ngx-image-cropper": "^7.2.1",
"ngx-clipboard": "^16.0.0" "ngx-clipboard": "16.0.0"
},
"overrides": {
"ngx-avatars": {
"@angular/common": "$@angular/common",
"@angular/core": "$@angular/core"
},
"ngx-clipboard": {
"@angular/core": "$@angular/core"
},
"ngx-image-cropper": {
"@angular/common": "$@angular/common",
"@angular/core": "$@angular/core"
}
,
"ngx-uploadx": {
"@angular/core": "$@angular/core"
}
} }
} }

View File

@@ -71,8 +71,6 @@ export const TOGGLENOTIFICATIONMENU = '[AppCommon] ToggleNotificationMenu';
export const TOGGLEHELPMENU = '[AppCommon] ToggleHelpMenu'; export const TOGGLEHELPMENU = '[AppCommon] ToggleHelpMenu';
export const TOGGLESETTINGMENU = '[AppCommon] ToggleSettingMenu';
export const SETMENUVISIBLE = '[AppCommon] SetMenuVisible'; export const SETMENUVISIBLE = '[AppCommon] SetMenuVisible';
export const ONLINE = '[AppCommon] Online'; export const ONLINE = '[AppCommon] Online';
@@ -83,11 +81,6 @@ export const SETPAGEMODE = '[AppCommon] SetPageMode';
export const SETUNREADNOTIFICATIONS = '[AppCommon] SetUnreadNotifications'; export const SETUNREADNOTIFICATIONS = '[AppCommon] SetUnreadNotifications';
export const SWITCHLANGUAGE = '[AppCommon] SwitchLanguage';
export const SETSETTINGMENUBACKGROUNDCOLOR = '[AppCommon] SetSettingMenuBackgroundColor';
export class InitUser implements Action { export class InitUser implements Action {
readonly type = INITUSER; readonly type = INITUSER;
@@ -339,12 +332,6 @@ export class ToggleHelpMenu implements Action {
constructor() { } constructor() { }
} }
export class ToggleSettingMenu implements Action {
readonly type = TOGGLESETTINGMENU;
constructor() { }
}
export class SetMenuVisible implements Action { export class SetMenuVisible implements Action {
readonly type = SETMENUVISIBLE; readonly type = SETMENUVISIBLE;
@@ -376,17 +363,6 @@ export class SetUnreadNotifications implements Action {
} }
export class SwitchLanguage implements Action {
readonly type = SWITCHLANGUAGE;
constructor(public locale:string) { }
}
export class SetSettingMenuBackgroundColor implements Action {
readonly type = SETSETTINGMENUBACKGROUNDCOLOR;
constructor(public color:string) { }
}
export type Actions = OpenModal export type Actions = OpenModal
| InitRoot | InitRoot
@@ -432,10 +408,7 @@ export type Actions = OpenModal
| ToggleAppMenu | ToggleAppMenu
| ToggleNotificationMenu | ToggleNotificationMenu
| ToggleHelpMenu | ToggleHelpMenu
| ToggleSettingMenu
| NotificationEvent | NotificationEvent
| SetUnreadNotifications | SetUnreadNotifications;
| SwitchLanguage
| SetSettingMenuBackgroundColor;

View File

@@ -1,5 +1,5 @@
// angular modules // angular modules
import { NgModule, ModuleWithProviders, Injector, Optional, SkipSelf, inject, provideAppInitializer } from '@angular/core'; import { NgModule, APP_INITIALIZER, ModuleWithProviders, Injector, Optional, SkipSelf } from '@angular/core';
import { DatePipe } from '@angular/common'; import { DatePipe } from '@angular/common';
import { HTTP_INTERCEPTORS } from '@angular/common/http'; import { HTTP_INTERCEPTORS } from '@angular/common/http';
@@ -13,7 +13,6 @@ import { SchemaService } from './services/schema.service';
import { FolderService } from './services/folder.service'; import { FolderService } from './services/folder.service';
import { TimespanService } from './services/timespan.service'; import { TimespanService } from './services/timespan.service';
import { ItemService } from './services/item.service'; import { ItemService } from './services/item.service';
import { TaskService } from './services/task.service';
import { AdminService } from './services/admin.service'; import { AdminService } from './services/admin.service';
import { EventService } from './services/event.service'; import { EventService } from './services/event.service';
import { TypeaheadService } from './services/typeahead.service'; import { TypeaheadService } from './services/typeahead.service';
@@ -45,7 +44,6 @@ export {
ItemTypeService, ItemTypeService,
TimespanService, TimespanService,
ItemService, ItemService,
TaskService,
AdminService, AdminService,
EventService, EventService,
TypeaheadService, TypeaheadService,
@@ -90,10 +88,12 @@ export class AppCommonServiceModule {
providers: [ providers: [
AppConfig, AppConfig,
ItemTypeService, ItemTypeService,
provideAppInitializer(() => { {
const initializerFn = (appConfigFactory)(inject(Injector), inject(AppConfig), inject(OAuthService), inject(AuthConfigFactory), inject(OAuthStorage), inject(ItemTypeService)); provide: APP_INITIALIZER,
return initializerFn(); useFactory: appConfigFactory,
}), deps: [Injector, AppConfig, OAuthService, AuthConfigFactory, OAuthStorage, ItemTypeService],
multi: true
},
{ {
provide: HTTP_INTERCEPTORS, provide: HTTP_INTERCEPTORS,
useClass: AccessTokenInterceptor, useClass: AccessTokenInterceptor,

View File

@@ -1,16 +1,16 @@
// angular modules // angular modules
import { CommonModule } from '@angular/common'; import { NgModule, APP_INITIALIZER, ModuleWithProviders, Injector, Optional, SkipSelf,InjectionToken } from '@angular/core';
import { provideHttpClient, withInterceptorsFromDi } from '@angular/common/http'; import { CommonModule, DatePipe } from '@angular/common';
import { InjectionToken, NgModule } from '@angular/core'; import { HttpClientModule, HttpClient, HTTP_INTERCEPTORS } from '@angular/common/http';
import { FormsModule } from '@angular/forms'; import { FormsModule } from '@angular/forms';
// external modules // external modules
import { NgbModule } from '@ng-bootstrap/ng-bootstrap'; import { OAuthModule, AuthConfig, OAuthService, OAuthStorage } from 'angular-oauth2-oidc';
import { StoreModule, Store } from '@ngrx/store';
import { EffectsModule } from '@ngrx/effects'; import { EffectsModule } from '@ngrx/effects';
import { StoreModule } from '@ngrx/store'; import { NgbModule } from '@ng-bootstrap/ng-bootstrap';
import { OAuthModule } from 'angular-oauth2-oidc';
import { ClipboardModule } from 'ngx-clipboard';
import { UploadxModule } from 'ngx-uploadx'; import { UploadxModule } from 'ngx-uploadx';
import { ClipboardModule } from 'ngx-clipboard';
// routing module // routing module
@@ -19,71 +19,129 @@ import { AppCommonRoutingModule } from './common-routing.module';
import { MODULE_NAME } from './module-name'; import { MODULE_NAME } from './module-name';
//components //components
import { AvatarModule } from 'ngx-avatars'; import { SafePipe } from './shared/safe.pipe';
import { ImageCropperComponent } from 'ngx-image-cropper'; import { AuthConfigFactory, IAuthconfigFactory } from './shared/authconfigFactory';
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 { AppComponent } from './components/app/app.component';
import { AuthCallbackComponent } from './components/auth-callback/auth-callback.component'; import { AuthCallbackComponent } from './components/auth-callback/auth-callback.component';
import { AvatarComponent } from './components/avatar/avatar.component'; import { SessionClearedComponent } from './components/session-cleared/session-cleared.component';
import { BackButtonComponent } from './components/back-button/back-button.component'; import { ResumableFileUploadComponent } from './components/resumable-file-upload/resumable-file-upload.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 { NotFoundComponent } from './components/not-found/not-found.component';
import { NotImplementedComponent } from './components/not-implemented/not-implemented.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 { SettingMenuComponent } from './components/setting-menu/setting-menu.component';
import { SidePanelComponent } from './components/side-panel/side-panel.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 { 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 { UserMenuComponent} from './components/user-menu/user-menu.component';
import * as commonEffects from './effects/app-common.effects'; import { ThumbnailComponent } from './components/thumbnail/thumbnail.component';
import { Alert } from './enumerations/alert.enum'; import { Alert } from './enumerations/alert.enum';
import { IDataLayer } from './models/data.layer';
import { IEventMessage } from './models/event.message'; import { IEventMessage } from './models/event.message';
import { IColor, IGradientstop } from './models/gradient';
import { IItem, Item } from './models/item'; import { IItem, Item } from './models/item';
import { IItemType } from './models/item.type';
import { IItemTypes } from './models/item.types';
import { IItemLinkType } from './models/itemlink.type';
import { IItemTask, ItemTask } from './models/itemTask';
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 { 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 commonReducers from './reducers/app-common.reducer';
import { AuthConfigFactory, IAuthconfigFactory } from './shared/authconfigFactory'; import * as commonEffects from './effects/app-common.effects';
import { SafePipe } from './shared/safe.pipe';
import { SecureOAuthStorage} from './shared/secureOAuthStorage'; 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 { ImageCropperModule } from 'ngx-image-cropper';
export const FM_COMMON_STARTPAGE = new InjectionToken<string>('fm-common-startpage'); export const FM_COMMON_STARTPAGE = new InjectionToken<string>('fm-common-startpage');
export { export {
Alert, AppComponent, AuthCallbackComponent, AuthConfigFactory, AvatarComponent, BackButtonComponent, commonActions, SafePipe,
commonReducers, 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, HasClaimDirective, HasPackageDirective, HasRoleDirective, IAuthconfigFactory, IColor, IDataLayer, IEventMessage, IGradientstop, IItem, IItemLinkType, IItemTask, IItemType, IItemTypes, IJsonline, IListItem, IPackage, GradientSelectComponent
IPackages, IQueryState, ISenMLItem, Item, ItemLinkComponent, ItemTask, ITypeaheadItem, IUrlType, IUser, MenuBackgroundComponent, NotFoundComponent,
NotImplementedComponent, PackageExistsDirective, ResumableFileUploadComponent, SafePipe, SecureOAuthStorage, SessionClearedComponent, SidePanelComponent, TagInputComponent, ThumbnailComponent, TimespanComponent, UserMenuComponent, WeatherCurrentObservation
}; };
@NgModule({ declarations: [ @NgModule({
imports: [
CommonModule,
HttpClientModule,
AppCommonRoutingModule,
StoreModule.forFeature(MODULE_NAME, commonReducers.reducer),
EffectsModule.forFeature([commonEffects.AppCommonEffects]),
OAuthModule.forRoot(),
NgbModule,
FormsModule,
UploadxModule,
ClipboardModule,
AvatarModule,
ImageCropperModule
],
declarations: [
AppComponent, AppComponent,
AuthCallbackComponent, AuthCallbackComponent,
SidePanelComponent, SidePanelComponent,
@@ -105,7 +163,6 @@ export {
AppMenuComponent, AppMenuComponent,
NotificationMenuComponent, NotificationMenuComponent,
HelpMenuComponent, HelpMenuComponent,
SettingMenuComponent,
BackButtonComponent, BackButtonComponent,
ThumbnailComponent, ThumbnailComponent,
EditImageModalComponent, EditImageModalComponent,
@@ -141,16 +198,7 @@ export {
AvatarComponent, AvatarComponent,
ItemLinkComponent, ItemLinkComponent,
EditImageModalComponent EditImageModalComponent
], imports: [CommonModule, ]
AppCommonRoutingModule, })
StoreModule.forFeature(MODULE_NAME, commonReducers.reducer),
EffectsModule.forFeature([commonEffects.AppCommonEffects]),
OAuthModule.forRoot(),
NgbModule,
FormsModule,
UploadxModule,
ClipboardModule,
AvatarModule,
ImageCropperComponent], providers: [provideHttpClient(withInterceptorsFromDi())] })
export class AppCommonModule { export class AppCommonModule {
} }

View File

@@ -1,14 +1,14 @@
import { Component, Input, OnInit } from '@angular/core'; import { Component, OnInit, Input } from '@angular/core';
import { Store } from '@ngrx/store';
import * as appActions from '../../actions/app-common.actions';
import { IUser } from '../../models/user'; import { IUser } from '../../models/user';
import {Store} from '@ngrx/store';
import * as appReducers from '../../reducers/app-common.reducer'; import * as appReducers from '../../reducers/app-common.reducer';
import * as appActions from '../../actions/app-common.actions';
@Component({ @Component({
selector: 'fm-app-menu', selector: 'fm-app-menu',
templateUrl: './app-menu.component.html', templateUrl: './app-menu.component.html',
styleUrls: ['./app-menu.component.scss'], styleUrls: ['./app-menu.component.scss']
standalone: false
}) })
export class AppMenuComponent implements OnInit { export class AppMenuComponent implements OnInit {
@@ -33,4 +33,5 @@ export class AppMenuComponent implements OnInit {
deActivateRoute() { deActivateRoute() {
this.noContent=true; this.noContent=true;
} }
} }

View File

@@ -6,12 +6,8 @@
<router-outlet name="menu" class="ms-4"></router-outlet> <router-outlet name="menu" class="ms-4"></router-outlet>
<div class="collapse navbar-collapse pageonly"> <div class="collapse navbar-collapse pageonly">
<a class="btn btn-primary ms-auto" role="button" [routerLink]="[ startPage == null?'/map':startPage]"> <a class="btn btn-primary ms-auto" role="button" [routerLink]="[ startPage == null?'/map':startPage]">
@if ((user|async)==null) { <span *ngIf="(user|async)==null" i18n>Sign in</span>
<span i18n>Sign in</span> <span *ngIf="(user|async)!=null" i18n>To app</span>
}
@if ((user|async)!=null) {
<span i18n>To app</span>
}
</a> </a>
</div> </div>
</div> </div>
@@ -33,11 +29,10 @@
</div> </div>
</div> </div>
</fm-side-panel> </fm-side-panel>
@if (showUploadProgress) { <ng-container *ngIf="showUploadProgress">
<fm-resumable-file-upload></fm-resumable-file-upload> <fm-resumable-file-upload></fm-resumable-file-upload>
} </ng-container>
<div class="user-menu apponly"> <div class="user-menu apponly">
<fm-setting-menu [user]="user|async" [showMenu]="settingMenuVisible|async" [backgroundColor]="settingMenuBackgroundColor|async"></fm-setting-menu>
<fm-help-menu [user]="user|async" [showMenu]="helpMenuVisible|async"></fm-help-menu> <fm-help-menu [user]="user|async" [showMenu]="helpMenuVisible|async"></fm-help-menu>
<fm-notification-menu [user]="user|async" [unread]="unreadNotifications|async" [showMenu]="notificationMenuVisible|async"></fm-notification-menu> <fm-notification-menu [user]="user|async" [unread]="unreadNotifications|async" [showMenu]="notificationMenuVisible|async"></fm-notification-menu>
<fm-app-menu [user]="user|async" [showMenu]="appMenuVisible|async"></fm-app-menu> <fm-app-menu [user]="user|async" [showMenu]="appMenuVisible|async"></fm-app-menu>

View File

@@ -119,7 +119,7 @@ body { background: #f1f1f1; line-height: 18px; user-select:none;font-family: Lat
max-height:0em; max-height:0em;
} }
fm-help-menu,fm-app-menu,fm-user-menu,fm-notification-menu,fm-setting-menu { fm-help-menu,fm-app-menu,fm-user-menu,fm-notification-menu {
display: inline-block; display: inline-block;
margin-left: 1rem; margin-left: 1rem;
} }

View File

@@ -1,6 +1,6 @@
import { Component, OnInit, OnDestroy, Inject, Optional, ViewEncapsulation, RendererFactory2, PLATFORM_ID, ChangeDetectionStrategy, HostListener, Input, DOCUMENT } from '@angular/core'; import { Component, OnInit, OnDestroy, Inject, Optional, ViewEncapsulation, RendererFactory2, PLATFORM_ID, ChangeDetectionStrategy, HostListener, Input } from '@angular/core';
import { Router, NavigationStart, NavigationEnd, RouteConfigLoadStart, RouteConfigLoadEnd, ActivatedRoute, PRIMARY_OUTLET } from '@angular/router'; import { Router, NavigationStart, NavigationEnd, RouteConfigLoadStart, RouteConfigLoadEnd, ActivatedRoute, PRIMARY_OUTLET } from '@angular/router';
import { Meta, Title, MetaDefinition } from '@angular/platform-browser'; import { Meta, Title, MetaDefinition } from '@angular/platform-browser'; import { DOCUMENT } from "@angular/common";
import { Subscription, Observable } from 'rxjs'; import { Subscription, Observable } from 'rxjs';
import { distinctUntilChanged } from 'rxjs/operators'; import { distinctUntilChanged } from 'rxjs/operators';
import { Store, Action } from '@ngrx/store'; import { Store, Action } from '@ngrx/store';
@@ -24,8 +24,7 @@ import * as appReducers from '../../reducers/app-common.reducer';
templateUrl: './app.component.html', templateUrl: './app.component.html',
styleUrls: ['./app.component.scss'], styleUrls: ['./app.component.scss'],
encapsulation: ViewEncapsulation.None, encapsulation: ViewEncapsulation.None,
changeDetection: ChangeDetectionStrategy.OnPush, changeDetection: ChangeDetectionStrategy.OnPush
standalone: false
}) })
export class AppComponent implements OnInit, OnDestroy { export class AppComponent implements OnInit, OnDestroy {
@@ -46,12 +45,10 @@ export class AppComponent implements OnInit, OnDestroy {
public accountMenuVisible: Observable<boolean> = this.store$.select(appReducers.SelectGetAccountMenuVisible); public accountMenuVisible: Observable<boolean> = this.store$.select(appReducers.SelectGetAccountMenuVisible);
public appMenuVisible: Observable<boolean> = this.store$.select(appReducers.SelectGetAppMenuVisible); public appMenuVisible: Observable<boolean> = this.store$.select(appReducers.SelectGetAppMenuVisible);
public notificationMenuVisible: Observable<boolean> = this.store$.select(appReducers.SelectGetNotificationMenuVisible); public notificationMenuVisible: Observable<boolean> = this.store$.select(appReducers.SelectGetNotificationMenuVisible);
public settingMenuVisible: Observable<boolean> = this.store$.select(appReducers.SelectGetSettingMenuVisible);
public helpMenuVisible: Observable<boolean> = this.store$.select(appReducers.SelectGetHelpMenuVisible); public helpMenuVisible: Observable<boolean> = this.store$.select(appReducers.SelectGetHelpMenuVisible);
public unreadNotifications: Observable<number> = this.store$.select(appReducers.SelectgetUnreadNotifications); public unreadNotifications: Observable<number> = this.store$.select(appReducers.SelectgetUnreadNotifications);
public user: Observable<IUser> = this.store$.select(appReducers.SelectGetUser); public user: Observable<IUser> = this.store$.select(appReducers.SelectGetUser);
public isPageMode: Observable<boolean> = this.store$.select(appReducers.SelectGetIsPageMode); public isPageMode: Observable<boolean> = this.store$.select(appReducers.SelectGetIsPageMode);
public settingMenuBackgroundColor: Observable<string> = this.store$.select(appReducers.SelectGetSettingMenuBackgroundColor);
@Input() showUploadProgress = true; @Input() showUploadProgress = true;
constructor( constructor(

View File

@@ -5,8 +5,7 @@ import { Location} from '@angular/common';
@Component({ @Component({
selector: 'fm-auth-callback', selector: 'fm-auth-callback',
template: '<div></div>', template:'<div></div>'
standalone: false
}) })
export class AuthCallbackComponent { export class AuthCallbackComponent {

View File

@@ -5,8 +5,7 @@ import { AppConfig } from '../../shared/app.config';
@Component({ @Component({
selector: 'fm-avatar', selector: 'fm-avatar',
templateUrl: './avatar.component.html', templateUrl: './avatar.component.html',
styleUrls: ['./avatar.component.css'], styleUrls: ['./avatar.component.css']
standalone: false
}) })
export class AvatarComponent implements OnInit { export class AvatarComponent implements OnInit {

View File

@@ -1,5 +1,4 @@
@if (show()) { <div *ngIf="show()" class="back-button mb-2">
<div class="back-button mb-2">
<i class="fal fa-arrow-left"></i>&nbsp;<span i18n="@FmBackButton">Back</span> <i class="fal fa-arrow-left"></i>&nbsp;<span i18n="@FmBackButton">Back</span>
</div> </div>
}

View File

@@ -1,26 +1,23 @@
import {Component, HostListener} from '@angular/core';
import {Location} from "@angular/common"; import {Location} from "@angular/common";
import { Component, EventEmitter, HostListener, Output } from '@angular/core';
import { DeviceService} from '../../services/device.service'; import { DeviceService} from '../../services/device.service';
@Component({ @Component({
selector: 'fm-back-button', selector: 'fm-back-button',
templateUrl: './back-button.component.html', templateUrl: './back-button.component.html',
styleUrls: ['./back-button.component.scss'], styleUrls: ['./back-button.component.scss']
standalone: false
}) })
export class BackButtonComponent { export class BackButtonComponent {
@Output() beforeLocationBack = new EventEmitter();
@HostListener('click') @HostListener('click')
onBackClicked() { onBackClicked() {
this.beforeLocationBack.emit();
this.location.back(); this.location.back();
} }
constructor(private location: Location,private deviceService:DeviceService) { constructor(private location: Location,private deviceService:DeviceService) { }
}
public show() { public show() {
return !this.deviceService.IsMobile(); return !this.deviceService.IsMobile();
} }
} }

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