Archived
Compare commits
1011
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
2192797a35 | ||
|
|
9d743eddea | ||
|
|
3c99855c31 | ||
|
|
8667001c01 | ||
|
|
73d0a99cd6 | ||
|
|
5991adf0c6 | ||
|
|
d7ab7e84ce | ||
|
|
18092fcc24 | ||
|
|
5e84eb4404 | ||
|
|
a5324c5164 | ||
|
|
7c2911afae | ||
|
|
0fe20b6649 | ||
|
|
c49534050a | ||
|
|
bab870cc43 | ||
|
|
cad022e772 | ||
|
|
3b2ea10fdc | ||
|
|
c20754e10a | ||
|
|
c4b8e9664c | ||
|
|
7822015f8c | ||
|
|
48261c9657 | ||
|
|
a6bd28ac45 | ||
|
|
674a0f2a9e | ||
|
|
77800fe0f7 | ||
|
|
3251ba4022 | ||
|
|
a758a38a0a | ||
|
|
3c6a8e28c1 | ||
|
|
b72e309fbe | ||
|
|
d7b978c477 | ||
|
|
930d4fe0b7 | ||
|
|
642ea33c3c | ||
|
|
429ab24408 | ||
|
|
eed70c449b | ||
|
|
4bef16aa2b | ||
|
|
05bc18c291 | ||
|
|
35ab2f7c90 | ||
|
|
2eca9b2562 | ||
|
|
e0c89f4358 | ||
|
|
604c1176c3 | ||
|
|
0ff8992874 | ||
|
|
b5b84c2547 | ||
|
|
c2b016b2b9 | ||
|
|
d44531274b | ||
|
|
c52ee36d1b | ||
|
|
9b86927e2c | ||
|
|
e224b80995 | ||
|
|
88f3d9ef1a | ||
|
|
6737029a61 | ||
|
|
d4786564bd | ||
|
|
6fd69d7999 | ||
|
|
4ec75b3d5a | ||
|
|
04e3f1e71f | ||
|
|
f66187d3a2 | ||
|
|
df77631299 | ||
|
|
a8d0f05c81 | ||
|
|
df0d13e5dd | ||
|
|
c79637be77 | ||
|
|
b347220dd4 | ||
|
|
b5e11da9a8 | ||
|
|
edeadef96f | ||
|
|
267a299589 | ||
|
|
9d45c25a95 | ||
|
|
2ffce50c47 | ||
|
|
f50ff878e0 | ||
|
|
09c74448a8 | ||
|
|
205b73b30e | ||
|
|
313cc59fe7 | ||
|
|
c3fb42c65f | ||
|
|
6b73fb0d55 | ||
|
|
ea641caf38 | ||
|
|
ac15b2018d | ||
|
|
fe73f615ad | ||
|
|
3e1b3ee78e | ||
|
|
58391b7828 | ||
|
|
b2b2a1e8be | ||
|
|
0d96a1be4f | ||
|
|
d599430cb0 | ||
|
|
e17911b339 | ||
|
|
9d6cbffb3d | ||
|
|
a11eb81e73 | ||
|
|
4fc3ad933c | ||
|
|
e6d90c9e61 | ||
|
|
250b3841fe | ||
|
|
51291cd86f | ||
|
|
e9e3b719a4 | ||
|
|
1c0ad57b0a | ||
|
|
8684ba25c8 | ||
|
|
78ca3044cf | ||
|
|
2e55b5a70e | ||
|
|
af0a3dca2d | ||
|
|
f039898c26 | ||
|
|
ab19b1c2ce | ||
|
|
a2641f8ea5 | ||
|
|
d6841c8f83 | ||
|
|
187b24ab97 | ||
|
|
b80ddf7854 | ||
|
|
79bc3d9082 | ||
|
|
1c92ad4c28 | ||
|
|
61e6de0052 | ||
|
|
fb25b92349 | ||
|
|
e78f2893ae | ||
|
|
51170b45e9 | ||
|
|
7365bea145 | ||
|
|
dc096065b4 | ||
|
|
b9850311ea | ||
|
|
ee9c050db3 | ||
|
|
95200d9920 | ||
|
|
ee1ce21cca | ||
|
|
467f7447bf | ||
|
|
1df4496058 | ||
|
|
134220d75f | ||
|
|
80ef4ed6fe | ||
|
|
2137f3f07e | ||
|
|
a46e8040b2 | ||
|
|
2ca9730735 | ||
|
|
3d2ca8fb9f | ||
|
|
6810da8b79 | ||
|
|
4866a6f22d | ||
|
|
84a1004977 | ||
|
|
39c619a837 | ||
|
|
758613aa12 | ||
|
|
6914a61bc4 | ||
|
|
9f43287433 | ||
|
|
10df983ae3 | ||
|
|
78249811ab | ||
|
|
df14427d60 | ||
|
|
c7c131d437 | ||
|
|
b2fe8f3bd7 | ||
|
|
3027c69fa8 | ||
|
|
5995d205a4 | ||
|
|
fd479c92d8 | ||
|
|
e9880d6eb2 | ||
|
|
a4438d8a90 | ||
|
|
89061774de | ||
|
|
362e6c8534 | ||
|
|
64a0e58238 | ||
|
|
a3d4dfbd59 | ||
|
|
4c106ebff3 | ||
|
|
d21f304081 | ||
|
|
2bad3274fd | ||
|
|
5c8fd64521 | ||
|
|
72ba8eca81 | ||
|
|
f89f741265 | ||
|
|
50af55acb2 | ||
|
|
cc879b85e5 | ||
|
|
b4a0a4584d | ||
|
|
8ab1611f39 | ||
|
|
475c522039 | ||
|
|
068396ac9a | ||
|
|
4a30707ec6 | ||
|
|
852b1db895 | ||
|
|
fcbd68eca0 | ||
|
|
3a42f9114e | ||
|
|
3f664b472c | ||
|
|
57811f3f2e | ||
|
|
5e1bc6d705 | ||
|
|
d4a230f96d | ||
|
|
ed1e1478b2 | ||
|
|
afe013a59a | ||
|
|
db3734f8a3 | ||
|
|
86f75c7f78 | ||
|
|
a7abb4072b | ||
|
|
61d6446d75 | ||
|
|
392008ae4b | ||
|
|
093c26c7f3 | ||
|
|
a8e1ba6c02 | ||
|
|
e64fbfd014 | ||
|
|
8cd7b85de2 | ||
|
|
ddc7f97e27 | ||
|
|
24e3765c28 | ||
|
|
86f3ddb34b | ||
|
|
d6c55ef82b | ||
|
|
d977ddfb7b | ||
|
|
0e8bd5343d | ||
|
|
ceeaa89ba3 | ||
|
|
c3dbf85eb6 | ||
|
|
ad5fe95b55 | ||
|
|
31d3e58062 | ||
|
|
0231421cef | ||
|
|
6b95fb7f77 | ||
|
|
da7e193219 | ||
|
|
31f9b48bd7 | ||
|
|
1d6b30edff | ||
|
|
349a76395b | ||
|
|
32b3b98f76 | ||
|
|
010ed6e010 | ||
|
|
a8675f5c49 | ||
|
|
f76ef44dee | ||
|
|
2387a0e39e | ||
|
|
98980fc857 | ||
|
|
6f7d8fe248 | ||
|
|
03a1ccd597 | ||
|
|
f2c133e9bd | ||
|
|
9c866e500f | ||
|
|
3b692359c6 | ||
|
|
3d4042e8c6 | ||
|
|
3db760dd96 | ||
|
|
b5828cd0fa | ||
|
|
af4e6f45d1 | ||
|
|
79def90bc7 | ||
|
|
53c60427f1 | ||
|
|
7d7e5bcd37 | ||
|
|
72a172ccb2 | ||
|
|
2728a91ab4 | ||
|
|
28d2b5d4a3 | ||
|
|
b70e385097 | ||
|
|
7392c6170c | ||
|
|
367348088a | ||
|
|
5efd5b78c9 | ||
|
|
0498d64c36 | ||
|
|
e17ac435b5 | ||
|
|
3e11c7cefd | ||
|
|
b3dcd1e58b | ||
|
|
681fc819a6 | ||
|
|
2a62d2df48 | ||
|
|
004bcea0b6 | ||
|
|
8efa46fa66 | ||
|
|
cefa788295 | ||
|
|
2da783d6be | ||
|
|
749be159f1 | ||
|
|
4e24527950 | ||
|
|
45263a59f4 | ||
|
|
5cdef30c71 | ||
|
|
cdba2af921 | ||
|
|
658c2c84cd | ||
|
|
3f9b4dcdaa | ||
|
|
a63159367f | ||
|
|
b9d1c8f61f | ||
|
|
eb34de193c | ||
|
|
5612bb3d66 | ||
|
|
0e42efac75 | ||
|
|
3247880b7c | ||
|
|
a250ecdcc1 | ||
|
|
93e497ec3f | ||
|
|
10a1f07622 | ||
|
|
07d6c1bc10 | ||
|
|
1bddc28767 | ||
|
|
a999c05631 | ||
|
|
f3252a378d | ||
|
|
4ab1e43d40 | ||
|
|
2719f2fcf4 | ||
|
|
55914bf7d2 | ||
|
|
26ca9be4e7 | ||
|
|
0ed342404e | ||
|
|
26ae1c7f06 | ||
|
|
f71d0fe256 | ||
|
|
7544203202 | ||
|
|
41a30e0b64 | ||
|
|
f14fc1a4fc | ||
|
|
21ebda4753 | ||
|
|
3a80a6f7f3 | ||
|
|
71a2ef44e6 | ||
|
|
1610391d56 | ||
|
|
b778e5726c | ||
|
|
fc4abf9a5b | ||
|
|
1274d96f1d | ||
|
|
35ccb4f4c5 | ||
|
|
d6587bd63b | ||
|
|
ede75f63f5 | ||
|
|
274f33e709 | ||
|
|
4384b12944 | ||
|
|
10ebdf276a | ||
|
|
9c270bfe75 | ||
|
|
9031d3e171 | ||
|
|
c3158c1064 | ||
|
|
315b64a561 | ||
|
|
030dbcec5d | ||
|
|
876020828e | ||
|
|
393b881e3b | ||
|
|
8594a94d62 | ||
|
|
c543ac7c94 | ||
|
|
97d6d569a0 | ||
|
|
023048a5bb | ||
|
|
4a685d675d | ||
|
|
1125f4586e | ||
|
|
3bdba527ec | ||
|
|
fb03cfce44 | ||
|
|
6f93cf254c | ||
|
|
b5a3a62cee | ||
|
|
d306d5c4c1 | ||
|
|
e79ae2f623 | ||
|
|
bdf4e03b49 | ||
|
|
7d5c10d902 | ||
|
|
fb192c6e4d | ||
|
|
6356f149a6 | ||
|
|
5c5914327c | ||
|
|
e306bf601f | ||
|
|
f8459aaca4 | ||
|
|
47fbc5eab9 | ||
|
|
564d08b5b9 | ||
|
|
7e17a49dc6 | ||
|
|
ce52cbdbed | ||
|
|
752e1e2c42 | ||
|
|
6b617ed4ad | ||
|
|
9b19950945 | ||
|
|
3f286ee042 | ||
|
|
747499d009 | ||
|
|
c74163976a | ||
|
|
c9f43b5b53 | ||
|
|
6a240abc0c | ||
|
|
7d8b18a27d | ||
|
|
4a328054dd | ||
|
|
3e482470b6 | ||
|
|
3bacb8a5d9 | ||
|
|
47afa20a01 | ||
|
|
f0646a8f6a | ||
|
|
36ebc03189 | ||
|
|
c0d40d2d5e | ||
|
|
14e504cc79 | ||
|
|
b060fd34bb | ||
|
|
0694d4e467 | ||
|
|
7c5867a332 | ||
|
|
8f958e33f1 | ||
|
|
aa2f305b27 | ||
|
|
d02da8f334 | ||
|
|
253553c534 | ||
|
|
4641e351fd | ||
|
|
84cf6a3f6e | ||
|
|
92b29135b5 | ||
|
|
f6aebb2f80 | ||
|
|
daf78f32b7 | ||
|
|
42245612d2 | ||
|
|
a05c1fa874 | ||
|
|
4bda94c360 | ||
|
|
feaad02c33 | ||
|
|
af9acebaff | ||
|
|
7ba35052ec | ||
|
|
2e40d023b1 | ||
|
|
c4f4a4f61e | ||
|
|
6b095b7f49 | ||
|
|
b2791eb80b | ||
|
|
4d5ed915ad | ||
|
|
2fb5967c26 | ||
|
|
820543913f | ||
|
|
ce2f06091b | ||
|
|
5714cdce72 | ||
|
|
10e43e1ea5 | ||
|
|
8fa84c6ea8 | ||
|
|
9f872d0af0 | ||
|
|
f6bed668f6 | ||
|
|
f70e30204d | ||
|
|
7339b91328 | ||
|
|
88667b3986 | ||
|
|
a996caa73b | ||
|
|
ed6f8f4231 | ||
|
|
94ef2e269b | ||
|
|
da624f0535 | ||
|
|
3da646dc4d | ||
|
|
778e40a26d | ||
|
|
94ff567567 | ||
|
|
b20ab34859 | ||
|
|
1988b3f74d | ||
|
|
b0587bc4c3 | ||
|
|
681d372ef3 | ||
|
|
b1922cdb10 | ||
|
|
5774bff8df | ||
|
|
6254a3be98 | ||
|
|
7943cefddf | ||
|
|
a2a287961c | ||
|
|
8e8f18ad7c | ||
|
|
5cbb6f32f9 | ||
|
|
b2469f731e | ||
|
|
beb439469f | ||
|
|
ef49f62ca2 | ||
|
|
67abc67d9a | ||
|
|
1f7f410916 | ||
|
|
2f176be8c6 | ||
|
|
1118c5ca60 | ||
|
|
c7831d1d87 | ||
|
|
31c5e0cb52 | ||
|
|
c6a632894d | ||
|
|
e652c7bb5b | ||
|
|
818e04d1f3 | ||
|
|
ebbac409a0 | ||
|
|
5cc976ddd3 | ||
|
|
38eae3263e | ||
|
|
a3eb2d9617 | ||
|
|
03e3c7ad95 | ||
|
|
8fd8675260 | ||
|
|
187811e4e2 | ||
|
|
8e304fc6eb | ||
|
|
4c93a9f766 | ||
|
|
93554bc7c4 | ||
|
|
d074cd81cf | ||
|
|
127dc44917 | ||
|
|
aa5a8f0843 | ||
|
|
a10aca92f1 | ||
|
|
e42e94fcf7 | ||
|
|
2b83ccad1f | ||
|
|
e31d428c4b | ||
|
|
429e54ef8d | ||
|
|
02e13337bf | ||
|
|
b4eb7aaeac | ||
|
|
7e21c725d8 | ||
|
|
dd889ea7cc | ||
|
|
4dab5a00b1 | ||
|
|
5cc58e8988 | ||
|
|
0944e595d3 | ||
|
|
32bebec0df | ||
|
|
c0cf210600 | ||
|
|
f85a27a8e5 | ||
|
|
88ae8b829f | ||
|
|
fcb60ed8bc | ||
|
|
3d535507fb | ||
|
|
e89bdac47d | ||
|
|
4038702841 | ||
|
|
7ced2d2a7b | ||
|
|
c53981f4a6 | ||
|
|
076dec27d5 | ||
|
|
5354aa8d0a | ||
|
|
12143c8e69 | ||
|
|
50519e9236 | ||
|
|
7f6d007c04 | ||
|
|
98be4f05cc | ||
|
|
79558e2168 | ||
|
|
b966241997 | ||
|
|
60a7384f88 | ||
|
|
76f225b996 | ||
|
|
37a25c6b29 | ||
|
|
6c45842387 | ||
|
|
d37b0866d5 | ||
|
|
270f244128 | ||
|
|
ebddf688c6 | ||
|
|
f1c572ecc9 | ||
|
|
af5361b6c3 | ||
|
|
6daf0eab4a | ||
|
|
66fe0e9534 | ||
|
|
75ccc6dda4 | ||
|
|
e45ec785d7 | ||
|
|
b067b50937 | ||
|
|
0c2e6364ac | ||
|
|
b232fb2c8e | ||
|
|
4a19694c1a | ||
|
|
af766abe54 | ||
|
|
6333d78eab | ||
|
|
c06fe315d8 | ||
|
|
bc1f44f0b7 | ||
|
|
95bb8da8b7 | ||
|
|
68f8ff9cdd | ||
|
|
9e122fefd3 | ||
|
|
b47ead21be | ||
|
|
ebe43c3b27 | ||
|
|
686084f5cf | ||
|
|
0abaf15101 | ||
|
|
9dd2b5cdb5 | ||
|
|
2246a98bbb | ||
|
|
6265b66baf | ||
|
|
5488206588 | ||
|
|
b4f2042aa0 | ||
|
|
21dca2163b | ||
|
|
2bc02323ae | ||
|
|
8b073fb855 | ||
|
|
5d28b547a1 | ||
|
|
f2407dc12a | ||
|
|
f02b317cf4 | ||
|
|
270b774c33 | ||
|
|
864b72c82c | ||
|
|
c5716b0102 | ||
|
|
ad097121da | ||
|
|
79b33cff50 | ||
|
|
e01417f3b3 | ||
|
|
68ffc6f7d9 | ||
|
|
ef7cf410b9 | ||
|
|
151ba2563e | ||
|
|
78f4dca9a1 | ||
|
|
52bf963afd | ||
|
|
e6cfb85b8e | ||
|
|
6576e7cb6d | ||
|
|
7d7528ab4c | ||
|
|
34a79ec833 | ||
|
|
6cd5b0e5d7 | ||
|
|
412ddc01d1 | ||
|
|
10edf0728b | ||
|
|
57189ce4df | ||
|
|
e72f933014 | ||
|
|
782e7adb00 | ||
|
|
17b78476ee | ||
|
|
93630d5a09 | ||
|
|
79f09d0e0e | ||
|
|
02016eb404 | ||
|
|
59760ad201 | ||
|
|
6eca90abb6 | ||
|
|
b853b4d3f7 | ||
|
|
6e815e3442 | ||
|
|
befa82d0f6 | ||
|
|
5df0e6e423 | ||
|
|
669f93a327 | ||
|
|
73ff1fd47f | ||
|
|
e07c3aeb3d | ||
|
|
700b29c3d1 | ||
|
|
0ffdbfd3ca | ||
|
|
756db80b77 | ||
|
|
b2559be980 | ||
|
|
a9754a8eff | ||
|
|
d5961d4c96 | ||
|
|
56e35345fc | ||
|
|
9755f5a635 | ||
|
|
2ff1aff9f3 | ||
|
|
164ac7e3ad | ||
|
|
85a7e890bd | ||
|
|
8766293966 | ||
|
|
d2cad491b9 | ||
|
|
16d2c6abae | ||
|
|
a212b59d73 | ||
|
|
3574e34659 | ||
|
|
13704c6845 | ||
|
|
bbe337d115 | ||
|
|
e1b6e59b6a | ||
|
|
3685644888 | ||
|
|
050adcbc0f | ||
|
|
0a12005d5d | ||
|
|
8a4644049b | ||
|
|
ca7e5e03be | ||
|
|
a1ceabec47 | ||
|
|
917b875732 | ||
|
|
7df2004671 | ||
|
|
c50a79d723 | ||
|
|
519d789281 | ||
|
|
b5038e9661 | ||
|
|
bab69698c6 | ||
|
|
5c6ea6a391 | ||
|
|
328edc396b | ||
|
|
9cd8b81149 | ||
|
|
80e1f8042e | ||
|
|
1a1bdb314e | ||
|
|
51ec1bd3b4 | ||
|
|
c8440ca536 | ||
|
|
889d1b4f9e | ||
|
|
97b458e812 | ||
|
|
0378565b88 | ||
|
|
8ca8874707 | ||
|
|
dc2772aabf | ||
|
|
ce0e561a3f | ||
|
|
ba9aab03a9 | ||
|
|
f10686423d | ||
|
|
c1688f68c2 | ||
|
|
c916b2f155 | ||
|
|
5df9ac295d | ||
|
|
065a45dc98 | ||
|
|
6b66777699 | ||
|
|
9927ba0929 | ||
|
|
a05a29703c | ||
|
|
76952cac67 | ||
|
|
9b27a997f3 | ||
|
|
014e3143fd | ||
|
|
7eaf1686e1 | ||
|
|
d4bf2a6667 | ||
|
|
9d7cf637ee | ||
|
|
979f80ce89 | ||
|
|
c677a9b639 | ||
|
|
9440b91d90 | ||
|
|
2b18167761 | ||
|
|
da8b2f1d3a | ||
|
|
10e4e6abc6 | ||
|
|
6acfe7c32f | ||
|
|
d08c1b2008 | ||
|
|
a47e1d9a63 | ||
|
|
4187522739 | ||
|
|
c0d0088f6e | ||
|
|
d43dff3085 | ||
|
|
9a04e1f848 | ||
|
|
621773a6f1 | ||
|
|
a9672c44bf | ||
|
|
155c212f89 | ||
|
|
ee35c3f1b8 | ||
|
|
0a405f5515 | ||
|
|
b618b7c40f | ||
|
|
f10e68c4ad | ||
|
|
870c3c2c77 | ||
|
|
1559f15c7f | ||
|
|
96345e54fb | ||
|
|
f61590c677 | ||
|
|
6f1ec4a17a | ||
|
|
786e9392b1 | ||
|
|
f229c25b8f | ||
|
|
9bdd1ff35f | ||
|
|
4dd7a15b30 | ||
|
|
a4aa7dbb7d | ||
|
|
681d2fe273 | ||
|
|
87547aafcc | ||
|
|
6ab5ba8a56 | ||
|
|
78b7ef44d9 | ||
|
|
e19ca94653 | ||
|
|
a85378374b | ||
|
|
9e3f6010c3 | ||
|
|
e6a637b866 | ||
|
|
ccf77805a0 | ||
|
|
2b2e1bfafa | ||
|
|
3fd4ac2f94 | ||
|
|
9849eaf1e7 | ||
|
|
b516cc07e2 | ||
|
|
c9c9a2ddbf | ||
|
|
1d0f3b958d | ||
|
|
45537cb2e9 | ||
|
|
652ddc0cdc | ||
|
|
fd3b331cc0 | ||
|
|
9facbe76c8 | ||
|
|
20dff38cf7 | ||
|
|
e374bb8a73 | ||
|
|
294b9c6dd3 | ||
|
|
d92bf54c8d | ||
|
|
914e272fc2 | ||
|
|
b182b7fda6 | ||
|
|
22040b43b3 | ||
|
|
50170cf599 | ||
|
|
2deff46a7e | ||
|
|
e939a787ba | ||
|
|
4ae9562ce1 | ||
|
|
288e507e6c | ||
|
|
d9848a8ba3 | ||
|
|
a9d42484cc | ||
|
|
a276593c7f | ||
|
|
ff50650c28 | ||
|
|
d7efeb8d59 | ||
|
|
fd71d1f38e | ||
|
|
bc8c9f8bf9 | ||
|
|
0865ca1a93 | ||
|
|
1bc3983f55 | ||
|
|
945d88839f | ||
|
|
7c06343909 | ||
|
|
b8f8f27794 | ||
|
|
2a31771ac6 | ||
|
|
3f17341b2e | ||
|
|
6165f523cc | ||
|
|
19dce51a28 | ||
|
|
b29cd8e4c9 | ||
|
|
f2e265391c | ||
|
|
3c7adf012f | ||
|
|
7c8c16362c | ||
|
|
6555e68145 | ||
|
|
945c641503 | ||
|
|
60bc4c1a10 | ||
|
|
7b42ca252b | ||
|
|
9ef6c4d308 | ||
|
|
ed7f7923ca | ||
|
|
98142fab56 | ||
|
|
c460d31522 | ||
|
|
4c5b89852b | ||
|
|
fa90eaf1af | ||
|
|
aeded938bd | ||
|
|
c61a4fe7f4 | ||
|
|
8c3c40cfe6 | ||
|
|
e6e10c835e | ||
|
|
07a87175b4 | ||
|
|
e9ace73ddd | ||
|
|
12312c0e8b | ||
|
|
d365b1d5b5 | ||
|
|
846eee1ae5 | ||
|
|
2588732b91 | ||
|
|
de0089fbe8 | ||
|
|
d4e7756176 | ||
|
|
72c34310df | ||
|
|
0c0d0989b2 | ||
|
|
a86ab9f3c7 | ||
|
|
a2264a28e0 | ||
|
|
a4c34fe21c | ||
|
|
9196358842 | ||
|
|
f4cbb1ff68 | ||
|
|
f008e97e39 | ||
|
|
61d2fc8d54 | ||
|
|
80760a8fdd | ||
|
|
a7f53a841b | ||
|
|
9d64fce22c | ||
|
|
e39c0b055d | ||
|
|
237fd27489 | ||
|
|
296385ab33 | ||
|
|
402bbcea0d | ||
|
|
161717bc7b | ||
|
|
0b8dbf4e2e | ||
|
|
2acf13cbac | ||
|
|
a408f4bffa | ||
|
|
ac5bd7d635 | ||
|
|
cf84f8c93d | ||
|
|
4872dee094 | ||
|
|
b76a933dba | ||
|
|
41c7ab15f3 | ||
|
|
a9185b86af | ||
|
|
eb1b8f18eb | ||
|
|
bce562fb8e | ||
|
|
2825ce4ccc | ||
|
|
5d83293540 | ||
|
|
b652555f37 | ||
|
|
3db09c1e2a | ||
|
|
0d40141b2d | ||
|
|
33e7a2310d | ||
|
|
ddb112b989 | ||
|
|
7502bc54d1 | ||
|
|
15cc2c33f1 | ||
|
|
eb0e928c6f | ||
|
|
5631d23355 | ||
|
|
0470cb0fa1 | ||
|
|
1656b465ee | ||
|
|
a558b23a98 | ||
|
|
c569076c5d | ||
|
|
be2516a3b8 | ||
|
|
7f62a74877 | ||
|
|
3b296a1fba | ||
|
|
28c9cd353d | ||
|
|
83a5c1a7d2 | ||
|
|
a767502d66 | ||
|
|
897ac3dab5 | ||
|
|
2f165b4b48 | ||
|
|
3994818b6a | ||
|
|
7b2dbc1777 | ||
|
|
8c59976de6 | ||
|
|
d551a2cf7a | ||
|
|
a3a09507a6 | ||
|
|
9bbde64147 | ||
|
|
0c4259d72e | ||
|
|
57e0a37c78 | ||
|
|
713af307cd | ||
|
|
521b882798 | ||
|
|
b850f5d621 | ||
|
|
d8730e77ad | ||
|
|
e62c185f35 | ||
|
|
f81b16b966 | ||
|
|
b9ee39399c | ||
|
|
be9b01dbab | ||
|
|
feacfd8bb3 | ||
|
|
2f0362e730 | ||
|
|
f4ba89920c | ||
|
|
f5b312a888 | ||
|
|
97142bc986 | ||
|
|
67335a0a4a | ||
|
|
b752b377da | ||
|
|
74c77bae5e | ||
|
|
b22278a75f | ||
|
|
37854d43fc | ||
|
|
2161951cbb | ||
|
|
66e492d2f8 | ||
|
|
e944064053 | ||
|
|
a1a4fc14ab | ||
|
|
122563a0bd | ||
|
|
33f322424e | ||
|
|
519b81d1fd | ||
|
|
b7c80dfdd8 | ||
|
|
77d2433d63 | ||
|
|
9bc78dc302 | ||
|
|
ac0fe962a0 | ||
|
|
d89670f669 | ||
|
|
d025e2e3f6 | ||
|
|
c22cede59b | ||
|
|
48574dc0b0 | ||
|
|
57407d83d3 | ||
|
|
f83549b5af | ||
|
|
132556da81 | ||
|
|
c2350eec52 | ||
|
|
aa1ad9f844 | ||
|
|
c6d14e6c9c | ||
|
|
8e4364bd08 | ||
|
|
af3340ed70 | ||
|
|
cc4726e85c | ||
|
|
ff19d830a7 | ||
|
|
29914cfb1b | ||
|
|
7bca0a57c4 | ||
|
|
fdba357e9c | ||
|
|
e28564c88a | ||
|
|
90c3fa25a4 | ||
|
|
3b8b812c55 | ||
|
|
025889b390 | ||
|
|
eabaa1db19 | ||
|
|
ba541c4e08 | ||
|
|
b994bc51cd | ||
|
|
960275dd38 | ||
|
|
5b7fef689a | ||
|
|
1c1315a580 | ||
|
|
5d21d66589 | ||
|
|
160eb10aba | ||
|
|
4ef077f8d7 | ||
|
|
df84a7c217 | ||
|
|
b5d00f5619 | ||
|
|
89a0fb13a5 | ||
|
|
2861ba220e | ||
|
|
45e0d5e836 | ||
|
|
312611cdc1 | ||
|
|
54b8a3bf24 | ||
|
|
4c1d4137ea | ||
|
|
a454f2306d | ||
|
|
52a72b042c | ||
|
|
c0c9864b07 | ||
|
|
e0f36b043f | ||
|
|
b52bfd4f57 | ||
|
|
6ff3c0ec96 | ||
|
|
eb1157d608 | ||
|
|
1daa8e257f | ||
|
|
5db24cc63d | ||
|
|
ff018d9db1 | ||
|
|
8c49965df8 | ||
|
|
f880623337 | ||
|
|
2da4f88683 | ||
|
|
bd125b6f72 | ||
|
|
610408d17c | ||
|
|
52e3117771 | ||
|
|
1b000c6112 | ||
|
|
28e75d5a0d | ||
|
|
76c431b9c2 | ||
|
|
122c49d516 | ||
|
|
5c549c5851 | ||
|
|
3fcf80c1a0 | ||
|
|
519e5c9032 | ||
|
|
9c19595597 | ||
|
|
ea1b22ed41 | ||
|
|
8d3c098f4e | ||
|
|
22209cfaf6 | ||
|
|
8b45e431a7 | ||
|
|
74c792b96a | ||
|
|
d833f321d1 | ||
|
|
0d9789d8c6 | ||
|
|
93513f9dc7 | ||
|
|
e465142be0 | ||
|
|
92173c9847 | ||
|
|
05292f1e5d | ||
|
|
e672e28795 | ||
|
|
4b7b639046 | ||
|
|
34b067fd28 | ||
|
|
fb9a046ff8 | ||
|
|
c4934d799d | ||
|
|
469bc6f1c1 | ||
|
|
d140d4bd4c | ||
|
|
1ce259a152 | ||
|
|
00ae86ecf2 | ||
|
|
880eb26a99 | ||
|
|
bcfa13de60 | ||
|
|
6f77df0f61 | ||
|
|
fbe0413c6a | ||
|
|
115f53e93c | ||
|
|
ca40ca0927 | ||
|
|
29968a736c | ||
|
|
077afcb0d7 | ||
|
|
6e79afd115 | ||
|
|
4f9cdf1588 | ||
|
|
fa69dee550 | ||
|
|
06e353ee94 | ||
|
|
8d723477d3 | ||
|
|
771e388f0e | ||
|
|
040b5b8c4d | ||
|
|
3504990708 | ||
|
|
798ec8d1ca | ||
|
|
8f5dd0969c | ||
|
|
861a8a48fc | ||
|
|
86a545d7e6 | ||
|
|
8a1c4b5e20 | ||
|
|
b24e47e39b | ||
|
|
c0d8e6d615 | ||
|
|
7192f66420 | ||
|
|
dcc24aa149 | ||
|
|
0485c163ad | ||
|
|
1380d7169a | ||
|
|
a6d3b208b0 | ||
|
|
cbf805e1ff | ||
|
|
8907dca091 | ||
|
|
fe1fddd211 | ||
|
|
fa146f2c6e | ||
|
|
c9fac05aa6 | ||
|
|
75d8909997 | ||
|
|
36d9c98e47 | ||
|
|
e2255164fc | ||
|
|
4c5b77000f | ||
|
|
997ebb24a7 | ||
|
|
00346a963e | ||
|
|
a42059627a | ||
|
|
5b710ce200 | ||
|
|
f8a0e1e167 | ||
|
|
eb46b3496a | ||
|
|
e8bbb74185 | ||
|
|
3d8ce7ee74 | ||
|
|
aa308abbb0 | ||
|
|
9d5cd0fa88 | ||
|
|
5760c2b8ea | ||
|
|
1e6c9e9363 | ||
|
|
8f06a56e52 | ||
|
|
2f74f43c8e | ||
|
|
c093ffae50 | ||
|
|
c7da0866ef | ||
|
|
b000d5119a | ||
|
|
2dd10f04a3 | ||
|
|
4d62184e5b | ||
|
|
8ad9d56b07 | ||
|
|
2b1cb1ac8f | ||
|
|
08163f86bf | ||
|
|
33adb35923 | ||
|
|
855bd8fe2d | ||
|
|
fad257c6e2 | ||
|
|
e262f7c65d | ||
|
|
cabdeaa875 | ||
|
|
2f1c5210ea | ||
|
|
47f3238edd | ||
|
|
01488ae2e0 | ||
|
|
ae02dd0b53 | ||
|
|
7768387f58 | ||
|
|
3c0f220ee3 | ||
|
|
38e64a0713 | ||
|
|
0bb5406773 | ||
|
|
7c125f1771 | ||
|
|
3673e0b349 | ||
|
|
ece6096064 | ||
|
|
dd71b49502 | ||
|
|
a098f72b1a | ||
|
|
535f6bd064 | ||
|
|
74e7f41583 | ||
|
|
b537239c96 | ||
|
|
f9ba4fd5e2 | ||
|
|
8326255ce9 | ||
|
|
3d60d0127b | ||
|
|
697708710e | ||
|
|
102d96ded9 | ||
|
|
f802f41bbb | ||
|
|
d134240b8b | ||
|
|
3242058c4f | ||
|
|
3f6863845b | ||
|
|
231fbf9ee8 | ||
|
|
142a1c9e58 | ||
|
|
39993e75da | ||
|
|
b7b168dffb | ||
|
|
fb9c11fce6 | ||
|
|
da562ca96d | ||
|
|
33d03c3d58 | ||
|
|
335078a10c | ||
|
|
bb71c043a1 | ||
|
|
cb222770d8 | ||
|
|
f26ececb9b | ||
|
|
2d285eaba0 | ||
|
|
d9a42ca75a | ||
|
|
0c44beabe0 | ||
|
|
dd97c89254 | ||
|
|
45de27f666 | ||
|
|
5b0632ebf1 | ||
|
|
8389943d1a | ||
|
|
2606de5f0a | ||
|
|
208dfed7fb | ||
|
|
eb50218a8d | ||
|
|
516d63a59e | ||
|
|
321d34870e | ||
|
|
dbc330ab46 | ||
|
|
154bcba620 | ||
|
|
2f5ffde4d9 | ||
|
|
69e153abd7 | ||
|
|
669c724e3a | ||
|
|
a7402438a0 | ||
|
|
dda82c8b09 | ||
|
|
3e14157e87 | ||
|
|
1e84874695 | ||
|
|
9245003dd9 | ||
|
|
8d061210dc | ||
|
|
8a40335cf2 | ||
|
|
ce9c72016d | ||
|
|
a082967c69 | ||
|
|
a2e7439776 | ||
|
|
e858ac778c | ||
|
|
290d5d1d26 | ||
|
|
e75afdc01d | ||
|
|
8f54e095fe | ||
|
|
431cc78c19 | ||
|
|
878944b056 | ||
|
|
d2b8de17d1 | ||
|
|
ac352473a0 | ||
|
|
8655307858 | ||
|
|
17a947ce20 | ||
|
|
fe356441d0 | ||
|
|
b17bce1cd2 | ||
|
|
bb555eec74 | ||
|
|
d3c28847ec | ||
|
|
e2499d0403 | ||
|
|
8f364c4990 | ||
|
|
46f4ac06f4 | ||
|
|
b5d42d855e | ||
|
|
b14b01b358 | ||
|
|
08acba9a88 | ||
|
|
b30c29a5f1 | ||
|
|
2f4e14ca1f | ||
|
|
bfcdcce9ef | ||
|
|
9e3e7d5d47 | ||
|
|
2949e39fcd | ||
|
|
9376c236aa | ||
|
|
a1079eb21f | ||
|
|
c266ce7d42 | ||
|
|
428e3b002d | ||
|
|
65366ff09b | ||
|
|
0f1ce45b2f | ||
|
|
1ade8025ab | ||
|
|
ac8815e8f1 | ||
|
|
41b1295f9e | ||
|
|
ed5a74ed07 | ||
|
|
a08eed7c67 | ||
|
|
cc421742df | ||
|
|
9a38630d01 | ||
|
|
978360fad0 | ||
|
|
30dab68468 | ||
|
|
80fec7ccaa | ||
|
|
1a1cd7a81c | ||
|
|
a782d8ebe9 | ||
|
|
a0816afaea | ||
|
|
6746047fe2 | ||
|
|
7266c98a10 | ||
|
|
e873f5af5b | ||
|
|
44f476d5fd | ||
|
|
200f3e95eb | ||
|
|
1a8bc43c60 | ||
|
|
6dccaa8ce5 | ||
|
|
f2cb5d4d64 | ||
|
|
6252cc120b | ||
|
|
03284d26dd | ||
|
|
946cbc6533 | ||
|
|
6277236993 | ||
|
|
20bda6b81f | ||
|
|
9a338c04e6 | ||
|
|
65c1643c95 | ||
|
|
9cbc9f1293 | ||
|
|
34b75a4c18 | ||
|
|
1991e79ed2 | ||
|
|
d661e5f3f9 | ||
|
|
0a384a9196 |
@@ -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": {
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -33,6 +33,7 @@ speed-measure-plugin.json
|
|||||||
.history/*
|
.history/*
|
||||||
|
|
||||||
# misc
|
# misc
|
||||||
|
/.angular/cache
|
||||||
/.sass-cache
|
/.sass-cache
|
||||||
/connect.lock
|
/connect.lock
|
||||||
/coverage
|
/coverage
|
||||||
@@ -47,3 +48,8 @@ testem.log
|
|||||||
Thumbs.db
|
Thumbs.db
|
||||||
projects/common/node_modules/
|
projects/common/node_modules/
|
||||||
projects/common-map/node_modules/
|
projects/common-map/node_modules/
|
||||||
|
.angular/*
|
||||||
|
projects/common-map3d/node_modules/
|
||||||
|
projects/common-map/node_modules/
|
||||||
|
projects/ng-openlayers/node_modules/
|
||||||
|
projects/common/node_modules/
|
||||||
|
|||||||
Vendored
+24
@@ -0,0 +1,24 @@
|
|||||||
|
@Library('farmmaps-shared-library') _
|
||||||
|
|
||||||
|
pipeline {
|
||||||
|
agent any;
|
||||||
|
options {
|
||||||
|
copyArtifactPermission projectNames: env.allProjectsArtifactPermission;
|
||||||
|
disableConcurrentBuilds();
|
||||||
|
}
|
||||||
|
stages {
|
||||||
|
stage('FarmmapsLibBuildAll') {
|
||||||
|
steps {
|
||||||
|
stepFarmmapsLibBuildAll();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
post {
|
||||||
|
success {
|
||||||
|
postSuccess();
|
||||||
|
}
|
||||||
|
always {
|
||||||
|
postAlways();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
+23
-53
@@ -1,54 +1,24 @@
|
|||||||
pipeline {
|
@Library('farmmaps-shared-library') _
|
||||||
agent any
|
|
||||||
environment {
|
pipeline {
|
||||||
PACKAGE_VERSION_PREFIX=sh(script: 'jq .version package.json |sed "s/\\"//g"', returnStdout: true).trim()
|
agent any;
|
||||||
PACKAGE_VERSION="${PACKAGE_VERSION_PREFIX + '-prerelease.' + env.BUILD_NUMBER}"
|
options {
|
||||||
}
|
copyArtifactPermission projectNames: env.allProjectsArtifactPermission;
|
||||||
stages {
|
disableConcurrentBuilds();
|
||||||
stage('npm install'){
|
}
|
||||||
steps {
|
stages {
|
||||||
sh '''rm -rf node_modules/
|
stage('FarmmapsLibBuildAll') {
|
||||||
npm install
|
steps {
|
||||||
cd projects/common
|
stepFarmmapsLibBuildAll();
|
||||||
npm install
|
}
|
||||||
cd ../common-map
|
}
|
||||||
npm install
|
}
|
||||||
cd ../common-map3d
|
post {
|
||||||
npm install
|
success {
|
||||||
'''
|
postSuccess();
|
||||||
}
|
}
|
||||||
}
|
always {
|
||||||
stage('build'){
|
postAlways();
|
||||||
steps {
|
}
|
||||||
sh '''ng build common
|
}
|
||||||
ng build common-map
|
|
||||||
ng build common-map3d'''
|
|
||||||
}
|
|
||||||
}
|
|
||||||
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 {
|
|
||||||
always {
|
|
||||||
emailext (
|
|
||||||
body: '${DEFAULT_CONTENT}',
|
|
||||||
mimeType: 'text/html',
|
|
||||||
replyTo: '${DEFAULT_REPLYTO}',
|
|
||||||
subject: '${DEFAULT_SUBJECT}',
|
|
||||||
to: emailextrecipients([[$class: 'CulpritsRecipientProvider'], [$class: 'RequesterRecipientProvider']])
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
@@ -1,59 +1,64 @@
|
|||||||
# Farmmaps viewer
|
# Farmmaps viewer
|
||||||
|
|
||||||
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.
|
|
||||||
|
## Option 1, Using docker
|
||||||
## Option 1, Using docker
|
|
||||||
|
*Dependencies*
|
||||||
*Dependencies*
|
|
||||||
|
* docker desktop
|
||||||
* docker desktop
|
|
||||||
|
*Setup*
|
||||||
*Setup*
|
|
||||||
|
```
|
||||||
```
|
docker pull node:12.13.1
|
||||||
docker pull node:12.13.1
|
docker run -t -i --entrypoint /bin/bash -p 4200:4200 node:12.13.1
|
||||||
docker run -t -i --entrypoint /bin/bash -p 4200:4200 node:12.13.1
|
```
|
||||||
```
|
|
||||||
|
Inside the running container
|
||||||
Inside the running container
|
```
|
||||||
```
|
git clone https://git.akkerweb.nl/FarmMaps/FarmMapsLib.git
|
||||||
git clone https://git.akkerweb.nl/FarmMaps/FarmMapsLib.git
|
cd FarmMapsLib
|
||||||
cd FarmMapsLib
|
npm config set @farmmaps:registry https://repository.akkerweb.nl/repository/npm-group/
|
||||||
npm config set @farmmaps:registry https://repository.akkerweb.nl/repository/npm-group/
|
npm install -g @angular/cli
|
||||||
npm install -g @angular/cli
|
npm install
|
||||||
npm install
|
ng serve --host 0.0.0.0
|
||||||
ng serve --host 0.0.0.0
|
```
|
||||||
```
|
*Go*
|
||||||
*Go*
|
|
||||||
|
Point your browser to http://localhost:4200
|
||||||
Point your browser to http://localhost:4200
|
|
||||||
|
## Option 2, Using local machine
|
||||||
## Option 2, Using local machine
|
|
||||||
|
*Dependencies*
|
||||||
*Dependencies*
|
|
||||||
|
* npm 6.9.0
|
||||||
* npm 6.9.0
|
* nodejs 10.16.0
|
||||||
* nodejs 10.16.0
|
* git
|
||||||
* git
|
|
||||||
|
*Setup*
|
||||||
*Setup*
|
|
||||||
|
```
|
||||||
```
|
git clone https://git.akkerweb.nl/FarmMaps/FarmMapsLib.git
|
||||||
git clone https://git.akkerweb.nl/FarmMaps/FarmMapsLib.git
|
cd FarmMapsLib
|
||||||
cd FarmMapsLib
|
npm config set @farmmaps:registry https://repository.akkerweb.nl/repository/npm-group/
|
||||||
npm config set @farmmaps:registry https://repository.akkerweb.nl/repository/npm-group/
|
npm install -g @angular/cli
|
||||||
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
|
||||||
|
```
|
||||||
|
|||||||
+109
-105
@@ -48,7 +48,7 @@
|
|||||||
"styles": [
|
"styles": [
|
||||||
"src/styles.css",
|
"src/styles.css",
|
||||||
"node_modules/bootstrap/dist/css/bootstrap.min.css",
|
"node_modules/bootstrap/dist/css/bootstrap.min.css",
|
||||||
"node_modules/font-awesome/css/font-awesome.min.css",
|
"fontawesome-6.2.1/css/all.min.css",
|
||||||
"fonts/FMIconFont/style.css",
|
"fonts/FMIconFont/style.css",
|
||||||
"node_modules/cesium/Build/Cesium/Widgets/widgets.css",
|
"node_modules/cesium/Build/Cesium/Widgets/widgets.css",
|
||||||
"node_modules/ol/ol.css"
|
"node_modules/ol/ol.css"
|
||||||
@@ -83,6 +83,31 @@
|
|||||||
"maximumWarning": "6kb"
|
"maximumWarning": "6kb"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
},
|
||||||
|
"development": {
|
||||||
|
"fileReplacements": [
|
||||||
|
{
|
||||||
|
"replace": "src/environments/environment.ts",
|
||||||
|
"with": "src/environments/environment.prod.ts"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"optimization": false,
|
||||||
|
"sourceMap": true,
|
||||||
|
"namedChunks": true,
|
||||||
|
"extractLicenses": false,
|
||||||
|
"vendorChunk": false,
|
||||||
|
"buildOptimizer": false,
|
||||||
|
"budgets": [
|
||||||
|
{
|
||||||
|
"type": "initial",
|
||||||
|
"maximumWarning": "2mb",
|
||||||
|
"maximumError": "7mb"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "anyComponentStyle",
|
||||||
|
"maximumWarning": "6kb"
|
||||||
|
}
|
||||||
|
]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -94,70 +119,24 @@
|
|||||||
"configurations": {
|
"configurations": {
|
||||||
"production": {
|
"production": {
|
||||||
"browserTarget": "farmmaps-lib-app:build:production"
|
"browserTarget": "farmmaps-lib-app:build:production"
|
||||||
|
},
|
||||||
|
"development": {
|
||||||
|
"browserTarget": "farmmaps-lib-app:build:development"
|
||||||
}
|
}
|
||||||
}
|
},
|
||||||
|
"defaultConfiguration": "development"
|
||||||
},
|
},
|
||||||
"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": {
|
||||||
"builder": "@angular-devkit/build-angular:karma",
|
"builder": "@angular/build:unit-test",
|
||||||
"options": {
|
"options": {
|
||||||
"main": "src/test.ts",
|
|
||||||
"polyfills": "src/polyfills.ts",
|
|
||||||
"tsConfig": "src/tsconfig.spec.json",
|
"tsConfig": "src/tsconfig.spec.json",
|
||||||
"karmaConfig": "src/karma.conf.js",
|
"browsers": ["chromium"]
|
||||||
"styles": [
|
|
||||||
"src/styles.css"
|
|
||||||
],
|
|
||||||
"scripts": [],
|
|
||||||
"assets": [
|
|
||||||
"src/favicon.ico",
|
|
||||||
"src/assets"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"lint": {
|
|
||||||
"builder": "@angular-devkit/build-angular:tslint",
|
|
||||||
"options": {
|
|
||||||
"tsConfig": [
|
|
||||||
"src/tsconfig.app.json",
|
|
||||||
"src/tsconfig.spec.json"
|
|
||||||
],
|
|
||||||
"exclude": [
|
|
||||||
"**/node_modules/**"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"farmmaps-lib-app-e2e": {
|
|
||||||
"root": "e2e/",
|
|
||||||
"projectType": "application",
|
|
||||||
"prefix": "",
|
|
||||||
"architect": {
|
|
||||||
"e2e": {
|
|
||||||
"builder": "@angular-devkit/build-angular:protractor",
|
|
||||||
"options": {
|
|
||||||
"protractorConfig": "e2e/protractor.conf.js",
|
|
||||||
"devServerTarget": "farmmaps-lib-app:serve"
|
|
||||||
},
|
|
||||||
"configurations": {
|
|
||||||
"production": {
|
|
||||||
"devServerTarget": "farmmaps-lib-app:serve:production"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"lint": {
|
|
||||||
"builder": "@angular-devkit/build-angular:tslint",
|
|
||||||
"options": {
|
|
||||||
"tsConfig": "e2e/tsconfig.e2e.json",
|
|
||||||
"exclude": [
|
|
||||||
"**/node_modules/**"
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -169,7 +148,7 @@
|
|||||||
"prefix": "fm",
|
"prefix": "fm",
|
||||||
"architect": {
|
"architect": {
|
||||||
"build": {
|
"build": {
|
||||||
"builder": "@angular-devkit/build-ng-packagr:build",
|
"builder": "@angular-devkit/build-angular:ng-packagr",
|
||||||
"options": {
|
"options": {
|
||||||
"tsConfig": "projects/common/tsconfig.lib.json",
|
"tsConfig": "projects/common/tsconfig.lib.json",
|
||||||
"project": "projects/common/ng-package.json"
|
"project": "projects/common/ng-package.json"
|
||||||
@@ -181,23 +160,10 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"test": {
|
"test": {
|
||||||
"builder": "@angular-devkit/build-angular:karma",
|
"builder": "@angular/build:unit-test",
|
||||||
"options": {
|
"options": {
|
||||||
"main": "projects/common/src/test.ts",
|
|
||||||
"tsConfig": "projects/common/tsconfig.spec.json",
|
"tsConfig": "projects/common/tsconfig.spec.json",
|
||||||
"karmaConfig": "projects/common/karma.conf.js"
|
"browsers": ["chromium"]
|
||||||
}
|
|
||||||
},
|
|
||||||
"lint": {
|
|
||||||
"builder": "@angular-devkit/build-angular:tslint",
|
|
||||||
"options": {
|
|
||||||
"tsConfig": [
|
|
||||||
"projects/common/tsconfig.lib.json",
|
|
||||||
"projects/common/tsconfig.spec.json"
|
|
||||||
],
|
|
||||||
"exclude": [
|
|
||||||
"**/node_modules/**"
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -209,35 +175,22 @@
|
|||||||
"prefix": "fm-map",
|
"prefix": "fm-map",
|
||||||
"architect": {
|
"architect": {
|
||||||
"build": {
|
"build": {
|
||||||
"builder": "@angular-devkit/build-ng-packagr:build",
|
"builder": "@angular-devkit/build-angular:ng-packagr",
|
||||||
"options": {
|
"options": {
|
||||||
"tsConfig": "projects/common-map/tsconfig.lib.json",
|
"tsConfig": "projects/common-map/tsconfig.lib.json",
|
||||||
"project": "projects/common-map/ng-package.json"
|
"project": "projects/common-map/ng-package.json"
|
||||||
}
|
},
|
||||||
, "configurations": {
|
"configurations": {
|
||||||
"production": {
|
"production": {
|
||||||
"tsConfig": "projects/common-map/tsconfig.lib.prod.json"
|
"tsConfig": "projects/common-map/tsconfig.lib.prod.json"
|
||||||
}
|
}
|
||||||
}
|
|
||||||
},
|
|
||||||
"test": {
|
|
||||||
"builder": "@angular-devkit/build-angular:karma",
|
|
||||||
"options": {
|
|
||||||
"main": "projects/common-map/src/test.ts",
|
|
||||||
"tsConfig": "projects/common-map/tsconfig.spec.json",
|
|
||||||
"karmaConfig": "projects/common-map/karma.conf.js"
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"lint": {
|
"test": {
|
||||||
"builder": "@angular-devkit/build-angular:tslint",
|
"builder": "@angular/build:unit-test",
|
||||||
"options": {
|
"options": {
|
||||||
"tsConfig": [
|
"tsConfig": "projects/common-map/tsconfig.spec.json",
|
||||||
"projects/common-map/tsconfig.lib.json",
|
"browsers": ["chromium"]
|
||||||
"projects/common-map/tsconfig.spec.json"
|
|
||||||
],
|
|
||||||
"exclude": [
|
|
||||||
"**/node_modules/**"
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -261,27 +214,78 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"test": {
|
"test": {
|
||||||
"builder": "@angular-devkit/build-angular:karma",
|
"builder": "@angular/build:unit-test",
|
||||||
"options": {
|
"options": {
|
||||||
"main": "projects/common-map3d/src/test.ts",
|
|
||||||
"tsConfig": "projects/common-map3d/tsconfig.spec.json",
|
"tsConfig": "projects/common-map3d/tsconfig.spec.json",
|
||||||
"karmaConfig": "projects/common-map3d/karma.conf.js"
|
"browsers": ["chromium"]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"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/build:unit-test",
|
||||||
|
"options": {
|
||||||
|
"tsConfig": "projects/ng-openlayers/tsconfig.spec.json",
|
||||||
|
"browsers": ["chromium"]
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"lint": {
|
"lint": {
|
||||||
"builder": "@angular-devkit/build-angular:tslint",
|
"builder": "@angular-eslint/builder:lint",
|
||||||
"options": {
|
"options": {
|
||||||
"tsConfig": [
|
"lintFilePatterns": [
|
||||||
"projects/common-map3d/tsconfig.lib.json",
|
"projects/ng-openlayers/**/*.ts",
|
||||||
"projects/common-map3d/tsconfig.spec.json"
|
"projects/ng-openlayers/**/*.html"
|
||||||
],
|
|
||||||
"exclude": [
|
|
||||||
"**/node_modules/**"
|
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"defaultProject": "farmmaps-lib-app"
|
"cli": {
|
||||||
|
"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": "."
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -1,10 +1,16 @@
|
|||||||
module.exports = {
|
module.exports = {
|
||||||
node: {
|
resolve: {
|
||||||
|
fallback: {
|
||||||
// Resolve node module use of fs
|
// Resolve node module use of fs
|
||||||
fs: "empty",
|
fs: "empty",
|
||||||
Buffer: false,
|
Buffer: false,
|
||||||
http: "empty",
|
http: require.resolve("stream-http"),
|
||||||
https: "empty",
|
https: require.resolve("https-browserify"),
|
||||||
zlib: "empty"
|
url: require.resolve("url/"),
|
||||||
|
zlib: require.resolve('browserify-zlib'),
|
||||||
|
assert: require.resolve("assert/"),
|
||||||
|
util: require.resolve("util/"),
|
||||||
|
buffer: require.resolve("buffer/")
|
||||||
}
|
}
|
||||||
};
|
}
|
||||||
|
};
|
||||||
@@ -1,28 +0,0 @@
|
|||||||
// Protractor configuration file, see link for more information
|
|
||||||
// https://github.com/angular/protractor/blob/master/lib/config.ts
|
|
||||||
|
|
||||||
const { SpecReporter } = require('jasmine-spec-reporter');
|
|
||||||
|
|
||||||
exports.config = {
|
|
||||||
allScriptsTimeout: 11000,
|
|
||||||
specs: [
|
|
||||||
'./src/**/*.e2e-spec.ts'
|
|
||||||
],
|
|
||||||
capabilities: {
|
|
||||||
'browserName': 'chrome'
|
|
||||||
},
|
|
||||||
directConnect: true,
|
|
||||||
baseUrl: 'http://localhost:4200/',
|
|
||||||
framework: 'jasmine',
|
|
||||||
jasmineNodeOpts: {
|
|
||||||
showColors: true,
|
|
||||||
defaultTimeoutInterval: 30000,
|
|
||||||
print: function() {}
|
|
||||||
},
|
|
||||||
onPrepare() {
|
|
||||||
require('ts-node').register({
|
|
||||||
project: require('path').join(__dirname, './tsconfig.e2e.json')
|
|
||||||
});
|
|
||||||
jasmine.getEnv().addReporter(new SpecReporter({ spec: { displayStacktrace: true } }));
|
|
||||||
}
|
|
||||||
};
|
|
||||||
@@ -1,23 +0,0 @@
|
|||||||
import { AppPage } from './app.po';
|
|
||||||
import { browser, logging } from 'protractor';
|
|
||||||
|
|
||||||
describe('workspace-project App', () => {
|
|
||||||
let page: AppPage;
|
|
||||||
|
|
||||||
beforeEach(() => {
|
|
||||||
page = new AppPage();
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should display welcome message', () => {
|
|
||||||
page.navigateTo();
|
|
||||||
expect(page.getTitleText()).toEqual('Welcome to farmmaps-lib-app!');
|
|
||||||
});
|
|
||||||
|
|
||||||
afterEach(async () => {
|
|
||||||
// Assert that there are no errors emitted from the browser
|
|
||||||
const logs = await browser.manage().logs().get(logging.Type.BROWSER);
|
|
||||||
expect(logs).not.toContain(jasmine.objectContaining({
|
|
||||||
level: logging.Level.SEVERE,
|
|
||||||
} as logging.Entry));
|
|
||||||
});
|
|
||||||
});
|
|
||||||
@@ -1,11 +0,0 @@
|
|||||||
import { browser, by, element } from 'protractor';
|
|
||||||
|
|
||||||
export class AppPage {
|
|
||||||
navigateTo() {
|
|
||||||
return browser.get(browser.baseUrl) as Promise<any>;
|
|
||||||
}
|
|
||||||
|
|
||||||
getTitleText() {
|
|
||||||
return element(by.css('app-root h1')).getText() as Promise<string>;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,13 +0,0 @@
|
|||||||
{
|
|
||||||
"extends": "../tsconfig.json",
|
|
||||||
"compilerOptions": {
|
|
||||||
"outDir": "../out-tsc/app",
|
|
||||||
"module": "commonjs",
|
|
||||||
"target": "es5",
|
|
||||||
"types": [
|
|
||||||
"jasmine",
|
|
||||||
"jasminewd2",
|
|
||||||
"node"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -0,0 +1,18 @@
|
|||||||
|
Font Awesome Pro License
|
||||||
|
------------------------
|
||||||
|
|
||||||
|
Font Awesome Pro is commercial software that requires a paid license. Full
|
||||||
|
Font Awesome Pro license: https://fontawesome.com/license.
|
||||||
|
|
||||||
|
# Commercial License
|
||||||
|
The Font Awesome Pro commercial license allows you to pay for FA Pro once, own
|
||||||
|
it, and use it just about everywhere you'd like.
|
||||||
|
|
||||||
|
# Attribution
|
||||||
|
Attribution is not required by the Font Awesome Pro commercial license.
|
||||||
|
|
||||||
|
# Brand Icons
|
||||||
|
All brand icons are trademarks of their respective owners. The use of these
|
||||||
|
trademarks does not indicate endorsement of the trademark holder by Font
|
||||||
|
Awesome, nor vice versa. **Please do not use brand logos for any purpose except
|
||||||
|
to represent the company, product, or service to which they refer.**
|
||||||
File diff suppressed because it is too large
Load Diff
Vendored
+6
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large
Load Diff
Vendored
+6
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large
Load Diff
+6
File diff suppressed because one or more lines are too long
+12940
File diff suppressed because it is too large
Load Diff
+6
File diff suppressed because one or more lines are too long
@@ -0,0 +1,19 @@
|
|||||||
|
/*!
|
||||||
|
* Font Awesome Pro 6.2.1 by @fontawesome - https://fontawesome.com
|
||||||
|
* License - https://fontawesome.com/license (Commercial License)
|
||||||
|
* Copyright 2022 Fonticons, Inc.
|
||||||
|
*/
|
||||||
|
:root, :host {
|
||||||
|
--fa-style-family-classic: 'Font Awesome 6 Pro';
|
||||||
|
--fa-font-light: normal 300 1em/1 'Font Awesome 6 Pro'; }
|
||||||
|
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Font Awesome 6 Pro';
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: 300;
|
||||||
|
font-display: block;
|
||||||
|
src: url("../webfonts/fa-light-300.woff2") format("woff2"), url("../webfonts/fa-light-300.ttf") format("truetype"); }
|
||||||
|
|
||||||
|
.fal,
|
||||||
|
.fa-light {
|
||||||
|
font-weight: 300; }
|
||||||
Vendored
+6
@@ -0,0 +1,6 @@
|
|||||||
|
/*!
|
||||||
|
* Font Awesome Pro 6.2.1 by @fontawesome - https://fontawesome.com
|
||||||
|
* License - https://fontawesome.com/license (Commercial License)
|
||||||
|
* Copyright 2022 Fonticons, Inc.
|
||||||
|
*/
|
||||||
|
:host,:root{--fa-style-family-classic:"Font Awesome 6 Pro";--fa-font-light:normal 300 1em/1 "Font Awesome 6 Pro"}@font-face{font-family:"Font Awesome 6 Pro";font-style:normal;font-weight:300;font-display:block;src:url(../webfonts/fa-light-300.woff2) format("woff2"),url(../webfonts/fa-light-300.ttf) format("truetype")}.fa-light,.fal{font-weight:300}
|
||||||
@@ -0,0 +1,19 @@
|
|||||||
|
/*!
|
||||||
|
* Font Awesome Pro 6.2.1 by @fontawesome - https://fontawesome.com
|
||||||
|
* License - https://fontawesome.com/license (Commercial License)
|
||||||
|
* Copyright 2022 Fonticons, Inc.
|
||||||
|
*/
|
||||||
|
:root, :host {
|
||||||
|
--fa-style-family-classic: 'Font Awesome 6 Pro';
|
||||||
|
--fa-font-regular: normal 400 1em/1 'Font Awesome 6 Pro'; }
|
||||||
|
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Font Awesome 6 Pro';
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: 400;
|
||||||
|
font-display: block;
|
||||||
|
src: url("../webfonts/fa-regular-400.woff2") format("woff2"), url("../webfonts/fa-regular-400.ttf") format("truetype"); }
|
||||||
|
|
||||||
|
.far,
|
||||||
|
.fa-regular {
|
||||||
|
font-weight: 400; }
|
||||||
+6
@@ -0,0 +1,6 @@
|
|||||||
|
/*!
|
||||||
|
* Font Awesome Pro 6.2.1 by @fontawesome - https://fontawesome.com
|
||||||
|
* License - https://fontawesome.com/license (Commercial License)
|
||||||
|
* Copyright 2022 Fonticons, Inc.
|
||||||
|
*/
|
||||||
|
:host,:root{--fa-style-family-classic:"Font Awesome 6 Pro";--fa-font-regular:normal 400 1em/1 "Font Awesome 6 Pro"}@font-face{font-family:"Font Awesome 6 Pro";font-style:normal;font-weight:400;font-display:block;src:url(../webfonts/fa-regular-400.woff2) format("woff2"),url(../webfonts/fa-regular-400.ttf) format("truetype")}.fa-regular,.far{font-weight:400}
|
||||||
@@ -0,0 +1,19 @@
|
|||||||
|
/*!
|
||||||
|
* Font Awesome Pro 6.2.1 by @fontawesome - https://fontawesome.com
|
||||||
|
* License - https://fontawesome.com/license (Commercial License)
|
||||||
|
* Copyright 2022 Fonticons, Inc.
|
||||||
|
*/
|
||||||
|
:root, :host {
|
||||||
|
--fa-style-family-sharp: 'Font Awesome 6 Sharp';
|
||||||
|
--fa-font-sharp-solid: normal 900 1em/1 'Font Awesome 6 Sharp'; }
|
||||||
|
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Font Awesome 6 Sharp';
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: 900;
|
||||||
|
font-display: block;
|
||||||
|
src: url("../webfonts/fa-sharp-solid-900.woff2") format("woff2"), url("../webfonts/fa-sharp-solid-900.ttf") format("truetype"); }
|
||||||
|
|
||||||
|
.fass,
|
||||||
|
.fa-sharp-solid {
|
||||||
|
font-weight: 900; }
|
||||||
+6
@@ -0,0 +1,6 @@
|
|||||||
|
/*!
|
||||||
|
* Font Awesome Pro 6.2.1 by @fontawesome - https://fontawesome.com
|
||||||
|
* License - https://fontawesome.com/license (Commercial License)
|
||||||
|
* Copyright 2022 Fonticons, Inc.
|
||||||
|
*/
|
||||||
|
:host,:root{--fa-style-family-sharp:"Font Awesome 6 Sharp";--fa-font-sharp-solid:normal 900 1em/1 "Font Awesome 6 Sharp"}@font-face{font-family:"Font Awesome 6 Sharp";font-style:normal;font-weight:900;font-display:block;src:url(../webfonts/fa-sharp-solid-900.woff2) format("woff2"),url(../webfonts/fa-sharp-solid-900.ttf) format("truetype")}.fa-sharp-solid,.fass{font-weight:900}
|
||||||
@@ -0,0 +1,19 @@
|
|||||||
|
/*!
|
||||||
|
* Font Awesome Pro 6.2.1 by @fontawesome - https://fontawesome.com
|
||||||
|
* License - https://fontawesome.com/license (Commercial License)
|
||||||
|
* Copyright 2022 Fonticons, Inc.
|
||||||
|
*/
|
||||||
|
:root, :host {
|
||||||
|
--fa-style-family-classic: 'Font Awesome 6 Pro';
|
||||||
|
--fa-font-solid: normal 900 1em/1 'Font Awesome 6 Pro'; }
|
||||||
|
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Font Awesome 6 Pro';
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: 900;
|
||||||
|
font-display: block;
|
||||||
|
src: url("../webfonts/fa-solid-900.woff2") format("woff2"), url("../webfonts/fa-solid-900.ttf") format("truetype"); }
|
||||||
|
|
||||||
|
.fas,
|
||||||
|
.fa-solid {
|
||||||
|
font-weight: 900; }
|
||||||
Vendored
+6
@@ -0,0 +1,6 @@
|
|||||||
|
/*!
|
||||||
|
* Font Awesome Pro 6.2.1 by @fontawesome - https://fontawesome.com
|
||||||
|
* License - https://fontawesome.com/license (Commercial License)
|
||||||
|
* Copyright 2022 Fonticons, Inc.
|
||||||
|
*/
|
||||||
|
:host,:root{--fa-style-family-classic:"Font Awesome 6 Pro";--fa-font-solid:normal 900 1em/1 "Font Awesome 6 Pro"}@font-face{font-family:"Font Awesome 6 Pro";font-style:normal;font-weight:900;font-display:block;src:url(../webfonts/fa-solid-900.woff2) format("woff2"),url(../webfonts/fa-solid-900.ttf) format("truetype")}.fa-solid,.fas{font-weight:900}
|
||||||
@@ -0,0 +1,635 @@
|
|||||||
|
/*!
|
||||||
|
* Font Awesome Pro 6.2.1 by @fontawesome - https://fontawesome.com
|
||||||
|
* License - https://fontawesome.com/license (Commercial License)
|
||||||
|
* Copyright 2022 Fonticons, Inc.
|
||||||
|
*/
|
||||||
|
:root, :host {
|
||||||
|
--fa-font-solid: normal 900 1em/1 'Font Awesome 6 Solid';
|
||||||
|
--fa-font-regular: normal 400 1em/1 'Font Awesome 6 Regular';
|
||||||
|
--fa-font-light: normal 300 1em/1 'Font Awesome 6 Light';
|
||||||
|
--fa-font-thin: normal 100 1em/1 'Font Awesome 6 Thin';
|
||||||
|
--fa-font-duotone: normal 900 1em/1 'Font Awesome 6 Duotone';
|
||||||
|
--fa-font-sharp-solid: normal 900 1em/1 'Font Awesome 6 Sharp';
|
||||||
|
--fa-font-brands: normal 400 1em/1 'Font Awesome 6 Brands'; }
|
||||||
|
|
||||||
|
svg:not(:root).svg-inline--fa, svg:not(:host).svg-inline--fa {
|
||||||
|
overflow: visible;
|
||||||
|
box-sizing: content-box; }
|
||||||
|
|
||||||
|
.svg-inline--fa {
|
||||||
|
display: var(--fa-display, inline-block);
|
||||||
|
height: 1em;
|
||||||
|
overflow: visible;
|
||||||
|
vertical-align: -.125em; }
|
||||||
|
.svg-inline--fa.fa-2xs {
|
||||||
|
vertical-align: 0.1em; }
|
||||||
|
.svg-inline--fa.fa-xs {
|
||||||
|
vertical-align: 0em; }
|
||||||
|
.svg-inline--fa.fa-sm {
|
||||||
|
vertical-align: -0.07143em; }
|
||||||
|
.svg-inline--fa.fa-lg {
|
||||||
|
vertical-align: -0.2em; }
|
||||||
|
.svg-inline--fa.fa-xl {
|
||||||
|
vertical-align: -0.25em; }
|
||||||
|
.svg-inline--fa.fa-2xl {
|
||||||
|
vertical-align: -0.3125em; }
|
||||||
|
.svg-inline--fa.fa-pull-left {
|
||||||
|
margin-right: var(--fa-pull-margin, 0.3em);
|
||||||
|
width: auto; }
|
||||||
|
.svg-inline--fa.fa-pull-right {
|
||||||
|
margin-left: var(--fa-pull-margin, 0.3em);
|
||||||
|
width: auto; }
|
||||||
|
.svg-inline--fa.fa-li {
|
||||||
|
width: var(--fa-li-width, 2em);
|
||||||
|
top: 0.25em; }
|
||||||
|
.svg-inline--fa.fa-fw {
|
||||||
|
width: var(--fa-fw-width, 1.25em); }
|
||||||
|
|
||||||
|
.fa-layers svg.svg-inline--fa {
|
||||||
|
bottom: 0;
|
||||||
|
left: 0;
|
||||||
|
margin: auto;
|
||||||
|
position: absolute;
|
||||||
|
right: 0;
|
||||||
|
top: 0; }
|
||||||
|
|
||||||
|
.fa-layers-text, .fa-layers-counter {
|
||||||
|
display: inline-block;
|
||||||
|
position: absolute;
|
||||||
|
text-align: center; }
|
||||||
|
|
||||||
|
.fa-layers {
|
||||||
|
display: inline-block;
|
||||||
|
height: 1em;
|
||||||
|
position: relative;
|
||||||
|
text-align: center;
|
||||||
|
vertical-align: -.125em;
|
||||||
|
width: 1em; }
|
||||||
|
.fa-layers svg.svg-inline--fa {
|
||||||
|
-webkit-transform-origin: center center;
|
||||||
|
transform-origin: center center; }
|
||||||
|
|
||||||
|
.fa-layers-text {
|
||||||
|
left: 50%;
|
||||||
|
top: 50%;
|
||||||
|
-webkit-transform: translate(-50%, -50%);
|
||||||
|
transform: translate(-50%, -50%);
|
||||||
|
-webkit-transform-origin: center center;
|
||||||
|
transform-origin: center center; }
|
||||||
|
|
||||||
|
.fa-layers-counter {
|
||||||
|
background-color: var(--fa-counter-background-color, #ff253a);
|
||||||
|
border-radius: var(--fa-counter-border-radius, 1em);
|
||||||
|
box-sizing: border-box;
|
||||||
|
color: var(--fa-inverse, #fff);
|
||||||
|
line-height: var(--fa-counter-line-height, 1);
|
||||||
|
max-width: var(--fa-counter-max-width, 5em);
|
||||||
|
min-width: var(--fa-counter-min-width, 1.5em);
|
||||||
|
overflow: hidden;
|
||||||
|
padding: var(--fa-counter-padding, 0.25em 0.5em);
|
||||||
|
right: var(--fa-right, 0);
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
top: var(--fa-top, 0);
|
||||||
|
-webkit-transform: scale(var(--fa-counter-scale, 0.25));
|
||||||
|
transform: scale(var(--fa-counter-scale, 0.25));
|
||||||
|
-webkit-transform-origin: top right;
|
||||||
|
transform-origin: top right; }
|
||||||
|
|
||||||
|
.fa-layers-bottom-right {
|
||||||
|
bottom: var(--fa-bottom, 0);
|
||||||
|
right: var(--fa-right, 0);
|
||||||
|
top: auto;
|
||||||
|
-webkit-transform: scale(var(--fa-layers-scale, 0.25));
|
||||||
|
transform: scale(var(--fa-layers-scale, 0.25));
|
||||||
|
-webkit-transform-origin: bottom right;
|
||||||
|
transform-origin: bottom right; }
|
||||||
|
|
||||||
|
.fa-layers-bottom-left {
|
||||||
|
bottom: var(--fa-bottom, 0);
|
||||||
|
left: var(--fa-left, 0);
|
||||||
|
right: auto;
|
||||||
|
top: auto;
|
||||||
|
-webkit-transform: scale(var(--fa-layers-scale, 0.25));
|
||||||
|
transform: scale(var(--fa-layers-scale, 0.25));
|
||||||
|
-webkit-transform-origin: bottom left;
|
||||||
|
transform-origin: bottom left; }
|
||||||
|
|
||||||
|
.fa-layers-top-right {
|
||||||
|
top: var(--fa-top, 0);
|
||||||
|
right: var(--fa-right, 0);
|
||||||
|
-webkit-transform: scale(var(--fa-layers-scale, 0.25));
|
||||||
|
transform: scale(var(--fa-layers-scale, 0.25));
|
||||||
|
-webkit-transform-origin: top right;
|
||||||
|
transform-origin: top right; }
|
||||||
|
|
||||||
|
.fa-layers-top-left {
|
||||||
|
left: var(--fa-left, 0);
|
||||||
|
right: auto;
|
||||||
|
top: var(--fa-top, 0);
|
||||||
|
-webkit-transform: scale(var(--fa-layers-scale, 0.25));
|
||||||
|
transform: scale(var(--fa-layers-scale, 0.25));
|
||||||
|
-webkit-transform-origin: top left;
|
||||||
|
transform-origin: top left; }
|
||||||
|
|
||||||
|
.fa-1x {
|
||||||
|
font-size: 1em; }
|
||||||
|
|
||||||
|
.fa-2x {
|
||||||
|
font-size: 2em; }
|
||||||
|
|
||||||
|
.fa-3x {
|
||||||
|
font-size: 3em; }
|
||||||
|
|
||||||
|
.fa-4x {
|
||||||
|
font-size: 4em; }
|
||||||
|
|
||||||
|
.fa-5x {
|
||||||
|
font-size: 5em; }
|
||||||
|
|
||||||
|
.fa-6x {
|
||||||
|
font-size: 6em; }
|
||||||
|
|
||||||
|
.fa-7x {
|
||||||
|
font-size: 7em; }
|
||||||
|
|
||||||
|
.fa-8x {
|
||||||
|
font-size: 8em; }
|
||||||
|
|
||||||
|
.fa-9x {
|
||||||
|
font-size: 9em; }
|
||||||
|
|
||||||
|
.fa-10x {
|
||||||
|
font-size: 10em; }
|
||||||
|
|
||||||
|
.fa-2xs {
|
||||||
|
font-size: 0.625em;
|
||||||
|
line-height: 0.1em;
|
||||||
|
vertical-align: 0.225em; }
|
||||||
|
|
||||||
|
.fa-xs {
|
||||||
|
font-size: 0.75em;
|
||||||
|
line-height: 0.08333em;
|
||||||
|
vertical-align: 0.125em; }
|
||||||
|
|
||||||
|
.fa-sm {
|
||||||
|
font-size: 0.875em;
|
||||||
|
line-height: 0.07143em;
|
||||||
|
vertical-align: 0.05357em; }
|
||||||
|
|
||||||
|
.fa-lg {
|
||||||
|
font-size: 1.25em;
|
||||||
|
line-height: 0.05em;
|
||||||
|
vertical-align: -0.075em; }
|
||||||
|
|
||||||
|
.fa-xl {
|
||||||
|
font-size: 1.5em;
|
||||||
|
line-height: 0.04167em;
|
||||||
|
vertical-align: -0.125em; }
|
||||||
|
|
||||||
|
.fa-2xl {
|
||||||
|
font-size: 2em;
|
||||||
|
line-height: 0.03125em;
|
||||||
|
vertical-align: -0.1875em; }
|
||||||
|
|
||||||
|
.fa-fw {
|
||||||
|
text-align: center;
|
||||||
|
width: 1.25em; }
|
||||||
|
|
||||||
|
.fa-ul {
|
||||||
|
list-style-type: none;
|
||||||
|
margin-left: var(--fa-li-margin, 2.5em);
|
||||||
|
padding-left: 0; }
|
||||||
|
.fa-ul > li {
|
||||||
|
position: relative; }
|
||||||
|
|
||||||
|
.fa-li {
|
||||||
|
left: calc(var(--fa-li-width, 2em) * -1);
|
||||||
|
position: absolute;
|
||||||
|
text-align: center;
|
||||||
|
width: var(--fa-li-width, 2em);
|
||||||
|
line-height: inherit; }
|
||||||
|
|
||||||
|
.fa-border {
|
||||||
|
border-color: var(--fa-border-color, #eee);
|
||||||
|
border-radius: var(--fa-border-radius, 0.1em);
|
||||||
|
border-style: var(--fa-border-style, solid);
|
||||||
|
border-width: var(--fa-border-width, 0.08em);
|
||||||
|
padding: var(--fa-border-padding, 0.2em 0.25em 0.15em); }
|
||||||
|
|
||||||
|
.fa-pull-left {
|
||||||
|
float: left;
|
||||||
|
margin-right: var(--fa-pull-margin, 0.3em); }
|
||||||
|
|
||||||
|
.fa-pull-right {
|
||||||
|
float: right;
|
||||||
|
margin-left: var(--fa-pull-margin, 0.3em); }
|
||||||
|
|
||||||
|
.fa-beat {
|
||||||
|
-webkit-animation-name: fa-beat;
|
||||||
|
animation-name: fa-beat;
|
||||||
|
-webkit-animation-delay: var(--fa-animation-delay, 0s);
|
||||||
|
animation-delay: var(--fa-animation-delay, 0s);
|
||||||
|
-webkit-animation-direction: var(--fa-animation-direction, normal);
|
||||||
|
animation-direction: var(--fa-animation-direction, normal);
|
||||||
|
-webkit-animation-duration: var(--fa-animation-duration, 1s);
|
||||||
|
animation-duration: var(--fa-animation-duration, 1s);
|
||||||
|
-webkit-animation-iteration-count: var(--fa-animation-iteration-count, infinite);
|
||||||
|
animation-iteration-count: var(--fa-animation-iteration-count, infinite);
|
||||||
|
-webkit-animation-timing-function: var(--fa-animation-timing, ease-in-out);
|
||||||
|
animation-timing-function: var(--fa-animation-timing, ease-in-out); }
|
||||||
|
|
||||||
|
.fa-bounce {
|
||||||
|
-webkit-animation-name: fa-bounce;
|
||||||
|
animation-name: fa-bounce;
|
||||||
|
-webkit-animation-delay: var(--fa-animation-delay, 0s);
|
||||||
|
animation-delay: var(--fa-animation-delay, 0s);
|
||||||
|
-webkit-animation-direction: var(--fa-animation-direction, normal);
|
||||||
|
animation-direction: var(--fa-animation-direction, normal);
|
||||||
|
-webkit-animation-duration: var(--fa-animation-duration, 1s);
|
||||||
|
animation-duration: var(--fa-animation-duration, 1s);
|
||||||
|
-webkit-animation-iteration-count: var(--fa-animation-iteration-count, infinite);
|
||||||
|
animation-iteration-count: var(--fa-animation-iteration-count, infinite);
|
||||||
|
-webkit-animation-timing-function: var(--fa-animation-timing, cubic-bezier(0.28, 0.84, 0.42, 1));
|
||||||
|
animation-timing-function: var(--fa-animation-timing, cubic-bezier(0.28, 0.84, 0.42, 1)); }
|
||||||
|
|
||||||
|
.fa-fade {
|
||||||
|
-webkit-animation-name: fa-fade;
|
||||||
|
animation-name: fa-fade;
|
||||||
|
-webkit-animation-delay: var(--fa-animation-delay, 0s);
|
||||||
|
animation-delay: var(--fa-animation-delay, 0s);
|
||||||
|
-webkit-animation-direction: var(--fa-animation-direction, normal);
|
||||||
|
animation-direction: var(--fa-animation-direction, normal);
|
||||||
|
-webkit-animation-duration: var(--fa-animation-duration, 1s);
|
||||||
|
animation-duration: var(--fa-animation-duration, 1s);
|
||||||
|
-webkit-animation-iteration-count: var(--fa-animation-iteration-count, infinite);
|
||||||
|
animation-iteration-count: var(--fa-animation-iteration-count, infinite);
|
||||||
|
-webkit-animation-timing-function: var(--fa-animation-timing, cubic-bezier(0.4, 0, 0.6, 1));
|
||||||
|
animation-timing-function: var(--fa-animation-timing, cubic-bezier(0.4, 0, 0.6, 1)); }
|
||||||
|
|
||||||
|
.fa-beat-fade {
|
||||||
|
-webkit-animation-name: fa-beat-fade;
|
||||||
|
animation-name: fa-beat-fade;
|
||||||
|
-webkit-animation-delay: var(--fa-animation-delay, 0s);
|
||||||
|
animation-delay: var(--fa-animation-delay, 0s);
|
||||||
|
-webkit-animation-direction: var(--fa-animation-direction, normal);
|
||||||
|
animation-direction: var(--fa-animation-direction, normal);
|
||||||
|
-webkit-animation-duration: var(--fa-animation-duration, 1s);
|
||||||
|
animation-duration: var(--fa-animation-duration, 1s);
|
||||||
|
-webkit-animation-iteration-count: var(--fa-animation-iteration-count, infinite);
|
||||||
|
animation-iteration-count: var(--fa-animation-iteration-count, infinite);
|
||||||
|
-webkit-animation-timing-function: var(--fa-animation-timing, cubic-bezier(0.4, 0, 0.6, 1));
|
||||||
|
animation-timing-function: var(--fa-animation-timing, cubic-bezier(0.4, 0, 0.6, 1)); }
|
||||||
|
|
||||||
|
.fa-flip {
|
||||||
|
-webkit-animation-name: fa-flip;
|
||||||
|
animation-name: fa-flip;
|
||||||
|
-webkit-animation-delay: var(--fa-animation-delay, 0s);
|
||||||
|
animation-delay: var(--fa-animation-delay, 0s);
|
||||||
|
-webkit-animation-direction: var(--fa-animation-direction, normal);
|
||||||
|
animation-direction: var(--fa-animation-direction, normal);
|
||||||
|
-webkit-animation-duration: var(--fa-animation-duration, 1s);
|
||||||
|
animation-duration: var(--fa-animation-duration, 1s);
|
||||||
|
-webkit-animation-iteration-count: var(--fa-animation-iteration-count, infinite);
|
||||||
|
animation-iteration-count: var(--fa-animation-iteration-count, infinite);
|
||||||
|
-webkit-animation-timing-function: var(--fa-animation-timing, ease-in-out);
|
||||||
|
animation-timing-function: var(--fa-animation-timing, ease-in-out); }
|
||||||
|
|
||||||
|
.fa-shake {
|
||||||
|
-webkit-animation-name: fa-shake;
|
||||||
|
animation-name: fa-shake;
|
||||||
|
-webkit-animation-delay: var(--fa-animation-delay, 0s);
|
||||||
|
animation-delay: var(--fa-animation-delay, 0s);
|
||||||
|
-webkit-animation-direction: var(--fa-animation-direction, normal);
|
||||||
|
animation-direction: var(--fa-animation-direction, normal);
|
||||||
|
-webkit-animation-duration: var(--fa-animation-duration, 1s);
|
||||||
|
animation-duration: var(--fa-animation-duration, 1s);
|
||||||
|
-webkit-animation-iteration-count: var(--fa-animation-iteration-count, infinite);
|
||||||
|
animation-iteration-count: var(--fa-animation-iteration-count, infinite);
|
||||||
|
-webkit-animation-timing-function: var(--fa-animation-timing, linear);
|
||||||
|
animation-timing-function: var(--fa-animation-timing, linear); }
|
||||||
|
|
||||||
|
.fa-spin {
|
||||||
|
-webkit-animation-name: fa-spin;
|
||||||
|
animation-name: fa-spin;
|
||||||
|
-webkit-animation-delay: var(--fa-animation-delay, 0s);
|
||||||
|
animation-delay: var(--fa-animation-delay, 0s);
|
||||||
|
-webkit-animation-direction: var(--fa-animation-direction, normal);
|
||||||
|
animation-direction: var(--fa-animation-direction, normal);
|
||||||
|
-webkit-animation-duration: var(--fa-animation-duration, 2s);
|
||||||
|
animation-duration: var(--fa-animation-duration, 2s);
|
||||||
|
-webkit-animation-iteration-count: var(--fa-animation-iteration-count, infinite);
|
||||||
|
animation-iteration-count: var(--fa-animation-iteration-count, infinite);
|
||||||
|
-webkit-animation-timing-function: var(--fa-animation-timing, linear);
|
||||||
|
animation-timing-function: var(--fa-animation-timing, linear); }
|
||||||
|
|
||||||
|
.fa-spin-reverse {
|
||||||
|
--fa-animation-direction: reverse; }
|
||||||
|
|
||||||
|
.fa-pulse,
|
||||||
|
.fa-spin-pulse {
|
||||||
|
-webkit-animation-name: fa-spin;
|
||||||
|
animation-name: fa-spin;
|
||||||
|
-webkit-animation-direction: var(--fa-animation-direction, normal);
|
||||||
|
animation-direction: var(--fa-animation-direction, normal);
|
||||||
|
-webkit-animation-duration: var(--fa-animation-duration, 1s);
|
||||||
|
animation-duration: var(--fa-animation-duration, 1s);
|
||||||
|
-webkit-animation-iteration-count: var(--fa-animation-iteration-count, infinite);
|
||||||
|
animation-iteration-count: var(--fa-animation-iteration-count, infinite);
|
||||||
|
-webkit-animation-timing-function: var(--fa-animation-timing, steps(8));
|
||||||
|
animation-timing-function: var(--fa-animation-timing, steps(8)); }
|
||||||
|
|
||||||
|
@media (prefers-reduced-motion: reduce) {
|
||||||
|
.fa-beat,
|
||||||
|
.fa-bounce,
|
||||||
|
.fa-fade,
|
||||||
|
.fa-beat-fade,
|
||||||
|
.fa-flip,
|
||||||
|
.fa-pulse,
|
||||||
|
.fa-shake,
|
||||||
|
.fa-spin,
|
||||||
|
.fa-spin-pulse {
|
||||||
|
-webkit-animation-delay: -1ms;
|
||||||
|
animation-delay: -1ms;
|
||||||
|
-webkit-animation-duration: 1ms;
|
||||||
|
animation-duration: 1ms;
|
||||||
|
-webkit-animation-iteration-count: 1;
|
||||||
|
animation-iteration-count: 1;
|
||||||
|
transition-delay: 0s;
|
||||||
|
transition-duration: 0s; } }
|
||||||
|
|
||||||
|
@-webkit-keyframes fa-beat {
|
||||||
|
0%, 90% {
|
||||||
|
-webkit-transform: scale(1);
|
||||||
|
transform: scale(1); }
|
||||||
|
45% {
|
||||||
|
-webkit-transform: scale(var(--fa-beat-scale, 1.25));
|
||||||
|
transform: scale(var(--fa-beat-scale, 1.25)); } }
|
||||||
|
|
||||||
|
@keyframes fa-beat {
|
||||||
|
0%, 90% {
|
||||||
|
-webkit-transform: scale(1);
|
||||||
|
transform: scale(1); }
|
||||||
|
45% {
|
||||||
|
-webkit-transform: scale(var(--fa-beat-scale, 1.25));
|
||||||
|
transform: scale(var(--fa-beat-scale, 1.25)); } }
|
||||||
|
|
||||||
|
@-webkit-keyframes fa-bounce {
|
||||||
|
0% {
|
||||||
|
-webkit-transform: scale(1, 1) translateY(0);
|
||||||
|
transform: scale(1, 1) translateY(0); }
|
||||||
|
10% {
|
||||||
|
-webkit-transform: scale(var(--fa-bounce-start-scale-x, 1.1), var(--fa-bounce-start-scale-y, 0.9)) translateY(0);
|
||||||
|
transform: scale(var(--fa-bounce-start-scale-x, 1.1), var(--fa-bounce-start-scale-y, 0.9)) translateY(0); }
|
||||||
|
30% {
|
||||||
|
-webkit-transform: scale(var(--fa-bounce-jump-scale-x, 0.9), var(--fa-bounce-jump-scale-y, 1.1)) translateY(var(--fa-bounce-height, -0.5em));
|
||||||
|
transform: scale(var(--fa-bounce-jump-scale-x, 0.9), var(--fa-bounce-jump-scale-y, 1.1)) translateY(var(--fa-bounce-height, -0.5em)); }
|
||||||
|
50% {
|
||||||
|
-webkit-transform: scale(var(--fa-bounce-land-scale-x, 1.05), var(--fa-bounce-land-scale-y, 0.95)) translateY(0);
|
||||||
|
transform: scale(var(--fa-bounce-land-scale-x, 1.05), var(--fa-bounce-land-scale-y, 0.95)) translateY(0); }
|
||||||
|
57% {
|
||||||
|
-webkit-transform: scale(1, 1) translateY(var(--fa-bounce-rebound, -0.125em));
|
||||||
|
transform: scale(1, 1) translateY(var(--fa-bounce-rebound, -0.125em)); }
|
||||||
|
64% {
|
||||||
|
-webkit-transform: scale(1, 1) translateY(0);
|
||||||
|
transform: scale(1, 1) translateY(0); }
|
||||||
|
100% {
|
||||||
|
-webkit-transform: scale(1, 1) translateY(0);
|
||||||
|
transform: scale(1, 1) translateY(0); } }
|
||||||
|
|
||||||
|
@keyframes fa-bounce {
|
||||||
|
0% {
|
||||||
|
-webkit-transform: scale(1, 1) translateY(0);
|
||||||
|
transform: scale(1, 1) translateY(0); }
|
||||||
|
10% {
|
||||||
|
-webkit-transform: scale(var(--fa-bounce-start-scale-x, 1.1), var(--fa-bounce-start-scale-y, 0.9)) translateY(0);
|
||||||
|
transform: scale(var(--fa-bounce-start-scale-x, 1.1), var(--fa-bounce-start-scale-y, 0.9)) translateY(0); }
|
||||||
|
30% {
|
||||||
|
-webkit-transform: scale(var(--fa-bounce-jump-scale-x, 0.9), var(--fa-bounce-jump-scale-y, 1.1)) translateY(var(--fa-bounce-height, -0.5em));
|
||||||
|
transform: scale(var(--fa-bounce-jump-scale-x, 0.9), var(--fa-bounce-jump-scale-y, 1.1)) translateY(var(--fa-bounce-height, -0.5em)); }
|
||||||
|
50% {
|
||||||
|
-webkit-transform: scale(var(--fa-bounce-land-scale-x, 1.05), var(--fa-bounce-land-scale-y, 0.95)) translateY(0);
|
||||||
|
transform: scale(var(--fa-bounce-land-scale-x, 1.05), var(--fa-bounce-land-scale-y, 0.95)) translateY(0); }
|
||||||
|
57% {
|
||||||
|
-webkit-transform: scale(1, 1) translateY(var(--fa-bounce-rebound, -0.125em));
|
||||||
|
transform: scale(1, 1) translateY(var(--fa-bounce-rebound, -0.125em)); }
|
||||||
|
64% {
|
||||||
|
-webkit-transform: scale(1, 1) translateY(0);
|
||||||
|
transform: scale(1, 1) translateY(0); }
|
||||||
|
100% {
|
||||||
|
-webkit-transform: scale(1, 1) translateY(0);
|
||||||
|
transform: scale(1, 1) translateY(0); } }
|
||||||
|
|
||||||
|
@-webkit-keyframes fa-fade {
|
||||||
|
50% {
|
||||||
|
opacity: var(--fa-fade-opacity, 0.4); } }
|
||||||
|
|
||||||
|
@keyframes fa-fade {
|
||||||
|
50% {
|
||||||
|
opacity: var(--fa-fade-opacity, 0.4); } }
|
||||||
|
|
||||||
|
@-webkit-keyframes fa-beat-fade {
|
||||||
|
0%, 100% {
|
||||||
|
opacity: var(--fa-beat-fade-opacity, 0.4);
|
||||||
|
-webkit-transform: scale(1);
|
||||||
|
transform: scale(1); }
|
||||||
|
50% {
|
||||||
|
opacity: 1;
|
||||||
|
-webkit-transform: scale(var(--fa-beat-fade-scale, 1.125));
|
||||||
|
transform: scale(var(--fa-beat-fade-scale, 1.125)); } }
|
||||||
|
|
||||||
|
@keyframes fa-beat-fade {
|
||||||
|
0%, 100% {
|
||||||
|
opacity: var(--fa-beat-fade-opacity, 0.4);
|
||||||
|
-webkit-transform: scale(1);
|
||||||
|
transform: scale(1); }
|
||||||
|
50% {
|
||||||
|
opacity: 1;
|
||||||
|
-webkit-transform: scale(var(--fa-beat-fade-scale, 1.125));
|
||||||
|
transform: scale(var(--fa-beat-fade-scale, 1.125)); } }
|
||||||
|
|
||||||
|
@-webkit-keyframes fa-flip {
|
||||||
|
50% {
|
||||||
|
-webkit-transform: rotate3d(var(--fa-flip-x, 0), var(--fa-flip-y, 1), var(--fa-flip-z, 0), var(--fa-flip-angle, -180deg));
|
||||||
|
transform: rotate3d(var(--fa-flip-x, 0), var(--fa-flip-y, 1), var(--fa-flip-z, 0), var(--fa-flip-angle, -180deg)); } }
|
||||||
|
|
||||||
|
@keyframes fa-flip {
|
||||||
|
50% {
|
||||||
|
-webkit-transform: rotate3d(var(--fa-flip-x, 0), var(--fa-flip-y, 1), var(--fa-flip-z, 0), var(--fa-flip-angle, -180deg));
|
||||||
|
transform: rotate3d(var(--fa-flip-x, 0), var(--fa-flip-y, 1), var(--fa-flip-z, 0), var(--fa-flip-angle, -180deg)); } }
|
||||||
|
|
||||||
|
@-webkit-keyframes fa-shake {
|
||||||
|
0% {
|
||||||
|
-webkit-transform: rotate(-15deg);
|
||||||
|
transform: rotate(-15deg); }
|
||||||
|
4% {
|
||||||
|
-webkit-transform: rotate(15deg);
|
||||||
|
transform: rotate(15deg); }
|
||||||
|
8%, 24% {
|
||||||
|
-webkit-transform: rotate(-18deg);
|
||||||
|
transform: rotate(-18deg); }
|
||||||
|
12%, 28% {
|
||||||
|
-webkit-transform: rotate(18deg);
|
||||||
|
transform: rotate(18deg); }
|
||||||
|
16% {
|
||||||
|
-webkit-transform: rotate(-22deg);
|
||||||
|
transform: rotate(-22deg); }
|
||||||
|
20% {
|
||||||
|
-webkit-transform: rotate(22deg);
|
||||||
|
transform: rotate(22deg); }
|
||||||
|
32% {
|
||||||
|
-webkit-transform: rotate(-12deg);
|
||||||
|
transform: rotate(-12deg); }
|
||||||
|
36% {
|
||||||
|
-webkit-transform: rotate(12deg);
|
||||||
|
transform: rotate(12deg); }
|
||||||
|
40%, 100% {
|
||||||
|
-webkit-transform: rotate(0deg);
|
||||||
|
transform: rotate(0deg); } }
|
||||||
|
|
||||||
|
@keyframes fa-shake {
|
||||||
|
0% {
|
||||||
|
-webkit-transform: rotate(-15deg);
|
||||||
|
transform: rotate(-15deg); }
|
||||||
|
4% {
|
||||||
|
-webkit-transform: rotate(15deg);
|
||||||
|
transform: rotate(15deg); }
|
||||||
|
8%, 24% {
|
||||||
|
-webkit-transform: rotate(-18deg);
|
||||||
|
transform: rotate(-18deg); }
|
||||||
|
12%, 28% {
|
||||||
|
-webkit-transform: rotate(18deg);
|
||||||
|
transform: rotate(18deg); }
|
||||||
|
16% {
|
||||||
|
-webkit-transform: rotate(-22deg);
|
||||||
|
transform: rotate(-22deg); }
|
||||||
|
20% {
|
||||||
|
-webkit-transform: rotate(22deg);
|
||||||
|
transform: rotate(22deg); }
|
||||||
|
32% {
|
||||||
|
-webkit-transform: rotate(-12deg);
|
||||||
|
transform: rotate(-12deg); }
|
||||||
|
36% {
|
||||||
|
-webkit-transform: rotate(12deg);
|
||||||
|
transform: rotate(12deg); }
|
||||||
|
40%, 100% {
|
||||||
|
-webkit-transform: rotate(0deg);
|
||||||
|
transform: rotate(0deg); } }
|
||||||
|
|
||||||
|
@-webkit-keyframes fa-spin {
|
||||||
|
0% {
|
||||||
|
-webkit-transform: rotate(0deg);
|
||||||
|
transform: rotate(0deg); }
|
||||||
|
100% {
|
||||||
|
-webkit-transform: rotate(360deg);
|
||||||
|
transform: rotate(360deg); } }
|
||||||
|
|
||||||
|
@keyframes fa-spin {
|
||||||
|
0% {
|
||||||
|
-webkit-transform: rotate(0deg);
|
||||||
|
transform: rotate(0deg); }
|
||||||
|
100% {
|
||||||
|
-webkit-transform: rotate(360deg);
|
||||||
|
transform: rotate(360deg); } }
|
||||||
|
|
||||||
|
.fa-rotate-90 {
|
||||||
|
-webkit-transform: rotate(90deg);
|
||||||
|
transform: rotate(90deg); }
|
||||||
|
|
||||||
|
.fa-rotate-180 {
|
||||||
|
-webkit-transform: rotate(180deg);
|
||||||
|
transform: rotate(180deg); }
|
||||||
|
|
||||||
|
.fa-rotate-270 {
|
||||||
|
-webkit-transform: rotate(270deg);
|
||||||
|
transform: rotate(270deg); }
|
||||||
|
|
||||||
|
.fa-flip-horizontal {
|
||||||
|
-webkit-transform: scale(-1, 1);
|
||||||
|
transform: scale(-1, 1); }
|
||||||
|
|
||||||
|
.fa-flip-vertical {
|
||||||
|
-webkit-transform: scale(1, -1);
|
||||||
|
transform: scale(1, -1); }
|
||||||
|
|
||||||
|
.fa-flip-both,
|
||||||
|
.fa-flip-horizontal.fa-flip-vertical {
|
||||||
|
-webkit-transform: scale(-1, -1);
|
||||||
|
transform: scale(-1, -1); }
|
||||||
|
|
||||||
|
.fa-rotate-by {
|
||||||
|
-webkit-transform: rotate(var(--fa-rotate-angle, none));
|
||||||
|
transform: rotate(var(--fa-rotate-angle, none)); }
|
||||||
|
|
||||||
|
.fa-stack {
|
||||||
|
display: inline-block;
|
||||||
|
vertical-align: middle;
|
||||||
|
height: 2em;
|
||||||
|
position: relative;
|
||||||
|
width: 2.5em; }
|
||||||
|
|
||||||
|
.fa-stack-1x,
|
||||||
|
.fa-stack-2x {
|
||||||
|
bottom: 0;
|
||||||
|
left: 0;
|
||||||
|
margin: auto;
|
||||||
|
position: absolute;
|
||||||
|
right: 0;
|
||||||
|
top: 0;
|
||||||
|
z-index: var(--fa-stack-z-index, auto); }
|
||||||
|
|
||||||
|
.svg-inline--fa.fa-stack-1x {
|
||||||
|
height: 1em;
|
||||||
|
width: 1.25em; }
|
||||||
|
|
||||||
|
.svg-inline--fa.fa-stack-2x {
|
||||||
|
height: 2em;
|
||||||
|
width: 2.5em; }
|
||||||
|
|
||||||
|
.fa-inverse {
|
||||||
|
color: var(--fa-inverse, #fff); }
|
||||||
|
|
||||||
|
.sr-only,
|
||||||
|
.fa-sr-only {
|
||||||
|
position: absolute;
|
||||||
|
width: 1px;
|
||||||
|
height: 1px;
|
||||||
|
padding: 0;
|
||||||
|
margin: -1px;
|
||||||
|
overflow: hidden;
|
||||||
|
clip: rect(0, 0, 0, 0);
|
||||||
|
white-space: nowrap;
|
||||||
|
border-width: 0; }
|
||||||
|
|
||||||
|
.sr-only-focusable:not(:focus),
|
||||||
|
.fa-sr-only-focusable:not(:focus) {
|
||||||
|
position: absolute;
|
||||||
|
width: 1px;
|
||||||
|
height: 1px;
|
||||||
|
padding: 0;
|
||||||
|
margin: -1px;
|
||||||
|
overflow: hidden;
|
||||||
|
clip: rect(0, 0, 0, 0);
|
||||||
|
white-space: nowrap;
|
||||||
|
border-width: 0; }
|
||||||
|
|
||||||
|
.svg-inline--fa .fa-primary {
|
||||||
|
fill: var(--fa-primary-color, currentColor);
|
||||||
|
opacity: var(--fa-primary-opacity, 1); }
|
||||||
|
|
||||||
|
.svg-inline--fa .fa-secondary {
|
||||||
|
fill: var(--fa-secondary-color, currentColor);
|
||||||
|
opacity: var(--fa-secondary-opacity, 0.4); }
|
||||||
|
|
||||||
|
.svg-inline--fa.fa-swap-opacity .fa-primary {
|
||||||
|
opacity: var(--fa-secondary-opacity, 0.4); }
|
||||||
|
|
||||||
|
.svg-inline--fa.fa-swap-opacity .fa-secondary {
|
||||||
|
opacity: var(--fa-primary-opacity, 1); }
|
||||||
|
|
||||||
|
.svg-inline--fa mask .fa-primary,
|
||||||
|
.svg-inline--fa mask .fa-secondary {
|
||||||
|
fill: black; }
|
||||||
|
|
||||||
|
.fad.fa-inverse,
|
||||||
|
.fa-duotone.fa-inverse {
|
||||||
|
color: var(--fa-inverse, #fff); }
|
||||||
+6
File diff suppressed because one or more lines are too long
@@ -0,0 +1,19 @@
|
|||||||
|
/*!
|
||||||
|
* Font Awesome Pro 6.2.1 by @fontawesome - https://fontawesome.com
|
||||||
|
* License - https://fontawesome.com/license (Commercial License)
|
||||||
|
* Copyright 2022 Fonticons, Inc.
|
||||||
|
*/
|
||||||
|
:root, :host {
|
||||||
|
--fa-style-family-classic: 'Font Awesome 6 Pro';
|
||||||
|
--fa-font-thin: normal 100 1em/1 'Font Awesome 6 Pro'; }
|
||||||
|
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Font Awesome 6 Pro';
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: 100;
|
||||||
|
font-display: block;
|
||||||
|
src: url("../webfonts/fa-thin-100.woff2") format("woff2"), url("../webfonts/fa-thin-100.ttf") format("truetype"); }
|
||||||
|
|
||||||
|
.fat,
|
||||||
|
.fa-thin {
|
||||||
|
font-weight: 100; }
|
||||||
Vendored
+6
@@ -0,0 +1,6 @@
|
|||||||
|
/*!
|
||||||
|
* Font Awesome Pro 6.2.1 by @fontawesome - https://fontawesome.com
|
||||||
|
* License - https://fontawesome.com/license (Commercial License)
|
||||||
|
* Copyright 2022 Fonticons, Inc.
|
||||||
|
*/
|
||||||
|
:host,:root{--fa-style-family-classic:"Font Awesome 6 Pro";--fa-font-thin:normal 100 1em/1 "Font Awesome 6 Pro"}@font-face{font-family:"Font Awesome 6 Pro";font-style:normal;font-weight:100;font-display:block;src:url(../webfonts/fa-thin-100.woff2) format("woff2"),url(../webfonts/fa-thin-100.ttf) format("truetype")}.fa-thin,.fat{font-weight:100}
|
||||||
@@ -0,0 +1,26 @@
|
|||||||
|
/*!
|
||||||
|
* Font Awesome Pro 6.2.1 by @fontawesome - https://fontawesome.com
|
||||||
|
* License - https://fontawesome.com/license (Commercial License)
|
||||||
|
* Copyright 2022 Fonticons, Inc.
|
||||||
|
*/
|
||||||
|
@font-face {
|
||||||
|
font-family: 'FontAwesome';
|
||||||
|
font-display: block;
|
||||||
|
src: url("../webfonts/fa-solid-900.woff2") format("woff2"), url("../webfonts/fa-solid-900.ttf") format("truetype"); }
|
||||||
|
|
||||||
|
@font-face {
|
||||||
|
font-family: 'FontAwesome';
|
||||||
|
font-display: block;
|
||||||
|
src: url("../webfonts/fa-brands-400.woff2") format("woff2"), url("../webfonts/fa-brands-400.ttf") format("truetype"); }
|
||||||
|
|
||||||
|
@font-face {
|
||||||
|
font-family: 'FontAwesome';
|
||||||
|
font-display: block;
|
||||||
|
src: url("../webfonts/fa-regular-400.woff2") format("woff2"), url("../webfonts/fa-regular-400.ttf") format("truetype");
|
||||||
|
unicode-range: U+F003,U+F006,U+F014,U+F016-F017,U+F01A-F01B,U+F01D,U+F022,U+F03E,U+F044,U+F046,U+F05C-F05D,U+F06E,U+F070,U+F087-F088,U+F08A,U+F094,U+F096-F097,U+F09D,U+F0A0,U+F0A2,U+F0A4-F0A7,U+F0C5,U+F0C7,U+F0E5-F0E6,U+F0EB,U+F0F6-F0F8,U+F10C,U+F114-F115,U+F118-F11A,U+F11C-F11D,U+F133,U+F147,U+F14E,U+F150-F152,U+F185-F186,U+F18E,U+F190-F192,U+F196,U+F1C1-F1C9,U+F1D9,U+F1DB,U+F1E3,U+F1EA,U+F1F7,U+F1F9,U+F20A,U+F247-F248,U+F24A,U+F24D,U+F255-F25B,U+F25D,U+F271-F274,U+F278,U+F27B,U+F28C,U+F28E,U+F29C,U+F2B5,U+F2B7,U+F2BA,U+F2BC,U+F2BE,U+F2C0-F2C1,U+F2C3,U+F2D0,U+F2D2,U+F2D4,U+F2DC; }
|
||||||
|
|
||||||
|
@font-face {
|
||||||
|
font-family: 'FontAwesome';
|
||||||
|
font-display: block;
|
||||||
|
src: url("../webfonts/fa-v4compatibility.woff2") format("woff2"), url("../webfonts/fa-v4compatibility.ttf") format("truetype");
|
||||||
|
unicode-range: U+F041,U+F047,U+F065-F066,U+F07D-F07E,U+F080,U+F08B,U+F08E,U+F090,U+F09A,U+F0AC,U+F0AE,U+F0B2,U+F0D0,U+F0D6,U+F0E4,U+F0EC,U+F10A-F10B,U+F123,U+F13E,U+F148-F149,U+F14C,U+F156,U+F15E,U+F160-F161,U+F163,U+F175-F178,U+F195,U+F1F8,U+F219,U+F27A; }
|
||||||
+6
@@ -0,0 +1,6 @@
|
|||||||
|
/*!
|
||||||
|
* Font Awesome Pro 6.2.1 by @fontawesome - https://fontawesome.com
|
||||||
|
* License - https://fontawesome.com/license (Commercial License)
|
||||||
|
* Copyright 2022 Fonticons, Inc.
|
||||||
|
*/
|
||||||
|
@font-face{font-family:"FontAwesome";font-display:block;src:url(../webfonts/fa-solid-900.woff2) format("woff2"),url(../webfonts/fa-solid-900.ttf) format("truetype")}@font-face{font-family:"FontAwesome";font-display:block;src:url(../webfonts/fa-brands-400.woff2) format("woff2"),url(../webfonts/fa-brands-400.ttf) format("truetype")}@font-face{font-family:"FontAwesome";font-display:block;src:url(../webfonts/fa-regular-400.woff2) format("woff2"),url(../webfonts/fa-regular-400.ttf) format("truetype");unicode-range:u+f003,u+f006,u+f014,u+f016-f017,u+f01a-f01b,u+f01d,u+f022,u+f03e,u+f044,u+f046,u+f05c-f05d,u+f06e,u+f070,u+f087-f088,u+f08a,u+f094,u+f096-f097,u+f09d,u+f0a0,u+f0a2,u+f0a4-f0a7,u+f0c5,u+f0c7,u+f0e5-f0e6,u+f0eb,u+f0f6-f0f8,u+f10c,u+f114-f115,u+f118-f11a,u+f11c-f11d,u+f133,u+f147,u+f14e,u+f150-f152,u+f185-f186,u+f18e,u+f190-f192,u+f196,u+f1c1-f1c9,u+f1d9,u+f1db,u+f1e3,u+f1ea,u+f1f7,u+f1f9,u+f20a,u+f247-f248,u+f24a,u+f24d,u+f255-f25b,u+f25d,u+f271-f274,u+f278,u+f27b,u+f28c,u+f28e,u+f29c,u+f2b5,u+f2b7,u+f2ba,u+f2bc,u+f2be,u+f2c0-f2c1,u+f2c3,u+f2d0,u+f2d2,u+f2d4,u+f2dc}@font-face{font-family:"FontAwesome";font-display:block;src:url(../webfonts/fa-v4compatibility.woff2) format("woff2"),url(../webfonts/fa-v4compatibility.ttf) format("truetype");unicode-range:u+f041,u+f047,u+f065-f066,u+f07d-f07e,u+f080,u+f08b,u+f08e,u+f090,u+f09a,u+f0ac,u+f0ae,u+f0b2,u+f0d0,u+f0d6,u+f0e4,u+f0ec,u+f10a-f10b,u+f123,u+f13e,u+f148-f149,u+f14c,u+f156,u+f15e,u+f160-f161,u+f163,u+f175-f178,u+f195,u+f1f8,u+f219,u+f27a}
|
||||||
File diff suppressed because it is too large
Load Diff
+6
File diff suppressed because one or more lines are too long
@@ -0,0 +1,34 @@
|
|||||||
|
/*!
|
||||||
|
* Font Awesome Pro 6.2.1 by @fontawesome - https://fontawesome.com
|
||||||
|
* License - https://fontawesome.com/license (Commercial License)
|
||||||
|
* Copyright 2022 Fonticons, Inc.
|
||||||
|
*/
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Font Awesome 5 Brands';
|
||||||
|
font-display: block;
|
||||||
|
font-weight: 400;
|
||||||
|
src: url("../webfonts/fa-brands-400.woff2") format("woff2"), url("../webfonts/fa-brands-400.ttf") format("truetype"); }
|
||||||
|
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Font Awesome 5 Pro';
|
||||||
|
font-display: block;
|
||||||
|
font-weight: 900;
|
||||||
|
src: url("../webfonts/fa-solid-900.woff2") format("woff2"), url("../webfonts/fa-solid-900.ttf") format("truetype"); }
|
||||||
|
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Font Awesome 5 Pro';
|
||||||
|
font-display: block;
|
||||||
|
font-weight: 400;
|
||||||
|
src: url("../webfonts/fa-regular-400.woff2") format("woff2"), url("../webfonts/fa-regular-400.ttf") format("truetype"); }
|
||||||
|
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Font Awesome 5 Pro';
|
||||||
|
font-display: block;
|
||||||
|
font-weight: 300;
|
||||||
|
src: url("../webfonts/fa-light-300.woff2") format("woff2"), url("../webfonts/fa-light-300.ttf") format("truetype"); }
|
||||||
|
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Font Awesome 5 Duotone';
|
||||||
|
font-display: block;
|
||||||
|
font-weight: 900;
|
||||||
|
src: url("../webfonts/fa-duotone-900.woff2") format("woff2"), url("../webfonts/fa-duotone-900.ttf") format("truetype"); }
|
||||||
+6
@@ -0,0 +1,6 @@
|
|||||||
|
/*!
|
||||||
|
* Font Awesome Pro 6.2.1 by @fontawesome - https://fontawesome.com
|
||||||
|
* License - https://fontawesome.com/license (Commercial License)
|
||||||
|
* Copyright 2022 Fonticons, Inc.
|
||||||
|
*/
|
||||||
|
@font-face{font-family:"Font Awesome 5 Brands";font-display:block;font-weight:400;src:url(../webfonts/fa-brands-400.woff2) format("woff2"),url(../webfonts/fa-brands-400.ttf) format("truetype")}@font-face{font-family:"Font Awesome 5 Pro";font-display:block;font-weight:900;src:url(../webfonts/fa-solid-900.woff2) format("woff2"),url(../webfonts/fa-solid-900.ttf) format("truetype")}@font-face{font-family:"Font Awesome 5 Pro";font-display:block;font-weight:400;src:url(../webfonts/fa-regular-400.woff2) format("woff2"),url(../webfonts/fa-regular-400.ttf) format("truetype")}@font-face{font-family:"Font Awesome 5 Pro";font-display:block;font-weight:300;src:url(../webfonts/fa-light-300.woff2) format("woff2"),url(../webfonts/fa-light-300.ttf) format("truetype")}@font-face{font-family:"Font Awesome 5 Duotone";font-display:block;font-weight:900;src:url(../webfonts/fa-duotone-900.woff2) format("woff2"),url(../webfonts/fa-duotone-900.ttf) format("truetype")}
|
||||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
+580
-24
File diff suppressed because one or more lines are too long
|
Before Width: | Height: | Size: 34 KiB After Width: | Height: | Size: 143 KiB |
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -23,6 +23,46 @@
|
|||||||
content: "b";
|
content: "b";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.fm-trijntje:before {
|
||||||
|
content: "c";
|
||||||
|
}
|
||||||
|
|
||||||
|
.fm-satellite:before {
|
||||||
|
content: "d";
|
||||||
|
}
|
||||||
|
|
||||||
|
.fm-sensoterra:before {
|
||||||
|
content: "e";
|
||||||
|
}
|
||||||
|
|
||||||
|
.fm-blight:before {
|
||||||
|
content: "f";
|
||||||
|
}
|
||||||
|
|
||||||
|
.fm-agrodatacube:before {
|
||||||
|
content: "g";
|
||||||
|
}
|
||||||
|
|
||||||
|
.fm-app-menu:before {
|
||||||
|
content: "h";
|
||||||
|
}
|
||||||
|
|
||||||
|
.fm-blight-holes:before {
|
||||||
|
content: "i";
|
||||||
|
}
|
||||||
|
|
||||||
|
.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";
|
||||||
src: url("./FMIconFont.woff") format("woff"), /* Modern Browsers */
|
src: url("./FMIconFont.woff") format("woff"), /* Modern Browsers */
|
||||||
|
|||||||
Generated
+20022
-13595
File diff suppressed because it is too large
Load Diff
+85
-58
@@ -1,72 +1,99 @@
|
|||||||
{
|
{
|
||||||
"name": "farmmaps-lib-app",
|
"name": "farmmaps-lib-app",
|
||||||
"version": "0.0.1",
|
"version": "4.22.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": "~10.1.3",
|
"@angular-eslint/eslint-plugin": "20.7.0",
|
||||||
"@angular/common": "~10.1.3",
|
"@angular/animations": "^21.1.0",
|
||||||
"@angular/compiler": "~10.1.3",
|
"@angular/common": "^21.1.0",
|
||||||
"@angular/core": "~10.1.3",
|
"@angular/compiler": "^21.1.0",
|
||||||
"@angular/forms": "~10.1.3",
|
"@angular/core": "^21.1.0",
|
||||||
"@angular/platform-browser": "~10.1.3",
|
"@angular/forms": "^21.1.0",
|
||||||
"@angular/platform-browser-dynamic": "~10.1.3",
|
"@angular/platform-browser": "^21.1.0",
|
||||||
"@angular/router": "~10.1.3",
|
"@angular/platform-browser-dynamic": "^21.1.0",
|
||||||
"@farmmaps/common": ">=0.0.1-prerelease.434 <0.0.1",
|
"@angular/router": "^21.1.0",
|
||||||
"@farmmaps/common-map": ">=0.0.1-prerelease.434 <0.0.1",
|
"@farmmaps/common": "file:dist/common",
|
||||||
"@farmmaps/common-map3d": ">=0.0.1-prerelease.434 <0.0.1",
|
"@farmmaps/common-map": "file:dist/common-map",
|
||||||
"@microsoft/signalr": "^3.1.3",
|
"@farmmaps/common-map3d": "file:dist/common-map3d",
|
||||||
"@ng-bootstrap/ng-bootstrap": "^7.0",
|
"@farmmaps/ng-openlayers": "file:dist/ng-openlayers",
|
||||||
"@ngrx/effects": "^10.0",
|
"@microsoft/signalr": "^10.0.0",
|
||||||
"@ngrx/router-store": "^10.0",
|
"@ng-bootstrap/ng-bootstrap": "^20.0.0",
|
||||||
"@ngrx/store": "^10.0",
|
"@ngrx/effects": "^21.0.1",
|
||||||
"angular-oauth2-oidc": "^10.0.3",
|
"@ngrx/router-store": "^21.0.1",
|
||||||
"bootstrap": "^4.4.1",
|
"@ngrx/store": "^21.0.1",
|
||||||
"cesium": "^1.73.0",
|
"@popperjs/core": "2.11.8",
|
||||||
"core-js": "^2.6.11",
|
"assert": "^2.1.0",
|
||||||
"font-awesome": "^4.7.0",
|
"bootstrap": "^5.3.8",
|
||||||
"ngrx-store-localstorage": "^10.0",
|
"browserify-zlib": "^0.2.0",
|
||||||
"ngx-bootstrap": "^5.6.1",
|
"buffer": "^6.0.3",
|
||||||
"ngx-openlayers": "1.0.0-next.16",
|
"cesium": "^1.97.0",
|
||||||
"ngx-uploadx": "^3.5.1",
|
"core-js": "^3.48.0",
|
||||||
"ol": "6.1.1",
|
"https-browserify": "^1.0.0",
|
||||||
"ol-cesium": "^2.11.3",
|
"moment": "^2.29.4",
|
||||||
|
"ngrx-store-localstorage": "^20.1.0",
|
||||||
|
"ngx-avatars": "1.10.1",
|
||||||
|
"ngx-clipboard": "^16.0.0",
|
||||||
|
"ngx-image-cropper": "^7.0.0",
|
||||||
|
"ngx-uploadx": "^7.0.1",
|
||||||
|
"ol": "^8.2.0",
|
||||||
|
"olcs": "^2.13.1",
|
||||||
"resumablejs": "^1.1.0",
|
"resumablejs": "^1.1.0",
|
||||||
"rxjs": "^6.5.4",
|
"rxjs": "^7.8.0",
|
||||||
|
"stream": "^0.0.2",
|
||||||
|
"stream-http": "^3.2.0",
|
||||||
"tassign": "^1.0.0",
|
"tassign": "^1.0.0",
|
||||||
"tslib": "^2.0.0",
|
"tslib": "^2.4.0",
|
||||||
"zone.js": "~0.10.2",
|
"url": "^0.11.0",
|
||||||
"moment": "^2.27.0"
|
"util": "^0.12.4",
|
||||||
|
"zone.js": "~0.15.1"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"optionalDependencies": {
|
||||||
"@angular-devkit/build-angular": "^0.1001.3",
|
"@lmdb/lmdb-linux-x64": "^3.1.0",
|
||||||
"@angular-devkit/build-ng-packagr": "~0.1001.3",
|
"@rollup/rollup-linux-x64-gnu": "^4.21.2"
|
||||||
"@angular/cli": "^10.1.3",
|
},
|
||||||
"@angular/compiler-cli": "~10.1.3",
|
"devDependencies": {
|
||||||
"@angular/language-service": "~10.1.3",
|
"@angular-builders/custom-webpack": "^21.0.3",
|
||||||
"@angular-builders/custom-webpack": "~10.0.1",
|
"@angular-devkit/build-angular": "^21.1.0",
|
||||||
"@types/jasmine": "~2.8.8",
|
"@angular/build": "^21.1.0",
|
||||||
"@types/jasminewd2": "~2.0.3",
|
"@angular/cli": "^21.1.0",
|
||||||
"@types/node": "^12.11.1",
|
"@angular/compiler-cli": "^21.1.0",
|
||||||
"codelyzer": "^5.1.2",
|
"@angular/language-service": "^21.1.0",
|
||||||
"jasmine-core": "~3.5.0",
|
"@angular/localize": "^21.1.0",
|
||||||
"jasmine-spec-reporter": "~5.0.0",
|
"@types/arcgis-rest-api": "^10.4.5",
|
||||||
"karma": "~5.0.0",
|
"@types/node": "^22.5.4",
|
||||||
"karma-chrome-launcher": "~3.1.0",
|
"@typescript-eslint/eslint-plugin": "^8.53.1",
|
||||||
"karma-coverage-istanbul-reporter": "~3.0.2",
|
"@typescript-eslint/parser": "^8.53.1",
|
||||||
"karma-jasmine": "~4.0.0",
|
"@vitest/browser": "^4.0.17",
|
||||||
"karma-jasmine-html-reporter": "^1.5.0",
|
"@vitest/browser-playwright": "^4.0.17",
|
||||||
"ng-packagr": "^10.1.0",
|
"eslint": "^9.39.2",
|
||||||
"protractor": "~7.0.0",
|
"eslint-config-prettier": "^10.1.8",
|
||||||
|
"eslint-plugin-import": "^2.32.0",
|
||||||
|
"jsdom": "^27.4.0",
|
||||||
|
"ng-packagr": "^21.1.0",
|
||||||
"ts-node": "^8.8.1",
|
"ts-node": "^8.8.1",
|
||||||
"tslint": "~6.1.0",
|
"typescript": "~5.9.3",
|
||||||
"typescript": "~4.0.3"
|
"vitest": "^4.0.17"
|
||||||
|
},
|
||||||
|
"overrides": {
|
||||||
|
"ngrx-store-localstorage": {
|
||||||
|
"@angular/common": "$@angular/common",
|
||||||
|
"@angular/core": "$@angular/core"
|
||||||
|
},
|
||||||
|
"ngx-avatars": {
|
||||||
|
"@angular/common": "$@angular/common",
|
||||||
|
"@angular/core": "$@angular/core"
|
||||||
|
},
|
||||||
|
"ngx-uploadx": {
|
||||||
|
"@angular/common": "$@angular/common",
|
||||||
|
"@angular/core": "$@angular/core"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -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,7 +4,7 @@
|
|||||||
"lib": {
|
"lib": {
|
||||||
"entryFile": "src/public-api.ts"
|
"entryFile": "src/public-api.ts"
|
||||||
},
|
},
|
||||||
"whitelistedNonPeerDependencies": [
|
"allowedNonPeerDependencies": [
|
||||||
"."
|
"."
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
Generated
+209
-7
@@ -1,13 +1,215 @@
|
|||||||
{
|
{
|
||||||
"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": "20.3.16",
|
||||||
|
"@ngrx/effects": "20.1.0",
|
||||||
|
"@ngrx/router-store": "20.1.0",
|
||||||
|
"@ngrx/store": "20.1.0",
|
||||||
|
"ngrx-store-localstorage": "20.1.0",
|
||||||
|
"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": {
|
||||||
|
"extraneous": true
|
||||||
|
},
|
||||||
|
"node_modules/@angular/common": {
|
||||||
|
"version": "20.3.16",
|
||||||
|
"resolved": "https://registry.npmjs.org/@angular/common/-/common-20.3.16.tgz",
|
||||||
|
"integrity": "sha512-GRAziNlntwdnJy3F+8zCOvDdy7id0gITjDnM6P9+n2lXvtDuBLGJKU3DWBbvxcCjtD6JK/g/rEX5fbCxbUHkQQ==",
|
||||||
|
"license": "MIT",
|
||||||
|
"peer": true,
|
||||||
|
"dependencies": {
|
||||||
|
"tslib": "^2.3.0"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": "^20.19.0 || ^22.12.0 || >=24.0.0"
|
||||||
|
},
|
||||||
|
"peerDependencies": {
|
||||||
|
"@angular/core": "20.3.16",
|
||||||
|
"rxjs": "^6.5.3 || ^7.4.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/@angular/core": {
|
||||||
|
"version": "20.3.16",
|
||||||
|
"resolved": "https://registry.npmjs.org/@angular/core/-/core-20.3.16.tgz",
|
||||||
|
"integrity": "sha512-KSFPKvOmWWLCJBbEO+CuRUXfecX2FRuO0jNi9c54ptXMOPHlK1lIojUnyXmMNzjdHgRug8ci9qDuftvC2B7MKg==",
|
||||||
|
"license": "MIT",
|
||||||
|
"peer": true,
|
||||||
|
"dependencies": {
|
||||||
|
"tslib": "^2.3.0"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": "^20.19.0 || ^22.12.0 || >=24.0.0"
|
||||||
|
},
|
||||||
|
"peerDependencies": {
|
||||||
|
"@angular/compiler": "20.3.16",
|
||||||
|
"rxjs": "^6.5.3 || ^7.4.0",
|
||||||
|
"zone.js": "~0.15.0"
|
||||||
|
},
|
||||||
|
"peerDependenciesMeta": {
|
||||||
|
"@angular/compiler": {
|
||||||
|
"optional": true
|
||||||
|
},
|
||||||
|
"zone.js": {
|
||||||
|
"optional": true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/@angular/platform-browser": {
|
||||||
|
"version": "20.3.16",
|
||||||
|
"resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-20.3.16.tgz",
|
||||||
|
"integrity": "sha512-YsrLS6vyS77i4pVHg4gdSBW74qvzHjpQRTVQ5Lv/OxIjJdYYYkMmjNalCNgy1ZuyY6CaLIB11ccxhrNnxfKGOQ==",
|
||||||
|
"license": "MIT",
|
||||||
|
"peer": true,
|
||||||
|
"dependencies": {
|
||||||
|
"tslib": "^2.3.0"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": "^20.19.0 || ^22.12.0 || >=24.0.0"
|
||||||
|
},
|
||||||
|
"peerDependencies": {
|
||||||
|
"@angular/animations": "20.3.16",
|
||||||
|
"@angular/common": "20.3.16",
|
||||||
|
"@angular/core": "20.3.16"
|
||||||
|
},
|
||||||
|
"peerDependenciesMeta": {
|
||||||
|
"@angular/animations": {
|
||||||
|
"optional": true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/@angular/router": {
|
||||||
|
"version": "20.3.16",
|
||||||
|
"resolved": "https://registry.npmjs.org/@angular/router/-/router-20.3.16.tgz",
|
||||||
|
"integrity": "sha512-e1LiQFZaajKqc00cY5FboIrWJZSMnZ64GDp5R0UejritYrqorQQQNOqP1W85BMuY2owibMmxVfX+dJg/Mc8PuQ==",
|
||||||
|
"license": "MIT",
|
||||||
|
"peer": true,
|
||||||
|
"dependencies": {
|
||||||
|
"tslib": "^2.3.0"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": "^20.19.0 || ^22.12.0 || >=24.0.0"
|
||||||
|
},
|
||||||
|
"peerDependencies": {
|
||||||
|
"@angular/common": "20.3.16",
|
||||||
|
"@angular/core": "20.3.16",
|
||||||
|
"@angular/platform-browser": "20.3.16",
|
||||||
|
"rxjs": "^6.5.3 || ^7.4.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/@ngrx/effects": {
|
||||||
|
"version": "20.1.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/@ngrx/effects/-/effects-20.1.0.tgz",
|
||||||
|
"integrity": "sha512-wkIu0QnTarBd1zUswk643H5SILO9Be1OeswMe7g4tXlkNLFRPkyu0BUzXT80PsUPP5p0VrdFz3akrn3HHjjTjA==",
|
||||||
|
"license": "MIT",
|
||||||
|
"peer": true,
|
||||||
|
"dependencies": {
|
||||||
|
"tslib": "^2.0.0"
|
||||||
|
},
|
||||||
|
"peerDependencies": {
|
||||||
|
"@angular/core": "^20.0.0",
|
||||||
|
"@ngrx/store": "20.1.0",
|
||||||
|
"rxjs": "^6.5.3 || ^7.5.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/@ngrx/router-store": {
|
||||||
|
"version": "20.1.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/@ngrx/router-store/-/router-store-20.1.0.tgz",
|
||||||
|
"integrity": "sha512-XlpQsgmEc1E9Ogiv6QbJ8g8JzjrJOlr7JX9FngHIDLyXQFCMn5wcXsqhjiBjG9JgJLwlzV+v14i7EM/nqwQCGA==",
|
||||||
|
"license": "MIT",
|
||||||
|
"peer": true,
|
||||||
|
"dependencies": {
|
||||||
|
"tslib": "^2.0.0"
|
||||||
|
},
|
||||||
|
"peerDependencies": {
|
||||||
|
"@angular/common": "^20.0.0",
|
||||||
|
"@angular/core": "^20.0.0",
|
||||||
|
"@angular/router": "^20.0.0",
|
||||||
|
"@ngrx/store": "20.1.0",
|
||||||
|
"rxjs": "^6.5.3 || ^7.5.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/@ngrx/store": {
|
||||||
|
"version": "20.1.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/@ngrx/store/-/store-20.1.0.tgz",
|
||||||
|
"integrity": "sha512-o8j3CGAGedm+BIb+QDhNXrVaU//n9uF0wH0HZWtXHmW1mjRBaQiUA+ZPMUkDwAeN8KuOcoIEC+2QUXxXGVI7ow==",
|
||||||
|
"license": "MIT",
|
||||||
|
"peer": true,
|
||||||
|
"dependencies": {
|
||||||
|
"tslib": "^2.0.0"
|
||||||
|
},
|
||||||
|
"peerDependencies": {
|
||||||
|
"@angular/core": "^20.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=="
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@farmmaps/common-map",
|
"name": "@farmmaps/common-map",
|
||||||
"version": "0.0.1",
|
"version": "4.22.0",
|
||||||
"publishConfig": {
|
"publishConfig": {
|
||||||
"registry": "https://repository.akkerweb.nl/repository/npm-hosted/"
|
"registry": "https://repository.akkerweb.nl/repository/npm-hosted/"
|
||||||
},
|
},
|
||||||
@@ -8,14 +8,16 @@
|
|||||||
"tslib": "^2.0.0"
|
"tslib": "^2.0.0"
|
||||||
},
|
},
|
||||||
"peerDependencies": {
|
"peerDependencies": {
|
||||||
"@angular/core": "^10.1.3",
|
"@angular/core": "^21.1.0",
|
||||||
"ngrx-store-localstorage": "^10.0",
|
"ngrx-store-localstorage": "^20.1.0",
|
||||||
"@ngrx/effects": "^10.0",
|
"@ngrx/effects": "^21.0.1",
|
||||||
"@ngrx/router-store": "^10.0",
|
"@ngrx/router-store": "^21.0.1",
|
||||||
"@ngrx/store": "^10.0",
|
"@ngrx/store": "^21.0.1",
|
||||||
"tassign": "^1.0.0",
|
"tassign": "^1.0.0"
|
||||||
"@farmmaps/common": ">=0.0.1-prerelease.420 <0.0.1",
|
},
|
||||||
"ngx-openlayers": "1.0.0-next.16",
|
"overrides": {
|
||||||
"ol": "6.1.1"
|
"ngrx-store-localstorage": {
|
||||||
|
"@angular/core": "$@angular/core"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,20 +2,27 @@ import { Action } from '@ngrx/store';
|
|||||||
|
|
||||||
import { IMapState } from '../models/map.state';
|
import { IMapState } from '../models/map.state';
|
||||||
import { IItemLayer } from '../models/item.layer';
|
import { IItemLayer } from '../models/item.layer';
|
||||||
|
import { ILayervalue } from '../models/layer.value';
|
||||||
import { IQueryState } from '@farmmaps/common';
|
import { IQueryState } from '@farmmaps/common';
|
||||||
import { IItem } from '@farmmaps/common';
|
import { IItem } from '@farmmaps/common';
|
||||||
import { Feature,Style } from 'ol';
|
import { Feature } from 'ol';
|
||||||
|
import { Style } from 'ol/style';
|
||||||
|
import { Geometry } from 'ol/geom';
|
||||||
|
import { IPeriodState } from '../models/period.state';
|
||||||
|
|
||||||
export const SETSTATE = '[Map] SetState';
|
export const SETSTATE = '[Map] SetState';
|
||||||
export const SETMAPSTATE = '[Map] MapState';
|
export const SETMAPSTATE = '[Map] MapState';
|
||||||
export const SETVIEWEXTENT = '[Map] SetViewExtent';
|
export const SETVIEWEXTENT = '[Map] SetViewExtent';
|
||||||
export const INIT = '[Map] Init';
|
export const INIT = '[Map] Init';
|
||||||
export const SETPARENT = '[Map] SetParent';
|
export const SETPARENT = '[Map] SetParent';
|
||||||
|
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';
|
||||||
|
export const SETSELECTEDITEMLAYER = '[Map] SetSelectedItemLayer';
|
||||||
export const SELECTTEMPORALITEMSSUCCESS = '[Map] SelectTemporalItemsSuccess';
|
export const SELECTTEMPORALITEMSSUCCESS = '[Map] SelectTemporalItemsSuccess';
|
||||||
export const NEXTTEMPORAL = '[Map] NextTemporal';
|
export const NEXTTEMPORAL = '[Map] NextTemporal';
|
||||||
export const PREVIOUSTEMPORAL = '[Map] PreviousTemporal';
|
export const PREVIOUSTEMPORAL = '[Map] PreviousTemporal';
|
||||||
@@ -32,6 +39,7 @@ export const SETVISIBILITY = '[Map] SetVisibility';
|
|||||||
export const SETOPACITY = '[Map] SetOpacity';
|
export const SETOPACITY = '[Map] SetOpacity';
|
||||||
export const SETLAYERINDEX = '[Map] SetLayerIndex';
|
export const SETLAYERINDEX = '[Map] SetLayerIndex';
|
||||||
export const REMOVELAYER = '[Map] RemoveLayer';
|
export const REMOVELAYER = '[Map] RemoveLayer';
|
||||||
|
export const CLEARLAYERS = '[Map] ClearLayers';
|
||||||
export const LOADBASELAYERS = '[Map] LoadLayers';
|
export const LOADBASELAYERS = '[Map] LoadLayers';
|
||||||
export const LOADBASELAYERSSUCCESS = '[Map] LoadLayersSuccess';
|
export const LOADBASELAYERSSUCCESS = '[Map] LoadLayersSuccess';
|
||||||
export const SELECTBASELAYER = '[Map] SelectBaseLayers';
|
export const SELECTBASELAYER = '[Map] SelectBaseLayers';
|
||||||
@@ -42,6 +50,17 @@ export const SETSTYLE = '[Map] SetStyle';
|
|||||||
export const SHOWLAYERSWITCHER = '[Map] ShowLayerSwitcher';
|
export const SHOWLAYERSWITCHER = '[Map] ShowLayerSwitcher';
|
||||||
export const CLEAR = '[Map] Clear';
|
export const CLEAR = '[Map] Clear';
|
||||||
export const SETREPLACEURL = '[Map] SetReplaceUrl';
|
export const SETREPLACEURL = '[Map] SetReplaceUrl';
|
||||||
|
export const SETFEATURES = '[Map] SetFeatures'
|
||||||
|
export const SETLAYERVALUESLOCATION = '[Map] SetLayerValuesLocation'
|
||||||
|
export const TOGGLELAYERVALUESENABLED = '[Map] ToggleLayerValuesEnabled'
|
||||||
|
export const GETLAYERVALUE = '[Map] GetLayerValue'
|
||||||
|
export const GETLAYERVALUESUCCESS = '[Map] GetLayerValueSuccess'
|
||||||
|
export const TOGGLESHOWDATALAYERSLIDE = '[Map] ToggleShowDataLayerSlide'
|
||||||
|
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;
|
||||||
@@ -78,6 +97,12 @@ export class SetParent implements Action {
|
|||||||
constructor(public parentCode:string) { }
|
constructor(public parentCode:string) { }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export class SetPeriod implements Action {
|
||||||
|
readonly type = SETPERIOD;
|
||||||
|
|
||||||
|
constructor(public period:IPeriodState) { }
|
||||||
|
}
|
||||||
|
|
||||||
export class StartSearch implements Action {
|
export class StartSearch implements Action {
|
||||||
readonly type = STARTSEARCH;
|
readonly type = STARTSEARCH;
|
||||||
|
|
||||||
@@ -87,13 +112,19 @@ export class StartSearch implements Action {
|
|||||||
export class StartSearchSuccess implements Action {
|
export class StartSearchSuccess implements Action {
|
||||||
readonly type = STARTSEARCHSUCCESS;
|
readonly type = STARTSEARCHSUCCESS;
|
||||||
|
|
||||||
constructor(public features: Array<Feature>, 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;
|
||||||
|
|
||||||
constructor(public feature:Feature) { }
|
constructor(public feature:Feature<Geometry>) { }
|
||||||
}
|
}
|
||||||
|
|
||||||
export class SelectItem implements Action {
|
export class SelectItem implements Action {
|
||||||
@@ -135,13 +166,13 @@ export class SelectTemporal implements Action {
|
|||||||
export class AddFeatureSuccess implements Action {
|
export class AddFeatureSuccess implements Action {
|
||||||
readonly type = ADDFEATURESUCCESS;
|
readonly type = ADDFEATURESUCCESS;
|
||||||
|
|
||||||
constructor(public feature: Feature) { }
|
constructor(public feature: Feature<Geometry>) { }
|
||||||
}
|
}
|
||||||
|
|
||||||
export class UpdateFeatureSuccess implements Action {
|
export class UpdateFeatureSuccess implements Action {
|
||||||
readonly type = UPDATEFEATURESUCCESS;
|
readonly type = UPDATEFEATURESUCCESS;
|
||||||
|
|
||||||
constructor(public feature: Feature) { }
|
constructor(public feature: Feature<Geometry>) { }
|
||||||
}
|
}
|
||||||
|
|
||||||
export class ExpandSearch implements Action {
|
export class ExpandSearch implements Action {
|
||||||
@@ -180,6 +211,12 @@ export class AddLayer implements Action {
|
|||||||
constructor(public item:IItem,public layerIndex=-1) { }
|
constructor(public item:IItem,public layerIndex=-1) { }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export class SetSelectedItemLayer implements Action {
|
||||||
|
readonly type = SETSELECTEDITEMLAYER;
|
||||||
|
|
||||||
|
constructor(public item:IItem,public layerIndex=-1) { }
|
||||||
|
}
|
||||||
|
|
||||||
export class SetVisibility implements Action {
|
export class SetVisibility implements Action {
|
||||||
readonly type = SETVISIBILITY;
|
readonly type = SETVISIBILITY;
|
||||||
|
|
||||||
@@ -204,6 +241,12 @@ export class RemoveLayer implements Action {
|
|||||||
constructor(public itemLayer: IItemLayer) { }
|
constructor(public itemLayer: IItemLayer) { }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export class ClearLayers implements Action {
|
||||||
|
readonly type = CLEARLAYERS;
|
||||||
|
|
||||||
|
constructor() { }
|
||||||
|
}
|
||||||
|
|
||||||
export class LoadBaseLayers implements Action {
|
export class LoadBaseLayers implements Action {
|
||||||
readonly type = LOADBASELAYERS;
|
readonly type = LOADBASELAYERS;
|
||||||
|
|
||||||
@@ -237,13 +280,13 @@ export class ZoomToExtent implements Action {
|
|||||||
export class DoQuery implements Action {
|
export class DoQuery implements Action {
|
||||||
readonly type = DOQUERY;
|
readonly type = DOQUERY;
|
||||||
|
|
||||||
constructor(public query:IQueryState) { }
|
constructor(public query:IQueryState,public replace:boolean = false) { }
|
||||||
}
|
}
|
||||||
|
|
||||||
export class SetStyle implements Action {
|
export class SetStyle implements Action {
|
||||||
readonly type = SETSTYLE;
|
readonly type = SETSTYLE;
|
||||||
|
|
||||||
constructor(public itemType:string,public style: Style | (Feature)) { }
|
constructor(public itemType:string,public style: Style | ((feature:Feature<Geometry>) => Style )) { }
|
||||||
}
|
}
|
||||||
|
|
||||||
export class ShowLayerSwitcher implements Action {
|
export class ShowLayerSwitcher implements Action {
|
||||||
@@ -256,12 +299,73 @@ export class SetReplaceUrl implements Action {
|
|||||||
constructor(public replaceUrl:boolean) {}
|
constructor(public replaceUrl:boolean) {}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export class SetFeatures implements Action {
|
||||||
|
readonly type = SETFEATURES;
|
||||||
|
|
||||||
|
constructor(public features: Array<Feature<Geometry>>, public zoomToExtent: boolean = true) { }
|
||||||
|
}
|
||||||
|
|
||||||
|
export class SetLayerValuesLocation implements Action {
|
||||||
|
readonly type = SETLAYERVALUESLOCATION;
|
||||||
|
|
||||||
|
constructor(public x:number, public y:number) { }
|
||||||
|
}
|
||||||
|
|
||||||
|
export class ToggleLayerValuesEnabled implements Action {
|
||||||
|
readonly type = TOGGLELAYERVALUESENABLED;
|
||||||
|
|
||||||
|
constructor() { }
|
||||||
|
}
|
||||||
|
|
||||||
|
export class GetLayerValue implements Action {
|
||||||
|
readonly type = GETLAYERVALUE;
|
||||||
|
|
||||||
|
constructor(public itemLayer:IItemLayer,public x:number,public y:number) { }
|
||||||
|
}
|
||||||
|
|
||||||
|
export class GetLayerValueSuccess implements Action {
|
||||||
|
readonly type = GETLAYERVALUESUCCESS;
|
||||||
|
|
||||||
|
constructor(public layervalue:ILayervalue) { }
|
||||||
|
}
|
||||||
|
|
||||||
|
export class ToggleShowDataLayerSlide implements Action {
|
||||||
|
readonly type = TOGGLESHOWDATALAYERSLIDE;
|
||||||
|
constructor() {}
|
||||||
|
}
|
||||||
|
|
||||||
|
export class SetViewState implements Action {
|
||||||
|
readonly type = SETVIEWSTATE;
|
||||||
|
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
|
||||||
@@ -278,6 +382,7 @@ export type Actions = SetMapState
|
|||||||
| SetTimeSpan
|
| SetTimeSpan
|
||||||
| AddLayer
|
| AddLayer
|
||||||
| RemoveLayer
|
| RemoveLayer
|
||||||
|
| ClearLayers
|
||||||
| SetVisibility
|
| SetVisibility
|
||||||
| SetOpacity
|
| SetOpacity
|
||||||
| SetLayerIndex
|
| SetLayerIndex
|
||||||
@@ -291,5 +396,18 @@ export type Actions = SetMapState
|
|||||||
| DoQuery
|
| DoQuery
|
||||||
| SetStyle
|
| SetStyle
|
||||||
| ShowLayerSwitcher
|
| ShowLayerSwitcher
|
||||||
| SetReplaceUrl;
|
| SetReplaceUrl
|
||||||
|
| SetFeatures
|
||||||
|
| SetSelectedItemLayer
|
||||||
|
| SetLayerValuesLocation
|
||||||
|
| ToggleLayerValuesEnabled
|
||||||
|
| GetLayerValueSuccess
|
||||||
|
| GetLayerValue
|
||||||
|
| SetPeriod
|
||||||
|
| ToggleShowDataLayerSlide
|
||||||
|
| SetViewState
|
||||||
|
| ClearFeatures
|
||||||
|
| SetPanelExtraWide
|
||||||
|
| BackupFeatures
|
||||||
|
| RestoreFeatures;
|
||||||
|
|
||||||
|
|||||||
@@ -8,6 +8,10 @@ const routes = [
|
|||||||
path: '',
|
path: '',
|
||||||
component: MapComponent
|
component: MapComponent
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
path: ':xCenter/:yCenter/:zoom/:rotation/:baseLayer',
|
||||||
|
component: MapComponent
|
||||||
|
},
|
||||||
{
|
{
|
||||||
path: ':xCenter/:yCenter/:zoom/:rotation/:baseLayer/:queryState',
|
path: ':xCenter/:yCenter/:zoom/:rotation/:baseLayer/:queryState',
|
||||||
component: MapComponent
|
component: MapComponent
|
||||||
|
|||||||
@@ -1,86 +1,100 @@
|
|||||||
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 { IClickedFeature } from './models/clicked.feature';
|
||||||
import { ISelectedFeatures } from './models/selected.features';
|
import { IItemLayer, ItemLayer, ITemporalItemLayer, TemporalItemLayer } from './models/item.layer';
|
||||||
import { IItemLayer } from './models/item.layer';
|
import { IMapState } from './models/map.state';
|
||||||
import { ItemLayer} from './models/item.layer';
|
|
||||||
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 { 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';
|
|
||||||
|
|
||||||
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);
|
||||||
}
|
}
|
||||||
|
const sp = window.localStorage.getItem(MODULE_NAME+"_searchPeriod");
|
||||||
|
if(sp) {
|
||||||
|
const p = JSON.parse(sp);
|
||||||
|
r2["period"] = { startDate: new Date(Date.parse(p.startDate)),endDate:new Date(Date.parse(p.endDate))};
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if(action.type == "[Map] MapState" || action.type == "[Map] SetState") {
|
if(action.type == "[Map] MapState" || action.type == "[Map] SetState") {
|
||||||
window.localStorage.setItem(MODULE_NAME + "_mapState",JSON.stringify(r2["mapState"]));
|
window.localStorage.setItem(MODULE_NAME + "_mapState",JSON.stringify(r2["mapState"]));
|
||||||
|
}
|
||||||
|
if(action.type == "[Map] SetPeriod" ) {
|
||||||
|
window.localStorage.setItem(MODULE_NAME + "_searchPeriod",JSON.stringify(r2["period"]));
|
||||||
}
|
}
|
||||||
|
|
||||||
return r2;
|
return r2;
|
||||||
@@ -91,184 +105,130 @@ 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,
|
|
||||||
IMapState,
|
|
||||||
ISelectedFeatures,
|
|
||||||
IItemLayer,
|
|
||||||
ItemLayer,
|
|
||||||
IPeriodState,
|
|
||||||
ForChild,
|
|
||||||
ForItemType,
|
|
||||||
ForSourceTask,
|
|
||||||
ForPackage
|
|
||||||
}
|
|
||||||
|
|
||||||
@NgModule({
|
@NgModule({
|
||||||
imports: [
|
imports: [
|
||||||
CommonModule,
|
CommonModule,
|
||||||
AngularOpenlayersModule,
|
AngularOpenlayersModule,
|
||||||
MapRoutingModule,
|
MapRoutingModule,
|
||||||
StoreModule.forFeature(MODULE_NAME, mapReducers.reducer,{metaReducers:metaReducers}),
|
StoreModule.forFeature(MODULE_NAME, mapReducers.reducer, { metaReducers: metaReducers }),
|
||||||
EffectsModule.forFeature([mapEffects.MapEffects]),
|
EffectsModule.forFeature([mapEffects.MapEffects]),
|
||||||
NgbModule,
|
NgbModule,
|
||||||
FormsModule,
|
FormsModule,
|
||||||
ReactiveFormsModule,
|
ReactiveFormsModule,
|
||||||
AppCommonModule
|
AppCommonModule
|
||||||
],
|
],
|
||||||
declarations: [
|
declarations: [
|
||||||
ZoomToExtentComponent,
|
ZoomToExtentComponent,
|
||||||
ItemVectorSourceComponent,
|
ItemVectorSourceComponent,
|
||||||
ItemLayersComponent,
|
ItemLayersComponent,
|
||||||
FileDropTargetComponent,
|
FileDropTargetComponent,
|
||||||
MapComponent,
|
MapComponent,
|
||||||
MetaDataModalComponent,
|
MetaDataModalComponent,
|
||||||
RotationResetComponent,
|
RotationResetComponent,
|
||||||
MapSearchComponent,
|
MapSearchComponent,
|
||||||
SelectPeriodModalComponent,
|
SelectPeriodModalComponent,
|
||||||
LayerListComponent,
|
LayerListComponent,
|
||||||
LegendComponent,
|
LegendComponent,
|
||||||
LayerVectorImageComponent,
|
LayerVectorImageComponent,
|
||||||
FeatureListComponent,
|
FeatureListComponent,
|
||||||
WidgetHostDirective,
|
WidgetHostDirective,
|
||||||
FeatureListContainerComponent,
|
FeatureListContainerComponent,
|
||||||
FeatureListCroppingschemeComponent,
|
FeatureListCroppingschemeComponent,
|
||||||
FeatureListCropfieldComponent,
|
FeatureListCropfieldComponent,
|
||||||
FeatureListFeatureContainerComponent,
|
FeatureListObservationComponent,
|
||||||
FeatureListFeatureComponent,
|
FeatureListFeatureContainerComponent,
|
||||||
FeatureListFeatureCroppingschemeComponent,
|
FeatureListFeatureComponent,
|
||||||
FeatureListFeatureCropfieldComponent,
|
FeatureListFeatureCroppingschemeComponent,
|
||||||
SelectedItemContainerComponent,
|
FeatureListFeatureCropfieldComponent,
|
||||||
SelectedItemComponent,
|
SelectedItemContainerComponent,
|
||||||
SelectedItemCropfieldComponent,
|
SelectedItemComponent,
|
||||||
SelectedItemGeotiffComponent,
|
SelectedItemCropfieldComponent,
|
||||||
SelectedItemTemporalComponent,
|
SelectedItemGeotiffComponent,
|
||||||
SelectedItemShapeComponent,
|
SelectedItemTemporalComponent,
|
||||||
ItemListItemComponent,
|
SelectedItemShapeComponent,
|
||||||
ItemListItemContainerComponent,
|
ItemListItemComponent,
|
||||||
ItemListComponent,
|
ItemListItemContainerComponent,
|
||||||
ItemWidgetListComponent,
|
ItemListComponent,
|
||||||
WidgetStatusComponent,
|
ItemWidgetListComponent,
|
||||||
GpsLocation,
|
WidgetStatusComponent,
|
||||||
PanToLocation,
|
GpsLocation,
|
||||||
LayerSwitcher,
|
PanToLocation,
|
||||||
HistogramDetailsComponent,
|
LayerSwitcher,
|
||||||
StatisticsDetailsComponent
|
HistogramDetailsComponent,
|
||||||
],
|
StatisticsDetailsComponent,
|
||||||
entryComponents: [
|
ifZoomToShowDirective,
|
||||||
FeatureListComponent,
|
ZoomToShowAlert,
|
||||||
FeatureListCroppingschemeComponent,
|
LayerValuesComponent,
|
||||||
FeatureListCropfieldComponent,
|
GeometryThumbnailComponent
|
||||||
FeatureListFeatureComponent,
|
],
|
||||||
FeatureListFeatureCroppingschemeComponent,
|
exports: [
|
||||||
FeatureListFeatureCropfieldComponent,
|
ItemVectorSourceComponent,
|
||||||
SelectedItemComponent,
|
ItemLayersComponent,
|
||||||
SelectedItemCropfieldComponent,
|
FileDropTargetComponent,
|
||||||
SelectedItemGeotiffComponent,
|
MetaDataModalComponent,
|
||||||
SelectedItemTemporalComponent,
|
MapComponent,
|
||||||
SelectedItemShapeComponent,
|
GpsLocation,
|
||||||
ItemListComponent,
|
PanToLocation,
|
||||||
ItemListItemComponent,
|
LayerSwitcher,
|
||||||
],
|
FeatureListFeatureComponent,
|
||||||
exports: [
|
FeatureListFeatureCropfieldComponent,
|
||||||
ItemVectorSourceComponent,
|
FeatureListFeatureCroppingschemeComponent,
|
||||||
ItemLayersComponent,
|
SelectedItemContainerComponent,
|
||||||
FileDropTargetComponent,
|
SelectedItemComponent,
|
||||||
MetaDataModalComponent,
|
SelectedItemCropfieldComponent,
|
||||||
MapComponent,
|
SelectedItemGeotiffComponent,
|
||||||
GpsLocation,
|
SelectedItemTemporalComponent,
|
||||||
PanToLocation,
|
SelectedItemShapeComponent,
|
||||||
LayerSwitcher,
|
ItemListItemComponent,
|
||||||
FeatureListFeatureComponent,
|
ItemListItemContainerComponent,
|
||||||
FeatureListFeatureCropfieldComponent,
|
ItemListComponent,
|
||||||
FeatureListFeatureCroppingschemeComponent,
|
ItemWidgetListComponent,
|
||||||
SelectedItemContainerComponent,
|
WidgetStatusComponent,
|
||||||
SelectedItemComponent,
|
RotationResetComponent,
|
||||||
SelectedItemCropfieldComponent,
|
MapSearchComponent,
|
||||||
SelectedItemGeotiffComponent,
|
SelectPeriodModalComponent,
|
||||||
SelectedItemTemporalComponent,
|
LayerListComponent,
|
||||||
SelectedItemShapeComponent,
|
LegendComponent,
|
||||||
ItemListItemComponent,
|
LayerVectorImageComponent,
|
||||||
ItemListItemContainerComponent,
|
FeatureListComponent,
|
||||||
ItemListComponent,
|
WidgetHostDirective,
|
||||||
ItemWidgetListComponent,
|
FeatureListContainerComponent,
|
||||||
WidgetStatusComponent,
|
FeatureListCroppingschemeComponent,
|
||||||
RotationResetComponent,
|
FeatureListCropfieldComponent,
|
||||||
MapSearchComponent,
|
FeatureListObservationComponent,
|
||||||
SelectPeriodModalComponent,
|
FeatureListFeatureContainerComponent,
|
||||||
LayerListComponent,
|
ZoomToExtentComponent,
|
||||||
LegendComponent,
|
ifZoomToShowDirective,
|
||||||
LayerVectorImageComponent,
|
ZoomToShowAlert,
|
||||||
FeatureListComponent,
|
GeometryThumbnailComponent
|
||||||
WidgetHostDirective,
|
],
|
||||||
FeatureListContainerComponent,
|
providers: [
|
||||||
FeatureListCroppingschemeComponent,
|
FeatureIconService,
|
||||||
FeatureListCropfieldComponent,
|
GeolocationService,
|
||||||
FeatureListFeatureContainerComponent,
|
DeviceOrientationService,
|
||||||
ZoomToExtentComponent
|
TemporalService,
|
||||||
],
|
{ provide: AbstractFeatureListComponent, useClass: FeatureListCroppingschemeComponent, multi: true },
|
||||||
providers: [
|
{ provide: AbstractFeatureListComponent, useClass: FeatureListCropfieldComponent, multi: true },
|
||||||
FeatureIconService,
|
{ provide: AbstractFeatureListComponent, useClass: FeatureListObservationComponent, multi: true },
|
||||||
GeolocationService,
|
{ provide: AbstractFeatureListFeatureComponent, useClass: FeatureListFeatureComponent, multi: true },
|
||||||
DeviceOrientationService,
|
{ provide: AbstractFeatureListFeatureComponent, useClass: FeatureListFeatureCroppingschemeComponent, multi: true },
|
||||||
{ provide: AbstractFeatureListComponent, useClass: FeatureListCroppingschemeComponent, multi: true },
|
{ provide: AbstractFeatureListFeatureComponent, useClass: FeatureListFeatureCropfieldComponent, multi: true },
|
||||||
{ provide: AbstractFeatureListComponent, useClass: FeatureListCropfieldComponent, multi: true },
|
{ provide: AbstractSelectedItemComponent, useClass: SelectedItemComponent, multi: true },
|
||||||
{ provide: AbstractFeatureListFeatureComponent, useClass: FeatureListFeatureComponent, multi: true },
|
{ provide: AbstractSelectedItemComponent, useClass: SelectedItemCropfieldComponent, multi: true },
|
||||||
{ provide: AbstractFeatureListFeatureComponent, useClass: FeatureListFeatureCroppingschemeComponent, multi: true },
|
{ provide: AbstractSelectedItemComponent, useClass: SelectedItemGeotiffComponent, multi: true },
|
||||||
{ provide: AbstractFeatureListFeatureComponent, useClass: FeatureListFeatureCropfieldComponent, multi: true },
|
{ provide: AbstractSelectedItemComponent, useClass: SelectedItemTemporalComponent, multi: true },
|
||||||
{ provide: AbstractSelectedItemComponent, useClass: SelectedItemComponent, multi: true },
|
{ provide: AbstractSelectedItemComponent, useClass: SelectedItemShapeComponent, multi: true },
|
||||||
{ provide: AbstractSelectedItemComponent, useClass: SelectedItemCropfieldComponent, multi: true },
|
{ provide: AbstractItemListItemComponent, useClass: ItemListItemComponent, multi: true },
|
||||||
{ provide: AbstractSelectedItemComponent, useClass: SelectedItemGeotiffComponent, multi: true },
|
{ provide: AbstractItemListComponent, useClass: ItemListComponent, multi: true }
|
||||||
{ provide: AbstractSelectedItemComponent, useClass: SelectedItemTemporalComponent, multi: true },
|
]
|
||||||
{ provide: AbstractSelectedItemComponent, useClass: SelectedItemShapeComponent, multi: true },
|
|
||||||
{ provide: AbstractItemListItemComponent, useClass: ItemListItemComponent, multi: true },
|
|
||||||
{ provide: AbstractItemListComponent, useClass: ItemListComponent, multi: true }
|
|
||||||
]
|
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
+14
-13
@@ -1,10 +1,10 @@
|
|||||||
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';
|
||||||
import { GeoJSON } from 'ol/format';
|
import { GeoJSON } from 'ol/format';
|
||||||
import { Feature } from 'ol';
|
import { Feature} from 'ol';
|
||||||
|
|
||||||
export interface IDroppedFile {
|
export interface IDroppedFile {
|
||||||
files: any,
|
files: any,
|
||||||
@@ -14,21 +14,22 @@ 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;
|
||||||
@Output() onFileDropped = new EventEmitter<IDroppedFile>();
|
@Output() onFileDropped = new EventEmitter<IDroppedFile>();
|
||||||
@Input() parentCode: string;
|
@Input() parentCode: string;
|
||||||
@Input() features: Array<Feature>;
|
@Input() features: Array<Feature<Geometry>>;
|
||||||
|
|
||||||
constructor(private map: MapComponent) {
|
constructor(private map: MapComponent) {
|
||||||
}
|
}
|
||||||
|
|
||||||
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})
|
||||||
|
|||||||
+2
-2
@@ -6,8 +6,8 @@
|
|||||||
<stop offset="100%" class="stop2" />
|
<stop offset="100%" class="stop2" />
|
||||||
</linearGradient>
|
</linearGradient>
|
||||||
</defs>
|
</defs>
|
||||||
<circle class="tolerance" cx="500" cy="500" stroke="none" [attr.r]="locTolerancePixels" />
|
<circle class="tolerance hidden" [ngClass]="{'hidden':!showTolerance}" cx="500" cy="500" stroke="none" [attr.r]="locTolerancePixels" />
|
||||||
<path *ngIf="showHeading" class="heading" stroke="none" [attr.d]="path" fill="url(#grad1)" [attr.transform]="rotate"></path>
|
<path class="heading hidden" [ngClass]="{'hidden': !showHeading }" stroke="none" [attr.d]="path" fill="url(#grad1)" [attr.transform]="rotate"></path>
|
||||||
<circle class="border" cx="500" cy="500" r="7" stroke="none" />
|
<circle class="border" cx="500" cy="500" r="7" stroke="none" />
|
||||||
<circle class="center" cx="500" cy="500" r="6" stroke="none" />
|
<circle class="center" cx="500" cy="500" r="6" stroke="none" />
|
||||||
|
|
||||||
|
|||||||
+13
-8
@@ -1,6 +1,3 @@
|
|||||||
@import "~bootstrap/scss/bootstrap.scss";
|
|
||||||
|
|
||||||
|
|
||||||
.gps-location {
|
.gps-location {
|
||||||
display:none;
|
display:none;
|
||||||
}
|
}
|
||||||
@@ -9,26 +6,34 @@
|
|||||||
stroke-width: 0;
|
stroke-width: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.heading.hidden {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
.tolerance {
|
.tolerance {
|
||||||
fill: $primary;
|
fill: var(--bs-primary);
|
||||||
fill-opacity:0.4;
|
fill-opacity:0.4;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.tolerance.hidden {
|
||||||
|
display: none
|
||||||
|
}
|
||||||
|
|
||||||
.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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+27
-25
@@ -1,32 +1,34 @@
|
|||||||
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{
|
||||||
|
|
||||||
@Input() enable:boolean;
|
@Input() enable:boolean;
|
||||||
public instance: Overlay;
|
public instance: Overlay;
|
||||||
@Input() position: Position;
|
@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() heading: number = 0;
|
@Input() showTolerance = false;
|
||||||
@Input() headingTolerance: number = 0;
|
@Input() heading = 0;
|
||||||
public locTolerancePixels: number = 0;
|
@Input() headingTolerance = 0;
|
||||||
public path: string = "";
|
public locTolerancePixels = 0;
|
||||||
public rotate: string = "";
|
public path = "";
|
||||||
private resolution: number = 0;
|
public rotate = "";
|
||||||
initialized:boolean = false;
|
private resolution = 0;
|
||||||
|
initialized = false;
|
||||||
@ViewChild('location', { static: true }) locationElement: ElementRef;
|
@ViewChild('location', { static: true }) locationElement: ElementRef;
|
||||||
|
|
||||||
constructor(@Host() private map: MapComponent) {
|
constructor(private map: MapComponent) {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -41,17 +43,17 @@ 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;
|
||||||
this.map.instance.addOverlay(this.instance);
|
this.map.instance.addOverlay(this.instance);
|
||||||
this.map.instance.getView().on('change:resolution', (evt) => {
|
this.map.instance.getView().on('change:resolution', (evt:any) => {
|
||||||
this.resolution = evt.target.get('resolution');
|
this.resolution = evt.target.get('resolution');
|
||||||
this.recalcLocationTolerance();
|
this.recalcLocationTolerance();
|
||||||
});
|
});
|
||||||
@@ -60,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 Position;
|
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;
|
||||||
|
|||||||
+288
-110
@@ -1,39 +1,49 @@
|
|||||||
import { Component, Host, Input, Output, EventEmitter, Optional, QueryList, OnInit, AfterViewInit, OnChanges, SimpleChanges, SkipSelf, forwardRef, Inject, InjectionToken } from '@angular/core';
|
import { Component, Host, Input, Output, EventEmitter,OnDestroy, OnInit, OnChanges, SimpleChanges, forwardRef } from '@angular/core';
|
||||||
import { HttpClient } from "@angular/common/http";
|
import { LayerGroupComponent, MapComponent } from '@farmmaps/ng-openlayers';
|
||||||
import { LayerVectorComponent, LayerTileComponent, LayerGroupComponent, MapComponent } from 'ngx-openlayers';
|
|
||||||
import { ItemService,IItem,AppConfig } from '@farmmaps/common';
|
import { ItemService,IItem,AppConfig } from '@farmmaps/common';
|
||||||
import { IItemLayer,ItemLayer, ITemporalItemLayer} from '../../../models/item.layer';
|
import { IItemLayer, ITemporalItemLayer} from '../../../models/item.layer';
|
||||||
import { ILayerData} from '../../../models/layer.data';
|
import { ILayerData} from '../../../models/layer.data';
|
||||||
import { IRenderoutputTiles,IRenderoutputImage,IGradientstop,ILayer,IHistogram} from '../../../models/color.map';
|
import { IRenderoutputTiles,IRenderoutputImage,IGradientstop,ILayer,IHistogram,IColor} from '../../../models/color.map';
|
||||||
import {Extent} from 'ol/extent';
|
import {Extent} from 'ol/extent';
|
||||||
import Projection from 'ol/proj/Projection';
|
import Projection from 'ol/proj/Projection';
|
||||||
import * as proj from 'ol/proj';
|
import * as proj from 'ol/proj';
|
||||||
import * as loadingstrategy from 'ol/loadingstrategy';
|
import * as loadingstrategy from 'ol/loadingstrategy';
|
||||||
import * as style from 'ol/style';
|
import * as style from 'ol/style';
|
||||||
import {Tile,Layer,Image} from 'ol/layer';
|
import {Tile,Layer,Image} from 'ol/layer';
|
||||||
import {XYZ,ImageStatic,OSM,BingMaps,TileWMS,TileArcGISRest,TileJSON} from 'ol/source';
|
import {XYZ,ImageStatic,OSM,BingMaps,TileWMS,TileArcGISRest,TileJSON,Source} from 'ol/source';
|
||||||
import {Vector as VectorSource} from 'ol/source';
|
import {Vector as VectorSource} from 'ol/source';
|
||||||
import { Vector as VectorLayer } from 'ol/layer';
|
import { Vector as VectorLayer } from 'ol/layer';
|
||||||
|
import { VectorImage as VectorImageLayer } from 'ol/layer';
|
||||||
import VectorTileSource from 'ol/source/VectorTile';
|
import VectorTileSource from 'ol/source/VectorTile';
|
||||||
import VectorTileLayer from 'ol/layer/VectorTile';
|
import VectorTileLayer from 'ol/layer/VectorTile';
|
||||||
import {GeoJSON,MVT} from 'ol/format';
|
import {GeoJSON,MVT} from 'ol/format';
|
||||||
import { from } from 'rxjs';
|
import { Geometry } from 'ol/geom';
|
||||||
|
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 {
|
export class ItemLayersComponent extends LayerGroupComponent implements OnChanges, OnInit,OnDestroy {
|
||||||
@Input() itemLayers: IItemLayer[];
|
@Input() itemLayers: IItemLayer[];
|
||||||
@Input() itemLayer: IItemLayer;
|
@Input() itemLayer: IItemLayer;
|
||||||
|
@Output() onFeatureSelected: EventEmitter<any> = new EventEmitter<any>();
|
||||||
|
@Output() onFeatureHover: 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;
|
||||||
constructor(private itemService: ItemService, @Host() private map: MapComponent, public appConfig: AppConfig) {
|
private topLayerPrerenderEventhandlerInstalled = false;
|
||||||
|
private selectedFeatures = {};
|
||||||
|
private selectionLayer:Layer<Source> = null;
|
||||||
|
|
||||||
|
constructor(private itemService: ItemService, private map: MapComponent, public appConfig: AppConfig) {
|
||||||
super(map);
|
super(map);
|
||||||
this._apiEndPoint = appConfig.getConfig("apiEndPoint");
|
this._apiEndPoint = appConfig.getConfig("apiEndPoint");
|
||||||
}
|
}
|
||||||
@@ -41,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;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -49,76 +59,100 @@ export class ItemLayersComponent extends LayerGroupComponent implements OnChange
|
|||||||
return "#" + this.componentToHex(r) + this.componentToHex(g) + this.componentToHex(b) + this.componentToHex(a);
|
return "#" + this.componentToHex(r) + this.componentToHex(g) + this.componentToHex(b) + this.componentToHex(a);
|
||||||
}
|
}
|
||||||
|
|
||||||
getColorFromGradient(item:IItem,layer: ILayer, feature): style.Style {
|
getColorFromGradient(layer: ILayer, value: number): IColor {
|
||||||
var value = layer.indexKey ? feature.get(layer.indexKey): feature.get(layer.name);
|
const gradient: IGradientstop[] = layer.renderer.colorMap.gradient;
|
||||||
var key = item.code + "_" + value;
|
const histogram: IHistogram = layer.renderer.band.histogram;
|
||||||
if(!this.styleCache[key]) {
|
const index = (value - histogram.min) / histogram.max;
|
||||||
var gradient: IGradientstop[] = layer.renderer.colorMap.gradient;
|
let min = gradient[0];
|
||||||
var histogram: IHistogram = layer.renderer.band.histogram;
|
let max = gradient[gradient.length - 1];
|
||||||
var index = (value - histogram.min) / histogram.max;
|
for (let n = 0; n < gradient.length; n++) {
|
||||||
var min = gradient[0];
|
const s = gradient[n];
|
||||||
var max = gradient[gradient.length - 1];
|
|
||||||
for (var n = 0; n < gradient.length; n++) {
|
|
||||||
var 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));
|
||||||
|
|
||||||
this.styleCache[key] = new style.Style(
|
return { alpha: alpha, red: red, green: green, blue: blue };
|
||||||
{
|
}
|
||||||
image: new style.Circle({
|
|
||||||
fill: new style.Fill({
|
getColorForValue(layer: ILayer, value: number): IColor {
|
||||||
color: this.rgbaToHex(red,green,blue,alpha)
|
let color: IColor = { alpha:0,red:0,green:0,blue:0};
|
||||||
|
if(layer.renderer.colorMap.entries.length>0) {
|
||||||
|
color=layer.renderer.colorMap.noValue;
|
||||||
|
}
|
||||||
|
layer.renderer.colorMap.entries.forEach((entry) => {
|
||||||
|
if(entry.value==value) {
|
||||||
|
color =entry.color;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
return color;
|
||||||
|
}
|
||||||
|
|
||||||
|
getColor(item: IItem, layer: ILayer, feature): style.Style {
|
||||||
|
const value = layer.indexKey ? feature.get(layer.indexKey) : feature.get(layer.name);
|
||||||
|
const key = item.code + "_" + value;
|
||||||
|
if (!this.styleCache[key]) {
|
||||||
|
let color: IColor;
|
||||||
|
if(layer.renderer.colorMap.colormapType == "manual") {
|
||||||
|
color = this.getColorForValue(layer, value);
|
||||||
|
} else {
|
||||||
|
color = this.getColorFromGradient(layer, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
this.styleCache[key] = new style.Style(
|
||||||
|
{
|
||||||
|
image: new style.Circle({
|
||||||
|
fill: new style.Fill({
|
||||||
|
color: this.rgbaToHex(color.red, color.green, color.blue, color.alpha)
|
||||||
|
}),
|
||||||
|
radius: 3
|
||||||
}),
|
}),
|
||||||
radius: 3
|
fill: new style.Fill({
|
||||||
}),
|
color: this.rgbaToHex(color.red, color.green, color.blue, color.alpha)
|
||||||
fill: new style.Fill({
|
}),
|
||||||
color: this.rgbaToHex(red, green, blue, alpha)
|
stroke: new style.Stroke({
|
||||||
}),
|
color: this.rgbaToHex(color.red, color.green, color.blue, 255),
|
||||||
stroke: new style.Stroke({
|
width: 1.25
|
||||||
color: this.rgbaToHex(red, green, blue, 255),
|
}),
|
||||||
width: 1.25
|
});
|
||||||
}),
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
return this.styleCache[key];
|
return this.styleCache[key];
|
||||||
}
|
}
|
||||||
|
|
||||||
createGeotiffLayer(item:IItem,itemLayer:IItemLayer):Layer {
|
createGeotiffLayer(item:IItem,itemLayer:IItemLayer):Layer<Source> {
|
||||||
var layerIndex = -1;
|
let layerIndex = -1;
|
||||||
var layer: Layer = 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;
|
||||||
// convert to EPSG:4326 asworkaround for cesium
|
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)}` });
|
||||||
var projectedExtent = proj.transformExtent( ri.extent, 'EPSG:3857','EPSG:4326');
|
|
||||||
let source = new ImageStatic({ imageExtent:projectedExtent,projection:'EPSG:4326', 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 {
|
createShapeLayer(item:IItem,itemLayer:IItemLayer):Layer<Source> {
|
||||||
var layerIndex = -1;
|
let layerIndex = -1;
|
||||||
var layer: Layer = 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({
|
||||||
@@ -130,7 +164,7 @@ export class ItemLayersComponent extends LayerGroupComponent implements OnChange
|
|||||||
url: `${this._apiEndPoint}/api/v1/items/${item.code}/vectortiles/{z}/{x}/{y}.pbf?v=${Date.parse(item.updated)}`
|
url: `${this._apiEndPoint}/api/v1/items/${item.code}/vectortiles/{z}/{x}/{y}.pbf?v=${Date.parse(item.updated)}`
|
||||||
}),
|
}),
|
||||||
style: (feature) => {
|
style: (feature) => {
|
||||||
return this.getColorFromGradient(item,l, feature);
|
return this.getColor(item,l, feature);
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
} else if (l && l.rendering && l.rendering.renderoutputType == "Tiles") {
|
} else if (l && l.rendering && l.rendering.renderoutputType == "Tiles") {
|
||||||
@@ -143,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;
|
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"));
|
||||||
}
|
}
|
||||||
@@ -160,12 +194,13 @@ export class ItemLayersComponent extends LayerGroupComponent implements OnChange
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
layer = new VectorLayer({
|
layer = new VectorImageLayer({
|
||||||
|
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({
|
||||||
@@ -201,37 +236,67 @@ export class ItemLayersComponent extends LayerGroupComponent implements OnChange
|
|||||||
return layer;
|
return layer;
|
||||||
}
|
}
|
||||||
|
|
||||||
createExternalLayer(item:IItem,itemLayer:IItemLayer):Layer {
|
createSelectionLayer(itemLayer:IItemLayer):Layer<Source> {
|
||||||
let data = item.data as ILayerData;
|
let layerIndex = -1;
|
||||||
var layer: Layer = null;
|
const layer: Layer<Source> = null;
|
||||||
|
layerIndex = itemLayer.layerIndex != -1 ? itemLayer.layerIndex : itemLayer.item.data.layers[0].index;
|
||||||
|
const data = itemLayer.item.data;
|
||||||
|
const l:ILayer = (data && data.layers && data.layers.length > 0) ? data.layers[layerIndex] : null;
|
||||||
|
if (l && l.rendering && l.rendering.renderoutputType == "VectorTiles") {
|
||||||
|
return new VectorTileLayer({
|
||||||
|
renderMode: 'vector',
|
||||||
|
source: (itemLayer.layer as VectorTileLayer).getSource(),
|
||||||
|
style: (feature) => {
|
||||||
|
if (feature.getId() in this.selectedFeatures) {
|
||||||
|
|
||||||
|
return new style.Style(
|
||||||
|
{
|
||||||
|
stroke: new style.Stroke({
|
||||||
|
color: '#0d6efd',
|
||||||
|
width: 3
|
||||||
|
})
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
minZoom: itemLayer.layer.getMinZoom(),
|
||||||
|
maxZoom: itemLayer.layer.getMaxZoom()
|
||||||
|
});
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
createExternalLayer(item:IItem,itemLayer:IItemLayer):Layer<Source> {
|
||||||
|
const data = item.data as ILayerData;
|
||||||
|
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 (
|
||||||
@@ -253,9 +318,9 @@ export class ItemLayersComponent extends LayerGroupComponent implements OnChange
|
|||||||
return layer;
|
return layer;
|
||||||
}
|
}
|
||||||
|
|
||||||
createLayer(itemLayer: IItemLayer): Layer {
|
createLayer(itemLayer: IItemLayer): Layer<Source> {
|
||||||
var layer: Layer = 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') {
|
||||||
@@ -264,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);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -277,6 +342,9 @@ export class ItemLayersComponent extends LayerGroupComponent implements OnChange
|
|||||||
if(this.itemLayers) {
|
if(this.itemLayers) {
|
||||||
this.updateLayers(this.itemLayers);
|
this.updateLayers(this.itemLayers);
|
||||||
} else if(this.itemLayer) {
|
} else if(this.itemLayer) {
|
||||||
|
if(this.getItemlayer(this.itemLayer).item.itemType == 'vnd.farmmaps.itemtype.shape.processed') {
|
||||||
|
this.installMapEventHandler();
|
||||||
|
}
|
||||||
this.updateLayers([this.itemLayer])
|
this.updateLayers([this.itemLayer])
|
||||||
} else {
|
} else {
|
||||||
this.updateLayers([]);
|
this.updateLayers([]);
|
||||||
@@ -284,11 +352,49 @@ export class ItemLayersComponent extends LayerGroupComponent implements OnChange
|
|||||||
this.initialized=true;
|
this.initialized=true;
|
||||||
}
|
}
|
||||||
|
|
||||||
addOrUpdateOlLayer(itemLayer:IItemLayer,index:number):Layer {
|
installMapEventHandler() {
|
||||||
|
if(!this.mapEventHandlerInstalled) {
|
||||||
|
this.map.instance.on(['click', 'pointermove'],this.mapEventHandler);
|
||||||
|
this.mapEventHandlerInstalled=true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
unInstallMapEventHandler() {
|
||||||
|
if(this.mapEventHandlerInstalled) {
|
||||||
|
this.map.instance.un(['click', 'pointermove'],this.mapEventHandler);
|
||||||
|
this.mapEventHandlerInstalled=false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
installTopLayerPrerenderEventhandler(olLayer : Layer<Source>) {
|
||||||
|
if(!this.topLayerPrerenderEventhandlerInstalled && this.onPrerender.observers.length > 0 && olLayer) {
|
||||||
|
if(this.instance.getVisible()) {
|
||||||
|
olLayer.on('prerender',this.topLayerPrerenderEventhandler);
|
||||||
|
olLayer.on('postrender',this.topLayerPostrenderEventhandler);
|
||||||
|
this.topLayerPrerenderEventhandlerInstalled = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
unInstallTopLayerPrerenderEventhandler() {
|
||||||
|
if(this.topLayerPrerenderEventhandlerInstalled && this.onPrerender.observers.length > 0 )
|
||||||
|
{
|
||||||
|
if(this.instance.getVisible()) {
|
||||||
|
const olLayers = this.instance.getLayers().getArray().forEach((l:any) => {
|
||||||
|
l.un('prerender',this.topLayerPrerenderEventhandler);
|
||||||
|
l.un('postrender',this.topLayerPostrenderEventhandler);
|
||||||
|
});
|
||||||
|
this.topLayerPrerenderEventhandlerInstalled = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
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);
|
||||||
@@ -308,45 +414,117 @@ export class ItemLayersComponent extends LayerGroupComponent implements OnChange
|
|||||||
return layer;
|
return layer;
|
||||||
}
|
}
|
||||||
|
|
||||||
updateLayers(itemLayers: IItemLayer[]) {
|
updateLayers(itemLayers: IItemLayer[] | IItemLayer) {
|
||||||
let newLayers: IItemLayer[] = [];
|
this.unInstallTopLayerPrerenderEventhandler();
|
||||||
if (itemLayers) {
|
let dataLayer = false;
|
||||||
itemLayers.forEach((itemLayer, index) => {
|
let ils:IItemLayer[] = [];
|
||||||
|
if(Array.isArray(itemLayers)) {
|
||||||
|
ils = itemLayers;
|
||||||
|
} else {
|
||||||
|
dataLayer=true;
|
||||||
|
ils=[itemLayers];
|
||||||
|
}
|
||||||
|
const newLayers: Layer<Source>[] = [];
|
||||||
|
if (ils) {
|
||||||
|
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);
|
||||||
} 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);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
// 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);
|
||||||
}
|
}
|
||||||
|
this.selectionLayer=null;
|
||||||
|
if(this.mapEventHandlerInstalled && ils.length==1 && this.getItemlayer(itemLayers[0]).item.itemType == 'vnd.farmmaps.itemtype.shape.processed') {
|
||||||
|
this.selectionLayer = this.createSelectionLayer(this.getItemlayer(itemLayers[0]));
|
||||||
|
if(this.selectionLayer) olLayers.push(this.selectionLayer)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
topLayerPrerenderEventhandler = (event) => {
|
||||||
|
this.onPrerender.emit(event);
|
||||||
|
}
|
||||||
|
|
||||||
|
topLayerPostrenderEventhandler = (event) => {
|
||||||
|
const ctx = event.context;
|
||||||
|
ctx.restore();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
mapEventHandler = (event) => {
|
||||||
|
// select only when having observers
|
||||||
|
if(event.type === 'click' && !this.onFeatureSelected.observers.length) return;
|
||||||
|
if(event.type === 'pointermove' && !this.onFeatureHover.observers.length) return;
|
||||||
|
const itemLayer= this.getItemlayer(this.itemLayer);
|
||||||
|
if(itemLayer && itemLayer.layer) {
|
||||||
|
this.selectedFeatures = {};
|
||||||
|
if(itemLayer.layer ) {
|
||||||
|
const minZoom = itemLayer.layer.getMinZoom();
|
||||||
|
const currentZoom = this.map.instance.getView().getZoom();
|
||||||
|
if(currentZoom>minZoom) {
|
||||||
|
itemLayer.layer.getFeatures(event.pixel).then((features) => {
|
||||||
|
if(!features.length) {
|
||||||
|
this.onFeatureHover.emit(null);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
const fid = features[0].getId();
|
||||||
|
const feature = features[0];
|
||||||
|
if(event.type === 'pointermove') {
|
||||||
|
this.selectedFeatures[fid] = features[0];
|
||||||
|
this.onFeatureHover.emit({ "feature": feature,"itemCode":itemLayer.item.code });
|
||||||
|
} else {
|
||||||
|
this.onFeatureSelected.emit({ "feature": feature,"itemCode":itemLayer.item.code });
|
||||||
|
}
|
||||||
|
})
|
||||||
|
if(this.selectionLayer) this.selectionLayer.changed();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
getItemlayer(itemLayer:IItemLayer):IItemLayer {
|
||||||
|
if((itemLayer as ITemporalItemLayer).selectedItemLayer) return (itemLayer as ITemporalItemLayer).selectedItemLayer;
|
||||||
|
return itemLayer;
|
||||||
|
}
|
||||||
|
|
||||||
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
|
||||||
if(itemLayer) {
|
if(itemLayer) {
|
||||||
|
if(this.getItemlayer(this.itemLayer).item.itemType == 'vnd.farmmaps.itemtype.shape.processed') {
|
||||||
|
this.installMapEventHandler();
|
||||||
|
}
|
||||||
this.updateLayers([itemLayer]);
|
this.updateLayers([itemLayer]);
|
||||||
} else {
|
} else {
|
||||||
this.updateLayers([]);
|
this.unInstallMapEventHandler();
|
||||||
|
this.updateLayers([]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ngOnDestroy() {
|
||||||
|
this.unInstallMapEventHandler();
|
||||||
|
super.ngOnDestroy();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+164
-92
@@ -1,99 +1,118 @@
|
|||||||
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 } from 'ol/geom';
|
import { Point, Geometry } from 'ol/geom';
|
||||||
import { MapBrowserEvent } from 'ol';
|
import { MapBrowserEvent } from 'ol';
|
||||||
|
import { Types } from 'ol/MapBrowserEventType';
|
||||||
import * as style from 'ol/style';
|
import * as style from 'ol/style';
|
||||||
import * as color from 'ol/color';
|
import * as color from 'ol/color';
|
||||||
import * as loadingstrategy from 'ol/loadingstrategy';
|
import * as 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} 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';
|
||||||
@Component({
|
import { getCenter } from 'ol/extent';
|
||||||
selector: 'fm-map-item-source-vector',
|
import { formatNumber } from '@angular/common';
|
||||||
template: `<ng-content></ng-content>`,
|
|
||||||
providers: [
|
@Component({
|
||||||
{ provide: SourceVectorComponent , useExisting: forwardRef(() => ItemVectorSourceComponent) }
|
selector: 'fm-map-item-source-vector',
|
||||||
]
|
template: `<ng-content></ng-content>`,
|
||||||
|
providers: [
|
||||||
|
{ 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;
|
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>;
|
@Input() features: Array<Feature<Geometry>>;
|
||||||
@Input() selectedFeature: Feature;
|
@Input() selectedFeature: Feature<Geometry>;
|
||||||
@Input() selectedItem: IItem;
|
@Input() selectedItem: IItem;
|
||||||
@Input() styles:IStyles;
|
@Input() styles: IStyles;
|
||||||
@Output() onFeatureSelected: EventEmitter<Feature> = new EventEmitter<Feature>();
|
@Output() onFeatureSelected: EventEmitter<Feature<Geometry>> = new EventEmitter<Feature<Geometry>>();
|
||||||
@Output() onFeatureHover: EventEmitter<Feature> = new EventEmitter<Feature>();
|
@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, @Host() 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(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):style.Style {
|
getSelectedStyle(feature: Feature<Geometry>): style.Style {
|
||||||
let key = feature.get('itemType')+"_selected";
|
const key = feature.get('itemType') + "_selected";
|
||||||
let evaluatedStyle =null;
|
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;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
evaluatedStyle = this.stylesCache["selected"];
|
evaluatedStyle = this.stylesCache["selected"] as style.Style;
|
||||||
}
|
}
|
||||||
if(evaluatedStyle ) {
|
if (evaluatedStyle) {
|
||||||
evaluatedStyle.setGeometry((feature) => this.geometry(feature));
|
evaluatedStyle.setGeometry((feature: Feature<Geometry>) => this.geometry(feature));
|
||||||
}
|
}
|
||||||
return evaluatedStyle
|
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]
|
layers: [this.layer.instance as Layer<Source>]
|
||||||
});
|
});
|
||||||
this._hoverSelect = new Select({
|
this._hoverSelect = new Select({
|
||||||
style: (feature) => {
|
style: (feature: Feature<Geometry>) => {
|
||||||
return this.getSelectedStyle(feature);
|
return this.getSelectedStyle(feature);
|
||||||
},
|
},
|
||||||
hitTolerance: 10,
|
hitTolerance: 10,
|
||||||
condition: (e: MapBrowserEvent) => {
|
condition: (e: MapBrowserEvent<UIEvent>) => {
|
||||||
return e.type == 'pointermove';
|
return e.type == 'pointermove';
|
||||||
},
|
},
|
||||||
layers: [this.layer.instance as Layer]
|
layers: [this.layer.instance as Layer<Source>]
|
||||||
});
|
});
|
||||||
this.map.instance.addInteraction(this._select);
|
this.map.instance.addInteraction(this._select);
|
||||||
this.map.instance.addInteraction(this._hoverSelect);
|
this.map.instance.addInteraction(this._hoverSelect);
|
||||||
this._select.on('select', (e) => {
|
this._select.on('select', (e) => {
|
||||||
if (e.selected.length > 0 && e.selected[0]) {
|
if (e.selected.length > 0 && e.selected[0]) {
|
||||||
this.onFeatureSelected.emit(e.selected[0]);
|
this.onFeatureSelected.emit(e.selected[0]);
|
||||||
@@ -110,47 +129,53 @@ export class ItemVectorSourceComponent extends SourceVectorComponent implements
|
|||||||
});
|
});
|
||||||
this.instance = new Vector(this);
|
this.instance = new Vector(this);
|
||||||
this.host.instance.setSource(this.instance);
|
this.host.instance.setSource(this.instance);
|
||||||
|
|
||||||
this.host.instance.setStyle((feature) => {
|
this.host.instance.setStyle((feature) => {
|
||||||
var key = feature.get('itemType') + (this.selectedItem?"_I":"");
|
const itemType = feature.get('itemType');
|
||||||
|
let key = itemType + (this.selectedItem ? "_I" : "");
|
||||||
if (!this.stylesCache[key]) {
|
if (!this.stylesCache[key]) {
|
||||||
if (this.itemTypeService.itemTypes[key]) {
|
if (this.itemTypeService.itemTypes[itemType]) {
|
||||||
let itemType = this.itemTypeService.itemTypes[key];
|
const itemTypeEntry = this.itemTypeService.itemTypes[itemType];
|
||||||
let fillColor = color.asArray(itemType.iconColor);
|
const fillColor = color.asArray(itemTypeEntry.iconColor);
|
||||||
fillColor[3] = this.selectedItem?0:0.5;
|
fillColor[3] = 0;
|
||||||
this.stylesCache[key] = new style.Style({
|
this.stylesCache[key] = new style.Style({
|
||||||
image: itemType.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(itemType.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) => 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);
|
||||||
@@ -159,31 +184,78 @@ 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();
|
||||||
if (feature) {
|
if (feature) {
|
||||||
//this.instance.removeFeature(feature);
|
//this.instance.removeFeature(feature);
|
||||||
features.push(feature)
|
features.push(feature)
|
||||||
}
|
|
||||||
}
|
|
||||||
if (changes["selectedItem"] && this.instance) {
|
|
||||||
var item = changes["selectedItem"].currentValue
|
|
||||||
if (item) {
|
|
||||||
this.map.instance.removeInteraction(this._hoverSelect);
|
|
||||||
} else {
|
|
||||||
this.map.instance.addInteraction(this._hoverSelect);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (changes["styles"] && this.instance) {
|
if (changes["selectedItem"] && this.instance) {
|
||||||
let styles = changes["styles"].currentValue;
|
const item = changes["selectedItem"].currentValue
|
||||||
|
if (item) {
|
||||||
|
this.map.instance.removeInteraction(this._hoverSelect);
|
||||||
|
} else {
|
||||||
|
this.map.instance.addInteraction(this._hoverSelect);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (changes["styles"]) {
|
||||||
|
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']
|
||||||
|
};
|
||||||
|
}
|
||||||
+50
-31
@@ -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.item.code) {
|
||||||
<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="fa 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="fa fa-bar-chart" aria-hidden="true"></i></a></span>
|
@if (itemLayer.visible) {
|
||||||
<span class="float-right"><a href="#" title="Remove overlay" class="btn btn-light btn-sm" (click)="handleDelete($event,itemLayer)"><i class="fa fa-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);"></fm-map-layer-legend>
|
}
|
||||||
</div>
|
@if (itemLayer.visible) {
|
||||||
</div>
|
<a title="No transparency" href="#" class="btn btn-light btn-sm" (click)="handleSetOpacity($event,itemLayer,1)">100%</a>
|
||||||
</div>
|
}
|
||||||
</div>
|
</span>
|
||||||
</div>
|
<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>
|
||||||
</div>
|
@if (firstLayer(itemLayer)) {
|
||||||
<ng-template #noLayers>
|
<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>
|
||||||
<div class="list-group">
|
}
|
||||||
<div class="list-group-item" i18n>No layers</div>
|
@if (!dataLayers) {
|
||||||
</div>
|
<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>
|
||||||
</ng-template>
|
}
|
||||||
|
</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>
|
||||||
|
} @else {
|
||||||
|
<div class="list-group">
|
||||||
|
<div class="list-group-item" i18n>No layers</div>
|
||||||
|
</div>
|
||||||
|
}
|
||||||
|
</div>
|
||||||
|
|||||||
@@ -1,15 +1,17 @@
|
|||||||
import { Component,Input,Output,EventEmitter } from '@angular/core';
|
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 = 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>();
|
||||||
|
|||||||
+27
@@ -0,0 +1,27 @@
|
|||||||
|
<div #layerValues class="layer-values">
|
||||||
|
@if (enabled$ | async) {
|
||||||
|
<div class="cross" >
|
||||||
|
<div class="pointer"></div>
|
||||||
|
@if ((layerValues$ | async ); as layers) {
|
||||||
|
<div class="values-container border border-dark rounded p-2">
|
||||||
|
<div class="lonlat pb-2 "><span class="font-weight-bold">{{lonlat$}}</span><i class="ms-2 fal fa-copy" (click)="copyToClipboard()"></i> </div>
|
||||||
|
@if (layers.length>0 ) {
|
||||||
|
<ul class="value-list p-0 mb-0">
|
||||||
|
@for (layerValue of layers; track $index) {
|
||||||
|
<li class="border-top pt-1 pb-1 value">
|
||||||
|
<div>{{layerValue.layerName}}</div>
|
||||||
|
<div>{{layerValue.date|date}}</div>
|
||||||
|
<div>@if (layerValue.quantity) {
|
||||||
|
<span><span class="me-1">{{layerValue.quantity}}</span> </span>
|
||||||
|
}<span class="me-1 font-weight-bold">{{getScaledValue(layerValue)}}</span><span>{{layerValue.unit}}</span></div>
|
||||||
|
</li>
|
||||||
|
}
|
||||||
|
</ul>
|
||||||
|
} @else {
|
||||||
|
<div i18n class="border-top pt-1 pb-1">No data at location</div>
|
||||||
|
}
|
||||||
|
</div>
|
||||||
|
}
|
||||||
|
</div>
|
||||||
|
}
|
||||||
|
</div>
|
||||||
+37
@@ -0,0 +1,37 @@
|
|||||||
|
.layer-values {
|
||||||
|
position: absolute;
|
||||||
|
left: 50%;
|
||||||
|
top: 30%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.cross {
|
||||||
|
display: block;
|
||||||
|
position: relative;
|
||||||
|
width: 1em;
|
||||||
|
height: 1em;
|
||||||
|
left: -0.5em;
|
||||||
|
top: -0.5em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.values-container {
|
||||||
|
position: relative;
|
||||||
|
background-color: white;
|
||||||
|
left: calc( 1em - 1px);
|
||||||
|
top: -1.3em;
|
||||||
|
min-width: 15em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.value-list {
|
||||||
|
list-style: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.pointer {
|
||||||
|
position: relative;
|
||||||
|
width: 0px;
|
||||||
|
height: 0px;
|
||||||
|
left: 0.5em;
|
||||||
|
border-top: 0.5em solid transparent;
|
||||||
|
border-bottom: 0.5em solid transparent;
|
||||||
|
border-right: 0.5em solid black;
|
||||||
|
}
|
||||||
|
|
||||||
+6
-6
@@ -1,20 +1,20 @@
|
|||||||
import { ComponentFixture, TestBed } from '@angular/core/testing';
|
import { ComponentFixture, TestBed } from '@angular/core/testing';
|
||||||
|
|
||||||
import { GradientComponent } from './gradient.component';
|
import { LayerValuesComponent } from './layer-values.component';
|
||||||
|
|
||||||
describe('GradientComponent', () => {
|
describe('LayerValuesComponent', () => {
|
||||||
let component: GradientComponent;
|
let component: LayerValuesComponent;
|
||||||
let fixture: ComponentFixture<GradientComponent>;
|
let fixture: ComponentFixture<LayerValuesComponent>;
|
||||||
|
|
||||||
beforeEach(async () => {
|
beforeEach(async () => {
|
||||||
await TestBed.configureTestingModule({
|
await TestBed.configureTestingModule({
|
||||||
declarations: [ GradientComponent ]
|
declarations: [ LayerValuesComponent ]
|
||||||
})
|
})
|
||||||
.compileComponents();
|
.compileComponents();
|
||||||
});
|
});
|
||||||
|
|
||||||
beforeEach(() => {
|
beforeEach(() => {
|
||||||
fixture = TestBed.createComponent(GradientComponent);
|
fixture = TestBed.createComponent(LayerValuesComponent);
|
||||||
component = fixture.componentInstance;
|
component = fixture.componentInstance;
|
||||||
fixture.detectChanges();
|
fixture.detectChanges();
|
||||||
});
|
});
|
||||||
@@ -0,0 +1,71 @@
|
|||||||
|
import { Component, OnInit, Input, ViewChild, ElementRef, AfterViewInit } from '@angular/core';
|
||||||
|
import { IItemLayer } from '../../../models/item.layer';
|
||||||
|
import { Store } from '@ngrx/store';
|
||||||
|
import * as mapReducers from '../../../reducers/map.reducer';
|
||||||
|
import * as mapActions from '../../../actions/map.actions';
|
||||||
|
import { MapComponent } from '@farmmaps/ng-openlayers';
|
||||||
|
import { ILayervalue } from '../../../models/layer.value';
|
||||||
|
import { Observable, interval, Subject } from 'rxjs';
|
||||||
|
import { debounce, throttle } from 'rxjs/operators';
|
||||||
|
import { toLonLat } from 'ol/proj';
|
||||||
|
import { toStringHDMS } from 'ol/coordinate';
|
||||||
|
import { ClipboardService } from 'ngx-clipboard'
|
||||||
|
import { GeoJSON, WKT } from 'ol/format';
|
||||||
|
import { Point } from 'ol/geom';
|
||||||
|
|
||||||
|
@Component({
|
||||||
|
selector: 'fm-map-layer-values',
|
||||||
|
templateUrl: './layer-values.component.html',
|
||||||
|
styleUrls: ['./layer-values.component.scss'],
|
||||||
|
standalone: false
|
||||||
|
})
|
||||||
|
export class LayerValuesComponent implements OnInit, AfterViewInit {
|
||||||
|
|
||||||
|
@ViewChild('layerValues') containerRef: ElementRef;
|
||||||
|
offsetX$ = 0;
|
||||||
|
offsetY$ = 0;
|
||||||
|
lonlat$ = "";
|
||||||
|
wkt$ = "";
|
||||||
|
layerValues$: Observable<Array<ILayervalue>> = this.store.select(mapReducers.selectGetLayerValues);
|
||||||
|
enabled$: Observable<boolean> = this.store.select(mapReducers.selectGetLayerValuesEnabled);
|
||||||
|
wktFormat$: WKT;
|
||||||
|
|
||||||
|
constructor(private store: Store<mapReducers.State>, private map: MapComponent, private clipboardService$: ClipboardService) {
|
||||||
|
this.wktFormat$ = new WKT();
|
||||||
|
}
|
||||||
|
|
||||||
|
ngOnInit(): void {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
moveEndSubject = new Subject<any>();
|
||||||
|
|
||||||
|
ngAfterViewInit(): void {
|
||||||
|
this.offsetY$ = this.containerRef.nativeElement.offsetTop;
|
||||||
|
this.offsetX$ = this.containerRef.nativeElement.offsetLeft;
|
||||||
|
this.map.instance.on('moveend', () => {
|
||||||
|
this.moveEndSubject.next({});
|
||||||
|
});
|
||||||
|
this.moveEndSubject.pipe(throttle(ev => interval(100))).subscribe(() => this.updateValuesLocation());
|
||||||
|
}
|
||||||
|
|
||||||
|
updateValuesLocation() {
|
||||||
|
const xy = this.map.instance.getCoordinateFromPixel([this.offsetX$, this.offsetY$])
|
||||||
|
const lonlat = toLonLat(xy);
|
||||||
|
this.wkt$ = this.wktFormat$.writeGeometry(new Point(lonlat))
|
||||||
|
this.lonlat$ = toStringHDMS(lonlat);
|
||||||
|
this.store.dispatch(new mapActions.SetLayerValuesLocation(xy[0], xy[1]));
|
||||||
|
}
|
||||||
|
|
||||||
|
copyToClipboard() {
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
}
|
||||||
+11
-10
@@ -1,21 +1,22 @@
|
|||||||
import { Component, OnDestroy, OnInit, Input, Optional, OnChanges, SimpleChanges } from '@angular/core';
|
import { Component, OnDestroy, OnInit, Input, OnChanges, SimpleChanges } from '@angular/core';
|
||||||
import { Vector } from 'ol/layer';
|
import { LayerVectorComponent, MapComponent } from '@farmmaps/ng-openlayers';
|
||||||
import { Style } from 'ol/style';
|
import RenderType from 'ol/layer/Vector';
|
||||||
import { StyleFunction } from 'ol/style/Style';
|
import { Vector as VectorSource } from 'ol/source';
|
||||||
import { LayerVectorComponent, LayerGroupComponent, MapComponent } from 'ngx-openlayers';
|
import { Geometry } from 'ol/geom';
|
||||||
import { RenderType } from 'ol/layer/Vector';
|
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 | string = "image";
|
renderMode: RenderType<VectorSource<Feature<Geometry>>> | string = "image";
|
||||||
|
|
||||||
constructor(map: MapComponent) {
|
constructor(map: MapComponent) {
|
||||||
super(map);
|
super(map);
|
||||||
|
|||||||
+1
-1
@@ -1,4 +1,4 @@
|
|||||||
<div (click)="handleClick($event)" class="btn btn-outline-secondary gps-location">
|
<div (click)="handleClick($event)" class="btn btn-outline-primary gps-location">
|
||||||
<svg height="100%" width="100%" viewBox="0 0 96 96">
|
<svg height="100%" width="100%" viewBox="0 0 96 96">
|
||||||
<g
|
<g
|
||||||
id="XMLID_1_"><circle
|
id="XMLID_1_"><circle
|
||||||
|
|||||||
+6
-9
@@ -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,21 +14,21 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
.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 {
|
||||||
fill: theme-color-level($color-name: "primary", $level: -10)
|
fill: theme-color-level(primary, -10)
|
||||||
}
|
}
|
||||||
|
|
||||||
.pan-to.pan-to-disabled {
|
.pan-to.pan-to-disabled {
|
||||||
fill: $gray-300;
|
fill: var(--bs-gray-300);
|
||||||
}
|
}
|
||||||
|
|||||||
+24
-23
@@ -1,20 +1,21 @@
|
|||||||
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{
|
||||||
|
|
||||||
view: View;
|
view: View;
|
||||||
map: MapComponent;
|
map: MapComponent;
|
||||||
@Input() position: Position;
|
@Input() position: GeolocationPosition;
|
||||||
@Input() mapState: IMapState;
|
@Input() mapState: IMapState;
|
||||||
@Input() animate: boolean;
|
@Input() animate: boolean;
|
||||||
|
|
||||||
@@ -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
-1
@@ -1,4 +1,4 @@
|
|||||||
<div (click)="handleClick($event)" class="btn btn-outline-secondary compass" [style.transform]="Rotation()" [ngClass]="{'compass-n':IsNorth()}">
|
<div (click)="handleClick($event)" class="btn btn-outline-primary compass" [style.transform]="Rotation()" [ngClass]="{'compass-n':IsNorth()}">
|
||||||
<svg height="100%" width="100%" viewBox="0 0 132.29166 132.29167">
|
<svg height="100%" width="100%" viewBox="0 0 132.29166 132.29167">
|
||||||
<g
|
<g
|
||||||
inkscape:label="Laag 1"
|
inkscape:label="Laag 1"
|
||||||
|
|||||||
+6
-8
@@ -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 {
|
||||||
|
|||||||
+8
-7
@@ -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)`;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -29,7 +30,7 @@ export class RotationResetComponent implements OnInit {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
constructor( @Host() private map: MapComponent, private changeDetectorRef$: ChangeDetectorRef ) {
|
constructor( private map: MapComponent, private changeDetectorRef$: ChangeDetectorRef ) {
|
||||||
}
|
}
|
||||||
|
|
||||||
handleClick(event:Event) {
|
handleClick(event:Event) {
|
||||||
|
|||||||
+31
-17
@@ -1,37 +1,51 @@
|
|||||||
import { Component, Host, Input, OnInit, OnChanges, SimpleChanges, forwardRef } from '@angular/core';
|
import { Component, Host, Input, OnInit, OnChanges, SimpleChanges, forwardRef } from '@angular/core';
|
||||||
import { ViewComponent, MapComponent } from 'ngx-openlayers';
|
import { ActivatedRoute } from '@angular/router';
|
||||||
|
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;
|
||||||
@Input() extent: number[];
|
paddingTop = 0;
|
||||||
@Input() animate: boolean = false;
|
paddingLeft = 0;
|
||||||
|
paddingBottom = 0;
|
||||||
|
paddingRight = 0;
|
||||||
|
|
||||||
constructor(@Host() view: ViewComponent, @Host() map: MapComponent) {
|
@Input() extent: number[];
|
||||||
|
@Input() animate = false;
|
||||||
|
|
||||||
|
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"]) {
|
||||||
|
const params = route.snapshot.data["fm-map-zoom-to-extent"];
|
||||||
|
this.paddingTop = params["padding-top"] ? params["padding-top"] : 0;
|
||||||
|
this.paddingBottom = params["padding-bottom"] ? params["padding-bottom"] : 0;
|
||||||
|
this.paddingLeft = params["padding-left"] ? params["padding-left"] : 0;
|
||||||
|
this.paddingRight = params["padding-right"] ? params["padding-right"] : 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
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);
|
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 = 1 * rem;
|
bottom = 5 * rem;
|
||||||
left = 23 * rem;
|
left = 23 * rem;
|
||||||
}
|
}
|
||||||
options.padding = [top, right, bottom, left];
|
options.padding = [top + (this.paddingTop*rem), right+ (this.paddingRight*rem), bottom + (this.paddingBottom*rem), left+ (this.paddingLeft*rem)];
|
||||||
if (this.animate) options["duration"] = 1000;
|
if (this.animate) options["duration"] = 1000;
|
||||||
this.view.instance.fit(this.extent, options);
|
this.view.instance.fit(this.extent, options);
|
||||||
}
|
}
|
||||||
|
|||||||
+2
-6
@@ -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) {
|
||||||
|
|||||||
+14
-12
@@ -1,5 +1,6 @@
|
|||||||
import { Component, Input, OnInit, ComponentFactoryResolver, ViewChild, SimpleChanges, ComponentFactory, Inject} from '@angular/core';
|
import { Component, Input, OnInit, ComponentFactoryResolver, ViewChild, SimpleChanges, ComponentFactory, Inject} from '@angular/core';
|
||||||
import { Feature } from 'ol';
|
import { Feature } from 'ol';
|
||||||
|
import { Geometry} from 'ol/geom';
|
||||||
import { FeatureListComponent,AbstractFeatureListComponent } from '../feature-list/feature-list.component';
|
import { FeatureListComponent,AbstractFeatureListComponent } from '../feature-list/feature-list.component';
|
||||||
import { WidgetHostDirective } from '../widget-host/widget-host.directive';
|
import { WidgetHostDirective } from '../widget-host/widget-host.directive';
|
||||||
import {IQueryState,PackageService } from '@farmmaps/common';
|
import {IQueryState,PackageService } from '@farmmaps/common';
|
||||||
@@ -9,10 +10,11 @@ import { Store } from '@ngrx/store';
|
|||||||
import { Observable } from 'rxjs';
|
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 {
|
||||||
|
|
||||||
@@ -20,10 +22,10 @@ export class FeatureListContainerComponent {
|
|||||||
this.featureLists = [...this.featureLists].reverse();
|
this.featureLists = [...this.featureLists].reverse();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Input() features: Array<Feature>
|
@Input() features: Array<Feature<Geometry>>
|
||||||
@Input() queryState: IQueryState;
|
@Input() queryState: IQueryState;
|
||||||
@Input() selectedFeature: Feature;
|
@Input() selectedFeature: Feature<Geometry>;
|
||||||
@Input() clickedFeature:Observable<Feature>;
|
@Input() clickedFeature:Observable<Feature<Geometry>>;
|
||||||
|
|
||||||
@ViewChild(WidgetHostDirective, { static: true }) widgetHost: WidgetHostDirective;
|
@ViewChild(WidgetHostDirective, { static: true }) widgetHost: WidgetHostDirective;
|
||||||
componentRef:any;
|
componentRef:any;
|
||||||
@@ -32,13 +34,13 @@ 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;
|
||||||
if (this.featureLists[i]['forItemType']) {
|
if (this.featureLists[i]['forItemType']) {
|
||||||
criteria++;
|
criteria++;
|
||||||
if( this.featureLists[i]['forItemType'].indexOf(queryState.itemType) >= 0) {
|
if( this.featureLists[i]['forItemType'].split(",").filter(part => part == queryState.itemType).length == 1) {
|
||||||
matches++;
|
matches++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -63,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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+20
-14
@@ -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) {
|
||||||
<div><a href="#" (click)="handleBackClick($event)" i18n>back</a></div>
|
<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 pl-3 pr-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">
|
||||||
</div>
|
@for (feature of features; track $index) {
|
||||||
</div>
|
<div class="row m-0 ps-3 pe-3" [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>
|
</div>
|
||||||
</div>
|
}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
}
|
||||||
|
</div>
|
||||||
|
}
|
||||||
|
</div>
|
||||||
|
|||||||
+3
-5
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
+5
-4
@@ -11,10 +11,11 @@ import { Observable } from 'rxjs';
|
|||||||
@ForChild()
|
@ForChild()
|
||||||
@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 {
|
||||||
|
|
||||||
|
|||||||
+17
-13
@@ -1,13 +1,17 @@
|
|||||||
<div class="card border-0">
|
<div class="card border-0">
|
||||||
<div class="card-body">
|
<div class="card-body">
|
||||||
<div><a href="#" (click)="handleBackClick($event)" i18n>Back</a></div>
|
<fm-back-button></fm-back-button>
|
||||||
<h3><i class="fm fm-farm"></i> <span i18n>Farms</span></h3>
|
<h3><i class="far fa-farm"></i> <span i18n>Farms</span></h3>
|
||||||
<div *ngIf="features;let features">
|
@if (features; as features) {
|
||||||
<div class="farms">
|
<div>
|
||||||
<div class="row m-0 pl-3 pr-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 $index) {
|
||||||
</div>
|
<div class="row m-0 ps-3 pe-3"[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>
|
</div>
|
||||||
</div>
|
}
|
||||||
</div>
|
</div>
|
||||||
|
</div>
|
||||||
|
}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|||||||
+3
-5
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
+8
-6
@@ -9,13 +9,15 @@ import * as mapActions from '../../actions/map.actions';
|
|||||||
import { tassign } from 'tassign';
|
import { tassign } from 'tassign';
|
||||||
import { Router } from '@angular/router';
|
import { Router } from '@angular/router';
|
||||||
import { Feature } from 'ol';
|
import { Feature } from 'ol';
|
||||||
|
import { Geometry} from 'ol/geom';
|
||||||
|
|
||||||
@ForItemType("vnd.farmmaps.itemtype.croppingscheme")
|
@ForItemType("vnd.farmmaps.itemtype.croppingscheme")
|
||||||
@Injectable()
|
@Injectable()
|
||||||
@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 {
|
||||||
|
|
||||||
@@ -23,8 +25,8 @@ export class FeatureListCroppingschemeComponent extends AbstractFeatureListCompo
|
|||||||
super(store, itemTypeService, location);
|
super(store, itemTypeService, location);
|
||||||
}
|
}
|
||||||
|
|
||||||
getAction(feature:Feature):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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+9
-7
@@ -1,16 +1,18 @@
|
|||||||
import { Component, Input, OnInit, ComponentFactoryResolver, ViewChild, SimpleChanges, ComponentFactory, Inject, Type} from '@angular/core';
|
import { Component, Input, OnInit, ComponentFactoryResolver, ViewChild, SimpleChanges, ComponentFactory, Inject, Type} from '@angular/core';
|
||||||
import { Feature } from 'ol';
|
import { Feature } from 'ol';
|
||||||
|
import { Geometry } from 'ol/geom';
|
||||||
import { AbstractFeatureListFeatureComponent,FeatureListFeatureComponent } from '../feature-list-feature/feature-list-feature.component';
|
import { AbstractFeatureListFeatureComponent,FeatureListFeatureComponent } from '../feature-list-feature/feature-list-feature.component';
|
||||||
import { WidgetHostDirective } from '../widget-host/widget-host.directive';
|
import { WidgetHostDirective } from '../widget-host/widget-host.directive';
|
||||||
|
|
||||||
|
|
||||||
@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 {
|
||||||
|
|
||||||
@@ -18,12 +20,12 @@ export class FeatureListFeatureContainerComponent {
|
|||||||
this.featureLists = [...this.featureLists].reverse();
|
this.featureLists = [...this.featureLists].reverse();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Input() feature: Feature;
|
@Input() feature: Feature<Geometry>;
|
||||||
|
|
||||||
@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;
|
||||||
@@ -32,7 +34,7 @@ export class FeatureListFeatureContainerComponent {
|
|||||||
let criteria=0;
|
let criteria=0;
|
||||||
if (this.featureLists[i]['forItemType']) {
|
if (this.featureLists[i]['forItemType']) {
|
||||||
criteria++;
|
criteria++;
|
||||||
if(this.featureLists[i]['forItemType'].indexOf(this.feature.get("itemType")) >= 0) {
|
if(this.featureLists[i]['forItemType'].split(",").filter(part => part == this.feature.get("itemType")).length == 1) {
|
||||||
matches++;
|
matches++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+16
-12
@@ -1,12 +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 #container class="thumbnail">
|
<div class="p-2">
|
||||||
<canvas #canvas ></canvas>
|
<div class="thumbnail">
|
||||||
</div>
|
<fm-map-feature-thumbnail [feature]="feature"></fm-map-feature-thumbnail>
|
||||||
</div>
|
</div>
|
||||||
<div class="flex-grow p-2 overflow-hidden">
|
</div>
|
||||||
<h1 class="card-title" title="{{feature.get('name')}}">{{feature.get('name')}}</h1>
|
<div class="flex-grow p-2 overflow-hidden">
|
||||||
<div class="card-text"><span>{{areaInHa(feature)| number:'1.2-2'}} ha</span> <span>{{feature.get('cropTypeName')}}</span> </div>
|
<h1 class="card-title" title="{{feature.get('name')}}">{{feature.get('name')}}</h1>
|
||||||
<div class="card-text"><span>{{feature.get('datadate')|date}}</span> - <span>{{feature.get('dataenddate')|date}}</span> </div>
|
<div class="card-text"><span>{{areaInHa(feature)| number:'1.2-2'}}
|
||||||
</div>
|
ha</span> <span>{{feature.get('cropTypeName')}}</span> </div>
|
||||||
</div>
|
<div class="card-text"><span>{{feature.get('datadate')|date}}</span> -
|
||||||
|
<span>{{feature.get('dataenddate')|date}}</span> </div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
}
|
||||||
-4
@@ -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;
|
||||||
|
|||||||
+11
-51
@@ -1,75 +1,35 @@
|
|||||||
import { Component, Injectable,ViewChild,AfterViewInit} from '@angular/core';
|
import { Component, Injectable,ViewChild,AfterViewInit} from '@angular/core';
|
||||||
import { Feature } from 'ol';
|
import { Feature } from 'ol';
|
||||||
import * as extent from 'ol/extent';
|
import { Geometry } from 'ol/geom';
|
||||||
import * as render from 'ol/render';
|
|
||||||
import { Store } from '@ngrx/store';
|
import { Store } from '@ngrx/store';
|
||||||
import * as mapReducers from '../../reducers/map.reducer';
|
import * as mapReducers from '../../reducers/map.reducer';
|
||||||
import { commonReducers,ItemTypeService,AppConfig } from '@farmmaps/common';
|
import { commonReducers,ItemTypeService,AppConfig } from '@farmmaps/common';
|
||||||
import { AbstractFeatureListFeatureComponent } from '../feature-list-feature/feature-list-feature.component';
|
import { AbstractFeatureListFeatureComponent } from '../feature-list-feature/feature-list-feature.component';
|
||||||
import { ForItemType } from '../for-item/for-itemtype.decorator';
|
import { ForItemType } from '../for-item/for-itemtype.decorator';
|
||||||
import {getArea} from 'ol/sphere';
|
import {getArea} from 'ol/sphere';
|
||||||
import * as style from 'ol/style';
|
|
||||||
|
|
||||||
|
|
||||||
@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 implements AfterViewInit {
|
export class FeatureListFeatureCropfieldComponent extends AbstractFeatureListFeatureComponent {
|
||||||
|
|
||||||
@ViewChild('canvas') canvas;
|
|
||||||
@ViewChild('container') container;
|
|
||||||
|
|
||||||
constructor(store: Store<mapReducers.State | commonReducers.State>, itemTypeService: ItemTypeService,config:AppConfig) {
|
constructor(store: Store<mapReducers.State | commonReducers.State>, itemTypeService: ItemTypeService,config:AppConfig) {
|
||||||
super(store, itemTypeService,config);
|
super(store, itemTypeService,config);
|
||||||
}
|
}
|
||||||
|
|
||||||
areaInHa(feature:Feature):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(),{projectio:"EPSG:3857"}) / 10000;
|
return getArea(feature.getGeometry(),{projection:"EPSG:3857"}) / 10000;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
render(canvas,width,height,feature:Feature) {
|
|
||||||
let renderContext = render.toContext(canvas.getContext( '2d'),{ size: [width, height] });
|
|
||||||
|
|
||||||
let strokeStyle = new style.Style({
|
|
||||||
stroke: new style.Stroke({ color: 'black',width:1.5 })
|
|
||||||
});
|
|
||||||
|
|
||||||
let geom = feature.getGeometry().clone(),
|
|
||||||
line = geom.getCoordinates()[0],
|
|
||||||
e = extent.boundingExtent( line );
|
|
||||||
|
|
||||||
let dxy = extent.getCenter(e),
|
|
||||||
sxy = [
|
|
||||||
(width - 2 ) / extent.getWidth(e),
|
|
||||||
(height - 2 ) / extent.getHeight(e)
|
|
||||||
];
|
|
||||||
|
|
||||||
let dx = dxy[0],
|
|
||||||
dy = dxy[1],
|
|
||||||
sx = sxy[0],
|
|
||||||
sy = sxy[1];
|
|
||||||
|
|
||||||
geom.translate( -dx, -dy );
|
|
||||||
geom.scale( Math.min(sx, sy), -Math.min(sx, sy));
|
|
||||||
geom.translate( width / 2, height / 2 );
|
|
||||||
|
|
||||||
renderContext.setStyle( strokeStyle );
|
|
||||||
renderContext.drawGeometry( geom );
|
|
||||||
}
|
|
||||||
|
|
||||||
ngAfterViewInit() {
|
|
||||||
this.render(this.canvas.nativeElement,
|
|
||||||
this.container.nativeElement.offsetWidth,
|
|
||||||
this.container.nativeElement.offsetHeight,
|
|
||||||
this.feature);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user