594 Commits
Author SHA1 Message Date
peter 07e7282614 AW-6526 update angular 21
FarmMaps.Develop/FarmMapsLib/pipeline/head There was a failure building this commit
2026-01-19 18:25:47 +01:00
peter c33d8fc201 AW-6526 update angular 21
FarmMaps.Develop/FarmMapsLib/pipeline/head There was a failure building this commit
2026-01-19 14:36:49 +01:00
peter a0f9f0b03d AW-6526 update angular 21
FarmMaps.Develop/FarmMapsLib/pipeline/head There was a failure building this commit
2026-01-19 14:13:57 +01:00
peter 2e2b37e493 AW-6526 update angular 21
FarmMaps.Develop/FarmMapsLib/pipeline/head There was a failure building this commit
2026-01-19 13:56:07 +01:00
peter f9463f64c3 AW-6526 update angular 21
FarmMaps.Develop/FarmMapsLib/pipeline/head There was a failure building this commit
2026-01-19 13:43:12 +01:00
peter f66d199e75 AW-6526 update angular 21
FarmMaps.Develop/FarmMapsLib/pipeline/head There was a failure building this commit
2026-01-19 13:35:27 +01:00
peter c46dac7572 AW-6526 update angular 21
FarmMaps.Develop/FarmMapsLib/pipeline/head There was a failure building this commit
2026-01-19 13:24:57 +01:00
peter c3f2cbcedc AW-6526 update angular 21
FarmMaps.Develop/FarmMapsLib/pipeline/head There was a failure building this commit
2026-01-19 12:27:21 +01:00
peter 9cc581dd3d AW-6526 update angular 21
FarmMaps.Develop/FarmMapsLib/pipeline/head There was a failure building this commit
2026-01-19 12:19:09 +01:00
peter c35114b2d3 @angular-eslint/eslint-plugin 2026-01-19 10:54:37 +01:00
peter e03aacbcd7 ng update @angular/core@21 @angular/cli@21 2026-01-19 10:49:33 +01:00
peter f59e482f58 ng update @angular/core@20 @angular/cli@20 2026-01-19 10:45:06 +01:00
peter 6a1e6f6495 AW-6526 ng update @angular/core@19 @angular/cli@19 2026-01-19 10:38:27 +01:00
peter 70a86d195f AW-6526 ng update @angular/core@19 @angular/cli@19 2026-01-19 10:35:53 +01:00
peter 8d5412e643 AW-6526 ng update @angular/core@19 @angular/cli@19 2026-01-19 10:15:18 +01:00
jenkins 0ff8992874 [ci skip] Updated packages #2585
FarmMaps.Develop/FarmMapsLib/pipeline/head Something is wrong with the build of this commit
2025-11-13 12:46:51 +00:00
peter b5b84c2547 Merge branch 'develop' of https://git.akkerweb.nl/FarmMaps/FarmMapsLib into develop
FarmMaps.Develop/FarmMapsLib/pipeline/head There was a failure building this commit
2025-11-13 13:43:49 +01:00
peter c2b016b2b9 AW-7096 Fix 2025-11-13 13:43:44 +01:00
jenkins d44531274b [ci skip] Updated packages #2584
FarmMaps.Develop/FarmMapsLib/pipeline/head Something is wrong with the build of this commit
2025-11-11 13:10:21 +00:00
peter c52ee36d1b AW-6498
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2025-11-11 14:08:15 +01:00
jenkins 9b86927e2c [ci skip] Updated packages #2583
FarmMaps.Develop/FarmMapsLib/pipeline/head Something is wrong with the build of this commit
2025-10-16 09:33:10 +00:00
jenkins e224b80995 Updated packages #2582
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2025-10-16 09:25:48 +00:00
jenkins 88f3d9ef1a [ci skip] Updated packages #2581
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2025-10-09 13:09:39 +00:00
peter 6737029a61 AW-7050 Remove FeatureListFeatureObservationComponent
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2025-10-09 15:00:06 +02:00
jenkins d4786564bd [ci skip] Updated packages #2579
FarmMaps.Develop/FarmMapsLib/pipeline/head Something is wrong with the build of this commit
2025-09-02 07:33:57 +00:00
peter 6fd69d7999 AW-6981 Support for backup and restore (current) features
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2025-09-02 09:32:00 +02:00
jenkins 4ec75b3d5a [ci skip] Updated packages #2578
FarmMaps.Develop/FarmMapsLib/pipeline/head Something is wrong with the build of this commit
2025-08-31 08:49:24 +00:00
peter 04e3f1e71f AW-6981 Retrieve childs with ail
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2025-08-31 10:47:25 +02:00
jenkins df77631299 [ci skip] Updated packages #2577
FarmMaps.Develop/FarmMapsLib/pipeline/head Something is wrong with the build of this commit
2025-08-14 07:28:29 +00:00
peter a8d0f05c81 Aw6981 Add observation components
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2025-08-14 09:26:36 +02:00
jenkins c79637be77 [ci skip] Updated packages #2576
FarmMaps.Develop/FarmMapsLib/pipeline/head Something is wrong with the build of this commit
2025-08-11 08:14:46 +00:00
Willem Dantuma b5e11da9a8 Fix flag check
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2025-08-11 10:11:45 +02:00
jenkins 9d45c25a95 [ci skip] Updated packages #2575
FarmMaps.Develop/FarmMapsLib/pipeline/head Something is wrong with the build of this commit
2025-08-11 07:42:16 +00:00
Willem Dantuma 2ffce50c47 Add hideShowLayerValues flag for fm-map-map
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2025-08-11 09:40:00 +02:00
jenkins f50ff878e0 [ci skip] Updated packages #2574
FarmMaps.Develop/FarmMapsLib/pipeline/head Something is wrong with the build of this commit
2025-07-30 09:49:37 +00:00
peter 09c74448a8 Merge branch 'develop' of https://git.akkerweb.nl/FarmMaps/FarmMapsLib into develop
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2025-07-30 11:47:01 +02:00
peter 205b73b30e AW-4935 Tools in croppingscheme weer goed zetten op mobile 2025-07-30 11:46:58 +02:00
jenkins 313cc59fe7 [ci skip] Updated packages #2573
FarmMaps.Develop/FarmMapsLib/pipeline/head Something is wrong with the build of this commit
2025-07-30 09:20:14 +00:00
peter c3fb42c65f AW-4935 Tools in croppingscheme weer goed zetten op mobile
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2025-07-30 11:17:55 +02:00
jenkins 6b73fb0d55 [ci skip] Updated packages #2572
FarmMaps.Develop/FarmMapsLib/pipeline/head Something is wrong with the build of this commit
2025-06-03 10:27:08 +00:00
peter ea641caf38 AW-6806 Allow delete
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2025-06-03 12:25:16 +02:00
peter ac15b2018d AW-6806 Allow delete
FarmMaps.Develop/FarmMapsLib/pipeline/head There was a failure building this commit
2025-06-03 12:15:14 +02:00
jenkins fe73f615ad [ci skip] Updated packages #2570
FarmMaps.Develop/FarmMapsLib/pipeline/head Something is wrong with the build of this commit
2025-05-13 09:34:44 +00:00
jenkins 3e1b3ee78e Updated packages #2569
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2025-05-13 09:28:46 +00:00
jenkins 58391b7828 [ci skip] Updated packages #2568
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2025-05-12 13:54:16 +00:00
jenkins b2b2a1e8be Updated packages #2567
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2025-05-12 13:48:35 +00:00
jenkins 0d96a1be4f [ci skip] Updated packages #2566
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2025-05-12 11:01:08 +00:00
peter d599430cb0 AW-6649 Layers dialog => rename Data to Overlay slide, move below Overlays
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2025-05-12 12:59:12 +02:00
jenkins e17911b339 [ci skip] Updated packages #2565
FarmMaps.Develop/FarmMapsLib/pipeline/head Something is wrong with the build of this commit
2025-04-30 11:27:32 +00:00
jenkins 9d6cbffb3d Updated packages #2564
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2025-04-30 11:20:25 +00:00
jenkins a11eb81e73 [ci skip] Updated packages #2563
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2025-04-30 09:21:42 +00:00
jenkins 4fc3ad933c Updated packages #2562
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2025-04-30 09:14:15 +00:00
jenkins e6d90c9e61 [ci skip] Updated packages #2561
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2025-04-30 06:26:59 +00:00
peter 250b3841fe Merge branch 'develop' of https://git.akkerweb.nl/FarmMaps/FarmMapsLib into develop
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2025-04-30 08:25:09 +02:00
peter 51291cd86f AW-6801 Add switch to add full path to items result 2025-04-30 08:25:00 +02:00
jenkins e9e3b719a4 [ci skip] Updated packages #2560
FarmMaps.Develop/FarmMapsLib/pipeline/head Something is wrong with the build of this commit
2025-04-29 19:35:08 +00:00
jenkins 1c0ad57b0a Updated packages #2559
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2025-04-29 19:28:05 +00:00
jenkins 8684ba25c8 [ci skip] Updated packages #2558
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2025-04-28 08:22:16 +00:00
peter 78ca3044cf Merge branch 'develop' of https://git.akkerweb.nl/FarmMaps/FarmMapsLib into develop
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2025-04-28 10:20:22 +02:00
peter 2e55b5a70e AW-3101 vnd.farmmaps.itemtype.shape.processed download as shape (zip) 2025-04-28 10:20:19 +02:00
jenkins af0a3dca2d [ci skip] Updated packages #2557
FarmMaps.Develop/FarmMapsLib/pipeline/head Something is wrong with the build of this commit
2025-04-28 06:47:11 +00:00
peter f039898c26 AW-3101 vnd.farmmaps.itemtype.geotiff.processed -> Download as tiff
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2025-04-28 08:45:05 +02:00
jenkins ab19b1c2ce [ci skip] Updated packages #2556
FarmMaps.Develop/FarmMapsLib/pipeline/head Something is wrong with the build of this commit
2025-04-24 14:18:56 +00:00
peter a2641f8ea5 AW-3101 Alleen relevante plaatje downloaden bij satelliet
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2025-04-24 16:15:57 +02:00
jenkins d6841c8f83 [ci skip] Updated packages #2555
FarmMaps.Develop/FarmMapsLib/pipeline/head Something is wrong with the build of this commit
2025-04-23 14:39:24 +00:00
peter 187b24ab97 Merge branch 'develop' of https://git.akkerweb.nl/FarmMaps/FarmMapsLib into develop
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2025-04-23 16:37:29 +02:00
peter b80ddf7854 AW-6790 Admin -> users 2025-04-23 16:37:26 +02:00
jenkins 79bc3d9082 [ci skip] Updated packages #2554
FarmMaps.Develop/FarmMapsLib/pipeline/head Something is wrong with the build of this commit
2025-04-23 13:46:30 +00:00
peter 1c92ad4c28 AW-6790 Admin -> users
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2025-04-23 15:44:36 +02:00
jenkins 61e6de0052 [ci skip] Updated packages #2553
FarmMaps.Develop/FarmMapsLib/pipeline/head Something is wrong with the build of this commit
2025-04-16 13:45:05 +00:00
peter fb25b92349 AW-6792 Update API
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2025-04-16 15:43:08 +02:00
jenkins e78f2893ae [ci skip] Updated packages #2552
FarmMaps.Develop/FarmMapsLib/pipeline/head Something is wrong with the build of this commit
2025-04-14 12:57:56 +00:00
peter 51170b45e9 AW-6649 overlays boven luchtfoto’s
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2025-04-14 14:56:06 +02:00
jenkins 7365bea145 [ci skip] Updated packages #2551
FarmMaps.Develop/FarmMapsLib/pipeline/head Something is wrong with the build of this commit
2025-04-14 11:36:12 +00:00
peter dc096065b4 AW-6649 Achtergrondlagen
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2025-04-14 13:34:18 +02:00
jenkins b9850311ea [ci skip] Updated packages #2550
FarmMaps.Develop/FarmMapsLib/pipeline/head Something is wrong with the build of this commit
2025-04-14 10:31:45 +00:00
peter ee9c050db3 AW-6649 Achtergrondlagen
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2025-04-14 12:29:56 +02:00
jenkins 95200d9920 [ci skip] Updated packages #2549
FarmMaps.Develop/FarmMapsLib/pipeline/head Something is wrong with the build of this commit
2025-04-11 21:23:04 +00:00
jenkins ee1ce21cca Updated packages #2548
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2025-04-11 21:16:35 +00:00
jenkins 467f7447bf [ci skip] Updated packages #2547
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2025-04-11 12:01:45 +00:00
jenkins 1df4496058 Updated packages #2546
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2025-04-11 11:55:57 +00:00
jenkins 2137f3f07e [ci skip] Updated packages #2545
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2025-03-24 08:17:20 +00:00
peter a46e8040b2 AW-6756 Settingsknop Explorer dezelfde kleur als het logo van de explorer.
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2025-03-24 09:13:47 +01:00
jenkins 2ca9730735 [ci skip] Updated packages #2544
FarmMaps.Develop/FarmMapsLib/pipeline/head Something is wrong with the build of this commit
2025-03-14 14:27:03 +00:00
peter 3d2ca8fb9f Merge branch 'develop' of https://git.akkerweb.nl/FarmMaps/FarmMapsLib into develop
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2025-03-14 15:25:09 +01:00
peter 6810da8b79 AW-6742 Add analyse functions 2025-03-14 15:25:06 +01:00
jenkins 4866a6f22d [ci skip] Updated packages #2543
FarmMaps.Develop/FarmMapsLib/pipeline/head Something is wrong with the build of this commit
2025-03-13 07:46:33 +00:00
peter 84a1004977 Fix redirect URL for locale (without loosing queryparms)
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2025-03-13 08:44:46 +01:00
peter 39c619a837 Fix RVO redirect URL for locale (without loosing queryparms)
FarmMaps.Develop/FarmMapsLib/pipeline/head There was a failure building this commit
2025-03-13 08:38:24 +01:00
jenkins 758613aa12 [ci skip] Updated packages #2541
FarmMaps.Develop/FarmMapsLib/pipeline/head Something is wrong with the build of this commit
2025-03-12 14:40:01 +00:00
peter 6914a61bc4 Merge branch 'develop' of https://git.akkerweb.nl/FarmMaps/FarmMapsLib into develop
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2025-03-12 15:38:06 +01:00
peter 9f43287433 Revert "Fix RVO redirect URL for locale (without loosing queryparms)"
This reverts commit df14427d60.
2025-03-12 15:37:59 +01:00
jenkins 10df983ae3 [ci skip] Updated packages #2540
FarmMaps.Develop/FarmMapsLib/pipeline/head Something is wrong with the build of this commit
2025-03-12 14:16:55 +00:00
peter 78249811ab Merge branch 'develop' of https://git.akkerweb.nl/FarmMaps/FarmMapsLib into develop
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2025-03-12 15:15:01 +01:00
peter df14427d60 Fix RVO redirect URL for locale (without loosing queryparms) 2025-03-12 15:14:58 +01:00
jenkins c7c131d437 [ci skip] Updated packages #2539
FarmMaps.Develop/FarmMapsLib/pipeline/head Something is wrong with the build of this commit
2025-03-12 13:49:12 +00:00
peter b2fe8f3bd7 Fix RVO redirect URL for locale
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2025-03-12 14:47:17 +01:00
jenkins 3027c69fa8 [ci skip] Updated packages #2538
FarmMaps.Develop/FarmMapsLib/pipeline/head Something is wrong with the build of this commit
2025-03-12 08:00:13 +00:00
peter 5995d205a4 AW-2925 Accidently removed
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2025-03-12 08:58:19 +01:00
jenkins fd479c92d8 [ci skip] Updated packages #2537
FarmMaps.Develop/FarmMapsLib/pipeline/head Something is wrong with the build of this commit
2025-03-10 10:30:23 +00:00
peter e9880d6eb2 AW-2925 Data temporal item
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2025-03-10 11:28:34 +01:00
jenkins a4438d8a90 [ci skip] Updated packages #2536
FarmMaps.Develop/FarmMapsLib/pipeline/head Something is wrong with the build of this commit
2025-03-04 07:54:29 +00:00
peter 89061774de AW-6716 Uploaden avatar geeft foutmelding
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
Caused by BREAKING CHANGE: by default the output will be set to blob. Using blob instead of a base64 should decrease the memory usage. If you wish to keep using base64, simply add output="base64" to the <image-cropper> tag. (https://github.com/Mawi137/ngx-image-cropper/releases/tag/7.0.0)
2025-03-04 08:52:38 +01:00
jenkins 362e6c8534 [ci skip] Updated packages #2535
FarmMaps.Develop/FarmMapsLib/pipeline/head Something is wrong with the build of this commit
2025-03-03 14:34:07 +00:00
peter 64a0e58238 AW-3128 Cleanup
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2025-03-03 15:32:16 +01:00
jenkins a3d4dfbd59 [ci skip] Updated packages #2534
FarmMaps.Develop/FarmMapsLib/pipeline/head Something is wrong with the build of this commit
2025-03-03 14:05:03 +00:00
peter 4c106ebff3 AW-3128 Taalinstellingen profiel gebruiken voor FarmMaps ipv browser instelling
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2025-03-03 15:02:59 +01:00
jenkins 5c8fd64521 [ci skip] Updated packages #2533
FarmMaps.Develop/FarmMapsLib/pipeline/head Something is wrong with the build of this commit
2024-12-03 12:02:22 +00:00
peter 72ba8eca81 AW-6556 The Angular Material version (18.2.4) does not match the Angular CDK version (18.2.3).
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2024-12-03 13:00:12 +01:00
jenkins f89f741265 [ci skip] Updated packages #2532
FarmMaps.Develop/FarmMapsLib/pipeline/head Something is wrong with the build of this commit
2024-12-02 09:31:15 +00:00
peter 50af55acb2 AW-6480 Blauwe balk van upload venster is niet zichtbaar in de explorer
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2024-12-02 10:29:18 +01:00
jenkins cc879b85e5 [ci skip] Updated packages #2531
FarmMaps.Develop/FarmMapsLib/pipeline/head Something is wrong with the build of this commit
2024-11-21 09:49:47 +00:00
peter b4a0a4584d Merge branch 'develop' of https://git.akkerweb.nl/FarmMaps/FarmMapsLib into develop
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2024-11-21 10:47:51 +01:00
peter 8ab1611f39 AW-6504 Support indexed on retrieving child items 2024-11-21 10:47:42 +01:00
jenkins 475c522039 [ci skip] Updated packages #2530
FarmMaps.Develop/FarmMapsLib/pipeline/head Something is wrong with the build of this commit
2024-11-20 15:35:21 +00:00
mark 068396ac9a added TaskService
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2024-11-20 16:33:20 +01:00
jenkins 4a30707ec6 [ci skip] Updated packages #2529
FarmMaps.Develop/FarmMapsLib/pipeline/head Something is wrong with the build of this commit
2024-11-20 08:13:33 +00:00
mark 852b1db895 added workflowcode to IItemTask
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2024-11-20 09:11:34 +01:00
jenkins fcbd68eca0 [ci skip] Updated packages #2528
FarmMaps.Develop/FarmMapsLib/pipeline/head Something is wrong with the build of this commit
2024-11-19 12:25:40 +00:00
peter 3a42f9114e Merge branch 'develop' of https://git.akkerweb.nl/FarmMaps/FarmMapsLib into develop
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2024-11-19 13:23:36 +01:00
peter 3f664b472c Fixed VM104:1 Uncaught TypeError: Cannot read properties of null (reading 'vnd.farmmaps.itemtype.croppingscheme') at eval (eval at getExtraAttributes (main.ce80740d3a633957.js:311566:14), <anonymous>:1:15) 2024-11-19 13:23:32 +01:00
jenkins 57811f3f2e [ci skip] Updated packages #2527
FarmMaps.Develop/FarmMapsLib/pipeline/head Something is wrong with the build of this commit
2024-11-15 13:08:26 +00:00
peter 5e1bc6d705 AW-6495 Exception editor croppingscheme: do not use 'item' in route
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2024-11-15 14:06:33 +01:00
peter d4a230f96d AW-6495 Exception editor croppingscheme: do not use 'item' in route 2024-11-15 14:06:11 +01:00
jenkins ed1e1478b2 [ci skip] Updated packages #2526
FarmMaps.Develop/FarmMapsLib/pipeline/head Something is wrong with the build of this commit
2024-11-14 13:23:40 +00:00
peter afe013a59a Merge branch 'develop' of https://git.akkerweb.nl/FarmMaps/FarmMapsLib into develop
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2024-11-14 14:21:46 +01:00
peter db3734f8a3 AW-6466 Filter by (given) owner 2024-11-14 14:21:43 +01:00
jenkins 86f75c7f78 [ci skip] Updated packages #2525
FarmMaps.Develop/FarmMapsLib/pipeline/head Something is wrong with the build of this commit
2024-11-12 13:41:57 +00:00
peter a7abb4072b AW-6466 Fixed double line of code
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2024-11-12 14:40:05 +01:00
jenkins 61d6446d75 [ci skip] Updated packages #2524
FarmMaps.Develop/FarmMapsLib/pipeline/head Something is wrong with the build of this commit
2024-11-12 09:14:09 +00:00
peter 392008ae4b Merge branch 'develop' of https://git.akkerweb.nl/FarmMaps/FarmMapsLib into develop
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2024-11-12 10:12:15 +01:00
peter 093c26c7f3 AW-6466 Fix optional boolean value to overrule default. 2024-11-12 10:12:12 +01:00
jenkins a8e1ba6c02 [ci skip] Updated packages #2523
FarmMaps.Develop/FarmMapsLib/pipeline/head Something is wrong with the build of this commit
2024-11-12 08:01:08 +00:00
peter e64fbfd014 Merge branch 'develop' of https://git.akkerweb.nl/FarmMaps/FarmMapsLib into develop
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2024-11-12 08:56:59 +01:00
peter 8cd7b85de2 AW-6466 Overrule exact matching on data start/end date with from/until behavior 2024-11-12 08:56:50 +01:00
jenkins ddc7f97e27 [ci skip] Updated packages #2522
FarmMaps.Develop/FarmMapsLib/pipeline/head Something is wrong with the build of this commit
2024-11-12 07:49:58 +00:00
peter 24e3765c28 AW-6466 Overrule exact matching on data start/end date with from/until behavior
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2024-11-12 08:48:02 +01:00
jenkins 86f3ddb34b [ci skip] Updated packages #2521
FarmMaps.Develop/FarmMapsLib/pipeline/head Something is wrong with the build of this commit
2024-11-05 08:27:53 +00:00
peter d6c55ef82b Merge branch 'develop' of https://git.akkerweb.nl/FarmMaps/FarmMapsLib into develop
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2024-11-05 09:26:03 +01:00
peter d977ddfb7b Fix null ref exception 2024-11-05 09:26:00 +01:00
jenkins 0e8bd5343d [ci skip] Updated packages #2520
FarmMaps.Develop/FarmMapsLib/pipeline/head Something is wrong with the build of this commit
2024-10-30 10:39:49 +00:00
peter ceeaa89ba3 AW-6410 Add indexed parm to getItemListCount
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2024-10-30 11:37:51 +01:00
jenkins c3dbf85eb6 [ci skip] Updated packages #2519
FarmMaps.Develop/FarmMapsLib/pipeline/head Something is wrong with the build of this commit
2024-10-23 12:02:56 +00:00
peter ad5fe95b55 AW-6410 Add extra parms to /api/v1/items/../children/count
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2024-10-23 14:00:47 +02:00
jenkins 6b95fb7f77 [ci skip] Updated packages #2518
FarmMaps.Develop/FarmMapsLib/pipeline/head Something is wrong with the build of this commit
2024-10-22 12:40:18 +00:00
peter da7e193219 Merge branch 'develop' of https://git.akkerweb.nl/FarmMaps/FarmMapsLib into develop
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2024-10-22 14:38:21 +02:00
peter 31f9b48bd7 AW-6410 Add beforeLocationBack event 2024-10-22 14:38:17 +02:00
jenkins 1d6b30edff [ci skip] Updated packages #2517
FarmMaps.Develop/FarmMapsLib/pipeline/head Something is wrong with the build of this commit
2024-10-14 13:15:00 +00:00
peter 349a76395b AW-6410 Fix settings menu
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2024-10-14 15:12:41 +02:00
jenkins 32b3b98f76 [ci skip] Updated packages #2516
FarmMaps.Develop/FarmMapsLib/pipeline/head Something is wrong with the build of this commit
2024-10-14 12:11:38 +00:00
peter 010ed6e010 Merge branch 'develop' of https://git.akkerweb.nl/FarmMaps/FarmMapsLib into develop
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2024-10-14 14:09:26 +02:00
peter a8675f5c49 AW-6410 Fix settings menu 2024-10-14 14:09:23 +02:00
jenkins f76ef44dee [ci skip] Updated packages #2515
FarmMaps.Develop/FarmMapsLib/pipeline/head Something is wrong with the build of this commit
2024-10-14 11:10:45 +00:00
peter 2387a0e39e Merge branch 'develop' of https://git.akkerweb.nl/FarmMaps/FarmMapsLib into develop
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2024-10-14 13:08:44 +02:00
peter 98980fc857 AW-6410 Fix settings menu 2024-10-14 13:08:41 +02:00
jenkins 6f7d8fe248 [ci skip] Updated packages #2514
FarmMaps.Develop/FarmMapsLib/pipeline/head Something is wrong with the build of this commit
2024-10-14 10:17:45 +00:00
peter 03a1ccd597 AW-6410 Add settings menu
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2024-10-14 12:15:46 +02:00
jenkins 9c866e500f [ci skip] Updated packages #2513
FarmMaps.Develop/FarmMapsLib/pipeline/head Something is wrong with the build of this commit
2024-09-16 13:37:17 +00:00
peter 3b692359c6 Merge branch 'develop' of https://git.akkerweb.nl/FarmMaps/FarmMapsLib into develop
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2024-09-16 15:35:27 +02:00
peter 3d4042e8c6 AW6241 Add item owner 2024-09-16 15:35:24 +02:00
jenkins 3db760dd96 [ci skip] Updated packages #2512
FarmMaps.Develop/FarmMapsLib/pipeline/head Something is wrong with the build of this commit
2024-09-16 12:13:40 +00:00
peter b5828cd0fa Merge branch 'develop' of https://git.akkerweb.nl/FarmMaps/FarmMapsLib into develop
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2024-09-16 14:11:56 +02:00
peter af4e6f45d1 AW6241 Support source in item count 2024-09-16 14:11:39 +02:00
jenkins 79def90bc7 [ci skip] Updated packages #2511
FarmMaps.Develop/FarmMapsLib/pipeline/head Something is wrong with the build of this commit
2024-09-16 12:01:16 +00:00
peter 53c60427f1 AW6241 Support src in item count
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2024-09-16 13:58:54 +02:00
jenkins 7d7e5bcd37 [ci skip] Updated packages #2510
FarmMaps.Develop/FarmMapsLib/pipeline/head Something is wrong with the build of this commit
2024-09-06 11:47:40 +00:00
peter 72a172ccb2 Merge branch 'develop' of https://git.akkerweb.nl/FarmMaps/FarmMapsLib into develop
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2024-09-06 13:46:04 +02:00
peter 2728a91ab4 Fix ngrx-store-localstorage dep 2024-09-06 13:45:56 +02:00
jenkins 28d2b5d4a3 [ci skip] Updated packages #2509
FarmMaps.Develop/FarmMapsLib/pipeline/head Something is wrong with the build of this commit
2024-09-06 11:40:26 +00:00
peter b70e385097 Fix import @farmmaps/ng-openlayers
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2024-09-06 13:38:48 +02:00
peter 7392c6170c Merge branch 'develop' of https://git.akkerweb.nl/FarmMaps/FarmMapsLib into develop
FarmMaps.Develop/FarmMapsLib/pipeline/head There was a failure building this commit
2024-09-06 13:33:01 +02:00
peter 367348088a Move ng-openlayers to @farmmaps 2024-09-06 13:32:58 +02:00
jenkins 5efd5b78c9 [ci skip] Updated packages #2507
FarmMaps.Develop/FarmMapsLib/pipeline/head Something is wrong with the build of this commit
2024-09-06 11:14:07 +00:00
peter 0498d64c36 Move linux deps to optional
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2024-09-06 13:10:45 +02:00
jenkins e17ac435b5 [ci skip] Updated packages #2506
FarmMaps.Develop/FarmMapsLib/pipeline/head Something is wrong with the build of this commit
2024-09-06 10:43:59 +00:00
Willem Dantuma 3e11c7cefd Revert
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2024-09-06 12:40:43 +02:00
Willem Dantuma b3dcd1e58b Move lmdb to overrides
FarmMaps.Develop/FarmMapsLib/pipeline/head There was a failure building this commit
2024-09-06 12:36:56 +02:00
jenkins 681fc819a6 [ci skip] Updated packages #2504
FarmMaps.Develop/FarmMapsLib/pipeline/head Something is wrong with the build of this commit
2024-09-06 10:30:45 +00:00
peter 2a62d2df48 Trigger build
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2024-09-06 10:27:23 +00:00
jenkins 004bcea0b6 [ci skip] Updated packages #2503
FarmMaps.Develop/FarmMapsLib/pipeline/head Something is wrong with the build of this commit
2024-09-06 10:17:57 +00:00
peter 8efa46fa66 AW6241 Fix build
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2024-09-06 09:30:03 +02:00
peter cefa788295 Revert "AW6241 Fix build"
FarmMaps.Develop/FarmMapsLib/pipeline/head There was a failure building this commit
This reverts commit 749be159f1.
2024-09-06 09:17:25 +02:00
peter 2da783d6be Merge branch 'develop' of https://git.akkerweb.nl/FarmMaps/FarmMapsLib into develop
FarmMaps.Develop/FarmMapsLib/pipeline/head There was a failure building this commit
2024-09-06 09:14:06 +02:00
peter 749be159f1 AW6241 Fix build 2024-09-06 09:14:03 +02:00
jenkins 4e24527950 [ci skip] Updated packages #2496
FarmMaps.Develop/FarmMapsLib/pipeline/head Something is wrong with the build of this commit
2024-09-06 06:55:54 +00:00
peter 45263a59f4 AW6241 Fix peer deps
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2024-09-06 08:52:56 +02:00
jenkins 5cdef30c71 [ci skip] Updated packages #2495
FarmMaps.Develop/FarmMapsLib/pipeline/head Something is wrong with the build of this commit
2024-09-05 13:07:16 +00:00
peter cdba2af921 Merge branch 'develop' of https://git.akkerweb.nl/FarmMaps/FarmMapsLib into develop
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2024-09-05 15:01:14 +02:00
peter 658c2c84cd AW6241 publish config 2024-09-05 15:01:05 +02:00
peter 3f9b4dcdaa Update README.md
FarmMaps.Develop/FarmMapsLib/pipeline/head There was a failure building this commit
2024-09-05 12:53:30 +00:00
jenkins a63159367f [ci skip] Updated packages #2492
FarmMaps.Develop/FarmMapsLib/pipeline/head Something is wrong with the build of this commit
2024-09-05 12:51:03 +00:00
peter b9d1c8f61f Update README.md
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2024-09-05 12:47:31 +00:00
jenkins eb34de193c [ci skip] Updated packages #2491
FarmMaps.Develop/FarmMapsLib/pipeline/head Something is wrong with the build of this commit
2024-09-05 12:31:43 +00:00
peter 5612bb3d66 Merge branch 'feature/AW6241Angular18' into develop
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2024-09-05 13:44:56 +02:00
peter 0e42efac75 AW6241 Fix deps 2024-09-05 13:44:33 +02:00
peter 3247880b7c AW6241 Migrate deps 2024-09-05 12:50:16 +02:00
peter a250ecdcc1 AW6241 Migrate libs to latest bootstrap 2024-09-05 11:45:31 +02:00
peter 93e497ec3f AW6241 Migrate libs to ng-18 2024-09-05 11:02:15 +02:00
peter 10a1f07622 AW6241 Migrate main to ng-18 2024-09-05 09:08:43 +02:00
peter 07d6c1bc10 AW6241 ng-18 adopt ng-openlayers 2024-09-05 08:50:27 +02:00
jenkins 1bddc28767 [ci skip] Updated packages #2485
FarmMaps.Develop/FarmMapsLib/pipeline/head Something is wrong with the build of this commit
2024-09-02 12:29:11 +00:00
peter a999c05631 Aw-6020 Add getItemListCount for paging
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2024-09-02 14:27:47 +02:00
jenkins f3252a378d [ci skip] Updated packages #2484
FarmMaps.Develop/FarmMapsLib/pipeline/head Something is wrong with the build of this commit
2024-08-29 07:38:28 +00:00
peter 4ab1e43d40 Aw-6020 Fix getChildItemListCount
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2024-08-29 09:37:03 +02:00
jenkins 2719f2fcf4 [ci skip] Updated packages #2483
FarmMaps.Develop/FarmMapsLib/pipeline/head Something is wrong with the build of this commit
2024-08-20 08:54:40 +00:00
peter 55914bf7d2 Merge branch 'develop' of https://git.akkerweb.nl/FarmMaps/FarmMapsLib into develop
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2024-08-20 10:51:30 +02:00
peter 26ca9be4e7 Aw6020 Itemtype = optional 2024-08-20 10:51:21 +02:00
peter 0ed342404e Aw6020 Itemtype = optional 2024-08-20 10:47:33 +02:00
jenkins 26ae1c7f06 [ci skip] Updated packages #2482
FarmMaps.Develop/FarmMapsLib/pipeline/head Something is wrong with the build of this commit
2024-08-20 08:45:26 +00:00
peter f71d0fe256 Aw6020 Add my_root
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2024-08-20 10:43:57 +02:00
jenkins 7544203202 [ci skip] Updated packages #2481
FarmMaps.Develop/FarmMapsLib/pipeline/head Something is wrong with the build of this commit
2024-08-20 08:04:03 +00:00
peter 41a30e0b64 Merge branch 'develop' of https://git.akkerweb.nl/FarmMaps/FarmMapsLib into develop
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2024-08-20 10:02:37 +02:00
peter f14fc1a4fc Aw6020 Allow retrieving list items with date filter 2024-08-20 10:02:33 +02:00
jenkins 21ebda4753 [ci skip] Updated packages #2480
FarmMaps.Develop/FarmMapsLib/pipeline/head Something is wrong with the build of this commit
2024-06-12 13:30:48 +00:00
peter 3a80a6f7f3 Merge branch 'develop' of https://git.akkerweb.nl/FarmMaps/FarmMapsLib into develop
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2024-06-12 15:29:24 +02:00
peter 71a2ef44e6 AW-6226 Add admin function to post task on behalve of other user 2024-06-12 15:29:15 +02:00
jenkins 1610391d56 [ci skip] Updated packages #2479
FarmMaps.Develop/FarmMapsLib/pipeline/head Something is wrong with the build of this commit
2024-06-12 10:15:19 +00:00
peter b778e5726c error TS2307: Cannot find module 'dist/common' or its corresponding type declarations.
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2024-06-12 12:14:05 +02:00
peter fc4abf9a5b AW-6226 Add admin function to retrieve all users
FarmMaps.Develop/FarmMapsLib/pipeline/head There was a failure building this commit
2024-06-12 12:11:36 +02:00
jenkins d6587bd63b [ci skip] Updated packages #2477
FarmMaps.Develop/FarmMapsLib/pipeline/head Something is wrong with the build of this commit
2024-04-15 14:29:22 +00:00
jenkins ede75f63f5 [ci skip] Updated packages #2463
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2024-04-10 12:19:34 +00:00
peter 274f33e709 Merge branch 'develop' of https://git.akkerweb.nl/FarmMaps/FarmMapsLib into develop
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
# Conflicts:
#	package-lock.json
2024-04-10 14:07:19 +02:00
peter 4384b12944 AW-6046 ng-openlayers 2024-04-10 14:06:44 +02:00
jenkins 10ebdf276a [ci skip] Updated packages #2460
FarmMaps.Develop/FarmMapsLib/pipeline/head Something is wrong with the build of this commit
2024-04-10 11:45:06 +00:00
peter 9c270bfe75 Merge branch 'develop' of https://git.akkerweb.nl/FarmMaps/FarmMapsLib into develop
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2024-04-10 13:41:54 +02:00
peter 9031d3e171 Update ngx-clipboard 2024-04-10 13:41:46 +02:00
jenkins c3158c1064 [ci skip] Updated packages #2459
FarmMaps.Develop/FarmMapsLib/pipeline/head Something is wrong with the build of this commit
2024-04-10 11:29:13 +00:00
peter 315b64a561 Fixes
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2024-04-10 13:27:25 +02:00
jenkins 030dbcec5d [ci skip] Updated packages #2458
FarmMaps.Develop/FarmMapsLib/pipeline/head Something is wrong with the build of this commit
2024-04-10 06:25:47 +00:00
peter 876020828e AW-6046 Angular 17
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2024-04-10 08:24:07 +02:00
peter 393b881e3b Merge branch 'develop' of https://git.akkerweb.nl/FarmMaps/FarmMapsLib into develop 2024-04-10 08:18:36 +02:00
peter 8594a94d62 AW-6046 Angular 17 2024-04-10 08:18:25 +02:00
jenkins c543ac7c94 [ci skip] Updated packages #2457
FarmMaps.Develop/FarmMapsLib/pipeline/head Something is wrong with the build of this commit
2024-04-09 13:51:44 +00:00
peter 97d6d569a0 AW-6046 Fix open layers 8 issues
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2024-04-09 15:50:03 +02:00
peter 023048a5bb error TS2307: Cannot find module 'ol/source/WMSServerType' or its corresponding type declarations.
FarmMaps.Develop/FarmMapsLib/pipeline/head There was a failure building this commit
2024-04-09 15:05:26 +02:00
peter 4a685d675d AW-6046 Open layers 8
FarmMaps.Develop/FarmMapsLib/pipeline/head There was a failure building this commit
2024-04-09 12:36:39 +02:00
jenkins 1125f4586e [ci skip] Updated packages #2454
FarmMaps.Develop/FarmMapsLib/pipeline/head Something is wrong with the build of this commit
2024-04-09 10:13:34 +00:00
peter 3bdba527ec npm ERR! code ENEEDAUTH
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2024-04-09 12:10:38 +02:00
peter fb03cfce44 npm ERR! code ENEEDAUTH
FarmMaps.Develop/FarmMapsLib/pipeline/head There was a failure building this commit
2024-04-09 12:06:14 +02:00
peter 6f93cf254c AW-6046 Angular 17
FarmMaps.Develop/FarmMapsLib/pipeline/head There was a failure building this commit
2024-04-09 11:23:39 +02:00
peter b5a3a62cee AW-6046 Fix jenkins
FarmMaps.Develop/FarmMapsLib/pipeline/head There was a failure building this commit
2024-04-09 11:04:37 +02:00
peter d306d5c4c1 AW-6046 Angular 17
FarmMaps.Develop/FarmMapsLib/pipeline/head There was a failure building this commit
2024-04-09 10:58:42 +02:00
peter e79ae2f623 AW-6046 Angular 17 2024-04-09 10:16:21 +02:00
peter bdf4e03b49 AW-6046 Angular 17 2024-04-09 09:50:06 +02:00
peter 7d5c10d902 AW-6046 Angular 17 2024-04-09 09:46:52 +02:00
peter fb192c6e4d AW-6046 Angular 17 2024-04-09 09:45:29 +02:00
jenkins 6356f149a6 [ci skip] Updated packages #2447
FarmMaps.Develop/FarmMapsLib/pipeline/head Something is wrong with the build of this commit
2024-04-04 12:57:13 +00:00
peter 5c5914327c AW-6033 /api/v1/items/undefined/children?... 401 (Unauthorized)
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2024-04-04 14:55:39 +02:00
jenkins e306bf601f [ci skip] Updated packages #2446
FarmMaps.Develop/FarmMapsLib/pipeline/head Something is wrong with the build of this commit
2024-04-04 11:20:05 +00:00
peter f8459aaca4 AW-6033 main.js:555726 ERROR TypeError: Cannot read properties of null (reading 'code')
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2024-04-04 13:18:28 +02:00
jenkins ce52cbdbed [ci skip] Updated packages #2445
FarmMaps.Develop/FarmMapsLib/pipeline/head Something is wrong with the build of this commit
2024-03-05 14:41:30 +00:00
mark 752e1e2c42 added hit tolerance to ngx select interaction
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2024-03-05 15:39:52 +01:00
jenkins 6b617ed4ad [ci skip] Updated packages #2444
FarmMaps.Develop/FarmMapsLib/pipeline/head Something is wrong with the build of this commit
2024-03-04 12:22:37 +00:00
peter 9b19950945 Fix upload json formatting
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
Fix extraAttributes null exception
2024-03-04 13:20:23 +01:00
jenkins c74163976a [ci skip] Changed by Jenkins: 2443
FarmMaps.Develop/FarmMapsLib/pipeline/head Something is wrong with the build of this commit
2024-02-08 18:37:07 +00:00
Willem Dantuma c9f43b5b53 Fix span
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2024-02-08 19:35:39 +01:00
jenkins 6a240abc0c [ci skip] Changed by Jenkins: 2442
FarmMaps.Develop/FarmMapsLib/pipeline/head Something is wrong with the build of this commit
2024-02-08 18:10:48 +00:00
Willem Dantuma 7d8b18a27d Add space
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2024-02-08 19:09:19 +01:00
jenkins 4a328054dd [ci skip] Changed by Jenkins: 2441
FarmMaps.Develop/FarmMapsLib/pipeline/head Something is wrong with the build of this commit
2024-02-08 17:36:18 +00:00
Willem Dantuma 3e482470b6 Add provider info
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2024-02-08 18:33:35 +01:00
jenkins 3bacb8a5d9 [ci skip] Changed by Jenkins: 2440
FarmMaps.Develop/FarmMapsLib/pipeline/head Something is wrong with the build of this commit
2024-02-08 17:19:12 +00:00
Willem Dantuma 47afa20a01 Add firstname and lastname
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2024-02-08 18:17:42 +01:00
jenkins f0646a8f6a [ci skip] Changed by Jenkins: 2439
FarmMaps.Develop/FarmMapsLib/pipeline/head Something is wrong with the build of this commit
2024-02-01 15:38:22 +00:00
peter 36ebc03189 Merge branch 'develop' of https://git.akkerweb.nl/FarmMaps/FarmMapsLib into develop
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2024-02-01 16:35:36 +01:00
peter c0d40d2d5e Aw5812Add wide supp 2024-02-01 16:34:24 +01:00
jenkins 14e504cc79 [ci skip] Changed by Jenkins: 2438
FarmMaps.Develop/FarmMapsLib/pipeline/head Something is wrong with the build of this commit
2024-02-01 15:22:56 +00:00
peter b060fd34bb Merge branch 'develop' of https://git.akkerweb.nl/FarmMaps/FarmMapsLib into develop
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2024-02-01 16:21:20 +01:00
peter 0694d4e467 Aw5812Fix null exc 2024-02-01 16:20:57 +01:00
jenkins 7c5867a332 [ci skip] Changed by Jenkins: 2437
FarmMaps.Develop/FarmMapsLib/pipeline/head Something is wrong with the build of this commit
2024-02-01 15:02:54 +00:00
peter 8f958e33f1 Merge branch 'develop' of https://git.akkerweb.nl/FarmMaps/FarmMapsLib into develop
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2024-02-01 16:01:24 +01:00
peter aa2f305b27 Aw5812wip 2024-02-01 16:01:11 +01:00
jenkins d02da8f334 [ci skip] Changed by Jenkins: 2436
FarmMaps.Develop/FarmMapsLib/pipeline/head Something is wrong with the build of this commit
2024-02-01 14:23:30 +00:00
peter 253553c534 Merge branch 'develop' of https://git.akkerweb.nl/FarmMaps/FarmMapsLib into develop
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
# Conflicts:
#	package-lock.json
2024-02-01 15:21:58 +01:00
peter 4641e351fd Aw5812 2024-02-01 15:21:04 +01:00
jenkins 84cf6a3f6e [ci skip] Changed by Jenkins: 2435
FarmMaps.Develop/FarmMapsLib/pipeline/head Something is wrong with the build of this commit
2024-02-01 12:36:14 +00:00
peter 92b29135b5 Aw5812wip
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2024-02-01 13:34:38 +01:00
jenkins f6aebb2f80 [ci skip] Changed by Jenkins: 2434
FarmMaps.Develop/FarmMapsLib/pipeline/head Something is wrong with the build of this commit
2024-01-30 10:19:44 +00:00
peter daf78f32b7 Fix error TS500: RangeError: Maximum call stack size exceeded
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2024-01-30 11:18:11 +01:00
peter 42245612d2 ERROR: Trying to publish a package that has been compiled by Ivy in full compilation mode
FarmMaps.Develop/FarmMapsLib/pipeline/head There was a failure building this commit
2024-01-30 11:00:16 +01:00
peter a05c1fa874 Fix build
FarmMaps.Develop/FarmMapsLib/pipeline/head There was a failure building this commit
2024-01-30 10:52:02 +01:00
peter 4bda94c360 Fix path
FarmMaps.Develop/FarmMapsLib/pipeline/head There was a failure building this commit
2024-01-30 10:23:14 +01:00
peter feaad02c33 Fix path
FarmMaps.Develop/FarmMapsLib/pipeline/head There was a failure building this commit
2024-01-30 10:06:26 +01:00
peter af9acebaff Only page not found when no routing is matched on production environment
FarmMaps.Develop/FarmMapsLib/pipeline/head There was a failure building this commit
2024-01-30 09:54:00 +01:00
jenkins 7ba35052ec [ci skip] Changed by Jenkins: 2427
FarmMaps.Develop/FarmMapsLib/pipeline/head Something is wrong with the build of this commit
2024-01-29 15:27:29 +00:00
peter 2e40d023b1 Aw5812 Update item file
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2024-01-29 16:25:56 +01:00
jenkins 4d5ed915ad [ci skip] Changed by Jenkins: 2426
FarmMaps.Develop/FarmMapsLib/pipeline/head Something is wrong with the build of this commit
2024-01-12 12:07:12 +00:00
peter 2fb5967c26 Aw-5739 Use ngrx-store-localstorage angular 16 compatible version
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2024-01-12 13:05:37 +01:00
jenkins 820543913f [ci skip] Changed by Jenkins: 2425
FarmMaps.Develop/FarmMapsLib/pipeline/head Something is wrong with the build of this commit
2024-01-11 12:39:00 +00:00
peter ce2f06091b Aw-5739 Add data download service
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2024-01-11 13:37:25 +01:00
jenkins 5714cdce72 [ci skip] Changed by Jenkins: 2424
FarmMaps.Develop/FarmMapsLib/pipeline/head Something is wrong with the build of this commit
2024-01-09 08:27:18 +00:00
peter 10e43e1ea5 Merge branch 'develop' of https://git.akkerweb.nl/FarmMaps/FarmMapsLib into develop
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
# Conflicts:
#	package-lock.json
2024-01-09 09:25:44 +01:00
peter 8fa84c6ea8 Aw5739 Update to Angular v16. 2024-01-09 09:24:52 +01:00
jenkins 9f872d0af0 [ci skip] Changed by Jenkins: 2423
FarmMaps.Develop/FarmMapsLib/pipeline/head Something is wrong with the build of this commit
2024-01-08 13:54:36 +00:00
peter f6bed668f6 Merge branch 'feature/AW5739AngularV15ToV16' into develop
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
# Conflicts:
#	package-lock.json
2024-01-08 14:52:46 +01:00
peter f70e30204d Aw5739 Update to Angular v16. 2024-01-08 14:51:37 +01:00
peter 7339b91328 Aw5739 Prepare migration to v16: Use suported version of ngx-avatars 2024-01-08 14:43:28 +01:00
peter 88667b3986 Aw5739 Prepare migration to v16 Update package.lock 2024-01-08 14:41:05 +01:00
peter a996caa73b Aw5739 Prepare migration to v16 Update ngrx 2024-01-08 14:38:06 +01:00
peter ed6f8f4231 Aw5739 Prepare migration to v16 Update ngrx 2024-01-08 14:33:32 +01:00
peter 94ef2e269b Aw5739 Prepare migration to v16 Update eslint 2024-01-08 14:31:09 +01:00
peter da624f0535 Aw5739 Prepare migration to v16 2024-01-08 14:25:46 +01:00
peter 3da646dc4d Aw5739 Prepare migration to v16: Use supported version of TypeScript 2024-01-08 14:19:52 +01:00
peter 778e40a26d Aw5739 Prepare migration to v16: Use supported version of TypeScript 2024-01-08 13:25:30 +01:00
jenkins 94ff567567 [ci skip] Changed by Jenkins: 2422
FarmMaps.Develop/FarmMapsLib/pipeline/head Something is wrong with the build of this commit
2024-01-08 11:38:33 +00:00
peter b20ab34859 Merge branch 'feature/AW5739AngularV14ToV15' into develop
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2024-01-08 12:36:27 +01:00
peter 1988b3f74d Aw5739 Update to Angular v15. 2024-01-08 12:33:38 +01:00
peter b0587bc4c3 Aw5739 Prepare migration to v15: Use suported version of ngx-clipboard 2024-01-08 12:17:32 +01:00
peter 681d372ef3 Aw5739 Prepare migration to v15: Use suported version of ngx-avatar 2024-01-08 12:05:38 +01:00
peter b1922cdb10 Aw5739 Prepare migration to v15: Use supported version of TypeScript. Use suported version of ngx-avatar 2024-01-08 11:19:56 +01:00
jenkins 5774bff8df [ci skip] Changed by Jenkins: 2421
FarmMaps.Develop/FarmMapsLib/pipeline/head Something is wrong with the build of this commit
2023-12-29 13:53:17 +00:00
peter 6254a3be98 Trigger build
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-12-29 13:50:43 +00:00
jenkins 7943cefddf [ci skip] Changed by Jenkins: 2414
FarmMaps.Develop/FarmMapsLib/pipeline/head There was a failure building this commit
2023-12-29 10:17:00 +00:00
peter a2a287961c Fix error TS2307: Cannot find module 'ngx-openlayers' or its corresponding type declarations.
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-12-29 11:07:41 +01:00
peter 8e8f18ad7c Aw5739 Add ngx openlayers
FarmMaps.Develop/FarmMapsLib/pipeline/head There was a failure building this commit
2023-12-29 11:01:36 +01:00
jenkins 5cbb6f32f9 [ci skip] Changed by Jenkins: 2398
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-12-21 11:57:05 +00:00
peter b2469f731e trigger build
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-12-21 11:54:47 +00:00
jenkins beb439469f [ci skip] Changed by Jenkins: 2397
FarmMaps.Develop/FarmMapsLib/pipeline/head Something is wrong with the build of this commit
2023-12-19 13:26:17 +00:00
wilco ef49f62ca2 AW-5727 - Farms blijft leeg bij harde reload
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-12-19 14:14:57 +01:00
jenkins 67abc67d9a [ci skip] Changed by Jenkins: 2396
FarmMaps.Develop/FarmMapsLib/pipeline/head Something is wrong with the build of this commit
2023-12-15 13:11:48 +00:00
jenkins 1f7f410916 [ci skip] Changed by Jenkins: 2395
FarmMaps.Develop/FarmMapsLib/pipeline/head Something is wrong with the build of this commit
2023-12-15 13:06:21 +00:00
peter 2f176be8c6 Merge branch 'develop' of https://git.akkerweb.nl/FarmMaps/FarmMapsLib into develop
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-12-15 14:01:02 +01:00
peter 1118c5ca60 Aw3998 Add click 2023-12-15 14:00:48 +01:00
jenkins c7831d1d87 [ci skip] Changed by Jenkins: 2394
FarmMaps.Develop/FarmMapsLib/pipeline/head Something is wrong with the build of this commit
2023-12-15 12:51:48 +00:00
peter 31c5e0cb52 Aw3998 Add click
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-12-15 13:49:13 +01:00
jenkins c6a632894d [ci skip] Changed by Jenkins: 2393
FarmMaps.Develop/FarmMapsLib/pipeline/head Something is wrong with the build of this commit
2023-12-15 10:10:59 +00:00
peter e652c7bb5b Merge branch 'develop' of https://git.akkerweb.nl/FarmMaps/FarmMapsLib into develop
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-12-15 11:05:40 +01:00
peter 818e04d1f3 Aw3998 Cleanup 2023-12-15 11:05:27 +01:00
jenkins ebbac409a0 [ci skip] Changed by Jenkins: 2392
FarmMaps.Develop/FarmMapsLib/pipeline/head Something is wrong with the build of this commit
2023-12-15 10:01:59 +00:00
peter 5cc976ddd3 Merge branch 'develop' of https://git.akkerweb.nl/FarmMaps/FarmMapsLib into develop
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-12-15 10:59:18 +01:00
peter 38eae3263e Aw-3998 Add ability to clear features 2023-12-15 10:59:10 +01:00
jenkins a3eb2d9617 [ci skip] Changed by Jenkins: 2391
FarmMaps.Develop/FarmMapsLib/pipeline/head Something is wrong with the build of this commit
2023-11-25 14:55:18 +00:00
mark 03e3c7ad95 fix build...
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-11-25 15:52:47 +01:00
mark 8fd8675260 AW-5366 fix scaling of histogram
FarmMaps.Develop/FarmMapsLib/pipeline/head There was a failure building this commit
2023-11-25 15:46:31 +01:00
mark 187811e4e2 upped version
FarmMaps.Develop/FarmMapsLib/pipeline/head There was a failure building this commit
2023-11-25 15:41:39 +01:00
mark 8e304fc6eb also use scale for histogram
FarmMaps.Develop/FarmMapsLib/pipeline/head There was a failure building this commit
2023-11-23 21:13:44 +01:00
jenkins 127dc44917 [ci skip] Changed by Jenkins: 2387
FarmMaps.Develop/FarmMapsLib/pipeline/head Something is wrong with the build of this commit
2023-10-21 08:59:13 +00:00
jenkins aa5a8f0843 [ci skip] Changed by Jenkins: 2385
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-10-21 08:47:16 +00:00
jenkins a10aca92f1 [ci skip] Changed by Jenkins: 2383 2023-10-21 08:18:23 +00:00
jenkins e42e94fcf7 [ci skip] Changed by Jenkins: 2382
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-10-21 08:16:00 +00:00
jenkins 2b83ccad1f [ci skip] Changed by Jenkins: 2381
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-10-21 08:13:37 +00:00
jenkins e31d428c4b [ci skip] Changed by Jenkins: 2380
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-10-21 07:44:52 +00:00
jenkins 429e54ef8d [ci skip] Changed by Jenkins: 2379
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-10-21 07:39:40 +00:00
jenkins 02e13337bf [ci skip] Changed by Jenkins: 2378
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-10-21 07:34:27 +00:00
jenkins b4eb7aaeac [ci skip] Changed by Jenkins: 2377
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-10-21 07:30:58 +00:00
jenkins 7e21c725d8 [ci skip] Changed by Jenkins: 2376
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-10-21 07:25:39 +00:00
jenkins dd889ea7cc [ci skip] Changed by Jenkins: 2375
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-10-21 07:20:42 +00:00
jenkins 4dab5a00b1 [ci skip] Changed by Jenkins: 2374
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-10-21 07:16:29 +00:00
jenkins 5cc58e8988 [ci skip] Changed by Jenkins: 2373
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-10-21 07:11:47 +00:00
jenkins 0944e595d3 [ci skip] Changed by Jenkins: 2372
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-10-21 07:07:16 +00:00
jenkins 32bebec0df [ci skip] Changed by Jenkins: 2371
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-10-21 07:02:43 +00:00
jenkins c0cf210600 [ci skip] Changed by Jenkins: 2370
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-10-21 06:58:06 +00:00
jenkins f85a27a8e5 [ci skip] Changed by Jenkins: 2369
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-10-21 06:54:05 +00:00
jenkins 88ae8b829f [ci skip] Changed by Jenkins: 2368
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-10-21 06:49:06 +00:00
jenkins fcb60ed8bc [ci skip] Changed by Jenkins: 2367
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-10-21 06:44:19 +00:00
jenkins 3d535507fb [ci skip] Changed by Jenkins: 2366
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-10-21 06:40:43 +00:00
jenkins e89bdac47d [ci skip] Changed by Jenkins: 2365
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-10-21 06:35:36 +00:00
jenkins 4038702841 [ci skip] Changed by Jenkins: 2364
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-10-21 06:30:50 +00:00
jenkins 7ced2d2a7b [ci skip] Changed by Jenkins: 2363
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-10-21 06:27:26 +00:00
jenkins c53981f4a6 [ci skip] Changed by Jenkins: 2362
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-10-21 06:21:55 +00:00
jenkins 076dec27d5 [ci skip] Changed by Jenkins: 2361
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-10-21 06:16:30 +00:00
jenkins 5354aa8d0a [ci skip] Changed by Jenkins: 2360
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-10-21 06:12:54 +00:00
jenkins 12143c8e69 [ci skip] Changed by Jenkins: 2359
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-10-21 06:07:52 +00:00
jenkins 50519e9236 [ci skip] Changed by Jenkins: 2358
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-10-21 06:03:08 +00:00
jenkins 7f6d007c04 [ci skip] Changed by Jenkins: 2357
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-10-21 05:58:43 +00:00
jenkins 98be4f05cc [ci skip] Changed by Jenkins: 2356
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-10-21 05:54:03 +00:00
jenkins 79558e2168 [ci skip] Changed by Jenkins: 2355
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-10-21 05:49:44 +00:00
jenkins b966241997 [ci skip] Changed by Jenkins: 2354
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-10-21 05:44:51 +00:00
jenkins 60a7384f88 [ci skip] Changed by Jenkins: 2353
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-10-21 05:39:58 +00:00
jenkins 76f225b996 [ci skip] Changed by Jenkins: 2352
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-10-21 05:36:10 +00:00
jenkins 37a25c6b29 [ci skip] Changed by Jenkins: 2351
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-10-21 05:30:37 +00:00
jenkins 6c45842387 [ci skip] Changed by Jenkins: 2350
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-10-21 05:25:39 +00:00
jenkins d37b0866d5 [ci skip] Changed by Jenkins: 2349
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-10-21 05:22:22 +00:00
jenkins 270f244128 [ci skip] Changed by Jenkins: 2348
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-10-21 05:16:55 +00:00
jenkins ebddf688c6 [ci skip] Changed by Jenkins: 2347
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-10-21 05:11:46 +00:00
jenkins f1c572ecc9 [ci skip] Changed by Jenkins: 2346
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-10-21 05:08:27 +00:00
jenkins af5361b6c3 [ci skip] Changed by Jenkins: 2345
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-10-21 05:03:06 +00:00
jenkins 6daf0eab4a [ci skip] Changed by Jenkins: 2344
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-10-21 04:58:02 +00:00
jenkins 66fe0e9534 [ci skip] Changed by Jenkins: 2343
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-10-21 04:53:55 +00:00
jenkins 75ccc6dda4 [ci skip] Changed by Jenkins: 2342
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-10-21 04:49:13 +00:00
jenkins e45ec785d7 [ci skip] Changed by Jenkins: 2341
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-10-21 04:44:43 +00:00
jenkins b067b50937 [ci skip] Changed by Jenkins: 2340
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-10-21 04:39:41 +00:00
jenkins 0c2e6364ac [ci skip] Changed by Jenkins: 2339
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-10-21 04:34:53 +00:00
jenkins b232fb2c8e [ci skip] Changed by Jenkins: 2338
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-10-21 04:31:22 +00:00
jenkins 4a19694c1a [ci skip] Changed by Jenkins: 2337
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-10-21 04:26:15 +00:00
jenkins af766abe54 [ci skip] Changed by Jenkins: 2336
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-10-21 04:21:18 +00:00
jenkins 6333d78eab [ci skip] Changed by Jenkins: 2335
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-10-21 04:17:52 +00:00
jenkins c06fe315d8 [ci skip] Changed by Jenkins: 2334
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-10-21 04:12:49 +00:00
jenkins bc1f44f0b7 [ci skip] Changed by Jenkins: 2333
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-10-21 04:07:54 +00:00
jenkins 95bb8da8b7 [ci skip] Changed by Jenkins: 2332
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-10-21 04:04:15 +00:00
jenkins 68f8ff9cdd [ci skip] Changed by Jenkins: 2331
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-10-21 03:59:23 +00:00
jenkins 9e122fefd3 [ci skip] Changed by Jenkins: 2330
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-10-21 03:54:27 +00:00
jenkins b47ead21be [ci skip] Changed by Jenkins: 2329
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-10-21 03:49:59 +00:00
jenkins ebe43c3b27 [ci skip] Changed by Jenkins: 2328
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-10-21 03:45:21 +00:00
jenkins 686084f5cf [ci skip] Changed by Jenkins: 2327
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-10-21 03:40:56 +00:00
jenkins 0abaf15101 [ci skip] Changed by Jenkins: 2326
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-10-21 03:36:07 +00:00
jenkins 9dd2b5cdb5 [ci skip] Changed by Jenkins: 2325
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-10-21 03:31:28 +00:00
jenkins 2246a98bbb [ci skip] Changed by Jenkins: 2324
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-10-21 03:27:46 +00:00
jenkins 6265b66baf [ci skip] Changed by Jenkins: 2323
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-10-21 03:22:24 +00:00
jenkins 5488206588 [ci skip] Changed by Jenkins: 2322
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-10-21 03:17:37 +00:00
jenkins b4f2042aa0 [ci skip] Changed by Jenkins: 2321
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-10-21 03:14:13 +00:00
jenkins 21dca2163b [ci skip] Changed by Jenkins: 2320
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-10-21 03:08:56 +00:00
jenkins 2bc02323ae [ci skip] Changed by Jenkins: 2319
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-10-21 03:03:55 +00:00
jenkins 8b073fb855 [ci skip] Changed by Jenkins: 2318
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-10-21 02:59:42 +00:00
jenkins 5d28b547a1 [ci skip] Changed by Jenkins: 2317
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-10-21 02:54:59 +00:00
jenkins f2407dc12a [ci skip] Changed by Jenkins: 2316
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-10-21 02:50:27 +00:00
jenkins f02b317cf4 [ci skip] Changed by Jenkins: 2315
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-10-21 02:45:35 +00:00
jenkins 270b774c33 [ci skip] Changed by Jenkins: 2314
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-10-21 02:40:55 +00:00
jenkins 864b72c82c [ci skip] Changed by Jenkins: 2313
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-10-21 02:37:12 +00:00
jenkins c5716b0102 [ci skip] Changed by Jenkins: 2312
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-10-21 02:32:04 +00:00
jenkins ad097121da [ci skip] Changed by Jenkins: 2311
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-10-21 02:27:18 +00:00
jenkins 79b33cff50 [ci skip] Changed by Jenkins: 2310
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-10-21 02:23:53 +00:00
jenkins e01417f3b3 [ci skip] Changed by Jenkins: 2309
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-10-21 02:18:28 +00:00
jenkins 68ffc6f7d9 [ci skip] Changed by Jenkins: 2308
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-10-21 02:13:18 +00:00
jenkins ef7cf410b9 [ci skip] Changed by Jenkins: 2307
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-10-21 02:08:49 +00:00
jenkins 151ba2563e [ci skip] Changed by Jenkins: 2306
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-10-21 02:04:04 +00:00
jenkins 78f4dca9a1 [ci skip] Changed by Jenkins: 2305
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-10-21 01:59:33 +00:00
jenkins 52bf963afd [ci skip] Changed by Jenkins: 2304
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-10-21 01:55:02 +00:00
jenkins e6cfb85b8e [ci skip] Changed by Jenkins: 2303
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-10-21 01:50:24 +00:00
jenkins 6576e7cb6d [ci skip] Changed by Jenkins: 2302
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-10-21 01:46:19 +00:00
jenkins 7d7528ab4c [ci skip] Changed by Jenkins: 2301
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-10-21 01:41:07 +00:00
jenkins 34a79ec833 [ci skip] Changed by Jenkins: 2300
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-10-21 01:36:14 +00:00
jenkins 6cd5b0e5d7 [ci skip] Changed by Jenkins: 2299
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-10-21 01:32:38 +00:00
jenkins 412ddc01d1 [ci skip] Changed by Jenkins: 2298
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-10-21 01:27:32 +00:00
jenkins 10edf0728b [ci skip] Changed by Jenkins: 2297
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-10-21 01:22:40 +00:00
jenkins 57189ce4df [ci skip] Changed by Jenkins: 2296
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-10-21 01:18:05 +00:00
jenkins e72f933014 [ci skip] Changed by Jenkins: 2295
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-10-21 01:13:27 +00:00
jenkins 782e7adb00 [ci skip] Changed by Jenkins: 2294
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-10-21 01:08:52 +00:00
jenkins 17b78476ee [ci skip] Changed by Jenkins: 2293
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-10-21 01:04:01 +00:00
jenkins 93630d5a09 [ci skip] Changed by Jenkins: 2292
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-10-21 00:59:21 +00:00
jenkins 79f09d0e0e [ci skip] Changed by Jenkins: 2291
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-10-21 00:55:15 +00:00
jenkins 02016eb404 [ci skip] Changed by Jenkins: 2290
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-10-21 00:50:40 +00:00
jenkins 59760ad201 [ci skip] Changed by Jenkins: 2289
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-10-21 00:45:44 +00:00
jenkins 6eca90abb6 [ci skip] Changed by Jenkins: 2288
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-10-21 00:41:31 +00:00
jenkins b853b4d3f7 [ci skip] Changed by Jenkins: 2287
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-10-21 00:36:19 +00:00
jenkins 6e815e3442 [ci skip] Changed by Jenkins: 2286
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-10-21 00:31:19 +00:00
jenkins befa82d0f6 [ci skip] Changed by Jenkins: 2285
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-10-21 00:27:12 +00:00
jenkins 5df0e6e423 [ci skip] Changed by Jenkins: 2284
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-10-21 00:22:27 +00:00
jenkins 669f93a327 [ci skip] Changed by Jenkins: 2283
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-10-21 00:17:41 +00:00
jenkins 73ff1fd47f [ci skip] Changed by Jenkins: 2282
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-10-21 00:13:28 +00:00
jenkins e07c3aeb3d [ci skip] Changed by Jenkins: 2281
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-10-21 00:08:48 +00:00
jenkins 700b29c3d1 [ci skip] Changed by Jenkins: 2280
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-10-21 00:04:17 +00:00
jenkins 0ffdbfd3ca [ci skip] Changed by Jenkins: 2279
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-10-20 23:58:42 +00:00
jenkins 756db80b77 [ci skip] Changed by Jenkins: 2278
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-10-20 23:53:53 +00:00
jenkins b2559be980 [ci skip] Changed by Jenkins: 2277
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-10-20 23:50:26 +00:00
jenkins a9754a8eff [ci skip] Changed by Jenkins: 2276
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-10-20 23:44:53 +00:00
jenkins d5961d4c96 [ci skip] Changed by Jenkins: 2275
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-10-20 23:40:03 +00:00
jenkins 56e35345fc [ci skip] Changed by Jenkins: 2274
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-10-20 23:36:15 +00:00
jenkins 9755f5a635 [ci skip] Changed by Jenkins: 2273
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-10-20 23:31:22 +00:00
jenkins 2ff1aff9f3 [ci skip] Changed by Jenkins: 2272
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-10-20 23:26:18 +00:00
jenkins 164ac7e3ad [ci skip] Changed by Jenkins: 2271
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-10-20 23:22:05 +00:00
jenkins 85a7e890bd [ci skip] Changed by Jenkins: 2270
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-10-20 23:17:20 +00:00
jenkins 8766293966 [ci skip] Changed by Jenkins: 2269
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-10-20 23:12:47 +00:00
jenkins d2cad491b9 [ci skip] Changed by Jenkins: 2268
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-10-20 23:08:14 +00:00
jenkins 16d2c6abae [ci skip] Changed by Jenkins: 2267
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-10-20 23:03:36 +00:00
jenkins a212b59d73 [ci skip] Changed by Jenkins: 2266
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-10-20 22:59:21 +00:00
jenkins 3574e34659 [ci skip] Changed by Jenkins: 2265
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-10-20 22:54:18 +00:00
jenkins 13704c6845 [ci skip] Changed by Jenkins: 2264
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-10-20 22:49:39 +00:00
jenkins bbe337d115 [ci skip] Changed by Jenkins: 2263
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-10-20 22:45:43 +00:00
jenkins e1b6e59b6a [ci skip] Changed by Jenkins: 2262
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-10-20 22:40:29 +00:00
jenkins 3685644888 [ci skip] Changed by Jenkins: 2261
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-10-20 22:35:31 +00:00
jenkins 050adcbc0f [ci skip] Changed by Jenkins: 2260
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-10-20 22:32:05 +00:00
jenkins 0a12005d5d [ci skip] Changed by Jenkins: 2259
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-10-20 22:26:59 +00:00
jenkins 8a4644049b [ci skip] Changed by Jenkins: 2258
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-10-20 22:21:55 +00:00
jenkins ca7e5e03be [ci skip] Changed by Jenkins: 2257
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-10-20 22:17:41 +00:00
jenkins a1ceabec47 [ci skip] Changed by Jenkins: 2256
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-10-20 22:13:00 +00:00
jenkins 917b875732 [ci skip] Changed by Jenkins: 2255
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-10-20 22:08:15 +00:00
jenkins 7df2004671 [ci skip] Changed by Jenkins: 2254
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-10-20 22:03:04 +00:00
jenkins c50a79d723 [ci skip] Changed by Jenkins: 2253
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-10-20 21:58:10 +00:00
jenkins 519d789281 [ci skip] Changed by Jenkins: 2252
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-10-20 21:54:40 +00:00
jenkins b5038e9661 [ci skip] Changed by Jenkins: 2251
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-10-20 21:49:31 +00:00
jenkins bab69698c6 [ci skip] Changed by Jenkins: 2250
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-10-20 21:44:35 +00:00
jenkins 5c6ea6a391 [ci skip] Changed by Jenkins: 2249
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-10-20 21:40:39 +00:00
jenkins 328edc396b [ci skip] Changed by Jenkins: 2248
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-10-20 21:35:40 +00:00
jenkins 9cd8b81149 [ci skip] Changed by Jenkins: 2247
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-10-20 21:30:57 +00:00
jenkins 80e1f8042e [ci skip] Changed by Jenkins: 2246
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-10-20 21:26:44 +00:00
jenkins 1a1bdb314e [ci skip] Changed by Jenkins: 2245
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-10-20 21:22:06 +00:00
jenkins 51ec1bd3b4 [ci skip] Changed by Jenkins: 2244
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-10-20 21:17:45 +00:00
jenkins c8440ca536 [ci skip] Changed by Jenkins: 2243
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-10-20 21:12:51 +00:00
jenkins 889d1b4f9e [ci skip] Changed by Jenkins: 2242
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-10-20 21:08:16 +00:00
jenkins 97b458e812 [ci skip] Changed by Jenkins: 2241
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-10-20 21:04:14 +00:00
jenkins 0378565b88 [ci skip] Changed by Jenkins: 2240
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-10-20 20:59:03 +00:00
jenkins 8ca8874707 [ci skip] Changed by Jenkins: 2239
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-10-20 20:53:57 +00:00
jenkins dc2772aabf [ci skip] Changed by Jenkins: 2238
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-10-20 20:50:45 +00:00
jenkins ce0e561a3f [ci skip] Changed by Jenkins: 2237
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-10-20 20:45:22 +00:00
jenkins ba9aab03a9 [ci skip] Changed by Jenkins: 2236
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-10-20 20:40:28 +00:00
jenkins f10686423d [ci skip] Changed by Jenkins: 2235
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-10-20 20:36:10 +00:00
jenkins c1688f68c2 [ci skip] Changed by Jenkins: 2234
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-10-20 20:31:07 +00:00
jenkins c916b2f155 [ci skip] Changed by Jenkins: 2233
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-10-20 20:26:38 +00:00
jenkins 5df9ac295d [ci skip] Changed by Jenkins: 2232
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-10-20 20:21:27 +00:00
jenkins 065a45dc98 [ci skip] Changed by Jenkins: 2231
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-10-20 20:16:45 +00:00
jenkins 6b66777699 [ci skip] Changed by Jenkins: 2230
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-10-20 20:13:16 +00:00
jenkins 9927ba0929 [ci skip] Changed by Jenkins: 2229
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-10-20 20:08:06 +00:00
jenkins a05a29703c [ci skip] Changed by Jenkins: 2228
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-10-20 20:03:14 +00:00
jenkins 76952cac67 [ci skip] Changed by Jenkins: 2227
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-10-20 20:00:11 +00:00
jenkins 9b27a997f3 [ci skip] Changed by Jenkins: 2226
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-10-20 19:55:10 +00:00
jenkins 014e3143fd [ci skip] Changed by Jenkins: 2225
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-10-20 19:49:25 +00:00
jenkins 7eaf1686e1 [ci skip] Changed by Jenkins: 2224
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-10-20 19:45:29 +00:00
jenkins d4bf2a6667 [ci skip] Changed by Jenkins: 2223
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-10-20 19:40:20 +00:00
jenkins 9d7cf637ee [ci skip] Changed by Jenkins: 2222
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-10-20 19:35:28 +00:00
jenkins 979f80ce89 [ci skip] Changed by Jenkins: 2221
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-10-20 19:31:06 +00:00
jenkins c677a9b639 [ci skip] Changed by Jenkins: 2220
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-10-20 19:26:28 +00:00
jenkins 9440b91d90 [ci skip] Changed by Jenkins: 2219
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-10-20 19:22:00 +00:00
jenkins 2b18167761 [ci skip] Changed by Jenkins: 2218
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-10-20 19:17:12 +00:00
jenkins da8b2f1d3a [ci skip] Changed by Jenkins: 2217
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-10-20 19:12:23 +00:00
jenkins 10e4e6abc6 [ci skip] Changed by Jenkins: 2216
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-10-20 19:08:42 +00:00
jenkins 6acfe7c32f [ci skip] Changed by Jenkins: 2215
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-10-20 19:03:43 +00:00
jenkins d08c1b2008 [ci skip] Changed by Jenkins: 2214
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-10-20 18:59:00 +00:00
jenkins a47e1d9a63 [ci skip] Changed by Jenkins: 2213
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-10-20 18:55:36 +00:00
jenkins 4187522739 [ci skip] Changed by Jenkins: 2212
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-10-20 18:50:18 +00:00
jenkins c0d0088f6e [ci skip] Changed by Jenkins: 2211
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-10-20 18:45:22 +00:00
jenkins d43dff3085 [ci skip] Changed by Jenkins: 2210
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-10-20 18:41:54 +00:00
jenkins 9a04e1f848 [ci skip] Changed by Jenkins: 2209
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-10-20 18:36:47 +00:00
jenkins 621773a6f1 [ci skip] Changed by Jenkins: 2208
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-10-20 18:32:05 +00:00
jenkins a9672c44bf [ci skip] Changed by Jenkins: 2207
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-10-20 18:28:14 +00:00
jenkins 155c212f89 [ci skip] Changed by Jenkins: 2206
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-10-20 18:22:58 +00:00
jenkins ee35c3f1b8 [ci skip] Changed by Jenkins: 2205
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-10-20 18:18:04 +00:00
jenkins 0a405f5515 [ci skip] Changed by Jenkins: 2204
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-10-20 18:13:42 +00:00
jenkins b618b7c40f [ci skip] Changed by Jenkins: 2203
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-10-20 18:09:03 +00:00
jenkins f10e68c4ad [ci skip] Changed by Jenkins: 2202
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-10-20 18:04:31 +00:00
jenkins 870c3c2c77 [ci skip] Changed by Jenkins: 2201
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-10-20 17:59:26 +00:00
jenkins 1559f15c7f [ci skip] Changed by Jenkins: 2200
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-10-20 17:54:47 +00:00
jenkins 96345e54fb [ci skip] Changed by Jenkins: 2199
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-10-20 17:51:16 +00:00
jenkins f61590c677 [ci skip] Changed by Jenkins: 2198
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-10-20 17:45:57 +00:00
jenkins 6f1ec4a17a [ci skip] Changed by Jenkins: 2197
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-10-20 17:41:02 +00:00
jenkins 786e9392b1 [ci skip] Changed by Jenkins: 2196
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-10-20 17:37:24 +00:00
jenkins f229c25b8f [ci skip] Changed by Jenkins: 2195
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-10-20 17:32:15 +00:00
jenkins 9bdd1ff35f [ci skip] Changed by Jenkins: 2194
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-10-20 17:27:09 +00:00
jenkins 4dd7a15b30 [ci skip] Changed by Jenkins: 2193
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-10-20 17:22:59 +00:00
jenkins a4aa7dbb7d [ci skip] Changed by Jenkins: 2192
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-10-20 17:17:51 +00:00
jenkins 681d2fe273 [ci skip] Changed by Jenkins: 2191
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-10-20 17:12:35 +00:00
peter 78b7ef44d9 Update Jenkinsfile.develop
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-10-20 12:20:03 +00:00
peter e19ca94653 Update Jenkinsfile 2023-10-20 12:19:52 +00:00
Willem Dantuma a85378374b kick version
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
FarmMaps/FarmMapsLib/pipeline/head This commit looks good
2023-10-18 19:35:01 +02:00
wilco 9e3f6010c3 Merge branch 'master' into develop
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
FarmMaps/FarmMapsLib/pipeline/head This commit looks good
# Conflicts:
#	package-lock.json
#	package.json
2023-10-05 16:27:20 +02:00
wilco e6a637b866 AW-5467 - Refresh geeft leeg scherm
FarmMaps/FarmMapsLib/pipeline/head This commit looks good
2023-10-05 11:23:18 +02:00
Willem Dantuma ccf77805a0 AW-5495
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-09-11 21:59:34 +02:00
peter 2b2e1bfafa Layout
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-08-25 11:07:21 +02:00
peter 3fd4ac2f94 error TS1068: Unexpected token. A constructor, method, accessor, or property was expected.
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-08-25 09:53:36 +02:00
peter 9849eaf1e7 AW1873 Labels -> show below zoom, overflow + format centroid
FarmMaps.Develop/FarmMapsLib/pipeline/head There was a failure building this commit
2023-08-25 09:50:38 +02:00
peter b516cc07e2 AW1873Bouwplanlabels
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-08-24 09:05:42 +02:00
peter c9c9a2ddbf AW1873Bouwplanlabels
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-08-23 16:34:18 +02:00
peter 1d0f3b958d AW1873Bouwplanlabels generalize
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-08-23 15:17:38 +02:00
peter 45537cb2e9 ------------------------------------------------------------------------------
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
Building entry point '@farmmaps/common-map'
------------------------------------------------------------------------------
- Compiling with Angular sources in Ivy partial compilation mode.
Processing legacy "View Engine" libraries:
- ngx-openlayers [es2015/esm2015] ()
Encourage the library authors to publish an Ivy distribution.
Browserslist: caniuse-lite is outdated. Please run:
  npx update-browserslist-db@latest
  Why you should do it regularly: https://github.com/browserslist/update-db#readme
✖ Compiling with Angular sources in Ivy partial compilation mode.
projects/common-map/src/fm-map/components/map/map.component.ts:371:83 - error TS2339: Property 'replaceUrl' does not exist on type '{ mapState: IMapState; queryState: IQueryState; }'.

371           this.replaceUrl(newUrlState.mapState,newUrlState.queryState,newUrlState.replaceUrl);
2023-08-22 18:55:16 +02:00
peter 652ddc0cdc AW1873Bouwplanlabels
FarmMaps.Develop/FarmMapsLib/pipeline/head There was a failure building this commit
2023-08-22 18:45:46 +02:00
peter fd3b331cc0 AW-5419 RxJs => versie 7.x
FarmMaps.Develop/FarmMapsLib/pipeline/head There was a failure building this commit
2023-08-22 13:37:16 +02:00
peter 9facbe76c8 AW1873Bouwplanlabels
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-08-22 13:16:37 +02:00
peter 20dff38cf7 AW1873 labels -> undefined/null fixes
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-08-21 16:59:54 +02:00
peter e374bb8a73 AW1873 labels
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-08-21 16:28:32 +02:00
peter 294b9c6dd3 kick version
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-08-09 10:17:50 +02:00
peter d92bf54c8d Revert "AW-2924 Cache codelists"
This reverts commit 914e272fc2.
2023-08-09 10:17:32 +02:00
peter 914e272fc2 AW-2924 Cache codelists
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
FarmMaps/FarmMapsLib/pipeline/head This commit looks good
2023-08-07 14:49:04 +02:00
Willem Dantuma b182b7fda6 Change select color
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-08-01 09:18:11 +02:00
Willem Dantuma 22040b43b3 fix selector naam
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-07-31 20:25:29 +02:00
Willem Dantuma 50170cf599 Fix selector name
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-07-31 20:19:47 +02:00
Willem Dantuma 2deff46a7e AW-5365 add selectViewGetExtent
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-07-31 20:07:22 +02:00
Willem Dantuma e939a787ba AW-5365 add tags parameter
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-07-31 19:36:57 +02:00
Willem Dantuma 4ae9562ce1 Kick version
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-07-31 19:22:14 +02:00
Willem Dantuma 288e507e6c AW-5365 add crs parameter
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-07-31 19:14:13 +02:00
peter d9848a8ba3 AW-5371 Release 2023.08 libraries
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
FarmMaps/FarmMapsLib/pipeline/head There was a failure building this commit
2023-07-30 10:53:08 +02:00
peter a9d42484cc jenkins
FarmMaps/FarmMapsLib/pipeline/head This commit looks good
2023-07-26 17:52:01 +02:00
peter a276593c7f Merge branch 'develop' 2023-07-26 17:45:32 +02:00
peter ff50650c28 fix jenkins
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-06-27 16:30:49 +02:00
peter d7efeb8d59 fix build
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-06-27 16:27:18 +02:00
peter fd71d1f38e no message
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-06-27 16:02:52 +02:00
peter bc8c9f8bf9 no message
FarmMaps.Develop/FarmMapsLib/pipeline/head There was a failure building this commit
2023-06-27 15:56:17 +02:00
mark 0865ca1a93 upped version
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-05-30 21:16:53 +02:00
mark 1bc3983f55 AW-5071 refactor some parts 2023-05-30 21:16:20 +02:00
peter 945d88839f AW-5036 404../api/v1/items/xxx:USER_SETTINGS (new environ)
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-05-08 09:12:37 +02:00
peter 7c06343909 Aw4951 Non-fatal error if no viewer defined for itemtype
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-04-21 09:08:38 +02:00
peter b8f8f27794 Comment logging
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-04-11 11:33:11 +02:00
peter 2a31771ac6 v3.1.0
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-03-28 13:38:35 +02:00
peter 3f17341b2e Revert "++version"
FarmMaps/FarmMapsLib/pipeline/head There was a failure building this commit
This reverts commit 6165f523cc.
2023-03-28 13:37:50 +02:00
peter 6165f523cc ++version
FarmMaps/FarmMapsLib/pipeline/head This commit looks good
2023-03-28 13:30:16 +02:00
peter 19dce51a28 Removed logging
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-03-28 13:26:37 +02:00
peter b29cd8e4c9 AW-4929 Add agrirouter font
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-03-28 12:20:27 +02:00
Willem Dantuma f2e265391c AW-4860
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
FarmMaps/FarmMapsLib/pipeline/head This commit looks good
2023-03-15 12:18:23 +01:00
Willem Dantuma 3c7adf012f Load profile after refresh
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-03-07 14:14:14 +01:00
peter 7c8c16362c Aw4751 Update interface
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-03-06 14:38:48 +01:00
peter 6555e68145 Aw4751 eslint fixes
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-03-06 14:04:14 +01:00
peter 945c641503 Add more authguard debug loggin'
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-03-06 10:29:43 +01:00
peter 60bc4c1a10 Add some authguard debug loggin'
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-03-03 08:40:12 +01:00
peter 7b42ca252b AW-4770 TSLint -> ESLint
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-03-02 12:02:52 +01:00
peter 9ef6c4d308 AW-4673 Fix ERROR Error: Uncaught (in promise): TypeError: ownedRoleClaims.findIndex is not a function
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-02-27 09:43:39 +01:00
Willem Dantuma ed7f7923ca revert openlayers
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-02-22 18:38:58 +01:00
Willem Dantuma 98142fab56 AW-4707
FarmMaps.Develop/FarmMapsLib/pipeline/head There was a failure building this commit
2023-02-22 18:14:52 +01:00
Willem Dantuma c460d31522 Update open layers 2023-02-22 17:32:59 +01:00
Willem Dantuma 4c5b89852b Fix issue
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-02-14 17:22:26 +01:00
Willem Dantuma fa90eaf1af Fix styles
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-02-14 16:52:46 +01:00
peter aeded938bd AW-4628 Add role-based security to authguard
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-02-10 15:30:35 +01:00
peter c61a4fe7f4 Aw4645 Add get item to admin service
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-02-09 17:33:27 +01:00
peter 8c3c40cfe6 Aw4645 Add admin service
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-02-09 14:09:47 +01:00
peter e6e10c835e AW-4641 Cleanup
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-02-08 11:36:54 +01:00
peter 07a87175b4 AW-4641 Add fmHasRole directive
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-02-08 11:25:00 +01:00
peter e9ace73ddd AW-4641 Fix copy claims from userinfo
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good
2023-02-08 09:25:13 +01:00
340 changed files with 26664 additions and 22677 deletions
+22
View File
@@ -0,0 +1,22 @@
module.exports = {
"env": {
"browser": true,
"es2021": true
},
"extends": [
"eslint:recommended",
"plugin:@typescript-eslint/recommended"
],
"overrides": [
],
"parser": "@typescript-eslint/parser",
"parserOptions": {
"ecmaVersion": "latest",
"sourceType": "module"
},
"plugins": [
"@typescript-eslint"
],
"rules": {
}
}
+4
View File
@@ -49,3 +49,7 @@ Thumbs.db
projects/common/node_modules/ projects/common/node_modules/
projects/common-map/node_modules/ projects/common-map/node_modules/
.angular/* .angular/*
projects/common-map3d/node_modules/
projects/common-map/node_modules/
projects/ng-openlayers/node_modules/
projects/common/node_modules/
Vendored
+12 -42
View File
@@ -1,54 +1,24 @@
@Library('farmmaps-shared-library') _
pipeline { pipeline {
agent any agent any;
environment { options {
PACKAGE_VERSION_PREFIX=sh(script: 'jq .version package.json |sed "s/\\"//g"', returnStdout: true).trim() copyArtifactPermission projectNames: env.allProjectsArtifactPermission;
PACKAGE_VERSION="${PACKAGE_VERSION_PREFIX}" disableConcurrentBuilds();
} }
stages { stages {
stage('npm install'){ stage('FarmmapsLibBuildAll') {
steps { steps {
sh '''rm -rf node_modules/ stepFarmmapsLibBuildAll();
npm install --legacy-peer-deps
cd projects/common
npm install --legacy-peer-deps
cd ../common-map
npm install --legacy-peer-deps
cd ../common-map3d
npm install --legacy-peer-deps
'''
} }
} }
stage('build'){
steps {
sh '''ng build common --configuration production
ng build common-map --configuration production
ng build common-map3d --configuration production'''
}
}
stage('npm publish'){
steps {
sh '''cd dist/common
npm version ${PACKAGE_VERSION} --allow-same-version
npm publish
cd ../common-map
npm version ${PACKAGE_VERSION} --allow-same-version
npm publish
cd ../common-map3d
npm version ${PACKAGE_VERSION} --allow-same-version
npm publish'''
}
}
} }
post { post {
success {
postSuccess();
}
always { always {
emailext ( postAlways();
body: '${DEFAULT_CONTENT}',
mimeType: 'text/html',
replyTo: '${DEFAULT_REPLYTO}',
subject: '${DEFAULT_SUBJECT}',
to: emailextrecipients([[$class: 'CulpritsRecipientProvider'], [$class: 'RequesterRecipientProvider']])
)
} }
} }
} }
+12 -42
View File
@@ -1,54 +1,24 @@
@Library('farmmaps-shared-library') _
pipeline { pipeline {
agent any agent any;
environment { options {
PACKAGE_VERSION_PREFIX=sh(script: 'jq .version package.json |sed "s/\\"//g"', returnStdout: true).trim() copyArtifactPermission projectNames: env.allProjectsArtifactPermission;
PACKAGE_VERSION="${PACKAGE_VERSION_PREFIX + '-prerelease.' + env.BUILD_NUMBER}" disableConcurrentBuilds();
} }
stages { stages {
stage('npm install'){ stage('FarmmapsLibBuildAll') {
steps { steps {
sh '''rm -rf node_modules/ stepFarmmapsLibBuildAll();
npm install --legacy-peer-deps
cd projects/common
npm install --legacy-peer-deps
cd ../common-map
npm install --legacy-peer-deps
cd ../common-map3d
npm install --legacy-peer-deps
'''
} }
} }
stage('build'){
steps {
sh '''ng build common --configuration production
ng build common-map --configuration production
ng build common-map3d --configuration production'''
}
}
stage('npm publish'){
steps {
sh '''cd dist/common
npm version ${PACKAGE_VERSION}
npm publish
cd ../common-map
npm version ${PACKAGE_VERSION}
npm publish
cd ../common-map3d
npm version ${PACKAGE_VERSION}
npm publish'''
}
}
} }
post { post {
success {
postSuccess();
}
always { always {
emailext ( postAlways();
body: '${DEFAULT_CONTENT}',
mimeType: 'text/html',
replyTo: '${DEFAULT_REPLYTO}',
subject: '${DEFAULT_SUBJECT}',
to: emailextrecipients([[$class: 'CulpritsRecipientProvider'], [$class: 'RequesterRecipientProvider']])
)
} }
} }
} }
+8 -3
View File
@@ -2,7 +2,6 @@
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.
@@ -51,9 +50,15 @@ npm install -g @angular/cli
npm install npm install
ng serve ng serve
``` ```
*Go* *Go*`
Point your browser to http://localhost:4200 Point your browser to http://localhost:4200
*ESLint*
```
npm run lint src
npm run lint projects/common/src
npm run lint projects/common-map/src
npm run lint projects/common-map3d/src
```
+70 -7
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": {
"browserTarget": "farmmaps-lib-app:build" "buildTarget": "farmmaps-lib-app:build"
} }
}, },
"test": { "test": {
@@ -209,13 +209,13 @@
"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": {
"production": {
"tsConfig": "projects/common-map/tsconfig.lib.prod.json"
}
} }
, "configurations": { },
"production": {
"tsConfig": "projects/common-map/tsconfig.lib.prod.json"
}
}
},
"test": { "test": {
"builder": "@angular-devkit/build-angular:karma", "builder": "@angular-devkit/build-angular:karma",
"options": { "options": {
@@ -253,9 +253,72 @@
} }
} }
} }
},
"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": "."
}
} }
} }
File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 73 KiB

After

Width:  |  Height:  |  Size: 143 KiB

Binary file not shown.
Binary file not shown.
Binary file not shown.
+11 -1
View File
@@ -51,7 +51,17 @@
content: "i"; content: "i";
} }
hallo .fm-carbon:before {
content: "j";
}
.fm-bo-akkerbouw:before {
content: "k";
}
.fm-grass:before {
content: "l";
}
@font-face { @font-face {
font-family: "FarmMaps"; font-family: "FarmMaps";
@@ -0,0 +1,224 @@
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
+13752 -19425
View File
File diff suppressed because it is too large Load Diff
+57 -38
View File
@@ -1,72 +1,83 @@
{ {
"name": "farmmaps-lib-app", "name": "farmmaps-lib-app",
"version": "3.0.1", "version": "4.19.0",
"scripts": { "scripts": {
"ng": "ng", "ng": "ng",
"start": "ng serve", "start": "ng serve",
"build": "ng build", "build": "ng build",
"test": "ng test", "test": "ng test",
"lint": "ng lint", "lint": "eslint -c .eslintrc.js --ext .ts",
"e2e": "ng e2e" "e2e": "ng e2e"
}, },
"private": true, "private": true,
"dependencies": { "dependencies": {
"@angular/animations": "^14.1.3", "@angular-eslint/eslint-plugin": "21.1.0",
"@angular/common": "^14.1.3", "@angular/animations": "21.1.0",
"@angular/compiler": "^14.1.3", "@angular/common": "21.1.0",
"@angular/core": "^14.1.3", "@angular/compiler": "21.1.0",
"@angular/forms": "^14.1.3", "@angular/core": "21.1.0",
"@angular/platform-browser": "^14.1.3", "@angular/forms": "21.1.0",
"@angular/platform-browser-dynamic": "^14.1.3", "@angular/platform-browser": "21.1.0",
"@angular/router": "^14.1.3", "@angular/platform-browser-dynamic": "21.1.0",
"@angular/router": "21.1.0",
"@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",
"@microsoft/signalr": "^3.1.16", "@farmmaps/ng-openlayers": "file:dist/ng-openlayers",
"@ng-bootstrap/ng-bootstrap": "^13.0.0", "@microsoft/signalr": "10.0.0",
"@ngrx/effects": "^14", "@ng-bootstrap/ng-bootstrap": "^20.0.0",
"@ngrx/router-store": "^14", "@ngrx/effects": "21.0.1",
"@ngrx/store": "^14", "@ngrx/router-store": "21.0.1",
"@popperjs/core": "^2.11.6", "@ngrx/store": "21.0.1",
"angular-oauth2-oidc": "^13", "@popperjs/core": "^2.11.8",
"angular-oauth2-oidc": "20.0.2",
"assert": "^2.0.0", "assert": "^2.0.0",
"bootstrap": "^5.2.0", "bootstrap": "5.3.8",
"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": "^14", "ngrx-store-localstorage": "20.1.0",
"ngx-avatar": "^4.1.0", "ngx-avatars": "1.10.1",
"ngx-clipboard": "^14.0.1", "ngx-clipboard": "^16.0.0",
"ngx-image-cropper": "^3.3.5", "ngx-image-cropper": "9.1.6",
"ngx-openlayers": "1.0.0-next.19", "ngx-uploadx": "7.0.1",
"ngx-uploadx": "^5.2.0", "ol": "^8.2.0",
"ol": "6.14.1",
"olcs": "^2.13.1", "olcs": "^2.13.1",
"resumablejs": "^1.1.0", "resumablejs": "^1.1.0",
"rxjs": "^6.6.7", "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.11.4" "zone.js": "~0.15.1"
},
"optionalDependencies": {
"@lmdb/lmdb-linux-x64": "^3.1.0",
"@rollup/rollup-linux-x64-gnu": "^4.21.2"
}, },
"devDependencies": { "devDependencies": {
"@angular-builders/custom-webpack": "^14", "@angular-builders/custom-webpack": "^21.0.3",
"@angular-devkit/build-angular": "^14.1.3", "@angular-devkit/build-angular": "21.1.0",
"@angular/cli": "^14.1.3", "@angular/cli": "21.1.0",
"@angular/compiler-cli": "^14.1.3", "@angular/compiler-cli": "21.1.0",
"@angular/language-service": "^14.1.3", "@angular/language-service": "21.1.0",
"@angular/localize": "^14.1.3", "@angular/localize": "21.1.0",
"@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": "^12.20.15", "@types/node": "^22.5.4",
"codelyzer": "^0.0.28", "@typescript-eslint/eslint-plugin": "^6.18.0",
"@typescript-eslint/eslint-plugin-tslint": "^6.18.0",
"@typescript-eslint/parser": "^6.18.0",
"codelyzer": "^6.0.2",
"eslint": "^8.35.0",
"eslint-config-prettier": "^8.6.0",
"eslint-plugin-import": "^2.27.5",
"jasmine-core": "^4.3.0", "jasmine-core": "^4.3.0",
"jasmine-spec-reporter": "^7.0.0", "jasmine-spec-reporter": "^7.0.0",
"karma": "^6.3.20", "karma": "^6.3.20",
@@ -74,10 +85,18 @@
"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": "^14.1.0", "ng-packagr": "^21.1.0",
"protractor": "~7.0.0", "protractor": "~7.0.0",
"ts-node": "^8.8.1", "ts-node": "^8.8.1",
"tslint": "~6.1.0", "typescript": "~5.9.3"
"typescript": "~4.6.4" },
"overrides": {
"ngx-avatars": {
"@angular/common": "$@angular/common",
"@angular/core": "$@angular/core"
},
"ngx-uploadx": {
"@angular/core": "$@angular/core"
}
} }
} }
+22
View File
@@ -0,0 +1,22 @@
module.exports = {
"env": {
"browser": true,
"es2021": true
},
"extends": [
"eslint:recommended",
"plugin:@typescript-eslint/recommended"
],
"overrides": [
],
"parser": "@typescript-eslint/parser",
"parserOptions": {
"ecmaVersion": "latest",
"sourceType": "module"
},
"plugins": [
"@typescript-eslint"
],
"rules": {
}
}
+281 -7
View File
@@ -1,13 +1,287 @@
{ {
"name": "@farmmaps/common-map", "name": "@farmmaps/common-map",
"version": "0.0.1", "version": "2.0.0",
"lockfileVersion": 1, "lockfileVersion": 3,
"requires": true, "requires": true,
"dependencies": { "packages": {
"tslib": { "": {
"version": "2.0.1", "name": "@farmmaps/common-map",
"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.1.tgz", "version": "2.0.0",
"integrity": "sha512-SgIkNheinmEBgx1IUNirK0TUD4X9yjjBRTqqjggWCU3pUEqIk3/Uwl3yRixYKT6WjQuGiwDv4NomL3wqRCj+CQ==" "dependencies": {
"tslib": "^2.0.0"
},
"peerDependencies": {
"@angular/core": "21.1.0",
"@farmmaps/common": "file:../../dist/common",
"@farmmaps/ng-openlayers": "file:../../dist/ng-openlayers",
"@ngrx/effects": "21.0.1",
"@ngrx/router-store": "21.0.1",
"@ngrx/store": "21.0.1",
"ngrx-store-localstorage": "20.1.0",
"rxjs": "7.8.1",
"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": {
"version": "2.7.0",
"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.7.0.tgz",
"integrity": "sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA=="
} }
} }
} }
+9 -8
View File
@@ -8,13 +8,14 @@
"tslib": "^2.0.0" "tslib": "^2.0.0"
}, },
"peerDependencies": { "peerDependencies": {
"@angular/core": ">=14.0.0", "@angular/core": "21.1.0",
"ngrx-store-localstorage": ">=14.0.0", "@farmmaps/common": "file:../../dist/common",
"@ngrx/effects": ">=14.0.0", "@farmmaps/ng-openlayers": "file:../../dist/ng-openlayers",
"@ngrx/router-store":">=14.0.0", "ngrx-store-localstorage": "20.1.0",
"@ngrx/store":">=14.0.0", "@ngrx/effects": "21.0.1",
"tassign": ">=1.0.0", "@ngrx/router-store": "21.0.1",
"ngx-openlayers": ">=1.0.0-next.19", "@ngrx/store": "21.0.1",
"ol": ">=6.8.1" "tassign": "^1.0.0",
"rxjs": "7.8.1"
} }
} }
@@ -18,6 +18,7 @@ export const SETPARENT = '[Map] SetParent';
export const SETPERIOD = '[Map] SetPeriod'; export const SETPERIOD = '[Map] SetPeriod';
export const STARTSEARCH = '[Map] StartSearch'; export const STARTSEARCH = '[Map] StartSearch';
export const STARTSEARCHSUCCESS = '[Map] StartSearchSuccess'; export const STARTSEARCHSUCCESS = '[Map] StartSearchSuccess';
export const CLICKFEATURE = '[Map] ClickFeature';
export const SELECTFEATURE = '[Map] SelectFeature'; export const SELECTFEATURE = '[Map] SelectFeature';
export const SELECTITEM = '[Map] SelectItem'; export const SELECTITEM = '[Map] SelectItem';
export const SELECTITEMSUCCESS = '[Map] SelectItemSuccess'; export const SELECTITEMSUCCESS = '[Map] SelectItemSuccess';
@@ -56,7 +57,10 @@ export const GETLAYERVALUE = '[Map] GetLayerValue'
export const GETLAYERVALUESUCCESS = '[Map] GetLayerValueSuccess' export const GETLAYERVALUESUCCESS = '[Map] GetLayerValueSuccess'
export const TOGGLESHOWDATALAYERSLIDE = '[Map] ToggleShowDataLayerSlide' export const TOGGLESHOWDATALAYERSLIDE = '[Map] ToggleShowDataLayerSlide'
export const SETVIEWSTATE = '[Map] SetViewState' export const SETVIEWSTATE = '[Map] SetViewState'
export const CLEARFEATURES = '[Map] ClearFeatures';
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;
@@ -111,6 +115,12 @@ export class StartSearchSuccess implements Action {
constructor(public features: Array<Feature<Geometry>>, public query:IQueryState) { } constructor(public features: Array<Feature<Geometry>>, public query:IQueryState) { }
} }
export class ClickFeature implements Action {
readonly type = CLICKFEATURE;
constructor(public feature:Feature<Geometry>) { }
}
export class SelectFeature implements Action { export class SelectFeature implements Action {
readonly type = SELECTFEATURE; readonly type = SELECTFEATURE;
@@ -292,7 +302,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>>) { } constructor(public features: Array<Feature<Geometry>>, public zoomToExtent: boolean = true) { }
} }
export class SetLayerValuesLocation implements Action { export class SetLayerValuesLocation implements Action {
@@ -329,12 +339,33 @@ export class SetViewState implements Action {
constructor(public enabled:boolean) {} constructor(public enabled:boolean) {}
} }
export class ClearFeatures implements Action {
readonly type = CLEARFEATURES;
constructor() {}
}
export class SetPanelExtraWide implements Action {
readonly type = SETPANELEXTRAWIDE;
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
| SetParent | SetParent
| StartSearch | StartSearch
| StartSearchSuccess | StartSearchSuccess
| ClickFeature
| SelectFeature | SelectFeature
| SelectItem | SelectItem
| SelectItemSuccess | SelectItemSuccess
@@ -374,5 +405,9 @@ export type Actions = SetMapState
| GetLayerValue | GetLayerValue
| SetPeriod | SetPeriod
| ToggleShowDataLayerSlide | ToggleShowDataLayerSlide
| SetViewState; | SetViewState
| ClearFeatures
| SetPanelExtraWide
| BackupFeatures
| RestoreFeatures;
@@ -1,91 +1,92 @@
import { NgModule ,ModuleWithProviders} from '@angular/core';
import { CommonModule } from '@angular/common'; import { CommonModule } from '@angular/common';
import { NgModule } from '@angular/core';
import { FormsModule, ReactiveFormsModule } from '@angular/forms'; import { FormsModule, ReactiveFormsModule } from '@angular/forms';
//external modules //external modules
import { AngularOpenlayersModule } from 'ngx-openlayers';
import { StoreModule, ActionReducer, MetaReducer } from '@ngrx/store';
import { EffectsModule } from '@ngrx/effects';
import { NgbModule } from "@ng-bootstrap/ng-bootstrap"; import { NgbModule } from "@ng-bootstrap/ng-bootstrap";
import { EffectsModule } from '@ngrx/effects';
import { ActionReducer, MetaReducer, StoreModule } from '@ngrx/store';
import { AngularOpenlayersModule } from '@farmmaps/ng-openlayers';
//common modules //common modules
import { AppCommonModule } from '@farmmaps/common'; import { AppCommonModule } from '@farmmaps/common';
import { MODULE_NAME } from './module-name';
import * as mapReducers from './reducers/map.reducer';
import * as mapActions from './actions/map.actions'; import * as mapActions from './actions/map.actions';
import * as mapEffects from './effects/map.effects'; import * as mapEffects from './effects/map.effects';
import { MODULE_NAME } from './module-name';
import * as mapReducers from './reducers/map.reducer';
import { IMapState} from './models/map.state';
import { ISelectedFeatures } from './models/selected.features';
import { IItemLayer,ItemLayer,ITemporalItemLayer,TemporalItemLayer } from './models/item.layer';
import { IClickedFeature } from './models/clicked.feature'; import { IClickedFeature } from './models/clicked.feature';
import { IItemLayer, ItemLayer, ITemporalItemLayer, TemporalItemLayer } from './models/item.layer';
import { IMapState } from './models/map.state';
import { IPeriodState } from './models/period.state'; import { IPeriodState } from './models/period.state';
import { ISelectedFeatures } from './models/selected.features';
// components // components
import { GpsLocation} from './components/aol/gps-location/gps-location.component'; import { MapRoutingModule } from './common-map-routing.module';
import {FeatureListFeatureCropfieldComponent } from './components/feature-list-feature-cropfield/feature-list-feature-cropfield.component';
import { FeatureListFeatureCroppingschemeComponent} from './components/feature-list-feature-croppingscheme/feature-list-feature-croppingscheme.component';
import { ItemWidgetListComponent} from './components/item-widget-list/item-widget-list.component';
import { AbstractItemListItemComponent, ItemListItemComponent, AbstractItemWidgetComponent } from './components/item-list-item/item-list-item.component';
import { ItemListItemContainerComponent } from './components/item-list-item-container/item-list-item-container.component';
import { AbstractItemListComponent,ItemListComponent} from './components/item-list/item-list.component';
import { AbstractSelectedItemComponent, SelectedItemComponent } from './components/selected-item/selected-item.component';
import { SelectedItemCropfieldComponent } from './components/selected-item-cropfield/selected-item-cropfield.component';
import { SelectedItemGeotiffComponent } from './components/selected-item-geotiff/selected-item-geotiff.component';
import { SelectedItemTemporalComponent} from './components/selected-item-temporal/selected-item-temporal.component';
import {SelectedItemShapeComponent } from './components/selected-item-shape/selected-item-shape.component';
import { SelectedItemContainerComponent } from './components/selected-item-container/selected-item-container.component';
import { AbstractFeatureListFeatureComponent, FeatureListFeatureComponent } from './components/feature-list-feature/feature-list-feature.component';
import {FeatureListFeatureContainerComponent } from './components/feature-list-feature-container/feature-list-feature-container.component';
import { FeatureListCroppingschemeComponent } from './components/feature-list-croppingscheme/feature-list-croppingscheme.component';
import {FeatureListCropfieldComponent } from './components/feature-list-cropfield/feature-list-cropfield.component';
import {FeatureListContainerComponent } from './components/feature-list-container/feature-list-container.component';
import { WidgetHostDirective} from './components/widget-host/widget-host.directive';
import { FeatureListComponent,AbstractFeatureListComponent} from './components/feature-list/feature-list.component';
import { FileDropTargetComponent } from './components/aol/file-drop-target/file-drop-target.component'; import { FileDropTargetComponent } from './components/aol/file-drop-target/file-drop-target.component';
import { ItemVectorSourceComponent } from './components/aol/item-vector-source/item-vector-source.component'; import { GpsLocation } from './components/aol/gps-location/gps-location.component';
import { ItemLayersComponent } from './components/aol/item-layers/item-layers.component'; import { ItemLayersComponent } from './components/aol/item-layers/item-layers.component';
import { ZoomToExtentComponent } from './components/aol/zoom-to-extent/zoom-to-extent.component'; import { ItemVectorSourceComponent } from './components/aol/item-vector-source/item-vector-source.component';
import { RotationResetComponent } from './components/aol/rotation-reset/rotation-reset.component';
import { LayerListComponent } from './components/aol/layer-list/layer-list.component'; import { LayerListComponent } from './components/aol/layer-list/layer-list.component';
import { LayerValuesComponent } from './components/aol/layer-values/layer-values.component';
import { LayerVectorImageComponent } from './components/aol/layer-vector-image/layer-vector-image.component';
import { PanToLocation } from './components/aol/pan-to-location/pan-to-location.component';
import { RotationResetComponent } from './components/aol/rotation-reset/rotation-reset.component';
import { ZoomToExtentComponent } from './components/aol/zoom-to-extent/zoom-to-extent.component';
import { FeatureListContainerComponent } from './components/feature-list-container/feature-list-container.component';
import { FeatureListCropfieldComponent } from './components/feature-list-cropfield/feature-list-cropfield.component';
import { 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 { FeatureListFeatureCroppingschemeComponent } from './components/feature-list-feature-croppingscheme/feature-list-feature-croppingscheme.component';
import { AbstractFeatureListFeatureComponent, FeatureListFeatureComponent } from './components/feature-list-feature/feature-list-feature.component';
import { AbstractFeatureListComponent, FeatureListComponent } from './components/feature-list/feature-list.component';
import { GeometryThumbnailComponent } from './components/feature-thumbnail/feature-thumbnail.component';
import { ForChild } from './components/for-item/for-child.decorator';
import { ForItemType } from './components/for-item/for-itemtype.decorator';
import { ForPackage } from './components/for-item/for-package.decorator';
import { ForSourceTask } from './components/for-item/for-sourcetask.decorator';
import { ifZoomToShowDirective } from './components/if-zoom-to-show/if-zoom-to-show.directive';
import { ItemListItemContainerComponent } from './components/item-list-item-container/item-list-item-container.component';
import { AbstractItemListItemComponent, AbstractItemWidgetComponent, ItemListItemComponent } from './components/item-list-item/item-list-item.component';
import { AbstractItemListComponent, ItemListComponent } from './components/item-list/item-list.component';
import { ItemWidgetListComponent } from './components/item-widget-list/item-widget-list.component';
import { LayerSwitcher } from './components/layer-switcher/layer-switcher.component';
import { HistogramDetailsComponent } from './components/legend/histogram-details/histogram-details.component';
import { LegendComponent } from './components/legend/legend.component';
import { StatisticsDetailsComponent } from './components/legend/statistics-details/statistics-details.component';
import { MapSearchComponent } from './components/map-search/map-search.component';
import { MapComponent } from './components/map/map.component';
import { MetaDataModalComponent } from './components/meta-data-modal/meta-data-modal.component'; import { MetaDataModalComponent } from './components/meta-data-modal/meta-data-modal.component';
import { SelectPeriodModalComponent } from './components/select-period-modal/select-period-modal.component'; import { SelectPeriodModalComponent } from './components/select-period-modal/select-period-modal.component';
import { MapComponent } from './components/map/map.component'; import { SelectedItemContainerComponent } from './components/selected-item-container/selected-item-container.component';
import { MapSearchComponent } from './components/map-search/map-search.component'; import { SelectedItemCropfieldComponent } from './components/selected-item-cropfield/selected-item-cropfield.component';
import { MapRoutingModule } from './common-map-routing.module'; import { SelectedItemGeotiffComponent } from './components/selected-item-geotiff/selected-item-geotiff.component';
import { LegendComponent } from './components/legend/legend.component'; import { SelectedItemShapeComponent } from './components/selected-item-shape/selected-item-shape.component';
import { LayerVectorImageComponent } from './components/aol/layer-vector-image/layer-vector-image.component'; import { SelectedItemTemporalComponent } from './components/selected-item-temporal/selected-item-temporal.component';
import {FeatureIconService} from './services/feature-icon.service'; import { AbstractSelectedItemComponent, SelectedItemComponent } from './components/selected-item/selected-item.component';
import { GeolocationService } from './services/geolocation.service'; import { WidgetHostDirective } from './components/widget-host/widget-host.directive';
import {DeviceOrientationService} from './services/device-orientation.service';
import { TemporalService} from './services/temporal.service';
import { WidgetStatusComponent } from './components/widget-status/widget-status.component'; import { WidgetStatusComponent } from './components/widget-status/widget-status.component';
import { ForChild} from './components/for-item/for-child.decorator'; import { ZoomToShowAlert } from './components/zoom-to-show-alert/zoom-to-show-alert.component';
import {ForItemType } from './components/for-item/for-itemtype.decorator'; import { DeviceOrientationService } from './services/device-orientation.service';
import { ForSourceTask} from './components/for-item/for-sourcetask.decorator'; import { FeatureIconService } from './services/feature-icon.service';
import { ForPackage } from './components/for-item/for-package.decorator'; import { GeolocationService } from './services/geolocation.service';
import { PanToLocation} from './components/aol/pan-to-location/pan-to-location.component'; import { TemporalService } from './services/temporal.service';
import {LayerSwitcher} from './components/layer-switcher/layer-switcher.component';
import {HistogramDetailsComponent} from './components/legend/histogram-details/histogram-details.component';
import {StatisticsDetailsComponent} from './components/legend/statistics-details/statistics-details.component';
import { ifZoomToShowDirective} from './components/if-zoom-to-show/if-zoom-to-show.directive';
import { ZoomToShowAlert} from './components/zoom-to-show-alert/zoom-to-show-alert.component';
import { LayerValuesComponent } from './components/aol/layer-values/layer-values.component';
import { GeometryThumbnailComponent } from './components/feature-thumbnail/feature-thumbnail.component';
export function LocalStorageSync(reducer: ActionReducer<any>): ActionReducer<any> { export function LocalStorageSync(reducer: ActionReducer<any>): ActionReducer<any> {
const r = function(state, action) { const r = function(state, action) {
const r2 = reducer(state, action); const r2 = reducer(state, action);
if(action.type == "@ngrx/store/update-reducers") { if(action.type == "@ngrx/store/update-reducers") {
let ms = window.localStorage.getItem(MODULE_NAME+"_mapState"); const ms = window.localStorage.getItem(MODULE_NAME+"_mapState");
if(ms) { if(ms) {
r2["mapState"] = JSON.parse(ms); r2["mapState"] = JSON.parse(ms);
} }
let sp = window.localStorage.getItem(MODULE_NAME+"_searchPeriod"); const sp = window.localStorage.getItem(MODULE_NAME+"_searchPeriod");
if(sp) { if(sp) {
let p = JSON.parse(sp); const p = JSON.parse(sp);
r2["period"] = { startDate: new Date(Date.parse(p.startDate)),endDate:new Date(Date.parse(p.endDate))}; r2["period"] = { startDate: new Date(Date.parse(p.startDate)),endDate:new Date(Date.parse(p.endDate))};
} }
} }
@@ -104,70 +105,13 @@ export function LocalStorageSync(reducer: ActionReducer<any>): ActionReducer<any
const metaReducers: Array<MetaReducer<any, any>> = [LocalStorageSync]; const metaReducers: Array<MetaReducer<any, any>> = [LocalStorageSync];
export { export {
mapEffects,
mapReducers,
mapActions,
ZoomToExtentComponent,
ItemVectorSourceComponent,
ItemLayersComponent,
FileDropTargetComponent,
MapComponent,
MetaDataModalComponent,
RotationResetComponent,
MapSearchComponent,
SelectPeriodModalComponent,
LayerListComponent,
LegendComponent,
LayerVectorImageComponent,
FeatureListComponent,
WidgetHostDirective,
FeatureListContainerComponent,
FeatureListCroppingschemeComponent,
FeatureListCropfieldComponent,
FeatureListFeatureContainerComponent,
FeatureListFeatureComponent,
FeatureListFeatureCroppingschemeComponent,
FeatureListFeatureCropfieldComponent,
SelectedItemContainerComponent,
SelectedItemComponent,
SelectedItemCropfieldComponent,
SelectedItemGeotiffComponent,
SelectedItemTemporalComponent,
SelectedItemShapeComponent,
ItemListItemComponent,
ItemListItemContainerComponent,
ItemListComponent,
ItemWidgetListComponent,
WidgetStatusComponent,
GpsLocation,
PanToLocation,
LayerSwitcher,
AbstractFeatureListComponent, AbstractFeatureListComponent,
AbstractFeatureListFeatureComponent, AbstractFeatureListFeatureComponent, AbstractItemListComponent, AbstractItemListItemComponent, AbstractItemWidgetComponent, AbstractSelectedItemComponent, DeviceOrientationService, FeatureIconService, FeatureListComponent, FeatureListContainerComponent, FeatureListCropfieldComponent, FeatureListObservationComponent, FeatureListCroppingschemeComponent, FeatureListFeatureComponent, FeatureListFeatureContainerComponent, FeatureListFeatureCropfieldComponent, FeatureListFeatureCroppingschemeComponent, FileDropTargetComponent, ForChild,
AbstractSelectedItemComponent, ForItemType, ForPackage, ForSourceTask, GeolocationService, GeometryThumbnailComponent, GpsLocation, IClickedFeature, ifZoomToShowDirective, IItemLayer, IMapState, IPeriodState, ISelectedFeatures, ItemLayer, ItemLayersComponent, ItemListComponent, ItemListItemComponent,
AbstractItemWidgetComponent, ItemListItemContainerComponent, ITemporalItemLayer, ItemVectorSourceComponent, ItemWidgetListComponent, LayerListComponent, LayerSwitcher, LayerVectorImageComponent, LegendComponent, mapActions, MapComponent, mapEffects,
AbstractItemListItemComponent, mapReducers, MapSearchComponent, MetaDataModalComponent, PanToLocation, RotationResetComponent, SelectedItemComponent, SelectedItemContainerComponent, SelectedItemCropfieldComponent,
AbstractItemListComponent, SelectedItemGeotiffComponent, SelectedItemShapeComponent, SelectedItemTemporalComponent, SelectPeriodModalComponent, TemporalItemLayer, TemporalService, WidgetHostDirective, WidgetStatusComponent, ZoomToExtentComponent, ZoomToShowAlert
FeatureIconService, };
GeolocationService,
DeviceOrientationService,
TemporalService,
IMapState,
ISelectedFeatures,
IItemLayer,
ItemLayer,
IPeriodState,
ForChild,
ForItemType,
ForSourceTask,
ForPackage ,
ITemporalItemLayer,
TemporalItemLayer,
ifZoomToShowDirective,
ZoomToShowAlert,
IClickedFeature,
GeometryThumbnailComponent
}
@NgModule({ @NgModule({
imports: [ imports: [
@@ -199,6 +143,7 @@ export {
FeatureListContainerComponent, FeatureListContainerComponent,
FeatureListCroppingschemeComponent, FeatureListCroppingschemeComponent,
FeatureListCropfieldComponent, FeatureListCropfieldComponent,
FeatureListObservationComponent,
FeatureListFeatureContainerComponent, FeatureListFeatureContainerComponent,
FeatureListFeatureComponent, FeatureListFeatureComponent,
FeatureListFeatureCroppingschemeComponent, FeatureListFeatureCroppingschemeComponent,
@@ -258,6 +203,7 @@ export {
FeatureListContainerComponent, FeatureListContainerComponent,
FeatureListCroppingschemeComponent, FeatureListCroppingschemeComponent,
FeatureListCropfieldComponent, FeatureListCropfieldComponent,
FeatureListObservationComponent,
FeatureListFeatureContainerComponent, FeatureListFeatureContainerComponent,
ZoomToExtentComponent, ZoomToExtentComponent,
ifZoomToShowDirective, ifZoomToShowDirective,
@@ -271,6 +217,7 @@ 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 },
@@ -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 'ngx-openlayers'; import { MapComponent } from '@farmmaps/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';
@@ -14,8 +14,9 @@ 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;
@@ -28,7 +29,7 @@ export class FileDropTargetComponent implements OnInit, OnDestroy {
ngOnInit() { ngOnInit() {
this.element = this.map.instance.getViewport(); this.element = this.map.instance.getViewport();
let other = this; const other = this;
this.element.addEventListener('drop', this.onDrop, false); this.element.addEventListener('drop', this.onDrop, false);
this.element.addEventListener('dragover', this.preventDefault, false); this.element.addEventListener('dragover', this.preventDefault, false);
this.element.addEventListener('dragenter', this.preventDefault, false); this.element.addEventListener('dragenter', this.preventDefault, false);
@@ -36,20 +37,20 @@ export class FileDropTargetComponent implements OnInit, OnDestroy {
private onDrop = (event: DragEvent) => { private onDrop = (event: DragEvent) => {
this.stopEvent(event); this.stopEvent(event);
let geojsonFormat = new GeoJSON(); const geojsonFormat = new GeoJSON();
var parentCode = this.parentCode; let parentCode = this.parentCode;
var coordinate = this.map.instance.getEventCoordinate(event); const coordinate = this.map.instance.getEventCoordinate(event);
//coordinate = proj.transform(coordinate, this.map.instance.getView().getProjection(), 'EPSG:4326'); //coordinate = proj.transform(coordinate, this.map.instance.getView().getProjection(), 'EPSG:4326');
var geometry:Geometry = new Point(coordinate); let geometry:Geometry = new Point(coordinate);
var hitFeatures = this.map.instance.getFeaturesAtPixel([event.pageX, event.pageY]); const hitFeatures = this.map.instance.getFeaturesAtPixel([event.pageX, event.pageY]);
var hitFeature = hitFeatures && hitFeatures.length > 0 ? hitFeatures[0] : null; const hitFeature = hitFeatures && hitFeatures.length > 0 ? hitFeatures[0] : null;
if (hitFeature) { if (hitFeature) {
if (hitFeature.get("code")) { if (hitFeature.get("code")) {
parentCode = hitFeature.get("code"); parentCode = hitFeature.get("code");
} }
geometry = geojsonFormat.readGeometry(geojsonFormat.writeGeometry(geometry)); // create copy instead of reference geometry = geojsonFormat.readGeometry(geojsonFormat.writeGeometry(geometry)); // create copy instead of reference
} }
var projectedGeometry = geometry.transform(this.map.instance.getView().getProjection(), 'EPSG:4326'); const projectedGeometry = geometry.transform(this.map.instance.getView().getProjection(), 'EPSG:4326');
if (event.dataTransfer && event.dataTransfer.files) { if (event.dataTransfer && event.dataTransfer.files) {
this.onFileDropped.emit({ files: event.dataTransfer.files, event: event, geometry: JSON.parse(geojsonFormat.writeGeometry(projectedGeometry)),parentCode:parentCode}) this.onFileDropped.emit({ files: event.dataTransfer.files, event: event, geometry: JSON.parse(geojsonFormat.writeGeometry(projectedGeometry)),parentCode:parentCode})
@@ -1,6 +1,3 @@
@import "~bootstrap/scss/bootstrap.scss";
.gps-location { .gps-location {
display:none; display:none;
} }
@@ -14,7 +11,7 @@
} }
.tolerance { .tolerance {
fill: $primary; fill: var(--bs-primary);
fill-opacity:0.4; fill-opacity:0.4;
} }
@@ -23,20 +20,20 @@
} }
.border { .border {
fill: $white; fill: var(--bs-white);
} }
.center { .center {
fill: $primary; fill: var(--bs-primary);
} }
.stop1 { .stop1 {
stop-color: $primary; stop-color: var(--bs-primary);
stop-opacity:1; stop-opacity:1;
} }
.stop2 { .stop2 {
stop-color:$primary; stop-color:var(--bs-primary);
stop-opacity: 0; stop-opacity: 0;
} }
@@ -1,13 +1,14 @@
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 'ngx-openlayers'; import { MapComponent } from '@farmmaps/ng-openlayers';
import Overlay from 'ol/Overlay'; import Overlay from 'ol/Overlay';
import { fromLonLat, toLonLat } from 'ol/proj'; 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{
@@ -15,16 +16,16 @@ export class GpsLocation implements OnInit,OnChanges{
public instance: Overlay; public instance: Overlay;
@Input() position: GeolocationPosition; @Input() position: GeolocationPosition;
@Input() location: number[]=[0,0]; @Input() location: number[]=[0,0];
@Input() locationTolerance: number = 0; @Input() locationTolerance = 0;
@Input() showHeading: boolean = false; @Input() showHeading = false;
@Input() showTolerance: boolean = false; @Input() showTolerance = false;
@Input() heading: number = 0; @Input() heading = 0;
@Input() headingTolerance: number = 0; @Input() headingTolerance = 0;
public locTolerancePixels: number = 0; public locTolerancePixels = 0;
public path: string = ""; public path = "";
public rotate: string = ""; public rotate = "";
private resolution: number = 0; private resolution = 0;
initialized:boolean = false; initialized = false;
@ViewChild('location', { static: true }) locationElement: ElementRef; @ViewChild('location', { static: true }) locationElement: ElementRef;
constructor(private map: MapComponent) { constructor(private map: MapComponent) {
@@ -42,12 +43,12 @@ export class GpsLocation implements OnInit,OnChanges{
position: fromLonLat( this.location), position: fromLonLat( this.location),
element: this.locationElement.nativeElement element: this.locationElement.nativeElement
}); });
var x = Math.tan(this.headingTolerance * Math.PI / 180)*40; const x = Math.tan(this.headingTolerance * Math.PI / 180)*40;
var y = Math.cos(this.headingTolerance * Math.PI / 180) * 40; const y = Math.cos(this.headingTolerance * Math.PI / 180) * 40;
var y1 = Math.round(500 - y); const y1 = Math.round(500 - y);
var x1 = Math.round(500 - x); const x1 = Math.round(500 - x);
var y2 = Math.round(y1); const y2 = Math.round(y1);
var x2 = Math.round(500 + x); const x2 = Math.round(500 + x);
this.path = "M " + x2 + " " + y2 + " A 45 45,0,0,0, " + x1 + " " + y1 + " L 493 500 L 507 500 Z"; this.path = "M " + x2 + " " + y2 + " A 45 45,0,0,0, " + x1 + " " + y1 + " L 493 500 L 507 500 Z";
this.rotate = "rotate(" + Math.round(this.heading) + " 500 500)"; this.rotate = "rotate(" + Math.round(this.heading) + " 500 500)";
this.locTolerancePixels = this.locationTolerance; this.locTolerancePixels = this.locationTolerance;
@@ -61,7 +62,7 @@ export class GpsLocation implements OnInit,OnChanges{
ngOnChanges(changes: SimpleChanges) { ngOnChanges(changes: SimpleChanges) {
if (changes.position && this.instance) { if (changes.position && this.instance) {
var p = changes.position.currentValue as GeolocationPosition; const p = changes.position.currentValue as GeolocationPosition;
if(p && this.initialized) { if(p && this.initialized) {
this.instance.setPosition(fromLonLat([p.coords.longitude, p.coords.latitude])); this.instance.setPosition(fromLonLat([p.coords.longitude, p.coords.latitude]));
this.locationTolerance = p.coords.accuracy; this.locationTolerance = p.coords.accuracy;
@@ -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 'ngx-openlayers'; import { LayerGroupComponent, MapComponent } from '@farmmaps/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';
@@ -19,13 +19,15 @@ import VectorTileLayer from 'ol/layer/VectorTile';
import {GeoJSON,MVT} from 'ol/format'; import {GeoJSON,MVT} from 'ol/format';
import { Geometry } from 'ol/geom'; import { Geometry } from 'ol/geom';
import BaseLayer from 'ol/layer/Base'; import BaseLayer from 'ol/layer/Base';
import Feature from 'ol/Feature';
@Component({ @Component({
selector: 'fm-map-item-layers', selector: 'fm-map-item-layers',
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 {
@@ -35,7 +37,7 @@ export class ItemLayersComponent extends LayerGroupComponent implements OnChange
@Output() onFeatureHover: EventEmitter<any> = new EventEmitter<any>(); @Output() onFeatureHover: EventEmitter<any> = new EventEmitter<any>();
@Output() onPrerender: EventEmitter<any> = new EventEmitter<any>(); @Output() onPrerender: EventEmitter<any> = new EventEmitter<any>();
private _apiEndPoint: string; private _apiEndPoint: string;
private initialized:boolean = false; private initialized = false;
private mapEventHandlerInstalled = false; private mapEventHandlerInstalled = false;
private topLayerPrerenderEventhandlerInstalled = false; private topLayerPrerenderEventhandlerInstalled = false;
private selectedFeatures = {}; private selectedFeatures = {};
@@ -49,7 +51,7 @@ export class ItemLayersComponent extends LayerGroupComponent implements OnChange
private styleCache = {} private styleCache = {}
componentToHex(c) { componentToHex(c) {
var hex = c.toString(16); const hex = c.toString(16);
return hex.length == 1 ? "0" + hex : hex; return hex.length == 1 ? "0" + hex : hex;
} }
@@ -58,28 +60,28 @@ export class ItemLayersComponent extends LayerGroupComponent implements OnChange
} }
getColorFromGradient(layer: ILayer, value: number): IColor { getColorFromGradient(layer: ILayer, value: number): IColor {
var gradient: IGradientstop[] = layer.renderer.colorMap.gradient; const gradient: IGradientstop[] = layer.renderer.colorMap.gradient;
var histogram: IHistogram = layer.renderer.band.histogram; const histogram: IHistogram = layer.renderer.band.histogram;
var index = (value - histogram.min) / histogram.max; const index = (value - histogram.min) / histogram.max;
var min = gradient[0]; let min = gradient[0];
var max = gradient[gradient.length - 1]; let max = gradient[gradient.length - 1];
for (var n = 0; n < gradient.length; n++) { for (let n = 0; n < gradient.length; n++) {
var s = gradient[n]; const s = gradient[n];
if (s.relativestop <= index && min.relativestop < s.relativestop && n < gradient.length - 1) min = s; if (s.relativestop <= index && min.relativestop < s.relativestop && n < gradient.length - 1) min = s;
if (s.relativestop >= index && max.relativestop > s.relativestop && n > 0) max = s; if (s.relativestop >= index && max.relativestop > s.relativestop && n > 0) max = s;
} }
var i = index - min.relativestop; const i = index - min.relativestop;
var size = max.relativestop - min.relativestop; const size = max.relativestop - min.relativestop;
var alpha = Math.round(min.color.alpha + ((max.color.alpha - min.color.alpha) * i / size)); const alpha = Math.round(min.color.alpha + ((max.color.alpha - min.color.alpha) * i / size));
var red = Math.round(min.color.red + ((max.color.red - min.color.red) * i / size)); const red = Math.round(min.color.red + ((max.color.red - min.color.red) * i / size));
var green = Math.round(min.color.green + ((max.color.green - min.color.green) * i / size)); const green = Math.round(min.color.green + ((max.color.green - min.color.green) * i / size));
var blue = Math.round(min.color.blue + ((max.color.blue - min.color.blue) * i / size)); const blue = Math.round(min.color.blue + ((max.color.blue - min.color.blue) * i / size));
return { alpha: alpha, red: red, green: green, blue: blue }; return { alpha: alpha, red: red, green: green, blue: blue };
} }
getColorForValue(layer: ILayer, value: number): IColor { getColorForValue(layer: ILayer, value: number): IColor {
var color: IColor = { alpha:0,red:0,green:0,blue:0}; let color: IColor = { alpha:0,red:0,green:0,blue:0};
if(layer.renderer.colorMap.entries.length>0) { if(layer.renderer.colorMap.entries.length>0) {
color=layer.renderer.colorMap.noValue; color=layer.renderer.colorMap.noValue;
} }
@@ -94,10 +96,10 @@ export class ItemLayersComponent extends LayerGroupComponent implements OnChange
} }
getColor(item: IItem, layer: ILayer, feature): style.Style { getColor(item: IItem, layer: ILayer, feature): style.Style {
var value = layer.indexKey ? feature.get(layer.indexKey) : feature.get(layer.name); const value = layer.indexKey ? feature.get(layer.indexKey) : feature.get(layer.name);
var key = item.code + "_" + value; const key = item.code + "_" + value;
if (!this.styleCache[key]) { if (!this.styleCache[key]) {
var color: IColor; let color: IColor;
if(layer.renderer.colorMap.colormapType == "manual") { if(layer.renderer.colorMap.colormapType == "manual") {
color = this.getColorForValue(layer, value); color = this.getColorForValue(layer, value);
} else { } else {
@@ -125,32 +127,32 @@ export class ItemLayersComponent extends LayerGroupComponent implements OnChange
} }
createGeotiffLayer(item:IItem,itemLayer:IItemLayer):Layer<Source> { createGeotiffLayer(item:IItem,itemLayer:IItemLayer):Layer<Source> {
var layerIndex = -1; let layerIndex = -1;
var layer: Layer<Source> = null; let layer: Layer<Source> = null;
layerIndex = itemLayer.layerIndex != -1 ? itemLayer.layerIndex : item.data.layers[0].index; layerIndex = itemLayer.layerIndex != -1 ? itemLayer.layerIndex : item.data.layers[0].index;
let source = new XYZ({ maxZoom: 19, minZoom: 1, url: `${this._apiEndPoint}/api/v1/items/${item.code}/tiles/${layerIndex}/{z}/{x}/{y}.png?v=${Date.parse(item.updated)}` }); const source = new XYZ({ maxZoom: 19, minZoom: 1, url: `${this._apiEndPoint}/api/v1/items/${item.code}/tiles/${layerIndex}/{z}/{x}/{y}.png?v=${Date.parse(item.updated)}` });
layer = new Tile({ source: source }); layer = new Tile({ source: source });
var data = item.data; const data = item.data;
var l = (data && data.layers && data.layers.length > 0) ? data.layers[0] : null; const l = (data && data.layers && data.layers.length > 0) ? data.layers[0] : null;
if (l && l.rendering && l.rendering.renderoutputType == "Tiles") { if (l && l.rendering && l.rendering.renderoutputType == "Tiles") {
var rt = l.rendering as IRenderoutputTiles; const rt = l.rendering as IRenderoutputTiles;
let source = new XYZ({crossOrigin: 'use-credentials', maxZoom: rt.maxzoom, minZoom: rt.minzoom, url: `${this._apiEndPoint}/api/v1/items/${item.code}/tiles/${layerIndex}/{z}/{x}/{y}.png?v=${Date.parse(item.updated)}` }); const source = new XYZ({crossOrigin: 'use-credentials', maxZoom: rt.maxzoom, minZoom: rt.minzoom, url: `${this._apiEndPoint}/api/v1/items/${item.code}/tiles/${layerIndex}/{z}/{x}/{y}.png?v=${Date.parse(item.updated)}` });
layer = new Tile({ source: source }); layer = new Tile({ source: source });
} }
if (l && l.rendering && l.rendering.renderoutputType == "Image") { if (l && l.rendering && l.rendering.renderoutputType == "Image") {
var ri = l.rendering as IRenderoutputImage; const ri = l.rendering as IRenderoutputImage;
let source = new ImageStatic({ imageExtent:ri.extent,projection:'EPSG:3857', crossOrigin: 'use-credentials', url: `${this._apiEndPoint}/api/v1/items/${item.code}/mapimage/${layerIndex}?v=${Date.parse(item.updated)}` }); const source = new ImageStatic({ imageExtent:ri.extent,projection:'EPSG:3857', crossOrigin: 'use-credentials', url: `${this._apiEndPoint}/api/v1/items/${item.code}/mapimage/${layerIndex}?v=${Date.parse(item.updated)}` });
layer = new Image({ source: source }); layer = new Image({ source: source });
} }
return layer; return layer;
} }
createShapeLayer(item:IItem,itemLayer:IItemLayer):Layer<Source> { createShapeLayer(item:IItem,itemLayer:IItemLayer):Layer<Source> {
var layerIndex = -1; let layerIndex = -1;
var layer: Layer<Source> = null; let layer: Layer<Source> = null;
layerIndex = itemLayer.layerIndex != -1 ? itemLayer.layerIndex : item.data.layers[0].index; layerIndex = itemLayer.layerIndex != -1 ? itemLayer.layerIndex : item.data.layers[0].index;
var data = item.data; const data = item.data;
var l:ILayer = (data && data.layers && data.layers.length > 0) ? data.layers[layerIndex] : null; const l:ILayer = (data && data.layers && data.layers.length > 0) ? data.layers[layerIndex] : null;
if (l && l.rendering && l.rendering.renderoutputType == "VectorTiles") { if (l && l.rendering && l.rendering.renderoutputType == "VectorTiles") {
var rt = l.rendering as IRenderoutputTiles; var rt = l.rendering as IRenderoutputTiles;
layer = new VectorTileLayer({ layer = new VectorTileLayer({
@@ -175,15 +177,15 @@ export class ItemLayersComponent extends LayerGroupComponent implements OnChange
}) })
}); });
} else { } else {
let __this = this; const __this = this;
let format = new GeoJSON(); const format = new GeoJSON();
let source = new VectorSource({ const source = new VectorSource({
strategy: loadingstrategy.bbox, strategy: loadingstrategy.bbox,
loader: function (extent: Extent, resolution: number, projection: Projection) { loader: function (extent: Extent, resolution: number, projection: Projection) {
var source = this as VectorSource<Geometry>; const source = this as VectorSource<Feature<Geometry>>;
__this.itemService.getItemFeatures(item.code, extent, projection.getCode(), layerIndex).subscribe(function (data) { __this.itemService.getItemFeatures(item.code, extent, projection.getCode(), layerIndex).subscribe(function (data) {
var features = format.readFeatures(data); const features = format.readFeatures(data).filter(feature => feature instanceof Feature) as Feature[];
for (let f of features) { for (const f of features) {
if (f.get("code")) { if (f.get("code")) {
f.setId(f.get("code")); f.setId(f.get("code"));
} }
@@ -196,9 +198,9 @@ export class ItemLayersComponent extends LayerGroupComponent implements OnChange
declutter: true, declutter: true,
source: source, source: source,
style: (feature) => { style: (feature) => {
var key =feature.get("code") + "_" + feature.get("color"); const key =feature.get("code") + "_" + feature.get("color");
if (!this.styleCache[key]) { if (!this.styleCache[key]) {
var color = feature.get("color"); const color = feature.get("color");
this.styleCache[key] = new style.Style( this.styleCache[key] = new style.Style(
{ {
fill: new style.Fill({ fill: new style.Fill({
@@ -235,11 +237,11 @@ export class ItemLayersComponent extends LayerGroupComponent implements OnChange
} }
createSelectionLayer(itemLayer:IItemLayer):Layer<Source> { createSelectionLayer(itemLayer:IItemLayer):Layer<Source> {
var layerIndex = -1; let layerIndex = -1;
var layer: Layer<Source> = null; const layer: Layer<Source> = null;
layerIndex = itemLayer.layerIndex != -1 ? itemLayer.layerIndex : itemLayer.item.data.layers[0].index; layerIndex = itemLayer.layerIndex != -1 ? itemLayer.layerIndex : itemLayer.item.data.layers[0].index;
var data = itemLayer.item.data; const data = itemLayer.item.data;
var l:ILayer = (data && data.layers && data.layers.length > 0) ? data.layers[layerIndex] : null; const l:ILayer = (data && data.layers && data.layers.length > 0) ? data.layers[layerIndex] : null;
if (l && l.rendering && l.rendering.renderoutputType == "VectorTiles") { if (l && l.rendering && l.rendering.renderoutputType == "VectorTiles") {
return new VectorTileLayer({ return new VectorTileLayer({
renderMode: 'vector', renderMode: 'vector',
@@ -250,8 +252,8 @@ export class ItemLayersComponent extends LayerGroupComponent implements OnChange
return new style.Style( return new style.Style(
{ {
stroke: new style.Stroke({ stroke: new style.Stroke({
color: 'red', color: '#0d6efd',
width: 2 width: 3
}) })
} }
); );
@@ -265,36 +267,36 @@ export class ItemLayersComponent extends LayerGroupComponent implements OnChange
} }
createExternalLayer(item:IItem,itemLayer:IItemLayer):Layer<Source> { createExternalLayer(item:IItem,itemLayer:IItemLayer):Layer<Source> {
let data = item.data as ILayerData; const data = item.data as ILayerData;
var layer: Layer<Source> = null; let layer: Layer<Source> = null;
switch (data.interfaceType) { switch (data.interfaceType) {
case 'OSM': { case 'OSM': {
let source = new OSM(); const source = new OSM();
layer = new Tile({ source: source }); layer = new Tile({ source: source });
break; break;
} }
case 'BingMaps': { case 'BingMaps': {
let source = new BingMaps(data.options); const source = new BingMaps(data.options);
layer = new Tile({ source: source }); layer = new Tile({ source: source });
break; break;
} }
case 'TileWMS': { case 'TileWMS': {
let source = new TileWMS(data.options); const source = new TileWMS(data.options);
layer = new Tile({ source: source }); layer = new Tile({ source: source });
break; break;
} }
case 'TileJSON': { case 'TileJSON': {
let source = new TileJSON(data.options); const source = new TileJSON(data.options);
layer = new Tile({ source: source }); layer = new Tile({ source: source });
break; break;
} }
case 'TileArcGISRest': { case 'TileArcGISRest': {
let source = new TileArcGISRest(data.options); const source = new TileArcGISRest(data.options);
layer = new Tile({ source: source }); layer = new Tile({ source: source });
break; break;
} }
case 'VectorWFSJson': { case 'VectorWFSJson': {
let source = new VectorSource({ const source = new VectorSource({
format: new GeoJSON(), format: new GeoJSON(),
url: function (extent) { url: function (extent) {
return ( return (
@@ -317,8 +319,8 @@ export class ItemLayersComponent extends LayerGroupComponent implements OnChange
} }
createLayer(itemLayer: IItemLayer): Layer<Source> { createLayer(itemLayer: IItemLayer): Layer<Source> {
var layer: Layer<Source> = null; let layer: Layer<Source> = null;
var layerIndex = -1; const layerIndex = -1;
if (itemLayer.item.itemType == 'vnd.farmmaps.itemtype.geotiff.processed') { if (itemLayer.item.itemType == 'vnd.farmmaps.itemtype.geotiff.processed') {
layer = this.createGeotiffLayer(itemLayer.item,itemLayer); layer = this.createGeotiffLayer(itemLayer.item,itemLayer);
} else if (itemLayer.item.itemType == 'vnd.farmmaps.itemtype.shape.processed') { } else if (itemLayer.item.itemType == 'vnd.farmmaps.itemtype.shape.processed') {
@@ -327,8 +329,8 @@ export class ItemLayersComponent extends LayerGroupComponent implements OnChange
layer = this.createExternalLayer(itemLayer.item,itemLayer); layer = this.createExternalLayer(itemLayer.item,itemLayer);
} }
if (layer) { if (layer) {
let geometry = new GeoJSON().readGeometry(itemLayer.item.geometry); const geometry = new GeoJSON().readGeometry(itemLayer.item.geometry);
let extent = geometry ? proj.transformExtent(geometry.getExtent(), 'EPSG:4326', 'EPSG:3857') : null; const extent = geometry ? proj.transformExtent(geometry.getExtent(), 'EPSG:4326', 'EPSG:3857') : null;
if (extent) layer.setExtent(extent); if (extent) layer.setExtent(extent);
} }
@@ -378,7 +380,7 @@ export class ItemLayersComponent extends LayerGroupComponent implements OnChange
if(this.topLayerPrerenderEventhandlerInstalled && this.onPrerender.observers.length > 0 ) if(this.topLayerPrerenderEventhandlerInstalled && this.onPrerender.observers.length > 0 )
{ {
if(this.instance.getVisible()) { if(this.instance.getVisible()) {
var olLayers = this.instance.getLayers().getArray().forEach((l:any) => { const olLayers = this.instance.getLayers().getArray().forEach((l:any) => {
l.un('prerender',this.topLayerPrerenderEventhandler); l.un('prerender',this.topLayerPrerenderEventhandler);
l.un('postrender',this.topLayerPostrenderEventhandler); l.un('postrender',this.topLayerPostrenderEventhandler);
}); });
@@ -390,9 +392,9 @@ export class ItemLayersComponent extends LayerGroupComponent implements OnChange
addOrUpdateOlLayer(itemLayer:IItemLayer,index:number):Layer<Source> { addOrUpdateOlLayer(itemLayer:IItemLayer,index:number):Layer<Source> {
if(!itemLayer) return null; if(!itemLayer) return null;
var olLayers = this.instance.getLayers(); const olLayers = this.instance.getLayers();
var layer = itemLayer.layer; let layer = itemLayer.layer;
let olIndex = olLayers.getArray().indexOf(layer); const olIndex = olLayers.getArray().indexOf(layer);
if (olIndex < 0) { if (olIndex < 0) {
// New layer: we add it to the map // New layer: we add it to the map
layer = this.createLayer(itemLayer); layer = this.createLayer(itemLayer);
@@ -415,33 +417,33 @@ export class ItemLayersComponent extends LayerGroupComponent implements OnChange
updateLayers(itemLayers: IItemLayer[] | IItemLayer) { updateLayers(itemLayers: IItemLayer[] | IItemLayer) {
this.unInstallTopLayerPrerenderEventhandler(); this.unInstallTopLayerPrerenderEventhandler();
let dataLayer = false; let dataLayer = false;
var ils:IItemLayer[] = []; let ils:IItemLayer[] = [];
if(Array.isArray(itemLayers)) { if(Array.isArray(itemLayers)) {
ils = itemLayers; ils = itemLayers;
} else { } else {
dataLayer=true; dataLayer=true;
ils=[itemLayers]; ils=[itemLayers];
} }
let newLayers: Layer<Source>[] = []; const newLayers: Layer<Source>[] = [];
if (ils) { if (ils) {
ils.forEach((itemLayer, index) => { ils.forEach((itemLayer, index) => {
if(itemLayer.item.itemType == 'vnd.farmmaps.itemtype.temporal') { if(itemLayer.item.itemType == 'vnd.farmmaps.itemtype.temporal') {
let il = itemLayer as ITemporalItemLayer; const il = itemLayer as ITemporalItemLayer;
let previousLayer = this.addOrUpdateOlLayer(il.previousItemLayer,newLayers.length); const previousLayer = this.addOrUpdateOlLayer(il.previousItemLayer,newLayers.length);
if(previousLayer) newLayers.push(previousLayer); if(previousLayer) newLayers.push(previousLayer);
let selectedLayer = this.addOrUpdateOlLayer(il.selectedItemLayer,newLayers.length); const selectedLayer = this.addOrUpdateOlLayer(il.selectedItemLayer,newLayers.length);
if(selectedLayer) newLayers.push(selectedLayer); if(selectedLayer) newLayers.push(selectedLayer);
let nextLayer = this.addOrUpdateOlLayer(il.nextItemLayer,newLayers.length); const nextLayer = this.addOrUpdateOlLayer(il.nextItemLayer,newLayers.length);
if(nextLayer) newLayers.push(nextLayer); if(nextLayer) newLayers.push(nextLayer);
this.installTopLayerPrerenderEventhandler(selectedLayer); this.installTopLayerPrerenderEventhandler(selectedLayer);
} else { } else {
let layer = this.addOrUpdateOlLayer(itemLayer,newLayers.length); const layer = this.addOrUpdateOlLayer(itemLayer,newLayers.length);
if(layer) newLayers.push(layer); if(layer) newLayers.push(layer);
this.installTopLayerPrerenderEventhandler(layer); this.installTopLayerPrerenderEventhandler(layer);
} }
}); });
// Remove the layers that have disapeared from childrenLayers // Remove the layers that have disapeared from childrenLayers
var olLayers = this.instance.getLayers(); const olLayers = this.instance.getLayers();
while(olLayers.getLength() > newLayers.length) { while(olLayers.getLength() > newLayers.length) {
olLayers.removeAt(newLayers.length); olLayers.removeAt(newLayers.length);
} }
@@ -467,20 +469,20 @@ export class ItemLayersComponent extends LayerGroupComponent implements OnChange
// select only when having observers // select only when having observers
if(event.type === 'click' && !this.onFeatureSelected.observers.length) return; if(event.type === 'click' && !this.onFeatureSelected.observers.length) return;
if(event.type === 'pointermove' && !this.onFeatureHover.observers.length) return; if(event.type === 'pointermove' && !this.onFeatureHover.observers.length) return;
let itemLayer= this.getItemlayer(this.itemLayer); const itemLayer= this.getItemlayer(this.itemLayer);
if(itemLayer && itemLayer.layer) { if(itemLayer && itemLayer.layer) {
this.selectedFeatures = {}; this.selectedFeatures = {};
if(itemLayer.layer ) { if(itemLayer.layer ) {
let minZoom = itemLayer.layer.getMinZoom(); const minZoom = itemLayer.layer.getMinZoom();
let currentZoom = this.map.instance.getView().getZoom(); const currentZoom = this.map.instance.getView().getZoom();
if(currentZoom>minZoom) { if(currentZoom>minZoom) {
itemLayer.layer.getFeatures(event.pixel).then((features) => { itemLayer.layer.getFeatures(event.pixel).then((features) => {
if(!features.length) { if(!features.length) {
this.onFeatureHover.emit(null); this.onFeatureHover.emit(null);
return; return;
} }
let fid = features[0].getId(); const fid = features[0].getId();
let feature = features[0]; const feature = features[0];
if(event.type === 'pointermove') { if(event.type === 'pointermove') {
this.selectedFeatures[fid] = features[0]; this.selectedFeatures[fid] = features[0];
this.onFeatureHover.emit({ "feature": feature,"itemCode":itemLayer.item.code }); this.onFeatureHover.emit({ "feature": feature,"itemCode":itemLayer.item.code });
@@ -502,11 +504,11 @@ export class ItemLayersComponent extends LayerGroupComponent implements OnChange
ngOnChanges(changes: SimpleChanges) { ngOnChanges(changes: SimpleChanges) {
if (this.instance && this.initialized) { if (this.instance && this.initialized) {
if (changes['itemLayers']) { if (changes['itemLayers']) {
var itemLayers = changes['itemLayers'].currentValue as IItemLayer[]; const itemLayers = changes['itemLayers'].currentValue as IItemLayer[];
this.updateLayers(itemLayers); this.updateLayers(itemLayers);
} }
if (changes['itemLayer']) { if (changes['itemLayer']) {
var itemLayer = changes['itemLayer'].currentValue as IItemLayer; const itemLayer = changes['itemLayer'].currentValue as IItemLayer;
this.itemLayer = itemLayer this.itemLayer = itemLayer
if(itemLayer) { if(itemLayer) {
if(this.getItemlayer(this.itemLayer).item.itemType == 'vnd.farmmaps.itemtype.shape.processed') { if(this.getItemlayer(this.itemLayer).item.itemType == 'vnd.farmmaps.itemtype.shape.processed') {
@@ -1,9 +1,9 @@
import { Component, Host, Input, Output, EventEmitter, OnInit, OnChanges, SimpleChanges, forwardRef, Inject, InjectionToken } 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 'ngx-openlayers'; import { LayerVectorComponent, SourceVectorComponent, MapComponent } from '@farmmaps/ng-openlayers';
import { ItemService,ItemTypeService,IItem, IItemType } from '@farmmaps/common'; import { ItemService, ItemTypeService, IItem, IItemType, FolderService } from '@farmmaps/common';
import { Feature } from 'ol'; import { Feature } from 'ol';
import { Point,Geometry } from 'ol/geom'; import { Point, Geometry } from 'ol/geom';
import { MapBrowserEvent } from 'ol'; import { MapBrowserEvent } from 'ol';
import { Types } from 'ol/MapBrowserEventType'; import { Types } from 'ol/MapBrowserEventType';
import * as style from 'ol/style'; import * as style from 'ol/style';
@@ -11,57 +11,63 @@ import * as color from 'ol/color';
import * as loadingstrategy from 'ol/loadingstrategy'; import * as loadingstrategy from 'ol/loadingstrategy';
import * as condition from 'ol/events/condition'; import * as condition from 'ol/events/condition';
import * as extent from 'ol/extent'; import * as extent from 'ol/extent';
import {Vector,Cluster,Source} from 'ol/source'; import { Vector, Cluster, Source } from 'ol/source';
import {Layer} from 'ol/layer'; import { Layer } from 'ol/layer';
import {GeoJSON} from 'ol/format'; import { GeoJSON } from 'ol/format';
import {Select} from 'ol/interaction'; import { Select } from 'ol/interaction';
import {IStyles} from '../../../models/style.cache'; import { IStyles } from '../../../models/style.cache';
import {FeatureIconService} from '../../../services/feature-icon.service'; import { FeatureIconService } from '../../../services/feature-icon.service';
import { Subscription } from 'rxjs';
import { getCenter } from 'ol/extent';
import { formatNumber } from '@angular/common';
@Component({ @Component({
selector: 'fm-map-item-source-vector', selector: 'fm-map-item-source-vector',
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, OnChanges { export class ItemVectorSourceComponent extends SourceVectorComponent implements OnInit, OnDestroy, OnChanges {
instance: Vector<Geometry>; instance: Vector<Feature<Geometry>>;
private _format: GeoJSON; private _format: GeoJSON;
private _select: Select; private _select: Select;
private _hoverSelect: Select; private _hoverSelect: Select;
private _iconScale: number = 0.05; private _iconScale = 0.05;
@Input() features: Array<Feature<Geometry>>; @Input() features: Array<Feature<Geometry>>;
@Input() selectedFeature: Feature<Geometry>; @Input() selectedFeature: Feature<Geometry>;
@Input() selectedItem: IItem; @Input() selectedItem: IItem;
@Input() styles:IStyles; @Input() styles: IStyles;
@Output() onFeatureSelected: EventEmitter<Feature<Geometry>> = new EventEmitter<Feature<Geometry>>(); @Output() onFeatureSelected: EventEmitter<Feature<Geometry>> = new EventEmitter<Feature<Geometry>>();
@Output() onFeatureHover: EventEmitter<Feature<Geometry>> = new EventEmitter<Feature<Geometry>>(); @Output() onFeatureHover: EventEmitter<Feature<Geometry>> = new EventEmitter<Feature<Geometry>>();
private stylesCache:IStyles = {}; private stylesCache: IStyles = {};
private sub: Subscription;
private displayMapFeatureSettings: { [code: string]: string[] } = defaultDisplayMapFeatureSettings();
constructor(@Host() private layer: LayerVectorComponent, private itemService: ItemService, private map: MapComponent, private itemTypeService: ItemTypeService,private featureIconService$:FeatureIconService) { constructor(@Host() private layer: LayerVectorComponent, private itemService: ItemService, private map: MapComponent, private itemTypeService: ItemTypeService, private featureIconService$: FeatureIconService, private folderService: FolderService, @Inject(LOCALE_ID) private locale: string) {
super(layer); super(layer);
this._format = new GeoJSON(); this._format = new GeoJSON();
} }
geometry(feature: Feature<Geometry>) { geometry(feature: Feature<Geometry>) {
let view = this.map.instance.getView(); const view = this.map.instance.getView();
let resolution = view.getResolution(); const resolution = view.getResolution();
var geometry = feature.getGeometry(); let geometry = feature.getGeometry();
let e = geometry.getExtent(); const e = geometry.getExtent();
//var size = Math.max((e[2] - e[0]) / resolution, (e[3] - e[1]) / resolution); //var size = Math.max((e[2] - e[0]) / resolution, (e[3] - e[1]) / resolution);
if (resolution > 12) { if (resolution > 12) {
geometry = new Point(extent.getCenter(e)); geometry = new Point(extent.getCenter(e));
} }
return geometry; return geometry;
} }
getSelectedStyle(feature:Feature<Geometry>):style.Style { getSelectedStyle(feature: Feature<Geometry>): style.Style {
let key = feature.get('itemType')+"_selected"; const key = feature.get('itemType') + "_selected";
let evaluatedStyle: style.Style =undefined; let evaluatedStyle: style.Style = undefined;
var styleEntry = this.stylesCache[key]; const styleEntry = this.stylesCache[key];
if(styleEntry) { if (styleEntry) {
if(typeof styleEntry === 'function') { if (typeof styleEntry === 'function') {
evaluatedStyle = styleEntry(feature); evaluatedStyle = styleEntry(feature);
} else { } else {
evaluatedStyle = styleEntry; evaluatedStyle = styleEntry;
@@ -69,22 +75,34 @@ export class ItemVectorSourceComponent extends SourceVectorComponent implements
} else { } else {
evaluatedStyle = this.stylesCache["selected"] as style.Style; evaluatedStyle = this.stylesCache["selected"] as style.Style;
} }
if(evaluatedStyle ) { if (evaluatedStyle) {
evaluatedStyle .setGeometry((feature:Feature<Geometry>) => this.geometry(feature)); evaluatedStyle.setGeometry((feature: Feature<Geometry>) => this.geometry(feature));
} }
return evaluatedStyle as style.Style return evaluatedStyle as style.Style
} }
ngOnInit() { ngOnInit() {
this.sub = this.folderService.getFolder('my_settings').subscribe(
userSettingsRoot => {
if (userSettingsRoot == undefined) return;
this.itemService.getChildItemList(userSettingsRoot.code, 'vnd.farmmaps.itemtype.settings.general').subscribe(
items => {
if (items && items.length > 0 && items[0].data?.displayMapFeatureSettings) {
this.displayMapFeatureSettings = items[0].data?.displayMapFeatureSettings;
}
}
)
}
);
this.strategy = loadingstrategy.bbox; this.strategy = loadingstrategy.bbox;
this.format = new GeoJSON(); this.format = new GeoJSON();
this._select = new Select({ this._select = new Select({
style:null, style: null,
hitTolerance: 10, hitTolerance: 10,
layers: [this.layer.instance as Layer<Source>] layers: [this.layer.instance as Layer<Source>]
}); });
this._hoverSelect = new Select({ this._hoverSelect = new Select({
style: (feature:Feature<Geometry>) => { style: (feature: Feature<Geometry>) => {
return this.getSelectedStyle(feature); return this.getSelectedStyle(feature);
}, },
hitTolerance: 10, hitTolerance: 10,
@@ -113,46 +131,51 @@ export class ItemVectorSourceComponent extends SourceVectorComponent implements
this.host.instance.setSource(this.instance); this.host.instance.setSource(this.instance);
this.host.instance.setStyle((feature) => { this.host.instance.setStyle((feature) => {
var itemType = feature.get('itemType'); const itemType = feature.get('itemType');
var key = itemType + (this.selectedItem?"_I":""); let key = itemType + (this.selectedItem ? "_I" : "");
if (!this.stylesCache[key]) { if (!this.stylesCache[key]) {
if (this.itemTypeService.itemTypes[itemType]) { if (this.itemTypeService.itemTypes[itemType]) {
let itemTypeEntry = this.itemTypeService.itemTypes[itemType]; const itemTypeEntry = this.itemTypeService.itemTypes[itemType];
let fillColor = color.asArray(itemTypeEntry.iconColor); const fillColor = color.asArray(itemTypeEntry.iconColor);
fillColor[3] = 0; fillColor[3] = 0;
this.stylesCache[key] = new style.Style({ this.stylesCache[key] = new style.Style({
image: itemTypeEntry.icon ? new style.Icon({ image: itemTypeEntry.icon ? new style.Icon({
anchor: [0.5, 1], anchor: [0.5, 1],
scale: 0.05, scale: 0.05,
src: this.featureIconService$.getIconImageDataUrl(itemTypeEntry.icon) src: this.featureIconService$.getIconImageDataUrl(itemTypeEntry.icon)
}):null, }) : null,
stroke: new style.Stroke({ stroke: new style.Stroke({
color: 'red', color: 'red',
width: 1 width: 1
}), }),
fill: new style.Fill({ fill: new style.Fill({
color: fillColor color: fillColor
}), }),
geometry:(feature:Feature<Geometry>) => this.geometry(feature) geometry: (feature: Feature<Geometry>) => this.geometry(feature),
}); text: this.getDisplayTextForFeature(feature, this.map.instance.getView().getZoom())
});
} else { } else {
key = 'file'; key = 'file';
} }
} }
let evaluatedStyle =null; let evaluatedStyle = null;
var styleEntry = this.stylesCache[key]; const styleEntry = this.stylesCache[key];
if(typeof styleEntry === 'function') { if (typeof styleEntry === 'function') {
evaluatedStyle = styleEntry(feature); evaluatedStyle = styleEntry(feature);
} else { } else {
evaluatedStyle = styleEntry; evaluatedStyle = styleEntry;
} }
if(evaluatedStyle && evaluatedStyle.geometry_ == null) { if (evaluatedStyle && evaluatedStyle.geometry_ == null && !Array.isArray(evaluatedStyle)) {
evaluatedStyle.setGeometry((feature) => this.geometry(feature)); evaluatedStyle.setGeometry((feature) => this.geometry(feature));
} }
return evaluatedStyle; return evaluatedStyle;
}); });
} }
ngOnDestroy(): void {
if (this.sub) this.sub.unsubscribe();
}
ngOnChanges(changes: SimpleChanges) { ngOnChanges(changes: SimpleChanges) {
if (changes["features"] && this.instance) { if (changes["features"] && this.instance) {
this.instance.clear(true); this.instance.clear(true);
@@ -161,8 +184,8 @@ export class ItemVectorSourceComponent extends SourceVectorComponent implements
} }
if (changes["selectedFeature"] && this.instance) { if (changes["selectedFeature"] && this.instance) {
var features = this._hoverSelect.getFeatures(); const features = this._hoverSelect.getFeatures();
var feature = changes["selectedFeature"].currentValue const feature = changes["selectedFeature"].currentValue
//this.instance.clear(false); //this.instance.clear(false);
//this.instance.addFeatures(features.getArray()); //this.instance.addFeatures(features.getArray());
features.clear(); features.clear();
@@ -172,20 +195,67 @@ export class ItemVectorSourceComponent extends SourceVectorComponent implements
} }
} }
if (changes["selectedItem"] && this.instance) { if (changes["selectedItem"] && this.instance) {
var item = changes["selectedItem"].currentValue const item = changes["selectedItem"].currentValue
if (item) { if (item) {
this.map.instance.removeInteraction(this._hoverSelect); this.map.instance.removeInteraction(this._hoverSelect);
} else { } else {
this.map.instance.addInteraction(this._hoverSelect); this.map.instance.addInteraction(this._hoverSelect);
} }
} }
if (changes["styles"] && this.instance) { if (changes["styles"]) {
let styles = changes["styles"].currentValue; const styles = changes["styles"].currentValue;
for (const key in styles) { for (const key in styles) {
if (styles.hasOwnProperty(key)) { if (styles.hasOwnProperty(key)) {
this.stylesCache[key]=styles[key]; this.stylesCache[key] = styles[key];
} }
} }
} }
} }
getDisplayTextForFeature(feature: Feature<Geometry>, zoom: number, overrule?: style.Text) {
if (!feature) return null;
const propertiesToShow: string[] = this.displayMapFeatureSettings[feature.get('itemType')];
if (!propertiesToShow) return null;
if (propertiesToShow.length <= 0) return null;
if (zoom < 14) return null;
let displayText = '';
for (let i = 0; i < propertiesToShow.length; i++) {
let value = feature.get(propertiesToShow[i]);
switch (propertiesToShow[i]) {
case "area": value = formatNumber(value, this.locale, '0.1-2') + ' ha'; break;
case "centroid": {
if (feature.getGeometry()) {
const centroid = getCenter(feature.getGeometry().getExtent());
value = Math.round(centroid[0]) + ',' + Math.round(centroid[1]);
}
}
if (value) {
displayText += value + (i < propertiesToShow.length ? '\n' : '');
}
}
const styleText = new style.Text({
font: '13px Calibri,sans-serif',
fill: new style.Fill({ color: '#ffffff' }),
stroke: new style.Stroke({ color: '#000000', width: 2 }),
text: displayText
});
if (overrule) {
if (overrule.getFont()) styleText.setFont(overrule.getFont());
if (overrule.getFill()) styleText.setFill(overrule.getFill());
if (overrule.getStroke()) styleText.setStroke(overrule.getStroke());
}
return styleText;
}
}
}
function defaultDisplayMapFeatureSettings() {
return {
'vnd.farmmaps.itemtype.cropfield': ['name', 'cropTypeName', 'area']
};
} }
@@ -1,31 +1,50 @@
<div> <div>
<div class="layerlist" *ngIf="itemLayers.length > 0;else noLayers"> @if (itemLayers.length > 0) {
<div class="list-group"> <div class="layerlist">
<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">
<div (click)="handleSelectLayer($event,itemLayer)" [title]="itemLayer.item.name">{{itemLayer.item.name}}</div> @for (itemLayer of itemLayers; track itemLayer) {
<div class="mt-1" *ngIf="selectedLayer==itemLayer && !baseLayers"> <div class="list-group-item list-group-item-action p-2 text-truncate" [ngClass]="{'active' : selectedLayer==itemLayer}">
<span class="btn-group"> <div (click)="handleSelectLayer($event,itemLayer)" [title]="itemLayer.item.name">{{itemLayer.item.name}}</div>
<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 (selectedLayer==itemLayer && !baseLayers) {
<a title="Transparency 25%" *ngIf="itemLayer.visible" href="#" class="btn btn-light btn-sm" (click)="handleSetOpacity($event,itemLayer,0.25)">25%</a> <div class="mt-1">
<a title="Transparency 50%" *ngIf="itemLayer.visible" href="#" class="btn btn-light btn-sm" (click)="handleSetOpacity($event,itemLayer,0.5)">50%</a> <span class="btn-group">
<a title="Transparency 75%" *ngIf="itemLayer.visible" href="#" class="btn btn-light btn-sm" (click)="handleSetOpacity($event,itemLayer,0.75)">75%</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>
<a title="No transparency" *ngIf="itemLayer.visible" href="#" class="btn btn-light btn-sm" (click)="handleSetOpacity($event,itemLayer,1)">100%</a> @if (itemLayer.visible) {
</span> <a title="Transparency 25%" href="#" class="btn btn-light btn-sm" (click)="handleSetOpacity($event,itemLayer,0.25)">25%</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> }
<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> @if (itemLayer.visible) {
<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> <a title="Transparency 50%" href="#" class="btn btn-light btn-sm" (click)="handleSetOpacity($event,itemLayer,0.5)">50%</a>
</div> }
<div *ngIf="itemLayer.legendVisible"> @if (itemLayer.visible) {
<div class="card legend"> <a title="Transparency 75%" href="#" class="btn btn-light btn-sm" (click)="handleSetOpacity($event,itemLayer,0.75)">75%</a>
<fm-map-layer-legend [layer]="firstLayer(itemLayer)" (click)="handleLegendClick($event,itemLayer);" [histogramenabled]="true"></fm-map-layer-legend> }
</div> @if (itemLayer.visible) {
<a title="No transparency" href="#" class="btn btn-light btn-sm" (click)="handleSetOpacity($event,itemLayer,1)">100%</a>
}
</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>
@if (firstLayer(itemLayer)) {
<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>
}
@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>
}
@if (itemLayer.legendVisible) {
<div>
<div class="card 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 class="list-group">
<div class="list-group-item" i18n>No layers</div>
</div>
}
</div> </div>
<ng-template #noLayers>
<div class="list-group">
<div class="list-group-item" i18n>No layers</div>
</div>
</ng-template>
@@ -2,15 +2,16 @@ import { Component,Input,Output,EventEmitter } from '@angular/core';
import { IItemLayer } from '../../../models/item.layer'; 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 {
@Input() itemLayers: IItemLayer[] = []; @Input() itemLayers: IItemLayer[] = [];
@Input() baseLayers: boolean = false; @Input() baseLayers = false;
@Input() dataLayers: boolean = false; @Input() dataLayers = false;
@Output() onToggleVisibility = new EventEmitter<IItemLayer>(); @Output() onToggleVisibility = new EventEmitter<IItemLayer>();
@Output() onSetOpacity = new EventEmitter<{layer: IItemLayer,opacity:number }>(); @Output() onSetOpacity = new EventEmitter<{layer: IItemLayer,opacity:number }>();
@Output() onDelete = new EventEmitter<IItemLayer>(); @Output() onDelete = new EventEmitter<IItemLayer>();
@@ -1,18 +1,27 @@
<div #layerValues class="layer-values"> <div #layerValues class="layer-values">
<div class="cross" *ngIf="enabled$ | async"> @if (enabled$ | async) {
<div class="pointer"></div> <div class="cross" >
<div class="values-container border border-dark rounded p-2" *ngIf="(layerValues$ | async ) as layers"> <div class="pointer"></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 ((layerValues$ | async ); as layers) {
<ul class="value-list p-0 mb-0" *ngIf="layers.length>0 ;else no_data"> <div class="values-container border border-dark rounded p-2">
<li class="border-top pt-1 pb-1 value" *ngFor="let layerValue of layers"> <div class="lonlat pb-2 "><span class="font-weight-bold">{{lonlat$}}</span><i class="ms-2 fal fa-copy" (click)="copyToClipboard()"></i> </div>
<div>{{layerValue.layerName}}</div> @if (layers.length>0 ) {
<div>{{layerValue.date|date}}</div> <ul class="value-list p-0 mb-0">
<div><span *ngIf="layerValue.quantity"><span class="me-1">{{layerValue.quantity}}</span> </span><span class="me-1 font-weight-bold">{{layerValue.value}}</span><span>{{layerValue.unit}}</span></div> @for (layerValue of layers; track layerValue) {
</li> <li class="border-top pt-1 pb-1 value">
</ul> <div>{{layerValue.layerName}}</div>
<ng-template #no_data> <div>{{layerValue.date|date}}</div>
<div i18n class="border-top pt-1 pb-1">No data at location</div> <div>@if (layerValue.quantity) {
</ng-template> <span><span class="me-1">{{layerValue.quantity}}</span> </span>
</div> }<span class="me-1 font-weight-bold">{{getScaledValue(layerValue)}}</span><span>{{layerValue.unit}}</span></div>
</div> </li>
</div>> }
</ul>
} @else {
<div i18n class="border-top pt-1 pb-1">No data at location</div>
}
</div>
}
</div>
}
</div>
@@ -1,36 +1,37 @@
import { Component, OnInit,Input,ViewChild,ElementRef,AfterViewInit } from '@angular/core'; import { Component, OnInit, Input, ViewChild, ElementRef, AfterViewInit } from '@angular/core';
import {IItemLayer} from '../../../models/item.layer'; 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 'ngx-openlayers'; import { MapComponent } from '@farmmaps/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';
import { toLonLat } from 'ol/proj'; import { toLonLat } from 'ol/proj';
import { toStringHDMS } from 'ol/coordinate'; import { toStringHDMS } from 'ol/coordinate';
import { ClipboardService } from 'ngx-clipboard' import { ClipboardService } from 'ngx-clipboard'
import {GeoJSON,WKT} from 'ol/format'; import { GeoJSON, WKT } from 'ol/format';
import { Point } from 'ol/geom'; 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 {
@ViewChild('layerValues') containerRef:ElementRef; @ViewChild('layerValues') containerRef: ElementRef;
offsetX$:number =0; offsetX$ = 0;
offsetY$:number =0; offsetY$ = 0;
lonlat$: string=""; lonlat$ = "";
wkt$= ""; wkt$ = "";
layerValues$:Observable<Array<ILayervalue>> = this.store.select(mapReducers.selectGetLayerValues); layerValues$: Observable<Array<ILayervalue>> = this.store.select(mapReducers.selectGetLayerValues);
enabled$:Observable<boolean> = this.store.select(mapReducers.selectGetLayerValuesEnabled); enabled$: Observable<boolean> = this.store.select(mapReducers.selectGetLayerValuesEnabled);
wktFormat$:WKT; wktFormat$: WKT;
constructor( private store: Store<mapReducers.State>,private map: MapComponent,private clipboardService$:ClipboardService) { constructor(private store: Store<mapReducers.State>, private map: MapComponent, private clipboardService$: ClipboardService) {
this.wktFormat$=new WKT(); this.wktFormat$ = new WKT();
} }
ngOnInit(): void { ngOnInit(): void {
@@ -39,24 +40,32 @@ export class LayerValuesComponent implements OnInit,AfterViewInit {
moveEndSubject = new Subject<any>(); moveEndSubject = new Subject<any>();
ngAfterViewInit():void { ngAfterViewInit(): void {
this.offsetY$ = this.containerRef.nativeElement.offsetTop; this.offsetY$ = this.containerRef.nativeElement.offsetTop;
this.offsetX$ = this.containerRef.nativeElement.offsetLeft; this.offsetX$ = this.containerRef.nativeElement.offsetLeft;
this.map.instance.on('moveend', () => { this.map.instance.on('moveend', () => {
this.moveEndSubject.next({}); this.moveEndSubject.next({});
}); });
this.moveEndSubject.pipe(throttle(ev => interval(100))).subscribe(() => this.updateValuesLocation()); this.moveEndSubject.pipe(throttle(ev => interval(100))).subscribe(() => this.updateValuesLocation());
} }
updateValuesLocation() { updateValuesLocation() {
var xy = this.map.instance.getCoordinateFromPixel([this.offsetX$,this.offsetY$]) const xy = this.map.instance.getCoordinateFromPixel([this.offsetX$, this.offsetY$])
var lonlat = toLonLat(xy); const lonlat = toLonLat(xy);
this.wkt$ = this.wktFormat$.writeGeometry(new Point(lonlat)) this.wkt$ = this.wktFormat$.writeGeometry(new Point(lonlat))
this.lonlat$ = toStringHDMS(lonlat); this.lonlat$ = toStringHDMS(lonlat);
this.store.dispatch(new mapActions.SetLayerValuesLocation(xy[0],xy[1])); this.store.dispatch(new mapActions.SetLayerValuesLocation(xy[0], xy[1]));
} }
copyToClipboard() { copyToClipboard() {
this.clipboardService$.copy(this.wkt$); this.clipboardService$.copy(this.wkt$);
} }
public getScaledValue(layerValue: ILayervalue): number {
let v = layerValue.value;
if (layerValue.scale && layerValue.scale != 0) {
v = layerValue.scale * layerValue.value;
}
return v;
}
} }
@@ -1,20 +1,22 @@
import { Component, OnDestroy, OnInit, Input, OnChanges, SimpleChanges } from '@angular/core'; import { Component, OnDestroy, OnInit, Input, OnChanges, SimpleChanges } from '@angular/core';
import { LayerVectorComponent, MapComponent } from 'ngx-openlayers'; import { LayerVectorComponent, MapComponent } from '@farmmaps/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';
import Feature from 'ol/Feature';
@Component({ @Component({
selector: 'fm-map-aol-layer-vector-image', selector: 'fm-map-aol-layer-vector-image',
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;
@Input() @Input()
renderMode: RenderType<VectorSource<Geometry>> | string = "image"; renderMode: RenderType<VectorSource<Feature<Geometry>>> | string = "image";
constructor(map: MapComponent) { constructor(map: MapComponent) {
super(map); super(map);
@@ -1,11 +1,8 @@
@import "~bootstrap/scss/bootstrap.scss";
.gps-location { .gps-location {
display:block; display:block;
width:2.5em; width:2.5em;
height:2.5em; height:2.5em;
background-color: $body-bg; background-color: var(--bs-body-bg);
background-size: contain; background-size: contain;
margin-top:0.5em; margin-top:0.5em;
border-radius: 1.75em; border-radius: 1.75em;
@@ -17,15 +14,15 @@
} }
.pan-to { .pan-to {
fill: $secondary; fill: var(--bs-secondary);
} }
div.gps-location:hover .pan-to { div.gps-location:hover .pan-to {
fill: $white; fill: var(--bs-white);
} }
.pan-to-centered { .pan-to-centered {
fill: $primary; fill: var(--bs-primary);
} }
div.gps-location:hover .pan-to-centered { div.gps-location:hover .pan-to-centered {
@@ -33,5 +30,5 @@ div.gps-location:hover .pan-to-centered {
} }
.pan-to.pan-to-disabled { .pan-to.pan-to-disabled {
fill: $gray-300; fill: var(--bs-gray-300);
} }
@@ -1,14 +1,15 @@
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 'ngx-openlayers'; import { MapComponent } from '@farmmaps/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';
@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{
@@ -43,12 +44,12 @@ export class PanToLocation implements OnInit,OnChanges{
public centered():boolean { public centered():boolean {
if(this.position && this.mapState) { if(this.position && this.mapState) {
let center = this.view.getCenter(); const center = this.view.getCenter();
let newCenter = fromLonLat([this.position.coords.longitude,this.position.coords.latitude]); const newCenter = fromLonLat([this.position.coords.longitude,this.position.coords.latitude]);
let x1 = newCenter[0].toFixed(0); const x1 = newCenter[0].toFixed(0);
let x2 = center[0].toFixed(0); const x2 = center[0].toFixed(0);
let y1 = newCenter[1].toFixed(0); const y1 = newCenter[1].toFixed(0);
let y2 = center[1].toFixed(0); const y2 = center[1].toFixed(0);
return x1==x2 && y1==y2; return x1==x2 && y1==y2;
} }
return false; return false;
@@ -60,17 +61,17 @@ export class PanToLocation implements OnInit,OnChanges{
handleClick(event:Event) { handleClick(event:Event) {
if(this.position) { if(this.position) {
let view = this.map.instance.getView(); const view = this.map.instance.getView();
let newCenter = fromLonLat([this.position.coords.longitude,this.position.coords.latitude]); const newCenter = fromLonLat([this.position.coords.longitude,this.position.coords.latitude]);
let extent = [newCenter[0]-500,newCenter[1]-500,newCenter[0]+500,newCenter[1]+500]; const extent = [newCenter[0]-500,newCenter[1]-500,newCenter[0]+500,newCenter[1]+500];
var options = { padding: [0, 0, 0, 0],minResolution:1 }; const options = { padding: [0, 0, 0, 0],minResolution:1 };
let size = this.map.instance.getSize(); const size = this.map.instance.getSize();
let rem = parseFloat(getComputedStyle(document.documentElement).fontSize); const rem = parseFloat(getComputedStyle(document.documentElement).fontSize);
let threshold = 44 * rem; const threshold = 44 * rem;
var left = 1 * rem; let left = 1 * rem;
var right = 1 * rem; const right = 1 * rem;
var bottom = Math.round(size[1] / 2); let bottom = Math.round(size[1] / 2);
var top = 1 * rem; const top = 1 * rem;
if (size[0] > threshold) { if (size[0] > threshold) {
bottom = 1 * rem; bottom = 1 * rem;
left = 23 * rem; left = 23 * rem;
@@ -1,5 +1,3 @@
@import "~bootstrap/scss/bootstrap.scss";
.compass { .compass {
width:2.5em; width:2.5em;
height:2.5em; height:2.5em;
@@ -13,7 +11,7 @@
#north { #north {
display: none; display: none;
fill:$black; fill:var(--bs-black);
} }
#top-l { #top-l {
@@ -33,23 +31,23 @@
} }
div.compass:hover #top-l { div.compass:hover #top-l {
fill:$white; fill:var(--bs-white);
} }
div.compass:hover #top-r { div.compass:hover #top-r {
fill:$gray-300; fill:var(--bs-gray-300);
} }
div.compass:hover #bottom-l { div.compass:hover #bottom-l {
fill:$gray-300; fill:var(--bs-gray-300);
} }
div.compass:hover #bottom-r { div.compass:hover #bottom-r {
fill:$white; fill:var(--bs-white);
} }
div.compass:hover #north { div.compass:hover #north {
fill:$white; fill:var(--bs-white);
} }
.compass-n { .compass-n {
@@ -1,20 +1,21 @@
import { Component, Host, Input, OnInit, ChangeDetectorRef } from '@angular/core'; import { Component, Host, Input, OnInit, ChangeDetectorRef } from '@angular/core';
import { ViewComponent, MapComponent } from 'ngx-openlayers'; import { ViewComponent, MapComponent } from '@farmmaps/ng-openlayers';
import {View} from 'ol'; 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;
public Rotation() { public Rotation() {
let rotation = this.view ? this.view.getRotation() : 0; const rotation = this.view ? this.view.getRotation() : 0;
return `rotate(${rotation}rad)`; return `rotate(${rotation}rad)`;
} }
@@ -1,28 +1,29 @@
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 'ngx-openlayers'; import { ViewComponent, MapComponent } from '@farmmaps/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;
map: MapComponent; map: MapComponent;
paddingTop: number = 0; paddingTop = 0;
paddingLeft: number = 0; paddingLeft = 0;
paddingBottom: number = 0; paddingBottom = 0;
paddingRight: number = 0; paddingRight = 0;
@Input() extent: number[]; @Input() extent: number[];
@Input() animate: boolean = false; @Input() animate = false;
constructor(@Host() view: ViewComponent, @Host() map: MapComponent,route: ActivatedRoute ) { constructor(@Host() view: ViewComponent, @Host() map: MapComponent,route: ActivatedRoute ) {
this.view = view; this.view = view;
this.map = map; this.map = map;
if(route && route.snapshot && route.snapshot.data && route.snapshot.data["fm-map-zoom-to-extent"]) { if(route && route.snapshot && route.snapshot.data && route.snapshot.data["fm-map-zoom-to-extent"]) {
let params = route.snapshot.data["fm-map-zoom-to-extent"]; const params = route.snapshot.data["fm-map-zoom-to-extent"];
this.paddingTop = params["padding-top"] ? params["padding-top"] : 0; this.paddingTop = params["padding-top"] ? params["padding-top"] : 0;
this.paddingBottom = params["padding-bottom"] ? params["padding-bottom"] : 0; this.paddingBottom = params["padding-bottom"] ? params["padding-bottom"] : 0;
this.paddingLeft = params["padding-left"] ? params["padding-left"] : 0; this.paddingLeft = params["padding-left"] ? params["padding-left"] : 0;
@@ -32,14 +33,14 @@ export class ZoomToExtentComponent implements OnChanges {
ngOnChanges(changes: SimpleChanges) { ngOnChanges(changes: SimpleChanges) {
if (this.extent) { if (this.extent) {
var options = { padding: [0, 0, 0, 0],minResolution:1 }; const options = { padding: [0, 0, 0, 0],minResolution:1 };
let size = this.map.instance.getSize(); const size = this.map.instance.getSize();
let rem = parseFloat(getComputedStyle(document.documentElement).fontSize); const rem = parseFloat(getComputedStyle(document.documentElement).fontSize);
let threshold = 40 * rem; const threshold = 40 * rem;
var left = 1 * rem; let left = 1 * rem;
var right = 1 * rem; const right = 1 * rem;
var bottom = Math.round((size[1] / 2) + (4*rem)); let bottom = Math.round((size[1] / 2) + (4*rem));
var top = 1 * rem; const top = 1 * rem;
if (size[0] > threshold) { if (size[0] > threshold) {
bottom = 5 * rem; bottom = 5 * rem;
left = 23 * rem; left = 23 * rem;
@@ -1,14 +1,10 @@
@import "~bootstrap/scss/bootstrap.scss";
.row { .row {
border-bottom: 1px solid $gray-500; border-bottom: 1px solid var(--bs-gray-500);
user-select: none; user-select: none;
} }
.row.selected { .row.selected {
background-color: $gray-100; background-color: var(--bs-gray-100);
} }
@media screen and (min-width: 44rem) { @media screen and (min-width: 44rem) {
@@ -11,9 +11,10 @@ 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 {
@@ -33,7 +34,7 @@ export class FeatureListContainerComponent {
let componentFactory: ComponentFactory<AbstractFeatureListComponent> = this.componentFactoryResolver.resolveComponentFactory(FeatureListComponent); // default let componentFactory: ComponentFactory<AbstractFeatureListComponent> = this.componentFactoryResolver.resolveComponentFactory(FeatureListComponent); // default
let selected = -1; let selected = -1;
let maxMatches =0; let maxMatches =0;
let showItem = true; const showItem = true;
for (let i = 0; i < this.featureLists.length; i++) { for (let i = 0; i < this.featureLists.length; i++) {
let matches=0; let matches=0;
let criteria=0; let criteria=0;
@@ -64,9 +65,9 @@ export class FeatureListContainerComponent {
viewContainerRef.clear(); viewContainerRef.clear();
if(showItem) { if(showItem) {
this.componentRef = viewContainerRef.createComponent(componentFactory); this.componentRef = viewContainerRef.createComponent(componentFactory);
(<AbstractFeatureListComponent>this.componentRef.instance).features = null; (<AbstractFeatureListComponent>this.componentRef.instance).features = this.features;
(<AbstractFeatureListComponent>this.componentRef.instance).queryState = queryState; (<AbstractFeatureListComponent>this.componentRef.instance).queryState = this.queryState;
(<AbstractFeatureListComponent>this.componentRef.instance).selectedFeature = null; (<AbstractFeatureListComponent>this.componentRef.instance).selectedFeature = this.selectedFeature;
} }
} }
@@ -1,14 +1,20 @@
<div class="card border-0"> <div class="card border-0">
<div class="card-body" *ngIf="(schemeItem|async);let schemeItem"> @if ((schemeItem|async); as schemeItem) {
<fm-back-button></fm-back-button> <div class="card-body">
<h4 i18n>Farm</h4> <fm-back-button></fm-back-button>
<h3>{{schemeItem.name}}</h3> <h4 i18n>Farm</h4>
<div *ngIf="features;let features"> <h3>{{schemeItem.name}}</h3>
<div class="cropfields"> @if (features; as features) {
<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>
<fm-map-feature-list-feature-container [feature]="feature"></fm-map-feature-list-feature-container> <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> }
</div> </div>
</div> }
</div> </div>
@@ -1,22 +1,20 @@
@import "~bootstrap/scss/bootstrap.scss";
fm-map-feature-list-feature-container { fm-map-feature-list-feature-container {
width:100%; width:100%;
pointer-events:none; pointer-events:none;
} }
.row { .row {
border-bottom: 1px solid $gray-500; border-bottom: 1px solid var(--bs-gray-500);
user-select: none; user-select: none;
padding-left:1.5rem; padding-left:1.5rem;
} }
.row.selected { .row.selected {
background-color: $gray-100; background-color: var(--bs-gray-100);
} }
.cropfields { .cropfields {
border-top: 1px solid $gray-500; border-top: 1px solid var(--bs-gray-500);
margin-left: -1.25rem; margin-left: -1.25rem;
margin-right: -1.25rem; margin-right: -1.25rem;
} }
@@ -12,9 +12,10 @@ import { Observable } from 'rxjs';
@ForItemType("vnd.farmmaps.itemtype.cropfield") @ForItemType("vnd.farmmaps.itemtype.cropfield")
@Injectable() @Injectable()
@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 {
@@ -1,13 +1,17 @@
<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>
<h3><i class="far fa-farm"></i>&nbsp;<span i18n>Farms</span></h3> <h3><i class="far fa-farm"></i>&nbsp;<span i18n>Farms</span></h3>
<div *ngIf="features;let features"> @if (features; as features) {
<div class="farms"> <div>
<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="farms">
<fm-map-feature-list-feature-container [feature]="feature"></fm-map-feature-list-feature-container> @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>
</div> }
</div> </div>
</div> </div>
@@ -1,22 +1,20 @@
@import "~bootstrap/scss/bootstrap.scss";
fm-map-feature-list-feature-container { fm-map-feature-list-feature-container {
width:100%; width:100%;
pointer-events:none; pointer-events:none;
} }
.row { .row {
border-bottom: 1px solid $gray-500; border-bottom: 1px solid var(--bs-gray-500);
user-select: none; user-select: none;
padding-left:1.5rem; padding-left:1.5rem;
} }
.row.selected { .row.selected {
background-color: $gray-100; background-color: var(--bs-gray-100);
} }
.farms { .farms {
border-top: 1px solid $gray-500; border-top: 1px solid var(--bs-gray-500);
margin-left: -1.25rem; margin-left: -1.25rem;
margin-right: -1.25rem; margin-right: -1.25rem;
} }
@@ -16,7 +16,8 @@ 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 {
@@ -25,7 +26,7 @@ export class FeatureListCroppingschemeComponent extends AbstractFeatureListCompo
} }
getAction(feature:Feature<Geometry>):Action { getAction(feature:Feature<Geometry>):Action {
var queryState = tassign(mapReducers.initialState.queryState, { parentCode: feature.get('code'), itemType: "vnd.farmmaps.itemtype.cropfield" }); const queryState = tassign(mapReducers.initialState.queryState, { parentCode: feature.get('code'), itemType: "vnd.farmmaps.itemtype.cropfield" });
return new mapActions.DoQuery(queryState); return new mapActions.DoQuery(queryState);
} }
} }
@@ -6,12 +6,13 @@ import { WidgetHostDirective } from '../widget-host/widget-host.directive';
@Component({ @Component({
selector: 'fm-map-feature-list-feature-container', selector: 'fm-map-feature-list-feature-container',
template: ` template: `
<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 {
@@ -24,7 +25,7 @@ export class FeatureListFeatureContainerComponent {
@ViewChild(WidgetHostDirective, { static: true }) widgetHost: WidgetHostDirective; @ViewChild(WidgetHostDirective, { static: true }) widgetHost: WidgetHostDirective;
loadComponent() { loadComponent() {
var componentFactory: ComponentFactory<AbstractFeatureListFeatureComponent> = this.componentFactoryResolver.resolveComponentFactory(FeatureListFeatureComponent); // default let componentFactory: ComponentFactory<AbstractFeatureListFeatureComponent> = this.componentFactoryResolver.resolveComponentFactory(FeatureListFeatureComponent); // default
let selected = -1; let selected = -1;
let maxMatches =0; let maxMatches =0;
@@ -1,14 +1,16 @@
<div *ngIf="feature;let feature" class="d-flex m-0"> @if (feature; as feature) {
<div class="p-2"> <div class="d-flex m-0">
<div class="thumbnail"> <div class="p-2">
<fm-map-feature-thumbnail [feature]="feature"></fm-map-feature-thumbnail> <div class="thumbnail">
<fm-map-feature-thumbnail [feature]="feature"></fm-map-feature-thumbnail>
</div>
</div> </div>
</div> <div class="flex-grow p-2 overflow-hidden">
<div class="flex-grow p-2 overflow-hidden"> <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"><span>{{areaInHa(feature)| number:'1.2-2'}}
<div class="card-text"><span>{{areaInHa(feature)| number:'1.2-2'}}
ha</span>&nbsp;<span>{{feature.get('cropTypeName')}}</span> </div> ha</span>&nbsp;<span>{{feature.get('cropTypeName')}}</span> </div>
<div class="card-text"><span>{{feature.get('datadate')|date}}</span> - <div class="card-text"><span>{{feature.get('datadate')|date}}</span> -
<span>{{feature.get('dataenddate')|date}}</span> </div> <span>{{feature.get('dataenddate')|date}}</span> </div>
</div> </div>
</div> </div>
}
@@ -1,7 +1,3 @@
@import "~bootstrap/scss/bootstrap.scss";
.card-title { .card-title {
font-size: 1rem; font-size: 1rem;
white-space: nowrap; white-space: nowrap;
@@ -13,9 +13,10 @@ import {getArea} from 'ol/sphere';
@ForItemType("vnd.farmmaps.itemtype.cropfield") @ForItemType("vnd.farmmaps.itemtype.cropfield")
@Injectable() @Injectable()
@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 {
@@ -27,7 +28,7 @@ export class FeatureListFeatureCropfieldComponent extends AbstractFeatureListFea
areaInHa(feature:Feature<Geometry>):number { areaInHa(feature:Feature<Geometry>):number {
if(!feature) return 0; if(!feature) return 0;
// get area from faeture if 0 calculate from polygon // get area from faeture if 0 calculate from polygon
let a = feature.get('area'); const a = feature.get('area');
if(a) return a; if(a) return a;
return getArea(feature.getGeometry(),{projection:"EPSG:3857"}) / 10000; return getArea(feature.getGeometry(),{projection:"EPSG:3857"}) / 10000;
} }
@@ -1,6 +1,8 @@
<div *ngIf="feature;let feature" class="row m-0"> @if (feature; as feature) {
<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>
}
@@ -1,7 +1,3 @@
@import "~bootstrap/scss/bootstrap.scss";
.card-title { .card-title {
font-size: 1rem; font-size: 1rem;
white-space: nowrap; white-space: nowrap;
@@ -10,9 +10,10 @@ import { ForItemType } from '../for-item/for-itemtype.decorator';
@ForItemType("vnd.farmmaps.itemtype.croppingscheme") @ForItemType("vnd.farmmaps.itemtype.croppingscheme")
@Injectable() @Injectable()
@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 {
@@ -1,12 +1,18 @@
<div *ngIf="feature;let feature" class="row m-0"> @if (feature; as feature) {
<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">
<img *ngIf="feature.get('thumbnail')" [src]="config.getConfig('apiEndPoint') + '/api/v1/items/'+feature.get('code')+'/thumbnail'" /> @if (feature.get('thumbnail')) {
<div *ngIf="!feature.get('thumbnail')" [style.background-color]="itemTypeService.getColor(feature.get('itemType'))"> <img [src]="config.getConfig('apiEndPoint') + '/api/v1/items/'+feature.get('code')+'/thumbnail'" />
<i [ngClass]="itemTypeService.getIcon(feature.get('itemType'))"></i> }
</div> @if (!feature.get('thumbnail')) {
<div [style.background-color]="itemTypeService.getColor(feature.get('itemType'))">
<i [ngClass]="itemTypeService.getIcon(feature.get('itemType'))"></i>
</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>
}
@@ -1,7 +1,3 @@
@import "~bootstrap/scss/bootstrap.scss";
.card-title { .card-title {
font-size: 1rem; font-size: 1rem;
white-space: nowrap; white-space: nowrap;
@@ -18,9 +18,10 @@ export abstract class AbstractFeatureListFeatureComponent {
@Injectable() @Injectable()
@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 {
@@ -0,0 +1,20 @@
<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>
@@ -0,0 +1,20 @@
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;
}
@@ -0,0 +1,31 @@
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);
}
}
@@ -1,6 +1,10 @@
<div *ngIf="features;let features"> @if (features; as features) {
<fm-back-button></fm-back-button> <div>
<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)"> <fm-back-button></fm-back-button>
<fm-map-feature-list-feature-container [feature]="feature"></fm-map-feature-list-feature-container> @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> }
@@ -1,15 +1,13 @@
@import "~bootstrap/scss/bootstrap.scss";
fm-map-feature-list-feature-container { fm-map-feature-list-feature-container {
width: 100%; width: 100%;
pointer-events: none; pointer-events: none;
} }
.row { .row {
border-bottom: 1px solid $gray-500; border-bottom: 1px solid var(--bs-gray-500);
user-select: none; user-select: none;
} }
.row.selected { .row.selected {
background-color: $gray-100; background-color: var(--bs-gray-100);
} }
@@ -23,13 +23,14 @@ export abstract class AbstractFeatureListComponent {
handleFeatureClick(feature:Feature<Geometry>) { handleFeatureClick(feature:Feature<Geometry>) {
if(feature) { if(feature) {
let action = this.getAction(feature); this.store.dispatch(new mapActions.ClickFeature(feature));
const action = this.getAction(feature);
this.store.dispatch(action); this.store.dispatch(action);
} }
} }
getAction(feature:Feature<Geometry>):Action { getAction(feature:Feature<Geometry>):Action {
var newQuery: any = tassign(mapReducers.initialState.queryState); const newQuery: any = tassign(mapReducers.initialState.queryState);
newQuery.parentCode = feature.get('parentCode'); newQuery.parentCode = feature.get('parentCode');
newQuery.itemCode = feature.get('code'); newQuery.itemCode = feature.get('code');
newQuery.itemType = feature.get('itemType'); newQuery.itemType = feature.get('itemType');
@@ -57,9 +58,10 @@ export abstract class AbstractFeatureListComponent {
@Injectable() @Injectable()
@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 {
@@ -6,9 +6,10 @@ import * as render from 'ol/render';
import * as style from 'ol/style'; 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 {
@@ -30,7 +31,7 @@ export class GeometryThumbnailComponent implements AfterViewInit {
this.geometry, this.geometry,
this.width, this.width,
this.height); this.height);
}; }
private defaultStyle:style.Style = new style.Style({ private defaultStyle:style.Style = new style.Style({
stroke: new style.Stroke({ color: 'black',width:1.5 }) stroke: new style.Stroke({ color: 'black',width:1.5 })
@@ -52,24 +53,24 @@ export class GeometryThumbnailComponent implements AfterViewInit {
this.height); this.height);
} }
private width:number = 0; private width = 0;
private height:number = 0; private height = 0;
render(canvas,style:style.Style,geometry:Geometry,width:number,height:number) { render(canvas,style:style.Style,geometry:Geometry,width:number,height:number) {
if(canvas && canvas.nativeElement && geometry && style) { if(canvas && canvas.nativeElement && geometry && style) {
let renderContext = render.toContext(canvas.nativeElement.getContext( '2d'),{ size: [width, height] }); const renderContext = render.toContext(canvas.nativeElement.getContext( '2d'),{ size: [width, height] });
let geom = geometry.clone() as Polygon, const geom = geometry.clone() as Polygon,
line = geom.getCoordinates()[0], line = geom.getCoordinates()[0],
e = extent.boundingExtent( line ); e = extent.boundingExtent( line );
let dxy = extent.getCenter(e), const dxy = extent.getCenter(e),
sxy = [ sxy = [
(width - 2 ) / extent.getWidth(e), (width - 2 ) / extent.getWidth(e),
(height - 2 ) / extent.getHeight(e) (height - 2 ) / extent.getHeight(e)
]; ];
let dx = dxy[0], const dx = dxy[0],
dy = dxy[1], dy = dxy[1],
sx = sxy[0], sx = sxy[0],
sy = sxy[1]; sy = sxy[1];
@@ -1,10 +1,11 @@
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 'ngx-openlayers'; import { MapComponent } from '@farmmaps/ng-openlayers';
@Directive({ @Directive({
selector: '[fmMapIfZoomToShow]', selector: '[fmMapIfZoomToShow]',
standalone: false
}) })
export class ifZoomToShowDirective implements OnInit { export class ifZoomToShowDirective implements OnInit {
@Input() @Input()
@@ -43,9 +44,9 @@ export class ifZoomToShowDirective implements OnInit {
checkZoom() { checkZoom() {
if(this.layer$ && this.map$.instance) { if(this.layer$ && this.map$.instance) {
let minZoom = this.layer$.getMinZoom(); const minZoom = this.layer$.getMinZoom();
let currentZoom = this.map$.instance.getView().getZoom(); const currentZoom = this.map$.instance.getView().getZoom();
let view = currentZoom < minZoom; const view = currentZoom < minZoom;
if(view!= this.showView) { if(view!= this.showView) {
this.viewContainerRef$.clear(); this.viewContainerRef$.clear();
this.showView=view; this.showView=view;
@@ -5,12 +5,13 @@ import { IItem, IListItem } from '@farmmaps/common';
@Component({ @Component({
selector: 'fm-map-item-list-item-container', selector: 'fm-map-item-list-item-container',
template: ` template: `
<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 {
@@ -23,11 +24,11 @@ export class ItemListItemContainerComponent {
@ViewChild(WidgetHostDirective, { static: true }) widgetHost: WidgetHostDirective; @ViewChild(WidgetHostDirective, { static: true }) widgetHost: WidgetHostDirective;
loadComponent() { loadComponent() {
var componentFactory: ComponentFactory<AbstractItemListItemComponent> = this.componentFactoryResolver.resolveComponentFactory(ItemListItemComponent); // default let componentFactory: ComponentFactory<AbstractItemListItemComponent> = this.componentFactoryResolver.resolveComponentFactory(ItemListItemComponent); // default
let selected = -1; let selected = -1;
let maxMatches =0; let maxMatches =0;
let showItem = true; const showItem = true;
for (let i = 0; i < this.itemComponentList.length; i++) { for (let i = 0; i < this.itemComponentList.length; i++) {
let matches=0; let matches=0;
let criteria=0; let criteria=0;
@@ -1,4 +1,6 @@
<div *ngIf="item;let item" class="widget" [style.background-color]="itemTypeService.getColor(item.itemType)"> @if (item; as item) {
<div class="align-middle icon" [ngClass]="itemTypeService.getIcon(item.itemType)"></div> <div class="widget" [style.background-color]="itemTypeService.getColor(item.itemType)">
<div class="title">{{item.name}}</div> <div class="align-middle icon" [ngClass]="itemTypeService.getIcon(item.itemType)"></div>
</div> <div class="title">{{item.name}}</div>
</div>
}
@@ -1,5 +1,3 @@
@import "~bootstrap/scss/bootstrap.scss";
.widget { .widget {
padding:0.8rem; padding:0.8rem;
height:100%; height:100%;
@@ -13,7 +13,7 @@ export abstract class AbstractItemListItemComponent {
constructor(public store: Store<mapReducers.State | commonReducers.State>, public itemTypeService: ItemTypeService) { constructor(public store: Store<mapReducers.State | commonReducers.State>, public itemTypeService: ItemTypeService) {
} }
getScaledValue(value:number,scale:number = 0):number { getScaledValue(value:number,scale = 0):number {
let v = value; let v = value;
if(scale && scale != 0) { if(scale && scale != 0) {
v=scale*value; v=scale*value;
@@ -30,7 +30,7 @@ export abstract class AbstractItemWidgetComponent {
constructor(public store: Store<mapReducers.State | commonReducers.State>, public itemTypeService: ItemTypeService) { constructor(public store: Store<mapReducers.State | commonReducers.State>, public itemTypeService: ItemTypeService) {
} }
getScaledValue(value:number,scale:number = 0):number { getScaledValue(value:number,scale = 0):number {
let v = value; let v = value;
if(scale && scale != 0) { if(scale && scale != 0) {
v=scale*value; v=scale*value;
@@ -42,8 +42,9 @@ export abstract class AbstractItemWidgetComponent {
@Injectable() @Injectable()
@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 {
@@ -1,7 +1,11 @@
<div *ngIf="items;let items" class="widget-container pt-0"> @if (items; as items) {
<div class="widget" *ngFor="let item of items" (click)="handleItemClick(item)"> <div class="widget-container pt-0">
<div class="content"> @for (item of items; track item) {
<fm-map-item-list-item-container [item]="item" class="item-container"></fm-map-item-list-item-container> <div class="widget" (click)="handleItemClick(item)">
</div> <div class="content">
<fm-map-item-list-item-container [item]="item" class="item-container"></fm-map-item-list-item-container>
</div>
</div>
}
</div> </div>
</div> }
@@ -1,5 +1,3 @@
@import "~bootstrap/scss/bootstrap.scss";
.widget-container { .widget-container {
overflow:auto; overflow:auto;
margin-bottom:1rem; margin-bottom:1rem;
@@ -7,7 +5,7 @@
.widget { .widget {
position:relative; position:relative;
border: 1px solid $gray-500; border: 1px solid var(--bs-gray-500);
user-select: none; user-select: none;
display:inline-block; display:inline-block;
width:50%; width:50%;
@@ -28,7 +26,7 @@
} }
.widget:hover { .widget:hover {
background-color: $gray-100; background-color: var(--bs-gray-100);
} }
.widget-container { .widget-container {
@@ -15,7 +15,7 @@ export abstract class AbstractItemListComponent {
} }
handleItemClick(item:IListItem) { handleItemClick(item:IListItem) {
var newQuery: any = tassign(mapReducers.initialState.query); const newQuery: any = tassign(mapReducers.initialState.query);
newQuery.itemCode = item.code; newQuery.itemCode = item.code;
this.store.dispatch(new mapActions.DoQuery(newQuery)); this.store.dispatch(new mapActions.DoQuery(newQuery));
} }
@@ -28,9 +28,10 @@ export abstract class AbstractItemListComponent {
@Injectable() @Injectable()
@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 {
@@ -1,7 +1,11 @@
<div *ngIf="widgets;let widgets" class="widget-container pt-0"> @if (widgets; as widgets) {
<div class="widget" *ngFor="let widget of widgets"> <div class="widget-container pt-0">
<div class="content"> @for (widget of widgets; track widget) {
<ng-template #widgetTemplate></ng-template> <div class="widget">
</div> <div class="content">
<ng-template #widgetTemplate></ng-template>
</div>
</div>
}
</div> </div>
</div> }
@@ -1,5 +1,3 @@
@import "~bootstrap/scss/bootstrap.scss";
.widget-container { .widget-container {
overflow:auto; overflow:auto;
margin-bottom:1rem; margin-bottom:1rem;
@@ -7,7 +5,7 @@
.widget { .widget {
position:relative; position:relative;
border: 1px solid $gray-500; border: 1px solid var(--bs-gray-500);
user-select: none; user-select: none;
display:inline-block; display:inline-block;
width:50%; width:50%;
@@ -28,7 +26,7 @@
} }
.widget:hover { .widget:hover {
background-color: $gray-100; background-color: var(--bs-gray-100);
} }
.widget-container { .widget-container {
@@ -8,9 +8,10 @@ import { AbstractItemWidgetComponent } from '../item-list-item/item-list-item.co
@Injectable() @Injectable()
@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 {
@@ -23,10 +24,10 @@ export class ItemWidgetListComponent implements AfterViewInit {
} }
ngAfterViewInit() { ngAfterViewInit() {
let targets = this.widgetTargets.toArray(); const targets = this.widgetTargets.toArray();
if(this.widgets) { if(this.widgets) {
for (var i = 0; i < this.widgets.length; i++) { for (let i = 0; i < this.widgets.length; i++) {
var componentFactory: ComponentFactory<AbstractItemWidgetComponent> = this.componentFactoryResolver.resolveComponentFactory(this.widgets[i]['constructor'] as any); const componentFactory: ComponentFactory<AbstractItemWidgetComponent> = this.componentFactoryResolver.resolveComponentFactory(this.widgets[i]['constructor'] as any);
const viewContainerRef = targets[i]; const viewContainerRef = targets[i];
viewContainerRef.clear(); viewContainerRef.clear();
@@ -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]="baseLayers|async" [selectedLayer]="selectedBaseLayer|async" (onSelectLayer)="handleSelectBaseLayer($event)"></fm-map-layer-list> <fm-map-layer-list [baseLayers]="true" [itemLayers]="baseMaps|async" [selectedLayer]="selectedBaseLayer|async" (onSelectLayer)="handleSelectBaseLayer($event)"></fm-map-layer-list>
</div> </div>
</li> </li>
<li class="nav-item py-0"> <li class="nav-item py-0">
@@ -19,14 +19,21 @@
<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>
<li class="nav-item py-0" *ngIf="selectedItemLayer$ | async as selectedItemLayer"> @if (selectedItemLayer$ | async; as selectedItemLayer) {
<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> <li class="nav-item py-0">
<div class="mb-4"> <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>
<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 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>
</div>
</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> </div>
</li> </li>
</ul> </ul>
</div> </div>
</div> </div>
</div> </div>
@@ -1,18 +1,15 @@
@import "~bootstrap/scss/bootstrap.scss";
.layer-switcher { .layer-switcher {
display:block; display:block;
width:2.5em; width:2.5em;
height:2.5em; height:2.5em;
background-color: $body-bg; background-color: var(--bs-body-bg);
background-size: contain; background-size: contain;
margin-top:0.5em; margin-top:0.5em;
text-align: center; text-align: center;
line-height: 2.5em; line-height: 2.5em;
border-radius: 1.75em; border-radius: 1.75em;
padding: 0; padding: 0;
color: $secondary; color: var(--bs-secondary);
} }
.layer-switcher i { .layer-switcher i {
@@ -24,7 +21,7 @@
} }
.layers { .layers {
color:$secondary; color:var(--bs-secondary);
position: absolute; position: absolute;
overflow: hidden; overflow: hidden;
bottom: -1em; bottom: -1em;
@@ -4,12 +4,13 @@ import { Store } from '@ngrx/store';
import * as mapReducers from '../../reducers/map.reducer'; import * as mapReducers from '../../reducers/map.reducer';
import * as mapActions from '../../actions/map.actions'; import * as mapActions from '../../actions/map.actions';
import {createEmpty,extend } from 'ol/extent'; import {createEmpty,extend } from 'ol/extent';
import { Observable } from 'rxjs'; import { filter, map, Observable } from 'rxjs';
@Component({ @Component({
selector: 'fm-map-layer-switcher', selector: 'fm-map-layer-switcher',
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{
@@ -17,7 +18,8 @@ export class LayerSwitcher implements OnInit,OnChanges{
public overlayLayers: Observable<Array<IItemLayer>>; public overlayLayers: Observable<Array<IItemLayer>>;
public selectedOverlayLayer: Observable<IItemLayer>; public selectedOverlayLayer: Observable<IItemLayer>;
public selectedItemLayer$: Observable<IItemLayer>; public selectedItemLayer$: Observable<IItemLayer>;
public baseLayers: Observable<Array<IItemLayer>>; public baseMaps: Observable<Array<IItemLayer>>;
public aerialMaps: Observable<Array<IItemLayer>>;
public selectedBaseLayer: Observable<IItemLayer>; public selectedBaseLayer: Observable<IItemLayer>;
constructor( private store: Store<mapReducers.State>) { constructor( private store: Store<mapReducers.State>) {
@@ -26,7 +28,8 @@ export class LayerSwitcher implements OnInit,OnChanges{
ngOnInit() { ngOnInit() {
this.overlayLayers = this.store.select(mapReducers.selectGetOverlayLayers); this.overlayLayers = this.store.select(mapReducers.selectGetOverlayLayers);
this.selectedOverlayLayer = this.store.select(mapReducers.selectGetSelectedOverlayLayer); this.selectedOverlayLayer = this.store.select(mapReducers.selectGetSelectedOverlayLayer);
this.baseLayers = this.store.select(mapReducers.selectGetBaseLayers); this.baseMaps = this.store.select(mapReducers.selectGetBaseMaps);
this.aerialMaps = this.store.select(mapReducers.selectGetArealMaps);
this.selectedBaseLayer = this.store.select(mapReducers.selectGetSelectedBaseLayer); this.selectedBaseLayer = this.store.select(mapReducers.selectGetSelectedBaseLayer);
this.selectedItemLayer$ = this.store.select(mapReducers.selectGetSelectedItemLayer) this.selectedItemLayer$ = this.store.select(mapReducers.selectGetSelectedItemLayer)
this.showLayerSwitcher = this.store.select(mapReducers.selectGetShowLayerSwitcher); this.showLayerSwitcher = this.store.select(mapReducers.selectGetShowLayerSwitcher);
@@ -62,7 +65,7 @@ export class LayerSwitcher implements OnInit,OnChanges{
} }
handleZoomToExtent(itemLayer: IItemLayer) { handleZoomToExtent(itemLayer: IItemLayer) {
var extent = createEmpty(); const extent = createEmpty();
extend(extent, itemLayer.layer.getExtent()); extend(extent, itemLayer.layer.getExtent());
if (extent) { if (extent) {
this.store.dispatch(new mapActions.SetExtent(extent)); this.store.dispatch(new mapActions.SetExtent(extent));
@@ -83,3 +86,4 @@ export class LayerSwitcher implements OnInit,OnChanges{
event.preventDefault(); event.preventDefault();
} }
} }
@@ -1,15 +1,15 @@
<div class="row ps-3"> <div class="row ps-3">
<div class="col-8 nopadding"><span i18n>Average</span>:</div> <div class="col-8 nopadding"><span i18n>Average</span>:</div>
<div class="col-4 pull-left nopadding">{{histogram.mean| number:'1.0-2'}}</div> <div class="col-4 pull-left nopadding">{{ getScaledValue(histogram.mean)| number:'1.0-2'}}</div>
<div class="col-8 nopadding"><span i18n>Standard deviation</span>:</div> <div class="col-8 nopadding"><span i18n>Standard deviation</span>:</div>
<div class="col-4 pull-left nopadding">{{histogram.stddev| number:'1.0-2'}}</div> <div class="col-4 pull-left nopadding">{{ getScaledValue(histogram.stddev)| number:'1.0-2'}}</div>
<div class="col-8 nopadding"><span i18n>Min</span>:</div> <div class="col-8 nopadding"><span i18n>Min</span>:</div>
<div class="col-4 pull-left nopadding">{{histogram.min| number:'1.0-2'}}</div> <div class="col-4 pull-left nopadding">{{ getScaledValue(histogram.min)| number:'1.0-2'}}</div>
<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">{{histogram.max| number:'1.0-2'}}</div> <div class="col-4 pull-left nopadding">{{ getScaledValue(histogram.max)| number:'1.0-2'}}</div>
<ng-container *ngIf="showConfidenceInterval()"> @if (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">{{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>
@@ -2,18 +2,30 @@ import {Component, Input} from '@angular/core';
import {IHistogram, ILayer} from '../../../models/color.map'; import {IHistogram, ILayer} from '../../../models/color.map';
@Component({ @Component({
selector: 'fm-map-histogram-details', selector: 'fm-map-histogram-details',
templateUrl: './histogram-details.component.html', templateUrl: './histogram-details.component.html',
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 {
@Input() @Input()
histogram: IHistogram; histogram: IHistogram;
@Input()
scale: number | null;
public getScaledValue(value: number): number {
let v = value;
if (this.scale && this.scale != 0) {
v = this.scale * value;
}
return v;
}
showConfidenceInterval(): boolean { showConfidenceInterval(): boolean {
return this.histogram.confidence != null && this.histogram.confidence !== 1; return this.histogram.confidence != null && this.histogram.confidence !== 1;
} }
@@ -1,46 +1,66 @@
<table class="container" *ngIf="showLegend()"> @if (showLegend()) {
<tr> <table class="container">
<td colspan="3"> <tr>
<div class="title"> <td colspan="3">
<h4 *ngIf="showTitle">{{layer.name}}</h4> <div class="title">
<b *ngIf="layer.unit">({{layer.unit}})</b> @if (showTitle) {
</div> <h4>{{layer.name}}</h4>
</td> }
<td> @if (layer.unit) {
<a i18n-title title="more info"><i class="fal fa-info-circle text-primary" (click)="hideHistogramDetails = !hideHistogramDetails"></i></a> <b>({{layer.unit}})</b>
</td> }
<td colspan="2"> </div>
<div class="title" *ngIf="histogramenabled"> </td>
<h4>{{histogram}}</h4> <td>
<b *ngIf="histogramunit">({{histogramunit}})</b> <a i18n-title title="more info"><i class="fal fa-info-circle text-primary" (click)="hideHistogramDetails = !hideHistogramDetails"></i></a>
</div> </td>
</td> <td colspan="2">
</tr> @if (histogramenabled) {
<tr *ngFor="let entry of layer.renderer.colorMap.entries; let i = index "> <div class="title">
<td class="legend-items"><span [style.background-color]="getAlphaHex(entry.color)" [style.border-color]="getHex(entry.color)"class="color"></span></td> <h4>{{histogram}}</h4>
<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> @if (histogramunit) {
<td class="histogram-items"> <b>({{histogramunit}})</b>
<div *ngIf="showHistogram()"> }
<span class="bar" [style.background-color]="getHex(entry.color)" [style.width]="getPart(layer.renderer, i)"> </div>
</span> }
<span *ngIf="getPercentage(layer.renderer,i) as percentage" class="bar-label">{{percentage | number:'1.0-2'}} %</span> </td>
</div> </tr>
</td> @for (entry of layer.renderer.colorMap.entries; track entry; let i = $index) {
</tr> <tr>
<tr *ngIf="showHistogram()"> <td class="legend-items"><span [style.background-color]="getAlphaHex(entry.color)" [style.border-color]="getHex(entry.color)"class="color"></span></td>
<td colspan="4" class="pb-1 pt-1"> <td class="legend-items-text">@if (!entry.label) {
<div class="info" [ngbCollapse]="hideHistogramDetails"> <span>{{getScaledValue(entry.value,layer.scale) | number:'1.0-2'}} {{legendunit}}</span>
<ng-container *ngIf="bandContainsStatistics(); else histogram"> }@if (entry.label) {
<fm-map-statistics-details [statistics]="layer.renderer.band.statistics"></fm-map-statistics-details> <span>{{entry.label}}</span>
</ng-container> }</td>
<td class="histogram-items">
<ng-template #histogram> @if (showHistogram()) {
<fm-map-histogram-details [histogram]="layer.renderer.band.histogram"></fm-map-histogram-details> <div>
</ng-template> <span class="bar" [style.background-color]="getHex(entry.color)" [style.width]="getPart(layer.renderer, i)">
</div> </span>
</td> @if (getPercentage(layer.renderer,i); as percentage) {
</tr> <span class="bar-label">{{percentage | number:'1.0-2'}} %</span>
</table> }
</div>
}
</td>
</tr>
}
@if (showHistogram()) {
<tr>
<td colspan="4" class="pb-1 pt-1">
<div class="info" [ngbCollapse]="hideHistogramDetails">
@if (bandContainsStatistics()) {
<fm-map-statistics-details [statistics]="layer.renderer.band.statistics" [scale]="layer.scale"></fm-map-statistics-details>
} @else {
<fm-map-histogram-details [histogram]="layer.renderer.band.histogram" [scale]="layer.scale"></fm-map-histogram-details>
}
</div>
</td>
</tr>
}
</table>
}
@@ -3,9 +3,10 @@ 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 {
@@ -29,7 +30,7 @@ export class LegendComponent implements OnInit,AfterViewInit {
histogram: string; histogram: string;
@Input() @Input()
showTitle: boolean = true; showTitle = true;
@Input() @Input()
histogramenabled: boolean; histogramenabled: boolean;
@@ -40,7 +41,7 @@ export class LegendComponent implements OnInit,AfterViewInit {
@Input() @Input()
histogramunit: string; histogramunit: string;
public hideHistogramDetails:boolean = true; public hideHistogramDetails = true;
onClickHistoGram(): void { onClickHistoGram(): void {
this.histogramenabled = !this.histogramenabled; this.histogramenabled = !this.histogramenabled;
@@ -63,9 +64,9 @@ export class LegendComponent implements OnInit,AfterViewInit {
} }
public getPart(renderer: IRenderer, index: number): string { public getPart(renderer: IRenderer, index: number): string {
let max = renderer.band.histogram.entries.reduce((max, entry) => entry.freqency > max ? entry.freqency : max, 0); const max = renderer.band.histogram.entries.reduce((max, entry) => entry.freqency > max ? entry.freqency : max, 0);
let scale = 65 / max; const scale = 65 / max;
let part = (renderer.band.histogram.entries[index].freqency * scale) + "%"; const part = (renderer.band.histogram.entries[index].freqency * scale) + "%";
return part; return part;
} }
@@ -79,8 +80,8 @@ export class LegendComponent implements OnInit,AfterViewInit {
} }
public getPercentage(renderer: IRenderer, index: number): number { public getPercentage(renderer: IRenderer, index: number): number {
let scale = 100 / renderer.band.histogram.entries.reduce((sum, entry) => sum + entry.freqency, 0); const scale = 100 / renderer.band.histogram.entries.reduce((sum, entry) => sum + entry.freqency, 0);
let percent = renderer.band.histogram.entries[index].freqency * scale; const percent = renderer.band.histogram.entries[index].freqency * scale;
return percent < 0.1 ? null : percent; return percent < 0.1 ? null : percent;
} }
@@ -2,23 +2,23 @@
<div class="col-8 nopadding"><span i18n>Data points</span>:</div> <div class="col-8 nopadding"><span i18n>Data points</span>:</div>
<div class="col-4 pull-left nopadding">{{statistics.populationCount}}</div> <div class="col-4 pull-left nopadding">{{statistics.populationCount}}</div>
<div class="col-8 nopadding"><span i18n>Min</span>:</div> <div class="col-8 nopadding"><span i18n>Min</span>:</div>
<div class="col-4 pull-left nopadding">{{statistics.min| number:'1.0-2'}}</div> <div class="col-4 pull-left nopadding">{{getScaledValue(statistics.min)| number:'1.0-2'}}</div>
<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">{{statistics.max| number:'1.0-2'}}</div> <div class="col-4 pull-left nopadding">{{getScaledValue(statistics.max)| number:'1.0-2'}}</div>
<div class="col-8 nopadding"><span i18n>Min+1</span>:</div> <div class="col-8 nopadding"><span i18n>Min+1</span>:</div>
<div class="col-4 pull-left nopadding">{{statistics.minPlus| number:'1.0-2'}}</div> <div class="col-4 pull-left nopadding">{{getScaledValue(statistics.minPlus)| number:'1.0-2'}}</div>
<div class="col-8 nopadding"><span i18n>Max-1</span>:</div> <div class="col-8 nopadding"><span i18n>Max-1</span>:</div>
<div class="col-4 pull-left nopadding">{{statistics.maxMinus| number:'1.0-2'}}</div> <div class="col-4 pull-left nopadding">{{getScaledValue(statistics.maxMinus)| number:'1.0-2'}}</div>
<div class="col-8 nopadding"><span i18n>Average</span>:</div> <div class="col-8 nopadding"><span i18n>Average</span>:</div>
<div class="col-4 pull-left nopadding">{{statistics.mean| number:'1.0-2'}}</div> <div class="col-4 pull-left nopadding">{{getScaledValue(statistics.mean)| number:'1.0-2'}}</div>
<div class="col-8 nopadding"><span i18n>Standard deviation</span>:</div> <div class="col-8 nopadding"><span i18n>Standard deviation</span>:</div>
<div class="col-4 pull-left nopadding">{{statistics.stddev| number:'1.0-2'}}</div> <div class="col-4 pull-left nopadding">{{getScaledValue(statistics.stddev)| number:'1.0-2'}}</div>
<div class="col-8 nopadding"><span i18n>Mode</span>:</div> <div class="col-8 nopadding"><span i18n>Mode</span>:</div>
<div class="col-4 pull-left nopadding">{{statistics.mode| number:'1.0-2'}}</div> <div class="col-4 pull-left nopadding">{{getScaledValue(statistics.mode)| number:'1.0-2'}}</div>
<div class="col-8 nopadding"><span i18n>Median</span>:</div> <div class="col-8 nopadding"><span i18n>Median</span>:</div>
<div class="col-4 pull-left nopadding">{{statistics.median| number:'1.0-2'}}</div> <div class="col-4 pull-left nopadding">{{getScaledValue(statistics.median)| number:'1.0-2'}}</div>
<div class="col-8 nopadding"><span i18n>Kurtosis</span>:</div> <div class="col-8 nopadding"><span i18n>Kurtosis</span>:</div>
<div class="col-4 pull-left nopadding">{{statistics.curtosis| number:'1.0-2'}}</div> <div class="col-4 pull-left nopadding">{{statistics.curtosis| number:'1.0-2'}}</div>
@@ -26,11 +26,11 @@
<div class="col-4 pull-left nopadding">{{statistics.skewness| number:'1.0-2'}}</div> <div class="col-4 pull-left nopadding">{{statistics.skewness| number:'1.0-2'}}</div>
<div class="col-8 nopadding"><span i18n>Variance</span>:</div> <div class="col-8 nopadding"><span i18n>Variance</span>:</div>
<div class="col-4 pull-left nopadding">{{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>
<ng-container *ngIf="statistics.confidenceIntervalLow !== undefined"> @if (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">{{statistics.confidenceIntervalLow | number:'1.0-2'}} - {{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>
@@ -1,16 +1,36 @@
import {Component, Input} from '@angular/core'; import { Component, Input } from '@angular/core';
import {IStatistics} from '../../../models/color.map'; import { IStatistics } from '../../../models/color.map';
@Component({ @Component({
selector: 'fm-map-statistics-details', selector: 'fm-map-statistics-details',
templateUrl: './statistics-details.component.html', templateUrl: './statistics-details.component.html',
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 {
@Input() @Input()
statistics: IStatistics; statistics: IStatistics;
@Input()
scale: number | null;
public getScaledValue(value: number): number {
let v = value;
if (this.scale && this.scale != 0) {
v = this.scale * value;
}
return v;
}
public getSquaredScaledValue(value: number): number {
let v = value;
if (this.scale && this.scale != 0) {
v = (this.scale * this.scale) * value;
}
return v;
}
} }
@@ -1,5 +1,3 @@
@import "~bootstrap/scss/bootstrap.scss";
div.map-search { div.map-search {
position: absolute; position: absolute;
top: 0.5rem; top: 0.5rem;
@@ -16,7 +14,7 @@ div.map-search {
} }
.disabled { .disabled {
color:lighten(#000000,80%); color: adjust(#000000,80%);
} }
:host ::ng-deep ngb-typeahead-window.dropdown-menu { :host ::ng-deep ngb-typeahead-window.dropdown-menu {
@@ -106,7 +104,7 @@ div.map-search.searchcollapsed button[type="submit"] {
} }
.form-control, .form-control:focus { .form-control, .form-control:focus {
border-color: $secondary; border-color: var(--bs-secondary);
} }
@@ -7,9 +7,10 @@ import { IPeriodState } from '../../models/period.state';
import { tassign } from 'tassign'; 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 {
@@ -50,21 +51,21 @@ export class MapSearchComponent {
} }
} }
public collapsedLocal: boolean = true; public collapsedLocal = true;
public searchMinifiedLocal: boolean = false; public searchMinifiedLocal = false;
public periodLocal: IPeriodState = { startDate:new Date(new Date(Date.now()).getFullYear(), new Date(Date.now()).getMonth() - 3, 1), endDate:new Date(Date.now())}; public periodLocal: IPeriodState = { startDate:new Date(new Date(Date.now()).getFullYear(), new Date(Date.now()).getMonth() - 3, 1), endDate:new Date(Date.now())};
public filterOptionsLocal: IQueryState; public filterOptionsLocal: IQueryState;
private extent: number[]; private extent: number[];
public searchTextLocal: any; public searchTextLocal: any;
public searchTextLocalOutput: string; public searchTextLocalOutput: string;
public dateFilter: boolean = true; public dateFilter = true;
public startEndCaption: string = this.timespanService.getCaption(this.periodLocal.startDate, this.periodLocal.endDate, 4); public startEndCaption: string = this.timespanService.getCaption(this.periodLocal.startDate, this.periodLocal.endDate, 4);
searching = false; searching = false;
searchFailed = false; searchFailed = false;
hideSearchingWhenUnsubscribed = new Observable(() => () => this.searching = false); hideSearchingWhenUnsubscribed = new Observable(() => () => this.searching = false);
public disabled: boolean = true; public disabled = true;
constructor(private typeaheadService: TypeaheadService, private timespanService: TimespanService) { constructor(private typeaheadService: TypeaheadService, private timespanService: TimespanService) {
this.filterOptionsLocal = { query: "", tags: "", startDate: null, endDate: null, bboxFilter: false, itemType: null, itemCode:null,level:0,parentCode:null,bbox:[] }; this.filterOptionsLocal = { query: "", tags: "", startDate: null, endDate: null, bboxFilter: false, itemType: null, itemCode:null,level:0,parentCode:null,bbox:[] };
@@ -1,4 +1,4 @@
<ng-container *ngIf="{ @if ({
mapState:mapState$|async, mapState:mapState$|async,
extent:extent$|async, extent:extent$|async,
baseLayers:baseLayers$|async, baseLayers:baseLayers$|async,
@@ -10,6 +10,7 @@
panelVisible:panelVisible$|async, panelVisible:panelVisible$|async,
openedModalName:openedModalName$|async, openedModalName:openedModalName$|async,
panelCollapsed:panelCollapsed$|async, panelCollapsed:panelCollapsed$|async,
panelExtraWide:panelExtraWide$|async,
searchMinified:searchMinified$|async, searchMinified:searchMinified$|async,
selectedItem:selectedItem$|async, selectedItem:selectedItem$|async,
parentItem:parentItem$|async, parentItem:parentItem$|async,
@@ -21,23 +22,25 @@
styles:styles$|async, styles:styles$|async,
selectedFeature:selectedFeature$|async, selectedFeature:selectedFeature$|async,
fullscreen:fullscreen$|async, fullscreen:fullscreen$|async,
showDataLayerSlide:showDataLayerSlide$|async showDataLayerSlide:showDataLayerSlide$|async,
} as state"> menuVisible:menuVisible$|async
}; 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>
<fm-map-item-layers *ngIf="!overrideOverlayLayers" [itemLayers]="state.overlayLayers"></fm-map-item-layers> @if (!overrideOverlayLayers) {
<fm-map-item-layers *ngIf="!overrideSelectedItemLayer" [itemLayer]="state.selectedItemLayer" (onPrerender)="handlePrerender($event)"></fm-map-item-layers> <fm-map-item-layers [itemLayers]="state.overlayLayers"></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>
@@ -58,37 +61,49 @@
</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 *ngIf="noContent"> <div>
<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"> @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> <div class="panel-top bg-secondary">
<div class="panel-bottom"> </div>
}
<div *ngIf="!(state.selectedItem)"> <div class="panel-bottom">
<fm-map-feature-list-container [features]="state.features" [selectedFeature]="state.selectedFeature" [queryState]="state.queryState" [clickedFeature]="clickedFeature"></fm-map-feature-list-container> @if (!(state.selectedItem)) {
</div> <div>
<fm-map-feature-list-container [features]="state.features" [selectedFeature]="state.selectedFeature" [queryState]="state.queryState" [clickedFeature]="clickedFeature"></fm-map-feature-list-container>
<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> }
</div> @if (state.selectedItem; as item) {
<div *ngIf="state.features.length == 0" class="no-results m-2"> <div>
<div *ngIf="state.queryState.query">Cannot find <span>{{state.queryState?.query}}</span></div> <fm-map-selected-item-container [item]="item" [parentItem]="state.parentItem" [itemLayer]="state.selectedItemLayer" [overlayLayers]="state.overlayLayers"></fm-map-selected-item-container>
<div *ngIf="state.queryState?.tags">Cannot find tag <span>{{state.queryState?.tags}}</span></div> </div>
}
@if (state.features.length == 0) {
<div class="no-results m-2">
@if (state.queryState.query) {
<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>
</div> }
</fm-side-panel> </fm-side-panel>
<fm-side-panel [resizeable]="true" [visible]="!noContent"> <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> }
@@ -1,5 +1,3 @@
@import "~bootstrap/scss/bootstrap.scss";
aol-map { position:absolute;width:100%;height:calc( 100vh );} aol-map { position:absolute;width:100%;height:calc( 100vh );}
.arrow { .arrow {
@@ -54,11 +52,20 @@ aol-map { position:absolute;width:100%;height:calc( 100vh );}
pointer-events: none; pointer-events: none;
} }
@media screen and (max-width: 768px) {
.control-container {
margin-left: 1em;
margin-right: 1em;
pointer-events: all;
}
}
.control-container { @media screen and (min-width: 768px) {
float:right; .control-container {
margin-right: 1em; float: right;
pointer-events: all; margin-right: 1em;
pointer-events: all;
}
} }
.fullscreen .viewport-container { .fullscreen .viewport-container {
@@ -195,7 +202,7 @@ timespan.menuVisible {
width: 4rem; width: 4rem;
overflow: hidden; overflow: hidden;
text-overflow: ellipsis; text-overflow: ellipsis;
color: $primary; color: var(--bs-primary);
} }
.shortcut-icon > .farm-icon { .shortcut-icon > .farm-icon {
@@ -1,51 +1,52 @@
import { Component, OnInit, OnDestroy, HostListener, ViewChild, AfterViewInit,NgZone,ElementRef } from '@angular/core'; import { Component, OnInit, OnDestroy, HostListener, ViewChild, AfterViewInit, NgZone, ElementRef } from '@angular/core';
import { Location } from '@angular/common'; import { Location } from '@angular/common';
import { Observable, Subject, Subscription, from,of ,EMPTY } from 'rxjs'; import { Observable, Subject, Subscription, from, of, EMPTY } from 'rxjs';
import { withLatestFrom, switchMap,skip } from 'rxjs/operators'; import { withLatestFrom, switchMap, skip } from 'rxjs/operators';
import { Router, ActivatedRoute, ParamMap } from '@angular/router'; import { Router, ActivatedRoute, ParamMap } from '@angular/router';
import { Store } from '@ngrx/store'; import { Store } from '@ngrx/store';
import { DeviceService } from '@farmmaps/common'; import { DeviceService } from '@farmmaps/common';
import {getRenderPixel} from 'ol/render'; import { getRenderPixel } from 'ol/render';
// Map // Map
import * as mapReducers from '../../reducers/map.reducer'; import * as mapReducers from '../../reducers/map.reducer';
import * as mapActions from '../../actions/map.actions'; import * as mapActions from '../../actions/map.actions';
import { IMapState} from '../../models/map.state'; import { IMapState } from '../../models/map.state';
import { IClickedFeature} from '../../models/clicked.feature'; import { IClickedFeature } from '../../models/clicked.feature';
import { IQuery } from '../../reducers/map.reducer' import { IQuery } from '../../reducers/map.reducer'
import { ISelectedFeatures } from '../../models/selected.features'; import { ISelectedFeatures } from '../../models/selected.features';
import { IItemLayer } from '../../models/item.layer'; import { IItemLayer } from '../../models/item.layer';
import { IListItem, IQueryState } from '@farmmaps/common'; import { IListItem, IQueryState } from '@farmmaps/common';
import { IPeriodState } from '../../models/period.state'; import { IPeriodState } from '../../models/period.state';
import {IStyles} from '../../models/style.cache'; import { IStyles } from '../../models/style.cache';
import { IDroppedFile } from '../aol/file-drop-target/file-drop-target.component'; import { IDroppedFile } from '../aol/file-drop-target/file-drop-target.component';
import { StateSerializerService } from '@farmmaps/common'; import { StateSerializerService } from '@farmmaps/common';
import { GeolocationService} from '../../services/geolocation.service'; import { GeolocationService } from '../../services/geolocation.service';
import { GeolocatorService } from '@farmmaps/common'; import { GeolocatorService } from '@farmmaps/common';
import {DeviceOrientationService} from '../../services/device-orientation.service'; import { DeviceOrientationService } from '../../services/device-orientation.service';
// AppCommon // AppCommon
import { ResumableFileUploadService, ItemTypeService } from '@farmmaps/common'; import { ResumableFileUploadService, ItemTypeService } from '@farmmaps/common';
import { IItemType, IItem } from '@farmmaps/common'; import { IItemType, IItem } from '@farmmaps/common';
import {commonReducers} from '@farmmaps/common'; import { commonReducers } from '@farmmaps/common';
import {commonActions} from '@farmmaps/common'; import { commonActions } from '@farmmaps/common';
import {Feature} from 'ol'; import { Feature } from 'ol';
import {Geometry,Point,Circle} from 'ol/geom'; import { Geometry, Point, Circle } from 'ol/geom';
import {Extent,createEmpty,extend } from 'ol/extent'; import { Extent, createEmpty, extend } from 'ol/extent';
import {transform} from 'ol/proj'; import { transform } from 'ol/proj';
import { tassign } from 'tassign'; import { tassign } from 'tassign';
import * as style from 'ol/style'; import * as style from 'ol/style';
@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 {
title: string = 'Map'; title = 'Map';
public openedModalName$: Observable<string> = this.store.select(commonReducers.selectOpenedModalName); public openedModalName$: Observable<string> = this.store.select(commonReducers.selectOpenedModalName);
public itemTypes$: Observable<{ [id: string]: IItemType }>; public itemTypes$: Observable<{ [id: string]: IItemType }>;
public mapState$: Observable<IMapState> = this.store.select(mapReducers.selectGetMapState); public mapState$: Observable<IMapState> = this.store.select(mapReducers.selectGetMapState);
@@ -54,47 +55,50 @@ export class MapComponent implements OnInit, OnDestroy,AfterViewInit {
public selectedOverlayLayer$: Observable<IItemLayer> = this.store.select(mapReducers.selectGetSelectedOverlayLayer); public selectedOverlayLayer$: Observable<IItemLayer> = this.store.select(mapReducers.selectGetSelectedOverlayLayer);
public selectedItemLayer$: Observable<IItemLayer> = this.store.select(mapReducers.selectGetSelectedItemLayer); public selectedItemLayer$: Observable<IItemLayer> = this.store.select(mapReducers.selectGetSelectedItemLayer);
public baseLayers$: Observable<Array<IItemLayer>> = this.store.select(mapReducers.selectGetBaseLayers); public baseLayers$: Observable<Array<IItemLayer>> = this.store.select(mapReducers.selectGetBaseLayers);
public selectedBaseLayer$: Observable<IItemLayer> = this.store.select(mapReducers.selectGetSelectedBaseLayer); public selectedBaseLayer$: Observable<IItemLayer> = this.store.select(mapReducers.selectGetSelectedBaseLayer);
public projection$: Observable<string> = this.store.select(mapReducers.selectGetProjection); public projection$: Observable<string> = this.store.select(mapReducers.selectGetProjection);
public selectedFeatures$: Subject<ISelectedFeatures> = new Subject<ISelectedFeatures>(); public selectedFeatures$: Subject<ISelectedFeatures> = new Subject<ISelectedFeatures>();
public droppedFile$: Subject<IDroppedFile> = new Subject<IDroppedFile>(); public droppedFile$: Subject<IDroppedFile> = new Subject<IDroppedFile>();
private paramSub: Subscription; private paramSub: Subscription;
private itemTypeSub: Subscription; private itemTypeSub: Subscription;
private stateSub: Subscription; private stateSub: Subscription;
private queryStateSub: Subscription; private queryStateSub: Subscription;
private querySub: Subscription; private querySub: Subscription;
public parentCode$: Observable<string> =this.store.select(mapReducers.selectGetParentCode); public parentCode$: Observable<string> = this.store.select(mapReducers.selectGetParentCode);
public panelVisible$: Observable<boolean> = this.store.select(mapReducers.selectGetPanelVisible); public panelVisible$: Observable<boolean> = this.store.select(mapReducers.selectGetPanelVisible);
public panelCollapsed$: Observable<boolean> = this.store.select(mapReducers.selectGetPanelCollapsed); public panelCollapsed$: Observable<boolean> = this.store.select(mapReducers.selectGetPanelCollapsed);
public panelExtraWide$: Observable<boolean> = this.store.select(mapReducers.selectGetPanelExtraWide);
public selectedFeature$: Observable<Feature<Geometry>> = this.store.select(mapReducers.selectGetSelectedFeature); public selectedFeature$: Observable<Feature<Geometry>> = this.store.select(mapReducers.selectGetSelectedFeature);
public clickedFeature: Subject<Feature<Geometry>> = new Subject<Feature<Geometry>>(); public clickedFeature: Subject<Feature<Geometry>> = new Subject<Feature<Geometry>>();
public selectedItem$: Observable<IItem> = this.store.select(mapReducers.selectGetSelectedItem); public selectedItem$: Observable<IItem> = this.store.select(mapReducers.selectGetSelectedItem);
public parentItem$: Observable<IItem> =this.store.select(mapReducers.selectGetParentItem); public parentItem$: Observable<IItem> = this.store.select(mapReducers.selectGetParentItem);
public queryState$: Observable<IQueryState> = this.store.select(mapReducers.selectGetQueryState); public queryState$: Observable<IQueryState> = this.store.select(mapReducers.selectGetQueryState);
public state$:Observable<{mapState:IMapState,queryState:IQueryState}> = this.store.select(mapReducers.selectGetState); public state$: Observable<{ mapState: IMapState, queryState: IQueryState }> = this.store.select(mapReducers.selectGetState);
public period$: Observable<IPeriodState> = this.store.select(mapReducers.selectGetPeriod); public period$: Observable<IPeriodState> = this.store.select(mapReducers.selectGetPeriod);
public clearEnabled$: Observable<boolean> = this.store.select(mapReducers.selectGetClearEnabled); public clearEnabled$: Observable<boolean> = this.store.select(mapReducers.selectGetClearEnabled);
public searchCollapsed$: Observable<boolean> = this.store.select(mapReducers.selectGetSearchCollapsed); public searchCollapsed$: Observable<boolean> = this.store.select(mapReducers.selectGetSearchCollapsed);
public searchMinified$: Observable<boolean> = this.store.select(mapReducers.selectGetSearchMinified); public searchMinified$: Observable<boolean> = this.store.select(mapReducers.selectGetSearchMinified);
public showDataLayerSlide$: Observable<boolean> = this.store.select(mapReducers.selectGetShowdataLayerSlide); public showDataLayerSlide$: Observable<boolean> = this.store.select(mapReducers.selectGetShowdataLayerSlide);
public menuVisible$: Observable<boolean>; public menuVisible$: Observable<boolean>;
public query$: Observable<IQuery> = this.store.select(mapReducers.selectGetQuery); public query$: Observable<IQuery> = this.store.select(mapReducers.selectGetQuery);
public position$: Observable<GeolocationPosition> = this.geolocationService.getCurrentPosition(); public position$: Observable<GeolocationPosition> = this.geolocationService.getCurrentPosition();
public compassHeading$: Observable<number> = this.deviceorientationService.getCurrentCompassHeading(); public compassHeading$: Observable<number> = this.deviceorientationService.getCurrentCompassHeading();
public baseLayersCollapsed:boolean = true; public baseLayersCollapsed = true;
public overlayLayersCollapsed: boolean = true; public overlayLayersCollapsed = true;
public extent$: Observable<Extent> = this.store.select(mapReducers.selectGetExtent); public extent$: Observable<Extent> = this.store.select(mapReducers.selectGetExtent);
public styles$:Observable<IStyles> = this.store.select(mapReducers.selectGetStyles); public styles$: Observable<IStyles> = this.store.select(mapReducers.selectGetStyles);
public fullscreen$: Observable<boolean> = this.store.select(commonReducers.selectGetFullScreen); public fullscreen$: Observable<boolean> = this.store.select(commonReducers.selectGetFullScreen);
private lastUrl = ""; private lastUrl = "";
private initialized: boolean = false; private initialized = false;
public noContent: boolean = false; public noContent = false;
public overrideSelectedItemLayer: boolean = false; public overrideSelectedItemLayer = false;
public overrideOverlayLayers: boolean = false; public overrideOverlayLayers = false;
public dataLayerSlideValue:number = 50; public hideShowLayerValues = false;
public const
public dataLayerSlideValue = 50;
public dataLayerSlideEnabled = false; public dataLayerSlideEnabled = false;
private visibleAreaBottom = 0; private visibleAreaBottom = 0;
private viewEnabled: boolean = true; private viewEnabled = true;
@ViewChild('map') map; @ViewChild('map') map;
@ViewChild('contentDiv') contentDiv: ElementRef; @ViewChild('contentDiv') contentDiv: ElementRef;
@@ -109,70 +113,71 @@ export class MapComponent implements OnInit, OnDestroy,AfterViewInit {
private geolocationService: GeolocationService, private geolocationService: GeolocationService,
private geolocaterService: GeolocatorService, private geolocaterService: GeolocatorService,
private zone: NgZone, private zone: NgZone,
private deviceorientationService:DeviceOrientationService, private deviceorientationService: DeviceOrientationService,
public devicesService:DeviceService) { public devicesService: DeviceService) {
if(route && route.snapshot && route.snapshot.data && route.snapshot.data["fm-map-map"]) { if (route && route.snapshot && route.snapshot.data && route.snapshot.data["fm-map-map"]) {
let params = route.snapshot.data["fm-map-map"]; const params = route.snapshot.data["fm-map-map"];
this.overrideSelectedItemLayer = params["overrideSelectedItemlayer"] ? params["overrideSelectedItemlayer"] : false; this.overrideSelectedItemLayer = params["overrideSelectedItemlayer"] ? params["overrideSelectedItemlayer"] : false;
this.overrideOverlayLayers = params["overrideOverlayLayers"] ? params["overrideOverlayLayers"] : false; this.overrideOverlayLayers = params["overrideOverlayLayers"] ? params["overrideOverlayLayers"] : false;
} this.hideShowLayerValues = params["hideShowLayerValues"] ? params["hideShowLayerValues"] : false;
this.querySub = this.query$.pipe(skip(1), withLatestFrom(this.mapState$)).subscribe(([query,mapState]) =>{ }
if(query && query.querystate) { this.querySub = this.query$.pipe(skip(1), withLatestFrom(this.mapState$)).subscribe(([query, mapState]) => {
let newQueryState = tassign(mapReducers.initialQueryState); if (query && query.querystate) {
console.debug(`Do Query`); let newQueryState = tassign(mapReducers.initialQueryState);
let urlparts=[]; //console.debug(`Do Query`);
if (query.querystate.itemCode && query.querystate.itemCode != "") { const urlparts = [];
if(query.querystate.itemType && query.querystate.itemType!= "") { if (query.querystate.itemCode && query.querystate.itemCode != "") {
let itemType = this.itemTypeService.itemTypes[query.querystate.itemType]; if (query.querystate.itemType && query.querystate.itemType != "") {
if (itemType && itemType.viewer && itemType.viewer == "edit_in_editor" && itemType.editor) { const itemType = this.itemTypeService.itemTypes[query.querystate.itemType];
urlparts.push('/editor'); if (itemType && itemType.viewer && itemType.viewer == "edit_in_editor" && itemType.editor) {
urlparts.push(itemType.editor); urlparts.push('/editor');
urlparts.push('item'); urlparts.push(itemType.editor);
urlparts.push(query.querystate.itemCode); urlparts.push('item');
} urlparts.push(query.querystate.itemCode);
} }
} else {
newQueryState= query.querystate;
}
if(urlparts.length==0 ) {
newQueryState.itemCode = query.querystate.itemCode;
this.zone.run(() => {
this.replaceUrl(mapState,newQueryState,query.replace);
})
} else {
this.router.navigate(urlparts);
} }
} else {
newQueryState = query.querystate;
} }
}); if (urlparts.length == 0) {
this.store.dispatch(new mapActions.Init()); newQueryState.itemCode = query.querystate.itemCode;
// this.store.select(commonReducers.getRootItems).subscribe((l) => { this.zone.run(() => {
// if(l && l.length>0) { this.replaceUrl(mapState, newQueryState, query.replace);
// this.store.dispatch(new mapActions.Init()); })
// } } else {
// }); this.router.navigate(urlparts);
}
}
});
this.store.dispatch(new mapActions.Init());
// this.store.select(commonReducers.getRootItems).subscribe((l) => {
// if(l && l.length>0) {
// this.store.dispatch(new mapActions.Init());
// }
// });
} }
@HostListener('document:keyup', ['$event']) @HostListener('document:keyup', ['$event'])
escapeClose(event: KeyboardEvent) { escapeClose(event: KeyboardEvent) {
let x = event.keyCode; const x = event.keyCode;
if (x === 27) { if (x === 27) {
this.handleCloseModal() this.handleCloseModal()
} }
} }
handlePanelResize(resizeTop:number) { handlePanelResize(resizeTop: number) {
if(resizeTop==100 || !this.devicesService.IsMobile() ) { if (resizeTop == 100 || !this.devicesService.IsMobile()) {
this.visibleAreaBottom=0; this.visibleAreaBottom = 0;
} else { } else {
this.visibleAreaBottom=100-resizeTop; this.visibleAreaBottom = 100 - resizeTop;
if(this.visibleAreaBottom>60) { if (this.visibleAreaBottom > 60) {
this.visibleAreaBottom=60; this.visibleAreaBottom = 60;
} }
} }
} }
bottom(panelVisible:boolean) { bottom(panelVisible: boolean) {
if(panelVisible) { if (panelVisible) {
return this.visibleAreaBottom + '%'; return this.visibleAreaBottom + '%';
} else { } else {
return "0%"; return "0%";
@@ -180,7 +185,7 @@ export class MapComponent implements OnInit, OnDestroy,AfterViewInit {
} }
handleOpenModal(modalName: string) { handleOpenModal(modalName: string) {
this.store.dispatch(new commonActions.OpenModal(modalName)); this.store.dispatch(new commonActions.OpenModal(modalName));
} }
handleCloseModal() { handleCloseModal() {
@@ -188,10 +193,11 @@ export class MapComponent implements OnInit, OnDestroy,AfterViewInit {
} }
handleFileDropped(droppedFile: IDroppedFile) { handleFileDropped(droppedFile: IDroppedFile) {
this.uploadService.addFiles(droppedFile.files, droppedFile.event, { parentCode:droppedFile.parentCode, geometry:droppedFile.geometry }); this.uploadService.addFiles(droppedFile.files, droppedFile.event, { parentCode: droppedFile.parentCode, geometry: droppedFile.geometry });
} }
handleFeatureClick(feature: Feature<Geometry>) { handleFeatureClick(feature: Feature<Geometry>) {
this.store.dispatch(new mapActions.ClickFeature(feature));
this.clickedFeature.next(feature); this.clickedFeature.next(feature);
} }
@@ -203,20 +209,26 @@ export class MapComponent implements OnInit, OnDestroy,AfterViewInit {
this.store.dispatch(new mapActions.DoQuery(queryState)); this.store.dispatch(new mapActions.DoQuery(queryState));
} }
handleSidepaneloutletActivate(component:any) { handleSidepaneloutletActivate(component: any) {
if(component && component.hasOwnProperty('clickedFeature')) { if (component && component.hasOwnProperty('clickedFeature')) {
(component as IClickedFeature).clickedFeature = this.clickedFeature; (component as IClickedFeature).clickedFeature = this.clickedFeature;
} }
} if (component && component.hasOwnProperty('extrawide')) {
this.store.dispatch(new mapActions.SetPanelExtraWide(true));
handleSidepaneloutletDeactivate(component:any) {
if(component && component.hasOwnProperty('clickedFeature')) {
(component as IClickedFeature).clickedFeature = null;
} }
} }
handlePrerender(event:any) { handleSidepaneloutletDeactivate(component: any) {
if(!this.dataLayerSlideEnabled) return; if (component && component.hasOwnProperty('clickedFeature')) {
(component as IClickedFeature).clickedFeature = null;
}
if (component && component.hasOwnProperty('extrawide')) {
this.store.dispatch(new mapActions.SetPanelExtraWide(false));
}
}
handlePrerender(event: any) {
if (!this.dataLayerSlideEnabled) return;
const ctx = event.context; const ctx = event.context;
const mapSize = this.map.instance.getSize(); const mapSize = this.map.instance.getSize();
const width = mapSize[0] * (this.dataLayerSlideValue / 100); const width = mapSize[0] * (this.dataLayerSlideValue / 100);
@@ -235,75 +247,77 @@ export class MapComponent implements OnInit, OnDestroy,AfterViewInit {
ctx.clip(); ctx.clip();
} }
handleSlideChange(event:any) { handleSlideChange(event: any) {
this.dataLayerSlideValue = event.target.value; this.dataLayerSlideValue = event.target.value;
this.map.instance.render(); this.map.instance.render();
} }
ngOnInit() { ngOnInit() {
this.initialized = false; this.initialized = false;
console.debug("Init"); //console.debug("Init");
this.store.dispatch(new mapActions.Clear()); this.store.dispatch(new mapActions.Clear());
this.selectedFeatures$.next({x:0,y:0,features:[]}); this.selectedFeatures$.next({ x: 0, y: 0, features: [] });
this.selectedFeatures$.next(null); this.selectedFeatures$.next(null);
} }
initCustomStyles() { initCustomStyles() {
this.store.dispatch(new mapActions.SetStyle('vnd.farmmaps.itemtype.layer',new style.Style({ this.store.dispatch(new mapActions.SetStyle('vnd.farmmaps.itemtype.layer', new style.Style({
stroke: new style.Stroke({ stroke: new style.Stroke({
color: 'red', color: 'red',
lineDash: [ 5,5], lineDash: [5, 5],
width: 1 width: 1
}), }),
geometry:(feature) =>feature.getGeometry() geometry: (feature) => feature.getGeometry()
}))); })));
this.store.dispatch(new mapActions.SetStyle('vnd.farmmaps.itemtype.layer_selected',new style.Style({ this.store.dispatch(new mapActions.SetStyle('vnd.farmmaps.itemtype.layer_selected', new style.Style({
stroke: new style.Stroke({ stroke: new style.Stroke({
color: 'red', color: 'red',
lineDash: [ 5,5], lineDash: [5, 5],
width: 3 width: 3
}), }),
geometry:(feature) =>feature.getGeometry() geometry: (feature) => feature.getGeometry()
}))); })));
} }
round(value:number,decimals:number):number { round(value: number, decimals: number): number {
let d = Math.pow(10, decimals); const d = Math.pow(10, decimals);
return Math.round((value + Number.EPSILON)*d)/d; return Math.round((value + Number.EPSILON) * d) / d;
} }
getMapStateFromUrl(params:ParamMap):IMapState { getMapStateFromUrl(params: ParamMap): IMapState {
var hasUrlmapState = params.has("xCenter") && params.has("yCenter"); const hasUrlmapState = params.has("xCenter") && params.has("yCenter");
if (hasUrlmapState) { if (hasUrlmapState) {
let xCenter = parseFloat(params.get("xCenter")); const xCenter = parseFloat(params.get("xCenter"));
let yCenter = parseFloat(params.get("yCenter")); const yCenter = parseFloat(params.get("yCenter"));
let zoom = parseFloat(params.get("zoom")); const zoom = parseFloat(params.get("zoom"));
let rotation = parseFloat(params.get("rotation")); const rotation = parseFloat(params.get("rotation"));
let baseLayer = params.get("baseLayer")?params.get("baseLayer"):""; const baseLayer = params.get("baseLayer") ? params.get("baseLayer") : "";
var newMapState = {zoom: zoom, rotation: rotation, xCenter: xCenter, yCenter: yCenter, baseLayerCode: baseLayer }; const newMapState = { zoom: zoom, rotation: rotation, xCenter: xCenter, yCenter: yCenter, baseLayerCode: baseLayer };
return newMapState; return newMapState;
} else { } else {
return null; return null;
} }
} }
normalizeMapState(mapState:IMapState):IMapState { normalizeMapState(mapState: IMapState): IMapState {
if(!mapState) return null; if (!mapState) return null;
return {zoom: this.round(mapState.zoom,0), return {
rotation: this.round(mapState.rotation,2), zoom: this.round(mapState.zoom, 0),
xCenter: this.round(mapState.xCenter,5), rotation: this.round(mapState.rotation, 2),
yCenter: this.round(mapState.yCenter,5), xCenter: this.round(mapState.xCenter, 5),
baseLayerCode: mapState.baseLayerCode }; yCenter: this.round(mapState.yCenter, 5),
baseLayerCode: mapState.baseLayerCode
};
} }
serializeMapState(mapState:IMapState):string { serializeMapState(mapState: IMapState): string {
return JSON.stringify(this.normalizeMapState(mapState)); return JSON.stringify(this.normalizeMapState(mapState));
} }
getQueryStateFromUrl(params:ParamMap):IQueryState { getQueryStateFromUrl(params: ParamMap): IQueryState {
if (params.has("queryState")) { if (params.has("queryState")) {
let queryState = params.get("queryState"); const queryState = params.get("queryState");
var newQueryState = tassign(mapReducers.initialQueryState); let newQueryState = tassign(mapReducers.initialQueryState);
if (queryState != "") { if (queryState != "") {
newQueryState = this.serializeService.deserialize(queryState); newQueryState = this.serializeService.deserialize(queryState);
} }
@@ -314,11 +328,11 @@ export class MapComponent implements OnInit, OnDestroy,AfterViewInit {
} }
ngAfterViewInit() { ngAfterViewInit() {
console.debug("View init"); //console.debug("View init");
this.noContent=true; this.noContent = true;
this.route.children.forEach((entry) => { this.route.children.forEach((entry) => {
if(entry.outlet=="primary") { if (entry.outlet == "primary") {
this.noContent=false; this.noContent = false;
} }
}); });
@@ -326,54 +340,54 @@ export class MapComponent implements OnInit, OnDestroy,AfterViewInit {
// url to state // url to state
let urlMapState = this.getMapStateFromUrl(this.route.snapshot.paramMap); const urlMapState = this.getMapStateFromUrl(this.route.snapshot.paramMap);
let urlQueryState = this.getQueryStateFromUrl(this.route.snapshot.paramMap); const urlQueryState = this.getQueryStateFromUrl(this.route.snapshot.paramMap);
if(urlQueryState && urlMapState && this.noContent) { if (urlQueryState && urlMapState && this.noContent) {
this.store.dispatch(new mapActions.SetState(urlMapState,urlQueryState)); this.store.dispatch(new mapActions.SetState(urlMapState, urlQueryState));
window.localStorage.setItem("FarmMapsCommonMap_mapState",this.serializeMapState(urlMapState)); window.localStorage.setItem("FarmMapsCommonMap_mapState", this.serializeMapState(urlMapState));
} else if(urlQueryState && this.noContent) { } else if (urlQueryState && this.noContent) {
this.store.dispatch(new mapActions.SetQueryState(urlQueryState)); this.store.dispatch(new mapActions.SetQueryState(urlQueryState));
} else { } else {
this.store.dispatch(new mapActions.SetReplaceUrl(true)); this.store.dispatch(new mapActions.SetReplaceUrl(true));
} }
this.paramSub = this.route.paramMap.pipe(withLatestFrom(this.state$),switchMap(([params,state]) => { this.paramSub = this.route.paramMap.pipe(withLatestFrom(this.state$), switchMap(([params, state]) => {
if(this.initialized && this.noContent) { if (this.initialized && this.noContent) {
let urlQueryState = this.getQueryStateFromUrl(params); const urlQueryState = this.getQueryStateFromUrl(params);
if( this.serializeService.serialize(state.queryState) != this.serializeService.serialize(urlQueryState)) { if (this.serializeService.serialize(state.queryState) != this.serializeService.serialize(urlQueryState)) {
return of(new mapActions.SetState(state.mapState,urlQueryState)); return of(new mapActions.SetState(state.mapState, urlQueryState));
}
}
return EMPTY;
})).subscribe((action) => {
if(action) {
this.zone.run(() => {
console.debug("Url to state");
this.store.dispatch(action);
});
} }
}); }
return EMPTY;
})).subscribe((action) => {
if (action) {
this.zone.run(() => {
//console.debug("Url to state");
this.store.dispatch(action);
});
}
});
// state to url // state to url
this.stateSub = this.state$.pipe(switchMap((state) => { this.stateSub = this.state$.pipe(switchMap((state) => {
let newUrl = this.serializeMapState(state.mapState) + "_" + this.serializeService.serialize(state.queryState); const newUrl = this.serializeMapState(state.mapState) + "_" + this.serializeService.serialize(state.queryState);
if(this.lastUrl!=newUrl) { if (this.lastUrl != newUrl) {
this.lastUrl=newUrl; this.lastUrl = newUrl;
return of(state); return of(state);
} }
else { else {
return of(null); return of(null);
} }
})).subscribe((newUrlState) =>{ })).subscribe((newUrlState: any) => {
if(newUrlState) { if (newUrlState) {
console.debug(`State to url`); //console.debug(`State to url`);
this.replaceUrl(newUrlState.mapState,newUrlState.queryState,newUrlState.replaceUrl); this.replaceUrl(newUrlState.mapState, newUrlState.queryState, newUrlState.replaceUrl);
} }
}); });
this.initialized = true; this.initialized = true;
this.showDataLayerSlide$.subscribe((v) => { this.showDataLayerSlide$.subscribe((v) => {
this.dataLayerSlideEnabled=v; this.dataLayerSlideEnabled = v;
this.map.instance.render(); this.map.instance.render();
}); });
this.store.select(mapReducers.selectGetViewEnabled).subscribe((v) => { this.store.select(mapReducers.selectGetViewEnabled).subscribe((v) => {
@@ -393,7 +407,7 @@ export class MapComponent implements OnInit, OnDestroy,AfterViewInit {
this.store.dispatch(new commonActions.ToggleMenu()); this.store.dispatch(new commonActions.ToggleMenu());
} }
handleToggleBaseLayers(event:MouseEvent) { handleToggleBaseLayers(event: MouseEvent) {
this.baseLayersCollapsed = !this.baseLayersCollapsed; this.baseLayersCollapsed = !this.baseLayersCollapsed;
event.preventDefault(); event.preventDefault();
} }
@@ -405,49 +419,49 @@ export class MapComponent implements OnInit, OnDestroy,AfterViewInit {
handlePredefinedQuery(event: MouseEvent, query: any) { handlePredefinedQuery(event: MouseEvent, query: any) {
event.preventDefault(); event.preventDefault();
var queryState = tassign(mapReducers.initialQueryState, query); const queryState = tassign(mapReducers.initialQueryState, query);
this.store.dispatch(new mapActions.DoQuery(queryState)); this.store.dispatch(new mapActions.DoQuery(queryState));
} }
replaceUrl(mapState: IMapState, queryState: IQueryState, replace: boolean = true) { replaceUrl(mapState: IMapState, queryState: IQueryState, replace = true) {
if(this.noContent) { if (this.noContent) {
let newMapState = this.serializeMapState(mapState); const newMapState = this.serializeMapState(mapState);
let newQueryState = this.serializeService.serialize(queryState); const newQueryState = this.serializeService.serialize(queryState);
let currentMapState = this.serializeMapState(this.getMapStateFromUrl(this.route.snapshot.paramMap)); const currentMapState = this.serializeMapState(this.getMapStateFromUrl(this.route.snapshot.paramMap));
let urlQueryState = this.getQueryStateFromUrl(this.route.snapshot.paramMap); const urlQueryState = this.getQueryStateFromUrl(this.route.snapshot.paramMap);
let currentQueryState = urlQueryState==null?"":this.serializeService.serialize(urlQueryState); const currentQueryState = urlQueryState == null ? "" : this.serializeService.serialize(urlQueryState);
if(mapState.baseLayerCode!="" && ((newMapState!= currentMapState) || (newQueryState!=currentQueryState))) { if (mapState.baseLayerCode != "" && ((newMapState != currentMapState) || (newQueryState != currentQueryState))) {
let parts =["."]; const parts = ["."];
parts.push(mapState.xCenter.toFixed(5)); parts.push(mapState.xCenter.toFixed(5));
parts.push(mapState.yCenter.toFixed(5)); parts.push(mapState.yCenter.toFixed(5));
parts.push( mapState.zoom.toFixed(0)); parts.push(mapState.zoom.toFixed(0));
parts.push( mapState.rotation.toFixed(2)); parts.push(mapState.rotation.toFixed(2));
parts.push(mapState.baseLayerCode); parts.push(mapState.baseLayerCode);
parts.push( this.serializeService.serialize(queryState)); parts.push(this.serializeService.serialize(queryState));
console.debug("Replace url",parts); //console.debug("Replace url",parts);
this.router.navigate(parts, { replaceUrl: replace,relativeTo:this.route.parent }); this.router.navigate(parts, { replaceUrl: replace, relativeTo: this.route.parent });
}
} }
}
} }
handleOnMoveEnd(event) { handleOnMoveEnd(event) {
if(this.initialized && this.viewEnabled) { if (this.initialized && this.viewEnabled) {
this.zone.run(() =>{ this.zone.run(() => {
console.debug("Move end"); //console.debug("Move end");
var map = event.map; const map = event.map;
var view = map.getView(); const view = map.getView();
var rotation = view.getRotation(); const rotation = view.getRotation();
var zoom = view.getZoom(); const zoom = view.getZoom();
var center = transform(view.getCenter(), view.getProjection(), "EPSG:4326"); const center = transform(view.getCenter(), view.getProjection(), "EPSG:4326");
var viewExtent = view.calculateExtent(this.map.instance.getSize()); const viewExtent = view.calculateExtent(this.map.instance.getSize());
let mapState: IMapState = { xCenter: center[0], yCenter: center[1], zoom: zoom, rotation: rotation, baseLayerCode: null }; const mapState: IMapState = { xCenter: center[0], yCenter: center[1], zoom: zoom, rotation: rotation, baseLayerCode: null };
let state = { mapState: mapState, viewExtent: viewExtent }; const state = { mapState: mapState, viewExtent: viewExtent };
console.debug("Center: ",center[0],center[1] ); //console.debug("Center: ",center[0],center[1] );
let source = from([state]); const source = from([state]);
source.pipe(withLatestFrom(this.selectedBaseLayer$)).subscribe(([state, baselayer]) => { source.pipe(withLatestFrom(this.selectedBaseLayer$)).subscribe(([state, baselayer]) => {
if (mapState && baselayer) { // do not react on first move if (mapState && baselayer) { // do not react on first move
let newMapState = tassign(state.mapState, { baseLayerCode: baselayer.item.code }); const newMapState = tassign(state.mapState, { baseLayerCode: baselayer.item.code });
this.store.dispatch(new mapActions.SetMapState(newMapState)); this.store.dispatch(new mapActions.SetMapState(newMapState));
this.store.dispatch(new mapActions.SetViewExtent(state.viewExtent)); this.store.dispatch(new mapActions.SetViewExtent(state.viewExtent));
} }
@@ -458,16 +472,18 @@ export class MapComponent implements OnInit, OnDestroy,AfterViewInit {
handleOnMouseDown(event: MouseEvent) { handleOnMouseDown(event: MouseEvent) {
event.stopPropagation(); event.stopPropagation();
this.zone.run(() =>{ this.zone.run(() => {
this.store.dispatch(new commonActions.CloseAll()); this.store.dispatch(new commonActions.CloseAll());
}); });
} }
handleShowLayerValues(event: MouseEvent) { handleShowLayerValues(event: MouseEvent) {
event.stopPropagation(); if (!this.hideShowLayerValues) {
this.zone.run(() =>{ event.stopPropagation();
this.store.dispatch(new mapActions.ToggleLayerValuesEnabled()); this.zone.run(() => {
}); this.store.dispatch(new mapActions.ToggleLayerValuesEnabled());
});
}
} }
handleOnDownload(event) { handleOnDownload(event) {
@@ -483,15 +499,15 @@ export class MapComponent implements OnInit, OnDestroy,AfterViewInit {
} }
handleOnToggleVisibility(itemLayer: IItemLayer) { handleOnToggleVisibility(itemLayer: IItemLayer) {
this.store.dispatch(new mapActions.SetVisibility(itemLayer,!itemLayer.visible)); this.store.dispatch(new mapActions.SetVisibility(itemLayer, !itemLayer.visible));
} }
handleOnSetOpacity(event:{ layer: IItemLayer,opacity:number }) { handleOnSetOpacity(event: { layer: IItemLayer, opacity: number }) {
this.store.dispatch(new mapActions.SetOpacity(event.layer, event.opacity)); this.store.dispatch(new mapActions.SetOpacity(event.layer, event.opacity));
} }
handleZoomToExtent(itemLayer: IItemLayer) { handleZoomToExtent(itemLayer: IItemLayer) {
var extent = createEmpty(); const extent = createEmpty();
extend(extent, itemLayer.layer.getExtent()); extend(extent, itemLayer.layer.getExtent());
if (extent) { if (extent) {
this.store.dispatch(new mapActions.SetExtent(extent)); this.store.dispatch(new mapActions.SetExtent(extent));
@@ -506,21 +522,21 @@ export class MapComponent implements OnInit, OnDestroy,AfterViewInit {
this.store.dispatch(new mapActions.SelectOverlayLayer(itemLayer)); this.store.dispatch(new mapActions.SelectOverlayLayer(itemLayer));
} }
handlePeriodChange(period:IPeriodState) { handlePeriodChange(period: IPeriodState) {
this.store.dispatch(new mapActions.SetPeriod(period)); this.store.dispatch(new mapActions.SetPeriod(period));
} }
handleCitySearch(location:string) { handleCitySearch(location: string) {
this.geolocaterService.geocode(location).subscribe(locations => { this.geolocaterService.geocode(location).subscribe(locations => {
if( locations.length > 0) { if (locations.length > 0) {
let point = new Point([locations[0].coordinates.lon,locations[0].coordinates.lat]); const point = new Point([locations[0].coordinates.lon, locations[0].coordinates.lat]);
point.transform('EPSG:4326', 'EPSG:3857'); point.transform('EPSG:4326', 'EPSG:3857');
let circle = new Circle(point.getCoordinates(),5000);// const circle = new Circle(point.getCoordinates(), 5000);//
let extent = createEmpty(); const extent = createEmpty();
extend(extent, circle.getExtent()); extend(extent, circle.getExtent());
this.store.dispatch(new mapActions.SetExtent(extent)) this.store.dispatch(new mapActions.SetExtent(extent))
} }
}); });
} }
ngOnDestroy() { ngOnDestroy() {
@@ -10,17 +10,18 @@ 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 {
private modalName: string = 'metaDataModal'; private modalName = 'metaDataModal';
private modalRef: NgbModalRef; private modalRef: NgbModalRef;
@ViewChild('content', { static: true }) _templateModal:ElementRef; @ViewChild('content', { static: true }) _templateModal:ElementRef;
@Input() droppedFile: IDroppedFile; @Input() droppedFile: IDroppedFile;
@Input() set modalState(_modalState:any) {; @Input() set modalState(_modalState:any) {
if(_modalState == this.modalName) { if(_modalState == this.modalName) {
this.openModal() this.openModal()
} else if(this.modalRef) { } else if(this.modalRef) {
@@ -16,13 +16,14 @@ const after = (one: NgbDateStruct, two: NgbDateStruct) =>
? false : one.day > two.day : one.month > two.month : one.year > two.year; ? false : one.day > two.day : one.month > two.month : one.year > two.year;
@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 {
private modalName: string = 'selectPeriodModal'; private modalName = 'selectPeriodModal';
private modalRef: NgbModalRef; private modalRef: NgbModalRef;
private dateAdapter = new NgbDateNativeAdapter(); private dateAdapter = new NgbDateNativeAdapter();
hoveredDate: NgbDateStruct; hoveredDate: NgbDateStruct;
@@ -31,7 +32,7 @@ export class SelectPeriodModalComponent {
@ViewChild('content', { static: true }) _templateModal:ElementRef; @ViewChild('content', { static: true }) _templateModal:ElementRef;
@Input() set modalState(_modalState:any) {; @Input() set modalState(_modalState:any) {
if(_modalState == this.modalName) { if(_modalState == this.modalName) {
this.openModal() this.openModal()
} else if(this.modalRef) { } else if(this.modalRef) {
@@ -44,7 +45,7 @@ export class SelectPeriodModalComponent {
} }
@Input() set endDate(_modalState: Date) { @Input() set endDate(_modalState: Date) {
var d = new Date(_modalState); const d = new Date(_modalState);
d.setDate(d.getDate() - 1); d.setDate(d.getDate() - 1);
this.toDate = this.dateAdapter.fromModel(d); this.toDate = this.dateAdapter.fromModel(d);
} }
@@ -80,7 +81,7 @@ export class SelectPeriodModalComponent {
handleSelect(event:MouseEvent) { handleSelect(event:MouseEvent) {
event.preventDefault(); event.preventDefault();
if (this.fromDate && this.toDate && before(this.fromDate, this.toDate)) { if (this.fromDate && this.toDate && before(this.fromDate, this.toDate)) {
var endDate = new Date(this.dateAdapter.toModel(this.toDate)); const endDate = new Date(this.dateAdapter.toModel(this.toDate));
endDate.setDate(endDate.getDate() + 1); endDate.setDate(endDate.getDate() + 1);
this.onSelect.emit({startDate:this.dateAdapter.toModel(this.fromDate),endDate:endDate}) this.onSelect.emit({startDate:this.dateAdapter.toModel(this.fromDate),endDate:endDate})
} }
@@ -1,13 +1,9 @@
@import "~bootstrap/scss/bootstrap.scss";
.row { .row {
border-bottom: 1px solid $gray-500; border-bottom: 1px solid var(--bs-gray-500);
user-select: none; user-select: none;
} }
.row:hover { .row:hover {
background-color: $gray-100; background-color: var(--bs-gray-100);
} }
@@ -6,9 +6,10 @@ 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 {
@@ -28,7 +29,7 @@ export class SelectedItemContainerComponent {
let selected = -1; let selected = -1;
let maxMatches =0; let maxMatches =0;
let showItem = true; const showItem = true;
for (let i = 0; i < this.selectedItemComponents.length; i++) { for (let i = 0; i < this.selectedItemComponents.length; i++) {
let matches=0; let matches=0;
let criteria=0; let criteria=0;
@@ -1,19 +1,23 @@
<div class="spacer"></div> <div class="spacer"></div>
<div *ngIf="item;let item"> @if (item; as item) {
<div class="card border-0"> <div>
<div class="card-body"> <div class="card border-0">
<fm-back-button></fm-back-button> <div class="card-body">
<div class="card menu-card"> <fm-back-button></fm-back-button>
<h1>Cropfield</h1> <div class="card menu-card">
<h4>{{item.name}}</h4> <h1>Cropfield</h1>
<div class="card-text"><span>{{areaInHa(item)| number:'1.2-2'}} ha</span>&nbsp;<span>{{item.data.cropTypeName}}</span></div> <h4>{{item.name}}</h4>
<div class="card-text"><span>{{item.data.startDate|date}}</span> - <span>{{item.data.endDate|date}}</span> </div> <div class="card-text"><span>{{areaInHa(item)| number:'1.2-2'}} ha</span>&nbsp;<span>{{item.data.cropTypeName}}</span></div>
<ul class="p-0 mt-2"> <div class="card-text"><span>{{item.data.startDate|date}}</span> - <span>{{item.data.endDate|date}}</span> </div>
<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> <ul class="p-0 mt-2">
</ul> @if (item.isEditable) {
<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>
</div>
</div> </div>
<fm-map-item-list [items]="(items|async)"></fm-map-item-list>
<fm-map-item-widget-list [item]="item"></fm-map-item-widget-list>
</div> </div>
<fm-map-item-list [items]="(items|async)"></fm-map-item-list>
<fm-map-item-widget-list [item]="item"></fm-map-item-widget-list>
</div> </div>
</div> }
@@ -1,5 +1,3 @@
@import "~bootstrap/scss/bootstrap.scss";
.big-icon { .big-icon {
width: 100%; width: 100%;
color: white; color: white;
@@ -16,43 +16,44 @@ import { withLatestFrom,switchMap,combineLatest } from 'rxjs/operators';
@ForItemType("vnd.farmmaps.itemtype.cropfield") @ForItemType("vnd.farmmaps.itemtype.cropfield")
@Injectable() @Injectable()
@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,location,router); super(store, itemTypeService, itemService$, location,router);
} }
areaInHa(item:IItem):number { areaInHa(item:IItem):number {
if(!item) return 0; if(!item) return 0;
// get area from faeture if 0 calculate from polygon // get area from faeture if 0 calculate from polygon
let a = item.data.area; const a = item.data.area;
if(a) return a; if(a) return a;
let format = new GeoJSON(); const format = new GeoJSON();
let polygon = format.readGeometry(item.geometry); const polygon = format.readGeometry(item.geometry);
return getArea(polygon,{projection:"EPSG:4326"}) / 10000; return getArea(polygon,{projection:"EPSG:4326"}) / 10000;
} }
ngOnInit() { ngOnInit() {
var childItems = this.folderService$.getItems(this.item.code, 0, 1000); const childItems = this.folderService$.getItems(this.item.code, 0, 1000);
var atLocationItems = this.itemService$.getItemList(null,null,null,this.item.code,true); const atLocationItems = this.itemService$.getItemList(null,null,null,this.item.code,true);
this.items = childItems.pipe( this.items = childItems.pipe(
combineLatest(atLocationItems), combineLatest(atLocationItems),
switchMap(([ci,ali]) => { switchMap(([ci,ali]) => {
let retVal:IListItem[] = []; const retVal:IListItem[] = [];
let codes = {}; const codes = {};
ci.forEach((listItem) => { ci.forEach((listItem) => {
retVal.push(listItem); retVal.push(listItem);
codes[listItem.code]=listItem; codes[listItem.code]=listItem;
}); });
ali.forEach((atlocationitem) => { ali.forEach((atlocationitem) => {
let listItem = atlocationitem as IListItem; const listItem = atlocationitem as IListItem;
let allowedItemTypes = "vnd.farmmaps.itemtype.device.senml"; // this is a hack const allowedItemTypes = "vnd.farmmaps.itemtype.device.senml"; // this is a hack
if(!codes[listItem.code] && allowedItemTypes.indexOf(listItem.itemType) >= 0) { if(!codes[listItem.code] && allowedItemTypes.indexOf(listItem.itemType) >= 0) {
retVal.push(listItem); retVal.push(listItem);
} }
@@ -1,33 +1,51 @@
<div class="spacer"></div> <div class="spacer"></div>
<div *ngIf="item;let item"> @if (item; as item) {
<div class="card border-0"> <div>
<div class="card-body"> <div class="card border-0">
<fm-back-button></fm-back-button> <div class="card-body">
<div class="card menu-card"> <fm-back-button></fm-back-button>
<h2 *ngIf="parentOfItemType('vnd.farmmaps.itemtype.cropfield')">{{parentItem.name}}</h2>
<h1>{{item.name}}</h1>
</div>
<div class="legend-container" *ngIf="item?.data.layers;let layers">
<div class="card menu-card"> <div class="card menu-card">
<div *ngIf="layers.length>1"> @if (parentOfItemType('vnd.farmmaps.itemtype.cropfield')) {
<select (change)="onLayerChanged($event.target.value)"> <h2>{{parentItem.name}}</h2>
<option *ngFor="let l of layers;" [value]="l.index" [selected]="itemLayer.layerIndex == l.index">{{l.name}}</option> }
</select> <h1>{{item.name}}</h1>
</div>
<fm-map-layer-legend [showTitle]="layers.length == 1"
[layer]="layer(layers,itemLayer.layerIndex)" [histogramenabled]="true"></fm-map-layer-legend>
</div> </div>
@if (item?.data.layers; as layers) {
<div class="legend-container">
<div class="card menu-card">
@if (layers.length>1) {
<div>
<select (change)="onLayerChanged($event.target.value)">
@for (l of layers; track l) {
<option [value]="l.index" [selected]="itemLayer.layerIndex == l.index">{{l.name}}</option>
}
</select>
</div>
}
<fm-map-layer-legend [showTitle]="layers.length == 1"
[layer]="layer(layers,itemLayer.layerIndex)" [histogramenabled]="true"></fm-map-layer-legend>
</div>
</div>
<div class="card menu-card">
<ul class="p-0 mt-2">
@if (item.isEditable) {
<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>
}
@if (itemTypeService.isLayer(item)) {
@if (!getItemLayer(item,itemLayer.layerIndex)) {
<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><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>
</div>
<fm-map-zoom-to-show-alert [layer]="itemLayer?.layer"></fm-map-zoom-to-show-alert>
}
</div> </div>
<div class="card menu-card">
<ul class="p-0 mt-2">
<li *ngIf="item.isEditable"><a href="#" class="ms-1 me-1" (click)="handleOnEdit(item)"><i class="fal fa-pencil" aria-hidden="true" i18n-title title="Edit"></i>&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>
<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>
</ng-container>
</ul>
</div>
<fm-map-zoom-to-show-alert [layer]="itemLayer?.layer"></fm-map-zoom-to-show-alert>
</div> </div>
</div> </div>
</div> }
@@ -1,5 +1,3 @@
@import "~bootstrap/scss/bootstrap.scss";
.big-icon { .big-icon {
width: 100%; width: 100%;
color: white; color: white;
@@ -1,25 +1,32 @@
import { Component, Injectable } from '@angular/core';
import { Location } from '@angular/common'; import { Location } from '@angular/common';
import { Store } from '@ngrx/store'; import { Component, Injectable, OnDestroy } from '@angular/core';
import * as mapReducers from '../../reducers/map.reducer';
import { commonReducers, ItemTypeService, ItemService, FolderService } from '@farmmaps/common';
import { Router } from '@angular/router'; import { Router } from '@angular/router';
import { commonReducers, FolderService, IItem, IItemLinkType, ItemService, ItemTypeService, IUrlType } from '@farmmaps/common';
import { Store } from '@ngrx/store';
import { Subscription } from 'rxjs';
import * as mapActions from '../../actions/map.actions';
import * as mapReducers from '../../reducers/map.reducer';
import { ForItemType } from '../for-item/for-itemtype.decorator'; import { ForItemType } from '../for-item/for-itemtype.decorator';
import { AbstractSelectedItemComponent } from '../selected-item/selected-item.component'; import { AbstractSelectedItemComponent } from '../selected-item/selected-item.component';
import * as mapActions from '../../actions/map.actions';
@ForItemType("vnd.farmmaps.itemtype.geotiff.processed") @ForItemType("vnd.farmmaps.itemtype.geotiff.processed")
@Injectable() @Injectable()
@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 { export class SelectedItemGeotiffComponent extends AbstractSelectedItemComponent implements OnDestroy {
sub: Subscription;
constructor(store: Store<mapReducers.State | commonReducers.State>, itemTypeService: ItemTypeService, location: Location, router: Router, private itemService$: ItemService,private folderService$: FolderService) { constructor(store: Store<mapReducers.State | commonReducers.State>, public itemService: ItemService, itemTypeService: ItemTypeService, location: Location, router: Router, private itemService$: ItemService,private folderService$: FolderService) {
super(store, itemTypeService,location,router); super(store, itemTypeService,itemService,location,router);
}
ngOnDestroy(): void {
if (this.sub) this.sub.unsubscribe();
} }
onLayerChanged(layerIndex: number) { onLayerChanged(layerIndex: number) {
@@ -29,4 +36,13 @@ export class SelectedItemGeotiffComponent extends AbstractSelectedItemComponent
layer(layers:any,layerIndex:number) { layer(layers:any,layerIndex:number) {
return layers.find(l => l.index == layerIndex); return layers.find(l => l.index == layerIndex);
} }
download(event:MouseEvent,item:IItem,layers:any,layerIndex:number) {
event.stopPropagation();
event.preventDefault();
const itemLink : IItemLinkType = {itemcode:item.code,query:`layer=${this.layer(layers,layerIndex).name}`,pathsuffix:"download", validminutes:10}
this.sub = this.itemService.getItemLink(itemLink).subscribe((itemLinkUrl:IUrlType) => {
window.location.href = itemLinkUrl.url;
})
}
} }
@@ -1,32 +1,49 @@
<div class="spacer"></div> <div class="spacer"></div>
<div *ngIf="item;let item"> @if (item; as item) {
<div class="card border-0"> <div>
<div class="card-body"> <div class="card border-0">
<fm-back-button></fm-back-button> <div class="card-body">
<div class="card menu-card"> <fm-back-button></fm-back-button>
<h2 *ngIf="parentOfItemType('vnd.farmmaps.itemtype.cropfield')">{{parentItem.name}}</h2>
<h1>{{item.name}}</h1>
</div>
<div class="legend-container" *ngIf="item?.data.layers;let layers">
<div class="card menu-card"> <div class="card menu-card">
<div *ngIf="layers.length>1"> @if (parentOfItemType('vnd.farmmaps.itemtype.cropfield')) {
<select (change)="onLayerChanged($event.target.value)"> <h2>{{parentItem.name}}</h2>
<option *ngFor="let l of layers;" [value]="l.index" [selected]="itemLayer.layerIndex == l.index">{{l.name}}</option> }
</select> <h1>{{item.name}}</h1>
</div>
<fm-map-layer-legend [showTitle]="layers.length==1" [layer]="layer(layers,itemLayer.layerIndex)" [histogramenabled]="true"></fm-map-layer-legend>
</div> </div>
@if (item?.data.layers; as layers) {
<div class="legend-container">
<div class="card menu-card">
@if (layers.length>1) {
<div>
<select (change)="onLayerChanged($event.target.value)">
@for (l of layers; track l) {
<option [value]="l.index" [selected]="itemLayer.layerIndex == l.index">{{l.name}}</option>
}
</select>
</div>
}
<fm-map-layer-legend [showTitle]="layers.length==1" [layer]="layer(layers,itemLayer.layerIndex)" [histogramenabled]="true"></fm-map-layer-legend>
</div>
</div>
<div class="card menu-card">
<ul class="p-0 mt-2">
@if (item.isEditable) {
<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>
}
@if (itemTypeService.isLayer(item)) {
@if (!getItemLayer(item,itemLayer.layerIndex)) {
<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>
</div>
}
<fm-map-zoom-to-show-alert [layer]="itemLayer?.layer"></fm-map-zoom-to-show-alert>
</div> </div>
<div class="card menu-card">
<ul class="p-0 mt-2">
<li *ngIf="item.isEditable"><a href="#" class="mt-1 me-1" (click)="handleOnEdit(item)" ><i class="fal fa-pencil" aria-hidden="true" i18n-title title="Edit"></i>&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>
<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>
</ng-container>
</ul>
</div>
<fm-map-zoom-to-show-alert [layer]="itemLayer?.layer"></fm-map-zoom-to-show-alert>
</div> </div>
</div> </div>
</div> }
@@ -1,5 +1,3 @@
@import "~bootstrap/scss/bootstrap.scss";
.big-icon { .big-icon {
width: 100%; width: 100%;
color: white; color: white;
@@ -1,29 +1,34 @@
import { Component, Input, Injectable, OnInit } from '@angular/core';
import { Location } from '@angular/common'; import { Location } from '@angular/common';
import { Feature } from 'ol'; import { Component, Injectable, OnDestroy } from '@angular/core';
import { Router } from '@angular/router';
import { commonReducers, FolderService, IItem, IItemLinkType, ItemService, ItemTypeService, IUrlType } from '@farmmaps/common';
import { Store } from '@ngrx/store'; import { Store } from '@ngrx/store';
import * as mapReducers from '../../reducers/map.reducer';
import { commonReducers, ItemTypeService, IItem, Item, ItemService, FolderService, IListItem} from '@farmmaps/common';
import * as mapActions from '../../actions/map.actions'; import * as mapActions from '../../actions/map.actions';
import { Router, ActivatedRoute, ParamMap, Event } from '@angular/router'; import * as mapReducers from '../../reducers/map.reducer';
import { ForItemType } from '../for-item/for-itemtype.decorator'; import { ForItemType } from '../for-item/for-itemtype.decorator';
import { AbstractSelectedItemComponent } from '../selected-item/selected-item.component'; import { AbstractSelectedItemComponent } from '../selected-item/selected-item.component';
import { Observable } from 'rxjs'; import { Subscription } from 'rxjs';
@ForItemType("vnd.farmmaps.itemtype.shape.processed") @ForItemType("vnd.farmmaps.itemtype.shape.processed")
@Injectable() @Injectable()
@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 { export class SelectedItemShapeComponent extends AbstractSelectedItemComponent implements OnDestroy {
public selectedLayer = 0;
sub: Subscription;
constructor(store: Store<mapReducers.State | commonReducers.State>, itemTypeService: ItemTypeService, location: Location, router: Router, private itemService$: ItemService,private folderService$: FolderService) { constructor(store: Store<mapReducers.State | commonReducers.State>, public itemService: ItemService, itemTypeService: ItemTypeService, location: Location, router: Router, private itemService$: ItemService,private folderService$: FolderService) {
super(store, itemTypeService,location,router); super(store, itemTypeService,itemService,location,router);
}
ngOnDestroy(): void {
if (this.sub) this.sub.unsubscribe();
} }
public selectedLayer: number = 0;
onLayerChanged(layerIndex: number) { onLayerChanged(layerIndex: number) {
this.store.dispatch(new mapActions.SetLayerIndex(layerIndex)); this.store.dispatch(new mapActions.SetLayerIndex(layerIndex));
@@ -32,4 +37,13 @@ export class SelectedItemShapeComponent extends AbstractSelectedItemComponent {
layer(layers:any,layerIndex:number) { layer(layers:any,layerIndex:number) {
return layers.find(l => l.index == layerIndex); return layers.find(l => l.index == layerIndex);
} }
download(event:MouseEvent,item:IItem,layers:any,layerIndex:number) {
event.stopPropagation();
event.preventDefault();
const itemLink : IItemLinkType = {itemcode:item.code,query:`layer=${this.layer(layers,layerIndex).name}`,pathsuffix:"download", validminutes:10}
this.sub = this.itemService.getItemLink(itemLink).subscribe((itemLinkUrl:IUrlType) => {
window.location.href = itemLinkUrl.url;
})
}
} }
@@ -1,49 +1,70 @@
<div class="spacer"></div> <div class="spacer"></div>
<div *ngIf="selectedItem();let item"> @if (selectedItem(); as item) {
<div class="card border-0"> <div>
<div class="card-body"> <div class="card border-0">
<fm-back-button></fm-back-button> <div class="card-body">
<div class="card menu-card"> <fm-back-button></fm-back-button>
<h2 *ngIf="parentOfItemType('vnd.farmmaps.itemtype.cropfield')">{{parentItem.name}}</h2>
<h1>{{item.name}}</h1>
</div>
<div class="legend-container" *ngIf="item?.data.layers;let layers">
<div class="card menu-card"> <div class="card menu-card">
<h5><span i18n>Date</span>: {{temporalService.selectedDate(itemLayer)}}</h5> @if (parentOfItemType('vnd.farmmaps.itemtype.cropfield')) {
<div class="d-flex justify-content-between"> <h2>{{parentItem.name}}</h2>
<div> }
<button *ngIf="temporalService.hasPrevious(itemLayer)" type="button" class="btn btn-link p-0" (click)="handlePreviousTemporal($event)"> <h1>{{item.name}}</h1>
<i class="fal fa-arrow-circle-left" aria-hidden="true" i18n-title title="Previous"></i>&nbsp;{{ temporalService.previousDate(itemLayer) }} </div>
</button> @if (item?.data.layers; as layers) {
<div class="legend-container">
<div class="card menu-card">
<h5><span i18n>Date</span>: {{temporalService.selectedDate(itemLayer)}}</h5>
<div class="d-flex justify-content-between">
<div>
@if (temporalService.hasPrevious(itemLayer)) {
<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) }}
</button>
}
</div>
<div>
@if (temporalService.hasNext(itemLayer)) {
<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>
</button>
}
</div>
</div>
<fm-map-zoom-to-show-alert [layer]="currentItemLayer()?.layer"></fm-map-zoom-to-show-alert>
</div> </div>
<div> <div class="card menu-card pt-2">
<button *ngIf="temporalService.hasNext(itemLayer)" type="button" class="btn btn-link p-0" (click)="handleNextTemporal($event)"> @if (layers.length>1) {
{{ temporalService.nextDate(itemLayer)}}&nbsp;<i class="fal fa-arrow-circle-right" aria-hidden="true" i18n-title title="Next"></i> <div>
</button> <select (change)="onLayerChanged($event.target.value)">
@for (l of layers; track l) {
<option [value]="l.index" [selected]="itemLayer.layerIndex == l.index">{{l.name}}</option>
}
</select>
</div>
}
<fm-map-layer-legend [showTitle]="layers.length == 1"
[layer]="layer(layers,itemLayer.layerIndex)" [histogramenabled]="true"></fm-map-layer-legend>
</div> </div>
</div> </div>
<fm-map-zoom-to-show-alert [layer]="currentItemLayer()?.layer"></fm-map-zoom-to-show-alert> <div class="card menu-card">
</div> <ul class="p-0 mt-2">
<div class="card menu-card pt-2"> @if (item.isEditable) {
<div *ngIf="layers.length>1"> <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>
<select (change)="onLayerChanged($event.target.value)"> }
<option *ngFor="let l of layers;" [value]="l.index" [selected]="itemLayer.layerIndex == l.index">{{l.name}}</option> @if (itemTypeService.isLayer(item)) {
</select> @if (!getItemLayer(item,itemLayer.layerIndex)) {
<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)="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>
</div> </div>
<fm-map-layer-legend [showTitle]="layers.length == 1" }
[layer]="layer(layers,itemLayer.layerIndex)" [histogramenabled]="true"></fm-map-layer-legend>
</div>
</div>
<div class="card menu-card">
<ul class="p-0 mt-2">
<li *ngIf="item.isEditable"><a href="#" class="mt-1 me-1" (click)="handleOnEdit(item)"><i class="fal fa-pencil" aria-hidden="true" i18n-title title="Edit"></i>&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>
<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>
</ng-container>
<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>
</ul>
</div> </div>
</div> </div>
</div> </div>
</div> }
@@ -1,5 +1,3 @@
@import "~bootstrap/scss/bootstrap.scss";
.big-icon { .big-icon {
width: 100%; width: 100%;
color: white; color: white;
@@ -1,28 +1,33 @@
import { Component, Injectable } from '@angular/core';
import { Location } from '@angular/common'; import { Location } from '@angular/common';
import { Store } from '@ngrx/store'; import { Component, Injectable, OnDestroy } from '@angular/core';
import * as mapReducers from '../../reducers/map.reducer';
import { commonReducers, ItemTypeService, IItem } from '@farmmaps/common';
import { Router } from '@angular/router'; import { Router } from '@angular/router';
import { commonReducers, IItem, IItemLinkType, ItemService, ItemTypeService, IUrlType } from '@farmmaps/common';
import { Store } from '@ngrx/store';
import { Subscription } from 'rxjs';
import * as mapActions from '../../actions/map.actions';
import { IItemLayer, ITemporalItemLayer } from '../../models/item.layer';
import * as mapReducers from '../../reducers/map.reducer';
import { TemporalService } from '../../services/temporal.service';
import { ForItemType } from '../for-item/for-itemtype.decorator'; import { ForItemType } from '../for-item/for-itemtype.decorator';
import { AbstractSelectedItemComponent } from '../selected-item/selected-item.component'; import { AbstractSelectedItemComponent } from '../selected-item/selected-item.component';
import { ITemporalItemLayer} from '../../models/item.layer';
import * as mapActions from '../../actions/map.actions';
import { IItemLayer } from '../../models/item.layer';
import {TemporalService} from '../../services/temporal.service';
@ForItemType("vnd.farmmaps.itemtype.temporal") @ForItemType("vnd.farmmaps.itemtype.temporal")
@Injectable() @Injectable()
@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 { export class SelectedItemTemporalComponent extends AbstractSelectedItemComponent implements OnDestroy {
sub: Subscription;
constructor(store: Store<mapReducers.State | commonReducers.State>, itemTypeService: ItemTypeService, location: Location, router: Router,public temporalService:TemporalService) { constructor(store: Store<mapReducers.State | commonReducers.State>, public itemService: ItemService, itemTypeService: ItemTypeService, location: Location, router: Router,public temporalService:TemporalService) {
super(store, itemTypeService,location,router); super(store, itemTypeService,itemService,location,router);
}
ngOnDestroy(): void {
if (this.sub) this.sub.unsubscribe();
} }
onLayerChanged(layerIndex: number) { onLayerChanged(layerIndex: number) {
@@ -33,8 +38,6 @@ export class SelectedItemTemporalComponent extends AbstractSelectedItemComponent
return (this.itemLayer as ITemporalItemLayer)?.selectedItemLayer return (this.itemLayer as ITemporalItemLayer)?.selectedItemLayer
} }
handleNextTemporal(event:MouseEvent) { handleNextTemporal(event:MouseEvent) {
this.store.dispatch(new mapActions.NextTemporal()); this.store.dispatch(new mapActions.NextTemporal());
event.preventDefault(); event.preventDefault();
@@ -46,7 +49,7 @@ export class SelectedItemTemporalComponent extends AbstractSelectedItemComponent
} }
selectedItem():IItem { selectedItem():IItem {
let temporalItemLayer = this.itemLayer as ITemporalItemLayer; const temporalItemLayer = this.itemLayer as ITemporalItemLayer;
if(temporalItemLayer && temporalItemLayer.selectedItemLayer) { if(temporalItemLayer && temporalItemLayer.selectedItemLayer) {
return temporalItemLayer.selectedItemLayer.item; return temporalItemLayer.selectedItemLayer.item;
} }
@@ -61,4 +64,13 @@ 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;
})
}
} }

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